@zip.js/zip.js 2.11.4 → 2.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/deno.json +1 -1
  2. package/dist/zip-core-external.js +427 -110
  3. package/dist/zip-core-external.min.js +1 -1
  4. package/dist/zip-core.js +437 -107
  5. package/dist/zip-core.min.js +1 -1
  6. package/dist/zip-fs-core-external.js +492 -230
  7. package/dist/zip-fs-core-external.min.js +1 -1
  8. package/dist/zip-fs-core.js +505 -227
  9. package/dist/zip-fs-core.min.js +1 -1
  10. package/dist/zip-fs-external.js +492 -230
  11. package/dist/zip-fs-external.min.js +1 -1
  12. package/dist/zip-fs-native.js +507 -229
  13. package/dist/zip-fs-native.min.js +1 -1
  14. package/dist/zip-fs.js +508 -230
  15. package/dist/zip-fs.min.js +1 -1
  16. package/dist/zip-legacy.js +439 -109
  17. package/dist/zip-legacy.min.js +1 -1
  18. package/dist/zip-native.js +439 -109
  19. package/dist/zip-native.min.js +1 -1
  20. package/dist/zip-web-worker-native.js +1 -1
  21. package/dist/zip-web-worker.js +1 -1
  22. package/dist/zip.js +440 -110
  23. package/dist/zip.min.js +1 -1
  24. package/index-native.cjs +507 -229
  25. package/index-native.min.js +1 -1
  26. package/index.cjs +508 -230
  27. package/index.d.cts +468 -59
  28. package/index.d.ts +468 -59
  29. package/index.min.js +1 -1
  30. package/lib/core/codec-worker-web.js +10 -2
  31. package/lib/core/codec-worker.js +4 -3
  32. package/lib/core/configuration.js +20 -5
  33. package/lib/core/constants.js +2 -0
  34. package/lib/core/io.js +13 -5
  35. package/lib/core/options.js +16 -0
  36. package/lib/core/streams/codec-stream.js +6 -0
  37. package/lib/core/util/warnings.js +42 -0
  38. package/lib/core/version.js +1 -1
  39. package/lib/core/web-worker-base.js +4 -3
  40. package/lib/core/web-worker-inline-native.js +1 -1
  41. package/lib/core/web-worker-inline-wasm.js +1 -1
  42. package/lib/core/zip-entry.js +49 -1
  43. package/lib/core/zip-fs.js +43 -132
  44. package/lib/core/zip-reader.js +106 -48
  45. package/lib/core/zip-writer.js +236 -54
  46. package/lib/zip-core-base.js +9 -3
  47. package/lib/zip-core-reader.js +2 -0
  48. package/lib/zip-core-writer.js +6 -1
  49. package/lib/zip-module-wasm-base.js +2 -2
  50. package/package.json +5 -3
package/dist/zip-fs.js CHANGED
@@ -134,6 +134,7 @@
134
134
  const BOOLEAN_TYPE = "boolean";
135
135
 
136
136
  const EMPTY_UINT8_ARRAY = new Uint8Array();
137
+ const SYMBOL_ASYNC_DISPOSE = Symbol.asyncDispose || Symbol();
137
138
 
