@microwiseai/snapshot 0.6.0 → 0.8.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/dist/commands/current.d.ts +5 -1
- package/dist/commands/current.d.ts.map +1 -1
- package/dist/commands/current.js +89 -2
- package/dist/commands/current.js.map +1 -1
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +46 -0
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/install.d.ts +41 -0
- package/dist/commands/install.d.ts.map +1 -1
- package/dist/commands/install.js +328 -10
- package/dist/commands/install.js.map +1 -1
- package/dist/commands/publish.d.ts.map +1 -1
- package/dist/commands/publish.js +44 -24
- package/dist/commands/publish.js.map +1 -1
- package/dist/index.js +5 -2
- package/dist/index.js.map +1 -1
- package/dist/lib/access-sync.d.ts.map +1 -1
- package/dist/lib/access-sync.js +4 -0
- package/dist/lib/access-sync.js.map +1 -1
- package/dist/lib/config.d.ts +12 -0
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +38 -5
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/core-floor.d.ts +49 -0
- package/dist/lib/core-floor.d.ts.map +1 -0
- package/dist/lib/core-floor.js +78 -0
- package/dist/lib/core-floor.js.map +1 -0
- package/dist/lib/install-verify.d.ts +101 -0
- package/dist/lib/install-verify.d.ts.map +1 -0
- package/dist/lib/install-verify.js +143 -0
- package/dist/lib/install-verify.js.map +1 -0
- package/dist/lib/ledger.d.ts +212 -0
- package/dist/lib/ledger.d.ts.map +1 -0
- package/dist/lib/ledger.js +266 -0
- package/dist/lib/ledger.js.map +1 -0
- package/dist/lib/pin-override.d.ts +53 -0
- package/dist/lib/pin-override.d.ts.map +1 -0
- package/dist/lib/pin-override.js +77 -0
- package/dist/lib/pin-override.js.map +1 -0
- package/dist/lib/skit-adapter.d.ts.map +1 -1
- package/dist/lib/skit-adapter.js +54 -20
- package/dist/lib/skit-adapter.js.map +1 -1
- package/dist/lib/transitive-resolver.d.ts.map +1 -1
- package/dist/lib/transitive-resolver.js +14 -3
- package/dist/lib/transitive-resolver.js.map +1 -1
- package/dist/lib/version-validator.d.ts +9 -0
- package/dist/lib/version-validator.d.ts.map +1 -1
- package/dist/lib/version-validator.js +69 -0
- package/dist/lib/version-validator.js.map +1 -1
- package/package.json +13 -2
|
@@ -1,2 +1,6 @@
|
|
|
1
|
-
export
|
|
1
|
+
export interface CurrentCommandOptions {
|
|
2
|
+
/** Emit machine-readable JSON (current snapshot + install ledger) instead of the pretty view. */
|
|
3
|
+
json?: boolean;
|
|
4
|
+
}
|
|
5
|
+
export declare function currentCommand(options?: CurrentCommandOptions): Promise<void>;
|
|
2
6
|
//# sourceMappingURL=current.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"current.d.ts","sourceRoot":"","sources":["../../src/commands/current.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"current.d.ts","sourceRoot":"","sources":["../../src/commands/current.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,qBAAqB;IACpC,iGAAiG;IACjG,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAaD,wBAAsB,cAAc,CAAC,OAAO,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC,CA8CnF"}
|
package/dist/commands/current.js
CHANGED
|
@@ -1,12 +1,31 @@
|
|
|
1
1
|
import chalk from 'chalk';
|
|
2
2
|
import { getCurrentSnapshot } from '../lib/snapshot.js';
|
|
3
|
-
|
|
3
|
+
import { readLedger } from '../lib/ledger.js';
|
|
4
|
+
/**
|
|
5
|
+
* Whether the `--json` flag was passed. Read from the options object when the
|
|
6
|
+
* CLI wires it (index.ts), else self-parse process.argv so `snapshot current
|
|
7
|
+
* --json` works standalone (index.ts option definitions are the verify worker's
|
|
8
|
+
* lane; this keeps current.ts self-contained).
|
|
9
|
+
*/
|
|
10
|
+
function wantsJson(options) {
|
|
11
|
+
if (options?.json)
|
|
12
|
+
return true;
|
|
13
|
+
return process.argv.includes('--json');
|
|
14
|
+
}
|
|
15
|
+
export async function currentCommand(options) {
|
|
16
|
+
const current = getCurrentSnapshot();
|
|
17
|
+
const ledger = readLedger();
|
|
18
|
+
// ---- Machine-readable output (AC3.1: answer "where did this come from?"
|
|
19
|
+
// purely from the ledger, no reverse engineering) ----
|
|
20
|
+
if (wantsJson(options)) {
|
|
21
|
+
console.log(JSON.stringify({ current, ledger }, null, 2));
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
4
24
|
console.log(chalk.blue.bold(`
|
|
5
25
|
╔══════════════════════════════════════════════════════════════╗
|
|
6
26
|
║ Current Snapshot ║
|
|
7
27
|
╚══════════════════════════════════════════════════════════════╝
|
|
8
28
|
`));
|
|
9
|
-
const current = getCurrentSnapshot();
|
|
10
29
|
if (!current) {
|
|
11
30
|
console.log(chalk.yellow('No snapshot currently installed.'));
|
|
12
31
|
console.log(chalk.gray('Use: snapshot install <name> to install a snapshot'));
|
|
@@ -28,5 +47,73 @@ export async function currentCommand() {
|
|
|
28
47
|
console.log(chalk.green(` ✓ ${skit}`));
|
|
29
48
|
}
|
|
30
49
|
}
|
|
50
|
+
// ---- Install ledger (S3): package provenance + step order ----
|
|
51
|
+
if (ledger) {
|
|
52
|
+
printLedger(ledger);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
/** Pretty-print the ledger's provenance, install steps, overrides and verdict. */
|
|
56
|
+
function printLedger(ledger) {
|
|
57
|
+
console.log('');
|
|
58
|
+
console.log(chalk.blue.bold('── Install ledger (provenance) ──'));
|
|
59
|
+
console.log(chalk.gray(`Recorded: ${new Date(ledger.recordedAt).toLocaleString()} · cli v${ledger.cliVersion} · registry ${ledger.registry}`));
|
|
60
|
+
if (ledger.packages.length > 0) {
|
|
61
|
+
console.log('');
|
|
62
|
+
console.log(chalk.gray('Package provenance (resolved ← expected):'));
|
|
63
|
+
for (const p of ledger.packages) {
|
|
64
|
+
const resolved = p.resolved ?? chalk.red('(not installed)');
|
|
65
|
+
const diverged = p.expected && p.resolved && p.expected !== p.resolved;
|
|
66
|
+
const head = diverged
|
|
67
|
+
? chalk.yellow(` ⚠ ${p.name} ${p.resolved} ≠ pin ${p.expected}`)
|
|
68
|
+
: chalk.green(` ✓ ${p.name} ${resolved}`);
|
|
69
|
+
console.log(head);
|
|
70
|
+
console.log(chalk.gray(` ${p.resolutionSource}`));
|
|
71
|
+
if (p.tarballUrl)
|
|
72
|
+
console.log(chalk.gray(` tarball: ${p.tarballUrl}`));
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
if (ledger.installSteps.length > 0) {
|
|
76
|
+
console.log('');
|
|
77
|
+
console.log(chalk.gray('Install steps (in order):'));
|
|
78
|
+
for (const s of ledger.installSteps) {
|
|
79
|
+
const mark = s.result === 'ok' ? chalk.green('ok') : s.result === 'fallback' ? chalk.yellow('fallback') : chalk.red('failed');
|
|
80
|
+
console.log(chalk.gray(` ${s.order}. [${s.phase}/${s.installer}] ${mark} — ${s.specs.length} spec(s)`));
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
if (ledger.overrides && Object.keys(ledger.overrides).length > 0) {
|
|
84
|
+
console.log('');
|
|
85
|
+
console.log(chalk.gray('Pin overrides (FB):'));
|
|
86
|
+
for (const [name, version] of Object.entries(ledger.overrides)) {
|
|
87
|
+
console.log(chalk.cyan(` ⇄ ${name} → ${version}`));
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
if (ledger.verification) {
|
|
91
|
+
const v = ledger.verification;
|
|
92
|
+
console.log('');
|
|
93
|
+
if (v.ok) {
|
|
94
|
+
console.log(chalk.green(`✓ Verified ${v.verifiedCount}/${v.total} — disk matches manifest pins`));
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
console.log(chalk.red(`✗ Verified ${v.verifiedCount}/${v.total} — disk diverged from manifest pins:`));
|
|
98
|
+
for (const m of v.mismatches) {
|
|
99
|
+
const got = m.got === null ? '(not installed)' : m.got;
|
|
100
|
+
console.log(chalk.red(` ${m.name}: expected ${m.expected}, got ${got}`));
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
// AC1.4 — core-floor (nested singleton floor).
|
|
105
|
+
if (ledger.coreFloor) {
|
|
106
|
+
const cf = ledger.coreFloor;
|
|
107
|
+
console.log('');
|
|
108
|
+
if (cf.ok) {
|
|
109
|
+
console.log(chalk.green(`✓ Core-floor: every ${cf.pkg} copy is >= ${cf.minVersion} (S2 singleton intact)`));
|
|
110
|
+
}
|
|
111
|
+
else {
|
|
112
|
+
console.log(chalk.red(`✗ Core-floor: ${cf.offenders.length} ${cf.pkg} copy/copies below ${cf.minVersion}:`));
|
|
113
|
+
for (const o of cf.offenders) {
|
|
114
|
+
console.log(chalk.red(` ${o.version} at ${o.path}`));
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
31
118
|
}
|
|
32
119
|
//# sourceMappingURL=current.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"current.js","sourceRoot":"","sources":["../../src/commands/current.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"current.js","sourceRoot":"","sources":["../../src/commands/current.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAoDA,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAuCnD"}
|
package/dist/commands/doctor.js
CHANGED
|
@@ -1,5 +1,49 @@
|
|
|
1
1
|
import chalk from 'chalk';
|
|
2
|
+
import { existsSync, readFileSync } from 'fs';
|
|
3
|
+
import { join } from 'path';
|
|
2
4
|
import { checkPrerequisites, MINIMAL_PREREQUISITES } from '../lib/prerequisites.js';
|
|
5
|
+
import { getConfig } from '../lib/config.js';
|
|
6
|
+
import { verifyInstallMap, expectedMapFromLedger, } from '../lib/install-verify.js';
|
|
7
|
+
/**
|
|
8
|
+
* S1 — offline install verification for `snapshot doctor`.
|
|
9
|
+
*
|
|
10
|
+
* Reads the manifest `expected` pins recorded in the install ledger
|
|
11
|
+
* (~/.config/ist-snapshot/ledger.json — schema owned by lib/ledger.ts) and
|
|
12
|
+
* re-checks them against the current global npm disk. This catches drift that
|
|
13
|
+
* happened AFTER install (e.g. a later `npm i -g` regressed a pin), turning
|
|
14
|
+
* silent "green on broken" into a visible ❌. Purely offline (no re-fetch).
|
|
15
|
+
*
|
|
16
|
+
* Degrades gracefully: if the ledger is absent/unparseable/empty (older install
|
|
17
|
+
* or none), it prints nothing and doctor behaves as before.
|
|
18
|
+
*/
|
|
19
|
+
function verifyInstallFromLedger() {
|
|
20
|
+
const ledgerPath = join(getConfig().configDir, 'ledger.json');
|
|
21
|
+
if (!existsSync(ledgerPath))
|
|
22
|
+
return;
|
|
23
|
+
let parsed = null;
|
|
24
|
+
try {
|
|
25
|
+
parsed = JSON.parse(readFileSync(ledgerPath, 'utf-8'));
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
return; // corrupt ledger — don't crash doctor
|
|
29
|
+
}
|
|
30
|
+
const expected = expectedMapFromLedger(parsed);
|
|
31
|
+
if (Object.keys(expected).length === 0)
|
|
32
|
+
return;
|
|
33
|
+
console.log('');
|
|
34
|
+
console.log(chalk.blue('Verifying install against manifest pins (from ledger)...\n'));
|
|
35
|
+
const v = verifyInstallMap(expected);
|
|
36
|
+
if (v.ok) {
|
|
37
|
+
console.log(chalk.green(` ✅ verified ${v.verifiedCount}/${v.total} — disk matches manifest pins`));
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
console.log(chalk.red(` ❌ verified ${v.verifiedCount}/${v.total} — disk diverged from manifest pins:`));
|
|
41
|
+
for (const m of v.mismatches) {
|
|
42
|
+
const got = m.got === null ? '(not installed)' : m.got;
|
|
43
|
+
console.log(chalk.red(` ${m.name}: expected ${m.expected}, got ${got}`));
|
|
44
|
+
}
|
|
45
|
+
console.log(chalk.gray(' Fix: snapshot install <name> --converge'));
|
|
46
|
+
}
|
|
3
47
|
export async function doctorCommand() {
|
|
4
48
|
console.log(chalk.blue('Checking prerequisites...\n'));
|
|
5
49
|
const results = checkPrerequisites(MINIMAL_PREREQUISITES);
|
|
@@ -33,5 +77,7 @@ export async function doctorCommand() {
|
|
|
33
77
|
console.log(chalk.gray(`${manual.length} require manual action (see above).`));
|
|
34
78
|
}
|
|
35
79
|
}
|
|
80
|
+
// S1 — surface install verification (disk vs manifest pins) from the ledger.
|
|
81
|
+
verifyInstallFromLedger();
|
|
36
82
|
}
|
|
37
83
|
//# sourceMappingURL=doctor.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { Snapshot, InstallerConfig } from '../lib/types.js';
|
|
2
|
+
import { StepRecorder } from '../lib/ledger.js';
|
|
2
3
|
export interface InstallResult {
|
|
3
4
|
installed: string[];
|
|
4
5
|
failed: string[];
|
|
@@ -7,11 +8,37 @@ export interface InstallSnapshotOptions {
|
|
|
7
8
|
useProxy?: boolean;
|
|
8
9
|
autoDetect?: boolean;
|
|
9
10
|
sessionId?: string;
|
|
11
|
+
/**
|
|
12
|
+
* S3 — install-step recorder. When present, each npm batch / fallback /
|
|
13
|
+
* parallel / skit step appends an ordered entry for the install ledger. The
|
|
14
|
+
* same instance is threaded through the entire recursive extends chain.
|
|
15
|
+
*/
|
|
16
|
+
recorder?: StepRecorder;
|
|
17
|
+
/**
|
|
18
|
+
* FB — pin overrides (name → exact version), applied to every install map in
|
|
19
|
+
* this snapshot AND its extends chain (threaded through the recursion) so a
|
|
20
|
+
* base layer cannot clobber an override with its original pin.
|
|
21
|
+
*/
|
|
22
|
+
overrides?: Record<string, string>;
|
|
10
23
|
}
|
|
24
|
+
/**
|
|
25
|
+
* FB — the subset of pin overrides that actually apply to this install (i.e. the
|
|
26
|
+
* overridden package IS declared in the effective npm map). These are the
|
|
27
|
+
* packages we targeted-converge so a --pin always holds even without a global
|
|
28
|
+
* --converge. Overrides for packages not in the snapshot are dropped (already
|
|
29
|
+
* warned via unmatchedOverrides). Returns name → override version.
|
|
30
|
+
*/
|
|
31
|
+
export declare function overrideConvergeTargets(effectiveNpmMap: Record<string, string>, overrides: Record<string, string>): Record<string, string>;
|
|
11
32
|
export declare function installSnapshot(snapshot: Snapshot, depth?: number, parentInstallers?: Record<string, InstallerConfig>, options?: InstallSnapshotOptions): Promise<{
|
|
12
33
|
result: InstallResult;
|
|
13
34
|
installers: Record<string, InstallerConfig>;
|
|
14
35
|
}>;
|
|
36
|
+
/**
|
|
37
|
+
* Recursively collect all packages from snapshot and its extends chain.
|
|
38
|
+
* This ensures .npmrc is configured with ALL scopes before installation begins,
|
|
39
|
+
* including scopes from base snapshots (e.g., @microwiseai from @ist/minimal).
|
|
40
|
+
*/
|
|
41
|
+
export declare function collectAllPackages(snapshot: Snapshot): Promise<Record<string, string>>;
|
|
15
42
|
export interface InstallCommandOptions {
|
|
16
43
|
/** Converge onto the new version: remove previous-version-only packages (ADR 001). */
|
|
17
44
|
replace?: boolean;
|
|
@@ -19,6 +46,20 @@ export interface InstallCommandOptions {
|
|
|
19
46
|
dryRun?: boolean;
|
|
20
47
|
/** Skip the removal confirmation prompt. */
|
|
21
48
|
yes?: boolean;
|
|
49
|
+
/**
|
|
50
|
+
* S1 — post-install convergence. ON BY DEFAULT (undefined ⇒ true). When true,
|
|
51
|
+
* a disk divergence from the manifest pins is auto-repaired (bounded rounds);
|
|
52
|
+
* an UNREPAIRABLE residual still fails-loud (exit 1) — no green-on-broken. Set
|
|
53
|
+
* false (CLI `--no-converge`) for a raw/fast install that only verifies and
|
|
54
|
+
* fails-loud on divergence without attempting repair. (Core-floor offenders
|
|
55
|
+
* always fail-loud regardless of mode.)
|
|
56
|
+
*/
|
|
57
|
+
converge?: boolean;
|
|
58
|
+
/**
|
|
59
|
+
* FB — pin overrides without re-publishing, e.g. ["@ist/sesh@0.4.0"]
|
|
60
|
+
* (repeatable). Applied to the whole install + recorded in the ledger.
|
|
61
|
+
*/
|
|
62
|
+
pin?: string[];
|
|
22
63
|
}
|
|
23
64
|
export declare function installCommand(name: string, options?: InstallCommandOptions): Promise<void>;
|
|
24
65
|
//# sourceMappingURL=install.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAgBjE,OAAO,EACL,YAAY,EAIb,MAAM,kBAAkB,CAAC;AAsB1B,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAqgBD,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACpC;AAuBD;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CACrC,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EACvC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAChC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAMxB;AAED,wBAAsB,eAAe,CACnC,QAAQ,EAAE,QAAQ,EAClB,KAAK,GAAE,MAAU,EACjB,gBAAgB,GAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAM,EACtD,OAAO,GAAE,sBAA2B,GACnC,OAAO,CAAC;IAAE,MAAM,EAAE,aAAa,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAA;CAAE,CAAC,CA0YjF;AAwDD;;;;GAIG;AACH,wBAAsB,kBAAkB,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CA6B5F;AAED,MAAM,WAAW,qBAAqB;IACpC,sFAAsF;IACtF,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,yEAAyE;IACzE,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,4CAA4C;IAC5C,GAAG,CAAC,EAAE,OAAO,CAAC;IACd;;;;;;;OAOG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;OAGG;IACH,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC;CAChB;AAoLD,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,qBAA0B,GAAG,OAAO,CAAC,IAAI,CAAC,CAwoBrG"}
|