@polkadot-api/forklift 0.1.0
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 +394 -0
- package/bin/cli.js +388 -0
- package/bin/cli.js.map +1 -0
- package/dist/.papi/descriptors/dist/descriptors-CVixQzDI.js +27 -0
- package/dist/.papi/descriptors/dist/descriptors-CVixQzDI.js.map +1 -0
- package/dist/.papi/descriptors/dist/index.js +40 -0
- package/dist/.papi/descriptors/dist/index.js.map +1 -0
- package/dist/.papi/descriptors/dist/metadataTypes-OmVFeQs5.js +4 -0
- package/dist/.papi/descriptors/dist/metadataTypes-OmVFeQs5.js.map +1 -0
- package/dist/.papi/descriptors/dist/parachain_metadata-CQQZadL1.js +4 -0
- package/dist/.papi/descriptors/dist/parachain_metadata-CQQZadL1.js.map +1 -0
- package/dist/.papi/descriptors/dist/relay_metadata-BAI7pjXf.js +4 -0
- package/dist/.papi/descriptors/dist/relay_metadata-BAI7pjXf.js.map +1 -0
- package/dist/index.d.ts +64 -0
- package/dist/src/block-builder/create-block.js +232 -0
- package/dist/src/block-builder/create-block.js.map +1 -0
- package/dist/src/block-builder/para-enter.js +21 -0
- package/dist/src/block-builder/para-enter.js.map +1 -0
- package/dist/src/block-builder/set-validation-data.js +284 -0
- package/dist/src/block-builder/set-validation-data.js.map +1 -0
- package/dist/src/block-builder/slot-utils.js +68 -0
- package/dist/src/block-builder/slot-utils.js.map +1 -0
- package/dist/src/block-builder/timestamp.js +20 -0
- package/dist/src/block-builder/timestamp.js.map +1 -0
- package/dist/src/chain.js +334 -0
- package/dist/src/chain.js.map +1 -0
- package/dist/src/codecs.js +103 -0
- package/dist/src/codecs.js.map +1 -0
- package/dist/src/executor.js +87 -0
- package/dist/src/executor.js.map +1 -0
- package/dist/src/forklift.js +177 -0
- package/dist/src/forklift.js.map +1 -0
- package/dist/src/index.js +3 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/logger.js +11 -0
- package/dist/src/logger.js.map +1 -0
- package/dist/src/prequeries.js +19 -0
- package/dist/src/prequeries.js.map +1 -0
- package/dist/src/rpc/archive_v1.js +223 -0
- package/dist/src/rpc/archive_v1.js.map +1 -0
- package/dist/src/rpc/chainHead_v1.js +383 -0
- package/dist/src/rpc/chainHead_v1.js.map +1 -0
- package/dist/src/rpc/chainSpec_v1.js +14 -0
- package/dist/src/rpc/chainSpec_v1.js.map +1 -0
- package/dist/src/rpc/dev.js +32 -0
- package/dist/src/rpc/dev.js.map +1 -0
- package/dist/src/rpc/forklift_xcm.js +99 -0
- package/dist/src/rpc/forklift_xcm.js.map +1 -0
- package/dist/src/rpc/rpc_utils.js +20 -0
- package/dist/src/rpc/rpc_utils.js.map +1 -0
- package/dist/src/rpc/transaction_v1.js +13 -0
- package/dist/src/rpc/transaction_v1.js.map +1 -0
- package/dist/src/serve.js +88 -0
- package/dist/src/serve.js.map +1 -0
- package/dist/src/source.js +125 -0
- package/dist/src/source.js.map +1 -0
- package/dist/src/storage.js +223 -0
- package/dist/src/storage.js.map +1 -0
- package/dist/src/txPool.js +177 -0
- package/dist/src/txPool.js.map +1 -0
- package/dist/src/xcm.js +292 -0
- package/dist/src/xcm.js.map +1 -0
- package/package.json +61 -0
package/bin/cli.js
ADDED
|
@@ -0,0 +1,388 @@
|
|
|
1
|
+
import { program } from 'commander';
|
|
2
|
+
import { logger, forklift } from '../dist/src/index.js';
|
|
3
|
+
import { WebSocketServer } from 'ws';
|
|
4
|
+
import { readFile } from 'node:fs/promises';
|
|
5
|
+
import { parse } from 'yaml';
|
|
6
|
+
import { getDynamicBuilder, getLookupFn } from '@polkadot-api/metadata-builders';
|
|
7
|
+
import { unifyMetadata, decAnyMetadata } from '@polkadot-api/substrate-bindings';
|
|
8
|
+
import { createClient } from '@polkadot-api/substrate-client';
|
|
9
|
+
import { Enum, Binary } from 'polkadot-api';
|
|
10
|
+
import { getWsRawProvider, createWsClient } from 'polkadot-api/ws';
|
|
11
|
+
|
|
12
|
+
const createWsServer = async (forklift, options) => {
|
|
13
|
+
let port = options?.port ? Number(options.port) : 9944;
|
|
14
|
+
while (true) {
|
|
15
|
+
const wsServer = new WebSocketServer({ port });
|
|
16
|
+
wsServer.on("connection", (ws) => {
|
|
17
|
+
const connection = forklift.serve((msg) => ws.send(JSON.stringify(msg)));
|
|
18
|
+
ws.on("message", async (message) => {
|
|
19
|
+
try {
|
|
20
|
+
connection.send(JSON.parse(String(message)));
|
|
21
|
+
} catch {
|
|
22
|
+
ws.send(
|
|
23
|
+
JSON.stringify({
|
|
24
|
+
jsonrpc: "2.0",
|
|
25
|
+
error: {
|
|
26
|
+
code: -32700,
|
|
27
|
+
message: "Unable to parse message"
|
|
28
|
+
}
|
|
29
|
+
})
|
|
30
|
+
);
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
ws.on("close", () => {
|
|
34
|
+
connection.disconnect();
|
|
35
|
+
});
|
|
36
|
+
});
|
|
37
|
+
try {
|
|
38
|
+
await new Promise((resolve, reject) => {
|
|
39
|
+
const onError = (error) => {
|
|
40
|
+
wsServer.off("listening", onListening);
|
|
41
|
+
reject(error);
|
|
42
|
+
};
|
|
43
|
+
const onListening = () => {
|
|
44
|
+
wsServer.off("error", onError);
|
|
45
|
+
resolve();
|
|
46
|
+
};
|
|
47
|
+
wsServer.once("error", onError);
|
|
48
|
+
wsServer.once("listening", onListening);
|
|
49
|
+
});
|
|
50
|
+
const address = wsServer.address();
|
|
51
|
+
return {
|
|
52
|
+
port: typeof address === "object" && address ? address.port : port
|
|
53
|
+
};
|
|
54
|
+
} catch (ex) {
|
|
55
|
+
wsServer.close();
|
|
56
|
+
if (ex?.code === "EADDRINUSE" && typeof port === "number") {
|
|
57
|
+
port++;
|
|
58
|
+
continue;
|
|
59
|
+
}
|
|
60
|
+
throw ex;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
function parseStorageEntry(entry, idx) {
|
|
66
|
+
if (typeof entry !== "object" || entry === null) {
|
|
67
|
+
throw new Error(`storage[${idx}]: must be an object`);
|
|
68
|
+
}
|
|
69
|
+
if ("pallet" in entry && "entry" in entry) {
|
|
70
|
+
const e = entry;
|
|
71
|
+
if (typeof e.pallet !== "string")
|
|
72
|
+
throw new Error(`storage[${idx}].pallet must be a string`);
|
|
73
|
+
if (typeof e.entry !== "string")
|
|
74
|
+
throw new Error(`storage[${idx}].entry must be a string`);
|
|
75
|
+
if (!Array.isArray(e.key))
|
|
76
|
+
throw new Error(`storage[${idx}].key must be an array`);
|
|
77
|
+
return {
|
|
78
|
+
pallet: e.pallet,
|
|
79
|
+
entry: e.entry,
|
|
80
|
+
key: e.key,
|
|
81
|
+
value: JSON.parse(
|
|
82
|
+
JSON.stringify(e.value),
|
|
83
|
+
(_, value) => parseNumeric(value) ?? value
|
|
84
|
+
) ?? null
|
|
85
|
+
};
|
|
86
|
+
} else if ("key" in entry) {
|
|
87
|
+
const e = entry;
|
|
88
|
+
if (typeof e.key !== "string" || !e.key.startsWith("0x")) {
|
|
89
|
+
throw new Error(`storage[${idx}].key must be a 0x-prefixed hex string`);
|
|
90
|
+
}
|
|
91
|
+
if (e.value !== null && e.value !== void 0 && (typeof e.value !== "string" || !e.value.startsWith("0x"))) {
|
|
92
|
+
throw new Error(
|
|
93
|
+
`storage[${idx}].value must be a 0x-prefixed hex string or null`
|
|
94
|
+
);
|
|
95
|
+
}
|
|
96
|
+
return {
|
|
97
|
+
key: e.key,
|
|
98
|
+
value: e.value ?? null
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
throw new Error(
|
|
102
|
+
`storage[${idx}]: must have either "key" (raw hex) or "pallet"+"storage" (decoded)`
|
|
103
|
+
);
|
|
104
|
+
}
|
|
105
|
+
function validateDelayMode(raw, field) {
|
|
106
|
+
if (raw === "manual") return "manual";
|
|
107
|
+
if (typeof raw === "object" && raw !== null && "timer" in raw && typeof raw.timer === "number") {
|
|
108
|
+
return raw;
|
|
109
|
+
}
|
|
110
|
+
throw new Error(
|
|
111
|
+
`${field}: expected "manual" or { timer: <ms> }, got ${JSON.stringify(raw)}`
|
|
112
|
+
);
|
|
113
|
+
}
|
|
114
|
+
function parseChainConfig(raw, name) {
|
|
115
|
+
if (typeof raw !== "object" || raw === null)
|
|
116
|
+
throw new Error(`Chain "${name}": must be an object`);
|
|
117
|
+
const r = raw;
|
|
118
|
+
if (r.endpoint === void 0)
|
|
119
|
+
throw new Error(`Chain "${name}": missing "endpoint"`);
|
|
120
|
+
if (typeof r.endpoint !== "string" && !(Array.isArray(r.endpoint) && r.endpoint.every((e) => typeof e === "string"))) {
|
|
121
|
+
throw new Error(
|
|
122
|
+
`Chain "${name}": "endpoint" must be a string or array of strings`
|
|
123
|
+
);
|
|
124
|
+
}
|
|
125
|
+
if (r.block !== void 0 && typeof r.block !== "number" && typeof r.block !== "string") {
|
|
126
|
+
throw new Error(`Chain "${name}": "block" must be a number or hex string`);
|
|
127
|
+
}
|
|
128
|
+
const parsedPort = r.port == null ? null : parseNumber(r.port);
|
|
129
|
+
if (r.port != void 0 && (parsedPort == null || parsedPort < 1 || parsedPort > 65535)) {
|
|
130
|
+
throw new Error(
|
|
131
|
+
`Chain "${name}": "port" must be an integer between 1 and 65535`
|
|
132
|
+
);
|
|
133
|
+
}
|
|
134
|
+
const options = {};
|
|
135
|
+
if (r.options !== void 0) {
|
|
136
|
+
if (typeof r.options !== "object" || r.options === null)
|
|
137
|
+
throw new Error(`Chain "${name}": "options" must be an object`);
|
|
138
|
+
const o = r.options;
|
|
139
|
+
if (o.disableOnIdle !== void 0)
|
|
140
|
+
options.disableOnIdle = Boolean(o.disableOnIdle);
|
|
141
|
+
if (o.buildBlockMode !== void 0)
|
|
142
|
+
options.buildBlockMode = validateDelayMode(
|
|
143
|
+
o.buildBlockMode,
|
|
144
|
+
`${name}.options.buildBlockMode`
|
|
145
|
+
);
|
|
146
|
+
if (o.finalizeMode !== void 0)
|
|
147
|
+
options.finalizeMode = validateDelayMode(
|
|
148
|
+
o.finalizeMode,
|
|
149
|
+
`${name}.options.finalizeMode`
|
|
150
|
+
);
|
|
151
|
+
}
|
|
152
|
+
const storage = [];
|
|
153
|
+
if (r.storage !== void 0) {
|
|
154
|
+
if (!Array.isArray(r.storage))
|
|
155
|
+
throw new Error(`Chain "${name}": "storage" must be an array`);
|
|
156
|
+
for (let i = 0; i < r.storage.length; i++)
|
|
157
|
+
storage.push(parseStorageEntry(r.storage[i], i));
|
|
158
|
+
}
|
|
159
|
+
if (r.parachainOf !== void 0 && typeof r.parachainOf !== "string")
|
|
160
|
+
throw new Error(`Chain "${name}": "parachainOf" must be a string`);
|
|
161
|
+
return {
|
|
162
|
+
endpoint: r.endpoint,
|
|
163
|
+
block: parseNumber(r.block) ?? r.block,
|
|
164
|
+
port: parsedPort ?? void 0,
|
|
165
|
+
...r.parachainOf !== void 0 && {
|
|
166
|
+
parachainOf: r.parachainOf
|
|
167
|
+
},
|
|
168
|
+
...Object.keys(options).length > 0 && { options },
|
|
169
|
+
...storage.length > 0 && { storage }
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
function parseConfig(yaml) {
|
|
173
|
+
let raw;
|
|
174
|
+
try {
|
|
175
|
+
raw = parse(yaml);
|
|
176
|
+
} catch (e) {
|
|
177
|
+
throw new Error(`Failed to parse YAML: ${e.message}`);
|
|
178
|
+
}
|
|
179
|
+
if (typeof raw !== "object" || raw === null)
|
|
180
|
+
throw new Error("Config must be a YAML object");
|
|
181
|
+
const r = raw;
|
|
182
|
+
if ("chains" in r) {
|
|
183
|
+
if (typeof r.chains !== "object" || r.chains === null || Array.isArray(r.chains)) {
|
|
184
|
+
throw new Error('"chains" must be a map of chain name \u2192 chain config');
|
|
185
|
+
}
|
|
186
|
+
const chains = {};
|
|
187
|
+
for (const [name, chainRaw] of Object.entries(r.chains)) {
|
|
188
|
+
chains[name] = parseChainConfig(chainRaw, name);
|
|
189
|
+
}
|
|
190
|
+
for (const [name, chain] of Object.entries(chains)) {
|
|
191
|
+
if (chain.parachainOf !== void 0 && !(chain.parachainOf in chains))
|
|
192
|
+
throw new Error(
|
|
193
|
+
`Chain "${name}": parachainOf "${chain.parachainOf}" not found in chains`
|
|
194
|
+
);
|
|
195
|
+
}
|
|
196
|
+
return { type: "multi", chains };
|
|
197
|
+
}
|
|
198
|
+
return { type: "single", chain: parseChainConfig(raw, "root") };
|
|
199
|
+
}
|
|
200
|
+
async function loadConfig(path) {
|
|
201
|
+
let text;
|
|
202
|
+
try {
|
|
203
|
+
text = await readFile(path, "utf8");
|
|
204
|
+
} catch {
|
|
205
|
+
throw new Error(`Cannot read config file: ${path}`);
|
|
206
|
+
}
|
|
207
|
+
return parseConfig(text);
|
|
208
|
+
}
|
|
209
|
+
const parseNumber = (value) => {
|
|
210
|
+
if (typeof value === "number") return value;
|
|
211
|
+
if (typeof value !== "string") return null;
|
|
212
|
+
const valueStr = value.replaceAll("_", "");
|
|
213
|
+
return valueStr.startsWith("0x") || Number.isNaN(valueStr) ? null : Number(valueStr);
|
|
214
|
+
};
|
|
215
|
+
const parseNumeric = (value) => {
|
|
216
|
+
if (typeof value === "number") return value;
|
|
217
|
+
if (typeof value !== "string") return null;
|
|
218
|
+
if (value.endsWith("n")) {
|
|
219
|
+
try {
|
|
220
|
+
return BigInt(value.replaceAll("_", "").slice(0, -1));
|
|
221
|
+
} catch {
|
|
222
|
+
return null;
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
return parseNumber(value);
|
|
226
|
+
};
|
|
227
|
+
|
|
228
|
+
const log = logger.child({ module: "cli" });
|
|
229
|
+
|
|
230
|
+
const runFromConfig = async (config) => {
|
|
231
|
+
const chains = config.type === "single" ? {
|
|
232
|
+
single: config.chain
|
|
233
|
+
} : config.chains;
|
|
234
|
+
const ports = await Promise.all(
|
|
235
|
+
Object.entries(chains).map(
|
|
236
|
+
([key, chain]) => startChain(chain, config.type === "single" ? void 0 : key)
|
|
237
|
+
)
|
|
238
|
+
);
|
|
239
|
+
if (config.type === "multi") {
|
|
240
|
+
const chainToPort = Object.fromEntries(ports);
|
|
241
|
+
const parasByRelay = /* @__PURE__ */ new Map();
|
|
242
|
+
for (const [name, chain] of Object.entries(config.chains)) {
|
|
243
|
+
const relay = chain.parachainOf;
|
|
244
|
+
if (!relay) continue;
|
|
245
|
+
const list = parasByRelay.get(relay) ?? [];
|
|
246
|
+
list.push(name);
|
|
247
|
+
parasByRelay.set(relay, list);
|
|
248
|
+
}
|
|
249
|
+
for (const [name, chain] of Object.entries(config.chains)) {
|
|
250
|
+
const relay = chain.parachainOf;
|
|
251
|
+
if (!relay) continue;
|
|
252
|
+
log.info(`Attaching ${name} as parachain to ${relay}`);
|
|
253
|
+
const client = createClient(
|
|
254
|
+
getWsRawProvider(`ws://localhost:${chainToPort[name]}`)
|
|
255
|
+
);
|
|
256
|
+
await rawClientRequest(client, "forklift_xcm_attach_relay", [
|
|
257
|
+
`ws://localhost:${chainToPort[relay]}`
|
|
258
|
+
]);
|
|
259
|
+
client.destroy();
|
|
260
|
+
}
|
|
261
|
+
for (const paras of parasByRelay.values()) {
|
|
262
|
+
for (const a of paras) {
|
|
263
|
+
for (const b of paras) {
|
|
264
|
+
if (b <= a) continue;
|
|
265
|
+
log.info(`Attaching ${a} and ${b} as siblings`);
|
|
266
|
+
const client = createClient(
|
|
267
|
+
getWsRawProvider(`ws://localhost:${chainToPort[a]}`)
|
|
268
|
+
);
|
|
269
|
+
await rawClientRequest(client, "forklift_xcm_attach_sibling", [
|
|
270
|
+
`ws://localhost:${chainToPort[b]}`
|
|
271
|
+
]);
|
|
272
|
+
client.destroy();
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
};
|
|
278
|
+
const rawClientRequest = (client, method, params) => new Promise(
|
|
279
|
+
(resolve, reject) => client._request(method, params, {
|
|
280
|
+
onSuccess: resolve,
|
|
281
|
+
onError: reject
|
|
282
|
+
})
|
|
283
|
+
);
|
|
284
|
+
const startChain = async (config, key) => {
|
|
285
|
+
const logWithKey = log ? log.child({ chain: key }) : log;
|
|
286
|
+
logWithKey.info(
|
|
287
|
+
`Forking ${config.endpoint}${config.block !== void 0 ? ` at block ${config.block}` : ""}`
|
|
288
|
+
);
|
|
289
|
+
const f = forklift(
|
|
290
|
+
{
|
|
291
|
+
type: "remote",
|
|
292
|
+
value: { url: config.endpoint, atBlock: config.block }
|
|
293
|
+
},
|
|
294
|
+
{
|
|
295
|
+
buildBlockMode: config.options?.buildBlockMode && (typeof config.options.buildBlockMode === "string" ? Enum("manual") : Enum("timer", config.options.buildBlockMode.timer)),
|
|
296
|
+
finalizeMode: config.options?.finalizeMode && (typeof config.options.finalizeMode === "string" ? Enum("manual") : Enum("timer", config.options.finalizeMode.timer)),
|
|
297
|
+
disableOnIdle: config.options?.disableOnIdle
|
|
298
|
+
}
|
|
299
|
+
);
|
|
300
|
+
const server = await createWsServer(f, { port: config.port });
|
|
301
|
+
if (config.storage) {
|
|
302
|
+
logWithKey.info(`Waiting for initial block`);
|
|
303
|
+
const client = createWsClient(`ws://localhost:${server.port}`);
|
|
304
|
+
const finalized = await client.getFinalizedBlock();
|
|
305
|
+
logWithKey.info(`Overriding storage`);
|
|
306
|
+
const metadata = await client.getMetadata(finalized.hash);
|
|
307
|
+
const dynamicBuilder = getDynamicBuilder(
|
|
308
|
+
getLookupFn(unifyMetadata(decAnyMetadata(metadata)))
|
|
309
|
+
);
|
|
310
|
+
const rawOverrides = await Promise.all(
|
|
311
|
+
config.storage.map(
|
|
312
|
+
async (override) => {
|
|
313
|
+
if ("pallet" in override) {
|
|
314
|
+
const codecs = dynamicBuilder.buildStorage(
|
|
315
|
+
override.pallet,
|
|
316
|
+
override.entry
|
|
317
|
+
);
|
|
318
|
+
if (!codecs) {
|
|
319
|
+
logWithKey.error(
|
|
320
|
+
`Storage entry ${override.pallet}.${override.entry} not found, skipping`
|
|
321
|
+
);
|
|
322
|
+
return null;
|
|
323
|
+
}
|
|
324
|
+
let key2 = "";
|
|
325
|
+
let value = null;
|
|
326
|
+
try {
|
|
327
|
+
key2 = codecs.keys.enc(...override.key ?? []);
|
|
328
|
+
} catch {
|
|
329
|
+
logWithKey.error(
|
|
330
|
+
`Storage key ${override.pallet}.${override.entry} not compatible, skipping`
|
|
331
|
+
);
|
|
332
|
+
return null;
|
|
333
|
+
}
|
|
334
|
+
try {
|
|
335
|
+
value = override.value == null ? null : Binary.toHex(codecs.value.enc(override.value));
|
|
336
|
+
} catch {
|
|
337
|
+
logWithKey.error(
|
|
338
|
+
`Storage value ${override.pallet}.${override.entry} not compatible, skipping`
|
|
339
|
+
);
|
|
340
|
+
return null;
|
|
341
|
+
}
|
|
342
|
+
return {
|
|
343
|
+
key: key2,
|
|
344
|
+
value
|
|
345
|
+
};
|
|
346
|
+
} else {
|
|
347
|
+
return override;
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
)
|
|
351
|
+
);
|
|
352
|
+
await client._request("dev_setStorage", [
|
|
353
|
+
rawOverrides.filter((v) => v != null).map((override) => [override.key, override.value])
|
|
354
|
+
]);
|
|
355
|
+
client.destroy();
|
|
356
|
+
}
|
|
357
|
+
logWithKey.info(
|
|
358
|
+
`${key ? key + " " : ""}listening on ws://localhost:${server.port} https://dev.papi.how/storage#networkId=localhost&endpoint=ws%3A%2F%2F127.0.0.1%3A${server.port}`
|
|
359
|
+
);
|
|
360
|
+
return [key, server.port];
|
|
361
|
+
};
|
|
362
|
+
|
|
363
|
+
program.name("forklift").argument("[url]", "WebSocket URL of the node to fork").option("-c --config <file>", "use YAML config file").option("-b, --block <block>", "block number or hash to fork from").option("-p, --port <port>", "port to listen on", "3000").option(
|
|
364
|
+
"-l, --log-level <level>",
|
|
365
|
+
"log level (trace|debug|info|warn|error|fatal)",
|
|
366
|
+
"info"
|
|
367
|
+
).action(
|
|
368
|
+
async (url, opts) => {
|
|
369
|
+
if (!url && !opts.config) {
|
|
370
|
+
program.error("error: either <url> or --config <file> is required");
|
|
371
|
+
}
|
|
372
|
+
logger.level = opts.logLevel;
|
|
373
|
+
const config = opts.config ? await loadConfig(opts.config) : null;
|
|
374
|
+
if (config) {
|
|
375
|
+
return runFromConfig(config);
|
|
376
|
+
}
|
|
377
|
+
const atBlock = opts.block ? /^\d+$/.test(opts.block) ? parseInt(opts.block, 10) : opts.block : void 0;
|
|
378
|
+
const port = parseInt(opts.port, 10);
|
|
379
|
+
const f = forklift({ type: "remote", value: { url, atBlock } });
|
|
380
|
+
const server = await createWsServer(f, { port });
|
|
381
|
+
log.info(
|
|
382
|
+
`Forking ${url}${atBlock !== void 0 ? ` at block ${atBlock}` : ""}`
|
|
383
|
+
);
|
|
384
|
+
log.info(`Listening on ws://localhost:${server.port}`);
|
|
385
|
+
}
|
|
386
|
+
);
|
|
387
|
+
program.parse();
|
|
388
|
+
//# sourceMappingURL=cli.js.map
|
package/bin/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sources":["../server/node.ts","../cli/config.ts","../cli/log.ts","../cli/runFromConfig.ts","../cli/cli.ts"],"sourcesContent":["import { WebSocketServer } from \"ws\";\nimport type { Forklift } from \"../src/forklift\";\n\nexport interface NodeWsServer {\n port: number;\n}\n\nexport const createWsServer = async (\n forklift: Forklift,\n options?: {\n port?: number | string;\n }\n): Promise<NodeWsServer> => {\n let port = options?.port ? Number(options.port) : 9944;\n\n while (true) {\n const wsServer = new WebSocketServer({ port });\n\n wsServer.on(\"connection\", (ws) => {\n const connection = forklift.serve((msg) => ws.send(JSON.stringify(msg)));\n\n ws.on(\"message\", async (message) => {\n try {\n connection.send(JSON.parse(String(message)));\n } catch {\n ws.send(\n JSON.stringify({\n jsonrpc: \"2.0\",\n error: {\n code: -32700,\n message: \"Unable to parse message\",\n },\n })\n );\n }\n });\n\n ws.on(\"close\", () => {\n connection.disconnect();\n });\n });\n\n try {\n await new Promise<void>((resolve, reject) => {\n const onError = (error: unknown) => {\n wsServer.off(\"listening\", onListening);\n reject(error);\n };\n const onListening = () => {\n wsServer.off(\"error\", onError);\n resolve();\n };\n\n wsServer.once(\"error\", onError);\n wsServer.once(\"listening\", onListening);\n });\n const address = wsServer.address();\n return {\n port: typeof address === \"object\" && address ? address.port : port,\n };\n } catch (ex: any) {\n wsServer.close();\n if (ex?.code === \"EADDRINUSE\" && typeof port === \"number\") {\n port++;\n continue;\n }\n throw ex;\n }\n }\n};\n","import { readFile } from \"node:fs/promises\";\nimport type { HexString } from \"polkadot-api\";\nimport { parse } from \"yaml\";\n\n// ---------------------------------------------------------------------------\n// Storage overrides\n// ---------------------------------------------------------------------------\n\nexport type RawStorageOverride = {\n key: HexString;\n value: HexString | null;\n};\n\nexport type DecodedStorageOverride = {\n pallet: string;\n entry: string;\n key?: unknown[];\n value: unknown | null;\n};\n\nexport type StorageOverride = RawStorageOverride | DecodedStorageOverride;\n\nexport function isRawStorageOverride(\n o: StorageOverride\n): o is RawStorageOverride {\n return \"key\" in o;\n}\n\n// ---------------------------------------------------------------------------\n// Chain config\n// ---------------------------------------------------------------------------\n\nexport type DelayModeConfig = \"manual\" | { timer: number };\n\nexport type ParsedChainConfig = {\n endpoint: string | string[];\n block?: number | string;\n port?: number;\n parachainOf?: string; // chain name of the relay chain this parachain belongs to\n options?: {\n disableOnIdle?: boolean;\n buildBlockMode?: DelayModeConfig;\n finalizeMode?: DelayModeConfig;\n };\n storage?: StorageOverride[];\n};\n\n// ---------------------------------------------------------------------------\n// Top-level parsed config\n// ---------------------------------------------------------------------------\n\nexport type ParsedSingleChainConfig = {\n type: \"single\";\n chain: ParsedChainConfig;\n};\n\nexport type ParsedMultiChainConfig = {\n type: \"multi\";\n chains: Record<string, ParsedChainConfig>;\n};\n\nexport type ParsedConfig = ParsedSingleChainConfig | ParsedMultiChainConfig;\n\n// ---------------------------------------------------------------------------\n// Validation helpers\n// ---------------------------------------------------------------------------\n\nfunction parseStorageEntry(entry: unknown, idx: number): StorageOverride {\n if (typeof entry !== \"object\" || entry === null) {\n throw new Error(`storage[${idx}]: must be an object`);\n }\n\n if (\"pallet\" in entry && \"entry\" in entry) {\n const e = entry as Record<string, unknown>;\n if (typeof e.pallet !== \"string\")\n throw new Error(`storage[${idx}].pallet must be a string`);\n if (typeof e.entry !== \"string\")\n throw new Error(`storage[${idx}].entry must be a string`);\n if (!Array.isArray(e.key))\n throw new Error(`storage[${idx}].key must be an array`);\n return {\n pallet: e.pallet,\n entry: e.entry,\n key: e.key,\n value:\n JSON.parse(\n JSON.stringify(e.value),\n (_, value) => parseNumeric(value) ?? value\n ) ?? null,\n };\n } else if (\"key\" in entry) {\n const e = entry as Record<string, unknown>;\n if (typeof e.key !== \"string\" || !e.key.startsWith(\"0x\")) {\n throw new Error(`storage[${idx}].key must be a 0x-prefixed hex string`);\n }\n if (\n e.value !== null &&\n e.value !== undefined &&\n (typeof e.value !== \"string\" || !(e.value as string).startsWith(\"0x\"))\n ) {\n throw new Error(\n `storage[${idx}].value must be a 0x-prefixed hex string or null`\n );\n }\n return {\n key: e.key as HexString,\n value: (e.value ?? null) as HexString | null,\n };\n }\n\n throw new Error(\n `storage[${idx}]: must have either \"key\" (raw hex) or \"pallet\"+\"storage\" (decoded)`\n );\n}\n\nfunction validateDelayMode(raw: unknown, field: string): DelayModeConfig {\n if (raw === \"manual\") return \"manual\";\n if (\n typeof raw === \"object\" &&\n raw !== null &&\n \"timer\" in raw &&\n typeof (raw as Record<string, unknown>).timer === \"number\"\n ) {\n return raw as DelayModeConfig;\n }\n throw new Error(\n `${field}: expected \"manual\" or { timer: <ms> }, got ${JSON.stringify(raw)}`\n );\n}\n\nfunction parseChainConfig(raw: unknown, name: string): ParsedChainConfig {\n if (typeof raw !== \"object\" || raw === null)\n throw new Error(`Chain \"${name}\": must be an object`);\n const r = raw as Record<string, unknown>;\n\n if (r.endpoint === undefined)\n throw new Error(`Chain \"${name}\": missing \"endpoint\"`);\n if (\n typeof r.endpoint !== \"string\" &&\n !(\n Array.isArray(r.endpoint) &&\n r.endpoint.every((e) => typeof e === \"string\")\n )\n ) {\n throw new Error(\n `Chain \"${name}\": \"endpoint\" must be a string or array of strings`\n );\n }\n\n if (\n r.block !== undefined &&\n typeof r.block !== \"number\" &&\n typeof r.block !== \"string\"\n ) {\n throw new Error(`Chain \"${name}\": \"block\" must be a number or hex string`);\n }\n\n const parsedPort = r.port == null ? null : parseNumber(r.port as any);\n if (\n r.port != undefined &&\n (parsedPort == null || parsedPort < 1 || parsedPort > 65535)\n ) {\n throw new Error(\n `Chain \"${name}\": \"port\" must be an integer between 1 and 65535`\n );\n }\n\n const options: ParsedChainConfig[\"options\"] = {};\n if (r.options !== undefined) {\n if (typeof r.options !== \"object\" || r.options === null)\n throw new Error(`Chain \"${name}\": \"options\" must be an object`);\n const o = r.options as Record<string, unknown>;\n if (o.disableOnIdle !== undefined)\n options.disableOnIdle = Boolean(o.disableOnIdle);\n if (o.buildBlockMode !== undefined)\n options.buildBlockMode = validateDelayMode(\n o.buildBlockMode,\n `${name}.options.buildBlockMode`\n );\n if (o.finalizeMode !== undefined)\n options.finalizeMode = validateDelayMode(\n o.finalizeMode,\n `${name}.options.finalizeMode`\n );\n }\n\n const storage: StorageOverride[] = [];\n if (r.storage !== undefined) {\n if (!Array.isArray(r.storage))\n throw new Error(`Chain \"${name}\": \"storage\" must be an array`);\n for (let i = 0; i < r.storage.length; i++)\n storage.push(parseStorageEntry(r.storage[i], i));\n }\n\n if (r.parachainOf !== undefined && typeof r.parachainOf !== \"string\")\n throw new Error(`Chain \"${name}\": \"parachainOf\" must be a string`);\n\n return {\n endpoint: r.endpoint as string | string[],\n block: parseNumber(r.block) ?? (r.block as number | string | undefined),\n port: parsedPort ?? undefined,\n ...(r.parachainOf !== undefined && {\n parachainOf: r.parachainOf as string,\n }),\n ...(Object.keys(options).length > 0 && { options }),\n ...(storage.length > 0 && { storage }),\n };\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\nexport function parseConfig(yaml: string): ParsedConfig {\n let raw: unknown;\n try {\n raw = parse(yaml);\n } catch (e) {\n throw new Error(`Failed to parse YAML: ${(e as Error).message}`);\n }\n\n if (typeof raw !== \"object\" || raw === null)\n throw new Error(\"Config must be a YAML object\");\n const r = raw as Record<string, unknown>;\n\n if (\"chains\" in r) {\n if (\n typeof r.chains !== \"object\" ||\n r.chains === null ||\n Array.isArray(r.chains)\n ) {\n throw new Error('\"chains\" must be a map of chain name → chain config');\n }\n\n const chains: Record<string, ParsedChainConfig> = {};\n for (const [name, chainRaw] of Object.entries(r.chains as object)) {\n chains[name] = parseChainConfig(chainRaw, name);\n }\n\n for (const [name, chain] of Object.entries(chains)) {\n if (chain.parachainOf !== undefined && !(chain.parachainOf in chains))\n throw new Error(\n `Chain \"${name}\": parachainOf \"${chain.parachainOf}\" not found in chains`\n );\n }\n\n return { type: \"multi\", chains };\n }\n\n return { type: \"single\", chain: parseChainConfig(raw, \"root\") };\n}\n\nexport async function loadConfig(path: string): Promise<ParsedConfig> {\n let text: string;\n try {\n text = await readFile(path, \"utf8\");\n } catch {\n throw new Error(`Cannot read config file: ${path}`);\n }\n return parseConfig(text);\n}\n\nconst parseNumber = (value: unknown) => {\n if (typeof value === \"number\") return value;\n if (typeof value !== \"string\") return null;\n const valueStr = value.replaceAll(\"_\", \"\");\n return valueStr.startsWith(\"0x\") || Number.isNaN(valueStr)\n ? null\n : Number(valueStr);\n};\n\nconst parseNumeric = (value: unknown) => {\n if (typeof value === \"number\") return value;\n if (typeof value !== \"string\") return null;\n if (value.endsWith(\"n\")) {\n try {\n return BigInt(value.replaceAll(\"_\", \"\").slice(0, -1));\n } catch {\n return null;\n }\n }\n return parseNumber(value);\n};\n","import { logger } from \"../src\";\n\nexport const log = logger.child({ module: \"cli\" });\n","import {\n getDynamicBuilder,\n getLookupFn,\n} from \"@polkadot-api/metadata-builders\";\nimport {\n decAnyMetadata,\n unifyMetadata,\n} from \"@polkadot-api/substrate-bindings\";\nimport {\n createClient as createRawClient,\n type SubstrateClient,\n} from \"@polkadot-api/substrate-client\";\nimport { Binary, Enum, type HexString } from \"polkadot-api\";\nimport { createWsClient, getWsRawProvider } from \"polkadot-api/ws\";\nimport { forklift } from \"../src\";\nimport { createWsServer } from \"../server/node\";\nimport type {\n ParsedChainConfig,\n ParsedConfig,\n RawStorageOverride,\n} from \"./config\";\nimport { log } from \"./log\";\n\nexport const runFromConfig = async (config: ParsedConfig) => {\n const chains =\n config.type === \"single\"\n ? {\n single: config.chain,\n }\n : config.chains;\n\n const ports = await Promise.all(\n Object.entries(chains).map(([key, chain]) =>\n startChain(chain, config.type === \"single\" ? undefined : key)\n )\n );\n\n if (config.type === \"multi\") {\n const chainToPort: Record<string, number> = Object.fromEntries(ports);\n\n // Group parachains by relay\n const parasByRelay = new Map<string, string[]>();\n for (const [name, chain] of Object.entries(config.chains)) {\n const relay = chain.parachainOf;\n if (!relay) continue;\n const list = parasByRelay.get(relay) ?? [];\n list.push(name);\n parasByRelay.set(relay, list);\n }\n\n // Attach each parachain to its relay\n for (const [name, chain] of Object.entries(config.chains)) {\n const relay = chain.parachainOf;\n if (!relay) continue;\n log.info(`Attaching ${name} as parachain to ${relay}`);\n const client = createRawClient(\n getWsRawProvider(`ws://localhost:${chainToPort[name]}`)\n );\n await rawClientRequest(client, \"forklift_xcm_attach_relay\", [\n `ws://localhost:${chainToPort[relay]}`,\n ]);\n client.destroy();\n }\n\n // Attach siblings (all pairs sharing the same relay)\n for (const paras of parasByRelay.values()) {\n for (const a of paras) {\n for (const b of paras) {\n if (b <= a) continue; // process each pair once\n log.info(`Attaching ${a} and ${b} as siblings`);\n const client = createRawClient(\n getWsRawProvider(`ws://localhost:${chainToPort[a]}`)\n );\n await rawClientRequest(client, \"forklift_xcm_attach_sibling\", [\n `ws://localhost:${chainToPort[b]}`,\n ]);\n client.destroy();\n }\n }\n }\n }\n};\n\nconst rawClientRequest = (\n client: SubstrateClient,\n method: string,\n params: unknown[]\n) =>\n new Promise((resolve, reject) =>\n client._request(method, params, {\n onSuccess: resolve,\n onError: reject,\n })\n );\n\nconst startChain = async (config: ParsedChainConfig, key?: string) => {\n const logWithKey = log ? log.child({ chain: key }) : log;\n logWithKey.info(\n `Forking ${config.endpoint}${\n config.block !== undefined ? ` at block ${config.block}` : \"\"\n }`\n );\n\n const f = forklift(\n {\n type: \"remote\",\n value: { url: config.endpoint, atBlock: config.block },\n },\n {\n buildBlockMode:\n config.options?.buildBlockMode &&\n (typeof config.options.buildBlockMode === \"string\"\n ? Enum(\"manual\")\n : Enum(\"timer\", config.options.buildBlockMode.timer)),\n finalizeMode:\n config.options?.finalizeMode &&\n (typeof config.options.finalizeMode === \"string\"\n ? Enum(\"manual\")\n : Enum(\"timer\", config.options.finalizeMode.timer)),\n disableOnIdle: config.options?.disableOnIdle,\n }\n );\n\n const server = await createWsServer(f, { port: config.port });\n\n if (config.storage) {\n logWithKey.info(`Waiting for initial block`);\n const client = createWsClient(`ws://localhost:${server.port}`);\n const finalized = await client.getFinalizedBlock();\n\n logWithKey.info(`Overriding storage`);\n const metadata = await client.getMetadata(finalized.hash);\n const dynamicBuilder = getDynamicBuilder(\n getLookupFn(unifyMetadata(decAnyMetadata(metadata)))\n );\n\n const rawOverrides = await Promise.all(\n config.storage.map(\n async (override): Promise<RawStorageOverride | null> => {\n if (\"pallet\" in override) {\n const codecs = dynamicBuilder.buildStorage(\n override.pallet,\n override.entry\n );\n if (!codecs) {\n logWithKey.error(\n `Storage entry ${override.pallet}.${override.entry} not found, skipping`\n );\n return null;\n }\n let key: HexString = \"\";\n let value: HexString | null = null;\n try {\n key = codecs.keys.enc(...(override.key ?? []));\n } catch {\n logWithKey.error(\n `Storage key ${override.pallet}.${override.entry} not compatible, skipping`\n );\n return null;\n }\n try {\n value =\n override.value == null\n ? null\n : Binary.toHex(codecs.value.enc(override.value));\n } catch {\n logWithKey.error(\n `Storage value ${override.pallet}.${override.entry} not compatible, skipping`\n );\n return null;\n }\n return {\n key,\n value,\n };\n } else {\n return override;\n }\n }\n )\n );\n await client._request(\"dev_setStorage\", [\n rawOverrides\n .filter((v) => v != null)\n .map((override) => [override.key, override.value]),\n ]);\n client.destroy();\n }\n logWithKey.info(\n `${key ? key + \" \" : \"\"}listening on ws://localhost:${\n server.port\n } https://dev.papi.how/storage#networkId=localhost&endpoint=ws%3A%2F%2F127.0.0.1%3A${\n server.port\n }`\n );\n\n return [key, server.port!] as const;\n};\n","import { program } from \"commander\";\nimport { forklift, logger } from \"../src\";\nimport { createWsServer } from \"../server/node\";\nimport { loadConfig } from \"./config.ts\";\nimport { log } from \"./log.ts\";\nimport { runFromConfig } from \"./runFromConfig.ts\";\n\nprogram\n .name(\"forklift\")\n .argument(\"[url]\", \"WebSocket URL of the node to fork\")\n .option(\"-c --config <file>\", \"use YAML config file\")\n .option(\"-b, --block <block>\", \"block number or hash to fork from\")\n .option(\"-p, --port <port>\", \"port to listen on\", \"3000\")\n .option(\n \"-l, --log-level <level>\",\n \"log level (trace|debug|info|warn|error|fatal)\",\n \"info\"\n )\n .action(\n async (\n url: string | undefined,\n opts: { block?: string; config?: string; port: string; logLevel: string }\n ) => {\n if (!url && !opts.config) {\n program.error(\"error: either <url> or --config <file> is required\");\n }\n\n logger.level = opts.logLevel;\n\n const config = opts.config ? await loadConfig(opts.config) : null;\n if (config) {\n return runFromConfig(config);\n }\n\n const atBlock = opts.block\n ? /^\\d+$/.test(opts.block)\n ? parseInt(opts.block, 10)\n : opts.block\n : undefined;\n\n const port = parseInt(opts.port, 10);\n\n const f = forklift({ type: \"remote\", value: { url: url!, atBlock } });\n const server = await createWsServer(f, { port });\n\n log.info(\n `Forking ${url}${atBlock !== undefined ? ` at block ${atBlock}` : \"\"}`\n );\n log.info(`Listening on ws://localhost:${server.port}`);\n }\n );\n\nprogram.parse();\n"],"names":["createRawClient","key"],"mappings":";;;;;;;;;;;AAOO,MAAM,cAAA,GAAiB,OAC5B,QAAA,EACA,OAAA,KAG0B;AAC1B,EAAA,IAAI,OAAO,OAAA,EAAS,IAAA,GAAO,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAA,GAAI,IAAA;AAElD,EAAA,OAAO,IAAA,EAAM;AACX,IAAA,MAAM,QAAA,GAAW,IAAI,eAAA,CAAgB,EAAE,MAAM,CAAA;AAE7C,IAAA,QAAA,CAAS,EAAA,CAAG,YAAA,EAAc,CAAC,EAAA,KAAO;AAChC,MAAA,MAAM,UAAA,GAAa,QAAA,CAAS,KAAA,CAAM,CAAC,GAAA,KAAQ,EAAA,CAAG,IAAA,CAAK,IAAA,CAAK,SAAA,CAAU,GAAG,CAAC,CAAC,CAAA;AAEvE,MAAA,EAAA,CAAG,EAAA,CAAG,SAAA,EAAW,OAAO,OAAA,KAAY;AAClC,QAAA,IAAI;AACF,UAAA,UAAA,CAAW,KAAK,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,OAAO,CAAC,CAAC,CAAA;AAAA,QAC7C,CAAA,CAAA,MAAQ;AACN,UAAA,EAAA,CAAG,IAAA;AAAA,YACD,KAAK,SAAA,CAAU;AAAA,cACb,OAAA,EAAS,KAAA;AAAA,cACT,KAAA,EAAO;AAAA,gBACL,IAAA,EAAM,MAAA;AAAA,gBACN,OAAA,EAAS;AAAA;AACX,aACD;AAAA,WACH;AAAA,QACF;AAAA,MACF,CAAC,CAAA;AAED,MAAA,EAAA,CAAG,EAAA,CAAG,SAAS,MAAM;AACnB,QAAA,UAAA,CAAW,UAAA,EAAW;AAAA,MACxB,CAAC,CAAA;AAAA,IACH,CAAC,CAAA;AAED,IAAA,IAAI;AACF,MAAA,MAAM,IAAI,OAAA,CAAc,CAAC,OAAA,EAAS,MAAA,KAAW;AAC3C,QAAA,MAAM,OAAA,GAAU,CAAC,KAAA,KAAmB;AAClC,UAAA,QAAA,CAAS,GAAA,CAAI,aAAa,WAAW,CAAA;AACrC,UAAA,MAAA,CAAO,KAAK,CAAA;AAAA,QACd,CAAA;AACA,QAAA,MAAM,cAAc,MAAM;AACxB,UAAA,QAAA,CAAS,GAAA,CAAI,SAAS,OAAO,CAAA;AAC7B,UAAA,OAAA,EAAQ;AAAA,QACV,CAAA;AAEA,QAAA,QAAA,CAAS,IAAA,CAAK,SAAS,OAAO,CAAA;AAC9B,QAAA,QAAA,CAAS,IAAA,CAAK,aAAa,WAAW,CAAA;AAAA,MACxC,CAAC,CAAA;AACD,MAAA,MAAM,OAAA,GAAU,SAAS,OAAA,EAAQ;AACjC,MAAA,OAAO;AAAA,QACL,MAAM,OAAO,OAAA,KAAY,QAAA,IAAY,OAAA,GAAU,QAAQ,IAAA,GAAO;AAAA,OAChE;AAAA,IACF,SAAS,EAAA,EAAS;AAChB,MAAA,QAAA,CAAS,KAAA,EAAM;AACf,MAAA,IAAI,EAAA,EAAI,IAAA,KAAS,YAAA,IAAgB,OAAO,SAAS,QAAA,EAAU;AACzD,QAAA,IAAA,EAAA;AACA,QAAA;AAAA,MACF;AACA,MAAA,MAAM,EAAA;AAAA,IACR;AAAA,EACF;AACF,CAAA;;ACFA,SAAS,iBAAA,CAAkB,OAAgB,GAAA,EAA8B;AACvE,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,KAAU,IAAA,EAAM;AAC/C,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,QAAA,EAAW,GAAG,CAAA,oBAAA,CAAsB,CAAA;AAAA,EACtD;AAEA,EAAA,IAAI,QAAA,IAAY,KAAA,IAAS,OAAA,IAAW,KAAA,EAAO;AACzC,IAAA,MAAM,CAAA,GAAI,KAAA;AACV,IAAA,IAAI,OAAO,EAAE,MAAA,KAAW,QAAA;AACtB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,QAAA,EAAW,GAAG,CAAA,yBAAA,CAA2B,CAAA;AAC3D,IAAA,IAAI,OAAO,EAAE,KAAA,KAAU,QAAA;AACrB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,QAAA,EAAW,GAAG,CAAA,wBAAA,CAA0B,CAAA;AAC1D,IAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,CAAA,CAAE,GAAG,CAAA;AACtB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,QAAA,EAAW,GAAG,CAAA,sBAAA,CAAwB,CAAA;AACxD,IAAA,OAAO;AAAA,MACL,QAAQ,CAAA,CAAE,MAAA;AAAA,MACV,OAAO,CAAA,CAAE,KAAA;AAAA,MACT,KAAK,CAAA,CAAE,GAAA;AAAA,MACP,OACE,IAAA,CAAK,KAAA;AAAA,QACH,IAAA,CAAK,SAAA,CAAU,CAAA,CAAE,KAAK,CAAA;AAAA,QACtB,CAAC,CAAA,EAAG,KAAA,KAAU,YAAA,CAAa,KAAK,CAAA,IAAK;AAAA,OACvC,IAAK;AAAA,KACT;AAAA,EACF,CAAA,MAAA,IAAW,SAAS,KAAA,EAAO;AACzB,IAAA,MAAM,CAAA,GAAI,KAAA;AACV,IAAA,IAAI,OAAO,EAAE,GAAA,KAAQ,QAAA,IAAY,CAAC,CAAA,CAAE,GAAA,CAAI,UAAA,CAAW,IAAI,CAAA,EAAG;AACxD,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,QAAA,EAAW,GAAG,CAAA,sCAAA,CAAwC,CAAA;AAAA,IACxE;AACA,IAAA,IACE,CAAA,CAAE,KAAA,KAAU,IAAA,IACZ,CAAA,CAAE,UAAU,MAAA,KACX,OAAO,CAAA,CAAE,KAAA,KAAU,YAAY,CAAE,CAAA,CAAE,KAAA,CAAiB,UAAA,CAAW,IAAI,CAAA,CAAA,EACpE;AACA,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,WAAW,GAAG,CAAA,gDAAA;AAAA,OAChB;AAAA,IACF;AACA,IAAA,OAAO;AAAA,MACL,KAAK,CAAA,CAAE,GAAA;AAAA,MACP,KAAA,EAAQ,EAAE,KAAA,IAAS;AAAA,KACrB;AAAA,EACF;AAEA,EAAA,MAAM,IAAI,KAAA;AAAA,IACR,WAAW,GAAG,CAAA,mEAAA;AAAA,GAChB;AACF;AAEA,SAAS,iBAAA,CAAkB,KAAc,KAAA,EAAgC;AACvE,EAAA,IAAI,GAAA,KAAQ,UAAU,OAAO,QAAA;AAC7B,EAAA,IACE,OAAO,GAAA,KAAQ,QAAA,IACf,GAAA,KAAQ,IAAA,IACR,WAAW,GAAA,IACX,OAAQ,GAAA,CAAgC,KAAA,KAAU,QAAA,EAClD;AACA,IAAA,OAAO,GAAA;AAAA,EACT;AACA,EAAA,MAAM,IAAI,KAAA;AAAA,IACR,GAAG,KAAK,CAAA,4CAAA,EAA+C,IAAA,CAAK,SAAA,CAAU,GAAG,CAAC,CAAA;AAAA,GAC5E;AACF;AAEA,SAAS,gBAAA,CAAiB,KAAc,IAAA,EAAiC;AACvE,EAAA,IAAI,OAAO,GAAA,KAAQ,QAAA,IAAY,GAAA,KAAQ,IAAA;AACrC,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,OAAA,EAAU,IAAI,CAAA,oBAAA,CAAsB,CAAA;AACtD,EAAA,MAAM,CAAA,GAAI,GAAA;AAEV,EAAA,IAAI,EAAE,QAAA,KAAa,MAAA;AACjB,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,OAAA,EAAU,IAAI,CAAA,qBAAA,CAAuB,CAAA;AACvD,EAAA,IACE,OAAO,CAAA,CAAE,QAAA,KAAa,YACtB,EACE,KAAA,CAAM,QAAQ,CAAA,CAAE,QAAQ,CAAA,IACxB,CAAA,CAAE,SAAS,KAAA,CAAM,CAAC,MAAM,OAAO,CAAA,KAAM,QAAQ,CAAA,CAAA,EAE/C;AACA,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,UAAU,IAAI,CAAA,kDAAA;AAAA,KAChB;AAAA,EACF;AAEA,EAAA,IACE,CAAA,CAAE,KAAA,KAAU,MAAA,IACZ,OAAO,CAAA,CAAE,UAAU,QAAA,IACnB,OAAO,CAAA,CAAE,KAAA,KAAU,QAAA,EACnB;AACA,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,OAAA,EAAU,IAAI,CAAA,yCAAA,CAA2C,CAAA;AAAA,EAC3E;AAEA,EAAA,MAAM,aAAa,CAAA,CAAE,IAAA,IAAQ,OAAO,IAAA,GAAO,WAAA,CAAY,EAAE,IAAW,CAAA;AACpE,EAAA,IACE,CAAA,CAAE,QAAQ,MAAA,KACT,UAAA,IAAc,QAAQ,UAAA,GAAa,CAAA,IAAK,aAAa,KAAA,CAAA,EACtD;AACA,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,UAAU,IAAI,CAAA,gDAAA;AAAA,KAChB;AAAA,EACF;AAEA,EAAA,MAAM,UAAwC,EAAC;AAC/C,EAAA,IAAI,CAAA,CAAE,YAAY,MAAA,EAAW;AAC3B,IAAA,IAAI,OAAO,CAAA,CAAE,OAAA,KAAY,QAAA,IAAY,EAAE,OAAA,KAAY,IAAA;AACjD,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,OAAA,EAAU,IAAI,CAAA,8BAAA,CAAgC,CAAA;AAChE,IAAA,MAAM,IAAI,CAAA,CAAE,OAAA;AACZ,IAAA,IAAI,EAAE,aAAA,KAAkB,MAAA;AACtB,MAAA,OAAA,CAAQ,aAAA,GAAgB,OAAA,CAAQ,CAAA,CAAE,aAAa,CAAA;AACjD,IAAA,IAAI,EAAE,cAAA,KAAmB,MAAA;AACvB,MAAA,OAAA,CAAQ,cAAA,GAAiB,iBAAA;AAAA,QACvB,CAAA,CAAE,cAAA;AAAA,QACF,GAAG,IAAI,CAAA,uBAAA;AAAA,OACT;AACF,IAAA,IAAI,EAAE,YAAA,KAAiB,MAAA;AACrB,MAAA,OAAA,CAAQ,YAAA,GAAe,iBAAA;AAAA,QACrB,CAAA,CAAE,YAAA;AAAA,QACF,GAAG,IAAI,CAAA,qBAAA;AAAA,OACT;AAAA,EACJ;AAEA,EAAA,MAAM,UAA6B,EAAC;AACpC,EAAA,IAAI,CAAA,CAAE,YAAY,MAAA,EAAW;AAC3B,IAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,CAAA,CAAE,OAAO,CAAA;AAC1B,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,OAAA,EAAU,IAAI,CAAA,6BAAA,CAA+B,CAAA;AAC/D,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,QAAQ,MAAA,EAAQ,CAAA,EAAA;AACpC,MAAA,OAAA,CAAQ,KAAK,iBAAA,CAAkB,CAAA,CAAE,QAAQ,CAAC,CAAA,EAAG,CAAC,CAAC,CAAA;AAAA,EACnD;AAEA,EAAA,IAAI,CAAA,CAAE,WAAA,KAAgB,MAAA,IAAa,OAAO,EAAE,WAAA,KAAgB,QAAA;AAC1D,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,OAAA,EAAU,IAAI,CAAA,iCAAA,CAAmC,CAAA;AAEnE,EAAA,OAAO;AAAA,IACL,UAAU,CAAA,CAAE,QAAA;AAAA,IACZ,KAAA,EAAO,WAAA,CAAY,CAAA,CAAE,KAAK,KAAM,CAAA,CAAE,KAAA;AAAA,IAClC,MAAM,UAAA,IAAc,MAAA;AAAA,IACpB,GAAI,CAAA,CAAE,WAAA,KAAgB,MAAA,IAAa;AAAA,MACjC,aAAa,CAAA,CAAE;AAAA,KACjB;AAAA,IACA,GAAI,OAAO,IAAA,CAAK,OAAO,EAAE,MAAA,GAAS,CAAA,IAAK,EAAE,OAAA,EAAQ;AAAA,IACjD,GAAI,OAAA,CAAQ,MAAA,GAAS,CAAA,IAAK,EAAE,OAAA;AAAQ,GACtC;AACF;AAMO,SAAS,YAAY,IAAA,EAA4B;AACtD,EAAA,IAAI,GAAA;AACJ,EAAA,IAAI;AACF,IAAA,GAAA,GAAM,MAAM,IAAI,CAAA;AAAA,EAClB,SAAS,CAAA,EAAG;AACV,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,sBAAA,EAA0B,CAAA,CAAY,OAAO,CAAA,CAAE,CAAA;AAAA,EACjE;AAEA,EAAA,IAAI,OAAO,GAAA,KAAQ,QAAA,IAAY,GAAA,KAAQ,IAAA;AACrC,IAAA,MAAM,IAAI,MAAM,8BAA8B,CAAA;AAChD,EAAA,MAAM,CAAA,GAAI,GAAA;AAEV,EAAA,IAAI,YAAY,CAAA,EAAG;AACjB,IAAA,IACE,OAAO,CAAA,CAAE,MAAA,KAAW,QAAA,IACpB,CAAA,CAAE,MAAA,KAAW,IAAA,IACb,KAAA,CAAM,OAAA,CAAQ,CAAA,CAAE,MAAM,CAAA,EACtB;AACA,MAAA,MAAM,IAAI,MAAM,0DAAqD,CAAA;AAAA,IACvE;AAEA,IAAA,MAAM,SAA4C,EAAC;AACnD,IAAA,KAAA,MAAW,CAAC,MAAM,QAAQ,CAAA,IAAK,OAAO,OAAA,CAAQ,CAAA,CAAE,MAAgB,CAAA,EAAG;AACjE,MAAA,MAAA,CAAO,IAAI,CAAA,GAAI,gBAAA,CAAiB,QAAA,EAAU,IAAI,CAAA;AAAA,IAChD;AAEA,IAAA,KAAA,MAAW,CAAC,IAAA,EAAM,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,EAAG;AAClD,MAAA,IAAI,KAAA,CAAM,WAAA,KAAgB,MAAA,IAAa,EAAE,MAAM,WAAA,IAAe,MAAA,CAAA;AAC5D,QAAA,MAAM,IAAI,KAAA;AAAA,UACR,CAAA,OAAA,EAAU,IAAI,CAAA,gBAAA,EAAmB,KAAA,CAAM,WAAW,CAAA,qBAAA;AAAA,SACpD;AAAA,IACJ;AAEA,IAAA,OAAO,EAAE,IAAA,EAAM,OAAA,EAAS,MAAA,EAAO;AAAA,EACjC;AAEA,EAAA,OAAO,EAAE,IAAA,EAAM,QAAA,EAAU,OAAO,gBAAA,CAAiB,GAAA,EAAK,MAAM,CAAA,EAAE;AAChE;AAEA,eAAsB,WAAW,IAAA,EAAqC;AACpE,EAAA,IAAI,IAAA;AACJ,EAAA,IAAI;AACF,IAAA,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAM,MAAM,CAAA;AAAA,EACpC,CAAA,CAAA,MAAQ;AACN,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,yBAAA,EAA4B,IAAI,CAAA,CAAE,CAAA;AAAA,EACpD;AACA,EAAA,OAAO,YAAY,IAAI,CAAA;AACzB;AAEA,MAAM,WAAA,GAAc,CAAC,KAAA,KAAmB;AACtC,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,EAAU,OAAO,KAAA;AACtC,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,EAAU,OAAO,IAAA;AACtC,EAAA,MAAM,QAAA,GAAW,KAAA,CAAM,UAAA,CAAW,GAAA,EAAK,EAAE,CAAA;AACzC,EAAA,OAAO,QAAA,CAAS,UAAA,CAAW,IAAI,CAAA,IAAK,MAAA,CAAO,MAAM,QAAQ,CAAA,GACrD,IAAA,GACA,MAAA,CAAO,QAAQ,CAAA;AACrB,CAAA;AAEA,MAAM,YAAA,GAAe,CAAC,KAAA,KAAmB;AACvC,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,EAAU,OAAO,KAAA;AACtC,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,EAAU,OAAO,IAAA;AACtC,EAAA,IAAI,KAAA,CAAM,QAAA,CAAS,GAAG,CAAA,EAAG;AACvB,IAAA,IAAI;AACF,MAAA,OAAO,MAAA,CAAO,MAAM,UAAA,CAAW,GAAA,EAAK,EAAE,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,CAAA,CAAE,CAAC,CAAA;AAAA,IACtD,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AACA,EAAA,OAAO,YAAY,KAAK,CAAA;AAC1B,CAAA;;ACxRO,MAAM,MAAM,MAAA,CAAO,KAAA,CAAM,EAAE,MAAA,EAAQ,OAAO,CAAA;;ACqB1C,MAAM,aAAA,GAAgB,OAAO,MAAA,KAAyB;AAC3D,EAAA,MAAM,MAAA,GACJ,MAAA,CAAO,IAAA,KAAS,QAAA,GACZ;AAAA,IACE,QAAQ,MAAA,CAAO;AAAA,MAEjB,MAAA,CAAO,MAAA;AAEb,EAAA,MAAM,KAAA,GAAQ,MAAM,OAAA,CAAQ,GAAA;AAAA,IAC1B,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,CAAE,GAAA;AAAA,MAAI,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,KACrC,UAAA,CAAW,KAAA,EAAO,MAAA,CAAO,IAAA,KAAS,QAAA,GAAW,MAAA,GAAY,GAAG;AAAA;AAC9D,GACF;AAEA,EAAA,IAAI,MAAA,CAAO,SAAS,OAAA,EAAS;AAC3B,IAAA,MAAM,WAAA,GAAsC,MAAA,CAAO,WAAA,CAAY,KAAK,CAAA;AAGpE,IAAA,MAAM,YAAA,uBAAmB,GAAA,EAAsB;AAC/C,IAAA,KAAA,MAAW,CAAC,MAAM,KAAK,CAAA,IAAK,OAAO,OAAA,CAAQ,MAAA,CAAO,MAAM,CAAA,EAAG;AACzD,MAAA,MAAM,QAAQ,KAAA,CAAM,WAAA;AACpB,MAAA,IAAI,CAAC,KAAA,EAAO;AACZ,MAAA,MAAM,IAAA,GAAO,YAAA,CAAa,GAAA,CAAI,KAAK,KAAK,EAAC;AACzC,MAAA,IAAA,CAAK,KAAK,IAAI,CAAA;AACd,MAAA,YAAA,CAAa,GAAA,CAAI,OAAO,IAAI,CAAA;AAAA,IAC9B;AAGA,IAAA,KAAA,MAAW,CAAC,MAAM,KAAK,CAAA,IAAK,OAAO,OAAA,CAAQ,MAAA,CAAO,MAAM,CAAA,EAAG;AACzD,MAAA,MAAM,QAAQ,KAAA,CAAM,WAAA;AACpB,MAAA,IAAI,CAAC,KAAA,EAAO;AACZ,MAAA,GAAA,CAAI,IAAA,CAAK,CAAA,UAAA,EAAa,IAAI,CAAA,iBAAA,EAAoB,KAAK,CAAA,CAAE,CAAA;AACrD,MAAA,MAAM,MAAA,GAASA,YAAA;AAAA,QACb,gBAAA,CAAiB,CAAA,eAAA,EAAkB,WAAA,CAAY,IAAI,CAAC,CAAA,CAAE;AAAA,OACxD;AACA,MAAA,MAAM,gBAAA,CAAiB,QAAQ,2BAAA,EAA6B;AAAA,QAC1D,CAAA,eAAA,EAAkB,WAAA,CAAY,KAAK,CAAC,CAAA;AAAA,OACrC,CAAA;AACD,MAAA,MAAA,CAAO,OAAA,EAAQ;AAAA,IACjB;AAGA,IAAA,KAAA,MAAW,KAAA,IAAS,YAAA,CAAa,MAAA,EAAO,EAAG;AACzC,MAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,QAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,UAAA,IAAI,KAAK,CAAA,EAAG;AACZ,UAAA,GAAA,CAAI,IAAA,CAAK,CAAA,UAAA,EAAa,CAAC,CAAA,KAAA,EAAQ,CAAC,CAAA,YAAA,CAAc,CAAA;AAC9C,UAAA,MAAM,MAAA,GAASA,YAAA;AAAA,YACb,gBAAA,CAAiB,CAAA,eAAA,EAAkB,WAAA,CAAY,CAAC,CAAC,CAAA,CAAE;AAAA,WACrD;AACA,UAAA,MAAM,gBAAA,CAAiB,QAAQ,6BAAA,EAA+B;AAAA,YAC5D,CAAA,eAAA,EAAkB,WAAA,CAAY,CAAC,CAAC,CAAA;AAAA,WACjC,CAAA;AACD,UAAA,MAAA,CAAO,OAAA,EAAQ;AAAA,QACjB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF,CAAA;AAEA,MAAM,gBAAA,GAAmB,CACvB,MAAA,EACA,MAAA,EACA,WAEA,IAAI,OAAA;AAAA,EAAQ,CAAC,OAAA,EAAS,MAAA,KACpB,MAAA,CAAO,QAAA,CAAS,QAAQ,MAAA,EAAQ;AAAA,IAC9B,SAAA,EAAW,OAAA;AAAA,IACX,OAAA,EAAS;AAAA,GACV;AACH,CAAA;AAEF,MAAM,UAAA,GAAa,OAAO,MAAA,EAA2B,GAAA,KAAiB;AACpE,EAAA,MAAM,UAAA,GAAa,MAAM,GAAA,CAAI,KAAA,CAAM,EAAE,KAAA,EAAO,GAAA,EAAK,CAAA,GAAI,GAAA;AACrD,EAAA,UAAA,CAAW,IAAA;AAAA,IACT,CAAA,QAAA,EAAW,MAAA,CAAO,QAAQ,CAAA,EACxB,MAAA,CAAO,KAAA,KAAU,MAAA,GAAY,CAAA,UAAA,EAAa,MAAA,CAAO,KAAK,CAAA,CAAA,GAAK,EAC7D,CAAA;AAAA,GACF;AAEA,EAAA,MAAM,CAAA,GAAI,QAAA;AAAA,IACR;AAAA,MACE,IAAA,EAAM,QAAA;AAAA,MACN,OAAO,EAAE,GAAA,EAAK,OAAO,QAAA,EAAU,OAAA,EAAS,OAAO,KAAA;AAAM,KACvD;AAAA,IACA;AAAA,MACE,gBACE,MAAA,CAAO,OAAA,EAAS,cAAA,KACf,OAAO,OAAO,OAAA,CAAQ,cAAA,KAAmB,QAAA,GACtC,IAAA,CAAK,QAAQ,CAAA,GACb,IAAA,CAAK,SAAS,MAAA,CAAO,OAAA,CAAQ,eAAe,KAAK,CAAA,CAAA;AAAA,MACvD,cACE,MAAA,CAAO,OAAA,EAAS,YAAA,KACf,OAAO,OAAO,OAAA,CAAQ,YAAA,KAAiB,QAAA,GACpC,IAAA,CAAK,QAAQ,CAAA,GACb,IAAA,CAAK,SAAS,MAAA,CAAO,OAAA,CAAQ,aAAa,KAAK,CAAA,CAAA;AAAA,MACrD,aAAA,EAAe,OAAO,OAAA,EAAS;AAAA;AACjC,GACF;AAEA,EAAA,MAAM,MAAA,GAAS,MAAM,cAAA,CAAe,CAAA,EAAG,EAAE,IAAA,EAAM,MAAA,CAAO,MAAM,CAAA;AAE5D,EAAA,IAAI,OAAO,OAAA,EAAS;AAClB,IAAA,UAAA,CAAW,KAAK,CAAA,yBAAA,CAA2B,CAAA;AAC3C,IAAA,MAAM,MAAA,GAAS,cAAA,CAAe,CAAA,eAAA,EAAkB,MAAA,CAAO,IAAI,CAAA,CAAE,CAAA;AAC7D,IAAA,MAAM,SAAA,GAAY,MAAM,MAAA,CAAO,iBAAA,EAAkB;AAEjD,IAAA,UAAA,CAAW,KAAK,CAAA,kBAAA,CAAoB,CAAA;AACpC,IAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,WAAA,CAAY,UAAU,IAAI,CAAA;AACxD,IAAA,MAAM,cAAA,GAAiB,iBAAA;AAAA,MACrB,WAAA,CAAY,aAAA,CAAc,cAAA,CAAe,QAAQ,CAAC,CAAC;AAAA,KACrD;AAEA,IAAA,MAAM,YAAA,GAAe,MAAM,OAAA,CAAQ,GAAA;AAAA,MACjC,OAAO,OAAA,CAAQ,GAAA;AAAA,QACb,OAAO,QAAA,KAAiD;AACtD,UAAA,IAAI,YAAY,QAAA,EAAU;AACxB,YAAA,MAAM,SAAS,cAAA,CAAe,YAAA;AAAA,cAC5B,QAAA,CAAS,MAAA;AAAA,cACT,QAAA,CAAS;AAAA,aACX;AACA,YAAA,IAAI,CAAC,MAAA,EAAQ;AACX,cAAA,UAAA,CAAW,KAAA;AAAA,gBACT,CAAA,cAAA,EAAiB,QAAA,CAAS,MAAM,CAAA,CAAA,EAAI,SAAS,KAAK,CAAA,oBAAA;AAAA,eACpD;AACA,cAAA,OAAO,IAAA;AAAA,YACT;AACA,YAAA,IAAIC,IAAAA,GAAiB,EAAA;AACrB,YAAA,IAAI,KAAA,GAA0B,IAAA;AAC9B,YAAA,IAAI;AACF,cAAAA,IAAAA,GAAM,OAAO,IAAA,CAAK,GAAA,CAAI,GAAI,QAAA,CAAS,GAAA,IAAO,EAAG,CAAA;AAAA,YAC/C,CAAA,CAAA,MAAQ;AACN,cAAA,UAAA,CAAW,KAAA;AAAA,gBACT,CAAA,YAAA,EAAe,QAAA,CAAS,MAAM,CAAA,CAAA,EAAI,SAAS,KAAK,CAAA,yBAAA;AAAA,eAClD;AACA,cAAA,OAAO,IAAA;AAAA,YACT;AACA,YAAA,IAAI;AACF,cAAA,KAAA,GACE,QAAA,CAAS,KAAA,IAAS,IAAA,GACd,IAAA,GACA,MAAA,CAAO,KAAA,CAAM,MAAA,CAAO,KAAA,CAAM,GAAA,CAAI,QAAA,CAAS,KAAK,CAAC,CAAA;AAAA,YACrD,CAAA,CAAA,MAAQ;AACN,cAAA,UAAA,CAAW,KAAA;AAAA,gBACT,CAAA,cAAA,EAAiB,QAAA,CAAS,MAAM,CAAA,CAAA,EAAI,SAAS,KAAK,CAAA,yBAAA;AAAA,eACpD;AACA,cAAA,OAAO,IAAA;AAAA,YACT;AACA,YAAA,OAAO;AAAA,cACL,GAAA,EAAAA,IAAAA;AAAA,cACA;AAAA,aACF;AAAA,UACF,CAAA,MAAO;AACL,YAAA,OAAO,QAAA;AAAA,UACT;AAAA,QACF;AAAA;AACF,KACF;AACA,IAAA,MAAM,MAAA,CAAO,SAAS,gBAAA,EAAkB;AAAA,MACtC,YAAA,CACG,MAAA,CAAO,CAAC,CAAA,KAAM,KAAK,IAAI,CAAA,CACvB,GAAA,CAAI,CAAC,aAAa,CAAC,QAAA,CAAS,GAAA,EAAK,QAAA,CAAS,KAAK,CAAC;AAAA,KACpD,CAAA;AACD,IAAA,MAAA,CAAO,OAAA,EAAQ;AAAA,EACjB;AACA,EAAA,UAAA,CAAW,IAAA;AAAA,IACT,CAAA,EAAG,GAAA,GAAM,GAAA,GAAM,GAAA,GAAM,EAAE,+BACrB,MAAA,CAAO,IACT,CAAA,kFAAA,EACE,MAAA,CAAO,IACT,CAAA;AAAA,GACF;AAEA,EAAA,OAAO,CAAC,GAAA,EAAK,MAAA,CAAO,IAAK,CAAA;AAC3B,CAAA;;AC9LA,OAAA,CACG,KAAK,UAAU,CAAA,CACf,SAAS,OAAA,EAAS,mCAAmC,EACrD,MAAA,CAAO,oBAAA,EAAsB,sBAAsB,CAAA,CACnD,MAAA,CAAO,uBAAuB,mCAAmC,CAAA,CACjE,OAAO,mBAAA,EAAqB,mBAAA,EAAqB,MAAM,CAAA,CACvD,MAAA;AAAA,EACC,yBAAA;AAAA,EACA,+CAAA;AAAA,EACA;AACF,CAAA,CACC,MAAA;AAAA,EACC,OACE,KACA,IAAA,KACG;AACH,IAAA,IAAI,CAAC,GAAA,IAAO,CAAC,IAAA,CAAK,MAAA,EAAQ;AACxB,MAAA,OAAA,CAAQ,MAAM,oDAAoD,CAAA;AAAA,IACpE;AAEA,IAAA,MAAA,CAAO,QAAQ,IAAA,CAAK,QAAA;AAEpB,IAAA,MAAM,SAAS,IAAA,CAAK,MAAA,GAAS,MAAM,UAAA,CAAW,IAAA,CAAK,MAAM,CAAA,GAAI,IAAA;AAC7D,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,OAAO,cAAc,MAAM,CAAA;AAAA,IAC7B;AAEA,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,GACjB,OAAA,CAAQ,KAAK,IAAA,CAAK,KAAK,CAAA,GACrB,QAAA,CAAS,IAAA,CAAK,KAAA,EAAO,EAAE,CAAA,GACvB,KAAK,KAAA,GACP,MAAA;AAEJ,IAAA,MAAM,IAAA,GAAO,QAAA,CAAS,IAAA,CAAK,IAAA,EAAM,EAAE,CAAA;AAEnC,IAAA,MAAM,CAAA,GAAI,QAAA,CAAS,EAAE,IAAA,EAAM,QAAA,EAAU,OAAO,EAAE,GAAA,EAAW,OAAA,EAAQ,EAAG,CAAA;AACpE,IAAA,MAAM,SAAS,MAAM,cAAA,CAAe,CAAA,EAAG,EAAE,MAAM,CAAA;AAE/C,IAAA,GAAA,CAAI,IAAA;AAAA,MACF,CAAA,QAAA,EAAW,GAAG,CAAA,EAAG,OAAA,KAAY,SAAY,CAAA,UAAA,EAAa,OAAO,KAAK,EAAE,CAAA;AAAA,KACtE;AACA,IAAA,GAAA,CAAI,IAAA,CAAK,CAAA,4BAAA,EAA+B,MAAA,CAAO,IAAI,CAAA,CAAE,CAAA;AAAA,EACvD;AACF,CAAA;AAEF,OAAA,CAAQ,KAAA,EAAM"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
const [minified, commonTrees, tokens] = JSON.parse(`[{"relay":{"1":{"0":{"DownwardMessageQueues":0}},"2":{"0":0},"3":{"0":0},"4":{"0":0},"5":{"0":0},"6":{}},"parachain":{"1":{"7":{"HrmpOutboundMessages":1,"UpwardMessages":2}},"2":{"7":0},"3":{"7":0},"4":{"7":{"SelfParaId":3}},"5":{"7":0},"6":{}}},[{}],["Dmp","storage","tx","events","constants","viewFns","apis","ParachainSystem"]]`);
|
|
2
|
+
const replaceTokens = (obj) => Object.fromEntries(
|
|
3
|
+
Object.entries(obj).map(([key, value]) => {
|
|
4
|
+
const unwrappedValue = typeof value === "object" ? replaceTokens(value) : value;
|
|
5
|
+
const numericKey = Number(key);
|
|
6
|
+
if (Number.isNaN(numericKey)) {
|
|
7
|
+
return [key, unwrappedValue];
|
|
8
|
+
}
|
|
9
|
+
return [tokens[numericKey], unwrappedValue];
|
|
10
|
+
})
|
|
11
|
+
);
|
|
12
|
+
const tokenizedCommonTrees = commonTrees.map(replaceTokens);
|
|
13
|
+
const unwrap = (obj, depth) => depth === 0 ? obj : Object.fromEntries(
|
|
14
|
+
Object.entries(obj).map(([key, value]) => [
|
|
15
|
+
key,
|
|
16
|
+
unwrap(
|
|
17
|
+
typeof value === "object" ? value : tokenizedCommonTrees[value],
|
|
18
|
+
depth - 1
|
|
19
|
+
)
|
|
20
|
+
])
|
|
21
|
+
);
|
|
22
|
+
const getChainDescriptors = (key) => unwrap(replaceTokens(minified[key]), 2);
|
|
23
|
+
const Relay = getChainDescriptors("relay");
|
|
24
|
+
const Parachain = getChainDescriptors("parachain");
|
|
25
|
+
|
|
26
|
+
export { Parachain, Relay };
|
|
27
|
+
//# sourceMappingURL=descriptors-CVixQzDI.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"descriptors-CVixQzDI.js","sources":["../../../../.papi/descriptors/dist/descriptors-CVixQzDI.js"],"sourcesContent":["const [minified, commonTrees, tokens] = JSON.parse(`[{\"relay\":{\"1\":{\"0\":{\"DownwardMessageQueues\":0}},\"2\":{\"0\":0},\"3\":{\"0\":0},\"4\":{\"0\":0},\"5\":{\"0\":0},\"6\":{}},\"parachain\":{\"1\":{\"7\":{\"HrmpOutboundMessages\":1,\"UpwardMessages\":2}},\"2\":{\"7\":0},\"3\":{\"7\":0},\"4\":{\"7\":{\"SelfParaId\":3}},\"5\":{\"7\":0},\"6\":{}}},[{}],[\"Dmp\",\"storage\",\"tx\",\"events\",\"constants\",\"viewFns\",\"apis\",\"ParachainSystem\"]]`);\nconst replaceTokens = (obj) => Object.fromEntries(\n Object.entries(obj).map(([key, value]) => {\n const unwrappedValue = typeof value === \"object\" ? replaceTokens(value) : value;\n const numericKey = Number(key);\n if (Number.isNaN(numericKey)) {\n return [key, unwrappedValue];\n }\n return [tokens[numericKey], unwrappedValue];\n })\n);\nconst tokenizedCommonTrees = commonTrees.map(replaceTokens);\nconst unwrap = (obj, depth) => depth === 0 ? obj : Object.fromEntries(\n Object.entries(obj).map(([key, value]) => [\n key,\n unwrap(\n typeof value === \"object\" ? value : tokenizedCommonTrees[value],\n depth - 1\n )\n ])\n);\nconst getChainDescriptors = (key) => unwrap(replaceTokens(minified[key]), 2);\nconst Relay = getChainDescriptors(\"relay\");\nconst Parachain = getChainDescriptors(\"parachain\");\n\nexport { Parachain, Relay };\n"],"names":[],"mappings":"AAAA,MAAM,CAAC,QAAA,EAAU,WAAA,EAAa,MAAM,CAAA,GAAI,IAAA,CAAK,MAAM,CAAA,0UAAA,CAA4U,CAAA;AAC/X,MAAM,aAAA,GAAgB,CAAC,GAAA,KAAQ,MAAA,CAAO,WAAA;AAAA,EACpC,MAAA,CAAO,QAAQ,GAAG,CAAA,CAAE,IAAI,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,KAAM;AACxC,IAAA,MAAM,iBAAiB,OAAO,KAAA,KAAU,QAAA,GAAW,aAAA,CAAc,KAAK,CAAA,GAAI,KAAA;AAC1E,IAAA,MAAM,UAAA,GAAa,OAAO,GAAG,CAAA;AAC7B,IAAA,IAAI,MAAA,CAAO,KAAA,CAAM,UAAU,CAAA,EAAG;AAC5B,MAAA,OAAO,CAAC,KAAK,cAAc,CAAA;AAAA,IAC7B;AACA,IAAA,OAAO,CAAC,MAAA,CAAO,UAAU,CAAA,EAAG,cAAc,CAAA;AAAA,EAC5C,CAAC;AACH,CAAA;AACA,MAAM,oBAAA,GAAuB,WAAA,CAAY,GAAA,CAAI,aAAa,CAAA;AAC1D,MAAM,SAAS,CAAC,GAAA,EAAK,UAAU,KAAA,KAAU,CAAA,GAAI,MAAM,MAAA,CAAO,WAAA;AAAA,EACxD,MAAA,CAAO,QAAQ,GAAG,CAAA,CAAE,IAAI,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,KAAM;AAAA,IACxC,GAAA;AAAA,IACA,MAAA;AAAA,MACE,OAAO,KAAA,KAAU,QAAA,GAAW,KAAA,GAAQ,qBAAqB,KAAK,CAAA;AAAA,MAC9D,KAAA,GAAQ;AAAA;AACV,GACD;AACH,CAAA;AACA,MAAM,mBAAA,GAAsB,CAAC,GAAA,KAAQ,MAAA,CAAO,cAAc,QAAA,CAAS,GAAG,CAAC,CAAA,EAAG,CAAC,CAAA;AAC3E,MAAM,KAAA,GAAQ,oBAAoB,OAAO;AACzC,MAAM,SAAA,GAAY,oBAAoB,WAAW;;;;"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import 'polkadot-api';
|
|
2
|
+
|
|
3
|
+
const table = new Uint8Array(128);
|
|
4
|
+
for (let i = 0; i < 64; i++) table[i < 26 ? i + 65 : i < 52 ? i + 71 : i < 62 ? i - 4 : i * 4 - 205] = i;
|
|
5
|
+
const toBinary = (base64) => {
|
|
6
|
+
const n = base64.length, bytes = new Uint8Array((n - Number(base64[n - 1] === "=") - Number(base64[n - 2] === "=")) * 3 / 4 | 0);
|
|
7
|
+
for (let i2 = 0, j = 0; i2 < n; ) {
|
|
8
|
+
const c0 = table[base64.charCodeAt(i2++)], c1 = table[base64.charCodeAt(i2++)];
|
|
9
|
+
const c2 = table[base64.charCodeAt(i2++)], c3 = table[base64.charCodeAt(i2++)];
|
|
10
|
+
bytes[j++] = c0 << 2 | c1 >> 4;
|
|
11
|
+
bytes[j++] = c1 << 4 | c2 >> 2;
|
|
12
|
+
bytes[j++] = c2 << 6 | c3;
|
|
13
|
+
}
|
|
14
|
+
return bytes;
|
|
15
|
+
};
|
|
16
|
+
const descriptorValues$1 = import('./descriptors-CVixQzDI.js').then((module) => module["Relay"]);
|
|
17
|
+
const metadataTypes$1 = import('./metadataTypes-OmVFeQs5.js').then(
|
|
18
|
+
(module) => toBinary("default" in module ? module.default : module)
|
|
19
|
+
);
|
|
20
|
+
const asset$1 = {};
|
|
21
|
+
const extensions$1 = {};
|
|
22
|
+
const getMetadata$2 = () => import('./relay_metadata-BAI7pjXf.js').then(
|
|
23
|
+
(module) => toBinary("default" in module ? module.default : module)
|
|
24
|
+
);
|
|
25
|
+
const genesis$1 = "0x91b171bb158e2d3848fa23a9f1c25182fb8e20313b2c1eb49219da7a70ce90c3";
|
|
26
|
+
const _allDescriptors$1 = { descriptors: descriptorValues$1, metadataTypes: metadataTypes$1, asset: asset$1, extensions: extensions$1, getMetadata: getMetadata$2, genesis: genesis$1 };
|
|
27
|
+
const descriptorValues = import('./descriptors-CVixQzDI.js').then((module) => module["Parachain"]);
|
|
28
|
+
const metadataTypes = import('./metadataTypes-OmVFeQs5.js').then(
|
|
29
|
+
(module) => toBinary("default" in module ? module.default : module)
|
|
30
|
+
);
|
|
31
|
+
const asset = {};
|
|
32
|
+
const extensions = {};
|
|
33
|
+
const getMetadata$1 = () => import('./parachain_metadata-CQQZadL1.js').then(
|
|
34
|
+
(module) => toBinary("default" in module ? module.default : module)
|
|
35
|
+
);
|
|
36
|
+
const genesis = "0x68d56f15f85d3136970ec16946040bc1752654e906147f7e43e9d539d7c3de2f";
|
|
37
|
+
const _allDescriptors = { descriptors: descriptorValues, metadataTypes, asset, extensions, getMetadata: getMetadata$1, genesis };
|
|
38
|
+
|
|
39
|
+
export { _allDescriptors as parachain, _allDescriptors$1 as relay };
|
|
40
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../.papi/descriptors/dist/index.js"],"sourcesContent":["import { _Enum } from 'polkadot-api';\n\nconst table = new Uint8Array(128);\nfor (let i = 0; i < 64; i++) table[i < 26 ? i + 65 : i < 52 ? i + 71 : i < 62 ? i - 4 : i * 4 - 205] = i;\nconst toBinary = (base64) => {\n const n = base64.length, bytes = new Uint8Array((n - Number(base64[n - 1] === \"=\") - Number(base64[n - 2] === \"=\")) * 3 / 4 | 0);\n for (let i2 = 0, j = 0; i2 < n; ) {\n const c0 = table[base64.charCodeAt(i2++)], c1 = table[base64.charCodeAt(i2++)];\n const c2 = table[base64.charCodeAt(i2++)], c3 = table[base64.charCodeAt(i2++)];\n bytes[j++] = c0 << 2 | c1 >> 4;\n bytes[j++] = c1 << 4 | c2 >> 2;\n bytes[j++] = c2 << 6 | c3;\n }\n return bytes;\n};\n\nconst descriptorValues$1 = import('./descriptors-CVixQzDI.js').then((module) => module[\"Relay\"]);\nconst metadataTypes$1 = import('./metadataTypes-OmVFeQs5.js').then(\n (module) => toBinary(\"default\" in module ? module.default : module)\n);\nconst asset$1 = {};\nconst extensions$1 = {};\nconst getMetadata$2 = () => import('./relay_metadata-BAI7pjXf.js').then(\n (module) => toBinary(\"default\" in module ? module.default : module)\n);\nconst genesis$1 = \"0x91b171bb158e2d3848fa23a9f1c25182fb8e20313b2c1eb49219da7a70ce90c3\";\nconst _allDescriptors$1 = { descriptors: descriptorValues$1, metadataTypes: metadataTypes$1, asset: asset$1, extensions: extensions$1, getMetadata: getMetadata$2, genesis: genesis$1 };\n\nconst descriptorValues = import('./descriptors-CVixQzDI.js').then((module) => module[\"Parachain\"]);\nconst metadataTypes = import('./metadataTypes-OmVFeQs5.js').then(\n (module) => toBinary(\"default\" in module ? module.default : module)\n);\nconst asset = {};\nconst extensions = {};\nconst getMetadata$1 = () => import('./parachain_metadata-CQQZadL1.js').then(\n (module) => toBinary(\"default\" in module ? module.default : module)\n);\nconst genesis = \"0x68d56f15f85d3136970ec16946040bc1752654e906147f7e43e9d539d7c3de2f\";\nconst _allDescriptors = { descriptors: descriptorValues, metadataTypes, asset, extensions, getMetadata: getMetadata$1, genesis };\n\nconst DigestItem = _Enum;\nconst BabeDigestsNextConfigDescriptor = _Enum;\nconst BabeAllowedSlots = _Enum;\nconst MultiAddress = _Enum;\nconst BalancesAdjustmentDirection = _Enum;\nconst StakingRewardDestination = _Enum;\nconst StakingPalletConfigOpBig = _Enum;\nconst StakingPalletConfigOp = _Enum;\nconst GrandpaEquivocation = _Enum;\nconst XcmV3Junctions = _Enum;\nconst XcmV3Junction = _Enum;\nconst XcmV3JunctionNetworkId = _Enum;\nconst XcmV3JunctionBodyId = _Enum;\nconst XcmV2JunctionBodyPart = _Enum;\nconst XcmV3MultiassetAssetId = _Enum;\nconst XcmV5Junctions = _Enum;\nconst XcmV5Junction = _Enum;\nconst XcmV5NetworkId = _Enum;\nconst XcmVersionedLocation = _Enum;\nconst ConvictionVotingVoteAccountVote = _Enum;\nconst VotingConviction = _Enum;\nconst GovernanceOrigin = _Enum;\nconst ParachainsOrigin = _Enum;\nconst PreimagesBounded = _Enum;\nconst TraitsScheduleDispatchTime = _Enum;\nconst ClaimsStatementKind = _Enum;\nconst NominationPoolsBondExtra = _Enum;\nconst NominationPoolsPoolState = _Enum;\nconst NominationPoolsConfigOp = _Enum;\nconst NominationPoolsClaimPermission = _Enum;\nconst NominationPoolsCommissionClaimPermission = _Enum;\nconst PolkadotPrimitivesV6ExecutorParamsExecutorParam = _Enum;\nconst PolkadotPrimitivesV6PvfPrepKind = _Enum;\nconst PvfExecKind = _Enum;\nconst ValidityAttestation = _Enum;\nconst PolkadotPrimitivesV6DisputeStatement = _Enum;\nconst PolkadotPrimitivesV6ValidDisputeStatementKind = _Enum;\nconst InvalidDisputeStatementKind = _Enum;\nconst BrokerCoretimeInterfaceCoreAssignment = _Enum;\nconst XcmVersionedXcm = _Enum;\nconst XcmV3Instruction = _Enum;\nconst XcmV3MultiassetFungibility = _Enum;\nconst XcmV3MultiassetAssetInstance = _Enum;\nconst XcmV3Response = _Enum;\nconst XcmV3TraitsError = _Enum;\nconst XcmV3MaybeErrorCode = _Enum;\nconst XcmV2OriginKind = _Enum;\nconst XcmV3MultiassetMultiAssetFilter = _Enum;\nconst XcmV3MultiassetWildMultiAsset = _Enum;\nconst XcmV2MultiassetWildFungibility = _Enum;\nconst XcmV3WeightLimit = _Enum;\nconst XcmV4Instruction = _Enum;\nconst XcmV4Response = _Enum;\nconst XcmV4AssetAssetFilter = _Enum;\nconst XcmV4AssetWildAsset = _Enum;\nconst XcmV5Instruction = _Enum;\nconst XcmV5AssetFilter = _Enum;\nconst XcmV5WildAsset = _Enum;\nconst XcmVersionedAssets = _Enum;\nconst XcmVersionedAssetId = _Enum;\nconst ParachainsInclusionAggregateMessageOrigin = _Enum;\nconst ParachainsInclusionUmpQueueId = _Enum;\nconst PreimagePalletHoldReason = _Enum;\nconst WestendRuntimeRuntimeFreezeReason = _Enum;\nconst NominationPoolsPalletFreezeReason = _Enum;\nconst BalancesTypesReasons = _Enum;\nconst ConvictionVotingVoteVoting = _Enum;\nconst TreasuryPaymentState = _Enum;\nconst ChildBountyStatus = _Enum;\nconst StakingForcing = _Enum;\n\nconst metadatas = {\n [\"0xe29a1246273f74b2fbfde9ede985ccbe86b844be0a3537e34eb2bcd68c3b3358\"]: _allDescriptors$1,\n [\"0x04fa38c2fb117fbd73302c23b339ef18c4f3a200a0b487803208bf279161f1d7\"]: _allDescriptors\n};\nconst getMetadata = async (codeHash) => {\n try {\n return await metadatas[codeHash].getMetadata();\n } catch {\n }\n return null;\n};\n\nexport { BabeAllowedSlots, BabeDigestsNextConfigDescriptor, BalancesAdjustmentDirection, BalancesTypesReasons, BrokerCoretimeInterfaceCoreAssignment, ChildBountyStatus, ClaimsStatementKind, ConvictionVotingVoteAccountVote, ConvictionVotingVoteVoting, DigestItem, GovernanceOrigin, GrandpaEquivocation, InvalidDisputeStatementKind, MultiAddress, NominationPoolsBondExtra, NominationPoolsClaimPermission, NominationPoolsCommissionClaimPermission, NominationPoolsConfigOp, NominationPoolsPalletFreezeReason, NominationPoolsPoolState, ParachainsInclusionAggregateMessageOrigin, ParachainsInclusionUmpQueueId, ParachainsOrigin, PolkadotPrimitivesV6DisputeStatement, PolkadotPrimitivesV6ExecutorParamsExecutorParam, PolkadotPrimitivesV6PvfPrepKind, PolkadotPrimitivesV6ValidDisputeStatementKind, PreimagePalletHoldReason, PreimagesBounded, PvfExecKind, StakingForcing, StakingPalletConfigOp, StakingPalletConfigOpBig, StakingRewardDestination, TraitsScheduleDispatchTime, TreasuryPaymentState, ValidityAttestation, VotingConviction, WestendRuntimeRuntimeFreezeReason, XcmV2JunctionBodyPart, XcmV2MultiassetWildFungibility, XcmV2OriginKind, XcmV3Instruction, XcmV3Junction, XcmV3JunctionBodyId, XcmV3JunctionNetworkId, XcmV3Junctions, XcmV3MaybeErrorCode, XcmV3MultiassetAssetId, XcmV3MultiassetAssetInstance, XcmV3MultiassetFungibility, XcmV3MultiassetMultiAssetFilter, XcmV3MultiassetWildMultiAsset, XcmV3Response, XcmV3TraitsError, XcmV3WeightLimit, XcmV4AssetAssetFilter, XcmV4AssetWildAsset, XcmV4Instruction, XcmV4Response, XcmV5AssetFilter, XcmV5Instruction, XcmV5Junction, XcmV5Junctions, XcmV5NetworkId, XcmV5WildAsset, XcmVersionedAssetId, XcmVersionedAssets, XcmVersionedLocation, XcmVersionedXcm, getMetadata, _allDescriptors as parachain, _allDescriptors$1 as relay };\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metadataTypes-OmVFeQs5.js","sources":["../../../../.papi/descriptors/dist/metadataTypes-OmVFeQs5.js"],"sourcesContent":["const content = \"EAAAAAwBAQUAFAEBBQAYAQEFAAAcAQIFAAAIHHNlbnRfYXQADG1zZwQECAAACCRyZWNpcGllbnQAEGRhdGEEBBAABAQA\";\n\nexport { content as default };\n"],"names":[],"mappings":"AAAA,MAAM,OAAA,GAAU;;;;"}
|