138
139
  /*
139
140
  Copyright (c) 2022 Gildas Lormeau. All rights reserved.
@@ -178,6 +179,7 @@
178
179
  const OPTION_CHECK_OVERLAPPING_ENTRY = "checkOverlappingEntry";
179
180
  const OPTION_CHECK_AMBIGUITY = "checkAmbiguity";
180
181
  const OPTION_CHECK_LOCAL_DIRECTORY = "checkLocalDirectory";
182
+ const OPTION_CHECK_LOCAL_FILENAME = "checkLocalFilename";
181
183
  const OPTION_CHECK_SIGNATURE = "checkSignature";
182
184
  const OPTION_CHECK_CRC32 = "checkCrc32";
183
185
  const OPTION_CHECK_AUTHENTICATION_CODE = "checkAuthenticationCode";
@@ -208,15 +210,18 @@
208
210
  const OPTION_MAX_APPENDED_DATA_SIZE = "maxAppendedDataSize";
209
211
  const OPTION_DECRYPT_CENTRAL_DIRECTORY = "decryptCentralDirectory";
210
212
  const OPTION_SIGN_CENTRAL_DIRECTORY = "signCentralDirectory";
213
+ const OPTION_ENTRY = "entry";
211
214
  const TEXT_TYPE_FILENAME = "filename";
212
215
  const TEXT_TYPE_COMMENT = "comment";
213
216
  const STRICTNESS_STRICT = "strict";
214
217
  const STRICTNESS_BALANCED = "balanced";
215
218
  const STRICTNESS_TOLERANT = "tolerant";
219
+ const PASS_THROUGH_COMPRESSED = "compressed";
216
220
 
217
221
  const ERR_INVALID_FUNCTION_OPTION = "Invalid option (must be a function)";
218
222
  const ERR_INVALID_SIGNAL = "Invalid signal (must be an AbortSignal instance)";
219
223
  const ERR_INVALID_PASSWORD_TYPE = "Invalid password (password must be a string, rawPassword must be a Uint8Array)";
224
+ const ERR_INVALID_PASS_THROUGH_VALUE = "Invalid passThrough option (must be a boolean or 'compressed')";
220
225
  const ERR_ABORTED = "The operation was aborted";
221
226
  const ABORT_ERROR_NAME = "AbortError";
222
227
 
@@ -246,6 +251,13 @@
246
251
  }
247
252
  }
248
253
 
254
+ function checkPassThroughOption(passThrough) {
255
+ if (passThrough !== UNDEFINED_VALUE && typeof passThrough != BOOLEAN_TYPE && passThrough !== PASS_THROUGH_COMPRESSED) {
256
+ throw new Error(ERR_INVALID_PASS_THROUGH_VALUE);
257
+ }
258
+ return passThrough;
259
+ }
260
+
249
261
  function checkInteger(value, maxValue, errorMessage) {
250
262
  if (!Number.isInteger(value) || value < 0 || value > maxValue) {
251
263
  throw new Error(errorMessage);
@@ -295,6 +307,8 @@
295
307
  const MINIMUM_CHUNK_SIZE = 64;
296
308
  const MINIMUM_PROPERTY_VALUE = 1;
297
309
  const ERR_INVALID_MAX_WORKERS = "Invalid maxWorkers (must be an integer greater than 0)";
310
+ const ERR_INVALID_BASE_URI = "Invalid baseURI (must be a string)";
311
+ const ERR_INVALID_URI = "Invalid URI (must be a string or a function returning a string)";
298
312
  let maxWorkers = 2;
299
313
  try {
300
314
  if (typeof navigator != UNDEFINED_TYPE && navigator.hardwareConcurrency) {
@@ -319,9 +333,9 @@
319
333
  };
320
334
 
321
335
  const PROPERTY_NAME_MAX_WORKERS = "maxWorkers";
336
+ const PROPERTY_NAME_BASE_URI = "baseURI";
322
337
 
323
- const STRING_PROPERTY_NAMES = [
324
- "baseURI",
338
+ const URI_PROPERTY_NAMES = [
325
339
  "wasmURI",
326
340
  "workerURI"
327
341
  ];
@@ -345,7 +359,8 @@
345
359
  "DecompressionStreamFallback"
346
360
  ];
347
361
  const CONFIGURABLE_PROPERTY_NAMES = [
348
- ...STRING_PROPERTY_NAMES,
362
+ PROPERTY_NAME_BASE_URI,
363
+ ...URI_PROPERTY_NAMES,
349
364
  ...BOOLEAN_PROPERTY_NAMES,
350
365
  ...NUMBER_PROPERTY_NAMES,
351
366
  ...FUNCTION_PROPERTY_NAMES
@@ -389,6 +404,14 @@
389
404
  }
390
405
  } else if (FUNCTION_PROPERTY_NAMES.includes(propertyName)) {
391
406
  checkFunctionOption(propertyValue);
407
+ } else if (propertyName == PROPERTY_NAME_BASE_URI) {
408
+ if (propertyValue && typeof propertyValue != STRING_TYPE) {
409
+ throw new Error(ERR_INVALID_BASE_URI);
410
+ }
411
+ } else if (URI_PROPERTY_NAMES.includes(propertyName)) {
412
+ if (propertyValue && typeof propertyValue != STRING_TYPE && typeof propertyValue != FUNCTION_TYPE) {
413
+ throw new Error(ERR_INVALID_URI);
414
+ }
392
415
  }
393
416
  return propertyValue;
394
417
  }
@@ -422,7 +445,7 @@
422
445
  Object.assign(config, DEFAULT_CONFIGURATION);
423
446
  }
424
447
 
425
- 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$1="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",n$1=t=>t({workerURI:t=>{const n="text/javascript";let s='!function(t){"function"==typeof define&&define.amd?define(t):t()}(function(){"use strict";const{Array:t,Object:n,Number:e,Math:s,Error:r,Uint8Array:o,Uint16Array:c,Uint32Array:i,Int32Array:a,Map:f,DataView:u,Promise:l,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 n=t;for(let t=0;t<8;t++)n=1&n?n>>>1^3988292384:n>>>1;C[0][t]=n}for(let t=0;t<256;t++)for(let n=1;n<8;n++){const e=C[n-1][t];C[n][t]=e>>>8^C[0][255&e]}const[I,A,x,M,P,B,D,F]=C;class R{constructor(t){this.o=t||-1}append(t){let n=0|this.o;const e=0|t.length;let s=0;if(e>=8&&t.buffer){const r=new u(t.buffer,t.byteOffset,e),o=e-8;for(;s<=o;s+=8){const t=n^r.getInt32(s,!0),e=r.getInt32(s+4,!0);n=F[255&t]^D[t>>>8&255]^B[t>>>16&255]^P[t>>>24&255]^M[255&e]^x[e>>>8&255]^A[e>>>16&255]^I[e>>>24&255]}}for(;s<e;s++)n=n>>>8^I[255&(n^t[s])];this.o=n}get(){return~this.o}}class U extends d{constructor(){let t;const n=new R;super({transform(t,e){n.append(t),e.enqueue(t)},flush(){const e=new o(4);new u(e.buffer).setUint32(0,n.get()),t.value=e}}),t=this}}function W(t,n){const e=new o(t.length+n.length);return e.set(t),e.set(n,t.length),e}function _(t){return new u(t.buffer,t.byteOffset,t.byteLength)}const T={concat(t,n){if(0===t.length||0===n.length)return t.concat(n);const e=t[t.length-1],s=T.l(e);return 32===s?t.concat(n):T.h(n,s,0|e,t.slice(0,t.length-1))},bitLength(t){const n=t.length;if(0===n)return 0;const e=t[n-1];return 32*(n-1)+T.l(e)},m(t,n){if(32*t.length<n)return t;const e=(t=t.slice(0,s.ceil(n/32))).length;return n&=31,e>0&&n&&(t[e-1]=T.S(n,t[e-1]&2147483648>>n-1,1)),t},S:(t,n,e)=>32===t?n:(e?0|n:n<<32-t)+1099511627776*t,l:t=>s.round(t/1099511627776)||32,h(t,n,e,s){for(void 0===s&&(s=[]);n>=32;n-=32)s.push(e),e=0;if(0===n)return s.concat(t);for(let r=0;r<t.length;r++)s.push(e|t[r]>>>n),e=t[r]<<32-n;const r=t.length?t[t.length-1]:0,o=T.l(r);return s.push(T.S(n+o&31,n+o>32?e:s.pop(),1)),s}},V={bytes:{v(t){const n=T.bitLength(t)/8,e=new o(n);let s;for(let r=0;r<n;r++)3&r||(s=t[r/4]),e[r]=s>>>24,s<<=8;return e},C(t){const n=[];let e,s=0;for(e=0;e<t.length;e++)s=s<<8|t[e],3&~e||(n.push(s),s=0);return 3&e&&n.push(T.S(8*(3&e),s)),n}}},K=class{constructor(t){const n=this;n.blockSize=512,n.I=[1732584193,4023233417,2562383102,271733878,3285377520],n.A=[1518500249,1859775393,2400959708,3395469782],t?(n.M=t.M.slice(0),n.P=t.P.slice(0),n.B=t.B):n.reset()}reset(){const t=this;return t.M=t.I.slice(0),t.P=[],t.B=0,t}update(t){const n=this;"string"==typeof t&&(t=V.D.C(t));const e=n.P=T.concat(n.P,t),s=n.B,o=n.B=s+T.bitLength(t);if(o>9007199254740991)throw new r("Cannot hash more than 2^53 - 1 bits");const c=new i(e);let a=0;for(let t=n.blockSize+s-(n.blockSize+s&n.blockSize-1);t<=o;t+=n.blockSize)n.F(c.subarray(16*a,16*(a+1))),a+=1;return e.splice(0,16*a),n}R(){const t=this;let n=t.P;const e=t.M;n=T.concat(n,[T.S(1,1)]);for(let t=n.length+2;15&t;t++)n.push(0);for(n.push(s.floor(t.B/4294967296)),n.push(0|t.B);n.length;)t.F(n.splice(0,16));return t.reset(),e}U(t,n,e,s){return t<=19?n&e|~n&s:t<=39?n^e^s:t<=59?n&e|n&s|e&s:t<=79?n^e^s:void 0}W(t,n){return n<<t|n>>>32-t}F(n){const e=this,r=e.M,o=t(80);for(let t=0;t<16;t++)o[t]=n[t];let c=r[0],i=r[1],a=r[2],f=r[3],u=r[4];for(let t=0;t<=79;t++){t>=16&&(o[t]=e.W(1,o[t-3]^o[t-8]^o[t-14]^o[t-16]));const n=e.W(5,c)+e.U(t,i,a,f)+u+o[t]+e.A[s.floor(t/20)]|0;u=f,f=a,a=e.W(30,i),i=c,c=n}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]+u|0}},E={importKey:t=>new E._(V.bytes.C(t)),T(t,n,e,s){if(e=e||1e4,s<0||e<0)throw new r("invalid params to pbkdf2");const o=1+(s>>5)<<2;let c,i,a,f,l;const w=new ArrayBuffer(o),h=new u(w);let p=0;const d=T;for(n=V.bytes.C(n),l=1;p<(o||1);l++){for(c=i=t.encrypt(d.concat(n,[l])),a=1;a<e;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 n=this,e=n.V=K,s=[[],[]];n.K=[new e,new e];const r=n.K[0].blockSize/32;t.length>r&&(t=(new e).update(t).R());for(let n=0;n<r;n++)s[0][n]=909522486^t[n],s[1][n]=1549556828^t[n];n.K[0].update(s[0]),n.K[1].update(s[1]),n.L=new e(n.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,n=t.L.R(),e=new t.V(t.K[1]).update(n).R();return t.reset(),e}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="zipjs-abort-check-password";function H(t){if(L)return h.getRandomValues(t);throw new r("Crypto API not supported")}const N=16,q={name:"PBKDF2"},G=n.assign({hash:{name:"HMAC"}},q),J=n.assign({iterations:1e3,hash:{name:"SHA-1"}},q),Q=["deriveBits"],X=[8,12,16],Y=[16,24,32],Z=10,$=[0,0,0,0],tt=typeof h!=b,nt=tt&&h.subtle,et=tt&&typeof nt!=b,st=V.bytes,rt=class{constructor(t){const n=this;n.j=[[[],[],[],[],[]],[[],[],[],[],[]]],n.j[0][0][0]||n.H();const e=n.j[0][4],s=n.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(n.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=e[t>>>24]<<24^e[t>>16&255]<<16^e[t>>8&255]<<8^e[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 n=i[3&t?c:c-4];a[t]=c<=4||t<4?n:s[0][e[n>>>24]]^s[1][e[n>>16&255]]^s[2][e[n>>8&255]]^s[3][e[255&n]]}}encrypt(t){return this.N(t,0)}decrypt(t){return this.N(t,1)}H(){const t=this.j[0],n=this.j[1],e=t[4],s=n[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 u=c=0;!e[u];u^=i||1,c=o[c]||1){let o=c^c<<1^c<<2^c<<3^c<<4;o=o>>8^255&o^99,e[u]=o,s[o]=u,f=r[a=r[i=r[u]]];let l=16843009*f^65537*a^257*i^16843008*u,w=257*r[o]^16843008*o;for(let e=0;e<4;e++)t[e][u]=w=w<<24^w>>>8,n[e][o]=l=l<<24^l>>>8}for(let e=0;e<5;e++)t[e]=t[e].slice(0),n[e]=n[e].slice(0)}N(t,n){if(4!==t.length)throw new r("invalid aes block size");const e=this.A[n],s=e.length/4-2,o=[0,0,0,0],c=this.j[n],i=c[0],a=c[1],f=c[2],u=c[3],l=c[4];let w,h,p,d=t[0]^e[0],y=t[n?3:1]^e[1],m=t[2]^e[2],S=t[n?1:3]^e[3],g=4;for(let t=0;t<s;t++)w=i[d>>>24]^a[y>>16&255]^f[m>>8&255]^u[255&S]^e[g],h=i[y>>>24]^a[m>>16&255]^f[S>>8&255]^u[255&d]^e[g+1],p=i[m>>>24]^a[S>>16&255]^f[d>>8&255]^u[255&y]^e[g+2],S=i[S>>>24]^a[d>>16&255]^f[y>>8&255]^u[255&m]^e[g+3],g+=4,d=w,y=h,m=p;for(let t=0;t<4;t++)o[n?3&-t:t]=l[d>>>24]<<24^l[y>>16&255]<<16^l[m>>8&255]<<8^l[255&S]^e[g++],w=d,d=y,y=m,m=S,S=w;return o}},ot=class{constructor(t,n){this.G=t,this.J=n,this.X=n}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 n=t>>16&255,e=t>>8&255,s=255&t;255===n?(n=0,255===e?(e=0,255===s?s=0:++s):++e):++n,t=0,t+=n<<16,t+=e<<8,t+=s}return t}$(t){0===(t[0]=this.Z(t[0]))&&(t[1]=this.Z(t[1]))}Y(t,n,e){let s;if(!(s=n.length))return[];const r=T.bitLength(n);for(let r=0;r<s;r+=4){this.$(e);const s=t.encrypt(e);n[r]^=s[0],n[r+1]^=s[1],n[r+2]^=s[2],n[r+3]^=s[3]}return T.m(n,r)}},ct=E._;let it=tt&&et&&typeof nt.importKey==k,at=tt&&et&&typeof nt.deriveBits==k;class ft extends d{constructor({password:t,rawPassword:n,encryptionStrength:e,checkPasswordOnly:s,checkAuthenticationCode:c=!0}){super({start(){lt(this,t,n,e)},async transform(t,n){const e=this,{password:c,strength:i,nt:a,ready:f}=e;c?(await async function(t,n,e,s){const o=await ht(t,n,e,dt(s,0,X[n])),c=dt(s,X[n]);if(o[0]!=c[0]||o[1]!=c[1])throw new r(O)}(e,i,c,dt(t,0,X[i]+2)),t=dt(t,X[i]+2),s?n.error(new r(j)):a()):await f;const u=new o(t.length-Z-(t.length-Z)%N);n.enqueue(wt(e,t,u,0,Z,!0))},async flush(t){const{et:n,st:e,ot:s,ready:o}=this;if(e&&n){await o;const i=dt(s,0,s.length-Z),a=dt(s,s.length-Z);let f=z;if(i.length){const t=mt(st,i);e.update(t);const s=n.update(t);f=yt(st,s)}const u=dt(yt(st,e.digest()),0,Z);let l=s.length<Z?1:0;for(let t=0;t<Z;t++)l|=u[t]^a[t];if(l&&c)throw new r("Invalid authentication code");t.enqueue(f)}}})}}class ut extends d{constructor({password:t,rawPassword:n,encryptionStrength:e}){super({start(){lt(this,t,n,e)},async transform(t,n){const e=this,{password:s,strength:r,nt:c,ready:i}=e;let a=z;s?(a=await async function(t,n,e){const s=H(new o(X[n]));return W(s,await ht(t,n,e,s))}(e,r,s),c()):await i;const f=new o(a.length+t.length-t.length%N);f.set(a,0),n.enqueue(wt(e,t,f,a.length,0))},async flush(t){const{et:n,st:e,ot:s,ready:r}=this;if(e&&n){await r;let o=z;if(s.length){const t=n.update(mt(st,s));e.update(t),o=yt(st,t)}const c=yt(st,e.digest()).slice(0,Z);t.enqueue(W(o,c))}}})}}function lt(t,e,s,r){n.assign(t,{ready:new l(n=>t.nt=n),password:pt(e,s),strength:r-1,ot:z})}function wt(t,n,e,s,r,c){const{et:i,st:a,ot:f}=t;f.length&&(n=W(f,n));const u=n.length-r;let l;for(e=function(t,n){if(n&&n>t.length){const e=t;(t=new o(n)).set(e,0)}return t}(e,s+(u-u%N)),l=0;l<=u-N;l+=N){const t=mt(st,dt(n,l,l+N));c&&a.update(t);const r=i.update(t);c||a.update(r),e.set(yt(st,r),l+s)}return t.ot=dt(n,l),e}async function ht(e,s,r,c){e.password=null;const i=await async function(t,n,e,s,r){if(!it)return E.importKey(n);try{return await nt.importKey("raw",n,e,!1,r)}catch{return it=!1,E.importKey(n)}}(0,r,G,0,Q),a=await async function(t,n,e){if(!at)return E.T(n,t.salt,J.iterations,e);try{return await nt.deriveBits(t,n,e)}catch{return at=!1,E.T(n,t.salt,J.iterations,e)}}(n.assign({salt:c},J),i,8*(2*Y[s]+2)),f=new o(a),u=mt(st,dt(f,0,Y[s])),l=mt(st,dt(f,Y[s],2*Y[s])),w=dt(f,2*Y[s]);return n.assign(e,{keys:{key:u,ct:l,passwordVerification:w},et:new ot(new rt(u),t.from($)),st:new ct(l)}),w}function pt(t,n){return n===v?function(t){if(typeof w==b){t=unescape(encodeURIComponent(t));const n=new o(t.length);for(let e=0;e<n.length;e++)n[e]=t.charCodeAt(e);return n}return(new w).encode(t)}(t):n}function dt(t,n,e){return t.subarray(n,e)}function yt(t,n){return t.v(n)}function mt(t,n){return t.C(n)}class St extends d{constructor({password:t,rawPassword:n,passwordVerification:e,checkPasswordOnly:s}){super({start(){vt(this,t,n,e)},transform(t,n){const e=this;if(e.password||e.rawPassword){const n=bt(e,t.subarray(0,12));if(e.password=e.rawPassword=null,0!=(n[11]^e.passwordVerification))throw new r(O);t=t.subarray(12)}s?n.error(new r(j)):n.enqueue(bt(e,t))}})}}class gt extends d{constructor({password:t,rawPassword:n,passwordVerification:e}){super({start(){vt(this,t,n,e)},transform(t,n){const e=this;let s,r;if(e.password||e.rawPassword){e.password=e.rawPassword=null;const n=H(new o(12));n[11]=e.passwordVerification,s=new o(t.length+n.length),s.set(kt(e,n),0),r=12}else s=new o(t.length),r=0;s.set(kt(e,t),r),n.enqueue(s)}})}}function vt(t,e,s,r){n.assign(t,{password:e,rawPassword:s,passwordVerification:r}),function(t,e,s){const r=[305419896,591751049,878082192];if(n.assign(t,{keys:r,it:new R(r[0]),ft:new R(r[2])}),s)for(let n=0;n<s.length;n++)zt(t,s[n]);else for(let n=0;n<e.length;n++)zt(t,e.charCodeAt(n))}(t,e,s)}function bt(t,n){const e=new o(n.length);for(let s=0;s<n.length;s++)e[s]=Ct(t)^n[s],zt(t,e[s]);return e}function kt(t,n){const e=new o(n.length);for(let s=0;s<n.length;s++)e[s]=Ct(t)^n[s],zt(t,n[s]);return e}function zt(t,n){let[,e]=t.keys;t.it.append([n]);const r=~t.it.get();e=At(s.imul(At(e+It(r)),134775813)+1),t.ft.append([e>>>24]);const o=~t.ft.get();t.keys=[r,e,o]}function Ct(t){const n=2|t.keys[2];return It(s.imul(n,1^n)>>>8)}function It(t){return 255&t}function At(t){return 4294967295&t}function xt(t){if(t instanceof y)return t;const n=t.getReader();return new y({async pull(t){const{value:e,done:s}=await n.read();s?t.close():t.enqueue(e)},cancel:t=>n.cancel(t)})}const Mt=new f;function Pt(t){return Mt.get(t)}const Bt="Invalid uncompressed size",Dt="deflate-raw",Ft="gzip",Rt=[31,139,8];class Ut extends d{constructor(t,{chunkSize:n,CompressionStreamFallback:e,CompressionStream:s}){super({});const{compressed:r,encrypted:o,useCompressionStream:c,zipCrypto:i,computeCrc32:a,level:f,deflate64:l,format:w,compressionMethod:h,inputSize:p}=t,d=this;let y,m,S,g=super.readable;const v=w&&Pt(w),b=a&&r&&!l&&!v&&(!o||i)&&Boolean(c&&s);if(o&&!i||!a||b||(y=new U,g=Lt(g,y)),r)if(v)g=Ot(g,Kt(v.CompressionStream,w,{level:f,chunkSize:n,compressionMethod:h,uncompressedSize:p}));else if(b)S=new Wt,g=Ot(g,new s(Ft)),g=Lt(g,S);else try{g=Et(g,c,{level:f,chunkSize:n},s,e)}catch(t){let n;try{n=new s(Ft)}catch{throw t}g=Ot(g,n),g=Lt(g,new Wt)}o&&(i?g=Lt(g,new gt(t)):(m=new ut(t),g=Lt(g,m))),Vt(d,g,()=>{o&&!i||!a||(d.crc32=b?S.crc32:new u(y.value.buffer).getUint32(0))})}}class Wt extends d{constructor(){let t,n=10,e=new o(0);super({transform(t,r){if(n){const e=s.min(n,t.length);if(n-=e,!(t=t.subarray(e)).length)return}const o=e.length+t.length;if(o<=8)return void(e=W(e,t));const c=o-8,i=s.min(c,e.length);r.enqueue(W(e.subarray(0,i),t.subarray(0,c-i))),e=W(e.subarray(i),t.subarray(c-i))},flush(){const n=_(e);t.crc32=n.getUint32(0,!0),t.uncompressedSize=n.getUint32(4,!0)}}),t=this}}class _t extends d{constructor(t,{chunkSize:n,DecompressionStreamFallback:e,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=Lt(C,new St(t)):(z=new ft(t),C=Lt(C,z))),w){const t=m&&Pt(m);if(t)C=Ot(C,Kt(t.DecompressionStream,m,{chunkSize:n,compressionMethod:S,rawBitFlag:g,uncompressedSize:b}));else try{C=Et(C,h,{chunkSize:n,deflate64:p},s,e)}catch(t){if(p||b===v)throw t;let n;try{n=new s(Ft)}catch{throw t}C=function(t,n,e){const s=new R;let c,i,a,f=0,u=!1;const w=new l((t,n)=>{i=t,a=n});w.catch(()=>{}),e||i();const h=new d({start(t){const n=new o(10);n.set(Rt),t.enqueue(n)},transform(t,n){n.enqueue(t)},async flush(t){u=!0,y();try{await w}finally{m()}const n=new o(8),r=_(n);r.setUint32(0,s.get(),!0),r.setUint32(4,e,!0),t.enqueue(n)},cancel(t){a(t)}}),p=new d({transform(t,n){s.append(t),f+=t.length,f>=e?i():u&&y(),n.enqueue(t)},cancel(t){a(t)}});return t=Lt(t,h),Lt(t=Ot(t,n),p);function y(){m(),c=setTimeout(()=>a(new r(Bt)),5e3)}function m(){clearTimeout(c)}}(C,n,b)}C=function(t){const n=t.getReader();return new y({async pull(t){let e;try{e=await n.read()}catch(t){if(t&&t.message)throw t;const n=new r("Invalid compressed data");throw n.cause=t,n}const{value:s,done:o}=e;o?t.close():t.enqueue(s)},cancel:t=>n.cancel(t)})}(C)}a&&(k=new U,C=Lt(C,k)),Vt(this,C,()=>{if(a){const t=new u(k.value.buffer);if(f!=t.getUint32(0,!1))throw new r("Invalid CRC32")}})}}const Tt=new f;function Vt(t,e,s){e=Lt(e,new d({flush:s})),n.defineProperty(t,"readable",{get:()=>e})}function Kt(t,n,e){if(!t)throw new r("Compression method not supported");return new t(n,e)}function Et(t,n,e,s,r){const o=n&&s?s:r||s,c=e.deflate64?"deflate64-raw":Dt;let i;try{i=new o(c,e)}catch(t){if(!n||!r||o==r)throw t;i=new r(c,e)}return Ot(t,i)}function Lt(t,n){return xt(t).pipeThrough(n)}function Ot(t,n){const e=n.writable.getWriter(),s=t.getReader();return async function(){try{for(;;){await e.ready;const t=await s.read();if(t.done){await e.close();break}await e.write(t.value)}}catch(t){await async function(t,n){try{await t.abort(n)}catch{}}(e,t),await async function(t,n){try{await t.cancel(n)}catch{}}(s,t)}}(),n.readable}const jt="data",Ht="close",Nt="deflate";class qt extends d{constructor(t,e){super({});const s=this,{codecType:o}=t;let c;o.startsWith(Nt)?c=Ut:o.startsWith("inflate")&&(c=_t),s.outputSize=0;let i=0;const a=new c(t,e),f=super.readable,u=new d({transform(t,n){t&&t.length&&(i+=t.length,n.enqueue(t))},flush(){n.assign(s,{inputSize:i})}}),l=new d({transform(n,e){if(n&&n.length&&(e.enqueue(n),s.outputSize+=n.length,t.outputSize!==v&&s.outputSize>t.outputSize))throw new r(Bt)},flush(){const{crc32:t}=a;n.assign(s,{crc32:t,inputSize:i})}});n.defineProperty(s,"readable",{get:()=>f.pipeThrough(u).pipeThrough(a).pipeThrough(l)})}}class Gt extends d{constructor(t){const n=[];let s=0;function r(){const e=new o(t);let r=0;for(;r<t;){const s=n[0],o=t-r;s.length<=o?(e.set(s,r),r+=s.length,n.shift()):(e.set(s.subarray(0,o),r),n[0]=s.subarray(o),r+=o)}return s-=t,e}(!e.isFinite(t)||t<1)&&(t=65536),super({transform(e,o){for(n.push(e),s+=e.length;s>t;)o.enqueue(r())},flush(t){s&&t.enqueue(function(t,n){const e=new o(n);let s=0;for(const n of t)e.set(n,s),s+=n.length;return e}(n,s))}})}}let Jt=2;try{typeof navigator!=b&&navigator.hardwareConcurrency&&(Jt=navigator.hardwareConcurrency)}catch{}const Qt=new f,Xt=new f;let Yt,Zt=0;async function $t(t){let n,o;try{const{options:c,config:i}=t;if(c.format)try{await async function(t,n){!Mt.has(t)&&n&&function(t,n){const{CompressionStream:e,DecompressionStream:s}=n;if(typeof e!=k&&typeof s!=k)throw new r("Invalid codec module");Mt.set(t,{CompressionStream:e,DecompressionStream:s})}(t,await(import(n)))}(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(!function(t,n){if(!t)return!1;let e=Tt.get(t);e||(e=new f,Tt.set(t,e));let s=e.get(n);if(s===v){try{new t(n),s=!0}catch{s=!1}e.set(n,s)}return s}(c.codecType.startsWith(Nt)?i.CompressionStream:i.DecompressionStream,Dt))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},u=t.readable?xt(t.readable):new y({async pull(t){const n=new l(t=>Qt.set(Zt,t));tn({type:"pull",messageId:Zt}),Zt=(Zt+1)%e.MAX_SAFE_INTEGER;const{value:s,done:r}=await n;t.enqueue(s),r&&t.close()}},a);o=t.writable?function(t){if(t instanceof m)return t;const n=t.getWriter();return new m({write:t=>n.write(t),close:()=>n.close(),abort:t=>n.abort(t)})}(t.writable):new m({async write(t){let n;const s=new l(t=>n=t);Xt.set(Zt,n),tn({type:jt,value:t,messageId:Zt}),Zt=(Zt+1)%e.MAX_SAFE_INTEGER,await s}},a),n=new qt(c,i),Yt=new AbortController;const{signal:w}=Yt;await u.pipeThrough(n).pipeThrough(new Gt(function(t){return r="string"==typeof(n=r=t.chunkSize)&&n.trim()?e(n):n,e.isInteger(r)&&r>=1?s.max(r,64):65536;var n,r}(i))).pipeTo(o,{signal:w,preventClose:!0,preventAbort:!0}),await o.getWriter().close();const{crc32:h,inputSize:p,outputSize:d}=n;tn({type:Ht,result:{crc32:h,inputSize:p,outputSize:d}})}catch(t){if(t.outputSize=n?n.outputSize:0,o&&!o.locked)try{await o.getWriter().close()}catch{}nn(t)}}function tn(t){const{value:n}=t;if(n)if(n.length)try{t.value=(e=n,e.byteOffset||e.byteLength!=e.buffer.byteLength?new o(e):e).buffer,p(t,[t.value])}catch{p(t)}else p(t);else p(t);var e}function nn(t=new r("Unknown error")){const{message:n,stack:e,code:s,name:o,outputSize:c,cause:i,codecImportFailed:a}=t,f={message:n,stack:e,code:s,name:o,outputSize:c};i&&(f.cause={name:i.name,message:i.message}),a&&(f.codecImportFailed=!0),p({error:f})}addEventListener("message",({data:t})=>{const{type:n,messageId:e,value:s,done:r}=t;try{if("start"==n&&$t(t),n==jt){const t=Qt.get(e);Qt.delete(e),t({value:s||new o,done:r})}if("ack"==n){const t=Xt.get(e);Xt.delete(e),t()}n==Ht&&Yt.abort()}catch(t){nn(t)}}),p({type:"ready"});const en="deflate",sn="deflate-raw",rn="deflate64-raw",on="gzip";let cn,an,fn,un,ln;function wn(t,n,e={}){if(!cn){const t=new r("WASM module not loaded");throw t.cause=ln,t}const c="number"==typeof e.level?e.level:-1,i="number"==typeof e.outBuffer?e.outBuffer:65536,a="number"==typeof e.inBufferSize?e.inBufferSize:65536;return new d({start(){try{let e;if(this.ut=an(i),this.in=an(a),this.inBufferSize=a,!this.ut||!this.in)throw new r("allocation failed");if(this.lt=new o(i),t?(this.wt=cn.deflate_process,this.ht=cn.deflate_last_consumed,this.yt=cn.deflate_end,this.St=cn.deflate_new(),e=n===on?cn.deflate_init_gzip(this.St,c):n===sn?cn.deflate_init_raw(this.St,c):cn.deflate_init(this.St,c)):n===rn?(this.wt=cn.inflate9_process,this.ht=cn.inflate9_last_consumed,this.yt=cn.inflate9_end,this.St=cn.inflate9_new(),e=cn.inflate9_init_raw(this.St)):(this.wt=cn.inflate_process,this.ht=cn.inflate_last_consumed,this.yt=cn.inflate_end,this.St=cn.inflate_new(),e=n===sn?cn.inflate_init_raw(this.St):n===on?cn.inflate_init_gzip(this.St):cn.inflate_init(this.St)),0!==e)throw new r("init failed:"+e)}catch(t){throw f(this),t}},transform(t,n){try{const e=t,c=new o(un.buffer),a=this.wt,f=this.ht,u=this.ut,l=this.lt;let w=0;for(;w<e.length;){const t=s.min(e.length-w,32768);if((!this.in||this.inBufferSize<t)&&(this.in&&fn&&(fn(this.in),this.in=0),this.in=an(t),this.inBufferSize=t,!this.in))throw new r("allocation failed");c.set(e.subarray(w,w+t),this.in);const o=a(this.St,this.in,t,u,i,0),h=o>>24&255,p=128&h?h-256:h;if(p<0)throw new r("process error:"+p);const d=16777215&o;d&&(l.set(c.subarray(u,u+d),0),n.enqueue(l.slice(0,d)));const y=f(this.St);if(0===y&&0===d)break;w+=y}}catch(t){f(this),n.error(t)}},flush(t){try{const n=new o(un.buffer),e=this.wt,s=this.ut,c=this.lt;for(;;){const o=e(this.St,0,0,s,i,4),a=o>>24&255,f=128&a?a-256:a;if(f<0)throw new r("process error:"+f);const u=16777215&o;if(u&&(c.set(n.subarray(s,s+u),0),t.enqueue(c.slice(0,u))),1===a||0===u)break}}catch(n){t.error(n)}finally{const n=f(this);0!==n&&t.error(new r("end error:"+n))}},cancel(){f(this)}});function f(t){let n=0;return t.St&&t.yt&&(n=t.yt(t.St)),t.St=0,t.in&&fn&&fn(t.in),t.in=0,t.ut&&fn&&fn(t.ut),t.ut=0,n}}class hn{constructor(t=en,n){return wn(!0,t,n)}}class pn{constructor(t=en,n){return wn(!1,t,n)}}hn.gt=!0,pn.gt=!0,hn.vt=[en,sn,on],pn.vt=[en,sn,on,rn];let dn=!1;!function(t={}){const{init:n}=t,e=t.CompressionStreamFallback||t.CompressionStreamZlib,s=t.DecompressionStreamFallback||t.DecompressionStreamZlib;self.initModule=async t=>{n&&await n(t),e&&(t.CompressionStreamFallback=e),s&&(t.DecompressionStreamFallback=s)}}({CompressionStreamFallback:hn,DecompressionStreamFallback:pn,init:t=>async function(t,{baseURI:n}){if(!dn)try{await async function(t,n){let e,s;try{try{s=new URL(t,n)}catch{}const r=await fetch(s);e=await r.arrayBuffer()}catch(n){if(!t.startsWith("data:application/wasm;base64,"))throw n;e=function(t){const n=t.split(",")[1],e=atob(n),s=e.length,r=new o(s);for(let t=0;t<s;++t)r[t]=e.charCodeAt(t);return r.buffer}(t)}!function(t){if(cn=t,({malloc:an,free:fn,memory:un}=cn),"function"!=typeof an||"function"!=typeof fn||!un)throw cn=an=fn=un=null,new r("Invalid WASM module")}((await WebAssembly.instantiate(e)).instance.exports)}(t,n),dn=!0}catch(t){throw function(t){ln=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,"+function(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$1[s>>18&63]+e$1[s>>12&63]+e$1[s>>6&63]+e$1[63&s];}const o=s-r;if(1===o){const s=t[r]<<16;n+=e$1[s>>18&63]+e$1[s>>12&63]+"==";}else if(2===o){const s=t[r]<<16|t[r+1]<<8;n+=e$1[s>>18&63]+e$1[s>>12&63]+e$1[s>>6&63]+"=";}return n}(s)}});
448
+ 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$1="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",n$1=t=>t({workerURI:t=>{const n="text/javascript";let s='!function(t){"function"==typeof define&&define.amd?define(t):t()}(function(){"use strict";const{Array:t,Object:n,Number:e,Math:s,Error:r,Uint8Array:o,Uint16Array:c,Uint32Array:i,Int32Array:a,Map:f,DataView:u,Promise:l,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 n=t;for(let t=0;t<8;t++)n=1&n?n>>>1^3988292384:n>>>1;C[0][t]=n}for(let t=0;t<256;t++)for(let n=1;n<8;n++){const e=C[n-1][t];C[n][t]=e>>>8^C[0][255&e]}const[I,A,x,M,P,B,D,F]=C;class R{constructor(t){this.o=t||-1}append(t){let n=0|this.o;const e=0|t.length;let s=0;if(e>=8&&t.buffer){const r=new u(t.buffer,t.byteOffset,e),o=e-8;for(;s<=o;s+=8){const t=n^r.getInt32(s,!0),e=r.getInt32(s+4,!0);n=F[255&t]^D[t>>>8&255]^B[t>>>16&255]^P[t>>>24&255]^M[255&e]^x[e>>>8&255]^A[e>>>16&255]^I[e>>>24&255]}}for(;s<e;s++)n=n>>>8^I[255&(n^t[s])];this.o=n}get(){return~this.o}}class U extends d{constructor(){let t;const n=new R;super({transform(t,e){n.append(t),e.enqueue(t)},flush(){const e=new o(4);new u(e.buffer).setUint32(0,n.get()),t.value=e}}),t=this}}function W(t,n){const e=new o(t.length+n.length);return e.set(t),e.set(n,t.length),e}function _(t){return new u(t.buffer,t.byteOffset,t.byteLength)}const T={concat(t,n){if(0===t.length||0===n.length)return t.concat(n);const e=t[t.length-1],s=T.l(e);return 32===s?t.concat(n):T.h(n,s,0|e,t.slice(0,t.length-1))},bitLength(t){const n=t.length;if(0===n)return 0;const e=t[n-1];return 32*(n-1)+T.l(e)},m(t,n){if(32*t.length<n)return t;const e=(t=t.slice(0,s.ceil(n/32))).length;return n&=31,e>0&&n&&(t[e-1]=T.S(n,t[e-1]&2147483648>>n-1,1)),t},S:(t,n,e)=>32===t?n:(e?0|n:n<<32-t)+1099511627776*t,l:t=>s.round(t/1099511627776)||32,h(t,n,e,s){for(void 0===s&&(s=[]);n>=32;n-=32)s.push(e),e=0;if(0===n)return s.concat(t);for(let r=0;r<t.length;r++)s.push(e|t[r]>>>n),e=t[r]<<32-n;const r=t.length?t[t.length-1]:0,o=T.l(r);return s.push(T.S(n+o&31,n+o>32?e:s.pop(),1)),s}},V={bytes:{v(t){const n=T.bitLength(t)/8,e=new o(n);let s;for(let r=0;r<n;r++)3&r||(s=t[r/4]),e[r]=s>>>24,s<<=8;return e},C(t){const n=[];let e,s=0;for(e=0;e<t.length;e++)s=s<<8|t[e],3&~e||(n.push(s),s=0);return 3&e&&n.push(T.S(8*(3&e),s)),n}}},K=class{constructor(t){const n=this;n.blockSize=512,n.I=[1732584193,4023233417,2562383102,271733878,3285377520],n.A=[1518500249,1859775393,2400959708,3395469782],t?(n.M=t.M.slice(0),n.P=t.P.slice(0),n.B=t.B):n.reset()}reset(){const t=this;return t.M=t.I.slice(0),t.P=[],t.B=0,t}update(t){const n=this;"string"==typeof t&&(t=V.D.C(t));const e=n.P=T.concat(n.P,t),s=n.B,o=n.B=s+T.bitLength(t);if(o>9007199254740991)throw new r("Cannot hash more than 2^53 - 1 bits");const c=new i(e);let a=0;for(let t=n.blockSize+s-(n.blockSize+s&n.blockSize-1);t<=o;t+=n.blockSize)n.F(c.subarray(16*a,16*(a+1))),a+=1;return e.splice(0,16*a),n}R(){const t=this;let n=t.P;const e=t.M;n=T.concat(n,[T.S(1,1)]);for(let t=n.length+2;15&t;t++)n.push(0);for(n.push(s.floor(t.B/4294967296)),n.push(0|t.B);n.length;)t.F(n.splice(0,16));return t.reset(),e}U(t,n,e,s){return t<=19?n&e|~n&s:t<=39?n^e^s:t<=59?n&e|n&s|e&s:t<=79?n^e^s:void 0}W(t,n){return n<<t|n>>>32-t}F(n){const e=this,r=e.M,o=t(80);for(let t=0;t<16;t++)o[t]=n[t];let c=r[0],i=r[1],a=r[2],f=r[3],u=r[4];for(let t=0;t<=79;t++){t>=16&&(o[t]=e.W(1,o[t-3]^o[t-8]^o[t-14]^o[t-16]));const n=e.W(5,c)+e.U(t,i,a,f)+u+o[t]+e.A[s.floor(t/20)]|0;u=f,f=a,a=e.W(30,i),i=c,c=n}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]+u|0}},E={importKey:t=>new E._(V.bytes.C(t)),T(t,n,e,s){if(e=e||1e4,s<0||e<0)throw new r("invalid params to pbkdf2");const o=1+(s>>5)<<2;let c,i,a,f,l;const w=new ArrayBuffer(o),h=new u(w);let p=0;const d=T;for(n=V.bytes.C(n),l=1;p<(o||1);l++){for(c=i=t.encrypt(d.concat(n,[l])),a=1;a<e;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 n=this,e=n.V=K,s=[[],[]];n.K=[new e,new e];const r=n.K[0].blockSize/32;t.length>r&&(t=(new e).update(t).R());for(let n=0;n<r;n++)s[0][n]=909522486^t[n],s[1][n]=1549556828^t[n];n.K[0].update(s[0]),n.K[1].update(s[1]),n.L=new e(n.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,n=t.L.R(),e=new t.V(t.K[1]).update(n).R();return t.reset(),e}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="zipjs-abort-check-password";function H(t){if(L)return h.getRandomValues(t);throw new r("Crypto API not supported")}const N=16,q={name:"PBKDF2"},G=n.assign({hash:{name:"HMAC"}},q),J=n.assign({iterations:1e3,hash:{name:"SHA-1"}},q),Q=["deriveBits"],X=[8,12,16],Y=[16,24,32],Z=10,$=[0,0,0,0],tt=typeof h!=b,nt=tt&&h.subtle,et=tt&&typeof nt!=b,st=V.bytes,rt=class{constructor(t){const n=this;n.j=[[[],[],[],[],[]],[[],[],[],[],[]]],n.j[0][0][0]||n.H();const e=n.j[0][4],s=n.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(n.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=e[t>>>24]<<24^e[t>>16&255]<<16^e[t>>8&255]<<8^e[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 n=i[3&t?c:c-4];a[t]=c<=4||t<4?n:s[0][e[n>>>24]]^s[1][e[n>>16&255]]^s[2][e[n>>8&255]]^s[3][e[255&n]]}}encrypt(t){return this.N(t,0)}decrypt(t){return this.N(t,1)}H(){const t=this.j[0],n=this.j[1],e=t[4],s=n[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 u=c=0;!e[u];u^=i||1,c=o[c]||1){let o=c^c<<1^c<<2^c<<3^c<<4;o=o>>8^255&o^99,e[u]=o,s[o]=u,f=r[a=r[i=r[u]]];let l=16843009*f^65537*a^257*i^16843008*u,w=257*r[o]^16843008*o;for(let e=0;e<4;e++)t[e][u]=w=w<<24^w>>>8,n[e][o]=l=l<<24^l>>>8}for(let e=0;e<5;e++)t[e]=t[e].slice(0),n[e]=n[e].slice(0)}N(t,n){if(4!==t.length)throw new r("invalid aes block size");const e=this.A[n],s=e.length/4-2,o=[0,0,0,0],c=this.j[n],i=c[0],a=c[1],f=c[2],u=c[3],l=c[4];let w,h,p,d=t[0]^e[0],y=t[n?3:1]^e[1],m=t[2]^e[2],S=t[n?1:3]^e[3],g=4;for(let t=0;t<s;t++)w=i[d>>>24]^a[y>>16&255]^f[m>>8&255]^u[255&S]^e[g],h=i[y>>>24]^a[m>>16&255]^f[S>>8&255]^u[255&d]^e[g+1],p=i[m>>>24]^a[S>>16&255]^f[d>>8&255]^u[255&y]^e[g+2],S=i[S>>>24]^a[d>>16&255]^f[y>>8&255]^u[255&m]^e[g+3],g+=4,d=w,y=h,m=p;for(let t=0;t<4;t++)o[n?3&-t:t]=l[d>>>24]<<24^l[y>>16&255]<<16^l[m>>8&255]<<8^l[255&S]^e[g++],w=d,d=y,y=m,m=S,S=w;return o}},ot=class{constructor(t,n){this.G=t,this.J=n,this.X=n}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 n=t>>16&255,e=t>>8&255,s=255&t;255===n?(n=0,255===e?(e=0,255===s?s=0:++s):++e):++n,t=0,t+=n<<16,t+=e<<8,t+=s}return t}$(t){0===(t[0]=this.Z(t[0]))&&(t[1]=this.Z(t[1]))}Y(t,n,e){let s;if(!(s=n.length))return[];const r=T.bitLength(n);for(let r=0;r<s;r+=4){this.$(e);const s=t.encrypt(e);n[r]^=s[0],n[r+1]^=s[1],n[r+2]^=s[2],n[r+3]^=s[3]}return T.m(n,r)}},ct=E._;let it=tt&&et&&typeof nt.importKey==k,at=tt&&et&&typeof nt.deriveBits==k;class ft extends d{constructor({password:t,rawPassword:n,encryptionStrength:e,checkPasswordOnly:s,checkAuthenticationCode:c=!0}){super({start(){lt(this,t,n,e)},async transform(t,n){const e=this,{password:c,strength:i,nt:a,ready:f}=e;c?(await async function(t,n,e,s){const o=await ht(t,n,e,dt(s,0,X[n])),c=dt(s,X[n]);if(o[0]!=c[0]||o[1]!=c[1])throw new r(O)}(e,i,c,dt(t,0,X[i]+2)),t=dt(t,X[i]+2),s?n.error(new r(j)):a()):await f;const u=new o(t.length-Z-(t.length-Z)%N);n.enqueue(wt(e,t,u,0,Z,!0))},async flush(t){const{et:n,st:e,ot:s,ready:o}=this;if(e&&n){await o;const i=dt(s,0,s.length-Z),a=dt(s,s.length-Z);let f=z;if(i.length){const t=mt(st,i);e.update(t);const s=n.update(t);f=yt(st,s)}const u=dt(yt(st,e.digest()),0,Z);let l=s.length<Z?1:0;for(let t=0;t<Z;t++)l|=u[t]^a[t];if(l&&c)throw new r("Invalid authentication code");t.enqueue(f)}}})}}class ut extends d{constructor({password:t,rawPassword:n,encryptionStrength:e}){super({start(){lt(this,t,n,e)},async transform(t,n){const e=this,{password:s,strength:r,nt:c,ready:i}=e;let a=z;s?(a=await async function(t,n,e){const s=H(new o(X[n]));return W(s,await ht(t,n,e,s))}(e,r,s),c()):await i;const f=new o(a.length+t.length-t.length%N);f.set(a,0),n.enqueue(wt(e,t,f,a.length,0))},async flush(t){const{et:n,st:e,ot:s,ready:r}=this;if(e&&n){await r;let o=z;if(s.length){const t=n.update(mt(st,s));e.update(t),o=yt(st,t)}const c=yt(st,e.digest()).slice(0,Z);t.enqueue(W(o,c))}}})}}function lt(t,e,s,r){n.assign(t,{ready:new l(n=>t.nt=n),password:pt(e,s),strength:r-1,ot:z})}function wt(t,n,e,s,r,c){const{et:i,st:a,ot:f}=t;f.length&&(n=W(f,n));const u=n.length-r;let l;for(e=function(t,n){if(n&&n>t.length){const e=t;(t=new o(n)).set(e,0)}return t}(e,s+(u-u%N)),l=0;l<=u-N;l+=N){const t=mt(st,dt(n,l,l+N));c&&a.update(t);const r=i.update(t);c||a.update(r),e.set(yt(st,r),l+s)}return t.ot=dt(n,l),e}async function ht(e,s,r,c){e.password=null;const i=await async function(t,n,e,s,r){if(!it)return E.importKey(n);try{return await nt.importKey("raw",n,e,!1,r)}catch{return it=!1,E.importKey(n)}}(0,r,G,0,Q),a=await async function(t,n,e){if(!at)return E.T(n,t.salt,J.iterations,e);try{return await nt.deriveBits(t,n,e)}catch{return at=!1,E.T(n,t.salt,J.iterations,e)}}(n.assign({salt:c},J),i,8*(2*Y[s]+2)),f=new o(a),u=mt(st,dt(f,0,Y[s])),l=mt(st,dt(f,Y[s],2*Y[s])),w=dt(f,2*Y[s]);return n.assign(e,{keys:{key:u,ct:l,passwordVerification:w},et:new ot(new rt(u),t.from($)),st:new ct(l)}),w}function pt(t,n){return n===v?function(t){if(typeof w==b){t=unescape(encodeURIComponent(t));const n=new o(t.length);for(let e=0;e<n.length;e++)n[e]=t.charCodeAt(e);return n}return(new w).encode(t)}(t):n}function dt(t,n,e){return t.subarray(n,e)}function yt(t,n){return t.v(n)}function mt(t,n){return t.C(n)}class St extends d{constructor({password:t,rawPassword:n,passwordVerification:e,checkPasswordOnly:s}){super({start(){vt(this,t,n,e)},transform(t,n){const e=this;if(e.password||e.rawPassword){const n=bt(e,t.subarray(0,12));if(e.password=e.rawPassword=null,0!=(n[11]^e.passwordVerification))throw new r(O);t=t.subarray(12)}s?n.error(new r(j)):n.enqueue(bt(e,t))}})}}class gt extends d{constructor({password:t,rawPassword:n,passwordVerification:e}){super({start(){vt(this,t,n,e)},transform(t,n){const e=this;let s,r;if(e.password||e.rawPassword){e.password=e.rawPassword=null;const n=H(new o(12));n[11]=e.passwordVerification,s=new o(t.length+n.length),s.set(kt(e,n),0),r=12}else s=new o(t.length),r=0;s.set(kt(e,t),r),n.enqueue(s)}})}}function vt(t,e,s,r){n.assign(t,{password:e,rawPassword:s,passwordVerification:r}),function(t,e,s){const r=[305419896,591751049,878082192];if(n.assign(t,{keys:r,it:new R(r[0]),ft:new R(r[2])}),s)for(let n=0;n<s.length;n++)zt(t,s[n]);else for(let n=0;n<e.length;n++)zt(t,e.charCodeAt(n))}(t,e,s)}function bt(t,n){const e=new o(n.length);for(let s=0;s<n.length;s++)e[s]=Ct(t)^n[s],zt(t,e[s]);return e}function kt(t,n){const e=new o(n.length);for(let s=0;s<n.length;s++)e[s]=Ct(t)^n[s],zt(t,n[s]);return e}function zt(t,n){let[,e]=t.keys;t.it.append([n]);const r=~t.it.get();e=At(s.imul(At(e+It(r)),134775813)+1),t.ft.append([e>>>24]);const o=~t.ft.get();t.keys=[r,e,o]}function Ct(t){const n=2|t.keys[2];return It(s.imul(n,1^n)>>>8)}function It(t){return 255&t}function At(t){return 4294967295&t}function xt(t){if(t instanceof y)return t;const n=t.getReader();return new y({async pull(t){const{value:e,done:s}=await n.read();s?t.close():t.enqueue(e)},cancel:t=>n.cancel(t)})}const Mt=new f;function Pt(t){return Mt.get(t)}const Bt="Invalid uncompressed size",Dt="deflate-raw",Ft="gzip",Rt=[31,139,8];class Ut extends d{constructor(t,{chunkSize:n,CompressionStreamFallback:e,CompressionStream:s}){super({});const{compressed:r,encrypted:o,useCompressionStream:c,zipCrypto:i,computeCrc32:a,level:f,deflate64:l,format:w,compressionMethod:h,inputSize:p}=t,d=this;let y,m,S,g=super.readable;const v=w&&Pt(w),b=a&&r&&!l&&!v&&(!o||i)&&Boolean(c&&s);if(o&&!i||!a||b||(y=new U,g=Lt(g,y)),r)if(v)g=Ot(g,Kt(v.CompressionStream,w,{level:f,chunkSize:n,compressionMethod:h,uncompressedSize:p}));else if(b)S=new Wt,g=Ot(g,new s(Ft)),g=Lt(g,S);else try{g=Et(g,c,{level:f,chunkSize:n},s,e)}catch(t){let n;try{n=new s(Ft)}catch{throw t}g=Ot(g,n),g=Lt(g,new Wt)}o&&(i?g=Lt(g,new gt(t)):(m=new ut(t),g=Lt(g,m))),Vt(d,g,()=>{o&&!i||!a||(d.crc32=b?S.crc32:new u(y.value.buffer).getUint32(0))})}}class Wt extends d{constructor(){let t,n=10,e=new o(0);super({transform(t,r){if(n){const e=s.min(n,t.length);if(n-=e,!(t=t.subarray(e)).length)return}const o=e.length+t.length;if(o<=8)return void(e=W(e,t));const c=o-8,i=s.min(c,e.length);r.enqueue(W(e.subarray(0,i),t.subarray(0,c-i))),e=W(e.subarray(i),t.subarray(c-i))},flush(){const n=_(e);t.crc32=n.getUint32(0,!0),t.uncompressedSize=n.getUint32(4,!0)}}),t=this}}class _t extends d{constructor(t,{chunkSize:n,DecompressionStreamFallback:e,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=Lt(C,new St(t)):(z=new ft(t),C=Lt(C,z))),w){const t=m&&Pt(m);if(t)C=Ot(C,Kt(t.DecompressionStream,m,{chunkSize:n,compressionMethod:S,rawBitFlag:g,uncompressedSize:b}));else try{C=Et(C,h,{chunkSize:n,deflate64:p},s,e)}catch(t){if(p||b===v)throw t;let n;try{n=new s(Ft)}catch{throw t}C=function(t,n,e){const s=new R;let c,i,a,f=0,u=!1;const w=new l((t,n)=>{i=t,a=n});w.catch(()=>{}),e||i();const h=new d({start(t){const n=new o(10);n.set(Rt),t.enqueue(n)},transform(t,n){n.enqueue(t)},async flush(t){u=!0,y();try{await w}finally{m()}const n=new o(8),r=_(n);r.setUint32(0,s.get(),!0),r.setUint32(4,e,!0),t.enqueue(n)},cancel(t){a(t)}}),p=new d({transform(t,n){s.append(t),f+=t.length,f>=e?i():u&&y(),n.enqueue(t)},cancel(t){a(t)}});return t=Lt(t,h),Lt(t=Ot(t,n),p);function y(){m(),c=setTimeout(()=>a(new r(Bt)),5e3)}function m(){clearTimeout(c)}}(C,n,b)}C=function(t){const n=t.getReader();return new y({async pull(t){let e;try{e=await n.read()}catch(t){if(t&&t.message)throw t;const n=new r("Invalid compressed data");throw n.cause=t,n}const{value:s,done:o}=e;o?t.close():t.enqueue(s)},cancel:t=>n.cancel(t)})}(C)}a&&(k=new U,C=Lt(C,k)),Vt(this,C,()=>{if(a){const t=new u(k.value.buffer);if(f!=t.getUint32(0,!1))throw new r("Invalid CRC32")}})}}const Tt=new f;function Vt(t,e,s){e=Lt(e,new d({flush:s})),n.defineProperty(t,"readable",{get:()=>e})}function Kt(t,n,e){if(!t)throw new r("Compression method not supported");return new t(n,e)}function Et(t,n,e,s,r){const o=n&&s?s:r||s,c=e.deflate64?"deflate64-raw":Dt;let i;try{i=new o(c,e)}catch(t){if(!n||!r||o==r)throw t;i=new r(c,e)}return Ot(t,i)}function Lt(t,n){return xt(t).pipeThrough(n)}function Ot(t,n){const e=n.writable.getWriter(),s=t.getReader();return async function(){try{for(;;){await e.ready;const t=await s.read();if(t.done){await e.close();break}await e.write(t.value)}}catch(t){await async function(t,n){try{await t.abort(n)}catch{}}(e,t),await async function(t,n){try{await t.cancel(n)}catch{}}(s,t)}}(),n.readable}const jt="data",Ht="close",Nt="deflate";class qt extends d{constructor(t,e){super({});const s=this,{codecType:o}=t;let c;o.startsWith(Nt)?c=Ut:o.startsWith("inflate")&&(c=_t),s.outputSize=0;let i=0;const a=new c(t,e),f=super.readable,u=new d({transform(t,n){t&&t.length&&(i+=t.length,n.enqueue(t))},flush(){n.assign(s,{inputSize:i})}}),l=new d({transform(n,e){if(n&&n.length&&(e.enqueue(n),s.outputSize+=n.length,t.outputSize!==v&&s.outputSize>t.outputSize))throw new r(Bt)},flush(){const{crc32:t}=a;n.assign(s,{crc32:t,inputSize:i})}});n.defineProperty(s,"readable",{get:()=>f.pipeThrough(u).pipeThrough(a).pipeThrough(l)})}}class Gt extends d{constructor(t){const s=[];let r=0,c=0;function i(){const n=new o(t);let e=0;for(;e<t;){const r=s[0],o=t-e;r.length<=o?(n.set(r,e),e+=r.length,s.shift()):(n.set(r.subarray(0,o),e),s[0]=r.subarray(o),e+=o)}return r-=t,n}(!e.isFinite(t)||t<1)&&(t=65536),super({transform(n,e){for(s.push(n),r+=n.length;r>t;)c+=t,e.enqueue(i())},flush(t){r&&(c+=r,t.enqueue(function(t,n){const e=new o(n);let s=0;for(const n of t)e.set(n,s),s+=n.length;return e}(s,r)))}}),n.defineProperty(this,"outputSize",{get:()=>c})}}let Jt=2;try{typeof navigator!=b&&navigator.hardwareConcurrency&&(Jt=navigator.hardwareConcurrency)}catch{}const Qt=new f,Xt=new f;let Yt,Zt=0;async function $t(t){let n,o,c;try{const{options:i,config:a}=t;if(i.format)try{await async function(t,n){!Mt.has(t)&&n&&function(t,n){const{CompressionStream:e,DecompressionStream:s}=n;if(typeof e!=k&&typeof s!=k)throw new r("Invalid codec module");Mt.set(t,{CompressionStream:e,DecompressionStream:s})}(t,await(import(n)))}(i.format,i.codecURI)}catch(t){throw t.codecImportFailed=!0,t}if(a.CompressionStream=self.CompressionStream,a.DecompressionStream=self.DecompressionStream,i.compressed&&!i.format)if(i.useCompressionStream){if(!function(t,n){if(!t)return!1;let e=Tt.get(t);e||(e=new f,Tt.set(t,e));let s=e.get(n);if(s===v){try{new t(n),s=!0}catch{s=!1}e.set(n,s)}return s}(i.codecType.startsWith(Nt)?a.CompressionStream:a.DecompressionStream,Dt))try{await self.initModule(t.config)}catch{}}else try{await self.initModule(t.config)}catch{i.useCompressionStream=!0}!a.CompressionStreamFallback&&a.CompressionStreamZlib&&(a.CompressionStreamFallback=a.CompressionStreamZlib),!a.DecompressionStreamFallback&&a.DecompressionStreamZlib&&(a.DecompressionStreamFallback=a.DecompressionStreamZlib);const u={highWaterMark:1},w=t.readable?xt(t.readable):new y({async pull(t){const n=new l(t=>Qt.set(Zt,t));tn({type:"pull",messageId:Zt}),Zt=(Zt+1)%e.MAX_SAFE_INTEGER;const{value:s,done:r}=await n;t.enqueue(s),r&&t.close()}},u);c=t.writable?function(t){if(t instanceof m)return t;const n=t.getWriter();return new m({write:t=>n.write(t),close:()=>n.close(),abort:t=>n.abort(t)})}(t.writable):new m({async write(t){let n;const s=new l(t=>n=t);Xt.set(Zt,n),tn({type:jt,value:t,messageId:Zt}),Zt=(Zt+1)%e.MAX_SAFE_INTEGER,await s}},u),n=new qt(i,a),o=new Gt(function(t){return r="string"==typeof(n=r=t.chunkSize)&&n.trim()?e(n):n,e.isInteger(r)&&r>=1?s.max(r,64):65536;var n,r}(a)),Yt=new AbortController;const{signal:h}=Yt;await w.pipeThrough(n).pipeThrough(o).pipeTo(c,{signal:h,preventClose:!0,preventAbort:!0}),await c.getWriter().close();const{crc32:p,inputSize:d,outputSize:S}=n;tn({type:Ht,result:{crc32:p,inputSize:d,outputSize:S}})}catch(t){if(t.outputSize=o?o.outputSize:0,c&&!c.locked)try{await c.getWriter().close()}catch{}nn(t)}}function tn(t){const{value:n}=t;if(n)if(n.length)try{t.value=(e=n,e.byteOffset||e.byteLength!=e.buffer.byteLength?new o(e):e).buffer,p(t,[t.value])}catch{p(t)}else p(t);else p(t);var e}function nn(t=new r("Unknown error")){const{message:n,stack:e,code:s,name:o,outputSize:c,cause:i,codecImportFailed:a}=t,f={message:n,stack:e,code:s,name:o,outputSize:c};i&&(f.cause={name:i.name,message:i.message}),a&&(f.codecImportFailed=!0),p({error:f})}addEventListener("message",({data:t})=>{const{type:n,messageId:e,value:s,done:r}=t;try{if("start"==n&&$t(t),n==jt){const t=Qt.get(e);Qt.delete(e),t({value:s||new o,done:r})}if("ack"==n){const t=Xt.get(e);Xt.delete(e),t()}n==Ht&&Yt.abort()}catch(t){nn(t)}}),p({type:"ready"});const en="deflate",sn="deflate-raw",rn="deflate64-raw",on="gzip";let cn,an,fn,un,ln;function wn(t,n,e={}){if(!cn){const t=new r("WASM module not loaded");throw t.cause=ln,t}const c="number"==typeof e.level?e.level:-1,i="number"==typeof e.outBuffer?e.outBuffer:65536,a="number"==typeof e.inBufferSize?e.inBufferSize:65536;return new d({start(){try{let e;if(this.ut=an(i),this.in=an(a),this.inBufferSize=a,!this.ut||!this.in)throw new r("allocation failed");if(this.lt=new o(i),t?(this.wt=cn.deflate_process,this.ht=cn.deflate_last_consumed,this.yt=cn.deflate_end,this.St=cn.deflate_new(),e=n===on?cn.deflate_init_gzip(this.St,c):n===sn?cn.deflate_init_raw(this.St,c):cn.deflate_init(this.St,c)):n===rn?(this.wt=cn.inflate9_process,this.ht=cn.inflate9_last_consumed,this.yt=cn.inflate9_end,this.St=cn.inflate9_new(),e=cn.inflate9_init_raw(this.St)):(this.wt=cn.inflate_process,this.ht=cn.inflate_last_consumed,this.yt=cn.inflate_end,this.St=cn.inflate_new(),e=n===sn?cn.inflate_init_raw(this.St):n===on?cn.inflate_init_gzip(this.St):cn.inflate_init(this.St)),0!==e)throw new r("init failed:"+e)}catch(t){throw f(this),t}},transform(t,n){try{const e=t,c=new o(un.buffer),a=this.wt,f=this.ht,u=this.ut,l=this.lt;let w=0;for(;w<e.length;){const t=s.min(e.length-w,32768);if((!this.in||this.inBufferSize<t)&&(this.in&&fn&&(fn(this.in),this.in=0),this.in=an(t),this.inBufferSize=t,!this.in))throw new r("allocation failed");c.set(e.subarray(w,w+t),this.in);const o=a(this.St,this.in,t,u,i,0),h=o>>24&255,p=128&h?h-256:h;if(p<0)throw new r("process error:"+p);const d=16777215&o;d&&(l.set(c.subarray(u,u+d),0),n.enqueue(l.slice(0,d)));const y=f(this.St);if(0===y&&0===d)break;w+=y}}catch(t){f(this),n.error(t)}},flush(t){try{const n=new o(un.buffer),e=this.wt,s=this.ut,c=this.lt;for(;;){const o=e(this.St,0,0,s,i,4),a=o>>24&255,f=128&a?a-256:a;if(f<0)throw new r("process error:"+f);const u=16777215&o;if(u&&(c.set(n.subarray(s,s+u),0),t.enqueue(c.slice(0,u))),1===a||0===u)break}}catch(n){t.error(n)}finally{const n=f(this);0!==n&&t.error(new r("end error:"+n))}},cancel(){f(this)}});function f(t){let n=0;return t.St&&t.yt&&(n=t.yt(t.St)),t.St=0,t.in&&fn&&fn(t.in),t.in=0,t.ut&&fn&&fn(t.ut),t.ut=0,n}}class hn{constructor(t=en,n){return wn(!0,t,n)}}class pn{constructor(t=en,n){return wn(!1,t,n)}}hn.gt=!0,pn.gt=!0,hn.vt=[en,sn,on],pn.vt=[en,sn,on,rn];let dn=!1;!function(t={}){const{init:n}=t,e=t.CompressionStreamFallback||t.CompressionStreamZlib,s=t.DecompressionStreamFallback||t.DecompressionStreamZlib;self.initModule=async t=>{n&&await n(t),e&&(t.CompressionStreamFallback=e),s&&(t.DecompressionStreamFallback=s)}}({CompressionStreamFallback:hn,DecompressionStreamFallback:pn,init:t=>async function(t,{baseURI:n}){if(!dn)try{await async function(t,n){let e,s;try{try{s=new URL(t,n)}catch{}const r=await fetch(s);e=await r.arrayBuffer()}catch(n){if(!t.startsWith("data:application/wasm;base64,"))throw n;e=function(t){const n=t.split(",")[1],e=atob(n),s=e.length,r=new o(s);for(let t=0;t<s;++t)r[t]=e.charCodeAt(t);return r.buffer}(t)}!function(t){if(cn=t,({malloc:an,free:fn,memory:un}=cn),"function"!=typeof an||"function"!=typeof fn||!un)throw cn=an=fn=un=null,new r("Invalid WASM module")}((await WebAssembly.instantiate(e)).instance.exports)}(t,n),dn=!0}catch(t){throw function(t){ln=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,"+function(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$1[s>>18&63]+e$1[s>>12&63]+e$1[s>>6&63]+e$1[63&s];}const o=s-r;if(1===o){const s=t[r]<<16;n+=e$1[s>>18&63]+e$1[s>>12&63]+"==";}else if(2===o){const s=t[r]<<16|t[r+1]<<8;n+=e$1[s>>18&63]+e$1[s>>12&63]+e$1[s>>6&63]+"=";}return n}(s)}});
426
449
 
427
450
  /*
428
451
  Copyright (c) 2026 Gildas Lormeau. All rights reserved.
@@ -2607,6 +2630,7 @@
2607
2630
  constructor(chunkSize) {
2608
2631
  const pendingChunks = [];
2609
2632
  let pendingLength = 0;
2633
+ let outputSize = 0;
2610
2634
  if (!Number.isFinite(chunkSize) || chunkSize < 1) {
2611
2635
  chunkSize = DEFAULT_CHUNK_SIZE;
2612
2636
  }
@@ -2615,15 +2639,20 @@
2615
2639
  pendingChunks.push(chunk);
2616
2640
  pendingLength += chunk.length;
2617
2641
  while (pendingLength > chunkSize) {
2642
+ outputSize += chunkSize;
2618
2643
  controller.enqueue(shiftChunk());
2619
2644
  }
2620
2645
  },
2621
2646
  flush(controller) {
2622
2647
  if (pendingLength) {
2648
+ outputSize += pendingLength;
2623
2649
  controller.enqueue(concatChunks(pendingChunks, pendingLength));
2624
2650
  }
2625
2651
  }
2626
2652
  });
2653
+ Object.defineProperty(this, "outputSize", {
2654
+ get: () => outputSize
2655
+ });
2627
2656
 
2628
2657
  function shiftChunk() {
2629
2658
  const result = new Uint8Array(chunkSize);
@@ -2828,7 +2857,7 @@
2828
2857
  }
2829
2858
 
2830
2859
  async function runWorker$1({ options, readable, writable, onTaskFinished }, config) {
2831
- let codecStream;
2860
+ let codecStream, chunkStream;
2832
2861
  try {
2833
2862
  if (options.compressed && !options.format) {
2834
2863
  const deflate = options.codecType.startsWith(CODEC_DEFLATE);
@@ -2851,9 +2880,10 @@
2851
2880
  }
2852
2881
  }
2853
2882
  codecStream = new CodecStream(options, config);
2883
+ chunkStream = new ChunkStream(getChunkSize(config));
2854
2884
  await readable
2855
2885
  .pipeThrough(codecStream)
2856
- .pipeThrough(new ChunkStream(getChunkSize(config)))
2886
+ .pipeThrough(chunkStream)
2857
2887
  .pipeTo(writable, { preventClose: true, preventAbort: true });
2858
2888
  const {
2859
2889
  crc32,
@@ -2867,7 +2897,7 @@
2867
2897
  };
2868
2898
  } catch (error) {
2869
2899
  if (codecStream) {
2870
- error.outputSize = codecStream.outputSize;
2900
+ error.outputSize = chunkStream ? chunkStream.outputSize : 0;
2871
2901
  }
2872
2902
  throw error;
2873
2903
  } finally {
@@ -2976,11 +3006,17 @@
2976
3006
  let resolveResult, rejectResult;
2977
3007
  const result = new Promise((resolve, reject) => {
2978
3008
  resolveResult = resolve;
2979
- rejectResult = reject;
3009
+ rejectResult = error => {
3010
+ if (error && error.outputSize === UNDEFINED_VALUE) {
3011
+ error.outputSize = workerData.outputSize;
3012
+ }
3013
+ reject(error);
3014
+ };
2980
3015
  });
2981
3016
  Object.assign(workerData, {
2982
3017
  reader: null,
2983
3018
  writer: null,
3019
+ outputSize: 0,
2984
3020
  resolveResult,
2985
3021
  rejectResult,
2986
3022
  result
@@ -3264,8 +3300,10 @@
3264
3300
  }
3265
3301
  }
3266
3302
  if (type == MESSAGE_DATA) {
3303
+ const chunk = new Uint8Array(value);
3267
3304
  await writer.ready;
3268
- await writer.write(new Uint8Array(value));
3305
+ await writer.write(chunk);
3306
+ workerData.outputSize += chunk.length;
3269
3307
  if (!stale()) {
3270
3308
  sendMessage({ type: MESSAGE_ACK_DATA, messageId }, workerData);
3271
3309
  }
@@ -3573,10 +3611,13 @@
3573
3611
 
3574
3612
 
3575
3613
  const ERR_HTTP_STATUS = "HTTP error ";
3614
+ const MIN_SUCCESS_HTTP_STATUS = 200;
3615
+ const MAX_SUCCESS_HTTP_STATUS = 299;
3576
3616
  const ERR_HTTP_RANGE = "HTTP Range not supported";
3577
3617
  const ERR_HTTP_RESOURCE_CHANGED = "HTTP resource changed";
3578
3618
  const ERR_ITERATOR_COMPLETED_TOO_SOON = "Writer iterator completed too soon";
3579
3619
  const ERR_WRITER_NOT_INITIALIZED = "Writer not initialized";
3620
+ const ERR_WRITER_SIZE_NOT_WRITABLE = "Invalid writer (size must be writable)";
3580
3621
 
3581
3622
  const CONTENT_TYPE_TEXT_PLAIN = "text/plain";
3582
3623
  const HTTP_HEADER_CONTENT_LENGTH = "Content-Length";
@@ -3768,6 +3809,7 @@
3768
3809
  const reader = this;
3769
3810
  const { sourceBlob, size } = reader;
3770
3811
  const { offset = 0, size: readSize = size - offset } = options || {};
3812
+ // deno-lint-ignore valid-typeof
3771
3813
  if (typeof sourceBlob.stream == FUNCTION_TYPE) {
3772
3814
  if (!offset && readSize >= size) {
3773
3815
  return toCompatibleReadable(sourceBlob.stream());
@@ -4174,7 +4216,7 @@
4174
4216
 
4175
4217
  async function sendFetchRequest(method, { fetch: fetchFunction = fetch, options, url }, headers) {
4176
4218
  const response = await fetchFunction(url, Object.assign({}, options, { method, headers }));
4177
- if (response.status < 400) {
4219
+ if (response.status >= MIN_SUCCESS_HTTP_STATUS && response.status <= MAX_SUCCESS_HTTP_STATUS) {
4178
4220
  return response;
4179
4221
  } else {
4180
4222
  throw response.status == 416 ? new Error(ERR_HTTP_RANGE) : new Error(ERR_HTTP_STATUS + (response.statusText || response.status));
@@ -4185,7 +4227,7 @@
4185
4227
  return new Promise((resolve, reject) => {
4186
4228
  const request = new XMLHttpRequest();
4187
4229
  request.addEventListener("load", () => {
4188
- if (request.status < 400) {
4230
+ if (request.status >= MIN_SUCCESS_HTTP_STATUS && request.status <= MAX_SUCCESS_HTTP_STATUS) {
4189
4231
  const headers = [];
4190
4232
  request.getAllResponseHeaders().trim().split(/[\r\n]+/).forEach(header => {
4191
4233
  const splitHeader = header.trim().split(/\s*:\s*/);
