@zip.js/zip.js 2.8.53 → 2.8.55

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.
Files changed (48) hide show
  1. package/README.md +1 -1
  2. package/deno.json +2 -1
  3. package/dist/zip-core-external.js +737 -491
  4. package/dist/zip-core-external.min.js +1 -1
  5. package/dist/zip-core.js +745 -490
  6. package/dist/zip-core.min.js +1 -1
  7. package/dist/zip-fs-core-external.js +776 -525
  8. package/dist/zip-fs-core-external.min.js +1 -1
  9. package/dist/zip-fs-core.js +738 -510
  10. package/dist/zip-fs-core.min.js +1 -1
  11. package/dist/zip-fs-external.js +776 -525
  12. package/dist/zip-fs-external.min.js +1 -1
  13. package/dist/zip-fs-native.js +790 -525
  14. package/dist/zip-fs-native.min.js +1 -1
  15. package/dist/zip-fs.js +791 -526
  16. package/dist/zip-fs.min.js +1 -1
  17. package/dist/zip-legacy.js +746 -491
  18. package/dist/zip-legacy.min.js +1 -1
  19. package/dist/zip-native.js +746 -491
  20. package/dist/zip-native.min.js +1 -1
  21. package/dist/zip-web-worker-native.js +1 -1
  22. package/dist/zip-web-worker.js +1 -1
  23. package/dist/zip.js +747 -492
  24. package/dist/zip.min.js +1 -1
  25. package/eslint.config.mjs +1 -0
  26. package/index-native.cjs +790 -525
  27. package/index-native.min.js +1 -1
  28. package/index.cjs +791 -526
  29. package/index.d.cts +422 -49
  30. package/index.d.ts +422 -49
  31. package/index.min.js +1 -1
  32. package/lib/core/configuration.js +62 -21
  33. package/lib/core/constants.js +13 -1
  34. package/lib/core/io.js +33 -27
  35. package/lib/core/options.js +44 -2
  36. package/lib/core/streams/aes-crypto-stream.js +12 -12
  37. package/lib/core/util/decode-text.js +11 -2
  38. package/lib/core/web-worker-base.js +3 -2
  39. package/lib/core/web-worker-inline-native.js +1 -1
  40. package/lib/core/web-worker-inline-wasm.js +1 -1
  41. package/lib/core/zip-fs.js +39 -32
  42. package/lib/core/zip-reader.js +100 -38
  43. package/lib/core/zip-writer.js +301 -177
  44. package/lib/core/zlib-streams-inline.js +1 -1
  45. package/lib/zip-core-base.js +6 -1
  46. package/lib/zip-core-reader.js +1 -0
  47. package/lib/zip-core-writer.js +5 -0
  48. package/package.json +8 -2
package/dist/zip-fs.js CHANGED
@@ -45,6 +45,7 @@
45
45
 
46
46
  const LOCAL_FILE_HEADER_SIGNATURE = 0x04034b50;
47
47
  const SPLIT_ZIP_FILE_SIGNATURE = 0x08074b50;
48
+ const TEMPORARY_SPLIT_ZIP_FILE_SIGNATURE = 0x30304b50;
48
49
  const DATA_DESCRIPTOR_RECORD_SIGNATURE = SPLIT_ZIP_FILE_SIGNATURE;
49
50
  const ARCHIVE_EXTRA_DATA_SIGNATURE = 0x08064b50;
50
51
  const DIGITAL_SIGNATURE_RECORD_SIGNATURE = 0x05054b50;
@@ -61,6 +62,7 @@
61
62
  const DATA_DESCRIPTOR_RECORD_LENGTH = 12;
62
63
  const DATA_DESCRIPTOR_RECORD_ZIP_64_LENGTH = 20;
63
64
  const DATA_DESCRIPTOR_RECORD_SIGNATURE_LENGTH = 4;
65
+ const SPLIT_ZIP_FILE_SIGNATURE_LENGTH = 4;
64
66
 
65
67
  const EXTRAFIELD_TYPE_ZIP64 = 0x0001;
66
68
  const EXTRAFIELD_TYPE_AES = 0x9901;
@@ -83,6 +85,7 @@
83
85
  const BITFLAG_DATA_DESCRIPTOR = 0b1000;
84
86
  const BITFLAG_STRONG_ENCRYPTION = 0b1000000;
85
87
  const BITFLAG_LANG_ENCODING_FLAG = 0b100000000000;
88
+ const BITFLAG_MASKED_LOCAL_HEADERS = 0b10000000000000;
86
89
  const FILE_ATTR_MSDOS_DIR_MASK = 0b10000;
87
90
  const FILE_ATTR_MSDOS_READONLY_MASK = 0x01;
88
91
  const FILE_ATTR_MSDOS_HIDDEN_MASK = 0x02;
@@ -112,6 +115,8 @@
112
115
  const HEADER_OFFSET_SIGNATURE = 10;
113
116
  const HEADER_OFFSET_COMPRESSED_SIZE = 14;
114
117
  const HEADER_OFFSET_UNCOMPRESSED_SIZE = 18;
118
+ const HEADER_OFFSET_FILENAME_LENGTH = 22;
119
+ const HEADER_OFFSET_EXTRAFIELD_LENGTH = 24;
115
120
  const LOCAL_HEADER_COMMON_OFFSET = 4;
116
121
 
117
122
  const MAX_DATE = new Date(2107, 11, 31, 23, 59, 58);
@@ -124,9 +129,116 @@
124
129
  const OBJECT_TYPE = "object";
125
130
  const STRING_TYPE = "string";
126
131
  const NUMBER_TYPE = "number";
132
+ const BOOLEAN_TYPE = "boolean";
127
133
 
128
134
  const EMPTY_UINT8_ARRAY = new Uint8Array();
129
135
 
136
+ /*
137
+ Copyright (c) 2022 Gildas Lormeau. All rights reserved.
138
+
139
+ Redistribution and use in source and binary forms, with or without
140
+ modification, are permitted provided that the following conditions are met:
141
+
142
+ 1. Redistributions of source code must retain the above copyright notice,
143
+ this list of conditions and the following disclaimer.
144
+
145
+ 2. Redistributions in binary form must reproduce the above copyright
146
+ notice, this list of conditions and the following disclaimer in
147
+ the documentation and/or other materials provided with the distribution.
148
+
149
+ 3. The names of the authors may not be used to endorse or promote products
150
+ derived from this software without specific prior written permission.
151
+
152
+ THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
153
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
154
+ FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
155
+ INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
156
+ INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
157
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
158
+ OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
159
+ LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
160
+ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
161
+ EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
162
+ */
163
+
164
+
165
+ const OPTION_FILENAME_ENCODING = "filenameEncoding";
166
+ const OPTION_COMMENT_ENCODING = "commentEncoding";
167
+ const OPTION_DECODE_TEXT = "decodeText";
168
+ const OPTION_EXTRACT_PREPENDED_DATA = "extractPrependedData";
169
+ const OPTION_EXTRACT_APPENDED_DATA = "extractAppendedData";
170
+ const OPTION_PASSWORD = "password";
171
+ const OPTION_RAW_PASSWORD = "rawPassword";
172
+ const OPTION_PASS_THROUGH = "passThrough";
173
+ const OPTION_SIGNAL = "signal";
174
+ const OPTION_CHECK_PASSWORD_ONLY = "checkPasswordOnly";
175
+ const OPTION_CHECK_OVERLAPPING_ENTRY_ONLY = "checkOverlappingEntryOnly";
176
+ const OPTION_CHECK_OVERLAPPING_ENTRY = "checkOverlappingEntry";
177
+ const OPTION_CHECK_AMBIGUITY = "checkAmbiguity";
178
+ const OPTION_CHECK_LOCAL_DIRECTORY = "checkLocalDirectory";
179
+ const OPTION_CHECK_SIGNATURE = "checkSignature";
180
+ const OPTION_CHECK_CRC32 = "checkCrc32";
181
+ const OPTION_CHECK_AUTHENTICATION_CODE = "checkAuthenticationCode";
182
+ const OPTION_USE_WEB_WORKERS = "useWebWorkers";
183
+ const OPTION_USE_COMPRESSION_STREAM = "useCompressionStream";
184
+ const OPTION_TRANSFER_STREAMS = "transferStreams";
185
+ const OPTION_PREVENT_CLOSE = "preventClose";
186
+ const OPTION_ENCRYPTION_STRENGTH = "encryptionStrength";
187
+ const OPTION_EXTENDED_TIMESTAMP = "extendedTimestamp";
188
+ const OPTION_NTFS_TIMESTAMP = "ntfsTimestamp";
189
+ const OPTION_KEEP_ORDER = "keepOrder";
190
+ const OPTION_LEVEL = "level";
191
+ const OPTION_BUFFERED_WRITE = "bufferedWrite";
192
+ const OPTION_CREATE_TEMP_STREAM = "createTempStream";
193
+ const OPTION_DATA_DESCRIPTOR_SIGNATURE = "dataDescriptorSignature";
194
+ const OPTION_USE_UNICODE_FILE_NAMES = "useUnicodeFileNames";
195
+ const OPTION_DATA_DESCRIPTOR = "dataDescriptor";
196
+ const OPTION_SUPPORT_ZIP64_SPLIT_FILE = "supportZip64SplitFile";
197
+ const OPTION_ENCODE_TEXT = "encodeText";
198
+ const OPTION_OFFSET = "offset";
199
+ const OPTION_USDZ = "usdz";
200
+ const OPTION_UNIX_EXTRA_FIELD_TYPE = "unixExtraFieldType";
201
+ const OPTION_LOCAL_EXTRA_FIELD = "localExtraField";
202
+ const OPTION_STRICTNESS = "strictness";
203
+ const OPTION_FILENAME_VALIDATION = "filenameValidation";
204
+ const OPTION_NORMALIZE_FILENAME = "normalizeFilename";
205
+ const OPTION_MAX_APPENDED_DATA_SIZE = "maxAppendedDataSize";
206
+ const OPTION_DECRYPT_CENTRAL_DIRECTORY = "decryptCentralDirectory";
207
+ const OPTION_SIGN_CENTRAL_DIRECTORY = "signCentralDirectory";
208
+ const TEXT_TYPE_FILENAME = "filename";
209
+ const TEXT_TYPE_COMMENT = "comment";
210
+ const STRICTNESS_STRICT = "strict";
211
+ const STRICTNESS_BALANCED = "balanced";
212
+ const STRICTNESS_TOLERANT = "tolerant";
213
+
214
+ const ERR_INVALID_FUNCTION_OPTION = "Invalid option (must be a function)";
215
+ const ERR_INVALID_SIGNAL = "Invalid signal (must be an AbortSignal instance)";
216
+ const ERR_INVALID_PASSWORD_TYPE = "Invalid password (password must be a string, rawPassword must be a Uint8Array)";
217
+
218
+ function checkFunctionOption(value) {
219
+ if (value && typeof value != FUNCTION_TYPE) {
220
+ throw new Error(ERR_INVALID_FUNCTION_OPTION);
221
+ }
222
+ return value;
223
+ }
224
+
225
+ function checkSignalOption(signal) {
226
+ if (signal && (typeof signal.addEventListener != FUNCTION_TYPE || typeof signal.aborted != BOOLEAN_TYPE)) {
227
+ throw new Error(ERR_INVALID_SIGNAL);
228
+ }
229
+ return signal || UNDEFINED_VALUE;
230
+ }
231
+
232
+ function checkPasswordOption(password, rawPassword) {
233
+ if ((password && typeof password != STRING_TYPE) || (rawPassword && !(rawPassword instanceof Uint8Array))) {
234
+ throw new Error(ERR_INVALID_PASSWORD_TYPE);
235
+ }
236
+ }
237
+
238
+ function toNumber(value) {
239
+ return typeof value == STRING_TYPE && value.trim() ? Number(value) : value;
240
+ }
241
+
130
242
  /*
131
243
  Copyright (c) 2025 Gildas Lormeau. All rights reserved.
132
244
 
@@ -156,7 +268,10 @@
156
268
  */
157
269
 
158
270
 
271
+ const DEFAULT_CHUNK_SIZE$1 = 64 * 1024;
159
272
  const MINIMUM_CHUNK_SIZE = 64;
273
+ const MINIMUM_PROPERTY_VALUE = 1;
274
+ const ERR_INVALID_MAX_WORKERS = "Invalid maxWorkers (must be an integer greater than 0)";
160
275
  let maxWorkers = 2;
