@staticn0va/wigolo 0.3.0 → 0.4.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 (184) hide show
  1. package/README.md +67 -2
  2. package/SKILL.md +149 -0
  3. package/dist/cache/change-detector.d.ts +7 -0
  4. package/dist/cache/change-detector.d.ts.map +1 -0
  5. package/dist/cache/change-detector.js +43 -0
  6. package/dist/cache/change-detector.js.map +1 -0
  7. package/dist/cache/diff-summary.d.ts +2 -0
  8. package/dist/cache/diff-summary.d.ts.map +1 -0
  9. package/dist/cache/diff-summary.js +87 -0
  10. package/dist/cache/diff-summary.js.map +1 -0
  11. package/dist/cache/store.d.ts +2 -0
  12. package/dist/cache/store.d.ts.map +1 -1
  13. package/dist/cache/store.js +10 -0
  14. package/dist/cache/store.js.map +1 -1
  15. package/dist/cli/auth.d.ts +2 -0
  16. package/dist/cli/auth.d.ts.map +1 -0
  17. package/dist/cli/auth.js +95 -0
  18. package/dist/cli/auth.js.map +1 -0
  19. package/dist/cli/daemon.d.ts +6 -1
  20. package/dist/cli/daemon.d.ts.map +1 -1
  21. package/dist/cli/daemon.js +56 -3
  22. package/dist/cli/daemon.js.map +1 -1
  23. package/dist/cli/doctor.d.ts +8 -0
  24. package/dist/cli/doctor.d.ts.map +1 -0
  25. package/dist/cli/doctor.js +153 -0
  26. package/dist/cli/doctor.js.map +1 -0
  27. package/dist/cli/health.d.ts +1 -1
  28. package/dist/cli/health.d.ts.map +1 -1
  29. package/dist/cli/health.js +41 -3
  30. package/dist/cli/health.js.map +1 -1
  31. package/dist/cli/index.d.ts +1 -1
  32. package/dist/cli/index.d.ts.map +1 -1
  33. package/dist/cli/index.js +1 -1
  34. package/dist/cli/index.js.map +1 -1
  35. package/dist/cli/plugin.d.ts +5 -0
  36. package/dist/cli/plugin.d.ts.map +1 -0
  37. package/dist/cli/plugin.js +188 -0
  38. package/dist/cli/plugin.js.map +1 -0
  39. package/dist/cli/shell.d.ts +2 -0
  40. package/dist/cli/shell.d.ts.map +1 -0
  41. package/dist/cli/shell.js +86 -0
  42. package/dist/cli/shell.js.map +1 -0
  43. package/dist/cli/warmup.d.ts +4 -0
  44. package/dist/cli/warmup.d.ts.map +1 -1
  45. package/dist/cli/warmup.js +78 -2
  46. package/dist/cli/warmup.js.map +1 -1
  47. package/dist/config.d.ts +10 -0
  48. package/dist/config.d.ts.map +1 -1
  49. package/dist/config.js +27 -0
  50. package/dist/config.js.map +1 -1
  51. package/dist/daemon/health-check.d.ts +16 -0
  52. package/dist/daemon/health-check.d.ts.map +1 -0
  53. package/dist/daemon/health-check.js +36 -0
  54. package/dist/daemon/health-check.js.map +1 -0
  55. package/dist/daemon/http-server.d.ts +26 -0
  56. package/dist/daemon/http-server.d.ts.map +1 -0
  57. package/dist/daemon/http-server.js +282 -0
  58. package/dist/daemon/http-server.js.map +1 -0
  59. package/dist/daemon/proxy.d.ts +10 -0
  60. package/dist/daemon/proxy.d.ts.map +1 -0
  61. package/dist/daemon/proxy.js +99 -0
  62. package/dist/daemon/proxy.js.map +1 -0
  63. package/dist/fetch/action-executor.d.ts +28 -0
  64. package/dist/fetch/action-executor.d.ts.map +1 -0
  65. package/dist/fetch/action-executor.js +86 -0
  66. package/dist/fetch/action-executor.js.map +1 -0
  67. package/dist/fetch/auth.d.ts +2 -1
  68. package/dist/fetch/auth.d.ts.map +1 -1
  69. package/dist/fetch/auth.js +30 -2
  70. package/dist/fetch/auth.js.map +1 -1
  71. package/dist/fetch/browser-pool.d.ts +30 -11
  72. package/dist/fetch/browser-pool.d.ts.map +1 -1
  73. package/dist/fetch/browser-pool.js +165 -49
  74. package/dist/fetch/browser-pool.js.map +1 -1
  75. package/dist/fetch/browser-selector.d.ts +17 -0
  76. package/dist/fetch/browser-selector.d.ts.map +1 -0
  77. package/dist/fetch/browser-selector.js +70 -0
  78. package/dist/fetch/browser-selector.js.map +1 -0
  79. package/dist/fetch/browser-types.d.ts +3 -0
  80. package/dist/fetch/browser-types.d.ts.map +1 -0
  81. package/dist/fetch/browser-types.js +45 -0
  82. package/dist/fetch/browser-types.js.map +1 -0
  83. package/dist/fetch/cdp-client.d.ts +9 -0
  84. package/dist/fetch/cdp-client.d.ts.map +1 -0
  85. package/dist/fetch/cdp-client.js +90 -0
  86. package/dist/fetch/cdp-client.js.map +1 -0
  87. package/dist/fetch/router.d.ts +4 -1
  88. package/dist/fetch/router.d.ts.map +1 -1
  89. package/dist/fetch/router.js +8 -2
  90. package/dist/fetch/router.js.map +1 -1
  91. package/dist/index.js +39 -3
  92. package/dist/index.js.map +1 -1
  93. package/dist/instructions.d.ts +26 -0
  94. package/dist/instructions.d.ts.map +1 -0
  95. package/dist/instructions.js +101 -0
  96. package/dist/instructions.js.map +1 -0
  97. package/dist/logger.d.ts +1 -1
  98. package/dist/logger.d.ts.map +1 -1
  99. package/dist/plugins/loader.d.ts +20 -0
  100. package/dist/plugins/loader.d.ts.map +1 -0
  101. package/dist/plugins/loader.js +162 -0
  102. package/dist/plugins/loader.js.map +1 -0
  103. package/dist/plugins/registry.d.ts +26 -0
  104. package/dist/plugins/registry.d.ts.map +1 -0
  105. package/dist/plugins/registry.js +68 -0
  106. package/dist/plugins/registry.js.map +1 -0
  107. package/dist/plugins/validate.d.ts +9 -0
  108. package/dist/plugins/validate.d.ts.map +1 -0
  109. package/dist/plugins/validate.js +70 -0
  110. package/dist/plugins/validate.js.map +1 -0
  111. package/dist/repl/commands/cache.d.ts +4 -0
  112. package/dist/repl/commands/cache.d.ts.map +1 -0
  113. package/dist/repl/commands/cache.js +44 -0
  114. package/dist/repl/commands/cache.js.map +1 -0
  115. package/dist/repl/commands/crawl.d.ts +7 -0
  116. package/dist/repl/commands/crawl.d.ts.map +1 -0
  117. package/dist/repl/commands/crawl.js +42 -0
  118. package/dist/repl/commands/crawl.js.map +1 -0
  119. package/dist/repl/commands/extract.d.ts +5 -0
  120. package/dist/repl/commands/extract.d.ts.map +1 -0
  121. package/dist/repl/commands/extract.js +37 -0
  122. package/dist/repl/commands/extract.js.map +1 -0
  123. package/dist/repl/commands/fetch.d.ts +5 -0
  124. package/dist/repl/commands/fetch.d.ts.map +1 -0
  125. package/dist/repl/commands/fetch.js +53 -0
  126. package/dist/repl/commands/fetch.js.map +1 -0
  127. package/dist/repl/commands/search.d.ts +5 -0
  128. package/dist/repl/commands/search.d.ts.map +1 -0
  129. package/dist/repl/commands/search.js +62 -0
  130. package/dist/repl/commands/search.js.map +1 -0
  131. package/dist/repl/commands/types.d.ts +9 -0
  132. package/dist/repl/commands/types.d.ts.map +1 -0
  133. package/dist/repl/commands/types.js +2 -0
  134. package/dist/repl/commands/types.js.map +1 -0
  135. package/dist/repl/formatters.d.ts +10 -0
  136. package/dist/repl/formatters.d.ts.map +1 -0
  137. package/dist/repl/formatters.js +209 -0
  138. package/dist/repl/formatters.js.map +1 -0
  139. package/dist/repl/parser.d.ts +9 -0
  140. package/dist/repl/parser.d.ts.map +1 -0
  141. package/dist/repl/parser.js +84 -0
  142. package/dist/repl/parser.js.map +1 -0
  143. package/dist/repl/shell.d.ts +8 -0
  144. package/dist/repl/shell.d.ts.map +1 -0
  145. package/dist/repl/shell.js +156 -0
  146. package/dist/repl/shell.js.map +1 -0
  147. package/dist/search/context-formatter.d.ts +3 -0
  148. package/dist/search/context-formatter.d.ts.map +1 -0
  149. package/dist/search/context-formatter.js +56 -0
  150. package/dist/search/context-formatter.js.map +1 -0
  151. package/dist/search/engines/bing.d.ts +1 -0
  152. package/dist/search/engines/bing.d.ts.map +1 -1
  153. package/dist/search/engines/bing.js +27 -1
  154. package/dist/search/engines/bing.js.map +1 -1
  155. package/dist/searxng/bootstrap.d.ts +30 -0
  156. package/dist/searxng/bootstrap.d.ts.map +1 -1
  157. package/dist/searxng/bootstrap.js +150 -23
  158. package/dist/searxng/bootstrap.js.map +1 -1
  159. package/dist/searxng/process.d.ts +13 -1
  160. package/dist/searxng/process.d.ts.map +1 -1
  161. package/dist/searxng/process.js +52 -2
  162. package/dist/searxng/process.js.map +1 -1
  163. package/dist/server/backend-status.d.ts +11 -0
  164. package/dist/server/backend-status.d.ts.map +1 -0
  165. package/dist/server/backend-status.js +27 -0
  166. package/dist/server/backend-status.js.map +1 -0
  167. package/dist/server.d.ts +17 -0
  168. package/dist/server.d.ts.map +1 -1
  169. package/dist/server.js +228 -91
  170. package/dist/server.js.map +1 -1
  171. package/dist/tools/cache.d.ts +2 -1
  172. package/dist/tools/cache.d.ts.map +1 -1
  173. package/dist/tools/cache.js +56 -1
  174. package/dist/tools/cache.js.map +1 -1
  175. package/dist/tools/fetch.d.ts.map +1 -1
  176. package/dist/tools/fetch.js +16 -1
  177. package/dist/tools/fetch.js.map +1 -1
  178. package/dist/tools/search.d.ts +2 -1
  179. package/dist/tools/search.d.ts.map +1 -1
  180. package/dist/tools/search.js +26 -4
  181. package/dist/tools/search.js.map +1 -1
  182. package/dist/types.d.ts +49 -0
  183. package/dist/types.d.ts.map +1 -1
  184. package/package.json +36 -3