@@ -4489,8 +4531,10 @@
4489
4531
  writable: toCompatibleWritable(writer)
4490
4532
  };
4491
4533
  }
4492
- if (writer.size === UNDEFINED_VALUE) {
4493
- writer.size = 0;
4534
+ try {
4535
+ writer.size = writer.size === UNDEFINED_VALUE ? 0 : writer.size;
4536
+ } catch {
4537
+ throw new Error(ERR_WRITER_SIZE_NOT_WRITABLE);
4494
4538
  }
4495
4539
  return writer;
4496
4540
  }
@@ -4538,6 +4582,45 @@
4538
4582
  }
4539
4583
  }
4540
4584
 
4585
+ /*
4586
+ Copyright (c) 2026 Gildas Lormeau. All rights reserved.
4587
+
4588
+ Redistribution and use in source and binary forms, with or without
4589
+ modification, are permitted provided that the following conditions are met:
4590
+
4591
+ 1. Redistributions of source code must retain the above copyright notice,
4592
+ this list of conditions and the following disclaimer.
4593
+
4594
+ 2. Redistributions in binary form must reproduce the above copyright
4595
+ notice, this list of conditions and the following disclaimer in
4596
+ the documentation and/or other materials provided with the distribution.
4597
+
4598
+ 3. The names of the authors may not be used to endorse or promote products
4599
+ derived from this software without specific prior written permission.
4600
+
4601
+ THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
4602
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
4603
+ FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
4604
+ INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
4605
+ INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
4606
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
4607
+ OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
4608
+ LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
4609
+ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
4610
+ EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
4611
+ */
4612
+
4613
+
4614
+ function addWarning(warnings, reason, filename) {
4615
+ if (!warnings.some(warning => warning.reason == reason)) {
4616
+ const warning = { reason };
4617
+ if (filename !== UNDEFINED_VALUE) {
4618
+ warning.filename = filename;
4619
+ }
4620
+ warnings.push(warning);
4621
+ }
4622
+ }
4623
+
4541
4624
  /*
4542
4625
  Copyright (c) 2025 Gildas Lormeau. All rights reserved.
4543
4626
 
@@ -4566,6 +4649,7 @@
4566
4649
  EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
4567
4650
  */
