agent-debugger 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. package/README.md +131 -0
  2. package/bin/agent-debugger +2 -0
  3. package/dist/src/adapters/base.d.ts +45 -0
  4. package/dist/src/adapters/base.d.ts.map +1 -0
  5. package/dist/src/adapters/base.js +3 -0
  6. package/dist/src/adapters/base.js.map +1 -0
  7. package/dist/src/adapters/go.d.ts +27 -0
  8. package/dist/src/adapters/go.d.ts.map +1 -0
  9. package/dist/src/adapters/go.js +144 -0
  10. package/dist/src/adapters/go.js.map +1 -0
  11. package/dist/src/adapters/node.d.ts +27 -0
  12. package/dist/src/adapters/node.d.ts.map +1 -0
  13. package/dist/src/adapters/node.js +197 -0
  14. package/dist/src/adapters/node.js.map +1 -0
  15. package/dist/src/adapters/python.d.ts +27 -0
  16. package/dist/src/adapters/python.d.ts.map +1 -0
  17. package/dist/src/adapters/python.js +152 -0
  18. package/dist/src/adapters/python.js.map +1 -0
  19. package/dist/src/adapters/registry.d.ts +10 -0
  20. package/dist/src/adapters/registry.d.ts.map +1 -0
  21. package/dist/src/adapters/registry.js +45 -0
  22. package/dist/src/adapters/registry.js.map +1 -0
  23. package/dist/src/adapters/rust.d.ts +27 -0
  24. package/dist/src/adapters/rust.d.ts.map +1 -0
  25. package/dist/src/adapters/rust.js +149 -0
  26. package/dist/src/adapters/rust.js.map +1 -0
  27. package/dist/src/cli.d.ts +4 -0
  28. package/dist/src/cli.d.ts.map +1 -0
  29. package/dist/src/cli.js +326 -0
  30. package/dist/src/cli.js.map +1 -0
  31. package/dist/src/daemon.d.ts +3 -0
  32. package/dist/src/daemon.d.ts.map +1 -0
  33. package/dist/src/daemon.js +136 -0
  34. package/dist/src/daemon.js.map +1 -0
  35. package/dist/src/dap-client.d.ts +35 -0
  36. package/dist/src/dap-client.d.ts.map +1 -0
  37. package/dist/src/dap-client.js +256 -0
  38. package/dist/src/dap-client.js.map +1 -0
  39. package/dist/src/dap-types.d.ts +52 -0
  40. package/dist/src/dap-types.d.ts.map +1 -0
  41. package/dist/src/dap-types.js +3 -0
  42. package/dist/src/dap-types.js.map +1 -0
  43. package/dist/src/protocol.d.ts +253 -0
  44. package/dist/src/protocol.d.ts.map +1 -0
  45. package/dist/src/protocol.js +50 -0
  46. package/dist/src/protocol.js.map +1 -0
  47. package/dist/src/session.d.ts +30 -0
  48. package/dist/src/session.d.ts.map +1 -0
  49. package/dist/src/session.js +407 -0
  50. package/dist/src/session.js.map +1 -0
  51. package/dist/src/util/paths.d.ts +5 -0
  52. package/dist/src/util/paths.d.ts.map +1 -0
  53. package/dist/src/util/paths.js +7 -0
  54. package/dist/src/util/paths.js.map +1 -0
  55. package/dist/src/util/ports.d.ts +3 -0
  56. package/dist/src/util/ports.d.ts.map +1 -0
  57. package/dist/src/util/ports.js +19 -0
  58. package/dist/src/util/ports.js.map +1 -0
  59. package/dist/test/protocol.test.d.ts +2 -0
  60. package/dist/test/protocol.test.d.ts.map +1 -0
  61. package/dist/test/protocol.test.js +25 -0
  62. package/dist/test/protocol.test.js.map +1 -0
  63. package/package.json +55 -0
  64. package/skills/agent-debugger/SKILL.md +225 -0
