slybrowser 0.1.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 +146 -0
- package/dist/automation.d.ts +15 -0
- package/dist/automation.d.ts.map +1 -0
- package/dist/automation.js +69 -0
- package/dist/automation.js.map +1 -0
- package/dist/browser.d.ts +31 -0
- package/dist/browser.d.ts.map +1 -0
- package/dist/browser.js +203 -0
- package/dist/browser.js.map +1 -0
- package/dist/canonical.d.ts +4 -0
- package/dist/canonical.d.ts.map +1 -0
- package/dist/canonical.js +42 -0
- package/dist/canonical.js.map +1 -0
- package/dist/cdp.d.ts +21 -0
- package/dist/cdp.d.ts.map +1 -0
- package/dist/cdp.js +139 -0
- package/dist/cdp.js.map +1 -0
- package/dist/cli.d.ts +19 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +241 -0
- package/dist/cli.js.map +1 -0
- package/dist/errors.d.ts +21 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +113 -0
- package/dist/errors.js.map +1 -0
- package/dist/humanize.d.ts +23 -0
- package/dist/humanize.d.ts.map +1 -0
- package/dist/humanize.js +247 -0
- package/dist/humanize.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +13 -0
- package/dist/index.js.map +1 -0
- package/dist/installer.d.ts +43 -0
- package/dist/installer.d.ts.map +1 -0
- package/dist/installer.js +669 -0
- package/dist/installer.js.map +1 -0
- package/dist/launcher.d.ts +38 -0
- package/dist/launcher.d.ts.map +1 -0
- package/dist/launcher.js +325 -0
- package/dist/launcher.js.map +1 -0
- package/dist/license.d.ts +76 -0
- package/dist/license.d.ts.map +1 -0
- package/dist/license.js +329 -0
- package/dist/license.js.map +1 -0
- package/dist/licensed.d.ts +82 -0
- package/dist/licensed.d.ts.map +1 -0
- package/dist/licensed.js +513 -0
- package/dist/licensed.js.map +1 -0
- package/dist/manifest.d.ts +66 -0
- package/dist/manifest.d.ts.map +1 -0
- package/dist/manifest.js +292 -0
- package/dist/manifest.js.map +1 -0
- package/dist/service.d.ts +206 -0
- package/dist/service.d.ts.map +1 -0
- package/dist/service.js +1271 -0
- package/dist/service.js.map +1 -0
- package/dist/webdriver.d.ts +208 -0
- package/dist/webdriver.d.ts.map +1 -0
- package/dist/webdriver.js +592 -0
- package/dist/webdriver.js.map +1 -0
- package/package.json +78 -0
|
@@ -0,0 +1,592 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import { constants } from "node:fs";
|
|
3
|
+
import { access, stat, writeFile } from "node:fs/promises";
|
|
4
|
+
import { createServer } from "node:net";
|
|
5
|
+
import { basename, dirname, join, resolve } from "node:path";
|
|
6
|
+
import { ConfigurationError, SlyBrowserError } from "./errors.js";
|
|
7
|
+
import { prepareLaunch } from "./launcher.js";
|
|
8
|
+
const ELEMENT_KEY = "element-6066-11e4-a52e-4f735466cecf";
|
|
9
|
+
const DEFAULT_EXCLUDED_SWITCHES = ["enable-automation", "enable-unsafe-swiftshader"];
|
|
10
|
+
export class WebDriverError extends SlyBrowserError {
|
|
11
|
+
command;
|
|
12
|
+
status;
|
|
13
|
+
payload;
|
|
14
|
+
constructor(message, code = "webdriver_error", details = {}) {
|
|
15
|
+
super(message, code);
|
|
16
|
+
if (details.command !== undefined)
|
|
17
|
+
this.command = details.command;
|
|
18
|
+
if (details.status !== undefined)
|
|
19
|
+
this.status = details.status;
|
|
20
|
+
if (details.payload !== undefined)
|
|
21
|
+
this.payload = details.payload;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
function delay(milliseconds) {
|
|
25
|
+
return new Promise((accept) => setTimeout(accept, milliseconds));
|
|
26
|
+
}
|
|
27
|
+
async function fileExists(path) {
|
|
28
|
+
try {
|
|
29
|
+
await access(path, constants.R_OK);
|
|
30
|
+
return (await stat(path)).isFile();
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
return false;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
async function freePort() {
|
|
37
|
+
const server = createServer();
|
|
38
|
+
await new Promise((accept, reject) => {
|
|
39
|
+
server.once("error", reject);
|
|
40
|
+
server.listen(0, "127.0.0.1", accept);
|
|
41
|
+
});
|
|
42
|
+
const address = server.address();
|
|
43
|
+
if (!address || typeof address === "string")
|
|
44
|
+
throw new WebDriverError("Unable to allocate a WebDriver port", "webdriver_port_failed");
|
|
45
|
+
await new Promise((accept, reject) => server.close((error) => error ? reject(error) : accept()));
|
|
46
|
+
return address.port;
|
|
47
|
+
}
|
|
48
|
+
export function defaultDriverExecutable(browserExecutable, explicit) {
|
|
49
|
+
const configured = explicit ?? process.env.SLYBROWSER_WEBDRIVER_PATH;
|
|
50
|
+
if (configured)
|
|
51
|
+
return resolve(configured);
|
|
52
|
+
return join(dirname(resolve(browserExecutable)), process.platform === "win32" ? "chromedriver.exe" : "chromedriver");
|
|
53
|
+
}
|
|
54
|
+
function jsonObject(value) {
|
|
55
|
+
return value && typeof value === "object" && !Array.isArray(value) ? value : undefined;
|
|
56
|
+
}
|
|
57
|
+
function parseSignedLeaseClaims(lease) {
|
|
58
|
+
let envelope = lease;
|
|
59
|
+
try {
|
|
60
|
+
if (Buffer.isBuffer(lease))
|
|
61
|
+
envelope = JSON.parse(lease.toString("utf8"));
|
|
62
|
+
else if (typeof lease === "string")
|
|
63
|
+
envelope = JSON.parse(lease);
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
return undefined;
|
|
67
|
+
}
|
|
68
|
+
const payload = jsonObject(envelope)?.payload;
|
|
69
|
+
if (typeof payload !== "string" || !payload)
|
|
70
|
+
return undefined;
|
|
71
|
+
try {
|
|
72
|
+
return jsonObject(JSON.parse(Buffer.from(payload, "base64url").toString("utf8")));
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
return undefined;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
export function deriveReleaseRoot(browserExecutable, artifactBrowserExecutable) {
|
|
79
|
+
if (typeof artifactBrowserExecutable !== "string" || !artifactBrowserExecutable.trim()) {
|
|
80
|
+
return undefined;
|
|
81
|
+
}
|
|
82
|
+
const expectedParts = artifactBrowserExecutable
|
|
83
|
+
.replaceAll("\\", "/")
|
|
84
|
+
.split("/")
|
|
85
|
+
.filter(Boolean);
|
|
86
|
+
if (expectedParts.length === 0)
|
|
87
|
+
return undefined;
|
|
88
|
+
const actualPath = resolve(browserExecutable);
|
|
89
|
+
const actualParts = actualPath.replaceAll("\\", "/").split("/").filter(Boolean);
|
|
90
|
+
if (actualParts.length < expectedParts.length)
|
|
91
|
+
return undefined;
|
|
92
|
+
const actualSuffix = actualParts.slice(-expectedParts.length);
|
|
93
|
+
const matches = expectedParts.every((part, index) => {
|
|
94
|
+
const actualPart = actualSuffix[index];
|
|
95
|
+
return typeof actualPart === "string" &&
|
|
96
|
+
part.toLowerCase() === actualPart.toLowerCase();
|
|
97
|
+
});
|
|
98
|
+
if (!matches)
|
|
99
|
+
return undefined;
|
|
100
|
+
let releaseRoot = actualPath;
|
|
101
|
+
for (let index = 0; index < expectedParts.length; ++index) {
|
|
102
|
+
releaseRoot = dirname(releaseRoot);
|
|
103
|
+
}
|
|
104
|
+
return releaseRoot;
|
|
105
|
+
}
|
|
106
|
+
function releaseRootFromLease(browserExecutable, lease) {
|
|
107
|
+
const claims = parseSignedLeaseClaims(lease);
|
|
108
|
+
const artifact = jsonObject(claims?.artifact);
|
|
109
|
+
return deriveReleaseRoot(browserExecutable, artifact?.browserExecutable);
|
|
110
|
+
}
|
|
111
|
+
export function buildWebDriverSessionPayload(browserExecutable, settings = {}, handoffArguments = []) {
|
|
112
|
+
const args = ["--no-first-run", "--no-default-browser-check", ...handoffArguments, ...(settings.args ?? [])];
|
|
113
|
+
if ((settings.headless ?? true) && !args.some((argument) => argument.startsWith("--headless")))
|
|
114
|
+
args.push("--headless=new");
|
|
115
|
+
const mobilePersona = settings.mobilePersona === undefined ? undefined : validateMobilePersona(settings.mobilePersona);
|
|
116
|
+
const viewport = settings.viewport ?? mobilePersona?.deviceMetrics ?? { width: 1920, height: 947 };
|
|
117
|
+
if (!args.some((argument) => argument.startsWith("--window-size")))
|
|
118
|
+
args.push(`--window-size=${viewport.width},${viewport.height}`);
|
|
119
|
+
const profileMode = settings.profileMode ?? (settings.profileDir ? "persistent" : "ephemeral");
|
|
120
|
+
if (profileMode === "persistent" && !settings.profileDir) {
|
|
121
|
+
throw new ConfigurationError("Persistent profile mode requires profileDir", "persistent_profile_dir_required");
|
|
122
|
+
}
|
|
123
|
+
if (settings.profileMode === "ephemeral" && settings.profileDir) {
|
|
124
|
+
throw new ConfigurationError("Ephemeral profile mode cannot use profileDir", "ephemeral_profile_dir_forbidden");
|
|
125
|
+
}
|
|
126
|
+
if (settings.profileDir && !args.some((argument) => argument.startsWith("--user-data-dir"))) {
|
|
127
|
+
args.push(`--user-data-dir=${resolve(settings.profileDir)}`);
|
|
128
|
+
}
|
|
129
|
+
return {
|
|
130
|
+
capabilities: {
|
|
131
|
+
alwaysMatch: {
|
|
132
|
+
browserName: "chrome",
|
|
133
|
+
acceptInsecureCerts: false,
|
|
134
|
+
"sly:options": {
|
|
135
|
+
humanize: {
|
|
136
|
+
enabled: settings.humanize === true,
|
|
137
|
+
preset: settings.humanPreset ?? "default",
|
|
138
|
+
...(settings.humanConfig === undefined ? {} : { config: settings.humanConfig }),
|
|
139
|
+
...(settings.humanSeed === undefined ? {} : { seed: settings.humanSeed }),
|
|
140
|
+
},
|
|
141
|
+
},
|
|
142
|
+
"goog:chromeOptions": {
|
|
143
|
+
binary: resolve(browserExecutable),
|
|
144
|
+
args,
|
|
145
|
+
excludeSwitches: [...(settings.excludeSwitches ?? DEFAULT_EXCLUDED_SWITCHES)],
|
|
146
|
+
...(mobilePersona === undefined ? {} : { mobileEmulation: mobilePersona }),
|
|
147
|
+
},
|
|
148
|
+
},
|
|
149
|
+
},
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
function validateMobilePersona(value) {
|
|
153
|
+
const metrics = value?.deviceMetrics;
|
|
154
|
+
const hints = value?.clientHints;
|
|
155
|
+
if (!value || typeof value.userAgent !== "string" || !value.userAgent ||
|
|
156
|
+
!metrics || !Number.isInteger(metrics.width) || metrics.width < 320 || metrics.width > 4096 ||
|
|
157
|
+
!Number.isInteger(metrics.height) || metrics.height < 240 || metrics.height > 4096 ||
|
|
158
|
+
!Number.isFinite(metrics.pixelRatio) || metrics.pixelRatio < 0.5 || metrics.pixelRatio > 8 ||
|
|
159
|
+
metrics.mobile !== true || metrics.touch !== true || !hints || typeof hints.platform !== "string" ||
|
|
160
|
+
!hints.platform || hints.mobile !== true) {
|
|
161
|
+
throw new ConfigurationError("Mobile persona must provide one coherent UA, metrics, touch and client-hint set", "mobile_persona_invalid");
|
|
162
|
+
}
|
|
163
|
+
return value;
|
|
164
|
+
}
|
|
165
|
+
function nativeProfileForSettings(settings) {
|
|
166
|
+
const profile = { ...(settings.profile ?? {}) };
|
|
167
|
+
if (settings.mobilePersona === undefined)
|
|
168
|
+
return profile;
|
|
169
|
+
const persona = validateMobilePersona(settings.mobilePersona);
|
|
170
|
+
const expectedScreen = { width: persona.deviceMetrics.width, height: persona.deviceMetrics.height };
|
|
171
|
+
if (profile.userAgent !== undefined && profile.userAgent !== persona.userAgent) {
|
|
172
|
+
throw new ConfigurationError("Mobile persona conflicts with profile.userAgent", "mobile_persona_conflict");
|
|
173
|
+
}
|
|
174
|
+
if (profile.screen !== undefined && JSON.stringify(profile.screen) !== JSON.stringify(expectedScreen)) {
|
|
175
|
+
throw new ConfigurationError("Mobile persona conflicts with profile.screen", "mobile_persona_conflict");
|
|
176
|
+
}
|
|
177
|
+
profile.userAgent = persona.userAgent;
|
|
178
|
+
profile.screen = expectedScreen;
|
|
179
|
+
const brands = persona.clientHints.brands;
|
|
180
|
+
if (profile.clientHints === undefined && Array.isArray(brands))
|
|
181
|
+
profile.clientHints = brands;
|
|
182
|
+
const platformVersion = persona.clientHints.platformVersion;
|
|
183
|
+
if (profile.osVersion === undefined && typeof platformVersion === "string" && platformVersion) {
|
|
184
|
+
profile.osVersion = platformVersion;
|
|
185
|
+
}
|
|
186
|
+
return profile;
|
|
187
|
+
}
|
|
188
|
+
function majorVersion(value) {
|
|
189
|
+
const match = String(value ?? "").match(/^\s*(\d+)/);
|
|
190
|
+
return match ? Number(match[1]) : null;
|
|
191
|
+
}
|
|
192
|
+
export function validateWebDriverCapabilities(capabilities) {
|
|
193
|
+
const browserVersion = typeof capabilities.browserVersion === "string" ? capabilities.browserVersion : "";
|
|
194
|
+
const chrome = capabilities.chrome;
|
|
195
|
+
const fullDriverVersion = typeof chrome?.chromedriverVersion === "string" ? chrome.chromedriverVersion : "";
|
|
196
|
+
const driverVersion = fullDriverVersion.split(/\s+/)[0] ?? "";
|
|
197
|
+
const browserMajor = majorVersion(browserVersion);
|
|
198
|
+
const driverMajor = majorVersion(driverVersion);
|
|
199
|
+
if (browserMajor === null || driverMajor === null) {
|
|
200
|
+
throw new WebDriverError("The project WebDriver did not report browser and driver versions", "webdriver_version_missing");
|
|
201
|
+
}
|
|
202
|
+
if (browserMajor !== driverMajor) {
|
|
203
|
+
throw new WebDriverError(`SlyBrowser ${browserVersion} and project WebDriver ${driverVersion} have different major versions`, "webdriver_version_mismatch");
|
|
204
|
+
}
|
|
205
|
+
return { browserVersion, driverVersion, browserMajor };
|
|
206
|
+
}
|
|
207
|
+
async function requestJson(origin, method, path, body, timeout) {
|
|
208
|
+
let response;
|
|
209
|
+
try {
|
|
210
|
+
response = await fetch(`${origin}${path}`, {
|
|
211
|
+
method,
|
|
212
|
+
signal: AbortSignal.timeout(timeout),
|
|
213
|
+
...(body === undefined ? {} : {
|
|
214
|
+
headers: { "content-type": "application/json" },
|
|
215
|
+
body: JSON.stringify(body),
|
|
216
|
+
}),
|
|
217
|
+
});
|
|
218
|
+
}
|
|
219
|
+
catch (error) {
|
|
220
|
+
if (error instanceof Error && error.name === "TimeoutError") {
|
|
221
|
+
throw new WebDriverError(`${method} ${path} exceeded ${timeout} ms`, "webdriver_command_timeout", { command: `${method} ${path}` });
|
|
222
|
+
}
|
|
223
|
+
throw error;
|
|
224
|
+
}
|
|
225
|
+
const payload = await response.json().catch(() => null);
|
|
226
|
+
const value = payload?.value;
|
|
227
|
+
if (!response.ok || value?.error) {
|
|
228
|
+
const remoteMessage = typeof value?.message === "string" ? value.message : JSON.stringify(payload);
|
|
229
|
+
throw new WebDriverError(`${method} ${path} failed: ${String(value?.error ?? response.status)}: ${remoteMessage}`, "webdriver_protocol_error", { command: `${method} ${path}`, status: response.status, payload });
|
|
230
|
+
}
|
|
231
|
+
return payload?.value;
|
|
232
|
+
}
|
|
233
|
+
export class SlyWebDriverElement {
|
|
234
|
+
session;
|
|
235
|
+
id;
|
|
236
|
+
constructor(session, id) {
|
|
237
|
+
this.session = session;
|
|
238
|
+
this.id = id;
|
|
239
|
+
}
|
|
240
|
+
async click() { await this.session.clickElement(this.id); }
|
|
241
|
+
async clear() { await this.session.clearElement(this.id); }
|
|
242
|
+
async sendKeys(value) { await this.session.sendKeysToElement(this.id, value); }
|
|
243
|
+
async type(value, options = {}) {
|
|
244
|
+
await this.session.typeIntoElement(this.id, value, options.clear ?? true);
|
|
245
|
+
}
|
|
246
|
+
async rect() {
|
|
247
|
+
return this.session.elementRect(this.id);
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
export class SlyWebDriverSession {
|
|
251
|
+
service;
|
|
252
|
+
sessionId;
|
|
253
|
+
versions;
|
|
254
|
+
capabilities;
|
|
255
|
+
driverExecutable;
|
|
256
|
+
browserExecutable;
|
|
257
|
+
closed = false;
|
|
258
|
+
humanizeEnabled;
|
|
259
|
+
closeCallbacks = [];
|
|
260
|
+
licenseRuntime;
|
|
261
|
+
constructor(service, sessionId, capabilities, browserExecutable, humanize = {}) {
|
|
262
|
+
this.service = service;
|
|
263
|
+
this.sessionId = sessionId;
|
|
264
|
+
this.capabilities = capabilities;
|
|
265
|
+
this.versions = validateWebDriverCapabilities(capabilities);
|
|
266
|
+
this.driverExecutable = service.executable;
|
|
267
|
+
this.browserExecutable = resolve(browserExecutable);
|
|
268
|
+
this.humanizeEnabled = humanize.enabled === true;
|
|
269
|
+
if (this.humanizeEnabled) {
|
|
270
|
+
const features = capabilities["sly:features"];
|
|
271
|
+
const advertised = features?.humanize;
|
|
272
|
+
if (advertised?.enabled !== true || advertised.version !== 1) {
|
|
273
|
+
throw new WebDriverError("Project WebDriver did not enable the requested Humanize capability", "humanize_not_supported");
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
path(suffix = "") { return `/session/${encodeURIComponent(this.sessionId)}${suffix}`; }
|
|
278
|
+
async request(method, suffix, body) {
|
|
279
|
+
if (this.closed)
|
|
280
|
+
throw new WebDriverError("The WebDriver session is closed", "webdriver_session_closed");
|
|
281
|
+
return requestJson(this.service.origin, method, this.path(suffix), body, this.service.commandTimeout);
|
|
282
|
+
}
|
|
283
|
+
reference(id) { return { [ELEMENT_KEY]: id }; }
|
|
284
|
+
async get(url) { await this.request("POST", "/url", { url }); }
|
|
285
|
+
async currentUrl() { return String(await this.request("GET", "/url")); }
|
|
286
|
+
async title() { return String(await this.request("GET", "/title")); }
|
|
287
|
+
async executeScript(script, args = []) {
|
|
288
|
+
const encoded = args.map((value) => value instanceof SlyWebDriverElement ? this.reference(value.id) : value);
|
|
289
|
+
return this.request("POST", "/execute/sync", { script, args: encoded });
|
|
290
|
+
}
|
|
291
|
+
async executeAsyncScript(script, args = []) {
|
|
292
|
+
const encoded = args.map((value) => value instanceof SlyWebDriverElement ? this.reference(value.id) : value);
|
|
293
|
+
return this.request("POST", "/execute/async", { script, args: encoded });
|
|
294
|
+
}
|
|
295
|
+
async findElement(selector, using = "css selector") {
|
|
296
|
+
const result = await this.request("POST", "/element", { using, value: selector });
|
|
297
|
+
return new SlyWebDriverElement(this, String(result[ELEMENT_KEY]));
|
|
298
|
+
}
|
|
299
|
+
async findElements(selector, using = "css selector") {
|
|
300
|
+
const results = await this.request("POST", "/elements", { using, value: selector });
|
|
301
|
+
return results.map((result) => new SlyWebDriverElement(this, String(result[ELEMENT_KEY])));
|
|
302
|
+
}
|
|
303
|
+
async clearElement(id) { await this.request("POST", `/element/${encodeURIComponent(id)}/clear`, {}); }
|
|
304
|
+
async sendKeysToElement(id, value) {
|
|
305
|
+
const text = String(value);
|
|
306
|
+
await this.request("POST", `/element/${encodeURIComponent(id)}/value`, { text, value: [...text] });
|
|
307
|
+
}
|
|
308
|
+
async elementRect(id) {
|
|
309
|
+
const result = await this.executeScript(`
|
|
310
|
+
const element = arguments[0];
|
|
311
|
+
element.scrollIntoView({block: 'center', inline: 'nearest', behavior: 'instant'});
|
|
312
|
+
const rect = element.getBoundingClientRect();
|
|
313
|
+
if (!rect.width || !rect.height) throw new Error('Element has an empty rectangle');
|
|
314
|
+
return {x: rect.x, y: rect.y, width: rect.width, height: rect.height};
|
|
315
|
+
`, [new SlyWebDriverElement(this, id)]);
|
|
316
|
+
return result;
|
|
317
|
+
}
|
|
318
|
+
async clickElement(id) {
|
|
319
|
+
await this.request("POST", `/element/${encodeURIComponent(id)}/click`, {});
|
|
320
|
+
}
|
|
321
|
+
async typeIntoElement(id, value, clear = true) {
|
|
322
|
+
if (clear)
|
|
323
|
+
await this.clearElement(id).catch(() => undefined);
|
|
324
|
+
// The W3C element-value command focuses and scrolls the target before the
|
|
325
|
+
// native driver emits Humanize key events. An extra click is both
|
|
326
|
+
// redundant and more likely to be intercepted by sticky page chrome.
|
|
327
|
+
await this.sendKeysToElement(id, value);
|
|
328
|
+
}
|
|
329
|
+
async addVirtualAuthenticator(options = {
|
|
330
|
+
protocol: "ctap2",
|
|
331
|
+
transport: "internal",
|
|
332
|
+
hasResidentKey: true,
|
|
333
|
+
hasUserVerification: true,
|
|
334
|
+
isUserConsenting: true,
|
|
335
|
+
isUserVerified: true,
|
|
336
|
+
}) {
|
|
337
|
+
const result = await this.request("POST", "/webauthn/authenticator", options);
|
|
338
|
+
if (typeof result !== "string" || !result) {
|
|
339
|
+
throw new WebDriverError("WebDriver returned an invalid virtual authenticator ID", "webauthn_response_invalid");
|
|
340
|
+
}
|
|
341
|
+
return result;
|
|
342
|
+
}
|
|
343
|
+
async removeVirtualAuthenticator(authenticatorId) {
|
|
344
|
+
await this.request("DELETE", `/webauthn/authenticator/${encodeURIComponent(authenticatorId)}`);
|
|
345
|
+
}
|
|
346
|
+
async addVirtualCredential(authenticatorId, credential) {
|
|
347
|
+
await this.request("POST", `/webauthn/authenticator/${encodeURIComponent(authenticatorId)}/credential`, credential);
|
|
348
|
+
}
|
|
349
|
+
async virtualCredentials(authenticatorId) {
|
|
350
|
+
const result = await this.request("GET", `/webauthn/authenticator/${encodeURIComponent(authenticatorId)}/credentials`);
|
|
351
|
+
if (!Array.isArray(result))
|
|
352
|
+
throw new WebDriverError("WebDriver returned an invalid credential list", "webauthn_response_invalid");
|
|
353
|
+
return result;
|
|
354
|
+
}
|
|
355
|
+
async windowHandles() {
|
|
356
|
+
const result = await this.request("GET", "/window/handles");
|
|
357
|
+
if (!Array.isArray(result) || result.some((item) => typeof item !== "string")) {
|
|
358
|
+
throw new WebDriverError("WebDriver returned invalid window handles", "webdriver_response_invalid");
|
|
359
|
+
}
|
|
360
|
+
return result;
|
|
361
|
+
}
|
|
362
|
+
async currentWindowHandle() {
|
|
363
|
+
const result = await this.request("GET", "/window");
|
|
364
|
+
if (typeof result !== "string" || !result)
|
|
365
|
+
throw new WebDriverError("WebDriver returned an invalid window handle", "webdriver_response_invalid");
|
|
366
|
+
return result;
|
|
367
|
+
}
|
|
368
|
+
async newWindow(type = "tab") {
|
|
369
|
+
const result = await this.request("POST", "/window/new", { type });
|
|
370
|
+
if (typeof result?.handle !== "string" || !result.handle || typeof result.type !== "string") {
|
|
371
|
+
throw new WebDriverError("WebDriver returned an invalid new-window result", "webdriver_response_invalid");
|
|
372
|
+
}
|
|
373
|
+
return { handle: result.handle, type: result.type };
|
|
374
|
+
}
|
|
375
|
+
async switchToWindow(handle) { await this.request("POST", "/window", { handle }); }
|
|
376
|
+
async windowRect() {
|
|
377
|
+
return await this.request("GET", "/window/rect");
|
|
378
|
+
}
|
|
379
|
+
async setWindowRect(rect) {
|
|
380
|
+
return await this.request("POST", "/window/rect", rect);
|
|
381
|
+
}
|
|
382
|
+
async closeWindow() {
|
|
383
|
+
const result = await this.request("DELETE", "/window");
|
|
384
|
+
if (!Array.isArray(result) || result.some((item) => typeof item !== "string")) {
|
|
385
|
+
throw new WebDriverError("WebDriver returned invalid remaining window handles", "webdriver_response_invalid");
|
|
386
|
+
}
|
|
387
|
+
return result;
|
|
388
|
+
}
|
|
389
|
+
async switchToFrame(frame) {
|
|
390
|
+
await this.request("POST", "/frame", { id: frame instanceof SlyWebDriverElement ? this.reference(frame.id) : frame });
|
|
391
|
+
}
|
|
392
|
+
async switchToParentFrame() { await this.request("POST", "/frame/parent", {}); }
|
|
393
|
+
async alertText() { return String(await this.request("GET", "/alert/text")); }
|
|
394
|
+
async acceptAlert() { await this.request("POST", "/alert/accept", {}); }
|
|
395
|
+
async dismissAlert() { await this.request("POST", "/alert/dismiss", {}); }
|
|
396
|
+
async sendAlertText(text) {
|
|
397
|
+
const value = String(text);
|
|
398
|
+
await this.request("POST", "/alert/text", { text: value, value: [...value] });
|
|
399
|
+
}
|
|
400
|
+
async performActions(actions) { await this.request("POST", "/actions", { actions }); }
|
|
401
|
+
async screenshot(path) {
|
|
402
|
+
const bytes = Buffer.from(String(await this.request("GET", "/screenshot")), "base64");
|
|
403
|
+
if (path)
|
|
404
|
+
await writeFile(resolve(path), bytes);
|
|
405
|
+
return bytes;
|
|
406
|
+
}
|
|
407
|
+
async browserLogs() {
|
|
408
|
+
const result = await this.request("POST", "/log", { type: "browser" });
|
|
409
|
+
if (!Array.isArray(result))
|
|
410
|
+
throw new WebDriverError("WebDriver returned invalid browser logs", "webdriver_response_invalid");
|
|
411
|
+
return result;
|
|
412
|
+
}
|
|
413
|
+
async setTimeouts(timeouts) {
|
|
414
|
+
await this.request("POST", "/timeouts", timeouts);
|
|
415
|
+
}
|
|
416
|
+
addCloseCallback(callback) {
|
|
417
|
+
if (this.closed)
|
|
418
|
+
throw new WebDriverError("The WebDriver session is closed", "webdriver_session_closed");
|
|
419
|
+
this.closeCallbacks.push(callback);
|
|
420
|
+
}
|
|
421
|
+
async close() {
|
|
422
|
+
if (this.closed)
|
|
423
|
+
return;
|
|
424
|
+
this.closed = true;
|
|
425
|
+
try {
|
|
426
|
+
await requestJson(this.service.origin, "DELETE", this.path(), undefined, this.service.commandTimeout);
|
|
427
|
+
}
|
|
428
|
+
catch { /* closing the owned service below is authoritative */ }
|
|
429
|
+
try {
|
|
430
|
+
await this.service.close();
|
|
431
|
+
}
|
|
432
|
+
finally {
|
|
433
|
+
await Promise.allSettled(this.closeCallbacks.map((callback) => callback()));
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
async quit() { await this.close(); }
|
|
437
|
+
async [Symbol.asyncDispose]() { await this.close(); }
|
|
438
|
+
}
|
|
439
|
+
export class SlyWebDriverService {
|
|
440
|
+
executable;
|
|
441
|
+
origin;
|
|
442
|
+
commandTimeout;
|
|
443
|
+
process;
|
|
444
|
+
stdout;
|
|
445
|
+
stderr;
|
|
446
|
+
constructor(executable, origin, commandTimeout, process, stdout, stderr) {
|
|
447
|
+
this.executable = executable;
|
|
448
|
+
this.origin = origin;
|
|
449
|
+
this.commandTimeout = commandTimeout;
|
|
450
|
+
this.process = process;
|
|
451
|
+
this.stdout = stdout;
|
|
452
|
+
this.stderr = stderr;
|
|
453
|
+
}
|
|
454
|
+
static async start(executable, options = {}) {
|
|
455
|
+
const path = resolve(executable);
|
|
456
|
+
if (!await fileExists(path))
|
|
457
|
+
throw new ConfigurationError("Project WebDriver executable does not exist", "webdriver_missing");
|
|
458
|
+
const port = await freePort();
|
|
459
|
+
const stdout = [];
|
|
460
|
+
const stderr = [];
|
|
461
|
+
const process = spawn(path, [
|
|
462
|
+
`--port=${port}`,
|
|
463
|
+
"--log-level=WARNING",
|
|
464
|
+
...(options.licenseFile === undefined ? [] : [`--sly-license-file=${resolve(options.licenseFile)}`]),
|
|
465
|
+
...(options.releaseRoot === undefined ? [] : [`--sly-release-root=${resolve(options.releaseRoot)}`]),
|
|
466
|
+
...(options.runtimeFile === undefined ? [] : [`--sly-runtime-file=${resolve(options.runtimeFile)}`]),
|
|
467
|
+
], { windowsHide: true, stdio: ["ignore", "pipe", "pipe"] });
|
|
468
|
+
process.stdout?.on("data", (chunk) => { if (stdout.length < 200)
|
|
469
|
+
stdout.push(String(chunk).slice(0, 4000)); });
|
|
470
|
+
process.stderr?.on("data", (chunk) => { if (stderr.length < 200)
|
|
471
|
+
stderr.push(String(chunk).slice(0, 4000)); });
|
|
472
|
+
const origin = `http://127.0.0.1:${port}`;
|
|
473
|
+
const deadline = Date.now() + (options.startTimeout ?? 15_000);
|
|
474
|
+
while (Date.now() < deadline) {
|
|
475
|
+
if (process.exitCode !== null) {
|
|
476
|
+
throw new WebDriverError(`Project WebDriver exited with ${process.exitCode}: ${stderr.join("") || stdout.join("")}`, "webdriver_start_failed");
|
|
477
|
+
}
|
|
478
|
+
try {
|
|
479
|
+
const status = await requestJson(origin, "GET", "/status", undefined, 1000);
|
|
480
|
+
if (status.ready === true)
|
|
481
|
+
return new SlyWebDriverService(path, origin, options.commandTimeout ?? 60_000, process, stdout, stderr);
|
|
482
|
+
}
|
|
483
|
+
catch { /* startup polling */ }
|
|
484
|
+
await delay(100);
|
|
485
|
+
}
|
|
486
|
+
if (process.exitCode === null)
|
|
487
|
+
process.kill();
|
|
488
|
+
throw new WebDriverError(`Project WebDriver did not become ready: ${stderr.join("") || stdout.join("")}`, "webdriver_start_timeout");
|
|
489
|
+
}
|
|
490
|
+
async createSession(browserExecutable, settings, handoffArguments = []) {
|
|
491
|
+
const payload = buildWebDriverSessionPayload(browserExecutable, settings, handoffArguments);
|
|
492
|
+
const value = await requestJson(this.origin, "POST", "/session", payload, this.commandTimeout);
|
|
493
|
+
const sessionId = String(value.sessionId ?? "");
|
|
494
|
+
const capabilities = (value.capabilities ?? value);
|
|
495
|
+
if (!sessionId)
|
|
496
|
+
throw new WebDriverError("Project WebDriver did not return a session ID", "webdriver_session_invalid");
|
|
497
|
+
try {
|
|
498
|
+
return new SlyWebDriverSession(this, sessionId, capabilities, browserExecutable, {
|
|
499
|
+
...(settings.humanize === undefined ? {} : { enabled: settings.humanize }),
|
|
500
|
+
...(settings.humanPreset === undefined ? {} : { preset: settings.humanPreset }),
|
|
501
|
+
...(settings.humanConfig === undefined ? {} : { config: settings.humanConfig }),
|
|
502
|
+
...(settings.humanSeed === undefined ? {} : { seed: settings.humanSeed }),
|
|
503
|
+
});
|
|
504
|
+
}
|
|
505
|
+
catch (error) {
|
|
506
|
+
await requestJson(this.origin, "DELETE", `/session/${encodeURIComponent(sessionId)}`, undefined, this.commandTimeout).catch(() => undefined);
|
|
507
|
+
throw error;
|
|
508
|
+
}
|
|
509
|
+
}
|
|
510
|
+
async close() {
|
|
511
|
+
if (this.process.exitCode !== null)
|
|
512
|
+
return;
|
|
513
|
+
await fetch(`${this.origin}/shutdown`, {
|
|
514
|
+
method: "GET",
|
|
515
|
+
signal: AbortSignal.timeout(1000),
|
|
516
|
+
}).catch(() => undefined);
|
|
517
|
+
await new Promise((accept) => {
|
|
518
|
+
if (this.process.exitCode !== null)
|
|
519
|
+
accept();
|
|
520
|
+
else {
|
|
521
|
+
const timer = setTimeout(accept, 3000);
|
|
522
|
+
this.process.once("exit", () => { clearTimeout(timer); accept(); });
|
|
523
|
+
}
|
|
524
|
+
});
|
|
525
|
+
if (this.process.exitCode === null)
|
|
526
|
+
this.process.kill();
|
|
527
|
+
}
|
|
528
|
+
}
|
|
529
|
+
/** Launch SlyBrowser through its project-built WebDriver. This is the default SDK backend. */
|
|
530
|
+
export async function launch(executable, lease, settings = {}) {
|
|
531
|
+
if (settings.driverStartTimeout !== undefined && settings.driverStartTimeout < 1000) {
|
|
532
|
+
throw new ConfigurationError("driverStartTimeout must be at least 1000 milliseconds", "config_invalid");
|
|
533
|
+
}
|
|
534
|
+
if (settings.commandTimeout !== undefined && settings.commandTimeout < 1000) {
|
|
535
|
+
throw new ConfigurationError("commandTimeout must be at least 1000 milliseconds", "config_invalid");
|
|
536
|
+
}
|
|
537
|
+
if (settings.nativeReady === true &&
|
|
538
|
+
settings.nativeReadyTimeout !== undefined &&
|
|
539
|
+
(!Number.isFinite(settings.nativeReadyTimeout) || settings.nativeReadyTimeout < 1)) {
|
|
540
|
+
throw new ConfigurationError("nativeReadyTimeout must be a positive number of milliseconds", "config_invalid");
|
|
541
|
+
}
|
|
542
|
+
const browserExecutable = resolve(executable);
|
|
543
|
+
const driverExecutable = defaultDriverExecutable(browserExecutable, settings.driverExecutable);
|
|
544
|
+
const releaseRoot = settings.releaseRoot === undefined
|
|
545
|
+
? releaseRootFromLease(browserExecutable, lease)
|
|
546
|
+
: resolve(settings.releaseRoot);
|
|
547
|
+
const plan = await prepareLaunch(browserExecutable, nativeProfileForSettings(settings), lease, {
|
|
548
|
+
tempRoot: settings.tempRoot,
|
|
549
|
+
releaseRoot,
|
|
550
|
+
includeDriverLease: true,
|
|
551
|
+
runtimeHandoff: settings.runtimeHandoff,
|
|
552
|
+
driverRuntimeHandoff: settings.driverRuntimeHandoff,
|
|
553
|
+
includeDriverRuntime: settings.runtimeHandoff !== undefined,
|
|
554
|
+
allowRuntimeActivationTicket: settings.allowRuntimeActivationTicket === true,
|
|
555
|
+
nativeReady: settings.nativeReady === true,
|
|
556
|
+
});
|
|
557
|
+
let service;
|
|
558
|
+
try {
|
|
559
|
+
service = await SlyWebDriverService.start(driverExecutable, {
|
|
560
|
+
...(settings.driverStartTimeout === undefined ? {} : { startTimeout: settings.driverStartTimeout }),
|
|
561
|
+
...(settings.commandTimeout === undefined ? {} : { commandTimeout: settings.commandTimeout }),
|
|
562
|
+
...(plan.driverLicenseFile === undefined ? {} : { licenseFile: plan.driverLicenseFile }),
|
|
563
|
+
...(releaseRoot === undefined ? {} : { releaseRoot }),
|
|
564
|
+
...(plan.driverRuntimeFile === undefined ? {} : { runtimeFile: plan.driverRuntimeFile }),
|
|
565
|
+
});
|
|
566
|
+
const session = await service.createSession(browserExecutable, settings, plan.arguments);
|
|
567
|
+
try {
|
|
568
|
+
if (settings.nativeReady === true)
|
|
569
|
+
await plan.waitForNativeReady(settings.nativeReadyTimeout ?? 15_000);
|
|
570
|
+
await session.setTimeouts({ pageLoad: settings.commandTimeout ?? 60_000, script: settings.commandTimeout ?? 60_000, implicit: 0 });
|
|
571
|
+
return session;
|
|
572
|
+
}
|
|
573
|
+
catch (error) {
|
|
574
|
+
await session.close().catch(() => undefined);
|
|
575
|
+
throw error;
|
|
576
|
+
}
|
|
577
|
+
}
|
|
578
|
+
catch (error) {
|
|
579
|
+
await service?.close();
|
|
580
|
+
throw error;
|
|
581
|
+
}
|
|
582
|
+
finally {
|
|
583
|
+
await plan.cleanup();
|
|
584
|
+
}
|
|
585
|
+
}
|
|
586
|
+
export const launchWebDriver = launch;
|
|
587
|
+
export function describeDefaultDriver(browserExecutable, explicit) {
|
|
588
|
+
const executable = defaultDriverExecutable(browserExecutable, explicit);
|
|
589
|
+
const source = explicit ? "explicit" : process.env.SLYBROWSER_WEBDRIVER_PATH ? "environment" : `sibling-of-${basename(browserExecutable)}`;
|
|
590
|
+
return { backend: "project-webdriver", executable, source };
|
|
591
|
+
}
|
|
592
|
+
//# sourceMappingURL=webdriver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webdriver.js","sourceRoot":"","sources":["../src/webdriver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAqB,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AACxC,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAE7D,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAElE,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAE9C,MAAM,WAAW,GAAG,qCAAqC,CAAC;AAC1D,MAAM,yBAAyB,GAAG,CAAC,mBAAmB,EAAE,2BAA2B,CAAU,CAAC;AA+C9F,MAAM,OAAO,cAAe,SAAQ,eAAe;IACxC,OAAO,CAAU;IACjB,MAAM,CAAU;IAChB,OAAO,CAAW;IAE3B,YACE,OAAe,EACf,IAAI,GAAG,iBAAiB,EACxB,UAAoE,EAAE;QAEtE,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QACrB,IAAI,OAAO,CAAC,OAAO,KAAK,SAAS;YAAE,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;QAClE,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS;YAAE,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;QAC/D,IAAI,OAAO,CAAC,OAAO,KAAK,SAAS;YAAE,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IACpE,CAAC;CACF;AAED,SAAS,KAAK,CAAC,YAAoB;IACjC,OAAO,IAAI,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,UAAU,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC;AACnE,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,IAAY;IACpC,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;QACnC,OAAO,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IACrC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,KAAK,UAAU,QAAQ;IACrB,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;IAC9B,MAAM,IAAI,OAAO,CAAO,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE;QACzC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC7B,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IACH,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;IACjC,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ;QAAE,MAAM,IAAI,cAAc,CAAC,qCAAqC,EAAE,uBAAuB,CAAC,CAAC;IACtI,MAAM,IAAI,OAAO,CAAO,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IACvG,OAAO,OAAO,CAAC,IAAI,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,iBAAyB,EAAE,QAAiB;IAClF,MAAM,UAAU,GAAG,QAAQ,IAAI,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC;IACrE,IAAI,UAAU;QAAE,OAAO,OAAO,CAAC,UAAU,CAAC,CAAC;IAC3C,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,EAAE,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC;AACvH,CAAC;AAED,SAAS,UAAU,CAAC,KAAc;IAChC,OAAO,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAmB,CAAC,CAAC,CAAC,SAAS,CAAC;AACvG,CAAC;AAED,SAAS,sBAAsB,CAAC,KAAgD;IAC9E,IAAI,QAAQ,GAAY,KAAK,CAAC;IAC9B,IAAI,CAAC;QACH,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;YAAE,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAY,CAAC;aAChF,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAY,CAAC;IAC9E,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,OAAO,GAAG,UAAU,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAC9C,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,CAAC,OAAO;QAAE,OAAO,SAAS,CAAC;IAC9D,IAAI,CAAC;QACH,OAAO,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAY,CAAC,CAAC;IAC/F,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,iBAAyB,EACzB,yBAAkC;IAElC,IAAI,OAAO,yBAAyB,KAAK,QAAQ,IAAI,CAAC,yBAAyB,CAAC,IAAI,EAAE,EAAE,CAAC;QACvF,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,aAAa,GAAG,yBAAyB;SAC5C,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC;SACrB,KAAK,CAAC,GAAG,CAAC;SACV,MAAM,CAAC,OAAO,CAAC,CAAC;IACnB,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IACjD,MAAM,UAAU,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAC9C,MAAM,WAAW,GAAG,UAAU,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAChF,IAAI,WAAW,CAAC,MAAM,GAAG,aAAa,CAAC,MAAM;QAAE,OAAO,SAAS,CAAC;IAChE,MAAM,YAAY,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;IAC9D,MAAM,OAAO,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;QAClD,MAAM,UAAU,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;QACvC,OAAO,OAAO,UAAU,KAAK,QAAQ;YACnC,IAAI,CAAC,WAAW,EAAE,KAAK,UAAU,CAAC,WAAW,EAAE,CAAC;IACpD,CAAC,CAAC,CAAC;IACH,IAAI,CAAC,OAAO;QAAE,OAAO,SAAS,CAAC;IAC/B,IAAI,WAAW,GAAG,UAAU,CAAC;IAC7B,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,aAAa,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,CAAC;QAC1D,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IACrC,CAAC;IACD,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,SAAS,oBAAoB,CAC3B,iBAAyB,EACzB,KAAgD;IAEhD,MAAM,MAAM,GAAG,sBAAsB,CAAC,KAAK,CAAC,CAAC;IAC7C,MAAM,QAAQ,GAAG,UAAU,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC9C,OAAO,iBAAiB,CAAC,iBAAiB,EAAE,QAAQ,EAAE,iBAAiB,CAAC,CAAC;AAC3E,CAAC;AAED,MAAM,UAAU,4BAA4B,CAC1C,iBAAyB,EACzB,WAA4M,EAAE,EAC9M,mBAAsC,EAAE;IAExC,MAAM,IAAI,GAAG,CAAC,gBAAgB,EAAE,4BAA4B,EAAE,GAAG,gBAAgB,EAAE,GAAG,CAAC,QAAQ,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC;IAC7G,IAAI,CAAC,QAAQ,CAAC,QAAQ,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;QAAE,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IAC5H,MAAM,aAAa,GAAG,QAAQ,CAAC,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,qBAAqB,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;IACvH,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,IAAI,aAAa,EAAE,aAAa,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;IACnG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC;QAAE,IAAI,CAAC,IAAI,CAAC,iBAAiB,QAAQ,CAAC,KAAK,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IACpI,MAAM,WAAW,GAAG,QAAQ,CAAC,WAAW,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;IAC/F,IAAI,WAAW,KAAK,YAAY,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC;QACzD,MAAM,IAAI,kBAAkB,CAAC,6CAA6C,EAAE,iCAAiC,CAAC,CAAC;IACjH,CAAC;IACD,IAAI,QAAQ,CAAC,WAAW,KAAK,WAAW,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC;QAChE,MAAM,IAAI,kBAAkB,CAAC,8CAA8C,EAAE,iCAAiC,CAAC,CAAC;IAClH,CAAC;IACD,IAAI,QAAQ,CAAC,UAAU,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC,EAAE,CAAC;QAC5F,IAAI,CAAC,IAAI,CAAC,mBAAmB,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;IAC/D,CAAC;IACD,OAAO;QACL,YAAY,EAAE;YACZ,WAAW,EAAE;gBACX,WAAW,EAAE,QAAQ;gBACrB,mBAAmB,EAAE,KAAK;gBAC1B,aAAa,EAAE;oBACb,QAAQ,EAAE;wBACR,OAAO,EAAE,QAAQ,CAAC,QAAQ,KAAK,IAAI;wBACnC,MAAM,EAAE,QAAQ,CAAC,WAAW,IAAI,SAAS;wBACzC,GAAG,CAAC,QAAQ,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,WAAW,EAAE,CAAC;wBAC/E,GAAG,CAAC,QAAQ,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,SAAS,EAAE,CAAC;qBAC1E;iBACF;gBACD,oBAAoB,EAAE;oBACpB,MAAM,EAAE,OAAO,CAAC,iBAAiB,CAAC;oBAClC,IAAI;oBACJ,eAAe,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,eAAe,IAAI,yBAAyB,CAAC,CAAC;oBAC7E,GAAG,CAAC,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,aAAa,EAAE,CAAC;iBAC3E;aACF;SACF;KACF,CAAC;AACJ,CAAC;AAED,SAAS,qBAAqB,CAAC,KAAoB;IACjD,MAAM,OAAO,GAAG,KAAK,EAAE,aAAa,CAAC;IACrC,MAAM,KAAK,GAAG,KAAK,EAAE,WAAW,CAAC;IACjC,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,CAAC,SAAS,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,SAAS;QACjE,CAAC,OAAO,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,KAAK,GAAG,GAAG,IAAI,OAAO,CAAC,KAAK,GAAG,IAAI;QAC3F,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,OAAO,CAAC,MAAM,GAAG,GAAG,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI;QAClF,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,OAAO,CAAC,UAAU,GAAG,GAAG,IAAI,OAAO,CAAC,UAAU,GAAG,CAAC;QAC1F,OAAO,CAAC,MAAM,KAAK,IAAI,IAAI,OAAO,CAAC,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,CAAC,QAAQ,KAAK,QAAQ;QACjG,CAAC,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;QAC7C,MAAM,IAAI,kBAAkB,CAAC,iFAAiF,EAAE,wBAAwB,CAAC,CAAC;IAC5I,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,wBAAwB,CAAC,QAAiC;IACjE,MAAM,OAAO,GAAG,EAAE,GAAG,CAAC,QAAQ,CAAC,OAAO,IAAI,EAAE,CAAC,EAAE,CAAC;IAChD,IAAI,QAAQ,CAAC,aAAa,KAAK,SAAS;QAAE,OAAO,OAAO,CAAC;IACzD,MAAM,OAAO,GAAG,qBAAqB,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;IAC9D,MAAM,cAAc,GAAG,EAAE,KAAK,EAAE,OAAO,CAAC,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC;IACpG,IAAI,OAAO,CAAC,SAAS,KAAK,SAAS,IAAI,OAAO,CAAC,SAAS,KAAK,OAAO,CAAC,SAAS,EAAE,CAAC;QAC/E,MAAM,IAAI,kBAAkB,CAAC,iDAAiD,EAAE,yBAAyB,CAAC,CAAC;IAC7G,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,IAAI,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,EAAE,CAAC;QACtG,MAAM,IAAI,kBAAkB,CAAC,8CAA8C,EAAE,yBAAyB,CAAC,CAAC;IAC1G,CAAC;IACD,OAAO,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;IACtC,OAAO,CAAC,MAAM,GAAG,cAAc,CAAC;IAChC,MAAM,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC;IAC1C,IAAI,OAAO,CAAC,WAAW,KAAK,SAAS,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;QAAE,OAAO,CAAC,WAAW,GAAG,MAAM,CAAC;IAC7F,MAAM,eAAe,GAAG,OAAO,CAAC,WAAW,CAAC,eAAe,CAAC;IAC5D,IAAI,OAAO,CAAC,SAAS,KAAK,SAAS,IAAI,OAAO,eAAe,KAAK,QAAQ,IAAI,eAAe,EAAE,CAAC;QAC9F,OAAO,CAAC,SAAS,GAAG,eAAe,CAAC;IACtC,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,YAAY,CAAC,KAAc;IAClC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;IACrD,OAAO,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,6BAA6B,CAAC,YAAwB;IACpE,MAAM,cAAc,GAAG,OAAO,YAAY,CAAC,cAAc,KAAK,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC;IAC1G,MAAM,MAAM,GAAG,YAAY,CAAC,MAAgC,CAAC;IAC7D,MAAM,iBAAiB,GAAG,OAAO,MAAM,EAAE,mBAAmB,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC,CAAC,EAAE,CAAC;IAC5G,MAAM,aAAa,GAAG,iBAAiB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC9D,MAAM,YAAY,GAAG,YAAY,CAAC,cAAc,CAAC,CAAC;IAClD,MAAM,WAAW,GAAG,YAAY,CAAC,aAAa,CAAC,CAAC;IAChD,IAAI,YAAY,KAAK,IAAI,IAAI,WAAW,KAAK,IAAI,EAAE,CAAC;QAClD,MAAM,IAAI,cAAc,CAAC,kEAAkE,EAAE,2BAA2B,CAAC,CAAC;IAC5H,CAAC;IACD,IAAI,YAAY,KAAK,WAAW,EAAE,CAAC;QACjC,MAAM,IAAI,cAAc,CACtB,cAAc,cAAc,0BAA0B,aAAa,gCAAgC,EACnG,4BAA4B,CAC7B,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,YAAY,EAAE,CAAC;AACzD,CAAC;AAED,KAAK,UAAU,WAAW,CACxB,MAAc,EACd,MAAc,EACd,IAAY,EACZ,IAAa,EACb,OAAe;IAEf,IAAI,QAAkB,CAAC;IACvB,IAAI,CAAC;QACH,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,MAAM,GAAG,IAAI,EAAE,EAAE;YACzC,MAAM;YACN,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC;YACpC,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBAC5B,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;gBAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;aAC3B,CAAC;SACH,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;YAC5D,MAAM,IAAI,cAAc,CAAC,GAAG,MAAM,IAAI,IAAI,aAAa,OAAO,KAAK,EAAE,2BAA2B,EAAE,EAAE,OAAO,EAAE,GAAG,MAAM,IAAI,IAAI,EAAE,EAAE,CAAC,CAAC;QACtI,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;IACD,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAsB,CAAC;IAC7E,MAAM,KAAK,GAAG,OAAO,EAAE,KAA+B,CAAC;IACvD,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,KAAK,EAAE,KAAK,EAAE,CAAC;QACjC,MAAM,aAAa,GAAG,OAAO,KAAK,EAAE,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QACnG,MAAM,IAAI,cAAc,CACtB,GAAG,MAAM,IAAI,IAAI,YAAY,MAAM,CAAC,KAAK,EAAE,KAAK,IAAI,QAAQ,CAAC,MAAM,CAAC,KAAK,aAAa,EAAE,EACxF,0BAA0B,EAC1B,EAAE,OAAO,EAAE,GAAG,MAAM,IAAI,IAAI,EAAE,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,CACnE,CAAC;IACJ,CAAC;IACD,OAAO,OAAO,EAAE,KAAK,CAAC;AACxB,CAAC;AAED,MAAM,OAAO,mBAAmB;IACT;IAAuC;IAA5D,YAAqB,OAA4B,EAAW,EAAU;QAAjD,YAAO,GAAP,OAAO,CAAqB;QAAW,OAAE,GAAF,EAAE,CAAQ;IAAG,CAAC;IAE1E,KAAK,CAAC,KAAK,KAAoB,MAAM,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC1E,KAAK,CAAC,KAAK,KAAoB,MAAM,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC1E,KAAK,CAAC,QAAQ,CAAC,KAAa,IAAmB,MAAM,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,IAAI,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;IACtG,KAAK,CAAC,IAAI,CAAC,KAAa,EAAE,UAA+B,EAAE;QACzD,MAAM,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC;IAC5E,CAAC;IACD,KAAK,CAAC,IAAI;QACR,OAAO,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC3C,CAAC;CACF;AAED,MAAM,OAAO,mBAAmB;IA0BX;IACR;IA1BF,QAAQ,CAAoB;IAC5B,YAAY,CAAa;IACzB,gBAAgB,CAAS;IACzB,iBAAiB,CAAS;IAC3B,MAAM,GAAG,KAAK,CAAC;IACN,eAAe,CAAU;IACzB,cAAc,GAA+B,EAAE,CAAC;IACjE,cAAc,CAeZ;IAEF,YACmB,OAA4B,EACpC,SAAiB,EAC1B,YAAwB,EACxB,iBAAyB,EACzB,WAAsG,EAAE;QAJvF,YAAO,GAAP,OAAO,CAAqB;QACpC,cAAS,GAAT,SAAS,CAAQ;QAK1B,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;QACjC,IAAI,CAAC,QAAQ,GAAG,6BAA6B,CAAC,YAAY,CAAC,CAAC;QAC5D,IAAI,CAAC,gBAAgB,GAAG,OAAO,CAAC,UAAU,CAAC;QAC3C,IAAI,CAAC,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;QACpD,IAAI,CAAC,eAAe,GAAG,QAAQ,CAAC,OAAO,KAAK,IAAI,CAAC;QACjD,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YACzB,MAAM,QAAQ,GAAG,YAAY,CAAC,cAAc,CAA2B,CAAC;YACxE,MAAM,UAAU,GAAG,QAAQ,EAAE,QAAkC,CAAC;YAChE,IAAI,UAAU,EAAE,OAAO,KAAK,IAAI,IAAI,UAAU,CAAC,OAAO,KAAK,CAAC,EAAE,CAAC;gBAC7D,MAAM,IAAI,cAAc,CACtB,oEAAoE,EACpE,wBAAwB,CACzB,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAEO,IAAI,CAAC,MAAM,GAAG,EAAE,IAAY,OAAO,YAAY,kBAAkB,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,MAAM,EAAE,CAAC,CAAC,CAAC;IAC/F,KAAK,CAAC,OAAO,CAAC,MAAc,EAAE,MAAc,EAAE,IAAc;QAClE,IAAI,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,cAAc,CAAC,iCAAiC,EAAE,0BAA0B,CAAC,CAAC;QACzG,OAAO,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IACxG,CAAC;IACO,SAAS,CAAC,EAAU,IAAgB,OAAO,EAAE,CAAC,WAAW,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;IAE3E,KAAK,CAAC,GAAG,CAAC,GAAW,IAAmB,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;IACtF,KAAK,CAAC,UAAU,KAAsB,OAAO,MAAM,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IACzF,KAAK,CAAC,KAAK,KAAsB,OAAO,MAAM,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IACtF,KAAK,CAAC,aAAa,CAAC,MAAc,EAAE,OAA2B,EAAE;QAC/D,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,YAAY,mBAAmB,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QAC7G,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,eAAe,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;IAC1E,CAAC;IACD,KAAK,CAAC,kBAAkB,CAAC,MAAc,EAAE,OAA2B,EAAE;QACpE,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,YAAY,mBAAmB,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QAC7G,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,gBAAgB,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;IAC3E,CAAC;IACD,KAAK,CAAC,WAAW,CAAC,QAAgB,EAAE,KAAK,GAAG,cAAc;QACxD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,UAAU,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAe,CAAC;QAChG,OAAO,IAAI,mBAAmB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IACpE,CAAC;IACD,KAAK,CAAC,YAAY,CAAC,QAAgB,EAAE,KAAK,GAAG,cAAc;QACzD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,WAAW,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAiB,CAAC;QACpG,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,mBAAmB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7F,CAAC;IACD,KAAK,CAAC,YAAY,CAAC,EAAU,IAAmB,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,YAAY,kBAAkB,CAAC,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;IAE7H,KAAK,CAAC,iBAAiB,CAAC,EAAU,EAAE,KAAa;QAC/C,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QAC3B,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,YAAY,kBAAkB,CAAC,EAAE,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC;IACrG,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,EAAU;QAC1B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC;;;;;;KAMvC,EAAE,CAAC,IAAI,mBAAmB,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;QACxC,OAAO,MAAiE,CAAC;IAC3E,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,EAAU;QAC3B,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,YAAY,kBAAkB,CAAC,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IAC7E,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,EAAU,EAAE,KAAa,EAAE,KAAK,GAAG,IAAI;QAC3D,IAAI,KAAK;YAAE,MAAM,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QAC9D,0EAA0E;QAC1E,kEAAkE;QAClE,qEAAqE;QACrE,MAAM,IAAI,CAAC,iBAAiB,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;IAC1C,CAAC;IAED,KAAK,CAAC,uBAAuB,CAAC,UAAsB;QAClD,QAAQ,EAAE,OAAO;QACjB,SAAS,EAAE,UAAU;QACrB,cAAc,EAAE,IAAI;QACpB,mBAAmB,EAAE,IAAI;QACzB,gBAAgB,EAAE,IAAI;QACtB,cAAc,EAAE,IAAI;KACrB;QACC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,yBAAyB,EAAE,OAAO,CAAC,CAAC;QAC9E,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,MAAM,EAAE,CAAC;YAC1C,MAAM,IAAI,cAAc,CAAC,wDAAwD,EAAE,2BAA2B,CAAC,CAAC;QAClH,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,0BAA0B,CAAC,eAAuB;QACtD,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,2BAA2B,kBAAkB,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;IACjG,CAAC;IAED,KAAK,CAAC,oBAAoB,CAAC,eAAuB,EAAE,UAAsB;QACxE,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,2BAA2B,kBAAkB,CAAC,eAAe,CAAC,aAAa,EAAE,UAAU,CAAC,CAAC;IACtH,CAAC;IAED,KAAK,CAAC,kBAAkB,CAAC,eAAuB;QAC9C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,2BAA2B,kBAAkB,CAAC,eAAe,CAAC,cAAc,CAAC,CAAC;QACvH,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;YAAE,MAAM,IAAI,cAAc,CAAC,+CAA+C,EAAE,2BAA2B,CAAC,CAAC;QACnI,OAAO,MAAsB,CAAC;IAChC,CAAC;IAED,KAAK,CAAC,aAAa;QACjB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,iBAAiB,CAAC,CAAC;QAC5D,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,IAAI,KAAK,QAAQ,CAAC,EAAE,CAAC;YAC9E,MAAM,IAAI,cAAc,CAAC,2CAA2C,EAAE,4BAA4B,CAAC,CAAC;QACtG,CAAC;QACD,OAAO,MAAkB,CAAC;IAC5B,CAAC;IAED,KAAK,CAAC,mBAAmB;QACvB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;QACpD,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,cAAc,CAAC,6CAA6C,EAAE,4BAA4B,CAAC,CAAC;QACjJ,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,OAAyB,KAAK;QAC5C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,aAAa,EAAE,EAAE,IAAI,EAAE,CAAe,CAAC;QACjF,IAAI,OAAO,MAAM,EAAE,MAAM,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC5F,MAAM,IAAI,cAAc,CAAC,iDAAiD,EAAE,4BAA4B,CAAC,CAAC;QAC5G,CAAC;QACD,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAsC,CAAC;IAC1F,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,MAAc,IAAmB,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC;IAC1G,KAAK,CAAC,UAAU;QACd,OAAO,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,cAAc,CAA4D,CAAC;IAC9G,CAAC;IACD,KAAK,CAAC,aAAa,CAAC,IAAiE;QACnF,OAAO,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,cAAc,EAAE,IAAI,CAA4D,CAAC;IACrH,CAAC;IACD,KAAK,CAAC,WAAW;QACf,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;QACvD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,IAAI,KAAK,QAAQ,CAAC,EAAE,CAAC;YAC9E,MAAM,IAAI,cAAc,CAAC,qDAAqD,EAAE,4BAA4B,CAAC,CAAC;QAChH,CAAC;QACD,OAAO,MAAkB,CAAC;IAC5B,CAAC;IACD,KAAK,CAAC,aAAa,CAAC,KAA0C;QAC5D,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,QAAQ,EAAE,EAAE,EAAE,EAAE,KAAK,YAAY,mBAAmB,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;IACxH,CAAC;IACD,KAAK,CAAC,mBAAmB,KAAoB,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,eAAe,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;IAC/F,KAAK,CAAC,SAAS,KAAsB,OAAO,MAAM,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/F,KAAK,CAAC,WAAW,KAAoB,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,eAAe,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;IACvF,KAAK,CAAC,YAAY,KAAoB,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,gBAAgB,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;IACzF,KAAK,CAAC,aAAa,CAAC,IAAY;QAC9B,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;QAC3B,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,aAAa,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,GAAG,KAAK,CAAC,EAAE,CAAC,CAAC;IAChF,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,OAA8B,IAAmB,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,UAAU,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;IAC5H,KAAK,CAAC,UAAU,CAAC,IAAa;QAC5B,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;QACtF,IAAI,IAAI;YAAE,MAAM,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC,CAAC;QAChD,OAAO,KAAK,CAAC;IACf,CAAC;IACD,KAAK,CAAC,WAAW;QACf,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;QACvE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;YAAE,MAAM,IAAI,cAAc,CAAC,yCAAyC,EAAE,4BAA4B,CAAC,CAAC;QAC9H,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,KAAK,CAAC,WAAW,CAAC,QAAmE;QACnF,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC;IACpD,CAAC;IAED,gBAAgB,CAAC,QAA6B;QAC5C,IAAI,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,cAAc,CAAC,iCAAiC,EAAE,0BAA0B,CAAC,CAAC;QACzG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACrC,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,IAAI,CAAC,MAAM;YAAE,OAAO;QACxB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,IAAI,CAAC;YAAC,MAAM,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,QAAQ,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;QAAC,CAAC;QAC9G,MAAM,CAAC,CAAC,sDAAsD,CAAC,CAAC;QAChE,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QAC7B,CAAC;gBAAS,CAAC;YACT,MAAM,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;QAC9E,CAAC;IACH,CAAC;IACD,KAAK,CAAC,IAAI,KAAoB,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IACnD,KAAK,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,KAAoB,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;CACrE;AAED,MAAM,OAAO,mBAAmB;IAEnB;IACA;IACA;IACQ;IACA;IACA;IANnB,YACW,UAAkB,EAClB,MAAc,EACd,cAAsB,EACd,OAAqB,EACrB,MAAgB,EAChB,MAAgB;QALxB,eAAU,GAAV,UAAU,CAAQ;QAClB,WAAM,GAAN,MAAM,CAAQ;QACd,mBAAc,GAAd,cAAc,CAAQ;QACd,YAAO,GAAP,OAAO,CAAc;QACrB,WAAM,GAAN,MAAM,CAAU;QAChB,WAAM,GAAN,MAAM,CAAU;IAChC,CAAC;IAEJ,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,UAAkB,EAAE,UAAgI,EAAE;QACvK,MAAM,IAAI,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;QACjC,IAAI,CAAC,MAAM,UAAU,CAAC,IAAI,CAAC;YAAE,MAAM,IAAI,kBAAkB,CAAC,6CAA6C,EAAE,mBAAmB,CAAC,CAAC;QAC9H,MAAM,IAAI,GAAG,MAAM,QAAQ,EAAE,CAAC;QAC9B,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE;YAC1B,UAAU,IAAI,EAAE;YAChB,qBAAqB;YACrB,GAAG,CAAC,OAAO,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,sBAAsB,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;YACpG,GAAG,CAAC,OAAO,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,sBAAsB,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;YACpG,GAAG,CAAC,OAAO,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,sBAAsB,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;SACrG,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;QAC7D,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,GAAG,IAAI,MAAM,CAAC,MAAM,GAAG,GAAG;YAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/G,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,GAAG,IAAI,MAAM,CAAC,MAAM,GAAG,GAAG;YAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/G,MAAM,MAAM,GAAG,oBAAoB,IAAI,EAAE,CAAC;QAC1C,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,OAAO,CAAC,YAAY,IAAI,MAAM,CAAC,CAAC;QAC/D,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;YAC7B,IAAI,OAAO,CAAC,QAAQ,KAAK,IAAI,EAAE,CAAC;gBAC9B,MAAM,IAAI,cAAc,CAAC,iCAAiC,OAAO,CAAC,QAAQ,KAAK,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,wBAAwB,CAAC,CAAC;YACjJ,CAAC;YACD,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,CAAe,CAAC;gBAC1F,IAAI,MAAM,CAAC,KAAK,KAAK,IAAI;oBAAE,OAAO,IAAI,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,cAAc,IAAI,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;YACrI,CAAC;YAAC,MAAM,CAAC,CAAC,qBAAqB,CAAC,CAAC;YACjC,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;QACnB,CAAC;QACD,IAAI,OAAO,CAAC,QAAQ,KAAK,IAAI;YAAE,OAAO,CAAC,IAAI,EAAE,CAAC;QAC9C,MAAM,IAAI,cAAc,CAAC,2CAA2C,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,yBAAyB,CAAC,CAAC;IACvI,CAAC;IAED,KAAK,CAAC,aAAa,CACjB,iBAAyB,EACzB,QAAiC,EACjC,mBAAsC,EAAE;QAExC,MAAM,OAAO,GAAG,4BAA4B,CAAC,iBAAiB,EAAE,QAAQ,EAAE,gBAAgB,CAAC,CAAC;QAC5F,MAAM,KAAK,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,IAAI,CAAC,cAAc,CAAe,CAAC;QAC7G,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC;QAChD,MAAM,YAAY,GAAG,CAAC,KAAK,CAAC,YAAY,IAAI,KAAK,CAAe,CAAC;QACjE,IAAI,CAAC,SAAS;YAAE,MAAM,IAAI,cAAc,CAAC,+CAA+C,EAAE,2BAA2B,CAAC,CAAC;QACvH,IAAI,CAAC;YACH,OAAO,IAAI,mBAAmB,CAAC,IAAI,EAAE,SAAS,EAAE,YAAY,EAAE,iBAAiB,EAAE;gBAC/E,GAAG,CAAC,QAAQ,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,QAAQ,CAAC,QAAQ,EAAE,CAAC;gBAC1E,GAAG,CAAC,QAAQ,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,WAAW,EAAE,CAAC;gBAC/E,GAAG,CAAC,QAAQ,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,WAAW,EAAE,CAAC;gBAC/E,GAAG,CAAC,QAAQ,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,SAAS,EAAE,CAAC;aAC1E,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE,YAAY,kBAAkB,CAAC,SAAS,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;YAC7I,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ,KAAK,IAAI;YAAE,OAAO;QAC3C,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,MAAM,WAAW,EAAE;YACrC,MAAM,EAAE,KAAK;YACb,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC;SAClC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QAC1B,MAAM,IAAI,OAAO,CAAO,CAAC,MAAM,EAAE,EAAE;YACjC,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ,KAAK,IAAI;gBAAE,MAAM,EAAE,CAAC;iBACxC,CAAC;gBACJ,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;gBACvC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YACtE,CAAC;QACH,CAAC,CAAC,CAAC;QACH,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ,KAAK,IAAI;YAAE,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;IAC1D,CAAC;CACF;AAED,8FAA8F;AAC9F,MAAM,CAAC,KAAK,UAAU,MAAM,CAC1B,UAAkB,EAClB,KAAgD,EAChD,WAAoC,EAAE;IAEtC,IAAI,QAAQ,CAAC,kBAAkB,KAAK,SAAS,IAAI,QAAQ,CAAC,kBAAkB,GAAG,IAAI,EAAE,CAAC;QACpF,MAAM,IAAI,kBAAkB,CAAC,uDAAuD,EAAE,gBAAgB,CAAC,CAAC;IAC1G,CAAC;IACD,IAAI,QAAQ,CAAC,cAAc,KAAK,SAAS,IAAI,QAAQ,CAAC,cAAc,GAAG,IAAI,EAAE,CAAC;QAC5E,MAAM,IAAI,kBAAkB,CAAC,mDAAmD,EAAE,gBAAgB,CAAC,CAAC;IACtG,CAAC;IACD,IAAI,QAAQ,CAAC,WAAW,KAAK,IAAI;QAC7B,QAAQ,CAAC,kBAAkB,KAAK,SAAS;QACzC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,kBAAkB,CAAC,IAAI,QAAQ,CAAC,kBAAkB,GAAG,CAAC,CAAC,EAAE,CAAC;QACvF,MAAM,IAAI,kBAAkB,CAAC,8DAA8D,EAAE,gBAAgB,CAAC,CAAC;IACjH,CAAC;IACD,MAAM,iBAAiB,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IAC9C,MAAM,gBAAgB,GAAG,uBAAuB,CAAC,iBAAiB,EAAE,QAAQ,CAAC,gBAAgB,CAAC,CAAC;IAC/F,MAAM,WAAW,GAAG,QAAQ,CAAC,WAAW,KAAK,SAAS;QACpD,CAAC,CAAC,oBAAoB,CAAC,iBAAiB,EAAE,KAAK,CAAC;QAChD,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IAClC,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC,iBAAiB,EAAE,wBAAwB,CAAC,QAAQ,CAAC,EAAE,KAAK,EAAE;QAC7F,QAAQ,EAAE,QAAQ,CAAC,QAAQ;QAC3B,WAAW;QACX,kBAAkB,EAAE,IAAI;QACxB,cAAc,EAAE,QAAQ,CAAC,cAAc;QACvC,oBAAoB,EAAE,QAAQ,CAAC,oBAAoB;QACnD,oBAAoB,EAAE,QAAQ,CAAC,cAAc,KAAK,SAAS;QAC3D,4BAA4B,EAAE,QAAQ,CAAC,4BAA4B,KAAK,IAAI;QAC5E,WAAW,EAAE,QAAQ,CAAC,WAAW,KAAK,IAAI;KAC3C,CAAC,CAAC;IACH,IAAI,OAAwC,CAAC;IAC7C,IAAI,CAAC;QACH,OAAO,GAAG,MAAM,mBAAmB,CAAC,KAAK,CAAC,gBAAgB,EAAE;YAC1D,GAAG,CAAC,QAAQ,CAAC,kBAAkB,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,QAAQ,CAAC,kBAAkB,EAAE,CAAC;YACnG,GAAG,CAAC,QAAQ,CAAC,cAAc,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,QAAQ,CAAC,cAAc,EAAE,CAAC;YAC7F,GAAG,CAAC,IAAI,CAAC,iBAAiB,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACxF,GAAG,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC;YACrD,GAAG,CAAC,IAAI,CAAC,iBAAiB,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,CAAC,iBAAiB,EAAE,CAAC;SACzF,CAAC,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,aAAa,CAAC,iBAAiB,EAAE,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QACzF,IAAI,CAAC;YACH,IAAI,QAAQ,CAAC,WAAW,KAAK,IAAI;gBAAE,MAAM,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,kBAAkB,IAAI,MAAM,CAAC,CAAC;YACxG,MAAM,OAAO,CAAC,WAAW,CAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC,cAAc,IAAI,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,cAAc,IAAI,MAAM,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC;YACnI,OAAO,OAAO,CAAC;QACjB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;YAC7C,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,EAAE,KAAK,EAAE,CAAC;QACvB,MAAM,KAAK,CAAC;IACd,CAAC;YAAS,CAAC;QACT,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;IACvB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,MAAM,eAAe,GAAG,MAAM,CAAC;AAEtC,MAAM,UAAU,qBAAqB,CAAC,iBAAyB,EAAE,QAAiB;IAChF,MAAM,UAAU,GAAG,uBAAuB,CAAC,iBAAiB,EAAE,QAAQ,CAAC,CAAC;IACxE,MAAM,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,cAAc,QAAQ,CAAC,iBAAiB,CAAC,EAAE,CAAC;IAC3I,OAAO,EAAE,OAAO,EAAE,mBAAmB,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC;AAC9D,CAAC"}
|