fileport-gateway 0.1.8 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -14,7 +14,8 @@ Implemented:
14
14
  - reverse proxy with GET/HEAD/Range;
15
15
  - traversal, encoded-path and symlink-escape protection;
16
16
  - CLI and browser preview shell;
17
- - explicit RO/RW shares, expiry and strict existing-file-only atomic saves.
17
+ - explicit RO/RW shares, expiry and strict existing-file-only atomic saves;
18
+ - in-browser archive browsing and bounded entry preview for ZIP and compressed tar files.
18
19
 
19
20
  See [current architecture](docs/CURRENT_ARCHITECTURE,md), [Dufs compatibility](docs/DUFS_COMPATIBILITY,md), and [migration plan](docs/MIGRATION_PLAN,md), and [network/CLI contract](docs/NETWORK_AND_CLI.md).
20
21
 
@@ -58,6 +59,22 @@ fileport share ./report.md --readonly
58
59
 
59
60
  Proxy mode treats `public.url` as the externally advertised URL. DNS is reported for diagnostics but is not required to resolve to a local interface, and the public port does not need to equal the origin listener port. Fileport does not configure or verify the reverse proxy itself; verify the resulting capability URL end to end.
60
61
 
62
+ ## Archive browsing
63
+
64
+ The preview shell recognizes these formats by filename extension:
65
+
66
+ - ZIP: `.zip`
67
+ - tar: `.tar`
68
+ - gzip-compressed tar: `.tar.gz`, `.tgz`
69
+ - bzip2-compressed tar: `.tar.bz2`, `.tbz`, `.tbz2`
70
+ - xz-compressed tar: `.tar.xz`, `.txz`
71
+
72
+ Opening one of these files shows a sorted archive manifest with entry paths, types, uncompressed sizes and ZIP encryption status. Entries marked previewable—supported, unencrypted regular files of at most 10 MiB—can be opened with magic-validated image, PDF or media previews, sanitized Markdown/source/text views, and bounded binary-entry download behavior; a selected binary entry can be downloaded from that view. The original archive remains available through Download. Archive entries are read-only even when the enclosing share is RW.
73
+
74
+ Fileport streams archive parsing and decompression and never extracts archive contents to disk. A selected entry is buffered in memory only after its size has passed the preview checks. Limits are a 512 MiB archive input file, 10,000 entries per archive, 4 KiB per entry path, 4 MiB of aggregate manifest path text, 256 MiB of expanded data per tar scan, and 10 MiB per entry preview. Archive work runs in memory-limited worker threads with bounded global/per-archive concurrency and a 15-second wall-clock timeout. Tar archives are rescanned when an entry is opened; the limit applies to every such scan.
75
+
76
+ Unsafe archive paths are omitted from the manifest and counted. Leading `./` prefixes and trailing directory slashes are normalized; after that, absolute paths, drive-prefixed paths, backslashes, NULs, empty components, and `.` or `..` components are unsafe. Symlinks, hard links and other non-regular entries may be listed but are never followed or previewed. Encrypted ZIP entries and regular files over the preview limit are listed as non-previewable; download the original archive to handle them with a trusted local tool.
77
+
61
78
  ```bash
62
79
  fileport --help
63
80
  fileport share --help
@@ -10,3 +10,23 @@ Fileport Gateway packages the official Linux x86_64 musl binary of [Dufs](https:
10
10
  - Release archive SHA256: `817769f726613194bcff9d0e3e481eaccc86ac11208857614f36a8c02f410977`
11
11
 
12
12
  The corresponding license texts are included in `vendor/LICENSE-DUFS-APACHE` and `vendor/LICENSE-DUFS-MIT`.
13
+
14
+ ## Archive preview dependencies
15
+
16
+ The archive preview implementation uses the following direct runtime dependencies. Versions shown are the versions currently locked by `package-lock.json`.
17
+
18
+ | Package | Purpose | License | Source |
19
+ |---|---|---|---|
20
+ | `yauzl` 3.4.0 | Lazy ZIP directory and entry streaming | MIT | https://github.com/thejoshwolfe/yauzl |
21
+ | `tar-stream` 3.2.1 | Streaming tar parsing | MIT | https://github.com/mafintosh/tar-stream |
22
+ | `unbzip2-stream` 1.4.3 | Streaming bzip2 decompression | MIT | https://github.com/regular/unbzip2-stream |
23
+ | `xz-decompress` 0.2.3 | WebAssembly-backed streaming xz decompression | MIT (package declaration) | https://github.com/httptoolkit/xz-decompress |
24
+ | `mime-types` 3.0.1 | Content types for entry preview responses | MIT | https://github.com/jshttp/mime-types |
25
+
26
+ `xz-decompress` includes the following upstream code, as declared by the notice embedded in its distributed JavaScript bundle:
27
+
28
+ - `xzwasm`, copyright Steve Sanderson, MIT license: https://github.com/SteveSanderson/xzwasm
29
+ - `xz-embedded`, by Lasse Collin and Igor Pavlov, public domain: https://tukaani.org/xz/embedded.html
30
+ - `walloc`, copyright 2020 Igalia, S.L., MIT license: https://github.com/wingo/walloc
31
+
32
+ Gzip decompression is provided by Node.js's built-in `node:zlib` module rather than an additional npm package. Package copyright and license texts are available from the linked upstream repositories and installed package distributions.
@@ -0,0 +1,42 @@
1
+ export declare const MAX_ARCHIVE_ENTRIES = 10000;
2
+ export declare const MAX_ARCHIVE_SCAN_BYTES: number;
3
+ export declare const MAX_ARCHIVE_FILE_BYTES: number;
4
+ export declare const MAX_ARCHIVE_ENTRY_BYTES: number;
5
+ export declare const MAX_ARCHIVE_PATH_BYTES = 4096;
6
+ export declare const MAX_ARCHIVE_MANIFEST_PATH_BYTES: number;
7
+ export type ArchiveFormat = "zip" | "tar" | "tar.gz" | "tar.bz2" | "tar.xz";
8
+ export type ArchiveEntryType = "file" | "directory" | "symlink" | "other";
9
+ export interface ArchiveEntry {
10
+ path: string;
11
+ type: ArchiveEntryType;
12
+ size: number;
13
+ compressedSize?: number;
14
+ modifiedAt?: string;
15
+ previewable: boolean;
16
+ encrypted?: boolean;
17
+ }
18
+ export interface ArchiveManifest {
19
+ format: ArchiveFormat;
20
+ entries: ArchiveEntry[];
21
+ skippedUnsafe: number;
22
+ limits: {
23
+ maxEntries: number;
24
+ maxArchiveBytes: number;
25
+ maxScannedBytes: number;
26
+ maxPreviewBytes: number;
27
+ };
28
+ }
29
+ export interface ArchiveContent {
30
+ entry: ArchiveEntry;
31
+ body: Buffer;
32
+ contentType: string;
33
+ }
34
+ export declare class ArchiveError extends Error {
35
+ readonly status: number;
36
+ readonly code: string;
37
+ constructor(status: number, code: string, message?: string);
38
+ }
39
+ export declare function archiveFormat(file: string): ArchiveFormat | undefined;
40
+ export declare function isArchivePath(file: string): boolean;
41
+ export declare function listArchive(file: string, expectedRealPath?: string): Promise<ArchiveManifest>;
42
+ export declare function readArchiveEntry(file: string, rawEntry: string, expectedRealPath?: string): Promise<ArchiveContent>;
@@ -0,0 +1,372 @@
1
+ import { close as closeFd, constants, createReadStream, fstat, open as openFd } from "node:fs";
2
+ import { realpath } from "node:fs/promises";
3
+ import { createGunzip } from "node:zlib";
4
+ import { createRequire } from "node:module";
5
+ import unbzip2 from "unbzip2-stream";
6
+ import { Readable, Transform } from "node:stream";
7
+ import { pipeline } from "node:stream/promises";
8
+ import { contentType, lookup } from "mime-types";
9
+ import { extract } from "tar-stream";
10
+ import { fromFdPromise } from "yauzl";
11
+ const { XzReadableStream } = createRequire(import.meta.url)("xz-decompress");
12
+ export const MAX_ARCHIVE_ENTRIES = 10_000;
13
+ export const MAX_ARCHIVE_SCAN_BYTES = 256 * 1024 * 1024;
14
+ export const MAX_ARCHIVE_FILE_BYTES = 512 * 1024 * 1024;
15
+ export const MAX_ARCHIVE_ENTRY_BYTES = 10 * 1024 * 1024;
16
+ export const MAX_ARCHIVE_PATH_BYTES = 4096;
17
+ export const MAX_ARCHIVE_MANIFEST_PATH_BYTES = 4 * 1024 * 1024;
18
+ class ArchiveEntryFound extends Error {
19
+ }
20
+ export class ArchiveError extends Error {
21
+ status;
22
+ code;
23
+ constructor(status, code, message = code) {
24
+ super(message);
25
+ this.status = status;
26
+ this.code = code;
27
+ }
28
+ }
29
+ class ByteLimitTransform extends Transform {
30
+ limit;
31
+ seen = 0;
32
+ constructor(limit) {
33
+ super();
34
+ this.limit = limit;
35
+ }
36
+ _transform(chunk, _encoding, callback) {
37
+ this.seen += chunk.length;
38
+ if (this.seen > this.limit)
39
+ return callback(new ArchiveError(413, "archive_scan_too_large", `archive expands beyond the ${this.limit} byte scan limit`));
40
+ callback(null, chunk);
41
+ }
42
+ }
43
+ export function archiveFormat(file) {
44
+ const lower = file.toLowerCase();
45
+ if (lower.endsWith(".zip"))
46
+ return "zip";
47
+ if (lower.endsWith(".tar.gz") || lower.endsWith(".tgz"))
48
+ return "tar.gz";
49
+ if (lower.endsWith(".tar.bz2") || lower.endsWith(".tbz2") || lower.endsWith(".tbz"))
50
+ return "tar.bz2";
51
+ if (lower.endsWith(".tar.xz") || lower.endsWith(".txz"))
52
+ return "tar.xz";
53
+ if (lower.endsWith(".tar"))
54
+ return "tar";
55
+ return undefined;
56
+ }
57
+ export function isArchivePath(file) { return archiveFormat(file) !== undefined; }
58
+ function safeArchivePath(raw) {
59
+ if (!raw || raw.includes("\0") || raw.includes("\\") || raw.startsWith("/") || /^[A-Za-z]:/.test(raw))
60
+ return undefined;
61
+ let value = raw;
62
+ while (value.startsWith("./"))
63
+ value = value.slice(2);
64
+ value = value.replace(/\/+$/, "");
65
+ if (!value || value === ".")
66
+ return undefined;
67
+ const parts = value.split("/");
68
+ if (parts.some(part => !part || part === "." || part === ".."))
69
+ return undefined;
70
+ return parts.join("/");
71
+ }
72
+ function requestedEntryPath(raw) {
73
+ const normalized = safeArchivePath(raw);
74
+ if (!normalized)
75
+ throw new ArchiveError(400, "unsafe_archive_path", "unsafe archive entry path");
76
+ return normalized;
77
+ }
78
+ function limits() { return { maxEntries: MAX_ARCHIVE_ENTRIES, maxArchiveBytes: MAX_ARCHIVE_FILE_BYTES, maxScannedBytes: MAX_ARCHIVE_SCAN_BYTES, maxPreviewBytes: MAX_ARCHIVE_ENTRY_BYTES }; }
79
+ function mimeFor(file, body) {
80
+ const lower = file.toLowerCase(), textual = /\.(?:md|markdown|txt|json|csv|tsv|ya?ml|toml|xml|html?|css|js|mjs|cjs|ts|tsx|jsx|py|go|rs|java|kt|sh|bash|zsh|fish|sql|log|ini|conf)$/i.test(lower);
81
+ if (textual) {
82
+ try {
83
+ new TextDecoder("utf-8", { fatal: true }).decode(body);
84
+ return contentType(lookup(file) || "text/plain") || "text/plain; charset=utf-8";
85
+ }
86
+ catch {
87
+ return "application/octet-stream";
88
+ }
89
+ }
90
+ if (body.length >= 8 && body.subarray(0, 8).equals(Buffer.from([137, 80, 78, 71, 13, 10, 26, 10])))
91
+ return "image/png";
92
+ if (body.length >= 3 && body[0] === 0xff && body[1] === 0xd8 && body[2] === 0xff)
93
+ return "image/jpeg";
94
+ if (body.length >= 6 && (body.subarray(0, 6).toString("ascii") === "GIF87a" || body.subarray(0, 6).toString("ascii") === "GIF89a"))
95
+ return "image/gif";
96
+ if (body.length >= 12 && body.subarray(0, 4).toString("ascii") === "RIFF" && body.subarray(8, 12).toString("ascii") === "WEBP")
97
+ return "image/webp";
98
+ if (body.length >= 12 && body.subarray(0, 4).toString("ascii") === "RIFF" && body.subarray(8, 12).toString("ascii") === "WAVE")
99
+ return "audio/wav";
100
+ if (body.length >= 4 && body.subarray(0, 4).toString("ascii") === "OggS")
101
+ return "audio/ogg";
102
+ if (body.length >= 4 && body.subarray(0, 4).toString("ascii") === "fLaC")
103
+ return "audio/flac";
104
+ if (body.length >= 3 && body.subarray(0, 3).toString("ascii") === "ID3" || body.length >= 2 && body[0] === 0xff && (body[1] & 0xe0) === 0xe0)
105
+ return "audio/mpeg";
106
+ if (body.length >= 12 && body.subarray(4, 8).toString("ascii") === "ftyp")
107
+ return "video/mp4";
108
+ if (body.length >= 4 && body[0] === 0x1a && body[1] === 0x45 && body[2] === 0xdf && body[3] === 0xa3)
109
+ return "video/webm";
110
+ if (body.length >= 5 && body.subarray(0, 5).toString("ascii") === "%PDF-")
111
+ return "application/pdf";
112
+ return "application/octet-stream";
113
+ }
114
+ function zipType(entry) {
115
+ if (entry.fileName.endsWith("/"))
116
+ return "directory";
117
+ const unixType = (entry.externalFileAttributes >>> 16) & 0xf000;
118
+ if (unixType === 0xa000)
119
+ return "symlink";
120
+ if (unixType && unixType !== 0x8000)
121
+ return "other";
122
+ return "file";
123
+ }
124
+ function tarType(header) {
125
+ if (header.type === "file" || header.type === "contiguous-file")
126
+ return "file";
127
+ if (header.type === "directory")
128
+ return "directory";
129
+ if (header.type === "link" || header.type === "symlink")
130
+ return "symlink";
131
+ return "other";
132
+ }
133
+ function archiveEntry(path, type, size, modifiedAt, compressedSize, encrypted) {
134
+ return { path, type, size, ...(compressedSize === undefined ? {} : { compressedSize }), ...(modifiedAt ? { modifiedAt } : {}), previewable: type === "file" && !encrypted && size <= MAX_ARCHIVE_ENTRY_BYTES, ...(encrypted ? { encrypted: true } : {}) };
135
+ }
136
+ function stableEntries(entries) { return entries.sort((a, b) => a.path.localeCompare(b.path) || a.type.localeCompare(b.type)); }
137
+ async function openArchiveFile(file, expectedRealPath) {
138
+ let handle;
139
+ try {
140
+ handle = await new Promise((resolve, reject) => openFd(file, constants.O_RDONLY | constants.O_NOFOLLOW, (error, fd) => error ? reject(error) : resolve(fd)));
141
+ }
142
+ catch (error) {
143
+ const code = error.code;
144
+ if (code === "ELOOP")
145
+ throw new ArchiveError(409, "archive_target_changed", "archive target changed during authorization");
146
+ throw error;
147
+ }
148
+ const stat = await new Promise((resolve, reject) => fstat(handle, (error, value) => error ? reject(error) : resolve(value)));
149
+ let actual;
150
+ try {
151
+ actual = await realpath(`/proc/self/fd/${handle}`);
152
+ }
153
+ catch {
154
+ await closeArchiveFile(handle);
155
+ throw new ArchiveError(409, "archive_target_changed", "cannot verify opened archive target");
156
+ }
157
+ if (actual !== expectedRealPath) {
158
+ await closeArchiveFile(handle);
159
+ throw new ArchiveError(409, "archive_target_changed", "archive target changed during authorization");
160
+ }
161
+ if (!stat.isFile()) {
162
+ await closeArchiveFile(handle);
163
+ throw new ArchiveError(415, "archive_not_regular_file");
164
+ }
165
+ if (stat.size > MAX_ARCHIVE_FILE_BYTES) {
166
+ await closeArchiveFile(handle);
167
+ throw new ArchiveError(413, "archive_file_too_large", `archive exceeds the ${MAX_ARCHIVE_FILE_BYTES} byte input limit`);
168
+ }
169
+ return handle;
170
+ }
171
+ async function closeArchiveFile(handle) {
172
+ await new Promise((resolve, reject) => closeFd(handle, error => error && error.code !== "EBADF" ? reject(error) : resolve()));
173
+ }
174
+ async function listZip(file, expectedRealPath) {
175
+ const handle = await openArchiveFile(file, expectedRealPath);
176
+ let zip;
177
+ try {
178
+ zip = await fromFdPromise(handle, { lazyEntries: true, autoClose: false, validateEntrySizes: true, strictFileNames: false });
179
+ }
180
+ catch {
181
+ await closeArchiveFile(handle);
182
+ throw new ArchiveError(422, "invalid_archive", "cannot read ZIP archive");
183
+ }
184
+ if (zip.entryCount > MAX_ARCHIVE_ENTRIES) {
185
+ try {
186
+ zip.close();
187
+ }
188
+ catch { }
189
+ throw new ArchiveError(413, "archive_too_many_entries", `archive contains more than ${MAX_ARCHIVE_ENTRIES} entries`);
190
+ }
191
+ const entries = [];
192
+ let skippedUnsafe = 0, pathBytes = 0;
193
+ try {
194
+ for await (const item of zip.eachEntry()) {
195
+ if (entries.length >= MAX_ARCHIVE_ENTRIES)
196
+ throw new ArchiveError(413, "archive_too_many_entries", `archive contains more than ${MAX_ARCHIVE_ENTRIES} entries`);
197
+ const normalized = safeArchivePath(item.fileName);
198
+ if (!normalized) {
199
+ skippedUnsafe++;
200
+ continue;
201
+ }
202
+ const bytes = Buffer.byteLength(normalized);
203
+ if (bytes > MAX_ARCHIVE_PATH_BYTES)
204
+ throw new ArchiveError(413, "archive_path_too_long");
205
+ pathBytes += bytes;
206
+ if (pathBytes > MAX_ARCHIVE_MANIFEST_PATH_BYTES)
207
+ throw new ArchiveError(413, "archive_manifest_too_large");
208
+ const type = zipType(item), encrypted = item.isEncrypted();
209
+ let modifiedAt;
210
+ try {
211
+ modifiedAt = item.getLastModDate().toISOString();
212
+ }
213
+ catch { }
214
+ const meta = archiveEntry(normalized, type, item.uncompressedSize, modifiedAt, item.compressedSize, encrypted);
215
+ meta.previewable = meta.previewable && item.canDecodeFileData() && item.compressedSize <= MAX_ARCHIVE_SCAN_BYTES;
216
+ entries.push(meta);
217
+ }
218
+ }
219
+ catch (error) {
220
+ if (error instanceof ArchiveError)
221
+ throw error;
222
+ throw new ArchiveError(422, "invalid_archive", "cannot read ZIP archive");
223
+ }
224
+ finally {
225
+ try {
226
+ zip.close();
227
+ }
228
+ catch { }
229
+ }
230
+ return { format: "zip", entries: stableEntries(entries), skippedUnsafe, limits: limits() };
231
+ }
232
+ async function readZipEntry(file, requested, expectedRealPath) {
233
+ const handle = await openArchiveFile(file, expectedRealPath);
234
+ let zip;
235
+ try {
236
+ zip = await fromFdPromise(handle, { lazyEntries: true, autoClose: false, validateEntrySizes: true, strictFileNames: false });
237
+ }
238
+ catch {
239
+ await closeArchiveFile(handle);
240
+ throw new ArchiveError(422, "invalid_archive", "cannot read ZIP archive");
241
+ }
242
+ if (zip.entryCount > MAX_ARCHIVE_ENTRIES) {
243
+ try {
244
+ zip.close();
245
+ }
246
+ catch { }
247
+ throw new ArchiveError(413, "archive_too_many_entries", `archive contains more than ${MAX_ARCHIVE_ENTRIES} entries`);
248
+ }
249
+ try {
250
+ for await (const item of zip.eachEntry()) {
251
+ const normalized = safeArchivePath(item.fileName);
252
+ if (normalized !== requested)
253
+ continue;
254
+ const type = zipType(item), encrypted = item.isEncrypted(), meta = archiveEntry(normalized, type, item.uncompressedSize, undefined, item.compressedSize, encrypted);
255
+ if (type !== "file" || encrypted || !item.canDecodeFileData())
256
+ throw new ArchiveError(415, encrypted ? "archive_entry_encrypted" : "archive_entry_not_previewable");
257
+ if (item.uncompressedSize > MAX_ARCHIVE_ENTRY_BYTES || item.compressedSize > MAX_ARCHIVE_SCAN_BYTES)
258
+ throw new ArchiveError(413, "archive_entry_too_large", `archive entry exceeds the ${MAX_ARCHIVE_ENTRY_BYTES} byte preview limit`);
259
+ const stream = await zip.openReadStreamPromise(item);
260
+ const chunks = [];
261
+ let size = 0;
262
+ for await (const chunk of stream) {
263
+ const value = Buffer.from(chunk);
264
+ size += value.length;
265
+ if (size > MAX_ARCHIVE_ENTRY_BYTES) {
266
+ stream.destroy();
267
+ throw new ArchiveError(413, "archive_entry_too_large");
268
+ }
269
+ chunks.push(value);
270
+ }
271
+ const body = Buffer.concat(chunks);
272
+ return { entry: meta, body, contentType: mimeFor(requested, body) };
273
+ }
274
+ throw new ArchiveError(404, "archive_entry_not_found");
275
+ }
276
+ catch (error) {
277
+ if (error instanceof ArchiveError)
278
+ throw error;
279
+ throw new ArchiveError(422, "invalid_archive", "cannot extract ZIP entry");
280
+ }
281
+ finally {
282
+ try {
283
+ zip.close();
284
+ }
285
+ catch { }
286
+ }
287
+ }
288
+ async function scanTar(file, format, expectedRealPath, requested) {
289
+ const parser = extract();
290
+ const entries = [];
291
+ let seenEntries = 0, skippedUnsafe = 0, pathBytes = 0, content, parserError;
292
+ parser.on("entry", (header, stream, next) => {
293
+ const normalized = safeArchivePath(header.name), type = tarType(header), size = Number(header.size || 0);
294
+ if (!Number.isSafeInteger(size) || size < 0)
295
+ return next(new ArchiveError(422, "invalid_archive", "invalid tar entry size"));
296
+ seenEntries++;
297
+ if (seenEntries > MAX_ARCHIVE_ENTRIES)
298
+ return next(new ArchiveError(413, "archive_too_many_entries", `archive contains more than ${MAX_ARCHIVE_ENTRIES} entries`));
299
+ if (!normalized) {
300
+ skippedUnsafe++;
301
+ stream.on("end", () => next());
302
+ stream.resume();
303
+ return;
304
+ }
305
+ const bytes = Buffer.byteLength(normalized);
306
+ if (bytes > MAX_ARCHIVE_PATH_BYTES)
307
+ return next(new ArchiveError(413, "archive_path_too_long"));
308
+ pathBytes += bytes;
309
+ if (pathBytes > MAX_ARCHIVE_MANIFEST_PATH_BYTES)
310
+ return next(new ArchiveError(413, "archive_manifest_too_large"));
311
+ const modifiedAt = header.mtime instanceof Date && !Number.isNaN(header.mtime.getTime()) ? header.mtime.toISOString() : undefined;
312
+ const meta = archiveEntry(normalized, type, size, modifiedAt);
313
+ entries.push(meta);
314
+ if (requested === normalized) {
315
+ if (type !== "file")
316
+ return next(new ArchiveError(415, "archive_entry_not_previewable"));
317
+ if (size > MAX_ARCHIVE_ENTRY_BYTES)
318
+ return next(new ArchiveError(413, "archive_entry_too_large", `archive entry exceeds the ${MAX_ARCHIVE_ENTRY_BYTES} byte preview limit`));
319
+ const chunks = [];
320
+ let actual = 0;
321
+ stream.on("data", (chunk) => { const value = Buffer.from(chunk); actual += value.length; if (actual <= MAX_ARCHIVE_ENTRY_BYTES)
322
+ chunks.push(value); });
323
+ stream.on("end", () => { if (actual > MAX_ARCHIVE_ENTRY_BYTES)
324
+ return next(new ArchiveError(413, "archive_entry_too_large")); const body = Buffer.concat(chunks); content = { entry: meta, body, contentType: mimeFor(requested, body) }; next(new ArchiveEntryFound()); });
325
+ return;
326
+ }
327
+ stream.on("end", () => next());
328
+ stream.resume();
329
+ });
330
+ parser.on("error", error => { parserError = error; });
331
+ const handle = await openArchiveFile(file, expectedRealPath), source = createReadStream(file, { fd: handle, autoClose: true }), limiter = new ByteLimitTransform(MAX_ARCHIVE_SCAN_BYTES);
332
+ try {
333
+ if (format === "tar.gz")
334
+ await pipeline(source, createGunzip(), limiter, parser);
335
+ else if (format === "tar.bz2")
336
+ await pipeline(source, unbzip2(), limiter, parser);
337
+ else if (format === "tar.xz")
338
+ await pipeline(Readable.fromWeb(new XzReadableStream(Readable.toWeb(source))), limiter, parser);
339
+ else
340
+ await pipeline(source, limiter, parser);
341
+ }
342
+ catch (error) {
343
+ const cause = parserError || error;
344
+ if (cause instanceof ArchiveEntryFound && content)
345
+ return { entries, skippedUnsafe, content };
346
+ if (cause instanceof ArchiveError)
347
+ throw cause;
348
+ throw new ArchiveError(422, "invalid_archive", `cannot read ${format} archive`);
349
+ }
350
+ return { entries: stableEntries(entries), skippedUnsafe, content };
351
+ }
352
+ export async function listArchive(file, expectedRealPath = file) {
353
+ const format = archiveFormat(file);
354
+ if (!format)
355
+ throw new ArchiveError(415, "unsupported_archive", "supported archives: .zip, .tar, .tar.gz, .tgz, .tar.bz2, .tbz2, .tar.xz, .txz");
356
+ if (format === "zip")
357
+ return listZip(file, expectedRealPath);
358
+ const result = await scanTar(file, format, expectedRealPath);
359
+ return { format, entries: result.entries, skippedUnsafe: result.skippedUnsafe, limits: limits() };
360
+ }
361
+ export async function readArchiveEntry(file, rawEntry, expectedRealPath = file) {
362
+ const requested = requestedEntryPath(rawEntry), format = archiveFormat(file);
363
+ if (!format)
364
+ throw new ArchiveError(415, "unsupported_archive");
365
+ if (format === "zip")
366
+ return readZipEntry(file, requested, expectedRealPath);
367
+ const result = await scanTar(file, format, expectedRealPath, requested);
368
+ if (!result.content)
369
+ throw new ArchiveError(404, "archive_entry_not_found");
370
+ return result.content;
371
+ }
372
+ //# sourceMappingURL=archive-engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"archive-engine.js","sourceRoot":"","sources":["../src/archive-engine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,12 @@
1
+ import { parentPort, workerData } from "node:worker_threads";
2
+ import { ArchiveError, listArchive, readArchiveEntry } from "./archive-engine.js";
3
+ try {
4
+ const input = workerData;
5
+ const value = input.action === "list" ? await listArchive(input.file, input.expectedRealPath) : await readArchiveEntry(input.file, input.entry ?? "", input.expectedRealPath);
6
+ parentPort.postMessage({ ok: true, value });
7
+ }
8
+ catch (error) {
9
+ const value = error instanceof ArchiveError ? error : new ArchiveError(422, "invalid_archive", error instanceof Error ? error.message : String(error));
10
+ parentPort.postMessage({ ok: false, error: { status: value.status, code: value.code, message: value.message } });
11
+ }
12
+ //# sourceMappingURL=archive-worker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"archive-worker.js","sourceRoot":"","sources":["../src/archive-worker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAGlF,IAAG,CAAC;IACF,MAAM,KAAK,GAAC,UAAkB,CAAC;IAC/B,MAAM,KAAK,GAAC,KAAK,CAAC,MAAM,KAAG,MAAM,CAAA,CAAC,CAAA,MAAM,WAAW,CAAC,KAAK,CAAC,IAAI,EAAC,KAAK,CAAC,gBAAgB,CAAC,CAAA,CAAC,CAAA,MAAM,gBAAgB,CAAC,KAAK,CAAC,IAAI,EAAC,KAAK,CAAC,KAAK,IAAE,EAAE,EAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;IACjK,UAAW,CAAC,WAAW,CAAC,EAAC,EAAE,EAAC,IAAI,EAAC,KAAK,EAAC,CAAC,CAAC;AAC3C,CAAC;AAAA,OAAM,KAAK,EAAC,CAAC;IAAA,MAAM,KAAK,GAAC,KAAK,YAAY,YAAY,CAAA,CAAC,CAAA,KAAK,CAAA,CAAC,CAAA,IAAI,YAAY,CAAC,GAAG,EAAC,iBAAiB,EAAC,KAAK,YAAY,KAAK,CAAA,CAAC,CAAA,KAAK,CAAC,OAAO,CAAA,CAAC,CAAA,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IAAA,UAAW,CAAC,WAAW,CAAC,EAAC,EAAE,EAAC,KAAK,EAAC,KAAK,EAAC,EAAC,MAAM,EAAC,KAAK,CAAC,MAAM,EAAC,IAAI,EAAC,KAAK,CAAC,IAAI,EAAC,OAAO,EAAC,KAAK,CAAC,OAAO,EAAC,EAAC,CAAC,CAAC;AAAA,CAAC"}
@@ -0,0 +1,17 @@
1
+ import { type ArchiveContent, type ArchiveFormat, type ArchiveManifest } from "./archive-engine.js";
2
+ export type { ArchiveContent, ArchiveEntry, ArchiveEntryType, ArchiveFormat, ArchiveManifest } from "./archive-engine.js";
3
+ export { MAX_ARCHIVE_ENTRIES, MAX_ARCHIVE_ENTRY_BYTES, MAX_ARCHIVE_FILE_BYTES, MAX_ARCHIVE_PATH_BYTES, MAX_ARCHIVE_MANIFEST_PATH_BYTES, MAX_ARCHIVE_SCAN_BYTES } from "./archive-engine.js";
4
+ export declare class ArchiveError extends Error {
5
+ readonly status: number;
6
+ readonly code: string;
7
+ constructor(status: number, code: string, message?: string);
8
+ }
9
+ export interface ArchiveJobOptions {
10
+ expectedRealPath: string;
11
+ key: string;
12
+ signal?: AbortSignal;
13
+ }
14
+ export declare function archiveFormat(file: string): ArchiveFormat | undefined;
15
+ export declare function isArchivePath(file: string): boolean;
16
+ export declare function listArchive(file: string, options?: ArchiveJobOptions): Promise<ArchiveManifest>;
17
+ export declare function readArchiveEntry(file: string, rawEntry: string, options?: ArchiveJobOptions): Promise<ArchiveContent>;
@@ -0,0 +1,75 @@
1
+ import { Worker } from "node:worker_threads";
2
+ import { archiveFormat as detectArchiveFormat } from "./archive-engine.js";
3
+ export { MAX_ARCHIVE_ENTRIES, MAX_ARCHIVE_ENTRY_BYTES, MAX_ARCHIVE_FILE_BYTES, MAX_ARCHIVE_PATH_BYTES, MAX_ARCHIVE_MANIFEST_PATH_BYTES, MAX_ARCHIVE_SCAN_BYTES } from "./archive-engine.js";
4
+ const MAX_CONCURRENT_ARCHIVE_JOBS = 2;
5
+ const MAX_QUEUED_ARCHIVE_JOBS = 32;
6
+ const ARCHIVE_JOB_TIMEOUT_MS = 15_000;
7
+ export class ArchiveError extends Error {
8
+ status;
9
+ code;
10
+ constructor(status, code, message = code) {
11
+ super(message);
12
+ this.status = status;
13
+ this.code = code;
14
+ }
15
+ }
16
+ let active = 0;
17
+ const activeKeys = new Set(), queue = [];
18
+ export function archiveFormat(file) { return detectArchiveFormat(file); }
19
+ export function isArchivePath(file) { return archiveFormat(file) !== undefined; }
20
+ function schedule() {
21
+ while (active < MAX_CONCURRENT_ARCHIVE_JOBS) {
22
+ const index = queue.findIndex(job => !activeKeys.has(job.key));
23
+ if (index < 0)
24
+ return;
25
+ const [job] = queue.splice(index, 1);
26
+ if (job.queuedAbort)
27
+ job.signal?.removeEventListener("abort", job.queuedAbort);
28
+ if (job.signal?.aborted) {
29
+ job.reject(new ArchiveError(499, "archive_request_aborted"));
30
+ continue;
31
+ }
32
+ active++;
33
+ activeKeys.add(job.key);
34
+ void job.start().then(job.resolve, job.reject).finally(() => { active--; activeKeys.delete(job.key); schedule(); });
35
+ }
36
+ }
37
+ function limited(key, signal, start) {
38
+ if (signal?.aborted)
39
+ return Promise.reject(new ArchiveError(499, "archive_request_aborted"));
40
+ if (queue.length >= MAX_QUEUED_ARCHIVE_JOBS)
41
+ return Promise.reject(new ArchiveError(429, "archive_queue_full", "too many archive preview requests"));
42
+ return new Promise((resolve, reject) => { const job = { key, start, resolve: resolve, reject, signal }; const abort = () => { const index = queue.indexOf(job); if (index >= 0) {
43
+ queue.splice(index, 1);
44
+ reject(new ArchiveError(499, "archive_request_aborted"));
45
+ } }; job.queuedAbort = abort; signal?.addEventListener("abort", abort, { once: true }); queue.push(job); schedule(); });
46
+ }
47
+ function runWorker(input, signal) {
48
+ return new Promise((resolve, reject) => {
49
+ const workerFile = new URL(import.meta.url.endsWith(".ts") ? "./archive-worker.ts" : "./archive-worker.js", import.meta.url);
50
+ const worker = new Worker(workerFile, { workerData: input, resourceLimits: { maxOldGenerationSizeMb: 128, maxYoungGenerationSizeMb: 16, stackSizeMb: 4 } });
51
+ let settled = false;
52
+ const finish = (error, value) => { if (settled)
53
+ return; settled = true; clearTimeout(timer); signal?.removeEventListener("abort", onAbort); void worker.terminate(); error ? reject(error) : resolve(value); };
54
+ const onAbort = () => finish(new ArchiveError(499, "archive_request_aborted"));
55
+ const timer = setTimeout(() => finish(new ArchiveError(504, "archive_timeout", `archive preview exceeded ${ARCHIVE_JOB_TIMEOUT_MS}ms`)), ARCHIVE_JOB_TIMEOUT_MS);
56
+ timer.unref();
57
+ signal?.addEventListener("abort", onAbort, { once: true });
58
+ worker.once("message", message => { if (message?.ok) {
59
+ const value = message.value;
60
+ if (value?.body)
61
+ value.body = Buffer.from(value.body);
62
+ finish(undefined, value);
63
+ }
64
+ else {
65
+ const e = message?.error;
66
+ finish(new ArchiveError(Number(e?.status) || 422, String(e?.code || "invalid_archive"), String(e?.message || "archive processing failed")));
67
+ } });
68
+ worker.once("error", error => finish(new ArchiveError(422, "archive_worker_failed", error.message)));
69
+ worker.once("exit", code => { if (!settled)
70
+ finish(new ArchiveError(422, "archive_worker_failed", `archive worker exited with code ${code}`)); });
71
+ });
72
+ }
73
+ export async function listArchive(file, options = { expectedRealPath: file, key: file }) { return limited(options.key, options.signal, () => runWorker({ action: "list", file, expectedRealPath: options.expectedRealPath }, options.signal)); }
74
+ export async function readArchiveEntry(file, rawEntry, options = { expectedRealPath: file, key: file }) { return limited(options.key, options.signal, () => runWorker({ action: "read", file, expectedRealPath: options.expectedRealPath, entry: rawEntry }, options.signal)); }
75
+ //# sourceMappingURL=archive.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"archive.js","sourceRoot":"","sources":["../src/archive.ts"],"names":[],"mappings":"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"}
package/dist/gateway.js CHANGED
@@ -1,9 +1,10 @@
1
1
  import fs from "node:fs/promises";
2
2
  import http from "node:http";
3
3
  import path from "node:path";
4
+ import { ArchiveError, isArchivePath, listArchive, readArchiveEntry } from "./archive.js";
4
5
  import { renderMarkdown } from "./markdown.js";
5
6
  import { PublicAddressError, PublicAddressResolver } from "./network.js";
6
- import { authorizeSharePath } from "./paths.js";
7
+ import { authorizeSharePath, authorizeShareTarget } from "./paths.js";
7
8
  import { proxyToUnixSocket } from "./proxy.js";
8
9
  import { ShareRegistry } from "./registry.js";
9
10
  import { fileVersion, isEditableText, MAX_SAVE_REQUEST_BYTES, MAX_TEXT_BYTES, SaveError, SaveManager } from "./save.js";
@@ -73,8 +74,12 @@ export class Gateway {
73
74
  if (error.code !== "ENOENT")
74
75
  throw error;
75
76
  }
76
- this.publicServer = http.createServer((req, res) => { void this.handlePublic(req, res).catch(error => { if (!res.headersSent)
77
- json(res, 500, { error: "internal_error" });
77
+ this.publicServer = http.createServer((req, res) => { void this.handlePublic(req, res).catch(error => { if (!res.headersSent) {
78
+ if (error instanceof ArchiveError)
79
+ json(res, error.status, { error: error.code, message: error.message });
80
+ else
81
+ json(res, 500, { error: "internal_error" });
82
+ }
78
83
  else
79
84
  res.destroy(); console.error(error); }); });
80
85
  this.controlServer = http.createServer((req, res) => { void this.handleControl(req, res).catch(error => json(res, error instanceof SaveError ? error.status : error instanceof PublicAddressError ? 422 : 400, { error: error instanceof SaveError ? error.code : error instanceof PublicAddressError ? error.code : error instanceof Error ? error.message : String(error), message: error instanceof Error ? error.message : undefined })); });
@@ -168,6 +173,88 @@ export class Gateway {
168
173
  if (!share)
169
174
  return json(res, 404, { error: "share_not_found" });
170
175
  const tail = match[2] || "";
176
+ const archiveAbort = () => { const controller = new AbortController(), abort = () => controller.abort(); req.once("aborted", abort); res.once("close", abort); return { signal: controller.signal, cleanup: () => { req.removeListener("aborted", abort); res.removeListener("close", abort); } }; };
177
+ const archiveListMatch = tail.match(/^api\/archive\/list\/(.*)$/);
178
+ if (archiveListMatch && req.method === "GET") {
179
+ const abort = archiveAbort();
180
+ try {
181
+ const authorized = await authorizeShareTarget(share, archiveListMatch[1]);
182
+ const target = path.resolve(share.root, authorized.relative);
183
+ if (!isArchivePath(target))
184
+ throw new ArchiveError(415, "unsupported_archive");
185
+ return json(res, 200, await listArchive(target, { expectedRealPath: authorized.real, key: `${share.id}:${authorized.real}`, signal: abort.signal }));
186
+ }
187
+ catch (error) {
188
+ if (error instanceof ArchiveError) {
189
+ if (error.code === "archive_request_aborted" && (req.aborted || res.destroyed))
190
+ return;
191
+ return json(res, error.status, { error: error.code, message: error.message });
192
+ }
193
+ return json(res, 403, { error: "scope_denied" });
194
+ }
195
+ finally {
196
+ abort.cleanup();
197
+ }
198
+ }
199
+ const archiveMarkdownMatch = tail.match(/^api\/archive\/render\/markdown\/(.*)$/);
200
+ if (archiveMarkdownMatch && req.method === "GET") {
201
+ const entryRaw = new URLSearchParams(query).get("entry");
202
+ if (!entryRaw)
203
+ return json(res, 400, { error: "archive_entry_required" });
204
+ const abort = archiveAbort();
205
+ try {
206
+ const authorized = await authorizeShareTarget(share, archiveMarkdownMatch[1]);
207
+ const target = path.resolve(share.root, authorized.relative);
208
+ const result = await readArchiveEntry(target, entryRaw, { expectedRealPath: authorized.real, key: `${share.id}:${authorized.real}`, signal: abort.signal });
209
+ let source;
210
+ try {
211
+ source = new TextDecoder("utf-8", { fatal: true }).decode(result.body);
212
+ }
213
+ catch {
214
+ throw new ArchiveError(415, "archive_entry_not_text");
215
+ }
216
+ const base = `/s/${share.id}/api/archive/entry/${authorized.encodedRelative}`;
217
+ const internalUrl = (relative) => { const match = relative.match(/^([^?#]*)([?#].*)?$/); const decoded = match[1].split("/").map(decodeURIComponent).join("/"); return `${base}?entry=${encodeURIComponent(decoded)}${match[2]?.startsWith("#") ? match[2] : ""}`; };
218
+ return json(res, 200, { html: renderMarkdown(source, "", entryRaw, internalUrl) });
219
+ }
220
+ catch (error) {
221
+ if (error instanceof ArchiveError) {
222
+ if (error.code === "archive_request_aborted" && (req.aborted || res.destroyed))
223
+ return;
224
+ return json(res, error.status, { error: error.code, message: error.message });
225
+ }
226
+ return json(res, 403, { error: "scope_denied" });
227
+ }
228
+ finally {
229
+ abort.cleanup();
230
+ }
231
+ }
232
+ const archiveEntryMatch = tail.match(/^api\/archive\/entry\/(.*)$/);
233
+ if (archiveEntryMatch && req.method === "GET") {
234
+ const entryRaw = new URLSearchParams(query).get("entry");
235
+ if (!entryRaw)
236
+ return json(res, 400, { error: "archive_entry_required" });
237
+ const abort = archiveAbort();
238
+ try {
239
+ const authorized = await authorizeShareTarget(share, archiveEntryMatch[1]);
240
+ const target = path.resolve(share.root, authorized.relative);
241
+ const result = await readArchiveEntry(target, entryRaw, { expectedRealPath: authorized.real, key: `${share.id}:${authorized.real}`, signal: abort.signal });
242
+ res.writeHead(200, { "content-type": result.contentType, "content-length": result.body.length, "cache-control": "no-store", "referrer-policy": "no-referrer", "x-content-type-options": "nosniff", "content-security-policy": "sandbox; default-src 'none'", "content-disposition": `attachment; filename*=UTF-8''${encodeURIComponent(path.basename(result.entry.path))}` });
243
+ res.end(result.body);
244
+ return;
245
+ }
246
+ catch (error) {
247
+ if (error instanceof ArchiveError) {
248
+ if (error.code === "archive_request_aborted" && (req.aborted || res.destroyed))
249
+ return;
250
+ return json(res, error.status, { error: error.code, message: error.message });
251
+ }
252
+ return json(res, 403, { error: "scope_denied" });
253
+ }
254
+ finally {
255
+ abort.cleanup();
256
+ }
257
+ }
171
258
  const renderMarkdownMatch = tail.match(/^api\/render\/markdown\/(.*)$/);
172
259
  if (renderMarkdownMatch && req.method === "POST") {
173
260
  try {
@@ -219,7 +306,7 @@ export class Gateway {
219
306
  }
220
307
  if (tail === "" && (req.method === "GET" || req.method === "HEAD")) {
221
308
  const html = previewHtml(share);
222
- res.writeHead(200, { "content-type": "text/html; charset=utf-8", "content-length": Buffer.byteLength(html), "cache-control": "no-store", "referrer-policy": "no-referrer", "x-content-type-options": "nosniff", "content-security-policy": "default-src 'none'; script-src 'unsafe-inline'; style-src 'unsafe-inline'; img-src 'self' blob: data:; connect-src 'self'; frame-src blob:" });
309
+ res.writeHead(200, { "content-type": "text/html; charset=utf-8", "content-length": Buffer.byteLength(html), "cache-control": "no-store", "referrer-policy": "no-referrer", "x-content-type-options": "nosniff", "content-security-policy": "default-src 'none'; script-src 'unsafe-inline'; style-src 'unsafe-inline'; img-src 'self' blob: data:; media-src blob:; connect-src 'self'; frame-src blob:" });
223
310
  res.end(req.method === "HEAD" ? undefined : html);
224
311
  return;
225
312
  }
@@ -1 +1 @@
1
- {"version":3,"file":"gateway.js","sourceRoot":"","sources":["../src/gateway.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"gateway.js","sourceRoot":"","sources":["../src/gateway.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAmD,MAAM,WAAW,CAAC;AAC5E,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAC1F,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,kBAAkB,EAAE,qBAAqB,EAAuB,MAAM,cAAc,CAAC;AAC9F,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AACtE,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,sBAAsB,EAAE,cAAc,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAExH,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACtC,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAEjD,SAAS,IAAI,CAAC,GAAmB,EAAE,MAAc,EAAE,IAAa,IAAU,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,cAAc,EAAE,iCAAiC,EAAE,gBAAgB,EAAE,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,eAAe,EAAE,UAAU,EAAE,iBAAiB,EAAE,aAAa,EAAE,wBAAwB,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAC1V,KAAK,UAAU,IAAI,CAAC,GAAoB,EAAE,KAAK,GAAG,KAAK,IAAkB,MAAM,MAAM,GAAa,EAAE,CAAC,CAAC,IAAI,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,GAAG,EAAE,CAAC;IAAC,IAAI,IAAI,KAAK,CAAC,MAAM,CAAC;IAAC,IAAI,IAAI,GAAG,KAAK;QAAE,MAAM,IAAI,SAAS,CAAC,GAAG,EAAE,mBAAmB,CAAC,CAAC;IAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAAC,CAAC,CAAC,IAAI,CAAC;IAAC,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC;AAAC,CAAC;AAAC,MAAM,CAAC;IAAC,MAAM,IAAI,SAAS,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;AAAC,CAAC,CAAC,CAAC;AAElY,MAAM,OAAO,OAAO;IAUG;IAAiC;IAT7C,QAAQ,CAAgB;IACxB,OAAO,CAAoB;IAC3B,KAAK,GAAG,IAAI,WAAW,EAAE,CAAC;IAC3B,YAAY,CAAe;IAC3B,aAAa,CAAe;IAC3B,aAAa,CAAS;IACvB,QAAQ,CAAiB;IAChB,QAAQ,CAAS;IAC1B,cAAc,CAAkB;IACxC,YAAqB,MAAsB,EAAW,kBAAkB,IAAI,qBAAqB,EAAE;QAA9E,WAAM,GAAN,MAAM,CAAgB;QAAW,oBAAe,GAAf,eAAe,CAA8B;QAAI,IAAI,CAAC,QAAQ,GAAG,IAAI,aAAa,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAAC,IAAI,CAAC,OAAO,GAAG,IAAI,iBAAiB,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;QAAC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;QAAC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;IAAC,CAAC;IAEhW,KAAK,CAAC,KAAK;QACT,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QAAC,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QACpH,IAAI,CAAC;YAAC,IAAI,CAAC,QAAQ,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;QAAC,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACzF,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ;gBAAE,MAAM,KAAK,CAAC;YACpE,IAAI,MAAM,GAAG,KAAK,CAAC;YACnB,IAAI,CAAC;gBAAC,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,GAAG,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,EAAE,UAAU,EAAE,IAAI,CAAC,aAAa,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,QAAQ,EAAE,EAAE,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,UAAU,KAAK,GAAG,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;gBAAC,MAAM,GAAG,IAAI,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAA,CAAC;YAC7X,IAAI,MAAM;gBAAE,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;YACnE,MAAM,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC/B,IAAI,CAAC,QAAQ,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;QAC5D,CAAC;QACD,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,GAAG,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC;YAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;YAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;YAC1G,IAAI,CAAC,cAAc,GAAC,MAAM,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,EAAC,IAAI,EAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAC,aAAa,EAAC,IAAI,CAAC,MAAM,CAAC,aAAa,EAAC,UAAU,EAAC,IAAI,CAAC,MAAM,CAAC,UAAU,EAAC,EAAC,IAAI,CAAC,CAAC;YACrL,IAAI,CAAC;gBAAC,MAAM,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YAAC,CAAC;YAAC,OAAO,KAAc,EAAE,CAAC;gBAAC,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ;oBAAE,MAAM,KAAK,CAAC;YAAC,CAAC;YAC5I,IAAI,CAAC,YAAY,GAAC,IAAI,CAAC,YAAY,CAAC,CAAC,GAAG,EAAC,GAAG,EAAC,EAAE,GAAC,KAAK,IAAI,CAAC,YAAY,CAAC,GAAG,EAAC,GAAG,CAAC,CAAC,KAAK,CAAC,KAAK,CAAA,EAAE,GAAC,IAAG,CAAC,GAAG,CAAC,WAAW,EAAC,CAAC;gBAAA,IAAG,KAAK,YAAY,YAAY;oBAAC,IAAI,CAAC,GAAG,EAAC,KAAK,CAAC,MAAM,EAAC,EAAC,KAAK,EAAC,KAAK,CAAC,IAAI,EAAC,OAAO,EAAC,KAAK,CAAC,OAAO,EAAC,CAAC,CAAC;;oBAAK,IAAI,CAAC,GAAG,EAAC,GAAG,EAAC,EAAC,KAAK,EAAC,gBAAgB,EAAC,CAAC,CAAC;YAAA,CAAC;;gBAAK,GAAG,CAAC,OAAO,EAAE,CAAC,CAAA,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAA,CAAC,CAAC,CAAC,CAAA,CAAC,CAAC,CAAC;YAC/S,IAAI,CAAC,aAAa,GAAC,IAAI,CAAC,YAAY,CAAC,CAAC,GAAG,EAAC,GAAG,EAAC,EAAE,GAAC,KAAK,IAAI,CAAC,aAAa,CAAC,GAAG,EAAC,GAAG,CAAC,CAAC,KAAK,CAAC,KAAK,CAAA,EAAE,CAAA,IAAI,CAAC,GAAG,EAAC,KAAK,YAAY,SAAS,CAAA,CAAC,CAAA,KAAK,CAAC,MAAM,CAAA,CAAC,CAAA,KAAK,YAAY,kBAAkB,CAAA,CAAC,CAAA,GAAG,CAAA,CAAC,CAAA,GAAG,EAAC,EAAC,KAAK,EAAC,KAAK,YAAY,SAAS,CAAA,CAAC,CAAA,KAAK,CAAC,IAAI,CAAA,CAAC,CAAA,KAAK,YAAY,kBAAkB,CAAA,CAAC,CAAA,KAAK,CAAC,IAAI,CAAA,CAAC,CAAA,KAAK,YAAY,KAAK,CAAA,CAAC,CAAA,KAAK,CAAC,OAAO,CAAA,CAAC,CAAA,MAAM,CAAC,KAAK,CAAC,EAAC,OAAO,EAAC,KAAK,YAAY,KAAK,CAAA,CAAC,CAAA,KAAK,CAAC,OAAO,CAAA,CAAC,CAAA,SAAS,EAAC,CAAC,CAAC,CAAC,CAAA,CAAC,CAAC,CAAC;YACxY,MAAM,SAAS,GAAC,MAAM,OAAO,CAAC,UAAU,CAAC;gBACvC,IAAI,OAAO,CAAO,CAAC,OAAO,EAAC,MAAM,EAAC,EAAE,GAAC,IAAI,CAAC,YAAa,CAAC,IAAI,CAAC,OAAO,EAAC,MAAM,CAAC,CAAC,CAAA,IAAI,CAAC,YAAa,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAC,OAAO,CAAC,CAAC,CAAA,CAAC,CAAC;gBACpJ,IAAI,OAAO,CAAO,CAAC,OAAO,EAAC,MAAM,EAAC,EAAE,GAAC,IAAI,CAAC,aAAc,CAAC,IAAI,CAAC,OAAO,EAAC,MAAM,CAAC,CAAC,CAAA,IAAI,CAAC,aAAc,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,EAAC,OAAO,CAAC,CAAC,CAAA,CAAC,CAAC;aACxI,CAAC,CAAC;YACH,MAAM,MAAM,GAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAA,EAAE,CAAA,MAAM,CAAC,MAAM,KAAG,UAAU,CAAoC,CAAC;YAAC,IAAG,MAAM;gBAAC,MAAM,MAAM,CAAC,MAAM,CAAC;YAClI,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,EAAC,KAAK,CAAC,CAAC;YAAC,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;QACvE,CAAC;QAAC,OAAM,KAAK,EAAE,CAAC;YAAC,MAAM,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAAC,MAAM,KAAK,CAAC;QAAC,CAAC;IAClE,CAAC;IAEO,KAAK,CAAC,kBAAkB;QAC9B,MAAM,KAAK,GAAC,KAAK,EAAC,MAAmB,EAAC,EAAE,GAAC,IAAG,CAAC,MAAM,EAAE,SAAS;YAAC,OAAO,CAAA,MAAM,IAAI,OAAO,CAAO,OAAO,CAAA,EAAE,CAAA,MAAM,CAAC,KAAK,CAAC,GAAE,EAAE,CAAA,OAAO,EAAE,CAAC,CAAC,CAAC,CAAA,CAAC,CAAC;QACtI,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,EAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,EAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QACpG,IAAG,CAAC;YAAA,MAAM,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAAA,CAAC;QAAA,MAAK,CAAC,CAAA,CAAC;QAAC,IAAG,CAAC;YAAA,MAAM,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,CAAC;QAAA,CAAC;QAAA,MAAK,CAAC,CAAA,CAAC;gBAAO,CAAC;YAAA,IAAI,CAAC,QAAQ,GAAC,SAAS,CAAC;QAAA,CAAC;QAAC,IAAG,CAAC;YAAA,MAAM,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAAA,CAAC;QAAA,MAAK,CAAC,CAAA,CAAC;IACzK,CAAC;IAEO,KAAK,CAAC,aAAa;QACzB,MAAM,OAAO,GAAC,IAAI,CAAC,MAAM,CAAC,IAAI,KAAG,SAAS,CAAA,CAAC,CAAA,WAAW,CAAA,CAAC,CAAA,IAAI,CAAC,MAAM,CAAC,IAAI,KAAG,IAAI,CAAA,CAAC,CAAA,KAAK,CAAA,CAAC,CAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;QACtG,MAAM,UAAU,GAAC,IAAI,CAAC,cAAc,EAAE,UAAU,KAAG,OAAO,CAAA,CAAC,CAAA,EAAE,CAAA,CAAC,CAAA,IAAI,CAAC,cAAc,EAAE,GAAG,EAAE,QAAQ,IAAE,CAAC,IAAI,CAAC,cAAc,EAAE,iBAAiB,EAAE,IAAI,KAAG,eAAe,IAAE,IAAI,CAAC,cAAc,EAAE,iBAAiB,EAAE,IAAI,KAAG,QAAQ,CAAA,CAAC,CAAA,CAAC,IAAI,CAAC,cAAc,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAA,CAAC,CAAA,EAAE,CAAC,CAAC;QAC5Q,KAAI,MAAM,IAAI,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,OAAO,EAAC,GAAG,UAAU,CAAC,CAAC,CAAC;YAAE,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IACtF,CAAC;IACO,SAAS,CAAC,IAAW,IAAkB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAC,MAAM,EAAC,EAAE,GAAC,MAAM,OAAO,GAAC,IAAI,CAAC,OAAO,CAAC,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAC,IAAI,EAAC,UAAU,EAAC,MAAM,EAAC,KAAK,EAAC,OAAO,EAAC,IAAI,EAAC,EAAC,QAAQ,CAAA,EAAE,GAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAA,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAC,GAAE,EAAE,CAAA,QAAQ,CAAC,UAAU,KAAG,GAAG,CAAA,CAAC,CAAA,OAAO,EAAE,CAAA,CAAC,CAAA,MAAM,CAAC,IAAI,KAAK,CAAC,gBAAgB,IAAI,aAAa,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA,CAAC,CAAC,CAAC,CAAA,OAAO,CAAC,IAAI,CAAC,SAAS,EAAC,GAAE,EAAE,CAAA,OAAO,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,gBAAgB,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC,CAAA,OAAO,CAAC,IAAI,CAAC,OAAO,EAAC,MAAM,CAAC,CAAC,CAAA,OAAO,CAAC,GAAG,EAAE,CAAC,CAAA,CAAC,CAAC,CAAC,CAAC,CAAC;IAE7d,KAAK,CAAC,aAAa,CAAC,GAAoB,EAAE,GAAmB;QACnE,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,EAAE,kBAAkB,CAAC,CAAC;QACxD,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM,IAAI,GAAG,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;YACxD,MAAM,QAAQ,GAAC,MAAM,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,EAAC,IAAI,EAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAC,aAAa,EAAC,IAAI,CAAC,MAAM,CAAC,aAAa,EAAC,UAAU,EAAC,IAAI,CAAC,MAAM,CAAC,UAAU,EAAC,EAAC,IAAI,CAAC,CAAC;YAChL,IAAI,CAAC,QAAQ,CAAC,aAAa;gBAAE,MAAM,IAAI,kBAAkB,CAAC,gBAAgB,EAAC,sEAAsE,CAAC,CAAC;YACnJ,IAAI,CAAC,cAAc,GAAC,QAAQ,CAAC;YAAC,MAAM,KAAK,GAAC,MAAM,IAAI,CAAC,GAAG,CAAC,CAAC;YAAC,MAAM,KAAK,GAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,EAAC,EAAC,UAAU,EAAC,KAAK,CAAC,UAAU,EAAC,SAAS,EAAC,KAAK,CAAC,SAAS,EAAC,CAAC,CAAC;YACtK,OAAO,IAAI,CAAC,GAAG,EAAC,GAAG,EAAC,EAAC,KAAK,EAAC,GAAG,EAAC,GAAG,QAAQ,CAAC,aAAa,MAAM,KAAK,CAAC,EAAE,GAAG,EAAC,aAAa,EAAC,QAAQ,CAAC,aAAa,EAAC,iBAAiB,EAAC,QAAQ,CAAC,iBAAiB,EAAC,CAAC,CAAC;QAChK,CAAC;QACD,IAAI,GAAG,CAAC,MAAM,KAAK,KAAK,IAAI,GAAG,CAAC,QAAQ,KAAK,SAAS;YAAE,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAChH,IAAI,GAAG,CAAC,MAAM,KAAK,KAAK,IAAI,GAAG,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;YAAC,IAAI,CAAC;gBAAC,IAAI,CAAC,cAAc,GAAC,MAAM,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,EAAC,IAAI,EAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAC,aAAa,EAAC,IAAI,CAAC,MAAM,CAAC,aAAa,EAAC,UAAU,EAAC,IAAI,CAAC,MAAM,CAAC,UAAU,EAAC,EAAC,IAAI,CAAC,CAAC;gBAAC,OAAO,IAAI,CAAC,GAAG,EAAC,GAAG,EAAC,EAAC,IAAI,EAAC,EAAC,IAAI,EAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAC,EAAC,GAAG,IAAI,CAAC,cAAc,EAAC,CAAC,CAAC;YAAC,CAAC;YAAC,OAAM,KAAK,EAAE,CAAC;gBAAC,OAAO,IAAI,CAAC,GAAG,EAAC,GAAG,EAAC,EAAC,MAAM,EAAC,OAAO,EAAC,IAAI,EAAC,EAAC,IAAI,EAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAC,EAAC,KAAK,EAAC,KAAK,YAAY,kBAAkB,CAAA,CAAC,CAAA,EAAC,IAAI,EAAC,KAAK,CAAC,IAAI,EAAC,OAAO,EAAC,KAAK,CAAC,OAAO,EAAC,CAAA,CAAC,CAAA,EAAC,IAAI,EAAC,eAAe,EAAC,OAAO,EAAC,MAAM,CAAC,KAAK,CAAC,EAAC,EAAC,CAAC,CAAC;YAAC,CAAC;QAAC,CAAC;QACrkB,IAAI,GAAG,CAAC,MAAM,KAAK,KAAK,IAAI,GAAG,CAAC,QAAQ,KAAK,SAAS;YAAE,OAAO,IAAI,CAAC,GAAG,EAAC,GAAG,EAAC,EAAC,MAAM,EAAC,OAAO,EAAC,eAAe,EAAC,CAAC,EAAC,GAAG,EAAC,OAAO,CAAC,GAAG,EAAC,IAAI,EAAC,EAAC,IAAI,EAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAC,EAAC,aAAa,EAAC,IAAI,CAAC,cAAc,EAAE,aAAa,EAAC,iBAAiB,EAAC,IAAI,CAAC,cAAc,EAAE,iBAAiB,EAAC,MAAM,EAAC,IAAI,CAAC,cAAc,EAAC,MAAM,EAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,MAAM,EAAC,CAAC,CAAC;QAC3V,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM,IAAI,GAAG,CAAC,QAAQ,KAAK,WAAW,EAAE,CAAC;YAAC,IAAI,CAAC,GAAG,EAAC,GAAG,EAAC,EAAC,EAAE,EAAC,IAAI,EAAC,GAAG,EAAC,OAAO,CAAC,GAAG,EAAC,CAAC,CAAC;YAAC,YAAY,CAAC,GAAE,EAAE,GAAC,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC,CAAA,CAAC,CAAC,CAAC;YAAC,OAAO;QAAC,CAAC;QACvJ,MAAM,MAAM,GAAG,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;QAAC,IAAI,GAAG,CAAC,MAAM,KAAK,QAAQ,IAAI,MAAM;YAAE,OAAO,IAAI,CAAC,GAAG,EAAE,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9L,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC;IACzC,CAAC;IAEO,KAAK,CAAC,YAAY,CAAC,GAAoB,EAAE,GAAmB;QAClE,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC;QAC3B,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAAC,MAAM,OAAO,GAAG,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;QAAC,MAAM,KAAK,GAAG,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACnJ,IAAI,OAAO,KAAK,UAAU;YAAE,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACnG,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,oCAAoC,CAAC,CAAC;QAAC,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC;QAC7H,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAAC,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,iBAAiB,EAAE,CAAC,CAAC;QAC3G,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC5B,MAAM,YAAY,GAAC,GAAE,EAAE,GAAC,MAAM,UAAU,GAAC,IAAI,eAAe,EAAE,EAAC,KAAK,GAAC,GAAE,EAAE,CAAA,UAAU,CAAC,KAAK,EAAE,CAAC,CAAA,GAAG,CAAC,IAAI,CAAC,SAAS,EAAC,KAAK,CAAC,CAAC,CAAA,GAAG,CAAC,IAAI,CAAC,OAAO,EAAC,KAAK,CAAC,CAAC,CAAA,OAAO,EAAC,MAAM,EAAC,UAAU,CAAC,MAAM,EAAC,OAAO,EAAC,GAAE,EAAE,GAAC,GAAG,CAAC,cAAc,CAAC,SAAS,EAAC,KAAK,CAAC,CAAC,CAAA,GAAG,CAAC,cAAc,CAAC,OAAO,EAAC,KAAK,CAAC,CAAC,CAAA,CAAC,EAAC,CAAC,CAAA,CAAC,CAAC;QACvQ,MAAM,gBAAgB,GAAC,IAAI,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;QAChE,IAAG,gBAAgB,IAAE,GAAG,CAAC,MAAM,KAAG,KAAK,EAAE,CAAC;YACxC,MAAM,KAAK,GAAC,YAAY,EAAE,CAAC;YAAA,IAAI,CAAC;gBAAC,MAAM,UAAU,GAAC,MAAM,oBAAoB,CAAC,KAAK,EAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC;gBAAC,MAAM,MAAM,GAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,EAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;gBAAC,IAAG,CAAC,aAAa,CAAC,MAAM,CAAC;oBAAC,MAAM,IAAI,YAAY,CAAC,GAAG,EAAC,qBAAqB,CAAC,CAAC;gBAAC,OAAO,IAAI,CAAC,GAAG,EAAC,GAAG,EAAC,MAAM,WAAW,CAAC,MAAM,EAAC,EAAC,gBAAgB,EAAC,UAAU,CAAC,IAAI,EAAC,GAAG,EAAC,GAAG,KAAK,CAAC,EAAE,IAAI,UAAU,CAAC,IAAI,EAAE,EAAC,MAAM,EAAC,KAAK,CAAC,MAAM,EAAC,CAAC,CAAC,CAAC;YAAC,CAAC;YAC9X,OAAM,KAAK,EAAE,CAAC;gBAAC,IAAG,KAAK,YAAY,YAAY,EAAC,CAAC;oBAAA,IAAG,KAAK,CAAC,IAAI,KAAG,yBAAyB,IAAE,CAAC,GAAG,CAAC,OAAO,IAAE,GAAG,CAAC,SAAS,CAAC;wBAAC,OAAO;oBAAA,OAAO,IAAI,CAAC,GAAG,EAAC,KAAK,CAAC,MAAM,EAAC,EAAC,KAAK,EAAC,KAAK,CAAC,IAAI,EAAC,OAAO,EAAC,KAAK,CAAC,OAAO,EAAC,CAAC,CAAC;gBAAA,CAAC;gBAAC,OAAO,IAAI,CAAC,GAAG,EAAC,GAAG,EAAC,EAAC,KAAK,EAAC,cAAc,EAAC,CAAC,CAAC;YAAC,CAAC;oBAAO,CAAC;gBAAA,KAAK,CAAC,OAAO,EAAE,CAAC;YAAA,CAAC;QAClR,CAAC;QACD,MAAM,oBAAoB,GAAC,IAAI,CAAC,KAAK,CAAC,wCAAwC,CAAC,CAAC;QAChF,IAAG,oBAAoB,IAAE,GAAG,CAAC,MAAM,KAAG,KAAK,EAAE,CAAC;YAC5C,MAAM,QAAQ,GAAC,IAAI,eAAe,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAAC,IAAG,CAAC,QAAQ;gBAAC,OAAO,IAAI,CAAC,GAAG,EAAC,GAAG,EAAC,EAAC,KAAK,EAAC,wBAAwB,EAAC,CAAC,CAAC;YAAA,MAAM,KAAK,GAAC,YAAY,EAAE,CAAC;YACtJ,IAAI,CAAC;gBAAC,MAAM,UAAU,GAAC,MAAM,oBAAoB,CAAC,KAAK,EAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC,CAAC;gBAAC,MAAM,MAAM,GAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,EAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;gBAAC,MAAM,MAAM,GAAC,MAAM,gBAAgB,CAAC,MAAM,EAAC,QAAQ,EAAC,EAAC,gBAAgB,EAAC,UAAU,CAAC,IAAI,EAAC,GAAG,EAAC,GAAG,KAAK,CAAC,EAAE,IAAI,UAAU,CAAC,IAAI,EAAE,EAAC,MAAM,EAAC,KAAK,CAAC,MAAM,EAAC,CAAC,CAAC;gBAAC,IAAI,MAAa,CAAC;gBAAC,IAAG,CAAC;oBAAA,MAAM,GAAC,IAAI,WAAW,CAAC,OAAO,EAAC,EAAC,KAAK,EAAC,IAAI,EAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;gBAAA,CAAC;gBAAA,MAAK,CAAC;oBAAA,MAAM,IAAI,YAAY,CAAC,GAAG,EAAC,wBAAwB,CAAC,CAAC;gBAAA,CAAC;gBAAC,MAAM,IAAI,GAAC,MAAM,KAAK,CAAC,EAAE,sBAAsB,UAAU,CAAC,eAAe,EAAE,CAAC;gBAAC,MAAM,WAAW,GAAC,CAAC,QAAe,EAAC,EAAE,GAAC,MAAM,KAAK,GAAC,QAAQ,CAAC,KAAK,CAAC,qBAAqB,CAAE,CAAC,CAAA,MAAM,OAAO,GAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA,OAAO,GAAG,IAAI,UAAU,kBAAkB,CAAC,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,GAAG,CAAC,CAAA,CAAC,CAAA,KAAK,CAAC,CAAC,CAAC,CAAA,CAAC,CAAA,EAAE,EAAE,CAAC,CAAA,CAAC,CAAC;gBAAC,OAAO,IAAI,CAAC,GAAG,EAAC,GAAG,EAAC,EAAC,IAAI,EAAC,cAAc,CAAC,MAAM,EAAC,EAAE,EAAC,QAAQ,EAAC,WAAW,CAAC,EAAC,CAAC,CAAC;YAAC,CAAC;YAC70B,OAAM,KAAK,EAAE,CAAC;gBAAC,IAAG,KAAK,YAAY,YAAY,EAAC,CAAC;oBAAA,IAAG,KAAK,CAAC,IAAI,KAAG,yBAAyB,IAAE,CAAC,GAAG,CAAC,OAAO,IAAE,GAAG,CAAC,SAAS,CAAC;wBAAC,OAAO;oBAAA,OAAO,IAAI,CAAC,GAAG,EAAC,KAAK,CAAC,MAAM,EAAC,EAAC,KAAK,EAAC,KAAK,CAAC,IAAI,EAAC,OAAO,EAAC,KAAK,CAAC,OAAO,EAAC,CAAC,CAAC;gBAAA,CAAC;gBAAC,OAAO,IAAI,CAAC,GAAG,EAAC,GAAG,EAAC,EAAC,KAAK,EAAC,cAAc,EAAC,CAAC,CAAC;YAAC,CAAC;oBAAO,CAAC;gBAAA,KAAK,CAAC,OAAO,EAAE,CAAC;YAAA,CAAC;QAClR,CAAC;QACD,MAAM,iBAAiB,GAAC,IAAI,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;QAClE,IAAG,iBAAiB,IAAE,GAAG,CAAC,MAAM,KAAG,KAAK,EAAE,CAAC;YACzC,MAAM,QAAQ,GAAC,IAAI,eAAe,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAAC,IAAG,CAAC,QAAQ;gBAAC,OAAO,IAAI,CAAC,GAAG,EAAC,GAAG,EAAC,EAAC,KAAK,EAAC,wBAAwB,EAAC,CAAC,CAAC;YAAA,MAAM,KAAK,GAAC,YAAY,EAAE,CAAC;YACtJ,IAAI,CAAC;gBAAC,MAAM,UAAU,GAAC,MAAM,oBAAoB,CAAC,KAAK,EAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC;gBAAC,MAAM,MAAM,GAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,EAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;gBAAC,MAAM,MAAM,GAAC,MAAM,gBAAgB,CAAC,MAAM,EAAC,QAAQ,EAAC,EAAC,gBAAgB,EAAC,UAAU,CAAC,IAAI,EAAC,GAAG,EAAC,GAAG,KAAK,CAAC,EAAE,IAAI,UAAU,CAAC,IAAI,EAAE,EAAC,MAAM,EAAC,KAAK,CAAC,MAAM,EAAC,CAAC,CAAC;gBAAC,GAAG,CAAC,SAAS,CAAC,GAAG,EAAC,EAAC,cAAc,EAAC,MAAM,CAAC,WAAW,EAAC,gBAAgB,EAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAC,eAAe,EAAC,UAAU,EAAC,iBAAiB,EAAC,aAAa,EAAC,wBAAwB,EAAC,SAAS,EAAC,yBAAyB,EAAC,6BAA6B,EAAC,qBAAqB,EAAC,gCAAgC,kBAAkB,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE,EAAC,CAAC,CAAC;gBAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;gBAAC,OAAO;YAAC,CAAC;YAC1pB,OAAM,KAAK,EAAE,CAAC;gBAAC,IAAG,KAAK,YAAY,YAAY,EAAC,CAAC;oBAAA,IAAG,KAAK,CAAC,IAAI,KAAG,yBAAyB,IAAE,CAAC,GAAG,CAAC,OAAO,IAAE,GAAG,CAAC,SAAS,CAAC;wBAAC,OAAO;oBAAA,OAAO,IAAI,CAAC,GAAG,EAAC,KAAK,CAAC,MAAM,EAAC,EAAC,KAAK,EAAC,KAAK,CAAC,IAAI,EAAC,OAAO,EAAC,KAAK,CAAC,OAAO,EAAC,CAAC,CAAC;gBAAA,CAAC;gBAAC,OAAO,IAAI,CAAC,GAAG,EAAC,GAAG,EAAC,EAAC,KAAK,EAAC,cAAc,EAAC,CAAC,CAAC;YAAC,CAAC;oBAAO,CAAC;gBAAA,KAAK,CAAC,OAAO,EAAE,CAAC;YAAA,CAAC;QAClR,CAAC;QACD,MAAM,mBAAmB,GAAC,IAAI,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;QACtE,IAAG,mBAAmB,IAAE,GAAG,CAAC,MAAM,KAAG,MAAM,EAAE,CAAC;YAAC,IAAI,CAAC;gBAAC,MAAM,UAAU,GAAC,MAAM,kBAAkB,CAAC,KAAK,EAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,CAAC;gBAAC,MAAM,KAAK,GAAC,MAAM,IAAI,CAAC,GAAG,EAAC,sBAAsB,CAAC,CAAC;gBAAC,IAAG,OAAO,KAAK,CAAC,MAAM,KAAG,QAAQ;oBAAC,OAAO,IAAI,CAAC,GAAG,EAAC,GAAG,EAAC,EAAC,KAAK,EAAC,uBAAuB,EAAC,CAAC,CAAC;gBAAC,IAAG,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,MAAM,EAAC,MAAM,CAAC,GAAC,cAAc;oBAAC,OAAO,IAAI,CAAC,GAAG,EAAC,GAAG,EAAC,EAAC,KAAK,EAAC,kBAAkB,EAAC,CAAC,CAAC;gBAAC,MAAM,MAAM,GAAC,MAAM,KAAK,CAAC,EAAE,MAAM,CAAC;gBAAC,OAAO,IAAI,CAAC,GAAG,EAAC,GAAG,EAAC,EAAC,IAAI,EAAC,cAAc,CAAC,KAAK,CAAC,MAAM,EAAC,MAAM,EAAC,kBAAkB,CAAC,UAAU,CAAC,CAAC,EAAC,CAAC,CAAC;YAAC,CAAC;YAAC,OAAM,KAAK,EAAC,CAAC;gBAAA,OAAO,IAAI,CAAC,GAAG,EAAC,KAAK,YAAY,SAAS,CAAA,CAAC,CAAA,KAAK,CAAC,MAAM,CAAA,CAAC,CAAA,GAAG,EAAC,EAAC,KAAK,EAAC,KAAK,YAAY,KAAK,CAAA,CAAC,CAAA,KAAK,CAAC,OAAO,CAAA,CAAC,CAAA,eAAe,EAAC,CAAC,CAAC;YAAA,CAAC;QAAC,CAAC;QACnoB,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;QAClD,IAAI,SAAS,IAAI,GAAG,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;YACtC,IAAI,CAAC;gBAAC,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAAC,CAAC;YAC1E,OAAO,KAAK,EAAE,CAAC;gBAAC,OAAO,IAAI,CAAC,GAAG,EAAE,KAAK,YAAY,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,KAAK,YAAY,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,cAAc,EAAE,CAAC,CAAC;YAAC,CAAC;QAC3J,CAAC;QACD,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;QAClD,IAAI,SAAS,IAAI,GAAG,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;YACtC,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,MAAM,kBAAkB,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC/D,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,CAAC;gBACxG,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;gBACrD,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;oBAAE,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC,CAAC;gBACnE,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,OAAO,EAAE,WAAW,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,UAAU,KAAK,IAAI,IAAI,cAAc,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC;YAC9K,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBAAC,OAAO,IAAI,CAAC,GAAG,EAAE,KAAK,YAAY,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,KAAK,YAAY,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,cAAc,EAAE,CAAC,CAAC;YAAC,CAAC;QAC7J,CAAC;QACD,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;QAClD,IAAI,SAAS,IAAI,GAAG,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;YACtC,IAAI,CAAC;gBAAC,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,GAAG,EAAE,sBAAsB,CAAC,CAAC;gBAAC,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC;YAAC,CAAC;YACvK,OAAO,KAAK,EAAE,CAAC;gBAAC,OAAO,IAAI,CAAC,GAAG,EAAE,KAAK,YAAY,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,KAAK,YAAY,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC,CAAC;YAAC,CAAC;QACnM,CAAC;QACD,IAAI,IAAI,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,KAAK,KAAK,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM,CAAC,EAAE,CAAC;YAAC,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;YAAC,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,0BAA0B,EAAE,gBAAgB,EAAE,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,eAAe,EAAE,UAAU,EAAE,iBAAiB,EAAE,aAAa,EAAE,wBAAwB,EAAE,SAAS,EAAE,yBAAyB,EAAE,6JAA6J,EAAE,CAAC,CAAC;YAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAAC,OAAO;QAAC,CAAC;QAChjB,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC;YAAE,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC;QAC1H,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC/B,IAAI,gBAAwB,CAAC;QAC7B,IAAI,CAAC;YAAC,gBAAgB,GAAG,MAAM,kBAAkB,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QAAC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAAC,OAAO,IAAI,CAAC,GAAG,EAAE,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,OAAO,KAAK,kBAAkB,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC,CAAC;QAAC,CAAC;QAChN,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,GAAG,gBAAgB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,CAAC;QACxH,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;YAC5E,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,GAAG,OAAO,IAAI,KAAK,EAAE,EAAE,eAAe,EAAE,UAAU,EAAE,iBAAiB,EAAE,aAAa,EAAE,CAAC,CAAC;YAAC,GAAG,CAAC,GAAG,EAAE,CAAC;YAAC,OAAO;QAC5I,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAClD,MAAM,iBAAiB,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,gBAAgB,GAAG,KAAK,EAAE,EAAE,MAAM,KAAK,CAAC,EAAE,MAAM,CAAC,CAAC;IACzG,CAAC;IAED,KAAK,CAAC,KAAK;QACT,MAAM,KAAK,GAAG,CAAC,MAAoB,EAAE,EAAE,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;QACnL,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;QAAC,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACrG,IAAI,CAAC;YAAC,MAAM,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;QACrD,IAAI,CAAC;YAAC,MAAM,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;gBAAS,CAAC;YAAC,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC;QAAC,CAAC;QACrF,IAAI,CAAC;YAAC,MAAM,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;IAClD,CAAC;CACF"}
@@ -1 +1 @@
1
- export declare function renderMarkdown(source: string, capabilityFsPrefix: string, filePath: string): string;
1
+ export declare function renderMarkdown(source: string, capabilityFsPrefix: string, filePath: string, internalUrl?: (target: string) => string): string;
package/dist/markdown.js CHANGED
@@ -21,7 +21,7 @@ function safeRelative(value, basePath) {
21
21
  return undefined;
22
22
  return `${joined.split("/").map(encodeURIComponent).join("/")}${suffix}`;
23
23
  }
24
- export function renderMarkdown(source, capabilityFsPrefix, filePath) {
24
+ export function renderMarkdown(source, capabilityFsPrefix, filePath, internalUrl = target => `${capabilityFsPrefix}${target}`) {
25
25
  const parsed = marked.parse(source, { gfm: true, breaks: false, async: false });
26
26
  const directory = path.posix.dirname(filePath) === "." ? "" : path.posix.dirname(filePath);
27
27
  const rewrite = (value) => value ? safeRelative(value, directory) : undefined;
@@ -30,8 +30,8 @@ export function renderMarkdown(source, capabilityFsPrefix, filePath) {
30
30
  allowedAttributes: { ...sanitizeHtml.defaults.allowedAttributes, a: ["href", "title", "target", "rel"], img: ["src", "alt", "title", "width", "height"], code: ["class"], input: ["type", "checked", "disabled"], th: ["align"], td: ["align"] },
31
31
  allowedSchemes: ["http", "https", "mailto"],
32
32
  transformTags: {
33
- a: (_tag, attrs) => { const target = rewrite(attrs.href); const external = target && /^(?:https?:|mailto:)/i.test(target); return { tagName: "a", attribs: { ...attrs, ...(target ? { href: external || target.startsWith("#") ? target : `${capabilityFsPrefix}${target}` } : { href: "#" }), ...(external ? { target: "_blank", rel: "noopener noreferrer" } : {}) } }; },
34
- img: (_tag, attrs) => { const target = rewrite(attrs.src); return { tagName: "img", attribs: { ...attrs, ...(target && !/^(?:https?:|mailto:)/i.test(target) ? { src: `${capabilityFsPrefix}${target}` } : { src: "" }) } }; },
33
+ a: (_tag, attrs) => { const target = rewrite(attrs.href); const external = target && /^(?:https?:|mailto:)/i.test(target); return { tagName: "a", attribs: { ...attrs, ...(target ? { href: external || target.startsWith("#") ? target : internalUrl(target) } : { href: "#" }), ...(external ? { target: "_blank", rel: "noopener noreferrer" } : {}) } }; },
34
+ img: (_tag, attrs) => { const target = rewrite(attrs.src); return { tagName: "img", attribs: { ...attrs, ...(target && !/^(?:https?:|mailto:)/i.test(target) ? { src: internalUrl(target) } : { src: "" }) } }; },
35
35
  input: (_tag, attrs) => ({ tagName: "input", attribs: { type: attrs.type === "checkbox" ? "checkbox" : "", ...(attrs.checked !== undefined ? { checked: "checked" } : {}), disabled: "disabled" } }),
36
36
  },
37
37
  });
@@ -1 +1 @@
1
- {"version":3,"file":"markdown.js","sourceRoot":"","sources":["../src/markdown.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"markdown.js","sourceRoot":"","sources":["../src/markdown.ts"],"names":[],"mappings":"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"}
package/dist/paths.d.ts CHANGED
@@ -5,4 +5,10 @@ export declare function canonicalTarget(input: string): Promise<{
5
5
  kind: ShareKind;
6
6
  }>;
7
7
  export declare function decodeRelativePath(raw: string): string;
8
+ export interface AuthorizedShareTarget {
9
+ relative: string;
10
+ encodedRelative: string;
11
+ real: string;
12
+ }
13
+ export declare function authorizeShareTarget(share: Share, rawRelative: string): Promise<AuthorizedShareTarget>;
8
14
  export declare function authorizeSharePath(share: Share, rawRelative: string): Promise<string>;
package/dist/paths.js CHANGED
@@ -55,7 +55,7 @@ function inside(parent, child) {
55
55
  const rel = path.relative(parent, child);
56
56
  return rel === "" || (!rel.startsWith(`..${path.sep}`) && rel !== ".." && !path.isAbsolute(rel));
57
57
  }
58
- export async function authorizeSharePath(share, rawRelative) {
58
+ export async function authorizeShareTarget(share, rawRelative) {
59
59
  const relative = decodeRelativePath(rawRelative);
60
60
  if (share.kind === "file") {
61
61
  const expected = path.basename(share.target);
@@ -83,6 +83,9 @@ export async function authorizeSharePath(share, rawRelative) {
83
83
  const scope = share.target;
84
84
  if (share.kind === "file" ? real !== scope : !inside(scope, real))
85
85
  throw new Error("symlink escape denied");
86
- return relative.split(path.sep).map(encodeURIComponent).join("/");
86
+ return { relative, encodedRelative: relative.split(path.sep).map(encodeURIComponent).join("/"), real };
87
+ }
88
+ export async function authorizeSharePath(share, rawRelative) {
89
+ return (await authorizeShareTarget(share, rawRelative)).encodedRelative;
87
90
  }
88
91
  //# sourceMappingURL=paths.js.map
package/dist/paths.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"paths.js","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"paths.js","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"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"}
package/dist/ui.js CHANGED
@@ -1,17 +1,19 @@
1
1
  export function previewHtml(share) {
2
2
  const config = JSON.stringify({ shareId: share.id, kind: share.kind, permission: share.permission, initialPath: share.kind === "file" ? share.target.split("/").pop() : "" }).replace(/</g, "\\u003c");
3
3
  return `<!doctype html><html><head><meta charset="utf-8"><meta name="viewport" content="width=device-width"><title>Fileport</title>
