@dynamic-labs-wallet/sui 0.0.94 → 0.0.97
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/index.cjs.js +43 -19
- package/index.esm.js +43 -19
- package/package.json +2 -2
- package/src/client/client.d.ts +10 -8
- package/src/client/client.d.ts.map +1 -1
package/index.cjs.js
CHANGED
|
@@ -57,6 +57,13 @@ class DynamicSuiWalletClient extends browser.DynamicWalletClient {
|
|
|
57
57
|
thresholdSignatureScheme,
|
|
58
58
|
clientKeySharesBackupInfo: browser.getClientKeyShareBackupInfo()
|
|
59
59
|
});
|
|
60
|
+
this.logger.debug('walletMap updated for wallet', {
|
|
61
|
+
context: {
|
|
62
|
+
accountAddress,
|
|
63
|
+
walletId,
|
|
64
|
+
walletMap: this.walletMap
|
|
65
|
+
}
|
|
66
|
+
});
|
|
60
67
|
ceremonyCeremonyCompleteResolver(undefined);
|
|
61
68
|
}
|
|
62
69
|
});
|
|
@@ -75,7 +82,6 @@ class DynamicSuiWalletClient extends browser.DynamicWalletClient {
|
|
|
75
82
|
clientKeyShares,
|
|
76
83
|
overwriteOrMerge: 'overwrite'
|
|
77
84
|
});
|
|
78
|
-
// Backup the new wallet without waiting for the promise to resolve
|
|
79
85
|
await this.storeEncryptedBackupByWalletWithRetry({
|
|
80
86
|
accountAddress,
|
|
81
87
|
clientKeyShares,
|
|
@@ -218,11 +224,15 @@ class DynamicSuiWalletClient extends browser.DynamicWalletClient {
|
|
|
218
224
|
* The output is compatible with RFC8032 Ed25519 private key format.
|
|
219
225
|
*
|
|
220
226
|
* @param suiPrivateKey - The Sui private key in Bech32 format starting with "suiprivkey1"
|
|
221
|
-
* @returns
|
|
227
|
+
* @returns An object containing the private key and the private key bytes
|
|
222
228
|
* @throws Error if the input is not a valid Sui private key format
|
|
223
|
-
*/
|
|
229
|
+
*/ convertSuiPrivateKey(suiPrivateKey) {
|
|
224
230
|
if (!suiPrivateKey.startsWith('suiprivkey1')) {
|
|
225
|
-
|
|
231
|
+
this.logger.debug('Sui private key not in Bech32 format');
|
|
232
|
+
return {
|
|
233
|
+
privateKey: suiPrivateKey,
|
|
234
|
+
privateKeyBytes: Buffer.from(suiPrivateKey, 'hex')
|
|
235
|
+
};
|
|
226
236
|
}
|
|
227
237
|
try {
|
|
228
238
|
const suiConverter = converter('suiprivkey');
|
|
@@ -234,7 +244,10 @@ class DynamicSuiWalletClient extends browser.DynamicWalletClient {
|
|
|
234
244
|
if (cleanHex.length !== 64) {
|
|
235
245
|
throw new Error(`Invalid output: Expected 64 characters, got ${cleanHex.length}`);
|
|
236
246
|
}
|
|
237
|
-
return
|
|
247
|
+
return {
|
|
248
|
+
privateKey: cleanHex.toLowerCase(),
|
|
249
|
+
privateKeyBytes: Buffer.from(cleanHex, 'hex')
|
|
250
|
+
};
|
|
238
251
|
} catch (error) {
|
|
239
252
|
if (error instanceof Error) {
|
|
240
253
|
throw new Error(`Failed to convert Sui private key: ${error.message}`);
|
|
@@ -244,19 +257,23 @@ class DynamicSuiWalletClient extends browser.DynamicWalletClient {
|
|
|
244
257
|
}
|
|
245
258
|
/**
|
|
246
259
|
* Gets the public key for a given private key
|
|
247
|
-
*
|
|
248
|
-
* @
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
260
|
+
* @param privateKeyBytes A Buffer containing the Ed25519 private key bytes
|
|
261
|
+
* @returns The public key (Sui address) derived from the private key
|
|
262
|
+
*/ getPublicKeyFromPrivateKey(privateKeyBytes) {
|
|
263
|
+
try {
|
|
264
|
+
const keypair = ed25519.Ed25519Keypair.fromSecretKey(privateKeyBytes);
|
|
265
|
+
const publicKey = keypair.getPublicKey();
|
|
266
|
+
const publicKeyBase58 = publicKey.toSuiAddress();
|
|
267
|
+
return publicKeyBase58;
|
|
268
|
+
} catch (error) {
|
|
269
|
+
this.logger.error('Unable to derive public key from private key. Check private key format', error instanceof Error ? error.message : 'Unknown error');
|
|
270
|
+
throw error;
|
|
271
|
+
}
|
|
255
272
|
}
|
|
256
273
|
/**
|
|
257
274
|
* Imports the private key for a given account address
|
|
258
275
|
*
|
|
259
|
-
* @param privateKey The private key to import
|
|
276
|
+
* @param privateKey The private key to import, accepts both Bech32 and hex formats
|
|
260
277
|
* @param chainName The chain name to import the private key for
|
|
261
278
|
* @param thresholdSignatureScheme The threshold signature scheme to use
|
|
262
279
|
* @param password The password for encrypted backup shares
|
|
@@ -267,8 +284,8 @@ class DynamicSuiWalletClient extends browser.DynamicWalletClient {
|
|
|
267
284
|
const ceremonyCompletePromise = new Promise((resolve)=>{
|
|
268
285
|
ceremonyCeremonyCompleteResolver = resolve;
|
|
269
286
|
});
|
|
270
|
-
const
|
|
271
|
-
const
|
|
287
|
+
const { privateKey: formattedPrivateKey, privateKeyBytes } = await this.convertSuiPrivateKey(privateKey);
|
|
288
|
+
const publicKey = this.getPublicKeyFromPrivateKey(privateKeyBytes);
|
|
272
289
|
const { rawPublicKey, clientKeyShares } = await this.importRawPrivateKey({
|
|
273
290
|
chainName,
|
|
274
291
|
privateKey: formattedPrivateKey,
|
|
@@ -286,6 +303,13 @@ class DynamicSuiWalletClient extends browser.DynamicWalletClient {
|
|
|
286
303
|
thresholdSignatureScheme,
|
|
287
304
|
clientKeySharesBackupInfo: browser.getClientKeyShareBackupInfo()
|
|
288
305
|
});
|
|
306
|
+
this.logger.debug('walletMap updated for wallet', {
|
|
307
|
+
context: {
|
|
308
|
+
accountAddress,
|
|
309
|
+
walletId,
|
|
310
|
+
walletMap: this.walletMap
|
|
311
|
+
}
|
|
312
|
+
});
|
|
289
313
|
ceremonyCeremonyCompleteResolver(undefined);
|
|
290
314
|
}
|
|
291
315
|
});
|
|
@@ -307,7 +331,6 @@ class DynamicSuiWalletClient extends browser.DynamicWalletClient {
|
|
|
307
331
|
clientKeyShares,
|
|
308
332
|
overwriteOrMerge: 'overwrite'
|
|
309
333
|
});
|
|
310
|
-
// Backup the new wallet without waiting for the promise to resolve
|
|
311
334
|
await this.storeEncryptedBackupByWalletWithRetry({
|
|
312
335
|
accountAddress,
|
|
313
336
|
clientKeyShares,
|
|
@@ -329,7 +352,7 @@ class DynamicSuiWalletClient extends browser.DynamicWalletClient {
|
|
|
329
352
|
*
|
|
330
353
|
* @param accountAddress The account address to export the private key for
|
|
331
354
|
* @param password The password for encrypted backup shares
|
|
332
|
-
* @returns The private key
|
|
355
|
+
* @returns The private key in hex format
|
|
333
356
|
*/ async exportPrivateKey({ accountAddress, password = undefined, signedSessionId }) {
|
|
334
357
|
try {
|
|
335
358
|
const { derivedPrivateKey } = await this.exportKey({
|
|
@@ -341,7 +364,8 @@ class DynamicSuiWalletClient extends browser.DynamicWalletClient {
|
|
|
341
364
|
if (!derivedPrivateKey) {
|
|
342
365
|
throw new Error('Derived private key is undefined');
|
|
343
366
|
}
|
|
344
|
-
|
|
367
|
+
const privateScalarHex = derivedPrivateKey.slice(0, 64);
|
|
368
|
+
return privateScalarHex;
|
|
345
369
|
} catch (error) {
|
|
346
370
|
this.logger.error(browser.ERROR_EXPORT_PRIVATE_KEY, error);
|
|
347
371
|
throw new Error(browser.ERROR_EXPORT_PRIVATE_KEY);
|
package/index.esm.js
CHANGED
|
@@ -55,6 +55,13 @@ class DynamicSuiWalletClient extends DynamicWalletClient {
|
|
|
55
55
|
thresholdSignatureScheme,
|
|
56
56
|
clientKeySharesBackupInfo: getClientKeyShareBackupInfo()
|
|
57
57
|
});
|
|
58
|
+
this.logger.debug('walletMap updated for wallet', {
|
|
59
|
+
context: {
|
|
60
|
+
accountAddress,
|
|
61
|
+
walletId,
|
|
62
|
+
walletMap: this.walletMap
|
|
63
|
+
}
|
|
64
|
+
});
|
|
58
65
|
ceremonyCeremonyCompleteResolver(undefined);
|
|
59
66
|
}
|
|
60
67
|
});
|
|
@@ -73,7 +80,6 @@ class DynamicSuiWalletClient extends DynamicWalletClient {
|
|
|
73
80
|
clientKeyShares,
|
|
74
81
|
overwriteOrMerge: 'overwrite'
|
|
75
82
|
});
|
|
76
|
-
// Backup the new wallet without waiting for the promise to resolve
|
|
77
83
|
await this.storeEncryptedBackupByWalletWithRetry({
|
|
78
84
|
accountAddress,
|
|
79
85
|
clientKeyShares,
|
|
@@ -216,11 +222,15 @@ class DynamicSuiWalletClient extends DynamicWalletClient {
|
|
|
216
222
|
* The output is compatible with RFC8032 Ed25519 private key format.
|
|
217
223
|
*
|
|
218
224
|
* @param suiPrivateKey - The Sui private key in Bech32 format starting with "suiprivkey1"
|
|
219
|
-
* @returns
|
|
225
|
+
* @returns An object containing the private key and the private key bytes
|
|
220
226
|
* @throws Error if the input is not a valid Sui private key format
|
|
221
|
-
*/
|
|
227
|
+
*/ convertSuiPrivateKey(suiPrivateKey) {
|
|
222
228
|
if (!suiPrivateKey.startsWith('suiprivkey1')) {
|
|
223
|
-
|
|
229
|
+
this.logger.debug('Sui private key not in Bech32 format');
|
|
230
|
+
return {
|
|
231
|
+
privateKey: suiPrivateKey,
|
|
232
|
+
privateKeyBytes: Buffer.from(suiPrivateKey, 'hex')
|
|
233
|
+
};
|
|
224
234
|
}
|
|
225
235
|
try {
|
|
226
236
|
const suiConverter = converter('suiprivkey');
|
|
@@ -232,7 +242,10 @@ class DynamicSuiWalletClient extends DynamicWalletClient {
|
|
|
232
242
|
if (cleanHex.length !== 64) {
|
|
233
243
|
throw new Error(`Invalid output: Expected 64 characters, got ${cleanHex.length}`);
|
|
234
244
|
}
|
|
235
|
-
return
|
|
245
|
+
return {
|
|
246
|
+
privateKey: cleanHex.toLowerCase(),
|
|
247
|
+
privateKeyBytes: Buffer.from(cleanHex, 'hex')
|
|
248
|
+
};
|
|
236
249
|
} catch (error) {
|
|
237
250
|
if (error instanceof Error) {
|
|
238
251
|
throw new Error(`Failed to convert Sui private key: ${error.message}`);
|
|
@@ -242,19 +255,23 @@ class DynamicSuiWalletClient extends DynamicWalletClient {
|
|
|
242
255
|
}
|
|
243
256
|
/**
|
|
244
257
|
* Gets the public key for a given private key
|
|
245
|
-
*
|
|
246
|
-
* @
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
258
|
+
* @param privateKeyBytes A Buffer containing the Ed25519 private key bytes
|
|
259
|
+
* @returns The public key (Sui address) derived from the private key
|
|
260
|
+
*/ getPublicKeyFromPrivateKey(privateKeyBytes) {
|
|
261
|
+
try {
|
|
262
|
+
const keypair = Ed25519Keypair.fromSecretKey(privateKeyBytes);
|
|
263
|
+
const publicKey = keypair.getPublicKey();
|
|
264
|
+
const publicKeyBase58 = publicKey.toSuiAddress();
|
|
265
|
+
return publicKeyBase58;
|
|
266
|
+
} catch (error) {
|
|
267
|
+
this.logger.error('Unable to derive public key from private key. Check private key format', error instanceof Error ? error.message : 'Unknown error');
|
|
268
|
+
throw error;
|
|
269
|
+
}
|
|
253
270
|
}
|
|
254
271
|
/**
|
|
255
272
|
* Imports the private key for a given account address
|
|
256
273
|
*
|
|
257
|
-
* @param privateKey The private key to import
|
|
274
|
+
* @param privateKey The private key to import, accepts both Bech32 and hex formats
|
|
258
275
|
* @param chainName The chain name to import the private key for
|
|
259
276
|
* @param thresholdSignatureScheme The threshold signature scheme to use
|
|
260
277
|
* @param password The password for encrypted backup shares
|
|
@@ -265,8 +282,8 @@ class DynamicSuiWalletClient extends DynamicWalletClient {
|
|
|
265
282
|
const ceremonyCompletePromise = new Promise((resolve)=>{
|
|
266
283
|
ceremonyCeremonyCompleteResolver = resolve;
|
|
267
284
|
});
|
|
268
|
-
const
|
|
269
|
-
const
|
|
285
|
+
const { privateKey: formattedPrivateKey, privateKeyBytes } = await this.convertSuiPrivateKey(privateKey);
|
|
286
|
+
const publicKey = this.getPublicKeyFromPrivateKey(privateKeyBytes);
|
|
270
287
|
const { rawPublicKey, clientKeyShares } = await this.importRawPrivateKey({
|
|
271
288
|
chainName,
|
|
272
289
|
privateKey: formattedPrivateKey,
|
|
@@ -284,6 +301,13 @@ class DynamicSuiWalletClient extends DynamicWalletClient {
|
|
|
284
301
|
thresholdSignatureScheme,
|
|
285
302
|
clientKeySharesBackupInfo: getClientKeyShareBackupInfo()
|
|
286
303
|
});
|
|
304
|
+
this.logger.debug('walletMap updated for wallet', {
|
|
305
|
+
context: {
|
|
306
|
+
accountAddress,
|
|
307
|
+
walletId,
|
|
308
|
+
walletMap: this.walletMap
|
|
309
|
+
}
|
|
310
|
+
});
|
|
287
311
|
ceremonyCeremonyCompleteResolver(undefined);
|
|
288
312
|
}
|
|
289
313
|
});
|
|
@@ -305,7 +329,6 @@ class DynamicSuiWalletClient extends DynamicWalletClient {
|
|
|
305
329
|
clientKeyShares,
|
|
306
330
|
overwriteOrMerge: 'overwrite'
|
|
307
331
|
});
|
|
308
|
-
// Backup the new wallet without waiting for the promise to resolve
|
|
309
332
|
await this.storeEncryptedBackupByWalletWithRetry({
|
|
310
333
|
accountAddress,
|
|
311
334
|
clientKeyShares,
|
|
@@ -327,7 +350,7 @@ class DynamicSuiWalletClient extends DynamicWalletClient {
|
|
|
327
350
|
*
|
|
328
351
|
* @param accountAddress The account address to export the private key for
|
|
329
352
|
* @param password The password for encrypted backup shares
|
|
330
|
-
* @returns The private key
|
|
353
|
+
* @returns The private key in hex format
|
|
331
354
|
*/ async exportPrivateKey({ accountAddress, password = undefined, signedSessionId }) {
|
|
332
355
|
try {
|
|
333
356
|
const { derivedPrivateKey } = await this.exportKey({
|
|
@@ -339,7 +362,8 @@ class DynamicSuiWalletClient extends DynamicWalletClient {
|
|
|
339
362
|
if (!derivedPrivateKey) {
|
|
340
363
|
throw new Error('Derived private key is undefined');
|
|
341
364
|
}
|
|
342
|
-
|
|
365
|
+
const privateScalarHex = derivedPrivateKey.slice(0, 64);
|
|
366
|
+
return privateScalarHex;
|
|
343
367
|
} catch (error) {
|
|
344
368
|
this.logger.error(ERROR_EXPORT_PRIVATE_KEY, error);
|
|
345
369
|
throw new Error(ERROR_EXPORT_PRIVATE_KEY);
|
package/package.json
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dynamic-labs-wallet/sui",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.97",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"dependencies": {
|
|
6
|
-
"@dynamic-labs-wallet/browser": "0.0.
|
|
6
|
+
"@dynamic-labs-wallet/browser": "0.0.97",
|
|
7
7
|
"@mysten/sui": "1.26.0",
|
|
8
8
|
"@noble/hashes": "1.7.1",
|
|
9
9
|
"bech32-converting": "^1.0.9"
|
package/src/client/client.d.ts
CHANGED
|
@@ -45,21 +45,23 @@ export declare class DynamicSuiWalletClient extends DynamicWalletClient {
|
|
|
45
45
|
* The output is compatible with RFC8032 Ed25519 private key format.
|
|
46
46
|
*
|
|
47
47
|
* @param suiPrivateKey - The Sui private key in Bech32 format starting with "suiprivkey1"
|
|
48
|
-
* @returns
|
|
48
|
+
* @returns An object containing the private key and the private key bytes
|
|
49
49
|
* @throws Error if the input is not a valid Sui private key format
|
|
50
50
|
*/
|
|
51
|
-
|
|
51
|
+
convertSuiPrivateKey(suiPrivateKey: string): {
|
|
52
|
+
privateKey: string;
|
|
53
|
+
privateKeyBytes: Buffer;
|
|
54
|
+
};
|
|
52
55
|
/**
|
|
53
56
|
* Gets the public key for a given private key
|
|
54
|
-
*
|
|
55
|
-
* @
|
|
56
|
-
* @returns The public key for the given private key
|
|
57
|
+
* @param privateKeyBytes A Buffer containing the Ed25519 private key bytes
|
|
58
|
+
* @returns The public key (Sui address) derived from the private key
|
|
57
59
|
*/
|
|
58
|
-
getPublicKeyFromPrivateKey(
|
|
60
|
+
getPublicKeyFromPrivateKey(privateKeyBytes: Buffer): string;
|
|
59
61
|
/**
|
|
60
62
|
* Imports the private key for a given account address
|
|
61
63
|
*
|
|
62
|
-
* @param privateKey The private key to import
|
|
64
|
+
* @param privateKey The private key to import, accepts both Bech32 and hex formats
|
|
63
65
|
* @param chainName The chain name to import the private key for
|
|
64
66
|
* @param thresholdSignatureScheme The threshold signature scheme to use
|
|
65
67
|
* @param password The password for encrypted backup shares
|
|
@@ -82,7 +84,7 @@ export declare class DynamicSuiWalletClient extends DynamicWalletClient {
|
|
|
82
84
|
*
|
|
83
85
|
* @param accountAddress The account address to export the private key for
|
|
84
86
|
* @param password The password for encrypted backup shares
|
|
85
|
-
* @returns The private key
|
|
87
|
+
* @returns The private key in hex format
|
|
86
88
|
*/
|
|
87
89
|
exportPrivateKey({ accountAddress, password, signedSessionId, }: {
|
|
88
90
|
accountAddress: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/client/client.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,mBAAmB,EACnB,wBAAwB,EACxB,wBAAwB,EAWzB,MAAM,8BAA8B,CAAC;AAWtC,qBAAa,sBAAuB,SAAQ,mBAAmB;IAC7D,QAAQ,CAAC,SAAS,SAAS;gBAEf,EACV,aAAa,EACb,SAAS,EACT,UAAU,EACV,kBAAkB,EAClB,UAAU,EACV,KAAK,GACN,EAAE,wBAAwB;IAWrB,mBAAmB,CAAC,EACxB,wBAAwB,EACxB,QAAoB,EACpB,OAAO,EACP,eAAe,GAChB,EAAE;QACD,wBAAwB,EAAE,wBAAwB,CAAC;QACnD,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;QACjC,eAAe,CAAC,EAAE,MAAM,CAAC;KAC1B,GAAG,OAAO,CAAC;QACV,cAAc,EAAE,MAAM,CAAC;QACvB,YAAY,EAAE,MAAM,CAAC;QACrB,YAAY,EAAE,MAAM,GAAG,SAAS,CAAC;KAClC,CAAC;
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/client/client.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,mBAAmB,EACnB,wBAAwB,EACxB,wBAAwB,EAWzB,MAAM,8BAA8B,CAAC;AAWtC,qBAAa,sBAAuB,SAAQ,mBAAmB;IAC7D,QAAQ,CAAC,SAAS,SAAS;gBAEf,EACV,aAAa,EACb,SAAS,EACT,UAAU,EACV,kBAAkB,EAClB,UAAU,EACV,KAAK,GACN,EAAE,wBAAwB;IAWrB,mBAAmB,CAAC,EACxB,wBAAwB,EACxB,QAAoB,EACpB,OAAO,EACP,eAAe,GAChB,EAAE;QACD,wBAAwB,EAAE,wBAAwB,CAAC;QACnD,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;QACjC,eAAe,CAAC,EAAE,MAAM,CAAC;KAC1B,GAAG,OAAO,CAAC;QACV,cAAc,EAAE,MAAM,CAAC;QACvB,YAAY,EAAE,MAAM,CAAC;QACrB,YAAY,EAAE,MAAM,GAAG,SAAS,CAAC;KAClC,CAAC;IAsEI,kCAAkC,CAAC,EACvC,SAAS,EACT,cAAc,GACf,EAAE;QACD,SAAS,EAAE,MAAM,CAAC;QAClB,cAAc,EAAE,cAAc,CAAC;KAChC;IAYD;;OAEG;YACW,eAAe;YAoCf,sBAAsB;YA6BtB,0BAA0B;IA6BlC,WAAW,CAAC,EAChB,OAAO,EACP,cAAc,EACd,QAAoB,EACpB,eAAe,GAChB,EAAE;QACD,OAAO,EAAE,MAAM,CAAC;QAChB,cAAc,EAAE,MAAM,CAAC;QACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,eAAe,CAAC,EAAE,MAAM,CAAC;KAC1B,GAAG,OAAO,CAAC,MAAM,CAAC;IAkCb,eAAe,CAAC,EACpB,WAAW,EACX,aAAa,EACb,QAAoB,EACpB,eAAe,GAChB,EAAE;QACD,WAAW,EAAE,MAAM,CAAC;QACpB,aAAa,EAAE,MAAM,CAAC;QACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,eAAe,CAAC,EAAE,MAAM,CAAC;KAC1B,GAAG,OAAO,CAAC,MAAM,CAAC;IAiCnB,oBAAoB,CAAC,EAAE,YAAY,EAAE,EAAE;QAAE,YAAY,EAAE,MAAM,CAAA;KAAE;;;;IAW/D;;;;;;;OAOG;IACH,oBAAoB,CAAC,aAAa,EAAE,MAAM,GAAG;QAC3C,UAAU,EAAE,MAAM,CAAC;QACnB,eAAe,EAAE,MAAM,CAAC;KACzB;IAqCD;;;;OAIG;IACH,0BAA0B,CAAC,eAAe,EAAE,MAAM;IAelD;;;;;;;;OAQG;IACG,gBAAgB,CAAC,EACrB,UAAU,EACV,SAAS,EACT,wBAAwB,EACxB,QAAoB,EACpB,OAAO,EACP,eAAe,GAChB,EAAE;QACD,UAAU,EAAE,MAAM,CAAC;QACnB,SAAS,EAAE,MAAM,CAAC;QAClB,wBAAwB,EAAE,wBAAwB,CAAC;QACnD,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;QACjC,eAAe,CAAC,EAAE,MAAM,CAAC;KAC1B,GAAG,OAAO,CAAC;QACV,cAAc,EAAE,MAAM,CAAC;QACvB,YAAY,EAAE,MAAM,GAAG,SAAS,CAAC;QACjC,eAAe,EAAE,cAAc,EAAE,CAAC;KACnC,CAAC;IAmFF;;;;;;OAMG;IACG,gBAAgB,CAAC,EACrB,cAAc,EACd,QAAoB,EACpB,eAAe,GAChB,EAAE;QACD,cAAc,EAAE,MAAM,CAAC;QACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,eAAe,CAAC,EAAE,MAAM,CAAC;KAC1B;IAmBK,aAAa;CAOpB"}
|