@bluewombat/runtime 0.11.0 → 0.11.1
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 +84 -7
- package/SPECS.md +55 -9
- package/dist/cli.js +63 -0
- package/dist/cli.js.map +1 -1
- package/dist/config/load-config.d.ts.map +1 -1
- package/dist/config/load-config.js +2 -1
- package/dist/config/load-config.js.map +1 -1
- package/dist/config/types.d.ts +7 -0
- package/dist/config/types.d.ts.map +1 -1
- package/dist/loop/authority.d.ts +2 -0
- package/dist/loop/authority.d.ts.map +1 -1
- package/dist/loop/authority.js +11 -1
- package/dist/loop/authority.js.map +1 -1
- package/dist/loop/deliveries.d.ts.map +1 -1
- package/dist/loop/deliveries.js +19 -0
- package/dist/loop/deliveries.js.map +1 -1
- package/dist/loop/features.d.ts +14 -0
- package/dist/loop/features.d.ts.map +1 -1
- package/dist/loop/features.js +78 -35
- package/dist/loop/features.js.map +1 -1
- package/dist/loop/journal.d.ts +7 -0
- package/dist/loop/journal.d.ts.map +1 -1
- package/dist/loop/journal.js +23 -1
- package/dist/loop/journal.js.map +1 -1
- package/dist/loop/lock.d.ts +2 -0
- package/dist/loop/lock.d.ts.map +1 -1
- package/dist/loop/lock.js +10 -0
- package/dist/loop/lock.js.map +1 -1
- package/dist/loop/run-slot.d.ts +14 -0
- package/dist/loop/run-slot.d.ts.map +1 -1
- package/dist/loop/run-slot.js +53 -5
- package/dist/loop/run-slot.js.map +1 -1
- package/dist/loop/streams.js +2 -2
- package/dist/loop/streams.js.map +1 -1
- package/dist/loop/tick.d.ts.map +1 -1
- package/dist/loop/tick.js +2 -1
- package/dist/loop/tick.js.map +1 -1
- package/dist/loop/transformers.d.ts.map +1 -1
- package/dist/loop/transformers.js +5 -3
- package/dist/loop/transformers.js.map +1 -1
- package/dist/operator/dash-model.d.ts +65 -0
- package/dist/operator/dash-model.d.ts.map +1 -0
- package/dist/operator/dash-model.js +209 -0
- package/dist/operator/dash-model.js.map +1 -0
- package/dist/operator/dash-view.d.ts +16 -0
- package/dist/operator/dash-view.d.ts.map +1 -0
- package/dist/operator/dash-view.js +226 -0
- package/dist/operator/dash-view.js.map +1 -0
- package/dist/operator/dash.d.ts +34 -0
- package/dist/operator/dash.d.ts.map +1 -0
- package/dist/operator/dash.js +141 -0
- package/dist/operator/dash.js.map +1 -0
- package/dist/operator/doctor.d.ts.map +1 -1
- package/dist/operator/doctor.js +44 -1
- package/dist/operator/doctor.js.map +1 -1
- package/dist/operator/incident-dossier.d.ts +4 -4
- package/dist/operator/incident-dossier.d.ts.map +1 -1
- package/dist/operator/incident-dossier.js +14 -18
- package/dist/operator/incident-dossier.js.map +1 -1
- package/dist/operator/incident-system.d.ts +13 -4
- package/dist/operator/incident-system.d.ts.map +1 -1
- package/dist/operator/incident-system.js +68 -6
- package/dist/operator/incident-system.js.map +1 -1
- package/dist/operator/install.d.ts +9 -0
- package/dist/operator/install.d.ts.map +1 -0
- package/dist/operator/install.js +14 -0
- package/dist/operator/install.js.map +1 -0
- package/dist/operator/supervise/act.d.ts +37 -0
- package/dist/operator/supervise/act.d.ts.map +1 -0
- package/dist/operator/supervise/act.js +354 -0
- package/dist/operator/supervise/act.js.map +1 -0
- package/dist/operator/supervise/config.d.ts +74 -0
- package/dist/operator/supervise/config.d.ts.map +1 -0
- package/dist/operator/supervise/config.js +175 -0
- package/dist/operator/supervise/config.js.map +1 -0
- package/dist/operator/supervise/council.d.ts +45 -0
- package/dist/operator/supervise/council.d.ts.map +1 -0
- package/dist/operator/supervise/council.js +97 -0
- package/dist/operator/supervise/council.js.map +1 -0
- package/dist/operator/supervise/decision.d.ts +46 -0
- package/dist/operator/supervise/decision.d.ts.map +1 -0
- package/dist/operator/supervise/decision.js +137 -0
- package/dist/operator/supervise/decision.js.map +1 -0
- package/dist/operator/supervise/exec.d.ts +28 -0
- package/dist/operator/supervise/exec.d.ts.map +1 -0
- package/dist/operator/supervise/exec.js +47 -0
- package/dist/operator/supervise/exec.js.map +1 -0
- package/dist/operator/supervise/memory.d.ts +33 -0
- package/dist/operator/supervise/memory.d.ts.map +1 -0
- package/dist/operator/supervise/memory.js +73 -0
- package/dist/operator/supervise/memory.js.map +1 -0
- package/dist/operator/supervise/observe.d.ts +47 -0
- package/dist/operator/supervise/observe.d.ts.map +1 -0
- package/dist/operator/supervise/observe.js +73 -0
- package/dist/operator/supervise/observe.js.map +1 -0
- package/dist/operator/supervise/prompts.d.ts +60 -0
- package/dist/operator/supervise/prompts.d.ts.map +1 -0
- package/dist/operator/supervise/prompts.js +338 -0
- package/dist/operator/supervise/prompts.js.map +1 -0
- package/dist/operator/supervise/review.d.ts +24 -0
- package/dist/operator/supervise/review.d.ts.map +1 -0
- package/dist/operator/supervise/review.js +51 -0
- package/dist/operator/supervise/review.js.map +1 -0
- package/dist/operator/supervise/supervise.d.ts +26 -0
- package/dist/operator/supervise/supervise.d.ts.map +1 -0
- package/dist/operator/supervise/supervise.js +484 -0
- package/dist/operator/supervise/supervise.js.map +1 -0
- package/package.json +14 -14
|
@@ -4,8 +4,8 @@ import type { HostInvocation } from "../config/types.js";
|
|
|
4
4
|
*
|
|
5
5
|
* Versions, then what the configuration switched on, said in words and numbers.
|
|
6
6
|
* A command's arguments are not copied: one can carry a key. The raw
|
|
7
|
-
* configuration is included only when asked,
|
|
8
|
-
*
|
|
7
|
+
* configuration is included only when asked, parsed and blanked by path (see
|
|
8
|
+
* `redact`).
|
|
9
9
|
*/
|
|
10
10
|
export type SystemFacts = {
|
|
11
11
|
bluewombat: {
|
|
@@ -43,6 +43,15 @@ export type SystemInput = {
|
|
|
43
43
|
withConfig: boolean;
|
|
44
44
|
};
|
|
45
45
|
export declare function systemOf(input: SystemInput): SystemFacts;
|
|
46
|
-
/**
|
|
47
|
-
|
|
46
|
+
/**
|
|
47
|
+
* The configuration with no secret in it, or nothing when it cannot be read as YAML.
|
|
48
|
+
*
|
|
49
|
+
* It is parsed and blanked by path, not line by line: a key that looks like a
|
|
50
|
+
* secret hides its whole value (a scalar, a list, a map, a multi-line block);
|
|
51
|
+
* in a command's argument list the value after a secret-looking flag, or after
|
|
52
|
+
* its `=`, is blanked; anywhere else a string is blanked where it has the shape
|
|
53
|
+
* of a token, a private key or a URL's credentials. Comments are dropped: they
|
|
54
|
+
* can hold what the values do not.
|
|
55
|
+
*/
|
|
56
|
+
export declare function redact(text: string): string | undefined;
|
|
48
57
|
//# sourceMappingURL=incident-system.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"incident-system.d.ts","sourceRoot":"","sources":["../../src/operator/incident-system.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"incident-system.d.ts","sourceRoot":"","sources":["../../src/operator/incident-system.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAc,MAAM,oBAAoB,CAAC;AAGrE;;;;;;;GAOG;AACH,MAAM,MAAM,WAAW,GAAG;IACxB,UAAU,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;IAC7D,uEAAuE;IACvE,QAAQ,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC9C,MAAM,EAAE;QACN,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,GAAG,EAAE,MAAM,CAAC;QACZ,cAAc,EAAE,MAAM,CAAC;QACvB,aAAa,EAAE,MAAM,CAAC;QACtB,OAAO,EAAE,MAAM,CAAC;QAChB,SAAS,EAAE,MAAM,CAAC;QAClB,SAAS,EAAE,SAAS,GAAG,UAAU,GAAG,MAAM,CAAC;QAC3C,WAAW,EAAE,MAAM,CAAC;QACpB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC/B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAChC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;QAChC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC/B,OAAO,EAAE,IAAI,GAAG,KAAK,CAAC;QACtB,iFAAiF;QACjF,GAAG,CAAC,EAAE,MAAM,CAAC;KACd,CAAC;CACH,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,UAAU,EAAE,cAAc,CAAC;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,OAAO,CAAC;CACrB,CAAC;AAEF,wBAAgB,QAAQ,CAAC,KAAK,EAAE,WAAW,GAAG,WAAW,CAmCxD;AAoID;;;;;;;;;GASG;AACH,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAQvD"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { readdirSync, readFileSync } from "node:fs";
|
|
2
2
|
import { basename, join } from "node:path";
|
|
3
|
+
import { parse as parseYaml, stringify as stringifyYaml } from "yaml";
|
|
3
4
|
import { hasAgent } from "../config/types.js";
|
|
4
5
|
export function systemOf(input) {
|
|
5
6
|
const { invocation } = input;
|
|
@@ -133,7 +134,18 @@ function packagesOf(configDir) {
|
|
|
133
134
|
}
|
|
134
135
|
return found;
|
|
135
136
|
}
|
|
136
|
-
const
|
|
137
|
+
const SECRET_NAME = /token|secret|password|passwd|api[-_]?key|credential|private[-_]?key/i;
|
|
138
|
+
const BLANK = "<redacted>";
|
|
139
|
+
/** What a secret looks like when nothing around it says so. */
|
|
140
|
+
const SECRET_SHAPES = [
|
|
141
|
+
[/\b(?:gh[pousr]_|github_pat_)[A-Za-z0-9_]{20,}/g, BLANK],
|
|
142
|
+
[/\bsk-[A-Za-z0-9_-]{20,}/g, BLANK],
|
|
143
|
+
[/\bxox[abprs]-[A-Za-z0-9-]{10,}/g, BLANK],
|
|
144
|
+
[/\bAKIA[0-9A-Z]{16}\b/g, BLANK],
|
|
145
|
+
[/\beyJ[\w-]+\.[\w-]+\.[\w-]+/g, BLANK],
|
|
146
|
+
[/-----BEGIN [A-Z ]*PRIVATE KEY-----[\s\S]*?(?:-----END [A-Z ]*PRIVATE KEY-----|$)/g, BLANK],
|
|
147
|
+
[/(\w+:\/\/)[^\s/:@]+:[^\s/@]+@/g, `$1${BLANK}@`],
|
|
148
|
+
];
|
|
137
149
|
function readConfig(path) {
|
|
138
150
|
try {
|
|
139
151
|
return redact(readFileSync(path, "utf8"));
|
|
@@ -142,11 +154,61 @@ function readConfig(path) {
|
|
|
142
154
|
return undefined;
|
|
143
155
|
}
|
|
144
156
|
}
|
|
145
|
-
/**
|
|
157
|
+
/**
|
|
158
|
+
* The configuration with no secret in it, or nothing when it cannot be read as YAML.
|
|
159
|
+
*
|
|
160
|
+
* It is parsed and blanked by path, not line by line: a key that looks like a
|
|
161
|
+
* secret hides its whole value (a scalar, a list, a map, a multi-line block);
|
|
162
|
+
* in a command's argument list the value after a secret-looking flag, or after
|
|
163
|
+
* its `=`, is blanked; anywhere else a string is blanked where it has the shape
|
|
164
|
+
* of a token, a private key or a URL's credentials. Comments are dropped: they
|
|
165
|
+
* can hold what the values do not.
|
|
166
|
+
*/
|
|
146
167
|
export function redact(text) {
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
168
|
+
let parsed;
|
|
169
|
+
try {
|
|
170
|
+
parsed = parseYaml(text);
|
|
171
|
+
}
|
|
172
|
+
catch {
|
|
173
|
+
return undefined;
|
|
174
|
+
}
|
|
175
|
+
return stringifyYaml(blank(parsed));
|
|
176
|
+
}
|
|
177
|
+
function blank(value) {
|
|
178
|
+
if (typeof value === "string") {
|
|
179
|
+
return SECRET_SHAPES.reduce((kept, [shape, to]) => kept.replace(shape, to), value);
|
|
180
|
+
}
|
|
181
|
+
if (Array.isArray(value)) {
|
|
182
|
+
const out = [];
|
|
183
|
+
let after = false;
|
|
184
|
+
for (const item of value) {
|
|
185
|
+
const flag = typeof item === "string" && item.startsWith("-") ? item : undefined;
|
|
186
|
+
if (after && flag === undefined) {
|
|
187
|
+
out.push(BLANK);
|
|
188
|
+
after = false;
|
|
189
|
+
continue;
|
|
190
|
+
}
|
|
191
|
+
after = false;
|
|
192
|
+
if (flag === undefined) {
|
|
193
|
+
out.push(blank(item));
|
|
194
|
+
continue;
|
|
195
|
+
}
|
|
196
|
+
const equals = flag.indexOf("=");
|
|
197
|
+
if (equals >= 0 && SECRET_NAME.test(flag.slice(0, equals))) {
|
|
198
|
+
out.push(`${flag.slice(0, equals)}=${BLANK}`);
|
|
199
|
+
continue;
|
|
200
|
+
}
|
|
201
|
+
after = equals < 0 && SECRET_NAME.test(flag);
|
|
202
|
+
out.push(blank(item));
|
|
203
|
+
}
|
|
204
|
+
return out;
|
|
205
|
+
}
|
|
206
|
+
if (typeof value === "object" && value !== null) {
|
|
207
|
+
return Object.fromEntries(Object.entries(value).map(([key, inner]) => [
|
|
208
|
+
key,
|
|
209
|
+
SECRET_NAME.test(key) && inner !== null ? BLANK : blank(inner),
|
|
210
|
+
]));
|
|
211
|
+
}
|
|
212
|
+
return value;
|
|
151
213
|
}
|
|
152
214
|
//# sourceMappingURL=incident-system.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"incident-system.js","sourceRoot":"","sources":["../../src/operator/incident-system.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACpD,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"incident-system.js","sourceRoot":"","sources":["../../src/operator/incident-system.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/** Which copy of Host is answering: the published package, or a checkout it was linked from. */
|
|
2
|
+
export type Install = {
|
|
3
|
+
version: string;
|
|
4
|
+
/** `npm` when it sits under a `node_modules`; `local` for a linked checkout or a build run in place. */
|
|
5
|
+
source: "npm" | "local";
|
|
6
|
+
dir: string;
|
|
7
|
+
};
|
|
8
|
+
export declare function installOf(): Install;
|
|
9
|
+
//# sourceMappingURL=install.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../src/operator/install.ts"],"names":[],"mappings":"AAKA,gGAAgG;AAChG,MAAM,MAAM,OAAO,GAAG;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,wGAAwG;IACxG,MAAM,EAAE,KAAK,GAAG,OAAO,CAAC;IACxB,GAAG,EAAE,MAAM,CAAC;CACb,CAAC;AAEF,wBAAgB,SAAS,IAAI,OAAO,CAQnC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { realpathSync } from "node:fs";
|
|
2
|
+
import { dirname } from "node:path";
|
|
3
|
+
import { fileURLToPath } from "node:url";
|
|
4
|
+
import { hostVersion } from "../loop/open-host.js";
|
|
5
|
+
export function installOf() {
|
|
6
|
+
const here = realpathSync(dirname(fileURLToPath(import.meta.url)));
|
|
7
|
+
return {
|
|
8
|
+
version: hostVersion(),
|
|
9
|
+
source: here.split(/[\\/]/).includes("node_modules") ? "npm" : "local",
|
|
10
|
+
// `<package>/dist/operator` or `<package>/src/operator`: two levels up is the package.
|
|
11
|
+
dir: dirname(dirname(here)),
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=install.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/operator/install.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAUnD,MAAM,UAAU,SAAS;IACvB,MAAM,IAAI,GAAG,YAAY,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACnE,OAAO;QACL,OAAO,EAAE,WAAW,EAAE;QACtB,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO;QACtE,uFAAuF;QACvF,GAAG,EAAE,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;KAC5B,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { SupervisorConfig } from "./config.js";
|
|
2
|
+
import type { Decision } from "./decision.js";
|
|
3
|
+
import { type Exec } from "./exec.js";
|
|
4
|
+
/** `pending`: done on this side (offered), but not in effect until a person folds it. */
|
|
5
|
+
export type Outcome = {
|
|
6
|
+
what: string;
|
|
7
|
+
ok: boolean;
|
|
8
|
+
detail: string;
|
|
9
|
+
pending?: boolean;
|
|
10
|
+
};
|
|
11
|
+
/** What touches the ledger or the worker, which only the supervisor's own process can do. */
|
|
12
|
+
export type Hands = {
|
|
13
|
+
restart(key: string): Promise<Outcome>;
|
|
14
|
+
cancel(key: string): Promise<Outcome>;
|
|
15
|
+
startWorker(): Promise<Outcome>;
|
|
16
|
+
restartWorker(): Promise<Outcome>;
|
|
17
|
+
};
|
|
18
|
+
export type ActContext = {
|
|
19
|
+
config: SupervisorConfig;
|
|
20
|
+
exec: Exec;
|
|
21
|
+
hands: Hands;
|
|
22
|
+
/** Where this incident's files are kept. */
|
|
23
|
+
dir: string;
|
|
24
|
+
now?: () => Date;
|
|
25
|
+
sleep?: (ms: number) => Promise<void>;
|
|
26
|
+
log?: (line: string) => void;
|
|
27
|
+
};
|
|
28
|
+
/**
|
|
29
|
+
* Do what the arbiter decided.
|
|
30
|
+
*
|
|
31
|
+
* The order is the arbiter's: when the same stop would come straight back
|
|
32
|
+
* without the fixes, they land first and the run is unblocked after; a fix
|
|
33
|
+
* that did not land holds the unblock back. Otherwise the run moves first and
|
|
34
|
+
* the fixes follow while it works. Nothing here chooses: it carries out.
|
|
35
|
+
*/
|
|
36
|
+
export declare function carryOut(decision: Decision, context: ActContext): Promise<Outcome[]>;
|
|
37
|
+
//# sourceMappingURL=act.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"act.d.ts","sourceRoot":"","sources":["../../../src/operator/supervise/act.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAa,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE/D,OAAO,KAAK,EAAE,QAAQ,EAAgB,MAAM,eAAe,CAAC;AAC5D,OAAO,EAAE,KAAK,IAAI,EAAyB,MAAM,WAAW,CAAC;AAI7D,yFAAyF;AACzF,MAAM,MAAM,OAAO,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC;AAEvF,6FAA6F;AAC7F,MAAM,MAAM,KAAK,GAAG;IAClB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACvC,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACtC,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IAChC,aAAa,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;CACnC,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACvB,MAAM,EAAE,gBAAgB,CAAC;IACzB,IAAI,EAAE,IAAI,CAAC;IACX,KAAK,EAAE,KAAK,CAAC;IACb,4CAA4C;IAC5C,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;IACjB,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACtC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAC9B,CAAC;AAUF;;;;;;;GAOG;AACH,wBAAsB,QAAQ,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAiC1F"}
|
|
@@ -0,0 +1,354 @@
|
|
|
1
|
+
import { mkdirSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { PRODUCT } from "@bluewombat/manager-kit";
|
|
4
|
+
import { runAgent } from "./council.js";
|
|
5
|
+
import { fill, succeeded, tail } from "./exec.js";
|
|
6
|
+
import { fixerPrompt, proposalReviewerPrompt, reviewerPrompt } from "./prompts.js";
|
|
7
|
+
import { parseVerdict } from "./review.js";
|
|
8
|
+
/** A fix that is offered and folded within this long, or it is reported as not folded. */
|
|
9
|
+
const FOLD_WAIT_MS = 60 * 60_000;
|
|
10
|
+
const FOLD_POLL_MS = 20_000;
|
|
11
|
+
/** Rounds the agent gets to make its change pass the checks. */
|
|
12
|
+
const FIX_ROUNDS = 3;
|
|
13
|
+
/** The guard gets the diff in its prompt up to this long; beyond, it reads the tree. */
|
|
14
|
+
const DIFF_CHARS = 60_000;
|
|
15
|
+
/**
|
|
16
|
+
* Do what the arbiter decided.
|
|
17
|
+
*
|
|
18
|
+
* The order is the arbiter's: when the same stop would come straight back
|
|
19
|
+
* without the fixes, they land first and the run is unblocked after; a fix
|
|
20
|
+
* that did not land holds the unblock back. Otherwise the run moves first and
|
|
21
|
+
* the fixes follow while it works. Nothing here chooses: it carries out.
|
|
22
|
+
*/
|
|
23
|
+
export async function carryOut(decision, context) {
|
|
24
|
+
const outcomes = [];
|
|
25
|
+
const fix = async () => {
|
|
26
|
+
let landed = true;
|
|
27
|
+
for (const item of decision.fixes) {
|
|
28
|
+
const outcome = await landFix(item, decision, context);
|
|
29
|
+
outcomes.push(outcome);
|
|
30
|
+
landed &&= outcome.ok && outcome.pending !== true;
|
|
31
|
+
}
|
|
32
|
+
return landed;
|
|
33
|
+
};
|
|
34
|
+
const unblock = async () => {
|
|
35
|
+
for (const item of decision.unblock) {
|
|
36
|
+
outcomes.push(await unblockOne(item, context));
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
if (decision.unblockAfterFixes) {
|
|
40
|
+
if (await fix()) {
|
|
41
|
+
await unblock();
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
outcomes.push({
|
|
45
|
+
what: "unblock",
|
|
46
|
+
ok: false,
|
|
47
|
+
detail: outcomes.some((o) => o.pending === true)
|
|
48
|
+
? "held: the fixes wait for a person to fold them, and without them the same stop comes back"
|
|
49
|
+
: "held: the fixes did not land, and without them the same stop comes back",
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
await unblock();
|
|
55
|
+
await fix();
|
|
56
|
+
}
|
|
57
|
+
return outcomes;
|
|
58
|
+
}
|
|
59
|
+
async function unblockOne(item, context) {
|
|
60
|
+
const what = `${item.do}${item.key === undefined ? "" : ` ${item.key}`}`;
|
|
61
|
+
const { config, exec, hands } = context;
|
|
62
|
+
switch (item.do) {
|
|
63
|
+
case "restart":
|
|
64
|
+
return await hands.restart(item.key ?? "");
|
|
65
|
+
case "cancel":
|
|
66
|
+
return await hands.cancel(item.key ?? "");
|
|
67
|
+
case "start-worker":
|
|
68
|
+
return await hands.startWorker();
|
|
69
|
+
case "restart-worker":
|
|
70
|
+
return await hands.restartWorker();
|
|
71
|
+
case "resume": {
|
|
72
|
+
if (config.resume === undefined) {
|
|
73
|
+
return { what, ok: false, detail: "no `resume` command in the supervisor config" };
|
|
74
|
+
}
|
|
75
|
+
const key = item.key ?? "";
|
|
76
|
+
const number = /#(\d+)$/.exec(key)?.[1] ?? key;
|
|
77
|
+
const result = await exec(fill(config.resume.cmd, { key, number }), {
|
|
78
|
+
timeoutMs: config.resume.timeoutMs,
|
|
79
|
+
});
|
|
80
|
+
return {
|
|
81
|
+
what,
|
|
82
|
+
ok: succeeded(result),
|
|
83
|
+
detail: succeeded(result) ? "signalled" : tail(result),
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
case "cleanup-disk": {
|
|
87
|
+
for (const step of config.diskCleanup) {
|
|
88
|
+
const result = await exec(step.cmd, { timeoutMs: step.timeoutMs });
|
|
89
|
+
if (!succeeded(result)) {
|
|
90
|
+
return { what, ok: false, detail: `${step.cmd.join(" ")}: ${tail(result)}` };
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
return {
|
|
94
|
+
what,
|
|
95
|
+
ok: config.diskCleanup.length > 0,
|
|
96
|
+
detail: config.diskCleanup.length > 0 ? "cleaned" : "no `diskCleanup` in the supervisor config",
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
/** Change a repository, offer the change, see it folded, run what follows. */
|
|
102
|
+
async function landFix(fix, decision, context) {
|
|
103
|
+
const what = `fix ${fix.target}: ${fix.title}`;
|
|
104
|
+
if (fix.revises !== undefined) {
|
|
105
|
+
return {
|
|
106
|
+
what,
|
|
107
|
+
ok: false,
|
|
108
|
+
detail: `not made: it would revise ${fix.revises}. That is for a person to decide`,
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
const target = context.config.targets.find((t) => t.name === fix.target);
|
|
112
|
+
if (target === undefined) {
|
|
113
|
+
return { what, ok: false, detail: `no target "${fix.target}" in the supervisor config` };
|
|
114
|
+
}
|
|
115
|
+
const stamp = (context.now ?? (() => new Date()))().toISOString().replace(/\D/g, "").slice(0, 14);
|
|
116
|
+
const slug = fix.title
|
|
117
|
+
.toLowerCase()
|
|
118
|
+
.replace(/[^a-z0-9]+/g, "-")
|
|
119
|
+
.replace(/^-|-$/g, "")
|
|
120
|
+
.slice(0, 40);
|
|
121
|
+
const branch = `supervisor/${stamp}-${slug}`;
|
|
122
|
+
const tree = join(context.config.dir, "work", `${stamp}-${slug}`);
|
|
123
|
+
const git = (args, cwd, timeoutMs = 5 * 60_000) => context.exec(["git", ...args], { cwd, timeoutMs });
|
|
124
|
+
const say = context.log ?? (() => { });
|
|
125
|
+
const fetched = await git(["fetch", target.remote, target.base], target.repo);
|
|
126
|
+
if (!succeeded(fetched)) {
|
|
127
|
+
return { what, ok: false, detail: `fetch: ${tail(fetched)}` };
|
|
128
|
+
}
|
|
129
|
+
mkdirSync(join(context.config.dir, "work"), { recursive: true });
|
|
130
|
+
const added = await git(["worktree", "add", "-b", branch, tree, `${target.remote}/${target.base}`], target.repo);
|
|
131
|
+
if (!succeeded(added)) {
|
|
132
|
+
return { what, ok: false, detail: `worktree: ${tail(added)}` };
|
|
133
|
+
}
|
|
134
|
+
try {
|
|
135
|
+
const made = await makeChange(fix, decision, target, tree, branch, context, git);
|
|
136
|
+
if (!made.ok) {
|
|
137
|
+
return { what, ...made };
|
|
138
|
+
}
|
|
139
|
+
say(`fix ${branch}: checks pass, offering`);
|
|
140
|
+
const body = join(context.dir, `${slug}.pr.md`);
|
|
141
|
+
writeFileSync(body, `${decision.summary}\n\n## Cause\n${decision.cause}\n\n## Evidence\n${decision.evidence.map((e) => `- ${e}`).join("\n")}\n\n## Guard\nApproved by an agent that did not see the stop. It checked:\n${made.checked.map((e) => `- ${e}`).join("\n")}\n\nMade by the ${PRODUCT} supervisor from incident ${context.dir}.\n`);
|
|
142
|
+
const pushed = await git(["push", "-u", target.remote, branch], tree);
|
|
143
|
+
if (!succeeded(pushed)) {
|
|
144
|
+
return { what, ok: false, detail: `push: ${tail(pushed)}` };
|
|
145
|
+
}
|
|
146
|
+
const vars = { branch, title: fix.title, bodyFile: body };
|
|
147
|
+
const opened = await context.exec(fill(target.open.cmd, vars), {
|
|
148
|
+
cwd: tree,
|
|
149
|
+
timeoutMs: target.open.timeoutMs,
|
|
150
|
+
});
|
|
151
|
+
if (!succeeded(opened)) {
|
|
152
|
+
return { what, ok: false, detail: `open: ${tail(opened)}` };
|
|
153
|
+
}
|
|
154
|
+
const pr = opened.stdout.trim().split("\n").pop()?.trim() ?? "";
|
|
155
|
+
if (!target.autoMerge) {
|
|
156
|
+
return {
|
|
157
|
+
what,
|
|
158
|
+
ok: true,
|
|
159
|
+
pending: true,
|
|
160
|
+
detail: `${pr} offered, waiting for a person to fold it`,
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
const merging = await context.exec(fill(target.merge.cmd, { ...vars, pr }), {
|
|
164
|
+
cwd: tree,
|
|
165
|
+
timeoutMs: target.merge.timeoutMs,
|
|
166
|
+
});
|
|
167
|
+
if (!succeeded(merging)) {
|
|
168
|
+
return { what, ok: false, detail: `merge ${pr}: ${tail(merging)}` };
|
|
169
|
+
}
|
|
170
|
+
const folded = await waitFolded(target, pr, tree, context);
|
|
171
|
+
if (!folded) {
|
|
172
|
+
return {
|
|
173
|
+
what,
|
|
174
|
+
ok: false,
|
|
175
|
+
detail: `${pr} was offered but is not folded after ${FOLD_WAIT_MS / 60_000} min`,
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
for (const step of target.after) {
|
|
179
|
+
const result = await context.exec(fill(step.cmd, vars), {
|
|
180
|
+
cwd: target.repo,
|
|
181
|
+
timeoutMs: step.timeoutMs,
|
|
182
|
+
});
|
|
183
|
+
if (!succeeded(result)) {
|
|
184
|
+
return {
|
|
185
|
+
what,
|
|
186
|
+
ok: false,
|
|
187
|
+
detail: `${pr} folded, then \`${step.cmd.join(" ")}\` failed: ${tail(result)}`,
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
return { what, ok: true, detail: `${pr} folded` };
|
|
192
|
+
}
|
|
193
|
+
finally {
|
|
194
|
+
await git(["worktree", "remove", "--force", tree], target.repo);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
async function makeChange(fix, decision, target, tree, branch, context, git) {
|
|
198
|
+
const proposal = await askGuard(proposalReviewerPrompt({
|
|
199
|
+
target: target.name,
|
|
200
|
+
title: fix.title,
|
|
201
|
+
instruction: fix.instruction,
|
|
202
|
+
conformity: fix.conformity,
|
|
203
|
+
rules: target.rules,
|
|
204
|
+
}), "proposal", tree, context, true);
|
|
205
|
+
if (proposal.kind === "unavailable") {
|
|
206
|
+
return { ok: false, detail: `the guard could not judge the proposal: ${proposal.reason}` };
|
|
207
|
+
}
|
|
208
|
+
if (proposal.kind === "reject") {
|
|
209
|
+
return {
|
|
210
|
+
ok: false,
|
|
211
|
+
detail: `the guard refused the proposal before it was written:\n${proposal.reasons.map((r) => `- ${r}`).join("\n")}`,
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
let failure;
|
|
215
|
+
let lastPoints = [];
|
|
216
|
+
for (let round = 1; round <= FIX_ROUNDS; round++) {
|
|
217
|
+
const agent = await runAgent({
|
|
218
|
+
config: context.config,
|
|
219
|
+
exec: context.exec,
|
|
220
|
+
role: "fixer",
|
|
221
|
+
prompt: fixerPrompt({
|
|
222
|
+
target: target.name,
|
|
223
|
+
title: fix.title,
|
|
224
|
+
instruction: fix.instruction,
|
|
225
|
+
conformity: fix.conformity,
|
|
226
|
+
deferred: proposal.deferred,
|
|
227
|
+
cause: decision.cause,
|
|
228
|
+
evidence: decision.evidence,
|
|
229
|
+
deny: target.deny,
|
|
230
|
+
checks: target.checks.map((check) => check.cmd.join(" ")),
|
|
231
|
+
...(failure === undefined ? {} : { failure }),
|
|
232
|
+
}),
|
|
233
|
+
dir: join(context.dir, `fix-${round}`),
|
|
234
|
+
cwd: tree,
|
|
235
|
+
addDirs: [],
|
|
236
|
+
});
|
|
237
|
+
if (!agent.ok) {
|
|
238
|
+
failure = `The agent itself failed: ${agent.text.slice(0, 1500)}`;
|
|
239
|
+
continue;
|
|
240
|
+
}
|
|
241
|
+
const status = await git(["status", "--porcelain"], tree);
|
|
242
|
+
const changed = status.stdout
|
|
243
|
+
.split("\n")
|
|
244
|
+
.filter((line) => line.length > 3)
|
|
245
|
+
.map((line) => line.slice(3).replace(/^"|"$/g, ""));
|
|
246
|
+
if (changed.length === 0) {
|
|
247
|
+
failure =
|
|
248
|
+
"You changed nothing. If the cause is not what was described, change what is actually wrong.";
|
|
249
|
+
continue;
|
|
250
|
+
}
|
|
251
|
+
const denied = changed.filter((path) => target.deny.some((prefix) => path.startsWith(prefix)));
|
|
252
|
+
if (denied.length > 0) {
|
|
253
|
+
failure = `You touched paths you may not: ${denied.join(", ")}. Revert them.`;
|
|
254
|
+
continue;
|
|
255
|
+
}
|
|
256
|
+
failure = undefined;
|
|
257
|
+
for (const check of target.checks) {
|
|
258
|
+
const result = await context.exec(check.cmd, { cwd: tree, timeoutMs: check.timeoutMs });
|
|
259
|
+
if (!succeeded(result)) {
|
|
260
|
+
failure = `\`${check.cmd.join(" ")}\` failed:\n${tail(result)}`;
|
|
261
|
+
break;
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
if (failure === undefined) {
|
|
265
|
+
const staged = await git(["add", "-A"], tree);
|
|
266
|
+
if (!succeeded(staged)) {
|
|
267
|
+
return { ok: false, detail: `add: ${tail(staged)}` };
|
|
268
|
+
}
|
|
269
|
+
const guard = await review(fix, target, tree, context, git);
|
|
270
|
+
if (guard.kind === "unavailable") {
|
|
271
|
+
return { ok: false, detail: `the guard could not give a verdict: ${guard.reason}` };
|
|
272
|
+
}
|
|
273
|
+
if (guard.kind === "reject") {
|
|
274
|
+
const again = guard.points.filter((point) => lastPoints.includes(point));
|
|
275
|
+
if (again.length > 0) {
|
|
276
|
+
return {
|
|
277
|
+
ok: false,
|
|
278
|
+
detail: `stopped: the guard rejected point ${[...new Set(again)].join(", ")} twice in a row, so another round would repeat it. A person decides:\n${guard.reasons.map((r) => `- ${r}`).join("\n")}`,
|
|
279
|
+
};
|
|
280
|
+
}
|
|
281
|
+
lastPoints = guard.points;
|
|
282
|
+
failure = `The guard rejected the change:\n${guard.reasons.map((r) => `- ${r}`).join("\n")}`;
|
|
283
|
+
continue;
|
|
284
|
+
}
|
|
285
|
+
const done = await git(["commit", "-m", `${fix.title}\n\nMade by the ${PRODUCT} supervisor (${branch}).`], tree);
|
|
286
|
+
return succeeded(done)
|
|
287
|
+
? { ok: true, checked: guard.checked }
|
|
288
|
+
: { ok: false, detail: `commit: ${tail(done)}` };
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
return { ok: false, detail: `no passing change after ${FIX_ROUNDS} rounds: ${failure ?? ""}` };
|
|
292
|
+
}
|
|
293
|
+
/** The guard reads the change and the repository, not the stop. Asked twice if it answers badly. */
|
|
294
|
+
async function review(fix, target, tree, context, git) {
|
|
295
|
+
const files = (await git(["diff", "--cached", "--name-only"], tree)).stdout
|
|
296
|
+
.split("\n")
|
|
297
|
+
.filter((line) => line.length > 0);
|
|
298
|
+
const full = (await git(["diff", "--cached"], tree)).stdout;
|
|
299
|
+
const diff = full.length > DIFF_CHARS
|
|
300
|
+
? `${full.slice(0, DIFF_CHARS)}\n[diff cut: read the rest in the tree]`
|
|
301
|
+
: full;
|
|
302
|
+
return await askGuard(reviewerPrompt({
|
|
303
|
+
target: target.name,
|
|
304
|
+
title: fix.title,
|
|
305
|
+
files,
|
|
306
|
+
diff,
|
|
307
|
+
checks: target.checks.map((check) => check.cmd.join(" ")),
|
|
308
|
+
}), "review", tree, context);
|
|
309
|
+
}
|
|
310
|
+
/** Ask the guard once, again if it answers badly. `label` names the folder its files go to. */
|
|
311
|
+
async function askGuard(prompt, label, tree, context, proposal = false) {
|
|
312
|
+
let reason = "";
|
|
313
|
+
for (let attempt = 1; attempt <= 2; attempt++) {
|
|
314
|
+
const answer = await runAgent({
|
|
315
|
+
config: context.config,
|
|
316
|
+
exec: context.exec,
|
|
317
|
+
role: "reviewer",
|
|
318
|
+
prompt: attempt === 1
|
|
319
|
+
? prompt
|
|
320
|
+
: `${prompt}\n\nYour previous answer was refused: ${reason}. Answer again.`,
|
|
321
|
+
dir: join(context.dir, `${label}-${attempt}`),
|
|
322
|
+
cwd: tree,
|
|
323
|
+
addDirs: [],
|
|
324
|
+
});
|
|
325
|
+
if (!answer.ok) {
|
|
326
|
+
reason = `the agent failed: ${answer.text.slice(0, 500)}`;
|
|
327
|
+
continue;
|
|
328
|
+
}
|
|
329
|
+
const verdict = parseVerdict(answer.text, { proposal });
|
|
330
|
+
if (!verdict.ok) {
|
|
331
|
+
reason = verdict.reason;
|
|
332
|
+
continue;
|
|
333
|
+
}
|
|
334
|
+
return verdict.approve
|
|
335
|
+
? { kind: "approve", checked: verdict.checked, deferred: verdict.deferred }
|
|
336
|
+
: { kind: "reject", reasons: verdict.reasons, points: verdict.points };
|
|
337
|
+
}
|
|
338
|
+
return { kind: "unavailable", reason };
|
|
339
|
+
}
|
|
340
|
+
async function waitFolded(target, pr, cwd, context) {
|
|
341
|
+
const sleep = context.sleep ?? ((ms) => new Promise((done) => setTimeout(done, ms)));
|
|
342
|
+
for (let waited = 0; waited <= FOLD_WAIT_MS; waited += FOLD_POLL_MS) {
|
|
343
|
+
const result = await context.exec(fill(target.merged.cmd, { pr }), {
|
|
344
|
+
cwd,
|
|
345
|
+
timeoutMs: target.merged.timeoutMs,
|
|
346
|
+
});
|
|
347
|
+
if (succeeded(result)) {
|
|
348
|
+
return true;
|
|
349
|
+
}
|
|
350
|
+
await sleep(FOLD_POLL_MS);
|
|
351
|
+
}
|
|
352
|
+
return false;
|
|
353
|
+
}
|
|
354
|
+
//# sourceMappingURL=act.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"act.js","sourceRoot":"","sources":["../../../src/operator/supervise/act.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAElD,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAExC,OAAO,EAAa,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAE,sBAAsB,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACnF,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAwB3C,0FAA0F;AAC1F,MAAM,YAAY,GAAG,EAAE,GAAG,MAAM,CAAC;AACjC,MAAM,YAAY,GAAG,MAAM,CAAC;AAC5B,gEAAgE;AAChE,MAAM,UAAU,GAAG,CAAC,CAAC;AACrB,wFAAwF;AACxF,MAAM,UAAU,GAAG,MAAM,CAAC;AAE1B;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,QAAkB,EAAE,OAAmB;IACpE,MAAM,QAAQ,GAAc,EAAE,CAAC;IAC/B,MAAM,GAAG,GAAG,KAAK,IAAsB,EAAE;QACvC,IAAI,MAAM,GAAG,IAAI,CAAC;QAClB,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;YAClC,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;YACvD,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACvB,MAAM,KAAK,OAAO,CAAC,EAAE,IAAI,OAAO,CAAC,OAAO,KAAK,IAAI,CAAC;QACpD,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC,CAAC;IACF,MAAM,OAAO,GAAG,KAAK,IAAmB,EAAE;QACxC,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;YACpC,QAAQ,CAAC,IAAI,CAAC,MAAM,UAAU,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;QACjD,CAAC;IACH,CAAC,CAAC;IACF,IAAI,QAAQ,CAAC,iBAAiB,EAAE,CAAC;QAC/B,IAAI,MAAM,GAAG,EAAE,EAAE,CAAC;YAChB,MAAM,OAAO,EAAE,CAAC;QAClB,CAAC;aAAM,CAAC;YACN,QAAQ,CAAC,IAAI,CAAC;gBACZ,IAAI,EAAE,SAAS;gBACf,EAAE,EAAE,KAAK;gBACT,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,IAAI,CAAC;oBAC9C,CAAC,CAAC,2FAA2F;oBAC7F,CAAC,CAAC,yEAAyE;aAC9E,CAAC,CAAC;QACL,CAAC;IACH,CAAC;SAAM,CAAC;QACN,MAAM,OAAO,EAAE,CAAC;QAChB,MAAM,GAAG,EAAE,CAAC;IACd,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,IAAa,EAAE,OAAmB;IAC1D,MAAM,IAAI,GAAG,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;IACzE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC;IACxC,QAAQ,IAAI,CAAC,EAAE,EAAE,CAAC;QAChB,KAAK,SAAS;YACZ,OAAO,MAAM,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC;QAC7C,KAAK,QAAQ;YACX,OAAO,MAAM,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC;QAC5C,KAAK,cAAc;YACjB,OAAO,MAAM,KAAK,CAAC,WAAW,EAAE,CAAC;QACnC,KAAK,gBAAgB;YACnB,OAAO,MAAM,KAAK,CAAC,aAAa,EAAE,CAAC;QACrC,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;gBAChC,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,8CAA8C,EAAE,CAAC;YACrF,CAAC;YACD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,EAAE,CAAC;YAC3B,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC;YAC/C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,EAAE;gBAClE,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,SAAS;aACnC,CAAC,CAAC;YACH,OAAO;gBACL,IAAI;gBACJ,EAAE,EAAE,SAAS,CAAC,MAAM,CAAC;gBACrB,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;aACvD,CAAC;QACJ,CAAC;QACD,KAAK,cAAc,CAAC,CAAC,CAAC;YACpB,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;gBACtC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;gBACnE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;oBACvB,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;gBAC/E,CAAC;YACH,CAAC;YACD,OAAO;gBACL,IAAI;gBACJ,EAAE,EAAE,MAAM,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC;gBACjC,MAAM,EACJ,MAAM,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,2CAA2C;aAC1F,CAAC;QACJ,CAAC;IACH,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,KAAK,UAAU,OAAO,CAAC,GAAQ,EAAE,QAAkB,EAAE,OAAmB;IACtE,MAAM,IAAI,GAAG,OAAO,GAAG,CAAC,MAAM,KAAK,GAAG,CAAC,KAAK,EAAE,CAAC;IAC/C,IAAI,GAAG,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;QAC9B,OAAO;YACL,IAAI;YACJ,EAAE,EAAE,KAAK;YACT,MAAM,EAAE,6BAA6B,GAAG,CAAC,OAAO,kCAAkC;SACnF,CAAC;IACJ,CAAC;IACD,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,GAAG,CAAC,MAAM,CAAC,CAAC;IACzE,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,cAAc,GAAG,CAAC,MAAM,4BAA4B,EAAE,CAAC;IAC3F,CAAC;IACD,MAAM,KAAK,GAAG,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAClG,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK;SACnB,WAAW,EAAE;SACb,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC;SAC3B,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC;SACrB,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAChB,MAAM,MAAM,GAAG,cAAc,KAAK,IAAI,IAAI,EAAE,CAAC;IAC7C,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,KAAK,IAAI,IAAI,EAAE,CAAC,CAAC;IAClE,MAAM,GAAG,GAAG,CAAC,IAAc,EAAE,GAAW,EAAE,SAAS,GAAG,CAAC,GAAG,MAAM,EAAE,EAAE,CAClE,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC,CAAC;IACrD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IAEtC,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;IAC9E,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;QACxB,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC;IAChE,CAAC;IACD,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACjE,MAAM,KAAK,GAAG,MAAM,GAAG,CACrB,CAAC,UAAU,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC,EAC1E,MAAM,CAAC,IAAI,CACZ,CAAC;IACF,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;QACtB,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,aAAa,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC;IACjE,CAAC;IACD,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC;QACjF,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;YACb,OAAO,EAAE,IAAI,EAAE,GAAG,IAAI,EAAE,CAAC;QAC3B,CAAC;QACD,GAAG,CAAC,OAAO,MAAM,yBAAyB,CAAC,CAAC;QAC5C,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,IAAI,QAAQ,CAAC,CAAC;QAChD,aAAa,CACX,IAAI,EACJ,GAAG,QAAQ,CAAC,OAAO,iBAAiB,QAAQ,CAAC,KAAK,oBAAoB,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,8EAA8E,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,mBAAmB,OAAO,6BAA6B,OAAO,CAAC,GAAG,KAAK,CACzT,CAAC;QACF,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC;QACtE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;YACvB,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;QAC9D,CAAC;QACD,MAAM,IAAI,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;QAC1D,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE;YAC7D,GAAG,EAAE,IAAI;YACT,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,SAAS;SACjC,CAAC,CAAC;QACH,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;YACvB,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;QAC9D,CAAC;QACD,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QAChE,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;YACtB,OAAO;gBACL,IAAI;gBACJ,EAAE,EAAE,IAAI;gBACR,OAAO,EAAE,IAAI;gBACb,MAAM,EAAE,GAAG,EAAE,2CAA2C;aACzD,CAAC;QACJ,CAAC;QACD,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,GAAG,IAAI,EAAE,EAAE,EAAE,CAAC,EAAE;YAC1E,GAAG,EAAE,IAAI;YACT,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC,SAAS;SAClC,CAAC,CAAC;QACH,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;YACxB,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC;QACtE,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;QAC3D,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO;gBACL,IAAI;gBACJ,EAAE,EAAE,KAAK;gBACT,MAAM,EAAE,GAAG,EAAE,wCAAwC,YAAY,GAAG,MAAM,MAAM;aACjF,CAAC;QACJ,CAAC;QACD,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YAChC,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE;gBACtD,GAAG,EAAE,MAAM,CAAC,IAAI;gBAChB,SAAS,EAAE,IAAI,CAAC,SAAS;aAC1B,CAAC,CAAC;YACH,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;gBACvB,OAAO;oBACL,IAAI;oBACJ,EAAE,EAAE,KAAK;oBACT,MAAM,EAAE,GAAG,EAAE,mBAAmB,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,cAAc,IAAI,CAAC,MAAM,CAAC,EAAE;iBAC/E,CAAC;YACJ,CAAC;QACH,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC;IACpD,CAAC;YAAS,CAAC;QACT,MAAM,GAAG,CAAC,CAAC,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;IAClE,CAAC;AACH,CAAC;AAED,KAAK,UAAU,UAAU,CACvB,GAAQ,EACR,QAAkB,EAClB,MAAiB,EACjB,IAAY,EACZ,MAAc,EACd,OAAmB,EACnB,GAA0E;IAE1E,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAC7B,sBAAsB,CAAC;QACrB,MAAM,EAAE,MAAM,CAAC,IAAI;QACnB,KAAK,EAAE,GAAG,CAAC,KAAK;QAChB,WAAW,EAAE,GAAG,CAAC,WAAW;QAC5B,UAAU,EAAE,GAAG,CAAC,UAAU;QAC1B,KAAK,EAAE,MAAM,CAAC,KAAK;KACpB,CAAC,EACF,UAAU,EACV,IAAI,EACJ,OAAO,EACP,IAAI,CACL,CAAC;IACF,IAAI,QAAQ,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;QACpC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,2CAA2C,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;IAC7F,CAAC;IACD,IAAI,QAAQ,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC/B,OAAO;YACL,EAAE,EAAE,KAAK;YACT,MAAM,EAAE,0DAA0D,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;SACrH,CAAC;IACJ,CAAC;IACD,IAAI,OAA2B,CAAC;IAChC,IAAI,UAAU,GAAa,EAAE,CAAC;IAC9B,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,IAAI,UAAU,EAAE,KAAK,EAAE,EAAE,CAAC;QACjD,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC;YAC3B,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,IAAI,EAAE,OAAO;YACb,MAAM,EAAE,WAAW,CAAC;gBAClB,MAAM,EAAE,MAAM,CAAC,IAAI;gBACnB,KAAK,EAAE,GAAG,CAAC,KAAK;gBAChB,WAAW,EAAE,GAAG,CAAC,WAAW;gBAC5B,UAAU,EAAE,GAAG,CAAC,UAAU;gBAC1B,QAAQ,EAAE,QAAQ,CAAC,QAAQ;gBAC3B,KAAK,EAAE,QAAQ,CAAC,KAAK;gBACrB,QAAQ,EAAE,QAAQ,CAAC,QAAQ;gBAC3B,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBACzD,GAAG,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC;aAC9C,CAAC;YACF,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,KAAK,EAAE,CAAC;YACtC,GAAG,EAAE,IAAI;YACT,OAAO,EAAE,EAAE;SACZ,CAAC,CAAC;QACH,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC;YACd,OAAO,GAAG,4BAA4B,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC;YAClE,SAAS;QACX,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,CAAC,QAAQ,EAAE,aAAa,CAAC,EAAE,IAAI,CAAC,CAAC;QAC1D,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM;aAC1B,KAAK,CAAC,IAAI,CAAC;aACX,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;aACjC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC;QACtD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,OAAO;gBACL,6FAA6F,CAAC;YAChG,SAAS;QACX,CAAC;QACD,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC/F,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtB,OAAO,GAAG,kCAAkC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC;YAC9E,SAAS;QACX,CAAC;QACD,OAAO,GAAG,SAAS,CAAC;QACpB,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAClC,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC;YACxF,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;gBACvB,OAAO,GAAG,KAAK,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,eAAe,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;gBAChE,MAAM;YACR,CAAC;QACH,CAAC;QACD,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YAC1B,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC;YAC9C,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;gBACvB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;YACvD,CAAC;YACD,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC;YAC5D,IAAI,KAAK,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;gBACjC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,uCAAuC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;YACtF,CAAC;YACD,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAC5B,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;gBACzE,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACrB,OAAO;wBACL,EAAE,EAAE,KAAK;wBACT,MAAM,EAAE,qCAAqC,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,yEAAyE,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;qBACpM,CAAC;gBACJ,CAAC;gBACD,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC;gBAC1B,OAAO,GAAG,mCAAmC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC7F,SAAS;YACX,CAAC;YACD,MAAM,IAAI,GAAG,MAAM,GAAG,CACpB,CAAC,QAAQ,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC,KAAK,mBAAmB,OAAO,gBAAgB,MAAM,IAAI,CAAC,EAClF,IAAI,CACL,CAAC;YACF,OAAO,SAAS,CAAC,IAAI,CAAC;gBACpB,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE;gBACtC,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;QACrD,CAAC;IACH,CAAC;IACD,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,2BAA2B,UAAU,YAAY,OAAO,IAAI,EAAE,EAAE,EAAE,CAAC;AACjG,CAAC;AAOD,oGAAoG;AACpG,KAAK,UAAU,MAAM,CACnB,GAAQ,EACR,MAAiB,EACjB,IAAY,EACZ,OAAmB,EACnB,GAA0E;IAE1E,MAAM,KAAK,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,EAAE,UAAU,EAAE,aAAa,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,MAAM;SACxE,KAAK,CAAC,IAAI,CAAC;SACX,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACrC,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,EAAE,UAAU,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC;IAC5D,MAAM,IAAI,GACR,IAAI,CAAC,MAAM,GAAG,UAAU;QACtB,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,yCAAyC;QACvE,CAAC,CAAC,IAAI,CAAC;IACX,OAAO,MAAM,QAAQ,CACnB,cAAc,CAAC;QACb,MAAM,EAAE,MAAM,CAAC,IAAI;QACnB,KAAK,EAAE,GAAG,CAAC,KAAK;QAChB,KAAK;QACL,IAAI;QACJ,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;KAC1D,CAAC,EACF,QAAQ,EACR,IAAI,EACJ,OAAO,CACR,CAAC;AACJ,CAAC;AAED,+FAA+F;AAC/F,KAAK,UAAU,QAAQ,CACrB,MAAc,EACd,KAAa,EACb,IAAY,EACZ,OAAmB,EACnB,QAAQ,GAAG,KAAK;IAEhB,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,CAAC,EAAE,OAAO,EAAE,EAAE,CAAC;QAC9C,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC;YAC5B,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,IAAI,EAAE,UAAU;YAChB,MAAM,EACJ,OAAO,KAAK,CAAC;gBACX,CAAC,CAAC,MAAM;gBACR,CAAC,CAAC,GAAG,MAAM,yCAAyC,MAAM,iBAAiB;YAC/E,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,KAAK,IAAI,OAAO,EAAE,CAAC;YAC7C,GAAG,EAAE,IAAI;YACT,OAAO,EAAE,EAAE;SACZ,CAAC,CAAC;QACH,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;YACf,MAAM,GAAG,qBAAqB,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;YAC1D,SAAS;QACX,CAAC;QACD,MAAM,OAAO,GAAG,YAAY,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;QACxD,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC;YAChB,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;YACxB,SAAS;QACX,CAAC;QACD,OAAO,OAAO,CAAC,OAAO;YACpB,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE;YAC3E,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC;IAC3E,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,CAAC;AACzC,CAAC;AAED,KAAK,UAAU,UAAU,CACvB,MAAiB,EACjB,EAAU,EACV,GAAW,EACX,OAAmB;IAEnB,MAAM,KAAK,GACT,OAAO,CAAC,KAAK,IAAI,CAAC,CAAC,EAAU,EAAE,EAAE,CAAC,IAAI,OAAO,CAAO,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;IACvF,KAAK,IAAI,MAAM,GAAG,CAAC,EAAE,MAAM,IAAI,YAAY,EAAE,MAAM,IAAI,YAAY,EAAE,CAAC;QACpE,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE;YACjE,GAAG;YACH,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,SAAS;SACnC,CAAC,CAAC;QACH,IAAI,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;YACtB,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,KAAK,CAAC,YAAY,CAAC,CAAC;IAC5B,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
|