@mastra/browser-viewer 0.2.1 → 0.2.2-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.cts CHANGED
@@ -1,11 +1,7 @@
1
- import { BrowserConfigBase, ThreadManager, ThreadManagerConfig, ThreadSession, MastraBrowser, BrowserState, ScreencastOptions, ScreencastStream, MouseEventParams, KeyboardEventParams } from '@mastra/core/browser';
2
- import { Tool } from '@mastra/core/tools';
3
- import { Browser, Page, CDPSession, BrowserContext, BrowserServer } from 'playwright-core';
4
-
5
- /**
6
- * Types for @mastra/browser-viewer
7
- */
8
-
1
+ import { BrowserConfigBase, BrowserState, KeyboardEventParams, MastraBrowser, MouseEventParams, ScreencastOptions, ScreencastStream, ThreadManager, ThreadManagerConfig, ThreadSession } from "@mastra/core/browser";
2
+ import { Tool } from "@mastra/core/tools";
3
+ import { Browser, BrowserContext, BrowserServer, CDPSession, Page } from "playwright-core";
4
+ //#region src/types.d.ts
9
5
  /**
10
6
  * Supported CLI providers that can be used with BrowserViewer.
11
7
  */
@@ -14,55 +10,49 @@ type CLIProvider = 'agent-browser' | 'browser-use' | 'browse' | 'browse-cli';
14
10
  * Configuration for BrowserViewer.
15
11
  */
16
12
  interface BrowserViewerConfig extends BrowserConfigBase {
17
- /**
18
- * Which CLI the agent will use for browser automation.
19
- * The CLI connects to Mastra's Chrome via the CDP URL.
20
- */
21
- cli: CLIProvider;
22
- /**
23
- * Port for Chrome's remote debugging protocol.
24
- * Only used when launching Chrome (not when connecting via cdpUrl).
25
- *
26
- * @default 0 (auto-assign available port)
27
- */
28
- cdpPort?: number;
13
+ /**
14
+ * Which CLI the agent will use for browser automation.
15
+ * The CLI connects to Mastra's Chrome via the CDP URL.
16
+ */
17
+ cli: CLIProvider;
18
+ /**
19
+ * Port for Chrome's remote debugging protocol.
20
+ * Only used when launching Chrome (not when connecting via cdpUrl).
21
+ *
22
+ * @default 0 (auto-assign available port)
23
+ */
24
+ cdpPort?: number;
29
25
  }
30
-
31
- /**
32
- * BrowserViewerThreadManager - Thread scope management for BrowserViewer
33
- *
34
- * Manages thread-scoped browser sessions using Playwright to launch
35
- * separate Chrome instances per thread.
36
- */
37
-
26
+ //#endregion
27
+ //#region src/thread-manager.d.ts
38
28
  /**
39
29
  * Extended session info for BrowserViewer.
40
30
  */
41
31
  interface BrowserViewerSession extends ThreadSession {
42
- /**
43
- * Playwright browser server (owns the Chrome process).
44
- * Null for external CDP connections where we don't own the browser process.
45
- */
46
- browserServer: BrowserServer | null;
47
- /** Playwright browser instance (connected to server) */
48
- browser: Browser;
49
- /** Browser context */
50
- context: BrowserContext;
51
- /** CDP session for the active page */
52
- cdpSession: CDPSession | null;
53
- /** CDP WebSocket URL (null if discovery failed) */
54
- cdpUrl: string | null;
32
+ /**
33
+ * Playwright browser server (owns the Chrome process).
34
+ * Null for external CDP connections where we don't own the browser process.
35
+ */
36
+ browserServer: BrowserServer | null;
37
+ /** Playwright browser instance (connected to server) */
38
+ browser: Browser;
39
+ /** Browser context */
40
+ context: BrowserContext;
41
+ /** CDP session for the active page */
42
+ cdpSession: CDPSession | null;
43
+ /** CDP WebSocket URL (null if discovery failed) */
44
+ cdpUrl: string | null;
55
45
  }