@@ -0,0 +1,282 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import { createServer } from 'node:http';
3
+ import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
4
+ import { SSEServerTransport } from '@modelcontextprotocol/sdk/server/sse.js';
5
+ import { isInitializeRequest } from '@modelcontextprotocol/sdk/types.js';
6
+ import { initSubsystems, createMcpServer } from '../server.js';
7
+ import { probeHealth } from './health-check.js';
8
+ import { createLogger } from '../logger.js';
9
+ const log = createLogger('server');
10
+ export class DaemonHttpServer {
11
+ httpServer = null;
12
+ subsystems = null;
13
+ startedAt = 0;
14
+ stopped = false;
15
+ sessions = new Map();
16
+ sseSessions = new Map();
17
+ port;
18
+ host;
19
+ constructor(options) {
20
+ this.port = options.port;
21
+ this.host = options.host;
22
+ }
23
+ async start() {
24
+ this.startedAt = Date.now();
25
+ this.stopped = false;
26
+ try {
27
+ this.subsystems = await initSubsystems();
28
+ }
29
+ catch (err) {
30
+ log.error('Failed to initialize subsystems', { error: String(err) });
31
+ throw err;
32
+ }
33
+ this.subsystems.bootstrapSearxng().catch((err) => {
34
+ log.warn('SearXNG bootstrap failed in daemon mode', { error: String(err) });
35
+ });
36
+ this.httpServer = createServer((req, res) => {
37
+ this.handleRequest(req, res).catch((err) => {
38
+ log.error('Unhandled request error', { error: String(err) });
39
+ if (!res.headersSent) {
40
+ res.writeHead(500, { 'Content-Type': 'application/json' });
41
+ res.end(JSON.stringify({ error: 'Internal server error' }));
42
+ }
43
+ });
44
+ });
45
+ return new Promise((resolve, reject) => {
46
+ this.httpServer.on('error', (err) => {
47
+ log.error('HTTP server error', { error: String(err) });
48
+ reject(err);
49
+ });
50
+ this.httpServer.listen(this.port, this.host, () => {
51
+ const addr = this.httpServer.address();
52
+ let resolvedPort = this.port;
53
+ if (addr && typeof addr === 'object') {
54
+ resolvedPort = addr.port;
55
+ }
56
+ const url = `http://${this.host}:${resolvedPort}`;
57
+ log.info('Daemon HTTP server started', { url });
58
+ resolve(url);
59
+ });
60
+ });
61
+ }
62
+ async handleRequest(req, res) {
63
+ const url = new URL(req.url ?? '/', `http://${req.headers.host ?? 'localhost'}`);
64
+ const pathname = url.pathname;
65
+ const method = req.method ?? 'GET';
66
+ if (pathname === '/health' && method === 'GET') {
67
+ return this.handleHealthRequest(res);
68
+ }
69
+ if (pathname === '/mcp' && method === 'POST') {
70
+ return this.handleStreamableHttpRequest(req, res);
71
+ }
72
+ if (pathname === '/mcp' && method === 'GET') {
73
+ return this.handleStreamableHttpGet(req, res);
74
+ }
75
+ if (pathname === '/mcp' && method === 'DELETE') {
76
+ return this.handleStreamableHttpDelete(req, res);
77
+ }
78
+ if (pathname === '/sse' && method === 'GET') {
79
+ return this.handleSseRequest(req, res);
80
+ }
81
+ if (pathname === '/messages' && method === 'POST') {
82
+ const sessionId = url.searchParams.get('sessionId');
83
+ return this.handleSseMessageRequest(req, res, sessionId);
84
+ }
85
+ res.writeHead(404, { 'Content-Type': 'application/json' });
86
+ res.end(JSON.stringify({ error: 'Not found' }));
87
+ }
88
+ handleHealthRequest(res) {
89
+ try {
90
+ const report = probeHealth({
91
+ backendStatus: this.subsystems?.backendStatus ?? null,
92
+ browserPool: this.subsystems?.browserPool ?? null,
93
+ startedAt: this.startedAt,
94
+ });
95
+ const statusCode = report.status === 'down' ? 503 : 200;
96
+ res.writeHead(statusCode, { 'Content-Type': 'application/json' });
97
+ res.end(JSON.stringify(report));
98
+ }
99
+ catch (err) {
100
+ log.error('Health check failed', { error: String(err) });
101
+ res.writeHead(500, { 'Content-Type': 'application/json' });
102
+ res.end(JSON.stringify({ status: 'down', error: String(err) }));
103
+ }
104
+ }
105
+ async handleStreamableHttpRequest(req, res) {
106
+ if (!this.subsystems) {
107
+ res.writeHead(503, { 'Content-Type': 'application/json' });
108
+ res.end(JSON.stringify({ error: 'Server not ready' }));
109
+ return;
110
+ }
111
+ try {
112
+ const body = await this.readJsonBody(req);
113
+ const sessionId = req.headers['mcp-session-id'];
114
+ if (sessionId && this.sessions.has(sessionId)) {
115
+ const session = this.sessions.get(sessionId);
116
+ await session.transport.handleRequest(req, res, body);
117
+ return;
118
+ }
119
+ if (!sessionId && isInitializeRequest(body)) {
120
+ const transport = new StreamableHTTPServerTransport({
121
+ sessionIdGenerator: () => randomUUID(),
122
+ onsessioninitialized: (newSessionId) => {
123
+ log.debug('StreamableHTTP session initialized', { sessionId: newSessionId });
124
+ this.sessions.set(newSessionId, { transport, server });
125
+ },
126
+ });
127
+ transport.onclose = () => {
128
+ const sid = transport.sessionId;
129
+ if (sid && this.sessions.has(sid)) {
130
+ log.debug('StreamableHTTP session closed', { sessionId: sid });
131
+ this.sessions.delete(sid);
132
+ }
133
+ };
134
+ const server = createMcpServer(this.subsystems);
135
+ await server.connect(transport);
136
+ await transport.handleRequest(req, res, body);
137
+ return;
138
+ }
139
+ res.writeHead(400, { 'Content-Type': 'application/json' });
140
+ res.end(JSON.stringify({
141
+ jsonrpc: '2.0',
142
+ error: { code: -32000, message: 'Bad Request: No valid session ID provided' },
143
+ id: null,
144
+ }));
145
+ }
146
+ catch (err) {
147
+ log.error('StreamableHTTP request failed', { error: String(err) });
148
+ if (!res.headersSent) {
149
+ res.writeHead(500, { 'Content-Type': 'application/json' });
150
+ res.end(JSON.stringify({ error: String(err) }));
151
+ }
152
+ }
153
+ }
154
+ async handleStreamableHttpGet(req, res) {
155
+ const sessionId = req.headers['mcp-session-id'];
156
+ if (!sessionId || !this.sessions.has(sessionId)) {
157
+ res.writeHead(400, { 'Content-Type': 'application/json' });
158
+ res.end(JSON.stringify({ error: 'Invalid or missing session ID' }));
159
+ return;
160
+ }
161
+ const session = this.sessions.get(sessionId);
162
+ await session.transport.handleRequest(req, res);
163
+ }
164
+ async handleStreamableHttpDelete(req, res) {
165
+ const sessionId = req.headers['mcp-session-id'];
166
+ if (!sessionId || !this.sessions.has(sessionId)) {
167
+ res.writeHead(400, { 'Content-Type': 'application/json' });
168
+ res.end(JSON.stringify({ error: 'Invalid or missing session ID' }));
169
+ return;
170
+ }
171
+ const session = this.sessions.get(sessionId);
172
+ await session.transport.handleRequest(req, res);
173
+ }
174
+ async handleSseRequest(req, res) {
175
+ if (!this.subsystems) {
176
+ res.writeHead(503, { 'Content-Type': 'application/json' });
177
+ res.end(JSON.stringify({ error: 'Server not ready' }));
178
+ return;
179
+ }
180
+ try {
181
+ const transport = new SSEServerTransport('/messages', res);
182
+ const server = createMcpServer(this.subsystems);
183
+ await server.connect(transport);
184
+ const sessionId = transport.sessionId;
185
+ this.sseSessions.set(sessionId, { transport, server });
186
+ res.on('close', () => {
187
+ this.sseSessions.delete(sessionId);
188
+ log.debug('SSE session closed', { sessionId });
189
+ });
190
+ log.debug('SSE session started', { sessionId });
191
+ }
192
+ catch (err) {
193
+ log.error('SSE connection failed', { error: String(err) });
194
+ if (!res.headersSent) {
195
+ res.writeHead(500, { 'Content-Type': 'application/json' });
196
+ res.end(JSON.stringify({ error: String(err) }));
197
+ }
198
+ }
199
+ }
200
+ async handleSseMessageRequest(req, res, sessionId) {
201
+ if (!sessionId || !this.sseSessions.has(sessionId)) {
202
+ res.writeHead(400, { 'Content-Type': 'application/json' });
203
+ res.end(JSON.stringify({ error: 'Invalid or missing sessionId query parameter' }));
204
+ return;
205
+ }
206
+ try {
207
+ const session = this.sseSessions.get(sessionId);
208
+ await session.transport.handlePostMessage(req, res);
209
+ }
210
+ catch (err) {
211
+ log.error('SSE message handling failed', { error: String(err) });
212
+ if (!res.headersSent) {
213
+ res.writeHead(500, { 'Content-Type': 'application/json' });
214
+ res.end(JSON.stringify({ error: String(err) }));
215
+ }
216
+ }
217
+ }
218
+ readJsonBody(req, maxBytes = 10 * 1024 * 1024) {
219
+ return new Promise((resolve, reject) => {
220
+ const chunks = [];
221
+ let size = 0;
222
+ req.on('data', (chunk) => {
223
+ size += chunk.length;
224
+ if (size > maxBytes) {
225
+ req.destroy();
226
+ reject(new Error('Request body too large'));
227
+ return;
228
+ }
229
+ chunks.push(chunk);
230
+ });
231
+ req.on('end', () => {
232
+ try {
233
+ resolve(JSON.parse(Buffer.concat(chunks).toString()));
234
+ }
235
+ catch (err) {
236
+ reject(err);
237
+ }
238
+ });
239
+ req.on('error', reject);
240
+ });
241
+ }
242
+ async stop() {
243
+ if (this.stopped)
244
+ return;
245
+ this.stopped = true;
246
+ log.info('Stopping daemon HTTP server');
247
+ for (const [id, session] of this.sessions) {
248
+ try {
249
+ await session.transport.close();
250
+ }
251
+ catch {
252
+ log.debug('StreamableHTTP transport close failed', { sessionId: id });
253
+ }
254
+ }
255
+ this.sessions.clear();
256
+ for (const [id, session] of this.sseSessions) {
257
+ try {
258
+ await session.transport.close();
259
+ }
260
+ catch {
261
+ log.debug('SSE transport close failed', { sessionId: id });
262
+ }
263
+ }
264
+ this.sseSessions.clear();
265
+ if (this.subsystems) {
266
+ try {
267
+ await this.subsystems.shutdown();
268
+ }
269
+ catch (err) {
270
+ log.error('Subsystems shutdown failed', { error: String(err) });
271
+ }
272
+ this.subsystems = null;
273
+ }
274
+ if (this.httpServer) {
275
+ await new Promise((resolve) => {
276
+ this.httpServer.close(() => resolve());
277
+ });
278
+ this.httpServer = null;
279
+ }
280
+ }
281
+ }
282
+ //# sourceMappingURL=http-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-server.js","sourceRoot":"","sources":["../../src/daemon/http-server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,YAAY,EAAwE,MAAM,WAAW,CAAC;AAE/G,OAAO,EAAE,6BAA6B,EAAE,MAAM,oDAAoD,CAAC;AACnG,OAAO,EAAE,kBAAkB,EAAE,MAAM,yCAAyC,CAAC;AAC7E,OAAO,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AACzE,OAAO,EAAE,cAAc,EAAE,eAAe,EAAmB,MAAM,cAAc,CAAC;AAChF,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,MAAM,GAAG,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;AAOnC,MAAM,OAAO,gBAAgB;IACnB,UAAU,GAAsB,IAAI,CAAC;IACrC,UAAU,GAAsB,IAAI,CAAC;IACrC,SAAS,GAAW,CAAC,CAAC;IACtB,OAAO,GAAG,KAAK,CAAC;IAChB,QAAQ,GAAG,IAAI,GAAG,EAAwE,CAAC;IAC3F,WAAW,GAAG,IAAI,GAAG,EAA6D,CAAC;IAC1E,IAAI,CAAS;IACb,IAAI,CAAS;IAE9B,YAAY,OAAsB;QAChC,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;QACzB,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC5B,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;QAErB,IAAI,CAAC;YACH,IAAI,CAAC,UAAU,GAAG,MAAM,cAAc,EAAE,CAAC;QAC3C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,GAAG,CAAC,KAAK,CAAC,iCAAiC,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACrE,MAAM,GAAG,CAAC;QACZ,CAAC;QAED,IAAI,CAAC,UAAU,CAAC,gBAAgB,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;YAC/C,GAAG,CAAC,IAAI,CAAC,yCAAyC,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC9E,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,UAAU,GAAG,YAAY,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;YAC1C,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;gBACzC,GAAG,CAAC,KAAK,CAAC,yBAAyB,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBAC7D,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC;oBACrB,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;oBAC3D,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,uBAAuB,EAAE,CAAC,CAAC,CAAC;gBAC9D,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,OAAO,IAAI,OAAO,CAAS,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC7C,IAAI,CAAC,UAAW,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;gBACnC,GAAG,CAAC,KAAK,CAAC,mBAAmB,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBACvD,MAAM,CAAC,GAAG,CAAC,CAAC;YACd,CAAC,CAAC,CAAC;YAEH,IAAI,CAAC,UAAW,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE;gBACjD,MAAM,IAAI,GAAG,IAAI,CAAC,UAAW,CAAC,OAAO,EAAE,CAAC;gBACxC,IAAI,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC;gBAC7B,IAAI,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;oBACrC,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC;gBAC3B,CAAC;gBACD,MAAM,GAAG,GAAG,UAAU,IAAI,CAAC,IAAI,IAAI,YAAY,EAAE,CAAC;gBAClD,GAAG,CAAC,IAAI,CAAC,4BAA4B,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;gBAChD,OAAO,CAAC,GAAG,CAAC,CAAC;YACf,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,KAAK,CAAC,aAAa,CAAC,GAAoB,EAAE,GAAmB;QACnE,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,EAAE,UAAU,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI,WAAW,EAAE,CAAC,CAAC;QACjF,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC;QAC9B,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,IAAI,KAAK,CAAC;QAEnC,IAAI,QAAQ,KAAK,SAAS,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;YAC/C,OAAO,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC;QACvC,CAAC;QAED,IAAI,QAAQ,KAAK,MAAM,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;YAC7C,OAAO,IAAI,CAAC,2BAA2B,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QACpD,CAAC;QAED,IAAI,QAAQ,KAAK,MAAM,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;YAC5C,OAAO,IAAI,CAAC,uBAAuB,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QAChD,CAAC;QAED,IAAI,QAAQ,KAAK,MAAM,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC/C,OAAO,IAAI,CAAC,0BAA0B,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QACnD,CAAC;QAED,IAAI,QAAQ,KAAK,MAAM,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;YAC5C,OAAO,IAAI,CAAC,gBAAgB,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QACzC,CAAC;QAED,IAAI,QAAQ,KAAK,WAAW,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;YAClD,MAAM,SAAS,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;YACpD,OAAO,IAAI,CAAC,uBAAuB,CAAC,GAAG,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC;QAC3D,CAAC;QAED,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;QAC3D,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC;IAClD,CAAC;IAEO,mBAAmB,CAAC,GAAmB;QAC7C,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,WAAW,CAAC;gBACzB,aAAa,EAAE,IAAI,CAAC,UAAU,EAAE,aAAa,IAAI,IAAI;gBACrD,WAAW,EAAE,IAAI,CAAC,UAAU,EAAE,WAAW,IAAI,IAAI;gBACjD,SAAS,EAAE,IAAI,CAAC,SAAS;aAC1B,CAAC,CAAC;YAEH,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;YACxD,GAAG,CAAC,SAAS,CAAC,UAAU,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;YAClE,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;QAClC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,GAAG,CAAC,KAAK,CAAC,qBAAqB,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACzD,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;YAC3D,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;QAClE,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,2BAA2B,CAAC,GAAoB,EAAE,GAAmB;QACjF,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACrB,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;YAC3D,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,kBAAkB,EAAE,CAAC,CAAC,CAAC;YACvD,OAAO;QACT,CAAC;QAED,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;YAC1C,MAAM,SAAS,GAAG,GAAG,CAAC,OAAO,CAAC,gBAAgB,CAAuB,CAAC;YAEtE,IAAI,SAAS,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC9C,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAE,CAAC;gBAC9C,MAAM,OAAO,CAAC,SAAS,CAAC,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;gBACtD,OAAO;YACT,CAAC;YAED,IAAI,CAAC,SAAS,IAAI,mBAAmB,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC5C,MAAM,SAAS,GAAG,IAAI,6BAA6B,CAAC;oBAClD,kBAAkB,EAAE,GAAG,EAAE,CAAC,UAAU,EAAE;oBACtC,oBAAoB,EAAE,CAAC,YAAoB,EAAE,EAAE;wBAC7C,GAAG,CAAC,KAAK,CAAC,oCAAoC,EAAE,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC,CAAC;wBAC7E,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,YAAY,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC;oBACzD,CAAC;iBACF,CAAC,CAAC;gBAEH,SAAS,CAAC,OAAO,GAAG,GAAG,EAAE;oBACvB,MAAM,GAAG,GAAG,SAAS,CAAC,SAAS,CAAC;oBAChC,IAAI,GAAG,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;wBAClC,GAAG,CAAC,KAAK,CAAC,+BAA+B,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC;wBAC/D,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;oBAC5B,CAAC;gBACH,CAAC,CAAC;gBAEF,MAAM,MAAM,GAAG,eAAe,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;gBAChD,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;gBAChC,MAAM,SAAS,CAAC,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;gBAC9C,OAAO;YACT,CAAC;YAED,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;YAC3D,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC;gBACrB,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,2CAA2C,EAAE;gBAC7E,EAAE,EAAE,IAAI;aACT,CAAC,CAAC,CAAC;QACN,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,GAAG,CAAC,KAAK,CAAC,+BAA+B,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACnE,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC;gBACrB,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;gBAC3D,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;YAClD,CAAC;QACH,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,uBAAuB,CAAC,GAAoB,EAAE,GAAmB;QAC7E,MAAM,SAAS,GAAG,GAAG,CAAC,OAAO,CAAC,gBAAgB,CAAuB,CAAC;QACtE,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;YAChD,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;YAC3D,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,+BAA+B,EAAE,CAAC,CAAC,CAAC;YACpE,OAAO;QACT,CAAC;QACD,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAE,CAAC;QAC9C,MAAM,OAAO,CAAC,SAAS,CAAC,aAAa,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAClD,CAAC;IAEO,KAAK,CAAC,0BAA0B,CAAC,GAAoB,EAAE,GAAmB;QAChF,MAAM,SAAS,GAAG,GAAG,CAAC,OAAO,CAAC,gBAAgB,CAAuB,CAAC;QACtE,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;YAChD,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;YAC3D,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,+BAA+B,EAAE,CAAC,CAAC,CAAC;YACpE,OAAO;QACT,CAAC;QACD,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAE,CAAC;QAC9C,MAAM,OAAO,CAAC,SAAS,CAAC,aAAa,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAClD,CAAC;IAEO,KAAK,CAAC,gBAAgB,CAAC,GAAoB,EAAE,GAAmB;QACtE,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACrB,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;YAC3D,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,kBAAkB,EAAE,CAAC,CAAC,CAAC;YACvD,OAAO;QACT,CAAC;QAED,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,IAAI,kBAAkB,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;YAC3D,MAAM,MAAM,GAAG,eAAe,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAEhD,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YAEhC,MAAM,SAAS,GAAG,SAAS,CAAC,SAAS,CAAC;YACtC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC;YAEvD,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;gBACnB,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;gBACnC,GAAG,CAAC,KAAK,CAAC,oBAAoB,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;YACjD,CAAC,CAAC,CAAC;YAEH,GAAG,CAAC,KAAK,CAAC,qBAAqB,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;QAClD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,GAAG,CAAC,KAAK,CAAC,uBAAuB,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAC3D,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC;gBACrB,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;gBAC3D,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;YAClD,CAAC;QACH,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,uBAAuB,CACnC,GAAoB,EACpB,GAAmB,EACnB,SAAwB;QAExB,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;YACnD,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;YAC3D,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,8CAA8C,EAAE,CAAC,CAAC,CAAC;YACnF,OAAO;QACT,CAAC;QAED,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,CAAE,CAAC;YACjD,MAAM,OAAO,CAAC,SAAS,CAAC,iBAAiB,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QACtD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,GAAG,CAAC,KAAK,CAAC,6BAA6B,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACjE,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC;gBACrB,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;gBAC3D,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;YAClD,CAAC;QACH,CAAC;IACH,CAAC;IAEO,YAAY,CAAC,GAAoB,EAAE,QAAQ,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI;QACpE,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,MAAM,MAAM,GAAa,EAAE,CAAC;YAC5B,IAAI,IAAI,GAAG,CAAC,CAAC;YACb,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;gBAC/B,IAAI,IAAI,KAAK,CAAC,MAAM,CAAC;gBACrB,IAAI,IAAI,GAAG,QAAQ,EAAE,CAAC;oBACpB,GAAG,CAAC,OAAO,EAAE,CAAC;oBACd,MAAM,CAAC,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC,CAAC;oBAC5C,OAAO;gBACT,CAAC;gBACD,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACrB,CAAC,CAAC,CAAC;YACH,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE;gBACjB,IAAI,CAAC;oBACH,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;gBACxD,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,MAAM,CAAC,GAAG,CAAC,CAAC;gBACd,CAAC;YACH,CAAC,CAAC,CAAC;YACH,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC1B,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,IAAI;QACR,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO;QACzB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QAEpB,GAAG,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;QAExC,KAAK,MAAM,CAAC,EAAE,EAAE,OAAO,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC1C,IAAI,CAAC;gBACH,MAAM,OAAO,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;YAClC,CAAC;YAAC,MAAM,CAAC;gBACP,GAAG,CAAC,KAAK,CAAC,uCAAuC,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,CAAC;YACxE,CAAC;QACH,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;QAEtB,KAAK,MAAM,CAAC,EAAE,EAAE,OAAO,CAAC,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YAC7C,IAAI,CAAC;gBACH,MAAM,OAAO,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;YAClC,CAAC;YAAC,MAAM,CAAC;gBACP,GAAG,CAAC,KAAK,CAAC,4BAA4B,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,CAAC;YAC7D,CAAC;QACH,CAAC;QACD,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;QAEzB,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC;YACnC,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,GAAG,CAAC,KAAK,CAAC,4BAA4B,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAClE,CAAC;YACD,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACzB,CAAC;QAED,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;gBAClC,IAAI,CAAC,UAAW,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;YAC1C,CAAC,CAAC,CAAC;YACH,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACzB,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,10 @@
1
+ import type { HealthReport } from './health-check.js';
2
+ export declare function tryConnectDaemon(port: number, host: string): Promise<HealthReport | null>;
3
+ export declare class DaemonProxy {
4
+ private readonly baseUrl;
5
+ constructor(url: string);
6
+ callTool(toolName: string, args: Record<string, unknown>): Promise<unknown>;
7
+ checkHealth(): Promise<HealthReport | null>;
8
+ listTools(): Promise<unknown>;
9
+ }
10
+ //# sourceMappingURL=proxy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proxy.d.ts","sourceRoot":"","sources":["../../src/daemon/proxy.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAItD,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAoB/F;AAKD,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;gBAErB,GAAG,EAAE,MAAM;IAIjB,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;IAiC3E,WAAW,IAAI,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IAc3C,SAAS,IAAI,OAAO,CAAC,OAAO,CAAC;CAwBpC"}
@@ -0,0 +1,99 @@
1
+ import { createLogger } from '../logger.js';
2
+ const log = createLogger('server');
3
+ export async function tryConnectDaemon(port, host) {
4
+ const url = `http://${host}:${port}/health`;
5
+ try {
6
+ const response = await fetch(url, {
7
+ signal: AbortSignal.timeout(2000),
8
+ });
9
+ if (!response.ok) {
10
+ log.debug('Daemon health check returned non-OK status', { status: response.status });
11
+ return null;
12
+ }
13
+ const report = await response.json();
14
+ log.debug('Daemon is running', { port, host, status: report.status });
15
+ return report;
16
+ }
17
+ catch {
18
+ log.debug('No daemon running', { port, host });
19
+ return null;
20
+ }
21
+ }
22
+ // NOTE: callTool and listTools are incomplete — they skip the MCP initialize
23
+ // handshake required by StreamableHTTP transport. Full proxy deferred to v2.1.
24
+ // Only checkHealth (which uses /health, not /mcp) works today.
25
+ export class DaemonProxy {
26
+ baseUrl;
27
+ constructor(url) {
28
+ this.baseUrl = url;
29
+ }
30
+ async callTool(toolName, args) {
31
+ const url = `${this.baseUrl}/mcp`;
32
+ try {
33
+ const response = await fetch(url, {
34
+ method: 'POST',
35
+ headers: {
36
+ 'Content-Type': 'application/json',
37
+ },
38
+ body: JSON.stringify({
39
+ jsonrpc: '2.0',
40
+ method: 'tools/call',
41
+ id: Date.now(),
42
+ params: {
43
+ name: toolName,
44
+ arguments: args,
45
+ },
46
+ }),
47
+ signal: AbortSignal.timeout(60000),
48
+ });
49
+ if (!response.ok) {
50
+ const text = await response.text().catch(() => '');
51
+ throw new Error(`Daemon returned HTTP ${response.status}: ${text}`);
52
+ }
53
+ return response.json();
54
+ }
55
+ catch (err) {
56
+ if (err instanceof Error && err.message.startsWith('Daemon returned'))
57
+ throw err;
58
+ throw new Error(`Failed to call tool via daemon: ${err instanceof Error ? err.message : String(err)}`);
59
+ }
60
+ }
61
+ async checkHealth() {
62
+ try {
63
+ const response = await fetch(`${this.baseUrl}/health`, {
64
+ signal: AbortSignal.timeout(2000),
65
+ });
66
+ if (!response.ok)
67
+ return null;
68
+ return response.json();
69
+ }
70
+ catch {
71
+ return null;
72
+ }
73
+ }
74
+ async listTools() {
75
+ const url = `${this.baseUrl}/mcp`;
76
+ try {
77
+ const response = await fetch(url, {
78
+ method: 'POST',
79
+ headers: {
80
+ 'Content-Type': 'application/json',
81
+ },
82
+ body: JSON.stringify({
83
+ jsonrpc: '2.0',
84
+ method: 'tools/list',
85
+ id: Date.now(),
86
+ params: {},
87
+ }),
88
+ signal: AbortSignal.timeout(10000),
89
+ });
90
+ if (!response.ok)
91
+ return null;
92
+ return response.json();
93
+ }
94
+ catch {
95
+ return null;
96
+ }
97
+ }
98
+ }
99
+ //# sourceMappingURL=proxy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proxy.js","sourceRoot":"","sources":["../../src/daemon/proxy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import type { BrowserAction, ActionResult } from '../types.js';
2
+ export interface ActionExecutorOptions {
3
+ perActionTimeoutMs?: number;
4
+ }
5
+ interface PlaywrightPage {
6
+ click(selector: string, options?: {
7
+ timeout?: number;
8
+ }): Promise<void>;
9
+ fill(selector: string, value: string, options?: {
10
+ timeout?: number;
11
+ }): Promise<void>;
12
+ waitForTimeout(timeout: number): Promise<void>;
13
+ waitForSelector(selector: string, options?: {
14
+ timeout?: number;
15
+ state?: string;
16
+ }): Promise<unknown>;
17
+ evaluate(fn: (...args: unknown[]) => unknown, ...args: unknown[]): Promise<unknown>;
18
+ screenshot(options?: {
19
+ fullPage?: boolean;
20
+ }): Promise<Buffer>;
21
+ viewportSize(): {
22
+ width: number;
23
+ height: number;
24
+ } | null;
25
+ }
26
+ export declare function executeActions(page: PlaywrightPage, actions: BrowserAction[] | undefined | null, opts?: ActionExecutorOptions): Promise<ActionResult[]>;
27
+ export {};
28
+ //# sourceMappingURL=action-executor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"action-executor.d.ts","sourceRoot":"","sources":["../../src/fetch/action-executor.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAO/D,MAAM,WAAW,qBAAqB;IACpC,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,UAAU,cAAc;IACtB,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvE,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACrF,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/C,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACpG,QAAQ,CAAC,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACpF,UAAU,CAAC,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC9D,YAAY,IAAI;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;CAC1D;AAED,wBAAsB,cAAc,CAClC,IAAI,EAAE,cAAc,EACpB,OAAO,EAAE,aAAa,EAAE,GAAG,SAAS,GAAG,IAAI,EAC3C,IAAI,CAAC,EAAE,qBAAqB,GAC3B,OAAO,CAAC,YAAY,EAAE,CAAC,CA2FzB"}
@@ -0,0 +1,86 @@
1
+ import { createLogger } from '../logger.js';
2
+ const log = createLogger('fetch');
3
+ const DEFAULT_PER_ACTION_TIMEOUT_MS = 5000;
4
+ const DEFAULT_WAIT_FOR_TIMEOUT_MS = 5000;
5
+ export async function executeActions(page, actions, opts) {
6
+ if (!actions || actions.length === 0) {
7
+ return [];
8
+ }
9
+ const perActionTimeout = opts?.perActionTimeoutMs ?? DEFAULT_PER_ACTION_TIMEOUT_MS;
10
+ const results = [];
11
+ for (let i = 0; i < actions.length; i++) {
12
+ const action = actions[i];
13
+ const result = {
14
+ action_index: i,
15
+ type: action.type,
16
+ success: false,
17
+ };
18
+ try {
19
+ switch (action.type) {
20
+ case 'click': {
21
+ log.debug('action: click', { index: i, selector: action.selector });
22
+ await page.click(action.selector, { timeout: perActionTimeout });
23
+ result.success = true;
24
+ break;
25
+ }
26
+ case 'type': {
27
+ log.debug('action: type', { index: i, selector: action.selector, textLength: action.text.length });
28
+ await page.fill(action.selector, action.text, { timeout: perActionTimeout });
29
+ result.success = true;
30
+ break;
31
+ }
32
+ case 'wait': {
33
+ const MAX_WAIT_MS = 10000;
34
+ const ms = Math.min(Math.max(0, action.ms), MAX_WAIT_MS);
35
+ log.debug('action: wait', { index: i, ms });
36
+ await page.waitForTimeout(ms);
37
+ result.success = true;
38
+ break;
39
+ }
40
+ case 'wait_for': {
41
+ const timeout = action.timeout ?? DEFAULT_WAIT_FOR_TIMEOUT_MS;
42
+ log.debug('action: wait_for', { index: i, selector: action.selector, timeout });
43
+ await page.waitForSelector(action.selector, { timeout });
44
+ result.success = true;
45
+ break;
46
+ }
47
+ case 'scroll': {
48
+ const viewport = page.viewportSize();
49
+ const defaultAmount = viewport?.height ?? 720;
50
+ const pixels = action.amount ?? defaultAmount;
51
+ const scrollY = action.direction === 'up' ? -pixels : pixels;
52
+ log.debug('action: scroll', { index: i, direction: action.direction, pixels: scrollY });
53
+ await page.evaluate((dy) => window.scrollBy(0, dy), scrollY);
54
+ result.success = true;
55
+ break;
56
+ }
57
+ case 'screenshot': {
58
+ log.debug('action: screenshot', { index: i });
59
+ const buf = await page.screenshot({ fullPage: true });
60
+ result.success = true;
61
+ result.screenshot = buf.toString('base64');
62
+ break;
63
+ }
64
+ default: {
65
+ const unknownType = action.type;
66
+ log.warn('unknown action type', { index: i, type: unknownType });
67
+ result.error = `Unknown action type: ${unknownType}`;
68
+ break;
69
+ }
70
+ }
71
+ }
72
+ catch (err) {
73
+ const message = err instanceof Error ? err.message : String(err);
74
+ log.warn('action failed', { index: i, type: action.type, error: message });
75
+ result.error = message;
76
+ }
77
+ results.push(result);
78
+ }
79
+ log.info('actions complete', {
80
+ total: actions.length,
81
+ succeeded: results.filter(r => r.success).length,
82
+ failed: results.filter(r => !r.success).length,
83
+ });
84
+ return results;
85
+ }
86
+ //# sourceMappingURL=action-executor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"action-executor.js","sourceRoot":"","sources":["../../src/fetch/action-executor.ts"],"names":[],"mappings":"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"}
@@ -2,7 +2,8 @@ import type { CDPSession } from '../types.js';
2
2
  export interface AuthOptions {
3
3
  storageStatePath?: string;
4
4
  userDataDir?: string;
5
+ cdpUrl?: string;
5
6
  }