4568
4651
 
4652
+
4569
4653
  const PROPERTY_NAME_FILENAME = "filename";
4570
4654
  const PROPERTY_NAME_RAW_FILENAME = "rawFilename";
4571
4655
  const PROPERTY_NAME_COMMENT = "comment";
@@ -4690,6 +4774,38 @@
4690
4774
 
4691
4775
  }
4692
4776
 
4777
+ const INTERPRETED_EXTRA_FIELD_TYPES = new Set([
4778
+ EXTRAFIELD_TYPE_ZIP64,
4779
+ EXTRAFIELD_TYPE_AES,
4780
+ EXTRAFIELD_TYPE_NTFS,
4781
+ EXTRAFIELD_TYPE_EXTENDED_TIMESTAMP,
4782
+ EXTRAFIELD_TYPE_UNICODE_PATH,
4783
+ EXTRAFIELD_TYPE_UNICODE_COMMENT,
4784
+ EXTRAFIELD_TYPE_USDZ,
4785
+ EXTRAFIELD_TYPE_INFOZIP,
4786
+ EXTRAFIELD_TYPE_UNIX,
4787
+ EXTRAFIELD_TYPE_UNIX_TYPE1,
4788
+ EXTRAFIELD_TYPE_PKWARE_UNIX
4789
+ ]);
4790
+
4791
+ function getUserExtraField(extraField) {
4792
+ if (extraField) {
4793
+ const userExtraField = new Map();
4794
+ extraField.forEach((field, type) => {
4795
+ if (!INTERPRETED_EXTRA_FIELD_TYPES.has(type)) {
4796
+ userExtraField.set(type, field.data);
4797
+ }
4798
+ });
4799
+ if (userExtraField.size) {
4800
+ return userExtraField;
4801
+ }
4802
+ }
4803
+ }
4804
+
4805
+ function getEncryptionOverhead(encrypted, zipCrypto, encryptionStrength) {
4806
+ return encrypted ? (zipCrypto ? 12 : 16 + encryptionStrength * 4) : 0;
4807
+ }
4808
+
4693
4809
  /*
4694
4810
  Copyright (c) 2025 Gildas Lormeau. All rights reserved.
4695
4811
 
@@ -4749,6 +4865,8 @@
4749
4865
  const WARNING_TRAILING_CENTRAL_DIRECTORY_DATA = "trailing central directory data";
4750
4866
  const WARNING_DUPLICATE_FILENAME = "duplicate filename";
4751
4867
  const WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY = "mismatched zip64 end of central directory record";
4868
+ const WARNING_MULTIPLE_END_OF_CENTRAL_DIRECTORY = "multiple end of central directory records";
4869
+ const WARNING_MISMATCHED_LOCAL_FILE_HEADER_FILENAME = "mismatched local file header (filename)";
4752
4870
  const WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG = "mismatched local file header (general purpose bit flag)";
4753
4871
  const WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD = "mismatched local file header (compression method)";
4754
4872
  const WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES = "mismatched local file header (crc32 or sizes)";
@@ -4819,7 +4937,7 @@
4819
4937
  }
4820
4938
  }
4821
4939
  if (rejectAmbiguousEndOfDirectory && endOfDirectoryReachingEndCount > 1) {
4822
- throwAmbiguousArchive("multiple end of central directory records");
4940
+ throwAmbiguousArchive(WARNING_MULTIPLE_END_OF_CENTRAL_DIRECTORY);
4823
4941
  }
4824
4942
  const endOfDirectoryView = getDataView(endOfDirectoryInfo);
4825
4943
  let directoryDataLength = getUint32$1(endOfDirectoryView, 12);
@@ -5117,7 +5235,8 @@
5117
5235
  const writer = new TransformStream();
5118
5236
  const arrayBufferPromise = streamToBlob(writer.readable).then(blob => blob.arrayBuffer());
5119
5237
  arrayBufferPromise.catch(() => { });
5120
- await fileEntry.getData(writer, entry, zipReader.readRanges, options);
5238
+ await fileEntry.getData(writer, entry, zipReader.readRanges,
5239
+ Object.assign({}, options, { preventClose: false }));
5121
5240
  return arrayBufferPromise;
5122
5241
  };
5123
5242
  offset = endOffset;
@@ -5198,49 +5317,101 @@
5198
5317
  await reader.readable.cancel();
5199
5318
  }
5200
5319
  }
5320
+
5321
+ [SYMBOL_ASYNC_DISPOSE]() {
5322
+ return this.close();
5323
+ }
5201
5324
  }
5202
5325
 
5203
5326
  class ZipReaderStream {
5204
5327
 
5205
5328
  constructor(options = {}) {
5206
- const { readable, writable } = new TransformStream();
5207
- const gen = new ZipReader(readable, options).getEntriesGenerator();
5329
+ let sourceController;
5330
+ const { readable, writable } = new TransformStream({
5331
+ start(controller) {
5332
+ sourceController = controller;
5333
+ }
5334
+ });
5335
+ const zipReader = new ZipReader(readable, options);
5336
+ const gen = zipReader.getEntriesGenerator();
5337
+ const pendingEntries = new Set();
5208
5338
  this.readable = new ReadableStream({
5209
5339
  async pull(controller) {
5210
5340
  const { done, value } = await gen.next();
5211
5341
  if (done)
5212
5342
  return controller.close();
5213
- const entryReadable = (function () {
5214
- const { readable, writable } = new TransformStream();
5215
- if (value.getData) {
5216
- getData();
5217
- return readable;
5218
- }
5219
-
5220
- async function getData() {
5221
- try {
5222
- await value.getData(writable);
5223
- } catch (error) {
5224
- try {
5225
- await writable.abort(error);
5226
- } catch {
5227
- // ignored
5228
- }
5229
- }
5230
- }
5231
- })();
5343
+ const entryStream = createEntryStream(value, pendingEntries);
5232
5344
  const chunk = {
5233
5345
  ...value,
5234
- readable: entryReadable
5346
+ readable: entryStream.readable
5235
5347
  };
5236
5348
  delete chunk.getData;
5349
+ Object.defineProperties(chunk, {
5350
+ localDirectory: {
5351
+ get: () => value.localDirectory,
5352
+ enumerable: true
5353
+ },
5354
+ warnings: {
5355
+ get: () => value.warnings,
5356
+ enumerable: true
5357
+ }
5358
+ });
5237
5359
  controller.enqueue(chunk);
5360
+ },
5361
+ async cancel(reason) {
5362
+ const entryStreams = Array.from(pendingEntries);
5363
+ pendingEntries.clear();
5364
+ sourceController.error(reason);
5365
+ await Promise.allSettled(entryStreams.map(entryStream => entryStream.cancel(reason)));
5366
+ await Promise.allSettled([gen.return(), zipReader.close()]);
5238
5367
  }
5239
5368
  });
5240
5369
  this.writable = writable;
5241
5370
  }
5242
5371
  }
5243
5372
 
5373
+ function createEntryStream(entry, pendingEntries) {
5374
+ const { readable, writable } = new TransformStream();
5375
+ let dataReader;
5376
+ const entryStream = {
5377
+ cancel: async reason => {
5378
+ pendingEntries.delete(entryStream);
5379
+ await (dataReader ? dataReader.cancel(reason) : readable.cancel(reason));
5380
+ }
5381
+ };
5382
+ entryStream.readable = new ReadableStream({
5383
+ async pull(controller) {
5384
+ if (!dataReader) {
5385
+ dataReader = readable.getReader();
5386
+ pendingEntries.add(entryStream);
5387
+ getData();
5388
+ }
5389
+ const { done, value } = await dataReader.read();
5390
+ if (done) {
5391
+ controller.close();
5392
+ } else {
5393
+ controller.enqueue(value);
5394
+ }
5395
+ },
5396
+ cancel: reason => entryStream.cancel(reason)
5397
+ }, { highWaterMark: 0 });
5398
+ return entryStream;
5399
+
5400
+ async function getData() {
5401
+ try {
5402
+ await entry.getData(writable, { preventClose: false });
5403
+ } catch (error) {
5404
+ try {
5405
+ await writable.abort(error);
5406
+ } catch {
5407
+ // ignored
5408
+ }
5409
+ } finally {
5410
+ pendingEntries.delete(entryStream);
5411
+ }
5412
+ }
5413
+ }
5414
+
5244
5415
  async function isZipFile(reader, options = {}) {
5245
5416
  reader = new GenericReader(reader);
5246
5417
  await initStream(reader);
@@ -5300,7 +5471,9 @@
5300
5471
  const dataView = getDataView(dataArray);
5301
5472
  let password = getOptionValue$1(zipEntry, options, OPTION_PASSWORD);
5302
5473
  let rawPassword = getOptionValue$1(zipEntry, options, OPTION_RAW_PASSWORD);
5303
- const passThrough = getOptionValue$1(zipEntry, options, OPTION_PASS_THROUGH);
5474
+ const passThrough = checkPassThroughOption(getOptionValue$1(zipEntry, options, OPTION_PASS_THROUGH));
5475
+ const passThroughCompression = Boolean(passThrough);
5476
+ const passThroughEncryption = passThrough === true;
5304
5477
  checkPasswordOption(password, rawPassword);
5305
5478
  password = password && password.length && password;
5306
5479
  rawPassword = rawPassword && rawPassword.length && rawPassword;
@@ -5321,7 +5494,9 @@
5321
5494
  const checkLocalDirectoryOption = getOptionValue$1(zipEntry, options, OPTION_CHECK_LOCAL_DIRECTORY);
5322
5495
  const entryStrictness = getStrictness(options, zipEntry.options);
5323
5496
  const checkLocalDirectory = getCheckLocalDirectory(checkLocalDirectoryOption, entryStrictness);
5324
- const checkLocalFilename = getCheckLocalFilename(checkLocalDirectoryOption, entryStrictness);
5497
+ const checkLocalFilenameOption = getOptionValue$1(zipEntry, options, OPTION_CHECK_LOCAL_FILENAME);
5498
+ const checkLocalFilename = getCheckLocalFilename(
5499
+ checkLocalFilenameOption === UNDEFINED_VALUE ? checkLocalDirectoryOption : checkLocalFilenameOption, entryStrictness);
5325
5500
  let rawLocalFilename = EMPTY_UINT8_ARRAY;
5326
5501
  if (checkLocalFilename && (filenameLength || extraFieldLength)) {
5327
5502
  const trailingDataArray = await readUint8Array(reader, localHeaderOffset + HEADER_SIZE, filenameLength + extraFieldLength);
@@ -5352,16 +5527,17 @@
5352
5527
  if (gid !== UNDEFINED_VALUE && fileEntry.gid === UNDEFINED_VALUE) {
5353
5528
  fileEntry.gid = gid;
5354
5529
  }
5355
- const encrypted = zipEntry.encrypted && localDirectory.encrypted && !passThrough;
5530
+ const checkPasswordOnly = getOptionValue$1(zipEntry, options, OPTION_CHECK_PASSWORD_ONLY);
5531
+ const encrypted = zipEntry.encrypted && localDirectory.encrypted && (!passThroughEncryption || checkPasswordOnly);
5356
5532
  const zipCrypto = encrypted && !extraFieldAES;
5357
- if (!passThrough) {
5533
+ if (!passThroughEncryption) {
5358
5534
  fileEntry.zipCrypto = zipCrypto;
5359
5535
  }
5360
5536
  if (encrypted && (localDirectory.rawBitFlag & BITFLAG_STRONG_ENCRYPTION) == BITFLAG_STRONG_ENCRYPTION) {
5361
5537
  throw new Error(ERR_UNSUPPORTED_ENCRYPTION);
5362
5538
  }
5363
- const registeredCodec = passThrough ? UNDEFINED_VALUE : getRegisteredCodec(compressionMethod);
5364
- if (compressionMethod != COMPRESSION_METHOD_STORE && compressionMethod != COMPRESSION_METHOD_DEFLATE && compressionMethod != COMPRESSION_METHOD_DEFLATE_64 && !registeredCodec && !passThrough) {
5539
+ const registeredCodec = passThroughCompression ? UNDEFINED_VALUE : getRegisteredCodec(compressionMethod);
5540
+ if (compressionMethod != COMPRESSION_METHOD_STORE && compressionMethod != COMPRESSION_METHOD_DEFLATE && compressionMethod != COMPRESSION_METHOD_DEFLATE_64 && !registeredCodec && !passThroughCompression) {
5365
5541
  throw new Error(ERR_UNSUPPORTED_COMPRESSION);
5366
5542
  }
5367
5543
  if (encrypted) {
@@ -5378,15 +5554,16 @@
5378
5554
  const readable = toCompatibleReadable(reader.createReadable({ offset: dataOffset, size }));
5379
5555
  const signal = checkSignalOption(getOptionValue$1(zipEntry, options, OPTION_SIGNAL));
5380
5556
  throwIfAborted(signal);
5381
- const checkPasswordOnly = getOptionValue$1(zipEntry, options, OPTION_CHECK_PASSWORD_ONLY);
5382
5557
  let checkOverlappingEntry = getOptionValue$1(zipEntry, options, OPTION_CHECK_OVERLAPPING_ENTRY);
5383
5558
  const checkOverlappingEntryOnly = getOptionValue$1(zipEntry, options, OPTION_CHECK_OVERLAPPING_ENTRY_ONLY);
5384
5559
  if (checkOverlappingEntryOnly) {
5385
5560
  checkOverlappingEntry = true;
5386
5561
  }
5387
5562
  const { onstart, onprogress, onend } = options;
5388
- const compressed = compressionMethod != COMPRESSION_METHOD_STORE && !passThrough;
5389
- const outputSize = passThrough ? compressedSize : uncompressedSize;
5563
+ const compressed = compressionMethod != COMPRESSION_METHOD_STORE && !passThroughCompression;
5564
+ const outputSize = passThroughCompression ?
5565
+ compressedSize - getEncryptionOverhead(encrypted, zipCrypto, extraFieldAES && extraFieldAES.strength) :
5566
+ uncompressedSize;
5390
5567
  const deflate64 = compressionMethod == COMPRESSION_METHOD_DEFLATE_64;
5391
5568
  let useCompressionStream = getOptionValue$1(zipEntry, options, OPTION_USE_COMPRESSION_STREAM);
5392
5569
  if (deflate64) {
@@ -5395,7 +5572,7 @@
5395
5572
  const checkCrc32Option = getOptionValue$1(zipEntry, options, OPTION_CHECK_CRC32);
5396
5573
  const checkCrc32 = (checkCrc32Option === UNDEFINED_VALUE ?
5397
5574
  getOptionValue$1(zipEntry, options, OPTION_CHECK_SIGNATURE) :
5398
- checkCrc32Option) && !passThrough &&
5575
+ checkCrc32Option) && !passThroughCompression &&
5399
5576
  (!encrypted || zipCrypto || (extraFieldAES && extraFieldAES.vendorVersion == VENDOR_VERSION_AE_1$1));
5400
5577
  const workerOptions = {
5401
5578
  options: {
@@ -5449,10 +5626,10 @@
5449
5626
  await initStream(writer, getDecodableOutputSize(outputSize, compressedSize, compressed));
5450
5627
  ({ writable } = writer);
5451
5628
  const { outputSize: writtenSize } = await runWorker({ readable, writable }, workerOptions);
5452
- writer.size += writtenSize;
5453
5629
  if (writtenSize != outputSize) {
5454
- throw new Error(ERR_INVALID_UNCOMPRESSED_SIZE);
5630
+ throw Object.assign(new Error(ERR_INVALID_UNCOMPRESSED_SIZE), { outputSize: writtenSize });
5455
5631
  }
5632
+ writer.size += writtenSize;
5456
5633
  }
5457
5634
  } catch (error) {
5458
5635
  if (error.outputSize !== UNDEFINED_VALUE) {
@@ -6118,7 +6295,7 @@
6118
6295
  if (checkLocalFilename && !maskedLocalDirectory &&
6119
6296
  (rawLocalFilename.length != rawFilename.length ||
6120
6297
  rawLocalFilename.some((byteValue, indexByte) => byteValue != rawFilename[indexByte]))) {
6121
- reportAmbiguity(reject, warnings, "mismatched local file header (filename)");
6298
+ reportAmbiguity(reject, warnings, WARNING_MISMATCHED_LOCAL_FILE_HEADER_FILENAME);
6122
6299
  }
6123
6300
  if ((localDirectory.rawBitFlag & BITFLAG_AMBIGUITY_MASK) != (zipEntry.rawBitFlag & BITFLAG_AMBIGUITY_MASK)) {
6124
6301
  reportAmbiguity(reject, warnings, WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG);
@@ -6143,16 +6320,6 @@
6143
6320
  }
6144
6321
  }
6145
6322
 
6146
- function addWarning(warnings, reason, filename) {
6147
- if (!warnings.some(warning => warning.reason == reason)) {
6148
- const warning = { reason };
6149
- if (filename !== UNDEFINED_VALUE) {
6150
- warning.filename = filename;
6151
- }
6152
- warnings.push(warning);
6153
- }
6154
- }
6155
-
6156
6323
  function throwAmbiguousArchive(reason) {
6157
6324
  const error = new Error(ERR_AMBIGUOUS_ARCHIVE);
6158
6325
  error.reason = reason;
@@ -6232,7 +6399,9 @@
6232
6399
  WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG: WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG,
6233
6400
  WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD: WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD,
6234
6401
  WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES: WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES,
6402
+ WARNING_MISMATCHED_LOCAL_FILE_HEADER_FILENAME: WARNING_MISMATCHED_LOCAL_FILE_HEADER_FILENAME,
6235
6403
  WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY: WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY,
6404
+ WARNING_MULTIPLE_END_OF_CENTRAL_DIRECTORY: WARNING_MULTIPLE_END_OF_CENTRAL_DIRECTORY,
6236
6405
  WARNING_PREPENDED_CENTRAL_DIRECTORY: WARNING_PREPENDED_CENTRAL_DIRECTORY,
6237
6406
  WARNING_PREPENDED_DATA: WARNING_PREPENDED_DATA,
6238
6407
  WARNING_TRAILING_CENTRAL_DIRECTORY_DATA: WARNING_TRAILING_CENTRAL_DIRECTORY_DATA,
@@ -6285,7 +6454,7 @@
6285
6454
  const ERR_INVALID_ENCRYPTION_STRENGTH = "The strength must equal 1, 2, or 3";
6286
6455
  const ERR_UNSUPPORTED_ENCRYPTION_USDZ = "Encryption is not supported in USDZ files";
6287
6456
  const ERR_UNSUPPORTED_SPLIT_USDZ = "Split zip files are not supported in USDZ files";
6288
- const ERR_UNSUPPORTED_ENCRYPTION_PASS_THROUGH = "Encryption is not supported when the 'passThrough' option is set";
6457
+ const ERR_UNSUPPORTED_ENCRYPTION_PASS_THROUGH = "Encryption is not supported when the 'passThrough' option is set to true (use 'compressed' instead)";
6289
6458
  const ERR_INVALID_EXTRAFIELD = "Invalid extra field (must be a Map)";
6290
6459
  const ERR_INVALID_EXTRAFIELD_TYPE = "Invalid extra field type (must be integer 0..65535)";
6291
6460
  const ERR_INVALID_EXTRAFIELD_DATA_TYPE = "Invalid extra field data (must be a Uint8Array)";
@@ -6297,6 +6466,7 @@
6297
6466
  const ERR_UNSUPPORTED_FORMAT = "Zip64 is not supported (set the 'zip64' option to 'true')";
6298
6467
  const ERR_UNDEFINED_UNCOMPRESSED_SIZE = "Undefined uncompressed size";
6299
6468
  const ERR_UNDEFINED_COMPRESSION_METHOD = "Undefined compression method";
6469
+ const ERR_UNDEFINED_CRC32 = "Undefined CRC32";
6300
6470
  const ERR_UNDETERMINED_SIZE = "Undetermined size";
6301
6471
  const ERR_UNDEFINED_READER = "Undefined reader";
6302
6472
  const ERR_INVALID_READER = "Invalid reader (must be a Reader instance, a ReadableStream instance, or an object with a 'readable' property)";
@@ -6310,14 +6480,21 @@
6310
6480
  const ERR_INVALID_MSDOS_DATA = "Invalid msdosAttributes (must be an object with boolean flags)";
6311
6481
  const ERR_INVALID_LEVEL = "Invalid level (must be integer 0..9)";
6312
6482
  const ERR_INVALID_SIGNATURE_DATA = "Signature data exceeds 64KB";
6483
+ const ERR_INVALID_ENTRY = "Invalid entry option (must be an entry returned by ZipReader#getEntries())";
6484
+ const ERR_ZIP_CRYPTO_LAST_MOD_DATE = "The last modification date of an entry encrypted with ZipCrypto cannot be changed when passThrough is set";
6485
+ const WARNING_COMPRESSION_UNAVAILABLE = "compression unavailable";
6486
+ const WARNING_CLAMPED_LAST_MODIFICATION_DATE = "clamped last modification date";
6313
6487
 
6314
6488
  const EXTRAFIELD_DATA_AES = new Uint8Array([0x07, 0x00, 0x02, 0x00, 0x41, 0x45, 0x03, 0x00, 0x00]);
6315
6489
  const EXTRAFIELD_OFFSET_AES_VENDOR_VERSION = 4;
6316
6490
  const EXTRAFIELD_OFFSET_AES_COMPRESSION_METHOD = 9;
6317
6491
  const EXTRAFIELD_USDZ_MAX_LENGTH = 67;
6492
+ const MIN_PRINTABLE_ASCII_CHARACTER_CODE = 0x20;
6493
+ const MAX_PRINTABLE_ASCII_CHARACTER_CODE = 0x7e;
6318
6494
  const VENDOR_VERSION_AE_1 = 1;
6319
- const INFOZIP_EXTRA_FIELD_TYPE$1 = "infozip";
6495
+ const INFOZIP_EXTRA_FIELD_TYPE = "infozip";
6320
6496
  const UNIX_EXTRA_FIELD_TYPE = "unix";
6497
+ const LEVEL_BY_BITFLAG_LEVEL = [8, 9, 5, 3];
6321
6498
  const MAX_LEVEL = 9;
6322
6499
 
6323
6500
  let workers = 0;
@@ -6344,9 +6521,11 @@
6344
6521
  initialOffset: options[OPTION_OFFSET] === UNDEFINED_VALUE ? 0 : options[OPTION_OFFSET] - (writer.size || writer.writable.size || 0),
6345
6522
  pendingAddFileCalls: new Set(),
6346
6523
  pendingErrors: [],
6524
+ warnings: [],
6347
6525
  bufferedWrites: 0,
6348
6526
  directWrites: 0,
6349
- lastFileEntry: UNDEFINED_VALUE
6527
+ lastFileEntry: UNDEFINED_VALUE,
6528
+ archiveClosed: false
6350
6529
  });
6351
6530
  }
6352
6531
 
@@ -6511,6 +6690,9 @@
6511
6690
  const zipWriter = this;
6512
6691
  const { pendingAddFileCalls, writer } = this;
6513
6692
  const { writable } = writer;
6693
+ if (zipWriter.archiveClosed) {
6694
+ return getWriterData(writer);
6695
+ }
6514
6696
  if (!(comment instanceof Uint8Array)) {
6515
6697
  throw new Error(ERR_INVALID_COMMENT_TYPE);
6516
6698
  }
@@ -6534,11 +6716,16 @@
6534
6716
  throw error;
6535
6717
  }
6536
6718
  await closeFile(zipWriter, comment, options);
6719
+ zipWriter.archiveClosed = true;
6537
6720
  const preventClose = !ownsWritable(writer) && getOptionValue(zipWriter, options, OPTION_PREVENT_CLOSE);
6538
6721
  if (!preventClose) {
6539
6722
  await writable.getWriter().close();
6540
6723
  }
6541
- return writer.getData ? writer.getData() : writable;
6724
+ return getWriterData(writer);
6725
+ }
6726
+
6727
+ [SYMBOL_ASYNC_DISPOSE]() {
6728
+ return this.close();
6542
6729
  }
6543
6730
  }
6544
6731
 
@@ -6617,6 +6804,10 @@
6617
6804
  }
6618
6805
  }
6619
6806
 
6807
+ function getWriterData(writer) {
6808
+ return writer.getData ? writer.getData() : writer.writable;
6809
+ }
6810
+
6620
6811
  function watchPromiseError(zipWriter, promise) {
6621
6812
  const watchedPromise = new WatchedPromise((resolve, reject) => Promise.prototype.then.call(promise, resolve, reject));
6622
6813
  const watcher = {};
@@ -6635,6 +6826,14 @@
6635
6826
 
6636
6827
  async function addFileEntry(zipWriter, name, reader, options) {
6637
6828
  options = Object.assign({}, options);
6829
+ const entry = options[OPTION_ENTRY];
6830
+ if (entry !== UNDEFINED_VALUE) {
6831
+ const { entryOptions, passThroughOptions } = getSourceEntryOptions(entry,
6832
+ checkPassThroughOption(getOptionValue(zipWriter, options, OPTION_PASS_THROUGH)),
6833
+ getOptionValue(zipWriter, options, PROPERTY_NAME_LAST_MODIFICATION_DATE));
6834
+ delete options[OPTION_ENTRY];
6835
+ options = Object.assign(entryOptions, passThroughOptions, options);
6836
+ }
6638
6837
  if (getOptionValue(zipWriter, options, PROPERTY_NAME_DIRECTORY) && !name.endsWith(DIRECTORY_SIGNATURE)) {
6639
6838
  name += DIRECTORY_SIGNATURE;
6640
6839
  }
@@ -6699,21 +6898,33 @@
6699
6898
  try {
6700
6899
  const { resolvedOptions } = metadataInfo;
6701
6900
  if (resolvedOptions.level != 0 && resolvedOptions.compressionMethod === UNDEFINED_VALUE &&
6702
- !resolvedOptions.passThrough && !(await supportsDeflate(getConfiguration()))) {
6901
+ !resolvedOptions.passThroughCompression && !(await supportsDeflate(getConfiguration()))) {
6703
6902
  resolvedOptions.level = 0;
6903
+ addWarning(zipWriter.warnings, WARNING_COMPRESSION_UNAVAILABLE, name);
6704
6904
  }
6705
6905
  const sizesInfo = await resolveSizes(zipWriter, reader, metadataInfo, options);
6706
6906
  ({ reader } = sizesInfo);
6707
6907
  const diskOffset = getDiskOffset(zipWriter.writer);
6708
6908
  const diskNumber = getDiskNumber(zipWriter.writer);
6909
+ let crc32 = options.crc32 === UNDEFINED_VALUE ? options[PROPERTY_NAME_SIGNATURE] : options.crc32;
6910
+ const storesAE2 = sizesInfo.resolvedOptions.encrypted && !resolvedOptions.zipCrypto;
6911
+ if (resolvedOptions.passThroughCompression && !resolvedOptions.passThroughEncryption && storesAE2) {
6912
+ crc32 = UNDEFINED_VALUE;
6913
+ }
6914
+ if (resolvedOptions.passThroughCompression && reader && !storesAE2 && crc32 === UNDEFINED_VALUE) {
6915
+ throw new Error(ERR_UNDEFINED_CRC32);
6916
+ }
6709
6917
  options = Object.assign({}, options, attributesInfo.resolvedOptions, metadataInfo.resolvedOptions, sizesInfo.resolvedOptions, {
6710
6918
  signature: options[PROPERTY_NAME_SIGNATURE],
6711
- crc32: options.crc32 === UNDEFINED_VALUE ? options[PROPERTY_NAME_SIGNATURE] : options.crc32,
6919
+ crc32,
6712
6920
  offset: zipWriter.offset - diskOffset,
6713
6921
  diskNumberStart: diskNumber,
6714
6922
  [OPTION_USDZ]: zipWriter.options[OPTION_USDZ]
6715
6923
  });
6716
6924
  const headerInfo = getHeaderInfo(options);
6925
+ if (headerInfo.lastModDateClamped) {
6926
+ addWarning(zipWriter.warnings, WARNING_CLAMPED_LAST_MODIFICATION_DATE, name);
6927
+ }
6717
6928
  const dataDescriptorInfo = getDataDescriptorInfo(options);
6718
6929
  const metadataSize = getLength(headerInfo.localHeaderArray, dataDescriptorInfo.dataDescriptorArray);
6719
6930
  fileEntry = await getFileEntry(zipWriter, name, reader, {
@@ -6740,6 +6951,95 @@
6740
6951
  return new Entry(fileEntry);
6741
6952
  }
6742
6953
 
6954
+ function getSourceEntryOptions(entry, passThrough, lastModDateOverride) {
6955
+ if (entry === null || typeof entry != OBJECT_TYPE || Array.isArray(entry)) {
6956
+ throw new Error(ERR_INVALID_ENTRY);
6957
+ }
6958
+ const {
6959
+ externalFileAttributes,
6960
+ versionMadeBy,
6961
+ comment,
6962
+ lastModDate,
6963
+ rawLastModDate,
6964
+ creationDate,
6965
+ lastAccessDate,
6966
+ uncompressedSize,
6967
+ encrypted,
6968
+ zipCrypto,
6969
+ crc32,
6970
+ compressionMethod,
6971
+ extraFieldAES,
6972
+ extraFieldUnix,
6973
+ internalFileAttributes,
6974
+ extraField,
6975
+ bitFlag,
6976
+ directory,
6977
+ uid,
6978
+ gid
6979
+ } = entry;
6980
+ const entryOptions = {
6981
+ externalFileAttributes,
6982
+ versionMadeBy,
6983
+ comment,
6984
+ lastModDate,
6985
+ creationDate,
6986
+ lastAccessDate,
6987
+ internalFileAttributes,
6988
+ directory
6989
+ };
6990
+ if (bitFlag && bitFlag.languageEncodingFlag) {
6991
+ entryOptions[OPTION_USE_UNICODE_FILE_NAMES] = true;
6992
+ }
6993
+ const userExtraField = getUserExtraField(extraField);
6994
+ if (userExtraField) {
6995
+ entryOptions[PROPERTY_NAME_EXTRA_FIELD] = userExtraField;
6996
+ }
6997
+ if (uid !== UNDEFINED_VALUE || gid !== UNDEFINED_VALUE) {
6998
+ Object.assign(entryOptions, {
6999
+ uid,
7000
+ gid,
7001
+ unixExtraFieldType: extraFieldUnix ? UNIX_EXTRA_FIELD_TYPE : INFOZIP_EXTRA_FIELD_TYPE
7002
+ });
7003
+ }
7004
+ const passThroughOptions = {};
7005
+ if (passThrough && !directory) {
7006
+ Object.assign(passThroughOptions, {
7007
+ uncompressedSize,
7008
+ crc32,
7009
+ compressionMethod
7010
+ });
7011
+ if (passThrough !== PASS_THROUGH_COMPRESSED) {
7012
+ Object.assign(passThroughOptions, {
7013
+ encrypted,
7014
+ zipCrypto,
7015
+ encryptionStrength: extraFieldAES ? extraFieldAES.strength : UNDEFINED_VALUE
7016
+ });
7017
+ }
7018
+ if (bitFlag) {
7019
+ passThroughOptions.dataDescriptor = bitFlag.dataDescriptor;
7020
+ passThroughOptions[OPTION_LEVEL] = LEVEL_BY_BITFLAG_LEVEL[bitFlag.level];
7021
+ }
7022
+ if (lastModDateOverride === UNDEFINED_VALUE) {
7023
+ passThroughOptions.rawLastModDate = rawLastModDate;
7024
+ } else if (passThrough !== PASS_THROUGH_COMPRESSED && zipCrypto && (!bitFlag || bitFlag.dataDescriptor) &&
7025
+ lastModDateOverride instanceof Date &&
7026
+ getDosTimeHighByte(lastModDateOverride) != ((rawLastModDate >>> 8) & MAX_8_BITS)) {
7027
+ throw new Error(ERR_ZIP_CRYPTO_LAST_MOD_DATE);
7028
+ }
7029
+ }
7030
+ return { entryOptions, passThroughOptions };
7031
+ }
7032
+
7033
+ function getDosTimeHighByte(lastModDate) {
7034
+ let dosLastModDate = new Date(Math.ceil(Math.floor(lastModDate.getTime() / 1000) / 2) * 2000);
7035
+ if (dosLastModDate < MIN_DATE) {
7036
+ dosLastModDate = MIN_DATE;
7037
+ } else if (dosLastModDate > MAX_DATE) {
7038
+ dosLastModDate = MAX_DATE;
7039
+ }
7040
+ return ((dosLastModDate.getHours() << 3) | (dosLastModDate.getMinutes() >> 3)) & MAX_8_BITS;
7041
+ }
7042
+
6743
7043
  function resolveAttributes(zipWriter, name, options) {
6744
7044
  let msDosCompatible = getOptionValue(zipWriter, options, PROPERTY_NAME_MS_DOS_COMPATIBLE);
6745
7045
  let versionMadeBy = getOptionValue(zipWriter, options, PROPERTY_NAME_VERSION_MADE_BY, msDosCompatible ? VERSION_MADE_BY_MSDOS : VERSION_MADE_BY_UNIX);
@@ -6754,7 +7054,7 @@
6754
7054
  checkIntegerOption(uid, MAX_32_BITS, ERR_INVALID_UID);
6755
7055
  checkIntegerOption(gid, MAX_32_BITS, ERR_INVALID_GID);
6756
7056
  checkIntegerOption(unixMode, MAX_16_BITS, ERR_INVALID_UNIX_MODE);
6757
- if (unixExtraFieldType !== UNDEFINED_VALUE && unixExtraFieldType !== INFOZIP_EXTRA_FIELD_TYPE$1 && unixExtraFieldType !== UNIX_EXTRA_FIELD_TYPE) {
7057
+ if (unixExtraFieldType !== UNDEFINED_VALUE && unixExtraFieldType !== INFOZIP_EXTRA_FIELD_TYPE && unixExtraFieldType !== UNIX_EXTRA_FIELD_TYPE) {
6758
7058
  throw new Error(ERR_INVALID_UNIX_EXTRA_FIELD_TYPE);
6759
7059
  }
6760
7060
  if (unixExtraFieldType === UNIX_EXTRA_FIELD_TYPE &&
@@ -6762,7 +7062,7 @@
6762
7062
  throw new Error(ERR_INVALID_UNIX_ID_SIZE);
6763
7063
  }
6764
7064
  if (unixExtraFieldType === UNDEFINED_VALUE && (uid !== UNDEFINED_VALUE || gid !== UNDEFINED_VALUE)) {
6765
- unixExtraFieldType = INFOZIP_EXTRA_FIELD_TYPE$1;
7065
+ unixExtraFieldType = INFOZIP_EXTRA_FIELD_TYPE;
6766
7066
  }
6767
7067
  let msdosAttributesRaw = getNumberOptionValue(zipWriter, options, PROPERTY_NAME_MSDOS_ATTRIBUTES_RAW);
6768
7068
  let msdosAttributes = getOptionValue(zipWriter, options, PROPERTY_NAME_MSDOS_ATTRIBUTES);
@@ -6893,7 +7193,9 @@
6893
7193
  const lastAccessDate = getDateOptionValue(zipWriter, options, PROPERTY_NAME_LAST_ACCESS_DATE);
6894
7194
  const creationDate = getDateOptionValue(zipWriter, options, PROPERTY_NAME_CREATION_DATE);
6895
7195
  const internalFileAttributes = getOptionValue(zipWriter, options, PROPERTY_NAME_INTERNAL_FILE_ATTRIBUTES, 0);
6896
- const passThrough = getOptionValue(zipWriter, options, OPTION_PASS_THROUGH);
7196
+ const passThrough = checkPassThroughOption(getOptionValue(zipWriter, options, OPTION_PASS_THROUGH));
7197
+ const passThroughCompression = Boolean(passThrough);
7198
+ const passThroughEncryption = passThrough === true;
6897
7199
  const password = getOptionValue(zipWriter, options, OPTION_PASSWORD);
6898
7200
  const rawPassword = getOptionValue(zipWriter, options, OPTION_RAW_PASSWORD);
6899
7201
  checkPasswordOption(password, rawPassword);
@@ -6909,10 +7211,11 @@
6909
7211
  const dataDescriptorSignature = getOptionValue(zipWriter, options, OPTION_DATA_DESCRIPTOR_SIGNATURE, true);
6910
7212
  const signal = checkSignalOption(getOptionValue(zipWriter, options, OPTION_SIGNAL));
6911
7213
  throwIfAborted(signal);
6912
- const useUnicodeFileNames = getOptionValue(zipWriter, options, OPTION_USE_UNICODE_FILE_NAMES, true);
7214
+ const useUnicodeFileNames = getOptionValue(zipWriter, options, OPTION_USE_UNICODE_FILE_NAMES,
7215
+ !isPrintableASCIIText(rawFilename) || !isPrintableASCIIText(rawComment));
6913
7216
  const compressionMethod = getOptionValue(zipWriter, options, PROPERTY_NAME_COMPRESSION_METHOD);
6914
- const registeredCodec = passThrough || compressionMethod === UNDEFINED_VALUE ? UNDEFINED_VALUE : getRegisteredCodec(compressionMethod);
6915
- if (!passThrough && compressionMethod !== UNDEFINED_VALUE &&
7217
+ const registeredCodec = passThroughCompression || compressionMethod === UNDEFINED_VALUE ? UNDEFINED_VALUE : getRegisteredCodec(compressionMethod);
7218
+ if (!passThroughCompression && compressionMethod !== UNDEFINED_VALUE &&
6916
7219
  compressionMethod !== COMPRESSION_METHOD_STORE && compressionMethod !== COMPRESSION_METHOD_DEFLATE && !registeredCodec) {
6917
7220
  throw new Error(ERR_UNSUPPORTED_COMPRESSION);
6918
7221
  }
@@ -6926,15 +7229,15 @@
6926
7229
  level = 0;
6927
7230
  }
6928
7231
  }
6929
- if (passThrough) {
6930
- level = UNDEFINED_VALUE;
7232
+ if (passThroughCompression) {
7233
+ level = toNumber(options[OPTION_LEVEL]);
6931
7234
  }
6932
7235
  let useCompressionStream = getOptionValue(zipWriter, options, OPTION_USE_COMPRESSION_STREAM);
6933
7236
  let dataDescriptor = getOptionValue(zipWriter, options, OPTION_DATA_DESCRIPTOR);
6934
7237
  if (bufferedWrite && dataDescriptor === UNDEFINED_VALUE) {
6935
7238
  dataDescriptor = false;
6936
7239
  }
6937
- if (dataDescriptor === UNDEFINED_VALUE || (zipCrypto && !passThrough)) {
7240
+ if (dataDescriptor === UNDEFINED_VALUE || (zipCrypto && !passThroughEncryption)) {
6938
7241
  dataDescriptor = true;
6939
7242
  }
6940
7243
  if (level !== UNDEFINED_VALUE && level != 6) {
@@ -6958,7 +7261,8 @@
6958
7261
  lastAccessDate,
6959
7262
  creationDate,
6960
7263
  internalFileAttributes,
6961
- passThrough,
7264
+ passThroughCompression,
7265
+ passThroughEncryption,
6962
7266
  password,
6963
7267
  rawPassword,
6964
7268
  encryptionStrength,
@@ -7019,7 +7323,7 @@
7019
7323
  }
7020
7324
 
7021
7325
  async function resolveSizes(zipWriter, reader, { resolvedOptions: metadata }, options) {
7022
- if (metadata.passThrough && !reader && !getOptionValue(zipWriter, options, PROPERTY_NAME_DIRECTORY)) {
7326
+ if (metadata.passThroughCompression && !reader && !getOptionValue(zipWriter, options, PROPERTY_NAME_DIRECTORY)) {
7023
7327
  throw new Error(ERR_UNDEFINED_READER);
7024
7328
  }
7025
7329
  let contentSize;
@@ -7035,12 +7339,12 @@
7035
7339
  }
7036
7340
 
7037
7341
  function resolveEntrySizes(zipWriter, hasContent, contentSize, metadata, options) {
7038
- const { passThrough, zipCrypto, password, rawPassword, encryptionStrength } = metadata;
7342
+ const { passThroughCompression, passThroughEncryption, zipCrypto, password, rawPassword, encryptionStrength } = metadata;
7039
7343
  let { dataDescriptor, zip64, level, compressionMethod } = metadata;
7040
7344
  let maximumCompressedSize = 0;
7041
7345
  let uncompressedSize = 0;
7042
7346
  let unknownSize = false;
7043
- if (passThrough && hasContent) {
7347
+ if (passThroughCompression && hasContent) {
7044
7348
  uncompressedSize = options[PROPERTY_NAME_UNCOMPRESSED_SIZE];
7045
7349
  if (uncompressedSize === UNDEFINED_VALUE) {
7046
7350
  throw new Error(ERR_UNDEFINED_UNCOMPRESSED_SIZE);
@@ -7051,17 +7355,17 @@
7051
7355
  }
7052
7356
  const zip64Enabled = zip64 === true;
7053
7357
  const encrypted = getOptionValue(zipWriter, options, PROPERTY_NAME_ENCRYPTED);
7054
- if (hasContent && passThrough && !encrypted && getLength(password, rawPassword)) {
7358
+ if (hasContent && passThroughEncryption && !encrypted && getLength(password, rawPassword)) {
7055
7359
  throw new Error(ERR_UNSUPPORTED_ENCRYPTION_PASS_THROUGH);
7056
7360
  }
7057
- const encryptedEntry = hasContent && (Boolean((password && getLength(password)) || (rawPassword && getLength(rawPassword))) || (passThrough && encrypted));
7361
+ const encryptedEntry = hasContent && (Boolean((password && getLength(password)) || (rawPassword && getLength(rawPassword))) || (passThroughEncryption && encrypted));
7058
7362
  if (!hasContent) {
7059
7363
  level = 0;
7060
7364
  compressionMethod = COMPRESSION_METHOD_STORE;
7061
7365
  }
7062
- const encryptionOverhead = encryptedEntry ? (zipCrypto ? 12 : 16 + encryptionStrength * 4) : 0;
7366
+ const encryptionOverhead = getEncryptionOverhead(encryptedEntry, zipCrypto, encryptionStrength);
7063
7367
  if (hasContent) {
7064
- if (!passThrough) {
7368
+ if (!passThroughCompression) {
7065
7369
  if (contentSize === UNDEFINED_VALUE) {
7066
7370
  dataDescriptor = true;
7067
7371
  if (zip64 || zip64 === UNDEFINED_VALUE) {
@@ -7074,10 +7378,12 @@
7074
7378
  }
7075
7379
  } else {
7076
7380
  options.uncompressedSize = uncompressedSize;
7077
- maximumCompressedSize = contentSize === UNDEFINED_VALUE ? getMaximumCompressedSize(uncompressedSize) + encryptionOverhead : contentSize;
7381
+ maximumCompressedSize = contentSize === UNDEFINED_VALUE ?
7382
+ getMaximumCompressedSize(uncompressedSize) + encryptionOverhead :
7383
+ contentSize + (passThroughEncryption ? 0 : encryptionOverhead);
7078
7384
  }
7079
7385
  }
7080
- const emptyEntry = !encryptedEntry && (!hasContent || (contentSize === 0 && !passThrough)) && !isCompressed(compressionMethod, level);
7386
+ const emptyEntry = !encryptedEntry && (!hasContent || (contentSize === 0 && !passThroughCompression)) && !isCompressed(compressionMethod, level);
7081
7387
  if (emptyEntry && !zipCrypto && getOptionValue(zipWriter, options, OPTION_DATA_DESCRIPTOR) === UNDEFINED_VALUE) {
7082
7388
  dataDescriptor = false;
7083
7389
  }
@@ -7126,6 +7432,8 @@
7126
7432
  const initialOffset = writerOptions[OPTION_OFFSET] === UNDEFINED_VALUE ? 0 : writerOptions[OPTION_OFFSET];
7127
7433
  let offset = initialOffset;
7128
7434
  let minimumEntrySize = INFINITY_VALUE;
7435
+ const entrySizes = [];
7436
+ const entriesAlreadyZip64 = new Set();
7129
7437
  for (const entry of entries) {
7130
7438
  let { name } = entry;
7131
7439
  const { size } = entry;
@@ -7137,7 +7445,7 @@
7137
7445
  ({ name } = attributesInfo);
7138
7446
  const { resolvedOptions: metadata } = resolveMetadata(zipWriter, name, options);
7139
7447
  if (metadata.level != 0 && metadata.compressionMethod === UNDEFINED_VALUE &&
7140
- !metadata.passThrough && !(await supportsDeflate(getConfiguration()))) {
7448
+ !metadata.passThroughCompression && !(await supportsDeflate(getConfiguration()))) {
7141
7449
  metadata.level = 0;
7142
7450
  }
7143
7451
  const hasContent = !getOptionValue(zipWriter, options, PROPERTY_NAME_DIRECTORY);
@@ -7145,7 +7453,7 @@
7145
7453
  throw new Error(ERR_UNDETERMINED_SIZE);
7146
7454
  }
7147
7455
  const { maximumCompressedSize, resolvedOptions: sizes } = resolveEntrySizes(zipWriter, hasContent, size, metadata, options);
7148
- if (hasContent && !metadata.passThrough && isCompressed(sizes.compressionMethod, sizes.level)) {
7456
+ if (hasContent && !metadata.passThroughCompression && isCompressed(sizes.compressionMethod, sizes.level)) {
7149
7457
  throw new Error(ERR_UNDETERMINED_SIZE);
7150
7458
  }
7151
7459
  const entryOptions = Object.assign({}, options, attributesInfo.resolvedOptions, metadata, sizes, { [OPTION_USDZ]: usdz });
@@ -7165,10 +7473,15 @@
7165
7473
  compressedSize
7166
7474
  }));
7167
7475
  const entrySize = entryInfo.metadataSize + compressedSize;
7476
+ entrySizes.push(entrySize);
7477
+ entriesAlreadyZip64.add(Boolean(entryOptions.zip64Enabled ||
7478
+ entryOptions.uncompressedSize >= MAX_32_BITS || compressedSize >= MAX_32_BITS));
7168
7479
  minimumEntrySize = Math.min(minimumEntrySize, entrySize);
7169
7480
  offset += entrySize;
7170
7481
  }
7171
- const layoutDependsOnWriteOrder = files.size > 1 && (usdz || offset - minimumEntrySize >= MAX_32_BITS);
7482
+ const layoutDependsOnWriteOrder = files.size > 1 && (usdz ||
7483
+ (offset - minimumEntrySize >= MAX_32_BITS &&
7484
+ (entriesAlreadyZip64.size > 1 || countEntriesBefore4GB(entrySizes, initialOffset, true) != countEntriesBefore4GB(entrySizes, initialOffset, false))));
7172
7485
  if (layoutDependsOnWriteOrder && !writeOrderGuaranteed) {
7173
7486
  throw new Error(ERR_UNDETERMINED_SIZE);
7174
7487
  }
@@ -7186,6 +7499,20 @@
7186
7499
  return offset - initialOffset + directoryDataLength + commentLength + (zip64 ? ZIP64_END_OF_CENTRAL_DIR_TOTAL_LENGTH : END_OF_CENTRAL_DIR_LENGTH);
7187
7500
  }
7188
7501
 
7502
+ function countEntriesBefore4GB(entrySizes, initialOffset, largestFirst) {
7503
+ const ordered = entrySizes.slice().sort((first, second) => largestFirst ? second - first : first - second);
7504
+ let position = initialOffset;
7505
+ let count = 0;
7506
+ for (const entrySize of ordered) {
7507
+ if (position >= MAX_32_BITS) {
7508
+ break;
7509
+ }
7510
+ position += entrySize;
7511
+ count++;
7512
+ }
7513
+ return count;
7514
+ }
7515
+
7189
7516
  async function getFileEntry(zipWriter, name, reader, entryInfo, options) {
7190
7517
  const {
7191
7518
  fileEntries,
@@ -7361,6 +7688,7 @@
7361
7688
  localExtraFieldZip64Length,
7362
7689
  rawExtraFieldExtendedTimestamp,
7363
7690
  extraFieldExtendedTimestampFlag,
7691
+ extraFieldExtendedTimestampTime,
7364
7692
  rawExtraFieldNTFS,
7365
7693
  rawExtraFieldUnix,
7366
7694
  rawExtraFieldAES,
@@ -7373,6 +7701,7 @@
7373
7701
  password,
7374
7702
  rawPassword,
7375
7703
  level,
7704
+ useUnicodeFileNames,
7376
7705
  zip64,
7377
7706
  zip64Enabled,
7378
7707
  zip64UncompressedSize,
@@ -7407,7 +7736,8 @@
7407
7736
  msdosAttributesRaw,
7408
7737
  msdosAttributes,
7409
7738
  useCompressionStream,
7410
- passThrough,
7739
+ passThroughCompression,
7740
+ passThroughEncryption,
7411
7741
  format,
7412
7742
  codecURI
7413
7743
  } = options;
@@ -7418,9 +7748,9 @@
7418
7748
  zip64Enabled,
7419
7749
  directory: Boolean(directory),
7420
7750
  executable: Boolean(executable),
7421
- filenameUTF8: true,
7751
+ filenameUTF8: Boolean(useUnicodeFileNames),
7422
7752
  rawFilename,
7423
- commentUTF8: true,
7753
+ commentUTF8: Boolean(useUnicodeFileNames),
7424
7754
  rawComment,
7425
7755
  rawExtraFieldZip64,
7426
7756
  localExtraFieldZip64Length,
@@ -7451,7 +7781,7 @@
7451
7781
  uncompressedSize
7452
7782
  } = options;
7453
7783
  let compressedSize = 0;
7454
- if (!passThrough) {
7784
+ if (!passThroughCompression) {
7455
7785
  uncompressedSize = 0;
7456
7786
  }
7457
7787
  const { writable } = writer;
@@ -7468,9 +7798,9 @@
7468
7798
  encryptionStrength,
7469
7799
  zipCrypto: encrypted && zipCrypto,
7470
7800
  passwordVerification: encrypted && zipCrypto && (rawLastModDate >> 8) & MAX_8_BITS,
7471
- computeCrc32: !passThrough,
7472
- compressed: compressed && !passThrough,
7473
- encrypted: encrypted && !passThrough,
7801
+ computeCrc32: !passThroughCompression,
7802
+ compressed: compressed && !passThroughCompression,
7803
+ encrypted: encrypted && !passThroughEncryption,
7474
7804
  useWebWorkers,
7475
7805
  useCompressionStream,
7476
7806
  transferStreams,
@@ -7485,7 +7815,7 @@
7485
7815
  const result = await runWorker({ readable, writable }, workerOptions);
7486
7816
  compressedSize = result.outputSize;
7487
7817
  writer.size += compressedSize;
7488
- if (!passThrough) {
7818
+ if (!passThroughCompression) {
7489
7819
  uncompressedSize = result.inputSize;
7490
7820
  if (!encrypted || zipCrypto) {
7491
7821
  crc32 = result.crc32;
@@ -7528,8 +7858,9 @@
7528
7858
  headerArray,
7529
7859
  headerView,
7530
7860
  signature: crc32,
7531
- crc32: encrypted && !zipCrypto && !passThrough ? UNDEFINED_VALUE : crc32,
7861
+ crc32: encrypted && !zipCrypto && !passThroughCompression ? UNDEFINED_VALUE : crc32,
7532
7862
  extraFieldExtendedTimestampFlag,
7863
+ extraFieldExtendedTimestampTime,
7533
7864
  zip64UncompressedSize,
7534
7865
  zip64CompressedSize
7535
7866
  });
@@ -7554,7 +7885,7 @@
7554
7885
  encryptionStrength,
7555
7886
  extendedTimestamp,
7556
7887
  ntfsTimestamp,
7557
- passThrough,
7888
+ passThroughCompression,
7558
7889
  encrypted,
7559
7890
  zip64UncompressedSize,
7560
7891
  zip64CompressedSize,
@@ -7565,7 +7896,7 @@
7565
7896
  let { version, compressionMethod } = options;
7566
7897
  const compressed = !directory && isCompressed(compressionMethod, level);
7567
7898
  let rawLocalExtraFieldZip64;
7568
- const uncompressedFile = passThrough || !compressed;
7899
+ const uncompressedFile = passThroughCompression || !compressed;
7569
7900
  const zip64ExtraFieldComplete = zip64 && (options.bufferedWrite || !dataDescriptor || ((!zip64UncompressedSize && !zip64CompressedSize) || (uncompressedFile && !unknownSize)));
7570
7901
  const writeLocalExtraFieldZip64 = zip64ExtraFieldComplete || (zip64 && dataDescriptor && (zip64UncompressedSize || zip64CompressedSize));
7571
7902
  if (zip64 && (zip64UncompressedSize || zip64CompressedSize)) {
@@ -7577,8 +7908,8 @@
7577
7908
  if (zip64ExtraFieldComplete) {
7578
7909
  extraFieldZip64.writeUint64(uncompressedSize);
7579
7910
  if (uncompressedFile) {
7580
- const encryptionOverhead = encrypted ? (zipCrypto ? 12 : 16 + encryptionStrength * 4) : 0;
7581
- extraFieldZip64.writeUint64(passThrough ? 0 : uncompressedSize + encryptionOverhead);
7911
+ const encryptionOverhead = getEncryptionOverhead(encrypted, zipCrypto, encryptionStrength);
7912
+ extraFieldZip64.writeUint64(passThroughCompression ? 0 : uncompressedSize + encryptionOverhead);
7582
7913
  }
7583
7914
  }
7584
7915
  } else {
@@ -7597,6 +7928,7 @@
7597
7928
  let rawExtraFieldNTFS;
7598
7929
  let rawExtraFieldExtendedTimestamp;
7599
7930
  let extraFieldExtendedTimestampFlag;
7931
+ let extraFieldExtendedTimestampTime;
7600
7932
  if (extendedTimestamp) {
7601
7933
  const lastModTimeUnix = getTimeUnix(lastModDate);
7602
7934
  const lastModTimeUnixInRange = inUnixTimeRange(lastModTimeUnix);
@@ -7604,6 +7936,7 @@
7604
7936
  const extraFieldTimestampLength = 9 + (lastAccessDate ? 4 : 0) + (creationDate ? 4 : 0);
7605
7937
  const extraFieldTimestamp = createRecordWriter(extraFieldTimestampLength);
7606
7938
  extraFieldExtendedTimestampFlag = 0x1 + (lastAccessDate ? 0x2 : 0) + (creationDate ? 0x4 : 0);
7939
+ extraFieldExtendedTimestampTime = lastModTimeUnix;
7607
7940
  extraFieldTimestamp.writeUint16(EXTRAFIELD_TYPE_EXTENDED_TIMESTAMP);
7608
7941
  extraFieldTimestamp.writeUint16(extraFieldTimestampLength - 4);
7609
7942
  extraFieldTimestamp.writeUint8(extraFieldExtendedTimestampFlag);
@@ -7646,7 +7979,7 @@
7646
7979
  let rawExtraFieldUnix;
7647
7980
  try {
7648
7981
  const { uid, gid, unixExtraFieldType } = options;
7649
- if (unixExtraFieldType == INFOZIP_EXTRA_FIELD_TYPE$1 && (uid !== UNDEFINED_VALUE || gid !== UNDEFINED_VALUE)) {
7982
+ if (unixExtraFieldType == INFOZIP_EXTRA_FIELD_TYPE && (uid !== UNDEFINED_VALUE || gid !== UNDEFINED_VALUE)) {
7650
7983
  const uidBytes = packUnixId(uid === UNDEFINED_VALUE ? 0 : uid);
7651
7984
  const gidBytes = packUnixId(gid === UNDEFINED_VALUE ? 0 : gid);
7652
7985
  const payloadLength = 3 + uidBytes.length + gidBytes.length;
@@ -7687,7 +8020,7 @@
7687
8020
  }
7688
8021
  if (encrypted && !zipCrypto) {
7689
8022
  version = version > VERSION_AES ? version : VERSION_AES;
7690
- if (passThrough && crc32 !== UNDEFINED_VALUE) {
8023
+ if (passThroughCompression && crc32 !== UNDEFINED_VALUE) {
7691
8024
  rawExtraFieldAES[EXTRAFIELD_OFFSET_AES_VENDOR_VERSION] = VENDOR_VERSION_AE_1;
7692
8025
  }
7693
8026
  setUint16(getDataView(rawExtraFieldAES), EXTRAFIELD_OFFSET_AES_COMPRESSION_METHOD, compressionMethod);
@@ -7749,12 +8082,14 @@
7749
8082
  headerArray,
7750
8083
  headerView,
7751
8084
  lastModDate: storedLastModDate,
8085
+ lastModDateClamped: storedLastModDate === clampedLastModDate && dosLastModDate.getTime() != clampedLastModDate.getTime(),
7752
8086
  rawLastModDate,
7753
8087
  encrypted,
7754
8088
  compressed,
7755
8089
  version,
7756
8090
  compressionMethod,
7757
8091
  extraFieldExtendedTimestampFlag,
8092
+ extraFieldExtendedTimestampTime,
7758
8093
  rawExtraFieldZip64: EMPTY_UINT8_ARRAY,
7759
8094
  localExtraFieldZip64Length,
7760
8095
  rawExtraFieldExtendedTimestamp,
@@ -7857,7 +8192,7 @@
7857
8192
  }, {
7858
8193
  zip64,
7859
8194
  zipCrypto,
7860
- passThrough,
8195
+ passThroughCompression,
7861
8196
  dataDescriptor
7862
8197
  }) {
7863
8198
  const {
@@ -7868,7 +8203,7 @@
7868
8203
  dataDescriptorView,
7869
8204
  dataDescriptorOffset
7870
8205
  } = dataDescriptorInfo;
7871
- if ((!encrypted || zipCrypto || passThrough) && crc32 !== UNDEFINED_VALUE) {
8206
+ if ((!encrypted || zipCrypto || passThroughCompression) && crc32 !== UNDEFINED_VALUE) {
7872
8207
  setUint32(headerView, HEADER_OFFSET_SIGNATURE, crc32);
7873
8208
  if (dataDescriptor) {
7874
8209
  setUint32(dataDescriptorView, dataDescriptorOffset, crc32);
@@ -7899,9 +8234,9 @@
7899
8234
  uncompressedSize,
7900
8235
  zip64UncompressedSize,
7901
8236
  zip64CompressedSize
7902
- }, localHeaderView, { dataDescriptor, passThrough }) {
8237
+ }, localHeaderView, { dataDescriptor, passThroughCompression }) {
7903
8238
  if (!dataDescriptor) {
7904
- if (!encrypted || (passThrough && crc32 !== UNDEFINED_VALUE)) {
8239
+ if (!encrypted || (passThroughCompression && crc32 !== UNDEFINED_VALUE)) {
7905
8240
  setUint32(localHeaderView, HEADER_OFFSET_SIGNATURE + LOCAL_HEADER_COMMON_OFFSET, crc32);
7906
8241
  }
7907
8242
  if (!zip64CompressedSize) {
@@ -7938,9 +8273,8 @@
7938
8273
  rawExtraFieldUnix,
7939
8274
  rawExtraField,
7940
8275
  rawCentralExtraField,
7941
- extendedTimestamp,
7942
8276
  extraFieldExtendedTimestampFlag,
7943
- lastModDate,
8277
+ extraFieldExtendedTimestampTime,
7944
8278
  zip64Enabled,
7945
8279
  uncompressedSize,
7946
8280
  compressedSize
@@ -7983,16 +8317,15 @@
7983
8317
  fileEntry.zip64Offset = zip64Offset;
7984
8318
  fileEntry.zip64DiskNumberStart = zip64DiskNumberStart;
7985
8319
  let rawExtraFieldTimestamp;
7986
- const lastModTimeUnix = getTimeUnix(lastModDate);
7987
- if (extendedTimestamp && inUnixTimeRange(lastModTimeUnix)) {
8320
+ if (extraFieldExtendedTimestampTime === UNDEFINED_VALUE) {
8321
+ rawExtraFieldTimestamp = EMPTY_UINT8_ARRAY;
8322
+ } else {
7988
8323
  const extraFieldTimestamp = createRecordWriter(9);
7989
8324
  extraFieldTimestamp.writeUint16(EXTRAFIELD_TYPE_EXTENDED_TIMESTAMP);
7990
8325
  extraFieldTimestamp.writeUint16(5);
7991
8326
  extraFieldTimestamp.writeUint8(extraFieldExtendedTimestampFlag);
7992
- extraFieldTimestamp.writeUint32(lastModTimeUnix);
8327
+ extraFieldTimestamp.writeUint32(extraFieldExtendedTimestampTime);
7993
8328
  rawExtraFieldTimestamp = extraFieldTimestamp.array;
7994
- } else {
7995
- rawExtraFieldTimestamp = EMPTY_UINT8_ARRAY;
7996
8329
  }
7997
8330
  fileEntry.rawExtraFieldExtendedTimestamp = rawExtraFieldTimestamp;
7998
8331
  const extraFieldLength = getLength(
@@ -8492,6 +8825,11 @@
8492
8825
  };
8493
8826
  }
8494
8827
 
8828
+ function isPrintableASCIIText(rawText) {
8829
+ return rawText.every(characterCode =>
8830
+ characterCode >= MIN_PRINTABLE_ASCII_CHARACTER_CODE && characterCode <= MAX_PRINTABLE_ASCII_CHARACTER_CODE);
8831
+ }
8832
+
8495
8833
  function getBitFlag(level, useUnicodeFileNames, dataDescriptor, encrypted, compressionMethod) {
8496
8834
  let bitFlag = 0;
8497
8835
  if (useUnicodeFileNames) {
@@ -8653,7 +8991,7 @@
8653
8991
  EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
8654
8992
  */