56
46
  /**
57
47
  * Configuration for BrowserViewerThreadManager.
58
48
  */
59
49
  interface BrowserViewerThreadManagerConfig extends ThreadManagerConfig {
60
- /** Browser configuration */
61
- browserConfig: BrowserViewerConfig;
62
- /** Callback when a browser is created for a thread */
63
- onBrowserCreated?: (browser: Browser, threadId: string, cdpUrl: string | null) => void;
64
- /** Callback when a browser is closed for a thread */
65
- onBrowserClosed?: (threadId: string) => void;
50
+ /** Browser configuration */
51
+ browserConfig: BrowserViewerConfig;
52
+ /** Callback when a browser is created for a thread */
53
+ onBrowserCreated?: (browser: Browser, threadId: string, cdpUrl: string | null) => void;
54
+ /** Callback when a browser is closed for a thread */
55
+ onBrowserClosed?: (threadId: string) => void;
66
56
  }
67
57
  /**
68
58
  * Thread manager implementation for BrowserViewer.
@@ -72,175 +62,163 @@ interface BrowserViewerThreadManagerConfig extends ThreadManagerConfig {
72
62
  * - 'thread': Each thread gets a dedicated Chrome instance
73
63
  */
74
64
  declare class BrowserViewerThreadManager extends ThreadManager<Browser> {
75
- private readonly browserConfig;
76
- private readonly onBrowserCreated?;
77
- private readonly onBrowserClosed?;
78
- /** Map of thread ID to session info (for 'thread' scope) */
79
- private readonly threadSessions;
80
- /** Shared session info (for 'shared' scope) */
81
- private sharedSession;
82
- /** Cached CDP sessions for input injection, keyed by threadId */
83
- private inputCdpSessions;
84
- constructor(config: BrowserViewerThreadManagerConfig);
85
- /**
86
- * Check if a thread should use the shared session slot.
87
- * In shared scope, all threads use the shared session.
88
- * In thread scope, DEFAULT_THREAD_ID also uses the shared session.
89
- */
90
- private usesSharedSlot;
91
- /**
92
- * Get the viewer session for a thread, using consistent routing.
93
- * Handles both shared and thread-scoped sessions.
94
- */
95
- private getViewerSession;
96
- /**
97
- * Store a session in the appropriate slot based on scope.
98
- * Consolidates session storage logic used by createSession, createSharedSession,
99
- * createSharedSessionFromCdp, and connectToExternalCdp.
100
- */
101
- private storeSession;
102
- /**
103
- * Clear a session from the appropriate slot based on scope.
104
- * Must be called BEFORE async cleanup operations to prevent double callbacks
105
- * from disconnect handlers.
106
- */
107
- private clearSessionState;
108
- /**
109
- * Clean up a session's resources (CDP session, browser, server).
110
- * Consolidates cleanup logic used by closeThreadBrowser, closeSharedBrowser,
111
- * and doDestroySession.
112
- *
113
- * @param session - The session to clean up
114
- * @param threadId - The thread ID (for onBrowserClosed callback)
115
- */
116
- private cleanupSession;
117
- /**
118
- * Launch a new browser instance and return the components.
119
- * Consolidates the launch logic shared by createSession and createSharedSession.
120
- *
121
- * @param threadId - Thread ID for logging and disconnect handler
122
- */
123
- private launchBrowser;
124
- /**
125
- * Get CDP URL for a specific thread.
126
- */
127
- getCdpUrlForThread(threadId?: string): string | null;
128
- /**
129
- * Get the active page for a thread.
130
- */
131
- getActivePageForThread(threadId?: string): Promise<Page | null>;
132
- /**
133
- * Resolve the active page from a browser context.
134
- * Uses last page (most recently opened) with fallback to first page.
135
- */
136
- private resolveActivePage;
137
- /**
138
- * Get or create a CDP session for the active page in a thread.
139
- *
140
- * CDP sessions are page-scoped, so we create a fresh one for the currently active page
141
- * rather than caching one that may point to a closed or inactive page.
142
- */
143
- getCdpSessionForThread(threadId?: string): Promise<CDPSession | null>;
144
- /**
145
- * Get the browser context for a thread.
146
- */
147
- getContextForThread(threadId?: string): BrowserContext | null;
148
- /**
149
- * Create a fresh CDP session for the active page (not cached).
150
- * Used by screencast which needs fresh sessions on tab switches.
151
- */
152
- createFreshCdpSession(threadId?: string): Promise<CDPSession | null>;
153
- /**
154
- * Create a new session for a thread.
155
- */
156
- protected createSession(threadId: string): Promise<BrowserViewerSession>;
157
- /**
158
- * Discover the actual CDP WebSocket URL from Chrome's DevToolsActivePort file.
159
- *
160
- * Playwright's BrowserServer exposes _userDataDirForTest which points to Chrome's
161
- * user data directory. Chrome writes a DevToolsActivePort file there containing:
162
- * Line 1: The debugging port number
163
- * Line 2: The browser WebSocket path (e.g., /devtools/browser/<guid>)
164
- *
165
- * This gives us the real CDP URL that external tools like agent-browser can connect to.
166
- * Returns null if discovery fails - callers should handle this case.
167
- */
168
- private discoverCdpUrl;
169
- /**
170
- * Create a shared session by connecting to an existing browser via CDP URL.
171
- * Used when BrowserViewer is configured with a cdpUrl to connect to an external browser.
172
- */
173
- createSharedSessionFromCdp(cdpUrl: string): Promise<void>;
174
- /**
175
- * Create a shared session (for 'shared' scope).
176
- */
177
- createSharedSession(): Promise<void>;
178
- /**
179
- * Handle browser disconnection for a thread.
180
- */
181
- private handleBrowserDisconnected;
182
- /**
183
- * Connect to an external browser via CDP URL for screencast.
184
- *
185
- * This is used when an agent is using their own external CDP (e.g., browser-use cloud).
186
- * We connect Playwright to the external browser to enable screencast without launching
187
- * our own browser.
188
- *
189
- * @param cdpUrl - The external CDP WebSocket URL (wss://... or ws://...)
190
- * @param threadId - Thread ID to associate the session with
191
- */
192
- connectToExternalCdp(cdpUrl: string, threadId: string): Promise<BrowserViewerSession>;
193
- /**
194
- * Connect to a browser via CDP URL and create a session.
195
- * Shared implementation for createSharedSessionFromCdp and connectToExternalCdp.
196
- */
197
- private connectToCdp;
198
- /**
199
- * Close a specific thread's browser.
200
- */
201
- closeThreadBrowser(threadId: string): Promise<void>;
202
- /**
203
- * Close the shared browser.
204
- */
205
- closeSharedBrowser(): Promise<void>;
206
- /**
207
- * Close all browsers.
208
- */
209
- closeAll(): Promise<void>;
210
- /**
211
- * Get the manager for a session.
212
- * Required by base class.
213
- */
214
- protected getManagerForSession(session: ThreadSession): Browser;
215
- /**
216
- * Get the shared manager.
217
- * Required by base class.
218
- */
219
- protected getSharedManager(): Browser;
220
- /**
221
- * Destroy a session and clean up resources.
222
- * Required by base class.
223
- */
224
- protected doDestroySession(session: ThreadSession): Promise<void>;
225
- /**
226
- * Check if browser is running for a thread.
227
- */
228
- isBrowserRunning(threadId?: string): boolean;
65
+ private readonly browserConfig;
66
+ private readonly onBrowserCreated?;
67
+ private readonly onBrowserClosed?;
68
+ /** Map of thread ID to session info (for 'thread' scope) */
69
+ private readonly threadSessions;
70
+ /** Shared session info (for 'shared' scope) */
71
+ private sharedSession;
72
+ /** Cached CDP sessions for input injection, keyed by threadId */
73
+ private inputCdpSessions;
74
+ constructor(config: BrowserViewerThreadManagerConfig);
75
+ /**
76
+ * Check if a thread should use the shared session slot.
77
+ * In shared scope, all threads use the shared session.
78
+ * In thread scope, DEFAULT_THREAD_ID also uses the shared session.
79
+ */
80
+ private usesSharedSlot;
81
+ /**
82
+ * Get the viewer session for a thread, using consistent routing.
83
+ * Handles both shared and thread-scoped sessions.
84
+ */
85
+ private getViewerSession;
86
+ /**
87
+ * Store a session in the appropriate slot based on scope.
88
+ * Consolidates session storage logic used by createSession, createSharedSession,
89
+ * createSharedSessionFromCdp, and connectToExternalCdp.
90
+ */
91
+ private storeSession;
92
+ /**
93
+ * Clear a session from the appropriate slot based on scope.
94
+ * Must be called BEFORE async cleanup operations to prevent double callbacks
95
+ * from disconnect handlers.
96
+ */
97
+ private clearSessionState;
98
+ /**
99
+ * Clean up a session's resources (CDP session, browser, server).
100
+ * Consolidates cleanup logic used by closeThreadBrowser, closeSharedBrowser,
101
+ * and doDestroySession.
102
+ *
103
+ * @param session - The session to clean up
104
+ * @param threadId - The thread ID (for onBrowserClosed callback)
105
+ */
106
+ private cleanupSession;
107
+ /**
108
+ * Launch a new browser instance and return the components.
109
+ * Consolidates the launch logic shared by createSession and createSharedSession.
110
+ *
111
+ * @param threadId - Thread ID for logging and disconnect handler
112
+ */
113
+ private launchBrowser;
114
+ /**
115
+ * Get CDP URL for a specific thread.
116
+ */
117
+ getCdpUrlForThread(threadId?: string): string | null;
118
+ /**
119
+ * Get the active page for a thread.
120
+ */
121
+ getActivePageForThread(threadId?: string): Promise<Page | null>;
122
+ /**
123
+ * Resolve the active page from a browser context.
124
+ * Uses last page (most recently opened) with fallback to first page.
125
+ */
126
+ private resolveActivePage;
127
+ /**
128
+ * Get or create a CDP session for the active page in a thread.
129
+ *
130
+ * CDP sessions are page-scoped, so we create a fresh one for the currently active page
131
+ * rather than caching one that may point to a closed or inactive page.
132
+ */
133
+ getCdpSessionForThread(threadId?: string): Promise<CDPSession | null>;
134
+ /**
135
+ * Get the browser context for a thread.
136
+ */
137
+ getContextForThread(threadId?: string): BrowserContext | null;
138
+ /**
139
+ * Create a fresh CDP session for the active page (not cached).
140
+ * Used by screencast which needs fresh sessions on tab switches.
141
+ */
142
+ createFreshCdpSession(threadId?: string): Promise<CDPSession | null>;
143
+ /**
144
+ * Create a new session for a thread.
145
+ */
146
+ protected createSession(threadId: string): Promise<BrowserViewerSession>;
147
+ /**
148
+ * Discover the actual CDP WebSocket URL from Chrome's DevToolsActivePort file.
149
+ *
150
+ * Playwright's BrowserServer exposes _userDataDirForTest which points to Chrome's
151
+ * user data directory. Chrome writes a DevToolsActivePort file there containing:
152
+ * Line 1: The debugging port number
153
+ * Line 2: The browser WebSocket path (e.g., /devtools/browser/<guid>)
154
+ *
155
+ * This gives us the real CDP URL that external tools like agent-browser can connect to.
156
+ * Returns null if discovery fails - callers should handle this case.
157
+ */
158
+ private discoverCdpUrl;
159
+ /**
160
+ * Create a shared session by connecting to an existing browser via CDP URL.
161
+ * Used when BrowserViewer is configured with a cdpUrl to connect to an external browser.
162
+ */
163
+ createSharedSessionFromCdp(cdpUrl: string): Promise<void>;
164
+ /**
165
+ * Create a shared session (for 'shared' scope).
166
+ */
167
+ createSharedSession(): Promise<void>;
168
+ /**
169
+ * Handle browser disconnection for a thread.
170
+ */
171
+ private handleBrowserDisconnected;
172
+ /**
173
+ * Connect to an external browser via CDP URL for screencast.
174
+ *
175
+ * This is used when an agent is using their own external CDP (e.g., browser-use cloud).
176
+ * We connect Playwright to the external browser to enable screencast without launching
177
+ * our own browser.
178
+ *
179
+ * @param cdpUrl - The external CDP WebSocket URL (wss://... or ws://...)
180
+ * @param threadId - Thread ID to associate the session with
181
+ */
182
+ connectToExternalCdp(cdpUrl: string, threadId: string): Promise<BrowserViewerSession>;
183
+ /**
184
+ * Connect to a browser via CDP URL and create a session.
185
+ * Shared implementation for createSharedSessionFromCdp and connectToExternalCdp.
186
+ */
187
+ private connectToCdp;
188
+ /**
189
+ * Close a specific thread's browser.
190
+ */
191
+ closeThreadBrowser(threadId: string): Promise<void>;
192
+ /**
193
+ * Close the shared browser.
194
+ */
195
+ closeSharedBrowser(): Promise<void>;
196
+ /**
197
+ * Close all browsers.
198
+ */
199
+ closeAll(): Promise<void>;
200
+ /**
201
+ * Get the manager for a session.
202
+ * Required by base class.
203
+ */
204
+ protected getManagerForSession(session: ThreadSession): Browser;
205
+ /**
206
+ * Get the shared manager.
207
+ * Required by base class.
208
+ */
209
+ protected getSharedManager(): Browser;
210
+ /**
211
+ * Destroy a session and clean up resources.
212
+ * Required by base class.
213
+ */
214
+ protected doDestroySession(session: ThreadSession): Promise<void>;
215
+ /**
216
+ * Check if browser is running for a thread.
217
+ */
218
+ isBrowserRunning(threadId?: string): boolean;
229
219
  }
