@zip.js/zip.js 2.8.36 → 2.8.38

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 (42) hide show
  1. package/deno.json +4 -2
  2. package/dist/zip-core.js +356 -63
  3. package/dist/zip-core.min.js +1 -1
  4. package/dist/zip-fs-core.js +301 -63
  5. package/dist/zip-fs-core.min.js +1 -1
  6. package/dist/zip-fs-native.js +359 -66
  7. package/dist/zip-fs-native.min.js +1 -1
  8. package/dist/zip-fs.js +357 -64
  9. package/dist/zip-fs.min.js +1 -1
  10. package/dist/zip-legacy.js +358 -65
  11. package/dist/zip-legacy.min.js +1 -1
  12. package/dist/zip-native.js +359 -66
  13. package/dist/zip-native.min.js +1 -1
  14. package/dist/zip-web-worker-native.js +1 -1
  15. package/dist/zip-web-worker.js +1 -1
  16. package/dist/zip.js +357 -64
  17. package/dist/zip.min.js +1 -1
  18. package/index-native.cjs +359 -66
  19. package/index-native.min.js +1 -1
  20. package/index.cjs +357 -64
  21. package/index.d.cts +126 -4
  22. package/index.d.ts +126 -4
  23. package/index.min.js +1 -1
  24. package/lib/core/codec-pool.js +21 -4
  25. package/lib/core/codec-registry.js +116 -0
  26. package/lib/core/codec-worker.js +94 -18
  27. package/lib/core/configuration.js +2 -0
  28. package/lib/core/constants.js +5 -1
  29. package/lib/core/options.js +2 -0
  30. package/lib/core/streams/codec-stream.js +6 -2
  31. package/lib/core/streams/zip-entry-stream.js +50 -16
  32. package/lib/core/streams/zlib-js/zlib-streams.min.js +1 -1
  33. package/lib/core/web-worker-base.js +30 -8
  34. package/lib/core/web-worker-inline-native.js +1 -1
  35. package/lib/core/web-worker-inline-wasm.js +1 -1
  36. package/lib/core/zip-reader.js +29 -3
  37. package/lib/core/zip-writer.js +68 -25
  38. package/lib/zip-core-base.js +7 -0
  39. package/lib/zip-core-reader.js +2 -1
  40. package/lib/zip-core-writer.js +1 -0
  41. package/package.json +1 -1
  42. package/worker-message-property-names.js +1 -1
package/index.cjs CHANGED
@@ -40,6 +40,7 @@ const COMPRESSION_METHOD_AES = 0x63;
40
40
  const LOCAL_FILE_HEADER_SIGNATURE = 0x04034b50;
41
41
  const SPLIT_ZIP_FILE_SIGNATURE = 0x08074b50;
42
42
  const DATA_DESCRIPTOR_RECORD_SIGNATURE = SPLIT_ZIP_FILE_SIGNATURE;
43
+ const ARCHIVE_EXTRA_DATA_SIGNATURE = 0x08064b50;
43
44
  const CENTRAL_FILE_HEADER_SIGNATURE = 0x02014b50;
44
45
  const END_OF_CENTRAL_DIR_SIGNATURE = 0x06054b50;
45
46
  const ZIP64_END_OF_CENTRAL_DIR_SIGNATURE = 0x06064b50;
@@ -71,6 +72,7 @@ const BITFLAG_LEVEL_MAX_MASK = 0b010;
71
72
  const BITFLAG_LEVEL_FAST_MASK = 0b100;
72
73
  const BITFLAG_LEVEL_SUPER_FAST_MASK = 0b110;
73
74
  const BITFLAG_DATA_DESCRIPTOR = 0b1000;
75
+ const BITFLAG_STRONG_ENCRYPTION = 0b1000000;
74
76
  const BITFLAG_LANG_ENCODING_FLAG = 0b100000000000;
75
77
  const FILE_ATTR_MSDOS_DIR_MASK = 0b10000;
76
78
  const FILE_ATTR_MSDOS_READONLY_MASK = 0x01;
@@ -98,7 +100,7 @@ const HEADER_OFFSET_COMPRESSED_SIZE = 14;
98
100
  const HEADER_OFFSET_UNCOMPRESSED_SIZE = 18;
99
101
  const LOCAL_HEADER_COMMON_OFFSET = 4;
100
102
 
101
- const MAX_DATE = new Date(2107, 11, 31);
103
+ const MAX_DATE = new Date(2107, 11, 31, 23, 59, 58);
102
104
  const MIN_DATE = new Date(1980, 0, 1);
103
105
 
104
106
  const UNDEFINED_VALUE = undefined;