8655
8993
 
8656
- const VERSION = "2.11.4";
8994
+ const VERSION = "2.12.0";
8657
8995
 
8658
8996
  /*
8659
8997
  Copyright (c) 2025 Gildas Lormeau. All rights reserved.
@@ -9475,9 +9813,9 @@
9475
9813
  DecompressionStreamFallback: DecompressionStreamZlib
9476
9814
  });
9477
9815
 
9478
- function terminateWorkersAndModule() {
9816
+ async function terminateWorkersAndModule() {
9817
+ await terminateWorkers();
9479
9818
  modulePromise = null;
9480
- terminateWorkers();
9481
9819
  resetWasmModule();
9482
9820
  }
9483
9821
 
@@ -9544,7 +9882,10 @@
9544
9882
  const ERR_ENTRY_EXISTS = "Entry filename already exists";
9545
9883
  const ERR_DUPLICATE_IMPORTED_ENTRY = "Duplicate entry filename in the imported zip file";
9546
9884
  const ERR_INVALID_DUPLICATES = "Invalid duplicates option (must be \"throw\", \"keep-first\" or \"keep-last\")";
9547
- const ERR_ANCESTOR_ENTRY = "Entry is a ancestor of target entry";
9885
+ const ERR_ANCESTOR_ENTRY = "Entry is an ancestor of target entry";
9886
+ const ERR_ROOT_DIRECTORY_NOT_MOVABLE = "Root directory cannot be moved";
9887
+ const ERR_TARGET_NOT_DIRECTORY = "Target entry is not a directory";
9888
+ const ERR_PARENT_NOT_DIRECTORY = "Parent entry is not a directory";
9548
9889
  const ERR_READABLE_CONSUMED = "Readable stream already consumed";
9549
9890
  const DUPLICATES_THROW = "throw";
9550
9891
  const DUPLICATES_KEEP_FIRST = "keep-first";
@@ -9552,22 +9893,8 @@
9552
9893
  const DUPLICATES_VALUES = new Set([DUPLICATES_THROW, DUPLICATES_KEEP_FIRST, DUPLICATES_KEEP_LAST]);
9553
9894
  const ERR_INVALID_PASS_THROUGH = "Invalid passThrough option (use readerOptions.passThrough or set uncompressedSize for each entry)";
9554
9895
  const ERR_INVALID_READER_OPTIONS = "Invalid readerOptions (must be an object)";
9555
- const ERR_ZIP_CRYPTO_LAST_MOD_DATE = "The last modification date of an entry encrypted with ZipCrypto cannot be changed when passThrough is set";
9896
+ const ERR_UNSUPPORTED_PASS_THROUGH_VALUE = "The 'compressed' passThrough option is only supported by Entry#getData() and ZipWriter#add()";
9556
9897
  const ERR_ABORT_EXPORT = "zipjs-abort-export";
9557
- const INFOZIP_EXTRA_FIELD_TYPE = "infozip";
9558
- const INTERPRETED_EXTRA_FIELD_TYPES = new Set([
9559
- EXTRAFIELD_TYPE_ZIP64,
9560
- EXTRAFIELD_TYPE_AES,
9561
- EXTRAFIELD_TYPE_NTFS,
9562
- EXTRAFIELD_TYPE_EXTENDED_TIMESTAMP,
9563
- EXTRAFIELD_TYPE_UNICODE_PATH,
9564
- EXTRAFIELD_TYPE_UNICODE_COMMENT,
9565
- EXTRAFIELD_TYPE_USDZ,
9566
- EXTRAFIELD_TYPE_INFOZIP,
9567
- EXTRAFIELD_TYPE_UNIX,
9568
- EXTRAFIELD_TYPE_UNIX_TYPE1,
9569
- EXTRAFIELD_TYPE_PKWARE_UNIX
9570
- ]);
9571
9898
 
9572
9899
  class ZipEntry {
9573
9900
 
@@ -9939,6 +10266,7 @@
9939
10266
  await initStream(reader);
9940
10267
  zipReader = new ZipReader(reader, options);
9941
10268
  }
10269
+ checkPassThroughValue(options.passThrough);
9942
10270
  const duplicates = checkDuplicatesOption(options.duplicates);
9943
10271
  const importedEntries = [];
9944
10272
  const entries = await zipReader.getEntries(options);
@@ -10029,18 +10357,25 @@
10029
10357
 
10030
10358
  async exportZip(writer, options = {}) {
10031
10359
  const zipEntry = this;
10360
+ const zipWriterProvided = Boolean(writer) && typeof writer.add == FUNCTION_TYPE;
10032
10361
  options = Object.assign({}, options);
10033
- if (options.bufferedWrite === UNDEFINED_VALUE) {
10362
+ if (!zipWriterProvided && options.bufferedWrite === UNDEFINED_VALUE) {
10034
10363
  options.bufferedWrite = true;
10035
10364
  }
10036
- const [readers] = await Promise.all([initReaders(zipEntry, checkReaderOptions(options.readerOptions)), initStream(writer)]);
10037
- const zipWriter = new ZipWriter(writer, options);
10365
+ const [readers] = await Promise.all([
10366
+ initReaders(zipEntry, checkReaderOptions(options.readerOptions)),
10367
+ zipWriterProvided ? UNDEFINED_VALUE : initStream(writer)
10368
+ ]);
10369
+ const zipWriter = zipWriterProvided ? writer : new ZipWriter(writer, options);
10038
10370
  await exportZip(zipWriter, zipEntry, getTotalSize([zipEntry], getUncompressedSize), options, readers);
10371
+ if (zipWriterProvided) {
10372
+ return zipWriter;
10373
+ }
10039
10374
  await zipWriter.close(options.globalComment);
10040
10375
  return writer.getData ? writer.getData() : writer.writable;
10041
10376
  }
10042
10377
 
10043
- getExportedSize(options = {}) {
10378
+ async getExportedSize(options = {}) {
10044
10379
  const zipEntry = this;
10045
10380
  options = Object.assign({}, options);
10046
10381
  checkReaderOptions(options.readerOptions);
@@ -10055,7 +10390,7 @@
10055
10390
  const writeOrderGuaranteed = !options.bufferedWrite ||
10056
10391
  (entries.every(entry => entry.options.keepOrder !== false) &&
10057
10392
  children.every(child => isImplicitDirectory(child) || !child.children.length));
10058
- return getEntriesSize(options, entries, writeOrderGuaranteed, options.globalComment);
10393
+ return await getEntriesSize(options, entries, writeOrderGuaranteed, options.globalComment);
10059
10394
  }
10060
10395
 
10061
10396
  getChildByName(name) {
@@ -10116,7 +10451,7 @@
10116
10451
 
10117
10452
  move(entry, destination) {
10118
10453
  if (entry == this.root) {
10119
- throw new Error("Root directory cannot be moved");
10454
+ throw new Error(ERR_ROOT_DIRECTORY_NOT_MOVABLE);
10120
10455
  } else {
10121
10456
  if (destination.directory) {
10122
10457
  if (!destination.isDescendantOf(entry)) {
@@ -10137,7 +10472,7 @@
10137
10472
  throw new Error(ERR_ANCESTOR_ENTRY);
10138
10473
  }
10139
10474
  } else {
10140
- throw new Error("Target entry is not a directory");
10475
+ throw new Error(ERR_TARGET_NOT_DIRECTORY);
10141
10476
  }
10142
10477
  }
10143
10478
  }
@@ -10450,70 +10785,11 @@
10450
10785
  let zipEntryMetadata = {};
10451
10786
  let passThroughOptions = {};
10452
10787
  if (child.data instanceof Entry) {
10453
- const {
10454
- externalFileAttributes,
10455
- versionMadeBy,
10456
- comment,
10457
- lastModDate,
10458
- rawLastModDate,
10459
- creationDate,
10460
- lastAccessDate,
10461
- uncompressedSize,
10462
- encrypted,
10463
- zipCrypto,
10464
- crc32,
10465
- compressionMethod,
10466
- extraFieldAES,
10467
- internalFileAttributes,
10468
- extraField,
10469
- bitFlag,
10470
- uid,
10471
- gid
10472
- } = child.data;
10473
- zipEntryMetadata = {
10474
- externalFileAttributes,
10475
- versionMadeBy,
10476
- comment,
10477
- lastModDate,
10478
- creationDate,
10479
- lastAccessDate,
10480
- internalFileAttributes
10481
- };
10482
- const userExtraField = getUserExtraField(extraField);
10483
- if (userExtraField) {
10484
- zipEntryMetadata.extraField = userExtraField;
10485
- }
10486
- if (uid !== UNDEFINED_VALUE || gid !== UNDEFINED_VALUE) {
10487
- Object.assign(zipEntryMetadata, {
10488
- uid,
10489
- gid,
10490
- unixExtraFieldType: INFOZIP_EXTRA_FIELD_TYPE
10491
- });
10492
- }
10493
- if (isPassThrough(child, options)) {
10494
- let encryptionStrength;
10495
- if (extraFieldAES) {
10496
- encryptionStrength = extraFieldAES.strength;
10497
- }
10498
- passThroughOptions = {
10499
- passThrough: true,
10500
- encrypted,
10501
- zipCrypto,
10502
- crc32,
10503
- uncompressedSize,
10504
- encryptionStrength,
10505
- compressionMethod
10506
- };
10507
- if (bitFlag) {
10508
- passThroughOptions.dataDescriptor = bitFlag.dataDescriptor;
10509
- }
10510
- const lastModDateOverride = childOptions.lastModDate === UNDEFINED_VALUE ? options.lastModDate : childOptions.lastModDate;
10511
- if (lastModDateOverride === UNDEFINED_VALUE) {
10512
- passThroughOptions.rawLastModDate = rawLastModDate;
10513
- } else if (zipCrypto && (!bitFlag || bitFlag.dataDescriptor) && lastModDateOverride instanceof Date &&
10514
- getDosTimeHighByte(lastModDateOverride) != ((rawLastModDate >>> 8) & MAX_8_BITS)) {
10515
- throw new Error(ERR_ZIP_CRYPTO_LAST_MOD_DATE);
10516
- }
10788
+ const passThrough = isPassThrough(child, options);
10789
+ const lastModDateOverride = childOptions.lastModDate === UNDEFINED_VALUE ? options.lastModDate : childOptions.lastModDate;
10790
+ ({ entryOptions: zipEntryMetadata, passThroughOptions } = getSourceEntryOptions(child.data, passThrough, lastModDateOverride));
10791
+ if (passThrough) {
10792
+ passThroughOptions.passThrough = true;
10517
10793
  }
10518
10794
  }
10519
10795
  const entryOptions = Object.assign({ lastModDate: child.defaultLastModDate }, zipEntryMetadata, options, childOptions, passThroughOptions, { directory: child.directory });
@@ -10523,16 +10799,6 @@
10523
10799
  return { name, entryOptions };
10524
10800
  }
10525
10801
 
10526
- function getDosTimeHighByte(lastModDate) {
10527
- let dosLastModDate = new Date(Math.ceil(Math.floor(lastModDate.getTime() / 1000) / 2) * 2000);
10528
- if (dosLastModDate < MIN_DATE) {
10529
- dosLastModDate = MIN_DATE;
10530
- } else if (dosLastModDate > MAX_DATE) {
10531
- dosLastModDate = MAX_DATE;
10532
- }
10533
- return ((dosLastModDate.getHours() << 3) | (dosLastModDate.getMinutes() >> 3)) & MAX_8_BITS;
10534
- }
10535
-
10536
10802
  function getDeterminedSize(child, passThrough) {
10537
10803
  const { reader } = child;
10538
10804
  if (reader && reader.size !== UNDEFINED_VALUE) {
@@ -10545,9 +10811,18 @@
10545
10811
  if (readerOptions && (typeof readerOptions != OBJECT_TYPE || Array.isArray(readerOptions))) {
10546
10812
  throw new Error(ERR_INVALID_READER_OPTIONS);
10547
10813
  }
10814
+ if (readerOptions) {
10815
+ checkPassThroughValue(readerOptions.passThrough);
10816
+ }
10548
10817
  return readerOptions;
10549
10818
  }
10550
10819
 
10820
+ function checkPassThroughValue(passThrough) {
10821
+ if (checkPassThroughOption(passThrough) === PASS_THROUGH_COMPRESSED) {
10822
+ throw new Error(ERR_UNSUPPORTED_PASS_THROUGH_VALUE);
10823
+ }
10824
+ }
10825
+
10551
10826
  function replaceContent(zipEntry, params) {
10552
10827
  const { uncompressedSize } = params;
10553
10828
  Object.assign(zipEntry, params, {
@@ -10576,20 +10851,6 @@
10576
10851
  return child.directory && child.data === null;
10577
10852
  }
10578
10853
 
10579
- function getUserExtraField(extraField) {
10580
- if (extraField) {
10581
- const userExtraField = new Map();
10582
- extraField.forEach((field, type) => {
10583
- if (!INTERPRETED_EXTRA_FIELD_TYPES.has(type)) {
10584
- userExtraField.set(type, field.data);
10585
- }
10586
- });
10587
- if (userExtraField.size) {
10588
- return userExtraField;
10589
- }
10590
- }
10591
- }
10592
-
10593
10854
  async function exportZip(zipWriter, entry, totalSize, options, readers) {
10594
10855
  const { onstart, onprogress, onend, onentryprogress } = options;
10595
10856
  const selectedEntry = entry;
@@ -10692,6 +10953,7 @@
10692
10953
 
10693
10954
  async function exportFileSystemHandle(zipEntry, directoryHandle, options) {
10694
10955
  const { onstart, onprogress, onend } = options;
10956
+ checkPassThroughValue(options.passThrough);
10695
10957
  const readerOptions = checkReaderOptions(options.readerOptions);
10696
10958
  const abortController = new AbortController();
10697
10959
  const { signal } = abortController;
@@ -10767,7 +11029,7 @@
10767
11029
  if (exportAborted || isExportAborted(signal.reason)) {
10768
11030
  return;
10769
11031
  }
10770
- throw signal.reason === UNDEFINED_VALUE ? new DOMException(ERR_ABORTED, ABORT_ERROR_NAME) : signal.reason;
11032
+ throwIfAborted(signal);
10771
11033
  }
10772
11034
  try {
10773
11035
  if (child.directory) {
@@ -10900,7 +11162,7 @@
10900
11162
  }
10901
11163
  return directory ? new ZipDirectoryEntry(parent.fs, name, params, parent) : new ZipFileEntry(parent.fs, name, params, parent);
10902
11164
  } else {
10903
- throw new Error("Parent entry is not a directory");
11165
+ throw new Error(ERR_PARENT_NOT_DIRECTORY);
10904
11166
  }
10905
11167
  }
10906
11168
 
@@ -11042,6 +11304,7 @@
11042
11304
  exports.Data64URIWriter = Data64URIWriter;
11043
11305
  exports.ERR_ABORTED = ERR_ABORTED;
11044
11306
  exports.ERR_AMBIGUOUS_ARCHIVE = ERR_AMBIGUOUS_ARCHIVE;
11307
+ exports.ERR_ANCESTOR_ENTRY = ERR_ANCESTOR_ENTRY;
11045
11308
  exports.ERR_BAD_FORMAT = ERR_BAD_FORMAT;
11046
11309
  exports.ERR_CENTRAL_DIRECTORY_NOT_FOUND = ERR_CENTRAL_DIRECTORY_NOT_FOUND;
11047
11310
  exports.ERR_DUPLICATED_NAME = ERR_DUPLICATED_NAME;
@@ -11055,7 +11318,9 @@
11055
11318
  exports.ERR_EXTRAFIELD_ZIP64_NOT_FOUND = ERR_EXTRAFIELD_ZIP64_NOT_FOUND;
11056
11319
  exports.ERR_HTTP_RANGE = ERR_HTTP_RANGE;
11057
11320
  exports.ERR_HTTP_RESOURCE_CHANGED = ERR_HTTP_RESOURCE_CHANGED;
11321
+ exports.ERR_HTTP_STATUS = ERR_HTTP_STATUS;
11058
11322
  exports.ERR_INVALID_AUTHENTICATION_CODE = ERR_INVALID_AUTHENTICATION_CODE;
11323
+ exports.ERR_INVALID_BASE_URI = ERR_INVALID_BASE_URI;
11059
11324
  exports.ERR_INVALID_CODEC_DEFINITION = ERR_INVALID_CODEC_DEFINITION;
11060
11325
  exports.ERR_INVALID_CODEC_MODULE = ERR_INVALID_CODEC_MODULE;
11061
11326
  exports.ERR_INVALID_COMMENT = ERR_INVALID_COMMENT;
@@ -11065,6 +11330,7 @@
11065
11330
  exports.ERR_INVALID_DATE = ERR_INVALID_DATE;
11066
11331
  exports.ERR_INVALID_DUPLICATES = ERR_INVALID_DUPLICATES;
11067
11332
  exports.ERR_INVALID_ENCRYPTION_STRENGTH = ERR_INVALID_ENCRYPTION_STRENGTH;
11333
+ exports.ERR_INVALID_ENTRY = ERR_INVALID_ENTRY;
11068
11334
  exports.ERR_INVALID_ENTRY_COMMENT = ERR_INVALID_ENTRY_COMMENT;
11069
11335
  exports.ERR_INVALID_ENTRY_COMMENT_TYPE = ERR_INVALID_ENTRY_COMMENT_TYPE;
11070
11336
  exports.ERR_INVALID_ENTRY_NAME = ERR_INVALID_ENTRY_NAME;
@@ -11083,6 +11349,7 @@
11083
11349
  exports.ERR_INVALID_PASSWORD = ERR_INVALID_PASSWORD;
11084
11350
  exports.ERR_INVALID_PASSWORD_TYPE = ERR_INVALID_PASSWORD_TYPE;
11085
11351
  exports.ERR_INVALID_PASS_THROUGH = ERR_INVALID_PASS_THROUGH;
11352
+ exports.ERR_INVALID_PASS_THROUGH_VALUE = ERR_INVALID_PASS_THROUGH_VALUE;
11086
11353
  exports.ERR_INVALID_READER = ERR_INVALID_READER;
11087
11354
  exports.ERR_INVALID_READER_OPTIONS = ERR_INVALID_READER_OPTIONS;
11088
11355
  exports.ERR_INVALID_SIGNAL = ERR_INVALID_SIGNAL;
@@ -11093,14 +11360,19 @@
11093
11360
  exports.ERR_INVALID_UNIX_EXTRA_FIELD_TYPE = ERR_INVALID_UNIX_EXTRA_FIELD_TYPE;
11094
11361
  exports.ERR_INVALID_UNIX_ID_SIZE = ERR_INVALID_UNIX_ID_SIZE;
11095
11362
  exports.ERR_INVALID_UNIX_MODE = ERR_INVALID_UNIX_MODE;
11363
+ exports.ERR_INVALID_URI = ERR_INVALID_URI;
11096
11364
  exports.ERR_INVALID_VERSION = ERR_INVALID_VERSION;
11097
11365
  exports.ERR_ITERATOR_COMPLETED_TOO_SOON = ERR_ITERATOR_COMPLETED_TOO_SOON;
11098
11366
  exports.ERR_LOCAL_FILE_HEADER_NOT_FOUND = ERR_LOCAL_FILE_HEADER_NOT_FOUND;
11099
11367
  exports.ERR_OVERLAPPING_ENTRY = ERR_OVERLAPPING_ENTRY;
11368
+ exports.ERR_PARENT_NOT_DIRECTORY = ERR_PARENT_NOT_DIRECTORY;
11100
11369
  exports.ERR_READABLE_CONSUMED = ERR_READABLE_CONSUMED;
11101
11370
  exports.ERR_RESERVED_COMPRESSION_METHOD = ERR_RESERVED_COMPRESSION_METHOD;
11371
+ exports.ERR_ROOT_DIRECTORY_NOT_MOVABLE = ERR_ROOT_DIRECTORY_NOT_MOVABLE;
11102
11372
  exports.ERR_SPLIT_ZIP_FILE = ERR_SPLIT_ZIP_FILE;
11373
+ exports.ERR_TARGET_NOT_DIRECTORY = ERR_TARGET_NOT_DIRECTORY;
11103
11374
  exports.ERR_UNDEFINED_COMPRESSION_METHOD = ERR_UNDEFINED_COMPRESSION_METHOD;
11375
+ exports.ERR_UNDEFINED_CRC32 = ERR_UNDEFINED_CRC32;
11104
11376
  exports.ERR_UNDEFINED_READER = ERR_UNDEFINED_READER;
11105
11377
  exports.ERR_UNDEFINED_UNCOMPRESSED_SIZE = ERR_UNDEFINED_UNCOMPRESSED_SIZE;
11106
11378
  exports.ERR_UNDETERMINED_SIZE = ERR_UNDETERMINED_SIZE;
@@ -11112,10 +11384,12 @@
11112
11384
  exports.ERR_UNSUPPORTED_ENCRYPTION_PASS_THROUGH = ERR_UNSUPPORTED_ENCRYPTION_PASS_THROUGH;
11113
11385
  exports.ERR_UNSUPPORTED_ENCRYPTION_USDZ = ERR_UNSUPPORTED_ENCRYPTION_USDZ;
11114
11386
  exports.ERR_UNSUPPORTED_FORMAT = ERR_UNSUPPORTED_FORMAT;
11387
+ exports.ERR_UNSUPPORTED_PASS_THROUGH_VALUE = ERR_UNSUPPORTED_PASS_THROUGH_VALUE;
11115
11388
  exports.ERR_UNSUPPORTED_SPLIT_USDZ = ERR_UNSUPPORTED_SPLIT_USDZ;
11116
11389
  exports.ERR_UNSUPPORTED_UINT64 = ERR_UNSUPPORTED_UINT64;
11117
11390
  exports.ERR_WORKER_STARTUP_TIMEOUT = ERR_WORKER_STARTUP_TIMEOUT;
11118
11391
  exports.ERR_WRITER_NOT_INITIALIZED = ERR_WRITER_NOT_INITIALIZED;
11392
+ exports.ERR_WRITER_SIZE_NOT_WRITABLE = ERR_WRITER_SIZE_NOT_WRITABLE;
11119
11393
  exports.ERR_ZIP_CRYPTO_LAST_MOD_DATE = ERR_ZIP_CRYPTO_LAST_MOD_DATE;
11120
11394
  exports.ERR_ZIP_NOT_EMPTY = ERR_ZIP_NOT_EMPTY;
11121
11395
  exports.HttpRangeReader = HttpRangeReader;
@@ -11129,13 +11403,17 @@
11129
11403
  exports.Uint8ArrayWriter = Uint8ArrayWriter;
11130
11404
  exports.VERSION = VERSION;
11131
11405
  exports.WARNING_APPENDED_DATA = WARNING_APPENDED_DATA;
11406
+ exports.WARNING_CLAMPED_LAST_MODIFICATION_DATE = WARNING_CLAMPED_LAST_MODIFICATION_DATE;
11132
11407
  exports.WARNING_COMPRESSED_PATCHED_DATA = WARNING_COMPRESSED_PATCHED_DATA;
11408
+ exports.WARNING_COMPRESSION_UNAVAILABLE = WARNING_COMPRESSION_UNAVAILABLE;
11133
11409
  exports.WARNING_DUPLICATE_FILENAME = WARNING_DUPLICATE_FILENAME;
11134
11410
  exports.WARNING_MALFORMED_EXTRA_FIELD = WARNING_MALFORMED_EXTRA_FIELD;
11135
11411
  exports.WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG = WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG;
11136
11412
  exports.WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD = WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD;
11137
11413
  exports.WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES = WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES;
11414
+ exports.WARNING_MISMATCHED_LOCAL_FILE_HEADER_FILENAME = WARNING_MISMATCHED_LOCAL_FILE_HEADER_FILENAME;
11138
11415
  exports.WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY = WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY;
11416
+ exports.WARNING_MULTIPLE_END_OF_CENTRAL_DIRECTORY = WARNING_MULTIPLE_END_OF_CENTRAL_DIRECTORY;
11139
11417
  exports.WARNING_PREPENDED_CENTRAL_DIRECTORY = WARNING_PREPENDED_CENTRAL_DIRECTORY;
11140
11418
  exports.WARNING_PREPENDED_DATA = WARNING_PREPENDED_DATA;
11141
11419
  exports.WARNING_TRAILING_CENTRAL_DIRECTORY_DATA = WARNING_TRAILING_CENTRAL_DIRECTORY_DATA;