230
-
231
- /**
232
- * BrowserViewer - Playwright-managed Chrome for CLI providers
233
- *
234
- * Launches Chrome via Playwright and exposes the CDP URL for CLI tools
235
- * (agent-browser, browser-use, and browse) to connect as secondary clients.
236
- *
237
- * This gives us:
238
- * - Direct page-level CDP sessions (fixes screencast sessionId issues)
239
- * - Full browser lifecycle control
240
- * - Predictable CDP URL for CLI injection
241
- * - Thread-scoped browser isolation
242
- */
243
-
220
+ //#endregion
221
+ //#region src/browser-viewer.d.ts
244
222
  /**
245
223
  * BrowserViewer - CLI provider with Playwright-managed Chrome
246
224
  *
@@ -262,69 +240,70 @@ declare class BrowserViewerThreadManager extends ThreadManager<Browser> {
262
240
  * ```
263
241
  */
264
242
  declare class BrowserViewer extends MastraBrowser {
265
- readonly id: string;
266
- readonly name = "BrowserViewer";
267
- readonly provider = "browser-viewer";
268
- readonly providerType: "cli";
269
- /** Which CLI the agent uses */
270
- readonly cli: CLIProvider;
271
- /** Viewer-specific config (stored for reference) */
272
- readonly viewerConfig: BrowserViewerConfig;
273
- /** Thread manager for browser sessions */
274
- protected threadManager: BrowserViewerThreadManager;
275
- constructor(config: BrowserViewerConfig);
276
- /**
277
- * Get the CDP WebSocket URL for CLI tools to connect.
278
- * For thread scope, returns the CDP URL for the specified thread.
279
- * For shared scope, returns the single shared CDP URL.
280
- *
281
- * @param threadId - Thread identifier (optional, uses current thread if not specified)
282
- * @returns CDP URL or null if browser not running for that thread
283
- */
284
- getCdpUrl(threadId?: string): string | null;
285
- protected doLaunch(): Promise<void>;
286
- protected doClose(): Promise<void>;
287
- /**
288
- * Connect to an existing browser via CDP URL.
289
- */
290
- private connectToExisting;
291
- /**
292
- * Ensure browser is ready for the current thread.
293
- * For thread scope, creates a new browser if needed.
294
- */
295
- ensureReady(): Promise<void>;
296
- /**
297
- * Check if browser is running (for current thread in thread scope).
298
- */
299
- isBrowserRunning(threadId?: string): boolean;
300
- /**
301
- * Launch browser, optionally for a specific thread.
302
- * For thread scope, creates a browser for that thread.
303
- * For shared scope, launches the single shared browser.
304
- */
305
- launch(threadId?: string): Promise<void>;
306
- /**
307
- * Handle browser disconnection.
308
- * Overrides base class method.
309
- */
310
- handleBrowserDisconnected(): void;
311
- /**
312
- * Connect to an external browser via CDP URL for screencast.
313
- *
314
- * Use this when an agent is using their own external CDP (e.g., browser-use cloud).
315
- * Connects Playwright to the external browser to enable screencast without launching
316
- * our own browser.
317
- *
318
- * @param cdpUrl - The external CDP WebSocket URL (wss://... or ws://...)
319
- * @param threadId - Thread ID to associate the session with
320
- */
321
- connectToExternalCdp(cdpUrl: string, threadId?: string): Promise<void>;
322
- protected getActivePage(threadId?: string): Promise<Page | null>;
323
- protected getBrowserStateForThread(threadId?: string): BrowserState | null;
324
- startScreencast(options?: ScreencastOptions): Promise<ScreencastStream>;
325
- injectMouseEvent(params: MouseEventParams, threadId?: string): Promise<void>;
326
- injectKeyboardEvent(params: KeyboardEventParams, threadId?: string): Promise<void>;
327
- getTools(): Record<string, Tool>;
243
+ readonly id: string;
244
+ readonly name = "BrowserViewer";
245
+ readonly provider = "browser-viewer";
246
+ readonly providerType: "cli";
247
+ /** Which CLI the agent uses */
248
+ readonly cli: CLIProvider;
249
+ /** Viewer-specific config (stored for reference) */
250
+ readonly viewerConfig: BrowserViewerConfig;
251
+ /** Thread manager for browser sessions */
252
+ protected threadManager: BrowserViewerThreadManager;
253
+ constructor(config: BrowserViewerConfig);
254
+ /**
255
+ * Get the CDP WebSocket URL for CLI tools to connect.
256
+ * For thread scope, returns the CDP URL for the specified thread.
257
+ * For shared scope, returns the single shared CDP URL.
258
+ *
259
+ * @param threadId - Thread identifier (optional, uses current thread if not specified)
260
+ * @returns CDP URL or null if browser not running for that thread
261
+ */
262
+ getCdpUrl(threadId?: string): string | null;
263
+ protected doLaunch(): Promise<void>;
264
+ protected doClose(): Promise<void>;
265
+ /**
266
+ * Connect to an existing browser via CDP URL.
267
+ */
268
+ private connectToExisting;
269
+ /**
270
+ * Ensure browser is ready for the current thread.
271
+ * For thread scope, creates a new browser if needed.
272
+ */
273
+ ensureReady(): Promise<void>;
274
+ /**
275
+ * Check if browser is running (for current thread in thread scope).
276
+ */
277
+ isBrowserRunning(threadId?: string): boolean;
278
+ /**
279
+ * Launch browser, optionally for a specific thread.
280
+ * For thread scope, creates a browser for that thread.
281
+ * For shared scope, launches the single shared browser.
282
+ */
283
+ launch(threadId?: string): Promise<void>;
284
+ /**
285
+ * Handle browser disconnection.
286
+ * Overrides base class method.
287
+ */
288
+ handleBrowserDisconnected(): void;
289
+ /**
290
+ * Connect to an external browser via CDP URL for screencast.
291
+ *
292
+ * Use this when an agent is using their own external CDP (e.g., browser-use cloud).
293
+ * Connects Playwright to the external browser to enable screencast without launching
294
+ * our own browser.
295
+ *
296
+ * @param cdpUrl - The external CDP WebSocket URL (wss://... or ws://...)
297
+ * @param threadId - Thread ID to associate the session with
298
+ */
299
+ connectToExternalCdp(cdpUrl: string, threadId?: string): Promise<void>;
300
+ protected getActivePage(threadId?: string): Promise<Page | null>;
301
+ protected getBrowserStateForThread(threadId?: string): BrowserState | null;
302
+ startScreencast(options?: ScreencastOptions): Promise<ScreencastStream>;
303
+ injectMouseEvent(params: MouseEventParams, threadId?: string): Promise<void>;
304
+ injectKeyboardEvent(params: KeyboardEventParams, threadId?: string): Promise<void>;
305
+ getTools(): Record<string, Tool>;
328
306
  }
