swarm-deploy 0.0.0 → 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/CHANGELOG.md +76 -0
- package/LICENSE.md +201 -0
- package/NOTICE.md +13 -0
- package/README.md +1283 -0
- package/RELEASING.md +71 -0
- package/SECURITY.md +40 -0
- package/dist/abort.d.ts +16 -0
- package/dist/abort.js +52 -0
- package/dist/abort.js.map +1 -0
- package/dist/allowlist.d.ts +2 -0
- package/dist/allowlist.js +21 -0
- package/dist/allowlist.js.map +1 -0
- package/dist/bin/swarm-deploy.d.ts +2 -0
- package/dist/bin/swarm-deploy.js +41 -0
- package/dist/bin/swarm-deploy.js.map +1 -0
- package/dist/cli.d.ts +27 -0
- package/dist/cli.js +751 -0
- package/dist/cli.js.map +1 -0
- package/dist/client.d.ts +111 -0
- package/dist/client.js +276 -0
- package/dist/client.js.map +1 -0
- package/dist/direct-dht.d.ts +81 -0
- package/dist/direct-dht.js +254 -0
- package/dist/direct-dht.js.map +1 -0
- package/dist/error-code.d.ts +15 -0
- package/dist/error-code.js +30 -0
- package/dist/error-code.js.map +1 -0
- package/dist/errors.d.ts +31 -0
- package/dist/errors.js +37 -0
- package/dist/errors.js.map +1 -0
- package/dist/events-node.d.ts +2 -0
- package/dist/events-node.js +7 -0
- package/dist/events-node.js.map +1 -0
- package/dist/files.d.ts +32 -0
- package/dist/files.js +85 -0
- package/dist/files.js.map +1 -0
- package/dist/fs-node.d.ts +2 -0
- package/dist/fs-node.js +7 -0
- package/dist/fs-node.js.map +1 -0
- package/dist/hooks-module.d.ts +9 -0
- package/dist/hooks-module.js +118 -0
- package/dist/hooks-module.js.map +1 -0
- package/dist/hooks.d.ts +69 -0
- package/dist/hooks.js +88 -0
- package/dist/hooks.js.map +1 -0
- package/dist/identity.d.ts +7 -0
- package/dist/identity.js +50 -0
- package/dist/identity.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.js +21 -0
- package/dist/index.js.map +1 -0
- package/dist/os-node.d.ts +2 -0
- package/dist/os-node.js +7 -0
- package/dist/os-node.js.map +1 -0
- package/dist/path-node.d.ts +2 -0
- package/dist/path-node.js +7 -0
- package/dist/path-node.js.map +1 -0
- package/dist/process-node.d.ts +2 -0
- package/dist/process-node.js +7 -0
- package/dist/process-node.js.map +1 -0
- package/dist/release.d.ts +26 -0
- package/dist/release.js +419 -0
- package/dist/release.js.map +1 -0
- package/dist/server.d.ts +239 -0
- package/dist/server.js +928 -0
- package/dist/server.js.map +1 -0
- package/dist/storage/atomic-file.d.ts +15 -0
- package/dist/storage/atomic-file.js +172 -0
- package/dist/storage/atomic-file.js.map +1 -0
- package/dist/storage/commit-journal.d.ts +120 -0
- package/dist/storage/commit-journal.js +417 -0
- package/dist/storage/commit-journal.js.map +1 -0
- package/dist/storage/commit-store.d.ts +307 -0
- package/dist/storage/commit-store.js +1691 -0
- package/dist/storage/commit-store.js.map +1 -0
- package/dist/storage/layout.d.ts +16 -0
- package/dist/storage/layout.js +409 -0
- package/dist/storage/layout.js.map +1 -0
- package/dist/storage/link-store.d.ts +70 -0
- package/dist/storage/link-store.js +363 -0
- package/dist/storage/link-store.js.map +1 -0
- package/dist/storage/recovery.d.ts +100 -0
- package/dist/storage/recovery.js +260 -0
- package/dist/storage/recovery.js.map +1 -0
- package/dist/storage/retention.d.ts +183 -0
- package/dist/storage/retention.js +619 -0
- package/dist/storage/retention.js.map +1 -0
- package/dist/storage/root-coordinator.d.ts +7 -0
- package/dist/storage/root-coordinator.js +27 -0
- package/dist/storage/root-coordinator.js.map +1 -0
- package/dist/storage/session-store.d.ts +2 -0
- package/dist/storage/session-store.js +7 -0
- package/dist/storage/session-store.js.map +1 -0
- package/dist/storage/tar-session-store.d.ts +147 -0
- package/dist/storage/tar-session-store.js +1044 -0
- package/dist/storage/tar-session-store.js.map +1 -0
- package/dist/storage/tree-fs.d.ts +44 -0
- package/dist/storage/tree-fs.js +580 -0
- package/dist/storage/tree-fs.js.map +1 -0
- package/dist/storage/tree-staging.d.ts +9 -0
- package/dist/storage/tree-staging.js +64 -0
- package/dist/storage/tree-staging.js.map +1 -0
- package/dist/storage/types.d.ts +77 -0
- package/dist/storage/types.js +3 -0
- package/dist/storage/types.js.map +1 -0
- package/dist/symlinks.d.ts +36 -0
- package/dist/symlinks.js +128 -0
- package/dist/symlinks.js.map +1 -0
- package/dist/tar-protocol/controls.d.ts +73 -0
- package/dist/tar-protocol/controls.js +291 -0
- package/dist/tar-protocol/controls.js.map +1 -0
- package/dist/tar-protocol/direct-wire.d.ts +43 -0
- package/dist/tar-protocol/direct-wire.js +194 -0
- package/dist/tar-protocol/direct-wire.js.map +1 -0
- package/dist/tar-protocol/extract.d.ts +18 -0
- package/dist/tar-protocol/extract.js +124 -0
- package/dist/tar-protocol/extract.js.map +1 -0
- package/dist/tar-protocol/hash.d.ts +10 -0
- package/dist/tar-protocol/hash.js +44 -0
- package/dist/tar-protocol/hash.js.map +1 -0
- package/dist/tar-protocol/lifecycle.d.ts +13 -0
- package/dist/tar-protocol/lifecycle.js +90 -0
- package/dist/tar-protocol/lifecycle.js.map +1 -0
- package/dist/tar-protocol/manifest.d.ts +58 -0
- package/dist/tar-protocol/manifest.js +312 -0
- package/dist/tar-protocol/manifest.js.map +1 -0
- package/dist/tar-protocol/tree-extract.d.ts +37 -0
- package/dist/tar-protocol/tree-extract.js +240 -0
- package/dist/tar-protocol/tree-extract.js.map +1 -0
- package/dist/tar-protocol/tree-manifest.d.ts +45 -0
- package/dist/tar-protocol/tree-manifest.js +277 -0
- package/dist/tar-protocol/tree-manifest.js.map +1 -0
- package/dist/tar-protocol/tree-path.d.ts +15 -0
- package/dist/tar-protocol/tree-path.js +68 -0
- package/dist/tar-protocol/tree-path.js.map +1 -0
- package/dist/tar-protocol/tree.d.ts +68 -0
- package/dist/tar-protocol/tree.js +269 -0
- package/dist/tar-protocol/tree.js.map +1 -0
- package/dist/tar-protocol/ustar.d.ts +36 -0
- package/dist/tar-protocol/ustar.js +167 -0
- package/dist/tar-protocol/ustar.js.map +1 -0
- package/dist/types.d.ts +61 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/dist/validation.d.ts +4 -0
- package/dist/validation.js +26 -0
- package/dist/validation.js.map +1 -0
- package/package.json +103 -1
|
@@ -0,0 +1,312 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.TAR_TRANSFER_DOMAIN = exports.TAR_UNAME = exports.TAR_UID = exports.TAR_MTIME_MS = exports.TAR_MODE = exports.TAR_GNAME = exports.TAR_GID = exports.TAR_BLOCK_BYTES = exports.deterministicTarSize = void 0;
|
|
7
|
+
exports.deriveSourceParent = deriveSourceParent;
|
|
8
|
+
exports.computeTarTransferId = computeTarTransferId;
|
|
9
|
+
exports.buildTarManifest = buildTarManifest;
|
|
10
|
+
exports.regenerateTarSuffix = regenerateTarSuffix;
|
|
11
|
+
exports.metadataFromManifest = metadataFromManifest;
|
|
12
|
+
exports.assertMetadataTransferId = assertMetadataTransferId;
|
|
13
|
+
const b4a_1 = __importDefault(require("b4a"));
|
|
14
|
+
const _fs_1 = __importDefault(require("#fs"));
|
|
15
|
+
const _path_1 = __importDefault(require("#path"));
|
|
16
|
+
const sodium_native_1 = __importDefault(require("sodium-native"));
|
|
17
|
+
const abort_js_1 = require("../abort.js");
|
|
18
|
+
const errors_js_1 = require("../errors.js");
|
|
19
|
+
const files_js_1 = require("../files.js");
|
|
20
|
+
const layout_js_1 = require("../storage/layout.js");
|
|
21
|
+
const controls_js_1 = require("./controls.js");
|
|
22
|
+
const hash_js_1 = require("./hash.js");
|
|
23
|
+
const ustar_js_1 = require("./ustar.js");
|
|
24
|
+
var ustar_js_2 = require("./ustar.js");
|
|
25
|
+
Object.defineProperty(exports, "deterministicTarSize", { enumerable: true, get: function () { return ustar_js_2.deterministicTarSize; } });
|
|
26
|
+
Object.defineProperty(exports, "TAR_BLOCK_BYTES", { enumerable: true, get: function () { return ustar_js_2.TAR_BLOCK_BYTES; } });
|
|
27
|
+
Object.defineProperty(exports, "TAR_GID", { enumerable: true, get: function () { return ustar_js_2.TAR_GID; } });
|
|
28
|
+
Object.defineProperty(exports, "TAR_GNAME", { enumerable: true, get: function () { return ustar_js_2.TAR_GNAME; } });
|
|
29
|
+
Object.defineProperty(exports, "TAR_MODE", { enumerable: true, get: function () { return ustar_js_2.TAR_MODE; } });
|
|
30
|
+
Object.defineProperty(exports, "TAR_MTIME_MS", { enumerable: true, get: function () { return ustar_js_2.TAR_MTIME_MS; } });
|
|
31
|
+
Object.defineProperty(exports, "TAR_UID", { enumerable: true, get: function () { return ustar_js_2.TAR_UID; } });
|
|
32
|
+
Object.defineProperty(exports, "TAR_UNAME", { enumerable: true, get: function () { return ustar_js_2.TAR_UNAME; } });
|
|
33
|
+
exports.TAR_TRANSFER_DOMAIN = 'swarm-deploy/direct-tar/v1';
|
|
34
|
+
const READ_BYTES = 64 * 1024;
|
|
35
|
+
function invalid(message, cause = null) {
|
|
36
|
+
return new errors_js_1.SwarmDeployError(errors_js_1.ERRORS.PROTOCOL_INVALID, message, cause);
|
|
37
|
+
}
|
|
38
|
+
function assertSafeSize(size) {
|
|
39
|
+
(0, ustar_js_1.assertUstarFileSize)(size);
|
|
40
|
+
}
|
|
41
|
+
function assertClientKey(key) {
|
|
42
|
+
if (!b4a_1.default.isBuffer(key) || key.byteLength !== 32)
|
|
43
|
+
throw invalid('Invalid client public key');
|
|
44
|
+
}
|
|
45
|
+
function canonicalName(filePath) {
|
|
46
|
+
const name = (0, files_js_1.validateBasename)(_path_1.default.basename(filePath));
|
|
47
|
+
if ((0, files_js_1.isReservedHistoryName)(name)) {
|
|
48
|
+
throw new errors_js_1.SwarmDeployError(errors_js_1.ERRORS.INVALID_FILENAME, 'Filename cannot be encoded as USTAR');
|
|
49
|
+
}
|
|
50
|
+
return name;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* The immediate parent directory name, only when it is a valid wire component.
|
|
54
|
+
* Unsafe or absent parents (spaces, dotfiles, filesystem root, overlong) are
|
|
55
|
+
* omitted so the upload keeps the legacy authenticated identity.
|
|
56
|
+
*/
|
|
57
|
+
function deriveSourceParent(filePath) {
|
|
58
|
+
const sourceParent = _path_1.default.basename(_path_1.default.dirname(_path_1.default.resolve(filePath)));
|
|
59
|
+
try {
|
|
60
|
+
(0, controls_js_1.assertSourceParent)(sourceParent);
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
return undefined;
|
|
64
|
+
}
|
|
65
|
+
return sourceParent;
|
|
66
|
+
}
|
|
67
|
+
function identity(stat) {
|
|
68
|
+
return { dev: stat.dev, ino: stat.ino, size: stat.size, mtimeMs: stat.mtimeMs };
|
|
69
|
+
}
|
|
70
|
+
function sameIdentity(expected, actual) {
|
|
71
|
+
return (actual.isFile() &&
|
|
72
|
+
actual.dev === expected.dev &&
|
|
73
|
+
actual.ino === expected.ino &&
|
|
74
|
+
actual.size === expected.size &&
|
|
75
|
+
actual.mtimeMs === expected.mtimeMs);
|
|
76
|
+
}
|
|
77
|
+
function assertIdentity(expected, actual, message) {
|
|
78
|
+
if (!sameIdentity(expected, actual))
|
|
79
|
+
throw new errors_js_1.SwarmDeployError(errors_js_1.ERRORS.FILE_BUSY, message);
|
|
80
|
+
}
|
|
81
|
+
async function openStableSource(filePath, expected, signal) {
|
|
82
|
+
(0, abort_js_1.throwIfAborted)(signal);
|
|
83
|
+
const pathStat = await _fs_1.default.promises.lstat(filePath);
|
|
84
|
+
(0, abort_js_1.throwIfAborted)(signal);
|
|
85
|
+
if (pathStat.isSymbolicLink() || !pathStat.isFile()) {
|
|
86
|
+
throw new errors_js_1.SwarmDeployError(errors_js_1.ERRORS.INVALID_FILENAME, 'Path must be a regular file');
|
|
87
|
+
}
|
|
88
|
+
const observed = identity(pathStat);
|
|
89
|
+
if (expected)
|
|
90
|
+
assertIdentity(expected, pathStat, 'Source file changed before TAR generation');
|
|
91
|
+
let handle = null;
|
|
92
|
+
try {
|
|
93
|
+
handle = await _fs_1.default.promises.open(filePath, (0, layout_js_1.safeFileOpenFlags)('read'));
|
|
94
|
+
const opened = await handle.stat();
|
|
95
|
+
assertIdentity(expected || observed, opened, 'Source identity changed while opening');
|
|
96
|
+
return { handle, source: expected || observed };
|
|
97
|
+
}
|
|
98
|
+
catch (error) {
|
|
99
|
+
if (handle)
|
|
100
|
+
await handle.close().catch(() => { });
|
|
101
|
+
if (error instanceof errors_js_1.SwarmDeployError)
|
|
102
|
+
throw error;
|
|
103
|
+
throw new errors_js_1.SwarmDeployError(errors_js_1.ERRORS.FILE_BUSY, 'Unable to safely open source file', error);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
async function* generateTar(handle, name, size, fileHash, signal) {
|
|
107
|
+
(0, abort_js_1.throwIfAborted)(signal);
|
|
108
|
+
yield (0, ustar_js_1.canonicalUstarHeader)(name, size);
|
|
109
|
+
let position = 0;
|
|
110
|
+
while (position < size) {
|
|
111
|
+
(0, abort_js_1.throwIfAborted)(signal);
|
|
112
|
+
const chunk = b4a_1.default.alloc(Math.min(READ_BYTES, size - position));
|
|
113
|
+
const read = await handle.read(chunk, 0, chunk.byteLength, position);
|
|
114
|
+
const count = typeof read === 'number' ? read : read.bytesRead;
|
|
115
|
+
if (count !== chunk.byteLength) {
|
|
116
|
+
throw new errors_js_1.SwarmDeployError(errors_js_1.ERRORS.FILE_BUSY, 'Source file was truncated');
|
|
117
|
+
}
|
|
118
|
+
fileHash.update(chunk);
|
|
119
|
+
position += count;
|
|
120
|
+
yield chunk;
|
|
121
|
+
}
|
|
122
|
+
const padding = (ustar_js_1.TAR_BLOCK_BYTES - (size % ustar_js_1.TAR_BLOCK_BYTES)) % ustar_js_1.TAR_BLOCK_BYTES;
|
|
123
|
+
if (padding > 0)
|
|
124
|
+
yield b4a_1.default.alloc(padding);
|
|
125
|
+
yield b4a_1.default.alloc(2 * ustar_js_1.TAR_BLOCK_BYTES);
|
|
126
|
+
}
|
|
127
|
+
async function assertSourceFinal(filePath, handle, expected, signal) {
|
|
128
|
+
(0, abort_js_1.throwIfAborted)(signal);
|
|
129
|
+
assertIdentity(expected, await handle.stat(), 'Source file changed during TAR generation');
|
|
130
|
+
assertIdentity(expected, await _fs_1.default.promises.lstat(filePath), 'Source path changed during TAR generation');
|
|
131
|
+
(0, abort_js_1.throwIfAborted)(signal);
|
|
132
|
+
}
|
|
133
|
+
function transferField(hash, label, value) {
|
|
134
|
+
const labelBytes = b4a_1.default.from(`${label}\u0000`);
|
|
135
|
+
const valueBytes = typeof value === 'number' ? b4a_1.default.from(String(value)) : b4a_1.default.from(value);
|
|
136
|
+
hash
|
|
137
|
+
.update(labelBytes)
|
|
138
|
+
.update(b4a_1.default.from(`${valueBytes.byteLength}:`))
|
|
139
|
+
.update(valueBytes);
|
|
140
|
+
}
|
|
141
|
+
function computeTarTransferId(clientPublicKey, immutable) {
|
|
142
|
+
assertClientKey(clientPublicKey);
|
|
143
|
+
assertSafeSize(immutable.fileSize);
|
|
144
|
+
if (!b4a_1.default.isBuffer(immutable.fileSha256) || immutable.fileSha256.byteLength !== 32) {
|
|
145
|
+
throw invalid('Invalid file digest');
|
|
146
|
+
}
|
|
147
|
+
if (!b4a_1.default.isBuffer(immutable.tarSha256) || immutable.tarSha256.byteLength !== 32) {
|
|
148
|
+
throw invalid('Invalid TAR digest');
|
|
149
|
+
}
|
|
150
|
+
const hash = new hash_js_1.SodiumSha256();
|
|
151
|
+
transferField(hash, 'domain', exports.TAR_TRANSFER_DOMAIN);
|
|
152
|
+
transferField(hash, 'clientPublicKey', clientPublicKey);
|
|
153
|
+
transferField(hash, 'name', immutable.name);
|
|
154
|
+
if (immutable.sourceParent !== undefined) {
|
|
155
|
+
(0, controls_js_1.assertSourceParent)(immutable.sourceParent);
|
|
156
|
+
transferField(hash, 'sourceParent', immutable.sourceParent);
|
|
157
|
+
}
|
|
158
|
+
transferField(hash, 'fileSize', immutable.fileSize);
|
|
159
|
+
transferField(hash, 'fileSha256', immutable.fileSha256);
|
|
160
|
+
transferField(hash, 'tarSize', immutable.tarSize);
|
|
161
|
+
transferField(hash, 'tarSha256', immutable.tarSha256);
|
|
162
|
+
transferField(hash, 'type', 'file');
|
|
163
|
+
transferField(hash, 'mode', ustar_js_1.TAR_MODE);
|
|
164
|
+
transferField(hash, 'uid', ustar_js_1.TAR_UID);
|
|
165
|
+
transferField(hash, 'gid', ustar_js_1.TAR_GID);
|
|
166
|
+
transferField(hash, 'mtimeMs', ustar_js_1.TAR_MTIME_MS);
|
|
167
|
+
transferField(hash, 'uname', ustar_js_1.TAR_UNAME);
|
|
168
|
+
transferField(hash, 'gname', ustar_js_1.TAR_GNAME);
|
|
169
|
+
transferField(hash, 'pax', 'none');
|
|
170
|
+
return hash.digest();
|
|
171
|
+
}
|
|
172
|
+
async function buildTarManifest(filePath, clientPublicKey, { signal = null, includeSourceParent = true } = {}) {
|
|
173
|
+
assertClientKey(clientPublicKey);
|
|
174
|
+
const name = canonicalName(filePath);
|
|
175
|
+
const sourceParent = includeSourceParent === false ? undefined : deriveSourceParent(filePath);
|
|
176
|
+
const opened = await openStableSource(filePath, null, signal);
|
|
177
|
+
assertSafeSize(opened.source.size);
|
|
178
|
+
const fileHash = new hash_js_1.SodiumSha256();
|
|
179
|
+
const tarHash = new hash_js_1.SodiumSha256();
|
|
180
|
+
let tarSize = 0;
|
|
181
|
+
try {
|
|
182
|
+
for await (const chunk of generateTar(opened.handle, name, opened.source.size, fileHash, signal)) {
|
|
183
|
+
tarHash.update(chunk);
|
|
184
|
+
tarSize += chunk.byteLength;
|
|
185
|
+
}
|
|
186
|
+
await assertSourceFinal(filePath, opened.handle, opened.source, signal);
|
|
187
|
+
}
|
|
188
|
+
finally {
|
|
189
|
+
await opened.handle.close().catch(() => { });
|
|
190
|
+
}
|
|
191
|
+
if (tarSize !== (0, ustar_js_1.deterministicTarSize)(opened.source.size)) {
|
|
192
|
+
throw invalid('Noncanonical deterministic TAR length');
|
|
193
|
+
}
|
|
194
|
+
const fileSha256 = fileHash.digest();
|
|
195
|
+
const tarSha256 = tarHash.digest();
|
|
196
|
+
const transferId = computeTarTransferId(clientPublicKey, {
|
|
197
|
+
name,
|
|
198
|
+
...(sourceParent === undefined ? {} : { sourceParent }),
|
|
199
|
+
fileSize: opened.source.size,
|
|
200
|
+
fileSha256,
|
|
201
|
+
tarSize,
|
|
202
|
+
tarSha256
|
|
203
|
+
});
|
|
204
|
+
return {
|
|
205
|
+
path: filePath,
|
|
206
|
+
name,
|
|
207
|
+
...(sourceParent === undefined ? {} : { sourceParent }),
|
|
208
|
+
fileSize: opened.source.size,
|
|
209
|
+
fileSha256,
|
|
210
|
+
tarSize,
|
|
211
|
+
tarSha256,
|
|
212
|
+
transferId,
|
|
213
|
+
source: opened.source
|
|
214
|
+
};
|
|
215
|
+
}
|
|
216
|
+
async function regenerateTarSuffix(manifest, offset, write, { signal = null, expectedPrefixSha256 = null } = {}) {
|
|
217
|
+
if (!manifest || typeof manifest !== 'object')
|
|
218
|
+
throw invalid('Invalid TAR manifest');
|
|
219
|
+
if (!Number.isSafeInteger(offset) || offset < 0 || offset > manifest.tarSize) {
|
|
220
|
+
throw invalid('Invalid TAR resume offset');
|
|
221
|
+
}
|
|
222
|
+
if (typeof write !== 'function')
|
|
223
|
+
throw invalid('Invalid TAR suffix writer');
|
|
224
|
+
if (expectedPrefixSha256 !== null &&
|
|
225
|
+
(!b4a_1.default.isBuffer(expectedPrefixSha256) || expectedPrefixSha256.byteLength !== 32)) {
|
|
226
|
+
throw invalid('Invalid expected prefix digest');
|
|
227
|
+
}
|
|
228
|
+
const opened = await openStableSource(manifest.path, manifest.source, signal);
|
|
229
|
+
const fileHash = new hash_js_1.SodiumSha256();
|
|
230
|
+
const tarHash = new hash_js_1.SodiumSha256();
|
|
231
|
+
const prefixHash = new hash_js_1.SodiumSha256();
|
|
232
|
+
let position = 0;
|
|
233
|
+
let bytesSent = 0;
|
|
234
|
+
let prefixSha256 = offset === 0 ? prefixHash.digest() : null;
|
|
235
|
+
let resetRequired = prefixSha256 !== null &&
|
|
236
|
+
expectedPrefixSha256 !== null &&
|
|
237
|
+
!sodium_native_1.default.sodium_memcmp(prefixSha256, expectedPrefixSha256);
|
|
238
|
+
try {
|
|
239
|
+
for await (const chunk of generateTar(opened.handle, manifest.name, manifest.fileSize, fileHash, signal)) {
|
|
240
|
+
(0, abort_js_1.throwIfAborted)(signal);
|
|
241
|
+
tarHash.update(chunk);
|
|
242
|
+
const end = position + chunk.byteLength;
|
|
243
|
+
if (position < offset) {
|
|
244
|
+
const prefixEnd = Math.min(chunk.byteLength, offset - position);
|
|
245
|
+
prefixHash.update(chunk.subarray(0, prefixEnd));
|
|
246
|
+
if (end >= offset) {
|
|
247
|
+
prefixSha256 = prefixHash.digest();
|
|
248
|
+
if (expectedPrefixSha256 && !sodium_native_1.default.sodium_memcmp(prefixSha256, expectedPrefixSha256)) {
|
|
249
|
+
resetRequired = true;
|
|
250
|
+
}
|
|
251
|
+
if (!resetRequired && prefixEnd < chunk.byteLength) {
|
|
252
|
+
const suffix = chunk.subarray(prefixEnd);
|
|
253
|
+
await write(suffix);
|
|
254
|
+
bytesSent += suffix.byteLength;
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
else if (!resetRequired) {
|
|
259
|
+
await write(chunk);
|
|
260
|
+
bytesSent += chunk.byteLength;
|
|
261
|
+
}
|
|
262
|
+
position = end;
|
|
263
|
+
}
|
|
264
|
+
await assertSourceFinal(manifest.path, opened.handle, manifest.source, signal);
|
|
265
|
+
}
|
|
266
|
+
finally {
|
|
267
|
+
await opened.handle.close().catch(() => { });
|
|
268
|
+
}
|
|
269
|
+
if (position !== manifest.tarSize ||
|
|
270
|
+
(!resetRequired && bytesSent !== manifest.tarSize - offset)) {
|
|
271
|
+
throw new errors_js_1.SwarmDeployError(errors_js_1.ERRORS.FILE_BUSY, 'Regenerated TAR length changed');
|
|
272
|
+
}
|
|
273
|
+
const regeneratedFile = fileHash.digest();
|
|
274
|
+
const regeneratedTar = tarHash.digest();
|
|
275
|
+
if (!(0, hash_js_1.digestMatches)(regeneratedFile, manifest.fileSha256) ||
|
|
276
|
+
!(0, hash_js_1.digestMatches)(regeneratedTar, manifest.tarSha256)) {
|
|
277
|
+
throw new errors_js_1.SwarmDeployError(errors_js_1.ERRORS.FILE_BUSY, 'Source file changed during TAR regeneration');
|
|
278
|
+
}
|
|
279
|
+
if (prefixSha256 === null)
|
|
280
|
+
throw invalid('Unable to hash TAR prefix');
|
|
281
|
+
if (resetRequired)
|
|
282
|
+
return { status: 'RESET_REQUIRED', prefixSha256, bytesSent: 0 };
|
|
283
|
+
return { status: 'MATCH', prefixSha256, bytesSent };
|
|
284
|
+
}
|
|
285
|
+
function metadataFromManifest(manifest, reset = false) {
|
|
286
|
+
return {
|
|
287
|
+
v: controls_js_1.CONTROL_VERSION,
|
|
288
|
+
name: manifest.name,
|
|
289
|
+
...(manifest.sourceParent === undefined ? {} : { sourceParent: manifest.sourceParent }),
|
|
290
|
+
fileSize: manifest.fileSize,
|
|
291
|
+
fileSha256: b4a_1.default.toString(manifest.fileSha256, 'hex'),
|
|
292
|
+
tarSize: manifest.tarSize,
|
|
293
|
+
tarSha256: b4a_1.default.toString(manifest.tarSha256, 'hex'),
|
|
294
|
+
transferId: b4a_1.default.toString(manifest.transferId, 'hex'),
|
|
295
|
+
reset
|
|
296
|
+
};
|
|
297
|
+
}
|
|
298
|
+
function assertMetadataTransferId(clientPublicKey, offeredMetadata) {
|
|
299
|
+
const metadata = (0, controls_js_1.decodeMetadataRecord)((0, controls_js_1.encodeMetadataRecord)(offeredMetadata));
|
|
300
|
+
const expected = computeTarTransferId(clientPublicKey, {
|
|
301
|
+
name: metadata.name,
|
|
302
|
+
...(metadata.sourceParent === undefined ? {} : { sourceParent: metadata.sourceParent }),
|
|
303
|
+
fileSize: metadata.fileSize,
|
|
304
|
+
fileSha256: b4a_1.default.from(metadata.fileSha256, 'hex'),
|
|
305
|
+
tarSize: metadata.tarSize,
|
|
306
|
+
tarSha256: b4a_1.default.from(metadata.tarSha256, 'hex')
|
|
307
|
+
});
|
|
308
|
+
const offered = b4a_1.default.from(metadata.transferId, 'hex');
|
|
309
|
+
if (!sodium_native_1.default.sodium_memcmp(expected, offered))
|
|
310
|
+
throw invalid('Noncanonical TAR transfer ID');
|
|
311
|
+
}
|
|
312
|
+
//# sourceMappingURL=manifest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../src/tar-protocol/manifest.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { type AbortSignalLike } from '../abort.js';
|
|
2
|
+
import { type TreeMetadataRecord } from './controls.js';
|
|
3
|
+
import { type TreeEntry } from './tree.js';
|
|
4
|
+
export interface TreeFileSink {
|
|
5
|
+
write(chunk: Uint8Array): Promise<void>;
|
|
6
|
+
close(): Promise<void>;
|
|
7
|
+
}
|
|
8
|
+
export interface TreeExtractionTarget {
|
|
9
|
+
createDirectory(relativePath: string): Promise<void>;
|
|
10
|
+
createFile(relativePath: string, size: number): Promise<TreeFileSink>;
|
|
11
|
+
complete(): Promise<void>;
|
|
12
|
+
abort(error: unknown): Promise<void>;
|
|
13
|
+
}
|
|
14
|
+
export interface TreeExtractionOptions {
|
|
15
|
+
signal?: AbortSignalLike | null;
|
|
16
|
+
}
|
|
17
|
+
export interface TreeExtractionResult {
|
|
18
|
+
entries: TreeEntry[];
|
|
19
|
+
entryCount: number;
|
|
20
|
+
payloadBytes: number;
|
|
21
|
+
treeSha256: Buffer;
|
|
22
|
+
tarSize: number;
|
|
23
|
+
tarSha256: Buffer;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Validates and extracts a canonical multi-entry tree archive.
|
|
27
|
+
*
|
|
28
|
+
* Only the name, typeflag, and size fields are parsed. Every other field is
|
|
29
|
+
* proved by rebuilding the whole 512-byte canonical header and comparing it
|
|
30
|
+
* byte for byte, so mode, uid, gid, mtime, uname, gname, magic, checksum, and
|
|
31
|
+
* the USTAR prefix are all pinned by one comparison.
|
|
32
|
+
*
|
|
33
|
+
* The archive path is only ever handed to the target as a validated relative
|
|
34
|
+
* path; this reader never joins it to an absolute path and never touches the
|
|
35
|
+
* filesystem itself. Any failure aborts the target exactly once.
|
|
36
|
+
*/
|
|
37
|
+
export declare function validateAndExtractTreeTar(source: Iterable<Uint8Array> | AsyncIterable<Uint8Array>, offeredMetadata: TreeMetadataRecord, target: TreeExtractionTarget, { signal }?: TreeExtractionOptions): Promise<TreeExtractionResult>;
|
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.validateAndExtractTreeTar = validateAndExtractTreeTar;
|
|
7
|
+
const b4a_1 = __importDefault(require("b4a"));
|
|
8
|
+
const abort_js_1 = require("../abort.js");
|
|
9
|
+
const errors_js_1 = require("../errors.js");
|
|
10
|
+
const controls_js_1 = require("./controls.js");
|
|
11
|
+
const hash_js_1 = require("./hash.js");
|
|
12
|
+
const tree_js_1 = require("./tree.js");
|
|
13
|
+
const ustar_js_1 = require("./ustar.js");
|
|
14
|
+
function invalid(message, cause = null) {
|
|
15
|
+
return new errors_js_1.SwarmDeployError(errors_js_1.ERRORS.PROTOCOL_INVALID, message, cause);
|
|
16
|
+
}
|
|
17
|
+
function parseOctal(block, offset, length) {
|
|
18
|
+
let value = 0;
|
|
19
|
+
let digits = 0;
|
|
20
|
+
for (let index = offset; index < offset + length; index++) {
|
|
21
|
+
const byte = block[index];
|
|
22
|
+
if (byte === 0x20 || byte === 0)
|
|
23
|
+
break;
|
|
24
|
+
if (byte < 0x30 || byte > 0x37)
|
|
25
|
+
throw invalid('Noncanonical tree TAR header');
|
|
26
|
+
value = value * 8 + (byte - 0x30);
|
|
27
|
+
digits++;
|
|
28
|
+
if (!Number.isSafeInteger(value))
|
|
29
|
+
throw invalid('Noncanonical tree TAR header');
|
|
30
|
+
}
|
|
31
|
+
if (digits === 0)
|
|
32
|
+
throw invalid('Noncanonical tree TAR header');
|
|
33
|
+
return value;
|
|
34
|
+
}
|
|
35
|
+
function parseStoredName(block) {
|
|
36
|
+
let end = 0;
|
|
37
|
+
while (end < 100 && block[end] !== 0)
|
|
38
|
+
end++;
|
|
39
|
+
for (let index = end; index < 100; index++) {
|
|
40
|
+
if (block[index] !== 0)
|
|
41
|
+
throw invalid('Noncanonical tree TAR header');
|
|
42
|
+
}
|
|
43
|
+
if (end === 0)
|
|
44
|
+
throw invalid('Noncanonical tree TAR header');
|
|
45
|
+
return b4a_1.default.toString(block.subarray(0, end), 'utf8');
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Validates and extracts a canonical multi-entry tree archive.
|
|
49
|
+
*
|
|
50
|
+
* Only the name, typeflag, and size fields are parsed. Every other field is
|
|
51
|
+
* proved by rebuilding the whole 512-byte canonical header and comparing it
|
|
52
|
+
* byte for byte, so mode, uid, gid, mtime, uname, gname, magic, checksum, and
|
|
53
|
+
* the USTAR prefix are all pinned by one comparison.
|
|
54
|
+
*
|
|
55
|
+
* The archive path is only ever handed to the target as a validated relative
|
|
56
|
+
* path; this reader never joins it to an absolute path and never touches the
|
|
57
|
+
* filesystem itself. Any failure aborts the target exactly once.
|
|
58
|
+
*/
|
|
59
|
+
async function validateAndExtractTreeTar(source, offeredMetadata, target, { signal = null } = {}) {
|
|
60
|
+
if (!target ||
|
|
61
|
+
typeof target !== 'object' ||
|
|
62
|
+
typeof target.createDirectory !== 'function' ||
|
|
63
|
+
typeof target.createFile !== 'function' ||
|
|
64
|
+
typeof target.complete !== 'function' ||
|
|
65
|
+
typeof target.abort !== 'function') {
|
|
66
|
+
throw invalid('Invalid tree extraction target');
|
|
67
|
+
}
|
|
68
|
+
const metadata = (0, controls_js_1.decodeTreeMetadataRecord)((0, controls_js_1.encodeTreeMetadataRecord)(offeredMetadata));
|
|
69
|
+
const tarHash = new hash_js_1.SodiumSha256();
|
|
70
|
+
const digests = [];
|
|
71
|
+
const directories = new Set();
|
|
72
|
+
const folded = new Set();
|
|
73
|
+
let position = 0;
|
|
74
|
+
let pending = b4a_1.default.alloc(0);
|
|
75
|
+
let payloadBytes = 0;
|
|
76
|
+
let previousPath = null;
|
|
77
|
+
let terminatorBlocks = 0;
|
|
78
|
+
let sink = null;
|
|
79
|
+
let sinkHash = null;
|
|
80
|
+
let sinkEntry = null;
|
|
81
|
+
let payloadRemaining = 0;
|
|
82
|
+
let paddingRemaining = 0;
|
|
83
|
+
const closeSink = async () => {
|
|
84
|
+
if (!sink || !sinkHash || !sinkEntry)
|
|
85
|
+
throw invalid('Tree extraction state is inconsistent');
|
|
86
|
+
const closing = sink;
|
|
87
|
+
const hash = sinkHash;
|
|
88
|
+
const entry = sinkEntry;
|
|
89
|
+
sink = null;
|
|
90
|
+
sinkHash = null;
|
|
91
|
+
sinkEntry = null;
|
|
92
|
+
await closing.close();
|
|
93
|
+
digests.push({ entry, sha256: hash.digest() });
|
|
94
|
+
};
|
|
95
|
+
const consumeHeader = async (block) => {
|
|
96
|
+
if (block.every((byte) => byte === 0)) {
|
|
97
|
+
terminatorBlocks++;
|
|
98
|
+
if (terminatorBlocks > 2)
|
|
99
|
+
throw invalid('Trailing tree TAR payload');
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
if (terminatorBlocks > 0)
|
|
103
|
+
throw invalid('Tree TAR entry after terminator');
|
|
104
|
+
const storedName = parseStoredName(block);
|
|
105
|
+
const typeflag = block[156];
|
|
106
|
+
if (typeflag !== 48 && typeflag !== 53)
|
|
107
|
+
throw invalid('Unsupported tree TAR entry type');
|
|
108
|
+
const kind = typeflag === 53 ? 'directory' : 'file';
|
|
109
|
+
if (kind === 'directory' && !storedName.endsWith('/')) {
|
|
110
|
+
throw invalid('Noncanonical tree TAR header');
|
|
111
|
+
}
|
|
112
|
+
if (kind === 'file' && storedName.endsWith('/'))
|
|
113
|
+
throw invalid('Noncanonical tree TAR header');
|
|
114
|
+
const relativePath = kind === 'directory' ? storedName.slice(0, -1) : storedName;
|
|
115
|
+
(0, tree_js_1.assertTreeEntryPath)(relativePath, kind);
|
|
116
|
+
const size = parseOctal(block, 124, 12);
|
|
117
|
+
if (kind === 'directory' && size !== 0)
|
|
118
|
+
throw invalid('Invalid tree directory size');
|
|
119
|
+
if (!b4a_1.default.equals(block, (0, ustar_js_1.canonicalUstarTreeHeader)(storedName, kind, size))) {
|
|
120
|
+
throw invalid('Noncanonical tree TAR header');
|
|
121
|
+
}
|
|
122
|
+
if (digests.length >= Math.min(metadata.entryCount, tree_js_1.MAX_TREE_ENTRIES)) {
|
|
123
|
+
throw invalid('Tree TAR entry count exceeds the offer');
|
|
124
|
+
}
|
|
125
|
+
if (previousPath !== null && (0, tree_js_1.compareTreePaths)(previousPath, relativePath) >= 0) {
|
|
126
|
+
throw invalid('Noncanonical tree entry order');
|
|
127
|
+
}
|
|
128
|
+
const fold = relativePath.toLowerCase();
|
|
129
|
+
if (folded.has(fold))
|
|
130
|
+
throw invalid('Case-folded duplicate tree entry path');
|
|
131
|
+
folded.add(fold);
|
|
132
|
+
const separator = relativePath.lastIndexOf('/');
|
|
133
|
+
if (separator !== -1 && !directories.has(relativePath.slice(0, separator))) {
|
|
134
|
+
throw invalid('Tree entry has no parent directory entry');
|
|
135
|
+
}
|
|
136
|
+
previousPath = relativePath;
|
|
137
|
+
const entry = { kind, path: relativePath, size: kind === 'directory' ? 0 : size };
|
|
138
|
+
if (kind === 'directory') {
|
|
139
|
+
directories.add(relativePath);
|
|
140
|
+
digests.push({ entry });
|
|
141
|
+
await target.createDirectory(relativePath);
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
if (payloadBytes > metadata.payloadBytes - size)
|
|
145
|
+
throw invalid('Tree payload exceeds the offer');
|
|
146
|
+
payloadBytes += size;
|
|
147
|
+
sinkEntry = entry;
|
|
148
|
+
sinkHash = new hash_js_1.SodiumSha256();
|
|
149
|
+
sink = await target.createFile(relativePath, size);
|
|
150
|
+
payloadRemaining = size;
|
|
151
|
+
paddingRemaining = (ustar_js_1.TAR_BLOCK_BYTES - (size % ustar_js_1.TAR_BLOCK_BYTES)) % ustar_js_1.TAR_BLOCK_BYTES;
|
|
152
|
+
if (payloadRemaining === 0)
|
|
153
|
+
await closeSink();
|
|
154
|
+
};
|
|
155
|
+
try {
|
|
156
|
+
(0, abort_js_1.throwIfAborted)(signal);
|
|
157
|
+
for await (const value of source) {
|
|
158
|
+
(0, abort_js_1.throwIfAborted)(signal);
|
|
159
|
+
if (!b4a_1.default.isBuffer(value))
|
|
160
|
+
throw invalid('Invalid TAR source bytes');
|
|
161
|
+
if (position > metadata.tarSize - value.byteLength)
|
|
162
|
+
throw invalid('Trailing tree TAR payload');
|
|
163
|
+
tarHash.update(value);
|
|
164
|
+
position += value.byteLength;
|
|
165
|
+
let offset = 0;
|
|
166
|
+
while (offset < value.byteLength) {
|
|
167
|
+
if (payloadRemaining > 0) {
|
|
168
|
+
const take = Math.min(payloadRemaining, value.byteLength - offset);
|
|
169
|
+
const chunk = value.subarray(offset, offset + take);
|
|
170
|
+
sinkHash.update(chunk);
|
|
171
|
+
await sink.write(chunk);
|
|
172
|
+
payloadRemaining -= take;
|
|
173
|
+
offset += take;
|
|
174
|
+
if (payloadRemaining === 0)
|
|
175
|
+
await closeSink();
|
|
176
|
+
continue;
|
|
177
|
+
}
|
|
178
|
+
if (paddingRemaining > 0) {
|
|
179
|
+
const take = Math.min(paddingRemaining, value.byteLength - offset);
|
|
180
|
+
for (let index = offset; index < offset + take; index++) {
|
|
181
|
+
if (value[index] !== 0)
|
|
182
|
+
throw invalid('Nonzero tree TAR padding');
|
|
183
|
+
}
|
|
184
|
+
paddingRemaining -= take;
|
|
185
|
+
offset += take;
|
|
186
|
+
continue;
|
|
187
|
+
}
|
|
188
|
+
const take = Math.min(ustar_js_1.TAR_BLOCK_BYTES - pending.byteLength, value.byteLength - offset);
|
|
189
|
+
pending = b4a_1.default.concat([pending, value.subarray(offset, offset + take)]);
|
|
190
|
+
offset += take;
|
|
191
|
+
if (pending.byteLength < ustar_js_1.TAR_BLOCK_BYTES)
|
|
192
|
+
continue;
|
|
193
|
+
const block = pending;
|
|
194
|
+
pending = b4a_1.default.alloc(0);
|
|
195
|
+
await consumeHeader(block);
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
if (pending.byteLength !== 0 ||
|
|
199
|
+
payloadRemaining !== 0 ||
|
|
200
|
+
paddingRemaining !== 0 ||
|
|
201
|
+
sink !== null) {
|
|
202
|
+
throw invalid('Truncated tree TAR payload');
|
|
203
|
+
}
|
|
204
|
+
if (position !== metadata.tarSize)
|
|
205
|
+
throw invalid('Truncated tree TAR payload');
|
|
206
|
+
if (terminatorBlocks !== 2)
|
|
207
|
+
throw invalid('Missing tree TAR terminator');
|
|
208
|
+
if (digests.length !== metadata.entryCount)
|
|
209
|
+
throw invalid('Tree entry count mismatch');
|
|
210
|
+
if (payloadBytes !== metadata.payloadBytes)
|
|
211
|
+
throw invalid('Tree payload size mismatch');
|
|
212
|
+
const treeSha256 = (0, tree_js_1.treeDigest)(digests);
|
|
213
|
+
const tarSha256 = tarHash.digest();
|
|
214
|
+
if (!(0, hash_js_1.digestMatches)(treeSha256, b4a_1.default.from(metadata.treeSha256, 'hex'))) {
|
|
215
|
+
throw new errors_js_1.SwarmDeployError(errors_js_1.ERRORS.CHECKSUM_MISMATCH, 'Extracted tree digest mismatch');
|
|
216
|
+
}
|
|
217
|
+
if (!(0, hash_js_1.digestMatches)(tarSha256, b4a_1.default.from(metadata.tarSha256, 'hex'))) {
|
|
218
|
+
throw new errors_js_1.SwarmDeployError(errors_js_1.ERRORS.CHECKSUM_MISMATCH, 'TAR digest mismatch');
|
|
219
|
+
}
|
|
220
|
+
await target.complete();
|
|
221
|
+
return {
|
|
222
|
+
entries: digests.map((value) => value.entry),
|
|
223
|
+
entryCount: digests.length,
|
|
224
|
+
payloadBytes,
|
|
225
|
+
treeSha256,
|
|
226
|
+
tarSize: metadata.tarSize,
|
|
227
|
+
tarSha256
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
catch (error) {
|
|
231
|
+
// A half-written file must release its handle before the target removes the tree.
|
|
232
|
+
if (sink)
|
|
233
|
+
await Promise.resolve(sink.close()).catch(() => { });
|
|
234
|
+
await Promise.resolve(target.abort(error)).catch(() => { });
|
|
235
|
+
if (error instanceof errors_js_1.SwarmDeployError)
|
|
236
|
+
throw error;
|
|
237
|
+
throw invalid('Tree extraction failed', error);
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
//# sourceMappingURL=tree-extract.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tree-extract.js","sourceRoot":"","sources":["../../src/tar-protocol/tree-extract.ts"],"names":[],"mappings":";;;;;;AAAA,8CAAqB;AACrB,0CAAkE;AAClE,4CAAuD;AACvD,+CAIsB;AACtB,uCAAuD;AACvD,uCAOkB;AAClB,yCAAsE;AA2BtE,SAAS,OAAO,CAAC,OAAe,EAAE,KAAK,GAAY,IAAI;IACrD,OAAO,IAAI,4BAAgB,CAAC,kBAAM,CAAC,gBAAgB,EAAE,OAAO,EAAE,KAAK,CAAC,CAAA;AACtE,CAAC;AAED,SAAS,UAAU,CAAC,KAAa,EAAE,MAAc,EAAE,MAAc;IAC/D,IAAI,KAAK,GAAG,CAAC,CAAA;IACb,IAAI,MAAM,GAAG,CAAC,CAAA;IACd,KAAK,IAAI,KAAK,GAAG,MAAM,EAAE,KAAK,GAAG,MAAM,GAAG,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;QAC1D,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAA;QACzB,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,CAAC;YAAE,MAAK;QACtC,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI;YAAE,MAAM,OAAO,CAAC,8BAA8B,CAAC,CAAA;QAC7E,KAAK,GAAG,KAAK,GAAG,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,CAAA;QACjC,MAAM,EAAE,CAAA;QACR,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC;YAAE,MAAM,OAAO,CAAC,8BAA8B,CAAC,CAAA;IACjF,CAAC;IACD,IAAI,MAAM,KAAK,CAAC;QAAE,MAAM,OAAO,CAAC,8BAA8B,CAAC,CAAA;IAC/D,OAAO,KAAK,CAAA;AACd,CAAC;AAED,SAAS,eAAe,CAAC,KAAa;IACpC,IAAI,GAAG,GAAG,CAAC,CAAA;IACX,OAAO,GAAG,GAAG,GAAG,IAAI,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC;QAAE,GAAG,EAAE,CAAA;IAC3C,KAAK,IAAI,KAAK,GAAG,GAAG,EAAE,KAAK,GAAG,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC;QAC3C,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC;YAAE,MAAM,OAAO,CAAC,8BAA8B,CAAC,CAAA;IACvE,CAAC;IACD,IAAI,GAAG,KAAK,CAAC;QAAE,MAAM,OAAO,CAAC,8BAA8B,CAAC,CAAA;IAC5D,OAAO,aAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,MAAM,CAAC,CAAA;AACrD,CAAC;AAED;;;;;;;;;;;GAWG;AACI,KAAK,oCACV,MAAwD,EACxD,eAAmC,EACnC,MAA4B,EAC5B,EAAE,MAAM,GAAG,IAAI,EAAE,GAA0B,EAAE;IAE7C,IACE,CAAC,MAAM;QACP,OAAO,MAAM,KAAK,QAAQ;QAC1B,OAAO,MAAM,CAAC,eAAe,KAAK,UAAU;QAC5C,OAAO,MAAM,CAAC,UAAU,KAAK,UAAU;QACvC,OAAO,MAAM,CAAC,QAAQ,KAAK,UAAU;QACrC,OAAO,MAAM,CAAC,KAAK,KAAK,UAAU,EAClC,CAAC;QACD,MAAM,OAAO,CAAC,gCAAgC,CAAC,CAAA;IACjD,CAAC;IACD,MAAM,QAAQ,GAAG,IAAA,sCAAwB,EAAC,IAAA,sCAAwB,EAAC,eAAe,CAAC,CAAC,CAAA;IACpF,MAAM,OAAO,GAAG,IAAI,sBAAY,EAAE,CAAA;IAClC,MAAM,OAAO,GAAsB,EAAE,CAAA;IACrC,MAAM,WAAW,GAAG,IAAI,GAAG,EAAU,CAAA;IACrC,MAAM,MAAM,GAAG,IAAI,GAAG,EAAU,CAAA;IAEhC,IAAI,QAAQ,GAAG,CAAC,CAAA;IAChB,IAAI,OAAO,GAAW,aAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;IAClC,IAAI,YAAY,GAAG,CAAC,CAAA;IACpB,IAAI,YAAY,GAAkB,IAAI,CAAA;IACtC,IAAI,gBAAgB,GAAG,CAAC,CAAA;IACxB,IAAI,IAAI,GAAwB,IAAI,CAAA;IACpC,IAAI,QAAQ,GAAwB,IAAI,CAAA;IACxC,IAAI,SAAS,GAAqB,IAAI,CAAA;IACtC,IAAI,gBAAgB,GAAG,CAAC,CAAA;IACxB,IAAI,gBAAgB,GAAG,CAAC,CAAA;IAExB,MAAM,SAAS,GAAG,KAAK,IAAmB,EAAE;QAC1C,IAAI,CAAC,IAAI,IAAI,CAAC,QAAQ,IAAI,CAAC,SAAS;YAAE,MAAM,OAAO,CAAC,uCAAuC,CAAC,CAAA;QAC5F,MAAM,OAAO,GAAG,IAAI,CAAA;QACpB,MAAM,IAAI,GAAG,QAAQ,CAAA;QACrB,MAAM,KAAK,GAAG,SAAS,CAAA;QACvB,IAAI,GAAG,IAAI,CAAA;QACX,QAAQ,GAAG,IAAI,CAAA;QACf,SAAS,GAAG,IAAI,CAAA;QAChB,MAAM,OAAO,CAAC,KAAK,EAAE,CAAA;QACrB,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,CAAA;IAChD,CAAC,CAAA;IAED,MAAM,aAAa,GAAG,KAAK,EAAE,KAAa,EAAiB,EAAE;QAC3D,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,CAAC,CAAC,EAAE,CAAC;YACtC,gBAAgB,EAAE,CAAA;YAClB,IAAI,gBAAgB,GAAG,CAAC;gBAAE,MAAM,OAAO,CAAC,2BAA2B,CAAC,CAAA;YACpE,OAAM;QACR,CAAC;QACD,IAAI,gBAAgB,GAAG,CAAC;YAAE,MAAM,OAAO,CAAC,iCAAiC,CAAC,CAAA;QAC1E,MAAM,UAAU,GAAG,eAAe,CAAC,KAAK,CAAC,CAAA;QACzC,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,CAAA;QAC3B,IAAI,QAAQ,KAAK,EAAE,IAAI,QAAQ,KAAK,EAAE;YAAE,MAAM,OAAO,CAAC,iCAAiC,CAAC,CAAA;QACxF,MAAM,IAAI,GAAG,QAAQ,KAAK,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAA;QACnD,IAAI,IAAI,KAAK,WAAW,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YACtD,MAAM,OAAO,CAAC,8BAA8B,CAAC,CAAA;QAC/C,CAAC;QACD,IAAI,IAAI,KAAK,MAAM,IAAI,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC;YAAE,MAAM,OAAO,CAAC,8BAA8B,CAAC,CAAA;QAC9F,MAAM,YAAY,GAAG,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAA;QAChF,IAAA,6BAAmB,EAAC,YAAY,EAAE,IAAI,CAAC,CAAA;QACvC,MAAM,IAAI,GAAG,UAAU,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC,CAAA;QACvC,IAAI,IAAI,KAAK,WAAW,IAAI,IAAI,KAAK,CAAC;YAAE,MAAM,OAAO,CAAC,6BAA6B,CAAC,CAAA;QACpF,IAAI,CAAC,aAAG,CAAC,MAAM,CAAC,KAAK,EAAE,IAAA,mCAAwB,EAAC,UAAU,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC;YACzE,MAAM,OAAO,CAAC,8BAA8B,CAAC,CAAA;QAC/C,CAAC;QACD,IAAI,OAAO,CAAC,MAAM,IAAI,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,UAAU,EAAE,0BAAgB,CAAC,EAAE,CAAC;YACtE,MAAM,OAAO,CAAC,wCAAwC,CAAC,CAAA;QACzD,CAAC;QACD,IAAI,YAAY,KAAK,IAAI,IAAI,IAAA,0BAAgB,EAAC,YAAY,EAAE,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC;YAC/E,MAAM,OAAO,CAAC,+BAA+B,CAAC,CAAA;QAChD,CAAC;QACD,MAAM,IAAI,GAAG,YAAY,CAAC,WAAW,EAAE,CAAA;QACvC,IAAI,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,MAAM,OAAO,CAAC,uCAAuC,CAAC,CAAA;QAC5E,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;QAChB,MAAM,SAAS,GAAG,YAAY,CAAC,WAAW,CAAC,GAAG,CAAC,CAAA;QAC/C,IAAI,SAAS,KAAK,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,EAAE,CAAC;YAC3E,MAAM,OAAO,CAAC,0CAA0C,CAAC,CAAA;QAC3D,CAAC;QACD,YAAY,GAAG,YAAY,CAAA;QAC3B,MAAM,KAAK,GAAc,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;QAC5F,IAAI,IAAI,KAAK,WAAW,EAAE,CAAC;YACzB,WAAW,CAAC,GAAG,CAAC,YAAY,CAAC,CAAA;YAC7B,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,CAAA;YACvB,MAAM,MAAM,CAAC,eAAe,CAAC,YAAY,CAAC,CAAA;YAC1C,OAAM;QACR,CAAC;QACD,IAAI,YAAY,GAAG,QAAQ,CAAC,YAAY,GAAG,IAAI;YAAE,MAAM,OAAO,CAAC,gCAAgC,CAAC,CAAA;QAChG,YAAY,IAAI,IAAI,CAAA;QACpB,SAAS,GAAG,KAAK,CAAA;QACjB,QAAQ,GAAG,IAAI,sBAAY,EAAE,CAAA;QAC7B,IAAI,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,YAAY,EAAE,IAAI,CAAC,CAAA;QAClD,gBAAgB,GAAG,IAAI,CAAA;QACvB,gBAAgB,GAAG,CAAC,0BAAe,GAAG,CAAC,IAAI,GAAG,0BAAe,CAAC,CAAC,GAAG,0BAAe,CAAA;QACjF,IAAI,gBAAgB,KAAK,CAAC;YAAE,MAAM,SAAS,EAAE,CAAA;IAC/C,CAAC,CAAA;IAED,IAAI,CAAC;QACH,IAAA,yBAAc,EAAC,MAAM,CAAC,CAAA;QACtB,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YACjC,IAAA,yBAAc,EAAC,MAAM,CAAC,CAAA;YACtB,IAAI,CAAC,aAAG,CAAC,QAAQ,CAAC,KAAK,CAAC;gBAAE,MAAM,OAAO,CAAC,0BAA0B,CAAC,CAAA;YACnE,IAAI,QAAQ,GAAG,QAAQ,CAAC,OAAO,GAAG,KAAK,CAAC,UAAU;gBAAE,MAAM,OAAO,CAAC,2BAA2B,CAAC,CAAA;YAC9F,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;YACrB,QAAQ,IAAI,KAAK,CAAC,UAAU,CAAA;YAC5B,IAAI,MAAM,GAAG,CAAC,CAAA;YACd,OAAO,MAAM,GAAG,KAAK,CAAC,UAAU,EAAE,CAAC;gBACjC,IAAI,gBAAgB,GAAG,CAAC,EAAE,CAAC;oBACzB,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,gBAAgB,EAAE,KAAK,CAAC,UAAU,GAAG,MAAM,CAAC,CAAA;oBAClE,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,CAAA;oBACnD,QAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;oBACvB,MAAM,IAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;oBACxB,gBAAgB,IAAI,IAAI,CAAA;oBACxB,MAAM,IAAI,IAAI,CAAA;oBACd,IAAI,gBAAgB,KAAK,CAAC;wBAAE,MAAM,SAAS,EAAE,CAAA;oBAC7C,SAAQ;gBACV,CAAC;gBACD,IAAI,gBAAgB,GAAG,CAAC,EAAE,CAAC;oBACzB,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,gBAAgB,EAAE,KAAK,CAAC,UAAU,GAAG,MAAM,CAAC,CAAA;oBAClE,KAAK,IAAI,KAAK,GAAG,MAAM,EAAE,KAAK,GAAG,MAAM,GAAG,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;wBACxD,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC;4BAAE,MAAM,OAAO,CAAC,0BAA0B,CAAC,CAAA;oBACnE,CAAC;oBACD,gBAAgB,IAAI,IAAI,CAAA;oBACxB,MAAM,IAAI,IAAI,CAAA;oBACd,SAAQ;gBACV,CAAC;gBACD,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,0BAAe,GAAG,OAAO,CAAC,UAAU,EAAE,KAAK,CAAC,UAAU,GAAG,MAAM,CAAC,CAAA;gBACtF,OAAO,GAAG,aAAG,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,CAAA;gBACtE,MAAM,IAAI,IAAI,CAAA;gBACd,IAAI,OAAO,CAAC,UAAU,GAAG,0BAAe;oBAAE,SAAQ;gBAClD,MAAM,KAAK,GAAG,OAAO,CAAA;gBACrB,OAAO,GAAG,aAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;gBACtB,MAAM,aAAa,CAAC,KAAK,CAAC,CAAA;YAC5B,CAAC;QACH,CAAC;QACD,IACE,OAAO,CAAC,UAAU,KAAK,CAAC;YACxB,gBAAgB,KAAK,CAAC;YACtB,gBAAgB,KAAK,CAAC;YACtB,IAAI,KAAK,IAAI,EACb,CAAC;YACD,MAAM,OAAO,CAAC,4BAA4B,CAAC,CAAA;QAC7C,CAAC;QACD,IAAI,QAAQ,KAAK,QAAQ,CAAC,OAAO;YAAE,MAAM,OAAO,CAAC,4BAA4B,CAAC,CAAA;QAC9E,IAAI,gBAAgB,KAAK,CAAC;YAAE,MAAM,OAAO,CAAC,6BAA6B,CAAC,CAAA;QACxE,IAAI,OAAO,CAAC,MAAM,KAAK,QAAQ,CAAC,UAAU;YAAE,MAAM,OAAO,CAAC,2BAA2B,CAAC,CAAA;QACtF,IAAI,YAAY,KAAK,QAAQ,CAAC,YAAY;YAAE,MAAM,OAAO,CAAC,4BAA4B,CAAC,CAAA;QACvF,MAAM,UAAU,GAAG,IAAA,oBAAU,EAAC,OAAO,CAAC,CAAA;QACtC,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,EAAE,CAAA;QAClC,IAAI,CAAC,IAAA,uBAAa,EAAC,UAAU,EAAE,aAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC;YACrE,MAAM,IAAI,4BAAgB,CAAC,kBAAM,CAAC,iBAAiB,EAAE,gCAAgC,CAAC,CAAA;QACxF,CAAC;QACD,IAAI,CAAC,IAAA,uBAAa,EAAC,SAAS,EAAE,aAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC;YACnE,MAAM,IAAI,4BAAgB,CAAC,kBAAM,CAAC,iBAAiB,EAAE,qBAAqB,CAAC,CAAA;QAC7E,CAAC;QACD,MAAM,MAAM,CAAC,QAAQ,EAAE,CAAA;QACvB,OAAO;YACL,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC;YAC5C,UAAU,EAAE,OAAO,CAAC,MAAM;YAC1B,YAAY;YACZ,UAAU;YACV,OAAO,EAAE,QAAQ,CAAC,OAAO;YACzB,SAAS;SACV,CAAA;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,kFAAkF;QAClF,IAAI,IAAI;YAAE,MAAM,OAAO,CAAC,OAAO,CAAE,IAAqB,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;QAC/E,MAAM,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;QAC1D,IAAI,KAAK,YAAY,4BAAgB;YAAE,MAAM,KAAK,CAAA;QAClD,MAAM,OAAO,CAAC,wBAAwB,EAAE,KAAK,CAAC,CAAA;IAChD,CAAC;AACH,CAAC"}
|