@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.
- package/deno.json +1 -1
- package/dist/zip-core-external.js +427 -110
- package/dist/zip-core-external.min.js +1 -1
- package/dist/zip-core.js +437 -107
- package/dist/zip-core.min.js +1 -1
- package/dist/zip-fs-core-external.js +492 -230
- package/dist/zip-fs-core-external.min.js +1 -1
- package/dist/zip-fs-core.js +505 -227
- package/dist/zip-fs-core.min.js +1 -1
- package/dist/zip-fs-external.js +492 -230
- package/dist/zip-fs-external.min.js +1 -1
- package/dist/zip-fs-native.js +507 -229
- package/dist/zip-fs-native.min.js +1 -1
- package/dist/zip-fs.js +508 -230
- package/dist/zip-fs.min.js +1 -1
- package/dist/zip-legacy.js +439 -109
- package/dist/zip-legacy.min.js +1 -1
- package/dist/zip-native.js +439 -109
- package/dist/zip-native.min.js +1 -1
- package/dist/zip-web-worker-native.js +1 -1
- package/dist/zip-web-worker.js +1 -1
- package/dist/zip.js +440 -110
- package/dist/zip.min.js +1 -1
- package/index-native.cjs +507 -229
- package/index-native.min.js +1 -1
- package/index.cjs +508 -230
- package/index.d.cts +468 -59
- package/index.d.ts +468 -59
- package/index.min.js +1 -1
- package/lib/core/codec-worker-web.js +10 -2
- package/lib/core/codec-worker.js +4 -3
- package/lib/core/configuration.js +20 -5
- package/lib/core/constants.js +2 -0
- package/lib/core/io.js +13 -5
- package/lib/core/options.js +16 -0
- package/lib/core/streams/codec-stream.js +6 -0
- package/lib/core/util/warnings.js +42 -0
- package/lib/core/version.js +1 -1
- package/lib/core/web-worker-base.js +4 -3
- package/lib/core/web-worker-inline-native.js +1 -1
- package/lib/core/web-worker-inline-wasm.js +1 -1
- package/lib/core/zip-entry.js +49 -1
- package/lib/core/zip-fs.js +43 -132
- package/lib/core/zip-reader.js +106 -48
- package/lib/core/zip-writer.js +236 -54
- package/lib/zip-core-base.js +9 -3
- package/lib/zip-core-reader.js +2 -0
- package/lib/zip-core-writer.js +6 -1
- package/lib/zip-module-wasm-base.js +2 -2
- package/package.json +5 -3
package/index.cjs
CHANGED
|
@@ -128,6 +128,7 @@ const NUMBER_TYPE = "number";
|
|
|
128
128
|
const BOOLEAN_TYPE = "boolean";
|
|
129
129
|
|
|
130
130
|
const EMPTY_UINT8_ARRAY = new Uint8Array();
|
|
131
|
+
const SYMBOL_ASYNC_DISPOSE = Symbol.asyncDispose || Symbol();
|
|
131
132
|
|
|
132
133
|
/*
|
|
133
134
|
Copyright (c) 2022 Gildas Lormeau. All rights reserved.
|
|
@@ -172,6 +173,7 @@ const OPTION_CHECK_OVERLAPPING_ENTRY_ONLY = "checkOverlappingEntryOnly";
|
|
|
172
173
|
const OPTION_CHECK_OVERLAPPING_ENTRY = "checkOverlappingEntry";
|
|
173
174
|
const OPTION_CHECK_AMBIGUITY = "checkAmbiguity";
|
|
174
175
|
const OPTION_CHECK_LOCAL_DIRECTORY = "checkLocalDirectory";
|
|
176
|
+
const OPTION_CHECK_LOCAL_FILENAME = "checkLocalFilename";
|
|
175
177
|
const OPTION_CHECK_SIGNATURE = "checkSignature";
|
|
176
178
|
const OPTION_CHECK_CRC32 = "checkCrc32";
|
|
177
179
|
const OPTION_CHECK_AUTHENTICATION_CODE = "checkAuthenticationCode";
|
|
@@ -202,15 +204,18 @@ const OPTION_NORMALIZE_FILENAME = "normalizeFilename";
|
|
|
202
204
|
const OPTION_MAX_APPENDED_DATA_SIZE = "maxAppendedDataSize";
|
|
203
205
|
const OPTION_DECRYPT_CENTRAL_DIRECTORY = "decryptCentralDirectory";
|
|
204
206
|
const OPTION_SIGN_CENTRAL_DIRECTORY = "signCentralDirectory";
|
|
207
|
+
const OPTION_ENTRY = "entry";
|
|
205
208
|
const TEXT_TYPE_FILENAME = "filename";
|
|
206
209
|
const TEXT_TYPE_COMMENT = "comment";
|
|
207
210
|
const STRICTNESS_STRICT = "strict";
|
|
208
211
|
const STRICTNESS_BALANCED = "balanced";
|
|
209
212
|
const STRICTNESS_TOLERANT = "tolerant";
|
|
213
|
+
const PASS_THROUGH_COMPRESSED = "compressed";
|
|
210
214
|
|
|
211
215
|
const ERR_INVALID_FUNCTION_OPTION = "Invalid option (must be a function)";
|
|
212
216
|
const ERR_INVALID_SIGNAL = "Invalid signal (must be an AbortSignal instance)";
|
|
213
217
|
const ERR_INVALID_PASSWORD_TYPE = "Invalid password (password must be a string, rawPassword must be a Uint8Array)";
|
|
218
|
+
const ERR_INVALID_PASS_THROUGH_VALUE = "Invalid passThrough option (must be a boolean or 'compressed')";
|
|
214
219
|
const ERR_ABORTED = "The operation was aborted";
|
|
215
220
|
const ABORT_ERROR_NAME = "AbortError";
|
|
216
221
|
|
|
@@ -240,6 +245,13 @@ function checkPasswordOption(password, rawPassword) {
|
|
|
240
245
|
}
|
|
241
246
|
}
|
|
242
247
|
|
|
248
|
+
function checkPassThroughOption(passThrough) {
|
|
249
|
+
if (passThrough !== UNDEFINED_VALUE && typeof passThrough != BOOLEAN_TYPE && passThrough !== PASS_THROUGH_COMPRESSED) {
|
|
250
|
+
throw new Error(ERR_INVALID_PASS_THROUGH_VALUE);
|
|
251
|
+
}
|
|
252
|
+
return passThrough;
|
|
253
|
+
}
|
|
254
|
+
|
|
243
255
|
function checkInteger(value, maxValue, errorMessage) {
|
|
244
256
|
if (!Number.isInteger(value) || value < 0 || value > maxValue) {
|
|
245
257
|
throw new Error(errorMessage);
|
|
@@ -289,6 +301,8 @@ const DEFAULT_CHUNK_SIZE$1 = 64 * 1024;
|
|
|
289
301
|
const MINIMUM_CHUNK_SIZE = 64;
|
|
290
302
|
const MINIMUM_PROPERTY_VALUE = 1;
|
|
291
303
|
const ERR_INVALID_MAX_WORKERS = "Invalid maxWorkers (must be an integer greater than 0)";
|
|
304
|
+
const ERR_INVALID_BASE_URI = "Invalid baseURI (must be a string)";
|
|
305
|
+
const ERR_INVALID_URI = "Invalid URI (must be a string or a function returning a string)";
|
|
292
306
|
let maxWorkers = 2;
|
|
293
307
|
try {
|
|
294
308
|
if (typeof navigator != UNDEFINED_TYPE && navigator.hardwareConcurrency) {
|
|
@@ -313,9 +327,9 @@ const DEFAULT_CONFIGURATION = {
|
|
|
313
327
|
};
|
|
314
328
|
|
|
315
329
|
const PROPERTY_NAME_MAX_WORKERS = "maxWorkers";
|
|
330
|
+
const PROPERTY_NAME_BASE_URI = "baseURI";
|
|
316
331
|
|
|
317
|
-
const
|
|
318
|
-
"baseURI",
|
|
332
|
+
const URI_PROPERTY_NAMES = [
|
|
319
333
|
"wasmURI",
|
|
320
334
|
"workerURI"
|
|
321
335
|
];
|
|
@@ -339,7 +353,8 @@ const FUNCTION_PROPERTY_NAMES = [
|
|
|
339
353
|
"DecompressionStreamFallback"
|
|
340
354
|
];
|
|
341
355
|
const CONFIGURABLE_PROPERTY_NAMES = [
|
|
342
|
-
|
|
356
|
+
PROPERTY_NAME_BASE_URI,
|
|
357
|
+
...URI_PROPERTY_NAMES,
|
|
343
358
|
...BOOLEAN_PROPERTY_NAMES,
|
|
344
359
|
...NUMBER_PROPERTY_NAMES,
|
|
345
360
|
...FUNCTION_PROPERTY_NAMES
|
|
@@ -383,6 +398,14 @@ function checkPropertyValue(propertyName, propertyValue) {
|
|
|
383
398
|
}
|
|
384
399
|
} else if (FUNCTION_PROPERTY_NAMES.includes(propertyName)) {
|
|
385
400
|
checkFunctionOption(propertyValue);
|
|
401
|
+
} else if (propertyName == PROPERTY_NAME_BASE_URI) {
|
|
402
|
+
if (propertyValue && typeof propertyValue != STRING_TYPE) {
|
|
403
|
+
throw new Error(ERR_INVALID_BASE_URI);
|
|
404
|
+
}
|
|
405
|
+
} else if (URI_PROPERTY_NAMES.includes(propertyName)) {
|
|
406
|
+
if (propertyValue && typeof propertyValue != STRING_TYPE && typeof propertyValue != FUNCTION_TYPE) {
|
|
407
|
+
throw new Error(ERR_INVALID_URI);
|
|
408
|
+
}
|
|
386
409
|
}
|
|
387
410
|
return propertyValue;
|
|
388
411
|
}
|
|
@@ -416,7 +439,7 @@ function resetConfiguration() {
|
|
|
416
439
|
Object.assign(config, DEFAULT_CONFIGURATION);
|
|
417
440
|
}
|
|
418
441
|
|
|
419
|
-
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)}});
|
|
442
|
+
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)}});
|
|
420
443
|
|
|
421
444
|
/*
|
|
422
445
|
Copyright (c) 2026 Gildas Lormeau. All rights reserved.
|
|
@@ -2601,6 +2624,7 @@ class ChunkStream extends TransformStream {
|
|
|
2601
2624
|
constructor(chunkSize) {
|
|
2602
2625
|
const pendingChunks = [];
|
|
2603
2626
|
let pendingLength = 0;
|
|
2627
|
+
let outputSize = 0;
|
|
2604
2628
|
if (!Number.isFinite(chunkSize) || chunkSize < 1) {
|
|
2605
2629
|
chunkSize = DEFAULT_CHUNK_SIZE;
|
|
2606
2630
|
}
|
|
@@ -2609,15 +2633,20 @@ class ChunkStream extends TransformStream {
|
|
|
2609
2633
|
pendingChunks.push(chunk);
|
|
2610
2634
|
pendingLength += chunk.length;
|
|
2611
2635
|
while (pendingLength > chunkSize) {
|
|
2636
|
+
outputSize += chunkSize;
|
|
2612
2637
|
controller.enqueue(shiftChunk());
|
|
2613
2638
|
}
|
|
2614
2639
|
},
|
|
2615
2640
|
flush(controller) {
|
|
2616
2641
|
if (pendingLength) {
|
|
2642
|
+
outputSize += pendingLength;
|
|
2617
2643
|
controller.enqueue(concatChunks(pendingChunks, pendingLength));
|
|
2618
2644
|
}
|
|
2619
2645
|
}
|
|
2620
2646
|
});
|
|
2647
|
+
Object.defineProperty(this, "outputSize", {
|
|
2648
|
+
get: () => outputSize
|
|
2649
|
+
});
|
|
2621
2650
|
|
|
2622
2651
|
function shiftChunk() {
|
|
2623
2652
|
const result = new Uint8Array(chunkSize);
|
|
@@ -2822,7 +2851,7 @@ function createWorkerInterface(workerData, config) {
|
|
|
2822
2851
|
}
|
|
2823
2852
|
|
|
2824
2853
|
async function runWorker$1({ options, readable, writable, onTaskFinished }, config) {
|
|
2825
|
-
let codecStream;
|
|
2854
|
+
let codecStream, chunkStream;
|
|
2826
2855
|
try {
|
|
2827
2856
|
if (options.compressed && !options.format) {
|
|
2828
2857
|
const deflate = options.codecType.startsWith(CODEC_DEFLATE);
|
|
@@ -2845,9 +2874,10 @@ async function runWorker$1({ options, readable, writable, onTaskFinished }, conf
|
|
|
2845
2874
|
}
|
|
2846
2875
|
}
|
|
2847
2876
|
codecStream = new CodecStream(options, config);
|
|
2877
|
+
chunkStream = new ChunkStream(getChunkSize(config));
|
|
2848
2878
|
await readable
|
|
2849
2879
|
.pipeThrough(codecStream)
|
|
2850
|
-
.pipeThrough(
|
|
2880
|
+
.pipeThrough(chunkStream)
|
|
2851
2881
|
.pipeTo(writable, { preventClose: true, preventAbort: true });
|
|
2852
2882
|
const {
|
|
2853
2883
|
crc32,
|
|
@@ -2861,7 +2891,7 @@ async function runWorker$1({ options, readable, writable, onTaskFinished }, conf
|
|
|
2861
2891
|
};
|
|
2862
2892
|
} catch (error) {
|
|
2863
2893
|
if (codecStream) {
|
|
2864
|
-
error.outputSize =
|
|
2894
|
+
error.outputSize = chunkStream ? chunkStream.outputSize : 0;
|
|
2865
2895
|
}
|
|
2866
2896
|
throw error;
|
|
2867
2897
|
} finally {
|
|
@@ -2970,11 +3000,17 @@ async function runWebWorker(workerData, config) {
|
|
|
2970
3000
|
let resolveResult, rejectResult;
|
|
2971
3001
|
const result = new Promise((resolve, reject) => {
|
|
2972
3002
|
resolveResult = resolve;
|
|
2973
|
-
rejectResult =
|
|
3003
|
+
rejectResult = error => {
|
|
3004
|
+
if (error && error.outputSize === UNDEFINED_VALUE) {
|
|
3005
|
+
error.outputSize = workerData.outputSize;
|
|
3006
|
+
}
|
|
3007
|
+
reject(error);
|
|
3008
|
+
};
|
|
2974
3009
|
});
|
|
2975
3010
|
Object.assign(workerData, {
|
|
2976
3011
|
reader: null,
|
|
2977
3012
|
writer: null,
|
|
3013
|
+
outputSize: 0,
|
|
2978
3014
|
resolveResult,
|
|
2979
3015
|
rejectResult,
|
|
2980
3016
|
result
|
|
@@ -3258,8 +3294,10 @@ async function onMessage({ data }, workerData) {
|
|
|
3258
3294
|
}
|
|
3259
3295
|
}
|
|
3260
3296
|
if (type == MESSAGE_DATA) {
|
|
3297
|
+
const chunk = new Uint8Array(value);
|
|
3261
3298
|
await writer.ready;
|
|
3262
|
-
await writer.write(
|
|
3299
|
+
await writer.write(chunk);
|
|
3300
|
+
workerData.outputSize += chunk.length;
|
|
3263
3301
|
if (!stale()) {
|
|
3264
3302
|
sendMessage({ type: MESSAGE_ACK_DATA, messageId }, workerData);
|
|
3265
3303
|
}
|
|
@@ -3567,10 +3605,13 @@ function decode(value, encoding, ignoreBOM) {
|
|
|
3567
3605
|
|
|
3568
3606
|
|
|
3569
3607
|
const ERR_HTTP_STATUS = "HTTP error ";
|
|
3608
|
+
const MIN_SUCCESS_HTTP_STATUS = 200;
|
|
3609
|
+
const MAX_SUCCESS_HTTP_STATUS = 299;
|
|
3570
3610
|
const ERR_HTTP_RANGE = "HTTP Range not supported";
|
|
3571
3611
|
const ERR_HTTP_RESOURCE_CHANGED = "HTTP resource changed";
|
|
3572
3612
|
const ERR_ITERATOR_COMPLETED_TOO_SOON = "Writer iterator completed too soon";
|
|
3573
3613
|
const ERR_WRITER_NOT_INITIALIZED = "Writer not initialized";
|
|
3614
|
+
const ERR_WRITER_SIZE_NOT_WRITABLE = "Invalid writer (size must be writable)";
|
|
3574
3615
|
|
|
3575
3616
|
const CONTENT_TYPE_TEXT_PLAIN = "text/plain";
|
|
3576
3617
|
const HTTP_HEADER_CONTENT_LENGTH = "Content-Length";
|
|
@@ -3762,6 +3803,7 @@ class BlobReader extends Reader {
|
|
|
3762
3803
|
const reader = this;
|
|
3763
3804
|
const { sourceBlob, size } = reader;
|
|
3764
3805
|
const { offset = 0, size: readSize = size - offset } = options || {};
|
|
3806
|
+
// deno-lint-ignore valid-typeof
|
|
3765
3807
|
if (typeof sourceBlob.stream == FUNCTION_TYPE) {
|
|
3766
3808
|
if (!offset && readSize >= size) {
|
|
3767
3809
|
return toCompatibleReadable(sourceBlob.stream());
|
|
@@ -4168,7 +4210,7 @@ async function getContentLength(httpReader, sendRequest, getRequestData) {
|
|
|
4168
4210
|
|
|
4169
4211
|
async function sendFetchRequest(method, { fetch: fetchFunction = fetch, options, url }, headers) {
|
|
4170
4212
|
const response = await fetchFunction(url, Object.assign({}, options, { method, headers }));
|
|
4171
|
-
if (response.status
|
|
4213
|
+
if (response.status >= MIN_SUCCESS_HTTP_STATUS && response.status <= MAX_SUCCESS_HTTP_STATUS) {
|
|
4172
4214
|
return response;
|
|
4173
4215
|
} else {
|
|
4174
4216
|
throw response.status == 416 ? new Error(ERR_HTTP_RANGE) : new Error(ERR_HTTP_STATUS + (response.statusText || response.status));
|
|
@@ -4179,7 +4221,7 @@ function sendXMLHttpRequest(method, { url }, headers) {
|
|
|
4179
4221
|
return new Promise((resolve, reject) => {
|
|
4180
4222
|
const request = new XMLHttpRequest();
|
|
4181
4223
|
request.addEventListener("load", () => {
|
|
4182
|
-
if (request.status
|
|
4224
|
+
if (request.status >= MIN_SUCCESS_HTTP_STATUS && request.status <= MAX_SUCCESS_HTTP_STATUS) {
|
|
4183
4225
|
const headers = [];
|
|
4184
4226
|
request.getAllResponseHeaders().trim().split(/[\r\n]+/).forEach(header => {
|
|
4185
4227
|
const splitHeader = header.trim().split(/\s*:\s*/);
|
|
@@ -4483,8 +4525,10 @@ class GenericWriter {
|
|
|
4483
4525
|
writable: toCompatibleWritable(writer)
|
|
4484
4526
|
};
|
|
4485
4527
|
}
|
|
4486
|
-
|
|
4487
|
-
writer.size = 0;
|
|
4528
|
+
try {
|
|
4529
|
+
writer.size = writer.size === UNDEFINED_VALUE ? 0 : writer.size;
|
|
4530
|
+
} catch {
|
|
4531
|
+
throw new Error(ERR_WRITER_SIZE_NOT_WRITABLE);
|
|
4488
4532
|
}
|
|
4489
4533
|
return writer;
|
|
4490
4534
|
}
|
|
@@ -4532,6 +4576,45 @@ function createReadable(reader, options) {
|
|
|
4532
4576
|
}
|
|
4533
4577
|
}
|
|
4534
4578
|
|
|
4579
|
+
/*
|
|
4580
|
+
Copyright (c) 2026 Gildas Lormeau. All rights reserved.
|
|
4581
|
+
|
|
4582
|
+
Redistribution and use in source and binary forms, with or without
|
|
4583
|
+
modification, are permitted provided that the following conditions are met:
|
|
4584
|
+
|
|
4585
|
+
1. Redistributions of source code must retain the above copyright notice,
|
|
4586
|
+
this list of conditions and the following disclaimer.
|
|
4587
|
+
|
|
4588
|
+
2. Redistributions in binary form must reproduce the above copyright
|
|
4589
|
+
notice, this list of conditions and the following disclaimer in
|
|
4590
|
+
the documentation and/or other materials provided with the distribution.
|
|
4591
|
+
|
|
4592
|
+
3. The names of the authors may not be used to endorse or promote products
|
|
4593
|
+
derived from this software without specific prior written permission.
|
|
4594
|
+
|
|
4595
|
+
THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
|
|
4596
|
+
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
|
4597
|
+
FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
|
|
4598
|
+
INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
4599
|
+
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
4600
|
+
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
|
|
4601
|
+
OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
|
4602
|
+
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
4603
|
+
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
|
4604
|
+
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
4605
|
+
*/
|
|
4606
|
+
|
|
4607
|
+
|
|
4608
|
+
function addWarning(warnings, reason, filename) {
|
|
4609
|
+
if (!warnings.some(warning => warning.reason == reason)) {
|
|
4610
|
+
const warning = { reason };
|
|
4611
|
+
if (filename !== UNDEFINED_VALUE) {
|
|
4612
|
+
warning.filename = filename;
|
|
4613
|
+
}
|
|
4614
|
+
warnings.push(warning);
|
|
4615
|
+
}
|
|
4616
|
+
}
|
|
4617
|
+
|
|
4535
4618
|
/*
|
|
4536
4619
|
Copyright (c) 2025 Gildas Lormeau. All rights reserved.
|
|
4537
4620
|
|
|
@@ -4560,6 +4643,7 @@ function createReadable(reader, options) {
|
|
|
4560
4643
|
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
4561
4644
|
*/
|
|
4562
4645
|
|
|
4646
|
+
|
|
4563
4647
|
const PROPERTY_NAME_FILENAME = "filename";
|
|
4564
4648
|
const PROPERTY_NAME_RAW_FILENAME = "rawFilename";
|
|
4565
4649
|
const PROPERTY_NAME_COMMENT = "comment";
|
|
@@ -4684,6 +4768,38 @@ class Entry {
|
|
|
4684
4768
|
|
|
4685
4769
|
}
|
|
4686
4770
|
|
|
4771
|
+
const INTERPRETED_EXTRA_FIELD_TYPES = new Set([
|
|
4772
|
+
EXTRAFIELD_TYPE_ZIP64,
|
|
4773
|
+
EXTRAFIELD_TYPE_AES,
|
|
4774
|
+
EXTRAFIELD_TYPE_NTFS,
|
|
4775
|
+
EXTRAFIELD_TYPE_EXTENDED_TIMESTAMP,
|
|
4776
|
+
EXTRAFIELD_TYPE_UNICODE_PATH,
|
|
4777
|
+
EXTRAFIELD_TYPE_UNICODE_COMMENT,
|
|
4778
|
+
EXTRAFIELD_TYPE_USDZ,
|
|
4779
|
+
EXTRAFIELD_TYPE_INFOZIP,
|
|
4780
|
+
EXTRAFIELD_TYPE_UNIX,
|
|
4781
|
+
EXTRAFIELD_TYPE_UNIX_TYPE1,
|
|
4782
|
+
EXTRAFIELD_TYPE_PKWARE_UNIX
|
|
4783
|
+
]);
|
|
4784
|
+
|
|
4785
|
+
function getUserExtraField(extraField) {
|
|
4786
|
+
if (extraField) {
|
|
4787
|
+
const userExtraField = new Map();
|
|
4788
|
+
extraField.forEach((field, type) => {
|
|
4789
|
+
if (!INTERPRETED_EXTRA_FIELD_TYPES.has(type)) {
|
|
4790
|
+
userExtraField.set(type, field.data);
|
|
4791
|
+
}
|
|
4792
|
+
});
|
|
4793
|
+
if (userExtraField.size) {
|
|
4794
|
+
return userExtraField;
|
|
4795
|
+
}
|
|
4796
|
+
}
|
|
4797
|
+
}
|
|
4798
|
+
|
|
4799
|
+
function getEncryptionOverhead(encrypted, zipCrypto, encryptionStrength) {
|
|
4800
|
+
return encrypted ? (zipCrypto ? 12 : 16 + encryptionStrength * 4) : 0;
|
|
4801
|
+
}
|
|
4802
|
+
|
|
4687
4803
|
/*
|
|
4688
4804
|
Copyright (c) 2025 Gildas Lormeau. All rights reserved.
|
|
4689
4805
|
|
|
@@ -4743,6 +4859,8 @@ const WARNING_PREPENDED_CENTRAL_DIRECTORY = "prepended central directory";
|
|
|
4743
4859
|
const WARNING_TRAILING_CENTRAL_DIRECTORY_DATA = "trailing central directory data";
|
|
4744
4860
|
const WARNING_DUPLICATE_FILENAME = "duplicate filename";
|
|
4745
4861
|
const WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY = "mismatched zip64 end of central directory record";
|
|
4862
|
+
const WARNING_MULTIPLE_END_OF_CENTRAL_DIRECTORY = "multiple end of central directory records";
|
|
4863
|
+
const WARNING_MISMATCHED_LOCAL_FILE_HEADER_FILENAME = "mismatched local file header (filename)";
|
|
4746
4864
|
const WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG = "mismatched local file header (general purpose bit flag)";
|
|
4747
4865
|
const WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD = "mismatched local file header (compression method)";
|
|
4748
4866
|
const WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES = "mismatched local file header (crc32 or sizes)";
|
|
@@ -4813,7 +4931,7 @@ class ZipReader {
|
|
|
4813
4931
|
}
|
|
4814
4932
|
}
|
|
4815
4933
|
if (rejectAmbiguousEndOfDirectory && endOfDirectoryReachingEndCount > 1) {
|
|
4816
|
-
throwAmbiguousArchive(
|
|
4934
|
+
throwAmbiguousArchive(WARNING_MULTIPLE_END_OF_CENTRAL_DIRECTORY);
|
|
4817
4935
|
}
|
|
4818
4936
|
const endOfDirectoryView = getDataView(endOfDirectoryInfo);
|
|
4819
4937
|
let directoryDataLength = getUint32$1(endOfDirectoryView, 12);
|
|
@@ -5111,7 +5229,8 @@ class ZipReader {
|
|
|
5111
5229
|
const writer = new TransformStream();
|
|
5112
5230
|
const arrayBufferPromise = streamToBlob(writer.readable).then(blob => blob.arrayBuffer());
|
|
5113
5231
|
arrayBufferPromise.catch(() => { });
|
|
5114
|
-
await fileEntry.getData(writer, entry, zipReader.readRanges,
|
|
5232
|
+
await fileEntry.getData(writer, entry, zipReader.readRanges,
|
|
5233
|
+
Object.assign({}, options, { preventClose: false }));
|
|
5115
5234
|
return arrayBufferPromise;
|
|
5116
5235
|
};
|
|
5117
5236
|
offset = endOffset;
|
|
@@ -5192,49 +5311,101 @@ class ZipReader {
|
|
|
5192
5311
|
await reader.readable.cancel();
|
|
5193
5312
|
}
|
|
5194
5313
|
}
|
|
5314
|
+
|
|
5315
|
+
[SYMBOL_ASYNC_DISPOSE]() {
|
|
5316
|
+
return this.close();
|
|
5317
|
+
}
|
|
5195
5318
|
}
|
|
5196
5319
|
|
|
5197
5320
|
class ZipReaderStream {
|
|
5198
5321
|
|
|
5199
5322
|
constructor(options = {}) {
|
|
5200
|
-
|
|
5201
|
-
const
|
|
5323
|
+
let sourceController;
|
|
5324
|
+
const { readable, writable } = new TransformStream({
|
|
5325
|
+
start(controller) {
|
|
5326
|
+
sourceController = controller;
|
|
5327
|
+
}
|
|
5328
|
+
});
|
|
5329
|
+
const zipReader = new ZipReader(readable, options);
|
|
5330
|
+
const gen = zipReader.getEntriesGenerator();
|
|
5331
|
+
const pendingEntries = new Set();
|
|
5202
5332
|
this.readable = new ReadableStream({
|
|
5203
5333
|
async pull(controller) {
|
|
5204
5334
|
const { done, value } = await gen.next();
|
|
5205
5335
|
if (done)
|
|
5206
5336
|
return controller.close();
|
|
5207
|
-
const
|
|
5208
|
-
const { readable, writable } = new TransformStream();
|
|
5209
|
-
if (value.getData) {
|
|
5210
|
-
getData();
|
|
5211
|
-
return readable;
|
|
5212
|
-
}
|
|
5213
|
-
|
|
5214
|
-
async function getData() {
|
|
5215
|
-
try {
|
|
5216
|
-
await value.getData(writable);
|
|
5217
|
-
} catch (error) {
|
|
5218
|
-
try {
|
|
5219
|
-
await writable.abort(error);
|
|
5220
|
-
} catch {
|
|
5221
|
-
// ignored
|
|
5222
|
-
}
|
|
5223
|
-
}
|
|
5224
|
-
}
|
|
5225
|
-
})();
|
|
5337
|
+
const entryStream = createEntryStream(value, pendingEntries);
|
|
5226
5338
|
const chunk = {
|
|
5227
5339
|
...value,
|
|
5228
|
-
readable:
|
|
5340
|
+
readable: entryStream.readable
|
|
5229
5341
|
};
|
|
5230
5342
|
delete chunk.getData;
|
|
5343
|
+
Object.defineProperties(chunk, {
|
|
5344
|
+
localDirectory: {
|
|
5345
|
+
get: () => value.localDirectory,
|
|
5346
|
+
enumerable: true
|
|
5347
|
+
},
|
|
5348
|
+
warnings: {
|
|
5349
|
+
get: () => value.warnings,
|
|
5350
|
+
enumerable: true
|
|
5351
|
+
}
|
|
5352
|
+
});
|
|
5231
5353
|
controller.enqueue(chunk);
|
|
5354
|
+
},
|
|
5355
|
+
async cancel(reason) {
|
|
5356
|
+
const entryStreams = Array.from(pendingEntries);
|
|
5357
|
+
pendingEntries.clear();
|
|
5358
|
+
sourceController.error(reason);
|
|
5359
|
+
await Promise.allSettled(entryStreams.map(entryStream => entryStream.cancel(reason)));
|
|
5360
|
+
await Promise.allSettled([gen.return(), zipReader.close()]);
|
|
5232
5361
|
}
|
|
5233
5362
|
});
|
|
5234
5363
|
this.writable = writable;
|
|
5235
5364
|
}
|
|
5236
5365
|
}
|
|
5237
5366
|
|
|
5367
|
+
function createEntryStream(entry, pendingEntries) {
|
|
5368
|
+
const { readable, writable } = new TransformStream();
|
|
5369
|
+
let dataReader;
|
|
5370
|
+
const entryStream = {
|
|
5371
|
+
cancel: async reason => {
|
|
5372
|
+
pendingEntries.delete(entryStream);
|
|
5373
|
+
await (dataReader ? dataReader.cancel(reason) : readable.cancel(reason));
|
|
5374
|
+
}
|
|
5375
|
+
};
|
|
5376
|
+
entryStream.readable = new ReadableStream({
|
|
5377
|
+
async pull(controller) {
|
|
5378
|
+
if (!dataReader) {
|
|
5379
|
+
dataReader = readable.getReader();
|
|
5380
|
+
pendingEntries.add(entryStream);
|
|
5381
|
+
getData();
|
|
5382
|
+
}
|
|
5383
|
+
const { done, value } = await dataReader.read();
|
|
5384
|
+
if (done) {
|
|
5385
|
+
controller.close();
|
|
5386
|
+
} else {
|
|
5387
|
+
controller.enqueue(value);
|
|
5388
|
+
}
|
|
5389
|
+
},
|
|
5390
|
+
cancel: reason => entryStream.cancel(reason)
|
|
5391
|
+
}, { highWaterMark: 0 });
|
|
5392
|
+
return entryStream;
|
|
5393
|
+
|
|
5394
|
+
async function getData() {
|
|
5395
|
+
try {
|
|
5396
|
+
await entry.getData(writable, { preventClose: false });
|
|
5397
|
+
} catch (error) {
|
|
5398
|
+
try {
|
|
5399
|
+
await writable.abort(error);
|
|
5400
|
+
} catch {
|
|
5401
|
+
// ignored
|
|
5402
|
+
}
|
|
5403
|
+
} finally {
|
|
5404
|
+
pendingEntries.delete(entryStream);
|
|
5405
|
+
}
|
|
5406
|
+
}
|
|
5407
|
+
}
|
|
5408
|
+
|
|
5238
5409
|
async function isZipFile(reader, options = {}) {
|
|
5239
5410
|
reader = new GenericReader(reader);
|
|
5240
5411
|
await initStream(reader);
|
|
@@ -5294,7 +5465,9 @@ let ZipEntry$1 = class ZipEntry {
|
|
|
5294
5465
|
const dataView = getDataView(dataArray);
|
|
5295
5466
|
let password = getOptionValue$1(zipEntry, options, OPTION_PASSWORD);
|
|
5296
5467
|
let rawPassword = getOptionValue$1(zipEntry, options, OPTION_RAW_PASSWORD);
|
|
5297
|
-
const passThrough = getOptionValue$1(zipEntry, options, OPTION_PASS_THROUGH);
|
|
5468
|
+
const passThrough = checkPassThroughOption(getOptionValue$1(zipEntry, options, OPTION_PASS_THROUGH));
|
|
5469
|
+
const passThroughCompression = Boolean(passThrough);
|
|
5470
|
+
const passThroughEncryption = passThrough === true;
|
|
5298
5471
|
checkPasswordOption(password, rawPassword);
|
|
5299
5472
|
password = password && password.length && password;
|
|
5300
5473
|
rawPassword = rawPassword && rawPassword.length && rawPassword;
|
|
@@ -5315,7 +5488,9 @@ let ZipEntry$1 = class ZipEntry {
|
|
|
5315
5488
|
const checkLocalDirectoryOption = getOptionValue$1(zipEntry, options, OPTION_CHECK_LOCAL_DIRECTORY);
|
|
5316
5489
|
const entryStrictness = getStrictness(options, zipEntry.options);
|
|
5317
5490
|
const checkLocalDirectory = getCheckLocalDirectory(checkLocalDirectoryOption, entryStrictness);
|
|
5318
|
-
const
|
|
5491
|
+
const checkLocalFilenameOption = getOptionValue$1(zipEntry, options, OPTION_CHECK_LOCAL_FILENAME);
|
|
5492
|
+
const checkLocalFilename = getCheckLocalFilename(
|
|
5493
|
+
checkLocalFilenameOption === UNDEFINED_VALUE ? checkLocalDirectoryOption : checkLocalFilenameOption, entryStrictness);
|
|
5319
5494
|
let rawLocalFilename = EMPTY_UINT8_ARRAY;
|
|
5320
5495
|
if (checkLocalFilename && (filenameLength || extraFieldLength)) {
|
|
5321
5496
|
const trailingDataArray = await readUint8Array(reader, localHeaderOffset + HEADER_SIZE, filenameLength + extraFieldLength);
|
|
@@ -5346,16 +5521,17 @@ let ZipEntry$1 = class ZipEntry {
|
|
|
5346
5521
|
if (gid !== UNDEFINED_VALUE && fileEntry.gid === UNDEFINED_VALUE) {
|
|
5347
5522
|
fileEntry.gid = gid;
|
|
5348
5523
|
}
|
|
5349
|
-
const
|
|
5524
|
+
const checkPasswordOnly = getOptionValue$1(zipEntry, options, OPTION_CHECK_PASSWORD_ONLY);
|
|
5525
|
+
const encrypted = zipEntry.encrypted && localDirectory.encrypted && (!passThroughEncryption || checkPasswordOnly);
|
|
5350
5526
|
const zipCrypto = encrypted && !extraFieldAES;
|
|
5351
|
-
if (!
|
|
5527
|
+
if (!passThroughEncryption) {
|
|
5352
5528
|
fileEntry.zipCrypto = zipCrypto;
|
|
5353
5529
|
}
|
|
5354
5530
|
if (encrypted && (localDirectory.rawBitFlag & BITFLAG_STRONG_ENCRYPTION) == BITFLAG_STRONG_ENCRYPTION) {
|
|
5355
5531
|
throw new Error(ERR_UNSUPPORTED_ENCRYPTION);
|
|
5356
5532
|
}
|
|
5357
|
-
const registeredCodec =
|
|
5358
|
-
if (compressionMethod != COMPRESSION_METHOD_STORE && compressionMethod != COMPRESSION_METHOD_DEFLATE && compressionMethod != COMPRESSION_METHOD_DEFLATE_64 && !registeredCodec && !
|
|
5533
|
+
const registeredCodec = passThroughCompression ? UNDEFINED_VALUE : getRegisteredCodec(compressionMethod);
|
|
5534
|
+
if (compressionMethod != COMPRESSION_METHOD_STORE && compressionMethod != COMPRESSION_METHOD_DEFLATE && compressionMethod != COMPRESSION_METHOD_DEFLATE_64 && !registeredCodec && !passThroughCompression) {
|
|
5359
5535
|
throw new Error(ERR_UNSUPPORTED_COMPRESSION);
|
|
5360
5536
|
}
|
|
5361
5537
|
if (encrypted) {
|
|
@@ -5372,15 +5548,16 @@ let ZipEntry$1 = class ZipEntry {
|
|
|
5372
5548
|
const readable = toCompatibleReadable(reader.createReadable({ offset: dataOffset, size }));
|
|
5373
5549
|
const signal = checkSignalOption(getOptionValue$1(zipEntry, options, OPTION_SIGNAL));
|
|
5374
5550
|
throwIfAborted(signal);
|
|
5375
|
-
const checkPasswordOnly = getOptionValue$1(zipEntry, options, OPTION_CHECK_PASSWORD_ONLY);
|
|
5376
5551
|
let checkOverlappingEntry = getOptionValue$1(zipEntry, options, OPTION_CHECK_OVERLAPPING_ENTRY);
|
|
5377
5552
|
const checkOverlappingEntryOnly = getOptionValue$1(zipEntry, options, OPTION_CHECK_OVERLAPPING_ENTRY_ONLY);
|
|
5378
5553
|
if (checkOverlappingEntryOnly) {
|
|
5379
5554
|
checkOverlappingEntry = true;
|
|
5380
5555
|
}
|
|
5381
5556
|
const { onstart, onprogress, onend } = options;
|
|
5382
|
-
const compressed = compressionMethod != COMPRESSION_METHOD_STORE && !
|
|
5383
|
-
const outputSize =
|
|
5557
|
+
const compressed = compressionMethod != COMPRESSION_METHOD_STORE && !passThroughCompression;
|
|
5558
|
+
const outputSize = passThroughCompression ?
|
|
5559
|
+
compressedSize - getEncryptionOverhead(encrypted, zipCrypto, extraFieldAES && extraFieldAES.strength) :
|
|
5560
|
+
uncompressedSize;
|
|
5384
5561
|
const deflate64 = compressionMethod == COMPRESSION_METHOD_DEFLATE_64;
|
|
5385
5562
|
let useCompressionStream = getOptionValue$1(zipEntry, options, OPTION_USE_COMPRESSION_STREAM);
|
|
5386
5563
|
if (deflate64) {
|
|
@@ -5389,7 +5566,7 @@ let ZipEntry$1 = class ZipEntry {
|
|
|
5389
5566
|
const checkCrc32Option = getOptionValue$1(zipEntry, options, OPTION_CHECK_CRC32);
|
|
5390
5567
|
const checkCrc32 = (checkCrc32Option === UNDEFINED_VALUE ?
|
|
5391
5568
|
getOptionValue$1(zipEntry, options, OPTION_CHECK_SIGNATURE) :
|
|
5392
|
-
checkCrc32Option) && !
|
|
5569
|
+
checkCrc32Option) && !passThroughCompression &&
|
|
5393
5570
|
(!encrypted || zipCrypto || (extraFieldAES && extraFieldAES.vendorVersion == VENDOR_VERSION_AE_1$1));
|
|
5394
5571
|
const workerOptions = {
|
|
5395
5572
|
options: {
|
|
@@ -5443,10 +5620,10 @@ let ZipEntry$1 = class ZipEntry {
|
|
|
5443
5620
|
await initStream(writer, getDecodableOutputSize(outputSize, compressedSize, compressed));
|
|
5444
5621
|
({ writable } = writer);
|
|
5445
5622
|
const { outputSize: writtenSize } = await runWorker({ readable, writable }, workerOptions);
|
|
5446
|
-
writer.size += writtenSize;
|
|
5447
5623
|
if (writtenSize != outputSize) {
|
|
5448
|
-
throw new Error(ERR_INVALID_UNCOMPRESSED_SIZE);
|
|
5624
|
+
throw Object.assign(new Error(ERR_INVALID_UNCOMPRESSED_SIZE), { outputSize: writtenSize });
|
|
5449
5625
|
}
|
|
5626
|
+
writer.size += writtenSize;
|
|
5450
5627
|
}
|
|
5451
5628
|
} catch (error) {
|
|
5452
5629
|
if (error.outputSize !== UNDEFINED_VALUE) {
|
|
@@ -6112,7 +6289,7 @@ function validateLocalDirectory(zipEntry, localDirectory, rawLocalFilename, chec
|
|
|
6112
6289
|
if (checkLocalFilename && !maskedLocalDirectory &&
|
|
6113
6290
|
(rawLocalFilename.length != rawFilename.length ||
|
|
6114
6291
|
rawLocalFilename.some((byteValue, indexByte) => byteValue != rawFilename[indexByte]))) {
|
|
6115
|
-
reportAmbiguity(reject, warnings,
|
|
6292
|
+
reportAmbiguity(reject, warnings, WARNING_MISMATCHED_LOCAL_FILE_HEADER_FILENAME);
|
|
6116
6293
|
}
|
|
6117
6294
|
if ((localDirectory.rawBitFlag & BITFLAG_AMBIGUITY_MASK) != (zipEntry.rawBitFlag & BITFLAG_AMBIGUITY_MASK)) {
|
|
6118
6295
|
reportAmbiguity(reject, warnings, WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG);
|
|
@@ -6137,16 +6314,6 @@ function reportAmbiguity(reject, warnings, reason) {
|
|
|
6137
6314
|
}
|
|
6138
6315
|
}
|
|
6139
6316
|
|
|
6140
|
-
function addWarning(warnings, reason, filename) {
|
|
6141
|
-
if (!warnings.some(warning => warning.reason == reason)) {
|
|
6142
|
-
const warning = { reason };
|
|
6143
|
-
if (filename !== UNDEFINED_VALUE) {
|
|
6144
|
-
warning.filename = filename;
|
|
6145
|
-
}
|
|
6146
|
-
warnings.push(warning);
|
|
6147
|
-
}
|
|
6148
|
-
}
|
|
6149
|
-
|
|
6150
6317
|
function throwAmbiguousArchive(reason) {
|
|
6151
6318
|
const error = new Error(ERR_AMBIGUOUS_ARCHIVE);
|
|
6152
6319
|
error.reason = reason;
|
|
@@ -6226,7 +6393,9 @@ var zipReader = /*#__PURE__*/Object.freeze({
|
|
|
6226
6393
|
WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG: WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG,
|
|
6227
6394
|
WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD: WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD,
|
|
6228
6395
|
WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES: WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES,
|
|
6396
|
+
WARNING_MISMATCHED_LOCAL_FILE_HEADER_FILENAME: WARNING_MISMATCHED_LOCAL_FILE_HEADER_FILENAME,
|
|
6229
6397
|
WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY: WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY,
|
|
6398
|
+
WARNING_MULTIPLE_END_OF_CENTRAL_DIRECTORY: WARNING_MULTIPLE_END_OF_CENTRAL_DIRECTORY,
|
|
6230
6399
|
WARNING_PREPENDED_CENTRAL_DIRECTORY: WARNING_PREPENDED_CENTRAL_DIRECTORY,
|
|
6231
6400
|
WARNING_PREPENDED_DATA: WARNING_PREPENDED_DATA,
|
|
6232
6401
|
WARNING_TRAILING_CENTRAL_DIRECTORY_DATA: WARNING_TRAILING_CENTRAL_DIRECTORY_DATA,
|
|
@@ -6279,7 +6448,7 @@ const ERR_INVALID_VERSION = "Version exceeds 65535";
|
|
|
6279
6448
|
const ERR_INVALID_ENCRYPTION_STRENGTH = "The strength must equal 1, 2, or 3";
|
|
6280
6449
|
const ERR_UNSUPPORTED_ENCRYPTION_USDZ = "Encryption is not supported in USDZ files";
|
|
6281
6450
|
const ERR_UNSUPPORTED_SPLIT_USDZ = "Split zip files are not supported in USDZ files";
|
|
6282
|
-
const ERR_UNSUPPORTED_ENCRYPTION_PASS_THROUGH = "Encryption is not supported when the 'passThrough' option is set";
|
|
6451
|
+
const ERR_UNSUPPORTED_ENCRYPTION_PASS_THROUGH = "Encryption is not supported when the 'passThrough' option is set to true (use 'compressed' instead)";
|
|
6283
6452
|
const ERR_INVALID_EXTRAFIELD = "Invalid extra field (must be a Map)";
|
|
6284
6453
|
const ERR_INVALID_EXTRAFIELD_TYPE = "Invalid extra field type (must be integer 0..65535)";
|
|
6285
6454
|
const ERR_INVALID_EXTRAFIELD_DATA_TYPE = "Invalid extra field data (must be a Uint8Array)";
|
|
@@ -6291,6 +6460,7 @@ const MAX_NTFS_TIME = BigInt("0x7fffffffffffffff");
|
|
|
6291
6460
|
const ERR_UNSUPPORTED_FORMAT = "Zip64 is not supported (set the 'zip64' option to 'true')";
|
|
6292
6461
|
const ERR_UNDEFINED_UNCOMPRESSED_SIZE = "Undefined uncompressed size";
|
|
6293
6462
|
const ERR_UNDEFINED_COMPRESSION_METHOD = "Undefined compression method";
|
|
6463
|
+
const ERR_UNDEFINED_CRC32 = "Undefined CRC32";
|
|
6294
6464
|
const ERR_UNDETERMINED_SIZE = "Undetermined size";
|
|
6295
6465
|
const ERR_UNDEFINED_READER = "Undefined reader";
|
|
6296
6466
|
const ERR_INVALID_READER = "Invalid reader (must be a Reader instance, a ReadableStream instance, or an object with a 'readable' property)";
|
|
@@ -6304,14 +6474,21 @@ const ERR_INVALID_MSDOS_ATTRIBUTES = "Invalid msdosAttributesRaw (must be intege
|
|
|
6304
6474
|
const ERR_INVALID_MSDOS_DATA = "Invalid msdosAttributes (must be an object with boolean flags)";
|
|
6305
6475
|
const ERR_INVALID_LEVEL = "Invalid level (must be integer 0..9)";
|
|
6306
6476
|
const ERR_INVALID_SIGNATURE_DATA = "Signature data exceeds 64KB";
|
|
6477
|
+
const ERR_INVALID_ENTRY = "Invalid entry option (must be an entry returned by ZipReader#getEntries())";
|
|
6478
|
+
const ERR_ZIP_CRYPTO_LAST_MOD_DATE = "The last modification date of an entry encrypted with ZipCrypto cannot be changed when passThrough is set";
|
|
6479
|
+
const WARNING_COMPRESSION_UNAVAILABLE = "compression unavailable";
|
|
6480
|
+
const WARNING_CLAMPED_LAST_MODIFICATION_DATE = "clamped last modification date";
|
|
6307
6481
|
|
|
6308
6482
|
const EXTRAFIELD_DATA_AES = new Uint8Array([0x07, 0x00, 0x02, 0x00, 0x41, 0x45, 0x03, 0x00, 0x00]);
|
|
6309
6483
|
const EXTRAFIELD_OFFSET_AES_VENDOR_VERSION = 4;
|
|
6310
6484
|
const EXTRAFIELD_OFFSET_AES_COMPRESSION_METHOD = 9;
|
|
6311
6485
|
const EXTRAFIELD_USDZ_MAX_LENGTH = 67;
|
|
6486
|
+
const MIN_PRINTABLE_ASCII_CHARACTER_CODE = 0x20;
|
|
6487
|
+
const MAX_PRINTABLE_ASCII_CHARACTER_CODE = 0x7e;
|
|
6312
6488
|
const VENDOR_VERSION_AE_1 = 1;
|
|
6313
|
-
const INFOZIP_EXTRA_FIELD_TYPE
|
|
6489
|
+
const INFOZIP_EXTRA_FIELD_TYPE = "infozip";
|
|
6314
6490
|
const UNIX_EXTRA_FIELD_TYPE = "unix";
|
|
6491
|
+
const LEVEL_BY_BITFLAG_LEVEL = [8, 9, 5, 3];
|
|
6315
6492
|
const MAX_LEVEL = 9;
|
|
6316
6493
|
|
|
6317
6494
|
let workers = 0;
|
|
@@ -6338,9 +6515,11 @@ class ZipWriter {
|
|
|
6338
6515
|
initialOffset: options[OPTION_OFFSET] === UNDEFINED_VALUE ? 0 : options[OPTION_OFFSET] - (writer.size || writer.writable.size || 0),
|
|
6339
6516
|
pendingAddFileCalls: new Set(),
|
|
6340
6517
|
pendingErrors: [],
|
|
6518
|
+
warnings: [],
|
|
6341
6519
|
bufferedWrites: 0,
|
|
6342
6520
|
directWrites: 0,
|
|
6343
|
-
lastFileEntry: UNDEFINED_VALUE
|
|
6521
|
+
lastFileEntry: UNDEFINED_VALUE,
|
|
6522
|
+
archiveClosed: false
|
|
6344
6523
|
});
|
|
6345
6524
|
}
|
|
6346
6525
|
|
|
@@ -6505,6 +6684,9 @@ class ZipWriter {
|
|
|
6505
6684
|
const zipWriter = this;
|
|
6506
6685
|
const { pendingAddFileCalls, writer } = this;
|
|
6507
6686
|
const { writable } = writer;
|
|
6687
|
+
if (zipWriter.archiveClosed) {
|
|
6688
|
+
return getWriterData(writer);
|
|
6689
|
+
}
|
|
6508
6690
|
if (!(comment instanceof Uint8Array)) {
|
|
6509
6691
|
throw new Error(ERR_INVALID_COMMENT_TYPE);
|
|
6510
6692
|
}
|
|
@@ -6528,11 +6710,16 @@ class ZipWriter {
|
|
|
6528
6710
|
throw error;
|
|
6529
6711
|
}
|
|
6530
6712
|
await closeFile(zipWriter, comment, options);
|
|
6713
|
+
zipWriter.archiveClosed = true;
|
|
6531
6714
|
const preventClose = !ownsWritable(writer) && getOptionValue(zipWriter, options, OPTION_PREVENT_CLOSE);
|
|
6532
6715
|
if (!preventClose) {
|
|
6533
6716
|
await writable.getWriter().close();
|
|
6534
6717
|
}
|
|
6535
|
-
return writer
|
|
6718
|
+
return getWriterData(writer);
|
|
6719
|
+
}
|
|
6720
|
+
|
|
6721
|
+
[SYMBOL_ASYNC_DISPOSE]() {
|
|
6722
|
+
return this.close();
|
|
6536
6723
|
}
|
|
6537
6724
|
}
|
|
6538
6725
|
|
|
@@ -6611,6 +6798,10 @@ class WatchedPromise extends Promise {
|
|
|
6611
6798
|
}
|
|
6612
6799
|
}
|
|
6613
6800
|
|
|
6801
|
+
function getWriterData(writer) {
|
|
6802
|
+
return writer.getData ? writer.getData() : writer.writable;
|
|
6803
|
+
}
|
|
6804
|
+
|
|
6614
6805
|
function watchPromiseError(zipWriter, promise) {
|
|
6615
6806
|
const watchedPromise = new WatchedPromise((resolve, reject) => Promise.prototype.then.call(promise, resolve, reject));
|
|
6616
6807
|
const watcher = {};
|
|
@@ -6629,6 +6820,14 @@ async function prependZipEntries(zipWriter, reader) {
|
|
|
6629
6820
|
|
|
6630
6821
|
async function addFileEntry(zipWriter, name, reader, options) {
|
|
6631
6822
|
options = Object.assign({}, options);
|
|
6823
|
+
const entry = options[OPTION_ENTRY];
|
|
6824
|
+
if (entry !== UNDEFINED_VALUE) {
|
|
6825
|
+
const { entryOptions, passThroughOptions } = getSourceEntryOptions(entry,
|
|
6826
|
+
checkPassThroughOption(getOptionValue(zipWriter, options, OPTION_PASS_THROUGH)),
|
|
6827
|
+
getOptionValue(zipWriter, options, PROPERTY_NAME_LAST_MODIFICATION_DATE));
|
|
6828
|
+
delete options[OPTION_ENTRY];
|
|
6829
|
+
options = Object.assign(entryOptions, passThroughOptions, options);
|
|
6830
|
+
}
|
|
6632
6831
|
if (getOptionValue(zipWriter, options, PROPERTY_NAME_DIRECTORY) && !name.endsWith(DIRECTORY_SIGNATURE)) {
|
|
6633
6832
|
name += DIRECTORY_SIGNATURE;
|
|
6634
6833
|
}
|
|
@@ -6693,21 +6892,33 @@ async function addFile(zipWriter, name, reader, options) {
|
|
|
6693
6892
|
try {
|
|
6694
6893
|
const { resolvedOptions } = metadataInfo;
|
|
6695
6894
|
if (resolvedOptions.level != 0 && resolvedOptions.compressionMethod === UNDEFINED_VALUE &&
|
|
6696
|
-
!resolvedOptions.
|
|
6895
|
+
!resolvedOptions.passThroughCompression && !(await supportsDeflate(getConfiguration()))) {
|
|
6697
6896
|
resolvedOptions.level = 0;
|
|
6897
|
+
addWarning(zipWriter.warnings, WARNING_COMPRESSION_UNAVAILABLE, name);
|
|
6698
6898
|
}
|
|
6699
6899
|
const sizesInfo = await resolveSizes(zipWriter, reader, metadataInfo, options);
|
|
6700
6900
|
({ reader } = sizesInfo);
|
|
6701
6901
|
const diskOffset = getDiskOffset(zipWriter.writer);
|
|
6702
6902
|
const diskNumber = getDiskNumber(zipWriter.writer);
|
|
6903
|
+
let crc32 = options.crc32 === UNDEFINED_VALUE ? options[PROPERTY_NAME_SIGNATURE] : options.crc32;
|
|
6904
|
+
const storesAE2 = sizesInfo.resolvedOptions.encrypted && !resolvedOptions.zipCrypto;
|
|
6905
|
+
if (resolvedOptions.passThroughCompression && !resolvedOptions.passThroughEncryption && storesAE2) {
|
|
6906
|
+
crc32 = UNDEFINED_VALUE;
|
|
6907
|
+
}
|
|
6908
|
+
if (resolvedOptions.passThroughCompression && reader && !storesAE2 && crc32 === UNDEFINED_VALUE) {
|
|
6909
|
+
throw new Error(ERR_UNDEFINED_CRC32);
|
|
6910
|
+
}
|
|
6703
6911
|
options = Object.assign({}, options, attributesInfo.resolvedOptions, metadataInfo.resolvedOptions, sizesInfo.resolvedOptions, {
|
|
6704
6912
|
signature: options[PROPERTY_NAME_SIGNATURE],
|
|
6705
|
-
crc32
|
|
6913
|
+
crc32,
|
|
6706
6914
|
offset: zipWriter.offset - diskOffset,
|
|
6707
6915
|
diskNumberStart: diskNumber,
|
|
6708
6916
|
[OPTION_USDZ]: zipWriter.options[OPTION_USDZ]
|
|
6709
6917
|
});
|
|
6710
6918
|
const headerInfo = getHeaderInfo(options);
|
|
6919
|
+
if (headerInfo.lastModDateClamped) {
|
|
6920
|
+
addWarning(zipWriter.warnings, WARNING_CLAMPED_LAST_MODIFICATION_DATE, name);
|
|
6921
|
+
}
|
|
6711
6922
|
const dataDescriptorInfo = getDataDescriptorInfo(options);
|
|
6712
6923
|
const metadataSize = getLength(headerInfo.localHeaderArray, dataDescriptorInfo.dataDescriptorArray);
|
|
6713
6924
|
fileEntry = await getFileEntry(zipWriter, name, reader, {
|
|
@@ -6734,6 +6945,95 @@ async function addFile(zipWriter, name, reader, options) {
|
|
|
6734
6945
|
return new Entry(fileEntry);
|
|
6735
6946
|
}
|
|
6736
6947
|
|
|
6948
|
+
function getSourceEntryOptions(entry, passThrough, lastModDateOverride) {
|
|
6949
|
+
if (entry === null || typeof entry != OBJECT_TYPE || Array.isArray(entry)) {
|
|
6950
|
+
throw new Error(ERR_INVALID_ENTRY);
|
|
6951
|
+
}
|
|
6952
|
+
const {
|
|
6953
|
+
externalFileAttributes,
|
|
6954
|
+
versionMadeBy,
|
|
6955
|
+
comment,
|
|
6956
|
+
lastModDate,
|
|
6957
|
+
rawLastModDate,
|
|
6958
|
+
creationDate,
|
|
6959
|
+
lastAccessDate,
|
|
6960
|
+
uncompressedSize,
|
|
6961
|
+
encrypted,
|
|
6962
|
+
zipCrypto,
|
|
6963
|
+
crc32,
|
|
6964
|
+
compressionMethod,
|
|
6965
|
+
extraFieldAES,
|
|
6966
|
+
extraFieldUnix,
|
|
6967
|
+
internalFileAttributes,
|
|
6968
|
+
extraField,
|
|
6969
|
+
bitFlag,
|
|
6970
|
+
directory,
|
|
6971
|
+
uid,
|
|
6972
|
+
gid
|
|
6973
|
+
} = entry;
|
|
6974
|
+
const entryOptions = {
|
|
6975
|
+
externalFileAttributes,
|
|
6976
|
+
versionMadeBy,
|
|
6977
|
+
comment,
|
|
6978
|
+
lastModDate,
|
|
6979
|
+
creationDate,
|
|
6980
|
+
lastAccessDate,
|
|
6981
|
+
internalFileAttributes,
|
|
6982
|
+
directory
|
|
6983
|
+
};
|
|
6984
|
+
if (bitFlag && bitFlag.languageEncodingFlag) {
|
|
6985
|
+
entryOptions[OPTION_USE_UNICODE_FILE_NAMES] = true;
|
|
6986
|
+
}
|
|
6987
|
+
const userExtraField = getUserExtraField(extraField);
|
|
6988
|
+
if (userExtraField) {
|
|
6989
|
+
entryOptions[PROPERTY_NAME_EXTRA_FIELD] = userExtraField;
|
|
6990
|
+
}
|
|
6991
|
+
if (uid !== UNDEFINED_VALUE || gid !== UNDEFINED_VALUE) {
|
|
6992
|
+
Object.assign(entryOptions, {
|
|
6993
|
+
uid,
|
|
6994
|
+
gid,
|
|
6995
|
+
unixExtraFieldType: extraFieldUnix ? UNIX_EXTRA_FIELD_TYPE : INFOZIP_EXTRA_FIELD_TYPE
|
|
6996
|
+
});
|
|
6997
|
+
}
|
|
6998
|
+
const passThroughOptions = {};
|
|
6999
|
+
if (passThrough && !directory) {
|
|
7000
|
+
Object.assign(passThroughOptions, {
|
|
7001
|
+
uncompressedSize,
|
|
7002
|
+
crc32,
|
|
7003
|
+
compressionMethod
|
|
7004
|
+
});
|
|
7005
|
+
if (passThrough !== PASS_THROUGH_COMPRESSED) {
|
|
7006
|
+
Object.assign(passThroughOptions, {
|
|
7007
|
+
encrypted,
|
|
7008
|
+
zipCrypto,
|
|
7009
|
+
encryptionStrength: extraFieldAES ? extraFieldAES.strength : UNDEFINED_VALUE
|
|
7010
|
+
});
|
|
7011
|
+
}
|
|
7012
|
+
if (bitFlag) {
|
|
7013
|
+
passThroughOptions.dataDescriptor = bitFlag.dataDescriptor;
|
|
7014
|
+
passThroughOptions[OPTION_LEVEL] = LEVEL_BY_BITFLAG_LEVEL[bitFlag.level];
|
|
7015
|
+
}
|
|
7016
|
+
if (lastModDateOverride === UNDEFINED_VALUE) {
|
|
7017
|
+
passThroughOptions.rawLastModDate = rawLastModDate;
|
|
7018
|
+
} else if (passThrough !== PASS_THROUGH_COMPRESSED && zipCrypto && (!bitFlag || bitFlag.dataDescriptor) &&
|
|
7019
|
+
lastModDateOverride instanceof Date &&
|
|
7020
|
+
getDosTimeHighByte(lastModDateOverride) != ((rawLastModDate >>> 8) & MAX_8_BITS)) {
|
|
7021
|
+
throw new Error(ERR_ZIP_CRYPTO_LAST_MOD_DATE);
|
|
7022
|
+
}
|
|
7023
|
+
}
|
|
7024
|
+
return { entryOptions, passThroughOptions };
|
|
7025
|
+
}
|
|
7026
|
+
|
|
7027
|
+
function getDosTimeHighByte(lastModDate) {
|
|
7028
|
+
let dosLastModDate = new Date(Math.ceil(Math.floor(lastModDate.getTime() / 1000) / 2) * 2000);
|
|
7029
|
+
if (dosLastModDate < MIN_DATE) {
|
|
7030
|
+
dosLastModDate = MIN_DATE;
|
|
7031
|
+
} else if (dosLastModDate > MAX_DATE) {
|
|
7032
|
+
dosLastModDate = MAX_DATE;
|
|
7033
|
+
}
|
|
7034
|
+
return ((dosLastModDate.getHours() << 3) | (dosLastModDate.getMinutes() >> 3)) & MAX_8_BITS;
|
|
7035
|
+
}
|
|
7036
|
+
|
|
6737
7037
|
function resolveAttributes(zipWriter, name, options) {
|
|
6738
7038
|
let msDosCompatible = getOptionValue(zipWriter, options, PROPERTY_NAME_MS_DOS_COMPATIBLE);
|
|
6739
7039
|
let versionMadeBy = getOptionValue(zipWriter, options, PROPERTY_NAME_VERSION_MADE_BY, msDosCompatible ? VERSION_MADE_BY_MSDOS : VERSION_MADE_BY_UNIX);
|
|
@@ -6748,7 +7048,7 @@ function resolveAttributes(zipWriter, name, options) {
|
|
|
6748
7048
|
checkIntegerOption(uid, MAX_32_BITS, ERR_INVALID_UID);
|
|
6749
7049
|
checkIntegerOption(gid, MAX_32_BITS, ERR_INVALID_GID);
|
|
6750
7050
|
checkIntegerOption(unixMode, MAX_16_BITS, ERR_INVALID_UNIX_MODE);
|
|
6751
|
-
if (unixExtraFieldType !== UNDEFINED_VALUE && unixExtraFieldType !== INFOZIP_EXTRA_FIELD_TYPE
|
|
7051
|
+
if (unixExtraFieldType !== UNDEFINED_VALUE && unixExtraFieldType !== INFOZIP_EXTRA_FIELD_TYPE && unixExtraFieldType !== UNIX_EXTRA_FIELD_TYPE) {
|
|
6752
7052
|
throw new Error(ERR_INVALID_UNIX_EXTRA_FIELD_TYPE);
|
|
6753
7053
|
}
|
|
6754
7054
|
if (unixExtraFieldType === UNIX_EXTRA_FIELD_TYPE &&
|
|
@@ -6756,7 +7056,7 @@ function resolveAttributes(zipWriter, name, options) {
|
|
|
6756
7056
|
throw new Error(ERR_INVALID_UNIX_ID_SIZE);
|
|
6757
7057
|
}
|
|
6758
7058
|
if (unixExtraFieldType === UNDEFINED_VALUE && (uid !== UNDEFINED_VALUE || gid !== UNDEFINED_VALUE)) {
|
|
6759
|
-
unixExtraFieldType = INFOZIP_EXTRA_FIELD_TYPE
|
|
7059
|
+
unixExtraFieldType = INFOZIP_EXTRA_FIELD_TYPE;
|
|
6760
7060
|
}
|
|
6761
7061
|
let msdosAttributesRaw = getNumberOptionValue(zipWriter, options, PROPERTY_NAME_MSDOS_ATTRIBUTES_RAW);
|
|
6762
7062
|
let msdosAttributes = getOptionValue(zipWriter, options, PROPERTY_NAME_MSDOS_ATTRIBUTES);
|
|
@@ -6887,7 +7187,9 @@ function resolveMetadata(zipWriter, name, options) {
|
|
|
6887
7187
|
const lastAccessDate = getDateOptionValue(zipWriter, options, PROPERTY_NAME_LAST_ACCESS_DATE);
|
|
6888
7188
|
const creationDate = getDateOptionValue(zipWriter, options, PROPERTY_NAME_CREATION_DATE);
|
|
6889
7189
|
const internalFileAttributes = getOptionValue(zipWriter, options, PROPERTY_NAME_INTERNAL_FILE_ATTRIBUTES, 0);
|
|
6890
|
-
const passThrough = getOptionValue(zipWriter, options, OPTION_PASS_THROUGH);
|
|
7190
|
+
const passThrough = checkPassThroughOption(getOptionValue(zipWriter, options, OPTION_PASS_THROUGH));
|
|
7191
|
+
const passThroughCompression = Boolean(passThrough);
|
|
7192
|
+
const passThroughEncryption = passThrough === true;
|
|
6891
7193
|
const password = getOptionValue(zipWriter, options, OPTION_PASSWORD);
|
|
6892
7194
|
const rawPassword = getOptionValue(zipWriter, options, OPTION_RAW_PASSWORD);
|
|
6893
7195
|
checkPasswordOption(password, rawPassword);
|
|
@@ -6903,10 +7205,11 @@ function resolveMetadata(zipWriter, name, options) {
|
|
|
6903
7205
|
const dataDescriptorSignature = getOptionValue(zipWriter, options, OPTION_DATA_DESCRIPTOR_SIGNATURE, true);
|
|
6904
7206
|
const signal = checkSignalOption(getOptionValue(zipWriter, options, OPTION_SIGNAL));
|
|
6905
7207
|
throwIfAborted(signal);
|
|
6906
|
-
const useUnicodeFileNames = getOptionValue(zipWriter, options, OPTION_USE_UNICODE_FILE_NAMES,
|
|
7208
|
+
const useUnicodeFileNames = getOptionValue(zipWriter, options, OPTION_USE_UNICODE_FILE_NAMES,
|
|
7209
|
+
!isPrintableASCIIText(rawFilename) || !isPrintableASCIIText(rawComment));
|
|
6907
7210
|
const compressionMethod = getOptionValue(zipWriter, options, PROPERTY_NAME_COMPRESSION_METHOD);
|
|
6908
|
-
const registeredCodec =
|
|
6909
|
-
if (!
|
|
7211
|
+
const registeredCodec = passThroughCompression || compressionMethod === UNDEFINED_VALUE ? UNDEFINED_VALUE : getRegisteredCodec(compressionMethod);
|
|
7212
|
+
if (!passThroughCompression && compressionMethod !== UNDEFINED_VALUE &&
|
|
6910
7213
|
compressionMethod !== COMPRESSION_METHOD_STORE && compressionMethod !== COMPRESSION_METHOD_DEFLATE && !registeredCodec) {
|
|
6911
7214
|
throw new Error(ERR_UNSUPPORTED_COMPRESSION);
|
|
6912
7215
|
}
|
|
@@ -6920,15 +7223,15 @@ function resolveMetadata(zipWriter, name, options) {
|
|
|
6920
7223
|
level = 0;
|
|
6921
7224
|
}
|
|
6922
7225
|
}
|
|
6923
|
-
if (
|
|
6924
|
-
level =
|
|
7226
|
+
if (passThroughCompression) {
|
|
7227
|
+
level = toNumber(options[OPTION_LEVEL]);
|
|
6925
7228
|
}
|
|
6926
7229
|
let useCompressionStream = getOptionValue(zipWriter, options, OPTION_USE_COMPRESSION_STREAM);
|
|
6927
7230
|
let dataDescriptor = getOptionValue(zipWriter, options, OPTION_DATA_DESCRIPTOR);
|
|
6928
7231
|
if (bufferedWrite && dataDescriptor === UNDEFINED_VALUE) {
|
|
6929
7232
|
dataDescriptor = false;
|
|
6930
7233
|
}
|
|
6931
|
-
if (dataDescriptor === UNDEFINED_VALUE || (zipCrypto && !
|
|
7234
|
+
if (dataDescriptor === UNDEFINED_VALUE || (zipCrypto && !passThroughEncryption)) {
|
|
6932
7235
|
dataDescriptor = true;
|
|
6933
7236
|
}
|
|
6934
7237
|
if (level !== UNDEFINED_VALUE && level != 6) {
|
|
@@ -6952,7 +7255,8 @@ function resolveMetadata(zipWriter, name, options) {
|
|
|
6952
7255
|
lastAccessDate,
|
|
6953
7256
|
creationDate,
|
|
6954
7257
|
internalFileAttributes,
|
|
6955
|
-
|
|
7258
|
+
passThroughCompression,
|
|
7259
|
+
passThroughEncryption,
|
|
6956
7260
|
password,
|
|
6957
7261
|
rawPassword,
|
|
6958
7262
|
encryptionStrength,
|
|
@@ -7013,7 +7317,7 @@ function serializeExtraField(extraField) {
|
|
|
7013
7317
|
}
|
|
7014
7318
|
|
|
7015
7319
|
async function resolveSizes(zipWriter, reader, { resolvedOptions: metadata }, options) {
|
|
7016
|
-
if (metadata.
|
|
7320
|
+
if (metadata.passThroughCompression && !reader && !getOptionValue(zipWriter, options, PROPERTY_NAME_DIRECTORY)) {
|
|
7017
7321
|
throw new Error(ERR_UNDEFINED_READER);
|
|
7018
7322
|
}
|
|
7019
7323
|
let contentSize;
|
|
@@ -7029,12 +7333,12 @@ async function resolveSizes(zipWriter, reader, { resolvedOptions: metadata }, op
|
|
|
7029
7333
|
}
|
|
7030
7334
|
|
|
7031
7335
|
function resolveEntrySizes(zipWriter, hasContent, contentSize, metadata, options) {
|
|
7032
|
-
const {
|
|
7336
|
+
const { passThroughCompression, passThroughEncryption, zipCrypto, password, rawPassword, encryptionStrength } = metadata;
|
|
7033
7337
|
let { dataDescriptor, zip64, level, compressionMethod } = metadata;
|
|
7034
7338
|
let maximumCompressedSize = 0;
|
|
7035
7339
|
let uncompressedSize = 0;
|
|
7036
7340
|
let unknownSize = false;
|
|
7037
|
-
if (
|
|
7341
|
+
if (passThroughCompression && hasContent) {
|
|
7038
7342
|
uncompressedSize = options[PROPERTY_NAME_UNCOMPRESSED_SIZE];
|
|
7039
7343
|
if (uncompressedSize === UNDEFINED_VALUE) {
|
|
7040
7344
|
throw new Error(ERR_UNDEFINED_UNCOMPRESSED_SIZE);
|
|
@@ -7045,17 +7349,17 @@ function resolveEntrySizes(zipWriter, hasContent, contentSize, metadata, options
|
|
|
7045
7349
|
}
|
|
7046
7350
|
const zip64Enabled = zip64 === true;
|
|
7047
7351
|
const encrypted = getOptionValue(zipWriter, options, PROPERTY_NAME_ENCRYPTED);
|
|
7048
|
-
if (hasContent &&
|
|
7352
|
+
if (hasContent && passThroughEncryption && !encrypted && getLength(password, rawPassword)) {
|
|
7049
7353
|
throw new Error(ERR_UNSUPPORTED_ENCRYPTION_PASS_THROUGH);
|
|
7050
7354
|
}
|
|
7051
|
-
const encryptedEntry = hasContent && (Boolean((password && getLength(password)) || (rawPassword && getLength(rawPassword))) || (
|
|
7355
|
+
const encryptedEntry = hasContent && (Boolean((password && getLength(password)) || (rawPassword && getLength(rawPassword))) || (passThroughEncryption && encrypted));
|
|
7052
7356
|
if (!hasContent) {
|
|
7053
7357
|
level = 0;
|
|
7054
7358
|
compressionMethod = COMPRESSION_METHOD_STORE;
|
|
7055
7359
|
}
|
|
7056
|
-
const encryptionOverhead = encryptedEntry
|
|
7360
|
+
const encryptionOverhead = getEncryptionOverhead(encryptedEntry, zipCrypto, encryptionStrength);
|
|
7057
7361
|
if (hasContent) {
|
|
7058
|
-
if (!
|
|
7362
|
+
if (!passThroughCompression) {
|
|
7059
7363
|
if (contentSize === UNDEFINED_VALUE) {
|
|
7060
7364
|
dataDescriptor = true;
|
|
7061
7365
|
if (zip64 || zip64 === UNDEFINED_VALUE) {
|
|
@@ -7068,10 +7372,12 @@ function resolveEntrySizes(zipWriter, hasContent, contentSize, metadata, options
|
|
|
7068
7372
|
}
|
|
7069
7373
|
} else {
|
|
7070
7374
|
options.uncompressedSize = uncompressedSize;
|
|
7071
|
-
maximumCompressedSize = contentSize === UNDEFINED_VALUE ?
|
|
7375
|
+
maximumCompressedSize = contentSize === UNDEFINED_VALUE ?
|
|
7376
|
+
getMaximumCompressedSize(uncompressedSize) + encryptionOverhead :
|
|
7377
|
+
contentSize + (passThroughEncryption ? 0 : encryptionOverhead);
|
|
7072
7378
|
}
|
|
7073
7379
|
}
|
|
7074
|
-
const emptyEntry = !encryptedEntry && (!hasContent || (contentSize === 0 && !
|
|
7380
|
+
const emptyEntry = !encryptedEntry && (!hasContent || (contentSize === 0 && !passThroughCompression)) && !isCompressed(compressionMethod, level);
|
|
7075
7381
|
if (emptyEntry && !zipCrypto && getOptionValue(zipWriter, options, OPTION_DATA_DESCRIPTOR) === UNDEFINED_VALUE) {
|
|
7076
7382
|
dataDescriptor = false;
|
|
7077
7383
|
}
|
|
@@ -7120,6 +7426,8 @@ async function getEntriesSize(writerOptions, entries, writeOrderGuaranteed, comm
|
|
|
7120
7426
|
const initialOffset = writerOptions[OPTION_OFFSET] === UNDEFINED_VALUE ? 0 : writerOptions[OPTION_OFFSET];
|
|
7121
7427
|
let offset = initialOffset;
|
|
7122
7428
|
let minimumEntrySize = INFINITY_VALUE;
|
|
7429
|
+
const entrySizes = [];
|
|
7430
|
+
const entriesAlreadyZip64 = new Set();
|
|
7123
7431
|
for (const entry of entries) {
|
|
7124
7432
|
let { name } = entry;
|
|
7125
7433
|
const { size } = entry;
|
|
@@ -7131,7 +7439,7 @@ async function getEntriesSize(writerOptions, entries, writeOrderGuaranteed, comm
|
|
|
7131
7439
|
({ name } = attributesInfo);
|
|
7132
7440
|
const { resolvedOptions: metadata } = resolveMetadata(zipWriter, name, options);
|
|
7133
7441
|
if (metadata.level != 0 && metadata.compressionMethod === UNDEFINED_VALUE &&
|
|
7134
|
-
!metadata.
|
|
7442
|
+
!metadata.passThroughCompression && !(await supportsDeflate(getConfiguration()))) {
|
|
7135
7443
|
metadata.level = 0;
|
|
7136
7444
|
}
|
|
7137
7445
|
const hasContent = !getOptionValue(zipWriter, options, PROPERTY_NAME_DIRECTORY);
|
|
@@ -7139,7 +7447,7 @@ async function getEntriesSize(writerOptions, entries, writeOrderGuaranteed, comm
|
|
|
7139
7447
|
throw new Error(ERR_UNDETERMINED_SIZE);
|
|
7140
7448
|
}
|
|
7141
7449
|
const { maximumCompressedSize, resolvedOptions: sizes } = resolveEntrySizes(zipWriter, hasContent, size, metadata, options);
|
|
7142
|
-
if (hasContent && !metadata.
|
|
7450
|
+
if (hasContent && !metadata.passThroughCompression && isCompressed(sizes.compressionMethod, sizes.level)) {
|
|
7143
7451
|
throw new Error(ERR_UNDETERMINED_SIZE);
|
|
7144
7452
|
}
|
|
7145
7453
|
const entryOptions = Object.assign({}, options, attributesInfo.resolvedOptions, metadata, sizes, { [OPTION_USDZ]: usdz });
|
|
@@ -7159,10 +7467,15 @@ async function getEntriesSize(writerOptions, entries, writeOrderGuaranteed, comm
|
|
|
7159
7467
|
compressedSize
|
|
7160
7468
|
}));
|
|
7161
7469
|
const entrySize = entryInfo.metadataSize + compressedSize;
|
|
7470
|
+
entrySizes.push(entrySize);
|
|
7471
|
+
entriesAlreadyZip64.add(Boolean(entryOptions.zip64Enabled ||
|
|
7472
|
+
entryOptions.uncompressedSize >= MAX_32_BITS || compressedSize >= MAX_32_BITS));
|
|
7162
7473
|
minimumEntrySize = Math.min(minimumEntrySize, entrySize);
|
|
7163
7474
|
offset += entrySize;
|
|
7164
7475
|
}
|
|
7165
|
-
const layoutDependsOnWriteOrder = files.size > 1 && (usdz ||
|
|
7476
|
+
const layoutDependsOnWriteOrder = files.size > 1 && (usdz ||
|
|
7477
|
+
(offset - minimumEntrySize >= MAX_32_BITS &&
|
|
7478
|
+
(entriesAlreadyZip64.size > 1 || countEntriesBefore4GB(entrySizes, initialOffset, true) != countEntriesBefore4GB(entrySizes, initialOffset, false))));
|
|
7166
7479
|
if (layoutDependsOnWriteOrder && !writeOrderGuaranteed) {
|
|
7167
7480
|
throw new Error(ERR_UNDETERMINED_SIZE);
|
|
7168
7481
|
}
|
|
@@ -7180,6 +7493,20 @@ async function getEntriesSize(writerOptions, entries, writeOrderGuaranteed, comm
|
|
|
7180
7493
|
return offset - initialOffset + directoryDataLength + commentLength + (zip64 ? ZIP64_END_OF_CENTRAL_DIR_TOTAL_LENGTH : END_OF_CENTRAL_DIR_LENGTH);
|
|
7181
7494
|
}
|
|
7182
7495
|
|
|
7496
|
+
function countEntriesBefore4GB(entrySizes, initialOffset, largestFirst) {
|
|
7497
|
+
const ordered = entrySizes.slice().sort((first, second) => largestFirst ? second - first : first - second);
|
|
7498
|
+
let position = initialOffset;
|
|
7499
|
+
let count = 0;
|
|
7500
|
+
for (const entrySize of ordered) {
|
|
7501
|
+
if (position >= MAX_32_BITS) {
|
|
7502
|
+
break;
|
|
7503
|
+
}
|
|
7504
|
+
position += entrySize;
|
|
7505
|
+
count++;
|
|
7506
|
+
}
|
|
7507
|
+
return count;
|
|
7508
|
+
}
|
|
7509
|
+
|
|
7183
7510
|
async function getFileEntry(zipWriter, name, reader, entryInfo, options) {
|
|
7184
7511
|
const {
|
|
7185
7512
|
fileEntries,
|
|
@@ -7355,6 +7682,7 @@ async function createFileEntry(reader, writer, { diskNumberStart, lockFileEntry
|
|
|
7355
7682
|
localExtraFieldZip64Length,
|
|
7356
7683
|
rawExtraFieldExtendedTimestamp,
|
|
7357
7684
|
extraFieldExtendedTimestampFlag,
|
|
7685
|
+
extraFieldExtendedTimestampTime,
|
|
7358
7686
|
rawExtraFieldNTFS,
|
|
7359
7687
|
rawExtraFieldUnix,
|
|
7360
7688
|
rawExtraFieldAES,
|
|
@@ -7367,6 +7695,7 @@ async function createFileEntry(reader, writer, { diskNumberStart, lockFileEntry
|
|
|
7367
7695
|
password,
|
|
7368
7696
|
rawPassword,
|
|
7369
7697
|
level,
|
|
7698
|
+
useUnicodeFileNames,
|
|
7370
7699
|
zip64,
|
|
7371
7700
|
zip64Enabled,
|
|
7372
7701
|
zip64UncompressedSize,
|
|
@@ -7401,7 +7730,8 @@ async function createFileEntry(reader, writer, { diskNumberStart, lockFileEntry
|
|
|
7401
7730
|
msdosAttributesRaw,
|
|
7402
7731
|
msdosAttributes,
|
|
7403
7732
|
useCompressionStream,
|
|
7404
|
-
|
|
7733
|
+
passThroughCompression,
|
|
7734
|
+
passThroughEncryption,
|
|
7405
7735
|
format,
|
|
7406
7736
|
codecURI
|
|
7407
7737
|
} = options;
|
|
@@ -7412,9 +7742,9 @@ async function createFileEntry(reader, writer, { diskNumberStart, lockFileEntry
|
|
|
7412
7742
|
zip64Enabled,
|
|
7413
7743
|
directory: Boolean(directory),
|
|
7414
7744
|
executable: Boolean(executable),
|
|
7415
|
-
filenameUTF8:
|
|
7745
|
+
filenameUTF8: Boolean(useUnicodeFileNames),
|
|
7416
7746
|
rawFilename,
|
|
7417
|
-
commentUTF8:
|
|
7747
|
+
commentUTF8: Boolean(useUnicodeFileNames),
|
|
7418
7748
|
rawComment,
|
|
7419
7749
|
rawExtraFieldZip64,
|
|
7420
7750
|
localExtraFieldZip64Length,
|
|
@@ -7445,7 +7775,7 @@ async function createFileEntry(reader, writer, { diskNumberStart, lockFileEntry
|
|
|
7445
7775
|
uncompressedSize
|
|
7446
7776
|
} = options;
|
|
7447
7777
|
let compressedSize = 0;
|
|
7448
|
-
if (!
|
|
7778
|
+
if (!passThroughCompression) {
|
|
7449
7779
|
uncompressedSize = 0;
|
|
7450
7780
|
}
|
|
7451
7781
|
const { writable } = writer;
|
|
@@ -7462,9 +7792,9 @@ async function createFileEntry(reader, writer, { diskNumberStart, lockFileEntry
|
|
|
7462
7792
|
encryptionStrength,
|
|
7463
7793
|
zipCrypto: encrypted && zipCrypto,
|
|
7464
7794
|
passwordVerification: encrypted && zipCrypto && (rawLastModDate >> 8) & MAX_8_BITS,
|
|
7465
|
-
computeCrc32: !
|
|
7466
|
-
compressed: compressed && !
|
|
7467
|
-
encrypted: encrypted && !
|
|
7795
|
+
computeCrc32: !passThroughCompression,
|
|
7796
|
+
compressed: compressed && !passThroughCompression,
|
|
7797
|
+
encrypted: encrypted && !passThroughEncryption,
|
|
7468
7798
|
useWebWorkers,
|
|
7469
7799
|
useCompressionStream,
|
|
7470
7800
|
transferStreams,
|
|
@@ -7479,7 +7809,7 @@ async function createFileEntry(reader, writer, { diskNumberStart, lockFileEntry
|
|
|
7479
7809
|
const result = await runWorker({ readable, writable }, workerOptions);
|
|
7480
7810
|
compressedSize = result.outputSize;
|
|
7481
7811
|
writer.size += compressedSize;
|
|
7482
|
-
if (!
|
|
7812
|
+
if (!passThroughCompression) {
|
|
7483
7813
|
uncompressedSize = result.inputSize;
|
|
7484
7814
|
if (!encrypted || zipCrypto) {
|
|
7485
7815
|
crc32 = result.crc32;
|
|
@@ -7522,8 +7852,9 @@ async function createFileEntry(reader, writer, { diskNumberStart, lockFileEntry
|
|
|
7522
7852
|
headerArray,
|
|
7523
7853
|
headerView,
|
|
7524
7854
|
signature: crc32,
|
|
7525
|
-
crc32: encrypted && !zipCrypto && !
|
|
7855
|
+
crc32: encrypted && !zipCrypto && !passThroughCompression ? UNDEFINED_VALUE : crc32,
|
|
7526
7856
|
extraFieldExtendedTimestampFlag,
|
|
7857
|
+
extraFieldExtendedTimestampTime,
|
|
7527
7858
|
zip64UncompressedSize,
|
|
7528
7859
|
zip64CompressedSize
|
|
7529
7860
|
});
|
|
@@ -7548,7 +7879,7 @@ function getHeaderInfo(options) {
|
|
|
7548
7879
|
encryptionStrength,
|
|
7549
7880
|
extendedTimestamp,
|
|
7550
7881
|
ntfsTimestamp,
|
|
7551
|
-
|
|
7882
|
+
passThroughCompression,
|
|
7552
7883
|
encrypted,
|
|
7553
7884
|
zip64UncompressedSize,
|
|
7554
7885
|
zip64CompressedSize,
|
|
@@ -7559,7 +7890,7 @@ function getHeaderInfo(options) {
|
|
|
7559
7890
|
let { version, compressionMethod } = options;
|
|
7560
7891
|
const compressed = !directory && isCompressed(compressionMethod, level);
|
|
7561
7892
|
let rawLocalExtraFieldZip64;
|
|
7562
|
-
const uncompressedFile =
|
|
7893
|
+
const uncompressedFile = passThroughCompression || !compressed;
|
|
7563
7894
|
const zip64ExtraFieldComplete = zip64 && (options.bufferedWrite || !dataDescriptor || ((!zip64UncompressedSize && !zip64CompressedSize) || (uncompressedFile && !unknownSize)));
|
|
7564
7895
|
const writeLocalExtraFieldZip64 = zip64ExtraFieldComplete || (zip64 && dataDescriptor && (zip64UncompressedSize || zip64CompressedSize));
|
|
7565
7896
|
if (zip64 && (zip64UncompressedSize || zip64CompressedSize)) {
|
|
@@ -7571,8 +7902,8 @@ function getHeaderInfo(options) {
|
|
|
7571
7902
|
if (zip64ExtraFieldComplete) {
|
|
7572
7903
|
extraFieldZip64.writeUint64(uncompressedSize);
|
|
7573
7904
|
if (uncompressedFile) {
|
|
7574
|
-
const encryptionOverhead = encrypted
|
|
7575
|
-
extraFieldZip64.writeUint64(
|
|
7905
|
+
const encryptionOverhead = getEncryptionOverhead(encrypted, zipCrypto, encryptionStrength);
|
|
7906
|
+
extraFieldZip64.writeUint64(passThroughCompression ? 0 : uncompressedSize + encryptionOverhead);
|
|
7576
7907
|
}
|
|
7577
7908
|
}
|
|
7578
7909
|
} else {
|
|
@@ -7591,6 +7922,7 @@ function getHeaderInfo(options) {
|
|
|
7591
7922
|
let rawExtraFieldNTFS;
|
|
7592
7923
|
let rawExtraFieldExtendedTimestamp;
|
|
7593
7924
|
let extraFieldExtendedTimestampFlag;
|
|
7925
|
+
let extraFieldExtendedTimestampTime;
|
|
7594
7926
|
if (extendedTimestamp) {
|
|
7595
7927
|
const lastModTimeUnix = getTimeUnix(lastModDate);
|
|
7596
7928
|
const lastModTimeUnixInRange = inUnixTimeRange(lastModTimeUnix);
|
|
@@ -7598,6 +7930,7 @@ function getHeaderInfo(options) {
|
|
|
7598
7930
|
const extraFieldTimestampLength = 9 + (lastAccessDate ? 4 : 0) + (creationDate ? 4 : 0);
|
|
7599
7931
|
const extraFieldTimestamp = createRecordWriter(extraFieldTimestampLength);
|
|
7600
7932
|
extraFieldExtendedTimestampFlag = 0x1 + (lastAccessDate ? 0x2 : 0) + (creationDate ? 0x4 : 0);
|
|
7933
|
+
extraFieldExtendedTimestampTime = lastModTimeUnix;
|
|
7601
7934
|
extraFieldTimestamp.writeUint16(EXTRAFIELD_TYPE_EXTENDED_TIMESTAMP);
|
|
7602
7935
|
extraFieldTimestamp.writeUint16(extraFieldTimestampLength - 4);
|
|
7603
7936
|
extraFieldTimestamp.writeUint8(extraFieldExtendedTimestampFlag);
|
|
@@ -7640,7 +7973,7 @@ function getHeaderInfo(options) {
|
|
|
7640
7973
|
let rawExtraFieldUnix;
|
|
7641
7974
|
try {
|
|
7642
7975
|
const { uid, gid, unixExtraFieldType } = options;
|
|
7643
|
-
if (unixExtraFieldType == INFOZIP_EXTRA_FIELD_TYPE
|
|
7976
|
+
if (unixExtraFieldType == INFOZIP_EXTRA_FIELD_TYPE && (uid !== UNDEFINED_VALUE || gid !== UNDEFINED_VALUE)) {
|
|
7644
7977
|
const uidBytes = packUnixId(uid === UNDEFINED_VALUE ? 0 : uid);
|
|
7645
7978
|
const gidBytes = packUnixId(gid === UNDEFINED_VALUE ? 0 : gid);
|
|
7646
7979
|
const payloadLength = 3 + uidBytes.length + gidBytes.length;
|
|
@@ -7681,7 +8014,7 @@ function getHeaderInfo(options) {
|
|
|
7681
8014
|
}
|
|
7682
8015
|
if (encrypted && !zipCrypto) {
|
|
7683
8016
|
version = version > VERSION_AES ? version : VERSION_AES;
|
|
7684
|
-
if (
|
|
8017
|
+
if (passThroughCompression && crc32 !== UNDEFINED_VALUE) {
|
|
7685
8018
|
rawExtraFieldAES[EXTRAFIELD_OFFSET_AES_VENDOR_VERSION] = VENDOR_VERSION_AE_1;
|
|
7686
8019
|
}
|
|
7687
8020
|
setUint16(getDataView(rawExtraFieldAES), EXTRAFIELD_OFFSET_AES_COMPRESSION_METHOD, compressionMethod);
|
|
@@ -7743,12 +8076,14 @@ function getHeaderInfo(options) {
|
|
|
7743
8076
|
headerArray,
|
|
7744
8077
|
headerView,
|
|
7745
8078
|
lastModDate: storedLastModDate,
|
|
8079
|
+
lastModDateClamped: storedLastModDate === clampedLastModDate && dosLastModDate.getTime() != clampedLastModDate.getTime(),
|
|
7746
8080
|
rawLastModDate,
|
|
7747
8081
|
encrypted,
|
|
7748
8082
|
compressed,
|
|
7749
8083
|
version,
|
|
7750
8084
|
compressionMethod,
|
|
7751
8085
|
extraFieldExtendedTimestampFlag,
|
|
8086
|
+
extraFieldExtendedTimestampTime,
|
|
7752
8087
|
rawExtraFieldZip64: EMPTY_UINT8_ARRAY,
|
|
7753
8088
|
localExtraFieldZip64Length,
|
|
7754
8089
|
rawExtraFieldExtendedTimestamp,
|
|
@@ -7851,7 +8186,7 @@ function setEntryInfo({
|
|
|
7851
8186
|
}, {
|
|
7852
8187
|
zip64,
|
|
7853
8188
|
zipCrypto,
|
|
7854
|
-
|
|
8189
|
+
passThroughCompression,
|
|
7855
8190
|
dataDescriptor
|
|
7856
8191
|
}) {
|
|
7857
8192
|
const {
|
|
@@ -7862,7 +8197,7 @@ function setEntryInfo({
|
|
|
7862
8197
|
dataDescriptorView,
|
|
7863
8198
|
dataDescriptorOffset
|
|
7864
8199
|
} = dataDescriptorInfo;
|
|
7865
|
-
if ((!encrypted || zipCrypto ||
|
|
8200
|
+
if ((!encrypted || zipCrypto || passThroughCompression) && crc32 !== UNDEFINED_VALUE) {
|
|
7866
8201
|
setUint32(headerView, HEADER_OFFSET_SIGNATURE, crc32);
|
|
7867
8202
|
if (dataDescriptor) {
|
|
7868
8203
|
setUint32(dataDescriptorView, dataDescriptorOffset, crc32);
|
|
@@ -7893,9 +8228,9 @@ function updateLocalHeader({
|
|
|
7893
8228
|
uncompressedSize,
|
|
7894
8229
|
zip64UncompressedSize,
|
|
7895
8230
|
zip64CompressedSize
|
|
7896
|
-
}, localHeaderView, { dataDescriptor,
|
|
8231
|
+
}, localHeaderView, { dataDescriptor, passThroughCompression }) {
|
|
7897
8232
|
if (!dataDescriptor) {
|
|
7898
|
-
if (!encrypted || (
|
|
8233
|
+
if (!encrypted || (passThroughCompression && crc32 !== UNDEFINED_VALUE)) {
|
|
7899
8234
|
setUint32(localHeaderView, HEADER_OFFSET_SIGNATURE + LOCAL_HEADER_COMMON_OFFSET, crc32);
|
|
7900
8235
|
}
|
|
7901
8236
|
if (!zip64CompressedSize) {
|
|
@@ -7932,9 +8267,8 @@ function createDirectoryRecords(files) {
|
|
|
7932
8267
|
rawExtraFieldUnix,
|
|
7933
8268
|
rawExtraField,
|
|
7934
8269
|
rawCentralExtraField,
|
|
7935
|
-
extendedTimestamp,
|
|
7936
8270
|
extraFieldExtendedTimestampFlag,
|
|
7937
|
-
|
|
8271
|
+
extraFieldExtendedTimestampTime,
|
|
7938
8272
|
zip64Enabled,
|
|
7939
8273
|
uncompressedSize,
|
|
7940
8274
|
compressedSize
|
|
@@ -7977,16 +8311,15 @@ function createDirectoryRecords(files) {
|
|
|
7977
8311
|
fileEntry.zip64Offset = zip64Offset;
|
|
7978
8312
|
fileEntry.zip64DiskNumberStart = zip64DiskNumberStart;
|
|
7979
8313
|
let rawExtraFieldTimestamp;
|
|
7980
|
-
|
|
7981
|
-
|
|
8314
|
+
if (extraFieldExtendedTimestampTime === UNDEFINED_VALUE) {
|
|
8315
|
+
rawExtraFieldTimestamp = EMPTY_UINT8_ARRAY;
|
|
8316
|
+
} else {
|
|
7982
8317
|
const extraFieldTimestamp = createRecordWriter(9);
|
|
7983
8318
|
extraFieldTimestamp.writeUint16(EXTRAFIELD_TYPE_EXTENDED_TIMESTAMP);
|
|
7984
8319
|
extraFieldTimestamp.writeUint16(5);
|
|
7985
8320
|
extraFieldTimestamp.writeUint8(extraFieldExtendedTimestampFlag);
|
|
7986
|
-
extraFieldTimestamp.writeUint32(
|
|
8321
|
+
extraFieldTimestamp.writeUint32(extraFieldExtendedTimestampTime);
|
|
7987
8322
|
rawExtraFieldTimestamp = extraFieldTimestamp.array;
|
|
7988
|
-
} else {
|
|
7989
|
-
rawExtraFieldTimestamp = EMPTY_UINT8_ARRAY;
|
|
7990
8323
|
}
|
|
7991
8324
|
fileEntry.rawExtraFieldExtendedTimestamp = rawExtraFieldTimestamp;
|
|
7992
8325
|
const extraFieldLength = getLength(
|
|
@@ -8486,6 +8819,11 @@ function getHeaderArrayData({
|
|
|
8486
8819
|
};
|
|
8487
8820
|
}
|
|
8488
8821
|
|
|
8822
|
+
function isPrintableASCIIText(rawText) {
|
|
8823
|
+
return rawText.every(characterCode =>
|
|
8824
|
+
characterCode >= MIN_PRINTABLE_ASCII_CHARACTER_CODE && characterCode <= MAX_PRINTABLE_ASCII_CHARACTER_CODE);
|
|
8825
|
+
}
|
|
8826
|
+
|
|
8489
8827
|
function getBitFlag(level, useUnicodeFileNames, dataDescriptor, encrypted, compressionMethod) {
|
|
8490
8828
|
let bitFlag = 0;
|
|
8491
8829
|
if (useUnicodeFileNames) {
|
|
@@ -8647,7 +8985,7 @@ function formatSupported(StreamClass, format) {
|
|
|
8647
8985
|
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
8648
8986
|
*/
|
|
8649
8987
|
|
|
8650
|
-
const VERSION = "2.
|
|
8988
|
+
const VERSION = "2.12.0";
|
|
8651
8989
|
|
|
8652
8990
|
/*
|
|
8653
8991
|
Copyright (c) 2025 Gildas Lormeau. All rights reserved.
|
|
@@ -9469,9 +9807,9 @@ setDefaultConfiguration({
|
|
|
9469
9807
|
DecompressionStreamFallback: DecompressionStreamZlib
|
|
9470
9808
|
});
|
|
9471
9809
|
|
|
9472
|
-
function terminateWorkersAndModule() {
|
|
9810
|
+
async function terminateWorkersAndModule() {
|
|
9811
|
+
await terminateWorkers();
|
|
9473
9812
|
modulePromise = null;
|
|
9474
|
-
terminateWorkers();
|
|
9475
9813
|
resetWasmModule();
|
|
9476
9814
|
}
|
|
9477
9815
|
|
|
@@ -9538,7 +9876,10 @@ s(setDefaultConfiguration);
|
|
|
9538
9876
|
const ERR_ENTRY_EXISTS = "Entry filename already exists";
|
|
9539
9877
|
const ERR_DUPLICATE_IMPORTED_ENTRY = "Duplicate entry filename in the imported zip file";
|
|
9540
9878
|
const ERR_INVALID_DUPLICATES = "Invalid duplicates option (must be \"throw\", \"keep-first\" or \"keep-last\")";
|
|
9541
|
-
const ERR_ANCESTOR_ENTRY = "Entry is
|
|
9879
|
+
const ERR_ANCESTOR_ENTRY = "Entry is an ancestor of target entry";
|
|
9880
|
+
const ERR_ROOT_DIRECTORY_NOT_MOVABLE = "Root directory cannot be moved";
|
|
9881
|
+
const ERR_TARGET_NOT_DIRECTORY = "Target entry is not a directory";
|
|
9882
|
+
const ERR_PARENT_NOT_DIRECTORY = "Parent entry is not a directory";
|
|
9542
9883
|
const ERR_READABLE_CONSUMED = "Readable stream already consumed";
|
|
9543
9884
|
const DUPLICATES_THROW = "throw";
|
|
9544
9885
|
const DUPLICATES_KEEP_FIRST = "keep-first";
|
|
@@ -9546,22 +9887,8 @@ const DUPLICATES_KEEP_LAST = "keep-last";
|
|
|
9546
9887
|
const DUPLICATES_VALUES = new Set([DUPLICATES_THROW, DUPLICATES_KEEP_FIRST, DUPLICATES_KEEP_LAST]);
|
|
9547
9888
|
const ERR_INVALID_PASS_THROUGH = "Invalid passThrough option (use readerOptions.passThrough or set uncompressedSize for each entry)";
|
|
9548
9889
|
const ERR_INVALID_READER_OPTIONS = "Invalid readerOptions (must be an object)";
|
|
9549
|
-
const
|
|
9890
|
+
const ERR_UNSUPPORTED_PASS_THROUGH_VALUE = "The 'compressed' passThrough option is only supported by Entry#getData() and ZipWriter#add()";
|
|
9550
9891
|
const ERR_ABORT_EXPORT = "zipjs-abort-export";
|
|
9551
|
-
const INFOZIP_EXTRA_FIELD_TYPE = "infozip";
|
|
9552
|
-
const INTERPRETED_EXTRA_FIELD_TYPES = new Set([
|
|
9553
|
-
EXTRAFIELD_TYPE_ZIP64,
|
|
9554
|
-
EXTRAFIELD_TYPE_AES,
|
|
9555
|
-
EXTRAFIELD_TYPE_NTFS,
|
|
9556
|
-
EXTRAFIELD_TYPE_EXTENDED_TIMESTAMP,
|
|
9557
|
-
EXTRAFIELD_TYPE_UNICODE_PATH,
|
|
9558
|
-
EXTRAFIELD_TYPE_UNICODE_COMMENT,
|
|
9559
|
-
EXTRAFIELD_TYPE_USDZ,
|
|
9560
|
-
EXTRAFIELD_TYPE_INFOZIP,
|
|
9561
|
-
EXTRAFIELD_TYPE_UNIX,
|
|
9562
|
-
EXTRAFIELD_TYPE_UNIX_TYPE1,
|
|
9563
|
-
EXTRAFIELD_TYPE_PKWARE_UNIX
|
|
9564
|
-
]);
|
|
9565
9892
|
|
|
9566
9893
|
class ZipEntry {
|
|
9567
9894
|
|
|
@@ -9933,6 +10260,7 @@ class ZipDirectoryEntry extends ZipEntry {
|
|
|
9933
10260
|
await initStream(reader);
|
|
9934
10261
|
zipReader = new ZipReader(reader, options);
|
|
9935
10262
|
}
|
|
10263
|
+
checkPassThroughValue(options.passThrough);
|
|
9936
10264
|
const duplicates = checkDuplicatesOption(options.duplicates);
|
|
9937
10265
|
const importedEntries = [];
|
|
9938
10266
|
const entries = await zipReader.getEntries(options);
|
|
@@ -10023,18 +10351,25 @@ class ZipDirectoryEntry extends ZipEntry {
|
|
|
10023
10351
|
|
|
10024
10352
|
async exportZip(writer, options = {}) {
|
|
10025
10353
|
const zipEntry = this;
|
|
10354
|
+
const zipWriterProvided = Boolean(writer) && typeof writer.add == FUNCTION_TYPE;
|
|
10026
10355
|
options = Object.assign({}, options);
|
|
10027
|
-
if (options.bufferedWrite === UNDEFINED_VALUE) {
|
|
10356
|
+
if (!zipWriterProvided && options.bufferedWrite === UNDEFINED_VALUE) {
|
|
10028
10357
|
options.bufferedWrite = true;
|
|
10029
10358
|
}
|
|
10030
|
-
const [readers] = await Promise.all([
|
|
10031
|
-
|
|
10359
|
+
const [readers] = await Promise.all([
|
|
10360
|
+
initReaders(zipEntry, checkReaderOptions(options.readerOptions)),
|
|
10361
|
+
zipWriterProvided ? UNDEFINED_VALUE : initStream(writer)
|
|
10362
|
+
]);
|
|
10363
|
+
const zipWriter = zipWriterProvided ? writer : new ZipWriter(writer, options);
|
|
10032
10364
|
await exportZip(zipWriter, zipEntry, getTotalSize([zipEntry], getUncompressedSize), options, readers);
|
|
10365
|
+
if (zipWriterProvided) {
|
|
10366
|
+
return zipWriter;
|
|
10367
|
+
}
|
|
10033
10368
|
await zipWriter.close(options.globalComment);
|
|
10034
10369
|
return writer.getData ? writer.getData() : writer.writable;
|
|
10035
10370
|
}
|
|
10036
10371
|
|
|
10037
|
-
getExportedSize(options = {}) {
|
|
10372
|
+
async getExportedSize(options = {}) {
|
|
10038
10373
|
const zipEntry = this;
|
|
10039
10374
|
options = Object.assign({}, options);
|
|
10040
10375
|
checkReaderOptions(options.readerOptions);
|
|
@@ -10049,7 +10384,7 @@ class ZipDirectoryEntry extends ZipEntry {
|
|
|
10049
10384
|
const writeOrderGuaranteed = !options.bufferedWrite ||
|
|
10050
10385
|
(entries.every(entry => entry.options.keepOrder !== false) &&
|
|
10051
10386
|
children.every(child => isImplicitDirectory(child) || !child.children.length));
|
|
10052
|
-
return getEntriesSize(options, entries, writeOrderGuaranteed, options.globalComment);
|
|
10387
|
+
return await getEntriesSize(options, entries, writeOrderGuaranteed, options.globalComment);
|
|
10053
10388
|
}
|
|
10054
10389
|
|
|
10055
10390
|
getChildByName(name) {
|
|
@@ -10110,7 +10445,7 @@ class ZipFS {
|
|
|
10110
10445
|
|
|
10111
10446
|
move(entry, destination) {
|
|
10112
10447
|
if (entry == this.root) {
|
|
10113
|
-
throw new Error(
|
|
10448
|
+
throw new Error(ERR_ROOT_DIRECTORY_NOT_MOVABLE);
|
|
10114
10449
|
} else {
|
|
10115
10450
|
if (destination.directory) {
|
|
10116
10451
|
if (!destination.isDescendantOf(entry)) {
|
|
@@ -10131,7 +10466,7 @@ class ZipFS {
|
|
|
10131
10466
|
throw new Error(ERR_ANCESTOR_ENTRY);
|
|
10132
10467
|
}
|
|
10133
10468
|
} else {
|
|
10134
|
-
throw new Error(
|
|
10469
|
+
throw new Error(ERR_TARGET_NOT_DIRECTORY);
|
|
10135
10470
|
}
|
|
10136
10471
|
}
|
|
10137
10472
|
}
|
|
@@ -10444,70 +10779,11 @@ function getChildEntryOptions(child, selectedEntry, options) {
|
|
|
10444
10779
|
let zipEntryMetadata = {};
|
|
10445
10780
|
let passThroughOptions = {};
|
|
10446
10781
|
if (child.data instanceof Entry) {
|
|
10447
|
-
const
|
|
10448
|
-
|
|
10449
|
-
|
|
10450
|
-
|
|
10451
|
-
|
|
10452
|
-
rawLastModDate,
|
|
10453
|
-
creationDate,
|
|
10454
|
-
lastAccessDate,
|
|
10455
|
-
uncompressedSize,
|
|
10456
|
-
encrypted,
|
|
10457
|
-
zipCrypto,
|
|
10458
|
-
crc32,
|
|
10459
|
-
compressionMethod,
|
|
10460
|
-
extraFieldAES,
|
|
10461
|
-
internalFileAttributes,
|
|
10462
|
-
extraField,
|
|
10463
|
-
bitFlag,
|
|
10464
|
-
uid,
|
|
10465
|
-
gid
|
|
10466
|
-
} = child.data;
|
|
10467
|
-
zipEntryMetadata = {
|
|
10468
|
-
externalFileAttributes,
|
|
10469
|
-
versionMadeBy,
|
|
10470
|
-
comment,
|
|
10471
|
-
lastModDate,
|
|
10472
|
-
creationDate,
|
|
10473
|
-
lastAccessDate,
|
|
10474
|
-
internalFileAttributes
|
|
10475
|
-
};
|
|
10476
|
-
const userExtraField = getUserExtraField(extraField);
|
|
10477
|
-
if (userExtraField) {
|
|
10478
|
-
zipEntryMetadata.extraField = userExtraField;
|
|
10479
|
-
}
|
|
10480
|
-
if (uid !== UNDEFINED_VALUE || gid !== UNDEFINED_VALUE) {
|
|
10481
|
-
Object.assign(zipEntryMetadata, {
|
|
10482
|
-
uid,
|
|
10483
|
-
gid,
|
|
10484
|
-
unixExtraFieldType: INFOZIP_EXTRA_FIELD_TYPE
|
|
10485
|
-
});
|
|
10486
|
-
}
|
|
10487
|
-
if (isPassThrough(child, options)) {
|
|
10488
|
-
let encryptionStrength;
|
|
10489
|
-
if (extraFieldAES) {
|
|
10490
|
-
encryptionStrength = extraFieldAES.strength;
|
|
10491
|
-
}
|
|
10492
|
-
passThroughOptions = {
|
|
10493
|
-
passThrough: true,
|
|
10494
|
-
encrypted,
|
|
10495
|
-
zipCrypto,
|
|
10496
|
-
crc32,
|
|
10497
|
-
uncompressedSize,
|
|
10498
|
-
encryptionStrength,
|
|
10499
|
-
compressionMethod
|
|
10500
|
-
};
|
|
10501
|
-
if (bitFlag) {
|
|
10502
|
-
passThroughOptions.dataDescriptor = bitFlag.dataDescriptor;
|
|
10503
|
-
}
|
|
10504
|
-
const lastModDateOverride = childOptions.lastModDate === UNDEFINED_VALUE ? options.lastModDate : childOptions.lastModDate;
|
|
10505
|
-
if (lastModDateOverride === UNDEFINED_VALUE) {
|
|
10506
|
-
passThroughOptions.rawLastModDate = rawLastModDate;
|
|
10507
|
-
} else if (zipCrypto && (!bitFlag || bitFlag.dataDescriptor) && lastModDateOverride instanceof Date &&
|
|
10508
|
-
getDosTimeHighByte(lastModDateOverride) != ((rawLastModDate >>> 8) & MAX_8_BITS)) {
|
|
10509
|
-
throw new Error(ERR_ZIP_CRYPTO_LAST_MOD_DATE);
|
|
10510
|
-
}
|
|
10782
|
+
const passThrough = isPassThrough(child, options);
|
|
10783
|
+
const lastModDateOverride = childOptions.lastModDate === UNDEFINED_VALUE ? options.lastModDate : childOptions.lastModDate;
|
|
10784
|
+
({ entryOptions: zipEntryMetadata, passThroughOptions } = getSourceEntryOptions(child.data, passThrough, lastModDateOverride));
|
|
10785
|
+
if (passThrough) {
|
|
10786
|
+
passThroughOptions.passThrough = true;
|
|
10511
10787
|
}
|
|
10512
10788
|
}
|
|
10513
10789
|
const entryOptions = Object.assign({ lastModDate: child.defaultLastModDate }, zipEntryMetadata, options, childOptions, passThroughOptions, { directory: child.directory });
|
|
@@ -10517,16 +10793,6 @@ function getChildEntryOptions(child, selectedEntry, options) {
|
|
|
10517
10793
|
return { name, entryOptions };
|
|
10518
10794
|
}
|
|
10519
10795
|
|
|
10520
|
-
function getDosTimeHighByte(lastModDate) {
|
|
10521
|
-
let dosLastModDate = new Date(Math.ceil(Math.floor(lastModDate.getTime() / 1000) / 2) * 2000);
|
|
10522
|
-
if (dosLastModDate < MIN_DATE) {
|
|
10523
|
-
dosLastModDate = MIN_DATE;
|
|
10524
|
-
} else if (dosLastModDate > MAX_DATE) {
|
|
10525
|
-
dosLastModDate = MAX_DATE;
|
|
10526
|
-
}
|
|
10527
|
-
return ((dosLastModDate.getHours() << 3) | (dosLastModDate.getMinutes() >> 3)) & MAX_8_BITS;
|
|
10528
|
-
}
|
|
10529
|
-
|
|
10530
10796
|
function getDeterminedSize(child, passThrough) {
|
|
10531
10797
|
const { reader } = child;
|
|
10532
10798
|
if (reader && reader.size !== UNDEFINED_VALUE) {
|
|
@@ -10539,9 +10805,18 @@ function checkReaderOptions(readerOptions) {
|
|
|
10539
10805
|
if (readerOptions && (typeof readerOptions != OBJECT_TYPE || Array.isArray(readerOptions))) {
|
|
10540
10806
|
throw new Error(ERR_INVALID_READER_OPTIONS);
|
|
10541
10807
|
}
|
|
10808
|
+
if (readerOptions) {
|
|
10809
|
+
checkPassThroughValue(readerOptions.passThrough);
|
|
10810
|
+
}
|
|
10542
10811
|
return readerOptions;
|
|
10543
10812
|
}
|
|
10544
10813
|
|
|
10814
|
+
function checkPassThroughValue(passThrough) {
|
|
10815
|
+
if (checkPassThroughOption(passThrough) === PASS_THROUGH_COMPRESSED) {
|
|
10816
|
+
throw new Error(ERR_UNSUPPORTED_PASS_THROUGH_VALUE);
|
|
10817
|
+
}
|
|
10818
|
+
}
|
|
10819
|
+
|
|
10545
10820
|
function replaceContent(zipEntry, params) {
|
|
10546
10821
|
const { uncompressedSize } = params;
|
|
10547
10822
|
Object.assign(zipEntry, params, {
|
|
@@ -10570,20 +10845,6 @@ function isImplicitDirectory(child) {
|
|
|
10570
10845
|
return child.directory && child.data === null;
|
|
10571
10846
|
}
|
|
10572
10847
|
|
|
10573
|
-
function getUserExtraField(extraField) {
|
|
10574
|
-
if (extraField) {
|
|
10575
|
-
const userExtraField = new Map();
|
|
10576
|
-
extraField.forEach((field, type) => {
|
|
10577
|
-
if (!INTERPRETED_EXTRA_FIELD_TYPES.has(type)) {
|
|
10578
|
-
userExtraField.set(type, field.data);
|
|
10579
|
-
}
|
|
10580
|
-
});
|
|
10581
|
-
if (userExtraField.size) {
|
|
10582
|
-
return userExtraField;
|
|
10583
|
-
}
|
|
10584
|
-
}
|
|
10585
|
-
}
|
|
10586
|
-
|
|
10587
10848
|
async function exportZip(zipWriter, entry, totalSize, options, readers) {
|
|
10588
10849
|
const { onstart, onprogress, onend, onentryprogress } = options;
|
|
10589
10850
|
const selectedEntry = entry;
|
|
@@ -10686,6 +10947,7 @@ function addFileSystemHandle(zipEntry, handle, options) {
|
|
|
10686
10947
|
|
|
10687
10948
|
async function exportFileSystemHandle(zipEntry, directoryHandle, options) {
|
|
10688
10949
|
const { onstart, onprogress, onend } = options;
|
|
10950
|
+
checkPassThroughValue(options.passThrough);
|
|
10689
10951
|
const readerOptions = checkReaderOptions(options.readerOptions);
|
|
10690
10952
|
const abortController = new AbortController();
|
|
10691
10953
|
const { signal } = abortController;
|
|
@@ -10761,7 +11023,7 @@ async function exportFileSystemHandle(zipEntry, directoryHandle, options) {
|
|
|
10761
11023
|
if (exportAborted || isExportAborted(signal.reason)) {
|
|
10762
11024
|
return;
|
|
10763
11025
|
}
|
|
10764
|
-
|
|
11026
|
+
throwIfAborted(signal);
|
|
10765
11027
|
}
|
|
10766
11028
|
try {
|
|
10767
11029
|
if (child.directory) {
|
|
@@ -10894,7 +11156,7 @@ function addChild(parent, name, params, directory) {
|
|
|
10894
11156
|
}
|
|
10895
11157
|
return directory ? new ZipDirectoryEntry(parent.fs, name, params, parent) : new ZipFileEntry(parent.fs, name, params, parent);
|
|
10896
11158
|
} else {
|
|
10897
|
-
throw new Error(
|
|
11159
|
+
throw new Error(ERR_PARENT_NOT_DIRECTORY);
|
|
10898
11160
|
}
|
|
10899
11161
|
}
|
|
10900
11162
|
|
|
@@ -11036,6 +11298,7 @@ exports.Data64URIReader = Data64URIReader;
|
|
|
11036
11298
|
exports.Data64URIWriter = Data64URIWriter;
|
|
11037
11299
|
exports.ERR_ABORTED = ERR_ABORTED;
|
|
11038
11300
|
exports.ERR_AMBIGUOUS_ARCHIVE = ERR_AMBIGUOUS_ARCHIVE;
|
|
11301
|
+
exports.ERR_ANCESTOR_ENTRY = ERR_ANCESTOR_ENTRY;
|
|
11039
11302
|
exports.ERR_BAD_FORMAT = ERR_BAD_FORMAT;
|
|
11040
11303
|
exports.ERR_CENTRAL_DIRECTORY_NOT_FOUND = ERR_CENTRAL_DIRECTORY_NOT_FOUND;
|
|
11041
11304
|
exports.ERR_DUPLICATED_NAME = ERR_DUPLICATED_NAME;
|
|
@@ -11049,7 +11312,9 @@ exports.ERR_EOCDR_NOT_FOUND = ERR_EOCDR_NOT_FOUND;
|
|
|
11049
11312
|
exports.ERR_EXTRAFIELD_ZIP64_NOT_FOUND = ERR_EXTRAFIELD_ZIP64_NOT_FOUND;
|
|
11050
11313
|
exports.ERR_HTTP_RANGE = ERR_HTTP_RANGE;
|
|
11051
11314
|
exports.ERR_HTTP_RESOURCE_CHANGED = ERR_HTTP_RESOURCE_CHANGED;
|
|
11315
|
+
exports.ERR_HTTP_STATUS = ERR_HTTP_STATUS;
|
|
11052
11316
|
exports.ERR_INVALID_AUTHENTICATION_CODE = ERR_INVALID_AUTHENTICATION_CODE;
|
|
11317
|
+
exports.ERR_INVALID_BASE_URI = ERR_INVALID_BASE_URI;
|
|
11053
11318
|
exports.ERR_INVALID_CODEC_DEFINITION = ERR_INVALID_CODEC_DEFINITION;
|
|
11054
11319
|
exports.ERR_INVALID_CODEC_MODULE = ERR_INVALID_CODEC_MODULE;
|
|
11055
11320
|
exports.ERR_INVALID_COMMENT = ERR_INVALID_COMMENT;
|
|
@@ -11059,6 +11324,7 @@ exports.ERR_INVALID_CRC32 = ERR_INVALID_CRC32;
|
|
|
11059
11324
|
exports.ERR_INVALID_DATE = ERR_INVALID_DATE;
|
|
11060
11325
|
exports.ERR_INVALID_DUPLICATES = ERR_INVALID_DUPLICATES;
|
|
11061
11326
|
exports.ERR_INVALID_ENCRYPTION_STRENGTH = ERR_INVALID_ENCRYPTION_STRENGTH;
|
|
11327
|
+
exports.ERR_INVALID_ENTRY = ERR_INVALID_ENTRY;
|
|
11062
11328
|
exports.ERR_INVALID_ENTRY_COMMENT = ERR_INVALID_ENTRY_COMMENT;
|
|
11063
11329
|
exports.ERR_INVALID_ENTRY_COMMENT_TYPE = ERR_INVALID_ENTRY_COMMENT_TYPE;
|
|
11064
11330
|
exports.ERR_INVALID_ENTRY_NAME = ERR_INVALID_ENTRY_NAME;
|
|
@@ -11077,6 +11343,7 @@ exports.ERR_INVALID_MSDOS_DATA = ERR_INVALID_MSDOS_DATA;
|
|
|
11077
11343
|
exports.ERR_INVALID_PASSWORD = ERR_INVALID_PASSWORD;
|
|
11078
11344
|
exports.ERR_INVALID_PASSWORD_TYPE = ERR_INVALID_PASSWORD_TYPE;
|
|
11079
11345
|
exports.ERR_INVALID_PASS_THROUGH = ERR_INVALID_PASS_THROUGH;
|
|
11346
|
+
exports.ERR_INVALID_PASS_THROUGH_VALUE = ERR_INVALID_PASS_THROUGH_VALUE;
|
|
11080
11347
|
exports.ERR_INVALID_READER = ERR_INVALID_READER;
|
|
11081
11348
|
exports.ERR_INVALID_READER_OPTIONS = ERR_INVALID_READER_OPTIONS;
|
|
11082
11349
|
exports.ERR_INVALID_SIGNAL = ERR_INVALID_SIGNAL;
|
|
@@ -11087,14 +11354,19 @@ exports.ERR_INVALID_UNCOMPRESSED_SIZE = ERR_INVALID_UNCOMPRESSED_SIZE;
|
|
|
11087
11354
|
exports.ERR_INVALID_UNIX_EXTRA_FIELD_TYPE = ERR_INVALID_UNIX_EXTRA_FIELD_TYPE;
|
|
11088
11355
|
exports.ERR_INVALID_UNIX_ID_SIZE = ERR_INVALID_UNIX_ID_SIZE;
|
|
11089
11356
|
exports.ERR_INVALID_UNIX_MODE = ERR_INVALID_UNIX_MODE;
|
|
11357
|
+
exports.ERR_INVALID_URI = ERR_INVALID_URI;
|
|
11090
11358
|
exports.ERR_INVALID_VERSION = ERR_INVALID_VERSION;
|
|
11091
11359
|
exports.ERR_ITERATOR_COMPLETED_TOO_SOON = ERR_ITERATOR_COMPLETED_TOO_SOON;
|
|
11092
11360
|
exports.ERR_LOCAL_FILE_HEADER_NOT_FOUND = ERR_LOCAL_FILE_HEADER_NOT_FOUND;
|
|
11093
11361
|
exports.ERR_OVERLAPPING_ENTRY = ERR_OVERLAPPING_ENTRY;
|
|
11362
|
+
exports.ERR_PARENT_NOT_DIRECTORY = ERR_PARENT_NOT_DIRECTORY;
|
|
11094
11363
|
exports.ERR_READABLE_CONSUMED = ERR_READABLE_CONSUMED;
|
|
11095
11364
|
exports.ERR_RESERVED_COMPRESSION_METHOD = ERR_RESERVED_COMPRESSION_METHOD;
|
|
11365
|
+
exports.ERR_ROOT_DIRECTORY_NOT_MOVABLE = ERR_ROOT_DIRECTORY_NOT_MOVABLE;
|
|
11096
11366
|
exports.ERR_SPLIT_ZIP_FILE = ERR_SPLIT_ZIP_FILE;
|
|
11367
|
+
exports.ERR_TARGET_NOT_DIRECTORY = ERR_TARGET_NOT_DIRECTORY;
|
|
11097
11368
|
exports.ERR_UNDEFINED_COMPRESSION_METHOD = ERR_UNDEFINED_COMPRESSION_METHOD;
|
|
11369
|
+
exports.ERR_UNDEFINED_CRC32 = ERR_UNDEFINED_CRC32;
|
|
11098
11370
|
exports.ERR_UNDEFINED_READER = ERR_UNDEFINED_READER;
|
|
11099
11371
|
exports.ERR_UNDEFINED_UNCOMPRESSED_SIZE = ERR_UNDEFINED_UNCOMPRESSED_SIZE;
|
|
11100
11372
|
exports.ERR_UNDETERMINED_SIZE = ERR_UNDETERMINED_SIZE;
|
|
@@ -11106,10 +11378,12 @@ exports.ERR_UNSUPPORTED_ENCRYPTION = ERR_UNSUPPORTED_ENCRYPTION;
|
|
|
11106
11378
|
exports.ERR_UNSUPPORTED_ENCRYPTION_PASS_THROUGH = ERR_UNSUPPORTED_ENCRYPTION_PASS_THROUGH;
|
|
11107
11379
|
exports.ERR_UNSUPPORTED_ENCRYPTION_USDZ = ERR_UNSUPPORTED_ENCRYPTION_USDZ;
|
|
11108
11380
|
exports.ERR_UNSUPPORTED_FORMAT = ERR_UNSUPPORTED_FORMAT;
|
|
11381
|
+
exports.ERR_UNSUPPORTED_PASS_THROUGH_VALUE = ERR_UNSUPPORTED_PASS_THROUGH_VALUE;
|
|
11109
11382
|
exports.ERR_UNSUPPORTED_SPLIT_USDZ = ERR_UNSUPPORTED_SPLIT_USDZ;
|
|
11110
11383
|
exports.ERR_UNSUPPORTED_UINT64 = ERR_UNSUPPORTED_UINT64;
|
|
11111
11384
|
exports.ERR_WORKER_STARTUP_TIMEOUT = ERR_WORKER_STARTUP_TIMEOUT;
|
|
11112
11385
|
exports.ERR_WRITER_NOT_INITIALIZED = ERR_WRITER_NOT_INITIALIZED;
|
|
11386
|
+
exports.ERR_WRITER_SIZE_NOT_WRITABLE = ERR_WRITER_SIZE_NOT_WRITABLE;
|
|
11113
11387
|
exports.ERR_ZIP_CRYPTO_LAST_MOD_DATE = ERR_ZIP_CRYPTO_LAST_MOD_DATE;
|
|
11114
11388
|
exports.ERR_ZIP_NOT_EMPTY = ERR_ZIP_NOT_EMPTY;
|
|
11115
11389
|
exports.HttpRangeReader = HttpRangeReader;
|
|
@@ -11123,13 +11397,17 @@ exports.Uint8ArrayReader = Uint8ArrayReader;
|
|
|
11123
11397
|
exports.Uint8ArrayWriter = Uint8ArrayWriter;
|
|
11124
11398
|
exports.VERSION = VERSION;
|
|
11125
11399
|
exports.WARNING_APPENDED_DATA = WARNING_APPENDED_DATA;
|
|
11400
|
+
exports.WARNING_CLAMPED_LAST_MODIFICATION_DATE = WARNING_CLAMPED_LAST_MODIFICATION_DATE;
|
|
11126
11401
|
exports.WARNING_COMPRESSED_PATCHED_DATA = WARNING_COMPRESSED_PATCHED_DATA;
|
|
11402
|
+
exports.WARNING_COMPRESSION_UNAVAILABLE = WARNING_COMPRESSION_UNAVAILABLE;
|
|
11127
11403
|
exports.WARNING_DUPLICATE_FILENAME = WARNING_DUPLICATE_FILENAME;
|
|
11128
11404
|
exports.WARNING_MALFORMED_EXTRA_FIELD = WARNING_MALFORMED_EXTRA_FIELD;
|
|
11129
11405
|
exports.WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG = WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG;
|
|
11130
11406
|
exports.WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD = WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD;
|
|
11131
11407
|
exports.WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES = WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES;
|
|
11408
|
+
exports.WARNING_MISMATCHED_LOCAL_FILE_HEADER_FILENAME = WARNING_MISMATCHED_LOCAL_FILE_HEADER_FILENAME;
|
|
11132
11409
|
exports.WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY = WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY;
|
|
11410
|
+
exports.WARNING_MULTIPLE_END_OF_CENTRAL_DIRECTORY = WARNING_MULTIPLE_END_OF_CENTRAL_DIRECTORY;
|
|
11133
11411
|
exports.WARNING_PREPENDED_CENTRAL_DIRECTORY = WARNING_PREPENDED_CENTRAL_DIRECTORY;
|
|
11134
11412
|
exports.WARNING_PREPENDED_DATA = WARNING_PREPENDED_DATA;
|
|
11135
11413
|
exports.WARNING_TRAILING_CENTRAL_DIRECTORY_DATA = WARNING_TRAILING_CENTRAL_DIRECTORY_DATA;
|