@juangadm/pre-post 0.2.0 → 1.0.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 +102 -222
- package/dist/bin/cli.js +199 -347
- package/dist/bin/cli.js.map +1 -1
- package/dist/browser.d.ts +42 -11
- package/dist/browser.d.ts.map +1 -1
- package/dist/browser.js +371 -94
- package/dist/browser.js.map +1 -1
- package/dist/capture.d.ts +1 -6
- package/dist/capture.d.ts.map +1 -1
- package/dist/capture.js +12 -35
- package/dist/capture.js.map +1 -1
- package/dist/commands/compare.d.ts +18 -0
- package/dist/commands/compare.d.ts.map +1 -0
- package/dist/commands/compare.js +64 -0
- package/dist/commands/compare.js.map +1 -0
- package/dist/commands/detect.d.ts +20 -0
- package/dist/commands/detect.d.ts.map +1 -0
- package/dist/commands/detect.js +19 -0
- package/dist/commands/detect.js.map +1 -0
- package/dist/commands/doctor.d.ts +10 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +38 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/login.d.ts +6 -0
- package/dist/commands/login.d.ts.map +1 -0
- package/dist/commands/login.js +34 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/pr.d.ts +28 -0
- package/dist/commands/pr.d.ts.map +1 -0
- package/dist/commands/pr.js +159 -0
- package/dist/commands/pr.js.map +1 -0
- package/dist/commands/prune.d.ts +10 -0
- package/dist/commands/prune.d.ts.map +1 -0
- package/dist/commands/prune.js +13 -0
- package/dist/commands/prune.js.map +1 -0
- package/dist/config.d.ts +36 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +60 -0
- package/dist/config.js.map +1 -0
- package/dist/diff-pool.d.ts +17 -0
- package/dist/diff-pool.d.ts.map +1 -0
- package/dist/diff-pool.js +89 -0
- package/dist/diff-pool.js.map +1 -0
- package/dist/diff-worker.d.ts +29 -0
- package/dist/diff-worker.d.ts.map +1 -0
- package/dist/diff-worker.js +38 -0
- package/dist/diff-worker.js.map +1 -0
- package/dist/diff.d.ts +37 -0
- package/dist/diff.d.ts.map +1 -0
- package/dist/diff.js +171 -0
- package/dist/diff.js.map +1 -0
- package/dist/doctor.d.ts +38 -0
- package/dist/doctor.d.ts.map +1 -0
- package/dist/doctor.js +72 -0
- package/dist/doctor.js.map +1 -0
- package/dist/errors.d.ts +38 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +59 -0
- package/dist/errors.js.map +1 -0
- package/dist/filename.d.ts +2 -0
- package/dist/filename.d.ts.map +1 -1
- package/dist/filename.js +2 -1
- package/dist/filename.js.map +1 -1
- package/dist/git.d.ts +23 -0
- package/dist/git.d.ts.map +1 -0
- package/dist/git.js +86 -0
- package/dist/git.js.map +1 -0
- package/dist/github.d.ts +73 -0
- package/dist/github.d.ts.map +1 -0
- package/dist/github.js +240 -0
- package/dist/github.js.map +1 -0
- package/dist/index.d.ts +22 -22
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +17 -66
- package/dist/index.js.map +1 -1
- package/dist/pkg.d.ts +8 -0
- package/dist/pkg.d.ts.map +1 -0
- package/dist/pkg.js +35 -0
- package/dist/pkg.js.map +1 -0
- package/dist/report.d.ts +20 -0
- package/dist/report.d.ts.map +1 -0
- package/dist/report.js +107 -0
- package/dist/report.js.map +1 -0
- package/dist/routes/imports.d.ts +46 -0
- package/dist/routes/imports.d.ts.map +1 -0
- package/dist/routes/imports.js +208 -0
- package/dist/routes/imports.js.map +1 -0
- package/dist/routes/vite.d.ts +15 -0
- package/dist/routes/vite.d.ts.map +1 -0
- package/dist/routes/vite.js +130 -0
- package/dist/routes/vite.js.map +1 -0
- package/dist/routes.d.ts +41 -14
- package/dist/routes.d.ts.map +1 -1
- package/dist/routes.js +271 -141
- package/dist/routes.js.map +1 -1
- package/dist/run.d.ts +36 -0
- package/dist/run.d.ts.map +1 -0
- package/dist/run.js +128 -0
- package/dist/run.js.map +1 -0
- package/dist/sessions.d.ts +50 -0
- package/dist/sessions.d.ts.map +1 -0
- package/dist/sessions.js +74 -0
- package/dist/sessions.js.map +1 -0
- package/dist/types.d.ts +118 -41
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +1 -0
- package/dist/types.js.map +1 -1
- package/dist/viewport.d.ts +6 -1
- package/dist/viewport.d.ts.map +1 -1
- package/dist/viewport.js +13 -7
- package/dist/viewport.js.map +1 -1
- package/package.json +21 -13
- package/skill/SKILL.md +31 -229
- package/dist/clipboard.d.ts +0 -9
- package/dist/clipboard.d.ts.map +0 -1
- package/dist/clipboard.js +0 -26
- package/dist/clipboard.js.map +0 -1
- package/dist/upload.d.ts +0 -39
- package/dist/upload.d.ts.map +0 -1
- package/dist/upload.js +0 -149
- package/dist/upload.js.map +0 -1
- package/skill/scripts/adapters/0x0st.sh +0 -36
- package/skill/scripts/adapters/blob.sh +0 -55
- package/skill/scripts/adapters/git-native.sh +0 -51
- package/skill/scripts/upload-and-copy.sh +0 -230
package/dist/browser.d.ts
CHANGED
|
@@ -1,25 +1,56 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Browser automation via Playwright.
|
|
3
|
-
*
|
|
2
|
+
* Browser automation via Playwright (playwright-core + Chromium headless shell).
|
|
3
|
+
*
|
|
4
|
+
* One browser per process, one context per viewport/auth combination, and a
|
|
5
|
+
* small page pool. Captures are deterministic: fixed clock, reduced motion,
|
|
6
|
+
* animations finished, caret hidden, fonts and images settled, layout stable.
|
|
4
7
|
*/
|
|
5
|
-
import {
|
|
8
|
+
import { Browser } from 'playwright-core';
|
|
9
|
+
import { AuthOptions, CaptureResult, ViewportSize } from './types.js';
|
|
10
|
+
/** Every capture sees the same wall clock, so dates and "x minutes ago" never drift. */
|
|
11
|
+
export declare const FIXED_TIME: Date;
|
|
6
12
|
export interface ScreenshotOptions {
|
|
7
13
|
viewport: ViewportSize;
|
|
8
14
|
fullPage?: boolean;
|
|
15
|
+
maxHeight?: number;
|
|
16
|
+
scale?: number;
|
|
9
17
|
selector?: string;
|
|
18
|
+
settleTimeout?: number;
|
|
19
|
+
wait?: number;
|
|
20
|
+
auth?: AuthOptions;
|
|
21
|
+
}
|
|
22
|
+
/** Directory of the playwright-core package (for its CLI and browsers.json). */
|
|
23
|
+
export declare function playwrightCoreDir(): string;
|
|
24
|
+
export interface LaunchOptions {
|
|
25
|
+
headless?: boolean;
|
|
10
26
|
}
|
|
11
27
|
/**
|
|
12
|
-
*
|
|
13
|
-
*
|
|
28
|
+
* Launch Chromium with a fallback chain:
|
|
29
|
+
* 1. Explicit custom path (PLAYWRIGHT_CHROMIUM_EXECUTABLE_PATH) — override, fails hard
|
|
30
|
+
* 2. Bundled Playwright Chromium (headless shell when headless)
|
|
31
|
+
* 3. Any Chromium build found in Playwright's cache
|
|
32
|
+
* 4. System Chrome / Edge
|
|
14
33
|
*/
|
|
15
|
-
export declare function
|
|
34
|
+
export declare function launchBrowser(opts?: LaunchOptions): Promise<Browser>;
|
|
35
|
+
export type BrowserKind = 'chromium-headless-shell' | 'chromium';
|
|
36
|
+
/** Install a browser through playwright-core's CLI. Returns true on success. */
|
|
37
|
+
export declare function installBrowser(kind: BrowserKind): boolean;
|
|
16
38
|
/**
|
|
17
|
-
*
|
|
39
|
+
* Launch, installing the right browser first if none is found.
|
|
40
|
+
* Throws BrowserNotFoundError (with `installed` set) when it still cannot launch.
|
|
18
41
|
*/
|
|
19
|
-
export declare function
|
|
42
|
+
export declare function launchBrowserOrInstall(opts?: LaunchOptions): Promise<Browser>;
|
|
43
|
+
/** The process-wide headless browser, launched (and installed) on first use. */
|
|
44
|
+
export declare function getBrowser(): Promise<Browser>;
|
|
45
|
+
export declare function browserDescription(): string;
|
|
20
46
|
/**
|
|
21
|
-
*
|
|
22
|
-
*
|
|
47
|
+
* Capture a screenshot. Safe to call concurrently — the page pool bounds parallelism.
|
|
48
|
+
* Throws HttpStatusError for 401/403 (auth required); other statuses are returned
|
|
49
|
+
* in the result so callers can decide (a 404 "before" for a new page is legitimate).
|
|
23
50
|
*/
|
|
24
|
-
export declare function
|
|
51
|
+
export declare function captureScreenshot(url: string, options: ScreenshotOptions): Promise<CaptureResult>;
|
|
52
|
+
/**
|
|
53
|
+
* Close the browser session and clean up resources.
|
|
54
|
+
*/
|
|
55
|
+
export declare function closeBrowser(): Promise<void>;
|
|
25
56
|
//# sourceMappingURL=browser.d.ts.map
|
package/dist/browser.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAY,OAAO,EAAwB,MAAM,iBAAiB,CAAC;AAK1E,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAKtE,wFAAwF;AACxF,eAAO,MAAM,UAAU,MAAuC,CAAC;AAyB/D,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,YAAY,CAAC;IACvB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,WAAW,CAAC;CACpB;AAMD,gFAAgF;AAChF,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C;AA4DD,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED;;;;;;GAMG;AACH,wBAAsB,aAAa,CAAC,IAAI,GAAE,aAAkB,GAAG,OAAO,CAAC,OAAO,CAAC,CAwC9E;AAED,MAAM,MAAM,WAAW,GAAG,yBAAyB,GAAG,UAAU,CAAC;AAEjE,gFAAgF;AAChF,wBAAgB,cAAc,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAIzD;AAED;;;GAGG;AACH,wBAAsB,sBAAsB,CAAC,IAAI,GAAE,aAAkB,GAAG,OAAO,CAAC,OAAO,CAAC,CAcvF;AAED,gFAAgF;AAChF,wBAAsB,UAAU,IAAI,OAAO,CAAC,OAAO,CAAC,CAMnD;AAED,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAoLD;;;;GAIG;AACH,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,aAAa,CAAC,CA2DvG;AAUD;;GAEG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAOlD"}
|
package/dist/browser.js
CHANGED
|
@@ -1,22 +1,56 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Browser automation via Playwright.
|
|
3
|
-
*
|
|
2
|
+
* Browser automation via Playwright (playwright-core + Chromium headless shell).
|
|
3
|
+
*
|
|
4
|
+
* One browser per process, one context per viewport/auth combination, and a
|
|
5
|
+
* small page pool. Captures are deterministic: fixed clock, reduced motion,
|
|
6
|
+
* animations finished, caret hidden, fonts and images settled, layout stable.
|
|
4
7
|
*/
|
|
5
|
-
import { chromium } from 'playwright';
|
|
8
|
+
import { chromium } from 'playwright-core';
|
|
6
9
|
import fs from 'fs';
|
|
7
10
|
import path from 'path';
|
|
11
|
+
import { createRequire } from 'module';
|
|
12
|
+
import { spawnSync } from 'child_process';
|
|
13
|
+
import { BrowserNotFoundError, HttpStatusError, NavigationError, isVercelResponse } from './errors.js';
|
|
14
|
+
const require = createRequire(import.meta.url);
|
|
15
|
+
/** Every capture sees the same wall clock, so dates and "x minutes ago" never drift. */
|
|
16
|
+
export const FIXED_TIME = new Date('2026-01-15T12:00:00.000Z');
|
|
17
|
+
const MAX_CONCURRENT_PAGES = Number(process.env.PRE_POST_CONCURRENCY) || 6;
|
|
18
|
+
const NAVIGATION_TIMEOUT = 30_000;
|
|
8
19
|
let browser = null;
|
|
9
|
-
let
|
|
20
|
+
let browserLabel = '';
|
|
21
|
+
const contexts = new Map();
|
|
22
|
+
let activePages = 0;
|
|
23
|
+
const pageQueue = [];
|
|
24
|
+
async function acquireSlot() {
|
|
25
|
+
if (activePages >= MAX_CONCURRENT_PAGES) {
|
|
26
|
+
await new Promise(resolve => pageQueue.push(resolve));
|
|
27
|
+
}
|
|
28
|
+
activePages++;
|
|
29
|
+
}
|
|
30
|
+
function releaseSlot() {
|
|
31
|
+
activePages--;
|
|
32
|
+
const next = pageQueue.shift();
|
|
33
|
+
if (next)
|
|
34
|
+
next();
|
|
35
|
+
}
|
|
36
|
+
// ============================================================
|
|
37
|
+
// Launch
|
|
38
|
+
// ============================================================
|
|
39
|
+
/** Directory of the playwright-core package (for its CLI and browsers.json). */
|
|
40
|
+
export function playwrightCoreDir() {
|
|
41
|
+
return path.dirname(require.resolve('playwright-core/package.json'));
|
|
42
|
+
}
|
|
10
43
|
/**
|
|
11
|
-
* Scan Playwright's cache
|
|
12
|
-
* Returns paths to try, in order of preference.
|
|
44
|
+
* Scan Playwright's browser cache for installed Chromium executables.
|
|
13
45
|
*/
|
|
14
46
|
function findCachedChromium() {
|
|
15
47
|
const home = process.env.HOME || process.env.USERPROFILE || '';
|
|
16
48
|
const cacheDir = process.env.PLAYWRIGHT_BROWSERS_PATH
|
|
17
|
-
||
|
|
18
|
-
|
|
19
|
-
|
|
49
|
+
|| (process.platform === 'darwin'
|
|
50
|
+
? path.join(home, 'Library', 'Caches', 'ms-playwright')
|
|
51
|
+
: process.platform === 'win32'
|
|
52
|
+
? path.join(process.env.LOCALAPPDATA || path.join(home, 'AppData', 'Local'), 'ms-playwright')
|
|
53
|
+
: path.join(home, '.cache', 'ms-playwright'));
|
|
20
54
|
let entries;
|
|
21
55
|
try {
|
|
22
56
|
entries = fs.readdirSync(cacheDir);
|
|
@@ -24,41 +58,57 @@ function findCachedChromium() {
|
|
|
24
58
|
catch {
|
|
25
59
|
return [];
|
|
26
60
|
}
|
|
27
|
-
const
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
61
|
+
const subpaths = process.platform === 'darwin'
|
|
62
|
+
? [
|
|
63
|
+
path.join('chrome-mac', 'headless_shell'),
|
|
64
|
+
path.join('chrome-mac', 'Chromium.app', 'Contents', 'MacOS', 'Chromium'),
|
|
65
|
+
path.join('chrome-mac-arm64', 'headless_shell'),
|
|
66
|
+
path.join('chrome-mac-arm64', 'Chromium.app', 'Contents', 'MacOS', 'Chromium'),
|
|
67
|
+
]
|
|
68
|
+
: process.platform === 'win32'
|
|
69
|
+
? [path.join('chrome-win', 'headless_shell.exe'), path.join('chrome-win', 'chrome.exe')]
|
|
70
|
+
: [
|
|
71
|
+
path.join('chrome-linux', 'headless_shell'),
|
|
72
|
+
path.join('chrome-headless-shell-linux64', 'chrome-headless-shell'),
|
|
73
|
+
path.join('chrome-linux', 'chrome'),
|
|
74
|
+
];
|
|
75
|
+
// Prefer headless shell builds, newest first.
|
|
76
|
+
const sorted = entries
|
|
77
|
+
.filter(e => e.startsWith('chromium'))
|
|
78
|
+
.sort((a, b) => (b.includes('headless') ? 1 : 0) - (a.includes('headless') ? 1 : 0) || b.localeCompare(a));
|
|
37
79
|
const candidates = [];
|
|
38
|
-
for (const entry of
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
if (fs.existsSync(fullPath))
|
|
44
|
-
candidates.push(fullPath);
|
|
80
|
+
for (const entry of sorted) {
|
|
81
|
+
for (const sub of subpaths) {
|
|
82
|
+
const full = path.join(cacheDir, entry, sub);
|
|
83
|
+
if (fs.existsSync(full))
|
|
84
|
+
candidates.push(full);
|
|
45
85
|
}
|
|
46
86
|
}
|
|
47
87
|
return candidates;
|
|
48
88
|
}
|
|
89
|
+
const LAUNCH_ARGS = [
|
|
90
|
+
'--disable-dev-shm-usage',
|
|
91
|
+
'--hide-scrollbars',
|
|
92
|
+
'--disable-background-timer-throttling',
|
|
93
|
+
'--disable-renderer-backgrounding',
|
|
94
|
+
'--force-color-profile=srgb',
|
|
95
|
+
'--font-render-hinting=none',
|
|
96
|
+
];
|
|
49
97
|
/**
|
|
50
98
|
* Launch Chromium with a fallback chain:
|
|
51
|
-
* 1. Explicit custom path (PLAYWRIGHT_CHROMIUM_EXECUTABLE_PATH) —
|
|
52
|
-
* 2.
|
|
53
|
-
* 3.
|
|
54
|
-
* 4.
|
|
99
|
+
* 1. Explicit custom path (PLAYWRIGHT_CHROMIUM_EXECUTABLE_PATH) — override, fails hard
|
|
100
|
+
* 2. Bundled Playwright Chromium (headless shell when headless)
|
|
101
|
+
* 3. Any Chromium build found in Playwright's cache
|
|
102
|
+
* 4. System Chrome / Edge
|
|
55
103
|
*/
|
|
56
|
-
async function launchBrowser() {
|
|
57
|
-
|
|
104
|
+
export async function launchBrowser(opts = {}) {
|
|
105
|
+
const headless = opts.headless ?? true;
|
|
58
106
|
const customPath = process.env.PLAYWRIGHT_CHROMIUM_EXECUTABLE_PATH;
|
|
59
107
|
if (customPath) {
|
|
60
108
|
try {
|
|
61
|
-
|
|
109
|
+
const b = await chromium.launch({ headless, executablePath: customPath, args: LAUNCH_ARGS });
|
|
110
|
+
browserLabel = `custom (${customPath})`;
|
|
111
|
+
return b;
|
|
62
112
|
}
|
|
63
113
|
catch (err) {
|
|
64
114
|
throw new Error(`Failed to launch Chromium at custom path: ${customPath}\n` +
|
|
@@ -66,91 +116,318 @@ async function launchBrowser() {
|
|
|
66
116
|
'Either fix the path or unset PLAYWRIGHT_CHROMIUM_EXECUTABLE_PATH to use auto-detection.');
|
|
67
117
|
}
|
|
68
118
|
}
|
|
69
|
-
// Auto-detection: try each strategy in order
|
|
70
119
|
const strategies = [
|
|
71
|
-
{ label: '
|
|
72
|
-
{ label: 'Bundled Playwright Chromium', options: { headless: true } },
|
|
120
|
+
{ label: 'bundled', options: { headless, args: LAUNCH_ARGS } },
|
|
73
121
|
];
|
|
74
|
-
|
|
75
|
-
|
|
122
|
+
if (headless) {
|
|
123
|
+
for (const cachedPath of findCachedChromium()) {
|
|
124
|
+
strategies.push({ label: `cached (${cachedPath})`, options: { headless, executablePath: cachedPath, args: LAUNCH_ARGS } });
|
|
125
|
+
}
|
|
76
126
|
}
|
|
77
|
-
|
|
127
|
+
strategies.push({ label: 'system chrome', options: { headless, channel: 'chrome', args: LAUNCH_ARGS } });
|
|
128
|
+
strategies.push({ label: 'system edge', options: { headless, channel: 'msedge', args: LAUNCH_ARGS } });
|
|
129
|
+
let lastError = null;
|
|
130
|
+
for (const { label, options } of strategies) {
|
|
78
131
|
try {
|
|
79
|
-
|
|
132
|
+
const b = await chromium.launch(options);
|
|
133
|
+
browserLabel = label;
|
|
134
|
+
return b;
|
|
135
|
+
}
|
|
136
|
+
catch (err) {
|
|
137
|
+
lastError = err;
|
|
80
138
|
}
|
|
81
|
-
catch { /* try next */ }
|
|
82
139
|
}
|
|
83
|
-
throw new
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
140
|
+
throw new BrowserNotFoundError(lastError);
|
|
141
|
+
}
|
|
142
|
+
/** Install a browser through playwright-core's CLI. Returns true on success. */
|
|
143
|
+
export function installBrowser(kind) {
|
|
144
|
+
const cli = path.join(playwrightCoreDir(), 'cli.js');
|
|
145
|
+
console.error(`Installing ${kind} (one-time, ~${kind === 'chromium' ? '170' : '80'} MB)...`);
|
|
146
|
+
return spawnSync(process.execPath, [cli, 'install', kind], { stdio: 'inherit' }).status === 0;
|
|
87
147
|
}
|
|
88
148
|
/**
|
|
89
|
-
*
|
|
90
|
-
*
|
|
149
|
+
* Launch, installing the right browser first if none is found.
|
|
150
|
+
* Throws BrowserNotFoundError (with `installed` set) when it still cannot launch.
|
|
91
151
|
*/
|
|
92
|
-
async function
|
|
93
|
-
|
|
94
|
-
|
|
152
|
+
export async function launchBrowserOrInstall(opts = {}) {
|
|
153
|
+
try {
|
|
154
|
+
return await launchBrowser(opts);
|
|
95
155
|
}
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
156
|
+
catch (err) {
|
|
157
|
+
if (!(err instanceof BrowserNotFoundError))
|
|
158
|
+
throw err;
|
|
159
|
+
}
|
|
160
|
+
const installed = installBrowser(opts.headless === false ? 'chromium' : 'chromium-headless-shell');
|
|
161
|
+
if (!installed)
|
|
162
|
+
throw new BrowserNotFoundError(null, false);
|
|
163
|
+
try {
|
|
164
|
+
return await launchBrowser(opts);
|
|
165
|
+
}
|
|
166
|
+
catch (err) {
|
|
167
|
+
if (err instanceof BrowserNotFoundError)
|
|
168
|
+
throw new BrowserNotFoundError(err.cause, true);
|
|
169
|
+
throw err;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
/** The process-wide headless browser, launched (and installed) on first use. */
|
|
173
|
+
export async function getBrowser() {
|
|
174
|
+
if (!browser) {
|
|
175
|
+
browser = await launchBrowserOrInstall();
|
|
176
|
+
browser.on('disconnected', () => { browser = null; contexts.clear(); });
|
|
101
177
|
}
|
|
102
|
-
|
|
103
|
-
|
|
178
|
+
return browser;
|
|
179
|
+
}
|
|
180
|
+
export function browserDescription() {
|
|
181
|
+
return browserLabel;
|
|
182
|
+
}
|
|
183
|
+
// ============================================================
|
|
184
|
+
// Contexts
|
|
185
|
+
// ============================================================
|
|
186
|
+
function contextKey(viewport, scale, auth) {
|
|
187
|
+
return `${viewport.width}x${viewport.height}@${scale}|${auth ? JSON.stringify(auth) : ''}`;
|
|
188
|
+
}
|
|
189
|
+
const INIT_SCRIPT = `
|
|
190
|
+
(() => {
|
|
191
|
+
// Deterministic pseudo-random for pages that seed layout from Math.random().
|
|
192
|
+
let seed = 42;
|
|
193
|
+
Math.random = () => { seed = (seed * 16807) % 2147483647; return (seed - 1) / 2147483646; };
|
|
194
|
+
// No smooth scrolling: scrollTo() must land immediately.
|
|
195
|
+
const style = document.createElement('style');
|
|
196
|
+
style.setAttribute('data-pre-post', '');
|
|
197
|
+
style.textContent = 'html, body, * { scroll-behavior: auto !important; } ::-webkit-scrollbar { display: none !important; }';
|
|
198
|
+
const attach = () => { (document.head || document.documentElement).appendChild(style); };
|
|
199
|
+
if (document.head) attach(); else document.addEventListener('DOMContentLoaded', attach, { once: true });
|
|
200
|
+
})();
|
|
201
|
+
`;
|
|
202
|
+
async function getContext(viewport, scale, auth) {
|
|
203
|
+
const key = contextKey(viewport, scale, auth);
|
|
204
|
+
let pending = contexts.get(key);
|
|
205
|
+
if (!pending) {
|
|
206
|
+
pending = (async () => {
|
|
207
|
+
const b = await getBrowser();
|
|
208
|
+
const ctx = await b.newContext({
|
|
209
|
+
viewport,
|
|
210
|
+
deviceScaleFactor: scale,
|
|
211
|
+
reducedMotion: 'reduce',
|
|
212
|
+
colorScheme: 'light',
|
|
213
|
+
locale: 'en-US',
|
|
214
|
+
timezoneId: 'UTC',
|
|
215
|
+
ignoreHTTPSErrors: true,
|
|
216
|
+
serviceWorkers: 'block',
|
|
217
|
+
extraHTTPHeaders: auth?.headers,
|
|
218
|
+
bypassCSP: true,
|
|
219
|
+
});
|
|
220
|
+
await ctx.clock.setFixedTime(FIXED_TIME);
|
|
221
|
+
await ctx.addInitScript(INIT_SCRIPT);
|
|
222
|
+
if (auth?.cookies?.length) {
|
|
223
|
+
await ctx.addCookies(auth.cookies.map(c => ({
|
|
224
|
+
name: c.name,
|
|
225
|
+
value: c.value,
|
|
226
|
+
...(c.url ? { url: c.url } : { domain: c.domain, path: c.path || '/' }),
|
|
227
|
+
})));
|
|
228
|
+
}
|
|
229
|
+
ctx.setDefaultNavigationTimeout(NAVIGATION_TIMEOUT);
|
|
230
|
+
ctx.setDefaultTimeout(10_000);
|
|
231
|
+
return ctx;
|
|
232
|
+
})();
|
|
233
|
+
contexts.set(key, pending);
|
|
104
234
|
}
|
|
105
|
-
return
|
|
235
|
+
return pending;
|
|
106
236
|
}
|
|
237
|
+
// ============================================================
|
|
238
|
+
// Settle
|
|
239
|
+
// ============================================================
|
|
107
240
|
/**
|
|
108
|
-
*
|
|
109
|
-
*
|
|
241
|
+
* In-page settle: fonts loaded, images decoded, and layout stable across
|
|
242
|
+
* consecutive animation frames. Bounded by `timeout` ms.
|
|
110
243
|
*/
|
|
111
|
-
|
|
112
|
-
const
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
244
|
+
async function settlePage(page, timeout, options = {}) {
|
|
245
|
+
const settled = page.evaluate(async (timeoutMs) => {
|
|
246
|
+
const start = performance.now();
|
|
247
|
+
const remaining = () => Math.max(0, timeoutMs - (performance.now() - start));
|
|
248
|
+
const sleep = (ms) => new Promise(r => setTimeout(r, ms));
|
|
249
|
+
const frame = () => new Promise(r => requestAnimationFrame(() => r()));
|
|
250
|
+
const withCap = (p, ms) => Promise.race([p, sleep(ms)]);
|
|
251
|
+
if (document.fonts?.ready)
|
|
252
|
+
await withCap(document.fonts.ready, Math.min(2500, remaining()));
|
|
253
|
+
const pending = Array.from(document.images).filter(img => !img.complete);
|
|
254
|
+
if (pending.length) {
|
|
255
|
+
await withCap(Promise.allSettled(pending.map(img => img.decode().catch(() => undefined))), Math.min(3000, remaining()));
|
|
256
|
+
}
|
|
257
|
+
const signature = () => {
|
|
258
|
+
const de = document.documentElement;
|
|
259
|
+
return `${de.scrollHeight}:${de.scrollWidth}:${document.body?.childElementCount ?? 0}:${document.getElementsByTagName('*').length}`;
|
|
260
|
+
};
|
|
261
|
+
let last = signature();
|
|
262
|
+
let stable = 0;
|
|
263
|
+
while (stable < 2 && remaining() > 0) {
|
|
264
|
+
await frame();
|
|
265
|
+
await frame();
|
|
266
|
+
const now = signature();
|
|
267
|
+
if (now === last)
|
|
268
|
+
stable++;
|
|
269
|
+
else {
|
|
270
|
+
stable = 0;
|
|
271
|
+
last = now;
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
}, timeout);
|
|
275
|
+
const quiet = options.network === false ? Promise.resolve() : waitForNetworkQuiet(page, 150, Math.min(timeout, 2500));
|
|
276
|
+
await Promise.all([settled, quiet]);
|
|
277
|
+
}
|
|
278
|
+
/**
|
|
279
|
+
* Resolve once no request has been in flight for `quietMs`, or after `cap` ms.
|
|
280
|
+
* Cheaper than Playwright's networkidle (which insists on a 500 ms window)
|
|
281
|
+
* and tolerant of dev servers that keep sockets open.
|
|
282
|
+
*/
|
|
283
|
+
function waitForNetworkQuiet(page, quietMs, cap) {
|
|
284
|
+
const tracker = inflight.get(page);
|
|
285
|
+
if (!tracker)
|
|
286
|
+
return Promise.resolve();
|
|
287
|
+
return new Promise(resolve => {
|
|
288
|
+
let timer = null;
|
|
289
|
+
const done = () => {
|
|
290
|
+
if (timer)
|
|
291
|
+
clearTimeout(timer);
|
|
292
|
+
clearTimeout(hardStop);
|
|
293
|
+
tracker.listeners.delete(check);
|
|
294
|
+
resolve();
|
|
295
|
+
};
|
|
296
|
+
const check = () => {
|
|
297
|
+
if (timer)
|
|
298
|
+
clearTimeout(timer);
|
|
299
|
+
timer = tracker.count === 0 ? setTimeout(done, quietMs) : null;
|
|
300
|
+
};
|
|
301
|
+
const hardStop = setTimeout(done, cap);
|
|
302
|
+
tracker.listeners.add(check);
|
|
303
|
+
check();
|
|
304
|
+
});
|
|
305
|
+
}
|
|
306
|
+
const inflight = new WeakMap();
|
|
307
|
+
function trackRequests(page) {
|
|
308
|
+
const tracker = { count: 0, listeners: new Set() };
|
|
309
|
+
inflight.set(page, tracker);
|
|
310
|
+
const notify = () => { for (const l of tracker.listeners)
|
|
311
|
+
l(); };
|
|
312
|
+
page.on('request', req => {
|
|
313
|
+
// WebSocket upgrades and event streams never "finish"; ignore them.
|
|
314
|
+
if (req.resourceType() === 'websocket' || req.resourceType() === 'eventsource')
|
|
315
|
+
return;
|
|
316
|
+
tracker.count++;
|
|
317
|
+
notify();
|
|
117
318
|
});
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
319
|
+
const finish = (req) => {
|
|
320
|
+
if (req.resourceType() === 'websocket' || req.resourceType() === 'eventsource')
|
|
321
|
+
return;
|
|
322
|
+
tracker.count = Math.max(0, tracker.count - 1);
|
|
323
|
+
notify();
|
|
324
|
+
};
|
|
325
|
+
page.on('requestfinished', finish);
|
|
326
|
+
page.on('requestfailed', finish);
|
|
327
|
+
}
|
|
328
|
+
/**
|
|
329
|
+
* Scroll through the page once so lazy-loaded and reveal-on-scroll content is
|
|
330
|
+
* rendered before a full-page capture, then return to the top.
|
|
331
|
+
*/
|
|
332
|
+
async function primeLazyContent(page, maxHeight) {
|
|
333
|
+
await page.evaluate(async (limitPx) => {
|
|
334
|
+
const frame = () => new Promise(r => requestAnimationFrame(() => r()));
|
|
335
|
+
const step = Math.max(200, window.innerHeight);
|
|
336
|
+
const limit = Math.min(document.documentElement.scrollHeight, limitPx);
|
|
337
|
+
for (let y = step; y < limit + step; y += step) {
|
|
338
|
+
window.scrollTo(0, y);
|
|
339
|
+
await frame();
|
|
340
|
+
await frame();
|
|
126
341
|
}
|
|
127
|
-
|
|
128
|
-
await
|
|
129
|
-
}
|
|
130
|
-
const screenshot = await pg.screenshot({ fullPage: options.fullPage ?? false });
|
|
131
|
-
return Buffer.from(screenshot);
|
|
342
|
+
window.scrollTo(0, 0);
|
|
343
|
+
await frame();
|
|
344
|
+
}, maxHeight);
|
|
132
345
|
}
|
|
346
|
+
// ============================================================
|
|
347
|
+
// Capture
|
|
348
|
+
// ============================================================
|
|
133
349
|
/**
|
|
134
|
-
*
|
|
350
|
+
* Capture a screenshot. Safe to call concurrently — the page pool bounds parallelism.
|
|
351
|
+
* Throws HttpStatusError for 401/403 (auth required); other statuses are returned
|
|
352
|
+
* in the result so callers can decide (a 404 "before" for a new page is legitimate).
|
|
135
353
|
*/
|
|
136
|
-
export async function
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
354
|
+
export async function captureScreenshot(url, options) {
|
|
355
|
+
const started = Date.now();
|
|
356
|
+
const scale = options.scale ?? 2;
|
|
357
|
+
const settleTimeout = options.settleTimeout ?? 8000;
|
|
358
|
+
const maxHeight = options.maxHeight ?? options.viewport.height * 3;
|
|
359
|
+
const ctx = await getContext(options.viewport, scale, options.auth);
|
|
360
|
+
await acquireSlot();
|
|
361
|
+
const page = await ctx.newPage();
|
|
362
|
+
trackRequests(page);
|
|
363
|
+
try {
|
|
364
|
+
const response = await page.goto(url, { waitUntil: 'domcontentloaded' }).catch(err => {
|
|
365
|
+
throw new NavigationError(classifyNavigationError(err), url, err);
|
|
366
|
+
});
|
|
367
|
+
const status = response?.status();
|
|
368
|
+
if (status === 401 || status === 403)
|
|
369
|
+
throw new HttpStatusError(status, url, isVercelResponse({ get: n => response.headers()[n] ?? null }));
|
|
370
|
+
await settlePage(page, settleTimeout);
|
|
371
|
+
if (options.fullPage) {
|
|
372
|
+
await primeLazyContent(page, maxHeight);
|
|
373
|
+
await settlePage(page, Math.min(settleTimeout, 2000), { network: false });
|
|
374
|
+
}
|
|
375
|
+
if (options.selector) {
|
|
376
|
+
const locator = page.locator(options.selector);
|
|
377
|
+
if ((await locator.count()) === 0)
|
|
378
|
+
throw new Error(`Element not found: ${options.selector}`);
|
|
379
|
+
await locator.first().scrollIntoViewIfNeeded();
|
|
380
|
+
}
|
|
381
|
+
if (options.wait)
|
|
382
|
+
await page.waitForTimeout(options.wait);
|
|
383
|
+
let clip;
|
|
384
|
+
if (options.fullPage) {
|
|
385
|
+
const height = await page.evaluate(() => document.documentElement.scrollHeight);
|
|
386
|
+
if (height > maxHeight)
|
|
387
|
+
clip = { x: 0, y: 0, width: options.viewport.width, height: maxHeight };
|
|
388
|
+
}
|
|
389
|
+
const image = await page.screenshot({
|
|
390
|
+
type: 'png',
|
|
391
|
+
fullPage: options.fullPage ?? false,
|
|
392
|
+
animations: 'disabled',
|
|
393
|
+
caret: 'hide',
|
|
394
|
+
clip,
|
|
395
|
+
timeout: 20_000,
|
|
396
|
+
});
|
|
397
|
+
return {
|
|
398
|
+
image,
|
|
399
|
+
viewport: options.viewport,
|
|
400
|
+
url,
|
|
401
|
+
status,
|
|
402
|
+
selector: options.selector,
|
|
403
|
+
durationMs: Date.now() - started,
|
|
404
|
+
};
|
|
140
405
|
}
|
|
141
|
-
|
|
142
|
-
await
|
|
143
|
-
|
|
406
|
+
finally {
|
|
407
|
+
await page.close().catch(() => undefined);
|
|
408
|
+
releaseSlot();
|
|
144
409
|
}
|
|
145
410
|
}
|
|
411
|
+
function classifyNavigationError(err) {
|
|
412
|
+
const msg = err.message || '';
|
|
413
|
+
if (err.name === 'TimeoutError' || /Timeout .* exceeded/.test(msg))
|
|
414
|
+
return 'timeout';
|
|
415
|
+
if (/ERR_CONNECTION_REFUSED/.test(msg))
|
|
416
|
+
return 'refused';
|
|
417
|
+
if (/ERR_NAME_NOT_RESOLVED|ENOTFOUND/.test(msg))
|
|
418
|
+
return 'dns';
|
|
419
|
+
return 'other';
|
|
420
|
+
}
|
|
146
421
|
/**
|
|
147
|
-
*
|
|
148
|
-
* Used in MCP mode where Playwright MCP saves files directly.
|
|
422
|
+
* Close the browser session and clean up resources.
|
|
149
423
|
*/
|
|
150
|
-
export function
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
424
|
+
export async function closeBrowser() {
|
|
425
|
+
const b = browser;
|
|
426
|
+
browser = null;
|
|
427
|
+
contexts.clear();
|
|
428
|
+
activePages = 0;
|
|
429
|
+
pageQueue.length = 0;
|
|
430
|
+
if (b)
|
|
431
|
+
await b.close().catch(() => undefined);
|
|
155
432
|
}
|
|
156
433
|
//# sourceMappingURL=browser.js.map
|
package/dist/browser.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser.js","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"browser.js","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,QAAQ,EAAiC,MAAM,iBAAiB,CAAC;AAC1E,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AACvC,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAE1C,OAAO,EAAE,oBAAoB,EAAE,eAAe,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAEvG,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAE/C,wFAAwF;AACxF,MAAM,CAAC,MAAM,UAAU,GAAG,IAAI,IAAI,CAAC,0BAA0B,CAAC,CAAC;AAE/D,MAAM,oBAAoB,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC;AAC3E,MAAM,kBAAkB,GAAG,MAAM,CAAC;AAElC,IAAI,OAAO,GAAmB,IAAI,CAAC;AACnC,IAAI,YAAY,GAAG,EAAE,CAAC;AACtB,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAmC,CAAC;AAE5D,IAAI,WAAW,GAAG,CAAC,CAAC;AACpB,MAAM,SAAS,GAAsB,EAAE,CAAC;AAExC,KAAK,UAAU,WAAW;IACxB,IAAI,WAAW,IAAI,oBAAoB,EAAE,CAAC;QACxC,MAAM,IAAI,OAAO,CAAO,OAAO,CAAC,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;IAC9D,CAAC;IACD,WAAW,EAAE,CAAC;AAChB,CAAC;AAED,SAAS,WAAW;IAClB,WAAW,EAAE,CAAC;IACd,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,EAAE,CAAC;IAC/B,IAAI,IAAI;QAAE,IAAI,EAAE,CAAC;AACnB,CAAC;AAaD,+DAA+D;AAC/D,SAAS;AACT,+DAA+D;AAE/D,gFAAgF;AAChF,MAAM,UAAU,iBAAiB;IAC/B,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,8BAA8B,CAAC,CAAC,CAAC;AACvE,CAAC;AAED;;GAEG;AACH,SAAS,kBAAkB;IACzB,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,EAAE,CAAC;IAC/D,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,wBAAwB;WAChD,CAAC,OAAO,CAAC,QAAQ,KAAK,QAAQ;YAC/B,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,eAAe,CAAC;YACvD,CAAC,CAAC,OAAO,CAAC,QAAQ,KAAK,OAAO;gBAC5B,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,eAAe,CAAC;gBAC7F,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,eAAe,CAAC,CAAC,CAAC;IAEpD,IAAI,OAAiB,CAAC;IACtB,IAAI,CAAC;QACH,OAAO,GAAG,EAAE,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;IACrC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,QAAQ,GAAa,OAAO,CAAC,QAAQ,KAAK,QAAQ;QACtD,CAAC,CAAC;YACE,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,gBAAgB,CAAC;YACzC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,cAAc,EAAE,UAAU,EAAE,OAAO,EAAE,UAAU,CAAC;YACxE,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,gBAAgB,CAAC;YAC/C,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,cAAc,EAAE,UAAU,EAAE,OAAO,EAAE,UAAU,CAAC;SAC/E;QACH,CAAC,CAAC,OAAO,CAAC,QAAQ,KAAK,OAAO;YAC5B,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,oBAAoB,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;YACxF,CAAC,CAAC;gBACE,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,gBAAgB,CAAC;gBAC3C,IAAI,CAAC,IAAI,CAAC,+BAA+B,EAAE,uBAAuB,CAAC;gBACnE,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,QAAQ,CAAC;aACpC,CAAC;IAER,8CAA8C;IAC9C,MAAM,MAAM,GAAG,OAAO;SACnB,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;SACrC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;IAE7G,MAAM,UAAU,GAAa,EAAE,CAAC;IAChC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;YAC3B,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;YAC7C,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC;gBAAE,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjD,CAAC;IACH,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,MAAM,WAAW,GAAG;IAClB,yBAAyB;IACzB,mBAAmB;IACnB,uCAAuC;IACvC,kCAAkC;IAClC,4BAA4B;IAC5B,4BAA4B;CAC7B,CAAC;AAMF;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAAsB,EAAE;IAC1D,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC;IACvC,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC;IACnE,IAAI,UAAU,EAAE,CAAC;QACf,IAAI,CAAC;YACH,MAAM,CAAC,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,cAAc,EAAE,UAAU,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC;YAC7F,YAAY,GAAG,WAAW,UAAU,GAAG,CAAC;YACxC,OAAO,CAAC,CAAC;QACX,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CACb,6CAA6C,UAAU,IAAI;gBAC3D,KAAM,GAAa,CAAC,OAAO,MAAM;gBACjC,yFAAyF,CAC1F,CAAC;QACJ,CAAC;IACH,CAAC;IAED,MAAM,UAAU,GAA6E;QAC3F,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE;KAC/D,CAAC;IACF,IAAI,QAAQ,EAAE,CAAC;QACb,KAAK,MAAM,UAAU,IAAI,kBAAkB,EAAE,EAAE,CAAC;YAC9C,UAAU,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,WAAW,UAAU,GAAG,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,cAAc,EAAE,UAAU,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,CAAC,CAAC;QAC7H,CAAC;IACH,CAAC;IACD,UAAU,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,eAAe,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,CAAC,CAAC;IACzG,UAAU,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,CAAC,CAAC;IAEvG,IAAI,SAAS,GAAiB,IAAI,CAAC;IACnC,KAAK,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,UAAU,EAAE,CAAC;QAC5C,IAAI,CAAC;YACH,MAAM,CAAC,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACzC,YAAY,GAAG,KAAK,CAAC;YACrB,OAAO,CAAC,CAAC;QACX,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,SAAS,GAAG,GAAY,CAAC;QAC3B,CAAC;IACH,CAAC;IAED,MAAM,IAAI,oBAAoB,CAAC,SAAS,CAAC,CAAC;AAC5C,CAAC;AAID,gFAAgF;AAChF,MAAM,UAAU,cAAc,CAAC,IAAiB;IAC9C,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,EAAE,QAAQ,CAAC,CAAC;IACrD,OAAO,CAAC,KAAK,CAAC,cAAc,IAAI,gBAAgB,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC,CAAC;IAC7F,OAAO,SAAS,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,GAAG,EAAE,SAAS,EAAE,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC;AAChG,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,OAAsB,EAAE;IACnE,IAAI,CAAC;QACH,OAAO,MAAM,aAAa,CAAC,IAAI,CAAC,CAAC;IACnC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,CAAC,GAAG,YAAY,oBAAoB,CAAC;YAAE,MAAM,GAAG,CAAC;IACxD,CAAC;IACD,MAAM,SAAS,GAAG,cAAc,CAAC,IAAI,CAAC,QAAQ,KAAK,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC;IACnG,IAAI,CAAC,SAAS;QAAE,MAAM,IAAI,oBAAoB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC5D,IAAI,CAAC;QACH,OAAO,MAAM,aAAa,CAAC,IAAI,CAAC,CAAC;IACnC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,oBAAoB;YAAE,MAAM,IAAI,oBAAoB,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QACzF,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC;AAED,gFAAgF;AAChF,MAAM,CAAC,KAAK,UAAU,UAAU;IAC9B,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,GAAG,MAAM,sBAAsB,EAAE,CAAC;QACzC,OAAO,CAAC,EAAE,CAAC,cAAc,EAAE,GAAG,EAAE,GAAG,OAAO,GAAG,IAAI,CAAC,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1E,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,kBAAkB;IAChC,OAAO,YAAY,CAAC;AACtB,CAAC;AAED,+DAA+D;AAC/D,WAAW;AACX,+DAA+D;AAE/D,SAAS,UAAU,CAAC,QAAsB,EAAE,KAAa,EAAE,IAAkB;IAC3E,OAAO,GAAG,QAAQ,CAAC,KAAK,IAAI,QAAQ,CAAC,MAAM,IAAI,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;AAC7F,CAAC;AAED,MAAM,WAAW,GAAG;;;;;;;;;;;;CAYnB,CAAC;AAEF,KAAK,UAAU,UAAU,CAAC,QAAsB,EAAE,KAAa,EAAE,IAAkB;IACjF,MAAM,GAAG,GAAG,UAAU,CAAC,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;IAC9C,IAAI,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAChC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,GAAG,CAAC,KAAK,IAAI,EAAE;YACpB,MAAM,CAAC,GAAG,MAAM,UAAU,EAAE,CAAC;YAC7B,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,UAAU,CAAC;gBAC7B,QAAQ;gBACR,iBAAiB,EAAE,KAAK;gBACxB,aAAa,EAAE,QAAQ;gBACvB,WAAW,EAAE,OAAO;gBACpB,MAAM,EAAE,OAAO;gBACf,UAAU,EAAE,KAAK;gBACjB,iBAAiB,EAAE,IAAI;gBACvB,cAAc,EAAE,OAAO;gBACvB,gBAAgB,EAAE,IAAI,EAAE,OAAO;gBAC/B,SAAS,EAAE,IAAI;aAChB,CAAC,CAAC;YACH,MAAM,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;YACzC,MAAM,GAAG,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC;YACrC,IAAI,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;gBAC1B,MAAM,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;oBAC1C,IAAI,EAAE,CAAC,CAAC,IAAI;oBACZ,KAAK,EAAE,CAAC,CAAC,KAAK;oBACd,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,MAAO,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,IAAI,GAAG,EAAE,CAAC;iBACzE,CAAC,CAAC,CAAC,CAAC;YACP,CAAC;YACD,GAAG,CAAC,2BAA2B,CAAC,kBAAkB,CAAC,CAAC;YACpD,GAAG,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;YAC9B,OAAO,GAAG,CAAC;QACb,CAAC,CAAC,EAAE,CAAC;QACL,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IAC7B,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,+DAA+D;AAC/D,SAAS;AACT,+DAA+D;AAE/D;;;GAGG;AACH,KAAK,UAAU,UAAU,CAAC,IAAU,EAAE,OAAe,EAAE,UAAiC,EAAE;IACxF,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,SAAiB,EAAE,EAAE;QACxD,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;QAChC,MAAM,SAAS,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,GAAG,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC;QAC7E,MAAM,KAAK,GAAG,CAAC,EAAU,EAAE,EAAE,CAAC,IAAI,OAAO,CAAO,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;QACxE,MAAM,KAAK,GAAG,GAAG,EAAE,CAAC,IAAI,OAAO,CAAO,CAAC,CAAC,EAAE,CAAC,qBAAqB,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC7E,MAAM,OAAO,GAAG,CAAK,CAAa,EAAE,EAAU,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAEhF,IAAI,QAAQ,CAAC,KAAK,EAAE,KAAK;YAAE,MAAM,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC;QAE5F,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACzE,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACnB,MAAM,OAAO,CACX,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,EAC3E,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,SAAS,EAAE,CAAC,CAC5B,CAAC;QACJ,CAAC;QAED,MAAM,SAAS,GAAG,GAAG,EAAE;YACrB,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC;YACpC,OAAO,GAAG,EAAE,CAAC,YAAY,IAAI,EAAE,CAAC,WAAW,IAAI,QAAQ,CAAC,IAAI,EAAE,iBAAiB,IAAI,CAAC,IAAI,QAAQ,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC;QACtI,CAAC,CAAC;QACF,IAAI,IAAI,GAAG,SAAS,EAAE,CAAC;QACvB,IAAI,MAAM,GAAG,CAAC,CAAC;QACf,OAAO,MAAM,GAAG,CAAC,IAAI,SAAS,EAAE,GAAG,CAAC,EAAE,CAAC;YACrC,MAAM,KAAK,EAAE,CAAC;YACd,MAAM,KAAK,EAAE,CAAC;YACd,MAAM,GAAG,GAAG,SAAS,EAAE,CAAC;YACxB,IAAI,GAAG,KAAK,IAAI;gBAAE,MAAM,EAAE,CAAC;iBACtB,CAAC;gBAAC,MAAM,GAAG,CAAC,CAAC;gBAAC,IAAI,GAAG,GAAG,CAAC;YAAC,CAAC;QAClC,CAAC;IACH,CAAC,EAAE,OAAO,CAAC,CAAC;IAEZ,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,mBAAmB,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;IACtH,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;AACtC,CAAC;AAED;;;;GAIG;AACH,SAAS,mBAAmB,CAAC,IAAU,EAAE,OAAe,EAAE,GAAW;IACnE,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACnC,IAAI,CAAC,OAAO;QAAE,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IACvC,OAAO,IAAI,OAAO,CAAO,OAAO,CAAC,EAAE;QACjC,IAAI,KAAK,GAA0B,IAAI,CAAC;QACxC,MAAM,IAAI,GAAG,GAAG,EAAE;YAChB,IAAI,KAAK;gBAAE,YAAY,CAAC,KAAK,CAAC,CAAC;YAC/B,YAAY,CAAC,QAAQ,CAAC,CAAC;YACvB,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAChC,OAAO,EAAE,CAAC;QACZ,CAAC,CAAC;QACF,MAAM,KAAK,GAAG,GAAG,EAAE;YACjB,IAAI,KAAK;gBAAE,YAAY,CAAC,KAAK,CAAC,CAAC;YAC/B,KAAK,GAAG,OAAO,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACjE,CAAC,CAAC;QACF,MAAM,QAAQ,GAAG,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QACvC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAC7B,KAAK,EAAE,CAAC;IACV,CAAC,CAAC,CAAC;AACL,CAAC;AAOD,MAAM,QAAQ,GAAG,IAAI,OAAO,EAAyB,CAAC;AAEtD,SAAS,aAAa,CAAC,IAAU;IAC/B,MAAM,OAAO,GAAoB,EAAE,KAAK,EAAE,CAAC,EAAE,SAAS,EAAE,IAAI,GAAG,EAAE,EAAE,CAAC;IACpE,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC5B,MAAM,MAAM,GAAG,GAAG,EAAE,GAAG,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,SAAS;QAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACjE,IAAI,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,CAAC,EAAE;QACvB,oEAAoE;QACpE,IAAI,GAAG,CAAC,YAAY,EAAE,KAAK,WAAW,IAAI,GAAG,CAAC,YAAY,EAAE,KAAK,aAAa;YAAE,OAAO;QACvF,OAAO,CAAC,KAAK,EAAE,CAAC;QAChB,MAAM,EAAE,CAAC;IACX,CAAC,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,CAAC,GAA+B,EAAE,EAAE;QACjD,IAAI,GAAG,CAAC,YAAY,EAAE,KAAK,WAAW,IAAI,GAAG,CAAC,YAAY,EAAE,KAAK,aAAa;YAAE,OAAO;QACvF,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;QAC/C,MAAM,EAAE,CAAC;IACX,CAAC,CAAC;IACF,IAAI,CAAC,EAAE,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAC;IACnC,IAAI,CAAC,EAAE,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;AACnC,CAAC;AAED;;;GAGG;AACH,KAAK,UAAU,gBAAgB,CAAC,IAAU,EAAE,SAAiB;IAC3D,MAAM,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,OAAe,EAAE,EAAE;QAC5C,MAAM,KAAK,GAAG,GAAG,EAAE,CAAC,IAAI,OAAO,CAAO,CAAC,CAAC,EAAE,CAAC,qBAAqB,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC7E,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC;QAC/C,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,eAAe,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QACvE,KAAK,IAAI,CAAC,GAAG,IAAI,EAAE,CAAC,GAAG,KAAK,GAAG,IAAI,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC;YAC/C,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACtB,MAAM,KAAK,EAAE,CAAC;YACd,MAAM,KAAK,EAAE,CAAC;QAChB,CAAC;QACD,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACtB,MAAM,KAAK,EAAE,CAAC;IAChB,CAAC,EAAE,SAAS,CAAC,CAAC;AAChB,CAAC;AAED,+DAA+D;AAC/D,UAAU;AACV,+DAA+D;AAE/D;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,GAAW,EAAE,OAA0B;IAC7E,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC3B,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,CAAC,CAAC;IACjC,MAAM,aAAa,GAAG,OAAO,CAAC,aAAa,IAAI,IAAI,CAAC;IACpD,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;IAEnE,MAAM,GAAG,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,QAAQ,EAAE,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IACpE,MAAM,WAAW,EAAE,CAAC;IACpB,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,OAAO,EAAE,CAAC;IACjC,aAAa,CAAC,IAAI,CAAC,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,kBAAkB,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE;YACnF,MAAM,IAAI,eAAe,CAAC,uBAAuB,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;QACpE,CAAC,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,QAAQ,EAAE,MAAM,EAAE,CAAC;QAClC,IAAI,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,GAAG;YAAE,MAAM,IAAI,eAAe,CAAC,MAAM,EAAE,GAAG,EAAE,gBAAgB,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,QAAS,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC;QAE7I,MAAM,UAAU,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;QAEtC,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;YACrB,MAAM,gBAAgB,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;YACxC,MAAM,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,IAAI,CAAC,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;QAC5E,CAAC;QAED,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;YACrB,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YAC/C,IAAI,CAAC,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,sBAAsB,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;YAC7F,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC,sBAAsB,EAAE,CAAC;QACjD,CAAC;QAED,IAAI,OAAO,CAAC,IAAI;YAAE,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAE1D,IAAI,IAAyE,CAAC;QAC9E,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;YACrB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC;YAChF,IAAI,MAAM,GAAG,SAAS;gBAAE,IAAI,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;QAClG,CAAC;QAED,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC;YAClC,IAAI,EAAE,KAAK;YACX,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,KAAK;YACnC,UAAU,EAAE,UAAU;YACtB,KAAK,EAAE,MAAM;YACb,IAAI;YACJ,OAAO,EAAE,MAAM;SAChB,CAAC,CAAC;QAEH,OAAO;YACL,KAAK;YACL,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,GAAG;YACH,MAAM;YACN,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO;SACjC,CAAC;IACJ,CAAC;YAAS,CAAC;QACT,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QAC1C,WAAW,EAAE,CAAC;IAChB,CAAC;AACH,CAAC;AAED,SAAS,uBAAuB,CAAC,GAAU;IACzC,MAAM,GAAG,GAAG,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC;IAC9B,IAAI,GAAG,CAAC,IAAI,KAAK,cAAc,IAAI,qBAAqB,CAAC,IAAI,CAAC,GAAG,CAAC;QAAE,OAAO,SAAS,CAAC;IACrF,IAAI,wBAAwB,CAAC,IAAI,CAAC,GAAG,CAAC;QAAE,OAAO,SAAS,CAAC;IACzD,IAAI,iCAAiC,CAAC,IAAI,CAAC,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC;IAC9D,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY;IAChC,MAAM,CAAC,GAAG,OAAO,CAAC;IAClB,OAAO,GAAG,IAAI,CAAC;IACf,QAAQ,CAAC,KAAK,EAAE,CAAC;IACjB,WAAW,GAAG,CAAC,CAAC;IAChB,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;IACrB,IAAI,CAAC;QAAE,MAAM,CAAC,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;AAChD,CAAC"}
|