@kernel.chat/kbot 2.9.1 → 2.10.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -5
- package/dist/agent.js +1 -1
- package/dist/agent.js.map +1 -1
- package/dist/cli.js +221 -24
- package/dist/cli.js.map +1 -1
- package/dist/context-manager.d.ts.map +1 -1
- package/dist/context-manager.js +31 -5
- package/dist/context-manager.js.map +1 -1
- package/dist/context-manager.test.d.ts +2 -0
- package/dist/context-manager.test.d.ts.map +1 -0
- package/dist/context-manager.test.js +121 -0
- package/dist/context-manager.test.js.map +1 -0
- package/dist/export.d.ts +20 -0
- package/dist/export.d.ts.map +1 -0
- package/dist/export.js +301 -0
- package/dist/export.js.map +1 -0
- package/dist/ide/acp-server.js +2 -2
- package/dist/ide/acp-server.js.map +1 -1
- package/dist/marketplace.d.ts +25 -0
- package/dist/marketplace.d.ts.map +1 -0
- package/dist/marketplace.js +327 -0
- package/dist/marketplace.js.map +1 -0
- package/dist/rate-limiter.d.ts +45 -0
- package/dist/rate-limiter.d.ts.map +1 -0
- package/dist/rate-limiter.js +200 -0
- package/dist/rate-limiter.js.map +1 -0
- package/dist/sessions.test.d.ts +2 -0
- package/dist/sessions.test.d.ts.map +1 -0
- package/dist/sessions.test.js +55 -0
- package/dist/sessions.test.js.map +1 -0
- package/dist/streaming.d.ts.map +1 -1
- package/dist/streaming.js +87 -24
- package/dist/streaming.js.map +1 -1
- package/dist/streaming.test.d.ts +2 -0
- package/dist/streaming.test.d.ts.map +1 -0
- package/dist/streaming.test.js +41 -0
- package/dist/streaming.test.js.map +1 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +3 -1
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/test-runner.d.ts +2 -0
- package/dist/tools/test-runner.d.ts.map +1 -0
- package/dist/tools/test-runner.js +550 -0
- package/dist/tools/test-runner.js.map +1 -0
- package/dist/ui.js +1 -1
- package/dist/voice.d.ts +25 -0
- package/dist/voice.d.ts.map +1 -0
- package/dist/voice.js +336 -0
- package/dist/voice.js.map +1 -0
- package/dist/watch.d.ts +37 -0
- package/dist/watch.d.ts.map +1 -0
- package/dist/watch.js +369 -0
- package/dist/watch.js.map +1 -0
- package/package.json +3 -3
package/dist/voice.js
ADDED
|
@@ -0,0 +1,336 @@
|
|
|
1
|
+
import { execSync, spawn } from 'node:child_process';
|
|
2
|
+
import { createInterface } from 'node:readline';
|
|
3
|
+
import { tmpdir } from 'node:os';
|
|
4
|
+
import { join } from 'node:path';
|
|
5
|
+
import { existsSync, unlinkSync } from 'node:fs';
|
|
6
|
+
import chalk from 'chalk';
|
|
7
|
+
// ---------------------------------------------------------------------------
|
|
8
|
+
// Platform detection helpers
|
|
9
|
+
// ---------------------------------------------------------------------------
|
|
10
|
+
const platform = process.platform;
|
|
11
|
+
function commandExists(cmd) {
|
|
12
|
+
try {
|
|
13
|
+
execSync(`which ${cmd}`, { stdio: 'ignore' });
|
|
14
|
+
return true;
|
|
15
|
+
}
|
|
16
|
+
catch {
|
|
17
|
+
return false;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
function detectTTSEngine() {
|
|
21
|
+
if (platform === 'darwin')
|
|
22
|
+
return 'say';
|
|
23
|
+
if (commandExists('espeak'))
|
|
24
|
+
return 'espeak';
|
|
25
|
+
if (commandExists('festival'))
|
|
26
|
+
return 'festival';
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
function detectSTT() {
|
|
30
|
+
return commandExists('whisper') || commandExists('whisper.cpp');
|
|
31
|
+
}
|
|
32
|
+
function detectRecorder() {
|
|
33
|
+
if (commandExists('rec'))
|
|
34
|
+
return 'rec';
|
|
35
|
+
if (commandExists('arecord'))
|
|
36
|
+
return 'arecord';
|
|
37
|
+
return null;
|
|
38
|
+
}
|
|
39
|
+
// ---------------------------------------------------------------------------
|
|
40
|
+
// Text sanitization
|
|
41
|
+
// ---------------------------------------------------------------------------
|
|
42
|
+
/** Strip markdown formatting so TTS reads clean prose. */
|
|
43
|
+
function stripMarkdown(text) {
|
|
44
|
+
let cleaned = text;
|
|
45
|
+
// Replace code blocks with a spoken description of the language
|
|
46
|
+
cleaned = cleaned.replace(/```(\w+)?\n[\s\S]*?```/g, (_match, lang) => {
|
|
47
|
+
return lang
|
|
48
|
+
? `Here's a ${lang} snippet.`
|
|
49
|
+
: 'Here\'s a code snippet.';
|
|
50
|
+
});
|
|
51
|
+
// Remove inline code
|
|
52
|
+
cleaned = cleaned.replace(/`([^`]+)`/g, '$1');
|
|
53
|
+
// Remove headings markers
|
|
54
|
+
cleaned = cleaned.replace(/^#{1,6}\s+/gm, '');
|
|
55
|
+
// Remove bold / italic markers
|
|
56
|
+
cleaned = cleaned.replace(/\*{1,3}([^*]+)\*{1,3}/g, '$1');
|
|
57
|
+
cleaned = cleaned.replace(/_{1,3}([^_]+)_{1,3}/g, '$1');
|
|
58
|
+
// Remove strikethrough
|
|
59
|
+
cleaned = cleaned.replace(/~~([^~]+)~~/g, '$1');
|
|
60
|
+
// Remove links — keep the label
|
|
61
|
+
cleaned = cleaned.replace(/\[([^\]]+)\]\([^)]+\)/g, '$1');
|
|
62
|
+
// Remove images
|
|
63
|
+
cleaned = cleaned.replace(/!\[([^\]]*)\]\([^)]+\)/g, '$1');
|
|
64
|
+
// Remove blockquote markers
|
|
65
|
+
cleaned = cleaned.replace(/^>\s+/gm, '');
|
|
66
|
+
// Remove horizontal rules
|
|
67
|
+
cleaned = cleaned.replace(/^[-*_]{3,}\s*$/gm, '');
|
|
68
|
+
// Remove list markers (unordered)
|
|
69
|
+
cleaned = cleaned.replace(/^[\s]*[-*+]\s+/gm, '');
|
|
70
|
+
// Remove list markers (ordered)
|
|
71
|
+
cleaned = cleaned.replace(/^[\s]*\d+\.\s+/gm, '');
|
|
72
|
+
// Collapse multiple newlines
|
|
73
|
+
cleaned = cleaned.replace(/\n{3,}/g, '\n\n');
|
|
74
|
+
return cleaned.trim();
|
|
75
|
+
}
|
|
76
|
+
/** Sanitize text for safe shell usage — strip characters that could be interpreted. */
|
|
77
|
+
function sanitizeForShell(text) {
|
|
78
|
+
// Remove characters that are dangerous in shell context
|
|
79
|
+
return text.replace(/[;&|`$(){}[\]!#\\]/g, '');
|
|
80
|
+
}
|
|
81
|
+
// ---------------------------------------------------------------------------
|
|
82
|
+
// 1. initVoice
|
|
83
|
+
// ---------------------------------------------------------------------------
|
|
84
|
+
export function initVoice(options) {
|
|
85
|
+
const ttsEngine = detectTTSEngine();
|
|
86
|
+
const sttAvailable = options?.stt ? detectSTT() : false;
|
|
87
|
+
const enabled = options?.tts !== false && ttsEngine !== null;
|
|
88
|
+
if (!ttsEngine) {
|
|
89
|
+
console.warn(chalk.yellow('⚠ No TTS engine found. ') +
|
|
90
|
+
(platform === 'darwin'
|
|
91
|
+
? 'Expected "say" — this should be available on macOS.'
|
|
92
|
+
: 'Install espeak or festival for TTS support.'));
|
|
93
|
+
}
|
|
94
|
+
if (options?.stt && !sttAvailable) {
|
|
95
|
+
console.warn(chalk.yellow('⚠ STT requested but whisper not found. ') +
|
|
96
|
+
'Install whisper.cpp or openai-whisper for speech-to-text.');
|
|
97
|
+
}
|
|
98
|
+
const defaultVoice = platform === 'darwin' ? 'Alex' : 'default';
|
|
99
|
+
return {
|
|
100
|
+
enabled,
|
|
101
|
+
sttAvailable,
|
|
102
|
+
voice: options?.voice ?? defaultVoice,
|
|
103
|
+
rate: options?.rate ?? 200,
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
// ---------------------------------------------------------------------------
|
|
107
|
+
// 2. speak
|
|
108
|
+
// ---------------------------------------------------------------------------
|
|
109
|
+
export async function speak(text, state) {
|
|
110
|
+
if (!state.enabled)
|
|
111
|
+
return;
|
|
112
|
+
// Kill any in-progress speech first
|
|
113
|
+
stopSpeaking(state);
|
|
114
|
+
const cleaned = sanitizeForShell(stripMarkdown(text));
|
|
115
|
+
if (!cleaned)
|
|
116
|
+
return;
|
|
117
|
+
const ttsEngine = detectTTSEngine();
|
|
118
|
+
if (!ttsEngine)
|
|
119
|
+
return;
|
|
120
|
+
return new Promise((resolve) => {
|
|
121
|
+
let proc;
|
|
122
|
+
switch (ttsEngine) {
|
|
123
|
+
case 'say':
|
|
124
|
+
proc = spawn('say', ['-v', state.voice, '-r', String(state.rate), cleaned], {
|
|
125
|
+
stdio: 'ignore',
|
|
126
|
+
});
|
|
127
|
+
break;
|
|
128
|
+
case 'espeak':
|
|
129
|
+
proc = spawn('espeak', [cleaned], {
|
|
130
|
+
stdio: 'ignore',
|
|
131
|
+
});
|
|
132
|
+
break;
|
|
133
|
+
case 'festival': {
|
|
134
|
+
proc = spawn('festival', ['--tts'], {
|
|
135
|
+
stdio: ['pipe', 'ignore', 'ignore'],
|
|
136
|
+
});
|
|
137
|
+
proc.stdin?.write(cleaned);
|
|
138
|
+
proc.stdin?.end();
|
|
139
|
+
break;
|
|
140
|
+
}
|
|
141
|
+
default:
|
|
142
|
+
resolve();
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
state.ttsProcess = proc;
|
|
146
|
+
proc.on('close', () => {
|
|
147
|
+
if (state.ttsProcess === proc) {
|
|
148
|
+
state.ttsProcess = undefined;
|
|
149
|
+
}
|
|
150
|
+
resolve();
|
|
151
|
+
});
|
|
152
|
+
proc.on('error', () => {
|
|
153
|
+
if (state.ttsProcess === proc) {
|
|
154
|
+
state.ttsProcess = undefined;
|
|
155
|
+
}
|
|
156
|
+
resolve();
|
|
157
|
+
});
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
// ---------------------------------------------------------------------------
|
|
161
|
+
// 3. stopSpeaking
|
|
162
|
+
// ---------------------------------------------------------------------------
|
|
163
|
+
export function stopSpeaking(state) {
|
|
164
|
+
if (state.ttsProcess) {
|
|
165
|
+
state.ttsProcess.kill('SIGTERM');
|
|
166
|
+
state.ttsProcess = undefined;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
// ---------------------------------------------------------------------------
|
|
170
|
+
// 4. listen
|
|
171
|
+
// ---------------------------------------------------------------------------
|
|
172
|
+
export async function listen(state) {
|
|
173
|
+
if (!state.sttAvailable) {
|
|
174
|
+
// Fall back to readline text input
|
|
175
|
+
return readlineInput();
|
|
176
|
+
}
|
|
177
|
+
const recorder = detectRecorder();
|
|
178
|
+
if (!recorder) {
|
|
179
|
+
console.warn(chalk.yellow('⚠ No audio recorder found (rec or arecord). Falling back to text input.'));
|
|
180
|
+
return readlineInput();
|
|
181
|
+
}
|
|
182
|
+
const tempFile = join(tmpdir(), `kbot-voice-${Date.now()}.wav`);
|
|
183
|
+
try {
|
|
184
|
+
// Record audio (up to 10 seconds)
|
|
185
|
+
console.log(chalk.cyan('🎙 Listening... (up to 10s, press Ctrl+C to stop)'));
|
|
186
|
+
await new Promise((resolve, reject) => {
|
|
187
|
+
let proc;
|
|
188
|
+
if (recorder === 'rec') {
|
|
189
|
+
// sox rec: record 16kHz mono WAV, max 10 seconds
|
|
190
|
+
proc = spawn('rec', [
|
|
191
|
+
tempFile,
|
|
192
|
+
'rate', '16k',
|
|
193
|
+
'channels', '1',
|
|
194
|
+
'trim', '0', '10',
|
|
195
|
+
], {
|
|
196
|
+
stdio: ['ignore', 'ignore', 'ignore'],
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
else {
|
|
200
|
+
// arecord: record 16kHz mono WAV, max 10 seconds
|
|
201
|
+
proc = spawn('arecord', [
|
|
202
|
+
'-f', 'S16_LE',
|
|
203
|
+
'-r', '16000',
|
|
204
|
+
'-c', '1',
|
|
205
|
+
'-d', '10',
|
|
206
|
+
tempFile,
|
|
207
|
+
], {
|
|
208
|
+
stdio: ['ignore', 'ignore', 'ignore'],
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
proc.on('close', (code) => {
|
|
212
|
+
if (code === 0 || code === null) {
|
|
213
|
+
resolve();
|
|
214
|
+
}
|
|
215
|
+
else {
|
|
216
|
+
reject(new Error(`Recording failed with exit code ${code}`));
|
|
217
|
+
}
|
|
218
|
+
});
|
|
219
|
+
proc.on('error', (err) => reject(err));
|
|
220
|
+
});
|
|
221
|
+
if (!existsSync(tempFile)) {
|
|
222
|
+
console.warn(chalk.yellow('⚠ Recording failed — no audio file produced.'));
|
|
223
|
+
return readlineInput();
|
|
224
|
+
}
|
|
225
|
+
// Transcribe with whisper
|
|
226
|
+
console.log(chalk.dim('Transcribing...'));
|
|
227
|
+
const whisperCmd = commandExists('whisper') ? 'whisper' : 'whisper.cpp';
|
|
228
|
+
const transcription = execSync(`${whisperCmd} "${tempFile}" --model base --output_format txt --language en 2>/dev/null`, { encoding: 'utf-8', timeout: 30_000 }).trim();
|
|
229
|
+
return transcription || await readlineInput();
|
|
230
|
+
}
|
|
231
|
+
catch (err) {
|
|
232
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
233
|
+
console.warn(chalk.yellow(`⚠ STT failed: ${message}. Falling back to text input.`));
|
|
234
|
+
return readlineInput();
|
|
235
|
+
}
|
|
236
|
+
finally {
|
|
237
|
+
// Clean up temp file
|
|
238
|
+
try {
|
|
239
|
+
if (existsSync(tempFile))
|
|
240
|
+
unlinkSync(tempFile);
|
|
241
|
+
}
|
|
242
|
+
catch {
|
|
243
|
+
// ignore cleanup errors
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
/** Readline fallback for text input when STT is unavailable. */
|
|
248
|
+
function readlineInput() {
|
|
249
|
+
return new Promise((resolve) => {
|
|
250
|
+
const rl = createInterface({
|
|
251
|
+
input: process.stdin,
|
|
252
|
+
output: process.stdout,
|
|
253
|
+
});
|
|
254
|
+
rl.question(chalk.cyan('You: '), (answer) => {
|
|
255
|
+
rl.close();
|
|
256
|
+
resolve(answer.trim());
|
|
257
|
+
});
|
|
258
|
+
});
|
|
259
|
+
}
|
|
260
|
+
// ---------------------------------------------------------------------------
|
|
261
|
+
// 5. listVoices
|
|
262
|
+
// ---------------------------------------------------------------------------
|
|
263
|
+
export function listVoices() {
|
|
264
|
+
const ttsEngine = detectTTSEngine();
|
|
265
|
+
if (!ttsEngine)
|
|
266
|
+
return [];
|
|
267
|
+
try {
|
|
268
|
+
switch (ttsEngine) {
|
|
269
|
+
case 'say': {
|
|
270
|
+
// macOS: `say -v ?` outputs lines like "Alex en_US # Most people recognize me by my voice."
|
|
271
|
+
const output = execSync('say -v ?', { encoding: 'utf-8' });
|
|
272
|
+
return output
|
|
273
|
+
.split('\n')
|
|
274
|
+
.filter(Boolean)
|
|
275
|
+
.map((line) => {
|
|
276
|
+
const match = line.match(/^(\S+)/);
|
|
277
|
+
return match ? match[1] : '';
|
|
278
|
+
})
|
|
279
|
+
.filter(Boolean);
|
|
280
|
+
}
|
|
281
|
+
case 'espeak': {
|
|
282
|
+
const output = execSync('espeak --voices', { encoding: 'utf-8' });
|
|
283
|
+
return output
|
|
284
|
+
.split('\n')
|
|
285
|
+
.slice(1) // skip header
|
|
286
|
+
.filter(Boolean)
|
|
287
|
+
.map((line) => {
|
|
288
|
+
const parts = line.trim().split(/\s+/);
|
|
289
|
+
// voice name is typically the 4th column
|
|
290
|
+
return parts[3] ?? '';
|
|
291
|
+
})
|
|
292
|
+
.filter(Boolean);
|
|
293
|
+
}
|
|
294
|
+
case 'festival': {
|
|
295
|
+
try {
|
|
296
|
+
const output = execSync('echo "(voice.list)" | festival --pipe 2>/dev/null', { encoding: 'utf-8' });
|
|
297
|
+
const match = output.match(/\(([^)]+)\)/);
|
|
298
|
+
if (match) {
|
|
299
|
+
return match[1].split(/\s+/).filter(Boolean);
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
catch {
|
|
303
|
+
// festival voice listing can be finicky
|
|
304
|
+
}
|
|
305
|
+
return [];
|
|
306
|
+
}
|
|
307
|
+
default:
|
|
308
|
+
return [];
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
catch {
|
|
312
|
+
return [];
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
// ---------------------------------------------------------------------------
|
|
316
|
+
// 6. formatVoiceStatus
|
|
317
|
+
// ---------------------------------------------------------------------------
|
|
318
|
+
export function formatVoiceStatus(state) {
|
|
319
|
+
const lines = [];
|
|
320
|
+
lines.push(chalk.bold('Voice Mode'));
|
|
321
|
+
lines.push('');
|
|
322
|
+
const ttsEngine = detectTTSEngine();
|
|
323
|
+
lines.push(` TTS: ${state.enabled
|
|
324
|
+
? chalk.green('enabled') + chalk.dim(` (${ttsEngine ?? 'unknown'})`)
|
|
325
|
+
: chalk.red('disabled')}`);
|
|
326
|
+
lines.push(` Voice: ${chalk.cyan(state.voice)}`);
|
|
327
|
+
lines.push(` Rate: ${state.rate} wpm`);
|
|
328
|
+
lines.push(` STT: ${state.sttAvailable
|
|
329
|
+
? chalk.green('available') + chalk.dim(' (whisper)')
|
|
330
|
+
: chalk.dim('not available')}`);
|
|
331
|
+
lines.push(` Speaking: ${state.ttsProcess
|
|
332
|
+
? chalk.yellow('in progress')
|
|
333
|
+
: chalk.dim('idle')}`);
|
|
334
|
+
return lines.join('\n');
|
|
335
|
+
}
|
|
336
|
+
//# sourceMappingURL=voice.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"voice.js","sourceRoot":"","sources":["../src/voice.ts"],"names":[],"mappings":"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"}
|
package/dist/watch.d.ts
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
export interface WatchOptions {
|
|
2
|
+
/** Directory to watch (default: cwd) */
|
|
3
|
+
path?: string;
|
|
4
|
+
/** File extensions to watch (default: common source extensions) */
|
|
5
|
+
extensions?: string[];
|
|
6
|
+
/** Whether to run analysis on changes (default: true) */
|
|
7
|
+
analyze?: boolean;
|
|
8
|
+
/** Callback for change events */
|
|
9
|
+
onChange?: (event: WatchEvent) => void;
|
|
10
|
+
}
|
|
11
|
+
export interface WatchEvent {
|
|
12
|
+
file: string;
|
|
13
|
+
type: 'change' | 'rename';
|
|
14
|
+
timestamp: Date;
|
|
15
|
+
analysis?: FileAnalysis;
|
|
16
|
+
}
|
|
17
|
+
export interface FileAnalysis {
|
|
18
|
+
todos: number;
|
|
19
|
+
debugStatements: number;
|
|
20
|
+
syntaxIssues: string[];
|
|
21
|
+
lineCount: number;
|
|
22
|
+
}
|
|
23
|
+
export declare function startWatch(path?: string, options?: WatchOptions): Promise<void>;
|
|
24
|
+
export declare function stopWatch(): void;
|
|
25
|
+
/**
|
|
26
|
+
* Get the recent change log (last 20 file changes).
|
|
27
|
+
*/
|
|
28
|
+
export declare function getChangeLog(): WatchEvent[];
|
|
29
|
+
/**
|
|
30
|
+
* Clear the change log.
|
|
31
|
+
*/
|
|
32
|
+
export declare function clearChangeLog(): void;
|
|
33
|
+
/**
|
|
34
|
+
* Check whether the watcher is currently active.
|
|
35
|
+
*/
|
|
36
|
+
export declare function isWatching(): boolean;
|
|
37
|
+
//# sourceMappingURL=watch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"watch.d.ts","sourceRoot":"","sources":["../src/watch.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,YAAY;IAC3B,wCAAwC;IACxC,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,mEAAmE;IACnE,UAAU,CAAC,EAAE,MAAM,EAAE,CAAA;IACrB,yDAAyD;IACzD,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,iCAAiC;IACjC,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAA;CACvC;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,QAAQ,GAAG,QAAQ,CAAA;IACzB,SAAS,EAAE,IAAI,CAAA;IACf,QAAQ,CAAC,EAAE,YAAY,CAAA;CACxB;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAA;IACb,eAAe,EAAE,MAAM,CAAA;IACvB,YAAY,EAAE,MAAM,EAAE,CAAA;IACtB,SAAS,EAAE,MAAM,CAAA;CAClB;AAySD,wBAAsB,UAAU,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAgGrF;AAED,wBAAgB,SAAS,IAAI,IAAI,CAahC;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,UAAU,EAAE,CAE3C;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,IAAI,CAErC;AAED;;GAEG;AACH,wBAAgB,UAAU,IAAI,OAAO,CAEpC"}
|