329
-
307
+ //#endregion
330
308
  export { BrowserViewer, type BrowserViewerConfig, BrowserViewerThreadManager, type BrowserViewerThreadManagerConfig, type CLIProvider };
309
+ //# sourceMappingURL=index.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.cts","names":[],"sources":["../src/types.ts","../src/thread-manager.ts","../src/browser-viewer.ts"],"mappings":";;;;;;;KASY;;;;UAKK,4BAA4B;;;;;EAK3C,KAAK;;;;;;;EAQL;;;;;;;UCRQ,6BAA6B;;;;;EAKrC,eAAe;;EAEf,SAAS;;EAET,SAAS;;EAET,YAAY;;EAEZ;;;;;UAMe,yCAAyC;;EAExD,eAAe;;EAEf,oBAAoB,SAAS,SAAS,kBAAkB;;EAExD,mBAAmB;;;;;;;;;cAUR,mCAAmC,cAAc;mBAC3C;mBACA;mBACA;;mBAGA;;UAGT;;UAGA;EAEI,YAAA,QAAQ;;;;;;UAYZ;;;;;UAQA;;;;;;UAgBA;;;;;;UAiBA;;;;;;;;;UAoBM;;;;;;;UAwCA;;;;EAiHd,mBAAmB;;;;EAQb,uBAAuB,oBAAoB,QAAQ;;;;;UAejD;;;;;;;EAWF,uBAAuB,oBAAoB,QAAQ;;;;EA8CzD,oBAAoB,oBAAoB;;;;;EASlC,sBAAsB,oBAAoB,QAAQ;;;;YAuBxC,cAAc,mBAAmB,QAAQ;;;;;;;;;;;;UAqCjD;;;;;EA8CF,2BAA2B,iBAAiB;;;;EAU5C,uBAAuB;;;;UA8BrB;;;;;;;;;;;EAqBF,qBAAqB,gBAAgB,mBAAmB,QAAQ;;;;;UAiBxD;;;;EAqER,mBAAmB,mBAAmB;;;;EAWtC,sBAAsB;;;;EAUtB,YAAY;;;;;YAaR,qBAAqB,SAAS,gBAAgB;;;;;YAS9C,oBAAoB;;;;;YAWd,iBAAiB,SAAS,gBAAgB;;;;EAW1D,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;cC7oBN,sBAAsB;WACf;WACA;WACA;WACT;;WAGA,KAAK;;WAGL,cAAc;;YAGL,eAAe;EAErB,YAAA,QAAQ;;;;;;;;;EAkDX,UAAU;YAQM,YAAY;YAeZ,WAAW;;;;UAOtB;;;;;EAaC,eAAe;;;;EAerB,iBAAiB;;;;;;EASX,OAAO,oBAAoB;;;;;EAwBjC;;;;;;;;;;;EAeM,qBAAqB,gBAAgB,oBAAoB;YAW/C,cAAc,oBAAoB,QAAQ;YAIhD,yBAAyB,oBAAoB;EAyBjD,gBAAgB,UAAU,oBAAoB,QAAQ;EA6GtD,iBAAiB,QAAQ,kBAAkB,oBAAoB;EAS/D,oBAAoB,QAAQ,qBAAqB,oBAAoB;EAapF,YAAY,eAAe"}