@vultisig/cli 0.1.0-alpha.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 +391 -0
- package/dist/adapters/cli-context.js +25 -0
- package/dist/adapters/cli-context.js.map +1 -0
- package/dist/adapters/cli-runner.js +47 -0
- package/dist/adapters/cli-runner.js.map +1 -0
- package/dist/adapters/index.js +6 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/commands/balance.js +65 -0
- package/dist/commands/balance.js.map +1 -0
- package/dist/commands/chains.js +46 -0
- package/dist/commands/chains.js.map +1 -0
- package/dist/commands/index.js +12 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/commands/settings.js +151 -0
- package/dist/commands/settings.js.map +1 -0
- package/dist/commands/swap.js +180 -0
- package/dist/commands/swap.js.map +1 -0
- package/dist/commands/tokens.js +116 -0
- package/dist/commands/tokens.js.map +1 -0
- package/dist/commands/transaction.js +99 -0
- package/dist/commands/transaction.js.map +1 -0
- package/dist/commands/vault-management.js +360 -0
- package/dist/commands/vault-management.js.map +1 -0
- package/dist/core/command-context.js +81 -0
- package/dist/core/command-context.js.map +1 -0
- package/dist/core/index.js +7 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/password-manager.js +92 -0
- package/dist/core/password-manager.js.map +1 -0
- package/dist/core/types.js +2 -0
- package/dist/core/types.js.map +1 -0
- package/dist/index.js +440 -0
- package/dist/index.js.map +1 -0
- package/dist/interactive/completer.js +170 -0
- package/dist/interactive/completer.js.map +1 -0
- package/dist/interactive/event-buffer.js +186 -0
- package/dist/interactive/event-buffer.js.map +1 -0
- package/dist/interactive/index.js +9 -0
- package/dist/interactive/index.js.map +1 -0
- package/dist/interactive/session.js +525 -0
- package/dist/interactive/session.js.map +1 -0
- package/dist/interactive/shell-commands.js +167 -0
- package/dist/interactive/shell-commands.js.map +1 -0
- package/dist/interactive/shell-context.js +112 -0
- package/dist/interactive/shell-context.js.map +1 -0
- package/dist/lib/completion.js +375 -0
- package/dist/lib/completion.js.map +1 -0
- package/dist/lib/config.js +172 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/errors.js +163 -0
- package/dist/lib/errors.js.map +1 -0
- package/dist/lib/index.js +9 -0
- package/dist/lib/index.js.map +1 -0
- package/dist/lib/output.js +155 -0
- package/dist/lib/output.js.map +1 -0
- package/dist/lib/version.js +210 -0
- package/dist/lib/version.js.map +1 -0
- package/dist/ui.js +286 -0
- package/dist/ui.js.map +1 -0
- package/package.json +76 -0
|
@@ -0,0 +1,525 @@
|
|
|
1
|
+
import { fiatCurrencies } from '@vultisig/sdk';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import ora from 'ora';
|
|
4
|
+
import * as repl from 'repl';
|
|
5
|
+
import { executeAddressBook, executeAddresses, executeBalance, executeChains, executeCreate, executeCurrency, executeExport, executeImport, executeInfo, executePortfolio, executeRename, executeSend, executeServer, executeSwap, executeSwapChains, executeSwapQuote, executeTokens, executeVaults, } from '../commands';
|
|
6
|
+
import { createCompleter, findChainByName } from './completer';
|
|
7
|
+
import { EventBuffer } from './event-buffer';
|
|
8
|
+
import { executeLock, executeStatus, executeUnlock, showHelp } from './shell-commands';
|
|
9
|
+
import { createShellContext } from './shell-context';
|
|
10
|
+
/**
|
|
11
|
+
* Create a REPL-safe spinner that doesn't interfere with stdin
|
|
12
|
+
*/
|
|
13
|
+
function createReplSafeSpinner(text) {
|
|
14
|
+
return ora({
|
|
15
|
+
text,
|
|
16
|
+
hideCursor: false,
|
|
17
|
+
stream: process.stdout,
|
|
18
|
+
isEnabled: true,
|
|
19
|
+
isSilent: false,
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Interactive Shell Session
|
|
24
|
+
*/
|
|
25
|
+
export class ShellSession {
|
|
26
|
+
ctx;
|
|
27
|
+
eventBuffer;
|
|
28
|
+
replServer;
|
|
29
|
+
constructor(sdk, options) {
|
|
30
|
+
this.ctx = createShellContext(sdk, options);
|
|
31
|
+
this.eventBuffer = new EventBuffer();
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Start the interactive shell
|
|
35
|
+
*/
|
|
36
|
+
async start() {
|
|
37
|
+
console.clear();
|
|
38
|
+
console.log(chalk.cyan.bold('\n=============================================='));
|
|
39
|
+
console.log(chalk.cyan.bold(' Vultisig Interactive Shell'));
|
|
40
|
+
console.log(chalk.cyan.bold('==============================================\n'));
|
|
41
|
+
// Load all vaults
|
|
42
|
+
await this.loadAllVaults();
|
|
43
|
+
// Display vault list
|
|
44
|
+
this.displayVaultList();
|
|
45
|
+
// Show quick help
|
|
46
|
+
console.log(chalk.gray('Type "help" for available commands, ".exit" to quit\n'));
|
|
47
|
+
// Create the REPL server with completer
|
|
48
|
+
this.replServer = repl.start({
|
|
49
|
+
prompt: this.getPrompt(),
|
|
50
|
+
eval: this.evalCommand.bind(this),
|
|
51
|
+
ignoreUndefined: true,
|
|
52
|
+
terminal: true,
|
|
53
|
+
useColors: true,
|
|
54
|
+
completer: createCompleter(this.ctx),
|
|
55
|
+
});
|
|
56
|
+
// Setup REPL commands
|
|
57
|
+
this.setupReplCommands();
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Custom eval function for command processing
|
|
61
|
+
*/
|
|
62
|
+
async evalCommand(cmd, _context, _filename, callback) {
|
|
63
|
+
const input = cmd.trim();
|
|
64
|
+
// Handle empty input
|
|
65
|
+
if (!input) {
|
|
66
|
+
callback(null);
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
// Parse command and arguments
|
|
70
|
+
const [command, ...args] = input.split(/\s+/);
|
|
71
|
+
try {
|
|
72
|
+
// Start command execution - buffer events during command
|
|
73
|
+
this.eventBuffer.startCommand();
|
|
74
|
+
// Execute command
|
|
75
|
+
await this.executeCommand(command.toLowerCase(), args);
|
|
76
|
+
// End command execution - flush buffered events
|
|
77
|
+
this.eventBuffer.endCommand();
|
|
78
|
+
// Update prompt if needed
|
|
79
|
+
this.replServer.setPrompt(this.getPrompt());
|
|
80
|
+
// Signal completion to REPL
|
|
81
|
+
callback(null);
|
|
82
|
+
// Restore terminal state after async commands
|
|
83
|
+
// Some commands (like ora spinners) pause stdin and disable raw mode
|
|
84
|
+
this.restoreTerminalState();
|
|
85
|
+
}
|
|
86
|
+
catch (error) {
|
|
87
|
+
// End command execution even on error
|
|
88
|
+
this.eventBuffer.endCommand();
|
|
89
|
+
// Show error
|
|
90
|
+
console.error(chalk.red(`\nx Error: ${error.message}`));
|
|
91
|
+
// Update prompt
|
|
92
|
+
this.replServer.setPrompt(this.getPrompt());
|
|
93
|
+
// Signal completion
|
|
94
|
+
callback(null);
|
|
95
|
+
// Restore terminal state after error
|
|
96
|
+
this.restoreTerminalState();
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Restore terminal state after commands that may have altered it.
|
|
101
|
+
* Some libraries (like ora spinners) pause stdin and disable raw mode.
|
|
102
|
+
*/
|
|
103
|
+
restoreTerminalState() {
|
|
104
|
+
// Resume stdin if paused
|
|
105
|
+
if (process.stdin.isPaused()) {
|
|
106
|
+
process.stdin.resume();
|
|
107
|
+
}
|
|
108
|
+
// Restore raw mode if disabled (required for REPL to work properly)
|
|
109
|
+
if (process.stdin.isTTY && !process.stdin.isRaw) {
|
|
110
|
+
process.stdin.setRawMode(true);
|
|
111
|
+
}
|
|
112
|
+
// Force prompt redisplay
|
|
113
|
+
this.replServer.displayPrompt();
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Execute a command
|
|
117
|
+
*/
|
|
118
|
+
async executeCommand(command, args) {
|
|
119
|
+
switch (command) {
|
|
120
|
+
// Vault management
|
|
121
|
+
case 'vaults':
|
|
122
|
+
await executeVaults(this.ctx);
|
|
123
|
+
break;
|
|
124
|
+
case 'vault':
|
|
125
|
+
await this.switchVault(args);
|
|
126
|
+
break;
|
|
127
|
+
case 'import':
|
|
128
|
+
await this.importVault(args);
|
|
129
|
+
break;
|
|
130
|
+
case 'create':
|
|
131
|
+
await this.createVault();
|
|
132
|
+
break;
|
|
133
|
+
case 'info':
|
|
134
|
+
await executeInfo(this.ctx);
|
|
135
|
+
break;
|
|
136
|
+
case 'export':
|
|
137
|
+
await executeExport(this.ctx, { outputPath: args.join(' ') || undefined });
|
|
138
|
+
break;
|
|
139
|
+
case 'rename':
|
|
140
|
+
if (args.length === 0) {
|
|
141
|
+
console.log(chalk.yellow('Usage: rename <newName>'));
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
await executeRename(this.ctx, args.join(' '));
|
|
145
|
+
break;
|
|
146
|
+
// Balance commands
|
|
147
|
+
case 'balance':
|
|
148
|
+
case 'bal':
|
|
149
|
+
await this.runBalance(args);
|
|
150
|
+
break;
|
|
151
|
+
case 'portfolio':
|
|
152
|
+
await this.runPortfolio(args);
|
|
153
|
+
break;
|
|
154
|
+
// Transaction
|
|
155
|
+
case 'send':
|
|
156
|
+
await this.runSend(args);
|
|
157
|
+
break;
|
|
158
|
+
// Chain management
|
|
159
|
+
case 'addresses':
|
|
160
|
+
await executeAddresses(this.ctx);
|
|
161
|
+
break;
|
|
162
|
+
case 'chains':
|
|
163
|
+
await this.runChains(args);
|
|
164
|
+
break;
|
|
165
|
+
case 'tokens':
|
|
166
|
+
await this.runTokens(args);
|
|
167
|
+
break;
|
|
168
|
+
// Swap commands
|
|
169
|
+
case 'swap-chains':
|
|
170
|
+
await executeSwapChains(this.ctx);
|
|
171
|
+
break;
|
|
172
|
+
case 'swap-quote':
|
|
173
|
+
await this.runSwapQuote(args);
|
|
174
|
+
break;
|
|
175
|
+
case 'swap':
|
|
176
|
+
await this.runSwap(args);
|
|
177
|
+
break;
|
|
178
|
+
// Shell-only commands
|
|
179
|
+
case 'lock':
|
|
180
|
+
await executeLock(this.ctx);
|
|
181
|
+
break;
|
|
182
|
+
case 'unlock':
|
|
183
|
+
await executeUnlock(this.ctx);
|
|
184
|
+
break;
|
|
185
|
+
case 'status':
|
|
186
|
+
await executeStatus(this.ctx);
|
|
187
|
+
break;
|
|
188
|
+
// Settings
|
|
189
|
+
case 'currency':
|
|
190
|
+
await executeCurrency(this.ctx, args[0]);
|
|
191
|
+
break;
|
|
192
|
+
case 'server':
|
|
193
|
+
await executeServer(this.ctx);
|
|
194
|
+
break;
|
|
195
|
+
case 'address-book':
|
|
196
|
+
await this.runAddressBook(args);
|
|
197
|
+
break;
|
|
198
|
+
// Help
|
|
199
|
+
case 'help':
|
|
200
|
+
case '?':
|
|
201
|
+
showHelp();
|
|
202
|
+
break;
|
|
203
|
+
default:
|
|
204
|
+
if (command && !command.startsWith('.')) {
|
|
205
|
+
console.log(chalk.yellow(`Unknown command: ${command}`));
|
|
206
|
+
console.log(chalk.gray('Type "help" for available commands'));
|
|
207
|
+
}
|
|
208
|
+
break;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
// ===== Command Helpers =====
|
|
212
|
+
async switchVault(args) {
|
|
213
|
+
if (args.length === 0) {
|
|
214
|
+
console.log(chalk.yellow('Usage: vault <name>'));
|
|
215
|
+
console.log(chalk.gray('Run "vaults" to see available vaults'));
|
|
216
|
+
return;
|
|
217
|
+
}
|
|
218
|
+
const vaultName = args.join(' ');
|
|
219
|
+
const vault = this.ctx.findVaultByName(vaultName);
|
|
220
|
+
if (!vault) {
|
|
221
|
+
console.log(chalk.red(`Vault not found: ${vaultName}`));
|
|
222
|
+
console.log(chalk.gray('Run "vaults" to see available vaults'));
|
|
223
|
+
return;
|
|
224
|
+
}
|
|
225
|
+
await this.ctx.setActiveVault(vault);
|
|
226
|
+
console.log(chalk.green(`\n+ Switched to: ${vault.name}`));
|
|
227
|
+
const isUnlocked = this.ctx.isVaultUnlocked(vault.id);
|
|
228
|
+
const status = isUnlocked ? chalk.green('Unlocked') : chalk.yellow('Locked');
|
|
229
|
+
console.log(`Status: ${status}`);
|
|
230
|
+
}
|
|
231
|
+
async importVault(args) {
|
|
232
|
+
if (args.length === 0) {
|
|
233
|
+
console.log(chalk.yellow('Usage: import <file>'));
|
|
234
|
+
return;
|
|
235
|
+
}
|
|
236
|
+
const filePath = args.join(' ');
|
|
237
|
+
const vault = await executeImport(this.ctx, filePath);
|
|
238
|
+
this.ctx.addVault(vault);
|
|
239
|
+
this.eventBuffer.setupVaultListeners(vault);
|
|
240
|
+
}
|
|
241
|
+
async createVault() {
|
|
242
|
+
const vault = await executeCreate(this.ctx, { type: 'fast' });
|
|
243
|
+
this.ctx.addVault(vault);
|
|
244
|
+
this.eventBuffer.setupVaultListeners(vault);
|
|
245
|
+
}
|
|
246
|
+
async runBalance(args) {
|
|
247
|
+
const chainStr = args[0];
|
|
248
|
+
const includeTokens = args.includes('-t') || args.includes('--tokens');
|
|
249
|
+
await executeBalance(this.ctx, {
|
|
250
|
+
chain: chainStr ? findChainByName(chainStr) || chainStr : undefined,
|
|
251
|
+
includeTokens,
|
|
252
|
+
});
|
|
253
|
+
}
|
|
254
|
+
async runPortfolio(args) {
|
|
255
|
+
let currency = 'usd';
|
|
256
|
+
for (let i = 0; i < args.length; i++) {
|
|
257
|
+
if ((args[i] === '-c' || args[i] === '--currency') && i + 1 < args.length) {
|
|
258
|
+
currency = args[i + 1].toLowerCase();
|
|
259
|
+
i++;
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
if (!fiatCurrencies.includes(currency)) {
|
|
263
|
+
console.log(chalk.red(`Invalid currency: ${currency}`));
|
|
264
|
+
console.log(chalk.yellow(`Supported currencies: ${fiatCurrencies.join(', ')}`));
|
|
265
|
+
return;
|
|
266
|
+
}
|
|
267
|
+
await executePortfolio(this.ctx, { currency });
|
|
268
|
+
}
|
|
269
|
+
async runSend(args) {
|
|
270
|
+
if (args.length < 3) {
|
|
271
|
+
console.log(chalk.yellow('Usage: send <chain> <to> <amount> [--token <tokenId>] [--memo <memo>]'));
|
|
272
|
+
return;
|
|
273
|
+
}
|
|
274
|
+
const [chainStr, to, amount, ...rest] = args;
|
|
275
|
+
const chain = findChainByName(chainStr) || chainStr;
|
|
276
|
+
let tokenId;
|
|
277
|
+
let memo;
|
|
278
|
+
for (let i = 0; i < rest.length; i++) {
|
|
279
|
+
if (rest[i] === '--token' && i + 1 < rest.length) {
|
|
280
|
+
tokenId = rest[i + 1];
|
|
281
|
+
i++;
|
|
282
|
+
}
|
|
283
|
+
else if (rest[i] === '--memo' && i + 1 < rest.length) {
|
|
284
|
+
memo = rest.slice(i + 1).join(' ');
|
|
285
|
+
break;
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
try {
|
|
289
|
+
await executeSend(this.ctx, { chain, to, amount, tokenId, memo });
|
|
290
|
+
}
|
|
291
|
+
catch (err) {
|
|
292
|
+
if (err.message === 'Transaction cancelled by user') {
|
|
293
|
+
console.log(chalk.yellow('\nTransaction cancelled'));
|
|
294
|
+
return;
|
|
295
|
+
}
|
|
296
|
+
throw err;
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
async runChains(args) {
|
|
300
|
+
let addChain;
|
|
301
|
+
let removeChain;
|
|
302
|
+
for (let i = 0; i < args.length; i++) {
|
|
303
|
+
if (args[i] === '--add' && i + 1 < args.length) {
|
|
304
|
+
const chain = findChainByName(args[i + 1]);
|
|
305
|
+
if (!chain) {
|
|
306
|
+
console.log(chalk.red(`Unknown chain: ${args[i + 1]}`));
|
|
307
|
+
console.log(chalk.gray('Use tab completion to see available chains'));
|
|
308
|
+
return;
|
|
309
|
+
}
|
|
310
|
+
addChain = chain;
|
|
311
|
+
i++;
|
|
312
|
+
}
|
|
313
|
+
else if (args[i] === '--remove' && i + 1 < args.length) {
|
|
314
|
+
const chain = findChainByName(args[i + 1]);
|
|
315
|
+
if (!chain) {
|
|
316
|
+
console.log(chalk.red(`Unknown chain: ${args[i + 1]}`));
|
|
317
|
+
console.log(chalk.gray('Use tab completion to see available chains'));
|
|
318
|
+
return;
|
|
319
|
+
}
|
|
320
|
+
removeChain = chain;
|
|
321
|
+
i++;
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
await executeChains(this.ctx, { add: addChain, remove: removeChain });
|
|
325
|
+
}
|
|
326
|
+
async runTokens(args) {
|
|
327
|
+
if (args.length === 0) {
|
|
328
|
+
console.log(chalk.yellow('Usage: tokens <chain> [--add <address>] [--remove <tokenId>]'));
|
|
329
|
+
return;
|
|
330
|
+
}
|
|
331
|
+
const chainStr = args[0];
|
|
332
|
+
const chain = findChainByName(chainStr) || chainStr;
|
|
333
|
+
let add;
|
|
334
|
+
let remove;
|
|
335
|
+
for (let i = 1; i < args.length; i++) {
|
|
336
|
+
if (args[i] === '--add' && i + 1 < args.length) {
|
|
337
|
+
add = args[i + 1];
|
|
338
|
+
i++;
|
|
339
|
+
}
|
|
340
|
+
else if (args[i] === '--remove' && i + 1 < args.length) {
|
|
341
|
+
remove = args[i + 1];
|
|
342
|
+
i++;
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
await executeTokens(this.ctx, { chain, add, remove });
|
|
346
|
+
}
|
|
347
|
+
async runSwapQuote(args) {
|
|
348
|
+
if (args.length < 3) {
|
|
349
|
+
console.log(chalk.yellow('Usage: swap-quote <fromChain> <toChain> <amount> [--from-token <addr>] [--to-token <addr>]'));
|
|
350
|
+
return;
|
|
351
|
+
}
|
|
352
|
+
const [fromChainStr, toChainStr, amountStr, ...rest] = args;
|
|
353
|
+
const fromChain = findChainByName(fromChainStr) || fromChainStr;
|
|
354
|
+
const toChain = findChainByName(toChainStr) || toChainStr;
|
|
355
|
+
const amount = parseFloat(amountStr);
|
|
356
|
+
let fromToken;
|
|
357
|
+
let toToken;
|
|
358
|
+
for (let i = 0; i < rest.length; i++) {
|
|
359
|
+
if (rest[i] === '--from-token' && i + 1 < rest.length) {
|
|
360
|
+
fromToken = rest[i + 1];
|
|
361
|
+
i++;
|
|
362
|
+
}
|
|
363
|
+
else if (rest[i] === '--to-token' && i + 1 < rest.length) {
|
|
364
|
+
toToken = rest[i + 1];
|
|
365
|
+
i++;
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
await executeSwapQuote(this.ctx, { fromChain, toChain, amount, fromToken, toToken });
|
|
369
|
+
}
|
|
370
|
+
async runSwap(args) {
|
|
371
|
+
if (args.length < 3) {
|
|
372
|
+
console.log(chalk.yellow('Usage: swap <fromChain> <toChain> <amount> [--from-token <addr>] [--to-token <addr>] [--slippage <pct>]'));
|
|
373
|
+
return;
|
|
374
|
+
}
|
|
375
|
+
const [fromChainStr, toChainStr, amountStr, ...rest] = args;
|
|
376
|
+
const fromChain = findChainByName(fromChainStr) || fromChainStr;
|
|
377
|
+
const toChain = findChainByName(toChainStr) || toChainStr;
|
|
378
|
+
const amount = parseFloat(amountStr);
|
|
379
|
+
let fromToken;
|
|
380
|
+
let toToken;
|
|
381
|
+
let slippage;
|
|
382
|
+
for (let i = 0; i < rest.length; i++) {
|
|
383
|
+
if (rest[i] === '--from-token' && i + 1 < rest.length) {
|
|
384
|
+
fromToken = rest[i + 1];
|
|
385
|
+
i++;
|
|
386
|
+
}
|
|
387
|
+
else if (rest[i] === '--to-token' && i + 1 < rest.length) {
|
|
388
|
+
toToken = rest[i + 1];
|
|
389
|
+
i++;
|
|
390
|
+
}
|
|
391
|
+
else if (rest[i] === '--slippage' && i + 1 < rest.length) {
|
|
392
|
+
slippage = parseFloat(rest[i + 1]);
|
|
393
|
+
i++;
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
try {
|
|
397
|
+
await executeSwap(this.ctx, { fromChain, toChain, amount, fromToken, toToken, slippage });
|
|
398
|
+
}
|
|
399
|
+
catch (err) {
|
|
400
|
+
if (err.message === 'Swap cancelled by user') {
|
|
401
|
+
console.log(chalk.yellow('\nSwap cancelled'));
|
|
402
|
+
return;
|
|
403
|
+
}
|
|
404
|
+
throw err;
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
async runAddressBook(args) {
|
|
408
|
+
let add = false;
|
|
409
|
+
let remove;
|
|
410
|
+
let chain;
|
|
411
|
+
for (let i = 0; i < args.length; i++) {
|
|
412
|
+
if (args[i] === '--add') {
|
|
413
|
+
add = true;
|
|
414
|
+
}
|
|
415
|
+
else if (args[i] === '--remove' && i + 1 < args.length) {
|
|
416
|
+
remove = args[i + 1];
|
|
417
|
+
i++;
|
|
418
|
+
}
|
|
419
|
+
else if (args[i] === '--chain' && i + 1 < args.length) {
|
|
420
|
+
chain = findChainByName(args[i + 1]) || args[i + 1];
|
|
421
|
+
i++;
|
|
422
|
+
}
|
|
423
|
+
}
|
|
424
|
+
await executeAddressBook(this.ctx, { add, remove, chain });
|
|
425
|
+
}
|
|
426
|
+
// ===== Setup =====
|
|
427
|
+
setupReplCommands() {
|
|
428
|
+
// Add .help command
|
|
429
|
+
this.replServer.defineCommand('help', {
|
|
430
|
+
help: 'Show available commands',
|
|
431
|
+
action: () => {
|
|
432
|
+
showHelp();
|
|
433
|
+
this.replServer.displayPrompt();
|
|
434
|
+
},
|
|
435
|
+
});
|
|
436
|
+
// Add .clear command
|
|
437
|
+
this.replServer.defineCommand('clear', {
|
|
438
|
+
help: 'Clear the screen',
|
|
439
|
+
action: () => {
|
|
440
|
+
console.clear();
|
|
441
|
+
this.displayVaultList();
|
|
442
|
+
this.replServer.displayPrompt();
|
|
443
|
+
},
|
|
444
|
+
});
|
|
445
|
+
// Override .exit to clean up
|
|
446
|
+
const originalExit = this.replServer.commands.exit;
|
|
447
|
+
this.replServer.defineCommand('exit', {
|
|
448
|
+
help: originalExit.help,
|
|
449
|
+
action: () => {
|
|
450
|
+
console.log(chalk.yellow('\nGoodbye!'));
|
|
451
|
+
this.ctx.dispose();
|
|
452
|
+
originalExit.action.call(this.replServer);
|
|
453
|
+
},
|
|
454
|
+
});
|
|
455
|
+
}
|
|
456
|
+
async loadAllVaults() {
|
|
457
|
+
const spinner = createReplSafeSpinner('Loading vaults...').start();
|
|
458
|
+
try {
|
|
459
|
+
// Load active vault first
|
|
460
|
+
const activeVault = await this.ctx.sdk.getActiveVault();
|
|
461
|
+
if (activeVault) {
|
|
462
|
+
this.ctx.addVault(activeVault);
|
|
463
|
+
await this.ctx.setActiveVault(activeVault);
|
|
464
|
+
this.eventBuffer.setupVaultListeners(activeVault);
|
|
465
|
+
}
|
|
466
|
+
// Load all vaults
|
|
467
|
+
const vaultList = await this.ctx.sdk.listVaults();
|
|
468
|
+
if (vaultList && vaultList.length > 0) {
|
|
469
|
+
vaultList.forEach(vault => {
|
|
470
|
+
if (!this.ctx.getVaultById(vault.id)) {
|
|
471
|
+
this.ctx.addVault(vault);
|
|
472
|
+
this.eventBuffer.setupVaultListeners(vault);
|
|
473
|
+
}
|
|
474
|
+
});
|
|
475
|
+
// Set first vault as active if none set
|
|
476
|
+
if (!this.ctx.getActiveVault() && this.ctx.getVaults().size > 0) {
|
|
477
|
+
const firstVault = this.ctx.getVaults().values().next().value;
|
|
478
|
+
await this.ctx.setActiveVault(firstVault);
|
|
479
|
+
}
|
|
480
|
+
spinner.succeed(`Loaded ${this.ctx.getVaults().size} vault(s)`);
|
|
481
|
+
}
|
|
482
|
+
else if (this.ctx.getVaults().size > 0) {
|
|
483
|
+
spinner.succeed(`Loaded ${this.ctx.getVaults().size} vault(s)`);
|
|
484
|
+
}
|
|
485
|
+
else {
|
|
486
|
+
spinner.succeed('No vaults found');
|
|
487
|
+
}
|
|
488
|
+
}
|
|
489
|
+
catch (error) {
|
|
490
|
+
if (this.ctx.getVaults().size > 0) {
|
|
491
|
+
spinner.succeed(`Loaded ${this.ctx.getVaults().size} vault(s)`);
|
|
492
|
+
}
|
|
493
|
+
else {
|
|
494
|
+
spinner.fail('Failed to load vaults');
|
|
495
|
+
throw error;
|
|
496
|
+
}
|
|
497
|
+
}
|
|
498
|
+
}
|
|
499
|
+
getPrompt() {
|
|
500
|
+
const vault = this.ctx.getActiveVault();
|
|
501
|
+
if (!vault)
|
|
502
|
+
return chalk.cyan('wallet> ');
|
|
503
|
+
const isUnlocked = this.ctx.isVaultUnlocked(vault.id);
|
|
504
|
+
const status = isUnlocked ? chalk.green('🔓') : chalk.yellow('🔒');
|
|
505
|
+
return chalk.cyan(`wallet[${vault.name}]${status}> `);
|
|
506
|
+
}
|
|
507
|
+
displayVaultList() {
|
|
508
|
+
const vaults = Array.from(this.ctx.getVaults().values());
|
|
509
|
+
const activeVault = this.ctx.getActiveVault();
|
|
510
|
+
if (vaults.length === 0) {
|
|
511
|
+
console.log(chalk.yellow('No vaults found. Use "create" or "import <file>" to add a vault.\n'));
|
|
512
|
+
return;
|
|
513
|
+
}
|
|
514
|
+
console.log(chalk.cyan('Loaded Vaults:\n'));
|
|
515
|
+
vaults.forEach(vault => {
|
|
516
|
+
const isActive = vault.id === activeVault?.id;
|
|
517
|
+
const isUnlocked = this.ctx.isVaultUnlocked(vault.id);
|
|
518
|
+
const activeMarker = isActive ? chalk.green(' (active)') : '';
|
|
519
|
+
const lockIcon = isUnlocked ? chalk.green('🔓') : chalk.yellow('🔒');
|
|
520
|
+
console.log(` ${lockIcon} ${vault.name}${activeMarker} - ${vault.type}`);
|
|
521
|
+
});
|
|
522
|
+
console.log();
|
|
523
|
+
}
|
|
524
|
+
}
|
|
525
|
+
//# sourceMappingURL=session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/interactive/session.ts"],"names":[],"mappings":"AAWA,OAAO,EAAS,cAAc,EAAE,MAAM,eAAe,CAAA;AACrD,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,GAAG,MAAM,KAAK,CAAA;AACrB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAA;AAE5B,OAAO,EACL,kBAAkB,EAClB,gBAAgB,EAChB,cAAc,EACd,aAAa,EACb,aAAa,EACb,eAAe,EACf,aAAa,EACb,aAAa,EACb,WAAW,EACX,gBAAgB,EAChB,aAAa,EACb,WAAW,EACX,aAAa,EACb,WAAW,EACX,iBAAiB,EACjB,gBAAgB,EAChB,aAAa,EACb,aAAa,GACd,MAAM,aAAa,CAAA;AACpB,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAC9D,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAC5C,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AACtF,OAAO,EAAE,kBAAkB,EAAgB,MAAM,iBAAiB,CAAA;AAElE;;GAEG;AACH,SAAS,qBAAqB,CAAC,IAAY;IACzC,OAAO,GAAG,CAAC;QACT,IAAI;QACJ,UAAU,EAAE,KAAK;QACjB,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,SAAS,EAAE,IAAI;QACf,QAAQ,EAAE,KAAK;KAChB,CAAC,CAAA;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,OAAO,YAAY;IACf,GAAG,CAAc;IACjB,WAAW,CAAa;IACxB,UAAU,CAAkB;IAEpC,YAAY,GAAa,EAAE,OAAoC;QAC7D,IAAI,CAAC,GAAG,GAAG,kBAAkB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAA;QAC3C,IAAI,CAAC,WAAW,GAAG,IAAI,WAAW,EAAE,CAAA;IACtC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAK;QACT,OAAO,CAAC,KAAK,EAAE,CAAA;QACf,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,kDAAkD,CAAC,CAAC,CAAA;QAChF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC,CAAA;QACnE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,kDAAkD,CAAC,CAAC,CAAA;QAEhF,kBAAkB;QAClB,MAAM,IAAI,CAAC,aAAa,EAAE,CAAA;QAE1B,qBAAqB;QACrB,IAAI,CAAC,gBAAgB,EAAE,CAAA;QAEvB,kBAAkB;QAClB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,uDAAuD,CAAC,CAAC,CAAA;QAEhF,wCAAwC;QACxC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC;YAC3B,MAAM,EAAE,IAAI,CAAC,SAAS,EAAE;YACxB,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC;YACjC,eAAe,EAAE,IAAI;YACrB,QAAQ,EAAE,IAAI;YACd,SAAS,EAAE,IAAI;YACf,SAAS,EAAE,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC;SACrC,CAAC,CAAA;QAEF,sBAAsB;QACtB,IAAI,CAAC,iBAAiB,EAAE,CAAA;IAC1B,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,WAAW,CACvB,GAAW,EACX,QAAa,EACb,SAAiB,EACjB,QAAmD;QAEnD,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,EAAE,CAAA;QAExB,qBAAqB;QACrB,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,QAAQ,CAAC,IAAI,CAAC,CAAA;YACd,OAAM;QACR,CAAC;QAED,8BAA8B;QAC9B,MAAM,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;QAE7C,IAAI,CAAC;YACH,yDAAyD;YACzD,IAAI,CAAC,WAAW,CAAC,YAAY,EAAE,CAAA;YAE/B,kBAAkB;YAClB,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,IAAI,CAAC,CAAA;YAEtD,gDAAgD;YAChD,IAAI,CAAC,WAAW,CAAC,UAAU,EAAE,CAAA;YAE7B,0BAA0B;YAC1B,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAA;YAE3C,4BAA4B;YAC5B,QAAQ,CAAC,IAAI,CAAC,CAAA;YAEd,8CAA8C;YAC9C,qEAAqE;YACrE,IAAI,CAAC,oBAAoB,EAAE,CAAA;QAC7B,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,sCAAsC;YACtC,IAAI,CAAC,WAAW,CAAC,UAAU,EAAE,CAAA;YAE7B,aAAa;YACb,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,cAAc,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAA;YAEvD,gBAAgB;YAChB,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAA;YAE3C,oBAAoB;YACpB,QAAQ,CAAC,IAAI,CAAC,CAAA;YAEd,qCAAqC;YACrC,IAAI,CAAC,oBAAoB,EAAE,CAAA;QAC7B,CAAC;IACH,CAAC;IAED;;;OAGG;IACK,oBAAoB;QAC1B,yBAAyB;QACzB,IAAI,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAE,CAAC;YAC7B,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,CAAA;QACxB,CAAC;QAED,oEAAoE;QACpE,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,IAAI,CAAE,OAAO,CAAC,KAAa,CAAC,KAAK,EAAE,CAAC;YACzD,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAA;QAChC,CAAC;QAED,yBAAyB;QACzB,IAAI,CAAC,UAAU,CAAC,aAAa,EAAE,CAAA;IACjC,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,cAAc,CAAC,OAAe,EAAE,IAAc;QAC1D,QAAQ,OAAO,EAAE,CAAC;YAChB,mBAAmB;YACnB,KAAK,QAAQ;gBACX,MAAM,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;gBAC7B,MAAK;YAEP,KAAK,OAAO;gBACV,MAAM,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAA;gBAC5B,MAAK;YAEP,KAAK,QAAQ;gBACX,MAAM,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAA;gBAC5B,MAAK;YAEP,KAAK,QAAQ;gBACX,MAAM,IAAI,CAAC,WAAW,EAAE,CAAA;gBACxB,MAAK;YAEP,KAAK,MAAM;gBACT,MAAM,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;gBAC3B,MAAK;YAEP,KAAK,QAAQ;gBACX,MAAM,aAAa,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,SAAS,EAAE,CAAC,CAAA;gBAC1E,MAAK;YAEP,KAAK,QAAQ;gBACX,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBACtB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,yBAAyB,CAAC,CAAC,CAAA;oBACpD,OAAM;gBACR,CAAC;gBACD,MAAM,aAAa,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;gBAC7C,MAAK;YAEP,mBAAmB;YACnB,KAAK,SAAS,CAAC;YACf,KAAK,KAAK;gBACR,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAA;gBAC3B,MAAK;YAEP,KAAK,WAAW;gBACd,MAAM,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAA;gBAC7B,MAAK;YAEP,cAAc;YACd,KAAK,MAAM;gBACT,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;gBACxB,MAAK;YAEP,mBAAmB;YACnB,KAAK,WAAW;gBACd,MAAM,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;gBAChC,MAAK;YAEP,KAAK,QAAQ;gBACX,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAA;gBAC1B,MAAK;YAEP,KAAK,QAAQ;gBACX,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAA;gBAC1B,MAAK;YAEP,gBAAgB;YAChB,KAAK,aAAa;gBAChB,MAAM,iBAAiB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;gBACjC,MAAK;YAEP,KAAK,YAAY;gBACf,MAAM,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAA;gBAC7B,MAAK;YAEP,KAAK,MAAM;gBACT,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;gBACxB,MAAK;YAEP,sBAAsB;YACtB,KAAK,MAAM;gBACT,MAAM,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;gBAC3B,MAAK;YAEP,KAAK,QAAQ;gBACX,MAAM,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;gBAC7B,MAAK;YAEP,KAAK,QAAQ;gBACX,MAAM,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;gBAC7B,MAAK;YAEP,WAAW;YACX,KAAK,UAAU;gBACb,MAAM,eAAe,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAA;gBACxC,MAAK;YAEP,KAAK,QAAQ;gBACX,MAAM,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;gBAC7B,MAAK;YAEP,KAAK,cAAc;gBACjB,MAAM,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAA;gBAC/B,MAAK;YAEP,OAAO;YACP,KAAK,MAAM,CAAC;YACZ,KAAK,GAAG;gBACN,QAAQ,EAAE,CAAA;gBACV,MAAK;YAEP;gBACE,IAAI,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;oBACxC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,oBAAoB,OAAO,EAAE,CAAC,CAAC,CAAA;oBACxD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC,CAAA;gBAC/D,CAAC;gBACD,MAAK;QACT,CAAC;IACH,CAAC;IAED,8BAA8B;IAEtB,KAAK,CAAC,WAAW,CAAC,IAAc;QACtC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC,CAAA;YAChD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC,CAAA;YAC/D,OAAM;QACR,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QAChC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,SAAS,CAAC,CAAA;QAEjD,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,oBAAoB,SAAS,EAAE,CAAC,CAAC,CAAA;YACvD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC,CAAA;YAC/D,OAAM;QACR,CAAC;QAED,MAAM,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC,KAAK,CAAC,CAAA;QACpC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,oBAAoB,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAA;QAE1D,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;QACrD,MAAM,MAAM,GAAG,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;QAC5E,OAAO,CAAC,GAAG,CAAC,WAAW,MAAM,EAAE,CAAC,CAAA;IAClC,CAAC;IAEO,KAAK,CAAC,WAAW,CAAC,IAAc;QACtC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,sBAAsB,CAAC,CAAC,CAAA;YACjD,OAAM;QACR,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QAC/B,MAAM,KAAK,GAAG,MAAM,aAAa,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAA;QACrD,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;QACxB,IAAI,CAAC,WAAW,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAA;IAC7C,CAAC;IAEO,KAAK,CAAC,WAAW;QACvB,MAAM,KAAK,GAAG,MAAM,aAAa,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAA;QAC7D,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;QACxB,IAAI,CAAC,WAAW,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAA;IAC7C,CAAC;IAEO,KAAK,CAAC,UAAU,CAAC,IAAc;QACrC,MAAM,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,CAAA;QACxB,MAAM,aAAa,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAA;QAEtE,MAAM,cAAc,CAAC,IAAI,CAAC,GAAG,EAAE;YAC7B,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,eAAe,CAAC,QAAQ,CAAC,IAAK,QAAkB,CAAC,CAAC,CAAC,SAAS;YAC9E,aAAa;SACd,CAAC,CAAA;IACJ,CAAC;IAEO,KAAK,CAAC,YAAY,CAAC,IAAc;QACvC,IAAI,QAAQ,GAAiB,KAAK,CAAA;QAElC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACrC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;gBAC1E,QAAQ,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,EAAkB,CAAA;gBACpD,CAAC,EAAE,CAAA;YACL,CAAC;QACH,CAAC;QAED,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YACvC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,qBAAqB,QAAQ,EAAE,CAAC,CAAC,CAAA;YACvD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,yBAAyB,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAA;YAC/E,OAAM;QACR,CAAC;QAED,MAAM,gBAAgB,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAA;IAChD,CAAC;IAEO,KAAK,CAAC,OAAO,CAAC,IAAc;QAClC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,uEAAuE,CAAC,CAAC,CAAA;YAClG,OAAM;QACR,CAAC;QAED,MAAM,CAAC,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAA;QAC5C,MAAM,KAAK,GAAG,eAAe,CAAC,QAAQ,CAAC,IAAK,QAAkB,CAAA;QAE9D,IAAI,OAA2B,CAAA;QAC/B,IAAI,IAAwB,CAAA;QAE5B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACrC,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,SAAS,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;gBACjD,OAAO,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;gBACrB,CAAC,EAAE,CAAA;YACL,CAAC;iBAAM,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;gBACvD,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;gBAClC,MAAK;YACP,CAAC;QACH,CAAC;QAED,IAAI,CAAC;YACH,MAAM,WAAW,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAA;QACnE,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,IAAI,GAAG,CAAC,OAAO,KAAK,+BAA+B,EAAE,CAAC;gBACpD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,yBAAyB,CAAC,CAAC,CAAA;gBACpD,OAAM;YACR,CAAC;YACD,MAAM,GAAG,CAAA;QACX,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,SAAS,CAAC,IAAc;QACpC,IAAI,QAA2B,CAAA;QAC/B,IAAI,WAA8B,CAAA;QAElC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACrC,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;gBAC/C,MAAM,KAAK,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;gBAC1C,IAAI,CAAC,KAAK,EAAE,CAAC;oBACX,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,kBAAkB,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;oBACvD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC,CAAA;oBACrE,OAAM;gBACR,CAAC;gBACD,QAAQ,GAAG,KAAK,CAAA;gBAChB,CAAC,EAAE,CAAA;YACL,CAAC;iBAAM,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,UAAU,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;gBACzD,MAAM,KAAK,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;gBAC1C,IAAI,CAAC,KAAK,EAAE,CAAC;oBACX,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,kBAAkB,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;oBACvD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC,CAAA;oBACrE,OAAM;gBACR,CAAC;gBACD,WAAW,GAAG,KAAK,CAAA;gBACnB,CAAC,EAAE,CAAA;YACL,CAAC;QACH,CAAC;QAED,MAAM,aAAa,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAA;IACvE,CAAC;IAEO,KAAK,CAAC,SAAS,CAAC,IAAc;QACpC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,8DAA8D,CAAC,CAAC,CAAA;YACzF,OAAM;QACR,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,CAAA;QACxB,MAAM,KAAK,GAAG,eAAe,CAAC,QAAQ,CAAC,IAAK,QAAkB,CAAA;QAE9D,IAAI,GAAuB,CAAA;QAC3B,IAAI,MAA0B,CAAA;QAE9B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACrC,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;gBAC/C,GAAG,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;gBACjB,CAAC,EAAE,CAAA;YACL,CAAC;iBAAM,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,UAAU,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;gBACzD,MAAM,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;gBACpB,CAAC,EAAE,CAAA;YACL,CAAC;QACH,CAAC;QAED,MAAM,aAAa,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,CAAA;IACvD,CAAC;IAEO,KAAK,CAAC,YAAY,CAAC,IAAc;QACvC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpB,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,MAAM,CAAC,4FAA4F,CAAC,CAC3G,CAAA;YACD,OAAM;QACR,CAAC;QAED,MAAM,CAAC,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAA;QAC3D,MAAM,SAAS,GAAG,eAAe,CAAC,YAAY,CAAC,IAAK,YAAsB,CAAA;QAC1E,MAAM,OAAO,GAAG,eAAe,CAAC,UAAU,CAAC,IAAK,UAAoB,CAAA;QACpE,MAAM,MAAM,GAAG,UAAU,CAAC,SAAS,CAAC,CAAA;QAEpC,IAAI,SAA6B,CAAA;QACjC,IAAI,OAA2B,CAAA;QAE/B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACrC,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,cAAc,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;gBACtD,SAAS,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;gBACvB,CAAC,EAAE,CAAA;YACL,CAAC;iBAAM,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,YAAY,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;gBAC3D,OAAO,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;gBACrB,CAAC,EAAE,CAAA;YACL,CAAC;QACH,CAAC;QAED,MAAM,gBAAgB,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,CAAA;IACtF,CAAC;IAEO,KAAK,CAAC,OAAO,CAAC,IAAc;QAClC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpB,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,MAAM,CACV,yGAAyG,CAC1G,CACF,CAAA;YACD,OAAM;QACR,CAAC;QAED,MAAM,CAAC,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAA;QAC3D,MAAM,SAAS,GAAG,eAAe,CAAC,YAAY,CAAC,IAAK,YAAsB,CAAA;QAC1E,MAAM,OAAO,GAAG,eAAe,CAAC,UAAU,CAAC,IAAK,UAAoB,CAAA;QACpE,MAAM,MAAM,GAAG,UAAU,CAAC,SAAS,CAAC,CAAA;QAEpC,IAAI,SAA6B,CAAA;QACjC,IAAI,OAA2B,CAAA;QAC/B,IAAI,QAA4B,CAAA;QAEhC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACrC,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,cAAc,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;gBACtD,SAAS,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;gBACvB,CAAC,EAAE,CAAA;YACL,CAAC;iBAAM,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,YAAY,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;gBAC3D,OAAO,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;gBACrB,CAAC,EAAE,CAAA;YACL,CAAC;iBAAM,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,YAAY,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;gBAC3D,QAAQ,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;gBAClC,CAAC,EAAE,CAAA;YACL,CAAC;QACH,CAAC;QAED,IAAI,CAAC;YACH,MAAM,WAAW,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAA;QAC3F,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,IAAI,GAAG,CAAC,OAAO,KAAK,wBAAwB,EAAE,CAAC;gBAC7C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC,CAAA;gBAC7C,OAAM;YACR,CAAC;YACD,MAAM,GAAG,CAAA;QACX,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,cAAc,CAAC,IAAc;QACzC,IAAI,GAAG,GAAG,KAAK,CAAA;QACf,IAAI,MAA0B,CAAA;QAC9B,IAAI,KAAwB,CAAA;QAE5B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACrC,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,OAAO,EAAE,CAAC;gBACxB,GAAG,GAAG,IAAI,CAAA;YACZ,CAAC;iBAAM,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,UAAU,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;gBACzD,MAAM,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;gBACpB,CAAC,EAAE,CAAA;YACL,CAAC;iBAAM,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,SAAS,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;gBACxD,KAAK,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAK,IAAI,CAAC,CAAC,GAAG,CAAC,CAAW,CAAA;gBAC9D,CAAC,EAAE,CAAA;YACL,CAAC;QACH,CAAC;QAED,MAAM,kBAAkB,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAA;IAC5D,CAAC;IAED,oBAAoB;IAEZ,iBAAiB;QACvB,oBAAoB;QACpB,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,MAAM,EAAE;YACpC,IAAI,EAAE,yBAAyB;YAC/B,MAAM,EAAE,GAAG,EAAE;gBACX,QAAQ,EAAE,CAAA;gBACV,IAAI,CAAC,UAAU,CAAC,aAAa,EAAE,CAAA;YACjC,CAAC;SACF,CAAC,CAAA;QAEF,qBAAqB;QACrB,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,OAAO,EAAE;YACrC,IAAI,EAAE,kBAAkB;YACxB,MAAM,EAAE,GAAG,EAAE;gBACX,OAAO,CAAC,KAAK,EAAE,CAAA;gBACf,IAAI,CAAC,gBAAgB,EAAE,CAAA;gBACvB,IAAI,CAAC,UAAU,CAAC,aAAa,EAAE,CAAA;YACjC,CAAC;SACF,CAAC,CAAA;QAEF,6BAA6B;QAC7B,MAAM,YAAY,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAA;QAClD,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,MAAM,EAAE;YACpC,IAAI,EAAE,YAAY,CAAC,IAAI;YACvB,MAAM,EAAE,GAAG,EAAE;gBACX,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAA;gBACvC,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAA;gBAClB,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;YAC3C,CAAC;SACF,CAAC,CAAA;IACJ,CAAC;IAEO,KAAK,CAAC,aAAa;QACzB,MAAM,OAAO,GAAG,qBAAqB,CAAC,mBAAmB,CAAC,CAAC,KAAK,EAAE,CAAA;QAElE,IAAI,CAAC;YACH,0BAA0B;YAC1B,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,cAAc,EAAE,CAAA;YACvD,IAAI,WAAW,EAAE,CAAC;gBAChB,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAA;gBAC9B,MAAM,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC,WAAW,CAAC,CAAA;gBAC1C,IAAI,CAAC,WAAW,CAAC,mBAAmB,CAAC,WAAW,CAAC,CAAA;YACnD,CAAC;YAED,kBAAkB;YAClB,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,UAAU,EAAE,CAAA;YACjD,IAAI,SAAS,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACtC,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;oBACxB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC;wBACrC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;wBACxB,IAAI,CAAC,WAAW,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAA;oBAC7C,CAAC;gBACH,CAAC,CAAC,CAAA;gBAEF,wCAAwC;gBACxC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,cAAc,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;oBAChE,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAA;oBAC7D,MAAM,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC,UAAU,CAAC,CAAA;gBAC3C,CAAC;gBAED,OAAO,CAAC,OAAO,CAAC,UAAU,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,IAAI,WAAW,CAAC,CAAA;YACjE,CAAC;iBAAM,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;gBACzC,OAAO,CAAC,OAAO,CAAC,UAAU,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,IAAI,WAAW,CAAC,CAAA;YACjE,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAA;YACpC,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;gBAClC,OAAO,CAAC,OAAO,CAAC,UAAU,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,IAAI,WAAW,CAAC,CAAA;YACjE,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAA;gBACrC,MAAM,KAAK,CAAA;YACb,CAAC;QACH,CAAC;IACH,CAAC;IAEO,SAAS;QACf,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,cAAc,EAAE,CAAA;QACvC,IAAI,CAAC,KAAK;YAAE,OAAO,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;QAEzC,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;QACrD,MAAM,MAAM,GAAG,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;QAClE,OAAO,KAAK,CAAC,IAAI,CAAC,UAAU,KAAK,CAAC,IAAI,IAAI,MAAM,IAAI,CAAC,CAAA;IACvD,CAAC;IAEO,gBAAgB;QACtB,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,MAAM,EAAE,CAAC,CAAA;QACxD,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,cAAc,EAAE,CAAA;QAE7C,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,oEAAoE,CAAC,CAAC,CAAA;YAC/F,OAAM;QACR,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAA;QAC3C,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;YACrB,MAAM,QAAQ,GAAG,KAAK,CAAC,EAAE,KAAK,WAAW,EAAE,EAAE,CAAA;YAC7C,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;YACrD,MAAM,YAAY,GAAG,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;YAC7D,MAAM,QAAQ,GAAG,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;YACpE,OAAO,CAAC,GAAG,CAAC,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,GAAG,YAAY,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC,CAAA;QAC3E,CAAC,CAAC,CAAA;QACF,OAAO,CAAC,GAAG,EAAE,CAAA;IACf,CAAC;CACF"}
|