crosscheck-cli 0.0.59 → 0.0.61
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/dist/cli.js +39 -42
- package/dist/cli.js.map +1 -1
- package/dist/engine-version.js +34 -4
- package/dist/engine-version.js.map +1 -1
- package/dist/http.js +1 -0
- package/dist/http.js.map +1 -1
- package/dist/key-status-signing.js +26 -0
- package/dist/key-status-signing.js.map +1 -0
- package/dist/key-status.js +118 -0
- package/dist/key-status.js.map +1 -0
- package/dist/key-verify.js +130 -0
- package/dist/key-verify.js.map +1 -0
- package/dist/keys-browser-flow.js +13 -126
- package/dist/keys-browser-flow.js.map +1 -1
- package/dist/keys-manage-cli.js +44 -0
- package/dist/keys-manage-cli.js.map +1 -0
- package/dist/keys-session.js +314 -0
- package/dist/keys-session.js.map +1 -0
- package/dist/reconcile.js +43 -1
- package/dist/reconcile.js.map +1 -1
- package/package.json +2 -2
|
@@ -293,132 +293,11 @@ export async function captureKeysViaBrowser(args) {
|
|
|
293
293
|
});
|
|
294
294
|
});
|
|
295
295
|
}
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
* have a stored key) is forwarded to the page via the `set=` query param so it
|
|
302
|
-
* can render status badges — which providers are configured is not secret; the
|
|
303
|
-
* key VALUES never leave the machine.
|
|
304
|
-
*
|
|
305
|
-
* Returns the applied-as-requested changes (validated/filtered to supported
|
|
306
|
-
* providers). The caller persists them.
|
|
307
|
-
*/
|
|
308
|
-
export async function captureKeyChangesViaBrowser(args) {
|
|
309
|
-
const supported = [...SUPPORTED_PROVIDERS];
|
|
310
|
-
const setProviders = args.setProviders.filter((p) => SUPPORTED_PROVIDERS.has(p));
|
|
311
|
-
const state = crypto.randomBytes(24).toString("base64url");
|
|
312
|
-
const pageBase = args.pageBaseUrl ?? `${SERVER_URL}/cli/keys/manage`;
|
|
313
|
-
const timeoutMs = args.timeoutMs ?? 10 * 60 * 1000;
|
|
314
|
-
const MAX_BATCH_BYTES = 32 * 1024;
|
|
315
|
-
return new Promise((resolve, reject) => {
|
|
316
|
-
let captured = null;
|
|
317
|
-
let consumed = false;
|
|
318
|
-
const server = http.createServer((req, res) => {
|
|
319
|
-
if (req.method === "OPTIONS") {
|
|
320
|
-
res.writeHead(204, corsHeaders(pageBase));
|
|
321
|
-
res.end();
|
|
322
|
-
return;
|
|
323
|
-
}
|
|
324
|
-
if (req.method !== "POST") {
|
|
325
|
-
res.writeHead(405, { "content-type": "text/plain", ...corsHeaders(pageBase) });
|
|
326
|
-
res.end("method not allowed");
|
|
327
|
-
return;
|
|
328
|
-
}
|
|
329
|
-
if (consumed) {
|
|
330
|
-
res.writeHead(410, { "content-type": "text/plain", ...corsHeaders(pageBase) });
|
|
331
|
-
res.end("already used");
|
|
332
|
-
return;
|
|
333
|
-
}
|
|
334
|
-
const url = new URL(req.url ?? "/", "http://localhost");
|
|
335
|
-
if (url.pathname !== "/manage") {
|
|
336
|
-
res.writeHead(404, { "content-type": "text/plain", ...corsHeaders(pageBase) });
|
|
337
|
-
res.end("not found");
|
|
338
|
-
return;
|
|
339
|
-
}
|
|
340
|
-
let received = 0;
|
|
341
|
-
const chunks = [];
|
|
342
|
-
req.on("data", (chunk) => {
|
|
343
|
-
received += chunk.length;
|
|
344
|
-
if (received > MAX_BATCH_BYTES) {
|
|
345
|
-
res.writeHead(413, { "content-type": "text/plain", ...corsHeaders(pageBase) });
|
|
346
|
-
res.end("payload too large");
|
|
347
|
-
req.destroy();
|
|
348
|
-
return;
|
|
349
|
-
}
|
|
350
|
-
chunks.push(chunk);
|
|
351
|
-
});
|
|
352
|
-
req.on("end", () => {
|
|
353
|
-
if (req.destroyed)
|
|
354
|
-
return;
|
|
355
|
-
let body;
|
|
356
|
-
try {
|
|
357
|
-
body = JSON.parse(Buffer.concat(chunks).toString("utf8"));
|
|
358
|
-
}
|
|
359
|
-
catch {
|
|
360
|
-
res.writeHead(400, { "content-type": "text/plain", ...corsHeaders(pageBase) });
|
|
361
|
-
res.end("invalid json");
|
|
362
|
-
return;
|
|
363
|
-
}
|
|
364
|
-
if (body.state !== state) {
|
|
365
|
-
res.writeHead(403, { "content-type": "text/plain", ...corsHeaders(pageBase) });
|
|
366
|
-
res.end("state mismatch");
|
|
367
|
-
return;
|
|
368
|
-
}
|
|
369
|
-
const incoming = body.set && typeof body.set === "object" ? body.set : {};
|
|
370
|
-
const set = {};
|
|
371
|
-
for (const p of supported) {
|
|
372
|
-
const v = incoming[p];
|
|
373
|
-
if (typeof v === "string" && v.trim())
|
|
374
|
-
set[p] = v.trim();
|
|
375
|
-
}
|
|
376
|
-
const remove = Array.isArray(body.remove)
|
|
377
|
-
? body.remove.filter((p) => typeof p === "string" && SUPPORTED_PROVIDERS.has(p) && !(p in set))
|
|
378
|
-
: [];
|
|
379
|
-
consumed = true;
|
|
380
|
-
captured = { set, remove };
|
|
381
|
-
res.writeHead(200, { "content-type": "application/json", ...corsHeaders(pageBase) });
|
|
382
|
-
res.end(JSON.stringify({ ok: true, saved: Object.keys(set).length, removed: remove.length }));
|
|
383
|
-
setTimeout(() => server.close(), 100);
|
|
384
|
-
});
|
|
385
|
-
});
|
|
386
|
-
let timeoutId;
|
|
387
|
-
server.on("error", (err) => reject(err));
|
|
388
|
-
server.on("close", () => {
|
|
389
|
-
if (timeoutId)
|
|
390
|
-
clearTimeout(timeoutId);
|
|
391
|
-
if (captured)
|
|
392
|
-
resolve(captured);
|
|
393
|
-
});
|
|
394
|
-
server.listen(0, "127.0.0.1", () => {
|
|
395
|
-
const addr = server.address();
|
|
396
|
-
if (!addr || typeof addr === "string") {
|
|
397
|
-
server.close();
|
|
398
|
-
reject(new Error("Could not determine local port."));
|
|
399
|
-
return;
|
|
400
|
-
}
|
|
401
|
-
const callback = `http://127.0.0.1:${addr.port}/manage`;
|
|
402
|
-
const qs = new URLSearchParams({ state, callback });
|
|
403
|
-
if (setProviders.length > 0)
|
|
404
|
-
qs.set("set", setProviders.join(","));
|
|
405
|
-
const pageUrl = `${pageBase}?${qs.toString()}`;
|
|
406
|
-
// eslint-disable-next-line no-console
|
|
407
|
-
console.log("\n Open this URL in your browser to manage your provider keys:");
|
|
408
|
-
// eslint-disable-next-line no-console
|
|
409
|
-
console.log(` ${pageUrl}\n`);
|
|
410
|
-
// eslint-disable-next-line no-console
|
|
411
|
-
console.log(" Waiting for the browser… (10 min timeout; Ctrl-C to cancel)\n");
|
|
412
|
-
openBrowser(pageUrl);
|
|
413
|
-
timeoutId = setTimeout(() => {
|
|
414
|
-
if (!captured) {
|
|
415
|
-
server.close();
|
|
416
|
-
reject(new Error("Timed out waiting for the browser."));
|
|
417
|
-
}
|
|
418
|
-
}, timeoutMs);
|
|
419
|
-
});
|
|
420
|
-
});
|
|
421
|
-
}
|
|
296
|
+
// NOTE: the one-shot "manage" flow used to live here — a page that collected
|
|
297
|
+
// a batch of key changes, POSTed once, and exited. `crosscheck keys` now opens
|
|
298
|
+
// the live session in keys-session.ts instead, so nothing in this CLI called
|
|
299
|
+
// it any more. The SERVER still serves /cli/keys/manage, because CLIs already
|
|
300
|
+
// installed in the wild still open it; only this side is gone.
|
|
422
301
|
function corsHeaders(origin) {
|
|
423
302
|
// Lock the allowed origin to the served page's origin so a malicious
|
|
424
303
|
// page on another origin can't POST to the loopback server. We use the
|
|
@@ -435,6 +314,14 @@ function corsHeaders(origin) {
|
|
|
435
314
|
"access-control-allow-origin": allow,
|
|
436
315
|
"access-control-allow-methods": "POST, OPTIONS",
|
|
437
316
|
"access-control-allow-headers": "content-type",
|
|
317
|
+
// Chromium's Private Network Access treats an HTTPS page reaching
|
|
318
|
+
// 127.0.0.1 as a privilege escalation and preflights it with
|
|
319
|
+
// `Access-Control-Request-Private-Network: true`. Without this answer the
|
|
320
|
+
// request is blocked with NO visible error — the fetch simply fails, and
|
|
321
|
+
// the page cannot distinguish that from "the CLI isn't running". This
|
|
322
|
+
// path shipped without it and has been living on the enforcement grace
|
|
323
|
+
// period.
|
|
324
|
+
"access-control-allow-private-network": "true",
|
|
438
325
|
"access-control-max-age": "600",
|
|
439
326
|
"vary": "origin",
|
|
440
327
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"keys-browser-flow.js","sourceRoot":"","sources":["../src/keys-browser-flow.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAE3C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,MAAM,CAAC,MAAM,mBAAmB,GAAG,IAAI,GAAG,CAAC;IACzC,WAAW;IACX,QAAQ;IACR,QAAQ;IACR,MAAM;IACN,MAAM;IACN,UAAU;IACV,SAAS;IACT,MAAM;IACN,MAAM;CACP,CAAC,CAAC;AAEH,MAAM,eAAe,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;AACtC,MAAM,aAAa,GAAG,IAAI,CAAC,CAAC,kCAAkC;AAI9D;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,IAO1C;IACC,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC5C,MAAM,IAAI,KAAK,CAAC,yBAAyB,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC5D,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IAC3D,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,IAAI,GAAG,UAAU,WAAW,CAAC;IAE9D,OAAO,IAAI,OAAO,CAAc,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAClD,IAAI,QAAQ,GAAuB,IAAI,CAAC;QACxC,IAAI,QAAQ,GAAG,KAAK,CAAC;QAErB,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;YAC5C,qDAAqD;YACrD,oEAAoE;YACpE,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;gBAC7B,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC;gBAC1C,GAAG,CAAC,GAAG,EAAE,CAAC;gBACV,OAAO;YACT,CAAC;YAED,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;gBAC1B,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,YAAY,EAAE,GAAG,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;gBAC/E,GAAG,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;gBAC9B,OAAO;YACT,CAAC;YACD,IAAI,QAAQ,EAAE,CAAC;gBACb,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,YAAY,EAAE,GAAG,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;gBAC/E,GAAG,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;gBACxB,OAAO;YACT,CAAC;YAED,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,EAAE,kBAAkB,CAAC,CAAC;YACxD,IAAI,GAAG,CAAC,QAAQ,KAAK,MAAM,EAAE,CAAC;gBAC5B,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,YAAY,EAAE,GAAG,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;gBAC/E,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;gBACrB,OAAO;YACT,CAAC;YAED,6CAA6C;YAC7C,IAAI,QAAQ,GAAG,CAAC,CAAC;YACjB,MAAM,MAAM,GAAa,EAAE,CAAC;YAC5B,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;gBAC/B,QAAQ,IAAI,KAAK,CAAC,MAAM,CAAC;gBACzB,IAAI,QAAQ,GAAG,aAAa,EAAE,CAAC;oBAC7B,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,YAAY,EAAE,GAAG,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;oBAC/E,GAAG,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;oBAC7B,GAAG,CAAC,OAAO,EAAE,CAAC;oBACd,OAAO;gBACT,CAAC;gBACD,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACrB,CAAC,CAAC,CAAC;YACH,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE;gBACjB,IAAI,GAAG,CAAC,SAAS;oBAAE,OAAO;gBAC1B,IAAI,IAA2D,CAAC;gBAChE,IAAI,CAAC;oBACH,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;gBAC5D,CAAC;gBAAC,MAAM,CAAC;oBACP,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,YAAY,EAAE,GAAG,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;oBAC/E,GAAG,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;oBACxB,OAAO;gBACT,CAAC;gBACD,IAAI,IAAI,CAAC,KAAK,KAAK,KAAK,EAAE,CAAC;oBACzB,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,YAAY,EAAE,GAAG,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;oBAC/E,GAAG,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;oBAC1B,OAAO;gBACT,CAAC;gBACD,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC,QAAQ,EAAE,CAAC;oBACpC,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,YAAY,EAAE,GAAG,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;oBAC/E,GAAG,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;oBAC7B,OAAO;gBACT,CAAC;gBACD,MAAM,KAAK,GAAG,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACtE,IAAI,CAAC,KAAK,EAAE,CAAC;oBACX,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,YAAY,EAAE,GAAG,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;oBAC/E,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;oBACrB,OAAO;gBACT,CAAC;gBACD,QAAQ,GAAG,IAAI,CAAC;gBAChB,QAAQ,GAAG,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,CAAC;gBAC9C,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,GAAG,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;gBACrF,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;gBACtC,oEAAoE;gBACpE,UAAU,CAAC,GAAG,EAAE;oBACd,MAAM,CAAC,KAAK,EAAE,CAAC;gBACjB,CAAC,EAAE,GAAG,CAAC,CAAC;YACV,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QAEzC,mEAAmE;QACnE,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,WAAW,EAAE,GAAG,EAAE;YACjC,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;YAC9B,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACtC,MAAM,CAAC,KAAK,EAAE,CAAC;gBACf,MAAM,CAAC,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC,CAAC;gBACrD,OAAO;YACT,CAAC;YACD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;YACvB,MAAM,QAAQ,GAAG,oBAAoB,IAAI,MAAM,CAAC;YAChD,MAAM,OAAO,GAAG,GAAG,QAAQ,aAAa,kBAAkB,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,kBAAkB,CAAC,KAAK,CAAC,aAAa,kBAAkB,CAAC,QAAQ,CAAC,EAAE,CAAC;YAExJ,YAAY,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YAErC,WAAW;YACX,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE;gBAChC,IAAI,CAAC,QAAQ,EAAE,CAAC;oBACd,MAAM,CAAC,KAAK,EAAE,CAAC;oBACf,MAAM,CACJ,IAAI,KAAK,CACP,mEAAmE,IAAI,CAAC,QAAQ,kBAAkB,CACnG,CACF,CAAC;gBACJ,CAAC;YACH,CAAC,EAAE,eAAe,CAAC,CAAC;YAEpB,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;gBACtB,YAAY,CAAC,SAAS,CAAC,CAAC;gBACxB,IAAI,QAAQ;oBAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;gBAChC,6DAA6D;gBAC7D,sCAAsC;YACxC,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,IAY3C;IACC,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3E,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACtC,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IAC3D,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,IAAI,GAAG,UAAU,WAAW,CAAC;IAC9D,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;IACnD,MAAM,eAAe,GAAG,EAAE,GAAG,IAAI,CAAC;IAElC,OAAO,IAAI,OAAO,CAAyB,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC7D,IAAI,QAAQ,GAAkC,IAAI,CAAC;QACnD,IAAI,QAAQ,GAAG,KAAK,CAAC;QAErB,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;YAC5C,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;gBAC7B,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC;gBAC1C,GAAG,CAAC,GAAG,EAAE,CAAC;gBACV,OAAO;YACT,CAAC;YACD,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;gBAC1B,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,YAAY,EAAE,GAAG,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;gBAC/E,GAAG,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;gBAC9B,OAAO;YACT,CAAC;YACD,IAAI,QAAQ,EAAE,CAAC;gBACb,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,YAAY,EAAE,GAAG,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;gBAC/E,GAAG,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;gBACxB,OAAO;YACT,CAAC;YACD,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,EAAE,kBAAkB,CAAC,CAAC;YACxD,IAAI,GAAG,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;gBAC7B,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,YAAY,EAAE,GAAG,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;gBAC/E,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;gBACrB,OAAO;YACT,CAAC;YACD,IAAI,QAAQ,GAAG,CAAC,CAAC;YACjB,MAAM,MAAM,GAAa,EAAE,CAAC;YAC5B,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;gBAC/B,QAAQ,IAAI,KAAK,CAAC,MAAM,CAAC;gBACzB,IAAI,QAAQ,GAAG,eAAe,EAAE,CAAC;oBAC/B,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,YAAY,EAAE,GAAG,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;oBAC/E,GAAG,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;oBAC7B,GAAG,CAAC,OAAO,EAAE,CAAC;oBACd,OAAO;gBACT,CAAC;gBACD,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACrB,CAAC,CAAC,CAAC;YACH,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE;gBACjB,IAAI,GAAG,CAAC,SAAS;oBAAE,OAAO;gBAC1B,IAAI,IAAwD,CAAC;gBAC7D,IAAI,CAAC;oBACH,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;gBAC5D,CAAC;gBAAC,MAAM,CAAC;oBACP,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,YAAY,EAAE,GAAG,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;oBAC/E,GAAG,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;oBACxB,OAAO;gBACT,CAAC;gBACD,IAAI,IAAI,CAAC,KAAK,KAAK,KAAK,EAAE,CAAC;oBACzB,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,YAAY,EAAE,GAAG,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;oBAC/E,GAAG,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;oBAC1B,OAAO;gBACT,CAAC;gBACD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC7E,MAAM,GAAG,GAA2B,EAAE,CAAC;gBACvC,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;oBAC1B,MAAM,CAAC,GAAI,QAAoC,CAAC,CAAC,CAAC,CAAC;oBACnD,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,EAAE;wBAAE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;gBAC3D,CAAC;gBACD,QAAQ,GAAG,IAAI,CAAC;gBAChB,QAAQ,GAAG,GAAG,CAAC;gBACf,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,GAAG,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;gBACrF,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;gBACtE,UAAU,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,GAAG,CAAC,CAAC;YACxC,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,IAAI,SAAoD,CAAC;QACzD,MAAM,UAAU,GAAG,GAAG,EAAE;YACtB,IAAI,SAAS;gBAAE,YAAY,CAAC,SAAS,CAAC,CAAC;YACvC,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE;gBAC1B,IAAI,CAAC,QAAQ,EAAE,CAAC;oBACd,MAAM,CAAC,KAAK,EAAE,CAAC;oBACf,MAAM,CAAC,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC,CAAC;gBAC1D,CAAC;YACH,CAAC,EAAE,SAAS,CAAC,CAAC;QAChB,CAAC,CAAC;QAEF,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QACzC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;YACtB,IAAI,SAAS;gBAAE,YAAY,CAAC,SAAS,CAAC,CAAC;YACvC,IAAI,QAAQ;gBAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;QAClC,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,WAAW,EAAE,GAAG,EAAE;YACjC,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;YAC9B,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACtC,MAAM,CAAC,KAAK,EAAE,CAAC;gBACf,MAAM,CAAC,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC,CAAC;gBACrD,OAAO;YACT,CAAC;YACD,MAAM,QAAQ,GAAG,oBAAoB,IAAI,CAAC,IAAI,OAAO,CAAC;YAEtD,IAAI,IAAI,CAAC,QAAQ,KAAK,KAAK,EAAE,CAAC;gBAC5B,MAAM,OAAO,GAAG,GAAG,QAAQ,cAAc,kBAAkB,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,UAAU,kBAAkB,CAAC,KAAK,CAAC,aAAa,kBAAkB,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC/J,sCAAsC;gBACtC,OAAO,CAAC,GAAG,CAAC,8DAA8D,CAAC,CAAC;gBAC5E,sCAAsC;gBACtC,OAAO,CAAC,GAAG,CAAC,OAAO,OAAO,IAAI,CAAC,CAAC;gBAChC,WAAW,CAAC,OAAO,CAAC,CAAC;gBACrB,UAAU,EAAE,CAAC;YACf,CAAC;YAED,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;gBACjB,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;qBAC/C,IAAI,CAAC,GAAG,EAAE,CAAC,UAAU,EAAE,CAAC,CAAC,0EAA0E;qBACnG,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE;oBACX,IAAI,SAAS;wBAAE,YAAY,CAAC,SAAS,CAAC,CAAC;oBACvC,MAAM,CAAC,KAAK,EAAE,CAAC;oBACf,MAAM,CAAC,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBACxD,CAAC,CAAC,CAAC;YACP,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAKD;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAAC,IAIjD;IACC,MAAM,SAAS,GAAG,CAAC,GAAG,mBAAmB,CAAC,CAAC;IAC3C,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACjF,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IAC3D,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,IAAI,GAAG,UAAU,kBAAkB,CAAC;IACrE,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;IACnD,MAAM,eAAe,GAAG,EAAE,GAAG,IAAI,CAAC;IAElC,OAAO,IAAI,OAAO,CAAa,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACjD,IAAI,QAAQ,GAAsB,IAAI,CAAC;QACvC,IAAI,QAAQ,GAAG,KAAK,CAAC;QAErB,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;YAC5C,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;gBAC7B,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC;gBAC1C,GAAG,CAAC,GAAG,EAAE,CAAC;gBACV,OAAO;YACT,CAAC;YACD,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;gBAC1B,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,YAAY,EAAE,GAAG,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;gBAC/E,GAAG,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;gBAC9B,OAAO;YACT,CAAC;YACD,IAAI,QAAQ,EAAE,CAAC;gBACb,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,YAAY,EAAE,GAAG,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;gBAC/E,GAAG,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;gBACxB,OAAO;YACT,CAAC;YACD,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,EAAE,kBAAkB,CAAC,CAAC;YACxD,IAAI,GAAG,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;gBAC/B,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,YAAY,EAAE,GAAG,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;gBAC/E,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;gBACrB,OAAO;YACT,CAAC;YACD,IAAI,QAAQ,GAAG,CAAC,CAAC;YACjB,MAAM,MAAM,GAAa,EAAE,CAAC;YAC5B,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;gBAC/B,QAAQ,IAAI,KAAK,CAAC,MAAM,CAAC;gBACzB,IAAI,QAAQ,GAAG,eAAe,EAAE,CAAC;oBAC/B,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,YAAY,EAAE,GAAG,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;oBAC/E,GAAG,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;oBAC7B,GAAG,CAAC,OAAO,EAAE,CAAC;oBACd,OAAO;gBACT,CAAC;gBACD,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACrB,CAAC,CAAC,CAAC;YACH,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE;gBACjB,IAAI,GAAG,CAAC,SAAS;oBAAE,OAAO;gBAC1B,IAAI,IAAyE,CAAC;gBAC9E,IAAI,CAAC;oBACH,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;gBAC5D,CAAC;gBAAC,MAAM,CAAC;oBACP,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,YAAY,EAAE,GAAG,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;oBAC/E,GAAG,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;oBACxB,OAAO;gBACT,CAAC;gBACD,IAAI,IAAI,CAAC,KAAK,KAAK,KAAK,EAAE,CAAC;oBACzB,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,YAAY,EAAE,GAAG,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;oBAC/E,GAAG,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;oBAC1B,OAAO;gBACT,CAAC;gBACD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,IAAI,OAAO,IAAI,CAAC,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC1E,MAAM,GAAG,GAA2B,EAAE,CAAC;gBACvC,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;oBAC1B,MAAM,CAAC,GAAI,QAAoC,CAAC,CAAC,CAAC,CAAC;oBACnD,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,EAAE;wBAAE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;gBAC3D,CAAC;gBACD,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC;oBACvC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAChB,CAAC,CAAC,EAAe,EAAE,CACjB,OAAO,CAAC,KAAK,QAAQ,IAAI,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CACrE;oBACH,CAAC,CAAC,EAAE,CAAC;gBACP,QAAQ,GAAG,IAAI,CAAC;gBAChB,QAAQ,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC;gBAC3B,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,GAAG,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;gBACrF,GAAG,CAAC,GAAG,CACL,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CACrF,CAAC;gBACF,UAAU,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,GAAG,CAAC,CAAC;YACxC,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,IAAI,SAAoD,CAAC;QACzD,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QACzC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;YACtB,IAAI,SAAS;gBAAE,YAAY,CAAC,SAAS,CAAC,CAAC;YACvC,IAAI,QAAQ;gBAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;QAClC,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,WAAW,EAAE,GAAG,EAAE;YACjC,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;YAC9B,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACtC,MAAM,CAAC,KAAK,EAAE,CAAC;gBACf,MAAM,CAAC,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC,CAAC;gBACrD,OAAO;YACT,CAAC;YACD,MAAM,QAAQ,GAAG,oBAAoB,IAAI,CAAC,IAAI,SAAS,CAAC;YACxD,MAAM,EAAE,GAAG,IAAI,eAAe,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;YACpD,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC;gBAAE,EAAE,CAAC,GAAG,CAAC,KAAK,EAAE,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;YACnE,MAAM,OAAO,GAAG,GAAG,QAAQ,IAAI,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC;YAC/C,sCAAsC;YACtC,OAAO,CAAC,GAAG,CAAC,iEAAiE,CAAC,CAAC;YAC/E,sCAAsC;YACtC,OAAO,CAAC,GAAG,CAAC,OAAO,OAAO,IAAI,CAAC,CAAC;YAChC,sCAAsC;YACtC,OAAO,CAAC,GAAG,CAAC,iEAAiE,CAAC,CAAC;YAC/E,WAAW,CAAC,OAAO,CAAC,CAAC;YACrB,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE;gBAC1B,IAAI,CAAC,QAAQ,EAAE,CAAC;oBACd,MAAM,CAAC,KAAK,EAAE,CAAC;oBACf,MAAM,CAAC,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC,CAAC;gBAC1D,CAAC;YACH,CAAC,EAAE,SAAS,CAAC,CAAC;QAChB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,WAAW,CAAC,MAAc;IACjC,qEAAqE;IACrE,uEAAuE;IACvE,0DAA0D;IAC1D,IAAI,KAAK,GAAG,GAAG,CAAC;IAChB,IAAI,CAAC;QACH,MAAM,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC;QAC1B,KAAK,GAAG,GAAG,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;IACrC,CAAC;IAAC,MAAM,CAAC;QACP,uBAAuB;IACzB,CAAC;IACD,OAAO;QACL,6BAA6B,EAAE,KAAK;QACpC,8BAA8B,EAAE,eAAe;QAC/C,8BAA8B,EAAE,cAAc;QAC9C,wBAAwB,EAAE,KAAK;QAC/B,MAAM,EAAE,QAAQ;KACjB,CAAC;AACJ,CAAC;AAED,SAAS,YAAY,CAAC,QAAgB,EAAE,OAAe;IACrD,sCAAsC;IACtC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,sCAAsC;IACtC,OAAO,CAAC,GAAG,CAAC,iDAAiD,QAAQ,OAAO,CAAC,CAAC;IAC9E,sCAAsC;IACtC,OAAO,CAAC,GAAG,CAAC,OAAO,OAAO,EAAE,CAAC,CAAC;IAC9B,sCAAsC;IACtC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,sCAAsC;IACtC,OAAO,CAAC,GAAG,CAAC,8DAA8D,CAAC,CAAC;IAC5E,sCAAsC;IACtC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,uEAAuE;IACvE,wEAAwE;IACxE,mBAAmB;IACnB,MAAM,MAAM,GACV,OAAO,CAAC,QAAQ,KAAK,QAAQ;QAC3B,CAAC,CAAC,MAAM;QACR,CAAC,CAAC,OAAO,CAAC,QAAQ,KAAK,OAAO;YAC5B,CAAC,CAAC,KAAK;YACP,CAAC,CAAC,UAAU,CAAC;IACnB,MAAM,IAAI,GACR,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IAC1E,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,IAAI,EAAE;YAChC,KAAK,EAAE,QAAQ;YACf,QAAQ,EAAE,IAAI;SACf,CAAC,CAAC;QACH,KAAK,CAAC,KAAK,EAAE,CAAC;QACd,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;YACrB,yDAAyD;QAC3D,CAAC,CAAC,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACP,YAAY;IACd,CAAC;AACH,CAAC"}
|
|
1
|
+
{"version":3,"file":"keys-browser-flow.js","sourceRoot":"","sources":["../src/keys-browser-flow.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `crosscheck keys manage` — open a live key-management session in the browser.
|
|
3
|
+
*
|
|
4
|
+
* Runs in the foreground on purpose. The session is a capability over your
|
|
5
|
+
* local key store, and a capability should be visible while it exists: the
|
|
6
|
+
* terminal shows what's happening, and closing it closes the session. A
|
|
7
|
+
* background daemon quietly holding this open would be the wrong shape.
|
|
8
|
+
*/
|
|
9
|
+
import { startKeysSession } from "./keys-session.js";
|
|
10
|
+
import { openBrowser } from "./open-browser.js";
|
|
11
|
+
function log(s = "") {
|
|
12
|
+
// eslint-disable-next-line no-console
|
|
13
|
+
console.log(s);
|
|
14
|
+
}
|
|
15
|
+
export async function runKeysManage(opts = {}) {
|
|
16
|
+
const session = await startKeysSession({
|
|
17
|
+
onEvent: (msg) => log(` · ${msg}`),
|
|
18
|
+
});
|
|
19
|
+
log("");
|
|
20
|
+
log(" Key management session open on this machine.");
|
|
21
|
+
log("");
|
|
22
|
+
log(` ${session.url}`);
|
|
23
|
+
log("");
|
|
24
|
+
log(" Your keys stay here — the browser talks straight to 127.0.0.1, and");
|
|
25
|
+
log(" the session link is never sent to Crosscheck.");
|
|
26
|
+
log("");
|
|
27
|
+
log(" Ends after 10 minutes idle. Ctrl-C to end it now.");
|
|
28
|
+
log("");
|
|
29
|
+
if (opts.open !== false)
|
|
30
|
+
openBrowser(session.url);
|
|
31
|
+
// Ctrl-C should end the session cleanly rather than orphan the listener.
|
|
32
|
+
const onSigint = () => session.close("ended");
|
|
33
|
+
process.once("SIGINT", onSigint);
|
|
34
|
+
const reason = await session.done;
|
|
35
|
+
process.off("SIGINT", onSigint);
|
|
36
|
+
log("");
|
|
37
|
+
log(reason === "idle"
|
|
38
|
+
? " Session closed (10 minutes idle)."
|
|
39
|
+
: reason === "expired"
|
|
40
|
+
? " Session closed (1 hour limit)."
|
|
41
|
+
: " Session closed.");
|
|
42
|
+
log(" Run `crosscheck keys manage` again whenever you need it.");
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=keys-manage-cli.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keys-manage-cli.js","sourceRoot":"","sources":["../src/keys-manage-cli.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,SAAS,GAAG,CAAC,CAAC,GAAG,EAAE;IACjB,sCAAsC;IACtC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AACjB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAA2B,EAAE;IAC/D,MAAM,OAAO,GAAG,MAAM,gBAAgB,CAAC;QACrC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,GAAG,EAAE,CAAC;KACpC,CAAC,CAAC;IAEH,GAAG,CAAC,EAAE,CAAC,CAAC;IACR,GAAG,CAAC,gDAAgD,CAAC,CAAC;IACtD,GAAG,CAAC,EAAE,CAAC,CAAC;IACR,GAAG,CAAC,KAAK,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IACxB,GAAG,CAAC,EAAE,CAAC,CAAC;IACR,GAAG,CAAC,sEAAsE,CAAC,CAAC;IAC5E,GAAG,CAAC,iDAAiD,CAAC,CAAC;IACvD,GAAG,CAAC,EAAE,CAAC,CAAC;IACR,GAAG,CAAC,qDAAqD,CAAC,CAAC;IAC3D,GAAG,CAAC,EAAE,CAAC,CAAC;IAER,IAAI,IAAI,CAAC,IAAI,KAAK,KAAK;QAAE,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAElD,yEAAyE;IACzE,MAAM,QAAQ,GAAG,GAAS,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACpD,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAEjC,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC;IAClC,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAEhC,GAAG,CAAC,EAAE,CAAC,CAAC;IACR,GAAG,CACD,MAAM,KAAK,MAAM;QACf,CAAC,CAAC,qCAAqC;QACvC,CAAC,CAAC,MAAM,KAAK,SAAS;YACpB,CAAC,CAAC,kCAAkC;YACpC,CAAC,CAAC,mBAAmB,CAC1B,CAAC;IACF,GAAG,CAAC,4DAA4D,CAAC,CAAC;AACpE,CAAC"}
|
|
@@ -0,0 +1,314 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A live, authenticated key-management session on this machine.
|
|
3
|
+
*
|
|
4
|
+
* WHAT THIS CHANGES. Key management used to be one-shot: `crosscheck keys`
|
|
5
|
+
* opened a page, the page POSTed one batch, the CLI applied it and exited.
|
|
6
|
+
* You could not sit in your account page and manage keys, and you could not
|
|
7
|
+
* see what a change did. This turns that into a session the browser can drive
|
|
8
|
+
* for as long as it's open — which is what makes /account a place you return
|
|
9
|
+
* to rather than a form you submit.
|
|
10
|
+
*
|
|
11
|
+
* WHAT IT DOES NOT CHANGE: keys still never reach our servers. The browser
|
|
12
|
+
* talks straight to 127.0.0.1. Everything below exists to make that channel
|
|
13
|
+
* safe to leave open for ten minutes instead of ten seconds.
|
|
14
|
+
*
|
|
15
|
+
* THE TOKEN NEVER TOUCHES OUR SERVER. It is delivered to the page in the URL
|
|
16
|
+
* *fragment* (`#xc=port.token`), and fragments are not sent in HTTP requests.
|
|
17
|
+
* So crosscheckagent.com — and its logs, and its proxies, and anyone who ever
|
|
18
|
+
* breaches it — cannot obtain the capability to manage keys on your machine.
|
|
19
|
+
* This is deliberately stricter than the design called for: registering the
|
|
20
|
+
* token server-side would have enabled a nicer "click a button in the browser
|
|
21
|
+
* first" flow, at the cost of making our server able to reach into your key
|
|
22
|
+
* store. That trade wasn't worth making, so the flow starts in the terminal.
|
|
23
|
+
*
|
|
24
|
+
* Defence in depth, each layer assuming the others failed:
|
|
25
|
+
* - binds 127.0.0.1 only, never 0.0.0.0 — nothing on the LAN can see it
|
|
26
|
+
* - every request needs the bearer token, compared in constant time
|
|
27
|
+
* - CORS locked to our origin, so a hostile page can't read responses
|
|
28
|
+
* - Private Network Access preflight answered explicitly (see below)
|
|
29
|
+
* - idle TTL of 10 minutes, hard cap of 60, so a forgotten tab isn't
|
|
30
|
+
* an indefinitely open door
|
|
31
|
+
* - responses carry the last 4 characters of a key and never more, so a
|
|
32
|
+
* bug in this file cannot turn into a key disclosure
|
|
33
|
+
*/
|
|
34
|
+
import crypto from "node:crypto";
|
|
35
|
+
import http from "node:http";
|
|
36
|
+
import os from "node:os";
|
|
37
|
+
import { getSecret, setSecret, deleteSecret, listSecrets } from "./keychain.js";
|
|
38
|
+
import { KEY_PANEL } from "./keys-setup.js";
|
|
39
|
+
import { validateKey, formatWarning, CANONICAL_PROVIDERS } from "./key-format.js";
|
|
40
|
+
import { verifyKey, canVerify } from "./key-verify.js";
|
|
41
|
+
import { suffix4 } from "./key-status.js";
|
|
42
|
+
import { SERVER_URL } from "./config.js";
|
|
43
|
+
/** Idle timeout. Every authenticated request pushes it out. */
|
|
44
|
+
export const IDLE_TTL_MS = 10 * 60 * 1000;
|
|
45
|
+
/** Absolute ceiling, regardless of activity. A session left open all day is
|
|
46
|
+
* not a session, it's a hole. */
|
|
47
|
+
export const MAX_SESSION_MS = 60 * 60 * 1000;
|
|
48
|
+
const MAX_BODY_BYTES = 8192;
|
|
49
|
+
/**
|
|
50
|
+
* Every provider this session can act on.
|
|
51
|
+
*
|
|
52
|
+
* CANONICAL_PROVIDERS, not KEY_PANEL. KEY_PANEL is the six-provider DEFAULT
|
|
53
|
+
* panel — what a fresh install is prompted to set up — but `keys add` accepts
|
|
54
|
+
* all nine, so people genuinely have mistral/groq/deepseek keys stored. If
|
|
55
|
+
* this listed only the panel, the browser UI would be unable to see or REMOVE
|
|
56
|
+
* a key that exists, which is the worst possible gap in a key manager: the
|
|
57
|
+
* page says you have no mistral key while mistral calls keep being made.
|
|
58
|
+
*/
|
|
59
|
+
const MANAGEABLE = CANONICAL_PROVIDERS.map((key) => ({
|
|
60
|
+
key,
|
|
61
|
+
label: KEY_PANEL.find((p) => p.key === key)?.label ?? key,
|
|
62
|
+
}));
|
|
63
|
+
export function isManageableProvider(name) {
|
|
64
|
+
return MANAGEABLE.some((p) => p.key === name);
|
|
65
|
+
}
|
|
66
|
+
export async function readProviderStates(memo) {
|
|
67
|
+
const out = [];
|
|
68
|
+
for (const p of MANAGEABLE) {
|
|
69
|
+
let secret = null;
|
|
70
|
+
try {
|
|
71
|
+
secret = await getSecret(`key:${p.key}`);
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
// Unreadable store (locked keychain, 1Password signed out) is not the
|
|
75
|
+
// same as "no key" — say nothing rather than something false.
|
|
76
|
+
continue;
|
|
77
|
+
}
|
|
78
|
+
const m = memo.get(p.key);
|
|
79
|
+
out.push({
|
|
80
|
+
provider: p.key,
|
|
81
|
+
label: p.label,
|
|
82
|
+
present: Boolean(secret),
|
|
83
|
+
...(secret ? { suffix: suffix4(secret) } : {}),
|
|
84
|
+
...(m ? { lastResult: m.result, lastCheckedAt: m.at } : {}),
|
|
85
|
+
canVerify: canVerify(p.key),
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
return out;
|
|
89
|
+
}
|
|
90
|
+
/** The origin the page is served from. Everything else is refused. */
|
|
91
|
+
function allowedOrigin() {
|
|
92
|
+
try {
|
|
93
|
+
const u = new URL(SERVER_URL);
|
|
94
|
+
return `${u.protocol}//${u.host}`;
|
|
95
|
+
}
|
|
96
|
+
catch {
|
|
97
|
+
return "https://crosscheckagent.com";
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* CORS, plus the header that stops Chromium blocking this outright.
|
|
102
|
+
*
|
|
103
|
+
* Chromium's Private Network Access treats a request from a public HTTPS page
|
|
104
|
+
* to 127.0.0.1 as a privilege escalation and sends a preflight carrying
|
|
105
|
+
* `Access-Control-Request-Private-Network: true`. If the listener doesn't
|
|
106
|
+
* answer `Access-Control-Allow-Private-Network: true`, the request is blocked
|
|
107
|
+
* with no visible error — the fetch just fails, and the page has no way to
|
|
108
|
+
* tell that apart from "the CLI isn't running". Cheap to send, and it is the
|
|
109
|
+
* difference between this feature working and mysteriously not.
|
|
110
|
+
*/
|
|
111
|
+
export function sessionCorsHeaders(origin = allowedOrigin()) {
|
|
112
|
+
return {
|
|
113
|
+
"access-control-allow-origin": origin,
|
|
114
|
+
"access-control-allow-methods": "GET, PUT, POST, DELETE, OPTIONS",
|
|
115
|
+
"access-control-allow-headers": "content-type, authorization",
|
|
116
|
+
"access-control-allow-private-network": "true",
|
|
117
|
+
"access-control-max-age": "600",
|
|
118
|
+
vary: "origin",
|
|
119
|
+
// A local listener's answers are about right now, and a cached one would
|
|
120
|
+
// show a key the user has already removed.
|
|
121
|
+
"cache-control": "no-store",
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
export function tokensMatch(expected, provided) {
|
|
125
|
+
if (!provided)
|
|
126
|
+
return false;
|
|
127
|
+
const a = Buffer.from(expected);
|
|
128
|
+
const b = Buffer.from(provided);
|
|
129
|
+
if (a.length !== b.length)
|
|
130
|
+
return false;
|
|
131
|
+
return crypto.timingSafeEqual(a, b);
|
|
132
|
+
}
|
|
133
|
+
export function bearerFrom(header) {
|
|
134
|
+
if (!header)
|
|
135
|
+
return undefined;
|
|
136
|
+
const m = /^Bearer\s+(.+)$/i.exec(header.trim());
|
|
137
|
+
return m?.[1];
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Start the session server. Resolves once it's listening; the caller decides
|
|
141
|
+
* whether to open a browser and how to report progress.
|
|
142
|
+
*/
|
|
143
|
+
export async function startKeysSession(opts = {}) {
|
|
144
|
+
const token = crypto.randomBytes(32).toString("base64url");
|
|
145
|
+
const origin = allowedOrigin();
|
|
146
|
+
const memo = new Map();
|
|
147
|
+
const startedAt = Date.now();
|
|
148
|
+
const machine = `${os.hostname()} (${process.platform})`;
|
|
149
|
+
let idleTimer = null;
|
|
150
|
+
let resolveDone;
|
|
151
|
+
const done = new Promise((r) => {
|
|
152
|
+
resolveDone = r;
|
|
153
|
+
});
|
|
154
|
+
const server = http.createServer((req, res) => void handle(req, res));
|
|
155
|
+
function shutdown(reason) {
|
|
156
|
+
if (idleTimer)
|
|
157
|
+
clearTimeout(idleTimer);
|
|
158
|
+
clearTimeout(hardTimer);
|
|
159
|
+
server.close();
|
|
160
|
+
resolveDone(reason);
|
|
161
|
+
}
|
|
162
|
+
const hardTimer = setTimeout(() => shutdown("expired"), MAX_SESSION_MS);
|
|
163
|
+
hardTimer.unref?.();
|
|
164
|
+
function touch() {
|
|
165
|
+
if (idleTimer)
|
|
166
|
+
clearTimeout(idleTimer);
|
|
167
|
+
idleTimer = setTimeout(() => shutdown("idle"), IDLE_TTL_MS);
|
|
168
|
+
idleTimer.unref?.();
|
|
169
|
+
}
|
|
170
|
+
touch();
|
|
171
|
+
function send(res, status, body) {
|
|
172
|
+
res.writeHead(status, { "content-type": "application/json", ...sessionCorsHeaders(origin) });
|
|
173
|
+
res.end(JSON.stringify(body));
|
|
174
|
+
}
|
|
175
|
+
async function readBody(req) {
|
|
176
|
+
const chunks = [];
|
|
177
|
+
let size = 0;
|
|
178
|
+
for await (const chunk of req) {
|
|
179
|
+
size += chunk.length;
|
|
180
|
+
if (size > MAX_BODY_BYTES)
|
|
181
|
+
throw new Error("payload too large");
|
|
182
|
+
chunks.push(chunk);
|
|
183
|
+
}
|
|
184
|
+
if (chunks.length === 0)
|
|
185
|
+
return {};
|
|
186
|
+
return JSON.parse(Buffer.concat(chunks).toString("utf8"));
|
|
187
|
+
}
|
|
188
|
+
async function handle(req, res) {
|
|
189
|
+
// Preflight is answered before auth: a preflight carries no credentials
|
|
190
|
+
// by definition, and refusing it just makes the real request invisible.
|
|
191
|
+
if (req.method === "OPTIONS") {
|
|
192
|
+
res.writeHead(204, sessionCorsHeaders(origin));
|
|
193
|
+
res.end();
|
|
194
|
+
return;
|
|
195
|
+
}
|
|
196
|
+
if (!tokensMatch(token, bearerFrom(req.headers.authorization))) {
|
|
197
|
+
// Deliberately terse. A detailed auth error is a probing aid.
|
|
198
|
+
send(res, 401, { ok: false, error: "unauthorized" });
|
|
199
|
+
return;
|
|
200
|
+
}
|
|
201
|
+
touch();
|
|
202
|
+
const url = new URL(req.url ?? "/", "http://127.0.0.1");
|
|
203
|
+
const parts = url.pathname.split("/").filter(Boolean);
|
|
204
|
+
try {
|
|
205
|
+
// GET /session — everything the page needs to render itself.
|
|
206
|
+
if (req.method === "GET" && parts[0] === "session" && parts.length === 1) {
|
|
207
|
+
send(res, 200, {
|
|
208
|
+
ok: true,
|
|
209
|
+
machine,
|
|
210
|
+
startedAt: new Date(startedAt).toISOString(),
|
|
211
|
+
expiresAt: new Date(startedAt + MAX_SESSION_MS).toISOString(),
|
|
212
|
+
providers: await readProviderStates(memo),
|
|
213
|
+
});
|
|
214
|
+
return;
|
|
215
|
+
}
|
|
216
|
+
// POST /end — the user pressed "End session".
|
|
217
|
+
if (req.method === "POST" && parts[0] === "end") {
|
|
218
|
+
send(res, 200, { ok: true });
|
|
219
|
+
setTimeout(() => shutdown("ended"), 50);
|
|
220
|
+
return;
|
|
221
|
+
}
|
|
222
|
+
if (parts[0] === "provider" && parts[1]) {
|
|
223
|
+
const provider = parts[1];
|
|
224
|
+
const known = isManageableProvider(provider);
|
|
225
|
+
if (!known) {
|
|
226
|
+
// The provider list is pinned on both sides, so a name we don't
|
|
227
|
+
// recognise means a tampered request, not a new provider.
|
|
228
|
+
send(res, 400, { ok: false, error: "unknown_provider" });
|
|
229
|
+
return;
|
|
230
|
+
}
|
|
231
|
+
// PUT /provider/<id> — add or replace.
|
|
232
|
+
if (req.method === "PUT" && parts.length === 2) {
|
|
233
|
+
const body = (await readBody(req));
|
|
234
|
+
const value = typeof body.value === "string" ? body.value.trim() : "";
|
|
235
|
+
const problem = validateKey(provider, value);
|
|
236
|
+
if (problem) {
|
|
237
|
+
send(res, 400, { ok: false, error: "invalid_key_format", detail: problem });
|
|
238
|
+
return;
|
|
239
|
+
}
|
|
240
|
+
const before = await getSecret(`key:${provider}`).catch(() => null);
|
|
241
|
+
await setSecret(`key:${provider}`, value);
|
|
242
|
+
memo.delete(provider); // a new key makes the old verdict meaningless
|
|
243
|
+
opts.onEvent?.(`${before ? "replaced" : "added"} ${provider} key (…${suffix4(value) ?? "????"})`);
|
|
244
|
+
send(res, 200, {
|
|
245
|
+
ok: true,
|
|
246
|
+
// Both suffixes, so the page can show old → new. Seeing the
|
|
247
|
+
// change is what tells you it actually took.
|
|
248
|
+
previousSuffix: before ? suffix4(before) : null,
|
|
249
|
+
suffix: suffix4(value),
|
|
250
|
+
// Non-blocking: providers change key formats, and we must never
|
|
251
|
+
// refuse a key the user says is right.
|
|
252
|
+
warning: formatWarning(provider, value),
|
|
253
|
+
});
|
|
254
|
+
return;
|
|
255
|
+
}
|
|
256
|
+
// DELETE /provider/<id> — remove.
|
|
257
|
+
if (req.method === "DELETE" && parts.length === 2) {
|
|
258
|
+
const removed = await deleteSecret(`key:${provider}`);
|
|
259
|
+
memo.delete(provider);
|
|
260
|
+
if (removed)
|
|
261
|
+
opts.onEvent?.(`removed ${provider} key`);
|
|
262
|
+
send(res, 200, { ok: true, removed });
|
|
263
|
+
return;
|
|
264
|
+
}
|
|
265
|
+
// POST /provider/<id>/verify — ask the provider, for free.
|
|
266
|
+
if (req.method === "POST" && parts[2] === "verify" && parts.length === 3) {
|
|
267
|
+
const secret = await getSecret(`key:${provider}`).catch(() => null);
|
|
268
|
+
if (!secret) {
|
|
269
|
+
send(res, 400, { ok: false, error: "no_key" });
|
|
270
|
+
return;
|
|
271
|
+
}
|
|
272
|
+
const outcome = await verifyKey(provider, secret);
|
|
273
|
+
const at = new Date().toISOString();
|
|
274
|
+
memo.set(provider, { result: outcome.result, at });
|
|
275
|
+
opts.onEvent?.(`verified ${provider}: ${outcome.result}`);
|
|
276
|
+
send(res, 200, { ok: true, result: outcome.result, detail: outcome.detail, at });
|
|
277
|
+
return;
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
send(res, 404, { ok: false, error: "not_found" });
|
|
281
|
+
}
|
|
282
|
+
catch (err) {
|
|
283
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
284
|
+
// Never echo the request body back — it may hold a key.
|
|
285
|
+
send(res, 400, { ok: false, error: "bad_request", detail: msg.slice(0, 200) });
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
await new Promise((resolve, reject) => {
|
|
289
|
+
server.once("error", reject);
|
|
290
|
+
server.listen(0, "127.0.0.1", resolve);
|
|
291
|
+
});
|
|
292
|
+
const addr = server.address();
|
|
293
|
+
if (!addr || typeof addr === "string") {
|
|
294
|
+
server.close();
|
|
295
|
+
throw new Error("Could not determine the local port.");
|
|
296
|
+
}
|
|
297
|
+
const port = addr.port;
|
|
298
|
+
return {
|
|
299
|
+
port,
|
|
300
|
+
token,
|
|
301
|
+
// The token rides in the FRAGMENT. Never the query string: a query string
|
|
302
|
+
// reaches our server, its logs, and the Referer header of anything the
|
|
303
|
+
// page loads.
|
|
304
|
+
url: `${SERVER_URL}/account/providers#xc=${port}.${token}`,
|
|
305
|
+
done,
|
|
306
|
+
close: (reason = "ended") => shutdown(reason),
|
|
307
|
+
};
|
|
308
|
+
}
|
|
309
|
+
/** Providers currently holding a key — used for the terminal summary. */
|
|
310
|
+
export async function configuredProviders() {
|
|
311
|
+
const items = await listSecrets();
|
|
312
|
+
return items.filter((i) => i.account.startsWith("key:")).map((i) => i.account.slice(4));
|
|
313
|
+
}
|
|
314
|
+
//# sourceMappingURL=keys-session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keys-session.js","sourceRoot":"","sources":["../src/keys-session.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAEH,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AAEzB,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAChF,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAClF,OAAO,EAAE,SAAS,EAAE,SAAS,EAAqB,MAAM,iBAAiB,CAAC;AAC1E,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,+DAA+D;AAC/D,MAAM,CAAC,MAAM,WAAW,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAC1C;kCACkC;AAClC,MAAM,CAAC,MAAM,cAAc,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAC7C,MAAM,cAAc,GAAG,IAAI,CAAC;AAiB5B;;;;;;;;;GASG;AACH,MAAM,UAAU,GAA0C,mBAAmB,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IAC1F,GAAG;IACH,KAAK,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,EAAE,KAAK,IAAI,GAAG;CAC1D,CAAC,CAAC,CAAC;AAEJ,MAAM,UAAU,oBAAoB,CAAC,IAAY;IAC/C,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,IAAI,CAAC,CAAC;AAChD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,IAAgB;IACvD,MAAM,GAAG,GAAoB,EAAE,CAAC;IAChC,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;QAC3B,IAAI,MAAM,GAAkB,IAAI,CAAC;QACjC,IAAI,CAAC;YACH,MAAM,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;QAC3C,CAAC;QAAC,MAAM,CAAC;YACP,sEAAsE;YACtE,8DAA8D;YAC9D,SAAS;QACX,CAAC;QACD,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QAC1B,GAAG,CAAC,IAAI,CAAC;YACP,QAAQ,EAAE,CAAC,CAAC,GAAG;YACf,KAAK,EAAE,CAAC,CAAC,KAAK;YACd,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC;YACxB,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC9C,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,aAAa,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC3D,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC;SAC5B,CAAC,CAAC;IACL,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,sEAAsE;AACtE,SAAS,aAAa;IACpB,IAAI,CAAC;QACH,MAAM,CAAC,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC;QAC9B,OAAO,GAAG,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;IACpC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,6BAA6B,CAAC;IACvC,CAAC;AACH,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,kBAAkB,CAAC,MAAM,GAAG,aAAa,EAAE;IACzD,OAAO;QACL,6BAA6B,EAAE,MAAM;QACrC,8BAA8B,EAAE,iCAAiC;QACjE,8BAA8B,EAAE,6BAA6B;QAC7D,sCAAsC,EAAE,MAAM;QAC9C,wBAAwB,EAAE,KAAK;QAC/B,IAAI,EAAE,QAAQ;QACd,yEAAyE;QACzE,2CAA2C;QAC3C,eAAe,EAAE,UAAU;KAC5B,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,QAAgB,EAAE,QAA4B;IACxE,IAAI,CAAC,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC5B,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAChC,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAChC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IACxC,OAAO,MAAM,CAAC,eAAe,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AACtC,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,MAA0B;IACnD,IAAI,CAAC,MAAM;QAAE,OAAO,SAAS,CAAC;IAC9B,MAAM,CAAC,GAAG,kBAAkB,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;IACjD,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AAChB,CAAC;AAWD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,OAA4C,EAAE;IAE9C,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IAC3D,MAAM,MAAM,GAAG,aAAa,EAAE,CAAC;IAC/B,MAAM,IAAI,GAAe,IAAI,GAAG,EAAE,CAAC;IACnC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC7B,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC,QAAQ,EAAE,KAAK,OAAO,CAAC,QAAQ,GAAG,CAAC;IAEzD,IAAI,SAAS,GAA0B,IAAI,CAAC;IAC5C,IAAI,WAAsD,CAAC;IAC3D,MAAM,IAAI,GAAG,IAAI,OAAO,CAA+B,CAAC,CAAC,EAAE,EAAE;QAC3D,WAAW,GAAG,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,KAAK,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;IAEtE,SAAS,QAAQ,CAAC,MAAoC;QACpD,IAAI,SAAS;YAAE,YAAY,CAAC,SAAS,CAAC,CAAC;QACvC,YAAY,CAAC,SAAS,CAAC,CAAC;QACxB,MAAM,CAAC,KAAK,EAAE,CAAC;QACf,WAAW,CAAC,MAAM,CAAC,CAAC;IACtB,CAAC;IAED,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,cAAc,CAAC,CAAC;IACxE,SAAS,CAAC,KAAK,EAAE,EAAE,CAAC;IAEpB,SAAS,KAAK;QACZ,IAAI,SAAS;YAAE,YAAY,CAAC,SAAS,CAAC,CAAC;QACvC,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC,CAAC;QAC5D,SAAS,CAAC,KAAK,EAAE,EAAE,CAAC;IACtB,CAAC;IACD,KAAK,EAAE,CAAC;IAER,SAAS,IAAI,CAAC,GAAwB,EAAE,MAAc,EAAE,IAAa;QACnE,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,GAAG,kBAAkB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAC7F,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;IAChC,CAAC;IAED,KAAK,UAAU,QAAQ,CAAC,GAAyB;QAC/C,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,IAAI,IAAI,GAAG,CAAC,CAAC;QACb,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,GAAG,EAAE,CAAC;YAC9B,IAAI,IAAK,KAAgB,CAAC,MAAM,CAAC;YACjC,IAAI,IAAI,GAAG,cAAc;gBAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;YAChE,MAAM,CAAC,IAAI,CAAC,KAAe,CAAC,CAAC;QAC/B,CAAC;QACD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QACnC,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;IAC5D,CAAC;IAED,KAAK,UAAU,MAAM,CAAC,GAAyB,EAAE,GAAwB;QACvE,wEAAwE;QACxE,wEAAwE;QACxE,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAC7B,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC;YAC/C,GAAG,CAAC,GAAG,EAAE,CAAC;YACV,OAAO;QACT,CAAC;QAED,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC;YAC/D,8DAA8D;YAC9D,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC,CAAC;YACrD,OAAO;QACT,CAAC;QACD,KAAK,EAAE,CAAC;QAER,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,EAAE,kBAAkB,CAAC,CAAC;QACxD,MAAM,KAAK,GAAG,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAEtD,IAAI,CAAC;YACH,6DAA6D;YAC7D,IAAI,GAAG,CAAC,MAAM,KAAK,KAAK,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,SAAS,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACzE,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE;oBACb,EAAE,EAAE,IAAI;oBACR,OAAO;oBACP,SAAS,EAAE,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE;oBAC5C,SAAS,EAAE,IAAI,IAAI,CAAC,SAAS,GAAG,cAAc,CAAC,CAAC,WAAW,EAAE;oBAC7D,SAAS,EAAE,MAAM,kBAAkB,CAAC,IAAI,CAAC;iBAC1C,CAAC,CAAC;gBACH,OAAO;YACT,CAAC;YAED,8CAA8C;YAC9C,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,KAAK,EAAE,CAAC;gBAChD,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;gBAC7B,UAAU,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;gBACxC,OAAO;YACT,CAAC;YAED,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,UAAU,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;gBACxC,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;gBAC1B,MAAM,KAAK,GAAG,oBAAoB,CAAC,QAAQ,CAAC,CAAC;gBAC7C,IAAI,CAAC,KAAK,EAAE,CAAC;oBACX,gEAAgE;oBAChE,0DAA0D;oBAC1D,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,kBAAkB,EAAE,CAAC,CAAC;oBACzD,OAAO;gBACT,CAAC;gBAED,uCAAuC;gBACvC,IAAI,GAAG,CAAC,MAAM,KAAK,KAAK,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBAC/C,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,GAAG,CAAC,CAAwB,CAAC;oBAC1D,MAAM,KAAK,GAAG,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBACtE,MAAM,OAAO,GAAG,WAAW,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;oBAC7C,IAAI,OAAO,EAAE,CAAC;wBACZ,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,oBAAoB,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;wBAC5E,OAAO;oBACT,CAAC;oBACD,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,OAAO,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;oBACpE,MAAM,SAAS,CAAC,OAAO,QAAQ,EAAE,EAAE,KAAK,CAAC,CAAC;oBAC1C,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,8CAA8C;oBACrE,IAAI,CAAC,OAAO,EAAE,CACZ,GAAG,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,IAAI,QAAQ,UAAU,OAAO,CAAC,KAAK,CAAC,IAAI,MAAM,GAAG,CAClF,CAAC;oBACF,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE;wBACb,EAAE,EAAE,IAAI;wBACR,4DAA4D;wBAC5D,6CAA6C;wBAC7C,cAAc,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI;wBAC/C,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC;wBACtB,gEAAgE;wBAChE,uCAAuC;wBACvC,OAAO,EAAE,aAAa,CAAC,QAAQ,EAAE,KAAK,CAAC;qBACxC,CAAC,CAAC;oBACH,OAAO;gBACT,CAAC;gBAED,kCAAkC;gBAClC,IAAI,GAAG,CAAC,MAAM,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBAClD,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,OAAO,QAAQ,EAAE,CAAC,CAAC;oBACtD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;oBACtB,IAAI,OAAO;wBAAE,IAAI,CAAC,OAAO,EAAE,CAAC,WAAW,QAAQ,MAAM,CAAC,CAAC;oBACvD,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;oBACtC,OAAO;gBACT,CAAC;gBAED,2DAA2D;gBAC3D,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBACzE,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,OAAO,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;oBACpE,IAAI,CAAC,MAAM,EAAE,CAAC;wBACZ,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;wBAC/C,OAAO;oBACT,CAAC;oBACD,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;oBAClD,MAAM,EAAE,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;oBACpC,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC;oBACnD,IAAI,CAAC,OAAO,EAAE,CAAC,YAAY,QAAQ,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;oBAC1D,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC;oBACjF,OAAO;gBACT,CAAC;YACH,CAAC;YAED,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC;QACpD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC7D,wDAAwD;YACxD,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;QACjF,CAAC;IACH,CAAC;IAED,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC1C,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC7B,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;IAC9B,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QACtC,MAAM,CAAC,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;IACzD,CAAC;IACD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;IAEvB,OAAO;QACL,IAAI;QACJ,KAAK;QACL,0EAA0E;QAC1E,uEAAuE;QACvE,cAAc;QACd,GAAG,EAAE,GAAG,UAAU,yBAAyB,IAAI,IAAI,KAAK,EAAE;QAC1D,IAAI;QACJ,KAAK,EAAE,CAAC,MAAM,GAAG,OAAO,EAAE,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC;KAC9C,CAAC;AACJ,CAAC;AAED,yEAAyE;AACzE,MAAM,CAAC,KAAK,UAAU,mBAAmB;IACvC,MAAM,KAAK,GAAG,MAAM,WAAW,EAAE,CAAC;IAClC,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AAC1F,CAAC"}
|