161
276
  try {
162
277
  if (typeof navigator != UNDEFINED_TYPE && navigator.hardwareConcurrency) {
@@ -168,7 +283,7 @@
168
283
  const DEFAULT_CONFIGURATION = {
169
284
  workerURI: "./core/web-worker-wasm.js",
170
285
  wasmURI: "./core/streams/zlib-wasm/zlib-streams.wasm",
171
- chunkSize: 64 * 1024,
286
+ chunkSize: DEFAULT_CHUNK_SIZE$1,
172
287
  maxWorkers,
173
288
  terminateWorkerTimeout: 5000,
174
289
  workerStarvationTimeout: 5000,
@@ -180,24 +295,38 @@
180
295
  DecompressionStream: typeof DecompressionStream != UNDEFINED_TYPE && DecompressionStream
181
296
  };
182
297
 
183
- const CONFIGURABLE_PROPERTY_NAMES = [
298
+ const PROPERTY_NAME_MAX_WORKERS = "maxWorkers";
299
+
300
+ const STRING_PROPERTY_NAMES = [
184
301
  "baseURI",
185
302
  "wasmURI",
186
- "workerURI",
187
- "createWorker",
303
+ "workerURI"
304
+ ];
305
+ const BOOLEAN_PROPERTY_NAMES = [
306
+ "useCompressionStream",
307
+ "useWebWorkers",
308
+ "transferStreams"
309
+ ];
310
+ const NUMBER_PROPERTY_NAMES = [
188
311
  "chunkSize",
189
- "maxWorkers",
312
+ PROPERTY_NAME_MAX_WORKERS,
190
313
  "terminateWorkerTimeout",
191
314
  "workerStarvationTimeout",
192
- "workerStartupTimeout",
193
- "useCompressionStream",
194
- "useWebWorkers",
195
- "transferStreams",
315
+ "workerStartupTimeout"
316
+ ];
317
+ const FUNCTION_PROPERTY_NAMES = [
318
+ "createWorker",
196
319
  "CompressionStream",
197
320
  "DecompressionStream",
198
321
  "CompressionStreamFallback",
199
322
  "DecompressionStreamFallback"
200
323
  ];
324
+ const CONFIGURABLE_PROPERTY_NAMES = [
325
+ ...STRING_PROPERTY_NAMES,
326
+ ...BOOLEAN_PROPERTY_NAMES,
327
+ ...NUMBER_PROPERTY_NAMES,
328
+ ...FUNCTION_PROPERTY_NAMES
329
+ ];
201
330
 
202
331
  const config = { ...DEFAULT_CONFIGURATION };
203
332
 
@@ -206,20 +335,43 @@
206
335
  }
207
336
 
208
337
  function getChunkSize(config) {
209
- return Math.max(config.chunkSize, MINIMUM_CHUNK_SIZE);
338
+ return normalizeChunkSize(config.chunkSize);
339
+ }
340
+
341
+ function normalizeChunkSize(chunkSize) {
342
+ chunkSize = toNumber(chunkSize);
343
+ return Number.isInteger(chunkSize) && chunkSize >= MINIMUM_PROPERTY_VALUE ? Math.max(chunkSize, MINIMUM_CHUNK_SIZE) : DEFAULT_CHUNK_SIZE$1;
210
344
  }
211
345
 
212
346
  function configure(configuration) {
213
- configuration = normalizeConfiguration(configuration);
347
+ Object.assign(config, checkConfiguration(normalizeConfiguration(configuration)));
348
+ }
349
+
350
+ function checkConfiguration(configuration) {
351
+ const checkedConfiguration = {};
214
352
  for (const propertyName of CONFIGURABLE_PROPERTY_NAMES) {
215
353
  const propertyValue = configuration[propertyName];
216
354
  if (propertyValue !== UNDEFINED_VALUE) {
217
- config[propertyName] = propertyValue;
355
+ checkedConfiguration[propertyName] = checkPropertyValue(propertyName, propertyValue);
218
356
  }
219
357
  }
358
+ return checkedConfiguration;
359
+ }
360
+
361
+ function checkPropertyValue(propertyName, propertyValue) {
362
+ if (NUMBER_PROPERTY_NAMES.includes(propertyName)) {
363
+ propertyValue = toNumber(propertyValue);
364
+ if (propertyName == PROPERTY_NAME_MAX_WORKERS && (!Number.isInteger(propertyValue) || propertyValue < MINIMUM_PROPERTY_VALUE)) {
365
+ throw new Error(ERR_INVALID_MAX_WORKERS);
366
+ }
367
+ } else if (FUNCTION_PROPERTY_NAMES.includes(propertyName)) {
368
+ checkFunctionOption(propertyValue);
369
+ }
370
+ return propertyValue;
220
371
  }
221
372
 
222
373
  function normalizeConfiguration(configuration) {
374
+ configuration = configuration || {};
223
375
  const { CompressionStreamZlib, DecompressionStreamZlib } = configuration;
224
376
  if (CompressionStreamZlib === UNDEFINED_VALUE && DecompressionStreamZlib === UNDEFINED_VALUE) {
225
377
  return configuration;
@@ -235,14 +387,9 @@
235
387
  }
236
388
 
237
389
  function setDefaultConfiguration(configuration) {
238
- configuration = normalizeConfiguration(configuration);
239
- for (const propertyName of CONFIGURABLE_PROPERTY_NAMES) {
240
- const propertyValue = configuration[propertyName];
241
- if (propertyValue !== UNDEFINED_VALUE) {
242
- DEFAULT_CONFIGURATION[propertyName] = propertyValue;
243
- }
244
- }
245
- configure(configuration);
390
+ const checkedConfiguration = checkConfiguration(normalizeConfiguration(configuration));
391
+ Object.assign(DEFAULT_CONFIGURATION, checkedConfiguration);
392
+ Object.assign(config, checkedConfiguration);
246
393
  }
247
394
 
248
395
  function resetConfiguration() {
@@ -252,7 +399,7 @@
252
399
  Object.assign(config, DEFAULT_CONFIGURATION);
253
400
  }
254
401
 
255
- const t$1=new Uint8Array(288);t$1.fill(8,0,144),t$1.fill(9,144,256),t$1.fill(7,256,280),t$1.fill(8,280,288),new Uint8Array(30).fill(5);const e="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",n$1=t=>t({workerURI:t=>{const n="text/javascript";let s='(t=>{"function"==typeof define&&define.amd?define(t):t()})(function(){"use strict";const{Array:t,Object:e,Number:n,Math:s,Error:r,Uint8Array:o,Uint16Array:c,Uint32Array:i,Int32Array:a,Map:f,DataView:l,Promise:w,TextEncoder:u,crypto:h,postMessage:p,TransformStream:d,ReadableStream:y,WritableStream:m,CompressionStream:S,DecompressionStream:g}=self,v=void 0,b="undefined",k="function",z=new o,C=[[],[],[],[],[],[],[],[]];for(let t=0;256>t;t++){let e=t;for(let t=0;8>t;t++)e=1&e?e>>>1^3988292384:e>>>1;C[0][t]=e}for(let t=0;256>t;t++)for(let e=1;8>e;e++){const n=C[e-1][t];C[e][t]=n>>>8^C[0][255&n]}const[A,I,x,M,P,D,F,B]=C;class R{constructor(t){this.o=t||-1}append(t){let e=0|this.o;const n=0|t.length;let s=0;if(n>=8&&t.buffer){const r=new l(t.buffer,t.byteOffset,n),o=n-8;for(;o>=s;s+=8){const t=e^r.getInt32(s,!0),n=r.getInt32(s+4,!0);e=B[255&t]^F[t>>>8&255]^D[t>>>16&255]^P[t>>>24&255]^M[255&n]^x[n>>>8&255]^I[n>>>16&255]^A[n>>>24&255]}}for(;n>s;s++)e=e>>>8^A[255&(e^t[s])];this.o=e}get(){return~this.o}}class U extends d{constructor(){let t;const e=new R;super({transform(t,n){e.append(t),n.enqueue(t)},flush(){const n=new o(4);new l(n.buffer).setUint32(0,e.get()),t.value=n}}),t=this}}function W(t,e){const n=new o(t.length+e.length);return n.set(t),n.set(e,t.length),n}function _(t){return new l(t.buffer,t.byteOffset,t.byteLength)}const T={concat(t,e){if(0===t.length||0===e.length)return t.concat(e);const n=t[t.length-1],s=T.l(n);return 32===s?t.concat(e):T.h(e,s,0|n,t.slice(0,t.length-1))},bitLength(t){const e=t.length;if(0===e)return 0;const n=t[e-1];return 32*(e-1)+T.l(n)},m(t,e){if(32*t.length<e)return t;const n=(t=t.slice(0,s.ceil(e/32))).length;return e&=31,n>0&&e&&(t[n-1]=T.S(e,t[n-1]&2147483648>>e-1,1)),t},S:(t,e,n)=>32===t?e:(n?0|e:e<<32-t)+1099511627776*t,l:t=>s.round(t/1099511627776)||32,h(t,e,n,s){for(void 0===s&&(s=[]);e>=32;e-=32)s.push(n),n=0;if(0===e)return s.concat(t);for(let r=0;r<t.length;r++)s.push(n|t[r]>>>e),n=t[r]<<32-e;const r=t.length?t[t.length-1]:0,o=T.l(r);return s.push(T.S(e+o&31,e+o>32?n:s.pop(),1)),s}},V={bytes:{v(t){const e=T.bitLength(t)/8,n=new o(e);let s;for(let r=0;e>r;r++)3&r||(s=t[r/4]),n[r]=s>>>24,s<<=8;return n},C(t){const e=[];let n,s=0;for(n=0;n<t.length;n++)s=s<<8|t[n],3&~n||(e.push(s),s=0);return 3&n&&e.push(T.S(8*(3&n),s)),e}}},K=class{constructor(t){const e=this;e.blockSize=512,e.A=[1732584193,4023233417,2562383102,271733878,3285377520],e.I=[1518500249,1859775393,2400959708,3395469782],t?(e.M=t.M.slice(0),e.P=t.P.slice(0),e.D=t.D):e.reset()}reset(){const t=this;return t.M=t.A.slice(0),t.P=[],t.D=0,t}update(t){const e=this;"string"==typeof t&&(t=V.F.C(t));const n=e.P=T.concat(e.P,t),s=e.D,o=e.D=s+T.bitLength(t);if(o>9007199254740991)throw new r("Cannot hash more than 2^53 - 1 bits");const c=new i(n);let a=0;for(let t=e.blockSize+s-(e.blockSize+s&e.blockSize-1);o>=t;t+=e.blockSize)e.B(c.subarray(16*a,16*(a+1))),a+=1;return n.splice(0,16*a),e}R(){const t=this;let e=t.P;const n=t.M;e=T.concat(e,[T.S(1,1)]);for(let t=e.length+2;15&t;t++)e.push(0);for(e.push(s.floor(t.D/4294967296)),e.push(0|t.D);e.length;)t.B(e.splice(0,16));return t.reset(),n}U(t,e,n,s){return t>19?t>39?t>59?t>79?void 0:e^n^s:e&n|e&s|n&s:e^n^s:e&n|~e&s}W(t,e){return e<<t|e>>>32-t}B(e){const n=this,r=n.M,o=t(80);for(let t=0;16>t;t++)o[t]=e[t];let c=r[0],i=r[1],a=r[2],f=r[3],l=r[4];for(let t=0;79>=t;t++){16>t||(o[t]=n.W(1,o[t-3]^o[t-8]^o[t-14]^o[t-16]));const e=n.W(5,c)+n.U(t,i,a,f)+l+o[t]+n.I[s.floor(t/20)]|0;l=f,f=a,a=n.W(30,i),i=c,c=e}r[0]=r[0]+c|0,r[1]=r[1]+i|0,r[2]=r[2]+a|0,r[3]=r[3]+f|0,r[4]=r[4]+l|0}},E={importKey:t=>new E._(V.bytes.C(t)),T(t,e,n,s){if(n=n||1e4,0>s||0>n)throw new r("invalid params to pbkdf2");const o=1+(s>>5)<<2;let c,i,a,f,w;const u=new ArrayBuffer(o),h=new l(u);let p=0;const d=T;for(e=V.bytes.C(e),w=1;(o||1)>p;w++){for(c=i=t.encrypt(d.concat(e,[w])),a=1;n>a;a++)for(i=t.encrypt(i),f=0;f<i.length;f++)c[f]^=i[f];for(a=0;(o||1)>p&&a<c.length;a++)h.setInt32(p,c[a]),p+=4}return u.slice(0,s/8)},_:class{constructor(t){const e=this,n=e.V=K,s=[[],[]];e.K=[new n,new n];const r=e.K[0].blockSize/32;t.length>r&&(t=(new n).update(t).R());for(let e=0;r>e;e++)s[0][e]=909522486^t[e],s[1][e]=1549556828^t[e];e.K[0].update(s[0]),e.K[1].update(s[1]),e.L=new n(e.K[0])}reset(){const t=this;t.L=new t.V(t.K[0]),t.O=!1}update(t){this.O=!0,this.L.update(t)}digest(){const t=this,e=t.L.R(),n=new t.V(t.K[1]).update(e).R();return t.reset(),n}encrypt(t){if(this.O)throw new r("encrypt on already updated hmac called!");return this.update(t),this.digest(t)}}},L=typeof h!=b&&typeof h.getRandomValues==k,O="Invalid password",j="Invalid signature",H=j,N="zipjs-abort-check-password";function q(t){if(L)return h.getRandomValues(t);throw new r("Crypto API not supported")}const G=16,J={name:"PBKDF2"},Q=e.assign({hash:{name:"HMAC"}},J),X=e.assign({iterations:1e3,hash:{name:"SHA-1"}},J),Y=["deriveBits"],Z=[8,12,16],$=[16,24,32],tt=10,et=[0,0,0,0],nt=typeof h!=b,st=nt&&h.subtle,rt=nt&&typeof st!=b,ot=V.bytes,ct=class{constructor(t){const e=this;e.j=[[[],[],[],[],[]],[[],[],[],[],[]]],e.j[0][0][0]||e.H();const n=e.j[0][4],s=e.j[1],o=t.length;let c,i,a,f=1;if(4!==o&&6!==o&&8!==o)throw new r("invalid aes key size");for(e.I=[i=t.slice(0),a=[]],c=o;4*o+28>c;c++){let t=i[c-1];(c%o===0||8===o&&c%o===4)&&(t=n[t>>>24]<<24^n[t>>16&255]<<16^n[t>>8&255]<<8^n[255&t],c%o===0&&(t=t<<8^t>>>24^f<<24,f=f<<1^283*(f>>7))),i[c]=i[c-o]^t}for(let t=0;c;t++,c--){const e=i[3&t?c:c-4];a[t]=4>=c||4>t?e:s[0][n[e>>>24]]^s[1][n[e>>16&255]]^s[2][n[e>>8&255]]^s[3][n[255&e]]}}encrypt(t){return this.N(t,0)}decrypt(t){return this.N(t,1)}H(){const t=this.j[0],e=this.j[1],n=t[4],s=e[4],r=[],o=[];let c,i,a,f;for(let t=0;256>t;t++)o[(r[t]=t<<1^283*(t>>7))^t]=t;for(let l=c=0;!n[l];l^=i||1,c=o[c]||1){let o=c^c<<1^c<<2^c<<3^c<<4;o=o>>8^255&o^99,n[l]=o,s[o]=l,f=r[a=r[i=r[l]]];let w=16843009*f^65537*a^257*i^16843008*l,u=257*r[o]^16843008*o;for(let n=0;4>n;n++)t[n][l]=u=u<<24^u>>>8,e[n][o]=w=w<<24^w>>>8}for(let n=0;5>n;n++)t[n]=t[n].slice(0),e[n]=e[n].slice(0)}N(t,e){if(4!==t.length)throw new r("invalid aes block size");const n=this.I[e],s=n.length/4-2,o=[0,0,0,0],c=this.j[e],i=c[0],a=c[1],f=c[2],l=c[3],w=c[4];let u,h,p,d=t[0]^n[0],y=t[e?3:1]^n[1],m=t[2]^n[2],S=t[e?1:3]^n[3],g=4;for(let t=0;s>t;t++)u=i[d>>>24]^a[y>>16&255]^f[m>>8&255]^l[255&S]^n[g],h=i[y>>>24]^a[m>>16&255]^f[S>>8&255]^l[255&d]^n[g+1],p=i[m>>>24]^a[S>>16&255]^f[d>>8&255]^l[255&y]^n[g+2],S=i[S>>>24]^a[d>>16&255]^f[y>>8&255]^l[255&m]^n[g+3],g+=4,d=u,y=h,m=p;for(let t=0;4>t;t++)o[e?3&-t:t]=w[d>>>24]<<24^w[y>>16&255]<<16^w[m>>8&255]<<8^w[255&S]^n[g++],u=d,d=y,y=m,m=S,S=u;return o}},it=class{constructor(t,e){this.G=t,this.J=e,this.X=e}reset(){this.X=this.J}update(t){return this.Y(this.G,t,this.X)}Z(t){if(255&~(t>>24))t+=1<<24;else{let e=t>>16&255,n=t>>8&255,s=255&t;255===e?(e=0,255===n?(n=0,255===s?s=0:++s):++n):++e,t=0,t+=e<<16,t+=n<<8,t+=s}return t}$(t){0===(t[0]=this.Z(t[0]))&&(t[1]=this.Z(t[1]))}Y(t,e,n){let s;if(!(s=e.length))return[];const r=T.bitLength(e);for(let r=0;s>r;r+=4){this.$(n);const s=t.encrypt(n);e[r]^=s[0],e[r+1]^=s[1],e[r+2]^=s[2],e[r+3]^=s[3]}return T.m(e,r)}},at=E._;let ft=nt&&rt&&typeof st.importKey==k,lt=nt&&rt&&typeof st.deriveBits==k;class wt extends d{constructor({password:t,rawPassword:e,encryptionStrength:n,checkPasswordOnly:s,checkAuthenticationCode:c=!0}){super({start(){ht(this,t,e,n)},async transform(t,e){const n=this,{password:c,strength:i,et:a,ready:f}=n;c?(await(async(t,e,n,s)=>{const o=await dt(t,e,n,mt(s,0,Z[e])),c=mt(s,Z[e]);if(o[0]!=c[0]||o[1]!=c[1])throw new r(O)})(n,i,c,mt(t,0,Z[i]+2)),t=mt(t,Z[i]+2),s?e.error(new r(N)):a()):await f;const l=new o(t.length-tt-(t.length-tt)%G);e.enqueue(pt(n,t,l,0,tt,!0))},async flush(t){const{nt:e,st:n,pending:s,ready:o}=this;if(n&&e){await o;const i=mt(s,0,s.length-tt),a=mt(s,s.length-tt);let f=z;if(i.length){const t=gt(ot,i);n.update(t);const s=e.update(t);f=St(ot,s)}const l=mt(St(ot,n.digest()),0,tt);let w=s.length<tt?1:0;for(let t=0;tt>t;t++)w|=l[t]^a[t];if(w&&c)throw new r(H);t.enqueue(f)}}})}}class ut extends d{constructor({password:t,rawPassword:e,encryptionStrength:n}){super({start(){ht(this,t,e,n)},async transform(t,e){const n=this,{password:s,strength:r,et:c,ready:i}=n;let a=z;s?(a=await(async(t,e,n)=>{const s=q(new o(Z[e]));return W(s,await dt(t,e,n,s))})(n,r,s),c()):await i;const f=new o(a.length+t.length-t.length%G);f.set(a,0),e.enqueue(pt(n,t,f,a.length,0))},async flush(t){const{nt:e,st:n,pending:s,ready:r}=this;if(n&&e){await r;let o=z;if(s.length){const t=e.update(gt(ot,s));n.update(t),o=St(ot,t)}const c=St(ot,n.digest()).slice(0,tt);t.enqueue(W(o,c))}}})}}function ht(t,n,s,r){e.assign(t,{ready:new w(e=>t.et=e),password:yt(n,s),strength:r-1,pending:z})}function pt(t,e,n,s,r,c){const{nt:i,st:a,pending:f}=t;f.length&&(e=W(f,e));const l=e.length-r;let w;for(n=((t,e)=>{if(e&&e>t.length){const n=t;(t=new o(e)).set(n,0)}return t})(n,s+(l-l%G)),w=0;l-G>=w;w+=G){const t=gt(ot,mt(e,w,w+G));c&&a.update(t);const r=i.update(t);c||a.update(r),n.set(St(ot,r),w+s)}return t.pending=mt(e,w),n}async function dt(n,s,r,c){n.password=null;const i=await(async(t,e,n,s,r)=>{if(!ft)return E.importKey(e);try{return await st.importKey("raw",e,n,!1,r)}catch{return ft=!1,E.importKey(e)}})(0,r,Q,0,Y),a=await(async(t,e,n)=>{if(!lt)return E.T(e,t.salt,X.iterations,n);try{return await st.deriveBits(t,e,n)}catch{return lt=!1,E.T(e,t.salt,X.iterations,n)}})(e.assign({salt:c},X),i,8*(2*$[s]+2)),f=new o(a),l=gt(ot,mt(f,0,$[s])),w=gt(ot,mt(f,$[s],2*$[s])),u=mt(f,2*$[s]);return e.assign(n,{keys:{key:l,ot:w,passwordVerification:u},nt:new it(new ct(l),t.from(et)),st:new at(w)}),u}function yt(t,e){return e===v?(t=>{if(typeof u==b){const e=new o((t=unescape(encodeURIComponent(t))).length);for(let n=0;n<e.length;n++)e[n]=t.charCodeAt(n);return e}return(new u).encode(t)})(t):e}function mt(t,e,n){return t.subarray(e,n)}function St(t,e){return t.v(e)}function gt(t,e){return t.C(e)}class vt extends d{constructor({password:t,rawPassword:e,passwordVerification:n,checkPasswordOnly:s}){super({start(){kt(this,t,e,n)},transform(t,e){const n=this;if(n.password||n.rawPassword){const e=zt(n,t.subarray(0,12));if(n.password=n.rawPassword=null,0!=(e[11]^n.passwordVerification))throw new r(O);t=t.subarray(12)}s?e.error(new r(N)):e.enqueue(zt(n,t))}})}}class bt extends d{constructor({password:t,rawPassword:e,passwordVerification:n}){super({start(){kt(this,t,e,n)},transform(t,e){const n=this;let s,r;if(n.password||n.rawPassword){n.password=n.rawPassword=null;const e=q(new o(12));e[11]=n.passwordVerification,s=new o(t.length+e.length),s.set(Ct(n,e),0),r=12}else s=new o(t.length),r=0;s.set(Ct(n,t),r),e.enqueue(s)}})}}function kt(t,n,s,r){e.assign(t,{password:n,rawPassword:s,passwordVerification:r}),((t,n,s)=>{const r=[305419896,591751049,878082192];if(e.assign(t,{keys:r,ct:new R(r[0]),it:new R(r[2])}),s)for(let e=0;e<s.length;e++)At(t,s[e]);else for(let e=0;e<n.length;e++)At(t,n.charCodeAt(e))})(t,n,s)}function zt(t,e){const n=new o(e.length);for(let s=0;s<e.length;s++)n[s]=It(t)^e[s],At(t,n[s]);return n}function Ct(t,e){const n=new o(e.length);for(let s=0;s<e.length;s++)n[s]=It(t)^e[s],At(t,e[s]);return n}function At(t,e){let[,n]=t.keys;t.ct.append([e]);const r=~t.ct.get();n=Mt(s.imul(Mt(n+xt(r)),134775813)+1),t.it.append([n>>>24]);const o=~t.it.get();t.keys=[r,n,o]}function It(t){const e=2|t.keys[2];return xt(s.imul(e,1^e)>>>8)}function xt(t){return 255&t}function Mt(t){return 4294967295&t}const Pt=new f;function Dt(t){return Pt.get(t)}const Ft="Invalid uncompressed size",Bt=j,Rt="deflate-raw",Ut="gzip",Wt=[31,139,8];class _t extends d{constructor(t,{chunkSize:e,CompressionStreamFallback:n,CompressionStream:s}){super({});const{compressed:r,encrypted:o,useCompressionStream:c,zipCrypto:i,computeCrc32:a,level:f,deflate64:w,format:u,compressionMethod:h}=t,p=this;let d,y,m,S=super.readable;const g=u&&Dt(u),v=a&&r&&!w&&!g&&(!o||i)&&!(!c||!s);if(o&&!i||!a||v||(d=new U,S=jt(S,d)),r)if(g)S=Ht(S,Lt(g.CompressionStream,u,{level:f,chunkSize:e,compressionMethod:h}));else if(v)m=new Tt,S=Ht(S,new s(Ut)),S=jt(S,m);else try{S=Ot(S,c,{level:f,chunkSize:e},s,n)}catch(t){let e;try{e=new s(Ut)}catch{throw t}S=Ht(S,e),S=jt(S,new Tt)}o&&(i?S=jt(S,new bt(t)):(y=new ut(t),S=jt(S,y))),Et(p,S,()=>{o&&!i||!a||(p.crc32=v?m.crc32:new l(d.value.buffer).getUint32(0))})}}class Tt extends d{constructor(){let t,e=10,n=new o(0);super({transform(t,r){if(e){const n=s.min(e,t.length);if(e-=n,!(t=t.subarray(n)).length)return}const o=n.length+t.length;if(8>=o)return void(n=W(n,t));const c=o-8,i=s.min(c,n.length);r.enqueue(W(n.subarray(0,i),t.subarray(0,c-i))),n=W(n.subarray(i),t.subarray(c-i))},flush(){const e=_(n);t.crc32=e.getUint32(0,!0),t.uncompressedSize=e.getUint32(4,!0)}}),t=this}}class Vt extends d{constructor(t,{chunkSize:e,DecompressionStreamFallback:n,DecompressionStream:s}){super({});const{zipCrypto:c,encrypted:i,checkCrc32:a,crc32:f,compressed:u,useCompressionStream:h,deflate64:p,format:m,compressionMethod:S,rawBitFlag:g,outputSize:b}=t;let k,z,C=super.readable;if(i&&(c?C=jt(C,new vt(t)):(z=new wt(t),C=jt(C,z))),u){const t=m&&Dt(m);if(t)C=Ht(C,Lt(t.DecompressionStream,m,{chunkSize:e,compressionMethod:S,rawBitFlag:g,uncompressedSize:b}));else try{C=Ot(C,h,{chunkSize:e,deflate64:p},s,n)}catch(t){if(p||b===v)throw t;let e;try{e=new s(Ut)}catch{throw t}C=((t,e,n)=>{const s=new R;let c,i,a,f=0,l=!1;const u=new w((t,e)=>{i=t,a=e});u.catch(()=>{}),n||i();const h=new d({start(t){const e=new o(10);e.set(Wt),t.enqueue(e)},transform(t,e){e.enqueue(t)},async flush(t){l=!0,y();try{await u}finally{m()}const e=new o(8),r=_(e);r.setUint32(0,s.get(),!0),r.setUint32(4,n,!0),t.enqueue(e)},cancel(t){a(t)}}),p=new d({transform(t,e){s.append(t),f+=t.length,n>f?l&&y():i(),e.enqueue(t)},cancel(t){a(t)}});return t=jt(t,h),jt(t=Ht(t,e),p);function y(){m(),c=setTimeout(()=>a(new r(Ft)),5e3)}function m(){clearTimeout(c)}})(C,e,b)}C=(t=>{const e=t.getReader();return new y({async pull(t){let n;try{n=await e.read()}catch(t){if(t&&t.message)throw t;const e=new r("Invalid compressed data");throw e.cause=t,e}const{value:s,done:o}=n;o?t.close():t.enqueue(s)},cancel:t=>e.cancel(t)})})(C)}a&&(k=new U,C=jt(C,k)),Et(this,C,()=>{if(a){const t=new l(k.value.buffer);if(f!=t.getUint32(0,!1))throw new r(Bt)}})}}const Kt=new f;function Et(t,n,s){n=jt(n,new d({flush:s})),e.defineProperty(t,"readable",{get:()=>n})}function Lt(t,e,n){if(!t)throw new r("Compression method not supported");return new t(e,n)}function Ot(t,e,n,s,r){const o=e&&s?s:r||s,c=n.deflate64?"deflate64-raw":Rt;let i;try{i=new o(c,n)}catch(t){if(!e||!r||o==r)throw t;i=new r(c,n)}return Ht(t,i)}function jt(t,e){return(t=>{if(t instanceof y)return t;const e=t.getReader();return new y({async pull(t){const{value:n,done:s}=await e.read();s?t.close():t.enqueue(n)},cancel:t=>e.cancel(t)})})(t).pipeThrough(e)}function Ht(t,e){const n=e.writable.getWriter(),s=t.getReader();return(async()=>{try{for(;;){await n.ready;const t=await s.read();if(t.done){await n.close();break}await n.write(t.value)}}catch(t){await(async(t,e)=>{try{await t.abort(e)}catch{}})(n,t),await(async(t,e)=>{try{await t.cancel(e)}catch{}})(s,t)}})(),e.readable}const Nt="data",qt="close",Gt="deflate";class Jt extends d{constructor(t,n){super({});const s=this,{codecType:o}=t;let c;o.startsWith(Gt)?c=_t:o.startsWith("inflate")&&(c=Vt),s.outputSize=0;let i=0;const a=new c(t,n),f=super.readable,l=new d({transform(t,e){t&&t.length&&(i+=t.length,e.enqueue(t))},flush(){e.assign(s,{inputSize:i})}}),w=new d({transform(e,n){if(e&&e.length&&(n.enqueue(e),s.outputSize+=e.length,t.outputSize!==v&&s.outputSize>t.outputSize))throw new r(Ft)},flush(){const{crc32:t}=a;e.assign(s,{crc32:t,inputSize:i})}});e.defineProperty(s,"readable",{get:()=>f.pipeThrough(l).pipeThrough(a).pipeThrough(w)})}}class Qt extends d{constructor(t){const e=[];let s=0;function r(){const n=new o(t);let r=0;for(;t>r;){const s=e[0],o=t-r;s.length>o?(n.set(s.subarray(0,o),r),e[0]=s.subarray(o),r+=o):(n.set(s,r),r+=s.length,e.shift())}return s-=t,n}n.isFinite(t)&&t>=1||(t=65536),super({transform(n,o){for(e.push(n),s+=n.length;s>t;)o.enqueue(r())},flush(t){s&&t.enqueue(((t,e)=>{const n=new o(e);let s=0;for(const e of t)n.set(e,s),s+=e.length;return n})(e,s))}})}}let Xt=2;try{typeof navigator!=b&&navigator.hardwareConcurrency&&(Xt=navigator.hardwareConcurrency)}catch{}const Yt=new f,Zt=new f;let $t,te,ee,ne,se,re,oe=0;async function ce(t){let e,o;try{const{options:c,config:i}=t;if(c.format)try{await(async(t,e)=>{!Pt.has(t)&&e&&((t,e)=>{const{CompressionStream:n,DecompressionStream:s}=e;if(typeof n!=k&&typeof s!=k)throw new r("Invalid codec module");Pt.set(t,{CompressionStream:n,DecompressionStream:s})})(t,await(import(e)))})(c.format,c.codecURI)}catch(t){throw t.codecImportFailed=!0,t}if(i.CompressionStream=self.CompressionStream,i.DecompressionStream=self.DecompressionStream,c.compressed&&!c.format)if(c.useCompressionStream){if(!((t,e)=>{if(!t)return!1;let n=Kt.get(t);n||(n=new f,Kt.set(t,n));let s=n.get(e);if(s===v){try{new t(e),s=!0}catch{s=!1}n.set(e,s)}return s})(c.codecType.startsWith(Gt)?i.CompressionStream:i.DecompressionStream,Rt))try{await self.initModule(t.config)}catch{}}else try{await self.initModule(t.config)}catch{c.useCompressionStream=!0}!i.CompressionStreamFallback&&i.CompressionStreamZlib&&(i.CompressionStreamFallback=i.CompressionStreamZlib),!i.DecompressionStreamFallback&&i.DecompressionStreamZlib&&(i.DecompressionStreamFallback=i.DecompressionStreamZlib);const a={highWaterMark:1},l=t.readable||new y({async pull(t){const e=new w(t=>Yt.set(oe,t));ie({type:"pull",messageId:oe}),oe=(oe+1)%n.MAX_SAFE_INTEGER;const{value:s,done:r}=await e;t.enqueue(s),r&&t.close()}},a);o=t.writable||new m({async write(t){let e;const s=new w(t=>e=t);Zt.set(oe,e),ie({type:Nt,value:t,messageId:oe}),oe=(oe+1)%n.MAX_SAFE_INTEGER,await s}},a),e=new Jt(c,i),$t=new AbortController;const{signal:u}=$t;await l.pipeThrough(e).pipeThrough(new Qt((t=>s.max(t.chunkSize,64))(i))).pipeTo(o,{signal:u,preventClose:!0,preventAbort:!0}),await o.getWriter().close();const{crc32:h,inputSize:p,outputSize:d}=e;ie({type:qt,result:{crc32:h,inputSize:p,outputSize:d}})}catch(t){if(t.outputSize=e?e.outputSize:0,o&&!o.locked)try{await o.getWriter().close()}catch{}ae(t)}}function ie(t){const{value:e}=t;if(e)if(e.length)try{t.value=(n=e,n.byteOffset||n.byteLength!=n.buffer.byteLength?new o(n):n).buffer,p(t,[t.value])}catch{p(t)}else p(t);else p(t);var n}function ae(t=new r("Unknown error")){const{message:e,stack:n,code:s,name:o,outputSize:c,cause:i,codecImportFailed:a}=t,f={message:e,stack:n,code:s,name:o,outputSize:c};i&&(f.cause={name:i.name,message:i.message}),a&&(f.codecImportFailed=!0),p({error:f})}function fe(t,e,n={}){if(!te){const t=new r("WASM module not loaded");throw t.cause=re,t}const c="number"==typeof n.level?n.level:-1,i="number"==typeof n.outBuffer?n.outBuffer:65536,a="number"==typeof n.inBufferSize?n.inBufferSize:65536;return new d({start(){try{let n;if(this.ft=ee(i),this.in=ee(a),this.inBufferSize=a,!this.ft||!this.in)throw new r("allocation failed");if(this.lt=new o(i),t?(this.wt=te.deflate_process,this.ut=te.deflate_last_consumed,this.ht=te.deflate_end,this.yt=te.deflate_new(),n="gzip"===e?te.deflate_init_gzip(this.yt,c):"deflate-raw"===e?te.deflate_init_raw(this.yt,c):te.deflate_init(this.yt,c)):"deflate64-raw"===e?(this.wt=te.inflate9_process,this.ut=te.inflate9_last_consumed,this.ht=te.inflate9_end,this.yt=te.inflate9_new(),n=te.inflate9_init_raw(this.yt)):(this.wt=te.inflate_process,this.ut=te.inflate_last_consumed,this.ht=te.inflate_end,this.yt=te.inflate_new(),n="deflate-raw"===e?te.inflate_init_raw(this.yt):"gzip"===e?te.inflate_init_gzip(this.yt):te.inflate_init(this.yt)),0!==n)throw new r("init failed:"+n)}catch(t){throw f(this),t}},transform(e,n){try{const c=e,a=new o(se.buffer),f=this.wt,l=this.ut,w=this.ft,u=this.lt;let h=0;for(;h<c.length;){const e=s.min(c.length-h,32768);if((!this.in||this.inBufferSize<e)&&(this.in&&ne&&(ne(this.in),this.in=0),this.in=ee(e),this.inBufferSize=e,!this.in))throw new r("allocation failed");a.set(c.subarray(h,h+e),this.in);const o=f(this.yt,this.in,e,w,i,0),p=16777215&o;if(p&&(u.set(a.subarray(w,w+p),0),n.enqueue(u.slice(0,p))),!t){const t=o>>24&255,e=128&t?t-256:t;if(0>e)throw new r("process error:"+e)}const d=l(this.yt);if(0===d)break;h+=d}}catch(t){f(this),n.error(t)}},flush(e){try{const n=new o(se.buffer),s=this.wt,c=this.ft,a=this.lt;for(;;){const o=s(this.yt,0,0,c,i,4),f=16777215&o,l=o>>24&255;if(!t){const t=128&l?l-256:l;if(0>t)throw new r("process error:"+t)}if(f&&(a.set(n.subarray(c,c+f),0),e.enqueue(a.slice(0,f))),1===l||0===f)break}}catch(t){e.error(t)}finally{const t=f(this);0!==t&&e.error(new r("end error:"+t))}},cancel(){f(this)}});function f(t){let e=0;return t.yt&&t.ht&&(e=t.ht(t.yt)),t.yt=0,t.in&&ne&&ne(t.in),t.in=0,t.ft&&ne&&ne(t.ft),t.ft=0,e}}addEventListener("message",({data:t})=>{const{type:e,messageId:n,value:s,done:r}=t;try{if("start"==e&&ce(t),e==Nt){const t=Yt.get(n);Yt.delete(n),t({value:s||new o,done:r})}if("ack"==e){const t=Zt.get(n);Zt.delete(n),t()}e==qt&&$t.abort()}catch(t){ae(t)}}),p({type:"ready"});class le{constructor(t="deflate",e){return fe(!0,t,e)}}class we{constructor(t="deflate",e){return fe(!1,t,e)}}le.St=!0,we.St=!0;let ue=!1;((t={})=>{const{init:e}=t,n=t.CompressionStreamFallback||t.CompressionStreamZlib,s=t.DecompressionStreamFallback||t.DecompressionStreamZlib;self.initModule=async t=>{e&&await e(t),n&&(t.CompressionStreamFallback=n),s&&(t.DecompressionStreamFallback=s)}})({CompressionStreamFallback:le,DecompressionStreamFallback:we,init:t=>(async(t,{baseURI:e})=>{if(!ue)try{await(async(t,e)=>{let n,s;try{try{s=new URL(t,e)}catch{}const r=await fetch(s);n=await r.arrayBuffer()}catch(e){if(!t.startsWith("data:application/wasm;base64,"))throw e;n=(t=>{const e=t.split(",")[1],n=atob(e),s=n.length,r=new o(s);for(let t=0;s>t;++t)r[t]=n.charCodeAt(t);return r.buffer})(t)}(t=>{if(te=t,({malloc:ee,free:ne,memory:se}=te),"function"!=typeof ee||"function"!=typeof ne||!se)throw te=ee=ne=se=null,new r("Invalid WASM module")})((await WebAssembly.instantiate(n)).instance.exports)})(t,e),ue=!0}catch(t){throw(t=>{re=t})(t),t}})(t.wasmURI,t)})});\n';if("string"==typeof s&&(s=(new TextEncoder).encode(s)),t){const t=new Blob([s],{type:n});return URL.createObjectURL(t)}return "data:"+n+";base64,"+(t=>{let n="";const s=t.length;let r=0;for(;s>r+2;r+=3){const s=t[r]<<16|t[r+1]<<8|t[r+2];n+=e[s>>18&63]+e[s>>12&63]+e[s>>6&63]+e[63&s];}const o=s-r;if(1===o){const s=t[r]<<16;n+=e[s>>18&63]+e[s>>12&63]+"==";}else if(2===o){const s=t[r]<<16|t[r+1]<<8;n+=e[s>>18&63]+e[s>>12&63]+e[s>>6&63]+"=";}return n})(s)}});
402
+ const t$1=new Uint8Array(288);t$1.fill(8,0,144),t$1.fill(9,144,256),t$1.fill(7,256,280),t$1.fill(8,280,288),new Uint8Array(30).fill(5);const e="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",n$1=t=>t({workerURI:t=>{const n="text/javascript";let s='(t=>{"function"==typeof define&&define.amd?define(t):t()})(function(){"use strict";const{Array:t,Object:e,Number:n,Math:s,Error:r,Uint8Array:o,Uint16Array:c,Uint32Array:i,Int32Array:a,Map:f,DataView:l,Promise:u,TextEncoder:w,crypto:h,postMessage:p,TransformStream:d,ReadableStream:y,WritableStream:m,CompressionStream:S,DecompressionStream:g}=self,v=void 0,b="undefined",k="function",z=new o,C=[[],[],[],[],[],[],[],[]];for(let t=0;t<256;t++){let e=t;for(let t=0;t<8;t++)e=1&e?e>>>1^3988292384:e>>>1;C[0][t]=e}for(let t=0;t<256;t++)for(let e=1;e<8;e++){const n=C[e-1][t];C[e][t]=n>>>8^C[0][255&n]}const[I,A,x,M,P,D,F,B]=C;class R{constructor(t){this.o=t||-1}append(t){let e=0|this.o;const n=0|t.length;let s=0;if(n>=8&&t.buffer){const r=new l(t.buffer,t.byteOffset,n),o=n-8;for(;s<=o;s+=8){const t=e^r.getInt32(s,!0),n=r.getInt32(s+4,!0);e=B[255&t]^F[t>>>8&255]^D[t>>>16&255]^P[t>>>24&255]^M[255&n]^x[n>>>8&255]^A[n>>>16&255]^I[n>>>24&255]}}for(;s<n;s++)e=e>>>8^I[255&(e^t[s])];this.o=e}get(){return~this.o}}class U extends d{constructor(){let t;const e=new R;super({transform(t,n){e.append(t),n.enqueue(t)},flush(){const n=new o(4);new l(n.buffer).setUint32(0,e.get()),t.value=n}}),t=this}}function W(t,e){const n=new o(t.length+e.length);return n.set(t),n.set(e,t.length),n}function _(t){return new l(t.buffer,t.byteOffset,t.byteLength)}const T={concat(t,e){if(0===t.length||0===e.length)return t.concat(e);const n=t[t.length-1],s=T.l(n);return 32===s?t.concat(e):T.h(e,s,0|n,t.slice(0,t.length-1))},bitLength(t){const e=t.length;if(0===e)return 0;const n=t[e-1];return 32*(e-1)+T.l(n)},m(t,e){if(32*t.length<e)return t;const n=(t=t.slice(0,s.ceil(e/32))).length;return e&=31,n>0&&e&&(t[n-1]=T.S(e,t[n-1]&2147483648>>e-1,1)),t},S:(t,e,n)=>32===t?e:(n?0|e:e<<32-t)+1099511627776*t,l:t=>s.round(t/1099511627776)||32,h(t,e,n,s){for(void 0===s&&(s=[]);e>=32;e-=32)s.push(n),n=0;if(0===e)return s.concat(t);for(let r=0;r<t.length;r++)s.push(n|t[r]>>>e),n=t[r]<<32-e;const r=t.length?t[t.length-1]:0,o=T.l(r);return s.push(T.S(e+o&31,e+o>32?n:s.pop(),1)),s}},V={bytes:{v(t){const e=T.bitLength(t)/8,n=new o(e);let s;for(let r=0;r<e;r++)3&r||(s=t[r/4]),n[r]=s>>>24,s<<=8;return n},C(t){const e=[];let n,s=0;for(n=0;n<t.length;n++)s=s<<8|t[n],3&~n||(e.push(s),s=0);return 3&n&&e.push(T.S(8*(3&n),s)),e}}},K=class{constructor(t){const e=this;e.blockSize=512,e.I=[1732584193,4023233417,2562383102,271733878,3285377520],e.A=[1518500249,1859775393,2400959708,3395469782],t?(e.M=t.M.slice(0),e.P=t.P.slice(0),e.D=t.D):e.reset()}reset(){const t=this;return t.M=t.I.slice(0),t.P=[],t.D=0,t}update(t){const e=this;"string"==typeof t&&(t=V.F.C(t));const n=e.P=T.concat(e.P,t),s=e.D,o=e.D=s+T.bitLength(t);if(o>9007199254740991)throw new r("Cannot hash more than 2^53 - 1 bits");const c=new i(n);let a=0;for(let t=e.blockSize+s-(e.blockSize+s&e.blockSize-1);t<=o;t+=e.blockSize)e.B(c.subarray(16*a,16*(a+1))),a+=1;return n.splice(0,16*a),e}R(){const t=this;let e=t.P;const n=t.M;e=T.concat(e,[T.S(1,1)]);for(let t=e.length+2;15&t;t++)e.push(0);for(e.push(s.floor(t.D/4294967296)),e.push(0|t.D);e.length;)t.B(e.splice(0,16));return t.reset(),n}U(t,e,n,s){return t<=19?e&n|~e&s:t<=39?e^n^s:t<=59?e&n|e&s|n&s:t<=79?e^n^s:void 0}W(t,e){return e<<t|e>>>32-t}B(e){const n=this,r=n.M,o=t(80);for(let t=0;t<16;t++)o[t]=e[t];let c=r[0],i=r[1],a=r[2],f=r[3],l=r[4];for(let t=0;t<=79;t++){t>=16&&(o[t]=n.W(1,o[t-3]^o[t-8]^o[t-14]^o[t-16]));const e=n.W(5,c)+n.U(t,i,a,f)+l+o[t]+n.A[s.floor(t/20)]|0;l=f,f=a,a=n.W(30,i),i=c,c=e}r[0]=r[0]+c|0,r[1]=r[1]+i|0,r[2]=r[2]+a|0,r[3]=r[3]+f|0,r[4]=r[4]+l|0}},E={importKey:t=>new E._(V.bytes.C(t)),T(t,e,n,s){if(n=n||1e4,s<0||n<0)throw new r("invalid params to pbkdf2");const o=1+(s>>5)<<2;let c,i,a,f,u;const w=new ArrayBuffer(o),h=new l(w);let p=0;const d=T;for(e=V.bytes.C(e),u=1;p<(o||1);u++){for(c=i=t.encrypt(d.concat(e,[u])),a=1;a<n;a++)for(i=t.encrypt(i),f=0;f<i.length;f++)c[f]^=i[f];for(a=0;p<(o||1)&&a<c.length;a++)h.setInt32(p,c[a]),p+=4}return w.slice(0,s/8)},_:class{constructor(t){const e=this,n=e.V=K,s=[[],[]];e.K=[new n,new n];const r=e.K[0].blockSize/32;t.length>r&&(t=(new n).update(t).R());for(let e=0;e<r;e++)s[0][e]=909522486^t[e],s[1][e]=1549556828^t[e];e.K[0].update(s[0]),e.K[1].update(s[1]),e.L=new n(e.K[0])}reset(){const t=this;t.L=new t.V(t.K[0]),t.O=!1}update(t){this.O=!0,this.L.update(t)}digest(){const t=this,e=t.L.R(),n=new t.V(t.K[1]).update(e).R();return t.reset(),n}encrypt(t){if(this.O)throw new r("encrypt on already updated hmac called!");return this.update(t),this.digest(t)}}},L=typeof h!=b&&typeof h.getRandomValues==k,O="Invalid password",j="Invalid signature",H=j,N="zipjs-abort-check-password";function q(t){if(L)return h.getRandomValues(t);throw new r("Crypto API not supported")}const G=16,J={name:"PBKDF2"},Q=e.assign({hash:{name:"HMAC"}},J),X=e.assign({iterations:1e3,hash:{name:"SHA-1"}},J),Y=["deriveBits"],Z=[8,12,16],$=[16,24,32],tt=10,et=[0,0,0,0],nt=typeof h!=b,st=nt&&h.subtle,rt=nt&&typeof st!=b,ot=V.bytes,ct=class{constructor(t){const e=this;e.j=[[[],[],[],[],[]],[[],[],[],[],[]]],e.j[0][0][0]||e.H();const n=e.j[0][4],s=e.j[1],o=t.length;let c,i,a,f=1;if(4!==o&&6!==o&&8!==o)throw new r("invalid aes key size");for(e.A=[i=t.slice(0),a=[]],c=o;c<4*o+28;c++){let t=i[c-1];(c%o===0||8===o&&c%o===4)&&(t=n[t>>>24]<<24^n[t>>16&255]<<16^n[t>>8&255]<<8^n[255&t],c%o===0&&(t=t<<8^t>>>24^f<<24,f=f<<1^283*(f>>7))),i[c]=i[c-o]^t}for(let t=0;c;t++,c--){const e=i[3&t?c:c-4];a[t]=c<=4||t<4?e:s[0][n[e>>>24]]^s[1][n[e>>16&255]]^s[2][n[e>>8&255]]^s[3][n[255&e]]}}encrypt(t){return this.N(t,0)}decrypt(t){return this.N(t,1)}H(){const t=this.j[0],e=this.j[1],n=t[4],s=e[4],r=[],o=[];let c,i,a,f;for(let t=0;t<256;t++)o[(r[t]=t<<1^283*(t>>7))^t]=t;for(let l=c=0;!n[l];l^=i||1,c=o[c]||1){let o=c^c<<1^c<<2^c<<3^c<<4;o=o>>8^255&o^99,n[l]=o,s[o]=l,f=r[a=r[i=r[l]]];let u=16843009*f^65537*a^257*i^16843008*l,w=257*r[o]^16843008*o;for(let n=0;n<4;n++)t[n][l]=w=w<<24^w>>>8,e[n][o]=u=u<<24^u>>>8}for(let n=0;n<5;n++)t[n]=t[n].slice(0),e[n]=e[n].slice(0)}N(t,e){if(4!==t.length)throw new r("invalid aes block size");const n=this.A[e],s=n.length/4-2,o=[0,0,0,0],c=this.j[e],i=c[0],a=c[1],f=c[2],l=c[3],u=c[4];let w,h,p,d=t[0]^n[0],y=t[e?3:1]^n[1],m=t[2]^n[2],S=t[e?1:3]^n[3],g=4;for(let t=0;t<s;t++)w=i[d>>>24]^a[y>>16&255]^f[m>>8&255]^l[255&S]^n[g],h=i[y>>>24]^a[m>>16&255]^f[S>>8&255]^l[255&d]^n[g+1],p=i[m>>>24]^a[S>>16&255]^f[d>>8&255]^l[255&y]^n[g+2],S=i[S>>>24]^a[d>>16&255]^f[y>>8&255]^l[255&m]^n[g+3],g+=4,d=w,y=h,m=p;for(let t=0;t<4;t++)o[e?3&-t:t]=u[d>>>24]<<24^u[y>>16&255]<<16^u[m>>8&255]<<8^u[255&S]^n[g++],w=d,d=y,y=m,m=S,S=w;return o}},it=class{constructor(t,e){this.G=t,this.J=e,this.X=e}reset(){this.X=this.J}update(t){return this.Y(this.G,t,this.X)}Z(t){if(255&~(t>>24))t+=1<<24;else{let e=t>>16&255,n=t>>8&255,s=255&t;255===e?(e=0,255===n?(n=0,255===s?s=0:++s):++n):++e,t=0,t+=e<<16,t+=n<<8,t+=s}return t}$(t){0===(t[0]=this.Z(t[0]))&&(t[1]=this.Z(t[1]))}Y(t,e,n){let s;if(!(s=e.length))return[];const r=T.bitLength(e);for(let r=0;r<s;r+=4){this.$(n);const s=t.encrypt(n);e[r]^=s[0],e[r+1]^=s[1],e[r+2]^=s[2],e[r+3]^=s[3]}return T.m(e,r)}},at=E._;let ft=nt&&rt&&typeof st.importKey==k,lt=nt&&rt&&typeof st.deriveBits==k;class ut extends d{constructor({password:t,rawPassword:e,encryptionStrength:n,checkPasswordOnly:s,checkAuthenticationCode:c=!0}){super({start(){ht(this,t,e,n)},async transform(t,e){const n=this,{password:c,strength:i,et:a,ready:f}=n;c?(await(async(t,e,n,s)=>{const o=await dt(t,e,n,mt(s,0,Z[e])),c=mt(s,Z[e]);if(o[0]!=c[0]||o[1]!=c[1])throw new r(O)})(n,i,c,mt(t,0,Z[i]+2)),t=mt(t,Z[i]+2),s?e.error(new r(N)):a()):await f;const l=new o(t.length-tt-(t.length-tt)%G);e.enqueue(pt(n,t,l,0,tt,!0))},async flush(t){const{nt:e,st:n,ot:s,ready:o}=this;if(n&&e){await o;const i=mt(s,0,s.length-tt),a=mt(s,s.length-tt);let f=z;if(i.length){const t=gt(ot,i);n.update(t);const s=e.update(t);f=St(ot,s)}const l=mt(St(ot,n.digest()),0,tt);let u=s.length<tt?1:0;for(let t=0;t<tt;t++)u|=l[t]^a[t];if(u&&c)throw new r(H);t.enqueue(f)}}})}}class wt extends d{constructor({password:t,rawPassword:e,encryptionStrength:n}){super({start(){ht(this,t,e,n)},async transform(t,e){const n=this,{password:s,strength:r,et:c,ready:i}=n;let a=z;s?(a=await(async(t,e,n)=>{const s=q(new o(Z[e]));return W(s,await dt(t,e,n,s))})(n,r,s),c()):await i;const f=new o(a.length+t.length-t.length%G);f.set(a,0),e.enqueue(pt(n,t,f,a.length,0))},async flush(t){const{nt:e,st:n,ot:s,ready:r}=this;if(n&&e){await r;let o=z;if(s.length){const t=e.update(gt(ot,s));n.update(t),o=St(ot,t)}const c=St(ot,n.digest()).slice(0,tt);t.enqueue(W(o,c))}}})}}function ht(t,n,s,r){e.assign(t,{ready:new u(e=>t.et=e),password:yt(n,s),strength:r-1,ot:z})}function pt(t,e,n,s,r,c){const{nt:i,st:a,ot:f}=t;f.length&&(e=W(f,e));const l=e.length-r;let u;for(n=((t,e)=>{if(e&&e>t.length){const n=t;(t=new o(e)).set(n,0)}return t})(n,s+(l-l%G)),u=0;u<=l-G;u+=G){const t=gt(ot,mt(e,u,u+G));c&&a.update(t);const r=i.update(t);c||a.update(r),n.set(St(ot,r),u+s)}return t.ot=mt(e,u),n}async function dt(n,s,r,c){n.password=null;const i=await(async(t,e,n,s,r)=>{if(!ft)return E.importKey(e);try{return await st.importKey("raw",e,n,!1,r)}catch{return ft=!1,E.importKey(e)}})(0,r,Q,0,Y),a=await(async(t,e,n)=>{if(!lt)return E.T(e,t.salt,X.iterations,n);try{return await st.deriveBits(t,e,n)}catch{return lt=!1,E.T(e,t.salt,X.iterations,n)}})(e.assign({salt:c},X),i,8*(2*$[s]+2)),f=new o(a),l=gt(ot,mt(f,0,$[s])),u=gt(ot,mt(f,$[s],2*$[s])),w=mt(f,2*$[s]);return e.assign(n,{keys:{key:l,ct:u,passwordVerification:w},nt:new it(new ct(l),t.from(et)),st:new at(u)}),w}function yt(t,e){return e===v?(t=>{if(typeof w==b){const e=new o((t=unescape(encodeURIComponent(t))).length);for(let n=0;n<e.length;n++)e[n]=t.charCodeAt(n);return e}return(new w).encode(t)})(t):e}function mt(t,e,n){return t.subarray(e,n)}function St(t,e){return t.v(e)}function gt(t,e){return t.C(e)}class vt extends d{constructor({password:t,rawPassword:e,passwordVerification:n,checkPasswordOnly:s}){super({start(){kt(this,t,e,n)},transform(t,e){const n=this;if(n.password||n.rawPassword){const e=zt(n,t.subarray(0,12));if(n.password=n.rawPassword=null,0!=(e[11]^n.passwordVerification))throw new r(O);t=t.subarray(12)}s?e.error(new r(N)):e.enqueue(zt(n,t))}})}}class bt extends d{constructor({password:t,rawPassword:e,passwordVerification:n}){super({start(){kt(this,t,e,n)},transform(t,e){const n=this;let s,r;if(n.password||n.rawPassword){n.password=n.rawPassword=null;const e=q(new o(12));e[11]=n.passwordVerification,s=new o(t.length+e.length),s.set(Ct(n,e),0),r=12}else s=new o(t.length),r=0;s.set(Ct(n,t),r),e.enqueue(s)}})}}function kt(t,n,s,r){e.assign(t,{password:n,rawPassword:s,passwordVerification:r}),((t,n,s)=>{const r=[305419896,591751049,878082192];if(e.assign(t,{keys:r,it:new R(r[0]),ft:new R(r[2])}),s)for(let e=0;e<s.length;e++)It(t,s[e]);else for(let e=0;e<n.length;e++)It(t,n.charCodeAt(e))})(t,n,s)}function zt(t,e){const n=new o(e.length);for(let s=0;s<e.length;s++)n[s]=At(t)^e[s],It(t,n[s]);return n}function Ct(t,e){const n=new o(e.length);for(let s=0;s<e.length;s++)n[s]=At(t)^e[s],It(t,e[s]);return n}function It(t,e){let[,n]=t.keys;t.it.append([e]);const r=~t.it.get();n=Mt(s.imul(Mt(n+xt(r)),134775813)+1),t.ft.append([n>>>24]);const o=~t.ft.get();t.keys=[r,n,o]}function At(t){const e=2|t.keys[2];return xt(s.imul(e,1^e)>>>8)}function xt(t){return 255&t}function Mt(t){return 4294967295&t}function Pt(t){if(t instanceof y)return t;const e=t.getReader();return new y({async pull(t){const{value:n,done:s}=await e.read();s?t.close():t.enqueue(n)},cancel:t=>e.cancel(t)})}const Dt=new f;function Ft(t){return Dt.get(t)}const Bt="Invalid uncompressed size",Rt=j,Ut="deflate-raw",Wt="gzip",_t=[31,139,8];class Tt extends d{constructor(t,{chunkSize:e,CompressionStreamFallback:n,CompressionStream:s}){super({});const{compressed:r,encrypted:o,useCompressionStream:c,zipCrypto:i,computeCrc32:a,level:f,deflate64:u,format:w,compressionMethod:h}=t,p=this;let d,y,m,S=super.readable;const g=w&&Ft(w),v=a&&r&&!u&&!g&&(!o||i)&&!(!c||!s);if(o&&!i||!a||v||(d=new U,S=Ht(S,d)),r)if(g)S=Nt(S,Ot(g.CompressionStream,w,{level:f,chunkSize:e,compressionMethod:h}));else if(v)m=new Vt,S=Nt(S,new s(Wt)),S=Ht(S,m);else try{S=jt(S,c,{level:f,chunkSize:e},s,n)}catch(t){let e;try{e=new s(Wt)}catch{throw t}S=Nt(S,e),S=Ht(S,new Vt)}o&&(i?S=Ht(S,new bt(t)):(y=new wt(t),S=Ht(S,y))),Lt(p,S,()=>{o&&!i||!a||(p.crc32=v?m.crc32:new l(d.value.buffer).getUint32(0))})}}class Vt extends d{constructor(){let t,e=10,n=new o(0);super({transform(t,r){if(e){const n=s.min(e,t.length);if(e-=n,!(t=t.subarray(n)).length)return}const o=n.length+t.length;if(o<=8)return void(n=W(n,t));const c=o-8,i=s.min(c,n.length);r.enqueue(W(n.subarray(0,i),t.subarray(0,c-i))),n=W(n.subarray(i),t.subarray(c-i))},flush(){const e=_(n);t.crc32=e.getUint32(0,!0),t.uncompressedSize=e.getUint32(4,!0)}}),t=this}}class Kt extends d{constructor(t,{chunkSize:e,DecompressionStreamFallback:n,DecompressionStream:s}){super({});const{zipCrypto:c,encrypted:i,checkCrc32:a,crc32:f,compressed:w,useCompressionStream:h,deflate64:p,format:m,compressionMethod:S,rawBitFlag:g,outputSize:b}=t;let k,z,C=super.readable;if(i&&(c?C=Ht(C,new vt(t)):(z=new ut(t),C=Ht(C,z))),w){const t=m&&Ft(m);if(t)C=Nt(C,Ot(t.DecompressionStream,m,{chunkSize:e,compressionMethod:S,rawBitFlag:g,uncompressedSize:b}));else try{C=jt(C,h,{chunkSize:e,deflate64:p},s,n)}catch(t){if(p||b===v)throw t;let e;try{e=new s(Wt)}catch{throw t}C=((t,e,n)=>{const s=new R;let c,i,a,f=0,l=!1;const w=new u((t,e)=>{i=t,a=e});w.catch(()=>{}),n||i();const h=new d({start(t){const e=new o(10);e.set(_t),t.enqueue(e)},transform(t,e){e.enqueue(t)},async flush(t){l=!0,y();try{await w}finally{m()}const e=new o(8),r=_(e);r.setUint32(0,s.get(),!0),r.setUint32(4,n,!0),t.enqueue(e)},cancel(t){a(t)}}),p=new d({transform(t,e){s.append(t),f+=t.length,f>=n?i():l&&y(),e.enqueue(t)},cancel(t){a(t)}});return t=Ht(t,h),Ht(t=Nt(t,e),p);function y(){m(),c=setTimeout(()=>a(new r(Bt)),5e3)}function m(){clearTimeout(c)}})(C,e,b)}C=(t=>{const e=t.getReader();return new y({async pull(t){let n;try{n=await e.read()}catch(t){if(t&&t.message)throw t;const e=new r("Invalid compressed data");throw e.cause=t,e}const{value:s,done:o}=n;o?t.close():t.enqueue(s)},cancel:t=>e.cancel(t)})})(C)}a&&(k=new U,C=Ht(C,k)),Lt(this,C,()=>{if(a){const t=new l(k.value.buffer);if(f!=t.getUint32(0,!1))throw new r(Rt)}})}}const Et=new f;function Lt(t,n,s){n=Ht(n,new d({flush:s})),e.defineProperty(t,"readable",{get:()=>n})}function Ot(t,e,n){if(!t)throw new r("Compression method not supported");return new t(e,n)}function jt(t,e,n,s,r){const o=e&&s?s:r||s,c=n.deflate64?"deflate64-raw":Ut;let i;try{i=new o(c,n)}catch(t){if(!e||!r||o==r)throw t;i=new r(c,n)}return Nt(t,i)}function Ht(t,e){return Pt(t).pipeThrough(e)}function Nt(t,e){const n=e.writable.getWriter(),s=t.getReader();return(async()=>{try{for(;;){await n.ready;const t=await s.read();if(t.done){await n.close();break}await n.write(t.value)}}catch(t){await(async(t,e)=>{try{await t.abort(e)}catch{}})(n,t),await(async(t,e)=>{try{await t.cancel(e)}catch{}})(s,t)}})(),e.readable}const qt="data",Gt="close",Jt="deflate";class Qt extends d{constructor(t,n){super({});const s=this,{codecType:o}=t;let c;o.startsWith(Jt)?c=Tt:o.startsWith("inflate")&&(c=Kt),s.outputSize=0;let i=0;const a=new c(t,n),f=super.readable,l=new d({transform(t,e){t&&t.length&&(i+=t.length,e.enqueue(t))},flush(){e.assign(s,{inputSize:i})}}),u=new d({transform(e,n){if(e&&e.length&&(n.enqueue(e),s.outputSize+=e.length,t.outputSize!==v&&s.outputSize>t.outputSize))throw new r(Bt)},flush(){const{crc32:t}=a;e.assign(s,{crc32:t,inputSize:i})}});e.defineProperty(s,"readable",{get:()=>f.pipeThrough(l).pipeThrough(a).pipeThrough(u)})}}class Xt extends d{constructor(t){const e=[];let s=0;function r(){const n=new o(t);let r=0;for(;r<t;){const s=e[0],o=t-r;s.length<=o?(n.set(s,r),r+=s.length,e.shift()):(n.set(s.subarray(0,o),r),e[0]=s.subarray(o),r+=o)}return s-=t,n}(!n.isFinite(t)||t<1)&&(t=65536),super({transform(n,o){for(e.push(n),s+=n.length;s>t;)o.enqueue(r())},flush(t){s&&t.enqueue(((t,e)=>{const n=new o(e);let s=0;for(const e of t)n.set(e,s),s+=e.length;return n})(e,s))}})}}let Yt=2;try{typeof navigator!=b&&navigator.hardwareConcurrency&&(Yt=navigator.hardwareConcurrency)}catch{}const Zt=new f,$t=new f;let te,ee,ne,se,re,oe,ce=0;async function ie(t){let e,o;try{const{options:c,config:i}=t;if(c.format)try{await(async(t,e)=>{!Dt.has(t)&&e&&((t,e)=>{const{CompressionStream:n,DecompressionStream:s}=e;if(typeof n!=k&&typeof s!=k)throw new r("Invalid codec module");Dt.set(t,{CompressionStream:n,DecompressionStream:s})})(t,await(import(e)))})(c.format,c.codecURI)}catch(t){throw t.codecImportFailed=!0,t}if(i.CompressionStream=self.CompressionStream,i.DecompressionStream=self.DecompressionStream,c.compressed&&!c.format)if(c.useCompressionStream){if(!((t,e)=>{if(!t)return!1;let n=Et.get(t);n||(n=new f,Et.set(t,n));let s=n.get(e);if(s===v){try{new t(e),s=!0}catch{s=!1}n.set(e,s)}return s})(c.codecType.startsWith(Jt)?i.CompressionStream:i.DecompressionStream,Ut))try{await self.initModule(t.config)}catch{}}else try{await self.initModule(t.config)}catch{c.useCompressionStream=!0}!i.CompressionStreamFallback&&i.CompressionStreamZlib&&(i.CompressionStreamFallback=i.CompressionStreamZlib),!i.DecompressionStreamFallback&&i.DecompressionStreamZlib&&(i.DecompressionStreamFallback=i.DecompressionStreamZlib);const a={highWaterMark:1},l=t.readable?Pt(t.readable):new y({async pull(t){const e=new u(t=>Zt.set(ce,t));ae({type:"pull",messageId:ce}),ce=(ce+1)%n.MAX_SAFE_INTEGER;const{value:s,done:r}=await e;t.enqueue(s),r&&t.close()}},a);o=t.writable?(t=>{if(t instanceof m)return t;const e=t.getWriter();return new m({write:t=>e.write(t),close:()=>e.close(),abort:t=>e.abort(t)})})(t.writable):new m({async write(t){let e;const s=new u(t=>e=t);$t.set(ce,e),ae({type:qt,value:t,messageId:ce}),ce=(ce+1)%n.MAX_SAFE_INTEGER,await s}},a),e=new Qt(c,i),te=new AbortController;const{signal:w}=te;await l.pipeThrough(e).pipeThrough(new Xt((t=>{return r="string"==typeof(e=r=t.chunkSize)&&e.trim()?n(e):e,n.isInteger(r)&&r>=1?s.max(r,64):65536;var e,r})(i))).pipeTo(o,{signal:w,preventClose:!0,preventAbort:!0}),await o.getWriter().close();const{crc32:h,inputSize:p,outputSize:d}=e;ae({type:Gt,result:{crc32:h,inputSize:p,outputSize:d}})}catch(t){if(t.outputSize=e?e.outputSize:0,o&&!o.locked)try{await o.getWriter().close()}catch{}fe(t)}}function ae(t){const{value:e}=t;if(e)if(e.length)try{t.value=(n=e,n.byteOffset||n.byteLength!=n.buffer.byteLength?new o(n):n).buffer,p(t,[t.value])}catch{p(t)}else p(t);else p(t);var n}function fe(t=new r("Unknown error")){const{message:e,stack:n,code:s,name:o,outputSize:c,cause:i,codecImportFailed:a}=t,f={message:e,stack:n,code:s,name:o,outputSize:c};i&&(f.cause={name:i.name,message:i.message}),a&&(f.codecImportFailed=!0),p({error:f})}function le(t,e,n={}){if(!ee){const t=new r("WASM module not loaded");throw t.cause=oe,t}const c="number"==typeof n.level?n.level:-1,i="number"==typeof n.outBuffer?n.outBuffer:65536,a="number"==typeof n.inBufferSize?n.inBufferSize:65536;return new d({start(){try{let n;if(this.lt=ne(i),this.in=ne(a),this.inBufferSize=a,!this.lt||!this.in)throw new r("allocation failed");if(this.ut=new o(i),t?(this.wt=ee.deflate_process,this.ht=ee.deflate_last_consumed,this.yt=ee.deflate_end,this.St=ee.deflate_new(),n="gzip"===e?ee.deflate_init_gzip(this.St,c):"deflate-raw"===e?ee.deflate_init_raw(this.St,c):ee.deflate_init(this.St,c)):"deflate64-raw"===e?(this.wt=ee.inflate9_process,this.ht=ee.inflate9_last_consumed,this.yt=ee.inflate9_end,this.St=ee.inflate9_new(),n=ee.inflate9_init_raw(this.St)):(this.wt=ee.inflate_process,this.ht=ee.inflate_last_consumed,this.yt=ee.inflate_end,this.St=ee.inflate_new(),n="deflate-raw"===e?ee.inflate_init_raw(this.St):"gzip"===e?ee.inflate_init_gzip(this.St):ee.inflate_init(this.St)),0!==n)throw new r("init failed:"+n)}catch(t){throw f(this),t}},transform(e,n){try{const c=e,a=new o(re.buffer),f=this.wt,l=this.ht,u=this.lt,w=this.ut;let h=0;for(;h<c.length;){const e=s.min(c.length-h,32768);if((!this.in||this.inBufferSize<e)&&(this.in&&se&&(se(this.in),this.in=0),this.in=ne(e),this.inBufferSize=e,!this.in))throw new r("allocation failed");a.set(c.subarray(h,h+e),this.in);const o=f(this.St,this.in,e,u,i,0),p=16777215&o;if(p&&(w.set(a.subarray(u,u+p),0),n.enqueue(w.slice(0,p))),!t){const t=o>>24&255,e=128&t?t-256:t;if(e<0)throw new r("process error:"+e)}const d=l(this.St);if(0===d)break;h+=d}}catch(t){f(this),n.error(t)}},flush(e){try{const n=new o(re.buffer),s=this.wt,c=this.lt,a=this.ut;for(;;){const o=s(this.St,0,0,c,i,4),f=16777215&o,l=o>>24&255;if(!t){const t=128&l?l-256:l;if(t<0)throw new r("process error:"+t)}if(f&&(a.set(n.subarray(c,c+f),0),e.enqueue(a.slice(0,f))),1===l||0===f)break}}catch(t){e.error(t)}finally{const t=f(this);0!==t&&e.error(new r("end error:"+t))}},cancel(){f(this)}});function f(t){let e=0;return t.St&&t.yt&&(e=t.yt(t.St)),t.St=0,t.in&&se&&se(t.in),t.in=0,t.lt&&se&&se(t.lt),t.lt=0,e}}addEventListener("message",({data:t})=>{const{type:e,messageId:n,value:s,done:r}=t;try{if("start"==e&&ie(t),e==qt){const t=Zt.get(n);Zt.delete(n),t({value:s||new o,done:r})}if("ack"==e){const t=$t.get(n);$t.delete(n),t()}e==Gt&&te.abort()}catch(t){fe(t)}}),p({type:"ready"});class ue{constructor(t="deflate",e){return le(!0,t,e)}}class we{constructor(t="deflate",e){return le(!1,t,e)}}ue.gt=!0,we.gt=!0;let he=!1;((t={})=>{const{init:e}=t,n=t.CompressionStreamFallback||t.CompressionStreamZlib,s=t.DecompressionStreamFallback||t.DecompressionStreamZlib;self.initModule=async t=>{e&&await e(t),n&&(t.CompressionStreamFallback=n),s&&(t.DecompressionStreamFallback=s)}})({CompressionStreamFallback:ue,DecompressionStreamFallback:we,init:t=>(async(t,{baseURI:e})=>{if(!he)try{await(async(t,e)=>{let n,s;try{try{s=new URL(t,e)}catch{}const r=await fetch(s);n=await r.arrayBuffer()}catch(e){if(!t.startsWith("data:application/wasm;base64,"))throw e;n=(t=>{const e=t.split(",")[1],n=atob(e),s=n.length,r=new o(s);for(let t=0;t<s;++t)r[t]=n.charCodeAt(t);return r.buffer})(t)}(t=>{if(ee=t,({malloc:ne,free:se,memory:re}=ee),"function"!=typeof ne||"function"!=typeof se||!re)throw ee=ne=se=re=null,new r("Invalid WASM module")})((await WebAssembly.instantiate(n)).instance.exports)})(t,e),he=!0}catch(t){throw(t=>{oe=t})(t),t}})(t.wasmURI,t)})});\n';if("string"==typeof s&&(s=(new TextEncoder).encode(s)),t){const t=new Blob([s],{type:n});return URL.createObjectURL(t)}return "data:"+n+";base64,"+(t=>{let n="";const s=t.length;let r=0;for(;r+2<s;r+=3){const s=t[r]<<16|t[r+1]<<8|t[r+2];n+=e[s>>18&63]+e[s>>12&63]+e[s>>6&63]+e[63&s];}const o=s-r;if(1===o){const s=t[r]<<16;n+=e[s>>18&63]+e[s>>12&63]+"==";}else if(2===o){const s=t[r]<<16|t[r+1]<<8;n+=e[s>>18&63]+e[s>>12&63]+e[s>>6&63]+"=";}return n})(s)}});
256
403
 
257
404
  /*
258
405
  Copyright (c) 2026 Gildas Lormeau. All rights reserved.
@@ -1400,13 +1547,13 @@
1400
1547
  const {
1401
1548
  ctr,
1402
1549
  hmac,
1403
- pending,
1550
+ pendingInput,
1404
1551
  ready
1405
1552
  } = this;
1406
1553
  if (hmac && ctr) {
1407
1554
  await ready;
1408
- const chunkToDecrypt = subarray(pending, 0, pending.length - AUTHENTICATION_CODE_LENGTH);
1409
- const originalAuthenticationCode = subarray(pending, pending.length - AUTHENTICATION_CODE_LENGTH);
1555
+ const chunkToDecrypt = subarray(pendingInput, 0, pendingInput.length - AUTHENTICATION_CODE_LENGTH);
1556
+ const originalAuthenticationCode = subarray(pendingInput, pendingInput.length - AUTHENTICATION_CODE_LENGTH);
1410
1557
  let decryptedChunkArray = EMPTY_UINT8_ARRAY;
1411
1558
  if (chunkToDecrypt.length) {
1412
1559
  const encryptedChunk = toBits(codecBytes, chunkToDecrypt);
@@ -1415,7 +1562,7 @@
1415
1562
  decryptedChunkArray = fromBits(codecBytes, decryptedChunk);
1416
1563
  }
1417
1564
  const authenticationCode = subarray(fromBits(codecBytes, hmac.digest()), 0, AUTHENTICATION_CODE_LENGTH);
1418
- let invalidAuthenticationCode = pending.length < AUTHENTICATION_CODE_LENGTH ? 1 : 0;
1565
+ let invalidAuthenticationCode = pendingInput.length < AUTHENTICATION_CODE_LENGTH ? 1 : 0;
1419
1566
  for (let indexByte = 0; indexByte < AUTHENTICATION_CODE_LENGTH; indexByte++) {
1420
1567
  invalidAuthenticationCode |= authenticationCode[indexByte] ^ originalAuthenticationCode[indexByte];
1421
1568
  }
@@ -1459,14 +1606,14 @@
1459
1606
  const {
1460
1607
  ctr,
1461
1608
  hmac,
1462
- pending,
1609
+ pendingInput,
1463
1610
  ready
1464
1611
  } = this;
1465
1612
  if (hmac && ctr) {
1466
1613
  await ready;
1467
1614
  let encryptedChunkArray = EMPTY_UINT8_ARRAY;
1468
- if (pending.length) {
1469
- const encryptedChunk = ctr.update(toBits(codecBytes, pending));
1615
+ if (pendingInput.length) {
1616
+ const encryptedChunk = ctr.update(toBits(codecBytes, pendingInput));
1470
1617
  hmac.update(encryptedChunk);
1471
1618
  encryptedChunkArray = fromBits(codecBytes, encryptedChunk);
1472
1619
  }
@@ -1483,7 +1630,7 @@
1483
1630
  ready: new Promise(resolve => aesCrypto.resolveReady = resolve),
1484
1631
  password: encodePassword(password, rawPassword),
1485
1632
  strength: encryptionStrength - 1,
1486
- pending: EMPTY_UINT8_ARRAY
1633
+ pendingInput: EMPTY_UINT8_ARRAY
1487
1634
  });
1488
1635
  }
1489
1636
 
@@ -1491,10 +1638,10 @@
1491
1638
  const {
1492
1639
  ctr,
1493
1640
  hmac,
1494
- pending
1641
+ pendingInput
1495
1642
  } = aesCrypto;
1496
- if (pending.length) {
1497
- input = concat(pending, input);
1643
+ if (pendingInput.length) {
1644
+ input = concat(pendingInput, input);
1498
1645
  }
1499
1646
  const inputLength = input.length - paddingEnd;
1500
1647
  output = expand(output, paddingStart + (inputLength - (inputLength % BLOCK_LENGTH)));
@@ -1510,7 +1657,7 @@
1510
1657
  }
1511
1658
  output.set(fromBits(codecBytes, outputChunk), offset + paddingStart);
1512
1659
  }
1513
- aesCrypto.pending = subarray(input, offset);
1660
+ aesCrypto.pendingInput = subarray(input, offset);
1514
1661
  return output;
1515
1662
  }
1516
1663
 
@@ -3287,6 +3434,96 @@
3287
3434
  resetWebWorkerSupport();
3288
3435
  }
3289
3436
 
3437
+ /*
3438
+ Copyright (c) 2022 Gildas Lormeau. All rights reserved.
3439
+
3440
+ Redistribution and use in source and binary forms, with or without
3441
+ modification, are permitted provided that the following conditions are met:
3442
+
3443
+ 1. Redistributions of source code must retain the above copyright notice,
3444
+ this list of conditions and the following disclaimer.
3445
+
3446
+ 2. Redistributions in binary form must reproduce the above copyright
3447
+ notice, this list of conditions and the following disclaimer in
3448
+ the documentation and/or other materials provided with the distribution.
3449
+
3450
+ 3. The names of the authors may not be used to endorse or promote products
3451
+ derived from this software without specific prior written permission.
3452
+
3453
+ THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
3454
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
3455
+ FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
3456
+ INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
3457
+ INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
3458
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
3459
+ OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
3460
+ LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
3461
+ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
3462
+ EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
3463
+ */
3464
+
3465
+ /* global TextDecoder */
3466
+
3467
+ const CP437 = "\0☺☻♥♦♣♠•◘○◙♂♀♪♫☼►◄↕‼¶§▬↨↑↓→←∟↔▲▼ !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~⌂ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜ¢£¥₧ƒáíóúñѪº¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ ".split("");
3468
+ const VALID_CP437 = CP437.length == 256;
3469
+
3470
+ function decodeCP437(stringValue) {
3471
+ if (VALID_CP437) {
3472
+ let result = "";
3473
+ for (let indexCharacter = 0; indexCharacter < stringValue.length; indexCharacter++) {
3474
+ result += CP437[stringValue[indexCharacter]];
3475
+ }
3476
+ return result;
3477
+ } else {
3478
+ return new TextDecoder().decode(stringValue);
3479
+ }
3480
+ }
3481
+
3482
+ /*
3483
+ Copyright (c) 2022 Gildas Lormeau. All rights reserved.
3484
+
3485
+ Redistribution and use in source and binary forms, with or without
3486
+ modification, are permitted provided that the following conditions are met:
3487
+
3488
+ 1. Redistributions of source code must retain the above copyright notice,
3489
+ this list of conditions and the following disclaimer.
3490
+
3491
+ 2. Redistributions in binary form must reproduce the above copyright
3492
+ notice, this list of conditions and the following disclaimer in
3493
+ the documentation and/or other materials provided with the distribution.
3494
+
3495
+ 3. The names of the authors may not be used to endorse or promote products
3496
+ derived from this software without specific prior written permission.
3497
+
3498
+ THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
3499
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
3500
+ FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
3501
+ INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
3502
+ INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
3503
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
3504
+ OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
3505
+ LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
3506
+ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
3507
+ EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
3508
+ */
3509
+
3510
+
3511
+ function decodeText(value, encoding) {
3512
+ return decode(value, encoding, true);
3513
+ }
3514
+
3515
+ function decodeTextRemovingBOM(value, encoding) {
3516
+ return decode(value, encoding, false);
3517
+ }
3518
+
3519
+ function decode(value, encoding, ignoreBOM) {
3520
+ if (encoding && encoding.trim().toLowerCase() == "cp437") {
3521
+ return decodeCP437(value);
3522
+ } else {
3523
+ return new TextDecoder(encoding, { ignoreBOM }).decode(value);
3524
+ }
3525
+ }
3526
+
3290
3527
  /*
3291
3528
  Copyright (c) 2025 Gildas Lormeau. All rights reserved.
3292
3529
 
@@ -3359,6 +3596,7 @@
3359
3596
  createReadable({ offset = 0, size, chunkSize = getChunkSize(getConfiguration()) } = {}) {
3360
3597
  const reader = this;
3361
3598
  let chunkOffset = 0;
3599
+ chunkSize = normalizeChunkSize(chunkSize);
3362
3600
  return new ReadableStream({
3363
3601
  async pull(controller) {
3364
3602
  const dataSize = size === UNDEFINED_VALUE ? chunkSize : Math.min(chunkSize, size - chunkOffset);
@@ -3366,7 +3604,7 @@
3366
3604
  if (data.length) {
3367
3605
  controller.enqueue(data);
3368
3606
  }
3369
- if ((chunkOffset + chunkSize >= size) || (size === UNDEFINED_VALUE && !data.length && dataSize)) {
3607
+ if ((chunkOffset + chunkSize >= size) || (!data.length && dataSize)) {
3370
3608
  controller.close();
3371
3609
  } else {
3372
3610
  chunkOffset += chunkSize;
@@ -3446,31 +3684,31 @@
3446
3684
  Object.assign(this, {
3447
3685
  contentType,
3448
3686
  data: "data:" + (contentType || "") + ";base64,",
3449
- pending: []
3687
+ pendingCharacters: ""
3450
3688
  });
3451
3689
  }
3452
3690
 
3453
3691
  writeUint8Array(array) {
3454
3692
  const writer = this;
3455
3693
  let indexArray;
3456
- let dataString = writer.pending;
3457
- const delta = writer.pending.length;
3458
- writer.pending = "";
3694
+ let dataString = writer.pendingCharacters;
3695
+ const delta = writer.pendingCharacters.length;
3696
+ writer.pendingCharacters = "";
3459
3697
  for (indexArray = 0; indexArray < (Math.floor((delta + array.length) / 3) * 3) - delta; indexArray++) {
3460
3698
  dataString += String.fromCharCode(array[indexArray]);
3461
3699
  }
3462
3700
  for (; indexArray < array.length; indexArray++) {
3463
- writer.pending += String.fromCharCode(array[indexArray]);
3701
+ writer.pendingCharacters += String.fromCharCode(array[indexArray]);
3464
3702
  }
3465
3703
  if (dataString.length > 2) {
3466
3704
  writer.data += btoa(dataString);
3467
3705
  } else {
3468
- writer.pending = dataString + writer.pending;
3706
+ writer.pendingCharacters = dataString + writer.pendingCharacters;
3469
3707
  }
3470
3708
  }
3471
3709
 
3472
3710
  getData() {
3473
- return this.data + btoa(this.pending);
3711
+ return this.data + btoa(this.pendingCharacters);
3474
3712
  }
3475
3713
  }
3476
3714
 
@@ -3500,7 +3738,7 @@
3500
3738
  constructor(blob) {
3501
3739
  super();
3502
3740
  Object.assign(this, {
3503
- blob,
3741
+ sourceBlob: blob,
3504
3742
  size: blob.size
3505
3743
  });
3506
3744
  if (!blobSliceProbe) {
@@ -3510,13 +3748,13 @@
3510
3748
 
3511
3749
  createReadable(options) {
3512
3750
  const reader = this;
3513
- const { blob, size } = reader;
3751
+ const { sourceBlob, size } = reader;
3514
3752
  const { offset = 0, size: readSize = size - offset } = options || {};
3515
3753
  if (!offset && readSize >= size) {
3516
- return toCompatibleReadable(blob.stream());
3754
+ return toCompatibleReadable(sourceBlob.stream());
3517
3755
  }
3518
3756
  if (blobSliceReliable) {
3519
- return toCompatibleReadable(blob.slice(offset, offset + readSize).stream());
3757
+ return toCompatibleReadable(sourceBlob.slice(offset, offset + readSize).stream());
3520
3758
  }
3521
3759
  return super.createReadable(options);
3522
3760
  }
@@ -3525,7 +3763,7 @@
3525
3763
  const reader = this;
3526
3764
  const offsetEnd = offset + length;
3527
3765
  const readsWholeBlob = !offset && offsetEnd >= reader.size;
3528
- const blob = readsWholeBlob ? reader.blob : reader.blob.slice(offset, offsetEnd);
3766
+ const blob = readsWholeBlob ? reader.sourceBlob : reader.sourceBlob.slice(offset, offsetEnd);
3529
3767
  let arrayBuffer = await blob.arrayBuffer();
3530
3768
  const sliceIgnoredByBuggyImplementation = arrayBuffer.byteLength > length;
3531
3769
  if (sliceIgnoredByBuggyImplementation) {
@@ -3547,12 +3785,12 @@
3547
3785
  }
3548
3786
  });
3549
3787
  writer.contentType = contentType;
3550
- writer.blob = streamToBlob(transformStream.readable, contentType);
3551
- writer.blob.catch(() => { });
3788
+ writer.blobPromise = streamToBlob(transformStream.readable, contentType);
3789
+ writer.blobPromise.catch(() => { });
3552
3790
  }
3553
3791
 
3554
3792
  getData() {
3555
- return this.blob;
3793
+ return this.blobPromise;
3556
3794
  }
3557
3795
  }
3558
3796
 
@@ -3586,7 +3824,7 @@
3586
3824
  class TextWriter extends BlobWriter {
3587
3825
 
3588
3826
  constructor(encoding) {
3589
- super(encoding);
3827
+ super();
3590
3828
  Object.assign(this, {
3591
3829
  encoding,
3592
3830
  utf8: !encoding || encoding.toLowerCase() == "utf-8"
@@ -3602,14 +3840,7 @@
3602
3840
  if (blob.text && utf8) {
3603
3841
  return blob.text();
3604
3842
  } else {
3605
- const reader = new FileReader();
3606
- return new Promise((resolve, reject) => {
3607
- Object.assign(reader, {
3608
- onload: ({ target }) => resolve(target.result),
3609
- onerror: () => reject(reader.error)
3610
- });
3611
- reader.readAsText(blob, encoding);
3612
- });
3843
+ return decodeTextRemovingBOM(new Uint8Array(await blob.arrayBuffer()), encoding);
3613
3844
  }
3614
3845
  }
3615
3846
  }
@@ -4277,85 +4508,13 @@
4277
4508
  return reader.readUint8Array(offset, size);
4278
4509
  }
4279
4510
 
4280
- /*
4281
- Copyright (c) 2022 Gildas Lormeau. All rights reserved.
4282
-
4283
- Redistribution and use in source and binary forms, with or without
4284
- modification, are permitted provided that the following conditions are met:
4285
-
4286
- 1. Redistributions of source code must retain the above copyright notice,
4287
- this list of conditions and the following disclaimer.
4288
-
4289
- 2. Redistributions in binary form must reproduce the above copyright
4290
- notice, this list of conditions and the following disclaimer in
4291
- the documentation and/or other materials provided with the distribution.
4292
-
4293
- 3. The names of the authors may not be used to endorse or promote products
4294
- derived from this software without specific prior written permission.
4295
-
4296
- THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
4297
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
4298
- FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
4299
- INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
4300
- INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
4301
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
4302
- OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
4303
- LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
4304
- NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
4305
- EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
4306
- */
4307
-
4308
- /* global TextDecoder */
4309
-
4310
- const CP437 = "\0☺☻♥♦♣♠•◘○◙♂♀♪♫☼►◄↕‼¶§▬↨↑↓→←∟↔▲▼ !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~⌂ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜ¢£¥₧ƒáíóúñѪº¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ ".split("");
4311
- const VALID_CP437 = CP437.length == 256;
4312
-
4313
- function decodeCP437(stringValue) {
4314
- if (VALID_CP437) {
4315
- let result = "";
4316
- for (let indexCharacter = 0; indexCharacter < stringValue.length; indexCharacter++) {
4317
- result += CP437[stringValue[indexCharacter]];
4318
- }
4319
- return result;
4320
- } else {
4321
- return new TextDecoder().decode(stringValue);
4322
- }
4323
- }
4324
-
4325
- /*
4326
- Copyright (c) 2022 Gildas Lormeau. All rights reserved.
4327
-
4328
- Redistribution and use in source and binary forms, with or without
4329
- modification, are permitted provided that the following conditions are met:
4330
-
4331
- 1. Redistributions of source code must retain the above copyright notice,
4332
- this list of conditions and the following disclaimer.
4333
-
4334
- 2. Redistributions in binary form must reproduce the above copyright
4335
- notice, this list of conditions and the following disclaimer in
4336
- the documentation and/or other materials provided with the distribution.
4337
-
4338
- 3. The names of the authors may not be used to endorse or promote products
4339
- derived from this software without specific prior written permission.
4340
-
4341
- THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
4342
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
4343
- FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
4344
- INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
4345
- INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
4346
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
4347
- OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
4348
- LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
4349
- NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
4350
- EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
4351
- */
4352
-
4353
-
4354
- function decodeText(value, encoding) {
4355
- if (encoding && encoding.trim().toLowerCase() == "cp437") {
4356
- return decodeCP437(value);
4511
+ function createReadable(reader, options) {
4512
+ if (reader.createReadable) {
4513
+ return reader.createReadable(options);
4514
+ } else if (reader.readUint8Array) {
4515
+ return Reader.prototype.createReadable.call(reader, options);
4357
4516
  } else {
4358
- return new TextDecoder(encoding, { ignoreBOM: true }).decode(value);
4517
+ return reader.readable;
4359
4518
  }
4360
4519
  }
4361
4520
 
@@ -4515,83 +4674,6 @@
4515
4674
 
4516
4675
  }
4517
4676
 
4518
- /*
4519
- Copyright (c) 2022 Gildas Lormeau. All rights reserved.
4520
-
4521
- Redistribution and use in source and binary forms, with or without
4522
- modification, are permitted provided that the following conditions are met:
4523
-
4524
- 1. Redistributions of source code must retain the above copyright notice,
4525
- this list of conditions and the following disclaimer.
4526
-
4527
- 2. Redistributions in binary form must reproduce the above copyright
4528
- notice, this list of conditions and the following disclaimer in
4529
- the documentation and/or other materials provided with the distribution.
4530
-
4531
- 3. The names of the authors may not be used to endorse or promote products
4532
- derived from this software without specific prior written permission.
4533
-
4534
- THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
4535
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
4536
- FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
4537
- INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
4538
- INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
4539
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
4540
- OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
4541
- LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
4542
- NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
4543
- EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
4544
- */
4545
-
4546
- const OPTION_FILENAME_ENCODING = "filenameEncoding";
4547
- const OPTION_COMMENT_ENCODING = "commentEncoding";
4548
- const OPTION_DECODE_TEXT = "decodeText";
4549
- const OPTION_EXTRACT_PREPENDED_DATA = "extractPrependedData";
4550
- const OPTION_EXTRACT_APPENDED_DATA = "extractAppendedData";
4551
- const OPTION_PASSWORD = "password";
4552
- const OPTION_RAW_PASSWORD = "rawPassword";
4553
- const OPTION_PASS_THROUGH = "passThrough";
4554
- const OPTION_SIGNAL = "signal";
4555
- const OPTION_CHECK_PASSWORD_ONLY = "checkPasswordOnly";
4556
- const OPTION_CHECK_OVERLAPPING_ENTRY_ONLY = "checkOverlappingEntryOnly";
4557
- const OPTION_CHECK_OVERLAPPING_ENTRY = "checkOverlappingEntry";
4558
- const OPTION_CHECK_AMBIGUITY = "checkAmbiguity";
4559
- const OPTION_CHECK_LOCAL_DIRECTORY = "checkLocalDirectory";
4560
- const OPTION_CHECK_SIGNATURE = "checkSignature";
4561
- const OPTION_CHECK_CRC32 = "checkCrc32";
4562
- const OPTION_CHECK_AUTHENTICATION_CODE = "checkAuthenticationCode";
4563
- const OPTION_USE_WEB_WORKERS = "useWebWorkers";
4564
- const OPTION_USE_COMPRESSION_STREAM = "useCompressionStream";
4565
- const OPTION_TRANSFER_STREAMS = "transferStreams";
4566
- const OPTION_PREVENT_CLOSE = "preventClose";
4567
- const OPTION_ENCRYPTION_STRENGTH = "encryptionStrength";
4568
- const OPTION_EXTENDED_TIMESTAMP = "extendedTimestamp";
4569
- const OPTION_NTFS_TIMESTAMP = "ntfsTimestamp";
4570
- const OPTION_KEEP_ORDER = "keepOrder";
4571
- const OPTION_LEVEL = "level";
4572
- const OPTION_BUFFERED_WRITE = "bufferedWrite";
4573
- const OPTION_CREATE_TEMP_STREAM = "createTempStream";
4574
- const OPTION_DATA_DESCRIPTOR_SIGNATURE = "dataDescriptorSignature";
4575
- const OPTION_USE_UNICODE_FILE_NAMES = "useUnicodeFileNames";
4576
- const OPTION_DATA_DESCRIPTOR = "dataDescriptor";
4577
- const OPTION_SUPPORT_ZIP64_SPLIT_FILE = "supportZip64SplitFile";
4578
- const OPTION_ENCODE_TEXT = "encodeText";
4579
- const OPTION_OFFSET = "offset";
4580
- const OPTION_USDZ = "usdz";
4581
- const OPTION_UNIX_EXTRA_FIELD_TYPE = "unixExtraFieldType";
4582
- const OPTION_LOCAL_EXTRA_FIELD = "localExtraField";
4583
- const OPTION_STRICTNESS = "strictness";
4584
- const OPTION_FILENAME_VALIDATION = "filenameValidation";
4585
- const OPTION_NORMALIZE_FILENAME = "normalizeFilename";
4586
- const OPTION_MAX_APPENDED_DATA_SIZE = "maxAppendedDataSize";
4587
- const OPTION_DECRYPT_CENTRAL_DIRECTORY = "decryptCentralDirectory";
4588
- const OPTION_SIGN_CENTRAL_DIRECTORY = "signCentralDirectory";
4589
- const TEXT_TYPE_FILENAME = "filename";
4590
- const TEXT_TYPE_COMMENT = "comment";
4591
- const STRICTNESS_STRICT = "strict";
4592
- const STRICTNESS_BALANCED = "balanced";
4593
- const STRICTNESS_TOLERANT = "tolerant";
4594
-
4595
4677
  /*
4596
4678
  Copyright (c) 2025 Gildas Lormeau. All rights reserved.
4597
4679
 
@@ -4632,6 +4714,7 @@
4632
4714
  const ERR_UNSUPPORTED_COMPRESSION$1 = "Compression method not supported";
4633
4715
  const ERR_SPLIT_ZIP_FILE = "Split zip file";
4634
4716
  const ERR_OVERLAPPING_ENTRY = "Overlapping entry found";
4717
+ const ERR_ENTRY_DATA_OUT_OF_BOUNDS = "Entry data out of bounds";
4635
4718
  const ERR_AMBIGUOUS_ARCHIVE = "Ambiguous archive";
4636
4719
  const ERR_ENCRYPTED_CENTRAL_DIRECTORY = "Encrypted central directory is not supported";
4637
4720
  const ERR_UNSAFE_FILENAME = "Unsafe filename";
@@ -4652,7 +4735,7 @@
4652
4735
  ];
4653
4736
  const ZIP64_EXTRACTION = {
4654
4737
  [MAX_16_BITS]: {
4655
- getValue: getUint32,
4738
+ getValue: getUint32$1,
4656
4739
  bytes: 4
4657
4740
  },
4658
4741
  [MAX_32_BITS]: {
@@ -4661,6 +4744,7 @@
4661
4744
  }
4662
4745
  };
4663
4746
  const MAX_END_OF_CENTRAL_DIR_PROBES = 64;
4747
+ const MAX_DEFLATE_EXPANSION_RATIO = 1032;
4664
4748
  const CENTRAL_DIRECTORY_UNREACHABLE = 0;
4665
4749
  const CENTRAL_DIRECTORY_PLAUSIBLE = 1;
4666
4750
  const CENTRAL_DIRECTORY_REACHABLE = 2;
@@ -4671,7 +4755,6 @@
4671
4755
  Object.assign(this, {
4672
4756
  reader: new GenericReader(reader),
4673
4757
  options,
4674
- config: getConfiguration(),
4675
4758
  readRanges: new Map()
4676
4759
  });
4677
4760
  }
@@ -4679,7 +4762,6 @@
4679
4762
  async* getEntriesGenerator(options = {}) {
4680
4763
  const zipReader = this;
4681
4764
  let { reader } = zipReader;
4682
- const { config } = zipReader;
4683
4765
  await initStream(reader);
4684
4766
  if (reader.size === UNDEFINED_VALUE || !reader.readUint8Array) {
4685
4767
  reader = new BlobReader(await streamToBlob(reader.readable));
@@ -4696,9 +4778,7 @@
4696
4778
  const normalizeFilename = getOptionValue$1(zipReader, options, OPTION_NORMALIZE_FILENAME);
4697
4779
  const { endOfDirectoryInfo, endOfDirectoryReachingEndCount } = await findEndOfCentralDirectory(reader, rejectAmbiguousEndOfDirectory, maxAppendedDataSize);
4698
4780
  if (!endOfDirectoryInfo) {
4699
- const signatureArray = await readUint8Array(reader, 0, 4);
4700
- const signatureView = getDataView(signatureArray);
4701
- if (getUint32(signatureView) == SPLIT_ZIP_FILE_SIGNATURE) {
4781
+ if (await startsWithSplitZipSignature$1(reader)) {
4702
4782
  throw new Error(ERR_SPLIT_ZIP_FILE);
4703
4783
  } else {
4704
4784
  throw new Error(ERR_EOCDR_NOT_FOUND);
@@ -4708,22 +4788,23 @@
4708
4788
  throwAmbiguousArchive("multiple end of central directory records");
4709
4789
  }
4710
4790
  const endOfDirectoryView = getDataView(endOfDirectoryInfo);
4711
- let directoryDataLength = getUint32(endOfDirectoryView, 12);
4712
- let directoryDataOffset = getUint32(endOfDirectoryView, 16);
4791
+ let directoryDataLength = getUint32$1(endOfDirectoryView, 12);
4792
+ let directoryDataOffset = getUint32$1(endOfDirectoryView, 16);
4713
4793
  const commentOffset = endOfDirectoryInfo.offset;
4714
- const commentLength = getUint16(endOfDirectoryView, 20);
4794
+ const commentLength = getUint16$1(endOfDirectoryView, 20);
4715
4795
  const appendedDataOffset = commentOffset + END_OF_CENTRAL_DIR_LENGTH + commentLength;
4716
4796
  if (reader.size - appendedDataOffset > maxAppendedDataSize) {
4717
4797
  throwAmbiguousArchive("appended data");
4718
4798
  }
4719
- let lastDiskNumber = getUint16(endOfDirectoryView, 4);
4799
+ let lastDiskNumber = getUint16$1(endOfDirectoryView, 4);
4720
4800
  const expectedLastDiskNumber = reader.lastDiskNumber || 0;
4721
- let diskNumber = getUint16(endOfDirectoryView, 6);
4722
- let filesLength = getUint16(endOfDirectoryView, 10);
4801
+ let diskNumber = getUint16$1(endOfDirectoryView, 6);
4802
+ let filesLength = getUint16$1(endOfDirectoryView, 10);
4723
4803
  let prependedDataLength = 0;
4724
4804
  let startOffset;
4725
4805
  let zip64EndOfDirectory;
4726
4806
  let zip64EndOfDirectoryVersion2;
4807
+ let zip64EndOfDirectoryLength = ZIP64_END_OF_CENTRAL_DIR_LENGTH;
4727
4808
  let directoryEncryptionInfo;
4728
4809
  const requiresZip64 = directoryDataOffset == MAX_32_BITS || directoryDataLength == MAX_32_BITS || filesLength == MAX_16_BITS || diskNumber == MAX_16_BITS;
4729
4810
  if (directoryDataOffset != MAX_32_BITS && diskNumber != MAX_16_BITS) {
@@ -4735,12 +4816,12 @@
4735
4816
  EMPTY_UINT8_ARRAY;
4736
4817
  const endOfDirectoryLocatorView = getDataView(endOfDirectoryLocatorArray);
4737
4818
  if (endOfDirectoryLocatorArray.length == ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH &&
4738
- getUint32(endOfDirectoryLocatorView, 0) == ZIP64_END_OF_CENTRAL_DIR_LOCATOR_SIGNATURE) {
4739
- directoryDataOffset = getDiskOffset$1(reader, getUint32(endOfDirectoryLocatorView, 4)) + getBigUint64(endOfDirectoryLocatorView, 8);
4819
+ getUint32$1(endOfDirectoryLocatorView, 0) == ZIP64_END_OF_CENTRAL_DIR_LOCATOR_SIGNATURE) {
4820
+ directoryDataOffset = getDiskOffset$1(reader, getUint32$1(endOfDirectoryLocatorView, 4)) + getBigUint64(endOfDirectoryLocatorView, 8);
4740
4821
  let endOfDirectoryArray = await readUint8Array(reader, directoryDataOffset, ZIP64_END_OF_CENTRAL_DIR_LENGTH);
4741
4822
  let endOfDirectoryView = getDataView(endOfDirectoryArray);
4742
4823
  const expectedDirectoryDataOffset = endOfDirectoryInfo.offset - ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH - ZIP64_END_OF_CENTRAL_DIR_LENGTH;
4743
- if ((endOfDirectoryArray.length < ZIP64_END_OF_CENTRAL_DIR_LENGTH || getUint32(endOfDirectoryView, 0) != ZIP64_END_OF_CENTRAL_DIR_SIGNATURE) &&
4824
+ if ((endOfDirectoryArray.length < ZIP64_END_OF_CENTRAL_DIR_LENGTH || getUint32$1(endOfDirectoryView, 0) != ZIP64_END_OF_CENTRAL_DIR_SIGNATURE) &&
4744
4825
  directoryDataOffset != expectedDirectoryDataOffset && expectedDirectoryDataOffset >= 0) {
4745
4826
  const originalDirectoryDataOffset = directoryDataOffset;
4746
4827
  directoryDataOffset = expectedDirectoryDataOffset;
@@ -4750,7 +4831,7 @@
4750
4831
  endOfDirectoryArray = await readUint8Array(reader, directoryDataOffset, ZIP64_END_OF_CENTRAL_DIR_LENGTH);
4751
4832
  endOfDirectoryView = getDataView(endOfDirectoryArray);
4752
4833
  }
4753
- if (endOfDirectoryArray.length < ZIP64_END_OF_CENTRAL_DIR_LENGTH || getUint32(endOfDirectoryView, 0) != ZIP64_END_OF_CENTRAL_DIR_SIGNATURE) {
4834
+ if (endOfDirectoryArray.length < ZIP64_END_OF_CENTRAL_DIR_LENGTH || getUint32$1(endOfDirectoryView, 0) != ZIP64_END_OF_CENTRAL_DIR_SIGNATURE) {
4754
4835
  throw new Error(ERR_EOCDR_LOCATOR_ZIP64_NOT_FOUND);
4755
4836
  }
4756
4837
  zip64EndOfDirectory = true;
@@ -4760,18 +4841,19 @@
4760
4841
  Number(getBigUint64(endOfDirectoryView, 4)) - (ZIP64_END_OF_CENTRAL_DIR_LENGTH - 12),
4761
4842
  reader.size - directoryDataOffset - ZIP64_END_OF_CENTRAL_DIR_LENGTH);
4762
4843
  if (extensibleDataLength > 0) {
4844
+ zip64EndOfDirectoryLength += extensibleDataLength;
4763
4845
  const rawExtensibleData = await readUint8Array(reader, directoryDataOffset + ZIP64_END_OF_CENTRAL_DIR_LENGTH, extensibleDataLength);
4764
4846
  directoryEncryptionInfo = getDirectoryEncryptionInfo(rawExtensibleData);
4765
4847
  }
4766
4848
  }
4767
4849
  if (lastDiskNumber == MAX_16_BITS) {
4768
- lastDiskNumber = getUint32(endOfDirectoryView, 16);
4769
- } else if (checkAmbiguity && lastDiskNumber != getUint32(endOfDirectoryView, 16)) {
4850
+ lastDiskNumber = getUint32$1(endOfDirectoryView, 16);
4851
+ } else if (checkAmbiguity && lastDiskNumber != getUint32$1(endOfDirectoryView, 16)) {
4770
4852
  throwAmbiguousArchive("mismatched zip64 end of central directory record");
4771
4853
  }
4772
4854
  if (diskNumber == MAX_16_BITS) {
4773
- diskNumber = getUint32(endOfDirectoryView, 20);
4774
- } else if (checkAmbiguity && diskNumber != getUint32(endOfDirectoryView, 20)) {
4855
+ diskNumber = getUint32$1(endOfDirectoryView, 20);
4856
+ } else if (checkAmbiguity && diskNumber != getUint32$1(endOfDirectoryView, 20)) {
4775
4857
  throwAmbiguousArchive("mismatched zip64 end of central directory record");
4776
4858
  }
4777
4859
  if (filesLength == MAX_16_BITS) {
@@ -4789,7 +4871,7 @@
4789
4871
  }
4790
4872
  let declaredDirectoryDataLength = directoryDataLength;
4791
4873
  const centralDirectoryEndOffset = endOfDirectoryInfo.offset -
4792
- (zip64EndOfDirectory ? ZIP64_END_OF_CENTRAL_DIR_LENGTH + ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH : 0);
4874
+ (zip64EndOfDirectory ? zip64EndOfDirectoryLength + ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH : 0);
4793
4875
  if (directoryDataOffset >= reader.size) {
4794
4876
  prependedDataLength = reader.size - directoryDataOffset - directoryDataLength - END_OF_CENTRAL_DIR_LENGTH;
4795
4877
  directoryDataOffset = reader.size - directoryDataLength - END_OF_CENTRAL_DIR_LENGTH;
@@ -4809,11 +4891,13 @@
4809
4891
  }
4810
4892
  const expectedDirectoryDataOffset = centralDirectoryEndOffset - directoryDataLength;
4811
4893
  if (directoryDataOffset != expectedDirectoryDataOffset && diskNumber == lastDiskNumber) {
4812
- const storedPointsAtDirectory = getUint32(directoryView, offset) == CENTRAL_FILE_HEADER_SIGNATURE;
4894
+ const storedPointsAtDirectory = getUint32$1(directoryView, offset) == CENTRAL_FILE_HEADER_SIGNATURE ||
4895
+ Boolean(directoryEncryptionInfo && directoryEncryptionInfo.compressedSize) ||
4896
+ detectEncryptedCentralDirectory(directoryView);
4813
4897
  let reconcile = !storedPointsAtDirectory;
4814
4898
  if (!reconcile && expectedDirectoryDataOffset >= 0 && expectedDirectoryDataOffset + 4 <= reader.size) {
4815
4899
  const expectedSignatureArray = await readUint8Array(reader, expectedDirectoryDataOffset, 4);
4816
- reconcile = getUint32(getDataView(expectedSignatureArray), 0) == CENTRAL_FILE_HEADER_SIGNATURE;
4900
+ reconcile = getUint32$1(getDataView(expectedSignatureArray), 0) == CENTRAL_FILE_HEADER_SIGNATURE;
4817
4901
  }
4818
4902
  if (reconcile) {
4819
4903
  const originalDirectoryDataOffset = directoryDataOffset;
@@ -4837,12 +4921,14 @@
4837
4921
  }
4838
4922
  zipReader.directoryOffset = directoryDataOffset;
4839
4923
  zipReader.directoryLength = declaredDirectoryDataLength;
4840
- const decryptCentralDirectory = getOptionValue$1(zipReader, options, OPTION_DECRYPT_CENTRAL_DIRECTORY);
4841
- let decryptedDirectory;
4924
+ const decryptCentralDirectory = getFunctionOptionValue$1(zipReader, options, OPTION_DECRYPT_CENTRAL_DIRECTORY);
4925
+ let decryptedDirectory, dataAfterEncryptedDirectory;
4842
4926
  if (decryptCentralDirectory && filesLength && directoryArray.length >= 4 &&
4843
- getUint32(directoryView, 0) != CENTRAL_FILE_HEADER_SIGNATURE &&
4927
+ getUint32$1(directoryView, 0) != CENTRAL_FILE_HEADER_SIGNATURE &&
4844
4928
  (zip64EndOfDirectoryVersion2 || detectEncryptedCentralDirectory(directoryView))) {
4845
- directoryArray = await decryptCentralDirectory(directoryArray, directoryEncryptionInfo);
4929
+ const encryptedDirectoryDataLength = getEncryptedDirectoryDataLength(directoryEncryptionInfo, declaredDirectoryDataLength, directoryArray.length);
4930
+ dataAfterEncryptedDirectory = directoryArray.subarray(encryptedDirectoryDataLength);
4931
+ directoryArray = await decryptCentralDirectory(directoryArray.subarray(0, encryptedDirectoryDataLength), directoryEncryptionInfo);
4846
4932
  directoryView = getDataView(directoryArray);
4847
4933
  declaredDirectoryDataLength = directoryArray.length;
4848
4934
  decryptedDirectory = true;
@@ -4853,8 +4939,8 @@
4853
4939
  const filenames = checkAmbiguity ? new Set() : UNDEFINED_VALUE;
4854
4940
  let duplicateFilename;
4855
4941
  for (let indexFile = 0; indexFile < filesLength; indexFile++) {
4856
- const fileEntry = new ZipEntry$1(reader, config, zipReader.options);
4857
- if (offset + CENTRAL_FILE_HEADER_LENGTH > directoryArray.length || getUint32(directoryView, offset) != CENTRAL_FILE_HEADER_SIGNATURE) {
4942
+ const fileEntry = new ZipEntry$1(reader, zipReader.options);
4943
+ if (offset + CENTRAL_FILE_HEADER_LENGTH > directoryArray.length || getUint32$1(directoryView, offset) != CENTRAL_FILE_HEADER_SIGNATURE) {
4858
4944
  if (indexFile == 0 && !decryptedDirectory && (zip64EndOfDirectoryVersion2 || detectEncryptedCentralDirectory(directoryView))) {
4859
4945
  throw new Error(ERR_ENCRYPTED_CENTRAL_DIRECTORY);
4860
4946
  }
@@ -4865,16 +4951,16 @@
4865
4951
  const filenameOffset = offset + CENTRAL_FILE_HEADER_LENGTH;
4866
4952
  const extraFieldOffset = filenameOffset + fileEntry.filenameLength;
4867
4953
  const commentOffset = extraFieldOffset + fileEntry.extraFieldLength;
4868
- const versionMadeBy = getUint16(directoryView, offset + 4);
4954
+ const versionMadeBy = getUint16$1(directoryView, offset + 4);
4869
4955
  const msDosCompatible = versionMadeBy >> 8 == 0;
4870
4956
  const unixCompatible = versionMadeBy >> 8 == 3;
4871
4957
  const rawFilename = directoryArray.subarray(filenameOffset, extraFieldOffset);
4872
- const commentLength = getUint16(directoryView, offset + 32);
4958
+ const commentLength = getUint16$1(directoryView, offset + 32);
4873
4959
  const endOffset = commentOffset + commentLength;
4874
4960
  const rawComment = directoryArray.subarray(commentOffset, endOffset);
4875
4961
  const filenameUTF8 = languageEncodingFlag;
4876
4962
  const commentUTF8 = languageEncodingFlag;
4877
- const externalFileAttributes = getUint32(directoryView, offset + 38);
4963
+ const externalFileAttributes = getUint32$1(directoryView, offset + 38);
4878
4964
  const msdosAttributesRaw = externalFileAttributes & MAX_8_BITS;
4879
4965
  const msdosAttributes = {
4880
4966
  readOnly: Boolean(msdosAttributesRaw & FILE_ATTR_MSDOS_READONLY_MASK),
@@ -4883,8 +4969,8 @@
4883
4969
  directory: Boolean(msdosAttributesRaw & FILE_ATTR_MSDOS_DIR_MASK),
4884
4970
  archive: Boolean(msdosAttributesRaw & FILE_ATTR_MSDOS_ARCHIVE_MASK)
4885
4971
  };
4886
- const offsetFileEntry = getUint32(directoryView, offset + 42);
4887
- const decode = getOptionValue$1(zipReader, options, OPTION_DECODE_TEXT) || decodeText;
4972
+ const offsetFileEntry = getUint32$1(directoryView, offset + 42);
4973
+ const decode = getFunctionOptionValue$1(zipReader, options, OPTION_DECODE_TEXT) || decodeText;
4888
4974
  const rawFilenameEncoding = filenameUTF8 ? CHARSET_UTF8 : filenameEncoding || CHARSET_CP437;
4889
4975
  const rawCommentEncoding = commentUTF8 ? CHARSET_UTF8 : commentEncoding || CHARSET_CP437;
4890
4976
  let filename = decode(rawFilename, rawFilenameEncoding, TEXT_TYPE_FILENAME);
@@ -4908,6 +4994,7 @@
4908
4994
  }
4909
4995
  Object.assign(fileEntry, {
4910
4996
  index: indexFile,
4997
+ decryptedDirectory,
4911
4998
  versionMadeBy,
4912
4999
  msDosCompatible,
4913
5000
  zip64: false,
@@ -4915,8 +5002,8 @@
4915
5002
  uncompressedSize: 0,
4916
5003
  commentLength,
4917
5004
  offset: offsetFileEntry,
4918
- diskNumberStart: getUint16(directoryView, offset + 34),
4919
- internalFileAttributes: getUint16(directoryView, offset + 36),
5005
+ diskNumberStart: getUint16$1(directoryView, offset + 34),
5006
+ internalFileAttributes: getUint16$1(directoryView, offset + 36),
4920
5007
  externalFileAttributes,
4921
5008
  msdosAttributesRaw,
4922
5009
  msdosAttributes,
@@ -4984,12 +5071,11 @@
4984
5071
  yield entry;
4985
5072
  }
4986
5073
  let offsetAfterSignature = offset;
4987
- if (offset + 6 <= directoryArray.length && getUint32(directoryView, offset) == DIGITAL_SIGNATURE_RECORD_SIGNATURE) {
4988
- const signatureDataLength = getUint16(directoryView, offset + 4);
4989
- if (offset + 6 + signatureDataLength <= directoryArray.length) {
4990
- zipReader.digitalSignature = directoryArray.subarray(offset + 6, offset + 6 + signatureDataLength);
4991
- offsetAfterSignature = offset + 6 + signatureDataLength;
4992
- }
5074
+ const digitalSignature = readDigitalSignature(directoryArray.subarray(offset)) ||
5075
+ (decryptedDirectory ? readDigitalSignature(dataAfterEncryptedDirectory) : UNDEFINED_VALUE);
5076
+ if (digitalSignature) {
5077
+ zipReader.digitalSignature = digitalSignature;
5078
+ offsetAfterSignature = offset + 6 + digitalSignature.length;
4993
5079
  }
4994
5080
  if (checkAmbiguity && offset != declaredDirectoryDataLength && offsetAfterSignature != declaredDirectoryDataLength) {
4995
5081
  throwAmbiguousArchive("trailing central directory data");
@@ -4997,13 +5083,17 @@
4997
5083
  if (duplicateFilename) {
4998
5084
  throwAmbiguousArchive("duplicate filename");
4999
5085
  }
5000
- if (checkAmbiguity && (prependedDataLength || (filesLength && startOffset > 0))) {
5001
- throwAmbiguousArchive("prepended data");
5002
- }
5003
5086
  const extractPrependedData = getOptionValue$1(zipReader, options, OPTION_EXTRACT_PREPENDED_DATA);
5004
5087
  const extractAppendedData = getOptionValue$1(zipReader, options, OPTION_EXTRACT_APPENDED_DATA);
5088
+ const splitZipSignatureLength = (checkAmbiguity || extractPrependedData) && filesLength &&
5089
+ startOffset == SPLIT_ZIP_FILE_SIGNATURE_LENGTH && await startsWithSplitZipMarker(reader) ? SPLIT_ZIP_FILE_SIGNATURE_LENGTH : 0;
5090
+ if (checkAmbiguity && (prependedDataLength || (filesLength && startOffset > splitZipSignatureLength))) {
5091
+ throwAmbiguousArchive("prepended data");
5092
+ }
5005
5093
  if (extractPrependedData) {
5006
- zipReader.prependedData = startOffset > 0 ? await readUint8Array(reader, 0, startOffset) : EMPTY_UINT8_ARRAY;
5094
+ zipReader.prependedData = startOffset > splitZipSignatureLength ?
5095
+ await readUint8Array(reader, splitZipSignatureLength, startOffset - splitZipSignatureLength) :
5096
+ EMPTY_UINT8_ARRAY;
5007
5097
  }
5008
5098
  zipReader.comment = commentLength ? await readUint8Array(reader, commentOffset + END_OF_CENTRAL_DIR_LENGTH, commentLength) : EMPTY_UINT8_ARRAY;
5009
5099
  if (extractAppendedData) {
@@ -5070,16 +5160,16 @@
5070
5160
 
5071
5161
  let ZipEntry$1 = class ZipEntry {
5072
5162
 
5073
- constructor(reader, config, options) {
5163
+ constructor(reader, options) {
5074
5164
  Object.assign(this, {
5075
5165
  reader,
5076
- config,
5077
5166
  options
5078
5167
  });
5079
5168
  }
5080
5169
 
5081
5170
  async getData(writer, fileEntry, readRanges, options = {}) {
5082
5171
  const zipEntry = this;
5172
+ const config = getConfiguration();
5083
5173
  const {
5084
5174
  reader,
5085
5175
  index,
@@ -5088,7 +5178,6 @@
5088
5178
  extraFieldAES,
5089
5179
  extraFieldZip64,
5090
5180
  compressionMethod,
5091
- config,
5092
5181
  bitFlag,
5093
5182
  rawBitFlag,
5094
5183
  crc32,
@@ -5106,6 +5195,7 @@
5106
5195
  let password = getOptionValue$1(zipEntry, options, OPTION_PASSWORD);
5107
5196
  let rawPassword = getOptionValue$1(zipEntry, options, OPTION_RAW_PASSWORD);
5108
5197
  const passThrough = getOptionValue$1(zipEntry, options, OPTION_PASS_THROUGH);
5198
+ checkPasswordOption(password, rawPassword);
5109
5199
  password = password && password.length && password;
5110
5200
  rawPassword = rawPassword && rawPassword.length && rawPassword;
5111
5201
  if (extraFieldAES) {
@@ -5113,7 +5203,7 @@
5113
5203
  throw new Error(ERR_UNSUPPORTED_COMPRESSION$1);
5114
5204
  }
5115
5205
  }
5116
- if (dataArray.length < HEADER_SIZE || getUint32(dataView, 0) != LOCAL_FILE_HEADER_SIGNATURE) {
5206
+ if (dataArray.length < HEADER_SIZE || getUint32$1(dataView, 0) != LOCAL_FILE_HEADER_SIGNATURE) {
5117
5207
  throw new Error(ERR_LOCAL_FILE_HEADER_NOT_FOUND);
5118
5208
  }
5119
5209
  readCommonHeader(localDirectory, dataView, 4);
@@ -5175,9 +5265,12 @@
5175
5265
  }
5176
5266
  }
5177
5267
  const dataOffset = localHeaderOffset + HEADER_SIZE + filenameLength + extraFieldLength;
5268
+ if (dataOffset + compressedSize > reader.size) {
5269
+ throw new Error(ERR_ENTRY_DATA_OUT_OF_BOUNDS);
5270
+ }
5178
5271
  const size = compressedSize;
5179
5272
  const readable = toCompatibleReadable(reader.createReadable({ offset: dataOffset, size }));
5180
- const signal = getOptionValue$1(zipEntry, options, OPTION_SIGNAL);
5273
+ const signal = checkSignalOption(getOptionValue$1(zipEntry, options, OPTION_SIGNAL));
5181
5274
  const checkPasswordOnly = getOptionValue$1(zipEntry, options, OPTION_CHECK_PASSWORD_ONLY);
5182
5275
  let checkOverlappingEntry = getOptionValue$1(zipEntry, options, OPTION_CHECK_OVERLAPPING_ENTRY);
5183
5276
  const checkOverlappingEntryOnly = getOptionValue$1(zipEntry, options, OPTION_CHECK_OVERLAPPING_ENTRY_ONLY);
@@ -5185,6 +5278,8 @@
5185
5278
  checkOverlappingEntry = true;
5186
5279
  }
5187
5280
  const { onstart, onprogress, onend } = options;
5281
+ const compressed = compressionMethod != COMPRESSION_METHOD_STORE && !passThrough;
5282
+ const outputSize = passThrough ? compressedSize : uncompressedSize;
5188
5283
  const deflate64 = compressionMethod == COMPRESSION_METHOD_DEFLATE_64;
5189
5284
  let useCompressionStream = getOptionValue$1(zipEntry, options, OPTION_USE_COMPRESSION_STREAM);
5190
5285
  if (deflate64) {
@@ -5205,9 +5300,9 @@
5205
5300
  checkCrc32,
5206
5301
  checkAuthenticationCode: getOptionValue$1(zipEntry, options, OPTION_CHECK_AUTHENTICATION_CODE),
5207
5302
  passwordVerification: zipCrypto && (dataDescriptor ? ((rawLastModDate >>> 8) & MAX_8_BITS) : ((crc32 >>> 24) & MAX_8_BITS)),
5208
- outputSize: passThrough ? compressedSize : uncompressedSize,
5303
+ outputSize,
5209
5304
  crc32,
5210
- compressed: compressionMethod != 0 && !passThrough,
5305
+ compressed,
5211
5306
  encrypted,
5212
5307
  useWebWorkers: getOptionValue$1(zipEntry, options, OPTION_USE_WEB_WORKERS),
5213
5308
  useCompressionStream,
@@ -5244,11 +5339,11 @@
5244
5339
  writer = new WritableStream();
5245
5340
  }
5246
5341
  writer = new GenericWriter(writer);
5247
- await initStream(writer, passThrough ? compressedSize : uncompressedSize);
5342
+ await initStream(writer, getDecodableOutputSize(outputSize, compressedSize, compressed));
5248
5343
  ({ writable } = writer);
5249
- const { outputSize } = await runWorker({ readable, writable }, workerOptions);
5250
- writer.size += outputSize;
5251
- if (outputSize != (passThrough ? compressedSize : uncompressedSize)) {
5344
+ const { outputSize: writtenSize } = await runWorker({ readable, writable }, workerOptions);
5345
+ writer.size += writtenSize;
5346
+ if (writtenSize != outputSize) {
5252
5347
  throw new Error(ERR_INVALID_UNCOMPRESSED_SIZE);
5253
5348
  }
5254
5349
  }
@@ -5282,26 +5377,47 @@
5282
5377
  function detectEncryptedCentralDirectory(directoryView) {
5283
5378
  const maxOffset = Math.min(directoryView.byteLength, 1024) - 3;
5284
5379
  for (let offset = 0; offset < maxOffset; offset++) {
5285
- if (getUint32(directoryView, offset) == ARCHIVE_EXTRA_DATA_SIGNATURE) {
5380
+ if (getUint32$1(directoryView, offset) == ARCHIVE_EXTRA_DATA_SIGNATURE) {
5286
5381
  return true;
5287
5382
  }
5288
5383
  }
5289
5384
  return false;
5290
5385
  }
5291
5386
 
5387
+ function readDigitalSignature(signatureRecordArray) {
5388
+ if (signatureRecordArray.length >= 6) {
5389
+ const signatureRecordView = getDataView(signatureRecordArray);
5390
+ if (getUint32$1(signatureRecordView, 0) == DIGITAL_SIGNATURE_RECORD_SIGNATURE) {
5391
+ const signatureDataLength = getUint16$1(signatureRecordView, 4);
5392
+ if (6 + signatureDataLength <= signatureRecordArray.length) {
5393
+ return signatureRecordArray.subarray(6, 6 + signatureDataLength);
5394
+ }
5395
+ }
5396
+ }
5397
+ }
5398
+
5399
+ function getEncryptedDirectoryDataLength(directoryEncryptionInfo, declaredDirectoryDataLength, directoryDataLength) {
5400
+ const encryptedDirectoryDataLength = directoryEncryptionInfo && directoryEncryptionInfo.compressedSize ?
5401
+ directoryEncryptionInfo.compressedSize :
5402
+ declaredDirectoryDataLength;
5403
+ return encryptedDirectoryDataLength > 0 && encryptedDirectoryDataLength <= directoryDataLength ?
5404
+ encryptedDirectoryDataLength :
5405
+ directoryDataLength;
5406
+ }
5407
+
5292
5408
  function getDirectoryEncryptionInfo(rawExtensibleData) {
5293
5409
  const directoryEncryptionInfo = { rawExtensibleData };
5294
5410
  if (rawExtensibleData.length >= 28) {
5295
5411
  const extensibleDataView = getDataView(rawExtensibleData);
5296
- const hashDataLength = getUint16(extensibleDataView, 26);
5412
+ const hashDataLength = getUint16$1(extensibleDataView, 26);
5297
5413
  Object.assign(directoryEncryptionInfo, {
5298
- compressionMethod: getUint16(extensibleDataView, 0),
5414
+ compressionMethod: getUint16$1(extensibleDataView, 0),
5299
5415
  compressedSize: Number(getBigUint64(extensibleDataView, 2)),
5300
5416
  uncompressedSize: Number(getBigUint64(extensibleDataView, 10)),
5301
- encryptionAlgorithm: getUint16(extensibleDataView, 18),
5302
- bitLength: getUint16(extensibleDataView, 20),
5303
- flags: getUint16(extensibleDataView, 22),
5304
- hashAlgorithm: getUint16(extensibleDataView, 24),
5417
+ encryptionAlgorithm: getUint16$1(extensibleDataView, 18),
5418
+ bitLength: getUint16$1(extensibleDataView, 20),
5419
+ flags: getUint16$1(extensibleDataView, 22),
5420
+ hashAlgorithm: getUint16$1(extensibleDataView, 24),
5305
5421
  hashData: rawExtensibleData.subarray(28, 28 + hashDataLength)
5306
5422
  });
5307
5423
  }
@@ -5309,12 +5425,12 @@
5309
5425
  }
5310
5426
 
5311
5427
  function readCommonHeader(directory, dataView, offset) {
5312
- const rawBitFlag = directory.rawBitFlag = getUint16(dataView, offset + 2);
5428
+ const rawBitFlag = directory.rawBitFlag = getUint16$1(dataView, offset + 2);
5313
5429
  const encrypted = (rawBitFlag & BITFLAG_ENCRYPTED) == BITFLAG_ENCRYPTED;
5314
- const rawLastModDate = getUint32(dataView, offset + 6);
5430
+ const rawLastModDate = getUint32$1(dataView, offset + 6);
5315
5431
  Object.assign(directory, {
5316
5432
  encrypted,
5317
- version: getUint16(dataView, offset),
5433
+ version: getUint16$1(dataView, offset),
5318
5434
  bitFlag: {
5319
5435
  level: (rawBitFlag & BITFLAG_LEVEL) >> 1,
5320
5436
  dataDescriptor: (rawBitFlag & BITFLAG_DATA_DESCRIPTOR) == BITFLAG_DATA_DESCRIPTOR,
@@ -5322,8 +5438,8 @@
5322
5438
  },
5323
5439
  rawLastModDate,
5324
5440
  lastModDate: getDate(rawLastModDate),
5325
- filenameLength: getUint16(dataView, offset + 22),
5326
- extraFieldLength: getUint16(dataView, offset + 24)
5441
+ filenameLength: getUint16$1(dataView, offset + 22),
5442
+ extraFieldLength: getUint16$1(dataView, offset + 24)
5327
5443
  });
5328
5444
  }
5329
5445
 
@@ -5334,8 +5450,8 @@
5334
5450
  let offsetExtraField = 0;
5335
5451
  try {
5336
5452
  while (offsetExtraField < rawExtraField.length) {
5337
- const type = getUint16(rawExtraFieldView, offsetExtraField);
5338
- const size = getUint16(rawExtraFieldView, offsetExtraField + 2);
5453
+ const type = getUint16$1(rawExtraFieldView, offsetExtraField);
5454
+ const size = getUint16$1(rawExtraFieldView, offsetExtraField + 2);
5339
5455
  extraField.set(type, {
5340
5456
  type,
5341
5457
  data: rawExtraField.slice(offsetExtraField + 4, offsetExtraField + 4 + size)
@@ -5345,12 +5461,12 @@
5345
5461
  } catch {
5346
5462
  // ignored
5347
5463
  }
5348
- const compressionMethod = getUint16(dataView, offset + 4);
5464
+ const compressionMethod = getUint16$1(dataView, offset + 4);
5349
5465
  Object.assign(directory, {
5350
- signature: getUint32(dataView, offset + HEADER_OFFSET_SIGNATURE),
5351
- crc32: getUint32(dataView, offset + HEADER_OFFSET_SIGNATURE),
5352
- compressedSize: getUint32(dataView, offset + HEADER_OFFSET_COMPRESSED_SIZE),
5353
- uncompressedSize: getUint32(dataView, offset + HEADER_OFFSET_UNCOMPRESSED_SIZE)
5466
+ signature: getUint32$1(dataView, offset + HEADER_OFFSET_SIGNATURE),
5467
+ crc32: getUint32$1(dataView, offset + HEADER_OFFSET_SIGNATURE),
5468
+ compressedSize: getUint32$1(dataView, offset + HEADER_OFFSET_COMPRESSED_SIZE),
5469
+ uncompressedSize: getUint32$1(dataView, offset + HEADER_OFFSET_UNCOMPRESSED_SIZE)
5354
5470
  });
5355
5471
  const extraFieldZip64 = extraField.get(EXTRAFIELD_TYPE_ZIP64);
5356
5472
  if (extraFieldZip64) {
@@ -5439,11 +5555,11 @@
5439
5555
  computedCrc32.append(fileEntry[rawPropertyName]);
5440
5556
  const computedCrc32View = getDataView(new Uint8Array(4));
5441
5557
  computedCrc32View.setUint32(0, computedCrc32.get(), true);
5442
- const nameCrc32 = getUint32(extraFieldView, 1);
5558
+ const nameCrc32 = getUint32$1(extraFieldView, 1);
5443
5559
  Object.assign(extraFieldUnicode, {
5444
5560
  version: getUint8(extraFieldView, 0),
5445
5561
  [propertyName]: decodeText(extraFieldUnicode.data.subarray(5)),
5446
- valid: !fileEntry.bitFlag.languageEncodingFlag && nameCrc32 == getUint32(computedCrc32View, 0)
5562
+ valid: !fileEntry.bitFlag.languageEncodingFlag && nameCrc32 == getUint32$1(computedCrc32View, 0)
5447
5563
  });
5448
5564
  if (extraFieldUnicode.valid) {
5449
5565
  directory[propertyName] = extraFieldUnicode[propertyName];
@@ -5459,7 +5575,7 @@
5459
5575
  vendorId: getUint8(extraFieldView, 2),
5460
5576
  strength,
5461
5577
  originalCompressionMethod: compressionMethod,
5462
- compressionMethod: getUint16(extraFieldView, 5)
5578
+ compressionMethod: getUint16$1(extraFieldView, 5)
5463
5579
  });
5464
5580
  directory.compressionMethod = extraFieldAES.compressionMethod;
5465
5581
  if (extraFieldAES.vendorVersion != VENDOR_VERSION_AE_1$1) {
@@ -5473,8 +5589,8 @@
5473
5589
  let tag1Data;
5474
5590
  try {
5475
5591
  while (offsetExtraField < extraFieldNTFS.data.length && !tag1Data) {
5476
- const tagValue = getUint16(extraFieldView, offsetExtraField);
5477
- const attributeSize = getUint16(extraFieldView, offsetExtraField + 2);
5592
+ const tagValue = getUint16$1(extraFieldView, offsetExtraField);
5593
+ const attributeSize = getUint16$1(extraFieldView, offsetExtraField + 2);
5478
5594
  if (tagValue == EXTRAFIELD_TYPE_NTFS_TAG1) {
5479
5595
  tag1Data = extraFieldNTFS.data.slice(offsetExtraField + 4, offsetExtraField + 4 + attributeSize);
5480
5596
  }
@@ -5507,12 +5623,12 @@
5507
5623
  return;
5508
5624
  }
5509
5625
  const extraFieldView = getDataView(extraField.data);
5510
- const lastAccessDate = new Date((getUint32(extraFieldView, 0) | 0) * 1000);
5511
- const lastModDate = new Date((getUint32(extraFieldView, 4) | 0) * 1000);
5626
+ const lastAccessDate = new Date((getUint32$1(extraFieldView, 0) | 0) * 1000);
5627
+ const lastModDate = new Date((getUint32$1(extraFieldView, 4) | 0) * 1000);
5512
5628
  const extraFieldData = { lastAccessDate, lastModDate };
5513
5629
  if (extraField.data.length >= 12) {
5514
- extraFieldData.uid = getUint16(extraFieldView, 8);
5515
- extraFieldData.gid = getUint16(extraFieldView, 10);
5630
+ extraFieldData.uid = getUint16$1(extraFieldView, 8);
5631
+ extraFieldData.gid = getUint16$1(extraFieldView, 10);
5516
5632
  }
5517
5633
  Object.assign(extraField, extraFieldData);
5518
5634
  Object.assign(directory, extraFieldData);
@@ -5532,8 +5648,8 @@
5532
5648
  gid = unpackUnixId(extraField.data.subarray(offset, offset + gidSize));
5533
5649
  Object.assign(extraField, { version, uid, gid });
5534
5650
  } else if (extraField.data.length >= 4) {
5535
- uid = getUint16(view, 0);
5536
- gid = getUint16(view, 2);
5651
+ uid = getUint16$1(view, 0);
5652
+ gid = getUint16$1(view, 2);
5537
5653
  Object.assign(extraField, { uid, gid });
5538
5654
  }
5539
5655
  if (uid !== UNDEFINED_VALUE) {
@@ -5583,7 +5699,7 @@
5583
5699
  let offset = 1;
5584
5700
  timeProperties.forEach((propertyName, indexProperty) => {
5585
5701
  if (extraFieldExtendedTimestamp.data.length >= offset + 4) {
5586
- const time = getUint32(extraFieldView, offset);
5702
+ const time = getUint32$1(extraFieldView, offset);
5587
5703
  directory[propertyName] = extraFieldExtendedTimestamp[propertyName] = new Date((time | 0) * 1000);
5588
5704
  const rawPropertyName = timeRawProperties[indexProperty];
5589
5705
  extraFieldExtendedTimestamp[rawPropertyName] = time;
@@ -5617,7 +5733,7 @@
5617
5733
  const dataDescriptorArray = await readUint8Array(reader, dataOffset + compressedSize, dataDescriptorLength + DATA_DESCRIPTOR_RECORD_SIGNATURE_LENGTH);
5618
5734
  const dataDescriptorView = getDataView(dataDescriptorArray);
5619
5735
  let signature = dataDescriptorArray.length == dataDescriptorLength + DATA_DESCRIPTOR_RECORD_SIGNATURE_LENGTH &&
5620
- getUint32(dataDescriptorView, 0) == DATA_DESCRIPTOR_RECORD_SIGNATURE;
5736
+ getUint32$1(dataDescriptorView, 0) == DATA_DESCRIPTOR_RECORD_SIGNATURE;
5621
5737
  if (signature) {
5622
5738
  const signedDataDescriptor = readDataDescriptor(dataDescriptorView, DATA_DESCRIPTOR_RECORD_SIGNATURE_LENGTH, extraFieldZip64);
5623
5739
  const matchCrc32 = (fileEntry.encrypted && !fileEntry.zipCrypto) || signedDataDescriptor.crc32 == crc32;
@@ -5651,15 +5767,15 @@
5651
5767
  }
5652
5768
 
5653
5769
  function readDataDescriptor(dataDescriptorView, offset, extraFieldZip64) {
5654
- const crc32 = getUint32(dataDescriptorView, offset);
5770
+ const crc32 = getUint32$1(dataDescriptorView, offset);
5655
5771
  let compressedSize;
5656
5772
  let uncompressedSize;
5657
5773
  if (extraFieldZip64) {
5658
5774
  compressedSize = getBigUint64(dataDescriptorView, offset + 4);
5659
5775
  uncompressedSize = getBigUint64(dataDescriptorView, offset + 12);
5660
5776
  } else {
5661
- compressedSize = getUint32(dataDescriptorView, offset + 4);
5662
- uncompressedSize = getUint32(dataDescriptorView, offset + 8);
5777
+ compressedSize = getUint32$1(dataDescriptorView, offset + 4);
5778
+ uncompressedSize = getUint32$1(dataDescriptorView, offset + 8);
5663
5779
  }
5664
5780
  return { crc32, compressedSize, uncompressedSize };
5665
5781
  }
@@ -5668,10 +5784,28 @@
5668
5784
  return reader.getDiskOffset ? reader.getDiskOffset(diskNumber) : 0;
5669
5785
  }
5670
5786
 
5787
+ async function startsWithSplitZipSignature$1(reader) {
5788
+ return await getFirstSignature(reader) == SPLIT_ZIP_FILE_SIGNATURE;
5789
+ }
5790
+
5791
+ async function startsWithSplitZipMarker(reader) {
5792
+ const signature = await getFirstSignature(reader);
5793
+ return signature == SPLIT_ZIP_FILE_SIGNATURE || signature == TEMPORARY_SPLIT_ZIP_FILE_SIGNATURE;
5794
+ }
5795
+
5796
+ async function getFirstSignature(reader) {
5797
+ const signatureArray = await readUint8Array(reader, 0, SPLIT_ZIP_FILE_SIGNATURE_LENGTH);
5798
+ return getUint32$1(getDataView(signatureArray));
5799
+ }
5800
+
5671
5801
  function isStrictnessValue(value) {
5672
5802
  return value === STRICTNESS_STRICT || value === STRICTNESS_BALANCED || value === STRICTNESS_TOLERANT;
5673
5803
  }
5674
5804
 
5805
+ function getDecodableOutputSize(outputSize, compressedSize, compressed) {
5806
+ return Math.min(outputSize, compressed ? compressedSize * MAX_DEFLATE_EXPANSION_RATIO : compressedSize);
5807
+ }
5808
+
5675
5809
  function getStrictness(options, inheritedOptions) {
5676
5810
  return resolveStrictness(options, resolveStrictness(inheritedOptions, STRICTNESS_BALANCED));
5677
5811
  }
@@ -5734,7 +5868,7 @@
5734
5868
 
5735
5869
  function getMaxAppendedDataSize(maxAppendedDataSize, strictness) {
5736
5870
  if (maxAppendedDataSize !== UNDEFINED_VALUE) {
5737
- const size = toNumber$1(maxAppendedDataSize);
5871
+ const size = toNumber(maxAppendedDataSize);
5738
5872
  if (typeof size != NUMBER_TYPE || Number.isNaN(size) || size < 0) {
5739
5873
  throw new Error(ERR_INVALID_MAX_APPENDED_DATA_SIZE);
5740
5874
  }
@@ -5757,7 +5891,7 @@
5757
5891
  let plausibleEndOfDirectoryInfo;
5758
5892
  let endOfDirectoryReachingEndCount = 0;
5759
5893
  for await (const [anchoredView, anchoredOffset, anchoredArray, indexByte, offset] of scanEndOfCentralDirectory(reader, anchoredLength)) {
5760
- const commentLength = getUint16(anchoredView, indexByte + 20);
5894
+ const commentLength = getUint16$1(anchoredView, indexByte + 20);
5761
5895
  if (offset + END_OF_CENTRAL_DIR_LENGTH + commentLength == size) {
5762
5896
  const reachability = await getCentralDirectoryReachability(reader, anchoredView, anchoredOffset, indexByte, offset, size, remoteProbeBudget);
5763
5897
  if (reachability == CENTRAL_DIRECTORY_REACHABLE) {
@@ -5808,7 +5942,7 @@
5808
5942
  const scanArray = await readUint8Array(reader, scanOffset, scanLength);
5809
5943
  const scanView = getDataView(scanArray);
5810
5944
  for (let indexByte = scanArray.length - END_OF_CENTRAL_DIR_LENGTH; indexByte >= 0; indexByte--) {
5811
- if (getUint32(scanView, indexByte) == END_OF_CENTRAL_DIR_SIGNATURE) {
5945
+ if (getUint32$1(scanView, indexByte) == END_OF_CENTRAL_DIR_SIGNATURE) {
5812
5946
  yield [scanView, scanOffset, scanArray, indexByte, scanOffset + indexByte];
5813
5947
  }
5814
5948
  }
@@ -5819,9 +5953,9 @@
5819
5953
  }
5820
5954
 
5821
5955
  async function getCentralDirectoryReachability(reader, view, anchoredOffset, indexByte, offset, size, remoteProbeBudget) {
5822
- const filesLength = getUint16(view, indexByte + 10);
5823
- const directoryDataLength = getUint32(view, indexByte + 12);
5824
- const directoryDataOffset = getUint32(view, indexByte + 16);
5956
+ const filesLength = getUint16$1(view, indexByte + 10);
5957
+ const directoryDataLength = getUint32$1(view, indexByte + 12);
5958
+ const directoryDataOffset = getUint32$1(view, indexByte + 16);
5825
5959
  if (filesLength == MAX_16_BITS || directoryDataLength == MAX_32_BITS || directoryDataOffset == MAX_32_BITS) {
5826
5960
  const locatorSignature = await readSignature(reader, view, anchoredOffset, offset - ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH, size, remoteProbeBudget);
5827
5961
  return locatorSignature == ZIP64_END_OF_CENTRAL_DIR_LOCATOR_SIGNATURE ? CENTRAL_DIRECTORY_REACHABLE : CENTRAL_DIRECTORY_UNREACHABLE;
@@ -5829,7 +5963,7 @@
5829
5963
  if (!filesLength && !directoryDataLength) {
5830
5964
  return CENTRAL_DIRECTORY_PLAUSIBLE;
5831
5965
  }
5832
- const directoryDiskNumber = getUint16(view, indexByte + 6);
5966
+ const directoryDiskNumber = getUint16$1(view, indexByte + 6);
5833
5967
  for (const centralDirectoryOffset of [offset - directoryDataLength, getDiskOffset$1(reader, directoryDiskNumber) + directoryDataOffset]) {
5834
5968
  if (await readSignature(reader, view, anchoredOffset, centralDirectoryOffset, size, remoteProbeBudget) == CENTRAL_FILE_HEADER_SIGNATURE) {
5835
5969
  return CENTRAL_DIRECTORY_REACHABLE;
@@ -5843,19 +5977,21 @@
5843
5977
  return UNDEFINED_VALUE;
5844
5978
  }
5845
5979
  if (signatureOffset >= anchoredOffset) {
5846
- return getUint32(view, signatureOffset - anchoredOffset);
5980
+ return getUint32$1(view, signatureOffset - anchoredOffset);
5847
5981
  }
5848
5982
  if (remoteProbeBudget.count > 0) {
5849
5983
  remoteProbeBudget.count--;
5850
5984
  const signatureArray = await readUint8Array(reader, signatureOffset, 4);
5851
- return getUint32(getDataView(signatureArray), 0);
5985
+ return getUint32$1(getDataView(signatureArray), 0);
5852
5986
  }
5853
5987
  return UNDEFINED_VALUE;
5854
5988
  }
5855
5989
 
5856
5990
  function validateLocalDirectory(zipEntry, localDirectory, rawLocalFilename, checkLocalFilename) {
5857
5991
  const { rawFilename } = zipEntry;
5858
- if (checkLocalFilename &&
5992
+ const maskedLocalDirectory = zipEntry.decryptedDirectory &&
5993
+ (localDirectory.rawBitFlag & BITFLAG_MASKED_LOCAL_HEADERS) == BITFLAG_MASKED_LOCAL_HEADERS;
5994
+ if (checkLocalFilename && !maskedLocalDirectory &&
5859
5995
  (rawLocalFilename.length != rawFilename.length ||
5860
5996
  rawLocalFilename.some((byteValue, indexByte) => byteValue != rawFilename[indexByte]))) {
5861
5997
  throwAmbiguousArchive("mismatched local file header (filename)");
@@ -5866,7 +6002,7 @@
5866
6002
  if (localDirectory.compressionMethod != zipEntry.compressionMethod) {
5867
6003
  throwAmbiguousArchive("mismatched local file header (compression method)");
5868
6004
  }
5869
- if (!localDirectory.bitFlag.dataDescriptor &&
6005
+ if (!localDirectory.bitFlag.dataDescriptor && !maskedLocalDirectory &&
5870
6006
  (localDirectory.crc32 || localDirectory.compressedSize || localDirectory.uncompressedSize) &&
5871
6007
  (localDirectory.crc32 != zipEntry.crc32 ||
5872
6008
  localDirectory.compressedSize != zipEntry.compressedSize ||
@@ -5885,10 +6021,11 @@
5885
6021
  return options[name] === UNDEFINED_VALUE ? zipReader.options[name] : options[name];
5886
6022
  }
5887
6023
 
5888
- function toNumber$1(value) {
5889
- return typeof value == STRING_TYPE && value.trim() ? Number(value) : value;
6024
+ function getFunctionOptionValue$1(zipReader, options, name) {
6025
+ return checkFunctionOption(getOptionValue$1(zipReader, options, name));
5890
6026
  }
5891
6027
 
6028
+
5892
6029
  function getDate(timeRaw) {
5893
6030
  const date = (timeRaw & 0xffff0000) >> 16, time = timeRaw & MAX_16_BITS;
5894
6031
  return new Date(1980 + ((date & 0xFE00) >> 9), ((date & 0x01E0) >> 5) - 1, date & 0x001F, (time & 0xF800) >> 11, (time & 0x07E0) >> 5, (time & 0x001F) * 2, 0);
@@ -5902,11 +6039,11 @@
5902
6039
  return view.getUint8(offset);
5903
6040
  }
5904
6041
 
5905
- function getUint16(view, offset) {
6042
+ function getUint16$1(view, offset) {
5906
6043
  return view.getUint16(offset, true);
5907
6044
  }
5908
6045
 
5909
- function getUint32(view, offset) {
6046
+ function getUint32$1(view, offset) {
5910
6047
  return view.getUint32(offset, true);
5911
6048
  }
5912
6049
 
@@ -5921,6 +6058,7 @@
5921
6058
  ERR_CENTRAL_DIRECTORY_NOT_FOUND: ERR_CENTRAL_DIRECTORY_NOT_FOUND,
5922
6059
  ERR_ENCRYPTED: ERR_ENCRYPTED,
5923
6060
  ERR_ENCRYPTED_CENTRAL_DIRECTORY: ERR_ENCRYPTED_CENTRAL_DIRECTORY,
6061
+ ERR_ENTRY_DATA_OUT_OF_BOUNDS: ERR_ENTRY_DATA_OUT_OF_BOUNDS,
5924
6062
  ERR_EOCDR_LOCATOR_ZIP64_NOT_FOUND: ERR_EOCDR_LOCATOR_ZIP64_NOT_FOUND,
5925
6063
  ERR_EOCDR_NOT_FOUND: ERR_EOCDR_NOT_FOUND,
5926
6064
  ERR_EXTRAFIELD_ZIP64_NOT_FOUND: ERR_EXTRAFIELD_ZIP64_NOT_FOUND,
@@ -5977,12 +6115,16 @@
5977
6115
  const ERR_INVALID_COMMENT = "Zip file comment exceeds 64KB";
5978
6116
  const ERR_INVALID_COMMENT_TYPE = "Invalid zip file comment (must be a Uint8Array)";
5979
6117
  const ERR_INVALID_ENTRY_COMMENT = "File entry comment exceeds 64KB";
6118
+ const ERR_INVALID_ENTRY_COMMENT_TYPE = "Invalid file entry comment (must be a string)";
6119
+ const ERR_INVALID_DATE = "Invalid date (must be a valid Date instance)";
5980
6120
  const ERR_INVALID_ENTRY_NAME = "File entry name exceeds 64KB";
5981
6121
  const ERR_INVALID_VERSION = "Version exceeds 65535";
5982
6122
  const ERR_INVALID_ENCRYPTION_STRENGTH = "The strength must equal 1, 2, or 3";
5983
6123
  const ERR_UNSUPPORTED_ENCRYPTION_USDZ = "Encryption is not supported in USDZ files";
5984
6124
  const ERR_UNSUPPORTED_ENCRYPTION_PASS_THROUGH = "Encryption is not supported when the 'passThrough' option is set";
5985
- const ERR_INVALID_EXTRAFIELD_TYPE = "Extra field type exceeds 65535";
6125
+ const ERR_INVALID_EXTRAFIELD = "Invalid extra field (must be a Map)";
6126
+ const ERR_INVALID_EXTRAFIELD_TYPE = "Invalid extra field type (must be integer 0..65535)";
6127
+ const ERR_INVALID_EXTRAFIELD_DATA_TYPE = "Invalid extra field data (must be a Uint8Array)";
5986
6128
  const ERR_INVALID_EXTRAFIELD_DATA = "Extra field data exceeds 64KB";
5987
6129
  const ERR_UNSUPPORTED_COMPRESSION = "Compression method not supported";
5988
6130
  const MIN_UNIX_TIME = -2147483648;
@@ -5991,6 +6133,7 @@
5991
6133
  const MAX_NTFS_TIME = BigInt("0x7fffffffffffffff");
5992
6134
  const ERR_UNSUPPORTED_FORMAT = "Zip64 is not supported (set the 'zip64' option to 'true')";
5993
6135
  const ERR_UNDEFINED_UNCOMPRESSED_SIZE = "Undefined uncompressed size";
6136
+ const ERR_UNDEFINED_COMPRESSION_METHOD = "Undefined compression method";
5994
6137
  const ERR_UNDETERMINED_SIZE = "Undetermined size";
5995
6138
  const ERR_UNDEFINED_READER = "Undefined reader";
5996
6139
  const ERR_ZIP_NOT_EMPTY = "Zip file not empty";
@@ -6002,7 +6145,6 @@
6002
6145
  const ERR_INVALID_MSDOS_ATTRIBUTES = "Invalid msdosAttributesRaw (must be integer 0..255)";
6003
6146
  const ERR_INVALID_MSDOS_DATA = "Invalid msdosAttributes (must be an object with boolean flags)";
6004
6147
  const ERR_INVALID_LEVEL = "Invalid level (must be integer 0..9)";
6005
- const ERR_INVALID_PASSWORD_TYPE = "Invalid password (password must be a string, rawPassword must be a Uint8Array)";
6006
6148
  const ERR_INVALID_SIGNATURE_DATA = "Signature data exceeds 64KB";
6007
6149
 
6008
6150
  const EXTRAFIELD_DATA_AES = new Uint8Array([0x07, 0x00, 0x02, 0x00, 0x41, 0x45, 0x03, 0x00, 0x00]);
@@ -6027,8 +6169,7 @@
6027
6169
  writer,
6028
6170
  addSplitZipSignature,
6029
6171
  options,
6030
- config: getConfiguration(),
6031
- files: new Map(),
6172
+ fileEntries: new Map(),
6032
6173
  filenames: new Set(),
6033
6174
  offset: options[OPTION_OFFSET] === UNDEFINED_VALUE ? writer.size || writer.writable.size || 0 : options[OPTION_OFFSET],
6034
6175
  initialOffset: options[OPTION_OFFSET] === UNDEFINED_VALUE ? 0 : options[OPTION_OFFSET] - (writer.size || writer.writable.size || 0),
@@ -6049,14 +6190,23 @@
6049
6190
  await initStream(reader);
6050
6191
  }
6051
6192
  const { ZipReader } = await Promise.resolve().then(function () { return zipReader; });
6052
- const zipReader$1 = new ZipReader(reader.readable);
6193
+ const zipReader$1 = new ZipReader(reader);
6053
6194
  const entries = await zipReader$1.getEntries();
6054
6195
  await zipReader$1.close();
6055
6196
  await initStream(this.writer);
6056
- await reader.readable.pipeTo(this.writer.writable, { preventClose: true, preventAbort: true });
6057
- this.writer.size = this.offset = reader.size;
6197
+ const { directoryOffset } = zipReader$1;
6198
+ let splitZipSignatureLength = 0;
6199
+ if (this.addSplitZipSignature) {
6200
+ delete this.addSplitZipSignature;
6201
+ if (!await startsWithSplitZipSignature(reader)) {
6202
+ await writeData(this.writer, getSplitZipSignatureArray());
6203
+ splitZipSignatureLength = SPLIT_ZIP_FILE_SIGNATURE_LENGTH;
6204
+ this.offset += splitZipSignatureLength;
6205
+ }
6206
+ }
6207
+ const entryPositions = await copyZipData(this, reader, entries, directoryOffset, splitZipSignatureLength);
6058
6208
  this.filenames = new Set(entries.map(entry => entry.filename));
6059
- this.files = new Map(entries.map(entry => {
6209
+ this.fileEntries = new Map(entries.map(entry => {
6060
6210
  const {
6061
6211
  version,
6062
6212
  rawLastModDate,
@@ -6111,11 +6261,12 @@
6111
6261
  if (crc32 !== UNDEFINED_VALUE) {
6112
6262
  setUint32(headerView, HEADER_OFFSET_SIGNATURE, crc32);
6113
6263
  }
6264
+ const { offset, diskNumberStart } = entryPositions.get(entry);
6114
6265
  Object.assign(entry, {
6115
6266
  zip64UncompressedSize,
6116
6267
  zip64CompressedSize,
6117
- zip64Offset: zip64 && entry.offset >= MAX_32_BITS,
6118
- diskNumberStart: 0,
6268
+ offset,
6269
+ diskNumberStart,
6119
6270
  zip64DiskNumberStart: false,
6120
6271
  rawExtraFieldZip64,
6121
6272
  rawExtraFieldAES,
@@ -6135,11 +6286,8 @@
6135
6286
  async add(name = "", reader, options = {}) {
6136
6287
  const zipWriter = this;
6137
6288
  options = Object.assign({}, options);
6138
- const {
6139
- pendingAddFileCalls,
6140
- config
6141
- } = zipWriter;
6142
- if (workers < config.maxWorkers) {
6289
+ const { pendingAddFileCalls } = zipWriter;
6290
+ if (workers < getConfiguration().maxWorkers) {
6143
6291
  workers++;
6144
6292
  } else {
6145
6293
  await new Promise(resolve => pendingEntries.push(resolve));
@@ -6176,16 +6324,16 @@
6176
6324
  }
6177
6325
 
6178
6326
  remove(entry) {
6179
- const { filenames, files } = this;
6327
+ const { filenames, fileEntries } = this;
6180
6328
  // deno-lint-ignore valid-typeof
6181
6329
  if (typeof entry == STRING_TYPE) {
6182
- entry = files.get(entry);
6330
+ entry = fileEntries.get(entry);
6183
6331
  }
6184
6332
  if (entry && entry.filename !== UNDEFINED_VALUE) {
6185
6333
  const { filename } = entry;
6186
- if (filenames.has(filename) && files.has(filename)) {
6334
+ if (filenames.has(filename) && fileEntries.has(filename)) {
6187
6335
  filenames.delete(filename);
6188
- files.delete(filename);
6336
+ fileEntries.delete(filename);
6189
6337
  return true;
6190
6338
  }
6191
6339
  }
@@ -6282,12 +6430,12 @@
6282
6430
  const metadataInfo = resolveMetadata(zipWriter, name, options);
6283
6431
  const { comment } = metadataInfo;
6284
6432
  const extraField = options[PROPERTY_NAME_EXTRA_FIELD];
6285
- zipWriter.files.set(name, UNDEFINED_VALUE);
6433
+ zipWriter.fileEntries.set(name, UNDEFINED_VALUE);
6286
6434
  let fileEntry;
6287
6435
  try {
6288
6436
  const { resolvedOptions } = metadataInfo;
6289
6437
  if (resolvedOptions.level != 0 && resolvedOptions.compressionMethod === UNDEFINED_VALUE &&
6290
- !resolvedOptions.passThrough && !(await supportsDeflate(zipWriter.config))) {
6438
+ !resolvedOptions.passThrough && !(await supportsDeflate(getConfiguration()))) {
6291
6439
  resolvedOptions.level = 0;
6292
6440
  }
6293
6441
  const sizesInfo = await resolveSizes(zipWriter, reader, metadataInfo, options);
@@ -6305,7 +6453,7 @@
6305
6453
  const metadataSize = getLength(headerInfo.localHeaderArray, dataDescriptorInfo.dataDescriptorArray);
6306
6454
  fileEntry = await getFileEntry(zipWriter, name, reader, { headerInfo, dataDescriptorInfo, metadataSize }, options);
6307
6455
  } catch (error) {
6308
- zipWriter.files.delete(name);
6456
+ zipWriter.fileEntries.delete(name);
6309
6457
  throw error;
6310
6458
  }
6311
6459
  Object.assign(fileEntry, {
@@ -6349,9 +6497,9 @@
6349
6497
  if (unixExtraFieldType === UNDEFINED_VALUE && (uid !== UNDEFINED_VALUE || gid !== UNDEFINED_VALUE)) {
6350
6498
  unixExtraFieldType = INFOZIP_EXTRA_FIELD_TYPE$1;
6351
6499
  }
6352
- let msdosAttributesRaw = getOptionValue(zipWriter, options, PROPERTY_NAME_MSDOS_ATTRIBUTES_RAW);
6500
+ let msdosAttributesRaw = getNumberOptionValue(zipWriter, options, PROPERTY_NAME_MSDOS_ATTRIBUTES_RAW);
6353
6501
  let msdosAttributes = getOptionValue(zipWriter, options, PROPERTY_NAME_MSDOS_ATTRIBUTES);
6354
- const hasUnixMetadata = uid !== UNDEFINED_VALUE || gid !== UNDEFINED_VALUE || unixMode !== UNDEFINED_VALUE || unixExtraFieldType;
6502
+ const hasUnixMetadata = uid !== UNDEFINED_VALUE || gid !== UNDEFINED_VALUE || unixMode !== UNDEFINED_VALUE || unixExtraFieldType || executable;
6355
6503
  const hasMsDosProvided = msdosAttributesRaw !== UNDEFINED_VALUE || msdosAttributes !== UNDEFINED_VALUE;
6356
6504
  if (hasUnixMetadata) {
6357
6505
  msDosCompatible = false;
@@ -6360,10 +6508,10 @@
6360
6508
  msDosCompatible = true;
6361
6509
  versionMadeBy = (versionMadeBy & MAX_8_BITS);
6362
6510
  }
6363
- if (msdosAttributesRaw !== UNDEFINED_VALUE && (msdosAttributesRaw < 0 || msdosAttributesRaw > MAX_8_BITS)) {
6511
+ if (msdosAttributesRaw !== UNDEFINED_VALUE && (!Number.isInteger(msdosAttributesRaw) || msdosAttributesRaw < 0 || msdosAttributesRaw > MAX_8_BITS)) {
6364
6512
  throw new Error(ERR_INVALID_MSDOS_ATTRIBUTES);
6365
6513
  }
6366
- if (msdosAttributes && typeof msdosAttributes !== OBJECT_TYPE) {
6514
+ if (msdosAttributes && (typeof msdosAttributes !== OBJECT_TYPE || Array.isArray(msdosAttributes))) {
6367
6515
  throw new Error(ERR_INVALID_MSDOS_DATA);
6368
6516
  }
6369
6517
  if (versionMadeBy > MAX_16_BITS) {
@@ -6451,7 +6599,7 @@
6451
6599
  }
6452
6600
 
6453
6601
  function resolveMetadata(zipWriter, name, options) {
6454
- const encode = getOptionValue(zipWriter, options, OPTION_ENCODE_TEXT, encodeText);
6602
+ const encode = getFunctionOptionValue(zipWriter, options, OPTION_ENCODE_TEXT) || encodeText;
6455
6603
  let rawFilename = encode(name, TEXT_TYPE_FILENAME);
6456
6604
  if (rawFilename === UNDEFINED_VALUE) {
6457
6605
  rawFilename = encodeText(name);
@@ -6460,6 +6608,10 @@
6460
6608
  throw new Error(ERR_INVALID_ENTRY_NAME);
6461
6609
  }
6462
6610
  const comment = options[PROPERTY_NAME_COMMENT] || "";
6611
+ // deno-lint-ignore valid-typeof
6612
+ if (typeof comment != STRING_TYPE) {
6613
+ throw new Error(ERR_INVALID_ENTRY_COMMENT_TYPE);
6614
+ }
6463
6615
  let rawComment = encode(comment, TEXT_TYPE_COMMENT);
6464
6616
  if (rawComment === UNDEFINED_VALUE) {
6465
6617
  rawComment = encodeText(comment);
@@ -6471,16 +6623,14 @@
6471
6623
  if (version > MAX_16_BITS) {
6472
6624
  throw new Error(ERR_INVALID_VERSION);
6473
6625
  }
6474
- const lastModDate = getOptionValue(zipWriter, options, PROPERTY_NAME_LAST_MODIFICATION_DATE, new Date());
6475
- const lastAccessDate = getOptionValue(zipWriter, options, PROPERTY_NAME_LAST_ACCESS_DATE);
6476
- const creationDate = getOptionValue(zipWriter, options, PROPERTY_NAME_CREATION_DATE);
6626
+ const lastModDate = getDateOptionValue(zipWriter, options, PROPERTY_NAME_LAST_MODIFICATION_DATE, new Date());
6627
+ const lastAccessDate = getDateOptionValue(zipWriter, options, PROPERTY_NAME_LAST_ACCESS_DATE);
6628
+ const creationDate = getDateOptionValue(zipWriter, options, PROPERTY_NAME_CREATION_DATE);
6477
6629
  const internalFileAttributes = getAliasedOptionValue(zipWriter, options, PROPERTY_NAME_INTERNAL_FILE_ATTRIBUTES, PROPERTY_NAME_DEPRECATED_INTERNAL_FILE_ATTRIBUTES, 0);
6478
6630
  const passThrough = getOptionValue(zipWriter, options, OPTION_PASS_THROUGH);
6479
6631
  const password = getOptionValue(zipWriter, options, OPTION_PASSWORD);
6480
6632
  const rawPassword = getOptionValue(zipWriter, options, OPTION_RAW_PASSWORD);
6481
- if ((password && typeof password != STRING_TYPE) || (rawPassword && !(rawPassword instanceof Uint8Array))) {
6482
- throw new Error(ERR_INVALID_PASSWORD_TYPE);
6483
- }
6633
+ checkPasswordOption(password, rawPassword);
6484
6634
  const encryptionStrength = getNumberOptionValue(zipWriter, options, OPTION_ENCRYPTION_STRENGTH, 3);
6485
6635
  const zipCrypto = getOptionValue(zipWriter, options, PROPERTY_NAME_ZIPCRYPTO);
6486
6636
  const extendedTimestamp = getOptionValue(zipWriter, options, OPTION_EXTENDED_TIMESTAMP, true);
@@ -6489,9 +6639,9 @@
6489
6639
  const useWebWorkers = getOptionValue(zipWriter, options, OPTION_USE_WEB_WORKERS);
6490
6640
  const transferStreams = getOptionValue(zipWriter, options, OPTION_TRANSFER_STREAMS);
6491
6641
  const bufferedWrite = getOptionValue(zipWriter, options, OPTION_BUFFERED_WRITE);
6492
- const createTempStream = getOptionValue(zipWriter, options, OPTION_CREATE_TEMP_STREAM);
6642
+ const createTempStream = getFunctionOptionValue(zipWriter, options, OPTION_CREATE_TEMP_STREAM);
6493
6643
  const dataDescriptorSignature = getOptionValue(zipWriter, options, OPTION_DATA_DESCRIPTOR_SIGNATURE, true);
6494
- const signal = getOptionValue(zipWriter, options, OPTION_SIGNAL);
6644
+ const signal = checkSignalOption(getOptionValue(zipWriter, options, OPTION_SIGNAL));
6495
6645
  const useUnicodeFileNames = getOptionValue(zipWriter, options, OPTION_USE_UNICODE_FILE_NAMES, true);
6496
6646
  const compressionMethod = getOptionValue(zipWriter, options, PROPERTY_NAME_COMPRESSION_METHOD);
6497
6647
  const registeredCodec = passThrough || compressionMethod === UNDEFINED_VALUE ? UNDEFINED_VALUE : getRegisteredCodec(compressionMethod);
@@ -6511,6 +6661,9 @@
6511
6661
  level = 0;
6512
6662
  }
6513
6663
  }
6664
+ if (passThrough) {
6665
+ level = UNDEFINED_VALUE;
6666
+ }
6514
6667
  let useCompressionStream = getOptionValue(zipWriter, options, OPTION_USE_COMPRESSION_STREAM);
6515
6668
  let dataDescriptor = getOptionValue(zipWriter, options, OPTION_DATA_DESCRIPTOR);
6516
6669
  if (bufferedWrite && dataDescriptor === UNDEFINED_VALUE) {
@@ -6571,18 +6724,26 @@
6571
6724
  if (!extraField) {
6572
6725
  return EMPTY_UINT8_ARRAY;
6573
6726
  }
6727
+ if (!(extraField instanceof Map)) {
6728
+ throw new Error(ERR_INVALID_EXTRAFIELD);
6729
+ }
6574
6730
  let extraFieldSize = 0;
6575
6731
  let offset = 0;
6576
- extraField.forEach(data => extraFieldSize += 4 + getLength(data));
6577
- const rawExtraField = new Uint8Array(extraFieldSize);
6578
- const rawExtraFieldView = getDataView(rawExtraField);
6579
6732
  extraField.forEach((data, type) => {
6580
- if (type > MAX_16_BITS) {
6733
+ if (!Number.isInteger(type) || type < 0 || type > MAX_16_BITS) {
6581
6734
  throw new Error(ERR_INVALID_EXTRAFIELD_TYPE);
6582
6735
  }
6736
+ if (!(data instanceof Uint8Array)) {
6737
+ throw new Error(ERR_INVALID_EXTRAFIELD_DATA_TYPE);
6738
+ }
6583
6739
  if (getLength(data) > MAX_16_BITS) {
6584
6740
  throw new Error(ERR_INVALID_EXTRAFIELD_DATA);
6585
6741
  }
6742
+ extraFieldSize += 4 + getLength(data);
6743
+ });
6744
+ const rawExtraField = new Uint8Array(extraFieldSize);
6745
+ const rawExtraFieldView = getDataView(rawExtraField);
6746
+ extraField.forEach((data, type) => {
6586
6747
  setUint16(rawExtraFieldView, offset, type);
6587
6748
  setUint16(rawExtraFieldView, offset + 2, getLength(data));
6588
6749
  arraySet(rawExtraField, data, offset + 4);
@@ -6614,6 +6775,9 @@
6614
6775
  if (uncompressedSize === UNDEFINED_VALUE) {
6615
6776
  throw new Error(ERR_UNDEFINED_UNCOMPRESSED_SIZE);
6616
6777
  }
6778
+ if (compressionMethod === UNDEFINED_VALUE) {
6779
+ throw new Error(ERR_UNDEFINED_COMPRESSION_METHOD);
6780
+ }
6617
6781
  }
6618
6782
  const zip64Enabled = zip64 === true;
6619
6783
  const encrypted = getOptionValue(zipWriter, options, PROPERTY_NAME_ENCRYPTED);
@@ -6669,8 +6833,8 @@
6669
6833
  }
6670
6834
 
6671
6835
  async function getEntriesSize(writerOptions, entries, writeOrderGuaranteed, comment) {
6672
- const zipWriter = { options: writerOptions, config: getConfiguration() };
6673
- if (writerOptions[OPTION_SIGN_CENTRAL_DIRECTORY]) {
6836
+ const zipWriter = { options: writerOptions };
6837
+ if (checkFunctionOption(writerOptions[OPTION_SIGN_CENTRAL_DIRECTORY])) {
6674
6838
  throw new Error(ERR_UNDETERMINED_SIZE);
6675
6839
  }
6676
6840
  if (comment !== UNDEFINED_VALUE && !(comment instanceof Uint8Array)) {
@@ -6696,7 +6860,7 @@
6696
6860
  ({ name } = attributesInfo);
6697
6861
  const { resolvedOptions: metadata } = resolveMetadata(zipWriter, name, options);
6698
6862
  if (metadata.level != 0 && metadata.compressionMethod === UNDEFINED_VALUE &&
6699
- !metadata.passThrough && !(await supportsDeflate(zipWriter.config))) {
6863
+ !metadata.passThrough && !(await supportsDeflate(getConfiguration()))) {
6700
6864
  metadata.level = 0;
6701
6865
  }
6702
6866
  const hasContent = !getOptionValue(zipWriter, options, PROPERTY_NAME_DIRECTORY);
@@ -6745,7 +6909,7 @@
6745
6909
 
6746
6910
  async function getFileEntry(zipWriter, name, reader, entryInfo, options) {
6747
6911
  const {
6748
- files,
6912
+ fileEntries,
6749
6913
  writer
6750
6914
  } = zipWriter;
6751
6915
  const {
@@ -6767,12 +6931,12 @@
6767
6931
  let writerSizeBeforeEntry;
6768
6932
  let flushedBufferedSize = 0;
6769
6933
  let fileWriter;
6770
- files.set(name, fileEntry);
6934
+ fileEntries.set(name, fileEntry);
6771
6935
  zipWriter.lastFileEntry = fileEntry;
6772
6936
  try {
6773
6937
  let lockPreviousFileEntry;
6774
6938
  if (keepOrder) {
6775
- lockPreviousFileEntry = previousFileEntry && previousFileEntry.lock;
6939
+ lockPreviousFileEntry = previousFileEntry && previousFileEntry.lockFileEntry;
6776
6940
  requestLockCurrentFileEntry();
6777
6941
  }
6778
6942
  if (options.bufferedWrite || !keepOrder || zipWriter.writerLocked || zipWriter.bufferedWrites || !dataDescriptor) {
@@ -6793,11 +6957,8 @@
6793
6957
  const diskOffset = getDiskOffset(writer);
6794
6958
  if (zipWriter.addSplitZipSignature) {
6795
6959
  delete zipWriter.addSplitZipSignature;
6796
- const signatureArray = new Uint8Array(4);
6797
- const signatureArrayView = getDataView(signatureArray);
6798
- setUint32(signatureArrayView, 0, SPLIT_ZIP_FILE_SIGNATURE);
6799
- await writeData(writer, signatureArray);
6800
- zipWriter.offset += 4;
6960
+ await writeData(writer, getSplitZipSignatureArray());
6961
+ zipWriter.offset += SPLIT_ZIP_FILE_SIGNATURE_LENGTH;
6801
6962
  }
6802
6963
  if (usdz && !bufferedWrite) {
6803
6964
  appendExtraFieldUSDZ(entryInfo, zipWriter.offset - diskOffset);
@@ -6815,11 +6976,11 @@
6815
6976
  writerSizeBeforeEntry = writer.size;
6816
6977
  await writeData(fileWriter, localHeaderArray);
6817
6978
  }
6818
- fileEntry = await createFileEntry(reader, fileWriter, fileEntry, entryInfo, zipWriter.config, options);
6979
+ fileEntry = await createFileEntry(reader, fileWriter, fileEntry, entryInfo, getConfiguration(), options);
6819
6980
  if (!bufferedWrite) {
6820
6981
  writingEntryData = false;
6821
6982
  }
6822
- files.set(name, fileEntry);
6983
+ fileEntries.set(name, fileEntry);
6823
6984
  fileEntry.filename = name;
6824
6985
  if (bufferedWrite) {
6825
6986
  await Promise.all([fileWriter.writable.getWriter().close(), lockPreviousFileEntry]);
@@ -6860,7 +7021,7 @@
6860
7021
  zipWriter.offset += flushedBufferedSize;
6861
7022
  }
6862
7023
  }
6863
- files.delete(name);
7024
+ fileEntries.delete(name);
6864
7025
  throw error;
6865
7026
  } finally {
6866
7027
  if (bufferedWrite) {
@@ -6882,7 +7043,7 @@
6882
7043
  }
6883
7044
 
6884
7045
  function requestLockCurrentFileEntry() {
6885
- fileEntry.lock = new Promise(resolve => releaseLockCurrentFileEntry = resolve);
7046
+ fileEntry.lockFileEntry = new Promise(resolve => releaseLockCurrentFileEntry = resolve);
6886
7047
  }
6887
7048
 
6888
7049
  async function requestLockWriter() {
@@ -6902,7 +7063,7 @@
6902
7063
  }
6903
7064
  }
6904
7065
 
6905
- async function createFileEntry(reader, writer, { diskNumberStart, lock }, entryInfo, config, options) {
7066
+ async function createFileEntry(reader, writer, { diskNumberStart, lockFileEntry }, entryInfo, config, options) {
6906
7067
  const {
6907
7068
  headerInfo,
6908
7069
  dataDescriptorInfo,
@@ -6970,7 +7131,7 @@
6970
7131
  codecURI
6971
7132
  } = options;
6972
7133
  const fileEntry = {
6973
- lock,
7134
+ lockFileEntry,
6974
7135
  versionMadeBy,
6975
7136
  zip64,
6976
7137
  directory: Boolean(directory),
@@ -7012,7 +7173,7 @@
7012
7173
  }
7013
7174
  const { writable } = writer;
7014
7175
  if (reader) {
7015
- const readable = toCompatibleReadable(reader.createReadable ? reader.createReadable() : reader.readable);
7176
+ const readable = toCompatibleReadable(createReadable(reader));
7016
7177
  const size = reader.size;
7017
7178
  const workerOptions = {
7018
7179
  options: {
@@ -7124,14 +7285,14 @@
7124
7285
  if (zip64 && (zip64UncompressedSize || zip64CompressedSize)) {
7125
7286
  const length = 4 + 16;
7126
7287
  const extraFieldZip64 = createRecordWriter(length);
7127
- extraFieldZip64.uint16(EXTRAFIELD_TYPE_ZIP64);
7128
- extraFieldZip64.uint16(length - 4);
7288
+ extraFieldZip64.writeUint16(EXTRAFIELD_TYPE_ZIP64);
7289
+ extraFieldZip64.writeUint16(length - 4);
7129
7290
  rawLocalExtraFieldZip64 = extraFieldZip64.array;
7130
7291
  if (zip64ExtraFieldComplete) {
7131
- extraFieldZip64.uint64(uncompressedSize);
7292
+ extraFieldZip64.writeUint64(uncompressedSize);
7132
7293
  if (uncompressedFile) {
7133
7294
  const encryptionOverhead = encrypted ? (zipCrypto ? 12 : 16 + encryptionStrength * 4) : 0;
7134
- extraFieldZip64.uint64(passThrough ? 0 : uncompressedSize + encryptionOverhead);
7295
+ extraFieldZip64.writeUint64(passThrough ? 0 : uncompressedSize + encryptionOverhead);
7135
7296
  }
7136
7297
  }
7137
7298
  } else {
@@ -7140,8 +7301,8 @@
7140
7301
  let rawExtraFieldAES;
7141
7302
  if (encrypted && !zipCrypto) {
7142
7303
  const extraFieldAES = createRecordWriter(getLength(EXTRAFIELD_DATA_AES) + 2);
7143
- extraFieldAES.uint16(EXTRAFIELD_TYPE_AES);
7144
- extraFieldAES.bytes(EXTRAFIELD_DATA_AES);
7304
+ extraFieldAES.writeUint16(EXTRAFIELD_TYPE_AES);
7305
+ extraFieldAES.writeBytes(EXTRAFIELD_DATA_AES);
7145
7306
  rawExtraFieldAES = extraFieldAES.array;
7146
7307
  rawExtraFieldAES[8] = encryptionStrength;
7147
7308
  } else {
@@ -7157,15 +7318,15 @@
7157
7318
  const extraFieldTimestampLength = 9 + (lastAccessDate ? 4 : 0) + (creationDate ? 4 : 0);
7158
7319
  const extraFieldTimestamp = createRecordWriter(extraFieldTimestampLength);
7159
7320
  extraFieldExtendedTimestampFlag = 0x1 + (lastAccessDate ? 0x2 : 0) + (creationDate ? 0x4 : 0);
7160
- extraFieldTimestamp.uint16(EXTRAFIELD_TYPE_EXTENDED_TIMESTAMP);
7161
- extraFieldTimestamp.uint16(extraFieldTimestampLength - 4);
7162
- extraFieldTimestamp.uint8(extraFieldExtendedTimestampFlag);
7163
- extraFieldTimestamp.uint32(lastModTimeUnix);
7321
+ extraFieldTimestamp.writeUint16(EXTRAFIELD_TYPE_EXTENDED_TIMESTAMP);
7322
+ extraFieldTimestamp.writeUint16(extraFieldTimestampLength - 4);
7323
+ extraFieldTimestamp.writeUint8(extraFieldExtendedTimestampFlag);
7324
+ extraFieldTimestamp.writeUint32(lastModTimeUnix);
7164
7325
  if (lastAccessDate) {
7165
- extraFieldTimestamp.uint32(clampUnixTime(getTimeUnix(lastAccessDate)));
7326
+ extraFieldTimestamp.writeUint32(clampUnixTime(getTimeUnix(lastAccessDate)));
7166
7327
  }
7167
7328
  if (creationDate) {
7168
- extraFieldTimestamp.uint32(clampUnixTime(getTimeUnix(creationDate)));
7329
+ extraFieldTimestamp.writeUint32(clampUnixTime(getTimeUnix(creationDate)));
7169
7330
  }
7170
7331
  rawExtraFieldExtendedTimestamp = extraFieldTimestamp.array;
7171
7332
  } else {
@@ -7178,14 +7339,14 @@
7178
7339
  try {
7179
7340
  const lastModTimeNTFS = getTimeNTFS(lastModDate);
7180
7341
  const extraFieldNTFS = createRecordWriter(36);
7181
- extraFieldNTFS.uint16(EXTRAFIELD_TYPE_NTFS);
7182
- extraFieldNTFS.uint16(32);
7342
+ extraFieldNTFS.writeUint16(EXTRAFIELD_TYPE_NTFS);
7343
+ extraFieldNTFS.writeUint16(32);
7183
7344
  extraFieldNTFS.skip(4);
7184
- extraFieldNTFS.uint16(EXTRAFIELD_TYPE_NTFS_TAG1);
7185
- extraFieldNTFS.uint16(24);
7186
- extraFieldNTFS.uint64(lastModTimeNTFS);
7187
- extraFieldNTFS.uint64(lastAccessDate ? getTimeNTFS(lastAccessDate) : lastModTimeNTFS);
7188
- extraFieldNTFS.uint64(creationDate ? getTimeNTFS(creationDate) : lastModTimeNTFS);
7345
+ extraFieldNTFS.writeUint16(EXTRAFIELD_TYPE_NTFS_TAG1);
7346
+ extraFieldNTFS.writeUint16(24);
7347
+ extraFieldNTFS.writeUint64(lastModTimeNTFS);
7348
+ extraFieldNTFS.writeUint64(lastAccessDate ? getTimeNTFS(lastAccessDate) : lastModTimeNTFS);
7349
+ extraFieldNTFS.writeUint64(creationDate ? getTimeNTFS(creationDate) : lastModTimeNTFS);
7189
7350
  rawExtraFieldNTFS = extraFieldNTFS.array;
7190
7351
  } catch {
7191
7352
  rawExtraFieldNTFS = EMPTY_UINT8_ARRAY;
@@ -7204,20 +7365,20 @@
7204
7365
  const gidBytes = packUnixId(gid);
7205
7366
  const payloadLength = 3 + uidBytes.length + gidBytes.length;
7206
7367
  const extraFieldUnix = createRecordWriter(4 + payloadLength);
7207
- extraFieldUnix.uint16(EXTRAFIELD_TYPE_INFOZIP);
7208
- extraFieldUnix.uint16(payloadLength);
7209
- extraFieldUnix.uint8(1);
7210
- extraFieldUnix.uint8(uidBytes.length);
7211
- extraFieldUnix.bytes(uidBytes);
7212
- extraFieldUnix.uint8(gidBytes.length);
7213
- extraFieldUnix.bytes(gidBytes);
7368
+ extraFieldUnix.writeUint16(EXTRAFIELD_TYPE_INFOZIP);
7369
+ extraFieldUnix.writeUint16(payloadLength);
7370
+ extraFieldUnix.writeUint8(1);
7371
+ extraFieldUnix.writeUint8(uidBytes.length);
7372
+ extraFieldUnix.writeBytes(uidBytes);
7373
+ extraFieldUnix.writeUint8(gidBytes.length);
7374
+ extraFieldUnix.writeBytes(gidBytes);
7214
7375
  rawExtraFieldUnix = extraFieldUnix.array;
7215
7376
  } else if (unixExtraFieldType == UNIX_EXTRA_FIELD_TYPE && (uid !== UNDEFINED_VALUE || gid !== UNDEFINED_VALUE)) {
7216
7377
  const extraFieldUnix = createRecordWriter(8);
7217
- extraFieldUnix.uint16(EXTRAFIELD_TYPE_UNIX);
7218
- extraFieldUnix.uint16(4);
7219
- extraFieldUnix.uint16((uid === UNDEFINED_VALUE ? 0 : uid) & MAX_16_BITS);
7220
- extraFieldUnix.uint16((gid === UNDEFINED_VALUE ? 0 : gid) & MAX_16_BITS);
7378
+ extraFieldUnix.writeUint16(EXTRAFIELD_TYPE_UNIX);
7379
+ extraFieldUnix.writeUint16(4);
7380
+ extraFieldUnix.writeUint16((uid === UNDEFINED_VALUE ? 0 : uid) & MAX_16_BITS);
7381
+ extraFieldUnix.writeUint16((gid === UNDEFINED_VALUE ? 0 : gid) & MAX_16_BITS);
7221
7382
  rawExtraFieldUnix = extraFieldUnix.array;
7222
7383
  } else {
7223
7384
  rawExtraFieldUnix = EMPTY_UINT8_ARRAY;
@@ -7267,18 +7428,18 @@
7267
7428
  const localHeader = createRecordWriter(HEADER_SIZE + getLength(rawFilename) + extraFieldLength);
7268
7429
  const localHeaderArray = localHeader.array;
7269
7430
  const localHeaderView = getDataView(localHeaderArray);
7270
- localHeader.uint32(LOCAL_FILE_HEADER_SIGNATURE);
7271
- localHeader.bytes(headerArray);
7272
- localHeader.bytes(rawFilename);
7431
+ localHeader.writeUint32(LOCAL_FILE_HEADER_SIGNATURE);
7432
+ localHeader.writeBytes(headerArray);
7433
+ localHeader.writeBytes(rawFilename);
7273
7434
  if (writeLocalExtraFieldZip64) {
7274
- localHeader.bytes(rawLocalExtraFieldZip64);
7275
- }
7276
- localHeader.bytes(rawExtraFieldAES);
7277
- localHeader.bytes(rawExtraFieldExtendedTimestamp);
7278
- localHeader.bytes(rawExtraFieldNTFS);
7279
- localHeader.bytes(rawExtraFieldUnix);
7280
- localHeader.bytes(rawExtraField);
7281
- localHeader.bytes(rawLocalExtraField);
7435
+ localHeader.writeBytes(rawLocalExtraFieldZip64);
7436
+ }
7437
+ localHeader.writeBytes(rawExtraFieldAES);
7438
+ localHeader.writeBytes(rawExtraFieldExtendedTimestamp);
7439
+ localHeader.writeBytes(rawExtraFieldNTFS);
7440
+ localHeader.writeBytes(rawExtraFieldUnix);
7441
+ localHeader.writeBytes(rawExtraField);
7442
+ localHeader.writeBytes(rawLocalExtraField);
7282
7443
  if (dataDescriptor) {
7283
7444
  if (!zip64CompressedSize) {
7284
7445
  setUint32(localHeaderView, HEADER_OFFSET_COMPRESSED_SIZE + LOCAL_HEADER_COMMON_OFFSET, 0);
@@ -7468,7 +7629,7 @@
7468
7629
 
7469
7630
 
7470
7631
  async function closeFile(zipWriter, comment, options) {
7471
- const directoryDataLength = createDirectoryRecords(zipWriter.files);
7632
+ const directoryDataLength = createDirectoryRecords(zipWriter.fileEntries);
7472
7633
  const { directoryStart, directoryArray } = await writeDirectoryRecords(zipWriter, directoryDataLength, options);
7473
7634
  const signatureLength = await writeDigitalSignatureRecord(zipWriter, directoryArray, options);
7474
7635
  await writeEndOfDirectoryRecord(zipWriter, comment, options, { directoryStart, directoryDataLength, signatureLength });
@@ -7498,19 +7659,19 @@
7498
7659
  if (zip64Offset || zip64DiskNumberStart || zip64UncompressedSize || zip64CompressedSize) {
7499
7660
  const length = 4 + (zip64UncompressedSize ? 8 : 0) + (zip64CompressedSize ? 8 : 0) + (zip64Offset ? 8 : 0) + (zip64DiskNumberStart ? 4 : 0);
7500
7661
  const extraFieldZip64 = createRecordWriter(length);
7501
- extraFieldZip64.uint16(EXTRAFIELD_TYPE_ZIP64);
7502
- extraFieldZip64.uint16(length - 4);
7662
+ extraFieldZip64.writeUint16(EXTRAFIELD_TYPE_ZIP64);
7663
+ extraFieldZip64.writeUint16(length - 4);
7503
7664
  if (zip64UncompressedSize) {
7504
- extraFieldZip64.uint64(uncompressedSize);
7665
+ extraFieldZip64.writeUint64(uncompressedSize);
7505
7666
  }
7506
7667
  if (zip64CompressedSize) {
7507
- extraFieldZip64.uint64(compressedSize);
7668
+ extraFieldZip64.writeUint64(compressedSize);
7508
7669
  }
7509
7670
  if (zip64Offset) {
7510
- extraFieldZip64.uint64(fileEntry.offset);
7671
+ extraFieldZip64.writeUint64(fileEntry.offset);
7511
7672
  }
7512
7673
  if (zip64DiskNumberStart) {
7513
- extraFieldZip64.uint32(fileEntry.diskNumberStart);
7674
+ extraFieldZip64.writeUint32(fileEntry.diskNumberStart);
7514
7675
  }
7515
7676
  rawExtraFieldZip64 = extraFieldZip64.array;
7516
7677
  } else {
@@ -7523,10 +7684,10 @@
7523
7684
  const lastModTimeUnix = getTimeUnix(lastModDate);
7524
7685
  if (extendedTimestamp && inUnixTimeRange(lastModTimeUnix)) {
7525
7686
  const extraFieldTimestamp = createRecordWriter(9);
7526
- extraFieldTimestamp.uint16(EXTRAFIELD_TYPE_EXTENDED_TIMESTAMP);
7527
- extraFieldTimestamp.uint16(5);
7528
- extraFieldTimestamp.uint8(extraFieldExtendedTimestampFlag);
7529
- extraFieldTimestamp.uint32(lastModTimeUnix);
7687
+ extraFieldTimestamp.writeUint16(EXTRAFIELD_TYPE_EXTENDED_TIMESTAMP);
7688
+ extraFieldTimestamp.writeUint16(5);
7689
+ extraFieldTimestamp.writeUint8(extraFieldExtendedTimestampFlag);
7690
+ extraFieldTimestamp.writeUint32(lastModTimeUnix);
7530
7691
  rawExtraFieldTimestamp = extraFieldTimestamp.array;
7531
7692
  } else {
7532
7693
  rawExtraFieldTimestamp = EMPTY_UINT8_ARRAY;
@@ -7548,14 +7709,14 @@
7548
7709
  }
7549
7710
 
7550
7711
  async function writeDirectoryRecords(zipWriter, directoryDataLength, options) {
7551
- const { files, writer } = zipWriter;
7712
+ const { fileEntries, writer } = zipWriter;
7552
7713
  const directoryArray = new Uint8Array(directoryDataLength);
7553
7714
  await initStream(writer);
7554
7715
  let offset = 0;
7555
7716
  let directoryDiskOffset = 0;
7556
7717
  let directoryStartDiskNumber = getDiskNumber(writer);
7557
7718
  let directoryStartDiskOffset = getDiskOffset(writer);
7558
- for (const [indexFileEntry, fileEntry] of Array.from(files.values()).entries()) {
7719
+ for (const [indexFileEntry, fileEntry] of Array.from(fileEntries.values()).entries()) {
7559
7720
  const {
7560
7721
  offset: fileEntryOffset,
7561
7722
  rawFilename,
@@ -7600,28 +7761,28 @@
7600
7761
  setUint16(headerView, HEADER_OFFSET_VERSION, VERSION_ZIP64);
7601
7762
  }
7602
7763
  const directoryRecord = createRecordWriter(directoryRecordLength);
7603
- directoryRecord.uint32(CENTRAL_FILE_HEADER_SIGNATURE);
7604
- directoryRecord.uint16(versionMadeBy);
7605
- directoryRecord.bytes(headerArray.subarray(0, HEADER_SIZE - 4 - 2));
7606
- directoryRecord.uint16(extraFieldLength);
7607
- directoryRecord.uint16(getLength(rawComment));
7608
- directoryRecord.uint16(zip64DiskNumberStart ? MAX_16_BITS : diskNumberStart);
7609
- directoryRecord.uint16(internalFileAttributes);
7610
- directoryRecord.uint32(externalFileAttributes);
7611
- directoryRecord.uint32(zip64Offset ? MAX_32_BITS : fileEntryOffset);
7612
- directoryRecord.bytes(rawFilename);
7613
- directoryRecord.bytes(rawExtraFieldZip64);
7614
- directoryRecord.bytes(rawExtraFieldAES);
7615
- directoryRecord.bytes(rawExtraFieldExtendedTimestamp);
7616
- directoryRecord.bytes(rawExtraFieldNTFS);
7617
- directoryRecord.bytes(rawExtraFieldUnix);
7618
- directoryRecord.bytes(rawExtraField);
7619
- directoryRecord.bytes(rawComment);
7764
+ directoryRecord.writeUint32(CENTRAL_FILE_HEADER_SIGNATURE);
7765
+ directoryRecord.writeUint16(versionMadeBy);
7766
+ directoryRecord.writeBytes(headerArray.subarray(0, HEADER_SIZE - 4 - 2));
7767
+ directoryRecord.writeUint16(extraFieldLength);
7768
+ directoryRecord.writeUint16(getLength(rawComment));
7769
+ directoryRecord.writeUint16(zip64DiskNumberStart ? MAX_16_BITS : diskNumberStart);
7770
+ directoryRecord.writeUint16(internalFileAttributes);
7771
+ directoryRecord.writeUint32(externalFileAttributes);
7772
+ directoryRecord.writeUint32(zip64Offset ? MAX_32_BITS : fileEntryOffset);
7773
+ directoryRecord.writeBytes(rawFilename);
7774
+ directoryRecord.writeBytes(rawExtraFieldZip64);
7775
+ directoryRecord.writeBytes(rawExtraFieldAES);
7776
+ directoryRecord.writeBytes(rawExtraFieldExtendedTimestamp);
7777
+ directoryRecord.writeBytes(rawExtraFieldNTFS);
7778
+ directoryRecord.writeBytes(rawExtraFieldUnix);
7779
+ directoryRecord.writeBytes(rawExtraField);
7780
+ directoryRecord.writeBytes(rawComment);
7620
7781
  arraySet(directoryArray, directoryRecord.array, offset);
7621
7782
  offset += directoryRecordLength;
7622
7783
  if (options.onprogress) {
7623
7784
  try {
7624
- await options.onprogress(indexFileEntry + 1, files.size, new Entry(fileEntry));
7785
+ await options.onprogress(indexFileEntry + 1, fileEntries.size, new Entry(fileEntry));
7625
7786
  } catch {
7626
7787
  // ignored
7627
7788
  }
@@ -7635,7 +7796,7 @@
7635
7796
  }
7636
7797
 
7637
7798
  async function writeDigitalSignatureRecord(zipWriter, directoryArray, options) {
7638
- const signCentralDirectory = getOptionValue(zipWriter, options, OPTION_SIGN_CENTRAL_DIRECTORY);
7799
+ const signCentralDirectory = getFunctionOptionValue(zipWriter, options, OPTION_SIGN_CENTRAL_DIRECTORY);
7639
7800
  if (signCentralDirectory) {
7640
7801
  const signatureData = await signCentralDirectory(directoryArray);
7641
7802
  const signatureDataLength = getLength(signatureData);
@@ -7643,9 +7804,9 @@
7643
7804
  throw new Error(ERR_INVALID_SIGNATURE_DATA);
7644
7805
  }
7645
7806
  const signatureRecord = createRecordWriter(6 + signatureDataLength);
7646
- signatureRecord.uint32(DIGITAL_SIGNATURE_RECORD_SIGNATURE);
7647
- signatureRecord.uint16(signatureDataLength);
7648
- signatureRecord.bytes(signatureData);
7807
+ signatureRecord.writeUint32(DIGITAL_SIGNATURE_RECORD_SIGNATURE);
7808
+ signatureRecord.writeUint16(signatureDataLength);
7809
+ signatureRecord.writeBytes(signatureData);
7649
7810
  await writeData(zipWriter.writer, signatureRecord.array);
7650
7811
  return 6 + signatureDataLength;
7651
7812
  }
@@ -7656,7 +7817,7 @@
7656
7817
  const { writer } = zipWriter;
7657
7818
  const { directoryStart, signatureLength } = cdInfo;
7658
7819
  let { directoryDataLength } = cdInfo;
7659
- let filesLength = zipWriter.files.size;
7820
+ let fileEntriesLength = zipWriter.fileEntries.size;
7660
7821
  let diskNumber = directoryStart.diskNumber;
7661
7822
  let directoryOffset = getSegmentOffset(zipWriter, directoryStart);
7662
7823
  let lastDiskNumber = getDiskNumber(writer);
@@ -7664,7 +7825,7 @@
7664
7825
  lastDiskNumber++;
7665
7826
  }
7666
7827
  let zip64 = getOptionValue(zipWriter, options, PROPERTY_NAME_ZIP64);
7667
- if (directoryOffset >= MAX_32_BITS || directoryDataLength >= MAX_32_BITS || filesLength >= MAX_16_BITS || lastDiskNumber >= MAX_16_BITS) {
7828
+ if (directoryOffset >= MAX_32_BITS || directoryDataLength >= MAX_32_BITS || fileEntriesLength >= MAX_16_BITS || lastDiskNumber >= MAX_16_BITS) {
7668
7829
  if (zip64 === false) {
7669
7830
  throw new Error(ERR_UNSUPPORTED_FORMAT);
7670
7831
  } else {
@@ -7681,37 +7842,37 @@
7681
7842
  }
7682
7843
  lastDiskNumber = getDiskNumber(writer);
7683
7844
  if (zip64) {
7684
- endOfdirectoryRecord.uint32(ZIP64_END_OF_CENTRAL_DIR_SIGNATURE);
7685
- endOfdirectoryRecord.uint64(44);
7686
- endOfdirectoryRecord.uint16(45);
7687
- endOfdirectoryRecord.uint16(45);
7688
- endOfdirectoryRecord.uint32(lastDiskNumber);
7689
- endOfdirectoryRecord.uint32(diskNumber);
7690
- endOfdirectoryRecord.uint64(filesLength);
7691
- endOfdirectoryRecord.uint64(filesLength);
7692
- endOfdirectoryRecord.uint64(directoryDataLength);
7693
- endOfdirectoryRecord.uint64(directoryOffset);
7694
- endOfdirectoryRecord.uint32(ZIP64_END_OF_CENTRAL_DIR_LOCATOR_SIGNATURE);
7695
- endOfdirectoryRecord.uint32(lastDiskNumber);
7696
- endOfdirectoryRecord.uint64(BigInt(getSegmentOffset(zipWriter, writer)) + BigInt(directoryDataLength) + BigInt(signatureLength));
7697
- endOfdirectoryRecord.uint32(lastDiskNumber + 1);
7845
+ endOfdirectoryRecord.writeUint32(ZIP64_END_OF_CENTRAL_DIR_SIGNATURE);
7846
+ endOfdirectoryRecord.writeUint64(44);
7847
+ endOfdirectoryRecord.writeUint16(45);
7848
+ endOfdirectoryRecord.writeUint16(45);
7849
+ endOfdirectoryRecord.writeUint32(lastDiskNumber);
7850
+ endOfdirectoryRecord.writeUint32(diskNumber);
7851
+ endOfdirectoryRecord.writeUint64(fileEntriesLength);
7852
+ endOfdirectoryRecord.writeUint64(fileEntriesLength);
7853
+ endOfdirectoryRecord.writeUint64(directoryDataLength);
7854
+ endOfdirectoryRecord.writeUint64(directoryOffset);
7855
+ endOfdirectoryRecord.writeUint32(ZIP64_END_OF_CENTRAL_DIR_LOCATOR_SIGNATURE);
7856
+ endOfdirectoryRecord.writeUint32(lastDiskNumber);
7857
+ endOfdirectoryRecord.writeUint64(BigInt(getSegmentOffset(zipWriter, writer)) + BigInt(directoryDataLength) + BigInt(signatureLength));
7858
+ endOfdirectoryRecord.writeUint32(lastDiskNumber + 1);
7698
7859
  const supportZip64SplitFile = getOptionValue(zipWriter, options, OPTION_SUPPORT_ZIP64_SPLIT_FILE, true);
7699
7860
  if (supportZip64SplitFile) {
7700
7861
  lastDiskNumber = MAX_16_BITS;
7701
7862
  diskNumber = MAX_16_BITS;
7702
7863
  }
7703
- filesLength = MAX_16_BITS;
7864
+ fileEntriesLength = MAX_16_BITS;
7704
7865
  directoryOffset = MAX_32_BITS;
7705
7866
  directoryDataLength = MAX_32_BITS;
7706
7867
  }
7707
- endOfdirectoryRecord.uint32(END_OF_CENTRAL_DIR_SIGNATURE);
7708
- endOfdirectoryRecord.uint16(lastDiskNumber);
7709
- endOfdirectoryRecord.uint16(diskNumber);
7710
- endOfdirectoryRecord.uint16(filesLength);
7711
- endOfdirectoryRecord.uint16(filesLength);
7712
- endOfdirectoryRecord.uint32(directoryDataLength);
7713
- endOfdirectoryRecord.uint32(directoryOffset);
7714
- endOfdirectoryRecord.uint16(commentLength);
7868
+ endOfdirectoryRecord.writeUint32(END_OF_CENTRAL_DIR_SIGNATURE);
7869
+ endOfdirectoryRecord.writeUint16(lastDiskNumber);
7870
+ endOfdirectoryRecord.writeUint16(diskNumber);
7871
+ endOfdirectoryRecord.writeUint16(fileEntriesLength);
7872
+ endOfdirectoryRecord.writeUint16(fileEntriesLength);
7873
+ endOfdirectoryRecord.writeUint32(directoryDataLength);
7874
+ endOfdirectoryRecord.writeUint32(directoryOffset);
7875
+ endOfdirectoryRecord.writeUint16(commentLength);
7715
7876
  await writeData(writer, endOfdirectoryRecord.array);
7716
7877
  if (commentLength) {
7717
7878
  await writeData(writer, comment);
@@ -7724,11 +7885,11 @@
7724
7885
  let offset = 0;
7725
7886
  return {
7726
7887
  array,
7727
- uint8: value => { setUint8(view, offset, value); offset += 1; },
7728
- uint16: value => { setUint16(view, offset, value); offset += 2; },
7729
- uint32: value => { setUint32(view, offset, value); offset += 4; },
7730
- uint64: value => { setBigUint64(view, offset, BigInt(value)); offset += 8; },
7731
- bytes: value => { arraySet(array, value, offset); offset += getLength(value); },
7888
+ writeUint8: value => { setUint8(view, offset, value); offset += 1; },
7889
+ writeUint16: value => { setUint16(view, offset, value); offset += 2; },
7890
+ writeUint32: value => { setUint32(view, offset, value); offset += 4; },
7891
+ writeUint64: value => { setBigUint64(view, offset, BigInt(value)); offset += 8; },
7892
+ writeBytes: value => { arraySet(array, value, offset); offset += getLength(value); },
7732
7893
  skip: count => offset += count
7733
7894
  };
7734
7895
  }
@@ -7752,6 +7913,71 @@
7752
7913
  return zipWriter.offset - diskOffset - (diskNumber ? zipWriter.initialOffset : 0);
7753
7914
  }
7754
7915
 
7916
+ async function startsWithSplitZipSignature(reader) {
7917
+ const signatureArray = await readUint8Array(reader, 0, SPLIT_ZIP_FILE_SIGNATURE_LENGTH);
7918
+ return getUint32(getDataView(signatureArray), 0) == SPLIT_ZIP_FILE_SIGNATURE;
7919
+ }
7920
+
7921
+ async function copyZipData(zipWriter, reader, entries, directoryOffset, splitZipSignatureLength) {
7922
+ const { writer } = zipWriter;
7923
+ const entryPositions = new Map();
7924
+ if (writer.closeDisk) {
7925
+ const sortedEntries = Array.from(entries).sort((firstEntry, secondEntry) =>
7926
+ getSourceOffset(reader, firstEntry) - getSourceOffset(reader, secondEntry));
7927
+ let copiedLength = 0;
7928
+ for (const entry of sortedEntries) {
7929
+ const sourceOffset = getSourceOffset(reader, entry);
7930
+ await copyData(zipWriter, reader, copiedLength, sourceOffset - copiedLength);
7931
+ if (exceedsAvailableSize(writer, await getLocalHeaderLength(reader, sourceOffset))) {
7932
+ await writer.closeDisk();
7933
+ }
7934
+ entryPositions.set(entry, {
7935
+ offset: getSegmentOffset(zipWriter, writer),
7936
+ diskNumberStart: getDiskNumber(writer)
7937
+ });
7938
+ copiedLength = sourceOffset;
7939
+ }
7940
+ await copyData(zipWriter, reader, copiedLength, directoryOffset - copiedLength);
7941
+ } else {
7942
+ await copyData(zipWriter, reader, 0, directoryOffset);
7943
+ entries.forEach(entry => entryPositions.set(entry, {
7944
+ offset: splitZipSignatureLength + getSourceOffset(reader, entry),
7945
+ diskNumberStart: 0
7946
+ }));
7947
+ }
7948
+ return entryPositions;
7949
+ }
7950
+
7951
+ async function copyData(zipWriter, reader, offset, size) {
7952
+ if (size > 0) {
7953
+ const { writer } = zipWriter;
7954
+ await createReadable(reader, { offset, size }).pipeTo(writer.writable, { preventClose: true, preventAbort: true });
7955
+ writer.size += size;
7956
+ zipWriter.offset += size;
7957
+ }
7958
+ }
7959
+
7960
+ async function getLocalHeaderLength(reader, offset) {
7961
+ const headerArray = await readUint8Array(reader, offset, HEADER_SIZE);
7962
+ if (getLength(headerArray) < HEADER_SIZE) {
7963
+ return HEADER_SIZE;
7964
+ }
7965
+ const headerView = getDataView(headerArray);
7966
+ return HEADER_SIZE +
7967
+ getUint16(headerView, HEADER_OFFSET_FILENAME_LENGTH + LOCAL_HEADER_COMMON_OFFSET) +
7968
+ getUint16(headerView, HEADER_OFFSET_EXTRAFIELD_LENGTH + LOCAL_HEADER_COMMON_OFFSET);
7969
+ }
7970
+
7971
+ function getSourceOffset(reader, { offset, diskNumberStart }) {
7972
+ return offset + (reader.getDiskOffset ? reader.getDiskOffset(diskNumberStart) : 0);
7973
+ }
7974
+
7975
+ function getSplitZipSignatureArray() {
7976
+ const signatureArray = new Uint8Array(SPLIT_ZIP_FILE_SIGNATURE_LENGTH);
7977
+ setUint32(getDataView(signatureArray), 0, SPLIT_ZIP_FILE_SIGNATURE);
7978
+ return signatureArray;
7979
+ }
7980
+
7755
7981
  async function writeData(writer, array) {
7756
7982
  const { writable } = writer;
7757
7983
  const streamWriter = writable.getWriter();
@@ -7803,6 +8029,21 @@
7803
8029
  return result === UNDEFINED_VALUE ? defaultValue : result;
7804
8030
  }
7805
8031
 
8032
+ function getDateOptionValue(zipWriter, options, name, defaultValue) {
8033
+ const date = getOptionValue(zipWriter, options, name, defaultValue);
8034
+ if (date === null) {
8035
+ return defaultValue;
8036
+ }
8037
+ if (date !== UNDEFINED_VALUE && (typeof date.getTime != FUNCTION_TYPE || Number.isNaN(date.getTime()))) {
8038
+ throw new Error(ERR_INVALID_DATE);
8039
+ }
8040
+ return date;
8041
+ }
8042
+
8043
+ function getFunctionOptionValue(zipWriter, options, name) {
8044
+ return checkFunctionOption(getOptionValue(zipWriter, options, name));
8045
+ }
8046
+
7806
8047
  function getAliasedOptionValue(zipWriter, options, name, deprecatedName, defaultValue) {
7807
8048
  const value = getAliasedValue(options, name, deprecatedName);
7808
8049
  const result = value === UNDEFINED_VALUE ? getAliasedValue(zipWriter.options, name, deprecatedName) : value;
@@ -7817,9 +8058,6 @@
7817
8058
  return toNumber(getOptionValue(zipWriter, options, name, defaultValue));
7818
8059
  }
7819
8060
 
7820
- function toNumber(value) {
7821
- return typeof value == STRING_TYPE && value.trim() ? Number(value) : value;
7822
- }
7823
8061
 
7824
8062
  function getMaximumCompressedSize(uncompressedSize) {
7825
8063
  return uncompressedSize + (5 * (Math.floor(uncompressedSize / 16383) + 1));
@@ -7831,6 +8069,14 @@
7831
8069
  : compressionMethod !== COMPRESSION_METHOD_STORE;
7832
8070
  }
7833
8071
 
8072
+ function getUint16(view, offset) {
8073
+ return view.getUint16(offset, true);
8074
+ }
8075
+
8076
+ function getUint32(view, offset) {
8077
+ return view.getUint32(offset, true);
8078
+ }
8079
+
7834
8080
  function setUint8(view, offset, value) {
7835
8081
  view.setUint8(offset, value);
7836
8082
  }
@@ -7874,9 +8120,9 @@
7874
8120
  const headerRecord = createRecordWriter(HEADER_SIZE - 4);
7875
8121
  const headerArray = headerRecord.array;
7876
8122
  const headerView = getDataView(headerArray);
7877
- headerRecord.uint16(version);
7878
- headerRecord.uint16(bitFlag);
7879
- headerRecord.uint16(compressionMethod);
8123
+ headerRecord.writeUint16(version);
8124
+ headerRecord.writeUint16(bitFlag);
8125
+ headerRecord.writeUint16(compressionMethod);
7880
8126
  if (rawLastModDate === UNDEFINED_VALUE) {
7881
8127
  const dateArray = new Uint32Array(1);
7882
8128
  const dateView = getDataView(dateArray);
@@ -7884,20 +8130,20 @@
7884
8130
  setUint16(dateView, 2, ((((lastModDate.getFullYear() - 1980) << 4) | (lastModDate.getMonth() + 1)) << 5) | lastModDate.getDate());
7885
8131
  rawLastModDate = dateArray[0];
7886
8132
  }
7887
- headerRecord.uint32(rawLastModDate);
8133
+ headerRecord.writeUint32(rawLastModDate);
7888
8134
  headerRecord.skip(4);
7889
8135
  if (zip64CompressedSize || compressedSize !== UNDEFINED_VALUE) {
7890
- headerRecord.uint32(zip64CompressedSize ? MAX_32_BITS : compressedSize);
8136
+ headerRecord.writeUint32(zip64CompressedSize ? MAX_32_BITS : compressedSize);
7891
8137
  } else {
7892
8138
  headerRecord.skip(4);
7893
8139
  }
7894
8140
  if (zip64UncompressedSize || uncompressedSize !== UNDEFINED_VALUE) {
7895
- headerRecord.uint32(zip64UncompressedSize ? MAX_32_BITS : uncompressedSize);
8141
+ headerRecord.writeUint32(zip64UncompressedSize ? MAX_32_BITS : uncompressedSize);
7896
8142
  } else {
7897
8143
  headerRecord.skip(4);
7898
8144
  }
7899
- headerRecord.uint16(getLength(rawFilename));
7900
- headerRecord.uint16(extraFieldLength);
8145
+ headerRecord.writeUint16(getLength(rawFilename));
8146
+ headerRecord.writeUint16(extraFieldLength);
7901
8147
  return {
7902
8148
  headerArray,
7903
8149
  headerView,
@@ -8410,7 +8656,7 @@
8410
8656
  // ignored
8411
8657
  }
8412
8658
 
8413
- const n=[3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258],c=[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0],s=[1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577],f=[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13],z=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],t=new Uint8Array(288);t.fill(8,0,144),t.fill(9,144,256),t.fill(7,256,280),t.fill(8,280,288);const u=new Uint8Array(30).fill(5);function r(n){const c=new Uint16Array(16);for(const s of n)c[s]++;c[0]=0;const s=new Uint16Array(17);for(let n=1;15>=n;n++)s[n+1]=s[n]+c[n];const f=new Uint16Array(n.length);for(let c=0;c<n.length;c++)n[c]&&(f[s[n[c]]++]=c);return {l:c,symbols:f}}const l="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";function U(U){let e;U({wasmURI:()=>(e||(e="data:application/wasm;base64,"+(n=>{let c="";const s=n.length;let f=0;for(;s>f+2;f+=3){const s=n[f]<<16|n[f+1]<<8|n[f+2];c+=l[s>>18&63]+l[s>>12&63]+l[s>>6&63]+l[63&s];}const z=s-f;if(1===z){const s=n[f]<<16;c+=l[s>>18&63]+l[s>>12&63]+"==";}else if(2===z){const s=n[f]<<16|n[f+1]<<8;c+=l[s>>18&63]+l[s>>12&63]+l[s>>6&63]+"=";}return c})((l=>{let U=0,e=0,o=0,a=new Uint8Array(1024),y=0,i=0;for(;!i;){i=w(1);const n=w(2);if(0==n)V();else if(1==n)j(r(t),r(u));else {if(2!=n)throw Error("invalid deflate block type");j(...m());}}return a.subarray(0,y);function b(){if(U>=l.length)throw Error("unexpected end of deflate data");return l[U++]}function w(n){for(;n>o;)e|=b()<<o,o+=8;const c=e&(1<<n)-1;return e>>>=n,o-=n,c}function V(){e=0,o=0;const n=b()|b()<<8;U+=2,L(y+n);for(let c=0;n>c;c++)a[y++]=b();}function j(z,t){let u=q(z);for(;256!=u;){if(256>u)L(y+1),a[y++]=u;else {const z=u-257,r=n[z]+w(c[z]),l=q(t),U=s[l]+w(f[l]);L(y+r);const e=y-U;for(let n=0;r>n;n++)a[y++]=a[e+n];}u=q(z);}}function m(){const n=w(5)+257,c=w(5)+1,s=w(4)+4,f=new Uint8Array(19);for(let n=0;s>n;n++)f[z[n]]=w(3);const t=r(f),u=new Uint8Array(n+c);let l=0;for(;l<u.length;){const n=q(t);if(16>n)u[l++]=n;else if(16==n){const n=u[l-1];let c=w(2)+3;for(;c--;)u[l++]=n;}else l+=17==n?w(3)+3:w(7)+11;}return [r(u.subarray(0,n)),r(u.subarray(n))]}function q(n){const{l:c,symbols:s}=n;let f=0,z=0,t=0;for(let n=1;15>=n;n++){f|=w(1);const u=c[n];if(u>f-z)return s[t+(f-z)];t+=u,z=z+u<<1,f<<=1;}throw Error("invalid huffman code")}function L(n){if(a.length<n){let c=2*a.length;for(;n>c;)c*=2;const s=new Uint8Array(c);s.set(a.subarray(0,y)),a=s;}}})((n=>{const c=(n=(n+"").replace(/[^A-Za-z0-9+/=]/g,"")).length,s=[];for(let f=0;c>f;f+=4){const c=l.indexOf(n[f])<<18|l.indexOf(n[f+1])<<12|(63&l.indexOf(n[f+2]))<<6|63&l.indexOf(n[f+3]);s.push(c>>16&255),"="!==n[f+2]&&s.push(c>>8&255),"="!==n[f+3]&&s.push(255&c);}return new Uint8Array(s)})("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")))),e)});}
8659
+ const n=[3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258],c=[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0],s=[1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577],f=[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13],z=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],t=new Uint8Array(288);t.fill(8,0,144),t.fill(9,144,256),t.fill(7,256,280),t.fill(8,280,288);const u=new Uint8Array(30).fill(5);function r(n){const c=new Uint16Array(16);for(const s of n)c[s]++;c[0]=0;const s=new Uint16Array(17);for(let n=1;n<=15;n++)s[n+1]=s[n]+c[n];const f=new Uint16Array(n.length);for(let c=0;c<n.length;c++)n[c]&&(f[s[n[c]]++]=c);return {l:c,symbols:f}}const l="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";function U(U){let e;U({wasmURI:()=>(e||(e="data:application/wasm;base64,"+(n=>{let c="";const s=n.length;let f=0;for(;f+2<s;f+=3){const s=n[f]<<16|n[f+1]<<8|n[f+2];c+=l[s>>18&63]+l[s>>12&63]+l[s>>6&63]+l[63&s];}const z=s-f;if(1===z){const s=n[f]<<16;c+=l[s>>18&63]+l[s>>12&63]+"==";}else if(2===z){const s=n[f]<<16|n[f+1]<<8;c+=l[s>>18&63]+l[s>>12&63]+l[s>>6&63]+"=";}return c})((l=>{let U=0,e=0,o=0,a=new Uint8Array(1024),y=0,i=0;for(;!i;){i=w(1);const n=w(2);if(0==n)V();else if(1==n)j(r(t),r(u));else {if(2!=n)throw Error("invalid deflate block type");j(...m());}}return a.subarray(0,y);function b(){if(U>=l.length)throw Error("unexpected end of deflate data");return l[U++]}function w(n){for(;o<n;)e|=b()<<o,o+=8;const c=e&(1<<n)-1;return e>>>=n,o-=n,c}function V(){e=0,o=0;const n=b()|b()<<8;U+=2,L(y+n);for(let c=0;c<n;c++)a[y++]=b();}function j(z,t){let u=q(z);for(;256!=u;){if(u<256)L(y+1),a[y++]=u;else {const z=u-257,r=n[z]+w(c[z]),l=q(t),U=s[l]+w(f[l]);L(y+r);const e=y-U;for(let n=0;n<r;n++)a[y++]=a[e+n];}u=q(z);}}function m(){const n=w(5)+257,c=w(5)+1,s=w(4)+4,f=new Uint8Array(19);for(let n=0;n<s;n++)f[z[n]]=w(3);const t=r(f),u=new Uint8Array(n+c);let l=0;for(;l<u.length;){const n=q(t);if(n<16)u[l++]=n;else if(16==n){const n=u[l-1];let c=w(2)+3;for(;c--;)u[l++]=n;}else l+=17==n?w(3)+3:w(7)+11;}return [r(u.subarray(0,n)),r(u.subarray(n))]}function q(n){const{l:c,symbols:s}=n;let f=0,z=0,t=0;for(let n=1;n<=15;n++){f|=w(1);const u=c[n];if(f-z<u)return s[t+(f-z)];t+=u,z=z+u<<1,f<<=1;}throw Error("invalid huffman code")}function L(n){if(a.length<n){let c=2*a.length;for(;c<n;)c*=2;const s=new Uint8Array(c);s.set(a.subarray(0,y)),a=s;}}})((n=>{const c=(n=(n+"").replace(/[^A-Za-z0-9+/=]/g,"")).length,s=[];for(let f=0;f<c;f+=4){const c=l.indexOf(n[f])<<18|l.indexOf(n[f+1])<<12|(63&l.indexOf(n[f+2]))<<6|63&l.indexOf(n[f+3]);s.push(c>>16&255),"="!==n[f+2]&&s.push(c>>8&255),"="!==n[f+3]&&s.push(255&c);}return new Uint8Array(s)})("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")))),e)});}
8414
8660
 
8415
8661
  /*
8416
8662
  Copyright (c) 2025 Gildas Lormeau. All rights reserved.
@@ -8845,6 +9091,7 @@
8845
9091
  const ERR_ENTRY_EXISTS = "Entry filename already exists";
8846
9092
  const ERR_READABLE_CONSUMED = "Readable stream already consumed";
8847
9093
  const ERR_INVALID_PASS_THROUGH = "Invalid passThrough option (use readerOptions.passThrough or set uncompressedSize for each entry)";
9094
+ const ERR_INVALID_READER_OPTIONS = "Invalid readerOptions (must be an object)";
8848
9095
  const ERR_ABORT_EXPORT = "zipjs-abort-export";
8849
9096
  const ERR_ABORTED = "The operation was aborted";
8850
9097
  const ABORT_ERROR_NAME = "AbortError";
@@ -8877,13 +9124,14 @@
8877
9124
  fs,
8878
9125
  name,
8879
9126
  data: params.data,
8880
- options: params.options,
9127
+ options: params.options && Object.assign({}, params.options),
8881
9128
  id: fs.entryIdCounter++,
8882
9129
  parent,
8883
9130
  children: [],
8884
9131
  uncompressedSize: params.uncompressedSize || 0,
8885
9132
  undeterminedSize: params.undeterminedSize || params.uncompressedSize === UNDEFINED_VALUE,
8886
- passThrough: params.passThrough
9133
+ passThrough: params.passThrough,
9134
+ defaultLastModDate: params.defaultLastModDate || new Date()
8887
9135
  });
8888
9136
  if (parent || !fs.root) {
8889
9137
  fs.entries[zipEntry.id] = zipEntry;
@@ -8893,12 +9141,6 @@
8893
9141
  }
8894
9142
  }
8895
9143
 
8896
- moveTo(target) {
8897
- // deprecated
8898
- const zipEntry = this;
8899
- zipEntry.fs.move(zipEntry, target);
8900
- }
8901
-
8902
9144
  getFullname() {
8903
9145
  return this.getRelativeName();
8904
9146
  }
@@ -8930,6 +9172,11 @@
8930
9172
  this.name = name;
8931
9173
  }
8932
9174
  }
9175
+
9176
+ setOptions(options) {
9177
+ const entryOptions = Object.assign({}, this.options, options);
9178
+ this.options = Object.fromEntries(Object.entries(entryOptions).filter(([, value]) => value !== UNDEFINED_VALUE));
9179
+ }
8933
9180
  }
8934
9181
 
8935
9182
  class ZipFileEntry extends ZipEntry {
@@ -8956,7 +9203,7 @@
8956
9203
  const reader = zipEntry.reader = createReader(zipEntry.Reader, zipEntry.data, options);
8957
9204
  const dataSize = zipEntry.uncompressedSize || reader.size;
8958
9205
  await Promise.all([initStream(reader), initStream(writer, dataSize)]);
8959
- const { signal } = options;
9206
+ const signal = checkSignalOption(options.signal);
8960
9207
  const readable = createProgressReadable(zipEntry, reader, options, signal);
8961
9208
  const preventClose = !ownsWritable(writer) && Boolean(options.preventClose);
8962
9209
  zipEntry.uncompressedSize = reader.size;
@@ -9174,10 +9421,6 @@
9174
9421
  });
9175
9422
  }
9176
9423
 
9177
- addData(name, params) {
9178
- return addChild(this, name, params);
9179
- }
9180
-
9181
9424
  importBlob(blob, options) {
9182
9425
  return this.importZip(new BlobReader(blob), options);
9183
9426
  }
@@ -9291,7 +9534,7 @@
9291
9534
  if (options.bufferedWrite === UNDEFINED_VALUE) {
9292
9535
  options.bufferedWrite = true;
9293
9536
  }
9294
- const [readers] = await Promise.all([initReaders(zipEntry, options.readerOptions), initStream(writer)]);
9537
+ const [readers] = await Promise.all([initReaders(zipEntry, checkReaderOptions(options.readerOptions)), initStream(writer)]);
9295
9538
  const zipWriter = new ZipWriter(writer, options);
9296
9539
  await exportZip(zipWriter, zipEntry, getTotalSize([zipEntry], getUncompressedSize), options, readers);
9297
9540
  await zipWriter.close(options.globalComment);
@@ -9301,12 +9544,13 @@
9301
9544
  getExportedSize(options = {}) {
9302
9545
  const zipEntry = this;
9303
9546
  options = Object.assign({}, options);
9547
+ checkReaderOptions(options.readerOptions);
9304
9548
  if (options.bufferedWrite === UNDEFINED_VALUE) {
9305
9549
  options.bufferedWrite = true;
9306
9550
  }
9307
9551
  const writeOrderGuaranteed = !options.bufferedWrite ||
9308
9552
  (options.keepOrder !== false && zipEntry.children.every(child => !child.children.length));
9309
- return getEntriesSize(options, Array.from(zipEntry.getChildren({ recursive: true }), child => {
9553
+ return getEntriesSize(options, zipEntry.getChildren({ recursive: true }).filter(child => !isImplicitDirectory(child)).map(child => {
9310
9554
  const { name, entryOptions } = getChildEntryOptions(child, zipEntry, options);
9311
9555
  return { name, size: child.directory ? 0 : getDeterminedSize(child, isPassThrough(child, options)), options: entryOptions };
9312
9556
  }), writeOrderGuaranteed, options.globalComment);
@@ -9345,7 +9589,7 @@
9345
9589
  }
9346
9590
 
9347
9591
 
9348
- class FS {
9592
+ class ZipFS {
9349
9593
 
9350
9594
  constructor() {
9351
9595
  resetFS(this);
@@ -9461,10 +9705,6 @@
9461
9705
  return this.root.addFile(file, options);
9462
9706
  }
9463
9707
 
9464
- addData(name, params) {
9465
- return this.root.addData(name, params);
9466
- }
9467
-
9468
9708
  importBlob(blob, options) {
9469
9709
  resetFS(this);
9470
9710
  return this.root.importBlob(blob, options);
@@ -9532,7 +9772,7 @@
9532
9772
  }
9533
9773
  }
9534
9774
 
9535
- const fs = { FS, ZipDirectoryEntry, ZipFileEntry };
9775
+ const fs = { FS: ZipFS, ZipDirectoryEntry, ZipFileEntry };
9536
9776
 
9537
9777
  function getTotalSize(entries, getEntrySize) {
9538
9778
  let size = 0;
@@ -9676,7 +9916,7 @@
9676
9916
  }
9677
9917
 
9678
9918
  function forwardAbort(signal, abortController) {
9679
- if (!signal) {
9919
+ if (!checkSignalOption(signal)) {
9680
9920
  return () => { };
9681
9921
  }
9682
9922
  if (signal.aborted) {
@@ -9753,10 +9993,7 @@
9753
9993
  });
9754
9994
  }
9755
9995
  if (isPassThrough(child, options)) {
9756
- let level, encryptionStrength;
9757
- if (compressionMethod === 0) {
9758
- level = 0;
9759
- }
9996
+ let encryptionStrength;
9760
9997
  if (extraFieldAES) {
9761
9998
  encryptionStrength = extraFieldAES.strength;
9762
9999
  }
@@ -9766,13 +10003,12 @@
9766
10003
  zipCrypto,
9767
10004
  crc32,
9768
10005
  uncompressedSize,
9769
- level,
9770
10006
  encryptionStrength,
9771
10007
  compressionMethod
9772
10008
  };
9773
10009
  }
9774
10010
  }
9775
- const entryOptions = Object.assign({}, zipEntryMetadata, options, passThroughOptions, childOptions, { directory: child.directory });
10011
+ const entryOptions = Object.assign({ lastModDate: child.defaultLastModDate }, zipEntryMetadata, options, childOptions, passThroughOptions, { directory: child.directory });
9776
10012
  if (!child.directory && entryOptions.passThrough && entryOptions.uncompressedSize === UNDEFINED_VALUE) {
9777
10013
  throw new Error(ERR_INVALID_PASS_THROUGH);
9778
10014
  }
@@ -9787,11 +10023,22 @@
9787
10023
  return child.undeterminedSize ? UNDEFINED_VALUE : getExtractedSize(child, passThrough);
9788
10024
  }
9789
10025
 
10026
+ function checkReaderOptions(readerOptions) {
10027
+ if (readerOptions && (typeof readerOptions != OBJECT_TYPE || Array.isArray(readerOptions))) {
10028
+ throw new Error(ERR_INVALID_READER_OPTIONS);
10029
+ }
10030
+ return readerOptions;
10031
+ }
10032
+
9790
10033
  function isPassThrough(child, options) {
9791
10034
  const { readerOptions } = options;
9792
10035
  return Boolean(!child.directory && (child.passThrough || (readerOptions && readerOptions.passThrough)));
9793
10036
  }
9794
10037
 
10038
+ function isImplicitDirectory(child) {
10039
+ return child.directory && child.data === null;
10040
+ }
10041
+
9795
10042
  function getUserExtraField(extraField) {
9796
10043
  if (extraField) {
9797
10044
  const userExtraField = new Map();
@@ -9809,7 +10056,7 @@
9809
10056
  async function exportZip(zipWriter, entry, totalSize, options, readers) {
9810
10057
  const { onstart, onprogress, onend, onentryprogress } = options;
9811
10058
  const selectedEntry = entry;
9812
- const totalEntries = getTotalSize(entry.children, () => 1);
10059
+ const totalEntries = getTotalSize(entry.children, child => isImplicitDirectory(child) ? 0 : 1);
9813
10060
  let writtenSize = 0;
9814
10061
  let writtenEntries = 0;
9815
10062
  if (onstart) {
@@ -9838,6 +10085,9 @@
9838
10085
  }
9839
10086
 
9840
10087
  async function addChild(child) {
10088
+ if (isImplicitDirectory(child)) {
10089
+ return;
10090
+ }
9841
10091
  const { name, entryOptions } = getChildEntryOptions(child, selectedEntry, options);
9842
10092
  let entryWrittenSize = 0;
9843
10093
  const entryMetadata = await zipWriter.add(name, readers.get(child), Object.assign(entryOptions, {
@@ -9871,7 +10121,7 @@
9871
10121
  if (handle.kind == "file") {
9872
10122
  const file = await handle.getFile();
9873
10123
  addedEntries.push(
9874
- parentEntry.addData(file.name, {
10124
+ addChild(parentEntry, file.name, {
9875
10125
  Reader: function () {
9876
10126
  const readable = file.stream();
9877
10127
  const size = file.size;
@@ -9905,10 +10155,11 @@
9905
10155
 
9906
10156
  async function exportFileSystemHandle(zipEntry, directoryHandle, options) {
9907
10157
  const { onstart, onprogress, onend } = options;
10158
+ const readerOptions = checkReaderOptions(options.readerOptions);
9908
10159
  const abortController = new AbortController();
9909
10160
  const { signal } = abortController;
9910
10161
  const releaseSignal = forwardAbort(options.signal, abortController);
9911
- const getDataOptions = Object.assign({}, options, options.readerOptions, {
10162
+ const getDataOptions = Object.assign({}, options, readerOptions, {
9912
10163
  signal,
9913
10164
  onstart: UNDEFINED_VALUE,
9914
10165
  onprogress: UNDEFINED_VALUE,
@@ -10208,6 +10459,7 @@
10208
10459
  exports.ERR_DUPLICATED_NAME = ERR_DUPLICATED_NAME;
10209
10460
  exports.ERR_ENCRYPTED = ERR_ENCRYPTED;
10210
10461
  exports.ERR_ENCRYPTED_CENTRAL_DIRECTORY = ERR_ENCRYPTED_CENTRAL_DIRECTORY;
10462
+ exports.ERR_ENTRY_DATA_OUT_OF_BOUNDS = ERR_ENTRY_DATA_OUT_OF_BOUNDS;
10211
10463
  exports.ERR_ENTRY_EXISTS = ERR_ENTRY_EXISTS;
10212
10464
  exports.ERR_EOCDR_LOCATOR_ZIP64_NOT_FOUND = ERR_EOCDR_LOCATOR_ZIP64_NOT_FOUND;
10213
10465
  exports.ERR_EOCDR_NOT_FOUND = ERR_EOCDR_NOT_FOUND;
@@ -10221,20 +10473,28 @@
10221
10473
  exports.ERR_INVALID_COMMENT_TYPE = ERR_INVALID_COMMENT_TYPE;
10222
10474
  exports.ERR_INVALID_COMPRESSED_DATA = ERR_INVALID_COMPRESSED_DATA;
10223
10475
  exports.ERR_INVALID_CRC32 = ERR_INVALID_CRC32;
10476
+ exports.ERR_INVALID_DATE = ERR_INVALID_DATE;
10224
10477
  exports.ERR_INVALID_ENCRYPTION_STRENGTH = ERR_INVALID_ENCRYPTION_STRENGTH;
10225
10478
  exports.ERR_INVALID_ENTRY_COMMENT = ERR_INVALID_ENTRY_COMMENT;
10479
+ exports.ERR_INVALID_ENTRY_COMMENT_TYPE = ERR_INVALID_ENTRY_COMMENT_TYPE;
10226
10480
  exports.ERR_INVALID_ENTRY_NAME = ERR_INVALID_ENTRY_NAME;
10481
+ exports.ERR_INVALID_EXTRAFIELD = ERR_INVALID_EXTRAFIELD;
10227
10482
  exports.ERR_INVALID_EXTRAFIELD_DATA = ERR_INVALID_EXTRAFIELD_DATA;
10483
+ exports.ERR_INVALID_EXTRAFIELD_DATA_TYPE = ERR_INVALID_EXTRAFIELD_DATA_TYPE;
10228
10484
  exports.ERR_INVALID_EXTRAFIELD_TYPE = ERR_INVALID_EXTRAFIELD_TYPE;
10229
10485
  exports.ERR_INVALID_FILENAME_VALIDATION = ERR_INVALID_FILENAME_VALIDATION;
10486
+ exports.ERR_INVALID_FUNCTION_OPTION = ERR_INVALID_FUNCTION_OPTION;
10230
10487
  exports.ERR_INVALID_GID = ERR_INVALID_GID;
10231
10488
  exports.ERR_INVALID_LEVEL = ERR_INVALID_LEVEL;
10232
10489
  exports.ERR_INVALID_MAX_APPENDED_DATA_SIZE = ERR_INVALID_MAX_APPENDED_DATA_SIZE;
10490
+ exports.ERR_INVALID_MAX_WORKERS = ERR_INVALID_MAX_WORKERS;
10233
10491
  exports.ERR_INVALID_MSDOS_ATTRIBUTES = ERR_INVALID_MSDOS_ATTRIBUTES;
10234
10492
  exports.ERR_INVALID_MSDOS_DATA = ERR_INVALID_MSDOS_DATA;
10235
10493
  exports.ERR_INVALID_PASSWORD = ERR_INVALID_PASSWORD;
10236
10494
  exports.ERR_INVALID_PASSWORD_TYPE = ERR_INVALID_PASSWORD_TYPE;
10237
10495
  exports.ERR_INVALID_PASS_THROUGH = ERR_INVALID_PASS_THROUGH;
10496
+ exports.ERR_INVALID_READER_OPTIONS = ERR_INVALID_READER_OPTIONS;
10497
+ exports.ERR_INVALID_SIGNAL = ERR_INVALID_SIGNAL;
10238
10498
  exports.ERR_INVALID_SIGNATURE = ERR_INVALID_SIGNATURE;
10239
10499
  exports.ERR_INVALID_SIGNATURE_DATA = ERR_INVALID_SIGNATURE_DATA;
10240
10500
  exports.ERR_INVALID_STRICTNESS = ERR_INVALID_STRICTNESS;
@@ -10250,6 +10510,7 @@
10250
10510
  exports.ERR_READABLE_CONSUMED = ERR_READABLE_CONSUMED;
10251
10511
  exports.ERR_RESERVED_COMPRESSION_METHOD = ERR_RESERVED_COMPRESSION_METHOD;
10252
10512
  exports.ERR_SPLIT_ZIP_FILE = ERR_SPLIT_ZIP_FILE;
10513
+ exports.ERR_UNDEFINED_COMPRESSION_METHOD = ERR_UNDEFINED_COMPRESSION_METHOD;
10253
10514
  exports.ERR_UNDEFINED_READER = ERR_UNDEFINED_READER;
10254
10515
  exports.ERR_UNDEFINED_UNCOMPRESSED_SIZE = ERR_UNDEFINED_UNCOMPRESSED_SIZE;
10255
10516
  exports.ERR_UNDETERMINED_SIZE = ERR_UNDETERMINED_SIZE;
@@ -10274,6 +10535,10 @@
10274
10535
  exports.Uint8ArrayReader = Uint8ArrayReader;
10275
10536
  exports.Uint8ArrayWriter = Uint8ArrayWriter;
10276
10537
  exports.Writer = Writer;
10538
+ exports.ZipDirectoryEntry = ZipDirectoryEntry;
10539
+ exports.ZipEntry = ZipEntry;
10540
+ exports.ZipFS = ZipFS;
10541
+ exports.ZipFileEntry = ZipFileEntry;
10277
10542
  exports.ZipReader = ZipReader;
10278
10543
  exports.ZipReaderStream = ZipReaderStream;
10279
10544
  exports.ZipWriter = ZipWriter;