tollkit-wallet 0.2.1 → 0.2.2
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 +49 -2
- package/THIRD_PARTY_NOTICES.md +4 -0
- package/dist/actions.d.ts +34 -33
- package/dist/actions.js +5 -1
- package/dist/actions.js.map +1 -1
- package/dist/bridge.d.ts +148 -0
- package/dist/bridge.js +460 -0
- package/dist/bridge.js.map +1 -0
- package/dist/buy.d.ts +17 -0
- package/dist/buy.js +23 -0
- package/dist/buy.js.map +1 -0
- package/dist/cli.js +68 -2
- package/dist/cli.js.map +1 -1
- package/dist/dapp.d.ts +89 -0
- package/dist/dapp.js +505 -0
- package/dist/dapp.js.map +1 -0
- package/dist/dashboard.d.ts +2 -0
- package/dist/dashboard.js +145 -2
- package/dist/dashboard.js.map +1 -1
- package/dist/holdings.d.ts +92 -0
- package/dist/holdings.js +200 -0
- package/dist/holdings.js.map +1 -0
- package/dist/keystore.d.ts +58 -11
- package/dist/keystore.js +87 -11
- package/dist/keystore.js.map +1 -1
- package/dist/ledger.d.ts +1 -1
- package/dist/mcp.d.ts +1 -1
- package/dist/mcp.js +1 -1
- package/dist/netguard.d.ts +8 -0
- package/dist/netguard.js +44 -0
- package/dist/netguard.js.map +1 -0
- package/dist/paths.d.ts +1 -0
- package/dist/paths.js +1 -0
- package/dist/paths.js.map +1 -1
- package/dist/policy.d.ts +4 -4
- package/dist/rules.d.ts +4 -4
- package/dist/sell.d.ts +60 -0
- package/dist/sell.js +71 -0
- package/dist/sell.js.map +1 -0
- package/dist/stake.d.ts +84 -0
- package/dist/stake.js +158 -0
- package/dist/stake.js.map +1 -0
- package/dist/ui.js +306 -32
- package/dist/ui.js.map +1 -1
- package/dist/wallet.d.ts +57 -2
- package/dist/wallet.js +185 -4
- package/dist/wallet.js.map +1 -1
- package/extension/PRIVACY.md +19 -0
- package/extension/README.md +16 -0
- package/extension/background.js +88 -0
- package/extension/content.js +34 -0
- package/extension/icons/icon.svg +1 -0
- package/extension/icons/icon128.png +0 -0
- package/extension/icons/icon16.png +0 -0
- package/extension/icons/icon32.png +0 -0
- package/extension/icons/icon48.png +0 -0
- package/extension/inpage.js +129 -0
- package/extension/manifest.json +15 -0
- package/extension/popup.html +35 -0
- package/extension/popup.js +39 -0
- package/package.json +3 -2
package/dist/dapp.js
ADDED
|
@@ -0,0 +1,505 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Websites ("apps") talking to this wallet through the Tollkit browser extension.
|
|
3
|
+
*
|
|
4
|
+
* The extension forwards each request with the site's origin (taken by Chrome, not the page) to the dashboard
|
|
5
|
+
* on this computer. Reading is answered directly; connecting, signing and sending wait for the owner to
|
|
6
|
+
* approve in the dashboard's Approvals tab, showing which site asked and what it asked for. Keys never
|
|
7
|
+
* leave this process. These requests don't use the agent spending limits: each one is approved by hand.
|
|
8
|
+
*
|
|
9
|
+
* Standards (checked 2026-10-14): EIP-1193 provider errors 4001/4100/4200/4900/4901 (eips.ethereum.org/EIPS/eip-1193),
|
|
10
|
+
* EIP-1102 eth_requestAccounts, EIP-3326 wallet_switchEthereumChain, EIP-3085 wallet_addEthereumChain, EIP-2255
|
|
11
|
+
* permissions, EIP-191 personal_sign, EIP-712 eth_signTypedData_v4; Solana Wallet Standard features
|
|
12
|
+
* standard:connect, solana:signTransaction / signAndSendTransaction / signMessage (@solana/wallet-standard-features 1.5.0).
|
|
13
|
+
*/
|
|
14
|
+
import { createHash, createPrivateKey, randomBytes, randomUUID, sign as edSign, timingSafeEqual } from "node:crypto";
|
|
15
|
+
import { existsSync, readFileSync, writeFileSync } from "node:fs";
|
|
16
|
+
import path from "node:path";
|
|
17
|
+
import { Connection, PublicKey, VersionedTransaction } from "@solana/web3.js";
|
|
18
|
+
import { AbiCoder, Interface, JsonRpcProvider, MaxUint256, formatEther, formatUnits, getAddress, getBytes, hexlify, isHexString, toQuantity, toUtf8String } from "ethers";
|
|
19
|
+
import { DEFAULT_RPC, EVM_CHAIN_ID } from "./chains.js";
|
|
20
|
+
import { walletHome } from "./paths.js";
|
|
21
|
+
import { record } from "./ledger.js";
|
|
22
|
+
export class RpcError extends Error {
|
|
23
|
+
code;
|
|
24
|
+
constructor(code, message) {
|
|
25
|
+
super(message);
|
|
26
|
+
this.code = code;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
const rejected = () => new RpcError(4001, "You rejected this in Tollkit.");
|
|
30
|
+
const unauthorized = () => new RpcError(4100, "Connect this site to Tollkit first.");
|
|
31
|
+
const CHAIN_HEX = { base: "0x2105", ethereum: "0x1" };
|
|
32
|
+
const HEX_CHAIN = { "0x2105": "base", "0x1": "ethereum" };
|
|
33
|
+
/** Read-only Ethereum JSON-RPC methods passed straight to the network. */
|
|
34
|
+
const READ = new Set(["eth_blockNumber", "eth_call", "eth_estimateGas", "eth_gasPrice", "eth_maxPriorityFeePerGas", "eth_feeHistory", "eth_getBalance", "eth_getBlockByNumber", "eth_getBlockByHash", "eth_getCode", "eth_getLogs", "eth_getStorageAt", "eth_getTransactionByHash", "eth_getTransactionCount", "eth_getTransactionReceipt", "eth_syncing", "web3_clientVersion"]);
|
|
35
|
+
/** Program names shown in approvals (each checked on mainnet as an executable account). */
|
|
36
|
+
const PROGRAMS = {
|
|
37
|
+
"11111111111111111111111111111111": "System", TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA: "Token", TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb: "Token-2022",
|
|
38
|
+
ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL: "Associated Token", ComputeBudget111111111111111111111111111111: "Compute Budget", MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr: "Memo", Stake11111111111111111111111111111111111111: "Stake",
|
|
39
|
+
};
|
|
40
|
+
const TOKEN_CALLS = new Interface(["function approve(address spender, uint256 amount)", "function transfer(address to, uint256 amount)", "function transferFrom(address from, address to, uint256 amount)", "function setApprovalForAll(address operator, bool approved)", "function increaseAllowance(address spender, uint256 addedValue)"]);
|
|
41
|
+
const SOL_MINTS = { EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v: "USDC", Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB: "USDT" };
|
|
42
|
+
/** Instructions that hand over control, which a balance check alone wouldn't show. */
|
|
43
|
+
export function solanaWarnings(vtx) {
|
|
44
|
+
const keys = vtx.message.staticAccountKeys, out = new Set();
|
|
45
|
+
for (const ix of vtx.message.compiledInstructions) {
|
|
46
|
+
const prog = keys[ix.programIdIndex]?.toBase58(), d = ix.data;
|
|
47
|
+
if (prog === "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" || prog === "TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb") {
|
|
48
|
+
if (d[0] === 4 || d[0] === 13)
|
|
49
|
+
out.add("it lets another account spend your tokens later (token approval).");
|
|
50
|
+
if (d[0] === 6)
|
|
51
|
+
out.add("it changes who controls one of your token accounts.");
|
|
52
|
+
}
|
|
53
|
+
if (prog === "11111111111111111111111111111111" && d.length >= 4 && (d[0] === 1 || d[0] === 10) && d[1] === 0 && d[2] === 0 && d[3] === 0)
|
|
54
|
+
out.add("it hands an account over to another program (Assign).");
|
|
55
|
+
}
|
|
56
|
+
return [...out];
|
|
57
|
+
}
|
|
58
|
+
export function normalOrigin(o) {
|
|
59
|
+
let u;
|
|
60
|
+
try {
|
|
61
|
+
u = new URL(o);
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
throw new RpcError(4100, "Unknown site.");
|
|
65
|
+
}
|
|
66
|
+
if (!/^[a-z0-9.-]+$/.test(u.hostname))
|
|
67
|
+
throw new RpcError(4100, "Unknown site.");
|
|
68
|
+
if (u.protocol === "https:" || (u.protocol === "http:" && (u.hostname === "localhost" || u.hostname === "127.0.0.1")))
|
|
69
|
+
return u.origin;
|
|
70
|
+
throw new RpcError(4100, "Tollkit only connects to https sites.");
|
|
71
|
+
}
|
|
72
|
+
const shown = (s, n = 600) => (s.length > n ? s.slice(0, n) + `\n…(cut here: ${s.length - n} more characters not shown)` : s);
|
|
73
|
+
function readable(bytes) {
|
|
74
|
+
try {
|
|
75
|
+
const t = toUtf8String(bytes);
|
|
76
|
+
if (/^[\x09\x0a\x0d\x20-\x7e -]*$/.test(t))
|
|
77
|
+
return t;
|
|
78
|
+
}
|
|
79
|
+
catch { /* not text */ }
|
|
80
|
+
return hexlify(bytes);
|
|
81
|
+
}
|
|
82
|
+
export class DappBridge {
|
|
83
|
+
o;
|
|
84
|
+
file;
|
|
85
|
+
codes = new Map();
|
|
86
|
+
wrongCodes = 0;
|
|
87
|
+
jobs = new Map();
|
|
88
|
+
constructor(o) {
|
|
89
|
+
this.o = o;
|
|
90
|
+
this.file = path.join(walletHome(o.dir), "extension.json");
|
|
91
|
+
}
|
|
92
|
+
load() { try {
|
|
93
|
+
return existsSync(this.file) ? JSON.parse(readFileSync(this.file, "utf8")) : { tokens: [], sites: [] };
|
|
94
|
+
}
|
|
95
|
+
catch {
|
|
96
|
+
return { tokens: [], sites: [] };
|
|
97
|
+
} }
|
|
98
|
+
save(f) { writeFileSync(this.file, JSON.stringify(f, null, 2), { mode: 0o600 }); }
|
|
99
|
+
// ---- pairing -------------------------------------------------------------------------------
|
|
100
|
+
/** A one-time code the owner types into the extension (valid 5 minutes). */
|
|
101
|
+
newCode(port) {
|
|
102
|
+
const raw = randomBytes(5).toString("hex").toUpperCase().replace(/(.{4})(.{4})(.{2})/, "$1-$2$3").slice(0, 9);
|
|
103
|
+
this.codes.set(raw, Date.now() + 5 * 60_000);
|
|
104
|
+
this.wrongCodes = 0;
|
|
105
|
+
return `${port}-${raw}`;
|
|
106
|
+
}
|
|
107
|
+
pair(code, extOrigin) {
|
|
108
|
+
if (!/^chrome-extension:\/\/[a-p]{32}$/.test(extOrigin))
|
|
109
|
+
throw new Error("Pairing only works from the Tollkit extension.");
|
|
110
|
+
if (this.wrongCodes >= 5)
|
|
111
|
+
throw new Error("Too many wrong codes. Make a new one in Tollkit's Settings.");
|
|
112
|
+
const c = String(code).trim().toUpperCase().replace(/^\d+-/, "");
|
|
113
|
+
const exp = this.codes.get(c);
|
|
114
|
+
if (!exp || exp < Date.now()) {
|
|
115
|
+
this.wrongCodes++;
|
|
116
|
+
throw new Error("That code is wrong or has expired.");
|
|
117
|
+
}
|
|
118
|
+
this.codes.delete(c);
|
|
119
|
+
const token = randomBytes(32).toString("hex");
|
|
120
|
+
const f = this.load();
|
|
121
|
+
f.tokens.push({ hash: createHash("sha256").update(token).digest("hex"), origin: extOrigin, created: new Date().toISOString() });
|
|
122
|
+
this.save(f);
|
|
123
|
+
return token;
|
|
124
|
+
}
|
|
125
|
+
okToken(token, extOrigin) {
|
|
126
|
+
if (!token || !/^[0-9a-f]{64}$/.test(token))
|
|
127
|
+
return false;
|
|
128
|
+
const h = Buffer.from(createHash("sha256").update(token).digest("hex"));
|
|
129
|
+
return this.load().tokens.some((t) => t.origin === extOrigin && t.hash.length === h.length && timingSafeEqual(Buffer.from(t.hash), h));
|
|
130
|
+
}
|
|
131
|
+
paired() { return this.load().tokens.length; }
|
|
132
|
+
unpairAll() { const f = this.load(); f.tokens = []; this.save(f); }
|
|
133
|
+
// ---- sites ---------------------------------------------------------------------------------
|
|
134
|
+
/** Sites connected to the wallet (EVM, Solana or both). */
|
|
135
|
+
sites() { return this.load().sites.filter((s) => s.evm || s.solana); }
|
|
136
|
+
site(origin) { return this.load().sites.find((s) => s.origin === origin); }
|
|
137
|
+
setSite(origin, patch) {
|
|
138
|
+
const f = this.load();
|
|
139
|
+
const cur = f.sites.find((s) => s.origin === origin);
|
|
140
|
+
if (cur)
|
|
141
|
+
Object.assign(cur, patch);
|
|
142
|
+
else
|
|
143
|
+
f.sites.push({ origin, evm: false, solana: false, chain: "base", since: new Date().toISOString(), ...patch });
|
|
144
|
+
this.save(f);
|
|
145
|
+
}
|
|
146
|
+
disconnect(origin) { this.setSite(origin, { evm: false, solana: false }); }
|
|
147
|
+
// ---- requests ------------------------------------------------------------------------------
|
|
148
|
+
/** Start a request; quick ones answer at once, ones needing the owner return a job id to poll. */
|
|
149
|
+
async submit(originRaw, method, params) {
|
|
150
|
+
const origin = normalOrigin(originRaw);
|
|
151
|
+
const p = Array.isArray(params) ? params : params === undefined || params === null ? [] : [params];
|
|
152
|
+
const quick = await this.quick(origin, method, p);
|
|
153
|
+
if (quick.done)
|
|
154
|
+
return { result: quick.result };
|
|
155
|
+
const waiting = [...this.jobs.values()].filter((j) => j.status === "pending" && j.origin === origin).length;
|
|
156
|
+
if (waiting >= 3)
|
|
157
|
+
throw new RpcError(4001, "This site already has requests waiting in Tollkit. Answer those first.");
|
|
158
|
+
if ([...this.jobs.values()].filter((j) => j.status === "pending").length >= 10)
|
|
159
|
+
throw new RpcError(4001, "Too many requests are waiting in Tollkit. Answer those first.");
|
|
160
|
+
const id = randomUUID();
|
|
161
|
+
this.jobs.set(id, { status: "pending", at: Date.now(), origin });
|
|
162
|
+
for (const [k, j] of this.jobs)
|
|
163
|
+
if (Date.now() - j.at > 15 * 60_000)
|
|
164
|
+
this.jobs.delete(k);
|
|
165
|
+
void this.slow(origin, method, p).then((result) => this.jobs.set(id, { status: "done", result, at: Date.now(), origin }), (e) => this.jobs.set(id, { status: "error", error: { code: e instanceof RpcError ? e.code : -32603, message: e.message.slice(0, 300) }, at: Date.now(), origin }));
|
|
166
|
+
return { id };
|
|
167
|
+
}
|
|
168
|
+
job(id) { const j = this.jobs.get(id); if (!j)
|
|
169
|
+
throw new RpcError(-32603, "Unknown request."); return j; }
|
|
170
|
+
chainOf(origin) {
|
|
171
|
+
const c = this.site(origin)?.chain ?? "base";
|
|
172
|
+
const on = this.o.chains();
|
|
173
|
+
return on.includes(c) ? c : on.includes("base") ? "base" : "ethereum";
|
|
174
|
+
}
|
|
175
|
+
evmOk() { return this.o.chains().some((c) => c !== "solana"); }
|
|
176
|
+
async quick(origin, method, p) {
|
|
177
|
+
const s = this.site(origin);
|
|
178
|
+
const done = (result) => ({ done: true, result });
|
|
179
|
+
switch (method) {
|
|
180
|
+
case "eth_chainId": return done(CHAIN_HEX[this.chainOf(origin)]);
|
|
181
|
+
case "net_version": return done(String(EVM_CHAIN_ID[this.chainOf(origin)]));
|
|
182
|
+
case "eth_accounts": return done(s?.evm ? [this.o.evm] : []);
|
|
183
|
+
case "eth_coinbase": return done(s?.evm ? this.o.evm : null);
|
|
184
|
+
case "wallet_getPermissions": return done(s?.evm ? [{ parentCapability: "eth_accounts", invoker: origin }] : []);
|
|
185
|
+
case "wallet_revokePermissions":
|
|
186
|
+
this.setSite(origin, { evm: false });
|
|
187
|
+
return done(null);
|
|
188
|
+
case "wallet_switchEthereumChain":
|
|
189
|
+
case "wallet_addEthereumChain": {
|
|
190
|
+
const want = String(p[0]?.chainId ?? "").toLowerCase();
|
|
191
|
+
const c = HEX_CHAIN[want];
|
|
192
|
+
if (!c)
|
|
193
|
+
throw new RpcError(4902, "Tollkit works with Base and Ethereum only.");
|
|
194
|
+
if (!this.o.chains().includes(c))
|
|
195
|
+
throw new RpcError(4901, `${c === "base" ? "Base" : "Ethereum"} is turned off in Tollkit's settings.`);
|
|
196
|
+
this.setSite(origin, { chain: c });
|
|
197
|
+
return done(null);
|
|
198
|
+
}
|
|
199
|
+
case "eth_requestAccounts":
|
|
200
|
+
case "wallet_requestPermissions":
|
|
201
|
+
if (s?.evm)
|
|
202
|
+
return done(method === "eth_requestAccounts" ? [this.o.evm] : [{ parentCapability: "eth_accounts", invoker: origin }]);
|
|
203
|
+
return { done: false };
|
|
204
|
+
case "sol_connect":
|
|
205
|
+
if (s?.solana)
|
|
206
|
+
return done(this.solAccount());
|
|
207
|
+
if (p[0]?.silent)
|
|
208
|
+
throw new RpcError(4001, "Not connected.");
|
|
209
|
+
return { done: false };
|
|
210
|
+
case "sol_disconnect":
|
|
211
|
+
this.setSite(origin, { solana: false });
|
|
212
|
+
return done(null);
|
|
213
|
+
case "eth_sign": throw new RpcError(4200, "Tollkit doesn't support eth_sign (it can sign anything). Use personal_sign.");
|
|
214
|
+
}
|
|
215
|
+
if (READ.has(method)) {
|
|
216
|
+
if (!this.evmOk())
|
|
217
|
+
throw new RpcError(4900, "Base and Ethereum are turned off in Tollkit's settings.");
|
|
218
|
+
return done(await this.rpc(this.chainOf(origin), method, p));
|
|
219
|
+
}
|
|
220
|
+
if (["personal_sign", "eth_signTypedData_v4", "eth_sendTransaction"].includes(method)) {
|
|
221
|
+
if (!s?.evm)
|
|
222
|
+
throw unauthorized();
|
|
223
|
+
return { done: false };
|
|
224
|
+
}
|
|
225
|
+
if (["sol_signTransaction", "sol_signAndSendTransaction", "sol_signMessage"].includes(method)) {
|
|
226
|
+
if (!s?.solana)
|
|
227
|
+
throw unauthorized();
|
|
228
|
+
return { done: false };
|
|
229
|
+
}
|
|
230
|
+
throw new RpcError(4200, `Tollkit doesn't support ${String(method).slice(0, 60)}.`);
|
|
231
|
+
}
|
|
232
|
+
solAccount() { return { address: this.o.solana, publicKey: Buffer.from(new PublicKey(this.o.solana).toBytes()).toString("base64") }; }
|
|
233
|
+
rpc(chain, method, params) {
|
|
234
|
+
if (this.o.evmRpc)
|
|
235
|
+
return this.o.evmRpc(chain, method, params);
|
|
236
|
+
return new JsonRpcProvider(this.o.rpc?.[chain] ?? DEFAULT_RPC[chain], EVM_CHAIN_ID[chain], { staticNetwork: true }).send(method, params);
|
|
237
|
+
}
|
|
238
|
+
sol() { return this.o.solConn ?? new Connection(this.o.rpc?.solana ?? DEFAULT_RPC.solana, "confirmed"); }
|
|
239
|
+
meta = new Map();
|
|
240
|
+
async tokenMeta(chain, token) {
|
|
241
|
+
const k = `${chain}:${token.toLowerCase()}`;
|
|
242
|
+
if (this.meta.has(k))
|
|
243
|
+
return this.meta.get(k);
|
|
244
|
+
let m = null;
|
|
245
|
+
try {
|
|
246
|
+
const [sym, dec] = await Promise.all([this.rpc(chain, "eth_call", [{ to: token, data: "0x95d89b41" }, "latest"]), this.rpc(chain, "eth_call", [{ to: token, data: "0x313ce567" }, "latest"])]);
|
|
247
|
+
const symbol = String(AbiCoder.defaultAbiCoder().decode(["string"], String(sym))[0]).slice(0, 12);
|
|
248
|
+
const decimals = Number(AbiCoder.defaultAbiCoder().decode(["uint8"], String(dec))[0]);
|
|
249
|
+
if (/^[\w.$-]+$/.test(symbol))
|
|
250
|
+
m = { symbol, decimals };
|
|
251
|
+
}
|
|
252
|
+
catch {
|
|
253
|
+
m = null;
|
|
254
|
+
}
|
|
255
|
+
this.meta.set(k, m);
|
|
256
|
+
return m;
|
|
257
|
+
}
|
|
258
|
+
/** Plain words for the common token calls, so an approval or transfer isn't hidden behind "Calls 0x095ea7b3". */
|
|
259
|
+
async describeEvmCall(chain, to, data) {
|
|
260
|
+
if (!data || data === "0x")
|
|
261
|
+
return "No data (a plain ETH transfer).";
|
|
262
|
+
let p = null;
|
|
263
|
+
try {
|
|
264
|
+
p = TOKEN_CALLS.parseTransaction({ data });
|
|
265
|
+
}
|
|
266
|
+
catch {
|
|
267
|
+
p = null;
|
|
268
|
+
}
|
|
269
|
+
const raw = `Calls ${data.slice(0, 10)} with ${(data.length - 2) / 2} bytes of data (not a standard token call; it does whatever the contract does).`;
|
|
270
|
+
if (!p || !to)
|
|
271
|
+
return raw;
|
|
272
|
+
const m = await this.tokenMeta(chain, to);
|
|
273
|
+
const tok = m ? m.symbol : `the token at ${to}`;
|
|
274
|
+
const amt = (v) => (v >= MaxUint256 / 2n ? `UNLIMITED ${m?.symbol ?? "tokens"}` : m ? `${formatUnits(v, m.decimals)} ${m.symbol}` : `${v} units`);
|
|
275
|
+
const a = p.args;
|
|
276
|
+
switch (p.name) {
|
|
277
|
+
case "approve": return `Approves ${a[0]} to spend ${amt(a[1])} of your ${tok}.${a[1] > 0n ? " Warning: that address can then move those tokens at any time without asking." : ""}`;
|
|
278
|
+
case "increaseAllowance": return `Lets ${a[0]} spend ${amt(a[1])} more of your ${tok}. Warning: that address can then move those tokens without asking.`;
|
|
279
|
+
case "transfer": return `Sends ${amt(a[1])} to ${a[0]}.`;
|
|
280
|
+
case "transferFrom": return `Moves ${amt(a[2])} of ${tok} from ${a[0]} to ${a[1]}.`;
|
|
281
|
+
case "setApprovalForAll": return a[1] ? `Gives ${a[0]} control of ALL your items in the collection at ${to}. Warning: it can move every one of them without asking.` : `Removes ${a[0]}'s control of your items in the collection at ${to}.`;
|
|
282
|
+
}
|
|
283
|
+
return raw;
|
|
284
|
+
}
|
|
285
|
+
/**
|
|
286
|
+
* Simulate a Solana transaction and report what changes for this wallet: SOL, every token account of
|
|
287
|
+
* this wallet that the transaction touches (plus USDC/USDT), and who controls them afterwards.
|
|
288
|
+
* Inner instructions are covered because the result is read from the simulated accounts.
|
|
289
|
+
*/
|
|
290
|
+
async simulateSolana(vtx, me) {
|
|
291
|
+
const warnings = [];
|
|
292
|
+
try {
|
|
293
|
+
const conn = this.sol();
|
|
294
|
+
const held = new Map();
|
|
295
|
+
for (const prog of ["TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", "TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb"]) {
|
|
296
|
+
const r = await conn.getParsedTokenAccountsByOwner(me, { programId: new PublicKey(prog) });
|
|
297
|
+
for (const a of r.value) {
|
|
298
|
+
const i = a.account.data.parsed?.info;
|
|
299
|
+
if (i)
|
|
300
|
+
held.set(a.pubkey.toBase58(), { mint: i.mint, amount: BigInt(i.tokenAmount.amount), decimals: i.tokenAmount.decimals, owner: i.owner, delegate: i.delegate ?? null });
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
// Every account the transaction can touch, lookup tables included.
|
|
304
|
+
const luts = [];
|
|
305
|
+
for (const l of vtx.message.addressTableLookups ?? []) {
|
|
306
|
+
const t = await conn.getAddressLookupTable?.(l.accountKey);
|
|
307
|
+
if (!t?.value)
|
|
308
|
+
throw new Error("lookup table");
|
|
309
|
+
luts.push(t.value);
|
|
310
|
+
}
|
|
311
|
+
const keys = vtx.message.getAccountKeys({ addressLookupTableAccounts: luts });
|
|
312
|
+
const touched = new Set();
|
|
313
|
+
for (let i = 0; i < keys.length; i++) {
|
|
314
|
+
const k = keys.get(i).toBase58();
|
|
315
|
+
if (held.has(k) && vtx.message.isAccountWritable(i))
|
|
316
|
+
touched.add(k);
|
|
317
|
+
}
|
|
318
|
+
for (const [k, v] of held)
|
|
319
|
+
if (SOL_MINTS[v.mint])
|
|
320
|
+
touched.add(k);
|
|
321
|
+
const watch = [...touched].slice(0, 60);
|
|
322
|
+
const before = await conn.getBalance(me);
|
|
323
|
+
const r = await conn.simulateTransaction(vtx, { sigVerify: false, replaceRecentBlockhash: true, accounts: { encoding: "base64", addresses: [me.toBase58(), ...watch] } });
|
|
324
|
+
if (r.value.err)
|
|
325
|
+
return { text: `Check: would fail (${JSON.stringify(r.value.err).slice(0, 120)}).`, warnings };
|
|
326
|
+
const acc = r.value.accounts ?? [];
|
|
327
|
+
const lines = [];
|
|
328
|
+
const self = acc[0];
|
|
329
|
+
if (self) {
|
|
330
|
+
lines.push(`SOL ${((self.lamports - before) / 1e9).toFixed(6)}`);
|
|
331
|
+
if (self.owner && self.owner !== "11111111111111111111111111111111")
|
|
332
|
+
warnings.push("it hands your wallet account to another program.");
|
|
333
|
+
}
|
|
334
|
+
watch.forEach((addr, i) => {
|
|
335
|
+
const w = held.get(addr), a = acc[i + 1];
|
|
336
|
+
const name = SOL_MINTS[w.mint] ?? `token ${w.mint.slice(0, 4)}…${w.mint.slice(-4)}`;
|
|
337
|
+
if (!a) {
|
|
338
|
+
lines.push(`${name} -${formatUnits(w.amount, w.decimals)} (account closed)`);
|
|
339
|
+
return;
|
|
340
|
+
}
|
|
341
|
+
const d = Buffer.from(a.data[0] ?? "", "base64");
|
|
342
|
+
if (d.length < 165)
|
|
343
|
+
return;
|
|
344
|
+
const now = d.readBigUInt64LE(64);
|
|
345
|
+
if (now !== w.amount)
|
|
346
|
+
lines.push(`${name} ${now > w.amount ? "+" : "-"}${formatUnits(now > w.amount ? now - w.amount : w.amount - now, w.decimals)}`);
|
|
347
|
+
const owner = new PublicKey(d.subarray(32, 64)).toBase58();
|
|
348
|
+
if (owner !== me.toBase58())
|
|
349
|
+
warnings.push(`it gives your ${name} account to ${owner}.`);
|
|
350
|
+
const delegate = d.readUInt32LE(72) === 1 ? new PublicKey(d.subarray(76, 108)).toBase58() : null;
|
|
351
|
+
if (delegate && delegate !== w.delegate)
|
|
352
|
+
warnings.push(`it lets ${delegate} spend your ${name} later.`);
|
|
353
|
+
});
|
|
354
|
+
return { text: `Check: your balances change by ${lines.join(", ") || "nothing"}.`, warnings };
|
|
355
|
+
}
|
|
356
|
+
catch {
|
|
357
|
+
return { text: "Check: couldn't simulate it, so the changes can't be shown. Only approve if you trust this site.", warnings };
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
async ask(text) { if ((await this.o.approve(text)) !== "approved")
|
|
361
|
+
throw rejected(); }
|
|
362
|
+
async slow(origin, method, p) {
|
|
363
|
+
const host = new URL(origin).host;
|
|
364
|
+
const keys = this.o.keys();
|
|
365
|
+
switch (method) {
|
|
366
|
+
case "eth_requestAccounts":
|
|
367
|
+
case "wallet_requestPermissions":
|
|
368
|
+
if (!this.evmOk())
|
|
369
|
+
throw new RpcError(4900, "Base and Ethereum are turned off in Tollkit's settings.");
|
|
370
|
+
await this.ask(`${host} wants to connect to your wallet.\nIt will see your Base/Ethereum address ${this.o.evm} and can ask you to sign or send. Each request comes here for your OK.`);
|
|
371
|
+
this.setSite(origin, { evm: true });
|
|
372
|
+
return method === "eth_requestAccounts" ? [this.o.evm] : [{ parentCapability: "eth_accounts", invoker: origin }];
|
|
373
|
+
case "sol_connect":
|
|
374
|
+
if (!this.o.chains().includes("solana"))
|
|
375
|
+
throw new RpcError(4900, "Solana is turned off in Tollkit's settings.");
|
|
376
|
+
await this.ask(`${host} wants to connect to your wallet.\nIt will see your Solana address ${this.o.solana} and can ask you to sign or send. Each request comes here for your OK.`);
|
|
377
|
+
this.setSite(origin, { solana: true });
|
|
378
|
+
return this.solAccount();
|
|
379
|
+
case "personal_sign": {
|
|
380
|
+
const [data, addr] = p;
|
|
381
|
+
if (!isHexString(data) && typeof data !== "string")
|
|
382
|
+
throw new RpcError(-32602, "Bad message.");
|
|
383
|
+
if (addr && String(addr).toLowerCase() !== this.o.evm.toLowerCase())
|
|
384
|
+
throw unauthorized();
|
|
385
|
+
const bytes = isHexString(data) ? getBytes(data) : new TextEncoder().encode(data);
|
|
386
|
+
await this.ask(`${host} asks you to sign a message:\n\n${shown(readable(bytes))}`);
|
|
387
|
+
return keys.evm.signMessage(bytes);
|
|
388
|
+
}
|
|
389
|
+
case "eth_signTypedData_v4": {
|
|
390
|
+
const [addr, json] = p;
|
|
391
|
+
if (String(addr).toLowerCase() !== this.o.evm.toLowerCase())
|
|
392
|
+
throw unauthorized();
|
|
393
|
+
let td;
|
|
394
|
+
try {
|
|
395
|
+
td = typeof json === "string" ? JSON.parse(json) : json;
|
|
396
|
+
}
|
|
397
|
+
catch {
|
|
398
|
+
throw new RpcError(-32602, "Bad typed data.");
|
|
399
|
+
}
|
|
400
|
+
const { EIP712Domain: _d, ...types } = td?.types ?? {};
|
|
401
|
+
const cid = td?.domain?.chainId !== undefined ? Number(td.domain.chainId) : null;
|
|
402
|
+
const vc = td?.domain?.verifyingContract ? String(td.domain.verifyingContract) : null;
|
|
403
|
+
const permit = /permit|order|approval/i.test(String(td?.primaryType ?? ""));
|
|
404
|
+
await this.ask(`${host} asks you to sign data${td?.domain?.name ? ` for ${String(td.domain.name).slice(0, 60)}` : ""}:\nType: ${String(td?.primaryType ?? "").slice(0, 60)}${cid ? `\nChain: ${cid}` : ""}${vc ? `\nContract: ${vc}` : ""}\n\n${shown(JSON.stringify(td?.message ?? {}, null, 1), 4000)}${permit ? "\n\nWarning: signatures like this can let someone move your tokens without another prompt. Only approve if you started this." : ""}`);
|
|
405
|
+
return keys.evm.signTypedData(td.domain ?? {}, types, td.message ?? {});
|
|
406
|
+
}
|
|
407
|
+
case "eth_sendTransaction": {
|
|
408
|
+
const t = (p[0] ?? {});
|
|
409
|
+
if (t.from && String(t.from).toLowerCase() !== this.o.evm.toLowerCase())
|
|
410
|
+
throw unauthorized();
|
|
411
|
+
const chain = this.chainOf(origin);
|
|
412
|
+
if (t.chainId !== undefined && Number(t.chainId) !== EVM_CHAIN_ID[chain])
|
|
413
|
+
throw new RpcError(4901, "The site asked for a different network than it's connected to.");
|
|
414
|
+
const to = t.to ? getAddress(String(t.to).toLowerCase()) : null;
|
|
415
|
+
const value = BigInt(t.value ?? 0), data = t.data ?? t.input ?? "0x";
|
|
416
|
+
let sim = "";
|
|
417
|
+
try {
|
|
418
|
+
await this.rpc(chain, "eth_estimateGas", [{ from: this.o.evm, to, value: toQuantity(value), data }]);
|
|
419
|
+
sim = "Check: should go through.";
|
|
420
|
+
}
|
|
421
|
+
catch (e) {
|
|
422
|
+
sim = `Check: would fail (${e.message.slice(0, 120)}).`;
|
|
423
|
+
}
|
|
424
|
+
const what = await this.describeEvmCall(chain, to, String(data));
|
|
425
|
+
await this.ask(`${host} asks you to send a transaction on ${chain === "base" ? "Base" : "Ethereum"}:\nTo ${to ?? "(new contract)"}\nValue ${formatEther(value)} ETH\n${what}\n${sim}`);
|
|
426
|
+
const req = { to, value, data, chainId: EVM_CHAIN_ID[chain] };
|
|
427
|
+
if (t.gas ?? t.gasLimit)
|
|
428
|
+
req.gasLimit = BigInt(t.gas ?? t.gasLimit);
|
|
429
|
+
const hash = this.o.sendEvm ? await this.o.sendEvm(chain, req, keys) : (await keys.evm.connect(new JsonRpcProvider(this.o.rpc?.[chain] ?? DEFAULT_RPC[chain], EVM_CHAIN_ID[chain], { staticNetwork: true })).sendTransaction(req)).hash;
|
|
430
|
+
record({ id: randomUUID(), ts: new Date().toISOString(), kind: "dapp", status: "done", usd: 0, chain, seller: host, tool: "send", detail: `${formatEther(value)} ETH -> ${to ?? "new contract"} (from ${host})`, tx: hash }, this.o.dir);
|
|
431
|
+
return hash;
|
|
432
|
+
}
|
|
433
|
+
case "sol_signTransaction":
|
|
434
|
+
case "sol_signAndSendTransaction": {
|
|
435
|
+
const b64 = String(p[0]?.transaction ?? "");
|
|
436
|
+
let vtx;
|
|
437
|
+
try {
|
|
438
|
+
vtx = VersionedTransaction.deserialize(Buffer.from(b64, "base64"));
|
|
439
|
+
}
|
|
440
|
+
catch {
|
|
441
|
+
throw new RpcError(-32602, "That isn't a Solana transaction.");
|
|
442
|
+
}
|
|
443
|
+
const me = new PublicKey(this.o.solana);
|
|
444
|
+
const keysAll = vtx.message.staticAccountKeys;
|
|
445
|
+
const signerIdx = keysAll.slice(0, vtx.message.header.numRequiredSignatures).findIndex((k) => k.equals(me));
|
|
446
|
+
if (signerIdx < 0)
|
|
447
|
+
throw new RpcError(-32602, "This transaction doesn't need this wallet's signature.");
|
|
448
|
+
const progs = [...new Set(vtx.message.compiledInstructions.map((ix) => keysAll[ix.programIdIndex]?.toBase58() ?? "?"))].map((id) => PROGRAMS[id] ?? `${id.slice(0, 4)}…${id.slice(-4)}`);
|
|
449
|
+
const simr = await this.simulateSolana(vtx, me);
|
|
450
|
+
const sim = simr.text;
|
|
451
|
+
const warn = [...new Set([...solanaWarnings(vtx), ...simr.warnings])];
|
|
452
|
+
const send = method === "sol_signAndSendTransaction";
|
|
453
|
+
await this.ask(`${host} asks you to ${send ? "sign and send" : "sign"} a Solana transaction:\n${vtx.message.compiledInstructions.length} instruction(s) using ${progs.join(", ")}\n${signerIdx === 0 ? "You pay the network fee." : "Another account pays the network fee."}\n${sim}${warn.length ? "\n\nWarning: " + warn.join(" ") : ""}`);
|
|
454
|
+
vtx.sign([keys.solana]);
|
|
455
|
+
if (!send)
|
|
456
|
+
return { signedTransaction: Buffer.from(vtx.serialize()).toString("base64") };
|
|
457
|
+
const sig = await this.sol().sendRawTransaction(vtx.serialize(), { skipPreflight: !!p[0]?.options?.skipPreflight, maxRetries: 3 });
|
|
458
|
+
record({ id: randomUUID(), ts: new Date().toISOString(), kind: "dapp", status: "done", usd: 0, chain: "solana", seller: host, tool: "send", detail: `Solana transaction (from ${host})`, tx: sig }, this.o.dir);
|
|
459
|
+
return { signature: Buffer.from(bs58decode(sig)).toString("base64") };
|
|
460
|
+
}
|
|
461
|
+
case "sol_signMessage": {
|
|
462
|
+
const msg = Buffer.from(String(p[0]?.message ?? ""), "base64");
|
|
463
|
+
// Only readable text. Raw bytes could be a transaction in disguise (a transaction message starts with
|
|
464
|
+
// a small signature count byte, or 0x80 for v0, which fail these checks).
|
|
465
|
+
let text = "";
|
|
466
|
+
try {
|
|
467
|
+
text = new TextDecoder("utf-8", { fatal: true }).decode(msg);
|
|
468
|
+
}
|
|
469
|
+
catch {
|
|
470
|
+
text = "\u0000";
|
|
471
|
+
}
|
|
472
|
+
if (!msg.length || /[\x00-\x08\x0b\x0c\x0e-\x1f\x7f]/.test(text))
|
|
473
|
+
throw new RpcError(4200, "Tollkit only signs text messages on Solana.");
|
|
474
|
+
await this.ask(`${host} asks you to sign a message with your Solana key:\n\n${shown(text, 2000)}`);
|
|
475
|
+
const seed = Buffer.from(keys.solana.secretKey.slice(0, 32));
|
|
476
|
+
const key = createPrivateKey({ key: Buffer.concat([Buffer.from("302e020100300506032b657004220420", "hex"), seed]), format: "der", type: "pkcs8" });
|
|
477
|
+
return { signature: edSign(null, msg, key).toString("base64"), signedMessage: msg.toString("base64") };
|
|
478
|
+
}
|
|
479
|
+
}
|
|
480
|
+
throw new RpcError(4200, "Unsupported.");
|
|
481
|
+
}
|
|
482
|
+
}
|
|
483
|
+
const B58 = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";
|
|
484
|
+
function bs58decode(s) {
|
|
485
|
+
let n = 0n;
|
|
486
|
+
for (const ch of s) {
|
|
487
|
+
const i = B58.indexOf(ch);
|
|
488
|
+
if (i < 0)
|
|
489
|
+
throw new Error("bad base58");
|
|
490
|
+
n = n * 58n + BigInt(i);
|
|
491
|
+
}
|
|
492
|
+
const out = [];
|
|
493
|
+
while (n > 0n) {
|
|
494
|
+
out.unshift(Number(n & 255n));
|
|
495
|
+
n >>= 8n;
|
|
496
|
+
}
|
|
497
|
+
for (const ch of s) {
|
|
498
|
+
if (ch === "1")
|
|
499
|
+
out.unshift(0);
|
|
500
|
+
else
|
|
501
|
+
break;
|
|
502
|
+
}
|
|
503
|
+
return Uint8Array.from(out);
|
|
504
|
+
}
|
|
505
|
+
//# sourceMappingURL=dapp.js.map
|
package/dist/dapp.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dapp.js","sourceRoot":"","sources":["../src/dapp.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,WAAW,EAAE,UAAU,EAAE,IAAI,IAAI,MAAM,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACrH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAClE,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,oBAAoB,EAAgB,MAAM,iBAAiB,CAAC;AAC5F,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,eAAe,EAAE,UAAU,EAAwB,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,YAAY,EAAkC,MAAM,QAAQ,CAAC;AAChO,OAAO,EAAE,WAAW,EAAE,YAAY,EAAc,MAAM,aAAa,CAAC;AACpE,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAMrC,MAAM,OAAO,QAAS,SAAQ,KAAK;IAAwB;IAArB,YAAqB,IAAY,EAAE,OAAe;QAAI,KAAK,CAAC,OAAO,CAAC,CAAC;QAAhD,SAAI,GAAJ,IAAI,CAAQ;IAAqC,CAAC;CAAE;AAC/G,MAAM,QAAQ,GAAG,GAAG,EAAE,CAAC,IAAI,QAAQ,CAAC,IAAI,EAAE,+BAA+B,CAAC,CAAC;AAC3E,MAAM,YAAY,GAAG,GAAG,EAAE,CAAC,IAAI,QAAQ,CAAC,IAAI,EAAE,qCAAqC,CAAC,CAAC;AAErF,MAAM,SAAS,GAAwC,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;AAC3F,MAAM,SAAS,GAAwC,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;AAC/F,0EAA0E;AAC1E,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC,iBAAiB,EAAE,UAAU,EAAE,iBAAiB,EAAE,cAAc,EAAE,0BAA0B,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,oBAAoB,EAAE,aAAa,EAAE,aAAa,EAAE,kBAAkB,EAAE,0BAA0B,EAAE,yBAAyB,EAAE,2BAA2B,EAAE,aAAa,EAAE,oBAAoB,CAAC,CAAC,CAAC;AAClX,2FAA2F;AAC3F,MAAM,QAAQ,GAA2B;IACvC,kCAAkC,EAAE,QAAQ,EAAE,2CAA2C,EAAE,OAAO,EAAE,2CAA2C,EAAE,YAAY;IAC7J,4CAA4C,EAAE,kBAAkB,EAAE,2CAA2C,EAAE,gBAAgB,EAAE,2CAA2C,EAAE,MAAM,EAAE,2CAA2C,EAAE,OAAO;CAC3O,CAAC;AAEF,MAAM,WAAW,GAAG,IAAI,SAAS,CAAC,CAAC,mDAAmD,EAAE,+CAA+C,EAAE,iEAAiE,EAAE,6DAA6D,EAAE,iEAAiE,CAAC,CAAC,CAAC;AAC/U,MAAM,SAAS,GAA2B,EAAE,4CAA4C,EAAE,MAAM,EAAE,4CAA4C,EAAE,MAAM,EAAE,CAAC;AAEzJ,sFAAsF;AACtF,MAAM,UAAU,cAAc,CAAC,GAAyB;IACtD,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,iBAAiB,EAAE,GAAG,GAAG,IAAI,GAAG,EAAU,CAAC;IACpE,KAAK,MAAM,EAAE,IAAI,GAAG,CAAC,OAAO,CAAC,oBAAoB,EAAE,CAAC;QAClD,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,cAAc,CAAC,EAAE,QAAQ,EAAE,EAAE,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC;QAC9D,IAAI,IAAI,KAAK,6CAA6C,IAAI,IAAI,KAAK,6CAA6C,EAAE,CAAC;YACrH,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE;gBAAE,GAAG,CAAC,GAAG,CAAC,mEAAmE,CAAC,CAAC;YAC5G,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;gBAAE,GAAG,CAAC,GAAG,CAAC,qDAAqD,CAAC,CAAC;QACjF,CAAC;QACD,IAAI,IAAI,KAAK,kCAAkC,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;YAAE,GAAG,CAAC,GAAG,CAAC,uDAAuD,CAAC,CAAC;IAC9M,CAAC;IACD,OAAO,CAAC,GAAG,GAAG,CAAC,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,CAAS;IACpC,IAAI,CAAM,CAAC;IACX,IAAI,CAAC;QAAC,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC;QAAC,MAAM,IAAI,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC;IAAC,CAAC;IAC5E,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC;QAAE,MAAM,IAAI,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC;IACjF,IAAI,CAAC,CAAC,QAAQ,KAAK,QAAQ,IAAI,CAAC,CAAC,CAAC,QAAQ,KAAK,OAAO,IAAI,CAAC,CAAC,CAAC,QAAQ,KAAK,WAAW,IAAI,CAAC,CAAC,QAAQ,KAAK,WAAW,CAAC,CAAC;QAAE,OAAO,CAAC,CAAC,MAAM,CAAC;IACvI,MAAM,IAAI,QAAQ,CAAC,IAAI,EAAE,uCAAuC,CAAC,CAAC;AACpE,CAAC;AACD,MAAM,KAAK,GAAG,CAAC,CAAS,EAAE,CAAC,GAAG,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,iBAAiB,CAAC,CAAC,MAAM,GAAG,CAAC,6BAA6B,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACtI,SAAS,QAAQ,CAAC,KAAiB;IACjC,IAAI,CAAC;QAAC,MAAM,CAAC,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;QAAC,IAAI,+BAA+B,CAAC,IAAI,CAAC,CAAC,CAAC;YAAE,OAAO,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC,CAAC,cAAc,CAAC,CAAC;IACtH,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC;AACxB,CAAC;AAED,MAAM,OAAO,UAAU;IAKD;IAJZ,IAAI,CAAS;IACb,KAAK,GAAG,IAAI,GAAG,EAAkB,CAAC;IAClC,UAAU,GAAG,CAAC,CAAC;IACf,IAAI,GAAG,IAAI,GAAG,EAA8I,CAAC;IACrK,YAAoB,CAGqN;QAHrN,MAAC,GAAD,CAAC,CAGoN;QACvO,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,gBAAgB,CAAC,CAAC;IAC7D,CAAC;IAEO,IAAI,KAAc,IAAI,CAAC;QAAC,OAAO,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;IAAC,CAAC,CAAC,CAAC;IAC/K,IAAI,CAAC,CAAU,IAAI,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;IAEnG,+FAA+F;IAC/F,4EAA4E;IAC5E,OAAO,CAAC,IAAY;QAClB,MAAM,GAAG,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,oBAAoB,EAAE,SAAS,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC9G,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC;QAC7C,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC;QACpB,OAAO,GAAG,IAAI,IAAI,GAAG,EAAE,CAAC;IAC1B,CAAC;IACD,IAAI,CAAC,IAAY,EAAE,SAAiB;QAClC,IAAI,CAAC,kCAAkC,CAAC,IAAI,CAAC,SAAS,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;QAC3H,IAAI,IAAI,CAAC,UAAU,IAAI,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,6DAA6D,CAAC,CAAC;QACzG,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QACjE,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAC9B,IAAI,CAAC,GAAG,IAAI,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;YAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YAAC,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;QAAC,CAAC;QAC3G,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACrB,MAAM,KAAK,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAC9C,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QACtB,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;QAChI,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACb,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,CAAC,KAAyB,EAAE,SAAiB;QAClD,IAAI,CAAC,KAAK,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC;QAC1D,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QACxE,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM,IAAI,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACzI,CAAC;IACD,MAAM,KAAa,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;IACtD,SAAS,KAAK,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAEnE,+FAA+F;IAC/F,2DAA2D;IAC3D,KAAK,KAAa,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAC9E,IAAI,CAAC,MAAc,IAAsB,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC;IAC7F,OAAO,CAAC,MAAc,EAAE,KAAoB;QAClD,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QACtB,MAAM,GAAG,GAAG,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC;QACrD,IAAI,GAAG;YAAE,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;;YAAM,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC;QACvJ,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACf,CAAC;IACD,UAAU,CAAC,MAAc,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;IAEnF,+FAA+F;IAC/F,kGAAkG;IAClG,KAAK,CAAC,MAAM,CAAC,SAAiB,EAAE,MAAc,EAAE,MAAe;QAC7D,MAAM,MAAM,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC;QACvC,MAAM,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QACnG,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;QAClD,IAAI,KAAK,CAAC,IAAI;YAAE,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC;QAChD,MAAM,OAAO,GAAG,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,MAAM,CAAC;QAC5G,IAAI,OAAO,IAAI,CAAC;YAAE,MAAM,IAAI,QAAQ,CAAC,IAAI,EAAE,wEAAwE,CAAC,CAAC;QACrH,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,MAAM,IAAI,EAAE;YAAE,MAAM,IAAI,QAAQ,CAAC,IAAI,EAAE,+DAA+D,CAAC,CAAC;QAC1K,MAAM,EAAE,GAAG,UAAU,EAAE,CAAC;QACxB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;QACjE,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI;YAAE,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,MAAM;gBAAE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACzF,KAAK,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,IAAI,CACpC,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,CAAC,EACjF,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,YAAY,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,OAAO,EAAG,CAAW,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,CAAC,CAC7K,CAAC;QACF,OAAO,EAAE,EAAE,EAAE,CAAC;IAChB,CAAC;IACD,GAAG,CAAC,EAAU,IAAI,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAAE,MAAM,IAAI,QAAQ,CAAC,CAAC,KAAK,EAAE,kBAAkB,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAE1G,OAAO,CAAC,MAAc;QAC5B,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,KAAK,IAAI,MAAM,CAAC;QAC7C,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;QAC3B,OAAO,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC;IACxE,CAAC;IACO,KAAK,KAAc,OAAO,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC;IAExE,KAAK,CAAC,KAAK,CAAC,MAAc,EAAE,MAAc,EAAE,CAAY;QAC9D,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC5B,MAAM,IAAI,GAAG,CAAC,MAAe,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;QAC3D,QAAQ,MAAM,EAAE,CAAC;YACf,KAAK,aAAa,CAAC,CAAC,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YACjE,KAAK,aAAa,CAAC,CAAC,OAAO,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;YAC5E,KAAK,cAAc,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAC7D,KAAK,cAAc,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAC7D,KAAK,uBAAuB,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACjH,KAAK,0BAA0B;gBAAE,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC;gBAAC,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC;YACzF,KAAK,4BAA4B,CAAC;YAAC,KAAK,yBAAyB,CAAC,CAAC,CAAC;gBAClE,MAAM,IAAI,GAAG,MAAM,CAAE,CAAC,CAAC,CAAC,CAAS,EAAE,OAAO,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;gBAChE,MAAM,CAAC,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;gBAC1B,IAAI,CAAC,CAAC;oBAAE,MAAM,IAAI,QAAQ,CAAC,IAAI,EAAE,4CAA4C,CAAC,CAAC;gBAC/E,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;oBAAE,MAAM,IAAI,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,uCAAuC,CAAC,CAAC;gBACzI,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;gBACnC,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC;YACpB,CAAC;YACD,KAAK,qBAAqB,CAAC;YAAC,KAAK,2BAA2B;gBAC1D,IAAI,CAAC,EAAE,GAAG;oBAAE,OAAO,IAAI,CAAC,MAAM,KAAK,qBAAqB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;gBACnI,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;YACzB,KAAK,aAAa;gBAChB,IAAI,CAAC,EAAE,MAAM;oBAAE,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;gBAC9C,IAAK,CAAC,CAAC,CAAC,CAAS,EAAE,MAAM;oBAAE,MAAM,IAAI,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC;gBACtE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;YACzB,KAAK,gBAAgB;gBAAE,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;gBAAC,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC;YAClF,KAAK,UAAU,CAAC,CAAC,MAAM,IAAI,QAAQ,CAAC,IAAI,EAAE,6EAA6E,CAAC,CAAC;QAC3H,CAAC;QACD,IAAI,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;YACrB,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE;gBAAE,MAAM,IAAI,QAAQ,CAAC,IAAI,EAAE,yDAAyD,CAAC,CAAC;YACvG,OAAO,IAAI,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC;QAC/D,CAAC;QACD,IAAI,CAAC,eAAe,EAAE,sBAAsB,EAAE,qBAAqB,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YAAC,IAAI,CAAC,CAAC,EAAE,GAAG;gBAAE,MAAM,YAAY,EAAE,CAAC;YAAC,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;QAAC,CAAC;QACrJ,IAAI,CAAC,qBAAqB,EAAE,4BAA4B,EAAE,iBAAiB,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YAAC,IAAI,CAAC,CAAC,EAAE,MAAM;gBAAE,MAAM,YAAY,EAAE,CAAC;YAAC,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;QAAC,CAAC;QAChK,MAAM,IAAI,QAAQ,CAAC,IAAI,EAAE,2BAA2B,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC;IACtF,CAAC;IAEO,UAAU,KAAK,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;IAEtI,GAAG,CAAC,KAA0B,EAAE,MAAc,EAAE,MAAiB;QACvE,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM;YAAE,OAAO,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QAC/D,OAAO,IAAI,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,IAAI,WAAW,CAAC,KAAK,CAAC,EAAE,YAAY,CAAC,KAAK,CAAC,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC3I,CAAC;IACO,GAAG,KAAK,OAAO,IAAI,CAAC,CAAC,CAAC,OAAO,IAAI,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,EAAE,MAAM,IAAI,WAAW,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;IAEzG,IAAI,GAAG,IAAI,GAAG,EAAuD,CAAC;IACtE,KAAK,CAAC,SAAS,CAAC,KAA0B,EAAE,KAAa;QAC/D,MAAM,CAAC,GAAG,GAAG,KAAK,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;QAC5C,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;YAAE,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAE,CAAC;QAC/C,IAAI,CAAC,GAAgD,IAAI,CAAC;QAC1D,IAAI,CAAC;YACH,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,UAAU,EAAE,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,UAAU,EAAE,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;YAC/L,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,eAAe,EAAE,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAClG,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,eAAe,EAAE,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACtF,IAAI,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC;gBAAE,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;QAC1D,CAAC;QAAC,MAAM,CAAC;YAAC,CAAC,GAAG,IAAI,CAAC;QAAC,CAAC;QACrB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACpB,OAAO,CAAC,CAAC;IACX,CAAC;IAED,iHAAiH;IACzG,KAAK,CAAC,eAAe,CAAC,KAA0B,EAAE,EAAiB,EAAE,IAAY;QACvF,IAAI,CAAC,IAAI,IAAI,IAAI,KAAK,IAAI;YAAE,OAAO,iCAAiC,CAAC;QACrE,IAAI,CAAC,GAA8C,IAAI,CAAC;QACxD,IAAI,CAAC;YAAC,CAAC,GAAG,WAAW,CAAC,gBAAgB,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC;YAAC,CAAC,GAAG,IAAI,CAAC;QAAC,CAAC;QACvE,MAAM,GAAG,GAAG,SAAS,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,iFAAiF,CAAC;QACtJ,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE;YAAE,OAAO,GAAG,CAAC;QAC1B,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAC1C,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,gBAAgB,EAAE,EAAE,CAAC;QAChD,MAAM,GAAG,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,UAAU,GAAG,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,EAAE,MAAM,IAAI,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC1J,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;QACjB,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC;YACf,KAAK,SAAS,CAAC,CAAC,OAAO,YAAY,CAAC,CAAC,CAAC,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,+EAA+E,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;YACnL,KAAK,mBAAmB,CAAC,CAAC,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,iBAAiB,GAAG,oEAAoE,CAAC;YACzJ,KAAK,UAAU,CAAC,CAAC,OAAO,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;YACzD,KAAK,cAAc,CAAC,CAAC,OAAO,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;YACpF,KAAK,mBAAmB,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,mDAAmD,EAAE,0DAA0D,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,iDAAiD,EAAE,GAAG,CAAC;QAC/O,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IAED;;;;OAIG;IACK,KAAK,CAAC,cAAc,CAAC,GAAyB,EAAE,EAAa;QACnE,MAAM,QAAQ,GAAa,EAAE,CAAC;QAC9B,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACxB,MAAM,IAAI,GAAG,IAAI,GAAG,EAAsG,CAAC;YAC3H,KAAK,MAAM,IAAI,IAAI,CAAC,6CAA6C,EAAE,6CAA6C,CAAC,EAAE,CAAC;gBAClH,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,6BAA6B,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBAC3F,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC;oBAAC,MAAM,CAAC,GAAI,CAAC,CAAC,OAAO,CAAC,IAAY,CAAC,MAAM,EAAE,IAAI,CAAC;oBAAC,IAAI,CAAC;wBAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,WAAW,CAAC,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,IAAI,IAAI,EAAE,CAAC,CAAC;gBAAC,CAAC;YAC5P,CAAC;YACD,mEAAmE;YACnE,MAAM,IAAI,GAAG,EAAE,CAAC;YAChB,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,mBAAmB,IAAI,EAAE,EAAE,CAAC;gBAAC,MAAM,CAAC,GAAG,MAAO,IAAY,CAAC,qBAAqB,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;gBAAC,IAAI,CAAC,CAAC,EAAE,KAAK;oBAAE,MAAM,IAAI,KAAK,CAAC,cAAc,CAAC,CAAC;gBAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;YAAC,CAAC;YACnM,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,cAAc,CAAC,EAAE,0BAA0B,EAAE,IAAI,EAAE,CAAC,CAAC;YAC9E,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;YAClC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBAAC,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAE,CAAC,QAAQ,EAAE,CAAC;gBAAC,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAAC;oBAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YAAC,CAAC;YACjJ,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,IAAI;gBAAE,IAAI,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC;oBAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACjE,MAAM,KAAK,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACxC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;YACzC,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,sBAAsB,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,QAAQ,EAAE,EAAE,GAAG,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;YAC1K,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG;gBAAE,OAAO,EAAE,IAAI,EAAE,sBAAsB,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,EAAE,QAAQ,EAAE,CAAC;YAChH,MAAM,GAAG,GAAG,CAAC,CAAC,KAAK,CAAC,QAAQ,IAAI,EAAE,CAAC;YACnC,MAAM,KAAK,GAAa,EAAE,CAAC;YAC3B,MAAM,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;YACpB,IAAI,IAAI,EAAE,CAAC;gBACT,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBACjE,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,KAAK,kCAAkC;oBAAE,QAAQ,CAAC,IAAI,CAAC,kDAAkD,CAAC,CAAC;YACzI,CAAC;YACD,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE;gBACxB,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;gBAC1C,MAAM,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,SAAS,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBACpF,IAAI,CAAC,CAAC,EAAE,CAAC;oBAAC,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAC;oBAAC,OAAO;gBAAC,CAAC;gBACjG,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAE,CAAC,CAAC,IAAY,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,QAAQ,CAAC,CAAC;gBAC1D,IAAI,CAAC,CAAC,MAAM,GAAG,GAAG;oBAAE,OAAO;gBAC3B,MAAM,GAAG,GAAG,CAAC,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;gBAClC,IAAI,GAAG,KAAK,CAAC,CAAC,MAAM;oBAAE,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,IAAI,GAAG,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,WAAW,CAAC,GAAG,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;gBACtJ,MAAM,KAAK,GAAG,IAAI,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;gBAC3D,IAAI,KAAK,KAAK,EAAE,CAAC,QAAQ,EAAE;oBAAE,QAAQ,CAAC,IAAI,CAAC,iBAAiB,IAAI,eAAe,KAAK,GAAG,CAAC,CAAC;gBACzF,MAAM,QAAQ,GAAG,CAAC,CAAC,YAAY,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;gBACjG,IAAI,QAAQ,IAAI,QAAQ,KAAK,CAAC,CAAC,QAAQ;oBAAE,QAAQ,CAAC,IAAI,CAAC,WAAW,QAAQ,eAAe,IAAI,SAAS,CAAC,CAAC;YAC1G,CAAC,CAAC,CAAC;YACH,OAAO,EAAE,IAAI,EAAE,kCAAkC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,SAAS,GAAG,EAAE,QAAQ,EAAE,CAAC;QAChG,CAAC;QAAC,MAAM,CAAC;YAAC,OAAO,EAAE,IAAI,EAAE,kGAAkG,EAAE,QAAQ,EAAE,CAAC;QAAC,CAAC;IAC5I,CAAC;IAEO,KAAK,CAAC,GAAG,CAAC,IAAY,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,UAAU;QAAE,MAAM,QAAQ,EAAE,CAAC,CAAC,CAAC;IAE9F,KAAK,CAAC,IAAI,CAAC,MAAc,EAAE,MAAc,EAAE,CAAY;QAC7D,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC;QAClC,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC3B,QAAQ,MAAM,EAAE,CAAC;YACf,KAAK,qBAAqB,CAAC;YAAC,KAAK,2BAA2B;gBAC1D,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE;oBAAE,MAAM,IAAI,QAAQ,CAAC,IAAI,EAAE,yDAAyD,CAAC,CAAC;gBACvG,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,6EAA6E,IAAI,CAAC,CAAC,CAAC,GAAG,wEAAwE,CAAC,CAAC;gBACvL,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;gBACpC,OAAO,MAAM,KAAK,qBAAqB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;YACnH,KAAK,aAAa;gBAChB,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC;oBAAE,MAAM,IAAI,QAAQ,CAAC,IAAI,EAAE,6CAA6C,CAAC,CAAC;gBACjH,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,sEAAsE,IAAI,CAAC,CAAC,CAAC,MAAM,wEAAwE,CAAC,CAAC;gBACnL,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;gBACvC,OAAO,IAAI,CAAC,UAAU,EAAE,CAAC;YAC3B,KAAK,eAAe,CAAC,CAAC,CAAC;gBACrB,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAqB,CAAC;gBAC3C,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,OAAO,IAAI,KAAK,QAAQ;oBAAE,MAAM,IAAI,QAAQ,CAAC,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC;gBAC/F,IAAI,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,KAAK,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,WAAW,EAAE;oBAAE,MAAM,YAAY,EAAE,CAAC;gBAC1F,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;gBAClF,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,mCAAmC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;gBACnF,OAAO,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;YACrC,CAAC;YACD,KAAK,sBAAsB,CAAC,CAAC,CAAC;gBAC5B,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAA8B,CAAC;gBACpD,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,KAAK,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,WAAW,EAAE;oBAAE,MAAM,YAAY,EAAE,CAAC;gBAClF,IAAI,EAAO,CAAC;gBACZ,IAAI,CAAC;oBAAC,EAAE,GAAG,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;gBAAC,CAAC;gBAAC,MAAM,CAAC;oBAAC,MAAM,IAAI,QAAQ,CAAC,CAAC,KAAK,EAAE,iBAAiB,CAAC,CAAC;gBAAC,CAAC;gBACzH,MAAM,EAAE,YAAY,EAAE,EAAE,EAAE,GAAG,KAAK,EAAE,GAAG,EAAE,EAAE,KAAK,IAAI,EAAE,CAAC;gBACvD,MAAM,GAAG,GAAG,EAAE,EAAE,MAAM,EAAE,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;gBACjF,MAAM,EAAE,GAAG,EAAE,EAAE,MAAM,EAAE,iBAAiB,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;gBACtF,MAAM,MAAM,GAAG,wBAAwB,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,WAAW,IAAI,EAAE,CAAC,CAAC,CAAC;gBAC5E,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,yBAAyB,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,QAAQ,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,YAAY,MAAM,CAAC,EAAE,EAAE,WAAW,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,YAAY,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,OAAO,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,8HAA8H,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC1b,OAAO,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,CAAC,MAAM,IAAI,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;YAC1E,CAAC;YACD,KAAK,qBAAqB,CAAC,CAAC,CAAC;gBAC3B,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAQ,CAAC;gBAC9B,IAAI,CAAC,CAAC,IAAI,IAAI,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,KAAK,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,WAAW,EAAE;oBAAE,MAAM,YAAY,EAAE,CAAC;gBAC9F,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;gBACnC,IAAI,CAAC,CAAC,OAAO,KAAK,SAAS,IAAI,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,YAAY,CAAC,KAAK,CAAC;oBAAE,MAAM,IAAI,QAAQ,CAAC,IAAI,EAAE,gEAAgE,CAAC,CAAC;gBACrK,MAAM,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;gBAChE,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC;gBACrE,IAAI,GAAG,GAAG,EAAE,CAAC;gBACb,IAAI,CAAC;oBAAC,MAAM,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,iBAAiB,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,GAAG,EAAE,EAAE,EAAE,KAAK,EAAE,UAAU,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;oBAAC,GAAG,GAAG,2BAA2B,CAAC;gBAAC,CAAC;gBAChJ,OAAO,CAAC,EAAE,CAAC;oBAAC,GAAG,GAAG,sBAAuB,CAAW,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC;gBAAC,CAAC;gBACjF,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;gBACjE,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,sCAAsC,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,SAAS,EAAE,IAAI,gBAAgB,WAAW,WAAW,CAAC,KAAK,CAAC,SAAS,IAAI,KAAK,GAAG,EAAE,CAAC,CAAC;gBACvL,MAAM,GAAG,GAA4B,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;gBACvF,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,QAAQ;oBAAE,GAAG,CAAC,QAAQ,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,QAAQ,CAAC,CAAC;gBACpE,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,IAAI,WAAW,CAAC,KAAK,CAAC,EAAE,YAAY,CAAC,KAAK,CAAC,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;gBACxO,MAAM,CAAC,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,WAAW,CAAC,KAAK,CAAC,WAAW,EAAE,IAAI,cAAc,UAAU,IAAI,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;gBACzO,OAAO,IAAI,CAAC;YACd,CAAC;YACD,KAAK,qBAAqB,CAAC;YAAC,KAAK,4BAA4B,CAAC,CAAC,CAAC;gBAC9D,MAAM,GAAG,GAAG,MAAM,CAAE,CAAC,CAAC,CAAC,CAAS,EAAE,WAAW,IAAI,EAAE,CAAC,CAAC;gBACrD,IAAI,GAAyB,CAAC;gBAC9B,IAAI,CAAC;oBAAC,GAAG,GAAG,oBAAoB,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC;gBAAC,CAAC;gBAAC,MAAM,CAAC;oBAAC,MAAM,IAAI,QAAQ,CAAC,CAAC,KAAK,EAAE,kCAAkC,CAAC,CAAC;gBAAC,CAAC;gBACrJ,MAAM,EAAE,GAAG,IAAI,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;gBACxC,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,iBAAiB,CAAC;gBAC9C,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;gBAC5G,IAAI,SAAS,GAAG,CAAC;oBAAE,MAAM,IAAI,QAAQ,CAAC,CAAC,KAAK,EAAE,wDAAwD,CAAC,CAAC;gBACxG,MAAM,KAAK,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,cAAc,CAAC,EAAE,QAAQ,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBACzL,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;gBAChD,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC;gBACtB,MAAM,IAAI,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,cAAc,CAAC,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;gBACtE,MAAM,IAAI,GAAG,MAAM,KAAK,4BAA4B,CAAC;gBACrD,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,gBAAgB,IAAI,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,MAAM,2BAA2B,GAAG,CAAC,OAAO,CAAC,oBAAoB,CAAC,MAAM,yBAAyB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,SAAS,KAAK,CAAC,CAAC,CAAC,CAAC,0BAA0B,CAAC,CAAC,CAAC,uCAAuC,KAAK,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC7U,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;gBACxB,IAAI,CAAC,IAAI;oBAAE,OAAO,EAAE,iBAAiB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACzF,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,GAAG,EAAE,CAAC,kBAAkB,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,EAAE,aAAa,EAAE,CAAC,CAAE,CAAC,CAAC,CAAC,CAAS,EAAE,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC;gBAC5I,MAAM,CAAC,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,4BAA4B,IAAI,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;gBAChN,OAAO,EAAE,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YACxE,CAAC;YACD,KAAK,iBAAiB,CAAC,CAAC,CAAC;gBACvB,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAE,CAAC,CAAC,CAAC,CAAS,EAAE,OAAO,IAAI,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC;gBACxE,sGAAsG;gBACtG,0EAA0E;gBAC1E,IAAI,IAAI,GAAG,EAAE,CAAC;gBACd,IAAI,CAAC;oBAAC,IAAI,GAAG,IAAI,WAAW,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBAAC,CAAC;gBAAC,MAAM,CAAC;oBAAC,IAAI,GAAG,QAAQ,CAAC;gBAAC,CAAC;gBAChG,IAAI,CAAC,GAAG,CAAC,MAAM,IAAI,kCAAkC,CAAC,IAAI,CAAC,IAAI,CAAC;oBAAE,MAAM,IAAI,QAAQ,CAAC,IAAI,EAAE,6CAA6C,CAAC,CAAC;gBAC1I,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,wDAAwD,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;gBACnG,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;gBAC7D,MAAM,GAAG,GAAG,gBAAgB,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,kCAAkC,EAAE,KAAK,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;gBACnJ,OAAO,EAAE,SAAS,EAAE,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,aAAa,EAAE,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YACzG,CAAC;QACH,CAAC;QACD,MAAM,IAAI,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;IAC3C,CAAC;CACF;AAED,MAAM,GAAG,GAAG,4DAA4D,CAAC;AACzE,SAAS,UAAU,CAAC,CAAS;IAC3B,IAAI,CAAC,GAAG,EAAE,CAAC;IACX,KAAK,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC;QAAC,MAAM,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAAC,IAAI,CAAC,GAAG,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,YAAY,CAAC,CAAC;QAAC,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IAAC,CAAC;IACrH,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC;QAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;QAAC,CAAC,KAAK,EAAE,CAAC;IAAC,CAAC;IAC3D,KAAK,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC;QAAC,IAAI,EAAE,KAAK,GAAG;YAAE,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;;YAAM,MAAM;IAAC,CAAC;IACnE,OAAO,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC9B,CAAC"}
|
package/dist/dashboard.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { TollkitWallet } from "./wallet.js";
|
|
2
2
|
import { AiAssistant } from "./ai.js";
|
|
3
|
+
import { Holdings } from "./holdings.js";
|
|
3
4
|
export interface DashboardHandle {
|
|
4
5
|
url: string;
|
|
5
6
|
port: number;
|
|
@@ -12,6 +13,7 @@ export declare function startDashboard(w: TollkitWallet, password: string, o?: {
|
|
|
12
13
|
autopilot?: boolean;
|
|
13
14
|
connectApps?: boolean;
|
|
14
15
|
ai?: AiAssistant | false;
|
|
16
|
+
holdings?: Holdings | false;
|
|
15
17
|
}): Promise<DashboardHandle>;
|
|
16
18
|
/** CLI entry: unlock, serve, open the browser, run until Ctrl-C. */
|
|
17
19
|
export declare function serveDashboard(password: string, o: {
|