camofox-browser 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.
Files changed (66) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/LICENSE +21 -0
  3. package/README.md +328 -0
  4. package/bin/camofox-browser.js +6 -0
  5. package/dist/src/middleware/auth.d.ts +6 -0
  6. package/dist/src/middleware/auth.d.ts.map +1 -0
  7. package/dist/src/middleware/auth.js +41 -0
  8. package/dist/src/middleware/auth.js.map +1 -0
  9. package/dist/src/middleware/errors.d.ts +5 -0
  10. package/dist/src/middleware/errors.d.ts.map +1 -0
  11. package/dist/src/middleware/errors.js +33 -0
  12. package/dist/src/middleware/errors.js.map +1 -0
  13. package/dist/src/middleware/logging.d.ts +14 -0
  14. package/dist/src/middleware/logging.d.ts.map +1 -0
  15. package/dist/src/middleware/logging.js +57 -0
  16. package/dist/src/middleware/logging.js.map +1 -0
  17. package/dist/src/routes/core.d.ts +3 -0
  18. package/dist/src/routes/core.d.ts.map +1 -0
  19. package/dist/src/routes/core.js +579 -0
  20. package/dist/src/routes/core.js.map +1 -0
  21. package/dist/src/routes/openclaw.d.ts +3 -0
  22. package/dist/src/routes/openclaw.d.ts.map +1 -0
  23. package/dist/src/routes/openclaw.js +335 -0
  24. package/dist/src/routes/openclaw.js.map +1 -0
  25. package/dist/src/server.d.ts +2 -0
  26. package/dist/src/server.d.ts.map +1 -0
  27. package/dist/src/server.js +74 -0
  28. package/dist/src/server.js.map +1 -0
  29. package/dist/src/services/browser.d.ts +5 -0
  30. package/dist/src/services/browser.d.ts.map +1 -0
  31. package/dist/src/services/browser.js +64 -0
  32. package/dist/src/services/browser.js.map +1 -0
  33. package/dist/src/services/session.d.ts +30 -0
  34. package/dist/src/services/session.d.ts.map +1 -0
  35. package/dist/src/services/session.js +204 -0
  36. package/dist/src/services/session.js.map +1 -0
  37. package/dist/src/services/tab.d.ts +85 -0
  38. package/dist/src/services/tab.d.ts.map +1 -0
  39. package/dist/src/services/tab.js +463 -0
  40. package/dist/src/services/tab.js.map +1 -0
  41. package/dist/src/types.d.ts +66 -0
  42. package/dist/src/types.d.ts.map +1 -0
  43. package/dist/src/types.js +3 -0
  44. package/dist/src/types.js.map +1 -0
  45. package/dist/src/utils/config.d.ts +49 -0
  46. package/dist/src/utils/config.d.ts.map +1 -0
  47. package/dist/src/utils/config.js +59 -0
  48. package/dist/src/utils/config.js.map +1 -0
  49. package/dist/src/utils/cookies.d.ts +30 -0
  50. package/dist/src/utils/cookies.d.ts.map +1 -0
  51. package/dist/src/utils/cookies.js +71 -0
  52. package/dist/src/utils/cookies.js.map +1 -0
  53. package/dist/src/utils/launcher.d.ts +19 -0
  54. package/dist/src/utils/launcher.d.ts.map +1 -0
  55. package/dist/src/utils/launcher.js +50 -0
  56. package/dist/src/utils/launcher.js.map +1 -0
  57. package/dist/src/utils/macros.d.ts +21 -0
  58. package/dist/src/utils/macros.d.ts.map +1 -0
  59. package/dist/src/utils/macros.js +29 -0
  60. package/dist/src/utils/macros.js.map +1 -0
  61. package/dist/src/utils/presets.d.ts +36 -0
  62. package/dist/src/utils/presets.d.ts.map +1 -0
  63. package/dist/src/utils/presets.js +276 -0
  64. package/dist/src/utils/presets.js.map +1 -0
  65. package/dist/tsconfig.tsbuildinfo +1 -0
  66. package/package.json +78 -0
