@dynamic-labs-wallet/svm 0.0.46 → 0.0.48
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 +50 -57
- package/index.esm.js +51 -58
- package/package.json +3 -3
- package/src/svm/constants.d.ts +2 -0
- package/src/svm/constants.d.ts.map +1 -0
- package/src/svm/svm.d.ts.map +1 -1
package/index.cjs.js
CHANGED
|
@@ -5,6 +5,17 @@ var bs58 = require('bs58');
|
|
|
5
5
|
var web3_js = require('@solana/web3.js');
|
|
6
6
|
require('@dynamic-labs-wallet/core');
|
|
7
7
|
|
|
8
|
+
function _extends() {
|
|
9
|
+
_extends = Object.assign || function assign(target) {
|
|
10
|
+
for(var i = 1; i < arguments.length; i++){
|
|
11
|
+
var source = arguments[i];
|
|
12
|
+
for(var key in source)if (Object.prototype.hasOwnProperty.call(source, key)) target[key] = source[key];
|
|
13
|
+
}
|
|
14
|
+
return target;
|
|
15
|
+
};
|
|
16
|
+
return _extends.apply(this, arguments);
|
|
17
|
+
}
|
|
18
|
+
|
|
8
19
|
const addSignatureToTransaction = ({ transaction, signature, signerPublicKey })=>{
|
|
9
20
|
try {
|
|
10
21
|
transaction.addSignature(signerPublicKey, Buffer.from(signature));
|
|
@@ -15,6 +26,8 @@ const addSignatureToTransaction = ({ transaction, signature, signerPublicKey })=
|
|
|
15
26
|
}
|
|
16
27
|
};
|
|
17
28
|
|
|
29
|
+
const ERROR_CREATE_WALLET_ACCOUNT = 'Error creating svm wallet account';
|
|
30
|
+
|
|
18
31
|
class DynamicSvmWalletClient extends browser.DynamicWalletClient {
|
|
19
32
|
/**
|
|
20
33
|
* Creates a wallet account on the Solana chain
|
|
@@ -22,49 +35,38 @@ class DynamicSvmWalletClient extends browser.DynamicWalletClient {
|
|
|
22
35
|
* @param thresholdSignatureScheme The threshold signature scheme to use
|
|
23
36
|
* @returns The account address, public key hex, raw public key, and client key shares
|
|
24
37
|
*/ async createWalletAccount({ thresholdSignatureScheme, password = undefined }) {
|
|
25
|
-
let ceremonyCompleted = false;
|
|
26
38
|
try {
|
|
27
39
|
const { rawPublicKey, clientKeyShares } = await this.keyGen({
|
|
28
40
|
chainName: this.chainName,
|
|
29
41
|
thresholdSignatureScheme,
|
|
30
|
-
onCeremonyComplete: ()=>{
|
|
31
|
-
|
|
42
|
+
onCeremonyComplete: (accountAddress, walletId)=>{
|
|
43
|
+
// update wallet map
|
|
44
|
+
this.walletMap[accountAddress] = _extends({}, this.walletMap[accountAddress] || {}, {
|
|
45
|
+
accountAddress,
|
|
46
|
+
walletId,
|
|
47
|
+
chainName: this.chainName,
|
|
48
|
+
thresholdSignatureScheme,
|
|
49
|
+
clientKeySharesBackupInfo: browser.getClientKeyShareBackupInfo()
|
|
50
|
+
});
|
|
32
51
|
}
|
|
33
52
|
});
|
|
34
|
-
// Wait for the ceremony to complete, timeout after 5 seconds
|
|
35
|
-
await Promise.race([
|
|
36
|
-
(async ()=>{
|
|
37
|
-
while(!ceremonyCompleted){
|
|
38
|
-
await new Promise((resolve)=>setTimeout(resolve, 100));
|
|
39
|
-
}
|
|
40
|
-
})(),
|
|
41
|
-
browser.timeoutPromise({
|
|
42
|
-
timeInMs: 5000,
|
|
43
|
-
activity: 'Ceremony'
|
|
44
|
-
})
|
|
45
|
-
]);
|
|
46
53
|
if (!rawPublicKey || !(rawPublicKey instanceof Uint8Array)) {
|
|
47
54
|
throw new Error('Raw public key is not a Uint8Array');
|
|
48
55
|
}
|
|
49
56
|
if (!clientKeyShares) {
|
|
50
57
|
throw new Error('Error creating wallet account');
|
|
51
58
|
}
|
|
52
|
-
// Get EVM address from public key
|
|
53
59
|
const { accountAddress } = await this.deriveAccountAddress(rawPublicKey);
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
clientKeyShares: clientKeyShares,
|
|
63
|
-
thresholdSignatureScheme,
|
|
64
|
-
clientKeySharesBackupInfo: browser.getClientKeyShareBackupInfo()
|
|
65
|
-
};
|
|
66
|
-
await this.storeEncryptedBackupByWallet({
|
|
60
|
+
// Update client key shares in wallet map
|
|
61
|
+
// warning: this might result in race condition if `onCeremonyComplete` executes at the same time
|
|
62
|
+
// TODO: remove this once iframe handling for secret shares is implemented
|
|
63
|
+
this.walletMap[accountAddress] = _extends({}, this.walletMap[accountAddress] || {}, {
|
|
64
|
+
clientKeyShares
|
|
65
|
+
});
|
|
66
|
+
// Backup the new wallet without waiting for the promise to resolve
|
|
67
|
+
void this.storeEncryptedBackupByWalletWithRetry({
|
|
67
68
|
accountAddress,
|
|
69
|
+
clientKeyShares,
|
|
68
70
|
password
|
|
69
71
|
});
|
|
70
72
|
return {
|
|
@@ -73,8 +75,8 @@ class DynamicSvmWalletClient extends browser.DynamicWalletClient {
|
|
|
73
75
|
clientKeyShares
|
|
74
76
|
};
|
|
75
77
|
} catch (error) {
|
|
76
|
-
|
|
77
|
-
throw new Error(
|
|
78
|
+
this.logger.error(ERROR_CREATE_WALLET_ACCOUNT, error);
|
|
79
|
+
throw new Error(ERROR_CREATE_WALLET_ACCOUNT);
|
|
78
80
|
}
|
|
79
81
|
}
|
|
80
82
|
// Function to properly derive account address
|
|
@@ -237,7 +239,6 @@ class DynamicSvmWalletClient extends browser.DynamicWalletClient {
|
|
|
237
239
|
* @param password The password for encrypted backup shares
|
|
238
240
|
* @returns The account address, raw public key, and client key shares
|
|
239
241
|
*/ async importPrivateKey({ privateKey, chainName, thresholdSignatureScheme, password = undefined, onError }) {
|
|
240
|
-
let ceremonyCompleted = false;
|
|
241
242
|
//get public key from private key
|
|
242
243
|
const publicKey = this.getPublicKeyFromPrivateKey(privateKey);
|
|
243
244
|
const formattedPrivateKey = await this.decodePrivateKeyForSolana(privateKey);
|
|
@@ -246,22 +247,17 @@ class DynamicSvmWalletClient extends browser.DynamicWalletClient {
|
|
|
246
247
|
privateKey: formattedPrivateKey,
|
|
247
248
|
thresholdSignatureScheme,
|
|
248
249
|
onError,
|
|
249
|
-
onCeremonyComplete: ()=>{
|
|
250
|
-
|
|
250
|
+
onCeremonyComplete: (accountAddress, walletId)=>{
|
|
251
|
+
// update wallet map
|
|
252
|
+
this.walletMap[accountAddress] = _extends({}, this.walletMap[accountAddress] || {}, {
|
|
253
|
+
accountAddress,
|
|
254
|
+
walletId,
|
|
255
|
+
chainName: this.chainName,
|
|
256
|
+
thresholdSignatureScheme,
|
|
257
|
+
clientKeySharesBackupInfo: browser.getClientKeyShareBackupInfo()
|
|
258
|
+
});
|
|
251
259
|
}
|
|
252
260
|
});
|
|
253
|
-
// Wait for the ceremony to complete, timeout after 5 seconds
|
|
254
|
-
await Promise.race([
|
|
255
|
-
(async ()=>{
|
|
256
|
-
while(!ceremonyCompleted){
|
|
257
|
-
await new Promise((resolve)=>setTimeout(resolve, 100));
|
|
258
|
-
}
|
|
259
|
-
})(),
|
|
260
|
-
browser.timeoutPromise({
|
|
261
|
-
timeInMs: 5000,
|
|
262
|
-
activity: 'Ceremony'
|
|
263
|
-
})
|
|
264
|
-
]);
|
|
265
261
|
if (!rawPublicKey || !clientKeyShares) {
|
|
266
262
|
throw new Error('Error creating wallet account');
|
|
267
263
|
}
|
|
@@ -269,19 +265,16 @@ class DynamicSvmWalletClient extends browser.DynamicWalletClient {
|
|
|
269
265
|
if (accountAddress !== publicKey) {
|
|
270
266
|
throw new Error(`Public key mismatch: derived address ${accountAddress} !== public key ${publicKey}`);
|
|
271
267
|
}
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
this.walletMap[accountAddress] = {
|
|
268
|
+
// Update client key shares in wallet map
|
|
269
|
+
// warning: this might result in race condition if `onCeremonyComplete` executes at the same time
|
|
270
|
+
// TODO: remove this once iframe handling for secret shares is implemented
|
|
271
|
+
this.walletMap[accountAddress] = _extends({}, this.walletMap[accountAddress] || {}, {
|
|
272
|
+
clientKeyShares
|
|
273
|
+
});
|
|
274
|
+
// Backup the new wallet without waiting for the promise to resolve
|
|
275
|
+
void this.storeEncryptedBackupByWalletWithRetry({
|
|
276
276
|
accountAddress,
|
|
277
|
-
walletId: newWalletId,
|
|
278
|
-
chainName: this.chainName,
|
|
279
277
|
clientKeyShares,
|
|
280
|
-
thresholdSignatureScheme,
|
|
281
|
-
clientKeySharesBackupInfo: browser.getClientKeyShareBackupInfo()
|
|
282
|
-
};
|
|
283
|
-
await this.storeEncryptedBackupByWallet({
|
|
284
|
-
accountAddress,
|
|
285
278
|
password
|
|
286
279
|
});
|
|
287
280
|
return {
|
package/index.esm.js
CHANGED
|
@@ -1,8 +1,19 @@
|
|
|
1
|
-
import { DynamicWalletClient,
|
|
1
|
+
import { DynamicWalletClient, getClientKeyShareBackupInfo, WalletOperation } from '@dynamic-labs-wallet/browser';
|
|
2
2
|
import bs58 from 'bs58';
|
|
3
3
|
import { VersionedTransaction, PublicKey, Keypair } from '@solana/web3.js';
|
|
4
4
|
import '@dynamic-labs-wallet/core';
|
|
5
5
|
|
|
6
|
+
function _extends() {
|
|
7
|
+
_extends = Object.assign || function assign(target) {
|
|
8
|
+
for(var i = 1; i < arguments.length; i++){
|
|
9
|
+
var source = arguments[i];
|
|
10
|
+
for(var key in source)if (Object.prototype.hasOwnProperty.call(source, key)) target[key] = source[key];
|
|
11
|
+
}
|
|
12
|
+
return target;
|
|
13
|
+
};
|
|
14
|
+
return _extends.apply(this, arguments);
|
|
15
|
+
}
|
|
16
|
+
|
|
6
17
|
const addSignatureToTransaction = ({ transaction, signature, signerPublicKey })=>{
|
|
7
18
|
try {
|
|
8
19
|
transaction.addSignature(signerPublicKey, Buffer.from(signature));
|
|
@@ -13,6 +24,8 @@ const addSignatureToTransaction = ({ transaction, signature, signerPublicKey })=
|
|
|
13
24
|
}
|
|
14
25
|
};
|
|
15
26
|
|
|
27
|
+
const ERROR_CREATE_WALLET_ACCOUNT = 'Error creating svm wallet account';
|
|
28
|
+
|
|
16
29
|
class DynamicSvmWalletClient extends DynamicWalletClient {
|
|
17
30
|
/**
|
|
18
31
|
* Creates a wallet account on the Solana chain
|
|
@@ -20,49 +33,38 @@ class DynamicSvmWalletClient extends DynamicWalletClient {
|
|
|
20
33
|
* @param thresholdSignatureScheme The threshold signature scheme to use
|
|
21
34
|
* @returns The account address, public key hex, raw public key, and client key shares
|
|
22
35
|
*/ async createWalletAccount({ thresholdSignatureScheme, password = undefined }) {
|
|
23
|
-
let ceremonyCompleted = false;
|
|
24
36
|
try {
|
|
25
37
|
const { rawPublicKey, clientKeyShares } = await this.keyGen({
|
|
26
38
|
chainName: this.chainName,
|
|
27
39
|
thresholdSignatureScheme,
|
|
28
|
-
onCeremonyComplete: ()=>{
|
|
29
|
-
|
|
40
|
+
onCeremonyComplete: (accountAddress, walletId)=>{
|
|
41
|
+
// update wallet map
|
|
42
|
+
this.walletMap[accountAddress] = _extends({}, this.walletMap[accountAddress] || {}, {
|
|
43
|
+
accountAddress,
|
|
44
|
+
walletId,
|
|
45
|
+
chainName: this.chainName,
|
|
46
|
+
thresholdSignatureScheme,
|
|
47
|
+
clientKeySharesBackupInfo: getClientKeyShareBackupInfo()
|
|
48
|
+
});
|
|
30
49
|
}
|
|
31
50
|
});
|
|
32
|
-
// Wait for the ceremony to complete, timeout after 5 seconds
|
|
33
|
-
await Promise.race([
|
|
34
|
-
(async ()=>{
|
|
35
|
-
while(!ceremonyCompleted){
|
|
36
|
-
await new Promise((resolve)=>setTimeout(resolve, 100));
|
|
37
|
-
}
|
|
38
|
-
})(),
|
|
39
|
-
timeoutPromise({
|
|
40
|
-
timeInMs: 5000,
|
|
41
|
-
activity: 'Ceremony'
|
|
42
|
-
})
|
|
43
|
-
]);
|
|
44
51
|
if (!rawPublicKey || !(rawPublicKey instanceof Uint8Array)) {
|
|
45
52
|
throw new Error('Raw public key is not a Uint8Array');
|
|
46
53
|
}
|
|
47
54
|
if (!clientKeyShares) {
|
|
48
55
|
throw new Error('Error creating wallet account');
|
|
49
56
|
}
|
|
50
|
-
// Get EVM address from public key
|
|
51
57
|
const { accountAddress } = await this.deriveAccountAddress(rawPublicKey);
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
clientKeyShares: clientKeyShares,
|
|
61
|
-
thresholdSignatureScheme,
|
|
62
|
-
clientKeySharesBackupInfo: getClientKeyShareBackupInfo()
|
|
63
|
-
};
|
|
64
|
-
await this.storeEncryptedBackupByWallet({
|
|
58
|
+
// Update client key shares in wallet map
|
|
59
|
+
// warning: this might result in race condition if `onCeremonyComplete` executes at the same time
|
|
60
|
+
// TODO: remove this once iframe handling for secret shares is implemented
|
|
61
|
+
this.walletMap[accountAddress] = _extends({}, this.walletMap[accountAddress] || {}, {
|
|
62
|
+
clientKeyShares
|
|
63
|
+
});
|
|
64
|
+
// Backup the new wallet without waiting for the promise to resolve
|
|
65
|
+
void this.storeEncryptedBackupByWalletWithRetry({
|
|
65
66
|
accountAddress,
|
|
67
|
+
clientKeyShares,
|
|
66
68
|
password
|
|
67
69
|
});
|
|
68
70
|
return {
|
|
@@ -71,8 +73,8 @@ class DynamicSvmWalletClient extends DynamicWalletClient {
|
|
|
71
73
|
clientKeyShares
|
|
72
74
|
};
|
|
73
75
|
} catch (error) {
|
|
74
|
-
|
|
75
|
-
throw new Error(
|
|
76
|
+
this.logger.error(ERROR_CREATE_WALLET_ACCOUNT, error);
|
|
77
|
+
throw new Error(ERROR_CREATE_WALLET_ACCOUNT);
|
|
76
78
|
}
|
|
77
79
|
}
|
|
78
80
|
// Function to properly derive account address
|
|
@@ -235,7 +237,6 @@ class DynamicSvmWalletClient extends DynamicWalletClient {
|
|
|
235
237
|
* @param password The password for encrypted backup shares
|
|
236
238
|
* @returns The account address, raw public key, and client key shares
|
|
237
239
|
*/ async importPrivateKey({ privateKey, chainName, thresholdSignatureScheme, password = undefined, onError }) {
|
|
238
|
-
let ceremonyCompleted = false;
|
|
239
240
|
//get public key from private key
|
|
240
241
|
const publicKey = this.getPublicKeyFromPrivateKey(privateKey);
|
|
241
242
|
const formattedPrivateKey = await this.decodePrivateKeyForSolana(privateKey);
|
|
@@ -244,22 +245,17 @@ class DynamicSvmWalletClient extends DynamicWalletClient {
|
|
|
244
245
|
privateKey: formattedPrivateKey,
|
|
245
246
|
thresholdSignatureScheme,
|
|
246
247
|
onError,
|
|
247
|
-
onCeremonyComplete: ()=>{
|
|
248
|
-
|
|
248
|
+
onCeremonyComplete: (accountAddress, walletId)=>{
|
|
249
|
+
// update wallet map
|
|
250
|
+
this.walletMap[accountAddress] = _extends({}, this.walletMap[accountAddress] || {}, {
|
|
251
|
+
accountAddress,
|
|
252
|
+
walletId,
|
|
253
|
+
chainName: this.chainName,
|
|
254
|
+
thresholdSignatureScheme,
|
|
255
|
+
clientKeySharesBackupInfo: getClientKeyShareBackupInfo()
|
|
256
|
+
});
|
|
249
257
|
}
|
|
250
258
|
});
|
|
251
|
-
// Wait for the ceremony to complete, timeout after 5 seconds
|
|
252
|
-
await Promise.race([
|
|
253
|
-
(async ()=>{
|
|
254
|
-
while(!ceremonyCompleted){
|
|
255
|
-
await new Promise((resolve)=>setTimeout(resolve, 100));
|
|
256
|
-
}
|
|
257
|
-
})(),
|
|
258
|
-
timeoutPromise({
|
|
259
|
-
timeInMs: 5000,
|
|
260
|
-
activity: 'Ceremony'
|
|
261
|
-
})
|
|
262
|
-
]);
|
|
263
259
|
if (!rawPublicKey || !clientKeyShares) {
|
|
264
260
|
throw new Error('Error creating wallet account');
|
|
265
261
|
}
|
|
@@ -267,19 +263,16 @@ class DynamicSvmWalletClient extends DynamicWalletClient {
|
|
|
267
263
|
if (accountAddress !== publicKey) {
|
|
268
264
|
throw new Error(`Public key mismatch: derived address ${accountAddress} !== public key ${publicKey}`);
|
|
269
265
|
}
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
this.walletMap[accountAddress] = {
|
|
266
|
+
// Update client key shares in wallet map
|
|
267
|
+
// warning: this might result in race condition if `onCeremonyComplete` executes at the same time
|
|
268
|
+
// TODO: remove this once iframe handling for secret shares is implemented
|
|
269
|
+
this.walletMap[accountAddress] = _extends({}, this.walletMap[accountAddress] || {}, {
|
|
270
|
+
clientKeyShares
|
|
271
|
+
});
|
|
272
|
+
// Backup the new wallet without waiting for the promise to resolve
|
|
273
|
+
void this.storeEncryptedBackupByWalletWithRetry({
|
|
274
274
|
accountAddress,
|
|
275
|
-
walletId: newWalletId,
|
|
276
|
-
chainName: this.chainName,
|
|
277
275
|
clientKeyShares,
|
|
278
|
-
thresholdSignatureScheme,
|
|
279
|
-
clientKeySharesBackupInfo: getClientKeyShareBackupInfo()
|
|
280
|
-
};
|
|
281
|
-
await this.storeEncryptedBackupByWallet({
|
|
282
|
-
accountAddress,
|
|
283
276
|
password
|
|
284
277
|
});
|
|
285
278
|
return {
|
package/package.json
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dynamic-labs-wallet/svm",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.48",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"dependencies": {
|
|
6
|
-
"@dynamic-labs-wallet/browser": "0.0.
|
|
7
|
-
"@dynamic-labs-wallet/core": "0.0.
|
|
6
|
+
"@dynamic-labs-wallet/browser": "0.0.48",
|
|
7
|
+
"@dynamic-labs-wallet/core": "0.0.48",
|
|
8
8
|
"@solana/web3.js": "^1.98.0",
|
|
9
9
|
"bs58": "^6.0.0"
|
|
10
10
|
},
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/svm/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,2BAA2B,sCAAsC,CAAC"}
|
package/src/svm/svm.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"svm.d.ts","sourceRoot":"","sources":["../../src/svm/svm.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,mBAAmB,EACnB,mBAAmB,EACnB,wBAAwB,
|
|
1
|
+
{"version":3,"file":"svm.d.ts","sourceRoot":"","sources":["../../src/svm/svm.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,mBAAmB,EACnB,mBAAmB,EACnB,wBAAwB,EAGzB,MAAM,8BAA8B,CAAC;AAEtC,OAAO,EAEL,WAAW,EACX,oBAAoB,EAErB,MAAM,iBAAiB,CAAC;AAIzB,qBAAa,sBAAuB,SAAQ,mBAAmB;IAC7D,QAAQ,CAAC,SAAS,SAAS;IAC3B,cAAc,CAAC,EAAE,MAAM,CAAC;gBAEZ,EACV,aAAa,EACb,SAAS,EACT,UAAU,EACV,kBAAkB,GACnB,EAAE;QACD,aAAa,EAAE,MAAM,CAAC;QACtB,SAAS,EAAE,MAAM,CAAC;QAClB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,kBAAkB,CAAC,EAAE,MAAM,CAAC;KAC7B;IASD;;;;;OAKG;IACG,mBAAmB,CAAC,EACxB,wBAAwB,EACxB,QAAoB,GACrB,EAAE;QACD,wBAAwB,EAAE,wBAAwB,CAAC;QACnD,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,GAAG,OAAO,CAAC;QACV,cAAc,EAAE,MAAM,CAAC;QACvB,YAAY,EAAE,UAAU,CAAC;QACzB,eAAe,EAAE,cAAc,EAAE,CAAC;KACnC,CAAC;IAyDI,oBAAoB,CAAC,YAAY,EAAE,UAAU;;;IAOnD;;;;;;OAMG;IACG,WAAW,CAAC,EAChB,OAAO,EACP,cAAc,EACd,QAAoB,GACrB,EAAE;QACD,OAAO,EAAE,MAAM,CAAC;QAChB,cAAc,EAAE,MAAM,CAAC;QACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB;IAiDK,eAAe,CAAC,EACpB,aAAa,EACb,WAAW,EACX,QAAoB,GACrB,EAAE;QACD,aAAa,EAAE,MAAM,CAAC;QACtB,WAAW,EAAE,oBAAoB,GAAG,WAAW,CAAC;QAChD,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,GAAG,OAAO,CAAC,oBAAoB,GAAG,WAAW,CAAC;IAgD/C;;;;;;OAMG;IACG,gBAAgB,CAAC,EACrB,cAAc,EACd,QAAoB,GACrB,EAAE;QACD,cAAc,EAAE,MAAM,CAAC;QACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB;;;IAaD;;;;;OAKG;IACG,uBAAuB,CAAC,EAC5B,SAAS,EACT,cAAc,GACf,EAAE;QACD,SAAS,EAAE,mBAAmB,EAAE,CAAC;QACjC,cAAc,CAAC,EAAE,MAAM,CAAC;KACzB;;;IASD;;;;;OAKG;IACH,yBAAyB,CAAC,UAAU,EAAE,MAAM;IAM5C,0BAA0B,CAAC,UAAU,EAAE,MAAM;IAQ7C,eAAe,CAAC,SAAS,EAAE,UAAU,GAAG,MAAM;IAI9C;;;;;;;;OAQG;IACG,gBAAgB,CAAC,EACrB,UAAU,EACV,SAAS,EACT,wBAAwB,EACxB,QAAoB,EACpB,OAAO,GACR,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;KAClC,GAAG,OAAO,CAAC;QACV,cAAc,EAAE,MAAM,CAAC;QACvB,YAAY,EAAE,UAAU,GAAG,SAAS,CAAC;QACrC,eAAe,EAAE,cAAc,EAAE,CAAC;KACnC,CAAC;IA4DI,aAAa;CAOpB"}
|