rightsize 0.1.2 → 0.2.0
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/README.md +28 -4
- package/dist/backend-docker/backend.d.ts +53 -1
- package/dist/backend-docker/backend.d.ts.map +1 -1
- package/dist/backend-docker/backend.js +106 -13
- package/dist/backend-docker/backend.js.map +1 -1
- package/dist/backend-docker/labels.d.ts +27 -5
- package/dist/backend-docker/labels.d.ts.map +1 -1
- package/dist/backend-docker/labels.js +33 -5
- package/dist/backend-docker/labels.js.map +1 -1
- package/dist/backend-msb/backend.d.ts +35 -6
- package/dist/backend-msb/backend.d.ts.map +1 -1
- package/dist/backend-msb/backend.js +69 -14
- package/dist/backend-msb/backend.js.map +1 -1
- package/dist/backend-msb/provider.d.ts.map +1 -1
- package/dist/backend-msb/provider.js +7 -11
- package/dist/backend-msb/provider.js.map +1 -1
- package/dist/backend-msb/provisioner.d.ts.map +1 -1
- package/dist/backend-msb/provisioner.js +1 -20
- package/dist/backend-msb/provisioner.js.map +1 -1
- package/dist/core/backend.d.ts +73 -0
- package/dist/core/backend.d.ts.map +1 -1
- package/dist/core/backends.d.ts +16 -2
- package/dist/core/backends.d.ts.map +1 -1
- package/dist/core/backends.js +39 -5
- package/dist/core/backends.js.map +1 -1
- package/dist/core/cache-dir.d.ts +17 -0
- package/dist/core/cache-dir.d.ts.map +1 -0
- package/dist/core/cache-dir.js +29 -0
- package/dist/core/cache-dir.js.map +1 -0
- package/dist/core/cleanup.d.ts +19 -4
- package/dist/core/cleanup.d.ts.map +1 -1
- package/dist/core/cleanup.js +14 -27
- package/dist/core/cleanup.js.map +1 -1
- package/dist/core/diagnostics.d.ts +33 -0
- package/dist/core/diagnostics.d.ts.map +1 -0
- package/dist/core/diagnostics.js +76 -0
- package/dist/core/diagnostics.js.map +1 -0
- package/dist/core/errors.d.ts +41 -0
- package/dist/core/errors.d.ts.map +1 -1
- package/dist/core/errors.js +56 -0
- package/dist/core/errors.js.map +1 -1
- package/dist/core/generic-container.d.ts +107 -1
- package/dist/core/generic-container.d.ts.map +1 -1
- package/dist/core/generic-container.js +417 -3
- package/dist/core/generic-container.js.map +1 -1
- package/dist/core/model.d.ts +22 -0
- package/dist/core/model.d.ts.map +1 -1
- package/dist/core/network.d.ts.map +1 -1
- package/dist/core/network.js +2 -0
- package/dist/core/network.js.map +1 -1
- package/dist/core/reaper/env.d.ts +14 -0
- package/dist/core/reaper/env.d.ts.map +1 -0
- package/dist/core/reaper/env.js +22 -0
- package/dist/core/reaper/env.js.map +1 -0
- package/dist/core/reaper/init.d.ts +39 -0
- package/dist/core/reaper/init.d.ts.map +1 -0
- package/dist/core/reaper/init.js +140 -0
- package/dist/core/reaper/init.js.map +1 -0
- package/dist/core/reaper/ledger.d.ts +32 -0
- package/dist/core/reaper/ledger.d.ts.map +1 -0
- package/dist/core/reaper/ledger.js +160 -0
- package/dist/core/reaper/ledger.js.map +1 -0
- package/dist/core/reaper/process-liveness.d.ts +39 -0
- package/dist/core/reaper/process-liveness.d.ts.map +1 -0
- package/dist/core/reaper/process-liveness.js +117 -0
- package/dist/core/reaper/process-liveness.js.map +1 -0
- package/dist/core/reaper/run-record.d.ts +48 -0
- package/dist/core/reaper/run-record.d.ts.map +1 -0
- package/dist/core/reaper/run-record.js +58 -0
- package/dist/core/reaper/run-record.js.map +1 -0
- package/dist/core/reaper/sweep.d.ts +23 -0
- package/dist/core/reaper/sweep.d.ts.map +1 -0
- package/dist/core/reaper/sweep.js +76 -0
- package/dist/core/reaper/sweep.js.map +1 -0
- package/dist/core/reaper/watchdog.d.ts +100 -0
- package/dist/core/reaper/watchdog.d.ts.map +1 -0
- package/dist/core/reaper/watchdog.js +412 -0
- package/dist/core/reaper/watchdog.js.map +1 -0
- package/dist/core/reuse/env.d.ts +12 -0
- package/dist/core/reuse/env.d.ts.map +1 -0
- package/dist/core/reuse/env.js +15 -0
- package/dist/core/reuse/env.js.map +1 -0
- package/dist/core/reuse/hash.d.ts +34 -0
- package/dist/core/reuse/hash.d.ts.map +1 -0
- package/dist/core/reuse/hash.js +52 -0
- package/dist/core/reuse/hash.js.map +1 -0
- package/dist/core/reuse/registry.d.ts +50 -0
- package/dist/core/reuse/registry.d.ts.map +1 -0
- package/dist/core/reuse/registry.js +75 -0
- package/dist/core/reuse/registry.js.map +1 -0
- package/dist/index.d.ts +5 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/dist/backend-msb/reaper.d.ts +0 -10
- package/dist/backend-msb/reaper.d.ts.map +0 -1
- package/dist/backend-msb/reaper.js +0 -73
- package/dist/backend-msb/reaper.js.map +0 -1
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import * as fsp from "node:fs/promises";
|
|
2
|
+
import * as path from "node:path";
|
|
3
|
+
/** `<cacheDir>/reuse` — the directory every reuse registry file lives under. */
|
|
4
|
+
export function reuseDir(cacheDir) {
|
|
5
|
+
return path.join(cacheDir, "reuse");
|
|
6
|
+
}
|
|
7
|
+
/** `reuse/<hash>.json`. */
|
|
8
|
+
export function reusePath(cacheDir, hash) {
|
|
9
|
+
return path.join(reuseDir(cacheDir), `${hash}.json`);
|
|
10
|
+
}
|
|
11
|
+
function isRegistryEntry(value) {
|
|
12
|
+
if (typeof value !== "object" || value === null) {
|
|
13
|
+
return false;
|
|
14
|
+
}
|
|
15
|
+
const rec = value;
|
|
16
|
+
if (typeof rec["name"] !== "string" ||
|
|
17
|
+
typeof rec["image"] !== "string" ||
|
|
18
|
+
typeof rec["createdIso"] !== "string" ||
|
|
19
|
+
typeof rec["backend"] !== "string") {
|
|
20
|
+
return false;
|
|
21
|
+
}
|
|
22
|
+
const ports = rec["ports"];
|
|
23
|
+
if (typeof ports !== "object" || ports === null || Array.isArray(ports)) {
|
|
24
|
+
return false;
|
|
25
|
+
}
|
|
26
|
+
return Object.values(ports).every((v) => typeof v === "number");
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Reads and parses `reuse/<hash>.json`. `"missing"` means the file does not
|
|
30
|
+
* exist at all (the common "never created yet" case); `"corrupt"` means it
|
|
31
|
+
* exists but isn't a well-shaped `ReuseRegistryEntry` — malformed JSON or a
|
|
32
|
+
* missing/mistyped required field — distinct from `"missing"` because the
|
|
33
|
+
* adopt path's fallback behavior differs (see `hash.ts`'s sibling module doc
|
|
34
|
+
* and the reuse spec).
|
|
35
|
+
*/
|
|
36
|
+
export async function readRegistry(cacheDir, hash) {
|
|
37
|
+
let text;
|
|
38
|
+
try {
|
|
39
|
+
text = await fsp.readFile(reusePath(cacheDir, hash), "utf8");
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
return { kind: "missing" };
|
|
43
|
+
}
|
|
44
|
+
let parsed;
|
|
45
|
+
try {
|
|
46
|
+
parsed = JSON.parse(text);
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
49
|
+
return { kind: "corrupt" };
|
|
50
|
+
}
|
|
51
|
+
if (!isRegistryEntry(parsed)) {
|
|
52
|
+
return { kind: "corrupt" };
|
|
53
|
+
}
|
|
54
|
+
return { kind: "found", entry: parsed };
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Atomically writes `reuse/<hash>.json` (tmp file + rename, same protocol as
|
|
58
|
+
* the reaping ledger's `writeRunRecord`) — called once, after a fresh reuse
|
|
59
|
+
* container's wait strategy has confirmed readiness. A concurrent reader
|
|
60
|
+
* only ever observes either the previous complete file or this one, never a
|
|
61
|
+
* partial write.
|
|
62
|
+
*/
|
|
63
|
+
export async function writeRegistryAtomic(cacheDir, hash, entry) {
|
|
64
|
+
const dir = reuseDir(cacheDir);
|
|
65
|
+
await fsp.mkdir(dir, { recursive: true });
|
|
66
|
+
const target = reusePath(cacheDir, hash);
|
|
67
|
+
const tmp = path.join(dir, `.${hash}.json.tmp-${process.pid}-${Date.now()}`);
|
|
68
|
+
await fsp.writeFile(tmp, JSON.stringify(entry));
|
|
69
|
+
await fsp.rename(tmp, target);
|
|
70
|
+
}
|
|
71
|
+
/** Best-effort delete of `reuse/<hash>.json`. A file already gone is not an error. */
|
|
72
|
+
export async function removeRegistry(cacheDir, hash) {
|
|
73
|
+
await fsp.unlink(reusePath(cacheDir, hash)).catch(() => { });
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/core/reuse/registry.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -11,9 +11,9 @@
|
|
|
11
11
|
*
|
|
12
12
|
* @packageDocumentation
|
|
13
13
|
*/
|
|
14
|
-
export { UnsupportedByBackendError, PortBindConflictError, ContainerLaunchError, BackendError, ProvisionError, } from "./core/errors.js";
|
|
15
|
-
export type { PortBinding, FileMount, ExecResult, ContainerSpec } from "./core/model.js";
|
|
16
|
-
export type { NetworkLink, SandboxHandle, FollowHandle, SandboxBackend, BackendProvider } from "./core/backend.js";
|
|
14
|
+
export { UnsupportedByBackendError, PortBindConflictError, ContainerLaunchError, BackendError, ProvisionError, ReuseWithNetworkError, IsolationRequiredError, CheckpointUnsupportedError, } from "./core/errors.js";
|
|
15
|
+
export type { PortBinding, FileMount, ExecResult, ContainerSpec, Checkpoint } from "./core/model.js";
|
|
16
|
+
export type { NetworkLink, SandboxHandle, FollowHandle, SandboxBackend, BackendProvider, ReaperKillCommand, BackendCapabilities, } from "./core/backend.js";
|
|
17
17
|
export { registerBackend, Backends } from "./core/backends.js";
|
|
18
18
|
export { FreePorts } from "./core/free-ports.js";
|
|
19
19
|
export { Wait, HttpWaitStrategy } from "./core/wait.js";
|
|
@@ -23,4 +23,6 @@ export { Network } from "./core/network.js";
|
|
|
23
23
|
export type { NetworkMember } from "./core/network.js";
|
|
24
24
|
export { MountableFile } from "./core/mountable-file.js";
|
|
25
25
|
export { GenericContainer } from "./core/generic-container.js";
|
|
26
|
+
export { diagnostics, registerDiagnostics } from "./core/diagnostics.js";
|
|
27
|
+
export type { FailureHook } from "./core/diagnostics.js";
|
|
26
28
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,EACL,yBAAyB,EACzB,qBAAqB,EACrB,oBAAoB,EACpB,YAAY,EACZ,cAAc,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,EACL,yBAAyB,EACzB,qBAAqB,EACrB,oBAAoB,EACpB,YAAY,EACZ,cAAc,EACd,qBAAqB,EACrB,sBAAsB,EACtB,0BAA0B,GAC3B,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EAAE,WAAW,EAAE,SAAS,EAAE,UAAU,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AACrG,YAAY,EACV,WAAW,EACX,aAAa,EACb,YAAY,EACZ,cAAc,EACd,eAAe,EACf,iBAAiB,EACjB,mBAAmB,GACpB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,IAAI,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACxD,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC/D,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAC5C,YAAY,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AACzE,YAAY,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
*
|
|
12
12
|
* @packageDocumentation
|
|
13
13
|
*/
|
|
14
|
-
export { UnsupportedByBackendError, PortBindConflictError, ContainerLaunchError, BackendError, ProvisionError, } from "./core/errors.js";
|
|
14
|
+
export { UnsupportedByBackendError, PortBindConflictError, ContainerLaunchError, BackendError, ProvisionError, ReuseWithNetworkError, IsolationRequiredError, CheckpointUnsupportedError, } from "./core/errors.js";
|
|
15
15
|
export { registerBackend, Backends } from "./core/backends.js";
|
|
16
16
|
export { FreePorts } from "./core/free-ports.js";
|
|
17
17
|
export { Wait, HttpWaitStrategy } from "./core/wait.js";
|
|
@@ -19,4 +19,5 @@ export { RunId } from "./core/run-id.js";
|
|
|
19
19
|
export { Network } from "./core/network.js";
|
|
20
20
|
export { MountableFile } from "./core/mountable-file.js";
|
|
21
21
|
export { GenericContainer } from "./core/generic-container.js";
|
|
22
|
+
export { diagnostics, registerDiagnostics } from "./core/diagnostics.js";
|
|
22
23
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,EACL,yBAAyB,EACzB,qBAAqB,EACrB,oBAAoB,EACpB,YAAY,EACZ,cAAc,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,EACL,yBAAyB,EACzB,qBAAqB,EACrB,oBAAoB,EACpB,YAAY,EACZ,cAAc,EACd,qBAAqB,EACrB,sBAAsB,EACtB,0BAA0B,GAC3B,MAAM,kBAAkB,CAAC;AAW1B,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,IAAI,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAExD,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAE5C,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Every `rz-<runid>-<seq>` name mentioned in `msb ls`'s output that does NOT
|
|
3
|
-
* belong to `thisRunId` — leftovers from a run that crashed before its own
|
|
4
|
-
* cleanup ran. Filtering happens against the SAME `RunId.value` core used to
|
|
5
|
-
* name this run's own containers (imported from `rightsize`, never
|
|
6
|
-
* recomputed here) — a backend-local run id would either reap this run's own
|
|
7
|
-
* live sandboxes or fail to recognize a genuinely stale one.
|
|
8
|
-
*/
|
|
9
|
-
export declare function orphanNames(lsOutput: string, thisRunId: string): string[];
|
|
10
|
-
//# sourceMappingURL=reaper.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"reaper.d.ts","sourceRoot":"","sources":["../../src/backend-msb/reaper.ts"],"names":[],"mappings":"AA0DA;;;;;;;GAOG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE,CASzE"}
|
|
@@ -1,73 +0,0 @@
|
|
|
1
|
-
function isHexDigit(ch) {
|
|
2
|
-
return ch !== undefined && /^[0-9a-f]$/i.test(ch);
|
|
3
|
-
}
|
|
4
|
-
function isDigit(ch) {
|
|
5
|
-
return ch !== undefined && ch >= "0" && ch <= "9";
|
|
6
|
-
}
|
|
7
|
-
/** A character that continues an identifier token: alphanumeric, `-`, or `_`. */
|
|
8
|
-
function isIdentContinue(ch) {
|
|
9
|
-
return ch !== undefined && /^[A-Za-z0-9_-]$/.test(ch);
|
|
10
|
-
}
|
|
11
|
-
/**
|
|
12
|
-
* Extracts every `rz-<8 hex>-<seq>`-shaped name appearing anywhere in `ls`
|
|
13
|
-
* output — a manual character scan rather than
|
|
14
|
-
* a `\b`-delimited regex. `\b` is a `\w` boundary and `\w` does not include
|
|
15
|
-
* `-`, so a naive `/\brz-[0-9a-f]{8}-\d+\b/` would treat `rz-deadbeef-1` as a
|
|
16
|
-
* complete match inside `rz-deadbeef-1-extra` (the `-` after the digits
|
|
17
|
-
* counts as a boundary) even though that's a glued-on continuation of a
|
|
18
|
-
* longer, different token — exactly the shape a second run's id could
|
|
19
|
-
* produce as a prefix of a name it doesn't own. Requiring the character
|
|
20
|
-
* immediately after the matched digits to NOT be an identifier-continue
|
|
21
|
-
* character keeps this a whole-token match instead of a false-positive
|
|
22
|
-
* prefix.
|
|
23
|
-
*/
|
|
24
|
-
function orphanCandidateNames(lsOutput) {
|
|
25
|
-
const names = [];
|
|
26
|
-
let i = 0;
|
|
27
|
-
const n = lsOutput.length;
|
|
28
|
-
while (i < n) {
|
|
29
|
-
if (lsOutput.startsWith("rz-", i)) {
|
|
30
|
-
const start = i;
|
|
31
|
-
let j = i + 3;
|
|
32
|
-
let hexLen = 0;
|
|
33
|
-
while (j < n && hexLen < 8 && isHexDigit(lsOutput[j])) {
|
|
34
|
-
j++;
|
|
35
|
-
hexLen++;
|
|
36
|
-
}
|
|
37
|
-
if (hexLen === 8 && lsOutput[j] === "-") {
|
|
38
|
-
let k = j + 1;
|
|
39
|
-
let digitLen = 0;
|
|
40
|
-
while (k < n && isDigit(lsOutput[k])) {
|
|
41
|
-
k++;
|
|
42
|
-
digitLen++;
|
|
43
|
-
}
|
|
44
|
-
if (digitLen > 0 && (k >= n || !isIdentContinue(lsOutput[k]))) {
|
|
45
|
-
names.push(lsOutput.slice(start, k));
|
|
46
|
-
i = k;
|
|
47
|
-
continue;
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
i++;
|
|
52
|
-
}
|
|
53
|
-
return names;
|
|
54
|
-
}
|
|
55
|
-
/**
|
|
56
|
-
* Every `rz-<runid>-<seq>` name mentioned in `msb ls`'s output that does NOT
|
|
57
|
-
* belong to `thisRunId` — leftovers from a run that crashed before its own
|
|
58
|
-
* cleanup ran. Filtering happens against the SAME `RunId.value` core used to
|
|
59
|
-
* name this run's own containers (imported from `rightsize`, never
|
|
60
|
-
* recomputed here) — a backend-local run id would either reap this run's own
|
|
61
|
-
* live sandboxes or fail to recognize a genuinely stale one.
|
|
62
|
-
*/
|
|
63
|
-
export function orphanNames(lsOutput, thisRunId) {
|
|
64
|
-
const mine = `rz-${thisRunId}-`;
|
|
65
|
-
const seen = new Set();
|
|
66
|
-
for (const name of orphanCandidateNames(lsOutput)) {
|
|
67
|
-
if (!name.startsWith(mine)) {
|
|
68
|
-
seen.add(name);
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
return [...seen];
|
|
72
|
-
}
|
|
73
|
-
//# sourceMappingURL=reaper.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"reaper.js","sourceRoot":"","sources":["../../src/backend-msb/reaper.ts"],"names":[],"mappings":"AAAA,SAAS,UAAU,CAAC,EAAsB;IACxC,OAAO,EAAE,KAAK,SAAS,IAAI,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACpD,CAAC;AAED,SAAS,OAAO,CAAC,EAAsB;IACrC,OAAO,EAAE,KAAK,SAAS,IAAI,EAAE,IAAI,GAAG,IAAI,EAAE,IAAI,GAAG,CAAC;AACpD,CAAC;AAED,iFAAiF;AACjF,SAAS,eAAe,CAAC,EAAsB;IAC7C,OAAO,EAAE,KAAK,SAAS,IAAI,iBAAiB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACxD,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,SAAS,oBAAoB,CAAC,QAAgB;IAC5C,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,MAAM,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC;IAC1B,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACb,IAAI,QAAQ,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC;YAClC,MAAM,KAAK,GAAG,CAAC,CAAC;YAChB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACd,IAAI,MAAM,GAAG,CAAC,CAAC;YACf,OAAO,CAAC,GAAG,CAAC,IAAI,MAAM,GAAG,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBACtD,CAAC,EAAE,CAAC;gBACJ,MAAM,EAAE,CAAC;YACX,CAAC;YACD,IAAI,MAAM,KAAK,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;gBACxC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBACd,IAAI,QAAQ,GAAG,CAAC,CAAC;gBACjB,OAAO,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;oBACrC,CAAC,EAAE,CAAC;oBACJ,QAAQ,EAAE,CAAC;gBACb,CAAC;gBACD,IAAI,QAAQ,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;oBAC9D,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;oBACrC,CAAC,GAAG,CAAC,CAAC;oBACN,SAAS;gBACX,CAAC;YACH,CAAC;QACH,CAAC;QACD,CAAC,EAAE,CAAC;IACN,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,WAAW,CAAC,QAAgB,EAAE,SAAiB;IAC7D,MAAM,IAAI,GAAG,MAAM,SAAS,GAAG,CAAC;IAChC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,KAAK,MAAM,IAAI,IAAI,oBAAoB,CAAC,QAAQ,CAAC,EAAE,CAAC;QAClD,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YAC3B,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACjB,CAAC;IACH,CAAC;IACD,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC;AACnB,CAAC"}
|