4
- <style>:root{font:15px system-ui,sans-serif;color:#202124;background:#f6f7f9}*{box-sizing:border-box}body{margin:0}header{height:52px;display:flex;align-items:center;gap:12px;padding:0 18px;background:#fff;border-bottom:1px solid #dfe1e5}header strong{font-size:17px}.badge{font-size:12px;padding:3px 7px;border-radius:12px;background:#e8f0fe;color:#174ea6}main{max-width:1200px;margin:18px auto;padding:0 16px}.toolbar{display:flex;gap:8px;align-items:center;margin-bottom:12px}.path{font-family:ui-monospace,monospace;overflow-wrap:anywhere}.status{margin-left:auto;color:#5f6368;font-size:13px}.panel{background:#fff;border:1px solid #dfe1e5;border-radius:10px;overflow:hidden;min-height:160px}.entry{display:flex;gap:10px;padding:10px 14px;border-bottom:1px solid #eee;color:#174ea6;text-decoration:none}.entry:hover{background:#f8faff}.content{padding:18px;overflow:auto}pre{margin:0;white-space:pre-wrap;word-break:break-word;font:13px/1.5 ui-monospace,SFMono-Regular,monospace}table{border-collapse:collapse;width:100%}td,th{border:1px solid #ddd;padding:6px;text-align:left}img{max-width:100%;height:auto}.error{color:#b3261e;padding:18px}button{border:1px solid #ccd;background:#fff;border-radius:6px;padding:6px 10px;cursor:pointer}button:disabled{opacity:.5}.save{background:#174ea6;color:#fff}textarea{width:100%;height:70vh;border:0;padding:16px;resize:vertical;font:13px/1.5 ui-monospace,SFMono-Regular,monospace}.markdown-body{font-size:16px;line-height:1.65;color:#1f2328}.markdown-body h1,.markdown-body h2,.markdown-body h3{line-height:1.25;margin:1.4em 0 .6em}.markdown-body h1,.markdown-body h2{padding-bottom:.3em;border-bottom:1px solid #d8dee4}.markdown-body p{margin:.8em 0}.markdown-body ul,.markdown-body ol{padding-left:2em}.markdown-body li+li{margin-top:.25em}.markdown-body blockquote{margin:1em 0;padding:0 1em;color:#59636e;border-left:.25em solid #d0d7de}.markdown-body code{padding:.15em .35em;border-radius:4px;background:#eff1f3;font:85% ui-monospace,SFMono-Regular,monospace}.markdown-body pre{padding:16px;overflow:auto;background:#f6f8fa;border-radius:6px;white-space:pre}.markdown-body pre code{padding:0;background:transparent;font-size:100%}.markdown-body table{display:block;overflow:auto;margin:1em 0;border-spacing:0}.markdown-body th{font-weight:600;background:#f6f8fa}.markdown-body th,.markdown-body td{padding:6px 13px;border:1px solid #d0d7de}.markdown-body tr:nth-child(2n){background:#f6f8fa}.markdown-body a{color:#0969da;text-decoration:none}.markdown-body a:hover{text-decoration:underline}.markdown-body hr{height:.25em;border:0;background:#d0d7de}.markdown-body input[type=checkbox]{margin-right:.5em}</style></head><body>
4
+ <style>:root{font:15px system-ui,sans-serif;color:#202124;background:#f6f7f9}*{box-sizing:border-box}body{margin:0}header{height:52px;display:flex;align-items:center;gap:12px;padding:0 18px;background:#fff;border-bottom:1px solid #dfe1e5}header strong{font-size:17px}.badge{font-size:12px;padding:3px 7px;border-radius:12px;background:#e8f0fe;color:#174ea6}main{max-width:1200px;margin:18px auto;padding:0 16px}.toolbar{display:flex;gap:8px;align-items:center;margin-bottom:12px}.path{font-family:ui-monospace,monospace;overflow-wrap:anywhere}.status{margin-left:auto;color:#5f6368;font-size:13px}.panel{background:#fff;border:1px solid #dfe1e5;border-radius:10px;overflow:hidden;min-height:160px}.entry{display:flex;gap:10px;padding:10px 14px;border-bottom:1px solid #eee;color:#174ea6;text-decoration:none}.entry:hover{background:#f8faff}.entry-meta{margin-left:auto;color:#5f6368;font-size:12px}.archive-summary{padding:12px 14px;background:#f8faff;border-bottom:1px solid #e5e7eb;color:#5f6368}.content{padding:18px;overflow:auto}pre{margin:0;white-space:pre-wrap;word-break:break-word;font:13px/1.5 ui-monospace,SFMono-Regular,monospace}table{border-collapse:collapse;width:100%}td,th{border:1px solid #ddd;padding:6px;text-align:left}img{max-width:100%;height:auto}.error{color:#b3261e;padding:18px}button{border:1px solid #ccd;background:#fff;border-radius:6px;padding:6px 10px;cursor:pointer}button:disabled{opacity:.5}.save{background:#174ea6;color:#fff}textarea{width:100%;height:70vh;border:0;padding:16px;resize:vertical;font:13px/1.5 ui-monospace,SFMono-Regular,monospace}.markdown-body{font-size:16px;line-height:1.65;color:#1f2328}.markdown-body h1,.markdown-body h2,.markdown-body h3{line-height:1.25;margin:1.4em 0 .6em}.markdown-body h1,.markdown-body h2{padding-bottom:.3em;border-bottom:1px solid #d8dee4}.markdown-body p{margin:.8em 0}.markdown-body ul,.markdown-body ol{padding-left:2em}.markdown-body li+li{margin-top:.25em}.markdown-body blockquote{margin:1em 0;padding:0 1em;color:#59636e;border-left:.25em solid #d0d7de}.markdown-body code{padding:.15em .35em;border-radius:4px;background:#eff1f3;font:85% ui-monospace,SFMono-Regular,monospace}.markdown-body pre{padding:16px;overflow:auto;background:#f6f8fa;border-radius:6px;white-space:pre}.markdown-body pre code{padding:0;background:transparent;font-size:100%}.markdown-body table{display:block;overflow:auto;margin:1em 0;border-spacing:0}.markdown-body th{font-weight:600;background:#f6f8fa}.markdown-body th,.markdown-body td{padding:6px 13px;border:1px solid #d0d7de}.markdown-body tr:nth-child(2n){background:#f6f8fa}.markdown-body a{color:#0969da;text-decoration:none}.markdown-body a:hover{text-decoration:underline}.markdown-body hr{height:.25em;border:0;background:#d0d7de}.markdown-body input[type=checkbox]{margin-right:.5em}</style></head><body>
5
5
  <header><strong>Fileport</strong><span class="badge">${share.permission === "rw" ? "RW · saves modify the authoritative file" : "RO · read-only capability"}</span></header>
6
6
  <main><div class="toolbar"><button id="up">Up</button><button id="edit" hidden>Edit</button><button id="save" class="save" hidden>Save</button><button id="download" hidden>Download</button><span class="path" id="path"></span><span class="status" id="status"></span></div><section class="panel" id="view"><div class="content">Loading…</div></section></main>
7
7
  <script>const CONFIG=${config};
8
- const view=document.getElementById('view'),pathLabel=document.getElementById('path'),up=document.getElementById('up'),edit=document.getElementById('edit'),save=document.getElementById('save'),downloadBtn=document.getElementById('download'),status=document.getElementById('status');let active={path:'',text:'',version:'',editable:false,editing:false,type:''};
8
+ let archiveObjectUrl='';const releaseObjectUrl=()=>{if(archiveObjectUrl){URL.revokeObjectURL(archiveObjectUrl);archiveObjectUrl=''}};const objectUrl=blob=>{releaseObjectUrl();archiveObjectUrl=URL.createObjectURL(blob);return archiveObjectUrl};const view=document.getElementById('view'),pathLabel=document.getElementById('path'),up=document.getElementById('up'),edit=document.getElementById('edit'),save=document.getElementById('save'),downloadBtn=document.getElementById('download'),status=document.getElementById('status');let active={path:'',text:'',version:'',editable:false,editing:false,type:''};
9
9
  const esc=s=>String(s).replace(/[&<>"']/g,c=>({'&':'&amp;','<':'&lt;','>':'&gt;','"':'&quot;',"'":'&#39;'}[c]));
10
- const enc=p=>p.split('/').filter(Boolean).map(encodeURIComponent).join('/');const fsUrl=p=>'/s/'+CONFIG.shareId+'/fs/'+enc(p);const apiUrl=(kind,p)=>'/s/'+CONFIG.shareId+'/api/'+kind+'/'+enc(p);const current=()=>new URL(location.href).searchParams.get('path')??CONFIG.initialPath;
10
+ const enc=p=>p.split('/').filter(Boolean).map(encodeURIComponent).join('/');const fsUrl=p=>'/s/'+CONFIG.shareId+'/fs/'+enc(p);const apiUrl=(kind,p)=>'/s/'+CONFIG.shareId+'/api/'+kind+'/'+enc(p);const archiveUrl=(kind,p,entry)=>apiUrl('archive/'+kind,p)+(entry?'?entry='+encodeURIComponent(entry):'');const current=()=>new URL(location.href).searchParams.get('path')??CONFIG.initialPath;const archiveExt=p=>/\.(?:zip|tar|tar\.gz|tgz|tar\.bz2|tbz2?|tar\.xz|txz)$/i.test(p);const size=n=>{if(!Number.isFinite(n))return '';const units=['B','KiB','MiB','GiB'];let i=0;while(n>=1024&&i<units.length-1){n/=1024;i++}return (i?n.toFixed(n>=10?0:1):String(n))+' '+units[i]};
11
11
  function navigate(p){const u=new URL(location.href);p?u.searchParams.set('path',p):u.searchParams.delete('path');history.pushState({},'',u);render()}
12
12
  function csv(text){const rows=text.trim().split(/\\r?\\n/).map(r=>r.split(','));return '<table>'+rows.map((r,i)=>'<tr>'+r.map(c=>'<'+(i?'td':'th')+'>'+esc(c)+'</'+(i?'td':'th')+'>').join('')+'</tr>').join('')+'</table>'}
13
- async function sourceView(p,text,type){const ext=p.toLowerCase().split('.').pop();if(type.includes('text/html')||ext==='html'){const url=URL.createObjectURL(new Blob([text],{type:'text/html'}));view.innerHTML='<iframe sandbox="allow-scripts" style="width:100%;height:75vh;border:0" src="'+url+'"></iframe>';return}let formatted=text;if(ext==='json'){try{formatted=JSON.stringify(JSON.parse(text),null,2)}catch{}}if(ext==='md'||ext==='markdown'){const response=await fetch(apiUrl('render/markdown',p),{method:'POST',headers:{'content-type':'application/json'},body:JSON.stringify({source:text})});const data=await response.json();if(!response.ok)throw new Error(data.error||'Markdown render failed');view.innerHTML='<article class="content markdown-body">'+data.html+'</article>';return}if(ext==='csv'||ext==='tsv'){view.innerHTML='<div class="content">'+(ext==='csv'?csv(formatted):csv(formatted.replaceAll('\\t',',')))+'</div>';return}view.innerHTML='<div class="content"><pre>'+esc(formatted)+'</pre></div>'}
14
- async function showFile(p){const response=await fetch(fsUrl(p));if(!response.ok)throw new Error('HTTP '+response.status);const type=response.headers.get('content-type')||'';if(type.startsWith('image/')){const url=URL.createObjectURL(await response.blob());view.innerHTML='<div class="content"><img alt="preview" src="'+url+'"></div>';return}let text=await response.text(),version='',editable=false;if(CONFIG.permission==='rw'){const editResponse=await fetch(apiUrl('edit',p));if(editResponse.ok){const snapshot=await editResponse.json();text=snapshot.content;version=snapshot.version;editable=snapshot.editable===true}}active={path:p,text,version,editable,editing:false,type};await sourceView(p,text,type);downloadBtn.hidden=false;downloadBtn.onclick=()=>{const a=document.createElement('a');a.href=fsUrl(p);a.download=p.split('/').pop()||'download';a.click()};edit.hidden=!active.editable;edit.onclick=()=>{active.editing=true;view.innerHTML='<textarea id="editor"></textarea>';document.getElementById('editor').value=active.text;edit.hidden=true;save.hidden=false;downloadBtn.hidden=true;status.textContent='Unsaved changes'};save.onclick=async()=>{if(!confirm('Save changes to the authoritative file?'))return;save.disabled=true;const content=document.getElementById('editor').value,response=await fetch(apiUrl('save',active.path),{method:'PUT',headers:{'content-type':'application/json'},body:JSON.stringify({content,expectedVersion:active.version})}),data=await response.json();save.disabled=false;if(!response.ok){status.textContent='Save failed: '+data.error;return}active.text=content;active.version=data.version;active.editing=false;status.textContent='Saved';edit.hidden=false;save.hidden=true;await sourceView(active.path,active.text,active.type)}}
13
+ async function sourceView(p,text,type,archive=false){const ext=p.toLowerCase().split('.').pop();if(type.includes('text/html')||ext==='html'){const url=archive?objectUrl(new Blob([text],{type:'text/html'})):URL.createObjectURL(new Blob([text],{type:'text/html'}));view.innerHTML='<iframe sandbox="'+(archive?'':'allow-scripts')+'" style="width:100%;height:75vh;border:0" src="'+url+'"></iframe>';return}let formatted=text;if(ext==='json'){try{formatted=JSON.stringify(JSON.parse(text),null,2)}catch{}}if(ext==='md'||ext==='markdown'){const response=await fetch(apiUrl('render/markdown',p),{method:'POST',headers:{'content-type':'application/json'},body:JSON.stringify({source:text})});const data=await response.json();if(!response.ok)throw new Error(data.error||'Markdown render failed');view.innerHTML='<article class="content markdown-body">'+data.html+'</article>';return}if(ext==='csv'||ext==='tsv'){view.innerHTML='<div class="content">'+(ext==='csv'?csv(formatted):csv(formatted.replaceAll('\\t',',')))+'</div>';return}view.innerHTML='<div class="content"><pre>'+esc(formatted)+'</pre></div>'}
14
+ async function showArchiveEntry(archive,entry){releaseObjectUrl();status.textContent='Loading '+entry+'…';const response=await fetch(archiveUrl('entry',archive,entry));if(!response.ok){const data=await response.json().catch(()=>({}));throw new Error(data.message||data.error||('HTTP '+response.status))}const type=response.headers.get('content-type')||'',blob=await response.blob();pathLabel.textContent='/'+archive+'!/'+entry;up.disabled=false;up.onclick=()=>showArchive(archive);downloadBtn.hidden=false;downloadBtn.onclick=()=>{const a=document.createElement('a');a.href=URL.createObjectURL(blob);a.download=entry.split('/').pop()||'download';a.click();setTimeout(()=>URL.revokeObjectURL(a.href),1000)};if(type.startsWith('image/')){const object=objectUrl(blob);view.innerHTML='<div class="content"><img alt="preview" src="'+object+'"></div>';status.textContent=size(blob.size);return}if(type==='application/pdf'){const object=objectUrl(blob);view.innerHTML='<iframe sandbox title="PDF preview" style="width:100%;height:75vh;border:0" src="'+object+'"></iframe>';status.textContent=size(blob.size);return}if(type.startsWith('audio/')||type.startsWith('video/')){const object=objectUrl(blob),tag=type.startsWith('audio/')?'audio':'video';view.innerHTML='<div class="content"><'+tag+' controls style="max-width:100%" src="'+object+'"></'+tag+'></div>';status.textContent=size(blob.size);return}const textual=type.startsWith('text/')||/(?:json|javascript|xml|yaml)/i.test(type)||/\.(?:md|markdown|txt|json|csv|tsv|ya?ml|toml|xml|html?|css|js|mjs|cjs|ts|tsx|jsx|py|go|rs|java|kt|sh|bash|zsh|fish|sql|log|ini|conf)$/i.test(entry);if(!textual){view.innerHTML='<div class="content">Binary entry cannot be rendered safely. Use Download to save it.</div>';status.textContent=size(blob.size);return}if(/\.(?:md|markdown)$/i.test(entry)){const rendered=await fetch(apiUrl('archive/render/markdown',archive)+'?entry='+encodeURIComponent(entry)),data=await rendered.json();if(!rendered.ok)throw new Error(data.message||data.error||'Markdown render failed');view.innerHTML='<article class="content markdown-body">'+data.html+'</article>';status.textContent=size(blob.size);return}const text=await blob.text();await sourceView(entry,text,type,true);status.textContent=size(blob.size)}
15
+ async function showArchive(p){releaseObjectUrl();const response=await fetch(archiveUrl('list',p));if(!response.ok){const data=await response.json().catch(()=>({}));throw new Error(data.message||data.error||('HTTP '+response.status))}const data=await response.json(),entries=data.entries||[];pathLabel.textContent='/'+p;up.disabled=CONFIG.kind==='file';up.onclick=()=>CONFIG.kind==='file'?null:navigate(p.split('/').slice(0,-1).join('/'));downloadBtn.hidden=false;downloadBtn.onclick=()=>{const a=document.createElement('a');a.href=fsUrl(p);a.download=p.split('/').pop()||'archive';a.click()};status.textContent=entries.length+' entries';const summary='<div class="archive-summary">'+esc(String(data.format).toUpperCase())+' archive · '+entries.length+' entries'+(data.skippedUnsafe?' · '+data.skippedUnsafe+' unsafe paths hidden':'')+' · preview limit '+esc(size(data.limits.maxPreviewBytes))+'</div>';view.innerHTML=summary+(entries.length?entries.map(item=>{const icon=item.type==='directory'?'📁':item.type==='symlink'?'🔗':'📄',meta=[item.type,size(item.size),item.encrypted?'encrypted':'',!item.previewable&&item.type==='file'?'download only':''].filter(Boolean).join(' · ');return item.previewable?'<a class="entry" href="#" data-archive-entry="'+esc(item.path)+'"><span>'+icon+'</span><span>'+esc(item.path)+'</span><span class="entry-meta">'+esc(meta)+'</span></a>':'<div class="entry"><span>'+icon+'</span><span>'+esc(item.path)+'</span><span class="entry-meta">'+esc(meta)+'</span></div>'}).join(''):'<div class="content">Empty archive</div>');view.querySelectorAll('[data-archive-entry]').forEach(a=>a.addEventListener('click',e=>{e.preventDefault();showArchiveEntry(p,a.dataset.archiveEntry).catch(error=>{view.innerHTML='<div class="error">'+esc(error.message||error)+'</div>'})}))}
16
+ async function showFile(p){releaseObjectUrl();if(archiveExt(p)){await showArchive(p);return}const response=await fetch(fsUrl(p));if(!response.ok)throw new Error('HTTP '+response.status);const type=response.headers.get('content-type')||'';if(type.startsWith('image/')){const url=URL.createObjectURL(await response.blob());view.innerHTML='<div class="content"><img alt="preview" src="'+url+'"></div>';return}let text=await response.text(),version='',editable=false;if(CONFIG.permission==='rw'){const editResponse=await fetch(apiUrl('edit',p));if(editResponse.ok){const snapshot=await editResponse.json();text=snapshot.content;version=snapshot.version;editable=snapshot.editable===true}}active={path:p,text,version,editable,editing:false,type};await sourceView(p,text,type);downloadBtn.hidden=false;downloadBtn.onclick=()=>{const a=document.createElement('a');a.href=fsUrl(p);a.download=p.split('/').pop()||'download';a.click()};edit.hidden=!active.editable;edit.onclick=()=>{active.editing=true;view.innerHTML='<textarea id="editor"></textarea>';document.getElementById('editor').value=active.text;edit.hidden=true;save.hidden=false;downloadBtn.hidden=true;status.textContent='Unsaved changes'};save.onclick=async()=>{if(!confirm('Save changes to the authoritative file?'))return;save.disabled=true;const content=document.getElementById('editor').value,response=await fetch(apiUrl('save',active.path),{method:'PUT',headers:{'content-type':'application/json'},body:JSON.stringify({content,expectedVersion:active.version})}),data=await response.json();save.disabled=false;if(!response.ok){status.textContent='Save failed: '+data.error;return}active.text=content;active.version=data.version;active.editing=false;status.textContent='Saved';edit.hidden=false;save.hidden=true;await sourceView(active.path,active.text,active.type)}}
15
17
  async function showDirectory(p){const response=await fetch((p?fsUrl(p)+'/':fsUrl(''))+'?json');if(!response.ok)throw new Error('HTTP '+response.status);const data=await response.json(),entries=data.paths||[];view.innerHTML=entries.length?entries.map(item=>{const name=String(item.name),leaf=name.includes('/')?name.slice(name.lastIndexOf('/')+1):name,next=[p,leaf].filter(Boolean).join('/'),icon=item.path_type==='Dir'?'📁':'📄';return '<a class="entry" href="?path='+encodeURIComponent(next)+'" data-path="'+esc(next)+'"><span>'+icon+'</span><span>'+esc(leaf)+'</span></a>'}).join(''):'<div class="content">Empty directory</div>';view.querySelectorAll('[data-path]').forEach(a=>a.addEventListener('click',e=>{e.preventDefault();navigate(a.dataset.path)}))}
16
18
  async function render(){const p=current();edit.hidden=true;save.hidden=true;status.textContent='';pathLabel.textContent='/'+p;up.disabled=!p||CONFIG.kind==='file';up.onclick=()=>navigate(p.split('/').slice(0,-1).join('/'));view.innerHTML='<div class="content">Loading…</div>';try{if(CONFIG.kind==='file')await showFile(CONFIG.initialPath);else{const probe=await fetch(fsUrl(p)+(p?'/':'')+'?json');if(probe.ok){const data=await probe.clone().json().catch(()=>null);if(data?.kind==='Index'){await showDirectory(p);return}}await showFile(p)}}catch(e){view.innerHTML='<div class="error">'+esc(e.message||e)+'</div>'}}
17
19
  addEventListener('popstate',render);render();</script></body></html>`;
package/dist/ui.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"ui.js","sourceRoot":"","sources":["../src/ui.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,WAAW,CAAC,KAAY;IACtC,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE,WAAW,EAAE,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IACxM,OAAO;;uDAE8C,KAAK,CAAC,UAAU,KAAK,IAAI,CAAC,CAAC,CAAC,0CAA0C,CAAC,CAAC,CAAC,2BAA2B;;uBAEpI,MAAM;;;;;;;;;;qEAUwC,CAAC;AACtE,CAAC"}
1
+ {"version":3,"file":"ui.js","sourceRoot":"","sources":["../src/ui.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,WAAW,CAAC,KAAY;IACtC,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE,WAAW,EAAE,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IACxM,OAAO;;uDAE8C,KAAK,CAAC,UAAU,KAAK,IAAI,CAAC,CAAC,CAAC,0CAA0C,CAAC,CAAC,CAAC,2BAA2B;;uBAEpI,MAAM;;;;;;;;;;;;qEAYwC,CAAC;AACtE,CAAC"}
@@ -2,7 +2,7 @@
2
2
 
3
3
  ## Scope
4
4
 
5
- This document describes the clean-room Phase 0/1 implementation in this repository. The historical portable kit is reference material only and is not present in this Git history.
5
+ This document describes the current clean-room implementation in this repository. The historical portable kit is reference material only and is not present in this Git history.
6
6
 
7
7
  ## Historical implementation observed (reference only)
8
8
 
@@ -24,7 +24,7 @@ Agent CLI
24
24
  └─ Fileport Gateway :7892
25
25
  ├─ ShareRegistry ($STATE/shares.json, 0600)
26
26
  ├─ capability URL + scope guard
27
- ├─ minimal read-only preview shell
27
+ ├─ preview shell + bounded archive inspection
28
28
  └─ reverse proxy
29
29
  └─ official Dufs 0.46.0 worker per canonical root
30
30
  └─ Unix socket (0600), no TCP listener
@@ -39,8 +39,10 @@ Agent CLI
39
39
  | `src/workers.ts` | `canonical root -> Dufs child`, concurrent start deduplication, stale socket recovery, readiness probe and crash restart |
40
40
  | `src/paths.ts` | URL decoding, traversal rejection, realpath scope check, symlink escape rejection and sensitive-target guard |
41
41
  | `src/proxy.ts` | streaming HTTP/HEAD/Range reverse proxy over Unix sockets |
42
- | `src/gateway.ts` | public capability routes, local control API, read-only policy and Gateway health |
43
- | `src/ui.ts` | intentionally small Phase 1 read-only preview shell; no historical UI source was imported |
42
+ | `src/archive.ts` | bounded archive-job queue, worker lifecycle, timeout and cancellation |
43
+ | `src/archive-worker.ts` / `src/archive-engine.ts` | memory-isolated archive parsing, safe manifests, bounded ZIP/tar scans and entry reads |
44
+ | `src/gateway.ts` | public capability, archive and render routes; local control API; read-only policy; Gateway health |
45
+ | `src/ui.ts` | preview shell for directories, files and archive entries; no historical UI source was imported |
44
46
 
45
47
  ## URL model
46
48
 
@@ -50,6 +52,31 @@ Agent CLI
50
52
  - A file share permits exactly its one basename.
51
53
  - A directory share permits only canonical descendants of that directory.
52
54
  - Dufs's root is never trusted as the authorization boundary: every request passes the Gateway scope guard before proxying.
55
+ - Archive manifest route: `GET /s/<capability>/api/archive/list/<relative-archive-path>`
56
+ - Archive entry route: `GET /s/<capability>/api/archive/entry/<relative-archive-path>?entry=<archive-entry-path>`
57
+ - Both archive routes authorize the archive file against the capability scope before opening it.
58
+
59
+ ## Archive browsing and entry preview
60
+
61
+ Archive recognition is extension-based and case-insensitive. Supported names end in `.zip`, `.tar`, `.tar.gz`/`.tgz`, `.tar.bz2`/`.tbz`/`.tbz2`, or `.tar.xz`/`.txz`; a matching but corrupt input fails closed as an invalid archive.
62
+
63
+ `src/archive-engine.ts` returns a stable path-sorted manifest. The browser displays the archive format, entry count, paths, entry types, uncompressed sizes, ZIP encryption state and the number of omitted unsafe paths. A regular file is previewable only when it is not encrypted, its compression method is supported, its declared uncompressed size is at most 10 MiB, and—for ZIP—its compressed size is at most the 256 MiB scan limit. The entry response is magic-validated for active binary previews and otherwise downgraded to `application/octet-stream`; it carries an attachment disposition plus `no-store`, `nosniff`, `no-referrer` and a restrictive sandbox CSP, and is fetched as a Blob by the preview shell before being passed to the existing image, PDF, media, Markdown, source/text or bounded binary-entry view. Archive APIs never edit an entry, including under an RW share.
64
+
65
+ ZIP processing uses `yauzl` in lazy-entry mode with entry-size validation. The central directory is read to build the manifest; only the requested entry stream is opened for preview. Tar processing streams the source through the format-specific decompressor and a 256 MiB expanded-stream limiter into `tar-stream`. Opening a tar entry performs a fresh bounded scan of the archive. No entry is extracted to disk or written alongside the archive; at most the selected, checked entry is buffered in memory for the HTTP response. Parsing runs in memory-limited worker threads behind a two-job global/per-archive limiter, a bounded queue and a 15-second timeout; client disconnects abort queued or active work.
66
+
67
+ Archive safety rules are:
68
+
69
+ - the archive input must be a regular file no larger than 512 MiB;
70
+ - at most 10,000 entries are accepted; for tar this count includes unsafe entries that are subsequently omitted; each normalized path is capped at 4 KiB and aggregate manifest path text at 4 MiB;
71
+ - each tar or compressed-tar scan stops after 256 MiB of expanded tar data;
72
+ - an entry preview is capped at 10 MiB, with the actual streamed bytes checked as well as declared size;
73
+ - archive files are opened read-only with `O_NOFOLLOW` after normal share-scope authorization, and the opened descriptor is verified through `/proc/self/fd` against the authorized real path;
74
+ - leading `./` prefixes and trailing directory slashes are normalized; after that, absolute paths, drive-prefixed paths, backslashes, NULs, empty components, and `.` or `..` components are excluded from the manifest and cannot be requested;
75
+ - symlinks, hard links and other non-regular entries are never dereferenced or previewed;
76
+ - encrypted or otherwise undecodable ZIP entries are listed but cannot be previewed;
77
+ - malformed archives and limit violations fail closed instead of returning partial entry content.
78
+
79
+ The original archive remains downloadable through the ordinary scoped filesystem route. Entries that are encrypted, non-regular, or over the preview limit require downloading the original archive and handling it with a trusted local tool.
53
80
 
54
81
  ## Security properties in Phase 1
55
82
 
@@ -40,9 +40,27 @@ Acceptance invariants:
40
40
  - No create/delete/rename/full filesystem RW.
41
41
  - Preview UI exposes Edit/Save only for eligible RW files and requires an explicit browser confirmation.
42
42
 
43
+ ## Archive preview extension — delivered
44
+
45
+ - Recognize `.zip`, `.tar`, `.tar.gz`/`.tgz`, `.tar.bz2`/`.tbz`/`.tbz2`, and `.tar.xz`/`.txz` by extension.
46
+ - Add capability-scoped archive manifest and entry-preview APIs plus browser navigation for archive contents.
47
+ - Reuse the existing image, PDF, media, Markdown and source/text renderers for eligible entries, with a bounded download path for selected binary entries.
48
+ - Parse and decompress archives as streams without extracting entries to disk.
49
+ - Enforce a 512 MiB archive input limit, 10,000 entries, 4 KiB per path, 4 MiB aggregate manifest paths, 256 MiB of expanded tar data per scan, and 10 MiB per entry preview; isolate parsing in bounded, timeout-controlled worker threads.
50
+ - Omit unsafe archive paths; never follow archive symlinks or hard links; list encrypted ZIP entries without attempting to decrypt or preview them.
51
+
52
+ Acceptance invariants:
53
+
54
+ - archive APIs cannot open an archive outside the capability's file or directory scope;
55
+ - an RW share does not make archive entries editable;
56
+ - no archive operation creates extracted files or follows an entry link target;
57
+ - traversal-style entry names cannot be listed as safe or requested directly;
58
+ - corrupt, encrypted, oversized and over-entry-limit cases fail closed;
59
+ - the complete original archive remains downloadable through the existing scoped filesystem route.
60
+
43
61
  ## Phase 3 — lifecycle and product UI
44
62
 
45
- Add expiry CLI parsing, share inspection, cleanup/reaping, richer artifact renderers, Markdown/source views, `--line`, VSCode Remote link and PlantUML sandbox. Restore behaviors from contracts, not copied historical source.
63
+ Continue share inspection, cleanup/reaping and richer artifact renderers. Add `--line`, VSCode Remote links and a PlantUML sandbox. Restore behaviors from contracts, not copied historical source.
46
64
 
47
65
  ## Phase 4 — operations
48
66
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fileport-gateway",
3
- "version": "0.1.8",
3
+ "version": "0.2.0",
4
4
  "description": "Secure Agent Artifact Gateway with capability URLs, strict saves, and Dufs-backed file serving.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -21,10 +21,15 @@
21
21
  "npm": ">=11.5.1"
22
22
  },
23
23
  "devDependencies": {
24
+ "@types/mime-types": "^3.0.1",
24
25
  "@types/node": "^22.15.0",
25
26
  "@types/sanitize-html": "^2.16.1",
27
+ "@types/unbzip2-stream": "^1.4.3",
28
+ "@types/yauzl": "^3.4.0",
29
+ "@types/yazl": "^2.4.5",
26
30
  "tsx": "^4.20.0",
27
- "typescript": "^5.8.0"
31
+ "typescript": "^5.8.0",
32
+ "yazl": "^3.3.1"
28
33
  },
29
34
  "license": "MIT",
30
35
  "files": [
@@ -68,6 +73,11 @@
68
73
  },
69
74
  "dependencies": {
70
75
  "marked": "^16.4.2",
71
- "sanitize-html": "^2.17.7"
76
+ "mime-types": "^3.0.1",
77
+ "sanitize-html": "^2.17.7",
78
+ "tar-stream": "^3.2.1",
79
+ "unbzip2-stream": "^1.4.3",
80
+ "xz-decompress": "^0.2.3",
81
+ "yauzl": "^3.4.0"
72
82
  }
73
83
  }