@@ -0,0 +1,326 @@
1
+ #!/usr/bin/env node
2
+ /** CLI entry point — thin stateless client that talks to the daemon. */
3
+ import { connect } from "node:net";
4
+ import { spawn } from "node:child_process";
5
+ import { existsSync, readFileSync, unlinkSync } from "node:fs";
6
+ import { resolve as pathResolve, dirname } from "node:path";
7
+ import { fileURLToPath } from "node:url";
8
+ import { SESSION_DIR, SOCKET_PATH, PID_FILE } from "./util/paths.js";
9
+ const __dirname = dirname(fileURLToPath(import.meta.url));
10
+ function isDaemonRunning() {
11
+ if (!existsSync(PID_FILE))
12
+ return false;
13
+ try {
14
+ const pid = parseInt(readFileSync(PID_FILE, "utf-8").trim(), 10);
15
+ process.kill(pid, 0); // Check if process exists
16
+ return true;
17
+ }
18
+ catch {
19
+ // Clean up stale files
20
+ for (const p of [PID_FILE, SOCKET_PATH]) {
21
+ try {
22
+ if (existsSync(p))
23
+ unlinkSync(p);
24
+ }
25
+ catch { /* ignore */ }
26
+ }
27
+ return false;
28
+ }
29
+ }
30
+ function ensureDaemon() {
31
+ if (isDaemonRunning())
32
+ return Promise.resolve();
33
+ // Spawn daemon as a detached background process
34
+ const daemonScript = pathResolve(__dirname, "daemon.js");
35
+ const child = spawn("node", [daemonScript], {
36
+ stdio: "ignore",
37
+ detached: true,
38
+ });
39
+ child.unref();
40
+ // Wait for socket to appear
41
+ return new Promise((resolve, reject) => {
42
+ let attempts = 0;
43
+ const check = () => {
44
+ if (existsSync(SOCKET_PATH)) {
45
+ resolve();
46
+ return;
47
+ }
48
+ attempts++;
49
+ if (attempts > 30) {
50
+ reject(new Error("Daemon failed to start"));
51
+ return;
52
+ }
53
+ setTimeout(check, 100);
54
+ };
55
+ check();
56
+ });
57
+ }
58
+ function sendCommand(cmd) {
59
+ return new Promise(async (resolve, reject) => {
60
+ try {
61
+ await ensureDaemon();
62
+ }
63
+ catch (err) {
64
+ reject(err);
65
+ return;
66
+ }
67
+ const sock = connect(SOCKET_PATH);
68
+ let data = "";
69
+ sock.on("connect", () => {
70
+ sock.write(JSON.stringify(cmd) + "\n");
71
+ });
72
+ sock.on("data", (chunk) => {
73
+ data += chunk.toString();
74
+ });
75
+ sock.on("end", () => {
76
+ try {
77
+ resolve(JSON.parse(data.trim()));
78
+ }
79
+ catch {
80
+ resolve({ error: "Invalid response from daemon" });
81
+ }
82
+ });
83
+ sock.on("error", (err) => {
84
+ if (err.code === "ECONNREFUSED") {
85
+ // Daemon died, clean up
86
+ for (const p of [PID_FILE, SOCKET_PATH]) {
87
+ try {
88
+ if (existsSync(p))
89
+ unlinkSync(p);
90
+ }
91
+ catch { /* ignore */ }
92
+ }
93
+ resolve({ error: "Daemon not running. Try again." });
94
+ }
95
+ else {
96
+ reject(err);
97
+ }
98
+ });
99
+ });
100
+ }
101
+ function formatResult(result) {
102
+ if (result.error) {
103
+ return `Error: ${result.error}`;
104
+ }
105
+ // Variables
106
+ if (result.variables) {
107
+ const loc = result.location;
108
+ const lines = [];
109
+ if (loc) {
110
+ lines.push(` at ${loc.file}:${loc.line} in ${loc.function}`);
111
+ }
112
+ for (const v of result.variables) {
113
+ const typeSuffix = v.type ? ` (${v.type})` : "";
114
+ lines.push(` ${v.name} = ${v.value}${typeSuffix}`);
115
+ }
116
+ if (!result.variables.length) {
117
+ lines.push(" (no local variables)");
118
+ }
119
+ return lines.join("\n");
120
+ }
121
+ // Status (check before location since status also has location)
122
+ if (result.state) {
123
+ const lines = [`State: ${result.state}`];
124
+ const loc = result.location;
125
+ if (loc) {
126
+ lines.push(` ${loc.file}:${loc.line} in ${loc.function}`);
127
+ }
128
+ return lines.join("\n");
129
+ }
130
+ // Start / step / continue (has status + location)
131
+ if (result.location) {
132
+ const loc = result.location;
133
+ const out = [];
134
+ if (result.status) {
135
+ const reason = result.reason ? ` (${result.reason})` : "";
136
+ out.push(`Status: ${result.status}${reason}`);
137
+ }
138
+ out.push(` ${loc.file}:${loc.line} in ${loc.function}`);
139
+ if (result.breakpoints) {
140
+ for (const bp of result.breakpoints) {
141
+ const v = bp.verified ? "verified" : "pending";
142
+ out.push(` Breakpoint: ${bp.file}:${bp.line} (${v})`);
143
+ }
144
+ }
145
+ return out.join("\n");
146
+ }
147
+ // Stack trace
148
+ if (result.frames) {
149
+ const lines = [];
150
+ for (let i = 0; i < result.frames.length; i++) {
151
+ const f = result.frames[i];
152
+ const marker = i === 0 ? "\u2192" : " ";
153
+ lines.push(` ${marker} ${f.function} at ${f.file}:${f.line}`);
154
+ }
155
+ return lines.length ? lines.join("\n") : " (empty stack)";
156
+ }
157
+ // Eval result
158
+ if (result.result !== undefined) {
159
+ const typeSuffix = result.type ? ` (${result.type})` : "";
160
+ return ` ${result.result}${typeSuffix}`;
161
+ }
162
+ // Source
163
+ if (result.source) {
164
+ return result.source;
165
+ }
166
+ // Breakpoint set
167
+ if (result.verified !== undefined) {
168
+ const v = result.verified ? "verified" : "pending";
169
+ return ` Breakpoint: ${result.file}:${result.line} (${v})`;
170
+ }
171
+ // Terminated
172
+ if (result.status === "terminated") {
173
+ const exitStr = result.exitCode !== undefined && result.exitCode !== null ? ` (exit code: ${result.exitCode})` : "";
174
+ return `Status: terminated${exitStr}`;
175
+ }
176
+ // Closed
177
+ if (result.status === "closed") {
178
+ return "Session closed.";
179
+ }
180
+ // Generic
181
+ return JSON.stringify(result, null, 2);
182
+ }
183
+ const HELP = `agent-debugger \u2014 CLI debugger for AI agents
184
+
185
+ Usage:
186
+ agent-debugger start <script> [--break file:line] [--runtime path] [--args ...]
187
+ agent-debugger vars Get local variables
188
+ agent-debugger eval <expression> Evaluate expression
189
+ agent-debugger step [into|out] Step over/into/out
190
+ agent-debugger continue Continue to next breakpoint
191
+ agent-debugger stack Show call stack
192
+ agent-debugger break <file:line[:cond]> Add breakpoint
193
+ agent-debugger source [file] [line] Show source code
194
+ agent-debugger status Show current state
195
+ agent-debugger close End debug session`;
196
+ async function main() {
197
+ const args = process.argv.slice(2);
198
+ if (!args.length || args[0] === "-h" || args[0] === "--help" || args[0] === "help") {
199
+ console.log(HELP);
200
+ return;
201
+ }
202
+ const command = args[0];
203
+ let result;
204
+ switch (command) {
205
+ case "start": {
206
+ if (args.length < 2) {
207
+ process.stderr.write("Error: missing script path. Usage: agent-debugger start <script>\n");
208
+ process.exit(1);
209
+ }
210
+ const script = args[1];
211
+ const breakpoints = [];
212
+ let runtimePath;
213
+ let scriptArgs;
214
+ let stopOnEntry = false;
215
+ let i = 2;
216
+ while (i < args.length) {
217
+ if ((args[i] === "--break" || args[i] === "-b") && i + 1 < args.length) {
218
+ breakpoints.push(args[i + 1]);
219
+ i += 2;
220
+ }
221
+ else if ((args[i] === "--runtime" || args[i] === "--python") && i + 1 < args.length) {
222
+ runtimePath = args[i + 1];
223
+ i += 2;
224
+ }
225
+ else if (args[i] === "--stop-on-entry") {
226
+ stopOnEntry = true;
227
+ i += 1;
228
+ }
229
+ else if (args[i] === "--args") {
230
+ scriptArgs = args.slice(i + 1);
231
+ break;
232
+ }
233
+ else {
234
+ // Treat as breakpoint if it looks like file:line
235
+ const val = args[i];
236
+ if (val.includes(":") && /:\d+/.test(val)) {
237
+ breakpoints.push(val);
238
+ }
239
+ i += 1;
240
+ }
241
+ }
242
+ const cmd = {
243
+ action: "start",
244
+ script: pathResolve(script),
245
+ breakpoints,
246
+ stop_on_entry: stopOnEntry,
247
+ };
248
+ if (runtimePath)
249
+ cmd.runtime = pathResolve(runtimePath);
250
+ if (scriptArgs)
251
+ cmd.args = scriptArgs;
252
+ result = await sendCommand(cmd);
253
+ break;
254
+ }
255
+ case "vars":
256
+ result = await sendCommand({ action: "vars" });
257
+ break;
258
+ case "eval": {
259
+ const expr = args.slice(1).join(" ");
260
+ if (!expr) {
261
+ process.stderr.write("Error: missing expression. Usage: agent-debugger eval <expression>\n");
262
+ process.exit(1);
263
+ }
264
+ result = await sendCommand({ action: "eval", expression: expr });
265
+ break;
266
+ }
267
+ case "step":
268
+ result = await sendCommand({ action: "step", kind: args[1] || "over" });
269
+ break;
270
+ case "continue":
271
+ case "cont":
272
+ case "c":
273
+ result = await sendCommand({ action: "continue" });
274
+ break;
275
+ case "stack":
276
+ result = await sendCommand({ action: "stack" });
277
+ break;
278
+ case "break":
279
+ case "bp": {
280
+ if (args.length < 2) {
281
+ process.stderr.write("Error: missing location. Usage: agent-debugger break <file:line[:condition]>\n");
282
+ process.exit(1);
283
+ }
284
+ const parts = args[1].split(":");
285
+ if (parts.length < 2) {
286
+ process.stderr.write("Error: invalid breakpoint format. Use file:line or file:line:condition\n");
287
+ process.exit(1);
288
+ }
289
+ const cmd = {
290
+ action: "break",
291
+ file: parts[0],
292
+ line: parseInt(parts[1], 10),
293
+ };
294
+ if (parts.length > 2)
295
+ cmd.condition = parts.slice(2).join(":");
296
+ result = await sendCommand(cmd);
297
+ break;
298
+ }
299
+ case "source": {
300
+ const cmd = { action: "source" };
301
+ if (args.length > 1)
302
+ cmd.file = args[1];
303
+ if (args.length > 2)
304
+ cmd.line = parseInt(args[2], 10);
305
+ result = await sendCommand(cmd);
306
+ break;
307
+ }
308
+ case "status":
309
+ result = await sendCommand({ action: "status" });
310
+ break;
311
+ case "close":
312
+ result = await sendCommand({ action: "close" });
313
+ break;
314
+ default:
315
+ process.stderr.write(`Unknown command: ${command}. Run 'agent-debugger --help' for usage.\n`);
316
+ process.exit(1);
317
+ }
318
+ console.log(formatResult(result));
319
+ if (result.error)
320
+ process.exit(1);
321
+ }
322
+ main().catch((err) => {
323
+ process.stderr.write(`Error: ${err.message}\n`);
324
+ process.exit(1);
325
+ });
326
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ /** Background daemon — holds the DAP session, accepts CLI commands via Unix socket. */
2
+ export {};
3
+ //# sourceMappingURL=daemon.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"daemon.d.ts","sourceRoot":"","sources":["../../src/daemon.ts"],"names":[],"mappings":"AAAA,uFAAuF"}
@@ -0,0 +1,136 @@
1
+ /** Background daemon — holds the DAP session, accepts CLI commands via Unix socket. */
2
+ import { createServer } from "node:net";
3
+ import { mkdirSync, writeFileSync, unlinkSync, existsSync } from "node:fs";
4
+ import { SESSION_DIR, SOCKET_PATH, PID_FILE } from "./util/paths.js";
5
+ import { Session } from "./session.js";
6
+ import { Command } from "./protocol.js";
7
+ class Daemon {
8
+ session = new Session();
9
+ server = null;
10
+ isShuttingDown = false;
11
+ start() {
12
+ mkdirSync(SESSION_DIR, { recursive: true });
13
+ // Clean stale socket
14
+ if (existsSync(SOCKET_PATH)) {
15
+ unlinkSync(SOCKET_PATH);
16
+ }
17
+ // Write PID
18
+ writeFileSync(PID_FILE, String(process.pid));
19
+ // Create Unix socket server
20
+ this.server = createServer((conn) => { this.handleConnection(conn); });
21
+ this.server.listen(SOCKET_PATH);
22
+ // Graceful shutdown
23
+ const shutdown = (signal) => {
24
+ if (this.isShuttingDown)
25
+ return;
26
+ this.isShuttingDown = true;
27
+ process.stderr.write(`Daemon received ${signal}, shutting down...\n`);
28
+ this.cleanup();
29
+ };
30
+ process.on("SIGTERM", () => {
31
+ shutdown("SIGTERM");
32
+ // Force exit after 5s if cleanup hangs
33
+ setTimeout(() => process.exit(1), 5_000).unref();
34
+ });
35
+ process.on("SIGINT", () => {
36
+ shutdown("SIGINT");
37
+ setTimeout(() => process.exit(1), 5_000).unref();
38
+ });
39
+ process.on("uncaughtException", (err) => {
40
+ process.stderr.write(`Daemon uncaught exception: ${err.message}\n`);
41
+ shutdown("uncaughtException");
42
+ });
43
+ }
44
+ handleConnection(conn) {
45
+ let data = "";
46
+ let processed = false;
47
+ conn.on("data", (chunk) => {
48
+ if (processed)
49
+ return;
50
+ data += chunk.toString();
51
+ // Try to parse as JSON (newline-delimited or complete)
52
+ const nlIdx = data.indexOf("\n");
53
+ const toParse = nlIdx !== -1 ? data.substring(0, nlIdx) : data;
54
+ try {
55
+ const cmd = JSON.parse(toParse);
56
+ processed = true;
57
+ this.processCommand(cmd, conn);
58
+ }
59
+ catch {
60
+ // Wait for more data
61
+ }
62
+ });
63
+ conn.on("end", () => {
64
+ if (!processed && data.trim()) {
65
+ try {
66
+ const cmd = JSON.parse(data.trim());
67
+ processed = true;
68
+ this.processCommand(cmd, conn);
69
+ }
70
+ catch {
71
+ this.sendResponse(conn, { error: "Invalid JSON" });
72
+ }
73
+ }
74
+ });
75
+ conn.on("error", () => {
76
+ // Client disconnected
77
+ });
78
+ }
79
+ async processCommand(rawCmd, conn) {
80
+ try {
81
+ const parsed = Command.safeParse(rawCmd);
82
+ if (!parsed.success) {
83
+ this.sendResponse(conn, { error: `Invalid command: ${parsed.error.message}` });
84
+ return;
85
+ }
86
+ const cmd = parsed.data;
87
+ // Special handling for status command (needs async location)
88
+ let result;
89
+ if (cmd.action === "status") {
90
+ result = await this.session.getStatusAsync();
91
+ }
92
+ else {
93
+ result = await this.session.handleCommand(cmd);
94
+ }
95
+ this.sendResponse(conn, result);
96
+ // Self-terminate on close
97
+ if (cmd.action === "close") {
98
+ setTimeout(() => this.cleanup(), 100);
99
+ }
100
+ }
101
+ catch (err) {
102
+ this.sendResponse(conn, { error: err.message });
103
+ }
104
+ }
105
+ sendResponse(conn, result) {
106
+ try {
107
+ conn.write(JSON.stringify(result) + "\n");
108
+ conn.end();
109
+ }
110
+ catch {
111
+ // Client may have disconnected
112
+ }
113
+ }
114
+ cleanup() {
115
+ this.session.close().catch(() => { });
116
+ if (this.server) {
117
+ this.server.close();
118
+ this.server = null;
119
+ }
120
+ try {
121
+ if (existsSync(SOCKET_PATH))
122
+ unlinkSync(SOCKET_PATH);
123
+ }
124
+ catch { /* ignore */ }
125
+ try {
126
+ if (existsSync(PID_FILE))
127
+ unlinkSync(PID_FILE);
128
+ }
129
+ catch { /* ignore */ }
130
+ process.exitCode = 0;
131
+ }
132
+ }
133
+ // Entry point when run as a separate process
134
+ const daemon = new Daemon();
135
+ daemon.start();
136
+ //# sourceMappingURL=daemon.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"daemon.js","sourceRoot":"","sources":["../../src/daemon.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ /** DAP (Debug Adapter Protocol) client over TCP.*/
2
+ import { EventEmitter } from "node:events";
3
+ import type { DAPResponse, DAPEvent } from "./dap-types.js";
4
+ export declare class DAPClient extends EventEmitter {
5
+ private sock;
6
+ private seq;
7
+ private pending;
8
+ /** Deferred promises for requestAsync — survives dispatch resolution. */
9
+ private asyncResponses;
10
+ private eventQueue;
11
+ private buffer;
12
+ private capabilities;
13
+ /** Connect to a DAP server with retry loop. */
14
+ connect(host: string, port: number, timeout?: number): Promise<void>;
15
+ private tryConnect;
16
+ private setupSocket;
17
+ private processBuffer;
18
+ private dispatch;
19
+ private send;
20
+ /** Send a request and wait for the response. */
21
+ request(command: string, args?: Record<string, unknown>, timeout?: number): Promise<DAPResponse>;
22
+ /** Send a request without waiting. Returns the seq for later retrieval via waitForResponse. */
23
+ requestAsync(command: string, args?: Record<string, unknown>): number;
24
+ /** Wait for response to a previously sent async request. */
25
+ waitForResponse(seq: number, timeout?: number): Promise<DAPResponse>;
26
+ /** Wait for a specific DAP event. */
27
+ waitForEvent(eventName: string, timeout?: number): Promise<DAPEvent | null>;
28
+ /** Drain all events of a given type from the queue. */
29
+ drainEvents(eventName?: string): DAPEvent[];
30
+ getCapabilities(): Record<string, unknown>;
31
+ /** Disconnect from the DAP server. */
32
+ disconnect(terminate?: boolean): Promise<void>;
33
+ close(): Promise<void>;
34
+ }
35
+ //# sourceMappingURL=dap-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dap-client.d.ts","sourceRoot":"","sources":["../../src/dap-client.ts"],"names":[],"mappings":"AAAA,mDAAmD;AAGnD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAQ5D,qBAAa,SAAU,SAAQ,YAAY;IACzC,OAAO,CAAC,IAAI,CAAuB;IACnC,OAAO,CAAC,GAAG,CAAK;IAChB,OAAO,CAAC,OAAO,CAAqC;IACpD,yEAAyE;IACzE,OAAO,CAAC,cAAc,CAA4C;IAClE,OAAO,CAAC,UAAU,CAAkB;IACpC,OAAO,CAAC,MAAM,CAAmB;IACjC,OAAO,CAAC,YAAY,CAA+B;IAEnD,+CAA+C;IACzC,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,SAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAgBzE,OAAO,CAAC,UAAU;IAyBlB,OAAO,CAAC,WAAW;IA4BnB,OAAO,CAAC,aAAa;IA0BrB,OAAO,CAAC,QAAQ;IA2BhB,OAAO,CAAC,IAAI;IAOZ,gDAAgD;IAChD,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,SAAQ,GAAG,OAAO,CAAC,WAAW,CAAC;IAkB/F,+FAA+F;IAC/F,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM;IAcrE,4DAA4D;IACtD,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,SAAQ,GAAG,OAAO,CAAC,WAAW,CAAC;IAmBzE,qCAAqC;IACrC,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,SAAQ,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;IA0B1E,uDAAuD;IACvD,WAAW,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,QAAQ,EAAE;IAW3C,eAAe,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAI1C,sCAAsC;IAChC,UAAU,CAAC,SAAS,UAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAkB3C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAG7B"}