6
- export declare function getAuthOptions(): AuthOptions | null;
7
+ export declare function getAuthOptions(): Promise<AuthOptions | null>;
7
8
  export declare function listSessions(): Promise<CDPSession[]>;
8
9
  //# sourceMappingURL=auth.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/fetch/auth.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C,MAAM,WAAW,WAAW;IAC1B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,wBAAgB,cAAc,IAAI,WAAW,GAAG,IAAI,CAyBnD;AAED,wBAAsB,YAAY,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC,CAE1D"}
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/fetch/auth.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C,MAAM,WAAW,WAAW;IAC1B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAsB,cAAc,IAAI,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAyClE;AAED,wBAAsB,YAAY,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC,CAc1D"}
@@ -3,7 +3,8 @@ import { join } from 'node:path';
3
3
  import { tmpdir } from 'node:os';
4
4
  import { getConfig } from '../config.js';
5
5
  import { createLogger } from '../logger.js';
6
- export function getAuthOptions() {
6
+ import { discoverSessions, isCDPReachable } from './cdp-client.js';
7
+ export async function getAuthOptions() {
7
8
  const config = getConfig();
8
9
  const logger = createLogger('fetch');
9
10
  if (config.authStatePath) {
@@ -24,9 +25,36 @@ export function getAuthOptions() {
24
25
  logger.debug('copied Chrome profile to temp directory', { from: config.chromeProfilePath, to: tempDir });
25
26
  return { userDataDir: tempDir };
26
27
  }
28
+ if (config.cdpUrl) {
29
+ try {
30
+ const reachable = await isCDPReachable(config.cdpUrl);
31
+ if (reachable) {
32
+ logger.info('CDP endpoint reachable, using for auth', { cdpUrl: config.cdpUrl });
33
+ return { cdpUrl: config.cdpUrl };
34
+ }
35
+ logger.debug('CDP endpoint not reachable', { cdpUrl: config.cdpUrl });
36
+ }
37
+ catch (err) {
38
+ logger.warn('CDP reachability check failed', {
39
+ cdpUrl: config.cdpUrl,
40
+ error: err instanceof Error ? err.message : String(err),
41
+ });
42
+ }
43
+ }
27
44
  return null;
28
45
  }
29
46
  export async function listSessions() {
30
- return [];
47
+ const config = getConfig();
48
+ if (!config.cdpUrl) {
49
+ return [];
50
+ }
51
+ try {
52
+ return await discoverSessions(config.cdpUrl);
53
+ }
54
+ catch (err) {
55
+ const logger = createLogger('fetch');
56
+ logger.warn('listSessions failed', { error: err instanceof Error ? err.message : String(err) });
57
+ return [];
58
+ }
31
59
  }
32
60
  //# sourceMappingURL=auth.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/fetch/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAC1D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAQ5C,MAAM,UAAU,cAAc;IAC5B,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;IAErC,IAAI,MAAM,CAAC,aAAa,EAAE,CAAC;QACzB,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC;YACtC,MAAM,IAAI,KAAK,CAAC,8BAA8B,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC;QACxE,CAAC;QACD,OAAO,EAAE,gBAAgB,EAAE,MAAM,CAAC,aAAa,EAAE,CAAC;IACpD,CAAC;IAED,IAAI,MAAM,CAAC,iBAAiB,EAAE,CAAC;QAC7B,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,iBAAiB,EAAE,eAAe,CAAC,CAAC;QACjE,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YACzB,MAAM,CAAC,IAAI,CAAC,4FAA4F,EAAE;gBACxG,WAAW,EAAE,MAAM,CAAC,iBAAiB;aACtC,CAAC,CAAC;QACL,CAAC;QACD,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,gBAAgB,CAAC,CAAC,CAAC;QAC9D,MAAM,CAAC,MAAM,CAAC,iBAAiB,EAAE,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/D,MAAM,CAAC,KAAK,CAAC,yCAAyC,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,iBAAiB,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;QACzG,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC;IAClC,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY;IAChC,OAAO,EAAE,CAAC;AACZ,CAAC"}
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/fetch/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAC1D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AASnE,MAAM,CAAC,KAAK,UAAU,cAAc;IAClC,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;IAErC,IAAI,MAAM,CAAC,aAAa,EAAE,CAAC;QACzB,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC;YACtC,MAAM,IAAI,KAAK,CAAC,8BAA8B,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC;QACxE,CAAC;QACD,OAAO,EAAE,gBAAgB,EAAE,MAAM,CAAC,aAAa,EAAE,CAAC;IACpD,CAAC;IAED,IAAI,MAAM,CAAC,iBAAiB,EAAE,CAAC;QAC7B,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,iBAAiB,EAAE,eAAe,CAAC,CAAC;QACjE,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YACzB,MAAM,CAAC,IAAI,CAAC,4FAA4F,EAAE;gBACxG,WAAW,EAAE,MAAM,CAAC,iBAAiB;aACtC,CAAC,CAAC;QACL,CAAC;QACD,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,gBAAgB,CAAC,CAAC,CAAC;QAC9D,MAAM,CAAC,MAAM,CAAC,iBAAiB,EAAE,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/D,MAAM,CAAC,KAAK,CAAC,yCAAyC,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,iBAAiB,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;QACzG,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC;IAClC,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAClB,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,MAAM,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YACtD,IAAI,SAAS,EAAE,CAAC;gBACd,MAAM,CAAC,IAAI,CAAC,wCAAwC,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;gBACjF,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;YACnC,CAAC;YACD,MAAM,CAAC,KAAK,CAAC,4BAA4B,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;QACxE,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,IAAI,CAAC,+BAA+B,EAAE;gBAC3C,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;aACxD,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY;IAChC,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAE3B,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;QACnB,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,IAAI,CAAC;QACH,OAAO,MAAM,gBAAgB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC/C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;QACrC,MAAM,CAAC,IAAI,CAAC,qBAAqB,EAAE,EAAE,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChG,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC"}