@@ -0,0 +1,335 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const node_crypto_1 = __importDefault(require("node:crypto"));
7
+ const express_1 = require("express");
8
+ const errors_1 = require("../middleware/errors");
9
+ const logging_1 = require("../middleware/logging");
10
+ const auth_1 = require("../middleware/auth");
11
+ const config_1 = require("../utils/config");
12
+ const browser_1 = require("../services/browser");
13
+ const session_1 = require("../services/session");
14
+ const tab_1 = require("../services/tab");
15
+ const CONFIG = (0, config_1.loadConfig)();
16
+ const router = (0, express_1.Router)();
17
+ function isLoadState(value) {
18
+ return value === 'load' || value === 'domcontentloaded' || value === 'networkidle';
19
+ }
20
+ // GET / - Status (alias for GET /health)
21
+ router.get('/', async (_req, res) => {
22
+ try {
23
+ const b = await (0, browser_1.ensureBrowser)();
24
+ res.json({
25
+ ok: true,
26
+ enabled: true,
27
+ running: b.isConnected(),
28
+ engine: 'camoufox',
29
+ browserConnected: b.isConnected(),
30
+ });
31
+ }
32
+ catch (err) {
33
+ res.status(500).json({ ok: false, error: (0, errors_1.safeError)(err) });
34
+ }
35
+ });
36
+ // POST /tabs/open - Open tab (alias for POST /tabs, OpenClaw format)
37
+ router.post('/tabs/open', async (req, res) => {
38
+ try {
39
+ const { url, userId, listItemId = 'default' } = req.body;
40
+ if (!userId) {
41
+ return res.status(400).json({ error: 'userId is required' });
42
+ }
43
+ if (!url) {
44
+ return res.status(400).json({ error: 'url is required' });
45
+ }
46
+ const urlErr = (0, tab_1.validateUrl)(url);
47
+ if (urlErr)
48
+ return res.status(400).json({ error: urlErr });
49
+ const sessionMapKey = (0, session_1.getSessionMapKey)(userId, null);
50
+ const session = await (0, session_1.getSession)(userId);
51
+ const totalTabs = (0, session_1.countTotalTabsForSessions)([[sessionMapKey, session]]);
52
+ if (totalTabs >= session_1.MAX_TABS_PER_SESSION) {
53
+ return res.status(429).json({ error: 'Maximum tabs per session reached' });
54
+ }
55
+ const group = (0, session_1.getTabGroup)(session, listItemId);
56
+ const page = await session.context.newPage();
57
+ const tabId = node_crypto_1.default.randomUUID();
58
+ const tabState = (0, tab_1.createTabState)(page);
59
+ group.set(tabId, tabState);
60
+ (0, session_1.indexTab)(tabId, sessionMapKey);
61
+ await page.goto(url, { waitUntil: 'domcontentloaded', timeout: 30000 });
62
+ tabState.visitedUrls.add(url);
63
+ (0, logging_1.log)('info', 'openclaw tab opened', { reqId: req.reqId, tabId, url: page.url() });
64
+ return res.json({
65
+ ok: true,
66
+ targetId: tabId,
67
+ tabId,
68
+ url: page.url(),
69
+ title: await page.title().catch(() => ''),
70
+ });
71
+ }
72
+ catch (err) {
73
+ const message = err instanceof Error ? err.message : String(err);
74
+ (0, logging_1.log)('error', 'openclaw tab open failed', { reqId: req.reqId, error: message });
75
+ return res.status(500).json({ error: (0, errors_1.safeError)(err) });
76
+ }
77
+ });
78
+ // POST /start - Start browser (OpenClaw expects this)
79
+ router.post('/start', async (_req, res) => {
80
+ try {
81
+ await (0, browser_1.ensureBrowser)();
82
+ res.json({ ok: true, profile: 'camoufox' });
83
+ }
84
+ catch (err) {
85
+ res.status(500).json({ ok: false, error: (0, errors_1.safeError)(err) });
86
+ }
87
+ });
88
+ // POST /stop - Stop browser (OpenClaw expects this)
89
+ router.post('/stop', async (req, res) => {
90
+ try {
91
+ if (!(0, auth_1.isAuthorizedWithAdminKey)(req, CONFIG.adminKey)) {
92
+ return res.status(403).json({ error: 'Forbidden' });
93
+ }
94
+ if ((0, browser_1.getBrowser)()) {
95
+ await (0, browser_1.closeBrowser)();
96
+ }
97
+ (0, session_1.clearAllState)();
98
+ res.json({ ok: true, stopped: true, profile: 'camoufox' });
99
+ }
100
+ catch (err) {
101
+ res.status(500).json({ ok: false, error: (0, errors_1.safeError)(err) });
102
+ }
103
+ });
104
+ // POST /navigate - Navigate (OpenClaw format with targetId in body)
105
+ router.post('/navigate', async (req, res) => {
106
+ try {
107
+ const { targetId, url, userId } = req.body;
108
+ if (!userId) {
109
+ return res.status(400).json({ error: 'userId is required' });
110
+ }
111
+ if (!url) {
112
+ return res.status(400).json({ error: 'url is required' });
113
+ }
114
+ const urlErr = (0, tab_1.validateUrl)(url);
115
+ if (urlErr)
116
+ return res.status(400).json({ error: urlErr });
117
+ const found = (0, session_1.findTabById)(String(targetId), userId);
118
+ if (!found) {
119
+ return res.status(404).json({ error: 'Tab not found' });
120
+ }
121
+ const { tabState } = found;
122
+ tabState.toolCalls++;
123
+ const result = await (0, tab_1.withTabLock)(String(targetId), async () => {
124
+ await tabState.page.goto(url, { waitUntil: 'domcontentloaded', timeout: 30000 });
125
+ tabState.visitedUrls.add(url);
126
+ tabState.refs = await (0, tab_1.buildRefs)(tabState.page);
127
+ return { ok: true, targetId, url: tabState.page.url() };
128
+ });
129
+ return res.json(result);
130
+ }
131
+ catch (err) {
132
+ const message = err instanceof Error ? err.message : String(err);
133
+ (0, logging_1.log)('error', 'openclaw navigate failed', { reqId: req.reqId, error: message });
134
+ return res.status(500).json({ error: (0, errors_1.safeError)(err) });
135
+ }
136
+ });
137
+ // GET /snapshot - Snapshot (OpenClaw format with query params)
138
+ router.get('/snapshot', async (req, res) => {
139
+ try {
140
+ const { targetId, userId } = req.query;
141
+ if (!userId) {
142
+ return res.status(400).json({ error: 'userId is required' });
143
+ }
144
+ const found = (0, session_1.findTabById)(String(targetId), userId);
145
+ if (!found) {
146
+ return res.status(404).json({ error: 'Tab not found' });
147
+ }
148
+ const { tabState } = found;
149
+ tabState.toolCalls++;
150
+ tabState.refs = await (0, tab_1.buildRefs)(tabState.page);
151
+ const ariaYaml = await (0, tab_1.getAriaSnapshot)(tabState.page);
152
+ const annotatedYaml = (0, tab_1.annotateAriaYamlWithRefs)(ariaYaml, tabState.refs);
153
+ return res.json({
154
+ ok: true,
155
+ format: 'aria',
156
+ targetId,
157
+ url: tabState.page.url(),
158
+ snapshot: annotatedYaml,
159
+ refsCount: tabState.refs.size,
160
+ });
161
+ }
162
+ catch (err) {
163
+ const message = err instanceof Error ? err.message : String(err);
164
+ (0, logging_1.log)('error', 'openclaw snapshot failed', { reqId: req.reqId, error: message });
165
+ return res.status(500).json({ error: (0, errors_1.safeError)(err) });
166
+ }
167
+ });
168
+ // POST /act - Combined action endpoint (OpenClaw format)
169
+ router.post('/act', async (req, res) => {
170
+ try {
171
+ const body = req.body;
172
+ const kind = typeof body.kind === 'string' ? body.kind : undefined;
173
+ const targetId = typeof body.targetId === 'string' ? body.targetId : undefined;
174
+ const userId = body.userId;
175
+ if (!userId) {
176
+ return res.status(400).json({ error: 'userId is required' });
177
+ }
178
+ if (!kind) {
179
+ return res.status(400).json({ error: 'kind is required' });
180
+ }
181
+ if (!targetId) {
182
+ return res.status(400).json({ error: 'targetId is required' });
183
+ }
184
+ const found = (0, session_1.findTabById)(targetId, userId);
185
+ if (!found) {
186
+ return res.status(404).json({ error: 'Tab not found' });
187
+ }
188
+ const { tabState } = found;
189
+ tabState.toolCalls++;
190
+ const result = await (0, tab_1.withTabLock)(targetId, async () => {
191
+ switch (kind) {
192
+ case 'click': {
193
+ const params = body;
194
+ const { ref, selector, doubleClick } = params;
195
+ if (!ref && !selector) {
196
+ throw new Error('ref or selector required');
197
+ }
198
+ const doClick = async (target) => {
199
+ const locator = typeof target === 'string' ? tabState.page.locator(target) : target;
200
+ const clickOpts = { timeout: 5000 };
201
+ if (doubleClick)
202
+ clickOpts.clickCount = 2;
203
+ try {
204
+ await locator.click(clickOpts);
205
+ }
206
+ catch (err) {
207
+ const message = err instanceof Error ? err.message : String(err);
208
+ if (message.includes('intercepts pointer events')) {
209
+ await locator.click({ ...clickOpts, force: true });
210
+ }
211
+ else {
212
+ throw err;
213
+ }
214
+ }
215
+ };
216
+ if (ref) {
217
+ const locator = (0, tab_1.refToLocator)(tabState.page, ref, tabState.refs);
218
+ if (!locator)
219
+ throw new Error(`Unknown ref: ${ref}`);
220
+ await doClick(locator);
221
+ }
222
+ else {
223
+ await doClick(String(selector));
224
+ }
225
+ await tabState.page.waitForTimeout(500);
226
+ tabState.refs = await (0, tab_1.buildRefs)(tabState.page);
227
+ return { ok: true, targetId, url: tabState.page.url() };
228
+ }
229
+ case 'type': {
230
+ const params = body;
231
+ const { ref, selector, text, submit } = params;
232
+ if (!ref && !selector) {
233
+ throw new Error('ref or selector required');
234
+ }
235
+ if (typeof text !== 'string' || text.length === 0) {
236
+ throw new Error('text is required');
237
+ }
238
+ if (ref) {
239
+ const locator = (0, tab_1.refToLocator)(tabState.page, ref, tabState.refs);
240
+ if (!locator)
241
+ throw new Error(`Unknown ref: ${ref}`);
242
+ await locator.fill(text, { timeout: 10000 });
243
+ if (submit)
244
+ await tabState.page.keyboard.press('Enter');
245
+ }
246
+ else {
247
+ await tabState.page.fill(String(selector), text, { timeout: 10000 });
248
+ if (submit)
249
+ await tabState.page.keyboard.press('Enter');
250
+ }
251
+ return { ok: true, targetId };
252
+ }
253
+ case 'press': {
254
+ const params = body;
255
+ const { key } = params;
256
+ if (!key)
257
+ throw new Error('key is required');
258
+ await tabState.page.keyboard.press(key);
259
+ return { ok: true, targetId };
260
+ }
261
+ case 'scroll':
262
+ case 'scrollIntoView': {
263
+ const params = body;
264
+ const ref = params.ref;
265
+ const direction = params.direction ?? 'down';
266
+ const amount = params.amount ?? 500;
267
+ if (ref) {
268
+ const locator = (0, tab_1.refToLocator)(tabState.page, ref, tabState.refs);
269
+ if (!locator)
270
+ throw new Error(`Unknown ref: ${ref}`);
271
+ await locator.scrollIntoViewIfNeeded({ timeout: 5000 });
272
+ }
273
+ else {
274
+ const delta = direction === 'up' ? -amount : amount;
275
+ await tabState.page.mouse.wheel(0, delta);
276
+ }
277
+ await tabState.page.waitForTimeout(300);
278
+ return { ok: true, targetId };
279
+ }
280
+ case 'hover': {
281
+ const params = body;
282
+ const { ref, selector } = params;
283
+ if (!ref && !selector)
284
+ throw new Error('ref or selector required');
285
+ if (ref) {
286
+ const locator = (0, tab_1.refToLocator)(tabState.page, ref, tabState.refs);
287
+ if (!locator)
288
+ throw new Error(`Unknown ref: ${ref}`);
289
+ await locator.hover({ timeout: 5000 });
290
+ }
291
+ else {
292
+ await tabState.page.locator(String(selector)).hover({ timeout: 5000 });
293
+ }
294
+ return { ok: true, targetId };
295
+ }
296
+ case 'wait': {
297
+ const params = body;
298
+ const { timeMs, text } = params;
299
+ const loadStateUnknown = params.loadState;
300
+ const loadState = typeof loadStateUnknown === 'string' && isLoadState(loadStateUnknown) ? loadStateUnknown : undefined;
301
+ if (timeMs) {
302
+ await tabState.page.waitForTimeout(timeMs);
303
+ }
304
+ else if (text) {
305
+ await tabState.page.waitForSelector(`text=${text}`, { timeout: 30000 });
306
+ }
307
+ else if (loadState) {
308
+ await tabState.page.waitForLoadState(loadState, { timeout: 30000 });
309
+ }
310
+ return { ok: true, targetId, url: tabState.page.url() };
311
+ }
312
+ case 'close': {
313
+ await tabState.page.close();
314
+ found.group.delete(String(targetId));
315
+ (0, session_1.unindexTab)(String(targetId));
316
+ if (found.group.size === 0) {
317
+ found.session.tabGroups.delete(found.listItemId);
318
+ }
319
+ return { ok: true, targetId };
320
+ }
321
+ default:
322
+ throw new Error(`Unsupported action kind: ${kind}`);
323
+ }
324
+ });
325
+ return res.json(result);
326
+ }
327
+ catch (err) {
328
+ const message = err instanceof Error ? err.message : String(err);
329
+ const kindFromBody = typeof req.body.kind === 'string' ? req.body.kind : undefined;
330
+ (0, logging_1.log)('error', 'act failed', { reqId: req.reqId, kind: kindFromBody, error: message });
331
+ return res.status(500).json({ error: (0, errors_1.safeError)(err) });
332
+ }
333
+ });
334
+ exports.default = router;
335
+ //# sourceMappingURL=openclaw.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openclaw.js","sourceRoot":"","sources":["../../../src/routes/openclaw.ts"],"names":[],"mappings":";;;;;AAAA,8DAAiC;AAEjC,qCAA8D;AAG9D,iDAAiD;AACjD,mDAA4C;AAC5C,6CAA8D;AAC9D,4CAA6C;AAC7C,iDAA8E;AAC9E,iDAU6B;AAC7B,yCAA+I;AAE/I,MAAM,MAAM,GAAG,IAAA,mBAAU,GAAE,CAAC;AAE5B,MAAM,MAAM,GAAG,IAAA,gBAAM,GAAE,CAAC;AAKxB,SAAS,WAAW,CAAC,KAAa;IACjC,OAAO,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,kBAAkB,IAAI,KAAK,KAAK,aAAa,CAAC;AACpF,CAAC;AAED,yCAAyC;AACzC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,IAAa,EAAE,GAAa,EAAE,EAAE;IACtD,IAAI,CAAC;QACJ,MAAM,CAAC,GAAG,MAAM,IAAA,uBAAa,GAAE,CAAC;QAChC,GAAG,CAAC,IAAI,CAAC;YACR,EAAE,EAAE,IAAI;YACR,OAAO,EAAE,IAAI;YACb,OAAO,EAAE,CAAC,CAAC,WAAW,EAAE;YACxB,MAAM,EAAE,UAAU;YAClB,gBAAgB,EAAE,CAAC,CAAC,WAAW,EAAE;SACjC,CAAC,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACd,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,IAAA,kBAAS,EAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC5D,CAAC;AACF,CAAC,CAAC,CAAC;AAEH,qEAAqE;AACrE,MAAM,CAAC,IAAI,CAAC,YAAY,EAAE,KAAK,EAAE,GAAuF,EAAE,GAAa,EAAE,EAAE;IAC1I,IAAI,CAAC;QACJ,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,UAAU,GAAG,SAAS,EAAE,GAAG,GAAG,CAAC,IAAI,CAAC;QACzD,IAAI,CAAC,MAAM,EAAE,CAAC;YACb,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,oBAAoB,EAAE,CAAC,CAAC;QAC9D,CAAC;QACD,IAAI,CAAC,GAAG,EAAE,CAAC;YACV,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,iBAAiB,EAAE,CAAC,CAAC;QAC3D,CAAC;QAED,MAAM,MAAM,GAAG,IAAA,iBAAW,EAAC,GAAG,CAAC,CAAC;QAChC,IAAI,MAAM;YAAE,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;QAE3D,MAAM,aAAa,GAAG,IAAA,0BAAgB,EAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QACrD,MAAM,OAAO,GAAG,MAAM,IAAA,oBAAU,EAAC,MAAM,CAAC,CAAC;QAEzC,MAAM,SAAS,GAAG,IAAA,mCAAyB,EAAC,CAAC,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;QACxE,IAAI,SAAS,IAAI,8BAAoB,EAAE,CAAC;YACvC,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,kCAAkC,EAAE,CAAC,CAAC;QAC5E,CAAC;QAED,MAAM,KAAK,GAAG,IAAA,qBAAW,EAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QAC/C,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;QAC7C,MAAM,KAAK,GAAG,qBAAM,CAAC,UAAU,EAAE,CAAC;QAClC,MAAM,QAAQ,GAAG,IAAA,oBAAc,EAAC,IAAI,CAAC,CAAC;QACtC,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QAC3B,IAAA,kBAAQ,EAAC,KAAK,EAAE,aAAa,CAAC,CAAC;QAE/B,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,kBAAkB,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;QACxE,QAAQ,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAE9B,IAAA,aAAG,EAAC,MAAM,EAAE,qBAAqB,EAAE,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACjF,OAAO,GAAG,CAAC,IAAI,CAAC;YACf,EAAE,EAAE,IAAI;YACR,QAAQ,EAAE,KAAK;YACf,KAAK;YACL,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE;YACf,KAAK,EAAE,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC;SACzC,CAAC,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACd,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,IAAA,aAAG,EAAC,OAAO,EAAE,0BAA0B,EAAE,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;QAC/E,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAA,kBAAS,EAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACxD,CAAC;AACF,CAAC,CAAC,CAAC;AAEH,sDAAsD;AACtD,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,IAAa,EAAE,GAAa,EAAE,EAAE;IAC5D,IAAI,CAAC;QACJ,MAAM,IAAA,uBAAa,GAAE,CAAC;QACtB,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC;IAC7C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACd,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,IAAA,kBAAS,EAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC5D,CAAC;AACF,CAAC,CAAC,CAAC;AAEH,oDAAoD;AACpD,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,GAAY,EAAE,GAAa,EAAE,EAAE;IAC1D,IAAI,CAAC;QACJ,IAAI,CAAC,IAAA,+BAAwB,EAAC,GAAG,EAAE,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;YACrD,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC;QACrD,CAAC;QAED,IAAI,IAAA,oBAAU,GAAE,EAAE,CAAC;YAClB,MAAM,IAAA,sBAAY,GAAE,CAAC;QACtB,CAAC;QACD,IAAA,uBAAa,GAAE,CAAC;QAChB,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC;IAC5D,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACd,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,IAAA,kBAAS,EAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC5D,CAAC;AACF,CAAC,CAAC,CAAC;AAEH,oEAAoE;AACpE,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,EAAE,GAAqF,EAAE,GAAa,EAAE,EAAE;IACvI,IAAI,CAAC;QACJ,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC,IAAI,CAAC;QAC3C,IAAI,CAAC,MAAM,EAAE,CAAC;YACb,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,oBAAoB,EAAE,CAAC,CAAC;QAC9D,CAAC;QACD,IAAI,CAAC,GAAG,EAAE,CAAC;YACV,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,iBAAiB,EAAE,CAAC,CAAC;QAC3D,CAAC;QAED,MAAM,MAAM,GAAG,IAAA,iBAAW,EAAC,GAAG,CAAC,CAAC;QAChC,IAAI,MAAM;YAAE,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;QAE3D,MAAM,KAAK,GAAG,IAAA,qBAAW,EAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,CAAC;QACpD,IAAI,CAAC,KAAK,EAAE,CAAC;YACZ,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,eAAe,EAAE,CAAC,CAAC;QACzD,CAAC;QAED,MAAM,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC;QAC3B,QAAQ,CAAC,SAAS,EAAE,CAAC;QAErB,MAAM,MAAM,GAAG,MAAM,IAAA,iBAAW,EAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,KAAK,IAAI,EAAE;YAC7D,MAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,kBAAkB,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;YACjF,QAAQ,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAC9B,QAAQ,CAAC,IAAI,GAAG,MAAM,IAAA,eAAS,EAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YAC/C,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;QACzD,CAAC,CAAC,CAAC;QAEH,OAAO,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACzB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACd,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,IAAA,aAAG,EAAC,OAAO,EAAE,0BAA0B,EAAE,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;QAC/E,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAA,kBAAS,EAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACxD,CAAC;AACF,CAAC,CAAC,CAAC;AAEH,+DAA+D;AAC/D,MAAM,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,EAAE,GAAiG,EAAE,GAAa,EAAE,EAAE;IAClJ,IAAI,CAAC;QACJ,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC,KAAK,CAAC;QACvC,IAAI,CAAC,MAAM,EAAE,CAAC;YACb,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,oBAAoB,EAAE,CAAC,CAAC;QAC9D,CAAC;QAED,MAAM,KAAK,GAAG,IAAA,qBAAW,EAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,CAAC;QACpD,IAAI,CAAC,KAAK,EAAE,CAAC;YACZ,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,eAAe,EAAE,CAAC,CAAC;QACzD,CAAC;QAED,MAAM,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC;QAC3B,QAAQ,CAAC,SAAS,EAAE,CAAC;QACrB,QAAQ,CAAC,IAAI,GAAG,MAAM,IAAA,eAAS,EAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAE/C,MAAM,QAAQ,GAAG,MAAM,IAAA,qBAAe,EAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QACtD,MAAM,aAAa,GAAG,IAAA,8BAAwB,EAAC,QAAQ,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;QAExE,OAAO,GAAG,CAAC,IAAI,CAAC;YACf,EAAE,EAAE,IAAI;YACR,MAAM,EAAE,MAAM;YACd,QAAQ;YACR,GAAG,EAAE,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE;YACxB,QAAQ,EAAE,aAAa;YACvB,SAAS,EAAE,QAAQ,CAAC,IAAI,CAAC,IAAI;SAC7B,CAAC,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACd,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,IAAA,aAAG,EAAC,OAAO,EAAE,0BAA0B,EAAE,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;QAC/E,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAA,kBAAS,EAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACxD,CAAC;AACF,CAAC,CAAC,CAAC;AAEH,yDAAyD;AACzD,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,GAAuD,EAAE,GAAa,EAAE,EAAE;IACpG,IAAI,CAAC;QAwCJ,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC;QACtB,MAAM,IAAI,GAAG,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;QACnE,MAAM,QAAQ,GAAG,OAAO,IAAI,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;QAC/E,MAAM,MAAM,GAAI,IAA6B,CAAC,MAAM,CAAC;QACrD,IAAI,CAAC,MAAM,EAAE,CAAC;YACb,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,oBAAoB,EAAE,CAAC,CAAC;QAC9D,CAAC;QACD,IAAI,CAAC,IAAI,EAAE,CAAC;YACX,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,kBAAkB,EAAE,CAAC,CAAC;QAC5D,CAAC;QACD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACf,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,sBAAsB,EAAE,CAAC,CAAC;QAChE,CAAC;QAED,MAAM,KAAK,GAAG,IAAA,qBAAW,EAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAC5C,IAAI,CAAC,KAAK,EAAE,CAAC;YACZ,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,eAAe,EAAE,CAAC,CAAC;QACzD,CAAC;QAED,MAAM,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC;QAC3B,QAAQ,CAAC,SAAS,EAAE,CAAC;QAErB,MAAM,MAAM,GAAG,MAAM,IAAA,iBAAW,EAAC,QAAQ,EAAE,KAAK,IAAI,EAAE;YACrD,QAAQ,IAAI,EAAE,CAAC;gBACd,KAAK,OAAO,CAAC,CAAC,CAAC;oBACd,MAAM,MAAM,GAAG,IAAkC,CAAC;oBAClD,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,WAAW,EAAE,GAAG,MAAM,CAAC;oBAC9C,IAAI,CAAC,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;wBACvB,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;oBAC7C,CAAC;oBAED,MAAM,OAAO,GAAG,KAAK,EAAE,MAAwB,EAAiB,EAAE;wBACjE,MAAM,OAAO,GAAG,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;wBACpF,MAAM,SAAS,GAA8D,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;wBAC/F,IAAI,WAAW;4BAAE,SAAS,CAAC,UAAU,GAAG,CAAC,CAAC;wBAC1C,IAAI,CAAC;4BACJ,MAAM,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;wBAChC,CAAC;wBAAC,OAAO,GAAG,EAAE,CAAC;4BACd,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;4BACjE,IAAI,OAAO,CAAC,QAAQ,CAAC,2BAA2B,CAAC,EAAE,CAAC;gCACnD,MAAM,OAAO,CAAC,KAAK,CAAC,EAAE,GAAG,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;4BACpD,CAAC;iCAAM,CAAC;gCACP,MAAM,GAAG,CAAC;4BACX,CAAC;wBACF,CAAC;oBACF,CAAC,CAAC;oBAEF,IAAI,GAAG,EAAE,CAAC;wBACT,MAAM,OAAO,GAAG,IAAA,kBAAY,EAAC,QAAQ,CAAC,IAAI,EAAE,GAAG,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;wBAChE,IAAI,CAAC,OAAO;4BAAE,MAAM,IAAI,KAAK,CAAC,gBAAgB,GAAG,EAAE,CAAC,CAAC;wBACrD,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;oBACxB,CAAC;yBAAM,CAAC;wBACP,MAAM,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;oBACjC,CAAC;oBAED,MAAM,QAAQ,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;oBACxC,QAAQ,CAAC,IAAI,GAAG,MAAM,IAAA,eAAS,EAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;oBAC/C,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;gBACzD,CAAC;gBAED,KAAK,MAAM,CAAC,CAAC,CAAC;oBACb,MAAM,MAAM,GAAG,IAAiC,CAAC;oBACjD,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC;oBAC/C,IAAI,CAAC,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;wBACvB,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;oBAC7C,CAAC;oBACD,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;wBACnD,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;oBACrC,CAAC;oBAED,IAAI,GAAG,EAAE,CAAC;wBACT,MAAM,OAAO,GAAG,IAAA,kBAAY,EAAC,QAAQ,CAAC,IAAI,EAAE,GAAG,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;wBAChE,IAAI,CAAC,OAAO;4BAAE,MAAM,IAAI,KAAK,CAAC,gBAAgB,GAAG,EAAE,CAAC,CAAC;wBACrD,MAAM,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;wBAC7C,IAAI,MAAM;4BAAE,MAAM,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;oBACzD,CAAC;yBAAM,CAAC;wBACP,MAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;wBACrE,IAAI,MAAM;4BAAE,MAAM,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;oBACzD,CAAC;oBACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;gBAC/B,CAAC;gBAED,KAAK,OAAO,CAAC,CAAC,CAAC;oBACd,MAAM,MAAM,GAAG,IAAkC,CAAC;oBAClD,MAAM,EAAE,GAAG,EAAE,GAAG,MAAM,CAAC;oBACvB,IAAI,CAAC,GAAG;wBAAE,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;oBAC7C,MAAM,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;oBACxC,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;gBAC/B,CAAC;gBAED,KAAK,QAAQ,CAAC;gBACd,KAAK,gBAAgB,CAAC,CAAC,CAAC;oBACvB,MAAM,MAAM,GAAG,IAAmC,CAAC;oBACnD,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC;oBACvB,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC;oBAC7C,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC;oBACpC,IAAI,GAAG,EAAE,CAAC;wBACT,MAAM,OAAO,GAAG,IAAA,kBAAY,EAAC,QAAQ,CAAC,IAAI,EAAE,GAAG,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;wBAChE,IAAI,CAAC,OAAO;4BAAE,MAAM,IAAI,KAAK,CAAC,gBAAgB,GAAG,EAAE,CAAC,CAAC;wBACrD,MAAM,OAAO,CAAC,sBAAsB,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;oBACzD,CAAC;yBAAM,CAAC;wBACP,MAAM,KAAK,GAAG,SAAS,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;wBACpD,MAAM,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;oBAC3C,CAAC;oBACD,MAAM,QAAQ,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;oBACxC,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;gBAC/B,CAAC;gBAED,KAAK,OAAO,CAAC,CAAC,CAAC;oBACd,MAAM,MAAM,GAAG,IAAkC,CAAC;oBAClD,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAC;oBACjC,IAAI,CAAC,GAAG,IAAI,CAAC,QAAQ;wBAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;oBACnE,IAAI,GAAG,EAAE,CAAC;wBACT,MAAM,OAAO,GAAG,IAAA,kBAAY,EAAC,QAAQ,CAAC,IAAI,EAAE,GAAG,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;wBAChE,IAAI,CAAC,OAAO;4BAAE,MAAM,IAAI,KAAK,CAAC,gBAAgB,GAAG,EAAE,CAAC,CAAC;wBACrD,MAAM,OAAO,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;oBACxC,CAAC;yBAAM,CAAC;wBACP,MAAM,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;oBACxE,CAAC;oBACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;gBAC/B,CAAC;gBAED,KAAK,MAAM,CAAC,CAAC,CAAC;oBACb,MAAM,MAAM,GAAG,IAAiC,CAAC;oBACjD,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,CAAC;oBAChC,MAAM,gBAAgB,GAAI,MAAkC,CAAC,SAAS,CAAC;oBACvE,MAAM,SAAS,GAAG,OAAO,gBAAgB,KAAK,QAAQ,IAAI,WAAW,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,SAAS,CAAC;oBACvH,IAAI,MAAM,EAAE,CAAC;wBACZ,MAAM,QAAQ,CAAC,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;oBAC5C,CAAC;yBAAM,IAAI,IAAI,EAAE,CAAC;wBACjB,MAAM,QAAQ,CAAC,IAAI,CAAC,eAAe,CAAC,QAAQ,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;oBACzE,CAAC;yBAAM,IAAI,SAAS,EAAE,CAAC;wBACtB,MAAM,QAAQ,CAAC,IAAI,CAAC,gBAAgB,CAAC,SAAS,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;oBACrE,CAAC;oBACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;gBACzD,CAAC;gBAED,KAAK,OAAO,CAAC,CAAC,CAAC;oBACd,MAAM,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;oBAC5B,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;oBACrC,IAAA,oBAAU,EAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;oBAC7B,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;wBAC5B,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;oBAClD,CAAC;oBACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;gBAC/B,CAAC;gBAED;oBACC,MAAM,IAAI,KAAK,CAAC,4BAA4B,IAAI,EAAE,CAAC,CAAC;YACtD,CAAC;QACF,CAAC,CAAC,CAAC;QAEH,OAAO,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACzB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACd,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,MAAM,YAAY,GAAG,OAAQ,GAAG,CAAC,IAA2B,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAE,GAAG,CAAC,IAA2B,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;QACnI,IAAA,aAAG,EAAC,OAAO,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;QACrF,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAA,kBAAS,EAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACxD,CAAC;AACF,CAAC,CAAC,CAAC;AAEH,kBAAe,MAAM,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/server.ts"],"names":[],"mappings":""}
@@ -0,0 +1,74 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const express_1 = __importDefault(require("express"));
7
+ const core_1 = __importDefault(require("./routes/core"));
8
+ const openclaw_1 = __importDefault(require("./routes/openclaw"));
9
+ const errors_1 = require("./middleware/errors");
10
+ const logging_1 = require("./middleware/logging");
11
+ const config_1 = require("./utils/config");
12
+ const browser_1 = require("./services/browser");
13
+ const session_1 = require("./services/session");
14
+ const CONFIG = (0, config_1.loadConfig)();
15
+ const app = (0, express_1.default)();
16
+ app.use(express_1.default.json({ limit: '100kb' }));
17
+ app.use(logging_1.loggingMiddleware);
18
+ app.use(core_1.default);
19
+ app.use(openclaw_1.default);
20
+ // Fallback error middleware (routes largely handle their own errors to preserve legacy behavior)
21
+ app.use((err, _req, res, _next) => {
22
+ const anyErr = err;
23
+ const status = anyErr.statusCode || anyErr.status || 500;
24
+ res.status(status).json({ error: (0, errors_1.safeError)(err) });
25
+ });
26
+ (0, errors_1.installCrashHandlers)();
27
+ (0, session_1.startCleanupInterval)();
28
+ (0, logging_1.startStatsBeacon)(() => {
29
+ const sessions = (0, session_1.getAllSessions)().size;
30
+ const tabs = (0, session_1.countTotalTabsForSessions)();
31
+ const browserConnected = (0, browser_1.getBrowser)()?.isConnected() ?? false;
32
+ return { sessions, tabs, rssBytes: 0, heapUsedBytes: 0, uptimeSeconds: 0, browserConnected };
33
+ });
34
+ const PORT = CONFIG.port;
35
+ let server;
36
+ let shuttingDown = false;
37
+ async function gracefulShutdown(signal) {
38
+ if (shuttingDown)
39
+ return;
40
+ shuttingDown = true;
41
+ (0, logging_1.log)('info', 'shutting down', { signal });
42
+ const forceTimeout = setTimeout(() => {
43
+ (0, logging_1.log)('error', 'shutdown timed out, forcing exit');
44
+ process.exit(1);
45
+ }, 10000);
46
+ forceTimeout.unref();
47
+ try {
48
+ server.close();
49
+ }
50
+ catch {
51
+ // ignore
52
+ }
53
+ await (0, session_1.closeAllSessions)().catch(() => { });
54
+ await (0, browser_1.closeBrowser)().catch(() => { });
55
+ process.exit(0);
56
+ }
57
+ process.on('SIGTERM', () => void gracefulShutdown('SIGTERM'));
58
+ process.on('SIGINT', () => void gracefulShutdown('SIGINT'));
59
+ server = app.listen(PORT, () => {
60
+ (0, logging_1.log)('info', 'server started', { port: PORT, pid: process.pid, nodeVersion: process.version });
61
+ (0, browser_1.ensureBrowser)().catch((err) => {
62
+ const message = err instanceof Error ? err.message : String(err);
63
+ (0, logging_1.log)('error', 'browser pre-launch failed', { error: message });
64
+ });
65
+ });
66
+ server.on('error', (err) => {
67
+ if (err.code === 'EADDRINUSE') {
68
+ (0, logging_1.log)('error', 'port in use', { port: PORT });
69
+ process.exit(1);
70
+ }
71
+ (0, logging_1.log)('error', 'server error', { error: err.message });
72
+ process.exit(1);
73
+ });
74
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/server.ts"],"names":[],"mappings":";;;;;AAEA,sDAA8B;AAE9B,yDAAuC;AACvC,iEAA+C;AAC/C,gDAAsE;AACtE,kDAAgF;AAChF,2CAA4C;AAC5C,gDAA6E;AAC7E,gDAAuH;AAEvH,MAAM,MAAM,GAAG,IAAA,mBAAU,GAAE,CAAC;AAE5B,MAAM,GAAG,GAAG,IAAA,iBAAO,GAAE,CAAC;AACtB,GAAG,CAAC,GAAG,CAAC,iBAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;AAC1C,GAAG,CAAC,GAAG,CAAC,2BAAiB,CAAC,CAAC;AAE3B,GAAG,CAAC,GAAG,CAAC,cAAU,CAAC,CAAC;AACpB,GAAG,CAAC,GAAG,CAAC,kBAAc,CAAC,CAAC;AAExB,iGAAiG;AACjG,GAAG,CAAC,GAAG,CAAC,CAAC,GAAY,EAAE,IAAqB,EAAE,GAAqB,EAAE,KAA2B,EAAE,EAAE;IACnG,MAAM,MAAM,GAAG,GAA+C,CAAC;IAC/D,MAAM,MAAM,GAAG,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC;IACzD,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAA,kBAAS,EAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AACpD,CAAC,CAAC,CAAC;AAEH,IAAA,6BAAoB,GAAE,CAAC;AAEvB,IAAA,8BAAoB,GAAE,CAAC;AAEvB,IAAA,0BAAgB,EAAC,GAAG,EAAE;IACrB,MAAM,QAAQ,GAAG,IAAA,wBAAc,GAAE,CAAC,IAAI,CAAC;IACvC,MAAM,IAAI,GAAG,IAAA,mCAAyB,GAAE,CAAC;IACzC,MAAM,gBAAgB,GAAG,IAAA,oBAAU,GAAE,EAAE,WAAW,EAAE,IAAI,KAAK,CAAC;IAC9D,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,gBAAgB,EAAE,CAAC;AAC9F,CAAC,CAAC,CAAC;AAEH,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;AACzB,IAAI,MAAc,CAAC;AAEnB,IAAI,YAAY,GAAG,KAAK,CAAC;AACzB,KAAK,UAAU,gBAAgB,CAAC,MAAc;IAC7C,IAAI,YAAY;QAAE,OAAO;IACzB,YAAY,GAAG,IAAI,CAAC;IACpB,IAAA,aAAG,EAAC,MAAM,EAAE,eAAe,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;IAEzC,MAAM,YAAY,GAAG,UAAU,CAAC,GAAG,EAAE;QACpC,IAAA,aAAG,EAAC,OAAO,EAAE,kCAAkC,CAAC,CAAC;QACjD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACjB,CAAC,EAAE,KAAK,CAAC,CAAC;IACV,YAAY,CAAC,KAAK,EAAE,CAAC;IAErB,IAAI,CAAC;QACJ,MAAM,CAAC,KAAK,EAAE,CAAC;IAChB,CAAC;IAAC,MAAM,CAAC;QACR,SAAS;IACV,CAAC;IAED,MAAM,IAAA,0BAAgB,GAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IACzC,MAAM,IAAA,sBAAY,GAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACjB,CAAC;AAED,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,KAAK,gBAAgB,CAAC,SAAS,CAAC,CAAC,CAAC;AAC9D,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,KAAK,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC;AAE5D,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE;IAC9B,IAAA,aAAG,EAAC,MAAM,EAAE,gBAAgB,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,WAAW,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IAC9F,IAAA,uBAAa,GAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;QAC7B,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,IAAA,aAAG,EAAC,OAAO,EAAE,2BAA2B,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAA0B,EAAE,EAAE;IACjD,IAAI,GAAG,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;QAC/B,IAAA,aAAG,EAAC,OAAO,EAAE,aAAa,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACjB,CAAC;IACD,IAAA,aAAG,EAAC,OAAO,EAAE,cAAc,EAAE,EAAE,KAAK,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;IACrD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACjB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,5 @@
1
+ import { type Browser } from 'playwright-core';
2
+ export declare function ensureBrowser(): Promise<Browser>;
3
+ export declare function getBrowser(): Browser | null;
4
+ export declare function closeBrowser(): Promise<void>;
5
+ //# sourceMappingURL=browser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../../../src/services/browser.ts"],"names":[],"mappings":"AAGA,OAAO,EAAW,KAAK,OAAO,EAAE,MAAM,iBAAiB,CAAC;AA8BxD,wBAAsB,aAAa,IAAI,OAAO,CAAC,OAAO,CAAC,CAoBtD;AAED,wBAAgB,UAAU,IAAI,OAAO,GAAG,IAAI,CAE3C;AAED,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAIlD"}
@@ -0,0 +1,64 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.ensureBrowser = ensureBrowser;
7
+ exports.getBrowser = getBrowser;
8
+ exports.closeBrowser = closeBrowser;
9
+ const node_os_1 = __importDefault(require("node:os"));
10
+ const camoufox_js_1 = require("camoufox-js");
11
+ const playwright_core_1 = require("playwright-core");
12
+ const config_1 = require("../utils/config");
13
+ const logging_1 = require("../middleware/logging");
14
+ const CONFIG = (0, config_1.loadConfig)();
15
+ let browser = null;
16
+ function getHostOS() {
17
+ const platform = node_os_1.default.platform();
18
+ if (platform === 'darwin')
19
+ return 'macos';
20
+ if (platform === 'win32')
21
+ return 'windows';
22
+ return 'linux';
23
+ }
24
+ function buildProxyConfig() {
25
+ const { host, port, username, password } = CONFIG.proxy;
26
+ if (!host || !port) {
27
+ (0, logging_1.log)('info', 'no proxy configured');
28
+ return null;
29
+ }
30
+ (0, logging_1.log)('info', 'proxy configured', { host, port });
31
+ return {
32
+ server: `http://${host}:${port}`,
33
+ username: username || undefined,
34
+ password: password || undefined,
35
+ };
36
+ }
37
+ async function ensureBrowser() {
38
+ if (!browser) {
39
+ const hostOS = getHostOS();
40
+ const proxy = buildProxyConfig();
41
+ (0, logging_1.log)('info', 'launching camoufox', { hostOS, geoip: !!proxy });
42
+ const options = await (0, camoufox_js_1.launchOptions)({
43
+ headless: true,
44
+ os: hostOS,
45
+ humanize: true,
46
+ enable_cache: true,
47
+ proxy: proxy ?? undefined,
48
+ geoip: !!proxy,
49
+ });
50
+ browser = await playwright_core_1.firefox.launch(options);
51
+ (0, logging_1.log)('info', 'camoufox launched');
52
+ }
53
+ return browser;
54
+ }
55
+ function getBrowser() {
56
+ return browser;
57
+ }
58
+ async function closeBrowser() {
59
+ if (!browser)
60
+ return;
61
+ await browser.close().catch(() => { });
62
+ browser = null;
63
+ }
64
+ //# sourceMappingURL=browser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser.js","sourceRoot":"","sources":["../../../src/services/browser.ts"],"names":[],"mappings":";;;;;AAiCA,sCAoBC;AAED,gCAEC;AAED,oCAIC;AA/DD,sDAAyB;AAEzB,6CAA4C;AAC5C,qDAAwD;AAExD,4CAA6C;AAC7C,mDAA4C;AAE5C,MAAM,MAAM,GAAG,IAAA,mBAAU,GAAE,CAAC;AAE5B,IAAI,OAAO,GAAmB,IAAI,CAAC;AAEnC,SAAS,SAAS;IACjB,MAAM,QAAQ,GAAG,iBAAE,CAAC,QAAQ,EAAE,CAAC;IAC/B,IAAI,QAAQ,KAAK,QAAQ;QAAE,OAAO,OAAO,CAAC;IAC1C,IAAI,QAAQ,KAAK,OAAO;QAAE,OAAO,SAAS,CAAC;IAC3C,OAAO,OAAO,CAAC;AAChB,CAAC;AAED,SAAS,gBAAgB;IACxB,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC;IACxD,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACpB,IAAA,aAAG,EAAC,MAAM,EAAE,qBAAqB,CAAC,CAAC;QACnC,OAAO,IAAI,CAAC;IACb,CAAC;IACD,IAAA,aAAG,EAAC,MAAM,EAAE,kBAAkB,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IAChD,OAAO;QACN,MAAM,EAAE,UAAU,IAAI,IAAI,IAAI,EAAE;QAChC,QAAQ,EAAE,QAAQ,IAAI,SAAS;QAC/B,QAAQ,EAAE,QAAQ,IAAI,SAAS;KAC/B,CAAC;AACH,CAAC;AAEM,KAAK,UAAU,aAAa;IAClC,IAAI,CAAC,OAAO,EAAE,CAAC;QACd,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;QAC3B,MAAM,KAAK,GAAG,gBAAgB,EAAE,CAAC;QAEjC,IAAA,aAAG,EAAC,MAAM,EAAE,oBAAoB,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;QAE9D,MAAM,OAAO,GAAG,MAAM,IAAA,2BAAa,EAAC;YACnC,QAAQ,EAAE,IAAI;YACd,EAAE,EAAE,MAAM;YACV,QAAQ,EAAE,IAAI;YACd,YAAY,EAAE,IAAI;YAClB,KAAK,EAAE,KAAK,IAAI,SAAS;YACzB,KAAK,EAAE,CAAC,CAAC,KAAK;SACd,CAAC,CAAC;QAEH,OAAO,GAAG,MAAM,yBAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACxC,IAAA,aAAG,EAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;IAClC,CAAC;IACD,OAAO,OAAO,CAAC;AAChB,CAAC;AAED,SAAgB,UAAU;IACzB,OAAO,OAAO,CAAC;AAChB,CAAC;AAEM,KAAK,UAAU,YAAY;IACjC,IAAI,CAAC,OAAO;QAAE,OAAO;IACrB,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IACtC,OAAO,GAAG,IAAI,CAAC;AAChB,CAAC"}
@@ -0,0 +1,30 @@
1
+ import type { ContextOverrides, SessionData, TabState } from '../types';
2
+ export declare const SESSION_TIMEOUT_MS: number;
3
+ export declare const MAX_SESSIONS: number;
4
+ export declare const MAX_TABS_PER_SESSION: number;
5
+ export declare function normalizeUserId(userId: unknown): string;
6
+ export declare function getSessionMapKey(userId: unknown, contextOverrides: ContextOverrides | null | undefined): string;
7
+ export declare function getSessionsForUser(userId: unknown): Array<[string, SessionData]>;
8
+ export declare function getAllSessions(): Map<string, SessionData>;
9
+ export declare function countTotalTabsForSessions(sessionsForUser?: Array<[string, SessionData]>): number;
10
+ export declare function getTabGroup(session: SessionData, sessionKey: string): Map<string, TabState>;
11
+ declare function findTab(session: SessionData, tabId: string): {
12
+ tabState: TabState;
13
+ listItemId: string;
14
+ group: Map<string, TabState>;
15
+ } | null;
16
+ export declare function unindexSessionTabs(session: SessionData): void;
17
+ export declare function findTabById(tabId: string, userId: unknown): (ReturnType<typeof findTab> & {
18
+ sessionKey: string;
19
+ session: SessionData;
20
+ }) | null;
21
+ export declare function getSession(userId: unknown, contextOverrides?: ContextOverrides | null): Promise<SessionData>;
22
+ export declare function indexTab(tabId: string, sessionKey: string): void;
23
+ export declare function unindexTab(tabId: string): void;
24
+ export declare function clearAllState(): void;
25
+ export declare function closeSessionsForUser(userId: string): Promise<void>;
26
+ export declare function closeAllSessions(): Promise<void>;
27
+ export declare function startCleanupInterval(): NodeJS.Timeout;
28
+ export declare function stopCleanupInterval(): void;
29
+ export {};
30
+ //# sourceMappingURL=session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../../src/services/session.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAgBxE,eAAO,MAAM,kBAAkB,QAA6F,CAAC;AAC7H,eAAO,MAAM,YAAY,QAAiF,CAAC;AAC3G,eAAO,MAAM,oBAAoB,QAA6E,CAAC;AAE/G,wBAAgB,eAAe,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,CAEvD;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAE/G;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,OAAO,GAAG,KAAK,CAAC,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAQhF;AAED,wBAAgB,cAAc,IAAI,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAEzD;AAED,wBAAgB,yBAAyB,CAAC,eAAe,CAAC,EAAE,KAAK,CAAC,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,GAAG,MAAM,CAOhG;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAO3F;AAED,iBAAS,OAAO,CAAC,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,GAAG;IAAE,QAAQ,EAAE,QAAQ,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;CAAE,GAAG,IAAI,CASrI;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI,CAQ7D;AAED,wBAAgB,WAAW,CAC1B,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,OAAO,GAEb,CAAC,UAAU,CAAC,OAAO,OAAO,CAAC,GAAG;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,WAAW,CAAC;CACrB,CAAC,GACD,IAAI,CA6BN;AAED,wBAAsB,UAAU,CAAC,MAAM,EAAE,OAAO,EAAE,gBAAgB,CAAC,EAAE,gBAAgB,GAAG,IAAI,GAAG,OAAO,CAAC,WAAW,CAAC,CAqClH;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,CAEhE;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAG9C;AAED,wBAAgB,aAAa,IAAI,IAAI,CAIpC;AAED,wBAAsB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAUxE;AAED,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC,CAMtD;AAID,wBAAgB,oBAAoB,IAAI,MAAM,CAAC,OAAO,CAcrD;AAED,wBAAgB,mBAAmB,IAAI,IAAI,CAK1C"}