@usejunior/docx-core 0.22.0 → 0.23.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/.tsbuildinfo +1 -1
- package/dist/integration/generation-probes.d.ts.map +1 -1
- package/dist/integration/generation-probes.js +26 -21
- package/dist/integration/generation-probes.js.map +1 -1
- package/dist/integration/libreoffice-oracle.d.ts +6 -1
- package/dist/integration/libreoffice-oracle.d.ts.map +1 -1
- package/dist/integration/libreoffice-oracle.js +113 -44
- package/dist/integration/libreoffice-oracle.js.map +1 -1
- package/dist/integration/soffice-lock.d.ts +30 -0
- package/dist/integration/soffice-lock.d.ts.map +1 -0
- package/dist/integration/soffice-lock.js +308 -0
- package/dist/integration/soffice-lock.js.map +1 -0
- package/dist/primitives/accept_ai_edits.d.ts +8 -0
- package/dist/primitives/accept_ai_edits.d.ts.map +1 -1
- package/dist/primitives/accept_ai_edits.js +24 -4
- package/dist/primitives/accept_ai_edits.js.map +1 -1
- package/dist/primitives/accept_changes.d.ts +27 -1
- package/dist/primitives/accept_changes.d.ts.map +1 -1
- package/dist/primitives/accept_changes.js +57 -2
- package/dist/primitives/accept_changes.js.map +1 -1
- package/dist/primitives/comments.d.ts.map +1 -1
- package/dist/primitives/comments.js +2 -2
- package/dist/primitives/comments.js.map +1 -1
- package/dist/primitives/document.d.ts +1 -0
- package/dist/primitives/document.d.ts.map +1 -1
- package/dist/primitives/document.js +27 -14
- package/dist/primitives/document.js.map +1 -1
- package/dist/primitives/document_view-headings.d.ts.map +1 -1
- package/dist/primitives/document_view-headings.js +16 -6
- package/dist/primitives/document_view-headings.js.map +1 -1
- package/dist/primitives/footnotes.js +2 -2
- package/dist/primitives/footnotes.js.map +1 -1
- package/dist/primitives/formatting_tags.d.ts +6 -3
- package/dist/primitives/formatting_tags.d.ts.map +1 -1
- package/dist/primitives/formatting_tags.js +50 -44
- package/dist/primitives/formatting_tags.js.map +1 -1
- package/dist/primitives/paragraph-index.d.ts +28 -2
- package/dist/primitives/paragraph-index.d.ts.map +1 -1
- package/dist/primitives/paragraph-index.js +25 -6
- package/dist/primitives/paragraph-index.js.map +1 -1
- package/dist/primitives/styles.d.ts +88 -20
- package/dist/primitives/styles.d.ts.map +1 -1
- package/dist/primitives/styles.js +207 -40
- package/dist/primitives/styles.js.map +1 -1
- package/dist/primitives/xml.d.ts +43 -1
- package/dist/primitives/xml.d.ts.map +1 -1
- package/dist/primitives/xml.js +100 -10
- package/dist/primitives/xml.js.map +1 -1
- package/dist/primitives/zip.d.ts +6 -0
- package/dist/primitives/zip.d.ts.map +1 -1
- package/dist/primitives/zip.js +19 -4
- package/dist/primitives/zip.js.map +1 -1
- package/dist/shared/docx/DocxArchive.d.ts.map +1 -1
- package/dist/shared/docx/DocxArchive.js +6 -2
- package/dist/shared/docx/DocxArchive.js.map +1 -1
- package/package.json +3 -3
|
@@ -18,15 +18,21 @@
|
|
|
18
18
|
*
|
|
19
19
|
* This module is gated by callers: when `resolveSoffice()` returns null the oracle is skipped.
|
|
20
20
|
* CI does not install LibreOffice, so the oracle voter is a local developer check.
|
|
21
|
+
*
|
|
22
|
+
* Every soffice launch here runs under the cross-process lock in `soffice-lock.ts`, so parallel
|
|
23
|
+
* Vitest workers and sibling processes never start concurrent headless LibreOffice instances of
|
|
24
|
+
* the same binary (issue #1037).
|
|
21
25
|
*/
|
|
22
26
|
import { execFile } from 'node:child_process';
|
|
23
|
-
import {
|
|
27
|
+
import { createHash } from 'node:crypto';
|
|
28
|
+
import { existsSync, mkdirSync, mkdtempSync, readdirSync, readFileSync, rmSync, statSync, writeFileSync } from 'node:fs';
|
|
24
29
|
import os from 'node:os';
|
|
25
30
|
import path from 'node:path';
|
|
26
31
|
import { pathToFileURL } from 'node:url';
|
|
27
32
|
import { promisify } from 'node:util';
|
|
28
33
|
import { createZipBuffer, readZipText } from '../primitives/zip.js';
|
|
29
34
|
import { parseXml } from '../primitives/xml.js';
|
|
35
|
+
import { withSofficeLock } from './soffice-lock.js';
|
|
30
36
|
const execFileAsync = promisify(execFile);
|
|
31
37
|
const W_NS = 'http://schemas.openxmlformats.org/wordprocessingml/2006/main';
|
|
32
38
|
const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
@@ -75,6 +81,74 @@ export function resolveSoffice() {
|
|
|
75
81
|
return candidates.find((c) => existsSync(c)) ?? null;
|
|
76
82
|
}
|
|
77
83
|
const probeResults = new Map();
|
|
84
|
+
/**
|
|
85
|
+
* Run-scoped probe sharing. A test runner sets `SAFE_DOCX_SOFFICE_RUN_ID` once per invocation
|
|
86
|
+
* (the Vitest configs of the packages that drive the oracle do), and every worker inherits it.
|
|
87
|
+
* The first worker to take the lock probes and records the verdict; the rest reuse it, so one
|
|
88
|
+
* run performs at most one launchability probe per binary — in particular at most one FAILED
|
|
89
|
+
* launch, instead of one SIGABRT crash report per worker. Outside a tagged run the verdict is
|
|
90
|
+
* memoized per process only, so a stale verdict can never leak into a later run.
|
|
91
|
+
*/
|
|
92
|
+
const PROBE_RUN_ENV = 'SAFE_DOCX_SOFFICE_RUN_ID';
|
|
93
|
+
const PROBE_RECORD_MAX_AGE_MS = 24 * 60 * 60_000;
|
|
94
|
+
/** One verdict file per (run, binary) in a dedicated temp subdirectory (cheap to sweep even when
|
|
95
|
+
* the OS temp dir is huge), so concurrent runs never evict each other's verdicts. */
|
|
96
|
+
export function sofficeProbeRecordDir() {
|
|
97
|
+
return path.join(os.tmpdir(), 'safe-docx-soffice-probes');
|
|
98
|
+
}
|
|
99
|
+
function probeRecordPath(soffice, runId) {
|
|
100
|
+
const key = createHash('sha256').update(`${runId}\0${soffice}`).digest('hex').slice(0, 16);
|
|
101
|
+
return path.join(sofficeProbeRecordDir(), `probe-${key}.json`);
|
|
102
|
+
}
|
|
103
|
+
function readSharedProbe(soffice, runId) {
|
|
104
|
+
try {
|
|
105
|
+
const rec = JSON.parse(readFileSync(probeRecordPath(soffice, runId), 'utf8'));
|
|
106
|
+
return rec.runId === runId && rec.soffice === soffice && typeof rec.usable === 'boolean' ? rec.usable : null;
|
|
107
|
+
}
|
|
108
|
+
catch {
|
|
109
|
+
return null;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
function writeSharedProbe(soffice, runId, usable) {
|
|
113
|
+
const dir = sofficeProbeRecordDir();
|
|
114
|
+
try {
|
|
115
|
+
mkdirSync(dir, { recursive: true });
|
|
116
|
+
writeFileSync(probeRecordPath(soffice, runId), JSON.stringify({ runId, soffice, usable, at: new Date().toISOString() }));
|
|
117
|
+
}
|
|
118
|
+
catch { /* best effort — workers fall back to probing themselves */ }
|
|
119
|
+
// Bounded cleanup: drop verdicts from runs older than a day.
|
|
120
|
+
try {
|
|
121
|
+
for (const name of readdirSync(dir)) {
|
|
122
|
+
const full = path.join(dir, name);
|
|
123
|
+
if (Date.now() - statSync(full).mtimeMs > PROBE_RECORD_MAX_AGE_MS)
|
|
124
|
+
rmSync(full, { force: true });
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
catch { /* best effort */ }
|
|
128
|
+
}
|
|
129
|
+
async function launchProbe(soffice) {
|
|
130
|
+
const work = mkdtempSync(path.join(os.tmpdir(), 'lo-probe-'));
|
|
131
|
+
try {
|
|
132
|
+
const inPath = path.join(work, 'probe-input.txt');
|
|
133
|
+
const outDir = path.join(work, 'out');
|
|
134
|
+
writeFileSync(inPath, 'probe');
|
|
135
|
+
await runSoffice(soffice, [
|
|
136
|
+
'--headless',
|
|
137
|
+
'--norestore',
|
|
138
|
+
'--nologo',
|
|
139
|
+
`-env:UserInstallation=${pathToFileURL(path.join(work, 'profile')).href}`,
|
|
140
|
+
'--convert-to',
|
|
141
|
+
'txt',
|
|
142
|
+
'--outdir',
|
|
143
|
+
outDir,
|
|
144
|
+
inPath,
|
|
145
|
+
], 30_000);
|
|
146
|
+
return existsSync(path.join(outDir, 'probe-input.txt'));
|
|
147
|
+
}
|
|
148
|
+
finally {
|
|
149
|
+
rmSync(work, { recursive: true, force: true });
|
|
150
|
+
}
|
|
151
|
+
}
|
|
78
152
|
/**
|
|
79
153
|
* Preflight launchability probe. `resolveSoffice()` proves the binary EXISTS, not that it can
|
|
80
154
|
* launch: under a restricted shell (observed: macOS Seatbelt, e.g. `codex exec --sandbox
|
|
@@ -85,34 +159,23 @@ const probeResults = new Map();
|
|
|
85
159
|
*
|
|
86
160
|
* The probe is the same throwaway headless `--convert-to txt` the oracle uses to initialize its
|
|
87
161
|
* profile — the cheapest operation known to discriminate "can launch" from "aborts on init".
|
|
88
|
-
* Memoized per binary path so a multi-test file pays for one launch
|
|
162
|
+
* Memoized per binary path so a multi-test file pays for one launch, shared across the workers
|
|
163
|
+
* of one tagged test run (see `SAFE_DOCX_SOFFICE_RUN_ID` above), and serialized with every other
|
|
164
|
+
* soffice launch by the cross-process lock.
|
|
89
165
|
*/
|
|
90
166
|
export function probeSofficeUsable(soffice) {
|
|
91
167
|
let result = probeResults.get(soffice);
|
|
92
168
|
if (!result) {
|
|
93
|
-
result = (async () => {
|
|
94
|
-
const
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
`-env:UserInstallation=${pathToFileURL(path.join(work, 'profile')).href}`,
|
|
104
|
-
'--convert-to',
|
|
105
|
-
'txt',
|
|
106
|
-
'--outdir',
|
|
107
|
-
outDir,
|
|
108
|
-
inPath,
|
|
109
|
-
], 30_000);
|
|
110
|
-
return existsSync(path.join(outDir, 'probe-input.txt'));
|
|
111
|
-
}
|
|
112
|
-
finally {
|
|
113
|
-
rmSync(work, { recursive: true, force: true });
|
|
114
|
-
}
|
|
115
|
-
})();
|
|
169
|
+
result = withSofficeLock(soffice, async () => {
|
|
170
|
+
const runId = process.env[PROBE_RUN_ENV];
|
|
171
|
+
const shared = runId ? readSharedProbe(soffice, runId) : null;
|
|
172
|
+
if (shared !== null)
|
|
173
|
+
return shared;
|
|
174
|
+
const usable = await launchProbe(soffice);
|
|
175
|
+
if (runId)
|
|
176
|
+
writeSharedProbe(soffice, runId, usable);
|
|
177
|
+
return usable;
|
|
178
|
+
});
|
|
116
179
|
probeResults.set(soffice, result);
|
|
117
180
|
}
|
|
118
181
|
return result;
|
|
@@ -258,25 +321,31 @@ export async function runLibreOfficeOracle(jobs, soffice = resolveSoffice(), cap
|
|
|
258
321
|
writeFileSync(path.join(userDir, 'registrymodifications.xcu'), REGMOD);
|
|
259
322
|
const baseArgs = ['--headless', '--norestore', '--nologo', `-env:UserInstallation=${profileUrl}`];
|
|
260
323
|
const diag = [];
|
|
261
|
-
//
|
|
262
|
-
//
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
324
|
+
// Hold the cross-process lock only around the launches themselves. Reading the outputs and
|
|
325
|
+
// running `captureOutput` happen after release, so a callback that starts its own LibreOffice
|
|
326
|
+
// work does not hold up other workers (and could not deadlock even if it ran inside: the lock
|
|
327
|
+
// is re-entrant within an async context).
|
|
328
|
+
await withSofficeLock(soffice, async () => {
|
|
329
|
+
// (1) INIT the profile: a throwaway convert makes soffice populate user/basic/Standard
|
|
330
|
+
// (which would otherwise clobber a pre-placed Module1.xba on first real launch).
|
|
331
|
+
const init = await runSoffice(soffice, [...baseArgs, '--convert-to', 'txt', '--outdir', path.join(work, 'init'), path.join(inDir, 'job0.docx')], 20_000);
|
|
332
|
+
diag.push(`[init] ${(init.stderr || init.stdout || '(no output)').trim()}`);
|
|
333
|
+
// (2) Overwrite the Basic library with our macro.
|
|
334
|
+
mkdirSync(basicDir, { recursive: true });
|
|
335
|
+
writeFileSync(path.join(userDir, 'basic', 'script.xlc'), SCRIPT_XLC);
|
|
336
|
+
writeFileSync(path.join(basicDir, 'script.xlb'), SCRIPT_XLB);
|
|
337
|
+
writeFileSync(path.join(basicDir, 'Module1.xba'), module1Xba(jobsPath, marker));
|
|
338
|
+
// (3) Run the macro via a bare macro:/// URL — but only once the init instance has fully
|
|
339
|
+
// released the profile, so LibreOffice's single-instance model can't forward our macro command
|
|
340
|
+
// to the dying init process. Retry once: the first macro launch can still race a slow init exit.
|
|
341
|
+
for (let attempt = 1; attempt <= 2 && !existsSync(marker); attempt++) {
|
|
342
|
+
await settleProfile(profile);
|
|
343
|
+
const run = await runSoffice(soffice, [...baseArgs, 'macro:///Standard.Module1.RunOracle'], 45_000);
|
|
344
|
+
diag.push(`[macro attempt ${attempt}] ${(run.stderr || run.stdout || '(no output)').trim()}`);
|
|
345
|
+
if (!existsSync(marker))
|
|
346
|
+
await sleep(400);
|
|
347
|
+
}
|
|
348
|
+
});
|
|
280
349
|
if (!existsSync(marker)) {
|
|
281
350
|
keepWork = Boolean(process.env.SAFE_DOCX_ORACLE_DEBUG);
|
|
282
351
|
throw new Error('LibreOffice oracle macro did not run (no marker file) after 2 attempts.\nsoffice output:\n' +
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"libreoffice-oracle.js","sourceRoot":"","sources":["../../src/integration/libreoffice-oracle.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"libreoffice-oracle.js","sourceRoot":"","sources":["../../src/integration/libreoffice-oracle.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/** A holder older than this is presumed dead even if its PID looks alive (PID reuse). Oracle
|
|
2
|
+
* launches are bounded far below this: the probe times out at 30s, an oracle batch at
|
|
3
|
+
* 20s + 2 × 45s, a generation probe at 45s. */
|
|
4
|
+
export declare const DEFAULT_STALE_LOCK_MS: number;
|
|
5
|
+
/** Default wait for a contended lock before giving up with a diagnostic. */
|
|
6
|
+
export declare const DEFAULT_LOCK_TIMEOUT_MS: number;
|
|
7
|
+
export type SofficeLockOptions = {
|
|
8
|
+
/** Lockfile path; defaults to {@link sofficeLockPath}. */
|
|
9
|
+
lockPath?: string;
|
|
10
|
+
timeoutMs?: number;
|
|
11
|
+
pollMs?: number;
|
|
12
|
+
staleMs?: number;
|
|
13
|
+
};
|
|
14
|
+
/** An idempotent release; resolves once the lockfile is removed (or confirmed not ours). */
|
|
15
|
+
export type SofficeLockRelease = () => Promise<void>;
|
|
16
|
+
/** Lockfile path for a binary: one machine-wide (per OS user temp dir) lock for every real
|
|
17
|
+
* LibreOffice entry point, a per-path lock for anything else. */
|
|
18
|
+
export declare function sofficeLockPath(soffice: string): string;
|
|
19
|
+
/**
|
|
20
|
+
* Acquire the lockfile, returning an idempotent async release. Exported for unit tests and the
|
|
21
|
+
* multi-process contention test; production code uses {@link withSofficeLock}.
|
|
22
|
+
*/
|
|
23
|
+
export declare function acquireSofficeLock(lockPath: string, { timeoutMs, pollMs, staleMs, }?: Omit<SofficeLockOptions, 'lockPath'>): Promise<SofficeLockRelease>;
|
|
24
|
+
/**
|
|
25
|
+
* Run `fn` while holding the cross-process lock for `soffice`. The lock is released on every
|
|
26
|
+
* exit path, including a throw or timeout inside `fn`. See the module comment for re-entrancy
|
|
27
|
+
* and the unwritable-temp-dir fallback.
|
|
28
|
+
*/
|
|
29
|
+
export declare function withSofficeLock<T>(soffice: string, fn: () => Promise<T>, options?: SofficeLockOptions): Promise<T>;
|
|
30
|
+
//# sourceMappingURL=soffice-lock.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"soffice-lock.d.ts","sourceRoot":"","sources":["../../src/integration/soffice-lock.ts"],"names":[],"mappings":"AAkEA;;gDAEgD;AAChD,eAAO,MAAM,qBAAqB,QAAc,CAAC;AACjD,4EAA4E;AAC5E,eAAO,MAAM,uBAAuB,QAAa,CAAC;AAUlD,MAAM,MAAM,kBAAkB,GAAG;IAC/B,0DAA0D;IAC1D,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,4FAA4F;AAC5F,MAAM,MAAM,kBAAkB,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;AAarD;kEACkE;AAClE,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAMvD;AA4GD;;;GAGG;AACH,wBAAsB,kBAAkB,CACtC,QAAQ,EAAE,MAAM,EAChB,EACE,SAAmC,EACnC,MAAY,EACZ,OAA+B,GAChC,GAAE,IAAI,CAAC,kBAAkB,EAAE,UAAU,CAAM,GAC3C,OAAO,CAAC,kBAAkB,CAAC,CAmD7B;AASD;;;;GAIG;AACH,wBAAsB,eAAe,CAAC,CAAC,EACrC,OAAO,EAAE,MAAM,EACf,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,CAAC,CAAC,CAwBZ"}
|
|
@@ -0,0 +1,308 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cross-process LibreOffice launch lock.
|
|
3
|
+
*
|
|
4
|
+
* Every helper in this package that launches `soffice` (the accept/reject oracle, its
|
|
5
|
+
* launchability probe, and the generation probes) memoizes or batches within ONE process, but
|
|
6
|
+
* nothing coordinated ACROSS processes: parallel Vitest workers, sibling sessions, and a human
|
|
7
|
+
* running the oracle at the same time each spawned their own headless LibreOffice. On macOS
|
|
8
|
+
* concurrent headless launches are the amplification vector behind issue #627 (one environment
|
|
9
|
+
* incompatibility became several simultaneous SIGABRT crash reports), so LibreOffice launches
|
|
10
|
+
* serialize on a lockfile in the OS temp dir (issue #1037).
|
|
11
|
+
*
|
|
12
|
+
* Protocol:
|
|
13
|
+
* - Acquire = exclusive-create (`wx`) a JSON lockfile recording PID, host, and a random token.
|
|
14
|
+
* Creation can only succeed while no lockfile exists, so it never displaces a holder.
|
|
15
|
+
* - Every REMOVAL of the lockfile — a holder's release or a waiter's stale steal — happens under
|
|
16
|
+
* a short-lived guard file (also `wx`), and only after re-reading the lockfile under that guard
|
|
17
|
+
* and confirming it is still the exact record (by token) the remover is entitled to delete.
|
|
18
|
+
* Because removers are serialized and a present lockfile cannot be replaced by a create, the
|
|
19
|
+
* record cannot change between that re-read and the `rm`. So a release never deletes a
|
|
20
|
+
* successor's lock, and two waiters racing to steal the same stale lock cannot delete a fresh
|
|
21
|
+
* lock a third process created.
|
|
22
|
+
* - A waiter steals only when the recorded holder is provably gone (same host and
|
|
23
|
+
* `process.kill(pid, 0)` reports ESRCH), or the file is older than `staleMs` (a SIGKILLed holder
|
|
24
|
+
* cannot clean up; a recycled PID cannot pin the lock forever). A lockfile that cannot be parsed
|
|
25
|
+
* (a creator between `open` and `write`) is stolen only after a grace period.
|
|
26
|
+
* - The guard is held for a few synchronous filesystem calls and records its holder like the
|
|
27
|
+
* lock does. A guard is cleared only when its holder is provably dead (a process killed inside
|
|
28
|
+
* that window), or when it is still unparseable after `GUARD_STALE_MS` (its creator died between
|
|
29
|
+
* `open` and `write`). A guard whose holder is alive is never cleared, however old: a holder
|
|
30
|
+
* stopped mid-section (SIGSTOP, a debugger) keeps it, and waiters time out with a diagnostic
|
|
31
|
+
* naming the guard file rather than overlap. Clearing renames the guard aside and puts it back
|
|
32
|
+
* if it turns out not to be the one judged stale.
|
|
33
|
+
* Residual risk: two waiters clearing the SAME dead guard while a third creates a new one can
|
|
34
|
+
* still overlap. That needs a process to die inside a microsecond critical section and three
|
|
35
|
+
* more to race within microseconds of it; the worst outcome is two concurrent soffice launches,
|
|
36
|
+
* the behaviour before this lock existed.
|
|
37
|
+
* - If the guard cannot be taken, a release leaves its lockfile in place rather than removing it
|
|
38
|
+
* unguarded; waiters reclaim it once the holder exits (ESRCH) or after `staleMs`.
|
|
39
|
+
*
|
|
40
|
+
* Re-entrancy: a call nested inside a holder's async context (for the same lockfile) runs under
|
|
41
|
+
* the holder's lease instead of waiting on itself. The lease is invalidated before release, so
|
|
42
|
+
* work that outlives the holder (a detached promise) must acquire the lock again. Nested calls
|
|
43
|
+
* share the holder's lease and are not serialized among themselves; the package's launchers
|
|
44
|
+
* never nest.
|
|
45
|
+
*
|
|
46
|
+
* Scope: every real LibreOffice binary (anything whose path or resolved real path contains
|
|
47
|
+
* "libreoffice", e.g. the Homebrew wrapper and the app-bundle binary it execs) shares ONE
|
|
48
|
+
* machine-wide lock. Any other executable — the stub converters used by unit tests — is locked by
|
|
49
|
+
* its own real path, so stubs never queue behind a real oracle run in another worker.
|
|
50
|
+
*
|
|
51
|
+
* If the temp dir cannot be written (a restricted sandbox), launches proceed unlocked with a
|
|
52
|
+
* one-time warning rather than turning a skip-on-unusable-soffice into a hard failure.
|
|
53
|
+
*
|
|
54
|
+
* Deliberately NOT part of the package's public API: it is internal coordination for this
|
|
55
|
+
* package's soffice launchers, which callers reach through `runLibreOfficeOracle` /
|
|
56
|
+
* `probeSofficeUsable` and get the lock for free.
|
|
57
|
+
*
|
|
58
|
+
* @see https://github.com/UseJunior/safe-docx/issues/1037
|
|
59
|
+
* @see https://github.com/UseJunior/safe-docx/issues/627
|
|
60
|
+
*/
|
|
61
|
+
import { AsyncLocalStorage } from 'node:async_hooks';
|
|
62
|
+
import { createHash, randomUUID } from 'node:crypto';
|
|
63
|
+
import { closeSync, linkSync, openSync, readFileSync, realpathSync, renameSync, rmSync, statSync, writeSync } from 'node:fs';
|
|
64
|
+
import os from 'node:os';
|
|
65
|
+
import path from 'node:path';
|
|
66
|
+
/** A holder older than this is presumed dead even if its PID looks alive (PID reuse). Oracle
|
|
67
|
+
* launches are bounded far below this: the probe times out at 30s, an oracle batch at
|
|
68
|
+
* 20s + 2 × 45s, a generation probe at 45s. */
|
|
69
|
+
export const DEFAULT_STALE_LOCK_MS = 10 * 60_000;
|
|
70
|
+
/** Default wait for a contended lock before giving up with a diagnostic. */
|
|
71
|
+
export const DEFAULT_LOCK_TIMEOUT_MS = 5 * 60_000;
|
|
72
|
+
/** A lockfile that exists but cannot be parsed is only stolen after this grace period. */
|
|
73
|
+
const UNREADABLE_LOCK_GRACE_MS = 10_000;
|
|
74
|
+
/** A guard still unparseable after this long was abandoned between `open` and `write`. */
|
|
75
|
+
const GUARD_STALE_MS = 60_000;
|
|
76
|
+
/** Give up on the removal guard after this long (only reachable if the guard dir misbehaves). */
|
|
77
|
+
const GUARD_TIMEOUT_MS = 30_000;
|
|
78
|
+
const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
79
|
+
const errCode = (err) => err?.code;
|
|
80
|
+
function canonicalBinary(soffice) {
|
|
81
|
+
try {
|
|
82
|
+
return realpathSync(soffice);
|
|
83
|
+
}
|
|
84
|
+
catch {
|
|
85
|
+
return path.resolve(soffice);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
/** Lockfile path for a binary: one machine-wide (per OS user temp dir) lock for every real
|
|
89
|
+
* LibreOffice entry point, a per-path lock for anything else. */
|
|
90
|
+
export function sofficeLockPath(soffice) {
|
|
91
|
+
const real = canonicalBinary(soffice);
|
|
92
|
+
const key = /libreoffice/i.test(real) || /libreoffice/i.test(soffice)
|
|
93
|
+
? 'libreoffice'
|
|
94
|
+
: createHash('sha256').update(real).digest('hex').slice(0, 16);
|
|
95
|
+
return path.join(os.tmpdir(), `safe-docx-soffice-${key}.lock`);
|
|
96
|
+
}
|
|
97
|
+
function readRecord(file) {
|
|
98
|
+
try {
|
|
99
|
+
const parsed = JSON.parse(readFileSync(file, 'utf8'));
|
|
100
|
+
if (typeof parsed.pid !== 'number' || typeof parsed.token !== 'string')
|
|
101
|
+
return null;
|
|
102
|
+
return { pid: parsed.pid, host: String(parsed.host ?? ''), token: parsed.token, at: String(parsed.at ?? '') };
|
|
103
|
+
}
|
|
104
|
+
catch {
|
|
105
|
+
return null;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
/** True unless the holder is provably gone. EPERM means the PID exists but belongs to another
|
|
109
|
+
* user (shared /tmp on Linux), so it counts as alive. A holder on another host cannot be
|
|
110
|
+
* checked and is left to the age-based stale rule. */
|
|
111
|
+
function holderAlive(record) {
|
|
112
|
+
if (record.host && record.host !== os.hostname())
|
|
113
|
+
return true;
|
|
114
|
+
try {
|
|
115
|
+
process.kill(record.pid, 0);
|
|
116
|
+
return true;
|
|
117
|
+
}
|
|
118
|
+
catch (err) {
|
|
119
|
+
return errCode(err) !== 'ESRCH';
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
/** Age of the lockfile in ms; null if it no longer exists. Any other stat failure is reported as
|
|
123
|
+
* age 0 (fresh), so an unreadable file is waited on, never stolen or spun on. */
|
|
124
|
+
function lockAgeMs(lockPath) {
|
|
125
|
+
try {
|
|
126
|
+
return Date.now() - statSync(lockPath).mtimeMs;
|
|
127
|
+
}
|
|
128
|
+
catch (err) {
|
|
129
|
+
return errCode(err) === 'ENOENT' ? null : 0;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
/** Exclusive-create `file` holding `record`; false if it already exists. A failed write removes
|
|
133
|
+
* the half-created file (no one else removes a fresh unparseable file) and rethrows. */
|
|
134
|
+
function tryCreate(file, record) {
|
|
135
|
+
let fd;
|
|
136
|
+
try {
|
|
137
|
+
fd = openSync(file, 'wx');
|
|
138
|
+
}
|
|
139
|
+
catch (err) {
|
|
140
|
+
if (errCode(err) === 'EEXIST')
|
|
141
|
+
return false;
|
|
142
|
+
throw err;
|
|
143
|
+
}
|
|
144
|
+
try {
|
|
145
|
+
writeSync(fd, JSON.stringify(record));
|
|
146
|
+
closeSync(fd);
|
|
147
|
+
}
|
|
148
|
+
catch (err) {
|
|
149
|
+
try {
|
|
150
|
+
closeSync(fd);
|
|
151
|
+
}
|
|
152
|
+
catch { /* already closed */ }
|
|
153
|
+
try {
|
|
154
|
+
rmSync(file, { force: true });
|
|
155
|
+
}
|
|
156
|
+
catch { /* best effort */ }
|
|
157
|
+
throw err;
|
|
158
|
+
}
|
|
159
|
+
return true;
|
|
160
|
+
}
|
|
161
|
+
const newRecord = () => ({ pid: process.pid, host: os.hostname(), token: randomUUID(), at: new Date().toISOString() });
|
|
162
|
+
/** Clear an abandoned guard: rename it aside, keep it removed only if it is the record judged
|
|
163
|
+
* stale, otherwise put it back (`link` refuses to overwrite a newer guard). */
|
|
164
|
+
function clearStaleGuard(guard, judged) {
|
|
165
|
+
const aside = `${guard}.stale-${randomUUID()}`;
|
|
166
|
+
try {
|
|
167
|
+
renameSync(guard, aside);
|
|
168
|
+
}
|
|
169
|
+
catch {
|
|
170
|
+
return; // vanished, or cannot be moved — the caller waits and re-evaluates
|
|
171
|
+
}
|
|
172
|
+
const moved = readRecord(aside);
|
|
173
|
+
const same = judged ? moved?.token === judged.token : moved === null;
|
|
174
|
+
if (!same) {
|
|
175
|
+
try {
|
|
176
|
+
linkSync(aside, guard);
|
|
177
|
+
}
|
|
178
|
+
catch { /* a newer guard exists */ }
|
|
179
|
+
}
|
|
180
|
+
try {
|
|
181
|
+
rmSync(aside, { force: true });
|
|
182
|
+
}
|
|
183
|
+
catch { /* best effort */ }
|
|
184
|
+
}
|
|
185
|
+
/** Run `fn` (synchronous filesystem work only) while holding the removal guard. */
|
|
186
|
+
async function underRemovalGuard(lockPath, fn, deadline = Date.now() + GUARD_TIMEOUT_MS) {
|
|
187
|
+
const guard = `${lockPath}.guard`;
|
|
188
|
+
for (;;) {
|
|
189
|
+
const mine = newRecord();
|
|
190
|
+
if (tryCreate(guard, mine)) {
|
|
191
|
+
try {
|
|
192
|
+
fn();
|
|
193
|
+
return;
|
|
194
|
+
}
|
|
195
|
+
finally {
|
|
196
|
+
if (readRecord(guard)?.token === mine.token)
|
|
197
|
+
rmSync(guard, { force: true });
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
const holder = readRecord(guard);
|
|
201
|
+
const age = lockAgeMs(guard);
|
|
202
|
+
if (age === null)
|
|
203
|
+
continue; // freed between our create and our read — retry at once
|
|
204
|
+
const stale = holder ? !holderAlive(holder) : age > GUARD_STALE_MS;
|
|
205
|
+
if (stale)
|
|
206
|
+
clearStaleGuard(guard, holder);
|
|
207
|
+
if (Date.now() > deadline) {
|
|
208
|
+
throw new Error(`Timed out waiting for the LibreOffice lock guard at ${guard}` +
|
|
209
|
+
(holder ? ` (recorded holder pid ${holder.pid} since ${holder.at})` : '') +
|
|
210
|
+
'. Delete it only if that process is not a safe-docx LibreOffice launcher.');
|
|
211
|
+
}
|
|
212
|
+
await sleep(5 + Math.floor(Math.random() * 10));
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Acquire the lockfile, returning an idempotent async release. Exported for unit tests and the
|
|
217
|
+
* multi-process contention test; production code uses {@link withSofficeLock}.
|
|
218
|
+
*/
|
|
219
|
+
export async function acquireSofficeLock(lockPath, { timeoutMs = DEFAULT_LOCK_TIMEOUT_MS, pollMs = 200, staleMs = DEFAULT_STALE_LOCK_MS, } = {}) {
|
|
220
|
+
const deadline = Date.now() + timeoutMs;
|
|
221
|
+
const record = newRecord();
|
|
222
|
+
for (;;) {
|
|
223
|
+
if (tryCreate(lockPath, record)) {
|
|
224
|
+
let released;
|
|
225
|
+
return () => {
|
|
226
|
+
released ??= underRemovalGuard(lockPath, () => {
|
|
227
|
+
if (readRecord(lockPath)?.token === record.token)
|
|
228
|
+
rmSync(lockPath, { force: true });
|
|
229
|
+
}).catch((err) => {
|
|
230
|
+
// Never remove unguarded (a successor could be deleted). The lockfile stays until this
|
|
231
|
+
// process exits (ESRCH) or it ages past staleMs, when waiters reclaim it.
|
|
232
|
+
// eslint-disable-next-line no-console
|
|
233
|
+
console.warn(`[soffice-lock] could not release ${lockPath} (${err.message}); it will be reclaimed as stale.`);
|
|
234
|
+
});
|
|
235
|
+
return released;
|
|
236
|
+
};
|
|
237
|
+
}
|
|
238
|
+
const holder = readRecord(lockPath);
|
|
239
|
+
const age = lockAgeMs(lockPath);
|
|
240
|
+
if (age === null)
|
|
241
|
+
continue; // released between our create and our read — retry the create
|
|
242
|
+
const stale = holder ? !holderAlive(holder) || age > staleMs : age > UNREADABLE_LOCK_GRACE_MS;
|
|
243
|
+
if (stale) {
|
|
244
|
+
// Re-check under the guard: remove only the exact record judged stale. If it changed
|
|
245
|
+
// (released, or replaced by a fresh holder), the next iteration re-evaluates.
|
|
246
|
+
// The guard wait is bounded by the caller's deadline, and a removal that finishes past it
|
|
247
|
+
// does not turn into a late acquisition.
|
|
248
|
+
let removed = false;
|
|
249
|
+
await underRemovalGuard(lockPath, () => {
|
|
250
|
+
const current = readRecord(lockPath);
|
|
251
|
+
const currentAge = lockAgeMs(lockPath);
|
|
252
|
+
const same = holder
|
|
253
|
+
? current?.token === holder.token
|
|
254
|
+
: current === null && currentAge !== null && currentAge > UNREADABLE_LOCK_GRACE_MS;
|
|
255
|
+
if (same) {
|
|
256
|
+
rmSync(lockPath, { force: true });
|
|
257
|
+
removed = true;
|
|
258
|
+
}
|
|
259
|
+
}, deadline);
|
|
260
|
+
if (removed && Date.now() <= deadline)
|
|
261
|
+
continue;
|
|
262
|
+
}
|
|
263
|
+
if (Date.now() > deadline) {
|
|
264
|
+
throw new Error(`Timed out after ${timeoutMs}ms waiting for the cross-process LibreOffice lock at ${lockPath}` +
|
|
265
|
+
(holder ? ` (held by pid ${holder.pid} on ${holder.host || 'unknown host'} since ${holder.at})` : '') +
|
|
266
|
+
'. Another LibreOffice-driving process appears to be live; delete the lockfile only if none is.');
|
|
267
|
+
}
|
|
268
|
+
await sleep(pollMs + Math.floor(Math.random() * pollMs));
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
const leases = new AsyncLocalStorage();
|
|
272
|
+
let warnedUnlocked = false;
|
|
273
|
+
/** Filesystem errors meaning "the lock cannot be created here", not "the lock is contended". */
|
|
274
|
+
const UNWRITABLE = new Set(['EACCES', 'EPERM', 'EROFS']);
|
|
275
|
+
/**
|
|
276
|
+
* Run `fn` while holding the cross-process lock for `soffice`. The lock is released on every
|
|
277
|
+
* exit path, including a throw or timeout inside `fn`. See the module comment for re-entrancy
|
|
278
|
+
* and the unwritable-temp-dir fallback.
|
|
279
|
+
*/
|
|
280
|
+
export async function withSofficeLock(soffice, fn, options = {}) {
|
|
281
|
+
const lockPath = options.lockPath ?? sofficeLockPath(soffice);
|
|
282
|
+
const current = leases.getStore();
|
|
283
|
+
if (current?.get(lockPath)?.active)
|
|
284
|
+
return fn();
|
|
285
|
+
let release;
|
|
286
|
+
try {
|
|
287
|
+
release = await acquireSofficeLock(lockPath, options);
|
|
288
|
+
}
|
|
289
|
+
catch (err) {
|
|
290
|
+
if (!UNWRITABLE.has(errCode(err) ?? ''))
|
|
291
|
+
throw err;
|
|
292
|
+
if (!warnedUnlocked) {
|
|
293
|
+
warnedUnlocked = true;
|
|
294
|
+
// eslint-disable-next-line no-console
|
|
295
|
+
console.warn(`[soffice-lock] cannot create ${lockPath} (${errCode(err)}); launching LibreOffice without the cross-process lock.`);
|
|
296
|
+
}
|
|
297
|
+
return fn();
|
|
298
|
+
}
|
|
299
|
+
const lease = { lockPath, active: true };
|
|
300
|
+
try {
|
|
301
|
+
return await leases.run(new Map([...(current ?? []), [lockPath, lease]]), fn);
|
|
302
|
+
}
|
|
303
|
+
finally {
|
|
304
|
+
lease.active = false;
|
|
305
|
+
await release();
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
//# sourceMappingURL=soffice-lock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"soffice-lock.js","sourceRoot":"","sources":["../../src/integration/soffice-lock.ts"],"names":[],"mappings":"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"}
|
|
@@ -65,6 +65,14 @@ export declare function collectRevisionElements(root: Element | Document): Eleme
|
|
|
65
65
|
* otherwise `author` resolves to the ids of every revision it authored.
|
|
66
66
|
*/
|
|
67
67
|
export declare function resolveSelectedIds(revisionElements: Element[], selector: AiEditSelector): Set<string>;
|
|
68
|
+
/**
|
|
69
|
+
* The selected ids that name a tracked change actually present in
|
|
70
|
+
* `revisionElements`, in selection order. `resolveSelectedIds` keeps requested
|
|
71
|
+
* `revisionIds` verbatim (an unknown id simply filters nothing); this is what a
|
|
72
|
+
* caller should report as selected, so an id that matches no revision is not
|
|
73
|
+
* echoed back as if it had been acted on (#1099).
|
|
74
|
+
*/
|
|
75
|
+
export declare function matchedSelectedIds(revisionElements: Element[], selectedIds: Set<string>): string[];
|
|
68
76
|
/**
|
|
69
77
|
* Find ambiguous overlaps within a single story: a targeted content-wrapper
|
|
70
78
|
* revision that structurally contains — or is contained by — a non-targeted
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"accept_ai_edits.d.ts","sourceRoot":"","sources":["../../src/primitives/accept_ai_edits.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAIH,OAAO,EAGL,KAAK,mBAAmB,EACxB,KAAK,cAAc,EACpB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAiB,KAAK,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAmD9E,wDAAwD;AACxD,MAAM,WAAW,cAAc;IAC7B,gFAAgF;IAChF,WAAW,CAAC,EAAE,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC;IACrC,iFAAiF;IACjF,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,gFAAgF;AAChF,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED,mFAAmF;AACnF,qBAAa,6BAA8B,SAAQ,KAAK;IACtD,QAAQ,CAAC,IAAI,gCAAgC;IAC7C,QAAQ,CAAC,QAAQ,EAAE,iBAAiB,EAAE,CAAC;gBAC3B,QAAQ,EAAE,iBAAiB,EAAE;CAS1C;AAED,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,mBAAmB,CAAC;IAC5B,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,QAAQ,EAAE,iBAAiB,EAAE,CAAC;CAC/B;AAED,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,mBAAmB,CAAC;IAC5B,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,QAAQ,EAAE,iBAAiB,EAAE,CAAC;CAC/B;AAUD,qEAAqE;AACrE,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,OAAO,GAAG,QAAQ,GAAG,OAAO,EAAE,CAQ3E;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,gBAAgB,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,cAAc,GAAG,GAAG,CAAC,MAAM,CAAC,CAgBrG;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,OAAO,GAAG,QAAQ,EAAE,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,iBAAiB,EAAE,CA6E/G;AAED,qEAAqE;AACrE,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,cAAc,CAKzE;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,cAAc,GAAG,qBAAqB,
|
|
1
|
+
{"version":3,"file":"accept_ai_edits.d.ts","sourceRoot":"","sources":["../../src/primitives/accept_ai_edits.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAIH,OAAO,EAGL,KAAK,mBAAmB,EACxB,KAAK,cAAc,EACpB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAiB,KAAK,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAmD9E,wDAAwD;AACxD,MAAM,WAAW,cAAc;IAC7B,gFAAgF;IAChF,WAAW,CAAC,EAAE,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC;IACrC,iFAAiF;IACjF,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,gFAAgF;AAChF,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED,mFAAmF;AACnF,qBAAa,6BAA8B,SAAQ,KAAK;IACtD,QAAQ,CAAC,IAAI,gCAAgC;IAC7C,QAAQ,CAAC,QAAQ,EAAE,iBAAiB,EAAE,CAAC;gBAC3B,QAAQ,EAAE,iBAAiB,EAAE;CAS1C;AAED,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,mBAAmB,CAAC;IAC5B,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,QAAQ,EAAE,iBAAiB,EAAE,CAAC;CAC/B;AAED,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,mBAAmB,CAAC;IAC5B,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,QAAQ,EAAE,iBAAiB,EAAE,CAAC;CAC/B;AAUD,qEAAqE;AACrE,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,OAAO,GAAG,QAAQ,GAAG,OAAO,EAAE,CAQ3E;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,gBAAgB,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,cAAc,GAAG,GAAG,CAAC,MAAM,CAAC,CAgBrG;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,gBAAgB,EAAE,OAAO,EAAE,EAAE,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,MAAM,EAAE,CAOlG;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,OAAO,GAAG,QAAQ,EAAE,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,iBAAiB,EAAE,CA6E/G;AAED,qEAAqE;AACrE,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,cAAc,CAKzE;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,cAAc,GAAG,qBAAqB,CAU5F;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,cAAc,GAAG,qBAAqB,CAU5F"}
|