@@ -154,6 +156,7 @@ const DEFAULT_CONFIGURATION = {
154
156
  maxWorkers,
155
157
  terminateWorkerTimeout: 5000,
156
158
  workerStarvationTimeout: 5000,
159
+ workerStartupTimeout: 5000,
157
160
  useWebWorkers: true,
158
161
  useCompressionStream: true,
159
162
  transferStreams: true,
@@ -169,6 +172,7 @@ const CONFIGURABLE_PROPERTY_NAMES = [
169
172
  "maxWorkers",
170
173
  "terminateWorkerTimeout",
171
174
  "workerStarvationTimeout",
175
+ "workerStartupTimeout",
172
176
  "useCompressionStream",
173
177
  "useWebWorkers",
174
178
  "transferStreams",
@@ -214,7 +218,104 @@ function resetConfiguration() {
214
218
  Object.assign(config, DEFAULT_CONFIGURATION);
215
219
  }
216
220
 
217
- function t$1(t){const e='(t=>{"function"==typeof define&&define.amd?define(t):t()})(function(){"use strict";const{Array:t,Object:e,Number:n,Math:s,Error:r,Uint8Array:o,Uint16Array:i,Uint32Array:c,Int32Array:a,Map:f,DataView:l,Promise:u,TextEncoder:w,crypto:h,postMessage:p,TransformStream:d,ReadableStream:y,WritableStream:m,CompressionStream:g,DecompressionStream:v}=self,b=void 0,S="undefined",k="function",z=new o,C=[[],[],[],[],[],[],[],[]];for(let t=0;256>t;t++){let e=t;for(let t=0;8>t;t++)e=1&e?e>>>1^3988292384:e>>>1;C[0][t]=e}for(let t=0;256>t;t++)for(let e=1;8>e;e++){const n=C[e-1][t];C[e][t]=n>>>8^C[0][255&n]}const[A,I,x,P,R,U,M,_]=C;class B{constructor(t){this.o=t||-1}append(t){let e=0|this.o;const n=0|t.length;let s=0;if(n>=8&&t.buffer){const r=new l(t.buffer,t.byteOffset,n),o=n-8;for(;o>=s;s+=8){const t=e^r.getInt32(s,!0),n=r.getInt32(s+4,!0);e=_[255&t]^M[t>>>8&255]^U[t>>>16&255]^R[t>>>24&255]^P[255&n]^x[n>>>8&255]^I[n>>>16&255]^A[n>>>24&255]}}for(;n>s;s++)e=e>>>8^A[255&(e^t[s])];this.o=e}get(){return~this.o}}class D extends d{constructor(){let t;const e=new B;super({transform(t,n){e.append(t),n.enqueue(t)},flush(){const n=new o(4);new l(n.buffer).setUint32(0,e.get()),t.value=n}}),t=this}}function V(t,e){const n=new o(t.length+e.length);return n.set(t),n.set(e,t.length),n}const W={concat(t,e){if(0===t.length||0===e.length)return t.concat(e);const n=t[t.length-1],s=W.l(n);return 32===s?t.concat(e):W.h(e,s,0|n,t.slice(0,t.length-1))},m(t){const e=t.length;if(0===e)return 0;const n=t[e-1];return 32*(e-1)+W.l(n)},v(t,e){if(32*t.length<e)return t;const n=(t=t.slice(0,s.ceil(e/32))).length;return e&=31,n>0&&e&&(t[n-1]=W.S(e,t[n-1]&2147483648>>e-1,1)),t},S:(t,e,n)=>32===t?e:(n?0|e:e<<32-t)+1099511627776*t,l:t=>s.round(t/1099511627776)||32,h(t,e,n,s){for(void 0===s&&(s=[]);e>=32;e-=32)s.push(n),n=0;if(0===e)return s.concat(t);for(let r=0;r<t.length;r++)s.push(n|t[r]>>>e),n=t[r]<<32-e;const r=t.length?t[t.length-1]:0,o=W.l(r);return s.push(W.S(e+o&31,e+o>32?n:s.pop(),1)),s}},K={bytes:{C(t){const e=W.m(t)/8,n=new o(e);let s;for(let r=0;e>r;r++)3&r||(s=t[r/4]),n[r]=s>>>24,s<<=8;return n},A(t){const e=[];let n,s=0;for(n=0;n<t.length;n++)s=s<<8|t[n],3&~n||(e.push(s),s=0);return 3&n&&e.push(W.S(8*(3&n),s)),e}}},E=class{constructor(t){const e=this;e.blockSize=512,e.I=[1732584193,4023233417,2562383102,271733878,3285377520],e.P=[1518500249,1859775393,2400959708,3395469782],t?(e.R=t.R.slice(0),e.U=t.U.slice(0),e.M=t.M):e.reset()}reset(){const t=this;return t.R=t.I.slice(0),t.U=[],t.M=0,t}update(t){const e=this;"string"==typeof t&&(t=K._.A(t));const n=e.U=W.concat(e.U,t),s=e.M,o=e.M=s+W.m(t);if(o>9007199254740991)throw new r("Cannot hash more than 2^53 - 1 bits");const i=new c(n);let a=0;for(let t=e.blockSize+s-(e.blockSize+s&e.blockSize-1);o>=t;t+=e.blockSize)e.B(i.subarray(16*a,16*(a+1))),a+=1;return n.splice(0,16*a),e}D(){const t=this;let e=t.U;const n=t.R;e=W.concat(e,[W.S(1,1)]);for(let t=e.length+2;15&t;t++)e.push(0);for(e.push(s.floor(t.M/4294967296)),e.push(0|t.M);e.length;)t.B(e.splice(0,16));return t.reset(),n}V(t,e,n,s){return t>19?t>39?t>59?t>79?void 0:e^n^s:e&n|e&s|n&s:e^n^s:e&n|~e&s}W(t,e){return e<<t|e>>>32-t}B(e){const n=this,r=n.R,o=t(80);for(let t=0;16>t;t++)o[t]=e[t];let i=r[0],c=r[1],a=r[2],f=r[3],l=r[4];for(let t=0;79>=t;t++){16>t||(o[t]=n.W(1,o[t-3]^o[t-8]^o[t-14]^o[t-16]));const e=n.W(5,i)+n.V(t,c,a,f)+l+o[t]+n.P[s.floor(t/20)]|0;l=f,f=a,a=n.W(30,c),c=i,i=e}r[0]=r[0]+i|0,r[1]=r[1]+c|0,r[2]=r[2]+a|0,r[3]=r[3]+f|0,r[4]=r[4]+l|0}},L={importKey:t=>new L.K(K.bytes.A(t)),L(t,e,n,s){if(n=n||1e4,0>s||0>n)throw new r("invalid params to pbkdf2");const o=1+(s>>5)<<2;let i,c,a,f,u;const w=new ArrayBuffer(o),h=new l(w);let p=0;const d=W;for(e=K.bytes.A(e),u=1;(o||1)>p;u++){for(i=c=t.encrypt(d.concat(e,[u])),a=1;n>a;a++)for(c=t.encrypt(c),f=0;f<c.length;f++)i[f]^=c[f];for(a=0;(o||1)>p&&a<i.length;a++)h.setInt32(p,i[a]),p+=4}return w.slice(0,s/8)},K:class{constructor(t){const e=this,n=e.O=E,s=[[],[]];e.T=[new n,new n];const r=e.T[0].blockSize/32;t.length>r&&(t=(new n).update(t).D());for(let e=0;r>e;e++)s[0][e]=909522486^t[e],s[1][e]=1549556828^t[e];e.T[0].update(s[0]),e.T[1].update(s[1]),e.j=new n(e.T[0])}reset(){const t=this;t.j=new t.O(t.T[0]),t.H=!1}update(t){this.H=!0,this.j.update(t)}digest(){const t=this,e=t.j.D(),n=new t.O(t.T[1]).update(e).D();return t.reset(),n}encrypt(t){if(this.H)throw new r("encrypt on already updated hmac called!");return this.update(t),this.digest(t)}}},O=typeof h!=S&&typeof h.getRandomValues==k,T="Invalid password",j="Invalid signature",H="zipjs-abort-check-password";function Z(t){if(O)return h.getRandomValues(t);throw new r("Crypto API not supported")}const F=16,N={name:"PBKDF2"},q=e.assign({hash:{name:"HMAC"}},N),G=e.assign({iterations:1e3,hash:{name:"SHA-1"}},N),J=["deriveBits"],Q=[8,12,16],X=[16,24,32],Y=10,$=[0,0,0,0],tt=typeof h!=S,et=tt&&h.subtle,nt=tt&&typeof et!=S,st=K.bytes,rt=class{constructor(t){const e=this;e.Z=[[[],[],[],[],[]],[[],[],[],[],[]]],e.Z[0][0][0]||e.F();const n=e.Z[0][4],s=e.Z[1],o=t.length;let i,c,a,f=1;if(4!==o&&6!==o&&8!==o)throw new r("invalid aes key size");for(e.P=[c=t.slice(0),a=[]],i=o;4*o+28>i;i++){let t=c[i-1];(i%o===0||8===o&&i%o===4)&&(t=n[t>>>24]<<24^n[t>>16&255]<<16^n[t>>8&255]<<8^n[255&t],i%o===0&&(t=t<<8^t>>>24^f<<24,f=f<<1^283*(f>>7))),c[i]=c[i-o]^t}for(let t=0;i;t++,i--){const e=c[3&t?i:i-4];a[t]=4>=i||4>t?e:s[0][n[e>>>24]]^s[1][n[e>>16&255]]^s[2][n[e>>8&255]]^s[3][n[255&e]]}}encrypt(t){return this.N(t,0)}decrypt(t){return this.N(t,1)}F(){const t=this.Z[0],e=this.Z[1],n=t[4],s=e[4],r=[],o=[];let i,c,a,f;for(let t=0;256>t;t++)o[(r[t]=t<<1^283*(t>>7))^t]=t;for(let l=i=0;!n[l];l^=c||1,i=o[i]||1){let o=i^i<<1^i<<2^i<<3^i<<4;o=o>>8^255&o^99,n[l]=o,s[o]=l,f=r[a=r[c=r[l]]];let u=16843009*f^65537*a^257*c^16843008*l,w=257*r[o]^16843008*o;for(let n=0;4>n;n++)t[n][l]=w=w<<24^w>>>8,e[n][o]=u=u<<24^u>>>8}for(let n=0;5>n;n++)t[n]=t[n].slice(0),e[n]=e[n].slice(0)}N(t,e){if(4!==t.length)throw new r("invalid aes block size");const n=this.P[e],s=n.length/4-2,o=[0,0,0,0],i=this.Z[e],c=i[0],a=i[1],f=i[2],l=i[3],u=i[4];let w,h,p,d=t[0]^n[0],y=t[e?3:1]^n[1],m=t[2]^n[2],g=t[e?1:3]^n[3],v=4;for(let t=0;s>t;t++)w=c[d>>>24]^a[y>>16&255]^f[m>>8&255]^l[255&g]^n[v],h=c[y>>>24]^a[m>>16&255]^f[g>>8&255]^l[255&d]^n[v+1],p=c[m>>>24]^a[g>>16&255]^f[d>>8&255]^l[255&y]^n[v+2],g=c[g>>>24]^a[d>>16&255]^f[y>>8&255]^l[255&m]^n[v+3],v+=4,d=w,y=h,m=p;for(let t=0;4>t;t++)o[e?3&-t:t]=u[d>>>24]<<24^u[y>>16&255]<<16^u[m>>8&255]<<8^u[255&g]^n[v++],w=d,d=y,y=m,m=g,g=w;return o}},ot=class{constructor(t,e){this.G=t,this.J=e,this.X=e}reset(){this.X=this.J}update(t){return this.Y(this.G,t,this.X)}$(t){if(255&~(t>>24))t+=1<<24;else{let e=t>>16&255,n=t>>8&255,s=255&t;255===e?(e=0,255===n?(n=0,255===s?s=0:++s):++n):++e,t=0,t+=e<<16,t+=n<<8,t+=s}return t}et(t){0===(t[0]=this.$(t[0]))&&(t[1]=this.$(t[1]))}Y(t,e,n){let s;if(!(s=e.length))return[];const r=W.m(e);for(let r=0;s>r;r+=4){this.et(n);const s=t.encrypt(n);e[r]^=s[0],e[r+1]^=s[1],e[r+2]^=s[2],e[r+3]^=s[3]}return W.v(e,r)}},it=L.K;let ct=tt&&nt&&typeof et.importKey==k,at=tt&&nt&&typeof et.deriveBits==k;class ft extends d{constructor({password:t,rawPassword:e,encryptionStrength:n,checkPasswordOnly:s}){super({start(){ut(this,t,e,n)},async transform(t,e){const n=this,{password:i,strength:c,nt:a,ready:f}=n;i?(await(async(t,e,n,s)=>{const o=await ht(t,e,n,dt(s,0,Q[e])),i=dt(s,Q[e]);if(o[0]!=i[0]||o[1]!=i[1])throw new r(T)})(n,c,i,dt(t,0,Q[c]+2)),t=dt(t,Q[c]+2),s?e.error(new r(H)):a()):await f;const l=new o(t.length-Y-(t.length-Y)%F);e.enqueue(wt(n,t,l,0,Y,!0))},async flush(t){const{st:e,ot:n,pending:s,ready:o}=this;if(n&&e){await o;const i=dt(s,0,s.length-Y),c=dt(s,s.length-Y);let a=z;if(i.length){const t=mt(st,i);n.update(t);const s=e.update(t);a=yt(st,s)}const f=dt(yt(st,n.digest()),0,Y);let l=s.length<Y?1:0;for(let t=0;Y>t;t++)l|=f[t]^c[t];if(l)throw new r(j);t.enqueue(a)}}})}}class lt extends d{constructor({password:t,rawPassword:e,encryptionStrength:n}){let s;super({start(){ut(this,t,e,n)},async transform(t,e){const n=this,{password:s,strength:r,nt:i,ready:c}=n;let a=z;s?(a=await(async(t,e,n)=>{const s=Z(new o(Q[e]));return V(s,await ht(t,e,n,s))})(n,r,s),i()):await c;const f=new o(a.length+t.length-t.length%F);f.set(a,0),e.enqueue(wt(n,t,f,a.length,0))},async flush(t){const{st:e,ot:n,pending:r,ready:o}=this;if(n&&e){await o;let i=z;if(r.length){const t=e.update(mt(st,r));n.update(t),i=yt(st,t)}s.signature=yt(st,n.digest()).slice(0,Y),t.enqueue(V(i,s.signature))}}}),s=this}}function ut(t,n,s,r){e.assign(t,{ready:new u(e=>t.nt=e),password:pt(n,s),strength:r-1,pending:z})}function wt(t,e,n,s,r,i){const{st:c,ot:a,pending:f}=t;f.length&&(e=V(f,e));const l=e.length-r;let u;for(n=((t,e)=>{if(e&&e>t.length){const n=t;(t=new o(e)).set(n,0)}return t})(n,s+(l-l%F)),u=0;l-F>=u;u+=F){const t=mt(st,dt(e,u,u+F));i&&a.update(t);const r=c.update(t);i||a.update(r),n.set(yt(st,r),u+s)}return t.pending=dt(e,u),n}async function ht(n,s,r,i){n.password=null;const c=await(async(t,e,n,s,r)=>{if(!ct)return L.importKey(e);try{return await et.importKey("raw",e,n,!1,r)}catch{return ct=!1,L.importKey(e)}})(0,r,q,0,J),a=await(async(t,e,n)=>{if(!at)return L.L(e,t.salt,G.iterations,n);try{return await et.deriveBits(t,e,n)}catch{return at=!1,L.L(e,t.salt,G.iterations,n)}})(e.assign({salt:i},G),c,8*(2*X[s]+2)),f=new o(a),l=mt(st,dt(f,0,X[s])),u=mt(st,dt(f,X[s],2*X[s])),w=dt(f,2*X[s]);return e.assign(n,{keys:{key:l,it:u,passwordVerification:w},st:new ot(new rt(l),t.from($)),ot:new it(u)}),w}function pt(t,e){return e===b?(t=>{if(typeof w==S){const e=new o((t=unescape(encodeURIComponent(t))).length);for(let n=0;n<e.length;n++)e[n]=t.charCodeAt(n);return e}return(new w).encode(t)})(t):e}function dt(t,e,n){return t.subarray(e,n)}function yt(t,e){return t.C(e)}function mt(t,e){return t.A(e)}class gt extends d{constructor({password:t,rawPassword:e,passwordVerification:n,checkPasswordOnly:s}){super({start(){bt(this,t,e,n)},transform(t,e){const n=this;if(n.password||n.rawPassword){const e=St(n,t.subarray(0,12));if(n.password=n.rawPassword=null,0!=(e.at(-1)^n.passwordVerification))throw new r(T);t=t.subarray(12)}s?e.error(new r(H)):e.enqueue(St(n,t))}})}}class vt extends d{constructor({password:t,rawPassword:e,passwordVerification:n}){super({start(){bt(this,t,e,n)},transform(t,e){const n=this;let s,r;if(n.password||n.rawPassword){n.password=n.rawPassword=null;const e=Z(new o(12));e[11]=n.passwordVerification,s=new o(t.length+e.length),s.set(kt(n,e),0),r=12}else s=new o(t.length),r=0;s.set(kt(n,t),r),e.enqueue(s)}})}}function bt(t,n,s,r){e.assign(t,{password:n,rawPassword:s,passwordVerification:r}),((t,n,s)=>{const r=[305419896,591751049,878082192];if(e.assign(t,{keys:r,ct:new B(r[0]),ft:new B(r[2])}),s)for(let e=0;e<s.length;e++)zt(t,s[e]);else for(let e=0;e<n.length;e++)zt(t,n.charCodeAt(e))})(t,n,s)}function St(t,e){const n=new o(e.length);for(let s=0;s<e.length;s++)n[s]=Ct(t)^e[s],zt(t,n[s]);return n}function kt(t,e){const n=new o(e.length);for(let s=0;s<e.length;s++)n[s]=Ct(t)^e[s],zt(t,e[s]);return n}function zt(t,e){let[,n]=t.keys;t.ct.append([e]);const r=~t.ct.get();n=It(s.imul(It(n+At(r)),134775813)+1),t.ft.append([n>>>24]);const o=~t.ft.get();t.keys=[r,n,o]}function Ct(t){const e=2|t.keys[2];return At(s.imul(e,1^e)>>>8)}function At(t){return 255&t}function It(t){return 4294967295&t}class xt extends d{constructor(t,{chunkSize:e,CompressionStreamZlib:n,CompressionStream:s}){super({});const{compressed:r,encrypted:o,useCompressionStream:i,zipCrypto:c,signed:a,level:f,deflate64:u}=t,w=this;let h,p,d,y=super.readable;const m=a&&r&&!u&&(!o||c)&&!(!i||!s);o&&!c||!a||m||(h=new D,y=_t(y,h)),r&&(m?(d=new Pt,y=Bt(y,new s("gzip")),y=_t(y,d)):y=Mt(y,i,{level:f,chunkSize:e},s,n,s)),o&&(c?y=_t(y,new vt(t)):(p=new lt(t),y=_t(y,p))),Ut(w,y,()=>{let t;o&&!c&&(t=p.signature),o&&!c||!a||(t=m?d.signature:new l(h.value.buffer).getUint32(0)),w.signature=t})}}class Pt extends d{constructor(){let t,e=10,n=new o(0);super({transform(t,r){if(e){const n=s.min(e,t.length);if(e-=n,!(t=t.subarray(n)).length)return}const o=n.length+t.length;if(8>=o)return void(n=V(n,t));const i=o-8,c=s.min(i,n.length);r.enqueue(V(n.subarray(0,c),t.subarray(0,i-c))),n=V(n.subarray(c),t.subarray(i-c))},flush(){const e=new l((s=n).buffer,s.byteOffset,s.byteLength);var s;t.signature=e.getUint32(0,!0),t.uncompressedSize=e.getUint32(4,!0)}}),t=this}}class Rt extends d{constructor(t,{chunkSize:e,DecompressionStreamZlib:n,DecompressionStream:s}){super({});const{zipCrypto:o,encrypted:i,signed:c,signature:a,compressed:f,useCompressionStream:u,deflate64:w}=t;let h,p,d=super.readable;i&&(o?d=_t(d,new gt(t)):(p=new ft(t),d=_t(d,p))),f&&(d=Mt(d,u,{chunkSize:e,deflate64:w},s,n,s),d=(t=>{const e=t.getReader();return new y({async pull(t){let n;try{n=await e.read()}catch(t){if(t&&t.message)throw t;const e=new r("Invalid compressed data");throw e.cause=t,e}const{value:s,done:o}=n;o?t.close():t.enqueue(s)},cancel:t=>e.cancel(t)})})(d)),i&&!o||!c||(h=new D,d=_t(d,h)),Ut(this,d,()=>{if((!i||o)&&c){const t=new l(h.value.buffer);if(a!=t.getUint32(0,!1))throw new r(j)}})}}function Ut(t,n,s){n=_t(n,new d({flush:s})),e.defineProperty(t,"readable",{get:()=>n})}function Mt(t,e,n,s,r,o){const i=e&&s?s:r||o,c=n.deflate64?"deflate64-raw":"deflate-raw";let a;try{a=new i(c,n)}catch(t){if(!e)throw t;if(r)a=new r(c,n);else{if(!o)throw t;a=new o(c,n)}}return Bt(t,a)}function _t(t,e){return t.pipeThrough(e)}function Bt(t,e){const n=e.writable.getWriter(),s=t.getReader();return(async()=>{try{for(;;){await n.ready;const t=await s.read();if(t.done){await n.close();break}await n.write(t.value)}}catch(t){await(async(t,e)=>{try{await t.abort(e)}catch{}})(n,t),await(async(t,e)=>{try{await t.cancel(e)}catch{}})(s,t)}})(),e.readable}const Dt="data",Vt="close";class Wt extends d{constructor(t,n){super({});const s=this,{codecType:o}=t;let i;o.startsWith("deflate")?i=xt:o.startsWith("inflate")&&(i=Rt),s.outputSize=0;let c=0;const a=new i(t,n),f=super.readable,l=new d({transform(t,e){t&&t.length&&(c+=t.length,e.enqueue(t))},flush(){e.assign(s,{inputSize:c})}}),u=new d({transform(e,n){if(e&&e.length&&(n.enqueue(e),s.outputSize+=e.length,t.outputSize!==b&&s.outputSize>t.outputSize))throw new r("Invalid uncompressed size")},flush(){const{signature:t}=a;e.assign(s,{signature:t,inputSize:c})}});e.defineProperty(s,"readable",{get:()=>f.pipeThrough(l).pipeThrough(a).pipeThrough(u)})}}class Kt extends d{constructor(t){const e=[];let s=0;function r(){const n=new o(t);let r=0;for(;t>r;){const s=e[0],o=t-r;s.length>o?(n.set(s.subarray(0,o),r),e[0]=s.subarray(o),r+=o):(n.set(s,r),r+=s.length,e.shift())}return s-=t,n}n.isFinite(t)&&t>=1||(t=65536),super({transform(n,o){for(e.push(n),s+=n.length;s>t;)o.enqueue(r())},flush(t){s&&t.enqueue(((t,e)=>{const n=new o(e);let s=0;for(const e of t)n.set(e,s),s+=e.length;return n})(e,s))}})}}let Et=2;try{typeof navigator!=S&&navigator.hardwareConcurrency&&(Et=navigator.hardwareConcurrency)}catch{}const Lt=new f,Ot=new f;let Tt,jt,Ht,Zt,Ft,Nt=0;async function qt(t){let e,r;try{const{options:o,config:i}=t;if(!o.useCompressionStream)try{await self.initModule(t.config)}catch{o.useCompressionStream=!0}i.CompressionStream=self.CompressionStream,i.DecompressionStream=self.DecompressionStream;const c={highWaterMark:1},a=t.readable||new y({async pull(t){const e=new u(t=>Lt.set(Nt,t));Gt({type:"pull",messageId:Nt}),Nt=(Nt+1)%n.MAX_SAFE_INTEGER;const{value:s,done:r}=await e;t.enqueue(s),r&&t.close()}},c);r=t.writable||new m({async write(t){let e;const s=new u(t=>e=t);Ot.set(Nt,e),Gt({type:Dt,value:t,messageId:Nt}),Nt=(Nt+1)%n.MAX_SAFE_INTEGER,await s}},c),e=new Wt(o,i),Tt=new AbortController;const{signal:f}=Tt;await a.pipeThrough(e).pipeThrough(new Kt((t=>s.max(t.chunkSize,64))(i))).pipeTo(r,{signal:f,preventClose:!0,preventAbort:!0}),await r.getWriter().close();const{signature:l,inputSize:w,outputSize:h}=e;Gt({type:Vt,result:{signature:l,inputSize:w,outputSize:h}})}catch(t){if(t.outputSize=e?e.outputSize:0,r&&!r.locked)try{await r.getWriter().close()}catch{}Jt(t)}}function Gt(t){let{value:e}=t;if(e)if(e.length)try{t.value=(n=e,n.byteOffset||n.byteLength!=n.buffer.byteLength?new o(n):n).buffer,p(t,[t.value])}catch{p(t)}else p(t);else p(t);var n}function Jt(t=new r("Unknown error")){const{message:e,stack:n,code:s,name:o,outputSize:i}=t;p({error:{message:e,stack:n,code:s,name:o,outputSize:i}})}function Qt(t,e,n={}){const i="number"==typeof n.level?n.level:-1,c="number"==typeof n.outBuffer?n.outBuffer:65536,a="number"==typeof n.inBufferSize?n.inBufferSize:65536;return new d({start(){try{let n;if(this.lt=Ht(c),this.in=Ht(a),this.inBufferSize=a,!this.lt||!this.in)throw new r("allocation failed");if(this.ut=new o(c),t?(this.wt=jt.deflate_process,this.ht=jt.deflate_last_consumed,this.yt=jt.deflate_end,this.gt=jt.deflate_new(),n="gzip"===e?jt.deflate_init_gzip(this.gt,i):"deflate-raw"===e?jt.deflate_init_raw(this.gt,i):jt.deflate_init(this.gt,i)):"deflate64-raw"===e?(this.wt=jt.inflate9_process,this.ht=jt.inflate9_last_consumed,this.yt=jt.inflate9_end,this.gt=jt.inflate9_new(),n=jt.inflate9_init_raw(this.gt)):(this.wt=jt.inflate_process,this.ht=jt.inflate_last_consumed,this.yt=jt.inflate_end,this.gt=jt.inflate_new(),n="deflate-raw"===e?jt.inflate_init_raw(this.gt):"gzip"===e?jt.inflate_init_gzip(this.gt):jt.inflate_init(this.gt)),0!==n)throw new r("init failed:"+n)}catch(t){throw f(this),t}},transform(e,n){try{const i=e,a=new o(Ft.buffer),f=this.wt,l=this.ht,u=this.lt,w=this.ut;let h=0;for(;h<i.length;){const e=s.min(i.length-h,32768);if((!this.in||this.inBufferSize<e)&&(this.in&&Zt&&(Zt(this.in),this.in=0),this.in=Ht(e),this.inBufferSize=e,!this.in))throw new r("allocation failed");a.set(i.subarray(h,h+e),this.in);const o=f(this.gt,this.in,e,u,c,0),p=16777215&o;if(p&&(w.set(a.subarray(u,u+p),0),n.enqueue(w.slice(0,p))),!t){const t=o>>24&255,e=128&t?t-256:t;if(0>e)throw new r("process error:"+e)}const d=l(this.gt);if(0===d)break;h+=d}}catch(t){f(this),n.error(t)}},flush(e){try{const n=new o(Ft.buffer),s=this.wt,i=this.lt,a=this.ut;for(;;){const o=s(this.gt,0,0,i,c,4),f=16777215&o,l=o>>24&255;if(!t){const t=128&l?l-256:l;if(0>t)throw new r("process error:"+t)}if(f&&(a.set(n.subarray(i,i+f),0),e.enqueue(a.slice(0,f))),1===l||0===f)break}}catch(t){e.error(t)}finally{const t=f(this);0!==t&&e.error(new r("end error:"+t))}},cancel(){f(this)}});function f(t){let e=0;return t.gt&&t.yt&&(e=t.yt(t.gt)),t.gt=0,t.in&&Zt&&Zt(t.in),t.in=0,t.lt&&Zt&&Zt(t.lt),t.lt=0,e}}addEventListener("message",({data:t})=>{const{type:e,messageId:n,value:s,done:r}=t;try{if("start"==e&&qt(t),e==Dt){const t=Lt.get(n);Lt.delete(n),t({value:s||new o,done:r})}if("ack"==e){const t=Ot.get(n);Ot.delete(n),t()}e==Vt&&Tt.abort()}catch(t){Jt(t)}});class Xt{constructor(t="deflate",e){return Qt(!0,t,e)}}class Yt{constructor(t="deflate",e){return Qt(!1,t,e)}}Xt.vt=!0,Yt.vt=!0;let $t=!1;self.initModule=async t=>{try{const e=await(async(t,{baseURI:e})=>{if(!$t){let n,s;try{try{s=new URL(t,e)}catch{}const r=await fetch(s);n=await r.arrayBuffer()}catch(e){if(!t.startsWith("data:application/wasm;base64,"))throw e;n=(t=>{const e=t.split(",")[1],n=atob(e),s=n.length,r=new o(s);for(let t=0;s>t;++t)r[t]=n.charCodeAt(t);return r.buffer})(t)}(t=>{if(jt=t,({malloc:Ht,free:Zt,memory:Ft}=jt),"function"!=typeof Ht||"function"!=typeof Zt||!Ft)throw jt=Ht=Zt=Ft=null,new r("Invalid WASM module")})((await WebAssembly.instantiate(n)).instance.exports),$t=!0}})(t.wasmURI,t);return t.CompressionStreamZlib=Xt,t.DecompressionStreamZlib=Yt,e}catch{}}});\n';t({workerURI:t=>{const n="text/javascript";if(t){const t=new Blob([e],{type:n});return URL.createObjectURL(t)}return "data:"+n+","+encodeURIComponent(e)}});}
221
+ function t$1(t){const e='(t=>{"function"==typeof define&&define.amd?define(t):t()})(function(){"use strict";const{Array:t,Object:e,Number:n,Math:s,Error:r,Uint8Array:o,Uint16Array:i,Uint32Array:c,Int32Array:a,Map:f,DataView:l,Promise:u,TextEncoder:w,crypto:h,postMessage:p,TransformStream:d,ReadableStream:y,WritableStream:m,CompressionStream:g,DecompressionStream:S}=self,v=void 0,b="undefined",k="function",z=new o,C=[[],[],[],[],[],[],[],[]];for(let t=0;256>t;t++){let e=t;for(let t=0;8>t;t++)e=1&e?e>>>1^3988292384:e>>>1;C[0][t]=e}for(let t=0;256>t;t++)for(let e=1;8>e;e++){const n=C[e-1][t];C[e][t]=n>>>8^C[0][255&n]}const[A,I,x,P,D,R,U,M]=C;class _{constructor(t){this.o=t||-1}append(t){let e=0|this.o;const n=0|t.length;let s=0;if(n>=8&&t.buffer){const r=new l(t.buffer,t.byteOffset,n),o=n-8;for(;o>=s;s+=8){const t=e^r.getInt32(s,!0),n=r.getInt32(s+4,!0);e=M[255&t]^U[t>>>8&255]^R[t>>>16&255]^D[t>>>24&255]^P[255&n]^x[n>>>8&255]^I[n>>>16&255]^A[n>>>24&255]}}for(;n>s;s++)e=e>>>8^A[255&(e^t[s])];this.o=e}get(){return~this.o}}class B extends d{constructor(){let t;const e=new _;super({transform(t,n){e.append(t),n.enqueue(t)},flush(){const n=new o(4);new l(n.buffer).setUint32(0,e.get()),t.value=n}}),t=this}}function V(t,e){const n=new o(t.length+e.length);return n.set(t),n.set(e,t.length),n}const W={concat(t,e){if(0===t.length||0===e.length)return t.concat(e);const n=t[t.length-1],s=W.l(n);return 32===s?t.concat(e):W.h(e,s,0|n,t.slice(0,t.length-1))},m(t){const e=t.length;if(0===e)return 0;const n=t[e-1];return 32*(e-1)+W.l(n)},S(t,e){if(32*t.length<e)return t;const n=(t=t.slice(0,s.ceil(e/32))).length;return e&=31,n>0&&e&&(t[n-1]=W.v(e,t[n-1]&2147483648>>e-1,1)),t},v:(t,e,n)=>32===t?e:(n?0|e:e<<32-t)+1099511627776*t,l:t=>s.round(t/1099511627776)||32,h(t,e,n,s){for(void 0===s&&(s=[]);e>=32;e-=32)s.push(n),n=0;if(0===e)return s.concat(t);for(let r=0;r<t.length;r++)s.push(n|t[r]>>>e),n=t[r]<<32-e;const r=t.length?t[t.length-1]:0,o=W.l(r);return s.push(W.v(e+o&31,e+o>32?n:s.pop(),1)),s}},K={bytes:{C(t){const e=W.m(t)/8,n=new o(e);let s;for(let r=0;e>r;r++)3&r||(s=t[r/4]),n[r]=s>>>24,s<<=8;return n},A(t){const e=[];let n,s=0;for(n=0;n<t.length;n++)s=s<<8|t[n],3&~n||(e.push(s),s=0);return 3&n&&e.push(W.v(8*(3&n),s)),e}}},E=class{constructor(t){const e=this;e.blockSize=512,e.I=[1732584193,4023233417,2562383102,271733878,3285377520],e.P=[1518500249,1859775393,2400959708,3395469782],t?(e.D=t.D.slice(0),e.R=t.R.slice(0),e.U=t.U):e.reset()}reset(){const t=this;return t.D=t.I.slice(0),t.R=[],t.U=0,t}update(t){const e=this;"string"==typeof t&&(t=K.M.A(t));const n=e.R=W.concat(e.R,t),s=e.U,o=e.U=s+W.m(t);if(o>9007199254740991)throw new r("Cannot hash more than 2^53 - 1 bits");const i=new c(n);let a=0;for(let t=e.blockSize+s-(e.blockSize+s&e.blockSize-1);o>=t;t+=e.blockSize)e._(i.subarray(16*a,16*(a+1))),a+=1;return n.splice(0,16*a),e}B(){const t=this;let e=t.R;const n=t.D;e=W.concat(e,[W.v(1,1)]);for(let t=e.length+2;15&t;t++)e.push(0);for(e.push(s.floor(t.U/4294967296)),e.push(0|t.U);e.length;)t._(e.splice(0,16));return t.reset(),n}V(t,e,n,s){return t>19?t>39?t>59?t>79?void 0:e^n^s:e&n|e&s|n&s:e^n^s:e&n|~e&s}W(t,e){return e<<t|e>>>32-t}_(e){const n=this,r=n.D,o=t(80);for(let t=0;16>t;t++)o[t]=e[t];let i=r[0],c=r[1],a=r[2],f=r[3],l=r[4];for(let t=0;79>=t;t++){16>t||(o[t]=n.W(1,o[t-3]^o[t-8]^o[t-14]^o[t-16]));const e=n.W(5,i)+n.V(t,c,a,f)+l+o[t]+n.P[s.floor(t/20)]|0;l=f,f=a,a=n.W(30,c),c=i,i=e}r[0]=r[0]+i|0,r[1]=r[1]+c|0,r[2]=r[2]+a|0,r[3]=r[3]+f|0,r[4]=r[4]+l|0}},L={importKey:t=>new L.K(K.bytes.A(t)),L(t,e,n,s){if(n=n||1e4,0>s||0>n)throw new r("invalid params to pbkdf2");const o=1+(s>>5)<<2;let i,c,a,f,u;const w=new ArrayBuffer(o),h=new l(w);let p=0;const d=W;for(e=K.bytes.A(e),u=1;(o||1)>p;u++){for(i=c=t.encrypt(d.concat(e,[u])),a=1;n>a;a++)for(c=t.encrypt(c),f=0;f<c.length;f++)i[f]^=c[f];for(a=0;(o||1)>p&&a<i.length;a++)h.setInt32(p,i[a]),p+=4}return w.slice(0,s/8)},K:class{constructor(t){const e=this,n=e.O=E,s=[[],[]];e.T=[new n,new n];const r=e.T[0].blockSize/32;t.length>r&&(t=(new n).update(t).B());for(let e=0;r>e;e++)s[0][e]=909522486^t[e],s[1][e]=1549556828^t[e];e.T[0].update(s[0]),e.T[1].update(s[1]),e.j=new n(e.T[0])}reset(){const t=this;t.j=new t.O(t.T[0]),t.H=!1}update(t){this.H=!0,this.j.update(t)}digest(){const t=this,e=t.j.B(),n=new t.O(t.T[1]).update(e).B();return t.reset(),n}encrypt(t){if(this.H)throw new r("encrypt on already updated hmac called!");return this.update(t),this.digest(t)}}},O=typeof h!=b&&typeof h.getRandomValues==k,T="Invalid password",j="Invalid signature",H="zipjs-abort-check-password";function Z(t){if(O)return h.getRandomValues(t);throw new r("Crypto API not supported")}const F=16,N={name:"PBKDF2"},q=e.assign({hash:{name:"HMAC"}},N),G=e.assign({iterations:1e3,hash:{name:"SHA-1"}},N),J=["deriveBits"],Q=[8,12,16],X=[16,24,32],Y=10,$=[0,0,0,0],tt=typeof h!=b,et=tt&&h.subtle,nt=tt&&typeof et!=b,st=K.bytes,rt=class{constructor(t){const e=this;e.Z=[[[],[],[],[],[]],[[],[],[],[],[]]],e.Z[0][0][0]||e.F();const n=e.Z[0][4],s=e.Z[1],o=t.length;let i,c,a,f=1;if(4!==o&&6!==o&&8!==o)throw new r("invalid aes key size");for(e.P=[c=t.slice(0),a=[]],i=o;4*o+28>i;i++){let t=c[i-1];(i%o===0||8===o&&i%o===4)&&(t=n[t>>>24]<<24^n[t>>16&255]<<16^n[t>>8&255]<<8^n[255&t],i%o===0&&(t=t<<8^t>>>24^f<<24,f=f<<1^283*(f>>7))),c[i]=c[i-o]^t}for(let t=0;i;t++,i--){const e=c[3&t?i:i-4];a[t]=4>=i||4>t?e:s[0][n[e>>>24]]^s[1][n[e>>16&255]]^s[2][n[e>>8&255]]^s[3][n[255&e]]}}encrypt(t){return this.N(t,0)}decrypt(t){return this.N(t,1)}F(){const t=this.Z[0],e=this.Z[1],n=t[4],s=e[4],r=[],o=[];let i,c,a,f;for(let t=0;256>t;t++)o[(r[t]=t<<1^283*(t>>7))^t]=t;for(let l=i=0;!n[l];l^=c||1,i=o[i]||1){let o=i^i<<1^i<<2^i<<3^i<<4;o=o>>8^255&o^99,n[l]=o,s[o]=l,f=r[a=r[c=r[l]]];let u=16843009*f^65537*a^257*c^16843008*l,w=257*r[o]^16843008*o;for(let n=0;4>n;n++)t[n][l]=w=w<<24^w>>>8,e[n][o]=u=u<<24^u>>>8}for(let n=0;5>n;n++)t[n]=t[n].slice(0),e[n]=e[n].slice(0)}N(t,e){if(4!==t.length)throw new r("invalid aes block size");const n=this.P[e],s=n.length/4-2,o=[0,0,0,0],i=this.Z[e],c=i[0],a=i[1],f=i[2],l=i[3],u=i[4];let w,h,p,d=t[0]^n[0],y=t[e?3:1]^n[1],m=t[2]^n[2],g=t[e?1:3]^n[3],S=4;for(let t=0;s>t;t++)w=c[d>>>24]^a[y>>16&255]^f[m>>8&255]^l[255&g]^n[S],h=c[y>>>24]^a[m>>16&255]^f[g>>8&255]^l[255&d]^n[S+1],p=c[m>>>24]^a[g>>16&255]^f[d>>8&255]^l[255&y]^n[S+2],g=c[g>>>24]^a[d>>16&255]^f[y>>8&255]^l[255&m]^n[S+3],S+=4,d=w,y=h,m=p;for(let t=0;4>t;t++)o[e?3&-t:t]=u[d>>>24]<<24^u[y>>16&255]<<16^u[m>>8&255]<<8^u[255&g]^n[S++],w=d,d=y,y=m,m=g,g=w;return o}},ot=class{constructor(t,e){this.G=t,this.J=e,this.X=e}reset(){this.X=this.J}update(t){return this.Y(this.G,t,this.X)}$(t){if(255&~(t>>24))t+=1<<24;else{let e=t>>16&255,n=t>>8&255,s=255&t;255===e?(e=0,255===n?(n=0,255===s?s=0:++s):++n):++e,t=0,t+=e<<16,t+=n<<8,t+=s}return t}et(t){0===(t[0]=this.$(t[0]))&&(t[1]=this.$(t[1]))}Y(t,e,n){let s;if(!(s=e.length))return[];const r=W.m(e);for(let r=0;s>r;r+=4){this.et(n);const s=t.encrypt(n);e[r]^=s[0],e[r+1]^=s[1],e[r+2]^=s[2],e[r+3]^=s[3]}return W.S(e,r)}},it=L.K;let ct=tt&&nt&&typeof et.importKey==k,at=tt&&nt&&typeof et.deriveBits==k;class ft extends d{constructor({password:t,rawPassword:e,encryptionStrength:n,checkPasswordOnly:s}){super({start(){ut(this,t,e,n)},async transform(t,e){const n=this,{password:i,strength:c,nt:a,ready:f}=n;i?(await(async(t,e,n,s)=>{const o=await ht(t,e,n,dt(s,0,Q[e])),i=dt(s,Q[e]);if(o[0]!=i[0]||o[1]!=i[1])throw new r(T)})(n,c,i,dt(t,0,Q[c]+2)),t=dt(t,Q[c]+2),s?e.error(new r(H)):a()):await f;const l=new o(t.length-Y-(t.length-Y)%F);e.enqueue(wt(n,t,l,0,Y,!0))},async flush(t){const{st:e,ot:n,pending:s,ready:o}=this;if(n&&e){await o;const i=dt(s,0,s.length-Y),c=dt(s,s.length-Y);let a=z;if(i.length){const t=mt(st,i);n.update(t);const s=e.update(t);a=yt(st,s)}const f=dt(yt(st,n.digest()),0,Y);let l=s.length<Y?1:0;for(let t=0;Y>t;t++)l|=f[t]^c[t];if(l)throw new r(j);t.enqueue(a)}}})}}class lt extends d{constructor({password:t,rawPassword:e,encryptionStrength:n}){let s;super({start(){ut(this,t,e,n)},async transform(t,e){const n=this,{password:s,strength:r,nt:i,ready:c}=n;let a=z;s?(a=await(async(t,e,n)=>{const s=Z(new o(Q[e]));return V(s,await ht(t,e,n,s))})(n,r,s),i()):await c;const f=new o(a.length+t.length-t.length%F);f.set(a,0),e.enqueue(wt(n,t,f,a.length,0))},async flush(t){const{st:e,ot:n,pending:r,ready:o}=this;if(n&&e){await o;let i=z;if(r.length){const t=e.update(mt(st,r));n.update(t),i=yt(st,t)}s.signature=yt(st,n.digest()).slice(0,Y),t.enqueue(V(i,s.signature))}}}),s=this}}function ut(t,n,s,r){e.assign(t,{ready:new u(e=>t.nt=e),password:pt(n,s),strength:r-1,pending:z})}function wt(t,e,n,s,r,i){const{st:c,ot:a,pending:f}=t;f.length&&(e=V(f,e));const l=e.length-r;let u;for(n=((t,e)=>{if(e&&e>t.length){const n=t;(t=new o(e)).set(n,0)}return t})(n,s+(l-l%F)),u=0;l-F>=u;u+=F){const t=mt(st,dt(e,u,u+F));i&&a.update(t);const r=c.update(t);i||a.update(r),n.set(yt(st,r),u+s)}return t.pending=dt(e,u),n}async function ht(n,s,r,i){n.password=null;const c=await(async(t,e,n,s,r)=>{if(!ct)return L.importKey(e);try{return await et.importKey("raw",e,n,!1,r)}catch{return ct=!1,L.importKey(e)}})(0,r,q,0,J),a=await(async(t,e,n)=>{if(!at)return L.L(e,t.salt,G.iterations,n);try{return await et.deriveBits(t,e,n)}catch{return at=!1,L.L(e,t.salt,G.iterations,n)}})(e.assign({salt:i},G),c,8*(2*X[s]+2)),f=new o(a),l=mt(st,dt(f,0,X[s])),u=mt(st,dt(f,X[s],2*X[s])),w=dt(f,2*X[s]);return e.assign(n,{keys:{key:l,it:u,passwordVerification:w},st:new ot(new rt(l),t.from($)),ot:new it(u)}),w}function pt(t,e){return e===v?(t=>{if(typeof w==b){const e=new o((t=unescape(encodeURIComponent(t))).length);for(let n=0;n<e.length;n++)e[n]=t.charCodeAt(n);return e}return(new w).encode(t)})(t):e}function dt(t,e,n){return t.subarray(e,n)}function yt(t,e){return t.C(e)}function mt(t,e){return t.A(e)}class gt extends d{constructor({password:t,rawPassword:e,passwordVerification:n,checkPasswordOnly:s}){super({start(){vt(this,t,e,n)},transform(t,e){const n=this;if(n.password||n.rawPassword){const e=bt(n,t.subarray(0,12));if(n.password=n.rawPassword=null,0!=(e.at(-1)^n.passwordVerification))throw new r(T);t=t.subarray(12)}s?e.error(new r(H)):e.enqueue(bt(n,t))}})}}class St extends d{constructor({password:t,rawPassword:e,passwordVerification:n}){super({start(){vt(this,t,e,n)},transform(t,e){const n=this;let s,r;if(n.password||n.rawPassword){n.password=n.rawPassword=null;const e=Z(new o(12));e[11]=n.passwordVerification,s=new o(t.length+e.length),s.set(kt(n,e),0),r=12}else s=new o(t.length),r=0;s.set(kt(n,t),r),e.enqueue(s)}})}}function vt(t,n,s,r){e.assign(t,{password:n,rawPassword:s,passwordVerification:r}),((t,n,s)=>{const r=[305419896,591751049,878082192];if(e.assign(t,{keys:r,ct:new _(r[0]),ft:new _(r[2])}),s)for(let e=0;e<s.length;e++)zt(t,s[e]);else for(let e=0;e<n.length;e++)zt(t,n.charCodeAt(e))})(t,n,s)}function bt(t,e){const n=new o(e.length);for(let s=0;s<e.length;s++)n[s]=Ct(t)^e[s],zt(t,n[s]);return n}function kt(t,e){const n=new o(e.length);for(let s=0;s<e.length;s++)n[s]=Ct(t)^e[s],zt(t,e[s]);return n}function zt(t,e){let[,n]=t.keys;t.ct.append([e]);const r=~t.ct.get();n=It(s.imul(It(n+At(r)),134775813)+1),t.ft.append([n>>>24]);const o=~t.ft.get();t.keys=[r,n,o]}function Ct(t){const e=2|t.keys[2];return At(s.imul(e,1^e)>>>8)}function At(t){return 255&t}function It(t){return 4294967295&t}const xt=new f;function Pt(t){return xt.get(t)}const Dt="deflate-raw";class Rt extends d{constructor(t,{chunkSize:e,CompressionStreamZlib:n,CompressionStream:s}){super({});const{compressed:r,encrypted:o,useCompressionStream:i,zipCrypto:c,signed:a,level:f,deflate64:u,format:w}=t,h=this;let p,d,y,m=super.readable;const g=w&&Pt(w),S=a&&r&&!u&&!g&&(!o||c)&&!(!i||!s);o&&!c||!a||S||(p=new B,m=Kt(m,p)),r&&(g?m=Et(m,Vt(g.CompressionStream,w,{level:f,chunkSize:e})):S?(y=new Ut,m=Et(m,new s("gzip")),m=Kt(m,y)):m=Wt(m,i,{level:f,chunkSize:e},s,n)),o&&(c?m=Kt(m,new St(t)):(d=new lt(t),m=Kt(m,d))),Bt(h,m,()=>{let t;o&&!c&&(t=d.signature),o&&!c||!a||(t=S?y.signature:new l(p.value.buffer).getUint32(0)),h.signature=t})}}class Ut extends d{constructor(){let t,e=10,n=new o(0);super({transform(t,r){if(e){const n=s.min(e,t.length);if(e-=n,!(t=t.subarray(n)).length)return}const o=n.length+t.length;if(8>=o)return void(n=V(n,t));const i=o-8,c=s.min(i,n.length);r.enqueue(V(n.subarray(0,c),t.subarray(0,i-c))),n=V(n.subarray(c),t.subarray(i-c))},flush(){const e=new l((s=n).buffer,s.byteOffset,s.byteLength);var s;t.signature=e.getUint32(0,!0),t.uncompressedSize=e.getUint32(4,!0)}}),t=this}}class Mt extends d{constructor(t,{chunkSize:e,DecompressionStreamZlib:n,DecompressionStream:s}){super({});const{zipCrypto:o,encrypted:i,signed:c,signature:a,compressed:f,useCompressionStream:u,deflate64:w,format:h}=t;let p,d,m=super.readable;if(i&&(o?m=Kt(m,new gt(t)):(d=new ft(t),m=Kt(m,d))),f){const t=h&&Pt(h);m=t?Et(m,Vt(t.DecompressionStream,h,{chunkSize:e})):Wt(m,u,{chunkSize:e,deflate64:w},s,n),m=(t=>{const e=t.getReader();return new y({async pull(t){let n;try{n=await e.read()}catch(t){if(t&&t.message)throw t;const e=new r("Invalid compressed data");throw e.cause=t,e}const{value:s,done:o}=n;o?t.close():t.enqueue(s)},cancel:t=>e.cancel(t)})})(m)}i&&!o||!c||(p=new B,m=Kt(m,p)),Bt(this,m,()=>{if((!i||o)&&c){const t=new l(p.value.buffer);if(a!=t.getUint32(0,!1))throw new r(j)}})}}const _t=new f;function Bt(t,n,s){n=Kt(n,new d({flush:s})),e.defineProperty(t,"readable",{get:()=>n})}function Vt(t,e,n){if(!t)throw new r("Compression method not supported");return new t(e,n)}function Wt(t,e,n,s,r){const o=e&&s?s:r||s,i=n.deflate64?"deflate64-raw":Dt;let c;try{c=new o(i,n)}catch(t){if(!e||!r||o==r)throw t;c=new r(i,n)}return Et(t,c)}function Kt(t,e){return t.pipeThrough(e)}function Et(t,e){const n=e.writable.getWriter(),s=t.getReader();return(async()=>{try{for(;;){await n.ready;const t=await s.read();if(t.done){await n.close();break}await n.write(t.value)}}catch(t){await(async(t,e)=>{try{await t.abort(e)}catch{}})(n,t),await(async(t,e)=>{try{await t.cancel(e)}catch{}})(s,t)}})(),e.readable}const Lt="data",Ot="close",Tt="deflate";class jt extends d{constructor(t,n){super({});const s=this,{codecType:o}=t;let i;o.startsWith(Tt)?i=Rt:o.startsWith("inflate")&&(i=Mt),s.outputSize=0;let c=0;const a=new i(t,n),f=super.readable,l=new d({transform(t,e){t&&t.length&&(c+=t.length,e.enqueue(t))},flush(){e.assign(s,{inputSize:c})}}),u=new d({transform(e,n){if(e&&e.length&&(n.enqueue(e),s.outputSize+=e.length,t.outputSize!==v&&s.outputSize>t.outputSize))throw new r("Invalid uncompressed size")},flush(){const{signature:t}=a;e.assign(s,{signature:t,inputSize:c})}});e.defineProperty(s,"readable",{get:()=>f.pipeThrough(l).pipeThrough(a).pipeThrough(u)})}}class Ht extends d{constructor(t){const e=[];let s=0;function r(){const n=new o(t);let r=0;for(;t>r;){const s=e[0],o=t-r;s.length>o?(n.set(s.subarray(0,o),r),e[0]=s.subarray(o),r+=o):(n.set(s,r),r+=s.length,e.shift())}return s-=t,n}n.isFinite(t)&&t>=1||(t=65536),super({transform(n,o){for(e.push(n),s+=n.length;s>t;)o.enqueue(r())},flush(t){s&&t.enqueue(((t,e)=>{const n=new o(e);let s=0;for(const e of t)n.set(e,s),s+=e.length;return n})(e,s))}})}}let Zt=2;try{typeof navigator!=b&&navigator.hardwareConcurrency&&(Zt=navigator.hardwareConcurrency)}catch{}const Ft=new f,Nt=new f;let qt,Gt,Jt,Qt,Xt,Yt=0;async function $t(t){let e,o;try{const{options:i,config:c}=t;if(i.format&&await(async(t,e)=>{!xt.has(t)&&e&&((t,e)=>{const{CompressionStream:n,DecompressionStream:s}=e;if(typeof n!=k&&typeof s!=k)throw new r("Invalid codec module");xt.set(t,{CompressionStream:n,DecompressionStream:s})})(t,await(import(e)))})(i.format,i.codecURI),c.CompressionStream=self.CompressionStream,c.DecompressionStream=self.DecompressionStream,i.compressed&&!i.format)if(i.useCompressionStream){if(!(t=>{if(!t)return!1;let e=_t.get(t);if(e===v){try{new t(Dt),e=!0}catch{e=!1}_t.set(t,e)}return e})(i.codecType.startsWith(Tt)?c.CompressionStream:c.DecompressionStream))try{await self.initModule(t.config)}catch{}}else try{await self.initModule(t.config)}catch{i.useCompressionStream=!0}const a={highWaterMark:1},f=t.readable||new y({async pull(t){const e=new u(t=>Ft.set(Yt,t));te({type:"pull",messageId:Yt}),Yt=(Yt+1)%n.MAX_SAFE_INTEGER;const{value:s,done:r}=await e;t.enqueue(s),r&&t.close()}},a);o=t.writable||new m({async write(t){let e;const s=new u(t=>e=t);Nt.set(Yt,e),te({type:Lt,value:t,messageId:Yt}),Yt=(Yt+1)%n.MAX_SAFE_INTEGER,await s}},a),e=new jt(i,c),qt=new AbortController;const{signal:l}=qt;await f.pipeThrough(e).pipeThrough(new Ht((t=>s.max(t.chunkSize,64))(c))).pipeTo(o,{signal:l,preventClose:!0,preventAbort:!0}),await o.getWriter().close();const{signature:w,inputSize:h,outputSize:p}=e;te({type:Ot,result:{signature:w,inputSize:h,outputSize:p}})}catch(t){if(t.outputSize=e?e.outputSize:0,o&&!o.locked)try{await o.getWriter().close()}catch{}ee(t)}}function te(t){const{value:e}=t;if(e)if(e.length)try{t.value=(n=e,n.byteOffset||n.byteLength!=n.buffer.byteLength?new o(n):n).buffer,p(t,[t.value])}catch{p(t)}else p(t);else p(t);var n}function ee(t=new r("Unknown error")){const{message:e,stack:n,code:s,name:o,outputSize:i}=t;p({error:{message:e,stack:n,code:s,name:o,outputSize:i}})}function ne(t,e,n={}){const i="number"==typeof n.level?n.level:-1,c="number"==typeof n.outBuffer?n.outBuffer:65536,a="number"==typeof n.inBufferSize?n.inBufferSize:65536;return new d({start(){try{let n;if(this.lt=Jt(c),this.in=Jt(a),this.inBufferSize=a,!this.lt||!this.in)throw new r("allocation failed");if(this.ut=new o(c),t?(this.wt=Gt.deflate_process,this.ht=Gt.deflate_last_consumed,this.yt=Gt.deflate_end,this.gt=Gt.deflate_new(),n="gzip"===e?Gt.deflate_init_gzip(this.gt,i):"deflate-raw"===e?Gt.deflate_init_raw(this.gt,i):Gt.deflate_init(this.gt,i)):"deflate64-raw"===e?(this.wt=Gt.inflate9_process,this.ht=Gt.inflate9_last_consumed,this.yt=Gt.inflate9_end,this.gt=Gt.inflate9_new(),n=Gt.inflate9_init_raw(this.gt)):(this.wt=Gt.inflate_process,this.ht=Gt.inflate_last_consumed,this.yt=Gt.inflate_end,this.gt=Gt.inflate_new(),n="deflate-raw"===e?Gt.inflate_init_raw(this.gt):"gzip"===e?Gt.inflate_init_gzip(this.gt):Gt.inflate_init(this.gt)),0!==n)throw new r("init failed:"+n)}catch(t){throw f(this),t}},transform(e,n){try{const i=e,a=new o(Xt.buffer),f=this.wt,l=this.ht,u=this.lt,w=this.ut;let h=0;for(;h<i.length;){const e=s.min(i.length-h,32768);if((!this.in||this.inBufferSize<e)&&(this.in&&Qt&&(Qt(this.in),this.in=0),this.in=Jt(e),this.inBufferSize=e,!this.in))throw new r("allocation failed");a.set(i.subarray(h,h+e),this.in);const o=f(this.gt,this.in,e,u,c,0),p=16777215&o;if(p&&(w.set(a.subarray(u,u+p),0),n.enqueue(w.slice(0,p))),!t){const t=o>>24&255,e=128&t?t-256:t;if(0>e)throw new r("process error:"+e)}const d=l(this.gt);if(0===d)break;h+=d}}catch(t){f(this),n.error(t)}},flush(e){try{const n=new o(Xt.buffer),s=this.wt,i=this.lt,a=this.ut;for(;;){const o=s(this.gt,0,0,i,c,4),f=16777215&o,l=o>>24&255;if(!t){const t=128&l?l-256:l;if(0>t)throw new r("process error:"+t)}if(f&&(a.set(n.subarray(i,i+f),0),e.enqueue(a.slice(0,f))),1===l||0===f)break}}catch(t){e.error(t)}finally{const t=f(this);0!==t&&e.error(new r("end error:"+t))}},cancel(){f(this)}});function f(t){let e=0;return t.gt&&t.yt&&(e=t.yt(t.gt)),t.gt=0,t.in&&Qt&&Qt(t.in),t.in=0,t.lt&&Qt&&Qt(t.lt),t.lt=0,e}}addEventListener("message",({data:t})=>{const{type:e,messageId:n,value:s,done:r}=t;try{if("start"==e&&$t(t),e==Lt){const t=Ft.get(n);Ft.delete(n),t({value:s||new o,done:r})}if("ack"==e){const t=Nt.get(n);Nt.delete(n),t()}e==Ot&&qt.abort()}catch(t){ee(t)}}),p({type:"ready"});class se{constructor(t="deflate",e){return ne(!0,t,e)}}class re{constructor(t="deflate",e){return ne(!1,t,e)}}se.St=!0,re.St=!0;let oe=!1;self.initModule=async t=>{try{const e=await(async(t,{baseURI:e})=>{if(!oe){let n,s;try{try{s=new URL(t,e)}catch{}const r=await fetch(s);n=await r.arrayBuffer()}catch(e){if(!t.startsWith("data:application/wasm;base64,"))throw e;n=(t=>{const e=t.split(",")[1],n=atob(e),s=n.length,r=new o(s);for(let t=0;s>t;++t)r[t]=n.charCodeAt(t);return r.buffer})(t)}(t=>{if(Gt=t,({malloc:Jt,free:Qt,memory:Xt}=Gt),"function"!=typeof Jt||"function"!=typeof Qt||!Xt)throw Gt=Jt=Qt=Xt=null,new r("Invalid WASM module")})((await WebAssembly.instantiate(n)).instance.exports),oe=!0}})(t.wasmURI,t);return t.CompressionStreamZlib=se,t.DecompressionStreamZlib=re,e}catch{}}});\n';t({workerURI:t=>{const n="text/javascript";if(t){const t=new Blob([e],{type:n});return URL.createObjectURL(t)}return "data:"+n+","+encodeURIComponent(e)}});}
222
+
223
+ /*
224
+ Copyright (c) 2025 Gildas Lormeau. All rights reserved.
225
+
226
+ Redistribution and use in source and binary forms, with or without
227
+ modification, are permitted provided that the following conditions are met:
228
+
229
+ 1. Redistributions of source code must retain the above copyright notice,
230
+ this list of conditions and the following disclaimer.
231
+
232
+ 2. Redistributions in binary form must reproduce the above copyright
233
+ notice, this list of conditions and the following disclaimer in
234
+ the documentation and/or other materials provided with the distribution.
235
+
236
+ 3. The names of the authors may not be used to endorse or promote products
237
+ derived from this software without specific prior written permission.
238
+
239
+ THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
240
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
241
+ FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
242
+ INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
243
+ INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
244
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
245
+ OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
246
+ LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
247
+ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
248
+ EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
249
+ */
250
+
251
+
252
+ const ERR_INVALID_CODEC_DEFINITION = "Invalid codec definition";
253
+ const ERR_RESERVED_COMPRESSION_METHOD = "Reserved compression method";
254
+ const ERR_INVALID_CODEC_MODULE = "Invalid codec module";
255
+
256
+ const STRING_TYPE = "string";
257
+ const RESERVED_COMPRESSION_METHODS = [
258
+ COMPRESSION_METHOD_STORE,
259
+ COMPRESSION_METHOD_DEFLATE,
260
+ COMPRESSION_METHOD_DEFLATE_64,
261
+ COMPRESSION_METHOD_AES
262
+ ];
263
+
264
+ const registeredCodecs = new Map();
265
+ const codecStreams = new Map();
266
+
267
+ function registerCodec(codec = {}) {
268
+ const { compressionMethod, format, codecURI, CompressionStream, DecompressionStream, versionNeeded } = codec;
269
+ if (!Number.isInteger(compressionMethod) || compressionMethod < 0 || compressionMethod > MAX_16_BITS ||
270
+ typeof format != STRING_TYPE || !format.length) {
271
+ throw new Error(ERR_INVALID_CODEC_DEFINITION);
272
+ }
273
+ if (RESERVED_COMPRESSION_METHODS.includes(compressionMethod)) {
274
+ throw new Error(ERR_RESERVED_COMPRESSION_METHOD);
275
+ }
276
+ const hasStreams = typeof CompressionStream == FUNCTION_TYPE || typeof DecompressionStream == FUNCTION_TYPE;
277
+ if (!hasStreams && (typeof codecURI != STRING_TYPE || !codecURI.length)) {
278
+ throw new Error(ERR_INVALID_CODEC_DEFINITION);
279
+ }
280
+ registeredCodecs.set(compressionMethod, { compressionMethod, format, codecURI, versionNeeded });
281
+ if (hasStreams) {
282
+ setCodecStreams(format, { CompressionStream, DecompressionStream });
283
+ }
284
+ }
285
+
286
+ function unregisterCodec(compressionMethod) {
287
+ const codec = registeredCodecs.get(compressionMethod);
288
+ if (codec) {
289
+ registeredCodecs.delete(compressionMethod);
290
+ let formatUsed;
291
+ registeredCodecs.forEach(otherCodec => formatUsed = formatUsed || otherCodec.format == codec.format);
292
+ if (!formatUsed) {
293
+ codecStreams.delete(codec.format);
294
+ }
295
+ }
296
+ }
297
+
298
+ function getRegisteredCodec(compressionMethod) {
299
+ return registeredCodecs.get(compressionMethod);
300
+ }
301
+
302
+ function getCodecStreams(format) {
303
+ return codecStreams.get(format);
304
+ }
305
+
306
+ function setCodecStreams(format, streams) {
307
+ const { CompressionStream, DecompressionStream } = streams;
308
+ if (typeof CompressionStream != FUNCTION_TYPE && typeof DecompressionStream != FUNCTION_TYPE) {
309
+ throw new Error(ERR_INVALID_CODEC_MODULE);
310
+ }
311
+ codecStreams.set(format, { CompressionStream, DecompressionStream });
312
+ }
313
+
314
+ async function ensureCodecStreams(format, codecURI) {
315
+ if (!codecStreams.has(format) && codecURI) {
316
+ setCodecStreams(format, await import(codecURI));
317
+ }
318
+ }
218
319
 
219
320
  /*
220
321
  Copyright (c) 2022 Gildas Lormeau. All rights reserved.
@@ -1752,6 +1853,7 @@ function getInt32(number) {
1752
1853
 
1753
1854
  const ERR_INVALID_UNCOMPRESSED_SIZE = "Invalid uncompressed size";
1754
1855
  const ERR_INVALID_COMPRESSED_DATA = "Invalid compressed data";
1856
+ const ERR_UNSUPPORTED_COMPRESSION$2 = "Compression method not supported";
1755
1857
  const FORMAT_DEFLATE_RAW = "deflate-raw";
1756
1858
  const FORMAT_DEFLATE64_RAW = "deflate64-raw";
1757
1859
  const FORMAT_GZIP = "gzip";
@@ -1762,23 +1864,26 @@ class DeflateStream extends TransformStream {
1762
1864
 
1763
1865
  constructor(options, { chunkSize, CompressionStreamZlib, CompressionStream }) {
1764
1866
  super({});
1765
- const { compressed, encrypted, useCompressionStream, zipCrypto, signed, level, deflate64 } = options;
1867
+ const { compressed, encrypted, useCompressionStream, zipCrypto, signed, level, deflate64, format } = options;
1766
1868
  const stream = this;
1767
1869
  let crc32Stream, encryptionStream, gzipCrc32Stream;
1768
1870
  let readable = super.readable;
1769
- const useGzipCrc32 = signed && compressed && !deflate64 && (!encrypted || zipCrypto) &&
1871
+ const codecStreams = format && getCodecStreams(format);
1872
+ const useGzipCrc32 = signed && compressed && !deflate64 && !codecStreams && (!encrypted || zipCrypto) &&
1770
1873
  Boolean(useCompressionStream && CompressionStream);
1771
1874
  if ((!encrypted || zipCrypto) && signed && !useGzipCrc32) {
1772
1875
  crc32Stream = new Crc32Stream();
1773
1876
  readable = pipeThrough(readable, crc32Stream);
1774
1877
  }
1775
1878
  if (compressed) {
1776
- if (useGzipCrc32) {
1879
+ if (codecStreams) {
1880
+ readable = pipeThroughBackpressured(readable, createCodecStream(codecStreams.CompressionStream, format, { level, chunkSize }));
1881
+ } else if (useGzipCrc32) {
1777
1882
  gzipCrc32Stream = new GzipToRawDeflateStream();
1778
1883
  readable = pipeThroughBackpressured(readable, new CompressionStream(FORMAT_GZIP));
1779
1884
  readable = pipeThrough(readable, gzipCrc32Stream);
1780
1885
  } else {
1781
- readable = pipeThroughCommpressionStream(readable, useCompressionStream, { level, chunkSize }, CompressionStream, CompressionStreamZlib, CompressionStream);
1886
+ readable = pipeThroughCompressionStream(readable, useCompressionStream, { level, chunkSize }, CompressionStream, CompressionStreamZlib);
1782
1887
  }
1783
1888
  }
1784
1889
  if (encrypted) {
@@ -1847,7 +1952,7 @@ class InflateStream extends TransformStream {
1847
1952
 
1848
1953
  constructor(options, { chunkSize, DecompressionStreamZlib, DecompressionStream }) {
1849
1954
  super({});
1850
- const { zipCrypto, encrypted, signed, signature, compressed, useCompressionStream, deflate64 } = options;
1955
+ const { zipCrypto, encrypted, signed, signature, compressed, useCompressionStream, deflate64, format } = options;
1851
1956
  let crc32Stream, decryptionStream;
1852
1957
  let readable = super.readable;
1853
1958
  if (encrypted) {
@@ -1859,7 +1964,12 @@ class InflateStream extends TransformStream {
1859
1964
  }
1860
1965
  }
1861
1966
  if (compressed) {
1862
- readable = pipeThroughCommpressionStream(readable, useCompressionStream, { chunkSize, deflate64 }, DecompressionStream, DecompressionStreamZlib, DecompressionStream);
1967
+ const codecStreams = format && getCodecStreams(format);
1968
+ if (codecStreams) {
1969
+ readable = pipeThroughBackpressured(readable, createCodecStream(codecStreams.DecompressionStream, format, { chunkSize }));
1970
+ } else {
1971
+ readable = pipeThroughCompressionStream(readable, useCompressionStream, { chunkSize, deflate64 }, DecompressionStream, DecompressionStreamZlib);
1972
+ }
1863
1973
  readable = mapInflateStreamError(readable);
1864
1974
  }
1865
1975
  if ((!encrypted || zipCrypto) && signed) {
@@ -1877,6 +1987,25 @@ class InflateStream extends TransformStream {
1877
1987
  }
1878
1988
  }
1879
1989
 
1990
+ const deflateRawSupportByStream = new Map();
1991
+
1992
+ function supportsDeflateRaw(StreamClass) {
1993
+ if (!StreamClass) {
1994
+ return false;
1995
+ }
1996
+ let supported = deflateRawSupportByStream.get(StreamClass);
1997
+ if (supported === UNDEFINED_VALUE) {
1998
+ try {
1999
+ new StreamClass(FORMAT_DEFLATE_RAW);
2000
+ supported = true;
2001
+ } catch {
2002
+ supported = false;
2003
+ }
2004
+ deflateRawSupportByStream.set(StreamClass, supported);
2005
+ }
2006
+ return supported;
2007
+ }
2008
+
1880
2009
  function setReadable(stream, readable, flush) {
1881
2010
  readable = pipeThrough(readable, new TransformStream({ flush }));
1882
2011
  Object.defineProperty(stream, "readable", {
@@ -1886,21 +2015,24 @@ function setReadable(stream, readable, flush) {
1886
2015
  });
1887
2016
  }
1888
2017
 
1889
- function pipeThroughCommpressionStream(readable, useCompressionStream, options, CompressionStreamNative, CompressionStreamZlib, CompressionStream) {
1890
- const Stream = useCompressionStream && CompressionStreamNative ? CompressionStreamNative : CompressionStreamZlib || CompressionStream;
2018
+ function createCodecStream(CodecStreamClass, format, options) {
2019
+ if (!CodecStreamClass) {
2020
+ throw new Error(ERR_UNSUPPORTED_COMPRESSION$2);
2021
+ }
2022
+ return new CodecStreamClass(format, options);
2023
+ }
2024
+
2025
+ function pipeThroughCompressionStream(readable, useCompressionStream, options, CompressionStreamNative, CompressionStreamZlib) {
2026
+ const Stream = useCompressionStream && CompressionStreamNative ?
2027
+ CompressionStreamNative :
2028
+ CompressionStreamZlib || CompressionStreamNative;
1891
2029
  const format = options.deflate64 ? FORMAT_DEFLATE64_RAW : FORMAT_DEFLATE_RAW;
1892
2030
  let codecStream;
1893
2031
  try {
1894
2032
  codecStream = new Stream(format, options);
1895
2033
  } catch (error) {
1896
- if (useCompressionStream) {
1897
- if (CompressionStreamZlib) {
1898
- codecStream = new CompressionStreamZlib(format, options);
1899
- } else if (CompressionStream) {
1900
- codecStream = new CompressionStream(format, options);
1901
- } else {
1902
- throw error;
1903
- }
2034
+ if (useCompressionStream && CompressionStreamZlib && Stream != CompressionStreamZlib) {
2035
+ codecStream = new CompressionStreamZlib(format, options);
1904
2036
  } else {
1905
2037
  throw error;
1906
2038
  }
@@ -2161,6 +2293,7 @@ class ChunkStream extends TransformStream {
2161
2293
  const MODULE_WORKER_OPTIONS = { type: "module" };
2162
2294
  const ERROR_EVENT_TYPE = "error";
2163
2295
  const MESSAGE_ERROR_EVENT_TYPE = "messageerror";
2296
+ const ERR_WORKER_STARTUP_TIMEOUT = "Worker startup timeout";
2164
2297
 
2165
2298
  let webWorkerSupported, webWorkerSource, webWorkerURI, webWorkerOptions;
2166
2299
  let transferStreamsSupported = true;
@@ -2175,6 +2308,10 @@ function configureWorker({ initModule: initModuleFunction }) {
2175
2308
  initModule$1 = initModuleFunction;
2176
2309
  }
2177
2310
 
2311
+ function resetWebWorkerSupport() {
2312
+ webWorkerSupported = UNDEFINED_VALUE;
2313
+ }
2314
+
2178
2315
  class CodecWorker {
2179
2316
 
2180
2317
  constructor(workerData, { readable, writable }, { options, config, streamOptions, useWebWorkers, transferStreams, workerURI }, onTaskFinished) {
@@ -2268,7 +2405,7 @@ function createWorkerInterface(workerData, config) {
2268
2405
  }
2269
2406
 
2270
2407
  function createWebWorkerInterface(workerData, config) {
2271
- const { baseURI, chunkSize } = config;
2408
+ const { baseURI, chunkSize, workerStartupTimeout } = config;
2272
2409
  let { wasmURI } = config;
2273
2410
 
2274
2411
  if (!workerData.interface) {
@@ -2285,9 +2422,26 @@ function createWebWorkerInterface(workerData, config) {
2285
2422
  }
2286
2423
  Object.assign(workerData, {
2287
2424
  worker,
2425
+ workerAlive: false,
2288
2426
  terminated: false,
2289
2427
  interface: {
2290
- run: () => runWebWorker(workerData, { chunkSize, wasmURI, baseURI })
2428
+ run: async () => {
2429
+ try {
2430
+ return await runWebWorker(workerData, { chunkSize, wasmURI, baseURI, workerStartupTimeout });
2431
+ } catch (error) {
2432
+ if (error && error.workerStartupFailed) {
2433
+ webWorkerSupported = false;
2434
+ const { reader } = workerData;
2435
+ if (reader) {
2436
+ reader.releaseLock();
2437
+ }
2438
+ workerData.reader = null;
2439
+ workerData.writer = null;
2440
+ return runWorker$1(workerData, config);
2441
+ }
2442
+ throw error;
2443
+ }
2444
+ }
2291
2445
  }
2292
2446
  });
2293
2447
  }
@@ -2297,15 +2451,23 @@ function createWebWorkerInterface(workerData, config) {
2297
2451
  async function runWorker$1({ options, readable, writable, onTaskFinished }, config) {
2298
2452
  let codecStream;
2299
2453
  try {
2300
- if (!options.useCompressionStream) {
2301
- try {
2302
- await initModule$1(config);
2303
- } catch {
2304
- const ZlibStream = options.codecType.startsWith(CODEC_DEFLATE) ?
2305
- config.CompressionStreamZlib :
2306
- config.DecompressionStreamZlib;
2307
- if (!ZlibStream || ZlibStream.requiresModule) {
2308
- options.useCompressionStream = true;
2454
+ if (options.compressed && !options.format) {
2455
+ const deflate = options.codecType.startsWith(CODEC_DEFLATE);
2456
+ const ZlibStream = deflate ? config.CompressionStreamZlib : config.DecompressionStreamZlib;
2457
+ const NativeStream = deflate ? config.CompressionStream : config.DecompressionStream;
2458
+ if (!options.useCompressionStream) {
2459
+ try {
2460
+ await initModule$1(config);
2461
+ } catch {
2462
+ if (!ZlibStream || ZlibStream.requiresModule) {
2463
+ options.useCompressionStream = true;
2464
+ }
2465
+ }
2466
+ } else if (ZlibStream && ZlibStream.requiresModule && !supportsDeflateRaw(NativeStream)) {
2467
+ try {
2468
+ await initModule$1(config);
2469
+ } catch {
2470
+ // ignored
2309
2471
  }
2310
2472
  }
2311
2473
  }
@@ -2374,6 +2536,10 @@ async function runWebWorker(workerData, config) {
2374
2536
  writer: writable.getWriter()
2375
2537
  });
2376
2538
  }
2539
+ const { workerStartupTimeout } = config;
2540
+ if (!workerData.workerAlive && Number.isFinite(workerStartupTimeout) && workerStartupTimeout >= 0) {
2541
+ workerData.startupTimeout = setTimeout(() => onStartupTimeout(workerData), workerStartupTimeout);
2542
+ }
2377
2543
  try {
2378
2544
  const resultValue = await result;
2379
2545
  await closeWritable();
@@ -2486,28 +2652,68 @@ function getWebWorker(url, baseURI, workerData, isModuleType, useBlobURI = true)
2486
2652
  } else {
2487
2653
  worker = new Worker(webWorkerURI, webWorkerOptions);
2488
2654
  }
2489
- worker.addEventListener(MESSAGE_EVENT_TYPE, event => onMessage(event, workerData));
2655
+ worker.addEventListener(MESSAGE_EVENT_TYPE, event => {
2656
+ workerData.workerAlive = true;
2657
+ clearStartupTimeout(workerData);
2658
+ onMessage(event, workerData);
2659
+ });
2490
2660
  worker.addEventListener(ERROR_EVENT_TYPE, event => onWorkerError(event, workerData));
2491
2661
  worker.addEventListener(MESSAGE_ERROR_EVENT_TYPE, event => onWorkerError(event, workerData));
2492
2662
  return worker;
2493
2663
  }
2494
2664
 
2665
+ function onStartupTimeout(workerData) {
2666
+ workerData.startupTimeout = null;
2667
+ if (workerData.workerAlive) {
2668
+ return;
2669
+ }
2670
+ const { rejectResult, writer } = workerData;
2671
+ terminateWorker$1(workerData);
2672
+ workerData.worker = null;
2673
+ if (rejectResult) {
2674
+ const error = new Error(ERR_WORKER_STARTUP_TIMEOUT);
2675
+ error.workerStartupFailed = true;
2676
+ rejectResult(error);
2677
+ if (writer) {
2678
+ writer.releaseLock();
2679
+ }
2680
+ }
2681
+ }
2682
+
2683
+ function clearStartupTimeout(workerData) {
2684
+ const { startupTimeout } = workerData;
2685
+ if (startupTimeout) {
2686
+ clearTimeout(startupTimeout);
2687
+ workerData.startupTimeout = null;
2688
+ }
2689
+ }
2690
+
2495
2691
  function onWorkerError(event, workerData) {
2496
2692
  if (event.preventDefault) {
2497
2693
  event.preventDefault();
2498
2694
  }
2499
- const { rejectResult, writer, onTaskFinished } = workerData;
2695
+ clearStartupTimeout(workerData);
2696
+ const { workerAlive, rejectResult, writer, onTaskFinished } = workerData;
2500
2697
  terminateWorker$1(workerData);
2698
+ if (!workerAlive) {
2699
+ workerData.worker = null;
2700
+ }
2501
2701
  if (rejectResult) {
2502
- rejectResult(event.error || new Error(event.message || ERROR_EVENT_TYPE));
2702
+ let error = event.error || new Error(event.message || ERROR_EVENT_TYPE);
2703
+ if (!workerAlive) {
2704
+ error = Object.assign(new Error(error.message || ERROR_EVENT_TYPE), { workerStartupFailed: true });
2705
+ }
2706
+ rejectResult(error);
2503
2707
  if (writer) {
2504
2708
  writer.releaseLock();
2505
2709
  }
2506
- onTaskFinished();
2710
+ if (workerAlive) {
2711
+ onTaskFinished();
2712
+ }
2507
2713
  }
2508
2714
  }
2509
2715
 
2510
- function sendMessage(message, { worker, writer, transferStreams }) {
2716
+ function sendMessage(message, { worker, writer, transferStreams, workerAlive }) {
2511
2717
  try {
2512
2718
  const { value, readable, writable } = message;
2513
2719
  const transferables = [];
@@ -2515,7 +2721,7 @@ function sendMessage(message, { worker, writer, transferStreams }) {
2515
2721
  message.value = toExactUint8Array(value);
2516
2722
  transferables.push(message.value.buffer);
2517
2723
  }
2518
- if (transferStreams && transferStreamsSupported) {
2724
+ if (transferStreams && transferStreamsSupported && workerAlive) {
2519
2725
  if (readable) {
2520
2726
  transferables.push(readable);
2521
2727
  }
@@ -2634,11 +2840,18 @@ let indexWorker = 0;
2634
2840
 
2635
2841
  async function runWorker(stream, workerOptions) {
2636
2842
  const { options, config } = workerOptions;
2637
- const { transferStreams, useWebWorkers, useCompressionStream, compressed, signed, encrypted } = options;
2843
+ const { transferStreams, useWebWorkers, useCompressionStream, compressed, signed, encrypted, format, codecURI } = options;
2638
2844
  const { workerURI, maxWorkers } = config;
2845
+ if (format) {
2846
+ if (codecURI) {
2847
+ options.codecURI = resolveCodecURI(codecURI, config.baseURI);
2848
+ }
2849
+ await ensureCodecStreams(format, options.codecURI);
2850
+ }
2639
2851
  workerOptions.transferStreams = transferStreams || (transferStreams === UNDEFINED_VALUE && config.transferStreams);
2640
2852
  const streamCopy = !compressed && !signed && !encrypted;
2641
- workerOptions.useWebWorkers = !streamCopy && (useWebWorkers || (useWebWorkers === UNDEFINED_VALUE && config.useWebWorkers));
2853
+ const workerSupported = format === UNDEFINED_VALUE || Boolean(options.codecURI);
2854
+ workerOptions.useWebWorkers = !streamCopy && workerSupported && (useWebWorkers || (useWebWorkers === UNDEFINED_VALUE && config.useWebWorkers));
2642
2855
  workerOptions.workerURI = workerOptions.useWebWorkers && workerURI ? workerURI : UNDEFINED_VALUE;
2643
2856
  options.useCompressionStream = useCompressionStream || (useCompressionStream === UNDEFINED_VALUE && config.useCompressionStream);
2644
2857
  return (await getWorker()).run();
@@ -2678,6 +2891,14 @@ async function runWorker(stream, workerOptions) {
2678
2891
  }
2679
2892
  }
2680
2893
 
2894
+ function resolveCodecURI(codecURI, baseURI) {
2895
+ try {
2896
+ return new URL(codecURI, baseURI).toString();
2897
+ } catch {
2898
+ return codecURI;
2899
+ }
2900
+ }
2901
+
2681
2902
  function armStarvationTimeout() {
2682
2903
  if (!starvationTimeout && pendingRequests.length && Number.isFinite(starvationDelay) && starvationDelay >= 0) {
2683
2904
  starvationTimeout = setTimeout(onWorkerStarvation, starvationDelay);
@@ -2738,6 +2959,7 @@ async function terminateWorkers() {
2738
2959
  clearTerminateTimeout(workerData);
2739
2960
  return workerData.terminate();
2740
2961
  }));
2962
+ resetWebWorkerSupport();
2741
2963
  }
2742
2964
 
2743
2965
  /*
@@ -3961,6 +4183,7 @@ const OPTION_TRANSFER_STREAMS = "transferStreams";
3961
4183
  const OPTION_PREVENT_CLOSE = "preventClose";
3962
4184
  const OPTION_ENCRYPTION_STRENGTH = "encryptionStrength";
3963
4185
  const OPTION_EXTENDED_TIMESTAMP = "extendedTimestamp";
4186
+ const OPTION_NTFS_TIMESTAMP = "ntfsTimestamp";
3964
4187
  const OPTION_KEEP_ORDER = "keepOrder";
3965
4188
  const OPTION_LEVEL = "level";
3966
4189
  const OPTION_BUFFERED_WRITE = "bufferedWrite";
@@ -4020,6 +4243,7 @@ const ERR_UNSUPPORTED_COMPRESSION$1 = "Compression method not supported";
4020
4243
  const ERR_SPLIT_ZIP_FILE = "Split zip file";
4021
4244
  const ERR_OVERLAPPING_ENTRY = "Overlapping entry found";
4022
4245
  const ERR_AMBIGUOUS_ARCHIVE = "Ambiguous archive";
4246
+ const ERR_ENCRYPTED_CENTRAL_DIRECTORY = "Encrypted central directory is not supported";
4023
4247
  const CHARSET_UTF8 = "utf-8";
4024
4248
  const PROPERTY_NAME_UTF8_SUFFIX = "UTF8";
4025
4249
  const CHARSET_CP437 = "cp437";
@@ -4097,6 +4321,7 @@ class ZipReader {
4097
4321
  let prependedDataLength = 0;
4098
4322
  let startOffset;
4099
4323
  let zip64EndOfDirectory;
4324
+ let zip64EndOfDirectoryVersion2;
4100
4325
  const requiresZip64 = directoryDataOffset == MAX_32_BITS || directoryDataLength == MAX_32_BITS || filesLength == MAX_16_BITS || diskNumber == MAX_16_BITS;
4101
4326
  if (directoryDataOffset != MAX_32_BITS && diskNumber != MAX_16_BITS) {
4102
4327
  directoryDataOffset += getDiskOffset$1(reader, diskNumber);
@@ -4126,6 +4351,7 @@ class ZipReader {
4126
4351
  throw new Error(ERR_EOCDR_LOCATOR_ZIP64_NOT_FOUND);
4127
4352
  }
4128
4353
  zip64EndOfDirectory = true;
4354
+ zip64EndOfDirectoryVersion2 = getBigUint64(endOfDirectoryView, 4) > ZIP64_END_OF_CENTRAL_DIR_LENGTH - 12;
4129
4355
  if (lastDiskNumber == MAX_16_BITS) {
4130
4356
  lastDiskNumber = getUint32(endOfDirectoryView, 16);
4131
4357
  } else if (checkAmbiguity && lastDiskNumber != getUint32(endOfDirectoryView, 16)) {
@@ -4205,6 +4431,9 @@ class ZipReader {
4205
4431
  for (let indexFile = 0; indexFile < filesLength; indexFile++) {
4206
4432
  const fileEntry = new ZipEntry$1(reader, config, zipReader.options);
4207
4433
  if (offset + CENTRAL_FILE_HEADER_LENGTH > directoryArray.length || getUint32(directoryView, offset) != CENTRAL_FILE_HEADER_SIGNATURE) {
4434
+ if (indexFile == 0 && (zip64EndOfDirectoryVersion2 || detectEncryptedCentralDirectory(directoryView))) {
4435
+ throw new Error(ERR_ENCRYPTED_CENTRAL_DIRECTORY);
4436
+ }
4208
4437
  throw new Error(ERR_CENTRAL_DIRECTORY_NOT_FOUND);
4209
4438
  }
4210
4439
  readCommonHeader(fileEntry, directoryView, offset + 6);
@@ -4432,7 +4661,8 @@ let ZipEntry$1 = class ZipEntry {
4432
4661
  throw new Error(ERR_UNSUPPORTED_COMPRESSION$1);
4433
4662
  }
4434
4663
  }
4435
- if ((compressionMethod != COMPRESSION_METHOD_STORE && compressionMethod != COMPRESSION_METHOD_DEFLATE && compressionMethod != COMPRESSION_METHOD_DEFLATE_64) && !passThrough) {
4664
+ const registeredCodec = passThrough ? UNDEFINED_VALUE : getRegisteredCodec(compressionMethod);
4665
+ if ((compressionMethod != COMPRESSION_METHOD_STORE && compressionMethod != COMPRESSION_METHOD_DEFLATE && compressionMethod != COMPRESSION_METHOD_DEFLATE_64 && !registeredCodec) && !passThrough) {
4436
4666
  throw new Error(ERR_UNSUPPORTED_COMPRESSION$1);
4437
4667
  }
4438
4668
  if (dataArray.length < HEADER_SIZE || getUint32(dataView, 0) != LOCAL_FILE_HEADER_SIGNATURE) {
@@ -4471,7 +4701,10 @@ let ZipEntry$1 = class ZipEntry {
4471
4701
  fileEntry.zipCrypto = zipCrypto;
4472
4702
  }
4473
4703
  if (encrypted) {
4474
- if (!zipCrypto && extraFieldAES.strength === UNDEFINED_VALUE) {
4704
+ if ((localDirectory.rawBitFlag & BITFLAG_STRONG_ENCRYPTION) == BITFLAG_STRONG_ENCRYPTION) {
4705
+ throw new Error(ERR_UNSUPPORTED_ENCRYPTION);
4706
+ }
4707
+ if (!zipCrypto && (extraFieldAES.strength < 1 || extraFieldAES.strength > 3)) {
4475
4708
  throw new Error(ERR_UNSUPPORTED_ENCRYPTION);
4476
4709
  } else if (!password && !rawPassword) {
4477
4710
  throw new Error(ERR_ENCRYPTED);
@@ -4510,6 +4743,8 @@ let ZipEntry$1 = class ZipEntry {
4510
4743
  useCompressionStream,
4511
4744
  transferStreams: getOptionValue$1(zipEntry, options, OPTION_TRANSFER_STREAMS),
4512
4745
  deflate64,
4746
+ format: registeredCodec ? registeredCodec.format : UNDEFINED_VALUE,
4747
+ codecURI: registeredCodec ? registeredCodec.codecURI : UNDEFINED_VALUE,
4513
4748
  checkPasswordOnly
4514
4749
  },
4515
4750
  config,
@@ -4562,6 +4797,16 @@ let ZipEntry$1 = class ZipEntry {
4562
4797
  }
4563
4798
  };
4564
4799
 
4800
+ function detectEncryptedCentralDirectory(directoryView) {
4801
+ const maxOffset = Math.min(directoryView.byteLength, 1024) - 3;
4802
+ for (let offset = 0; offset < maxOffset; offset++) {
4803
+ if (getUint32(directoryView, offset) == ARCHIVE_EXTRA_DATA_SIGNATURE) {
4804
+ return true;
4805
+ }
4806
+ }
4807
+ return false;
4808
+ }
4809
+
4565
4810
  function readCommonHeader(directory, dataView, offset) {
4566
4811
  const rawBitFlag = directory.rawBitFlag = getUint16(dataView, offset + 2);
4567
4812
  const encrypted = (rawBitFlag & BITFLAG_ENCRYPTED) == BITFLAG_ENCRYPTED;
@@ -5076,6 +5321,7 @@ var zipReader = /*#__PURE__*/Object.freeze({
5076
5321
  ERR_BAD_FORMAT: ERR_BAD_FORMAT,
5077
5322
  ERR_CENTRAL_DIRECTORY_NOT_FOUND: ERR_CENTRAL_DIRECTORY_NOT_FOUND,
5078
5323
  ERR_ENCRYPTED: ERR_ENCRYPTED,
5324
+ ERR_ENCRYPTED_CENTRAL_DIRECTORY: ERR_ENCRYPTED_CENTRAL_DIRECTORY,
5079
5325
  ERR_EOCDR_LOCATOR_ZIP64_NOT_FOUND: ERR_EOCDR_LOCATOR_ZIP64_NOT_FOUND,
5080
5326
  ERR_EOCDR_NOT_FOUND: ERR_EOCDR_NOT_FOUND,
5081
5327
  ERR_EXTRAFIELD_ZIP64_NOT_FOUND: ERR_EXTRAFIELD_ZIP64_NOT_FOUND,
@@ -5127,6 +5373,7 @@ const ERR_INVALID_ENTRY_COMMENT = "File entry comment exceeds 64KB";
5127
5373
  const ERR_INVALID_ENTRY_NAME = "File entry name exceeds 64KB";
5128
5374
  const ERR_INVALID_VERSION = "Version exceeds 65535";
5129
5375
  const ERR_INVALID_ENCRYPTION_STRENGTH = "The strength must equal 1, 2, or 3";
5376
+ const ERR_UNSUPPORTED_ENCRYPTION_USDZ = "Encryption is not supported in USDZ files";
5130
5377
  const ERR_INVALID_EXTRAFIELD_TYPE = "Extra field type exceeds 65535";
5131
5378
  const ERR_INVALID_EXTRAFIELD_DATA = "Extra field data exceeds 64KB";
5132
5379
  const ERR_UNSUPPORTED_COMPRESSION = "Compression method not supported";
@@ -5487,7 +5734,11 @@ function resolveAttributes(zipWriter, name, options) {
5487
5734
  if (versionMadeBy > MAX_16_BITS) {
5488
5735
  throw new Error(ERR_INVALID_VERSION);
5489
5736
  }
5490
- let externalFileAttributes = getOptionValue(zipWriter, options, PROPERTY_NAME_EXTERNAL_FILE_ATTRIBUTES, 0);
5737
+ let externalFileAttributes = getOptionValue(zipWriter, options, PROPERTY_NAME_EXTERNAL_FILE_ATTRIBUTES);
5738
+ const externalFileAttributesProvided = externalFileAttributes !== UNDEFINED_VALUE;
5739
+ if (!externalFileAttributesProvided) {
5740
+ externalFileAttributes = 0;
5741
+ }
5491
5742
  if (!options[PROPERTY_NAME_DIRECTORY] && name.endsWith(DIRECTORY_SIGNATURE)) {
5492
5743
  options[PROPERTY_NAME_DIRECTORY] = true;
5493
5744
  }
@@ -5496,13 +5747,13 @@ function resolveAttributes(zipWriter, name, options) {
5496
5747
  if (!name.endsWith(DIRECTORY_SIGNATURE)) {
5497
5748
  name += DIRECTORY_SIGNATURE;
5498
5749
  }
5499
- if (externalFileAttributes === 0) {
5750
+ if (!externalFileAttributesProvided) {
5500
5751
  externalFileAttributes = FILE_ATTR_MSDOS_DIR_MASK;
5501
5752
  if (!msDosCompatible) {
5502
5753
  externalFileAttributes |= (FILE_ATTR_UNIX_TYPE_DIR | FILE_ATTR_UNIX_EXECUTABLE_MASK | FILE_ATTR_UNIX_DEFAULT_MASK) << 16;
5503
5754
  }
5504
5755
  }
5505
- } else if (!msDosCompatible && externalFileAttributes === 0) {
5756
+ } else if (!msDosCompatible && !externalFileAttributesProvided) {
5506
5757
  if (executable) {
5507
5758
  externalFileAttributes = (FILE_ATTR_UNIX_EXECUTABLE_MASK | FILE_ATTR_UNIX_DEFAULT_MASK) << 16;
5508
5759
  } else {
@@ -5511,6 +5762,7 @@ function resolveAttributes(zipWriter, name, options) {
5511
5762
  }
5512
5763
  let unixExternalUpper;
5513
5764
  if (!msDosCompatible) {
5765
+ const unixModeProvided = unixMode !== UNDEFINED_VALUE || Boolean(setuid || setgid || sticky);
5514
5766
  unixExternalUpper = (externalFileAttributes >> 16) & MAX_16_BITS;
5515
5767
  unixMode = unixMode === UNDEFINED_VALUE ? unixExternalUpper : (unixMode & MAX_16_BITS);
5516
5768
  if (setuid) {
@@ -5528,10 +5780,12 @@ function resolveAttributes(zipWriter, name, options) {
5528
5780
  } else {
5529
5781
  sticky = Boolean(unixMode & FILE_ATTR_UNIX_STICKY_MASK);
5530
5782
  }
5531
- if (directory) {
5532
- unixMode |= FILE_ATTR_UNIX_TYPE_DIR;
5783
+ if (!externalFileAttributesProvided || unixModeProvided) {
5784
+ if (directory) {
5785
+ unixMode |= FILE_ATTR_UNIX_TYPE_DIR;
5786
+ }
5787
+ externalFileAttributes = ((unixMode & MAX_16_BITS) << 16) | (externalFileAttributes & MAX_16_BITS);
5533
5788
  }
5534
- externalFileAttributes = ((unixMode & MAX_16_BITS) << 16) | (externalFileAttributes & MAX_8_BITS);
5535
5789
  }
5536
5790
  ({ msdosAttributesRaw, msdosAttributes } = normalizeMsdosAttributes(msdosAttributesRaw, msdosAttributes));
5537
5791
  if (hasMsDosProvided) {
@@ -5591,6 +5845,7 @@ function resolveMetadata(zipWriter, name, options) {
5591
5845
  const encryptionStrength = getOptionValue(zipWriter, options, OPTION_ENCRYPTION_STRENGTH, 3);
5592
5846
  const zipCrypto = getOptionValue(zipWriter, options, PROPERTY_NAME_ZIPCRYPTO);
5593
5847
  const extendedTimestamp = getOptionValue(zipWriter, options, OPTION_EXTENDED_TIMESTAMP, true);
5848
+ const ntfsTimestamp = getOptionValue(zipWriter, options, OPTION_NTFS_TIMESTAMP);
5594
5849
  const keepOrder = getOptionValue(zipWriter, options, OPTION_KEEP_ORDER, true);
5595
5850
  const useWebWorkers = getOptionValue(zipWriter, options, OPTION_USE_WEB_WORKERS);
5596
5851
  const transferStreams = getOptionValue(zipWriter, options, OPTION_TRANSFER_STREAMS);
@@ -5600,11 +5855,20 @@ function resolveMetadata(zipWriter, name, options) {
5600
5855
  const signal = getOptionValue(zipWriter, options, OPTION_SIGNAL);
5601
5856
  const useUnicodeFileNames = getOptionValue(zipWriter, options, OPTION_USE_UNICODE_FILE_NAMES, true);
5602
5857
  const compressionMethod = getOptionValue(zipWriter, options, PROPERTY_NAME_COMPRESSION_METHOD);
5858
+ const registeredCodec = passThrough || compressionMethod === UNDEFINED_VALUE ? UNDEFINED_VALUE : getRegisteredCodec(compressionMethod);
5603
5859
  if (!passThrough && compressionMethod !== UNDEFINED_VALUE &&
5604
- compressionMethod !== COMPRESSION_METHOD_STORE && compressionMethod !== COMPRESSION_METHOD_DEFLATE) {
5860
+ compressionMethod !== COMPRESSION_METHOD_STORE && compressionMethod !== COMPRESSION_METHOD_DEFLATE && !registeredCodec) {
5605
5861
  throw new Error(ERR_UNSUPPORTED_COMPRESSION);
5606
5862
  }
5607
5863
  let level = getOptionValue(zipWriter, options, OPTION_LEVEL);
5864
+ if (zipWriter.options[OPTION_USDZ]) {
5865
+ if (password !== UNDEFINED_VALUE || rawPassword !== UNDEFINED_VALUE) {
5866
+ throw new Error(ERR_UNSUPPORTED_ENCRYPTION_USDZ);
5867
+ }
5868
+ if (level === UNDEFINED_VALUE && compressionMethod === UNDEFINED_VALUE) {
5869
+ level = 0;
5870
+ }
5871
+ }
5608
5872
  let useCompressionStream = getOptionValue(zipWriter, options, OPTION_USE_COMPRESSION_STREAM);
5609
5873
  let dataDescriptor = getOptionValue(zipWriter, options, OPTION_DATA_DESCRIPTOR);
5610
5874
  if (bufferedWrite && dataDescriptor === UNDEFINED_VALUE) {
@@ -5616,7 +5880,7 @@ function resolveMetadata(zipWriter, name, options) {
5616
5880
  if (level !== UNDEFINED_VALUE && level != 6) {
5617
5881
  useCompressionStream = false;
5618
5882
  }
5619
- if (!useCompressionStream && (zipWriter.config.CompressionStream === UNDEFINED_VALUE && zipWriter.config.CompressionStreamZlib === UNDEFINED_VALUE)) {
5883
+ if (!useCompressionStream && !registeredCodec && (zipWriter.config.CompressionStream === UNDEFINED_VALUE && zipWriter.config.CompressionStreamZlib === UNDEFINED_VALUE)) {
5620
5884
  level = 0;
5621
5885
  }
5622
5886
  const zip64 = getOptionValue(zipWriter, options, PROPERTY_NAME_ZIP64);
@@ -5660,6 +5924,7 @@ function resolveMetadata(zipWriter, name, options) {
5660
5924
  encryptionStrength,
5661
5925
  zipCrypto,
5662
5926
  extendedTimestamp,
5927
+ ntfsTimestamp,
5663
5928
  keepOrder,
5664
5929
  useWebWorkers,
5665
5930
  transferStreams,
@@ -5669,6 +5934,9 @@ function resolveMetadata(zipWriter, name, options) {
5669
5934
  signal,
5670
5935
  useUnicodeFileNames,
5671
5936
  compressionMethod,
5937
+ format: registeredCodec ? registeredCodec.format : UNDEFINED_VALUE,
5938
+ codecURI: registeredCodec ? registeredCodec.codecURI : UNDEFINED_VALUE,
5939
+ codecVersionNeeded: registeredCodec ? registeredCodec.versionNeeded : UNDEFINED_VALUE,
5672
5940
  level,
5673
5941
  useCompressionStream,
5674
5942
  dataDescriptor,
@@ -5965,7 +6233,9 @@ async function createFileEntry(reader, writer, { diskNumberStart, lock }, entryI
5965
6233
  msdosAttributesRaw,
5966
6234
  msdosAttributes,
5967
6235
  useCompressionStream,
5968
- passThrough
6236
+ passThrough,
6237
+ format,
6238
+ codecURI
5969
6239
  } = options;
5970
6240
  const fileEntry = {
5971
6241
  lock,
@@ -6025,7 +6295,9 @@ async function createFileEntry(reader, writer, { diskNumberStart, lock }, entryI
6025
6295
  encrypted: encrypted && !passThrough,
6026
6296
  useWebWorkers,
6027
6297
  useCompressionStream,
6028
- transferStreams
6298
+ transferStreams,
6299
+ format,
6300
+ codecURI
6029
6301
  },
6030
6302
  config,
6031
6303
  streamOptions: { signal, size, onstart, onprogress, onend }
@@ -6097,6 +6369,7 @@ function getHeaderInfo(options) {
6097
6369
  rawExtraField,
6098
6370
  encryptionStrength,
6099
6371
  extendedTimestamp,
6372
+ ntfsTimestamp,
6100
6373
  passThrough,
6101
6374
  encrypted,
6102
6375
  zip64UncompressedSize,
@@ -6142,7 +6415,8 @@ function getHeaderInfo(options) {
6142
6415
  let extraFieldExtendedTimestampFlag;
6143
6416
  if (extendedTimestamp) {
6144
6417
  const lastModTimeUnix = getTimeUnix(lastModDate);
6145
- if (inUnixTimeRange(lastModTimeUnix)) {
6418
+ const lastModTimeUnixInRange = inUnixTimeRange(lastModTimeUnix);
6419
+ if (lastModTimeUnixInRange) {
6146
6420
  const extraFieldTimestampLength = 9 + (lastAccessDate ? 4 : 0) + (creationDate ? 4 : 0);
6147
6421
  const extraFieldTimestamp = createRecordWriter(extraFieldTimestampLength);
6148
6422
  extraFieldExtendedTimestampFlag = 0x1 + (lastAccessDate ? 0x2 : 0) + (creationDate ? 0x4 : 0);
@@ -6160,19 +6434,26 @@ function getHeaderInfo(options) {
6160
6434
  } else {
6161
6435
  rawExtraFieldExtendedTimestamp = EMPTY_UINT8_ARRAY;
6162
6436
  }
6163
- try {
6164
- const lastModTimeNTFS = getTimeNTFS(lastModDate);
6165
- const extraFieldNTFS = createRecordWriter(36);
6166
- extraFieldNTFS.uint16(EXTRAFIELD_TYPE_NTFS);
6167
- extraFieldNTFS.uint16(32);
6168
- extraFieldNTFS.skip(4);
6169
- extraFieldNTFS.uint16(EXTRAFIELD_TYPE_NTFS_TAG1);
6170
- extraFieldNTFS.uint16(24);
6171
- extraFieldNTFS.uint64(lastModTimeNTFS);
6172
- extraFieldNTFS.uint64(getTimeNTFS(lastAccessDate) || lastModTimeNTFS);
6173
- extraFieldNTFS.uint64(getTimeNTFS(creationDate) || lastModTimeNTFS);
6174
- rawExtraFieldNTFS = extraFieldNTFS.array;
6175
- } catch {
6437
+ const writeExtraFieldNTFS = ntfsTimestamp === UNDEFINED_VALUE ?
6438
+ !lastModTimeUnixInRange || Boolean(lastAccessDate || creationDate) :
6439
+ ntfsTimestamp;
6440
+ if (writeExtraFieldNTFS) {
6441
+ try {
6442
+ const lastModTimeNTFS = getTimeNTFS(lastModDate);
6443
+ const extraFieldNTFS = createRecordWriter(36);
6444
+ extraFieldNTFS.uint16(EXTRAFIELD_TYPE_NTFS);
6445
+ extraFieldNTFS.uint16(32);
6446
+ extraFieldNTFS.skip(4);
6447
+ extraFieldNTFS.uint16(EXTRAFIELD_TYPE_NTFS_TAG1);
6448
+ extraFieldNTFS.uint16(24);
6449
+ extraFieldNTFS.uint64(lastModTimeNTFS);
6450
+ extraFieldNTFS.uint64(getTimeNTFS(lastAccessDate) || lastModTimeNTFS);
6451
+ extraFieldNTFS.uint64(getTimeNTFS(creationDate) || lastModTimeNTFS);
6452
+ rawExtraFieldNTFS = extraFieldNTFS.array;
6453
+ } catch {
6454
+ rawExtraFieldNTFS = EMPTY_UINT8_ARRAY;
6455
+ }
6456
+ } else {
6176
6457
  rawExtraFieldNTFS = EMPTY_UINT8_ARRAY;
6177
6458
  }
6178
6459
  } else {
@@ -6210,6 +6491,10 @@ function getHeaderInfo(options) {
6210
6491
  if (compressionMethod === UNDEFINED_VALUE) {
6211
6492
  compressionMethod = compressed ? COMPRESSION_METHOD_DEFLATE : COMPRESSION_METHOD_STORE;
6212
6493
  }
6494
+ const { codecVersionNeeded } = options;
6495
+ if (compressed && codecVersionNeeded !== UNDEFINED_VALUE) {
6496
+ version = version > codecVersionNeeded ? version : codecVersionNeeded;
6497
+ }
6213
6498
  if (zip64) {
6214
6499
  version = version > VERSION_ZIP64 ? version : VERSION_ZIP64;
6215
6500
  }
@@ -6223,6 +6508,7 @@ function getHeaderInfo(options) {
6223
6508
  if (extraFieldLength > MAX_16_BITS) {
6224
6509
  throw new Error(ERR_INVALID_EXTRAFIELD_DATA);
6225
6510
  }
6511
+ const dosLastModDate = new Date(Math.ceil(lastModDate.getTime() / 2000) * 2000);
6226
6512
  const {
6227
6513
  headerArray,
6228
6514
  headerView,
@@ -6232,7 +6518,7 @@ function getHeaderInfo(options) {
6232
6518
  bitFlag: getBitFlag(level, useUnicodeFileNames, dataDescriptor, encrypted, compressionMethod),
6233
6519
  compressionMethod,
6234
6520
  uncompressedSize,
6235
- lastModDate: lastModDate < MIN_DATE ? MIN_DATE : lastModDate > MAX_DATE ? MAX_DATE : lastModDate,
6521
+ lastModDate: dosLastModDate < MIN_DATE ? MIN_DATE : dosLastModDate > MAX_DATE ? MAX_DATE : dosLastModDate,
6236
6522
  rawFilename,
6237
6523
  zip64CompressedSize,
6238
6524
  zip64UncompressedSize,
@@ -10362,11 +10648,14 @@ exports.ERR_BAD_FORMAT = ERR_BAD_FORMAT;
10362
10648
  exports.ERR_CENTRAL_DIRECTORY_NOT_FOUND = ERR_CENTRAL_DIRECTORY_NOT_FOUND;
10363
10649
  exports.ERR_DUPLICATED_NAME = ERR_DUPLICATED_NAME;
10364
10650
  exports.ERR_ENCRYPTED = ERR_ENCRYPTED;
10651
+ exports.ERR_ENCRYPTED_CENTRAL_DIRECTORY = ERR_ENCRYPTED_CENTRAL_DIRECTORY;
10365
10652
  exports.ERR_EOCDR_LOCATOR_ZIP64_NOT_FOUND = ERR_EOCDR_LOCATOR_ZIP64_NOT_FOUND;
10366
10653
  exports.ERR_EOCDR_NOT_FOUND = ERR_EOCDR_NOT_FOUND;
10367
10654
  exports.ERR_EXTRAFIELD_ZIP64_NOT_FOUND = ERR_EXTRAFIELD_ZIP64_NOT_FOUND;
10368
10655
  exports.ERR_HTTP_RANGE = ERR_HTTP_RANGE;
10369
10656
  exports.ERR_HTTP_RESOURCE_CHANGED = ERR_HTTP_RESOURCE_CHANGED;
10657
+ exports.ERR_INVALID_CODEC_DEFINITION = ERR_INVALID_CODEC_DEFINITION;
10658
+ exports.ERR_INVALID_CODEC_MODULE = ERR_INVALID_CODEC_MODULE;
10370
10659
  exports.ERR_INVALID_COMMENT = ERR_INVALID_COMMENT;
10371
10660
  exports.ERR_INVALID_COMPRESSED_DATA = ERR_INVALID_COMPRESSED_DATA;
10372
10661
  exports.ERR_INVALID_ENCRYPTION_STRENGTH = ERR_INVALID_ENCRYPTION_STRENGTH;
@@ -10381,11 +10670,13 @@ exports.ERR_INVALID_VERSION = ERR_INVALID_VERSION;
10381
10670
  exports.ERR_ITERATOR_COMPLETED_TOO_SOON = ERR_ITERATOR_COMPLETED_TOO_SOON;
10382
10671
  exports.ERR_LOCAL_FILE_HEADER_NOT_FOUND = ERR_LOCAL_FILE_HEADER_NOT_FOUND;
10383
10672
  exports.ERR_OVERLAPPING_ENTRY = ERR_OVERLAPPING_ENTRY;
10673
+ exports.ERR_RESERVED_COMPRESSION_METHOD = ERR_RESERVED_COMPRESSION_METHOD;
10384
10674
  exports.ERR_SPLIT_ZIP_FILE = ERR_SPLIT_ZIP_FILE;
10385
10675
  exports.ERR_UNDEFINED_READER = ERR_UNDEFINED_READER;
10386
10676
  exports.ERR_UNDEFINED_UNCOMPRESSED_SIZE = ERR_UNDEFINED_UNCOMPRESSED_SIZE;
10387
10677
  exports.ERR_UNSUPPORTED_COMPRESSION = ERR_UNSUPPORTED_COMPRESSION$1;
10388
10678
  exports.ERR_UNSUPPORTED_ENCRYPTION = ERR_UNSUPPORTED_ENCRYPTION;
10679
+ exports.ERR_UNSUPPORTED_ENCRYPTION_USDZ = ERR_UNSUPPORTED_ENCRYPTION_USDZ;
10389
10680
  exports.ERR_UNSUPPORTED_FORMAT = ERR_UNSUPPORTED_FORMAT;
10390
10681
  exports.ERR_WRITER_NOT_INITIALIZED = ERR_WRITER_NOT_INITIALIZED;
10391
10682
  exports.ERR_ZIP_NOT_EMPTY = ERR_ZIP_NOT_EMPTY;
@@ -10409,5 +10700,7 @@ exports.createOPFSTempStream = createOPFSTempStream;
10409
10700
  exports.createSyncAccessHandleTempStream = createSyncAccessHandleTempStream;
10410
10701
  exports.fs = fs;
10411
10702
  exports.getMimeType = getMimeType;
10703
+ exports.registerCodec = registerCodec;
10412
10704
  exports.resetConfiguration = resetConfiguration;
10413
10705
  exports.terminateWorkers = terminateWorkersAndModule;
10706
+ exports.unregisterCodec = unregisterCodec;