@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,255 @@
|
|
|
1
|
+
// @logix/core subpath bundles for @logix/sandbox
|
|
2
|
+
|
|
3
|
+
import {
|
|
4
|
+
makeEvidenceSink
|
|
5
|
+
} from "./chunk-RS5FFPUV.js";
|
|
6
|
+
import {
|
|
7
|
+
currentDiagnosticsLevel,
|
|
8
|
+
toRuntimeDebugEventRef
|
|
9
|
+
} from "./chunk-CVZPRIDB.js";
|
|
10
|
+
import {
|
|
11
|
+
projectJsonValue
|
|
12
|
+
} from "./chunk-RYSSJBGX.js";
|
|
13
|
+
|
|
14
|
+
// ../logix-core/src/internal/runtime/core/RuntimeKernel.ts
|
|
15
|
+
import { Context, Effect, Option } from "../effect.js";
|
|
16
|
+
var RuntimeServicesRuntimeConfigTagImpl = class extends Context.Tag(
|
|
17
|
+
"@logix/core/RuntimeServicesRuntimeConfig"
|
|
18
|
+
)() {
|
|
19
|
+
};
|
|
20
|
+
var RuntimeServicesRuntimeConfigTag = RuntimeServicesRuntimeConfigTagImpl;
|
|
21
|
+
var RuntimeServicesProviderOverridesTagImpl = class extends Context.Tag(
|
|
22
|
+
"@logix/core/RuntimeServicesProviderOverrides"
|
|
23
|
+
)() {
|
|
24
|
+
};
|
|
25
|
+
var RuntimeServicesProviderOverridesTag = RuntimeServicesProviderOverridesTagImpl;
|
|
26
|
+
var RuntimeServicesInstanceOverridesTagImpl = class extends Context.Tag(
|
|
27
|
+
"@logix/core/RuntimeServicesInstanceOverrides"
|
|
28
|
+
)() {
|
|
29
|
+
};
|
|
30
|
+
var RuntimeServicesInstanceOverridesTag = RuntimeServicesInstanceOverridesTagImpl;
|
|
31
|
+
var ORDERED_SCOPES = [
|
|
32
|
+
"builtin",
|
|
33
|
+
"runtime_default",
|
|
34
|
+
"runtime_module",
|
|
35
|
+
"provider",
|
|
36
|
+
"instance"
|
|
37
|
+
];
|
|
38
|
+
var maxScope = (a, b) => {
|
|
39
|
+
const ai = ORDERED_SCOPES.indexOf(a);
|
|
40
|
+
const bi = ORDERED_SCOPES.indexOf(b);
|
|
41
|
+
return ai >= bi ? a : b;
|
|
42
|
+
};
|
|
43
|
+
var isPlainRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
|
|
44
|
+
var normalizeOverride = (value) => {
|
|
45
|
+
if (!isPlainRecord(value)) return void 0;
|
|
46
|
+
const implIdRaw = value.implId;
|
|
47
|
+
const notesRaw = value.notes;
|
|
48
|
+
return {
|
|
49
|
+
implId: typeof implIdRaw === "string" && implIdRaw.length > 0 ? implIdRaw : void 0,
|
|
50
|
+
notes: typeof notesRaw === "string" && notesRaw.length > 0 ? notesRaw : void 0
|
|
51
|
+
};
|
|
52
|
+
};
|
|
53
|
+
var resolveRuntimeServicesOverrides = (args) => Effect.gen(function* () {
|
|
54
|
+
const runtimeConfigOpt = yield* Effect.serviceOption(
|
|
55
|
+
RuntimeServicesRuntimeConfigTag
|
|
56
|
+
);
|
|
57
|
+
const providerOverridesOpt = yield* Effect.serviceOption(
|
|
58
|
+
RuntimeServicesProviderOverridesTag
|
|
59
|
+
);
|
|
60
|
+
const instanceOverridesOpt = yield* Effect.serviceOption(
|
|
61
|
+
RuntimeServicesInstanceOverridesTag
|
|
62
|
+
);
|
|
63
|
+
const runtimeConfig = Option.isSome(runtimeConfigOpt) ? runtimeConfigOpt.value : void 0;
|
|
64
|
+
const providerOverrides = Option.isSome(providerOverridesOpt) ? providerOverridesOpt.value : void 0;
|
|
65
|
+
const instanceOverrides = Option.isSome(instanceOverridesOpt) ? instanceOverridesOpt.value : void 0;
|
|
66
|
+
const moduleId = args.moduleId;
|
|
67
|
+
const runtimeModule = moduleId && runtimeConfig?.servicesByModuleId ? runtimeConfig.servicesByModuleId[moduleId] : void 0;
|
|
68
|
+
const providerModule = moduleId && providerOverrides?.servicesByModuleId ? providerOverrides.servicesByModuleId[moduleId] : void 0;
|
|
69
|
+
return {
|
|
70
|
+
runtimeDefault: runtimeConfig?.services,
|
|
71
|
+
runtimeModule,
|
|
72
|
+
provider: providerOverrides?.services,
|
|
73
|
+
providerModule,
|
|
74
|
+
instance: instanceOverrides
|
|
75
|
+
};
|
|
76
|
+
});
|
|
77
|
+
var selectRuntimeService = (serviceId, impls, overrides) => {
|
|
78
|
+
const builtin = impls[0];
|
|
79
|
+
if (!builtin) {
|
|
80
|
+
throw new Error(`[Logix] RuntimeKernel registry missing builtin impl for: ${serviceId}`);
|
|
81
|
+
}
|
|
82
|
+
let desired;
|
|
83
|
+
const consider = (scope, patch) => {
|
|
84
|
+
const next = patch ? normalizeOverride(patch[serviceId]) : void 0;
|
|
85
|
+
if (!next || !next.implId) return;
|
|
86
|
+
desired = { scope, override: next };
|
|
87
|
+
};
|
|
88
|
+
consider("runtime_default", overrides.runtimeDefault);
|
|
89
|
+
consider("runtime_module", overrides.runtimeModule);
|
|
90
|
+
consider("provider", overrides.provider);
|
|
91
|
+
consider("provider", overrides.providerModule);
|
|
92
|
+
consider("instance", overrides.instance);
|
|
93
|
+
if (!desired) {
|
|
94
|
+
return {
|
|
95
|
+
impl: builtin,
|
|
96
|
+
binding: {
|
|
97
|
+
serviceId,
|
|
98
|
+
implId: builtin.implId,
|
|
99
|
+
implVersion: builtin.implVersion,
|
|
100
|
+
scope: "builtin",
|
|
101
|
+
overridden: false,
|
|
102
|
+
notes: builtin.notes
|
|
103
|
+
},
|
|
104
|
+
overridesApplied: []
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
const desiredImplId = desired.override.implId;
|
|
108
|
+
const selected = impls.find((i) => i.implId === desiredImplId);
|
|
109
|
+
const impl = selected ?? builtin;
|
|
110
|
+
const didFallback = selected == null;
|
|
111
|
+
const fallbackNote = didFallback ? `Unknown implId "${desiredImplId}", falling back to builtin "${builtin.implId}"` : void 0;
|
|
112
|
+
const notes = [desired.override.notes, impl.notes, fallbackNote].filter((s) => typeof s === "string" && s.length > 0).join("; ");
|
|
113
|
+
return {
|
|
114
|
+
impl,
|
|
115
|
+
binding: {
|
|
116
|
+
serviceId,
|
|
117
|
+
implId: impl.implId,
|
|
118
|
+
implVersion: impl.implVersion,
|
|
119
|
+
scope: desired.scope,
|
|
120
|
+
overridden: true,
|
|
121
|
+
notes: notes.length > 0 ? notes : void 0
|
|
122
|
+
},
|
|
123
|
+
overridesApplied: [
|
|
124
|
+
didFallback ? `${desired.scope}:${serviceId}=${desiredImplId} (fallback=${builtin.implId})` : `${desired.scope}:${serviceId}=${desiredImplId}`
|
|
125
|
+
]
|
|
126
|
+
};
|
|
127
|
+
};
|
|
128
|
+
var makeRuntimeServicesEvidence = (args) => {
|
|
129
|
+
let scope = "builtin";
|
|
130
|
+
for (const b of args.bindings) {
|
|
131
|
+
scope = maxScope(scope, b.scope);
|
|
132
|
+
}
|
|
133
|
+
return {
|
|
134
|
+
moduleId: args.moduleId,
|
|
135
|
+
instanceId: args.instanceId,
|
|
136
|
+
scope,
|
|
137
|
+
bindings: args.bindings,
|
|
138
|
+
overridesApplied: args.overridesApplied
|
|
139
|
+
};
|
|
140
|
+
};
|
|
141
|
+
var RUNTIME_SERVICES_EVIDENCE = /* @__PURE__ */ Symbol.for("@logix/core/runtimeServicesEvidence");
|
|
142
|
+
var defineHidden = (target, key, value) => {
|
|
143
|
+
Object.defineProperty(target, key, {
|
|
144
|
+
value,
|
|
145
|
+
enumerable: false,
|
|
146
|
+
configurable: true,
|
|
147
|
+
writable: false
|
|
148
|
+
});
|
|
149
|
+
};
|
|
150
|
+
var setRuntimeServicesEvidence = (runtime, evidence) => {
|
|
151
|
+
defineHidden(runtime, RUNTIME_SERVICES_EVIDENCE, evidence);
|
|
152
|
+
};
|
|
153
|
+
|
|
154
|
+
// ../logix-core/src/internal/observability/evidenceCollector.ts
|
|
155
|
+
import { Context as Context2, Effect as Effect2, FiberRef, Layer } from "../effect.js";
|
|
156
|
+
var EvidenceCollectorTagImpl = class extends Context2.Tag(
|
|
157
|
+
"@logix/core/EvidenceCollector"
|
|
158
|
+
)() {
|
|
159
|
+
};
|
|
160
|
+
var EvidenceCollectorTag = EvidenceCollectorTagImpl;
|
|
161
|
+
var evidenceCollectorLayer = (collector) => Layer.succeed(EvidenceCollectorTag, collector);
|
|
162
|
+
var isRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
|
|
163
|
+
var makeEvidenceCollector = (session) => {
|
|
164
|
+
const sink = makeEvidenceSink(session);
|
|
165
|
+
const convergeStaticIrByDigest = /* @__PURE__ */ new Map();
|
|
166
|
+
let runtimeServicesEvidence;
|
|
167
|
+
const exportBudget = {
|
|
168
|
+
dropped: 0,
|
|
169
|
+
oversized: 0,
|
|
170
|
+
nonSerializable: 0
|
|
171
|
+
};
|
|
172
|
+
const debugSink = {
|
|
173
|
+
record: (event) => Effect2.gen(function* () {
|
|
174
|
+
const level = yield* FiberRef.get(currentDiagnosticsLevel);
|
|
175
|
+
const instanceIdRaw = event.instanceId;
|
|
176
|
+
const instanceId = typeof instanceIdRaw === "string" && instanceIdRaw.length > 0 ? instanceIdRaw : "unknown";
|
|
177
|
+
const eventSeq = level === "off" ? void 0 : session.local.nextSeq("eventSeq", instanceId);
|
|
178
|
+
const ref = toRuntimeDebugEventRef(event, {
|
|
179
|
+
diagnosticsLevel: level,
|
|
180
|
+
eventSeq,
|
|
181
|
+
onMetaProjection: ({ stats }) => {
|
|
182
|
+
exportBudget.dropped += stats.dropped;
|
|
183
|
+
exportBudget.oversized += stats.oversized;
|
|
184
|
+
}
|
|
185
|
+
});
|
|
186
|
+
if (!ref) return;
|
|
187
|
+
const projected = projectJsonValue(ref);
|
|
188
|
+
exportBudget.dropped += projected.stats.dropped;
|
|
189
|
+
exportBudget.oversized += projected.stats.oversized;
|
|
190
|
+
exportBudget.nonSerializable += projected.stats.nonSerializable;
|
|
191
|
+
sink.record("debug:event", projected.value, {
|
|
192
|
+
timestamp: ref.timestamp
|
|
193
|
+
});
|
|
194
|
+
})
|
|
195
|
+
};
|
|
196
|
+
const registerConvergeStaticIr = (staticIr) => {
|
|
197
|
+
if (!isRecord(staticIr)) return;
|
|
198
|
+
const digest = staticIr.staticIrDigest;
|
|
199
|
+
if (typeof digest !== "string" || digest.length === 0) return;
|
|
200
|
+
const projected = projectJsonValue(staticIr);
|
|
201
|
+
exportBudget.dropped += projected.stats.dropped;
|
|
202
|
+
exportBudget.oversized += projected.stats.oversized;
|
|
203
|
+
exportBudget.nonSerializable += projected.stats.nonSerializable;
|
|
204
|
+
convergeStaticIrByDigest.set(digest, projected.value);
|
|
205
|
+
};
|
|
206
|
+
const setRuntimeServicesEvidence2 = (evidence) => {
|
|
207
|
+
const projected = projectJsonValue(evidence);
|
|
208
|
+
exportBudget.dropped += projected.stats.dropped;
|
|
209
|
+
exportBudget.oversized += projected.stats.oversized;
|
|
210
|
+
exportBudget.nonSerializable += projected.stats.nonSerializable;
|
|
211
|
+
runtimeServicesEvidence = projected.value;
|
|
212
|
+
};
|
|
213
|
+
const exportEvidencePackage = (options) => {
|
|
214
|
+
const convergeSummary = convergeStaticIrByDigest.size > 0 ? {
|
|
215
|
+
staticIrByDigest: Object.fromEntries(convergeStaticIrByDigest)
|
|
216
|
+
} : void 0;
|
|
217
|
+
const runtimeSummary = runtimeServicesEvidence != null ? { services: runtimeServicesEvidence } : void 0;
|
|
218
|
+
const summary = convergeSummary != null || runtimeSummary != null ? {
|
|
219
|
+
...convergeSummary != null ? { converge: convergeSummary } : {},
|
|
220
|
+
...runtimeSummary != null ? { runtime: runtimeSummary } : {}
|
|
221
|
+
} : void 0;
|
|
222
|
+
return sink.export({
|
|
223
|
+
maxEvents: options?.maxEvents,
|
|
224
|
+
summary
|
|
225
|
+
});
|
|
226
|
+
};
|
|
227
|
+
const clear = () => {
|
|
228
|
+
sink.clear();
|
|
229
|
+
convergeStaticIrByDigest.clear();
|
|
230
|
+
runtimeServicesEvidence = void 0;
|
|
231
|
+
exportBudget.dropped = 0;
|
|
232
|
+
exportBudget.oversized = 0;
|
|
233
|
+
exportBudget.nonSerializable = 0;
|
|
234
|
+
};
|
|
235
|
+
return {
|
|
236
|
+
session,
|
|
237
|
+
debugSink,
|
|
238
|
+
registerConvergeStaticIr,
|
|
239
|
+
setRuntimeServicesEvidence: setRuntimeServicesEvidence2,
|
|
240
|
+
exportEvidencePackage,
|
|
241
|
+
clear
|
|
242
|
+
};
|
|
243
|
+
};
|
|
244
|
+
|
|
245
|
+
export {
|
|
246
|
+
RuntimeServicesInstanceOverridesTag,
|
|
247
|
+
resolveRuntimeServicesOverrides,
|
|
248
|
+
selectRuntimeService,
|
|
249
|
+
makeRuntimeServicesEvidence,
|
|
250
|
+
setRuntimeServicesEvidence,
|
|
251
|
+
EvidenceCollectorTag,
|
|
252
|
+
evidenceCollectorLayer,
|
|
253
|
+
makeEvidenceCollector
|
|
254
|
+
};
|
|
255
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vbG9naXgtY29yZS9zcmMvaW50ZXJuYWwvcnVudGltZS9jb3JlL1J1bnRpbWVLZXJuZWwudHMiLCAiLi4vLi4vLi4vLi4vbG9naXgtY29yZS9zcmMvaW50ZXJuYWwvb2JzZXJ2YWJpbGl0eS9ldmlkZW5jZUNvbGxlY3Rvci50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiaW1wb3J0IHsgQ29udGV4dCwgRWZmZWN0LCBPcHRpb24gfSBmcm9tIFwiZWZmZWN0XCJcbmltcG9ydCB7IGlzRGV2RW52IH0gZnJvbSBcIi4vZW52LmpzXCJcblxuZXhwb3J0IHR5cGUgT3ZlcnJpZGVTY29wZSA9XG4gIHwgXCJidWlsdGluXCJcbiAgfCBcInJ1bnRpbWVfZGVmYXVsdFwiXG4gIHwgXCJydW50aW1lX21vZHVsZVwiXG4gIHwgXCJwcm92aWRlclwiXG4gIHwgXCJpbnN0YW5jZVwiXG5cbmV4cG9ydCB0eXBlIFJ1bnRpbWVTZXJ2aWNlT3ZlcnJpZGUgPSB7XG4gIHJlYWRvbmx5IGltcGxJZD86IHN0cmluZ1xuICByZWFkb25seSBub3Rlcz86IHN0cmluZ1xufVxuXG4vKipcbiAqIFJ1bnRpbWVTZXJ2aWNlc092ZXJyaWRlc1x1RkYxQVx1NTNFRlx1NUU4Rlx1NTIxN1x1NTMxNlx1NzY4NFx1MjAxQ1x1NjcwRFx1NTJBMVx1NUI5RVx1NzNCMFx1OTAwOVx1NjJFOVx1MjAxRFx1ODk4Nlx1NTE5OVx1MzAwMlxuICpcbiAqIC0ga2V5IFx1NEUzQVx1N0EzM1x1NUI5QSBzZXJ2aWNlSWRcdUZGMUJcbiAqIC0gdmFsdWUgXHU0RUM1XHU1MTQxXHU4QkI4XHU1MzA1XHU1NDJCXHU1M0VGXHU1RThGXHU1MjE3XHU1MzE2XHU1QjU3XHU2QkI1XHVGRjA4XHU3OTgxXHU2QjYyXHU1MUZEXHU2NTcwL1x1OTVFRFx1NTMwNVx1RkYwOVx1RkYwQ1x1NEVFNVx1NEZCRlx1NzUxRlx1NjIxMFx1NTNFRlx1ODlFM1x1OTFDQVx1OEJDMVx1NjM2RVx1MzAwMlxuICovXG5leHBvcnQgdHlwZSBSdW50aW1lU2VydmljZXNPdmVycmlkZXMgPSBSZWFkb25seTxcbiAgUmVjb3JkPHN0cmluZywgUnVudGltZVNlcnZpY2VPdmVycmlkZT5cbj5cblxuZXhwb3J0IGludGVyZmFjZSBSdW50aW1lU2VydmljZXNSdW50aW1lQ29uZmlnIHtcbiAgLyoqIFJ1bnRpbWUgXHU3RUE3XHU5RUQ4XHU4QkE0XHU4OTg2XHU1MTk5XHVGRjA4cnVudGltZV9kZWZhdWx0XHVGRjA5XHUzMDAyICovXG4gIHJlYWRvbmx5IHNlcnZpY2VzPzogUnVudGltZVNlcnZpY2VzT3ZlcnJpZGVzXG4gIC8qKiBcdTYzMDkgbW9kdWxlSWQgXHU3Njg0XHU1REVFXHU5MUNGXHU4OTg2XHU1MTk5XHVGRjA4cnVudGltZV9tb2R1bGVcdUZGMDlcdTMwMDIgKi9cbiAgcmVhZG9ubHkgc2VydmljZXNCeU1vZHVsZUlkPzogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgUnVudGltZVNlcnZpY2VzT3ZlcnJpZGVzPj5cbn1cblxuY2xhc3MgUnVudGltZVNlcnZpY2VzUnVudGltZUNvbmZpZ1RhZ0ltcGwgZXh0ZW5kcyBDb250ZXh0LlRhZyhcbiAgXCJAbG9naXgvY29yZS9SdW50aW1lU2VydmljZXNSdW50aW1lQ29uZmlnXCIsXG4pPFJ1bnRpbWVTZXJ2aWNlc1J1bnRpbWVDb25maWdUYWdJbXBsLCBSdW50aW1lU2VydmljZXNSdW50aW1lQ29uZmlnPigpIHt9XG5cbmV4cG9ydCBjb25zdCBSdW50aW1lU2VydmljZXNSdW50aW1lQ29uZmlnVGFnID0gUnVudGltZVNlcnZpY2VzUnVudGltZUNvbmZpZ1RhZ0ltcGxcblxuZXhwb3J0IGludGVyZmFjZSBSdW50aW1lU2VydmljZXNQcm92aWRlck92ZXJyaWRlcyB7XG4gIC8qKiBQcm92aWRlciBcdTgzMDNcdTU2RjRcdTlFRDhcdThCQTRcdTg5ODZcdTUxOTlcdUZGMDhwcm92aWRlclx1RkYwOVx1MzAwMiAqL1xuICByZWFkb25seSBzZXJ2aWNlcz86IFJ1bnRpbWVTZXJ2aWNlc092ZXJyaWRlc1xuICAvKiogUHJvdmlkZXIgXHU4MzAzXHU1NkY0XHU2MzA5IG1vZHVsZUlkIFx1NzY4NFx1NURFRVx1OTFDRlx1ODk4Nlx1NTE5OVx1RkYwOHByb3ZpZGVyXHVGRjA5XHUzMDAyICovXG4gIHJlYWRvbmx5IHNlcnZpY2VzQnlNb2R1bGVJZD86IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIFJ1bnRpbWVTZXJ2aWNlc092ZXJyaWRlcz4+XG59XG5cbmNsYXNzIFJ1bnRpbWVTZXJ2aWNlc1Byb3ZpZGVyT3ZlcnJpZGVzVGFnSW1wbCBleHRlbmRzIENvbnRleHQuVGFnKFxuICBcIkBsb2dpeC9jb3JlL1J1bnRpbWVTZXJ2aWNlc1Byb3ZpZGVyT3ZlcnJpZGVzXCIsXG4pPFJ1bnRpbWVTZXJ2aWNlc1Byb3ZpZGVyT3ZlcnJpZGVzVGFnSW1wbCwgUnVudGltZVNlcnZpY2VzUHJvdmlkZXJPdmVycmlkZXM+KCkge31cblxuZXhwb3J0IGNvbnN0IFJ1bnRpbWVTZXJ2aWNlc1Byb3ZpZGVyT3ZlcnJpZGVzVGFnID0gUnVudGltZVNlcnZpY2VzUHJvdmlkZXJPdmVycmlkZXNUYWdJbXBsXG5cbmNsYXNzIFJ1bnRpbWVTZXJ2aWNlc0luc3RhbmNlT3ZlcnJpZGVzVGFnSW1wbCBleHRlbmRzIENvbnRleHQuVGFnKFxuICBcIkBsb2dpeC9jb3JlL1J1bnRpbWVTZXJ2aWNlc0luc3RhbmNlT3ZlcnJpZGVzXCIsXG4pPFJ1bnRpbWVTZXJ2aWNlc0luc3RhbmNlT3ZlcnJpZGVzVGFnSW1wbCwgUnVudGltZVNlcnZpY2VzT3ZlcnJpZGVzPigpIHt9XG5cbmV4cG9ydCBjb25zdCBSdW50aW1lU2VydmljZXNJbnN0YW5jZU92ZXJyaWRlc1RhZyA9IFJ1bnRpbWVTZXJ2aWNlc0luc3RhbmNlT3ZlcnJpZGVzVGFnSW1wbFxuXG5leHBvcnQgaW50ZXJmYWNlIFJ1bnRpbWVTZXJ2aWNlQmluZGluZyB7XG4gIHJlYWRvbmx5IHNlcnZpY2VJZDogc3RyaW5nXG4gIHJlYWRvbmx5IGltcGxJZD86IHN0cmluZ1xuICByZWFkb25seSBpbXBsVmVyc2lvbj86IHN0cmluZ1xuICByZWFkb25seSBzY29wZTogT3ZlcnJpZGVTY29wZVxuICByZWFkb25seSBvdmVycmlkZGVuOiBib29sZWFuXG4gIHJlYWRvbmx5IG5vdGVzPzogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUnVudGltZVNlcnZpY2VzRXZpZGVuY2Uge1xuICByZWFkb25seSBtb2R1bGVJZD86IHN0cmluZ1xuICByZWFkb25seSBpbnN0YW5jZUlkOiBzdHJpbmdcbiAgcmVhZG9ubHkgc2NvcGU6IE92ZXJyaWRlU2NvcGVcbiAgcmVhZG9ubHkgYmluZGluZ3M6IFJlYWRvbmx5QXJyYXk8UnVudGltZVNlcnZpY2VCaW5kaW5nPlxuICByZWFkb25seSBvdmVycmlkZXNBcHBsaWVkOiBSZWFkb25seUFycmF5PHN0cmluZz5cbn1cblxuY29uc3QgT1JERVJFRF9TQ09QRVM6IFJlYWRvbmx5QXJyYXk8T3ZlcnJpZGVTY29wZT4gPSBbXG4gIFwiYnVpbHRpblwiLFxuICBcInJ1bnRpbWVfZGVmYXVsdFwiLFxuICBcInJ1bnRpbWVfbW9kdWxlXCIsXG4gIFwicHJvdmlkZXJcIixcbiAgXCJpbnN0YW5jZVwiLFxuXVxuXG5jb25zdCBtYXhTY29wZSA9IChhOiBPdmVycmlkZVNjb3BlLCBiOiBPdmVycmlkZVNjb3BlKTogT3ZlcnJpZGVTY29wZSA9PiB7XG4gIGNvbnN0IGFpID0gT1JERVJFRF9TQ09QRVMuaW5kZXhPZihhKVxuICBjb25zdCBiaSA9IE9SREVSRURfU0NPUEVTLmluZGV4T2YoYilcbiAgcmV0dXJuIChhaSA+PSBiaSA/IGEgOiBiKSBhcyBPdmVycmlkZVNjb3BlXG59XG5cbmNvbnN0IGlzUGxhaW5SZWNvcmQgPSAodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9PlxuICB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgdmFsdWUgIT09IG51bGwgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpXG5cbmNvbnN0IG5vcm1hbGl6ZU92ZXJyaWRlID0gKHZhbHVlOiB1bmtub3duKTogUnVudGltZVNlcnZpY2VPdmVycmlkZSB8IHVuZGVmaW5lZCA9PiB7XG4gIGlmICghaXNQbGFpblJlY29yZCh2YWx1ZSkpIHJldHVybiB1bmRlZmluZWRcblxuICBjb25zdCBpbXBsSWRSYXcgPSB2YWx1ZS5pbXBsSWRcbiAgY29uc3Qgbm90ZXNSYXcgPSB2YWx1ZS5ub3Rlc1xuXG4gIHJldHVybiB7XG4gICAgaW1wbElkOiB0eXBlb2YgaW1wbElkUmF3ID09PSBcInN0cmluZ1wiICYmIGltcGxJZFJhdy5sZW5ndGggPiAwID8gaW1wbElkUmF3IDogdW5kZWZpbmVkLFxuICAgIG5vdGVzOiB0eXBlb2Ygbm90ZXNSYXcgPT09IFwic3RyaW5nXCIgJiYgbm90ZXNSYXcubGVuZ3RoID4gMCA/IG5vdGVzUmF3IDogdW5kZWZpbmVkLFxuICB9XG59XG5cbmV4cG9ydCBjb25zdCByZXNvbHZlUnVudGltZVNlcnZpY2VzT3ZlcnJpZGVzID0gKGFyZ3M6IHtcbiAgcmVhZG9ubHkgbW9kdWxlSWQ6IHN0cmluZyB8IHVuZGVmaW5lZFxufSk6IEVmZmVjdC5FZmZlY3Q8XG4gIHtcbiAgICByZWFkb25seSBydW50aW1lRGVmYXVsdD86IFJ1bnRpbWVTZXJ2aWNlc092ZXJyaWRlc1xuICAgIHJlYWRvbmx5IHJ1bnRpbWVNb2R1bGU/OiBSdW50aW1lU2VydmljZXNPdmVycmlkZXNcbiAgICByZWFkb25seSBwcm92aWRlcj86IFJ1bnRpbWVTZXJ2aWNlc092ZXJyaWRlc1xuICAgIHJlYWRvbmx5IHByb3ZpZGVyTW9kdWxlPzogUnVudGltZVNlcnZpY2VzT3ZlcnJpZGVzXG4gICAgcmVhZG9ubHkgaW5zdGFuY2U/OiBSdW50aW1lU2VydmljZXNPdmVycmlkZXNcbiAgfSxcbiAgbmV2ZXIsXG4gIGFueVxuPiA9PlxuICBFZmZlY3QuZ2VuKGZ1bmN0aW9uKiAoKSB7XG4gICAgY29uc3QgcnVudGltZUNvbmZpZ09wdCA9IHlpZWxkKiBFZmZlY3Quc2VydmljZU9wdGlvbihcbiAgICAgIFJ1bnRpbWVTZXJ2aWNlc1J1bnRpbWVDb25maWdUYWcsXG4gICAgKVxuICAgIGNvbnN0IHByb3ZpZGVyT3ZlcnJpZGVzT3B0ID0geWllbGQqIEVmZmVjdC5zZXJ2aWNlT3B0aW9uKFxuICAgICAgUnVudGltZVNlcnZpY2VzUHJvdmlkZXJPdmVycmlkZXNUYWcsXG4gICAgKVxuICAgIGNvbnN0IGluc3RhbmNlT3ZlcnJpZGVzT3B0ID0geWllbGQqIEVmZmVjdC5zZXJ2aWNlT3B0aW9uKFxuICAgICAgUnVudGltZVNlcnZpY2VzSW5zdGFuY2VPdmVycmlkZXNUYWcsXG4gICAgKVxuXG4gICAgY29uc3QgcnVudGltZUNvbmZpZyA9IE9wdGlvbi5pc1NvbWUocnVudGltZUNvbmZpZ09wdClcbiAgICAgID8gcnVudGltZUNvbmZpZ09wdC52YWx1ZVxuICAgICAgOiB1bmRlZmluZWRcbiAgICBjb25zdCBwcm92aWRlck92ZXJyaWRlcyA9IE9wdGlvbi5pc1NvbWUocHJvdmlkZXJPdmVycmlkZXNPcHQpXG4gICAgICA/IHByb3ZpZGVyT3ZlcnJpZGVzT3B0LnZhbHVlXG4gICAgICA6IHVuZGVmaW5lZFxuICAgIGNvbnN0IGluc3RhbmNlT3ZlcnJpZGVzID0gT3B0aW9uLmlzU29tZShpbnN0YW5jZU92ZXJyaWRlc09wdClcbiAgICAgID8gaW5zdGFuY2VPdmVycmlkZXNPcHQudmFsdWVcbiAgICAgIDogdW5kZWZpbmVkXG5cbiAgICBjb25zdCBtb2R1bGVJZCA9IGFyZ3MubW9kdWxlSWRcblxuICAgIGNvbnN0IHJ1bnRpbWVNb2R1bGUgPVxuICAgICAgbW9kdWxlSWQgJiYgcnVudGltZUNvbmZpZz8uc2VydmljZXNCeU1vZHVsZUlkXG4gICAgICAgID8gcnVudGltZUNvbmZpZy5zZXJ2aWNlc0J5TW9kdWxlSWRbbW9kdWxlSWRdXG4gICAgICAgIDogdW5kZWZpbmVkXG5cbiAgICBjb25zdCBwcm92aWRlck1vZHVsZSA9XG4gICAgICBtb2R1bGVJZCAmJiBwcm92aWRlck92ZXJyaWRlcz8uc2VydmljZXNCeU1vZHVsZUlkXG4gICAgICAgID8gcHJvdmlkZXJPdmVycmlkZXMuc2VydmljZXNCeU1vZHVsZUlkW21vZHVsZUlkXVxuICAgICAgICA6IHVuZGVmaW5lZFxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHJ1bnRpbWVEZWZhdWx0OiBydW50aW1lQ29uZmlnPy5zZXJ2aWNlcyxcbiAgICAgIHJ1bnRpbWVNb2R1bGUsXG4gICAgICBwcm92aWRlcjogcHJvdmlkZXJPdmVycmlkZXM/LnNlcnZpY2VzLFxuICAgICAgcHJvdmlkZXJNb2R1bGUsXG4gICAgICBpbnN0YW5jZTogaW5zdGFuY2VPdmVycmlkZXMsXG4gICAgfVxuICB9KVxuXG5leHBvcnQgaW50ZXJmYWNlIFJ1bnRpbWVTZXJ2aWNlSW1wbDxTZXJ2aWNlPiB7XG4gIHJlYWRvbmx5IGltcGxJZDogc3RyaW5nXG4gIHJlYWRvbmx5IGltcGxWZXJzaW9uOiBzdHJpbmdcbiAgcmVhZG9ubHkgbWFrZTogRWZmZWN0LkVmZmVjdDxTZXJ2aWNlLCBuZXZlciwgYW55PlxuICByZWFkb25seSBub3Rlcz86IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJ1bnRpbWVTZXJ2aWNlU2VsZWN0aW9uPFNlcnZpY2U+IHtcbiAgcmVhZG9ubHkgYmluZGluZzogUnVudGltZVNlcnZpY2VCaW5kaW5nXG4gIHJlYWRvbmx5IGltcGw6IFJ1bnRpbWVTZXJ2aWNlSW1wbDxTZXJ2aWNlPlxuICByZWFkb25seSBvdmVycmlkZXNBcHBsaWVkOiBSZWFkb25seUFycmF5PHN0cmluZz5cbn1cblxuZXhwb3J0IGNvbnN0IHNlbGVjdFJ1bnRpbWVTZXJ2aWNlID0gPFNlcnZpY2U+KFxuICBzZXJ2aWNlSWQ6IHN0cmluZyxcbiAgaW1wbHM6IFJlYWRvbmx5QXJyYXk8UnVudGltZVNlcnZpY2VJbXBsPFNlcnZpY2U+PixcbiAgb3ZlcnJpZGVzOiB7XG4gICAgcmVhZG9ubHkgcnVudGltZURlZmF1bHQ/OiBSdW50aW1lU2VydmljZXNPdmVycmlkZXNcbiAgICByZWFkb25seSBydW50aW1lTW9kdWxlPzogUnVudGltZVNlcnZpY2VzT3ZlcnJpZGVzXG4gICAgcmVhZG9ubHkgcHJvdmlkZXI/OiBSdW50aW1lU2VydmljZXNPdmVycmlkZXNcbiAgICByZWFkb25seSBwcm92aWRlck1vZHVsZT86IFJ1bnRpbWVTZXJ2aWNlc092ZXJyaWRlc1xuICAgIHJlYWRvbmx5IGluc3RhbmNlPzogUnVudGltZVNlcnZpY2VzT3ZlcnJpZGVzXG4gIH0sXG4pOiBSdW50aW1lU2VydmljZVNlbGVjdGlvbjxTZXJ2aWNlPiA9PiB7XG4gIGNvbnN0IGJ1aWx0aW4gPSBpbXBsc1swXVxuICBpZiAoIWJ1aWx0aW4pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFtMb2dpeF0gUnVudGltZUtlcm5lbCByZWdpc3RyeSBtaXNzaW5nIGJ1aWx0aW4gaW1wbCBmb3I6ICR7c2VydmljZUlkfWApXG4gIH1cblxuICBsZXQgZGVzaXJlZDogeyByZWFkb25seSBzY29wZTogT3ZlcnJpZGVTY29wZTsgcmVhZG9ubHkgb3ZlcnJpZGU6IFJ1bnRpbWVTZXJ2aWNlT3ZlcnJpZGUgfSB8IHVuZGVmaW5lZFxuICBjb25zdCBjb25zaWRlciA9IChzY29wZTogT3ZlcnJpZGVTY29wZSwgcGF0Y2g6IFJ1bnRpbWVTZXJ2aWNlc092ZXJyaWRlcyB8IHVuZGVmaW5lZCk6IHZvaWQgPT4ge1xuICAgIGNvbnN0IG5leHQgPSBwYXRjaCA/IG5vcm1hbGl6ZU92ZXJyaWRlKHBhdGNoW3NlcnZpY2VJZF0pIDogdW5kZWZpbmVkXG4gICAgaWYgKCFuZXh0IHx8ICFuZXh0LmltcGxJZCkgcmV0dXJuXG4gICAgZGVzaXJlZCA9IHsgc2NvcGUsIG92ZXJyaWRlOiBuZXh0IH1cbiAgfVxuXG4gIC8vIHByaW9yaXR5OiBidWlsdGluIDwgcnVudGltZV9kZWZhdWx0IDwgcnVudGltZV9tb2R1bGUgPCBwcm92aWRlciA8IGluc3RhbmNlXG4gIGNvbnNpZGVyKFwicnVudGltZV9kZWZhdWx0XCIsIG92ZXJyaWRlcy5ydW50aW1lRGVmYXVsdClcbiAgY29uc2lkZXIoXCJydW50aW1lX21vZHVsZVwiLCBvdmVycmlkZXMucnVudGltZU1vZHVsZSlcbiAgY29uc2lkZXIoXCJwcm92aWRlclwiLCBvdmVycmlkZXMucHJvdmlkZXIpXG4gIGNvbnNpZGVyKFwicHJvdmlkZXJcIiwgb3ZlcnJpZGVzLnByb3ZpZGVyTW9kdWxlKVxuICBjb25zaWRlcihcImluc3RhbmNlXCIsIG92ZXJyaWRlcy5pbnN0YW5jZSlcblxuICBpZiAoIWRlc2lyZWQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaW1wbDogYnVpbHRpbixcbiAgICAgIGJpbmRpbmc6IHtcbiAgICAgICAgc2VydmljZUlkLFxuICAgICAgICBpbXBsSWQ6IGJ1aWx0aW4uaW1wbElkLFxuICAgICAgICBpbXBsVmVyc2lvbjogYnVpbHRpbi5pbXBsVmVyc2lvbixcbiAgICAgICAgc2NvcGU6IFwiYnVpbHRpblwiLFxuICAgICAgICBvdmVycmlkZGVuOiBmYWxzZSxcbiAgICAgICAgbm90ZXM6IGJ1aWx0aW4ubm90ZXMsXG4gICAgICB9LFxuICAgICAgb3ZlcnJpZGVzQXBwbGllZDogW10sXG4gICAgfVxuICB9XG5cbiAgY29uc3QgZGVzaXJlZEltcGxJZCA9IGRlc2lyZWQub3ZlcnJpZGUuaW1wbElkIVxuICBjb25zdCBzZWxlY3RlZCA9IGltcGxzLmZpbmQoKGkpID0+IGkuaW1wbElkID09PSBkZXNpcmVkSW1wbElkKVxuICBjb25zdCBpbXBsID0gc2VsZWN0ZWQgPz8gYnVpbHRpblxuXG4gIGNvbnN0IGRpZEZhbGxiYWNrID0gc2VsZWN0ZWQgPT0gbnVsbFxuICBjb25zdCBmYWxsYmFja05vdGUgPVxuICAgIGRpZEZhbGxiYWNrXG4gICAgICA/IGBVbmtub3duIGltcGxJZCBcIiR7ZGVzaXJlZEltcGxJZH1cIiwgZmFsbGluZyBiYWNrIHRvIGJ1aWx0aW4gXCIke2J1aWx0aW4uaW1wbElkfVwiYFxuICAgICAgOiB1bmRlZmluZWRcblxuICBjb25zdCBub3RlcyA9IFtkZXNpcmVkLm92ZXJyaWRlLm5vdGVzLCBpbXBsLm5vdGVzLCBmYWxsYmFja05vdGVdXG4gICAgLmZpbHRlcigocyk6IHMgaXMgc3RyaW5nID0+IHR5cGVvZiBzID09PSBcInN0cmluZ1wiICYmIHMubGVuZ3RoID4gMClcbiAgICAuam9pbihcIjsgXCIpXG5cbiAgcmV0dXJuIHtcbiAgICBpbXBsLFxuICAgIGJpbmRpbmc6IHtcbiAgICAgIHNlcnZpY2VJZCxcbiAgICAgIGltcGxJZDogaW1wbC5pbXBsSWQsXG4gICAgICBpbXBsVmVyc2lvbjogaW1wbC5pbXBsVmVyc2lvbixcbiAgICAgIHNjb3BlOiBkZXNpcmVkLnNjb3BlLFxuICAgICAgb3ZlcnJpZGRlbjogdHJ1ZSxcbiAgICAgIG5vdGVzOiBub3Rlcy5sZW5ndGggPiAwID8gbm90ZXMgOiB1bmRlZmluZWQsXG4gICAgfSxcbiAgICBvdmVycmlkZXNBcHBsaWVkOiBbXG4gICAgICBkaWRGYWxsYmFja1xuICAgICAgICA/IGAke2Rlc2lyZWQuc2NvcGV9OiR7c2VydmljZUlkfT0ke2Rlc2lyZWRJbXBsSWR9IChmYWxsYmFjaz0ke2J1aWx0aW4uaW1wbElkfSlgXG4gICAgICAgIDogYCR7ZGVzaXJlZC5zY29wZX06JHtzZXJ2aWNlSWR9PSR7ZGVzaXJlZEltcGxJZH1gLFxuICAgIF0sXG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IG1ha2VSdW50aW1lU2VydmljZXNFdmlkZW5jZSA9IChhcmdzOiB7XG4gIHJlYWRvbmx5IG1vZHVsZUlkOiBzdHJpbmcgfCB1bmRlZmluZWRcbiAgcmVhZG9ubHkgaW5zdGFuY2VJZDogc3RyaW5nXG4gIHJlYWRvbmx5IGJpbmRpbmdzOiBSZWFkb25seUFycmF5PFJ1bnRpbWVTZXJ2aWNlQmluZGluZz5cbiAgcmVhZG9ubHkgb3ZlcnJpZGVzQXBwbGllZDogUmVhZG9ubHlBcnJheTxzdHJpbmc+XG59KTogUnVudGltZVNlcnZpY2VzRXZpZGVuY2UgPT4ge1xuICBsZXQgc2NvcGU6IE92ZXJyaWRlU2NvcGUgPSBcImJ1aWx0aW5cIlxuICBmb3IgKGNvbnN0IGIgb2YgYXJncy5iaW5kaW5ncykge1xuICAgIHNjb3BlID0gbWF4U2NvcGUoc2NvcGUsIGIuc2NvcGUpXG4gIH1cblxuICByZXR1cm4ge1xuICAgIG1vZHVsZUlkOiBhcmdzLm1vZHVsZUlkLFxuICAgIGluc3RhbmNlSWQ6IGFyZ3MuaW5zdGFuY2VJZCxcbiAgICBzY29wZSxcbiAgICBiaW5kaW5nczogYXJncy5iaW5kaW5ncyxcbiAgICBvdmVycmlkZXNBcHBsaWVkOiBhcmdzLm92ZXJyaWRlc0FwcGxpZWQsXG4gIH1cbn1cblxuY29uc3QgUlVOVElNRV9TRVJWSUNFU19FVklERU5DRSA9IFN5bWJvbC5mb3IoXCJAbG9naXgvY29yZS9ydW50aW1lU2VydmljZXNFdmlkZW5jZVwiKVxuXG5jb25zdCBkZWZpbmVIaWRkZW4gPSAodGFyZ2V0OiBvYmplY3QsIGtleTogc3ltYm9sLCB2YWx1ZTogdW5rbm93bik6IHZvaWQgPT4ge1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHtcbiAgICB2YWx1ZSxcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgd3JpdGFibGU6IGZhbHNlLFxuICB9KVxufVxuXG5jb25zdCBmb3JtYXRTY29wZSA9IChtb2R1bGVJZDogdW5rbm93biwgaW5zdGFuY2VJZDogdW5rbm93bik6IHN0cmluZyA9PiB7XG4gIGNvbnN0IG0gPSB0eXBlb2YgbW9kdWxlSWQgPT09IFwic3RyaW5nXCIgJiYgbW9kdWxlSWQubGVuZ3RoID4gMCA/IG1vZHVsZUlkIDogXCJ1bmtub3duXCJcbiAgY29uc3QgaSA9IHR5cGVvZiBpbnN0YW5jZUlkID09PSBcInN0cmluZ1wiICYmIGluc3RhbmNlSWQubGVuZ3RoID4gMCA/IGluc3RhbmNlSWQgOiBcInVua25vd25cIlxuICByZXR1cm4gYG1vZHVsZUlkPSR7bX0sIGluc3RhbmNlSWQ9JHtpfWBcbn1cblxuZXhwb3J0IGNvbnN0IHNldFJ1bnRpbWVTZXJ2aWNlc0V2aWRlbmNlID0gKHJ1bnRpbWU6IG9iamVjdCwgZXZpZGVuY2U6IFJ1bnRpbWVTZXJ2aWNlc0V2aWRlbmNlKTogdm9pZCA9PiB7XG4gIGRlZmluZUhpZGRlbihydW50aW1lLCBSVU5USU1FX1NFUlZJQ0VTX0VWSURFTkNFLCBldmlkZW5jZSlcbn1cblxuZXhwb3J0IGNvbnN0IGdldFJ1bnRpbWVTZXJ2aWNlc0V2aWRlbmNlID0gKHJ1bnRpbWU6IG9iamVjdCk6IFJ1bnRpbWVTZXJ2aWNlc0V2aWRlbmNlID0+IHtcbiAgY29uc3Qgc2NvcGUgPSBydW50aW1lIGFzIHsgcmVhZG9ubHkgbW9kdWxlSWQ/OiB1bmtub3duOyByZWFkb25seSBpbnN0YW5jZUlkPzogdW5rbm93biB9XG4gIGNvbnN0IGV2aWRlbmNlID0gKHJ1bnRpbWUgYXMgYW55KVtSVU5USU1FX1NFUlZJQ0VTX0VWSURFTkNFXSBhcyBSdW50aW1lU2VydmljZXNFdmlkZW5jZSB8IHVuZGVmaW5lZFxuICBpZiAoIWV2aWRlbmNlKSB7XG4gICAgY29uc3QgbXNnID0gaXNEZXZFbnYoKVxuICAgICAgPyBbXG4gICAgICAgICAgXCJbTWlzc2luZ1J1bnRpbWVTZXJ2aWNlc0V2aWRlbmNlXSBSdW50aW1lIHNlcnZpY2VzIGV2aWRlbmNlIG5vdCBpbnN0YWxsZWQgb24gTW9kdWxlUnVudGltZSBpbnN0YW5jZS5cIixcbiAgICAgICAgICBgc2NvcGU6ICR7Zm9ybWF0U2NvcGUoc2NvcGUubW9kdWxlSWQsIHNjb3BlLmluc3RhbmNlSWQpfWAsXG4gICAgICAgICAgXCJmaXg6XCIsXG4gICAgICAgICAgXCItIEVuc3VyZSBNb2R1bGVSdW50aW1lLm1ha2UgYXNzZW1ibGVzIFJ1bnRpbWVLZXJuZWwgYW5kIGF0dGFjaGVzIGV2aWRlbmNlICgwMjAgVVMyKS5cIixcbiAgICAgICAgICBcIi0gSWYgeW91IGNyZWF0ZWQgYSBtb2NrIHJ1bnRpbWUgZm9yIHRlc3RzLCBhdHRhY2ggZXZpZGVuY2Ugb3IgYXZvaWQgY2FsbGluZyBldmlkZW5jZS1vbmx5IEFQSXMuXCIsXG4gICAgICAgIF0uam9pbihcIlxcblwiKVxuICAgICAgOiBcIlJ1bnRpbWUgc2VydmljZXMgZXZpZGVuY2Ugbm90IGluc3RhbGxlZFwiXG4gICAgdGhyb3cgbmV3IEVycm9yKG1zZylcbiAgfVxuXG4gIGNvbnN0IHJ1bnRpbWVJbnN0YW5jZUlkID0gc2NvcGUuaW5zdGFuY2VJZFxuICBpZiAoXG4gICAgdHlwZW9mIHJ1bnRpbWVJbnN0YW5jZUlkID09PSBcInN0cmluZ1wiICYmXG4gICAgcnVudGltZUluc3RhbmNlSWQubGVuZ3RoID4gMCAmJlxuICAgIHJ1bnRpbWVJbnN0YW5jZUlkICE9PSBldmlkZW5jZS5pbnN0YW5jZUlkXG4gICkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGlzRGV2RW52KClcbiAgICAgICAgPyBbXG4gICAgICAgICAgICBcIltJbmNvbnNpc3RlbnRSdW50aW1lU2VydmljZXNFdmlkZW5jZV0gUnVudGltZSBzZXJ2aWNlcyBldmlkZW5jZSBpbnN0YW5jZUlkIG1pc21hdGNoLlwiLFxuICAgICAgICAgICAgYHJ1bnRpbWU6ICR7Zm9ybWF0U2NvcGUoc2NvcGUubW9kdWxlSWQsIHJ1bnRpbWVJbnN0YW5jZUlkKX1gLFxuICAgICAgICAgICAgYGV2aWRlbmNlOiAke2Zvcm1hdFNjb3BlKGV2aWRlbmNlLm1vZHVsZUlkLCBldmlkZW5jZS5pbnN0YW5jZUlkKX1gLFxuICAgICAgICAgIF0uam9pbihcIlxcblwiKVxuICAgICAgICA6IFwiUnVudGltZSBzZXJ2aWNlcyBldmlkZW5jZSBtaXNtYXRjaFwiLFxuICAgIClcbiAgfVxuXG4gIHJldHVybiBldmlkZW5jZVxufVxuIiwgImltcG9ydCB7IENvbnRleHQsIEVmZmVjdCwgRmliZXJSZWYsIExheWVyIH0gZnJvbSBcImVmZmVjdFwiXG5pbXBvcnQgdHlwZSB7IEpzb25WYWx1ZSB9IGZyb20gXCIuL2pzb25WYWx1ZS5qc1wiXG5pbXBvcnQgeyBwcm9qZWN0SnNvblZhbHVlIH0gZnJvbSBcIi4vanNvblZhbHVlLmpzXCJcbmltcG9ydCB0eXBlIHsgRXZpZGVuY2VQYWNrYWdlIH0gZnJvbSBcIi4vZXZpZGVuY2UuanNcIlxuaW1wb3J0IHR5cGUgeyBSdW5TZXNzaW9uIH0gZnJvbSBcIi4vcnVuU2Vzc2lvbi5qc1wiXG5pbXBvcnQgeyBtYWtlRXZpZGVuY2VTaW5rIH0gZnJvbSBcIi4vcnVuU2Vzc2lvbi5qc1wiXG5pbXBvcnQge1xuICBjdXJyZW50RGlhZ25vc3RpY3NMZXZlbCxcbiAgdG9SdW50aW1lRGVidWdFdmVudFJlZixcbiAgdHlwZSBFdmVudCBhcyBEZWJ1Z0V2ZW50LFxuICB0eXBlIFNpbmsgYXMgRGVidWdTaW5rLFxufSBmcm9tIFwiLi4vcnVudGltZS9jb3JlL0RlYnVnU2luay5qc1wiXG5cbmV4cG9ydCBpbnRlcmZhY2UgRXZpZGVuY2VDb2xsZWN0b3Ige1xuICByZWFkb25seSBzZXNzaW9uOiBSdW5TZXNzaW9uXG4gIHJlYWRvbmx5IGRlYnVnU2luazogRGVidWdTaW5rXG4gIHJlYWRvbmx5IHJlZ2lzdGVyQ29udmVyZ2VTdGF0aWNJcjogKHN0YXRpY0lyOiB1bmtub3duKSA9PiB2b2lkXG4gIHJlYWRvbmx5IHNldFJ1bnRpbWVTZXJ2aWNlc0V2aWRlbmNlOiAoZXZpZGVuY2U6IHVua25vd24pID0+IHZvaWRcbiAgcmVhZG9ubHkgZXhwb3J0RXZpZGVuY2VQYWNrYWdlOiAob3B0aW9ucz86IHsgcmVhZG9ubHkgbWF4RXZlbnRzPzogbnVtYmVyIH0pID0+IEV2aWRlbmNlUGFja2FnZVxuICByZWFkb25seSBjbGVhcjogKCkgPT4gdm9pZFxufVxuXG5jbGFzcyBFdmlkZW5jZUNvbGxlY3RvclRhZ0ltcGwgZXh0ZW5kcyBDb250ZXh0LlRhZyhcbiAgXCJAbG9naXgvY29yZS9FdmlkZW5jZUNvbGxlY3RvclwiLFxuKTxFdmlkZW5jZUNvbGxlY3RvclRhZ0ltcGwsIEV2aWRlbmNlQ29sbGVjdG9yPigpIHt9XG5cbmV4cG9ydCBjb25zdCBFdmlkZW5jZUNvbGxlY3RvclRhZyA9IEV2aWRlbmNlQ29sbGVjdG9yVGFnSW1wbFxuXG5leHBvcnQgY29uc3QgZXZpZGVuY2VDb2xsZWN0b3JMYXllciA9IChcbiAgY29sbGVjdG9yOiBFdmlkZW5jZUNvbGxlY3Rvcixcbik6IExheWVyLkxheWVyPEV2aWRlbmNlQ29sbGVjdG9yVGFnSW1wbCwgbmV2ZXIsIG5ldmVyPiA9PlxuICBMYXllci5zdWNjZWVkKEV2aWRlbmNlQ29sbGVjdG9yVGFnLCBjb2xsZWN0b3IpIGFzIExheWVyLkxheWVyPFxuICAgIEV2aWRlbmNlQ29sbGVjdG9yVGFnSW1wbCxcbiAgICBuZXZlcixcbiAgICBuZXZlclxuICA+XG5cbmNvbnN0IGlzUmVjb3JkID0gKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPT5cbiAgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmIHZhbHVlICE9PSBudWxsICYmICFBcnJheS5pc0FycmF5KHZhbHVlKVxuXG5leHBvcnQgY29uc3QgbWFrZUV2aWRlbmNlQ29sbGVjdG9yID0gKHNlc3Npb246IFJ1blNlc3Npb24pOiBFdmlkZW5jZUNvbGxlY3RvciA9PiB7XG4gIGNvbnN0IHNpbmsgPSBtYWtlRXZpZGVuY2VTaW5rKHNlc3Npb24pXG5cbiAgY29uc3QgY29udmVyZ2VTdGF0aWNJckJ5RGlnZXN0ID0gbmV3IE1hcDxzdHJpbmcsIEpzb25WYWx1ZT4oKVxuICBsZXQgcnVudGltZVNlcnZpY2VzRXZpZGVuY2U6IEpzb25WYWx1ZSB8IHVuZGVmaW5lZFxuXG4gIGNvbnN0IGV4cG9ydEJ1ZGdldCA9IHtcbiAgICBkcm9wcGVkOiAwLFxuICAgIG92ZXJzaXplZDogMCxcbiAgICBub25TZXJpYWxpemFibGU6IDAsXG4gIH1cblxuICBjb25zdCBkZWJ1Z1Npbms6IERlYnVnU2luayA9IHtcbiAgICByZWNvcmQ6IChldmVudDogRGVidWdFdmVudCkgPT5cbiAgICAgIEVmZmVjdC5nZW4oZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgbGV2ZWwgPSB5aWVsZCogRmliZXJSZWYuZ2V0KGN1cnJlbnREaWFnbm9zdGljc0xldmVsKVxuICAgICAgICBjb25zdCBpbnN0YW5jZUlkUmF3ID0gKGV2ZW50IGFzIGFueSkuaW5zdGFuY2VJZFxuICAgICAgICBjb25zdCBpbnN0YW5jZUlkID1cbiAgICAgICAgICB0eXBlb2YgaW5zdGFuY2VJZFJhdyA9PT0gXCJzdHJpbmdcIiAmJiBpbnN0YW5jZUlkUmF3Lmxlbmd0aCA+IDBcbiAgICAgICAgICAgID8gaW5zdGFuY2VJZFJhd1xuICAgICAgICAgICAgOiBcInVua25vd25cIlxuICAgICAgICBjb25zdCBldmVudFNlcSA9XG4gICAgICAgICAgbGV2ZWwgPT09IFwib2ZmXCJcbiAgICAgICAgICAgID8gdW5kZWZpbmVkXG4gICAgICAgICAgICA6IHNlc3Npb24ubG9jYWwubmV4dFNlcShcImV2ZW50U2VxXCIsIGluc3RhbmNlSWQpXG4gICAgICAgIGNvbnN0IHJlZiA9IHRvUnVudGltZURlYnVnRXZlbnRSZWYoZXZlbnQsIHtcbiAgICAgICAgICBkaWFnbm9zdGljc0xldmVsOiBsZXZlbCxcbiAgICAgICAgICBldmVudFNlcSxcbiAgICAgICAgICBvbk1ldGFQcm9qZWN0aW9uOiAoeyBzdGF0cyB9KSA9PiB7XG4gICAgICAgICAgICBleHBvcnRCdWRnZXQuZHJvcHBlZCArPSBzdGF0cy5kcm9wcGVkXG4gICAgICAgICAgICBleHBvcnRCdWRnZXQub3ZlcnNpemVkICs9IHN0YXRzLm92ZXJzaXplZFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pXG4gICAgICAgIGlmICghcmVmKSByZXR1cm5cblxuICAgICAgICBjb25zdCBwcm9qZWN0ZWQgPSBwcm9qZWN0SnNvblZhbHVlKHJlZilcbiAgICAgICAgZXhwb3J0QnVkZ2V0LmRyb3BwZWQgKz0gcHJvamVjdGVkLnN0YXRzLmRyb3BwZWRcbiAgICAgICAgZXhwb3J0QnVkZ2V0Lm92ZXJzaXplZCArPSBwcm9qZWN0ZWQuc3RhdHMub3ZlcnNpemVkXG4gICAgICAgIGV4cG9ydEJ1ZGdldC5ub25TZXJpYWxpemFibGUgKz0gcHJvamVjdGVkLnN0YXRzLm5vblNlcmlhbGl6YWJsZVxuXG4gICAgICAgIHNpbmsucmVjb3JkKFwiZGVidWc6ZXZlbnRcIiwgcHJvamVjdGVkLnZhbHVlLCB7XG4gICAgICAgICAgdGltZXN0YW1wOiByZWYudGltZXN0YW1wLFxuICAgICAgICB9KVxuICAgICAgfSksXG4gIH1cblxuICBjb25zdCByZWdpc3RlckNvbnZlcmdlU3RhdGljSXIgPSAoc3RhdGljSXI6IHVua25vd24pOiB2b2lkID0+IHtcbiAgICBpZiAoIWlzUmVjb3JkKHN0YXRpY0lyKSkgcmV0dXJuXG4gICAgY29uc3QgZGlnZXN0ID0gc3RhdGljSXIuc3RhdGljSXJEaWdlc3RcbiAgICBpZiAodHlwZW9mIGRpZ2VzdCAhPT0gXCJzdHJpbmdcIiB8fCBkaWdlc3QubGVuZ3RoID09PSAwKSByZXR1cm5cbiAgICBjb25zdCBwcm9qZWN0ZWQgPSBwcm9qZWN0SnNvblZhbHVlKHN0YXRpY0lyKVxuICAgIGV4cG9ydEJ1ZGdldC5kcm9wcGVkICs9IHByb2plY3RlZC5zdGF0cy5kcm9wcGVkXG4gICAgZXhwb3J0QnVkZ2V0Lm92ZXJzaXplZCArPSBwcm9qZWN0ZWQuc3RhdHMub3ZlcnNpemVkXG4gICAgZXhwb3J0QnVkZ2V0Lm5vblNlcmlhbGl6YWJsZSArPSBwcm9qZWN0ZWQuc3RhdHMubm9uU2VyaWFsaXphYmxlXG4gICAgY29udmVyZ2VTdGF0aWNJckJ5RGlnZXN0LnNldChkaWdlc3QsIHByb2plY3RlZC52YWx1ZSlcbiAgfVxuXG4gIGNvbnN0IHNldFJ1bnRpbWVTZXJ2aWNlc0V2aWRlbmNlID0gKGV2aWRlbmNlOiB1bmtub3duKTogdm9pZCA9PiB7XG4gICAgY29uc3QgcHJvamVjdGVkID0gcHJvamVjdEpzb25WYWx1ZShldmlkZW5jZSlcbiAgICBleHBvcnRCdWRnZXQuZHJvcHBlZCArPSBwcm9qZWN0ZWQuc3RhdHMuZHJvcHBlZFxuICAgIGV4cG9ydEJ1ZGdldC5vdmVyc2l6ZWQgKz0gcHJvamVjdGVkLnN0YXRzLm92ZXJzaXplZFxuICAgIGV4cG9ydEJ1ZGdldC5ub25TZXJpYWxpemFibGUgKz0gcHJvamVjdGVkLnN0YXRzLm5vblNlcmlhbGl6YWJsZVxuICAgIHJ1bnRpbWVTZXJ2aWNlc0V2aWRlbmNlID0gcHJvamVjdGVkLnZhbHVlXG4gIH1cblxuICBjb25zdCBleHBvcnRFdmlkZW5jZVBhY2thZ2UgPSAob3B0aW9ucz86IHtcbiAgICByZWFkb25seSBtYXhFdmVudHM/OiBudW1iZXJcbiAgfSk6IEV2aWRlbmNlUGFja2FnZSA9PiB7XG4gICAgY29uc3QgY29udmVyZ2VTdW1tYXJ5ID1cbiAgICAgIGNvbnZlcmdlU3RhdGljSXJCeURpZ2VzdC5zaXplID4gMFxuICAgICAgICA/ICh7XG4gICAgICAgICAgICBzdGF0aWNJckJ5RGlnZXN0OiBPYmplY3QuZnJvbUVudHJpZXMoY29udmVyZ2VTdGF0aWNJckJ5RGlnZXN0KSxcbiAgICAgICAgICB9IGFzIHVua25vd24gYXMgSnNvblZhbHVlKVxuICAgICAgICA6IHVuZGVmaW5lZFxuXG4gICAgY29uc3QgcnVudGltZVN1bW1hcnkgPVxuICAgICAgcnVudGltZVNlcnZpY2VzRXZpZGVuY2UgIT0gbnVsbFxuICAgICAgICA/ICh7IHNlcnZpY2VzOiBydW50aW1lU2VydmljZXNFdmlkZW5jZSB9IGFzIHVua25vd24gYXMgSnNvblZhbHVlKVxuICAgICAgICA6IHVuZGVmaW5lZFxuXG4gICAgY29uc3Qgc3VtbWFyeSA9XG4gICAgICBjb252ZXJnZVN1bW1hcnkgIT0gbnVsbCB8fCBydW50aW1lU3VtbWFyeSAhPSBudWxsXG4gICAgICAgID8gKHtcbiAgICAgICAgICAgIC4uLihjb252ZXJnZVN1bW1hcnkgIT0gbnVsbCA/IHsgY29udmVyZ2U6IGNvbnZlcmdlU3VtbWFyeSB9IDoge30pLFxuICAgICAgICAgICAgLi4uKHJ1bnRpbWVTdW1tYXJ5ICE9IG51bGwgPyB7IHJ1bnRpbWU6IHJ1bnRpbWVTdW1tYXJ5IH0gOiB7fSksXG4gICAgICAgICAgfSBhcyB1bmtub3duIGFzIEpzb25WYWx1ZSlcbiAgICAgICAgOiB1bmRlZmluZWRcblxuICAgIHJldHVybiBzaW5rLmV4cG9ydCh7XG4gICAgICBtYXhFdmVudHM6IG9wdGlvbnM/Lm1heEV2ZW50cyxcbiAgICAgIHN1bW1hcnksXG4gICAgfSlcbiAgfVxuXG4gIGNvbnN0IGNsZWFyID0gKCk6IHZvaWQgPT4ge1xuICAgIHNpbmsuY2xlYXIoKVxuICAgIGNvbnZlcmdlU3RhdGljSXJCeURpZ2VzdC5jbGVhcigpXG4gICAgcnVudGltZVNlcnZpY2VzRXZpZGVuY2UgPSB1bmRlZmluZWRcbiAgICBleHBvcnRCdWRnZXQuZHJvcHBlZCA9IDBcbiAgICBleHBvcnRCdWRnZXQub3ZlcnNpemVkID0gMFxuICAgIGV4cG9ydEJ1ZGdldC5ub25TZXJpYWxpemFibGUgPSAwXG4gIH1cblxuICByZXR1cm4ge1xuICAgIHNlc3Npb24sXG4gICAgZGVidWdTaW5rLFxuICAgIHJlZ2lzdGVyQ29udmVyZ2VTdGF0aWNJcixcbiAgICBzZXRSdW50aW1lU2VydmljZXNFdmlkZW5jZSxcbiAgICBleHBvcnRFdmlkZW5jZVBhY2thZ2UsXG4gICAgY2xlYXIsXG4gIH1cbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7O0FBQUEsU0FBUyxTQUFTLFFBQVEsY0FBYztBQWdDeEMsSUFBTSxzQ0FBTixjQUFrRCxRQUFRO0FBQUEsRUFDeEQ7QUFDRixFQUFxRSxFQUFFO0FBQUM7QUFFakUsSUFBTSxrQ0FBa0M7QUFTL0MsSUFBTSwwQ0FBTixjQUFzRCxRQUFRO0FBQUEsRUFDNUQ7QUFDRixFQUE2RSxFQUFFO0FBQUM7QUFFekUsSUFBTSxzQ0FBc0M7QUFFbkQsSUFBTSwwQ0FBTixjQUFzRCxRQUFRO0FBQUEsRUFDNUQ7QUFDRixFQUFxRSxFQUFFO0FBQUM7QUFFakUsSUFBTSxzQ0FBc0M7QUFtQm5ELElBQU0saUJBQStDO0FBQUEsRUFDbkQ7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FB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QUksQ0FBQztBQUFBLE1BQy9ELEdBQUksa0JBQWtCLE9BQU8sRUFBRSxTQUFTLGVBQWUsSUFBSSxDQUFDO0FBQUEsSUFDOUQsSUFDQTtBQUVOLFdBQU8sS0FBSyxPQUFPO0FBQUEsTUFDakIsV0FBVyxTQUFTO0FBQUEsTUFDcEI7QUFBQSxJQUNGLENBQUM7QUFBQSxFQUNIO0FBRUEsUUFBTSxRQUFRLE1BQVk7QUFDeEIsU0FBSyxNQUFNO0FBQ1gsNkJBQXlCLE1BQU07QUFDL0IsOEJBQTBCO0FBQzFCLGlCQUFhLFVBQVU7QUFDdkIsaUJBQWEsWUFBWTtBQUN6QixpQkFBYSxrQkFBa0I7QUFBQSxFQUNqQztBQUVBLFNBQU87QUFBQSxJQUNMO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBLDRCQUFBQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsRUFDRjtBQUNGOyIsCiAgIm5hbWVzIjogWyJDb250ZXh0IiwgIkVmZmVjdCIsICJDb250ZXh0IiwgIkVmZmVjdCIsICJzZXRSdW50aW1lU2VydmljZXNFdmlkZW5jZSJdCn0K
|