@zip.js/zip.js 2.8.36 → 2.8.38
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/deno.json +4 -2
- package/dist/zip-core.js +356 -63
- package/dist/zip-core.min.js +1 -1
- package/dist/zip-fs-core.js +301 -63
- package/dist/zip-fs-core.min.js +1 -1
- package/dist/zip-fs-native.js +359 -66
- package/dist/zip-fs-native.min.js +1 -1
- package/dist/zip-fs.js +357 -64
- package/dist/zip-fs.min.js +1 -1
- package/dist/zip-legacy.js +358 -65
- package/dist/zip-legacy.min.js +1 -1
- package/dist/zip-native.js +359 -66
- 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 +357 -64
- package/dist/zip.min.js +1 -1
- package/index-native.cjs +359 -66
- package/index-native.min.js +1 -1
- package/index.cjs +357 -64
- package/index.d.cts +126 -4
- package/index.d.ts +126 -4
- package/index.min.js +1 -1
- package/lib/core/codec-pool.js +21 -4
- package/lib/core/codec-registry.js +116 -0
- package/lib/core/codec-worker.js +94 -18
- package/lib/core/configuration.js +2 -0
- package/lib/core/constants.js +5 -1
- package/lib/core/options.js +2 -0
- package/lib/core/streams/codec-stream.js +6 -2
- package/lib/core/streams/zip-entry-stream.js +50 -16
- package/lib/core/streams/zlib-js/zlib-streams.min.js +1 -1
- package/lib/core/web-worker-base.js +30 -8
- package/lib/core/web-worker-inline-native.js +1 -1
- package/lib/core/web-worker-inline-wasm.js +1 -1
- package/lib/core/zip-reader.js +29 -3
- package/lib/core/zip-writer.js +68 -25
- package/lib/zip-core-base.js +7 -0
- package/lib/zip-core-reader.js +2 -1
- package/lib/zip-core-writer.js +1 -0
- package/package.json +1 -1
- package/worker-message-property-names.js +1 -1
package/dist/zip-legacy.js
CHANGED
|
@@ -46,6 +46,7 @@
|
|
|
46
46
|
const LOCAL_FILE_HEADER_SIGNATURE = 0x04034b50;
|
|
47
47
|
const SPLIT_ZIP_FILE_SIGNATURE = 0x08074b50;
|
|
48
48
|
const DATA_DESCRIPTOR_RECORD_SIGNATURE = SPLIT_ZIP_FILE_SIGNATURE;
|
|
49
|
+
const ARCHIVE_EXTRA_DATA_SIGNATURE = 0x08064b50;
|
|
49
50
|
const CENTRAL_FILE_HEADER_SIGNATURE = 0x02014b50;
|
|
50
51
|
const END_OF_CENTRAL_DIR_SIGNATURE = 0x06054b50;
|
|
51
52
|
const ZIP64_END_OF_CENTRAL_DIR_SIGNATURE = 0x06064b50;
|
|
@@ -77,6 +78,7 @@
|
|
|
77
78
|
const BITFLAG_LEVEL_FAST_MASK = 0b100;
|
|
78
79
|
const BITFLAG_LEVEL_SUPER_FAST_MASK = 0b110;
|
|
79
80
|
const BITFLAG_DATA_DESCRIPTOR = 0b1000;
|
|
81
|
+
const BITFLAG_STRONG_ENCRYPTION = 0b1000000;
|
|
80
82
|
const BITFLAG_LANG_ENCODING_FLAG = 0b100000000000;
|
|
81
83
|
const FILE_ATTR_MSDOS_DIR_MASK = 0b10000;
|
|
82
84
|
const FILE_ATTR_MSDOS_READONLY_MASK = 0x01;
|
|
@@ -104,7 +106,7 @@
|
|
|
104
106
|
const HEADER_OFFSET_UNCOMPRESSED_SIZE = 18;
|
|
105
107
|
const LOCAL_HEADER_COMMON_OFFSET = 4;
|
|
106
108
|
|
|
107
|
-
const MAX_DATE = new Date(2107, 11, 31);
|
|
109
|
+
const MAX_DATE = new Date(2107, 11, 31, 23, 59, 58);
|
|
108
110
|
const MIN_DATE = new Date(1980, 0, 1);
|
|
109
111
|
|
|
110
112
|
const UNDEFINED_VALUE = undefined;
|
|
@@ -160,6 +162,7 @@
|
|
|
160
162
|
maxWorkers,
|
|
161
163
|
terminateWorkerTimeout: 5000,
|
|
162
164
|
workerStarvationTimeout: 5000,
|
|
165
|
+
workerStartupTimeout: 5000,
|
|
163
166
|
useWebWorkers: true,
|
|
164
167
|
useCompressionStream: true,
|
|
165
168
|
transferStreams: true,
|
|
@@ -175,6 +178,7 @@
|
|
|
175
178
|
"maxWorkers",
|
|
176
179
|
"terminateWorkerTimeout",
|
|
177
180
|
"workerStarvationTimeout",
|
|
181
|
+
"workerStartupTimeout",
|
|
178
182
|
"useCompressionStream",
|
|
179
183
|
"useWebWorkers",
|
|
180
184
|
"transferStreams",
|
|
@@ -220,7 +224,104 @@
|
|
|
220
224
|
Object.assign(config, DEFAULT_CONFIGURATION);
|
|
221
225
|
}
|
|
222
226
|
|
|
223
|
-
const n=[3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258],t=[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0],e=[1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577],o=[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13],f=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],r=new Uint8Array(288);r.fill(8,0,144),r.fill(9,144,256),r.fill(7,256,280),r.fill(8,280,288);const c=new Uint8Array(30).fill(5);function w(n){const t=new Uint16Array(16);for(const e of n)t[e]++;t[0]=0;const e=new Uint16Array(17);for(let n=1;15>=n;n++)e[n+1]=e[n]+t[n];const o=new Uint16Array(n.length);for(let t=0;t<n.length;t++)n[t]&&(o[e[n[t]]++]=t);return {o:t,symbols:o}}const P="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";function Y(Y){Y({workerURI:Y=>{const m="text/javascript",F=(P=>{let Y=0,m=0,F=0,x=new Uint8Array(1024),b=0,l=0;for(;!l;){l=v(1);const n=v(2);if(0==n)z();else if(1==n)a(w(r),w(c));else {if(2!=n)throw Error("invalid deflate block type");a(...j());}}return x.subarray(0,b);function s(){if(Y>=P.length)throw Error("unexpected end of deflate data");return P[Y++]}function v(n){for(;n>F;)m|=s()<<F,F+=8;const t=m&(1<<n)-1;return m>>>=n,F-=n,t}function z(){m=0,F=0;const n=s()|s()<<8;Y+=2,Z(b+n);for(let t=0;n>t;t++)x[b++]=s();}function a(f,r){let c=X(f);for(;256!=c;){if(256>c)Z(b+1),x[b++]=c;else {const f=c-257,w=n[f]+v(t[f]),P=X(r),Y=e[P]+v(o[P]);Z(b+w);const m=b-Y;for(let n=0;w>n;n++)x[b++]=x[m+n];}c=X(f);}}function j(){const n=v(5)+257,t=v(5)+1,e=v(4)+4,o=new Uint8Array(19);for(let n=0;e>n;n++)o[f[n]]=v(3);const r=w(o),c=new Uint8Array(n+t);let P=0;for(;P<c.length;){const n=X(r);if(16>n)c[P++]=n;else if(16==n){const n=c[P-1];let t=v(2)+3;for(;t--;)c[P++]=n;}else P+=17==n?v(3)+3:v(7)+11;}return [w(c.subarray(0,n)),w(c.subarray(n))]}function X(n){const{o:t,symbols:e}=n;let o=0,f=0,r=0;for(let n=1;15>=n;n++){o|=v(1);const c=t[n];if(c>o-f)return e[r+(o-f)];r+=c,f=f+c<<1,o<<=1;}throw Error("invalid huffman code")}function Z(n){if(x.length<n){let t=2*x.length;for(;n>t;)t*=2;const e=new Uint8Array(t);e.set(x.subarray(0,b)),x=e;}}})((n=>{const t=(n=(n+"").replace(/[^A-Za-z0-9+/=]/g,"")).length,e=[];for(let o=0;t>o;o+=4){const t=P.indexOf(n[o])<<18|P.indexOf(n[o+1])<<12|(63&P.indexOf(n[o+2]))<<6|63&P.indexOf(n[o+3]);e.push(t>>16&255),"="!==n[o+2]&&e.push(t>>8&255),"="!==n[o+3]&&e.push(255&t);}return new Uint8Array(e)})("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"));if(Y){const n=new Blob([F],{type:m});return URL.createObjectURL(n)}return "data:"+m+";base64,"+(n=>{let t="";const e=n.length;let o=0;for(;e>o+2;o+=3){const e=n[o]<<16|n[o+1]<<8|n[o+2];t+=P[e>>18&63]+P[e>>12&63]+P[e>>6&63]+P[63&e];}const f=e-o;if(1===f){const e=n[o]<<16;t+=P[e>>18&63]+P[e>>12&63]+"==";}else if(2===f){const e=n[o]<<16|n[o+1]<<8;t+=P[e>>18&63]+P[e>>12&63]+P[e>>6&63]+"=";}return t})(F)}});}
|
|
227
|
+
const r=[3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258],t=[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0],n=[1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577],o=[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13],e=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],l=new Uint8Array(288);l.fill(8,0,144),l.fill(9,144,256),l.fill(7,256,280),l.fill(8,280,288);const u=new Uint8Array(30).fill(5);function f(r){const t=new Uint16Array(16);for(const n of r)t[n]++;t[0]=0;const n=new Uint16Array(17);for(let r=1;15>=r;r++)n[r+1]=n[r]+t[r];const o=new Uint16Array(r.length);for(let t=0;t<r.length;t++)r[t]&&(o[n[r[t]]++]=t);return {o:t,symbols:o}}const q="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";function a(a){a({workerURI:a=>{const i="text/javascript",Y=(q=>{let a=0,i=0,Y=0,x=new Uint8Array(1024),U=0,v=0;for(;!v;){v=G(1);const r=G(2);if(0==r)S();else if(1==r)K(f(l),f(u));else {if(2!=r)throw Error("invalid deflate block type");K(...N());}}return x.subarray(0,U);function s(){if(a>=q.length)throw Error("unexpected end of deflate data");return q[a++]}function G(r){for(;r>Y;)i|=s()<<Y,Y+=8;const t=i&(1<<r)-1;return i>>>=r,Y-=r,t}function S(){i=0,Y=0;const r=s()|s()<<8;a+=2,c(U+r);for(let t=0;r>t;t++)x[U++]=s();}function K(e,l){let u=V(e);for(;256!=u;){if(256>u)c(U+1),x[U++]=u;else {const e=u-257,f=r[e]+G(t[e]),q=V(l),a=n[q]+G(o[q]);c(U+f);const i=U-a;for(let r=0;f>r;r++)x[U++]=x[i+r];}u=V(e);}}function N(){const r=G(5)+257,t=G(5)+1,n=G(4)+4,o=new Uint8Array(19);for(let r=0;n>r;r++)o[e[r]]=G(3);const l=f(o),u=new Uint8Array(r+t);let q=0;for(;q<u.length;){const r=V(l);if(16>r)u[q++]=r;else if(16==r){const r=u[q-1];let t=G(2)+3;for(;t--;)u[q++]=r;}else q+=17==r?G(3)+3:G(7)+11;}return [f(u.subarray(0,r)),f(u.subarray(r))]}function V(r){const{o:t,symbols:n}=r;let o=0,e=0,l=0;for(let r=1;15>=r;r++){o|=G(1);const u=t[r];if(u>o-e)return n[l+(o-e)];l+=u,e=e+u<<1,o<<=1;}throw Error("invalid huffman code")}function c(r){if(x.length<r){let t=2*x.length;for(;r>t;)t*=2;const n=new Uint8Array(t);n.set(x.subarray(0,U)),x=n;}}})((r=>{const t=(r=(r+"").replace(/[^A-Za-z0-9+/=]/g,"")).length,n=[];for(let o=0;t>o;o+=4){const t=q.indexOf(r[o])<<18|q.indexOf(r[o+1])<<12|(63&q.indexOf(r[o+2]))<<6|63&q.indexOf(r[o+3]);n.push(t>>16&255),"="!==r[o+2]&&n.push(t>>8&255),"="!==r[o+3]&&n.push(255&t);}return new Uint8Array(n)})("zX1pc9u4suj39yts1xwVETY5JLVYpgypEmedJE4mzjIZlZKiJdBiJJMOCFlxLJ3f/qob4CJZmclZ7ruvkpJJEGuj0Wj0Bkvw/u1BvEjHKsnSA87VzZXI4r2JiJNUNBr6rxtdTgb60RIsFBZbM6soZLHbg0Uu9nIlk7E66I2zNFe396WMbkIBr86/iLEKFZwuLs+FDCW8jNQ0TOGRlJkME3iXpKqrc2f04nf0W0xvzUC/5fCsepnDy+gqjOBhpKL3iViGY3gts8skF+EC3opv6lE6ziZChksYy5srlYVTuMpy9VLkeXQhwgm8lVGax5m8PFNSRJfhFbwR0SQ6nwuTcAMfZKJqCTM4yS6vpMjzJEtN2iU8FOM7qedrnot5DNf8Oksmex5c8INFqsE3OYAzXsEbvvNULPcy+MKHwxHs+j/qxZm05kLtCe71gnanL3rCttktJikuNj53zUfF/YYaqH6/739qHnW7wVHQ7LZCSuh9GXqjoRhxtd5dc5GquN/r9lVPYWs0q3uSfxkqx8fivS9DRdXIfr/f/USVBu12Q47WlHf4Gr7BO7gPJ/AZ3sCzEf/SG8+jPN97pCuTi7HKpCXYrZomuZtxsVo5/jq6uhLpBJN1H7yV/twreuCthDsX6YWa9jBHyr1eEluyz7uNhnDPF3EsZNHfhMA7top0EO75jRKv4jgXCiSDjEunSyDsZX2e9lKbd4vCgqtPiXshFGGelcK+x0DyepLdwsSe4s9o7GL06c1QIDwaQbs9+vSZXvyOfjuht6Cl3+4baH16N5RViW/0UpR4TW+mxJqmqyf72EucYkWAf031WOqTGKYjNuoZYKr1hVAWu5VCLWT6T526XusZ+LgnvimRTvK9q4250DAXBtSKgPeoly+uhLRuVbFkLAGS3Sq3nCmQrki/LsQCqcMa4vkin1oVyhCGWy3W03Mhizlyc6H0Erc8UC71l4Fwr6P5QnC5XjMQHDu+XhcLZu+hJUBtV13gg63MA+vpYe9JbEP3EB8UFFkZSI2me6ccaxtHStecxJbHOS/yrVb4VtZrqhWuKaJYiZZiWJRx/BGk/NSdW7LsSDPgnKeDWsHw1J1aClLwVoiW+TwZC8uDqhLG1nCJ66CYjRLtTR9V0R2v1glcnVWj9yzl+MzWfVnDdTnGZnCvqO64rEeU9ViCV11K3bFI5pb6tRkwxopOmDKqwZs+yL7XaKhGwxJD6fgjfuqeIbDppRH4rcNWt9lpdft95fjg4yyv4SzE3oBkvE/QEQMVWnLgrVSojo+bgSOY7XtHR23f7wSHh4edewLmoeD91JXZAhHv143PbLVqBjDVlULKbnG5aAqMsG80rJQPR6yn+rwZ9JTDmwFL3SvEVYnr2rsD17SYLcFKKptgvuNqKmy7rGQlhsmo3+8rrA2faRSqV5CiotBgA1VCDzJClqREFlMhAdHOGk0flJ31m8FAhql7lV1ZjGCYrtfwkt8iQcvD2y91VDl1EXN+7UKxRBTTxHJjHKqf0ACajWS1slLs86+tEQM5TEY8JcoD6fEx75bLaQ2v680MR1SrBCTCWDNCUVbQkQgdnh4fd1diKEfQbPxTrlaW0uNLGZarlkhDNhqqGnr3ntVsSAYpY6DW6zW85US9tnePojNIKXrKPZ9n49lZ8l3wth+Act/xoX/YDNrdln/UhJYXNINms+UfQtDuBM1u0/cCCA79w2aze9iFZtBtNw8P24E3AuXe50O/7Xfbnhe0jsDvto8OD9vNoyYELc87ah8del1oNo/arc7RYTcYgRhYyj3hwj0pFg8D5X7mwv1cT3jDhfuGhcqVAqkSW5u/1b6DQylpDVb4riov3M98OALhvuEeiPXiahIpcQcQB8iOpRcVRydwdfKX7jMXp7CiW9i/05IsuZ9B4LQo9w1k+MtTWyMTro6sf+R5h/7RUdBuHba8oyOfqanMlnuIZIl1cBKlaab2plE+3bvMpNhT0yjdCz61m3vOnr93nqj8oGg5JszMkUYiDs0NBml2pDaNdupYG6+N2pvjM9y3kW+pl2HK/WjFbr44j5BftPzOvTn4nXvW3PYZYzC3uV/bIq4MocNsiGsPt6fCsFru54rQuic9VYMbDBFlkbaN2MY4zM4U9Px2w/BmGsU9na9YC248zxCf3Te/toKj1lHnMDjqIOab3CtEmV5RX48J96Ol6l1nrMIYg08g16cVOSy+9v2jgeg38aeNP4dHA00lQ/VJfkpD1ZAr1UhXspHWUv6pGun6pd4/CtJ/fCxWyIQgrV5/tGr7MkINEi7dE8i4sLoe22BT/YLVzIgPRW4SP8U8GXojyHky9Ecw58kwGEHEk2FzBGOeDFubvPDhkZ55m91ihauVRdVJ96XlQzYUTnP0Cf909R+/Zf52RiX6K8rdhpjZ0kVY5TCHiNljG6uypXt/WM7Mr4HHRiuvN+YRRHwOcyrb9CBnkPMYYq7W2H8ahB2vPMBh0FjsnN6CEQ3JntNbc0QjsyN6a41ogPZ45a3X8IDfJpdXmVTPxQ1teWK598B9a70k9jXXSxgeVJOLHDCXq5UvWuD109XK68vNtZmk19E8mexdRTK6zPdUtnd1PpvEQbkgM+7bVtrvt9nxcaDnQ4MDFibHkpYsHcEeEAtnZQymhsVe6nU84QU3csVPNYbzqteKwYL7PStbrXzWn/QWOHmYKeY5F65I6bhmXdXW1WKECxbXa3/em5vjST1zziDiXi86zovFEWGuYTT6xPNhZHCGe2Wrjcb8OC6PELbNpsgcao5+AvFwPmIwsXlrbfB8WXFCv3bZGt6Gf7sPAdLVp/wtpOZcN+op9z0fIqgk0O+o5AuU+37ojSrq9Wsz6BVbaD8hsm1REeaWxN59aLFqTSlkSsxJLcWDmBrxI++oHQStbueTGKoRpEOfkv1266jd7nSDLqX3TOOmYiyMNOf90K+l+ZT2gSYaKRaW+MGmJUw24T61hM4Iwv2T7/u1jYoOI3/yfQ/o6UM1rPUkuRD5dq2AtPcDDtnwM0Xt/qgEiSKQ7CKBBZ4IWiW67c2lYXLsZeleNJcimtzs6Vone9PLaLw3juZzMdk/KKunSspO61GYnguGrMrTYted7vOLRqN4wTPOmyidZJfv8YyTc34Gv/ODZ+XSzPNlJicH8L5KzJOLNFILKQ7gAz/4nlx9yZ3oPJPKGU/FeOaUhXrlIelPM9anBSN7p2Hczzd3bhKT7N1//WwPd/B8cYXUR0wOmDkmPed+B17w2zS6FOHB6wfPHz4ODtbwlSs3yrGP1i1u+6HJ8PTl/ZOD9RpeMHhVy5IoISPsYx76ogn1EmdP7zu+KfIbHx5MhEyuxQNkGUbwBx92wQ/A74zgFz70OxC0oBmM4DH3PXjChx7QvxEIUQc9KMGFaDSmyAuouQCp300WJTBPKgoKBYn4KR7zOR9uiWtGsJ2A/ONzXIv0f7VS7gurznXRt9aIeK3nuN9lfEOuYYgv95Hxau1znjUaHf2ni392U/dI5HszcbOXJ9/FQcFh3OfDvDrPITXFDsc867XuZXbQ7ce9uJAoCZ4PYzxDWvE/Ms65t1p1ObWq31uMCJI0sozR8XHQ+kRvRmhxfOx3dELXvHc/SSMdAVMnVSHwi67lU4TVQMSj42P/U9Bt3rOifv8QWbV8GI+oS9nok9gQWMW49UPsONX05MNmQwziMHZao94cmYFWn8erVauPh0uijHKodMdHn4gk0rvpOiYFJqlbpjQxBfuvRqN1nZrUicErS4DH1hPxw68+W7/YomuEA6CKZ39E50aNE/gnQT4/K05ZBiF+IA7MhlaCAxYlBAVB8BOmlWXGPOZeb18Ox6Pe+BPPVysf8WAYj3BrJATIePwpxkri4+MAf5r40+plPENxEwIi+3R0BFgHzyAdZiM+Ji4NGTbk3cajke7xgvudbqvpeUf3ok+ddrt5eG/+KWgf3ss/mQ/de2NYckxKhtmoSs3KHuOJstWXdJTEMyS2uuRLQrslCsBAYWo24gu+oNQFpq7r5du18hx/aocxTFL1pPWrUkiCq64UGP1wudG+XSy4OgPs3qeNl0tTxa8tJ8DpLGlVXMy8QqY3RmSY8xjxIOIx8r5jHiPvu+Ax8r44nCVMYQJXXAy90SeJJW5Q6DNohj6++yOYcTEM8DkYwSV988MmvjdHcM5bG+iTGuRZ8nx4pZfFp/nwphJARsNZKZoc0yK4xKrORzDlOWY0RWb1IpdbRa6oiO2PYMJzzGoKXdYLXW0VutGFaBA5ZjWFruqFbrYKzXQhHKnNW3DFl3DDpzDjk41ht8o1owbNhiNCMeKLAgAah2pAIIK2qACBZGtRg4Vtj2DJr+CK38ANn8GMX8IlXxa8QrZeQ7ZzW0EsIwT4jQvNQ/zBlX74hauSvyoSKEONi6oTmMear/kNTEW/sPUTwwRgR/+JxCBoMSZs7uMAe2Kei0KDUIwUqY8ZJKScKHYvaLdRIjawFPdAv8gBinnMSzpIuRfadspC25b4o0CgXMLmCgGHD/L4uIt/04KhFmtBI0Bhm4WYrAf3hJ4ZbTB4cioT/RFj68dGWnir5VhJbO1baSWZNazOsGKrUWyhNgV3KQm8eMsAVQiUPuj8ae1EIVlPDZPRJ54SfR4mtk8vvn4J6CXQL016aY6KsZ2615aChK3XEAv+wH1LyzbXbIessx5uecJDNnC+K0fFA3F+ZrQnkfiB8P624ARDATJavi7eFJhxGQ0VgiuUQNxjkelVOr8J0zW7NbL+XEUScW8hCLFAg34NUX6TjvfqmoDtQ3/VixjyorUclAjnQKx1GK257MUDK1pGibKoxvIcy/u3xWGUPu9Nhfl2JawUPPhjqPA8GHN6pzcSTA290T5R0NUqG/r07I82aPbvqLOUkEOMdQmqKx/ZAQqjOaWYd0gHyhWonbR0yQ+MhXOLsVB3KTIYM97SPjiPndoz+8dzFNcUepGlsCQIGIMHj1FlVMJSK0sKFvNWilBBKkIccDpJ0oswNWDL1pr7xJN+o6HYre5NVorTDITSqguQ68RakpG1fcdqijNwxZTMhJUKiFlPVqebcn2oWtqc31DWtDgeRNiSTpPFUYgxHK1ucsyLThw/Hviht0GPHxt6PF7xaChGn3IUCCWxNd6YwPesJ0p4zvGYxQp91vi/sybWBXH5L66CtFoFCa6C2ExnjqugmIx0YM35nfVQrYaU/2lpZNP4X+wtD60UttZJyjSeJ5AyiCuszXvFROmK5oVkskTZ4gERNyJ12RxIXL2FwxEUZeFfwePk7/BYSwAJM5M7mFkin0bRhG3gKMQGHwVbp255YuZ3ELKU5DxGsUQxsIdWDLVijHALmfBN3SOqNxHCkJD2Ux9pBdzqcSFYF5bifeEqwRWDEgUmCLeU1RDB8UuwfF+zqoVlOYuQQFyDZY6wnJeFojUXvcgAqdGwFH9oRaBKsea43BedRHPiRjtjEa7yPklCGg3VF1uQllz0LFEqjUhHa0k82pR7N2JXaltjZ/yP5wzleV5v7Dzv80VvYfPn28TkSlgKFrCwn6O8qtGY36EsCa/JUnrxalVmSQq97Y2ZdFjYadUT14CD6zZQ1mNwsYDnlCCvYSndYkJ4upjPTeM537ENQWJAtJ+LQoTyoNqukatQ8qZgwDT+1vdz60BGywOqa99HXmAcqfG0yJ8Lvu/DZn3rNbM8SOArePAbHtB3EgPs0bzWowek0M6juYJXbiVaAbm7fxU3Yarc7Nfc9OvHtWIvK1kO5gjjNbxikEP3nhXc+2WY6g21JDIMxhUeROABZiGkqaViGujSjCErjYnmvZS4Fc1KuJ2JmzzE33AMCVr8FBP7XsgkTsbU33C5BiloVWZCb+TCGuOqj2V2aT1B/an+HAtrwdYMltU6nIhNRQfn/HpgCbNuNHu25Pyikjzo8VqCL1KRjyPkJ8gE6d2bZ2g2lKUiRalAqT5nGwdceazqKlM6lAp3PI3kSTYR91XNkEAZ9KchLZmrm0GxI0PTLFUN4koUHHO5YEqFGM1+mfNmc7jC/YIoWX6ebX9GOb7ZeS//9Z1352z9JD96vbUT/8UeTBtMueZXK+nWulFN3AVtahVkPPADxjYL842yRD7A2+e4FpTl+OxTlbU+KLbFf/bIqKLUSQZsvYvTrPZb3TXcjUpG5/y/Be7/DLTEJUHyNyD+SwCWCriCsyGwq6HvowZvV6ch/aG5D+7eQllnCDDFkGtJuB+s8ZC7t10Kv3m9WgHBcGepwJ5qgJfof/2Dbb+EuNyAeLob4smagaUrqvi6hA+bXrvlH3WPOtA+8g/bvtc6gu5h1+sG/lFAXHC9TSJ9CWSacj2yElKwxNVrMEJSlrK6ZkgdF7w3KYi+43hSOjkRgDazyjtZZZ0QKWIv9TAqEF2IXWZZ6g6tQzORtKJ1aMYmh+mIf0EC9knhPqCbrJN+WbVz9l9uR/2gne+mnblQQyBajIDvCTcThdUbwa+YxX/SFzJg60n+TVipm1wu5tY3YUn7NTIyDPxm6/Cw3fWbzPZpG6qq0kZ+o0oR+0/6rOvTbfNhAhKyUdXHLxs2H8FK5xsGpfXX67IbCvxPiqFYtDZnr+tCJBL2VN++1b+V5giYRbf3TnOIUaVyul8v8U73XRSHwxPBDyYinkdKOMgZGUnG5x8RMwG34+kiJWVoqO7a3f45T85DucMet7ZjrA00bwv7XDEJk+LUJyZhBotc3K0hhu/JlVaGhTngshOTcA5zcS3mYQRmFJ1WuACkjZEKl2suYFrRxQlcwQ3MOPXDlcaq2EztJV82GveFtWRwzueNRtJo7C8ajf3LRsPaz1arnDUa+9Z+vFrtp6yXNRr7+Wq1P1+tzlcra0JA/wgz/lJYM5gwBqgdvhzM+FtMeCisS/fOkGAJt0X3a1BdMxaeD6wbqvONAFMHvqXWwcX35OqAsaKpG8bCGT/Fx3h3bZCCZAyyRsPKB6YU1nWOeMFC60pbCdBhzXy+QvXOR2FNYQYW0kRte0qDJgXRVe1IBjVYWIKfD26qj6E2QJhow9HSuvSisi5lDKa1Y6GoNtQ34q9NYUGhgrGgNB7bZQybaMVyjSy5l0laNzYlMu5wCfvWBg8gK35QL511QQHk9vEcq+j2eVZw/2iyY0n+ULMIpRAoc7qQmw7EIKsO1A67ss7t5GyT+4mdHOeFaq7SN3NRnm07X2XsQKyUS1aYW6d1c2v98sL06DqSe2lP1KZF1aeMjK2Fu0ir9UtGffVMZHxdNxPWc/rsJ+nKDtt9Q1l2WfXvoi0VrchqpCUu6IYmIBpH51AjRNFu4rOo0ZdlQV+meNYvCMsdsoJivEbDyupr7nJjzUV31lxUndGnRI2mrDfjYlAQEeHuGD9MN4CH5IPowWITprUBaJoAM04Hp8qIGU0RRDQRsjLXwH7eWLf69H61mM8L83+pD7JGGKxo3JY5txr9hkCr/0vt2GEY7k0D9sQqbSmqKdibRCo6KIwglDuOFiijB6VX4C2RkjCFSZYKFFnJXobG2/MsFxYLRZ1ZhHGUjgVZJmM9+EzHsTWzZmwdNxpI2JF27SLgHw3XbUhgEltE/TPWaOTVNO0kcDj3830N0GrV+GxLaKpPD1TRozvb9kfD27JbiX3SpklX1i0tbUR5ZIy158prmV0JqW4sAQcF+h3A7YVQIXZd1uVYD8ujJ4osxJaRaIVae5dCTbPJtslJHS3E1ln1tCYiY6WyQDUa6SANk9UqhZhLt0TDwUH5SKxHeKIXU06IlRu6HpfCEINU+2q12k9Wq4zzpESq3KAT5TZdfIvdyWv9e7l9WL5KrsTbqcwWF9ONU/XbLV5WuUvjcIQTis5HuEIg3blijGQIUQbHQY4hvUKUqsnDTa/AHp2amsWDaCNcxOsqv8Hr3rkU0WxdpGJ/kBoQ1iESFQDaEk4VvdDlhEvWSSQiIPHSmiSGgsHfFDNLZ6NcihLdNbMQDQukM8j8AJlKXMTwVPADGsEB/F5xmgWX+f7Hu4G8Q9H3UiO/R6HK+O3NFS1+jTJxL3PpsJx/SNTU+l2wQcw/i3Aj9SBJdeuoxYz5MzSmdrOFuloo2r48jX2lkeSccCqmzkC0Rd1Bq5iuNtkNxW6J5pXS39wurRRqx1hR36LLM2QKt0lqOhPma9o9F3dbKdYuyoirhio3H7U5LLuUN4OoJe9zft1o1DP26583KVVJpOtbvjGr2OI1bqttVaz5vFcfXe0TbI+0d4eWpTtpWbSxaMds43W++Yqiw4Lx+PBDVLvjMkEOEwUpSO44SwmtNUuMUXxP9JMeK5VBCtXSGRdO0itO9v1sYGlZeVrn5jIt20AVey0dU22esbAogpkSu1TRgXLzaRKjwqSgc6nDBci1dJP8cZISXWCNhuhzn/hxNO7pMLjDHEvItH2vKh1tUrtkbsn+hGUlViVWhbOC3aaI5cW3UnOxdfZnFTgzaRko76G/Ayt8vlJqVG05LkkUZpO6DCcQK/lT8IC2BSPhTaPr5CJSmSQbzvLNnUZysoykOMnS8UJKkY5vGg3rT8H/MktJ1ow9pdmL4UWxKWMXvgp4hURiS4/xmyj9ISGjLup1kF1pW8oYxlkaJxeoVdQ8oau5x0ZjB9HdfyfcaZTTDKLP1gZkb++ypT/ih7nqVeJwuc/PStOFdJ+f7V7cRFf3LrPJYo7mUu+EdtCDf6FZLYDS49I6FJRKkUeyGTXELrXz7s0zBvndIzG55+44Kee7GF+deRdHjK0UhKrR2C9aZwT/XQy+Zi0KPcJ+ocnZ942DyaNCbkJwRaUDox1S80EnaGnM9z2DRwptqh8V8FPlSlUEiHL/2t6ydoAj3DluxqrNmUCAy/4lTZxFboxxclFt1SRJ/PkCu+FDgzPb4u00uZh+iJSQLyM5C/01RFyUO+NqtfPIUGf7Fwjn5xo+rwQdkv8QFq3t8AALHIA5NTybhK/EmuHKs14J22f/kO7L+398Prv/+NHnZ6dvHz159Ka341iQrItzSa9+IEChTHlUWK9hznpo2ltwd7rrs6Lrhskyq7vkQsoRKC5Y70U5DMWgHMUDAbo/4l8ZiTEYSKlnoGH1XlgxSgK+alp0Hxm4kyxVMpvPhezVNt15OF7zr6JnTGG2uNuNV6zpg0CdWD91L6NviATFSRE6LcYslDToIpmVQdkAXElxLVJ1giAM973inboV7ntrw0ruZXVOuWRit1mEZY0PmELFfoQTpGAlNJ+icXi+mKvw58qut46hdS5PDVTtFT088RTooqGomNTW1c4BFGvqF9LqVQeGPyqBr8FDZag9kZxSCo7VF07UluQKZE0Ig0qaSgqzzwtn7FriQO+skoWVHGdiCRiaSkdFD9H1Wy98fOpVTyjaqUnTcSDFSfxdOkuzZbpHWq8DVozH4G+oIFfReIbqwGyCC418A7I65GMc9MS6pRrCf63kmq2jyeQRItOLJFciFdI6MDUcgHWL54lQrKvNkDBD1ZaXhG0SIGg/TmLrgCgtOlw2Gr9pvxDOH4jqFP9ck3fJes9RGT8XCu0PQVgFWdGkISuqZmusNRrPsM6qmhdlNS82q2FrxflT0Wh8Lc5gNRQ12MRgUtBAOiQerGm6bmtROB6LjTAcT0Q98oZQd0JnKKVDekhlYnqkCnTmRK35xTw7j+Zv8VCVKfLc8A/B74IHXTiEI+iA70EbfB9a6ODRBL8JAfgt8MFvjyDWBOoxGWvn+uWJdmIgXrpuRlaYws8NsynAQ6/ybthivSLNA1/jZ3SnuF+YBUeb5VthoIuMy+aHHviAnW1BB4xjivZIgVYXOi046oAfdME/CtDNGJrdFqA38mGnC74XtMBvNzsQeK0uNL3DAFreUQc6fqsFXSziB0G3C34HiwWt9mFnxGCxq/E2dOAQO+BRH1rUDQ97EnSpMx72p93BLnU96hXmw551PN27oAUeuqyWJkiqLl/RHvGJYVR62j9A7CVprvC0nsV7j8VAC+Afix9E2RB1sS9KZ7aK18TMKaR2worqCtq0QcBs7BeexIWyYqgLVKaqEDp5+1yiBuE/6Cdz42Q+x7gUoOy6/GlSBdW4zUUYK5gjgY/wZ4w/C0pc4uMUfyb4g+vtAFToQRJ6cINJMxFqt9saib9Spd5xT6KltjKnldtL3OUXJWQYnKNt3TUSp1nowQU1EnpwJsJ6hTeqCqRSQ/c7bvo8MKaP5B4BCf6x/c31kfQ3/JcrQyyDl4qtcZXM1F/aun8XhbH7F1FYu78WHJ1eL39QslS+Y95vZfmvRfF3gkv9dF/wVD+dCJ6s1xVan9d9cl6ooUMOw6IfDI7CwBGj1ergoKbyN/Ogt9Irwc8reZYlmU47+D5PzvVGtndgK/tgzzqwpX3ADipWvNKQb8wsej15ZdCEAsDKAJgiJvgrvyEBNcOVq3pa04Sb+oT7GaNJvBG2TQF9Sg22+U75yHmJgS5TxJqp4fQXtWFbT6b/EhI61bcbijzTnglbuI9E5WD5WaDTDWZNQL/Z6O1cVF+kBSOeApa0eRMSnjh+g6oF1DIMBarl7bfK9kfuR3TnEu6pGL5TVsLKhEcCvXBe1tTTrzeASaMjOemuPqYj9EagJ+xf+RyMuCz7RX2Rf9Hitzr6CPdcOKc1YL9TG6r0DnqbyaEYhQodxzq2dsWq6e7v15blI2Ufgl7skHIL/zLHR+d5ZTzPLWV/xDAuv35UGLDIPz7u2o9KyuC6LpENv82AqMRbEbYCeIAU4WlBY+B3ETaDw84hvEeS8QGJx5/IxTwXYQIvNGV8IizM08VzQJEg8TARZvC5JJ4my29Y/x+61i68wbdf8Ocx/jzBH4HkLiWap0L0fMLHGH9y/Jnjzxh/FvizxJ8p/tzgzwx/zvHnGn8u8OcMf74r6ohQVnDvgUJTii+q6FqR8loV3f9A74+wOy/x55tC4vwMH99hbffx50SFXfisiqFg0jP8eYQ/D/XAE2W9V8WmwNzL6MpCSaF1+xHr+kg58edUhR5qTU7LYsG9p9iJny/6UlVFf//Xir5V4Rt0en5g/j7Vf2sbwsl/tiFAxj+jUUrmflQ8hcw9VTwpYlRkbAfh+1zbL3f1usr5pspJW8pMWcORVmgqi2zuYqU951iNdj0rBkQi+xC3Y2PMr/WOeqhS0QnUdV1R+JAnyqoDt/Kl18JDhRGN5FCNbNtIGE2hUqlflIRkV32QbVB3H8MOGa8zntkS41CgZxmQ02bW2zTCEnUjrGLPQG99w9mg9RZPhnJk2wXMb82xxwxfrMke1NjMPcG1sWkAVzSI3cyqBrPKD1gOs9Fq5aGXon7qpcMEtxkxuEDeSzBc3yZpixdINS/wSPEufFS8CQ8VD9pdOFX8IVIz24eX+AhvMb0DDxTHTcAOjuCp4k0PflfcP4L3ius1DR8U99vwp879XHHHhxeKDw9SgbrchHAhkjcHgHFvRHS5J9LJARwcwEGczIU5blYfzSue98qXJM0XcZyME5GqvUtxmVF1mlMsMx2M4KviN8qaKwav6ClSDH4ruXP/iPV+U0O/M+IB4MPhiDfpoTvih3SO+EPxZ8qyKpuXAn+CbncHPtLRpNnnOrwDogHv1r76rRZ66W18P6p9D9qdXoChUmrfD+vfu14v6B5u1V+z9mcMfqEem142PdPJNmPwWPETZf2hGDyhp18UA1HzMyiIy6Zlnqhb5t1qTQfa4g1w9xumo9BHngNZg8Txe1kfcV7yjK2Ddte8BO0uqy1MZIptf9PbT/a5jm/1QypnFy7PaHGtG5fYeExUjzxR+jxuNGI7c/w+T9htiqGxpFGUrus6mrsNOH7VRLrdREZN2CmND824El7RT2qlqgbSNbMWCr4qBkrW6ZoZetsPKOZY1XAd3siRmJiByA6lfTnAtkMEcC0jIorUMRBLopP2+4c9pZkY2Q/a7UHQboeSjWh2au74Qfuw1/YDw8F6nIL6oGeKCfDj+DVb/jWz/qcQ5H8bI0pOnVljBa/QJafcqqSsWUWUgenUalU+y8K6yzeorTlwgfuvDgupeedib+nJvtcr6XU/EM1BIJqh7EkHhWTZbcpTWw0z2x5hkCGe2OnKWy+nyVxYjiNYL/0HNhH4kJiHwrsgQefdVYpGox6R8lT+T0QorWKTfqLYpCZCaSr/nRClBmVlGaEUH2shSnWtJkbpdSSHiYRMQiwhlzCXEEkYS1jIEU9lTSAiLXRoLq1ZalEXq3kj9KvskA0ir/4paK9Fqx5JPEiCDiyVz3Ifg41WW8AYA51pyYT6yzil5MXcLQCcfhJVSNLERCmtJ5kopSlfFIEsPo11HAzjPR/pt8Kxfl4EydCvuSxClcayHqs0kxvBShO5M1qpXnApxRPsYiYKV5p+Qg9rVhgrW5WR8SeDdJVch/TnfgfPZGdiYNHRVrhXaB54RQe6M8E9NMo6ExQE1jqr5+j3eZfyOLxu/jyhWqlMd1BWqSvxGo16Fe8URsaiKvzG4WazNdlNubqpDr/jyIGFWfUaxscVRkxzzwSDzTFQBBIHv5Rn4zP0m3f8Dgt/WIfJVPfjoTFts5IPN7hJOuoqPOrWiG6R9XQr6+mPs75Um1lfqjIrNfGnfvNBuI/R5vUJRQXAo7VwhaoDbia3/JQQeb8r9LY3f/W7cJ8pxxnBuc7vo79fWcmlvBvoTnfo2JzsV6tiMNykNBrIRx/zdChrZ/NzuSkMobbpCCSPj/XG2kuOUdqAunMMBYoPl5Lsfb/rYAHmCf9+UazRSGwb9ilLuvmJYSC/78bfS6dLnkByfMz9XvGlJva5ljXJB3k2YpDG7wKZdPeLcL8JyPXTfQFzbhgB7KKGvuLvFYU6zU1IFG+fZxoaiKzf1dC2MfeIz0k88oU64LGQMp2qYt8J+pirxxK+USjozwe2PUeF1zAp5/8LjovafywcB9BeFfHB4TFmOlVFmKLXgs9BVnIPrPPXgOGu7fek4zCamgzdGxOe4/Ym+axIgnQTaxwHh6uFPLXXtOyZGbadDVP8W/bTMqM+pr/paGD+hiad2RhcUI7ch4pT2Yd4BC4wFWfadNNnZqfFcfR5wHobPSl6u8kJ6TkFivWjZzbiCBkYlxO80E9fYakf3pH7AT6dCJiYGUIO4YPq84xOdMJ9jWe4YhkPzXp6pEZ6Umm/eKRsv/deGcSoED/j8+FcDxRz4/D7aA2W8SlMbJsBfTxVPIOoT3F2TXMYnYl7kPbR6cGK+WKYOssRRiWYlzB/LGye37MyO2YwNohBKWNdqR0z7Y3n7fMJu51kt3p0yOOidka31GOZ4/TMi+OAfrL9kc0D/TLF5InDAzMnk745YmV8iqfqrJc5DrEVaVmpt8/TEsUdR45wfMiqzzXe7mNULEuPwcock8ruzTWGgUngGYPUcciOkRT4VuXRaxzpKMgTAqune+DT3GlOPOaxLYepERcgxvGYsukIvoahLXgt3SR2XUdjxp4ofqGsjEQZ6COO/ciAkApHWnfj2iR91C/HJwGAh9VCzj2Y80OITBwhjyMvbM253+xCxJsUTwlluadKb1kk4y4PFYmOkkmSWKzOsu28z+erVbLPYzSYjPr5gLYSAqDN89Db58nASgjUtS8opX1Jp2x6Y2He9z1d1O/qtFC/HZr82PWMJ6jSiwe1HoeJSejoV8uMry5jOtuGC0IlK6GCSJ7zQ5jzFuIk+cBQ/XPerM4fkYZERNEpk9hKeUZ1RAYYth33MSBXus8z4jTn/ZhNslviK2gsuGZU+XiqCvri7XPHiY0CHpF2YKX7hKh/UZYCp0GVgUCpqmfMQl9jpwkBY2GMEK7VSHBW1XOtgO/DITkgVJkPa5kPt2pv4iGJ4/kkxenJBjXwhalJ6OhXywC6LtP8XtMScY9piHl2Ck0GxOZpdkuav//EaN9k+Ya6TvczdvENVpBgFtKl8Bpn8eXuokDybMKFo/39I8HoqEVOdO43NcxHaHBoVe+2P2IYBAlpCb0HI8hR8eBhBCXNOeqlqv+eKhZaGRcYiBvM56xQk6jaC00k/4rkCj2ScTEmDl/QO5XD0AdEfiDj7xRaJ1EyyvawJvqrK3lVryR1+LiqJMVKCmzLj2nEPdMt4vOUeTg1OsDXkg9vf1fhnxLeo6T3A/78iT/PUeYL+O05fWvhtxZ+6+K31p1vKPQLfZT5hd07Hzv4sRngx2agv77YqlYX9Tv1r1386v+wcO0zqsqf0587GZpBLUPQ3migGVAVQRezoNwT6/CC1t08+LHKg3YA61F19vwm64qle8KxRL81OAq9GnF6t8U+WxadEJ6LT5I1hPun2DpO3ZeF5nCq+Du9Qqe4NBdDZVukaBrpEywyBS/EUDWE+ztGEXS/oqpxqkaVgq1IQSujmpLBnK3o6weU/XDU7ViYAh5YOpHdw3f3wce3j84+v3705vOjF49ePjp9WxvbZ1nZvUri8M6FiSmMdfQUij+U4xD/8pXi3Jq/JOXyQumkJn+6mfmFyfxiM3NNG1E7UGjxkXCjUrWY9FMS2aUMl3Ay8PCYFgmHJ7BEk2MKKSDIARBtq31OLsTuAzEQbsJREOQmYKRUO8/8tiSbbBYGZVHiNRK+/PnCjDpgE3s6pr9JXXOyC7iTTIeSFu5n5aDxqCNcVLuQjIMYrliZh1wNJE9Dx6dvktiuGNkWm7SljYZF9HUByPkvIIXU0fRVOaQSjs3fzPxNMRpNTGyLmypqiQFhAEjbQBo9vdxIMJK2aStZnCj3UlAbWMbGnmlKniubK/2XqucfVckoYfOYaA5IU0xaaJzYsS5Qeom5qXM7vuOyoUjHO9cLbCwURdxLqghg9a71WG9dHhlydXyKkN4vx6wdd2bHODXlvPFyyOgofiwHtDQ+K0eC6r9UFBvopWJ69S2AwiMId8alrVDYMTuWtsmFD45wZ4DTQJM/o/TipayD8lAtNlf1ffiRNLaQqKzjvDRv9sr4+bNiAaF/lXIvxT5e+tMK9rly34pGo31YPHWOiqfDZvF05BdPvlcm+n752Ol09GPVpY+yZgaBUV2NFYS2iKg5rNXXgu4oSdlJ9oT+S2jMJ4lN6At3KgxkpoKBYbU1riNSLDFkwmf8+UVoQC3RQYbeNT5OzN+pcCj9Df3FNea+EeRn84vg0v1N1JnQU7lhQUKwdNHaD3/dF2onecCOVFZUvwnbNIdXlOi/dde1TeGCbiOJLZrX1Ur12xhWvpR/kpGMExBe7uPYVyvC1kg0GvtI/larTqfDeUqT09rnO0vSop6KzU9tHYCFp26CbsOJQvDs89R9oxGMpgu2ilK+5wo8bZNa1I3d+SYtxY75N2lJtqsrur1ab81AduVqBWUmfCC6jO/c95sMiq8VMnVtK3WvhdM9Pm4hE6ipVurOUCawWgX91L1RAy/s6Ac/pE7cqEEQNkGuMIxmRw+eaKNc4b01SBGbviP/0fTho7TI0bbKQynCTVCsyPR3o0hw9aaQcB+KPoMBpgHvHWAmsdU+NIMiCkQ45tFCSqHpmwe/eWSeuugb9lQwerHw0f2K4/KYrd9e4NjojegEpb1CELQ2037DtO5m2h+Yhpdd6LZwHVP6L8qkmLfSymk7VUur7yRrqbVJPipnYHuaWqG33fJj9IVbzOf7xUC0ALqW48lG355UfdOAurt2kXrQZGCG+yifocnqHPUKzKbqiq783d+fHA77WZSgtXJU4DnSe6JDG0AodRNIMyW3NP4V4HBwWFqSiBls2U/dP0Sv4LTwxcEP2NISXdoMQMDUTmBBHgcTKTsY8khfkNP5myGQ0MvhyfrH1Utdvc3lRuXcWxOcDpu4NA6bd+Ggcbd8KCPsFRSBRqYZLeo/DYAqONVeqX/Xecm9tSrWyJBGbI/0PNaFAor1igrrHT/yseNH/u6O/6HKh//Rjv/xUx3XPfY9grXv/QDYLxQr+mQHhEqNhrXZlbt9KdcoEkXdByKZBd0oCd2aqv5pYmm2DtoMUzdX9KAMd1JtDZJ7Zln+KWn4Ie0cMzXYUo3vG51Dr7DGRmav0bCeVXtgrljxsaad1BppItlzLeN9rbVOiyEyjSPNIRu23bYLCYfivyPs933a7fSiLmtVa11hihW2as3pMh4bDJqaT30kfqq6Qt9Nvt6Khc2dQNBS8TociEHmD/XEa1AUSbQx1+BQQY1tgwQTkfVG2WJMFl9Woo8GPvE/C5S/pJzbdtJobP5l7DbTzPdDhWvCYO/uzD//N+sneNKYo3GUY2VOQmc4ZDpzvUvMlR5KMYrjjwrjcf/l1JISMVZgfua4lsnm16c356MyBTh9pELFI8KJ/f+BG6/lEBfMyP1dEwzSqwccrz1qou1EwYh1Oh1aGHK1Cmo2FYZdpFy0XpneyvT5Ff8oHeORJFsBSg/p6XEp5HpcSrmgOBikLGzrA8B3XMY6NCDuvE3yA7JOpKVPrqmeQOTQaD/P9B8EFsZk2eRo7xKWIhbXPkcGCNnOvjewAs2BDqy/I2a1lA0GSCdtMD+6lrEoc4zFnXrG4m5F4+pyU5T9VjxoabaygxXVw9bDIeg8ENzB35LGIrvHQr8WN6M4ZdKxxEDKCWpnTLp86a2oQocueKxAuS8Ez/HvV/P3s9Dp35T++13bUwmlb+n7YpJfK5291KOjNUilKqe3UhtOb09FcfOvcn8j4xE80OGfZ/jH9xFdB04zrInlHmxrdtGCQ5vex6hiEO4Y9S/CvVYwp8Q+iVkGRK7oEd1QSLQFY44iCFggCYMlEQyY8mX/oRo8VOESJnxBwl38g+rqG3rAa19gph9HvbiPEiHScfdRewl5f0majSUrpUQKFkNpx6N9Plut6NHB2Os39DLa5xOdimlXbJylKkkXwkQ2CDQ5pxuusMlkxDlmTkY9ltg2UQSeQNqPDcF/g6fAmKeoUMyNBGhHxwsRiqV4NFSN8Yj153Sgc5zqhs24vxwsw7gC/1MDfmtDlWD2n0LgL9wbZZYdCWU0RcaHmk0eSN7yjpqdoNVqHRrho9dr+sbAEl06uI8nKR/vuyRuobDI2NyzzJcjbbxQvPre1nuzXtI3DTaD3ltl7KJqdanNvEVzZCrM4FoLtd6q8vGBQm1tNTaq/UJ/e6jzuq8FA5N0qstQkqnhKZos8t+VQwbQTSM6fKmGGdqLkK5SOU7t3i5Upvotu3mPrKlBaTNmXAaPhd20D/v9Jq2GJ+Wblek7fkhQitYWVsZjxsKMx1zabcj6XNqtRkMN6ooiFsakWdLEXiuLvmhyD09Uqb1q6S9W/YYCwl8ChdaBOEH7ENqFZsXxy+fUaUHLxBs1dlCVSixDTQ9p/pqsd1bCFOXvcFbCUzq+jndgYG37BYhtH3Jyf6hNxylO442mqY3GxOxRlWzUQWkrKBK6MvrV5OWhlqHWZEG/y40wRnp50CG+FMNOxYAO8iFueqT2eS+11rdSYHzYrEb10Quv5h3w5w57FiyDB0A0gzqn2O4eET6Sgpak570kEnkm7FaAWGC6dIw32SZFB52E2Lhi4LKf2qYeMtgr3xhIssGVPGGgrUm1xBv3W7oCGh2n92sFmCFAMW/RRi959RHBBIRrhh2IGZR+Wk5L26QUr02yTuzWUoIR/2c9h4/vmKWYJaC7jKmXGGsPSPR4aaSPlySA1BOeUewTk2aTkF2DpXicmNRM4V/poJQdq61k6pvVylptsqpNVrXJ8hjHeUwcWu4Ucwc5UXJUIJ4LZuTKsTrmFO6R9AH4BTbUBpSidQFodCSIVxeFDP2uxoAVxQ2ze2kUMZe4Xzu5jneI/G1OFdiIbjm1QuoArUW/JRu1iqfQhUlBUuucrloZNMVauemt6cy6XGFVzHqU35suz4yOI0bTq3foKtFkoT4stui3UnjoAwq+ZrgKCcMN+MBk6VPYiUzRtq2VRVkB0X8duIldjWUXkJN+tZCSUkVB8Ui3FTKQFCBPKpAnNZCTLuEuWDaWd1KShQTekz1sWQnbWONW2ucZ3mZNOwJuB94dWCZ9njJa7h+kDn5ULON6LlzS1VLW2pO4RjpxCRRLkhmrNpxFnNBgQ0X7fEuwvnmkN7qe7ZPs6U8dZOXGKdaS/L7uLE2S9hYi2MhjXmjl6Ez3QMtX9Ony+KNi6V8fIUvJo0G5N+YgmeqDpIG/Sb17oKQT7JlarWhoHxW7c8aEUgdHze9Sw1EZf1Qu0blyHNwPCvlFbex1yxjMiGdqzESynH/tLEskCvV7xGmH+PTfPd2WaPLifwlN8GhRTMUCn8w0chprgURjtPo9U3+NT9DuU036PI38GE75XPFSyEJY0kdDh7Is2Rzobhx/NAX6+Kb1DUsj3dtEUNK3po0GcSYeK4RYBmkrHqWEi9YKYXVklFrLvXEZWqFOdT6qnsH1haK+beC675TpG9g+RpDRHx4gbqJlLG5xd6C+iaFjZdS7S70UCuCbfv4kyq5NFcQY3IWWrp3B/xu0Robwq+TddgCvJB8r8l4VvI9hieA3yReqHqjO8VmVocngD8kjXSRKGfxSvo1T1vtDan/TTgsC/Kbf/FYAJlDHY8nnqrzqxwlYWdGTnV+w0sdFNR3w4bCJITY8DBYCT8r6MSbJYYA/3SKKiCj9K4eu6/4mAQ158G5HBmr7U9N8kCl6DT5GqTw9PcHtbCPzK2myxtvJ6KJ8BK0jv91EQ1oq/4dkMKenX2TN2yhKN1nvfwQDEQrb71QEZ/yDLEG3dulRelcpTFvzXNCpbCnoOJYL4tEXaHWeugu8AQZdL/oexrBEfwh8XPDUFRKWPHUVCiTQ2T11pUR/90nxRt7vVzx1z3WhGxQI09OMp+6FTrzkqZtKOOeZYyFJQUX8Nc/QS2Mq8DzG4IIntjbKQRkV9+A79+AL9+A1nuRDY0nc89v9sSaw6NhVqDyIcO6JXmSjkbptj46PxzC2ub5XVPLFMGpMR4Yyf+GVGwxEGLHhC4wd/gX0B4ywwvkXdpuTI5bx5ZCVfN7vNL5QRWfFN/jSQHfXL9qZo/dlVxdvUzeR3O8EnhH174n13e6e2TxqIGS/IFhrnVv/xeh/rmoNieUwakx+HhLlWL//98f6/Ydj1XTrDBY8c86RbH3vLwo1zHdnQcYG/ZtG47II7VHc7zpJdACZPZVle3Ek984xHBOU3Tkqu6N33Rl1/TW/cjB2B0Zt2g7wYduCGUSYD1/bNt1XSXKxvc3rjeXOzBRF/jXPnO+llYPsz9jta35lzxx9o5zg0iHjKPHv9wBlVqKverattjLrUPYClxEobLpe/+xHnZ6ZTlOvNYxm/w9gRCil+kGvyJJTFvirN+XwZg/30K3kvr+dxnT4M+o/tfc/2lRJLzotXEM/QFQMA7ATQXGpGjW8ZLZVrRQ22q46ia1mgA+mGv/IL6vZbHZO94PNf9Xr9K8aX/ywccMJXeAB9rqfadvTb3zc7zd7icO/4RL+dnzchKhBe8SYEWM0F3SeXAqeAZJ5ftFPBhdOYrfDtmMlzgUjCyt+3c8G105mB+3DMGgfolLtGlUOVzzSUXjQj29c+rku00oJUG2m0/ouyJd4F5Ea+K1WJ/RbrdZ2KBbPRGJJZOh3/K4HuQzxajUMfzGnx0hi8BP8WeDPkp4wNMkEnyZoKf0Kf4QMJSiFVwzhB4lpV/h0gz8z/LnEn2vMdyGrMC5o11G+YlwB+C6LwCkpCg0xdoPE4Iqv8fEd/tyXoaqZ803S7fvD8ObgFV3ru6pZ+16l2kGWVMxembssXvNPxJx+PUenBXRveuUMmFYWz9qAnlGrVnEzMaPmrfLSYjSpWolC80RTeJny2/sE5hMZihQ+y1Cm8EaGWQrPZJin8EiGgQcfJSIEPMSxn8qwfRTASyr2FgGzhnNTj4f1KKonpXpiqmdO9fhHup4O1uP4uqIWVeRRRX4tCtV1WrvfkbQKGqXmEMEYFmBu98b7Y+ASzuEaLuAMvsMXeA3f4F0ZY6LD4H795YTng/M0vNTGznOMGNHu83lvbtvs3XBeOH5pFxTtgfJuqIbRCKOb4JclT9wHEhbcb/cWfe7TmfLdcDHqLVA6j2Y4/QVaOfIFCYAXBcN/4r6VA+uM36SWT4o89LHmZ/rJxyesmPvgsdB4I46531v0x6YJvIjetrWbzJg0TEs+ZnDFfZhzvzaOJLau0C0SrhyOYwKvf1Vo/3zs4RWpEPHkt1r5+3zBqq9Y+f0hmaGbSnWd94dzDAp1fzgf2VjnHSih7GgYYSCDbHi/gNiIR6yXLxMTWXEcodtN+IW/5hl84yfuI8Pb9eiLH37hJ+4J7kgn7mdJOT4WOSYijjDkKGZ5o7M801keSqTHM446Pez1GL7zGOdoylF/58E1OiHdYDSoJVzwG8cnK3NUObsv5eCmz7/K8Kb/VTLSgtc/nLin+An/sE3FEbJxZ/witTK85RUmIAzqnbj3JYNLbG3uTOAcH6Yw5ud4xj13+KVhPKxZvz9h9nmP5v+7LUb8rDrpnutpNtX4vVnjsscuKcKZVlJdDqxZg186Psxsfol3DnkQ2TZinOPgBGnHKMQ/Db85xqbBWVmTwxSiz6xxwfYxcrJxUJs0GtaELxl8t3WvpxyHcEUvvUV/amMOQqqpPRnBFXoGsqltA6Eb9uzGlPzPAHzNZ40LvTBwIu3rEZ+k1hSW8N3BBLY25kMz8kOkNTV3Jgyd+WY9M559Go8ZI40MkWNZRw5dkJnV+N3Wc4JLcRfgd0O9OMZTR/mNXsRLqOmrL+6QMphrYhbRxSQD1DYe5yH+sf3jnEX8KrXQ6C4FUV0+V2bt66yo2sW0RsPHuJOF68VQjfBU16NKYnKTdrQrr2HBdD5dFVXk5D/MvBdhfBpS705S66hDWxCzpJOWesiINpKzGi8A31N++5So+u/lTtputRi8l+FZCh/wdw1ffiZXtSG8TqvQz8Yy3iqMy2cC9q0NQ3nl3idLFWTI+spNJCYlsk+8Flut9qsMXW8rg+8zVjf2/la1zIV7Xw6+pOH3FCS/fSBDb60vHnxa93ozvqkYjajVT9Fx/UIOUySHJjCFjjNTSz8y6V1vM/2wSO9u16Pc32Utgha+gnLfS55Bwo/MFdHYw2wNOT0ka5gXfcZar1MLucMLCRhDFdFSuGcS5iCIhGV6neCdww/IwV3yOT7huJrBZnfavYS3e9p3kzKNi6YXpumexHURwXVqBbrRZkAbObUpTZvK/SB5ZqROEb4/RbO+tXAFWqq8x3xS8iMQrlIcc2OC4m3dP2yD0PFdquNjlpdMpGrryjJ9/8LBKQbFuswkBkC9WqgDVo+EeT+9o3LVq3c3D1LE0mkRF0D4uloZc3+y8t82lneCXl7uWij+wUCXqAUiB9xYu8tqBwYgTEa3h4QiqBSnjYDBFwvvJclhyedwicfC6pYbs/NibrP5Er6H+gQu0XjotqqqErPcJ1YpaEiy2W+2O36b84jdUqFr7XdxLTjGUZTuQhord3o8s/APRAy+WZikK+/6VeXaFYP+uH9Kjkr8fbTwwN6sVpZ1YnWRU8WzD3qhsH80/eoIN86kFGO8xB0v+dmjm3APimbKYxQ2093nJ1aLFUUXJpr2+M6VSruLf7ZaeCEXVmF3YWvgMwazvt9erWZ9fN8+YS6TdJIt9YUsdyuX7phiWM5AupHWNiScYCcNGBPJ237QiAYIuaOQph7BucErIVDDcq6oqgi6+9qXFl//7aG3D5utlq5iqwYD9XgeXeR7uVA7R1fN7leFB8duw2cY0plqbDRaBqusTXTZwpegGmUQ3rfIj6NW8y+KRz+u9PsPKm1WlTbDAm5Vpc91gNSIEt3HuvP/etdbVSstcmWl0oNyoiY4UfV2n/zlYDabYWG95Cu0u6s13a6abodkBm5abzSsKd71JWHaz+klZzA11Ri/KHTH0A5SmH3GTd8cLMaOyy9LVbQNM6KJ0x/3fSl152sX6iSQ2FMGU8Ygd/gUtedTAorDpxo6JR94jXd4Ibi8aoSdaoQdHCEGBjeoqolaXi895R5y3TOOsRenKC+qjfcrumK6E3lcvumB/aaGmIzb2qzQPc0ajbyvL6f8T8c6q3VQ81j1Gf2NZvTOsA+rYR/isFEp+G8O+9XGsF+Vw/7jf3PYfxTDNuPtVuPthrXWabh6IRXdiPYLlxnsR0n0ig1Cjvcuk/wSw1HvoFbfLLZBsV6g62Ik+/2jhg/FDuWzikQvKxJdE/ZVvT0yxKosMEutrb3wyCuzH9FWvC/deWl6/dpiEPR2bQm6vbIoEf82mVt1aspInP8yTxDSfptLdvum6kHgdczwDX9w32rix1zy/f0TFE58xp8TK2Dlkb3sQXPzwJ7E1rcUfT7LDEdQ785nK2Bwvbl1BVVtnXp6M9zcRs/xEpA9vIGhPnNrrHIL7EdN7AgOUUPfIETE9jkyEX2/80mbVW/v1LnKpCha0pLZfPemSCvSVLs5nS34Ifxb1Ugr0nxEpLkgx4TRdaKMJrjWlM9JeDStV7tUFvKfhuZWS2uOT3GNjpZb8Q+w9KhjGIcWDuNG8hOrzVDqC58tYulmJskvEq6k5oRaQHwRFuoH3c5qtS/pHIVF+k3PgBfTBgeoB7qM0hsD14NwO2Uvk5UwPr+5PM/m+U6O4rJOC48qWnh0GOrIee4lkrMr2WMGlS8kGo1ium2PRvwEUz9bJsRMzz/q46ceu5PR60n3Gs8R39EJWOCTQpJwja9S8kM64+gzDaau4dw8S7mGZ7UT4SW/pjM8nnT8I1jAOUg86TwDSScdameBRyWq+Byf7ujUUElQoOUP+a1N6FSU86i7AZ0baeMsGelI74rj+IYnFjbPRmBdVX4KqFd8p6+/9Dt9s5iuGPtcz6ShbCBnVsZVr9BZYQzCqqCm2oFdL48TUq+OWOxLuQ2C80QV6CLFlYh2wQB5FdMXNG+f8qaNxAuQUui9xj+sdQdZseZf9gWFaboWgzcstO5bhz9RxvftE+sQvx3qYFwEoGm/hP+/Mz5t/e84BmELmM/WWiUeeEf6YFjFeiBgXlBI/dFOpHIc3BbzJL3A8M9OFjtEA3ciWLUg8OhNK+BRbQV8rK2Ah8UKIPT3Nfrj2OERfNQL4GF9ATwqF8BH94FWyZ7yh/hIoKMFeC1LK5RTdneNbOrVfrxMpOIdauAlgaZ2szh2r5ofeFsb24NibGoNT+n5tFrdAbwkWglv4YEe29P62N6asSn+QD8ZSmJGs2ssBTX80SgIKDv32Y1t5yiUlRGASQ28gtdAep33eafRmPcpNvQt8hxkvLLU0oRtWcNrOqXXkJGSvJ+lIVfa26mxXzwFLY9pMnTDr4pazPK8YbZ1Ylk3VU02vQQtxvr9ejo2uJFtR+uf6zkAu23zKkWf86/u5KhSoLbtX0ExAFZKTQKvXU2NGV0zwM8EszuMYi1bp/XXmGw0xDsw+ZXipg6LdtqmH2pJjMnpV3Puh1K72d+38EEfsGx+Yt4+l6k47OL5ndS8SVlhUFUYhOXuoZSeefXjmf+LGVfq/9MZ/+H0bNkN7JiYiSpRpT5LfrvK3KxA2dwxN+rv5sZU06qqaRlp3rxOCojBXDpzqrNvmEycVeVMAXejGfJsqfxJI547Y8UqLsTAmjpITDGWpkQb9SkLJ5RgWplUgoc6Z7sR5XpqDFOyYazvyJHuYjgZYZA/sO2J1llMeIxyCLSEM1KMv68rq9dSY6uJXTacsuY6JjWRauB5W6eLwGvvAnE2jHETpu7MMVTWlt1VVbyjT2EPhOGD8ISydPjchLdZAt4fjn+LI+2y0DZk1S4VO0vAwIXFwfBCH7sVLMm/GYW/tYN5JAdRSEdPtNZg+1TmrhSVLnX4kQxVn41N4mE1nMNiOI36kRwHVT+SV1GqGzg8drfxgsz9TPPdqvluaCbhkvtQ2/YC76j64jQ3Pvme+eS0Sj1yIYJfb95NWb8I7V1an3Bzt30twrClTdjoMHguVqvlvnGbpt70y/3zvhxQzyklJJSgR7ZaUYAdM9tLss4kV+2tsKdlfKF9K3UXpEZI3YUx+UMPDndRKB/IMvSaPIUXrKZS1Rican8X/MNNTkBLUXKwnpH7+jF+LEOt46rGDD1BTlTCOFGh3Som451vxU0KdHG9heH02cAyebzNDBRe4wLvIMPWqKHQwhSbm35UPcROYfbZcZk0s7kwhmR7uxrAjJBqP5dqUJiw4b+Jpt6iWlloGOUoso9iGPS1CK1tcM/3wGkVSt6FQ/obXL44VyZY3OLHK9mEq6kv2R2tL03rS7LtRzbxTNgkuBl0WhT/p8aSDfygW6YZzn+1InGDyRC0O+h9iBO+INuRJf1eaj8f/YwuBZccDX4va5pqwrsqLjgRkqU0qaEsnmrxXjfMos/RokVfMnaONiRl/B6gSs4h2Iqw+P0ni58PA/1qNunzYVO/a1umovrWVvVfLB16YqEtr5eC/MGngoyz89I4O9eTGnHpXsGYoF+7Qc1C0rXQtnNLwWNtKzensIXkEmjM6yLBcxSVkHQfDeVqGmSL3UZaw1eLRmlVwtvqAvB3aS93HIhMUFS8MoOh2S5GyyY7Xc+YFJdKyiKQfU8YHqgWXbIWE1MbEgrm1NxoPuN3qlWg6WBt1G8s8+GwMcZPh41x/WqsmumZVswPnCDUVoGf9VUcHXiT7rqjkPsdUPxzau4o/E1iOGd6/EPW7r/Qt42YeyAEtBhF2jZFzK2KJqwjY+tfsGKss7LJLbKW17yoPupGHaewTDQZ8Koo2s90xn4Zi2+vqCG/ovOaCaNfu7zpMd0TK8VcRDldOLzZ5rEZVaOx0W2xoWJ+VrMtwDrfpFYzgM8pXb21mM+rnKlV2SA8lpa+uOIJRmszFkHaRV7WcClV1gHeLL4XR8lcTMK9A1uy2jWZdRPGhAYgb26VW42ovLO8NmqlrFu6vtdit2tQxQ23KJpkt3K1Qmdhi2nT1BxFOsKc5dP61ajzIjz+/DgrbkcorhEws16kO3MwF+lFdYZoDnM71exfjisxghxXogc5rsSoqBTfyptfUq7cXxB2GXqM4WhzXNkp5LiysegU9zxTtIhlqlIrR0PVefnJyc1GPe97xVa576NFiEzDtO6sM2dgwBnSJVZitbIE38cAFwWYU4wz3sswMS7vRpfE1WnDHoQd369FKcJI31vTfCWzsUB7B7pWeO/AxvClSRrN5ze32WqV4DVj62IejEGYzfFm83iuL6QjX3Fk6aqJ2prNWM9mYf1mlpEGaFoANEaASog1QGMEqNwB0Bi9/fPykxMbgOYbAE0IoLIO0PzvASoJoAgyyEqAJhVAKynZXTgSzJLvEa2JXcBMEZhogKbxW7hpasXFEsxpCeZbdYp0UluBOUaVr0UCTTev8vvR8iovWVXlkIQr00I0xqoeihIQrJxedouNInn+uJsqH0xEPI+UOKhMt4su7v56cPE9uTrAS5+bflh8d2S0pDTHb4c+hrRXjcZBurg8FxJv5r65QrYa+bVrMR+Yv2jsagDwLLVuH0ua2Pqdb3iRcBX2YiY4XQoKdOMaPJGhwOzEMfMupOgik/BHGBCmDEsSa+vE/ZrlDXnq4YnkADAur47sitGQ+imtBbS9cfx2P62KpNxJNfeZ9v02XdQQQOpwv6Nl5f1ktUr6R6tVdx8jKnX7eE052Yl4fTROw09eP1utsn5rtepyvAHCx3j+ZQs6zUr5UUFAaajF4HN0f58hn5G7l3i7b45BnFoB5BgNKIa8Fk8nR0MVpGya1cdXyN3fBccUx4fcfS94Yh9C7n4wOd5jjj8xxwed47ngFiaXl6pCXp00gns5sdo5RgsyFtZFytdaygdKmRF5fUUtJXYHcowpVBhM3cMvmOsPwfULNtRoYNX4+5V+P4uBlWMIInysaEJR9hl2/Ddhm+IvBW/eo49oYZS7NxgTJ3dnePlG7p4oLqF2O1wtcIuBNcVMQrbGQiafI4dPtjoaZZBLD8DYHiqM8GdCF2EYI0CLQjqJK4rSpChKEwZa4gHn+DZoH+LNs3g0KFJIsxxqfa/CYFZOoDtIiPqQ4hqUcZX6/L1idQek90UIGxO8Rt89ary/H4r6BaZ3smu+BAuYUGmn1Nhp1Zi5mLVeg04qazm90+jpnUbvFLnT8Eulr66oNfz73YZ/r9dClyltNPxS3W14q0i9YYwWw80lqhQbxlyj+hgvEQS8OwAeKPigvb8f1LKellmf4PV14MHTMt/TWr6XauNm1t8w5+8Kr33YuB5L357l6Zg0a2ZhzDUKSVOufk9TKcQJDGnB8Z7ScwEnxsP9TPHXcigo7NsHCrVRS3iPCde1hD8x4aKW8FxHs6OOZEXEP/qTlo7W5P5uvK2XZSQCOlS7M1GEIMKrJ0xwOSiuBHdaDCgcGTgtxkKnRQfxFLogoYvMlUrDlxLSNHwr12xN212P+OalTFR0Pkc2onjU5wUpoon5UDy6V8mVeDuV2eJiauHOijvgw7/Z8Qq22tpILCnD3290RWKnVUvuhH77X93WyHVq39/c2aptuGaKur2ZGbJkOCwHta8lIUt1vRRaZIZbQqr3DvI9SwbalkQ7X23fRqobogPexsZpfJsxwjWSJ8fvlLGunQBDl2IUVWn6AYo7ypj88LZtqX6/xXSGfR9a3T5tvejZynpFUFuSmNUgiFm6eg9NNFGu5F/oy4KCLB1bMKUQdjpQHsmZrgVXcJe8l6dWqyTi55qIz+iXxEc/UazaHJS7lLUdQlX3EPiNYgdIkGGmwVVAV2R446MYy/yNSHek0E6UctN52ty5PRFzocQeRs7Dy6Spr2e642Qi/R2twMk2mp6uy7RUai5ZK6YMaan9YtBeqRceLsb7KS7Gk3RtaNDmWlQ/WovqL9diLxfz2MUj6ctsspgLrmnZSWWYeka3Dv85T875x5RidY13fnyYrtes93/+Lw=="));if(a){const r=new Blob([Y],{type:i});return URL.createObjectURL(r)}return "data:"+i+";base64,"+(r=>{let t="";const n=r.length;let o=0;for(;n>o+2;o+=3){const n=r[o]<<16|r[o+1]<<8|r[o+2];t+=q[n>>18&63]+q[n>>12&63]+q[n>>6&63]+q[63&n];}const e=n-o;if(1===e){const n=r[o]<<16;t+=q[n>>18&63]+q[n>>12&63]+"==";}else if(2===e){const n=r[o]<<16|r[o+1]<<8;t+=q[n>>18&63]+q[n>>12&63]+q[n>>6&63]+"=";}return t})(Y)}});}
|
|
228
|
+
|
|
229
|
+
/*
|
|
230
|
+
Copyright (c) 2025 Gildas Lormeau. All rights reserved.
|
|
231
|
+
|
|
232
|
+
Redistribution and use in source and binary forms, with or without
|
|
233
|
+
modification, are permitted provided that the following conditions are met:
|
|
234
|
+
|
|
235
|
+
1. Redistributions of source code must retain the above copyright notice,
|
|
236
|
+
this list of conditions and the following disclaimer.
|
|
237
|
+
|
|
238
|
+
2. Redistributions in binary form must reproduce the above copyright
|
|
239
|
+
notice, this list of conditions and the following disclaimer in
|
|
240
|
+
the documentation and/or other materials provided with the distribution.
|
|
241
|
+
|
|
242
|
+
3. The names of the authors may not be used to endorse or promote products
|
|
243
|
+
derived from this software without specific prior written permission.
|
|
244
|
+
|
|
245
|
+
THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
|
|
246
|
+
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
|
247
|
+
FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
|
|
248
|
+
INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
249
|
+
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
250
|
+
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
|
|
251
|
+
OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
|
252
|
+
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
253
|
+
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
|
254
|
+
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
255
|
+
*/
|
|
256
|
+
|
|
257
|
+
|
|
258
|
+
const ERR_INVALID_CODEC_DEFINITION = "Invalid codec definition";
|
|
259
|
+
const ERR_RESERVED_COMPRESSION_METHOD = "Reserved compression method";
|
|
260
|
+
const ERR_INVALID_CODEC_MODULE = "Invalid codec module";
|
|
261
|
+
|
|
262
|
+
const STRING_TYPE = "string";
|
|
263
|
+
const RESERVED_COMPRESSION_METHODS = [
|
|
264
|
+
COMPRESSION_METHOD_STORE,
|
|
265
|
+
COMPRESSION_METHOD_DEFLATE,
|
|
266
|
+
COMPRESSION_METHOD_DEFLATE_64,
|
|
267
|
+
COMPRESSION_METHOD_AES
|
|
268
|
+
];
|
|
269
|
+
|
|
270
|
+
const registeredCodecs = new Map();
|
|
271
|
+
const codecStreams = new Map();
|
|
272
|
+
|
|
273
|
+
function registerCodec(codec = {}) {
|
|
274
|
+
const { compressionMethod, format, codecURI, CompressionStream, DecompressionStream, versionNeeded } = codec;
|
|
275
|
+
if (!Number.isInteger(compressionMethod) || compressionMethod < 0 || compressionMethod > MAX_16_BITS ||
|
|
276
|
+
typeof format != STRING_TYPE || !format.length) {
|
|
277
|
+
throw new Error(ERR_INVALID_CODEC_DEFINITION);
|
|
278
|
+
}
|
|
279
|
+
if (RESERVED_COMPRESSION_METHODS.includes(compressionMethod)) {
|
|
280
|
+
throw new Error(ERR_RESERVED_COMPRESSION_METHOD);
|
|
281
|
+
}
|
|
282
|
+
const hasStreams = typeof CompressionStream == FUNCTION_TYPE || typeof DecompressionStream == FUNCTION_TYPE;
|
|
283
|
+
if (!hasStreams && (typeof codecURI != STRING_TYPE || !codecURI.length)) {
|
|
284
|
+
throw new Error(ERR_INVALID_CODEC_DEFINITION);
|
|
285
|
+
}
|
|
286
|
+
registeredCodecs.set(compressionMethod, { compressionMethod, format, codecURI, versionNeeded });
|
|
287
|
+
if (hasStreams) {
|
|
288
|
+
setCodecStreams(format, { CompressionStream, DecompressionStream });
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
function unregisterCodec(compressionMethod) {
|
|
293
|
+
const codec = registeredCodecs.get(compressionMethod);
|
|
294
|
+
if (codec) {
|
|
295
|
+
registeredCodecs.delete(compressionMethod);
|
|
296
|
+
let formatUsed;
|
|
297
|
+
registeredCodecs.forEach(otherCodec => formatUsed = formatUsed || otherCodec.format == codec.format);
|
|
298
|
+
if (!formatUsed) {
|
|
299
|
+
codecStreams.delete(codec.format);
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
function getRegisteredCodec(compressionMethod) {
|
|
305
|
+
return registeredCodecs.get(compressionMethod);
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
function getCodecStreams(format) {
|
|
309
|
+
return codecStreams.get(format);
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
function setCodecStreams(format, streams) {
|
|
313
|
+
const { CompressionStream, DecompressionStream } = streams;
|
|
314
|
+
if (typeof CompressionStream != FUNCTION_TYPE && typeof DecompressionStream != FUNCTION_TYPE) {
|
|
315
|
+
throw new Error(ERR_INVALID_CODEC_MODULE);
|
|
316
|
+
}
|
|
317
|
+
codecStreams.set(format, { CompressionStream, DecompressionStream });
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
async function ensureCodecStreams(format, codecURI) {
|
|
321
|
+
if (!codecStreams.has(format) && codecURI) {
|
|
322
|
+
setCodecStreams(format, await import(codecURI));
|
|
323
|
+
}
|
|
324
|
+
}
|
|
224
325
|
|
|
225
326
|
/*
|
|
226
327
|
Copyright (c) 2022 Gildas Lormeau. All rights reserved.
|
|
@@ -1758,6 +1859,7 @@
|
|
|
1758
1859
|
|
|
1759
1860
|
const ERR_INVALID_UNCOMPRESSED_SIZE = "Invalid uncompressed size";
|
|
1760
1861
|
const ERR_INVALID_COMPRESSED_DATA = "Invalid compressed data";
|
|
1862
|
+
const ERR_UNSUPPORTED_COMPRESSION$2 = "Compression method not supported";
|
|
1761
1863
|
const FORMAT_DEFLATE_RAW = "deflate-raw";
|
|
1762
1864
|
const FORMAT_DEFLATE64_RAW = "deflate64-raw";
|
|
1763
1865
|
const FORMAT_GZIP = "gzip";
|
|
@@ -1768,23 +1870,26 @@
|
|
|
1768
1870
|
|
|
1769
1871
|
constructor(options, { chunkSize, CompressionStreamZlib, CompressionStream }) {
|
|
1770
1872
|
super({});
|
|
1771
|
-
const { compressed, encrypted, useCompressionStream, zipCrypto, signed, level, deflate64 } = options;
|
|
1873
|
+
const { compressed, encrypted, useCompressionStream, zipCrypto, signed, level, deflate64, format } = options;
|
|
1772
1874
|
const stream = this;
|
|
1773
1875
|
let crc32Stream, encryptionStream, gzipCrc32Stream;
|
|
1774
1876
|
let readable = super.readable;
|
|
1775
|
-
const
|
|
1877
|
+
const codecStreams = format && getCodecStreams(format);
|
|
1878
|
+
const useGzipCrc32 = signed && compressed && !deflate64 && !codecStreams && (!encrypted || zipCrypto) &&
|
|
1776
1879
|
Boolean(useCompressionStream && CompressionStream);
|
|
1777
1880
|
if ((!encrypted || zipCrypto) && signed && !useGzipCrc32) {
|
|
1778
1881
|
crc32Stream = new Crc32Stream();
|
|
1779
1882
|
readable = pipeThrough(readable, crc32Stream);
|
|
1780
1883
|
}
|
|
1781
1884
|
if (compressed) {
|
|
1782
|
-
if (
|
|
1885
|
+
if (codecStreams) {
|
|
1886
|
+
readable = pipeThroughBackpressured(readable, createCodecStream(codecStreams.CompressionStream, format, { level, chunkSize }));
|
|
1887
|
+
} else if (useGzipCrc32) {
|
|
1783
1888
|
gzipCrc32Stream = new GzipToRawDeflateStream();
|
|
1784
1889
|
readable = pipeThroughBackpressured(readable, new CompressionStream(FORMAT_GZIP));
|
|
1785
1890
|
readable = pipeThrough(readable, gzipCrc32Stream);
|
|
1786
1891
|
} else {
|
|
1787
|
-
readable =
|
|
1892
|
+
readable = pipeThroughCompressionStream(readable, useCompressionStream, { level, chunkSize }, CompressionStream, CompressionStreamZlib);
|
|
1788
1893
|
}
|
|
1789
1894
|
}
|
|
1790
1895
|
if (encrypted) {
|
|
@@ -1853,7 +1958,7 @@
|
|
|
1853
1958
|
|
|
1854
1959
|
constructor(options, { chunkSize, DecompressionStreamZlib, DecompressionStream }) {
|
|
1855
1960
|
super({});
|
|
1856
|
-
const { zipCrypto, encrypted, signed, signature, compressed, useCompressionStream, deflate64 } = options;
|
|
1961
|
+
const { zipCrypto, encrypted, signed, signature, compressed, useCompressionStream, deflate64, format } = options;
|
|
1857
1962
|
let crc32Stream, decryptionStream;
|
|
1858
1963
|
let readable = super.readable;
|
|
1859
1964
|
if (encrypted) {
|
|
@@ -1865,7 +1970,12 @@
|
|
|
1865
1970
|
}
|
|
1866
1971
|
}
|
|
1867
1972
|
if (compressed) {
|
|
1868
|
-
|
|
1973
|
+
const codecStreams = format && getCodecStreams(format);
|
|
1974
|
+
if (codecStreams) {
|
|
1975
|
+
readable = pipeThroughBackpressured(readable, createCodecStream(codecStreams.DecompressionStream, format, { chunkSize }));
|
|
1976
|
+
} else {
|
|
1977
|
+
readable = pipeThroughCompressionStream(readable, useCompressionStream, { chunkSize, deflate64 }, DecompressionStream, DecompressionStreamZlib);
|
|
1978
|
+
}
|
|
1869
1979
|
readable = mapInflateStreamError(readable);
|
|
1870
1980
|
}
|
|
1871
1981
|
if ((!encrypted || zipCrypto) && signed) {
|
|
@@ -1883,6 +1993,25 @@
|
|
|
1883
1993
|
}
|
|
1884
1994
|
}
|
|
1885
1995
|
|
|
1996
|
+
const deflateRawSupportByStream = new Map();
|
|
1997
|
+
|
|
1998
|
+
function supportsDeflateRaw(StreamClass) {
|
|
1999
|
+
if (!StreamClass) {
|
|
2000
|
+
return false;
|
|
2001
|
+
}
|
|
2002
|
+
let supported = deflateRawSupportByStream.get(StreamClass);
|
|
2003
|
+
if (supported === UNDEFINED_VALUE) {
|
|
2004
|
+
try {
|
|
2005
|
+
new StreamClass(FORMAT_DEFLATE_RAW);
|
|
2006
|
+
supported = true;
|
|
2007
|
+
} catch {
|
|
2008
|
+
supported = false;
|
|
2009
|
+
}
|
|
2010
|
+
deflateRawSupportByStream.set(StreamClass, supported);
|
|
2011
|
+
}
|
|
2012
|
+
return supported;
|
|
2013
|
+
}
|
|
2014
|
+
|
|
1886
2015
|
function setReadable(stream, readable, flush) {
|
|
1887
2016
|
readable = pipeThrough(readable, new TransformStream({ flush }));
|
|
1888
2017
|
Object.defineProperty(stream, "readable", {
|
|
@@ -1892,21 +2021,24 @@
|
|
|
1892
2021
|
});
|
|
1893
2022
|
}
|
|
1894
2023
|
|
|
1895
|
-
function
|
|
1896
|
-
|
|
2024
|
+
function createCodecStream(CodecStreamClass, format, options) {
|
|
2025
|
+
if (!CodecStreamClass) {
|
|
2026
|
+
throw new Error(ERR_UNSUPPORTED_COMPRESSION$2);
|
|
2027
|
+
}
|
|
2028
|
+
return new CodecStreamClass(format, options);
|
|
2029
|
+
}
|
|
2030
|
+
|
|
2031
|
+
function pipeThroughCompressionStream(readable, useCompressionStream, options, CompressionStreamNative, CompressionStreamZlib) {
|
|
2032
|
+
const Stream = useCompressionStream && CompressionStreamNative ?
|
|
2033
|
+
CompressionStreamNative :
|
|
2034
|
+
CompressionStreamZlib || CompressionStreamNative;
|
|
1897
2035
|
const format = options.deflate64 ? FORMAT_DEFLATE64_RAW : FORMAT_DEFLATE_RAW;
|
|
1898
2036
|
let codecStream;
|
|
1899
2037
|
try {
|
|
1900
2038
|
codecStream = new Stream(format, options);
|
|
1901
2039
|
} catch (error) {
|
|
1902
|
-
if (useCompressionStream) {
|
|
1903
|
-
|
|
1904
|
-
codecStream = new CompressionStreamZlib(format, options);
|
|
1905
|
-
} else if (CompressionStream) {
|
|
1906
|
-
codecStream = new CompressionStream(format, options);
|
|
1907
|
-
} else {
|
|
1908
|
-
throw error;
|
|
1909
|
-
}
|
|
2040
|
+
if (useCompressionStream && CompressionStreamZlib && Stream != CompressionStreamZlib) {
|
|
2041
|
+
codecStream = new CompressionStreamZlib(format, options);
|
|
1910
2042
|
} else {
|
|
1911
2043
|
throw error;
|
|
1912
2044
|
}
|
|
@@ -2167,6 +2299,7 @@
|
|
|
2167
2299
|
const MODULE_WORKER_OPTIONS = { type: "module" };
|
|
2168
2300
|
const ERROR_EVENT_TYPE = "error";
|
|
2169
2301
|
const MESSAGE_ERROR_EVENT_TYPE = "messageerror";
|
|
2302
|
+
const ERR_WORKER_STARTUP_TIMEOUT = "Worker startup timeout";
|
|
2170
2303
|
|
|
2171
2304
|
let webWorkerSupported, webWorkerSource, webWorkerURI, webWorkerOptions;
|
|
2172
2305
|
let transferStreamsSupported = true;
|
|
@@ -2177,6 +2310,10 @@
|
|
|
2177
2310
|
}
|
|
2178
2311
|
let initModule = () => { };
|
|
2179
2312
|
|
|
2313
|
+
function resetWebWorkerSupport() {
|
|
2314
|
+
webWorkerSupported = UNDEFINED_VALUE;
|
|
2315
|
+
}
|
|
2316
|
+
|
|
2180
2317
|
class CodecWorker {
|
|
2181
2318
|
|
|
2182
2319
|
constructor(workerData, { readable, writable }, { options, config, streamOptions, useWebWorkers, transferStreams, workerURI }, onTaskFinished) {
|
|
@@ -2270,7 +2407,7 @@
|
|
|
2270
2407
|
}
|
|
2271
2408
|
|
|
2272
2409
|
function createWebWorkerInterface(workerData, config) {
|
|
2273
|
-
const { baseURI, chunkSize } = config;
|
|
2410
|
+
const { baseURI, chunkSize, workerStartupTimeout } = config;
|
|
2274
2411
|
let { wasmURI } = config;
|
|
2275
2412
|
|
|
2276
2413
|
if (!workerData.interface) {
|
|
@@ -2287,9 +2424,26 @@
|
|
|
2287
2424
|
}
|
|
2288
2425
|
Object.assign(workerData, {
|
|
2289
2426
|
worker,
|
|
2427
|
+
workerAlive: false,
|
|
2290
2428
|
terminated: false,
|
|
2291
2429
|
interface: {
|
|
2292
|
-
run: () =>
|
|
2430
|
+
run: async () => {
|
|
2431
|
+
try {
|
|
2432
|
+
return await runWebWorker(workerData, { chunkSize, wasmURI, baseURI, workerStartupTimeout });
|
|
2433
|
+
} catch (error) {
|
|
2434
|
+
if (error && error.workerStartupFailed) {
|
|
2435
|
+
webWorkerSupported = false;
|
|
2436
|
+
const { reader } = workerData;
|
|
2437
|
+
if (reader) {
|
|
2438
|
+
reader.releaseLock();
|
|
2439
|
+
}
|
|
2440
|
+
workerData.reader = null;
|
|
2441
|
+
workerData.writer = null;
|
|
2442
|
+
return runWorker$1(workerData, config);
|
|
2443
|
+
}
|
|
2444
|
+
throw error;
|
|
2445
|
+
}
|
|
2446
|
+
}
|
|
2293
2447
|
}
|
|
2294
2448
|
});
|
|
2295
2449
|
}
|
|
@@ -2299,15 +2453,23 @@
|
|
|
2299
2453
|
async function runWorker$1({ options, readable, writable, onTaskFinished }, config) {
|
|
2300
2454
|
let codecStream;
|
|
2301
2455
|
try {
|
|
2302
|
-
if (!options.
|
|
2303
|
-
|
|
2304
|
-
|
|
2305
|
-
|
|
2306
|
-
|
|
2307
|
-
|
|
2308
|
-
config
|
|
2309
|
-
|
|
2310
|
-
|
|
2456
|
+
if (options.compressed && !options.format) {
|
|
2457
|
+
const deflate = options.codecType.startsWith(CODEC_DEFLATE);
|
|
2458
|
+
const ZlibStream = deflate ? config.CompressionStreamZlib : config.DecompressionStreamZlib;
|
|
2459
|
+
const NativeStream = deflate ? config.CompressionStream : config.DecompressionStream;
|
|
2460
|
+
if (!options.useCompressionStream) {
|
|
2461
|
+
try {
|
|
2462
|
+
await initModule(config);
|
|
2463
|
+
} catch {
|
|
2464
|
+
if (!ZlibStream || ZlibStream.requiresModule) {
|
|
2465
|
+
options.useCompressionStream = true;
|
|
2466
|
+
}
|
|
2467
|
+
}
|
|
2468
|
+
} else if (ZlibStream && ZlibStream.requiresModule && !supportsDeflateRaw(NativeStream)) {
|
|
2469
|
+
try {
|
|
2470
|
+
await initModule(config);
|
|
2471
|
+
} catch {
|
|
2472
|
+
// ignored
|
|
2311
2473
|
}
|
|
2312
2474
|
}
|
|
2313
2475
|
}
|
|
@@ -2376,6 +2538,10 @@
|
|
|
2376
2538
|
writer: writable.getWriter()
|
|
2377
2539
|
});
|
|
2378
2540
|
}
|
|
2541
|
+
const { workerStartupTimeout } = config;
|
|
2542
|
+
if (!workerData.workerAlive && Number.isFinite(workerStartupTimeout) && workerStartupTimeout >= 0) {
|
|
2543
|
+
workerData.startupTimeout = setTimeout(() => onStartupTimeout(workerData), workerStartupTimeout);
|
|
2544
|
+
}
|
|
2379
2545
|
try {
|
|
2380
2546
|
const resultValue = await result;
|
|
2381
2547
|
await closeWritable();
|
|
@@ -2488,28 +2654,68 @@
|
|
|
2488
2654
|
} else {
|
|
2489
2655
|
worker = new Worker(webWorkerURI, webWorkerOptions);
|
|
2490
2656
|
}
|
|
2491
|
-
worker.addEventListener(MESSAGE_EVENT_TYPE, event =>
|
|
2657
|
+
worker.addEventListener(MESSAGE_EVENT_TYPE, event => {
|
|
2658
|
+
workerData.workerAlive = true;
|
|
2659
|
+
clearStartupTimeout(workerData);
|
|
2660
|
+
onMessage(event, workerData);
|
|
2661
|
+
});
|
|
2492
2662
|
worker.addEventListener(ERROR_EVENT_TYPE, event => onWorkerError(event, workerData));
|
|
2493
2663
|
worker.addEventListener(MESSAGE_ERROR_EVENT_TYPE, event => onWorkerError(event, workerData));
|
|
2494
2664
|
return worker;
|
|
2495
2665
|
}
|
|
2496
2666
|
|
|
2667
|
+
function onStartupTimeout(workerData) {
|
|
2668
|
+
workerData.startupTimeout = null;
|
|
2669
|
+
if (workerData.workerAlive) {
|
|
2670
|
+
return;
|
|
2671
|
+
}
|
|
2672
|
+
const { rejectResult, writer } = workerData;
|
|
2673
|
+
terminateWorker$1(workerData);
|
|
2674
|
+
workerData.worker = null;
|
|
2675
|
+
if (rejectResult) {
|
|
2676
|
+
const error = new Error(ERR_WORKER_STARTUP_TIMEOUT);
|
|
2677
|
+
error.workerStartupFailed = true;
|
|
2678
|
+
rejectResult(error);
|
|
2679
|
+
if (writer) {
|
|
2680
|
+
writer.releaseLock();
|
|
2681
|
+
}
|
|
2682
|
+
}
|
|
2683
|
+
}
|
|
2684
|
+
|
|
2685
|
+
function clearStartupTimeout(workerData) {
|
|
2686
|
+
const { startupTimeout } = workerData;
|
|
2687
|
+
if (startupTimeout) {
|
|
2688
|
+
clearTimeout(startupTimeout);
|
|
2689
|
+
workerData.startupTimeout = null;
|
|
2690
|
+
}
|
|
2691
|
+
}
|
|
2692
|
+
|
|
2497
2693
|
function onWorkerError(event, workerData) {
|
|
2498
2694
|
if (event.preventDefault) {
|
|
2499
2695
|
event.preventDefault();
|
|
2500
2696
|
}
|
|
2501
|
-
|
|
2697
|
+
clearStartupTimeout(workerData);
|
|
2698
|
+
const { workerAlive, rejectResult, writer, onTaskFinished } = workerData;
|
|
2502
2699
|
terminateWorker$1(workerData);
|
|
2700
|
+
if (!workerAlive) {
|
|
2701
|
+
workerData.worker = null;
|
|
2702
|
+
}
|
|
2503
2703
|
if (rejectResult) {
|
|
2504
|
-
|
|
2704
|
+
let error = event.error || new Error(event.message || ERROR_EVENT_TYPE);
|
|
2705
|
+
if (!workerAlive) {
|
|
2706
|
+
error = Object.assign(new Error(error.message || ERROR_EVENT_TYPE), { workerStartupFailed: true });
|
|
2707
|
+
}
|
|
2708
|
+
rejectResult(error);
|
|
2505
2709
|
if (writer) {
|
|
2506
2710
|
writer.releaseLock();
|
|
2507
2711
|
}
|
|
2508
|
-
|
|
2712
|
+
if (workerAlive) {
|
|
2713
|
+
onTaskFinished();
|
|
2714
|
+
}
|
|
2509
2715
|
}
|
|
2510
2716
|
}
|
|
2511
2717
|
|
|
2512
|
-
function sendMessage(message, { worker, writer, transferStreams }) {
|
|
2718
|
+
function sendMessage(message, { worker, writer, transferStreams, workerAlive }) {
|
|
2513
2719
|
try {
|
|
2514
2720
|
const { value, readable, writable } = message;
|
|
2515
2721
|
const transferables = [];
|
|
@@ -2517,7 +2723,7 @@
|
|
|
2517
2723
|
message.value = toExactUint8Array(value);
|
|
2518
2724
|
transferables.push(message.value.buffer);
|
|
2519
2725
|
}
|
|
2520
|
-
if (transferStreams && transferStreamsSupported) {
|
|
2726
|
+
if (transferStreams && transferStreamsSupported && workerAlive) {
|
|
2521
2727
|
if (readable) {
|
|
2522
2728
|
transferables.push(readable);
|
|
2523
2729
|
}
|
|
@@ -2636,11 +2842,18 @@
|
|
|
2636
2842
|
|
|
2637
2843
|
async function runWorker(stream, workerOptions) {
|
|
2638
2844
|
const { options, config } = workerOptions;
|
|
2639
|
-
const { transferStreams, useWebWorkers, useCompressionStream, compressed, signed, encrypted } = options;
|
|
2845
|
+
const { transferStreams, useWebWorkers, useCompressionStream, compressed, signed, encrypted, format, codecURI } = options;
|
|
2640
2846
|
const { workerURI, maxWorkers } = config;
|
|
2847
|
+
if (format) {
|
|
2848
|
+
if (codecURI) {
|
|
2849
|
+
options.codecURI = resolveCodecURI(codecURI, config.baseURI);
|
|
2850
|
+
}
|
|
2851
|
+
await ensureCodecStreams(format, options.codecURI);
|
|
2852
|
+
}
|
|
2641
2853
|
workerOptions.transferStreams = transferStreams || (transferStreams === UNDEFINED_VALUE && config.transferStreams);
|
|
2642
2854
|
const streamCopy = !compressed && !signed && !encrypted;
|
|
2643
|
-
|
|
2855
|
+
const workerSupported = format === UNDEFINED_VALUE || Boolean(options.codecURI);
|
|
2856
|
+
workerOptions.useWebWorkers = !streamCopy && workerSupported && (useWebWorkers || (useWebWorkers === UNDEFINED_VALUE && config.useWebWorkers));
|
|
2644
2857
|
workerOptions.workerURI = workerOptions.useWebWorkers && workerURI ? workerURI : UNDEFINED_VALUE;
|
|
2645
2858
|
options.useCompressionStream = useCompressionStream || (useCompressionStream === UNDEFINED_VALUE && config.useCompressionStream);
|
|
2646
2859
|
return (await getWorker()).run();
|
|
@@ -2680,6 +2893,14 @@
|
|
|
2680
2893
|
}
|
|
2681
2894
|
}
|
|
2682
2895
|
|
|
2896
|
+
function resolveCodecURI(codecURI, baseURI) {
|
|
2897
|
+
try {
|
|
2898
|
+
return new URL(codecURI, baseURI).toString();
|
|
2899
|
+
} catch {
|
|
2900
|
+
return codecURI;
|
|
2901
|
+
}
|
|
2902
|
+
}
|
|
2903
|
+
|
|
2683
2904
|
function armStarvationTimeout() {
|
|
2684
2905
|
if (!starvationTimeout && pendingRequests.length && Number.isFinite(starvationDelay) && starvationDelay >= 0) {
|
|
2685
2906
|
starvationTimeout = setTimeout(onWorkerStarvation, starvationDelay);
|
|
@@ -2740,6 +2961,7 @@
|
|
|
2740
2961
|
clearTerminateTimeout(workerData);
|
|
2741
2962
|
return workerData.terminate();
|
|
2742
2963
|
}));
|
|
2964
|
+
resetWebWorkerSupport();
|
|
2743
2965
|
}
|
|
2744
2966
|
|
|
2745
2967
|
/*
|
|
@@ -3963,6 +4185,7 @@
|
|
|
3963
4185
|
const OPTION_PREVENT_CLOSE = "preventClose";
|
|
3964
4186
|
const OPTION_ENCRYPTION_STRENGTH = "encryptionStrength";
|
|
3965
4187
|
const OPTION_EXTENDED_TIMESTAMP = "extendedTimestamp";
|
|
4188
|
+
const OPTION_NTFS_TIMESTAMP = "ntfsTimestamp";
|
|
3966
4189
|
const OPTION_KEEP_ORDER = "keepOrder";
|
|
3967
4190
|
const OPTION_LEVEL = "level";
|
|
3968
4191
|
const OPTION_BUFFERED_WRITE = "bufferedWrite";
|
|
@@ -4022,6 +4245,7 @@
|
|
|
4022
4245
|
const ERR_SPLIT_ZIP_FILE = "Split zip file";
|
|
4023
4246
|
const ERR_OVERLAPPING_ENTRY = "Overlapping entry found";
|
|
4024
4247
|
const ERR_AMBIGUOUS_ARCHIVE = "Ambiguous archive";
|
|
4248
|
+
const ERR_ENCRYPTED_CENTRAL_DIRECTORY = "Encrypted central directory is not supported";
|
|
4025
4249
|
const CHARSET_UTF8 = "utf-8";
|
|
4026
4250
|
const PROPERTY_NAME_UTF8_SUFFIX = "UTF8";
|
|
4027
4251
|
const CHARSET_CP437 = "cp437";
|
|
@@ -4099,6 +4323,7 @@
|
|
|
4099
4323
|
let prependedDataLength = 0;
|
|
4100
4324
|
let startOffset;
|
|
4101
4325
|
let zip64EndOfDirectory;
|
|
4326
|
+
let zip64EndOfDirectoryVersion2;
|
|
4102
4327
|
const requiresZip64 = directoryDataOffset == MAX_32_BITS || directoryDataLength == MAX_32_BITS || filesLength == MAX_16_BITS || diskNumber == MAX_16_BITS;
|
|
4103
4328
|
if (directoryDataOffset != MAX_32_BITS && diskNumber != MAX_16_BITS) {
|
|
4104
4329
|
directoryDataOffset += getDiskOffset$1(reader, diskNumber);
|
|
@@ -4128,6 +4353,7 @@
|
|
|
4128
4353
|
throw new Error(ERR_EOCDR_LOCATOR_ZIP64_NOT_FOUND);
|
|
4129
4354
|
}
|
|
4130
4355
|
zip64EndOfDirectory = true;
|
|
4356
|
+
zip64EndOfDirectoryVersion2 = getBigUint64(endOfDirectoryView, 4) > ZIP64_END_OF_CENTRAL_DIR_LENGTH - 12;
|
|
4131
4357
|
if (lastDiskNumber == MAX_16_BITS) {
|
|
4132
4358
|
lastDiskNumber = getUint32(endOfDirectoryView, 16);
|
|
4133
4359
|
} else if (checkAmbiguity && lastDiskNumber != getUint32(endOfDirectoryView, 16)) {
|
|
@@ -4207,6 +4433,9 @@
|
|
|
4207
4433
|
for (let indexFile = 0; indexFile < filesLength; indexFile++) {
|
|
4208
4434
|
const fileEntry = new ZipEntry(reader, config, zipReader.options);
|
|
4209
4435
|
if (offset + CENTRAL_FILE_HEADER_LENGTH > directoryArray.length || getUint32(directoryView, offset) != CENTRAL_FILE_HEADER_SIGNATURE) {
|
|
4436
|
+
if (indexFile == 0 && (zip64EndOfDirectoryVersion2 || detectEncryptedCentralDirectory(directoryView))) {
|
|
4437
|
+
throw new Error(ERR_ENCRYPTED_CENTRAL_DIRECTORY);
|
|
4438
|
+
}
|
|
4210
4439
|
throw new Error(ERR_CENTRAL_DIRECTORY_NOT_FOUND);
|
|
4211
4440
|
}
|
|
4212
4441
|
readCommonHeader(fileEntry, directoryView, offset + 6);
|
|
@@ -4434,7 +4663,8 @@
|
|
|
4434
4663
|
throw new Error(ERR_UNSUPPORTED_COMPRESSION$1);
|
|
4435
4664
|
}
|
|
4436
4665
|
}
|
|
4437
|
-
|
|
4666
|
+
const registeredCodec = passThrough ? UNDEFINED_VALUE : getRegisteredCodec(compressionMethod);
|
|
4667
|
+
if ((compressionMethod != COMPRESSION_METHOD_STORE && compressionMethod != COMPRESSION_METHOD_DEFLATE && compressionMethod != COMPRESSION_METHOD_DEFLATE_64 && !registeredCodec) && !passThrough) {
|
|
4438
4668
|
throw new Error(ERR_UNSUPPORTED_COMPRESSION$1);
|
|
4439
4669
|
}
|
|
4440
4670
|
if (dataArray.length < HEADER_SIZE || getUint32(dataView, 0) != LOCAL_FILE_HEADER_SIGNATURE) {
|
|
@@ -4473,7 +4703,10 @@
|
|
|
4473
4703
|
fileEntry.zipCrypto = zipCrypto;
|
|
4474
4704
|
}
|
|
4475
4705
|
if (encrypted) {
|
|
4476
|
-
if (
|
|
4706
|
+
if ((localDirectory.rawBitFlag & BITFLAG_STRONG_ENCRYPTION) == BITFLAG_STRONG_ENCRYPTION) {
|
|
4707
|
+
throw new Error(ERR_UNSUPPORTED_ENCRYPTION);
|
|
4708
|
+
}
|
|
4709
|
+
if (!zipCrypto && (extraFieldAES.strength < 1 || extraFieldAES.strength > 3)) {
|
|
4477
4710
|
throw new Error(ERR_UNSUPPORTED_ENCRYPTION);
|
|
4478
4711
|
} else if (!password && !rawPassword) {
|
|
4479
4712
|
throw new Error(ERR_ENCRYPTED);
|
|
@@ -4512,6 +4745,8 @@
|
|
|
4512
4745
|
useCompressionStream,
|
|
4513
4746
|
transferStreams: getOptionValue$1(zipEntry, options, OPTION_TRANSFER_STREAMS),
|
|
4514
4747
|
deflate64,
|
|
4748
|
+
format: registeredCodec ? registeredCodec.format : UNDEFINED_VALUE,
|
|
4749
|
+
codecURI: registeredCodec ? registeredCodec.codecURI : UNDEFINED_VALUE,
|
|
4515
4750
|
checkPasswordOnly
|
|
4516
4751
|
},
|
|
4517
4752
|
config,
|
|
@@ -4564,6 +4799,16 @@
|
|
|
4564
4799
|
}
|
|
4565
4800
|
}
|
|
4566
4801
|
|
|
4802
|
+
function detectEncryptedCentralDirectory(directoryView) {
|
|
4803
|
+
const maxOffset = Math.min(directoryView.byteLength, 1024) - 3;
|
|
4804
|
+
for (let offset = 0; offset < maxOffset; offset++) {
|
|
4805
|
+
if (getUint32(directoryView, offset) == ARCHIVE_EXTRA_DATA_SIGNATURE) {
|
|
4806
|
+
return true;
|
|
4807
|
+
}
|
|
4808
|
+
}
|
|
4809
|
+
return false;
|
|
4810
|
+
}
|
|
4811
|
+
|
|
4567
4812
|
function readCommonHeader(directory, dataView, offset) {
|
|
4568
4813
|
const rawBitFlag = directory.rawBitFlag = getUint16(dataView, offset + 2);
|
|
4569
4814
|
const encrypted = (rawBitFlag & BITFLAG_ENCRYPTED) == BITFLAG_ENCRYPTED;
|
|
@@ -5078,6 +5323,7 @@
|
|
|
5078
5323
|
ERR_BAD_FORMAT: ERR_BAD_FORMAT,
|
|
5079
5324
|
ERR_CENTRAL_DIRECTORY_NOT_FOUND: ERR_CENTRAL_DIRECTORY_NOT_FOUND,
|
|
5080
5325
|
ERR_ENCRYPTED: ERR_ENCRYPTED,
|
|
5326
|
+
ERR_ENCRYPTED_CENTRAL_DIRECTORY: ERR_ENCRYPTED_CENTRAL_DIRECTORY,
|
|
5081
5327
|
ERR_EOCDR_LOCATOR_ZIP64_NOT_FOUND: ERR_EOCDR_LOCATOR_ZIP64_NOT_FOUND,
|
|
5082
5328
|
ERR_EOCDR_NOT_FOUND: ERR_EOCDR_NOT_FOUND,
|
|
5083
5329
|
ERR_EXTRAFIELD_ZIP64_NOT_FOUND: ERR_EXTRAFIELD_ZIP64_NOT_FOUND,
|
|
@@ -5129,6 +5375,7 @@
|
|
|
5129
5375
|
const ERR_INVALID_ENTRY_NAME = "File entry name exceeds 64KB";
|
|
5130
5376
|
const ERR_INVALID_VERSION = "Version exceeds 65535";
|
|
5131
5377
|
const ERR_INVALID_ENCRYPTION_STRENGTH = "The strength must equal 1, 2, or 3";
|
|
5378
|
+
const ERR_UNSUPPORTED_ENCRYPTION_USDZ = "Encryption is not supported in USDZ files";
|
|
5132
5379
|
const ERR_INVALID_EXTRAFIELD_TYPE = "Extra field type exceeds 65535";
|
|
5133
5380
|
const ERR_INVALID_EXTRAFIELD_DATA = "Extra field data exceeds 64KB";
|
|
5134
5381
|
const ERR_UNSUPPORTED_COMPRESSION = "Compression method not supported";
|
|
@@ -5489,7 +5736,11 @@
|
|
|
5489
5736
|
if (versionMadeBy > MAX_16_BITS) {
|
|
5490
5737
|
throw new Error(ERR_INVALID_VERSION);
|
|
5491
5738
|
}
|
|
5492
|
-
let externalFileAttributes = getOptionValue(zipWriter, options, PROPERTY_NAME_EXTERNAL_FILE_ATTRIBUTES
|
|
5739
|
+
let externalFileAttributes = getOptionValue(zipWriter, options, PROPERTY_NAME_EXTERNAL_FILE_ATTRIBUTES);
|
|
5740
|
+
const externalFileAttributesProvided = externalFileAttributes !== UNDEFINED_VALUE;
|
|
5741
|
+
if (!externalFileAttributesProvided) {
|
|
5742
|
+
externalFileAttributes = 0;
|
|
5743
|
+
}
|
|
5493
5744
|
if (!options[PROPERTY_NAME_DIRECTORY] && name.endsWith(DIRECTORY_SIGNATURE)) {
|
|
5494
5745
|
options[PROPERTY_NAME_DIRECTORY] = true;
|
|
5495
5746
|
}
|
|
@@ -5498,13 +5749,13 @@
|
|
|
5498
5749
|
if (!name.endsWith(DIRECTORY_SIGNATURE)) {
|
|
5499
5750
|
name += DIRECTORY_SIGNATURE;
|
|
5500
5751
|
}
|
|
5501
|
-
if (
|
|
5752
|
+
if (!externalFileAttributesProvided) {
|
|
5502
5753
|
externalFileAttributes = FILE_ATTR_MSDOS_DIR_MASK;
|
|
5503
5754
|
if (!msDosCompatible) {
|
|
5504
5755
|
externalFileAttributes |= (FILE_ATTR_UNIX_TYPE_DIR | FILE_ATTR_UNIX_EXECUTABLE_MASK | FILE_ATTR_UNIX_DEFAULT_MASK) << 16;
|
|
5505
5756
|
}
|
|
5506
5757
|
}
|
|
5507
|
-
} else if (!msDosCompatible &&
|
|
5758
|
+
} else if (!msDosCompatible && !externalFileAttributesProvided) {
|
|
5508
5759
|
if (executable) {
|
|
5509
5760
|
externalFileAttributes = (FILE_ATTR_UNIX_EXECUTABLE_MASK | FILE_ATTR_UNIX_DEFAULT_MASK) << 16;
|
|
5510
5761
|
} else {
|
|
@@ -5513,6 +5764,7 @@
|
|
|
5513
5764
|
}
|
|
5514
5765
|
let unixExternalUpper;
|
|
5515
5766
|
if (!msDosCompatible) {
|
|
5767
|
+
const unixModeProvided = unixMode !== UNDEFINED_VALUE || Boolean(setuid || setgid || sticky);
|
|
5516
5768
|
unixExternalUpper = (externalFileAttributes >> 16) & MAX_16_BITS;
|
|
5517
5769
|
unixMode = unixMode === UNDEFINED_VALUE ? unixExternalUpper : (unixMode & MAX_16_BITS);
|
|
5518
5770
|
if (setuid) {
|
|
@@ -5530,10 +5782,12 @@
|
|
|
5530
5782
|
} else {
|
|
5531
5783
|
sticky = Boolean(unixMode & FILE_ATTR_UNIX_STICKY_MASK);
|
|
5532
5784
|
}
|
|
5533
|
-
if (
|
|
5534
|
-
|
|
5785
|
+
if (!externalFileAttributesProvided || unixModeProvided) {
|
|
5786
|
+
if (directory) {
|
|
5787
|
+
unixMode |= FILE_ATTR_UNIX_TYPE_DIR;
|
|
5788
|
+
}
|
|
5789
|
+
externalFileAttributes = ((unixMode & MAX_16_BITS) << 16) | (externalFileAttributes & MAX_16_BITS);
|
|
5535
5790
|
}
|
|
5536
|
-
externalFileAttributes = ((unixMode & MAX_16_BITS) << 16) | (externalFileAttributes & MAX_8_BITS);
|
|
5537
5791
|
}
|
|
5538
5792
|
({ msdosAttributesRaw, msdosAttributes } = normalizeMsdosAttributes(msdosAttributesRaw, msdosAttributes));
|
|
5539
5793
|
if (hasMsDosProvided) {
|
|
@@ -5593,6 +5847,7 @@
|
|
|
5593
5847
|
const encryptionStrength = getOptionValue(zipWriter, options, OPTION_ENCRYPTION_STRENGTH, 3);
|
|
5594
5848
|
const zipCrypto = getOptionValue(zipWriter, options, PROPERTY_NAME_ZIPCRYPTO);
|
|
5595
5849
|
const extendedTimestamp = getOptionValue(zipWriter, options, OPTION_EXTENDED_TIMESTAMP, true);
|
|
5850
|
+
const ntfsTimestamp = getOptionValue(zipWriter, options, OPTION_NTFS_TIMESTAMP);
|
|
5596
5851
|
const keepOrder = getOptionValue(zipWriter, options, OPTION_KEEP_ORDER, true);
|
|
5597
5852
|
const useWebWorkers = getOptionValue(zipWriter, options, OPTION_USE_WEB_WORKERS);
|
|
5598
5853
|
const transferStreams = getOptionValue(zipWriter, options, OPTION_TRANSFER_STREAMS);
|
|
@@ -5602,11 +5857,20 @@
|
|
|
5602
5857
|
const signal = getOptionValue(zipWriter, options, OPTION_SIGNAL);
|
|
5603
5858
|
const useUnicodeFileNames = getOptionValue(zipWriter, options, OPTION_USE_UNICODE_FILE_NAMES, true);
|
|
5604
5859
|
const compressionMethod = getOptionValue(zipWriter, options, PROPERTY_NAME_COMPRESSION_METHOD);
|
|
5860
|
+
const registeredCodec = passThrough || compressionMethod === UNDEFINED_VALUE ? UNDEFINED_VALUE : getRegisteredCodec(compressionMethod);
|
|
5605
5861
|
if (!passThrough && compressionMethod !== UNDEFINED_VALUE &&
|
|
5606
|
-
compressionMethod !== COMPRESSION_METHOD_STORE && compressionMethod !== COMPRESSION_METHOD_DEFLATE) {
|
|
5862
|
+
compressionMethod !== COMPRESSION_METHOD_STORE && compressionMethod !== COMPRESSION_METHOD_DEFLATE && !registeredCodec) {
|
|
5607
5863
|
throw new Error(ERR_UNSUPPORTED_COMPRESSION);
|
|
5608
5864
|
}
|
|
5609
5865
|
let level = getOptionValue(zipWriter, options, OPTION_LEVEL);
|
|
5866
|
+
if (zipWriter.options[OPTION_USDZ]) {
|
|
5867
|
+
if (password !== UNDEFINED_VALUE || rawPassword !== UNDEFINED_VALUE) {
|
|
5868
|
+
throw new Error(ERR_UNSUPPORTED_ENCRYPTION_USDZ);
|
|
5869
|
+
}
|
|
5870
|
+
if (level === UNDEFINED_VALUE && compressionMethod === UNDEFINED_VALUE) {
|
|
5871
|
+
level = 0;
|
|
5872
|
+
}
|
|
5873
|
+
}
|
|
5610
5874
|
let useCompressionStream = getOptionValue(zipWriter, options, OPTION_USE_COMPRESSION_STREAM);
|
|
5611
5875
|
let dataDescriptor = getOptionValue(zipWriter, options, OPTION_DATA_DESCRIPTOR);
|
|
5612
5876
|
if (bufferedWrite && dataDescriptor === UNDEFINED_VALUE) {
|
|
@@ -5618,7 +5882,7 @@
|
|
|
5618
5882
|
if (level !== UNDEFINED_VALUE && level != 6) {
|
|
5619
5883
|
useCompressionStream = false;
|
|
5620
5884
|
}
|
|
5621
|
-
if (!useCompressionStream && (zipWriter.config.CompressionStream === UNDEFINED_VALUE && zipWriter.config.CompressionStreamZlib === UNDEFINED_VALUE)) {
|
|
5885
|
+
if (!useCompressionStream && !registeredCodec && (zipWriter.config.CompressionStream === UNDEFINED_VALUE && zipWriter.config.CompressionStreamZlib === UNDEFINED_VALUE)) {
|
|
5622
5886
|
level = 0;
|
|
5623
5887
|
}
|
|
5624
5888
|
const zip64 = getOptionValue(zipWriter, options, PROPERTY_NAME_ZIP64);
|
|
@@ -5662,6 +5926,7 @@
|
|
|
5662
5926
|
encryptionStrength,
|
|
5663
5927
|
zipCrypto,
|
|
5664
5928
|
extendedTimestamp,
|
|
5929
|
+
ntfsTimestamp,
|
|
5665
5930
|
keepOrder,
|
|
5666
5931
|
useWebWorkers,
|
|
5667
5932
|
transferStreams,
|
|
@@ -5671,6 +5936,9 @@
|
|
|
5671
5936
|
signal,
|
|
5672
5937
|
useUnicodeFileNames,
|
|
5673
5938
|
compressionMethod,
|
|
5939
|
+
format: registeredCodec ? registeredCodec.format : UNDEFINED_VALUE,
|
|
5940
|
+
codecURI: registeredCodec ? registeredCodec.codecURI : UNDEFINED_VALUE,
|
|
5941
|
+
codecVersionNeeded: registeredCodec ? registeredCodec.versionNeeded : UNDEFINED_VALUE,
|
|
5674
5942
|
level,
|
|
5675
5943
|
useCompressionStream,
|
|
5676
5944
|
dataDescriptor,
|
|
@@ -5967,7 +6235,9 @@
|
|
|
5967
6235
|
msdosAttributesRaw,
|
|
5968
6236
|
msdosAttributes,
|
|
5969
6237
|
useCompressionStream,
|
|
5970
|
-
passThrough
|
|
6238
|
+
passThrough,
|
|
6239
|
+
format,
|
|
6240
|
+
codecURI
|
|
5971
6241
|
} = options;
|
|
5972
6242
|
const fileEntry = {
|
|
5973
6243
|
lock,
|
|
@@ -6027,7 +6297,9 @@
|
|
|
6027
6297
|
encrypted: encrypted && !passThrough,
|
|
6028
6298
|
useWebWorkers,
|
|
6029
6299
|
useCompressionStream,
|
|
6030
|
-
transferStreams
|
|
6300
|
+
transferStreams,
|
|
6301
|
+
format,
|
|
6302
|
+
codecURI
|
|
6031
6303
|
},
|
|
6032
6304
|
config,
|
|
6033
6305
|
streamOptions: { signal, size, onstart, onprogress, onend }
|
|
@@ -6099,6 +6371,7 @@
|
|
|
6099
6371
|
rawExtraField,
|
|
6100
6372
|
encryptionStrength,
|
|
6101
6373
|
extendedTimestamp,
|
|
6374
|
+
ntfsTimestamp,
|
|
6102
6375
|
passThrough,
|
|
6103
6376
|
encrypted,
|
|
6104
6377
|
zip64UncompressedSize,
|
|
@@ -6144,7 +6417,8 @@
|
|
|
6144
6417
|
let extraFieldExtendedTimestampFlag;
|
|
6145
6418
|
if (extendedTimestamp) {
|
|
6146
6419
|
const lastModTimeUnix = getTimeUnix(lastModDate);
|
|
6147
|
-
|
|
6420
|
+
const lastModTimeUnixInRange = inUnixTimeRange(lastModTimeUnix);
|
|
6421
|
+
if (lastModTimeUnixInRange) {
|
|
6148
6422
|
const extraFieldTimestampLength = 9 + (lastAccessDate ? 4 : 0) + (creationDate ? 4 : 0);
|
|
6149
6423
|
const extraFieldTimestamp = createRecordWriter(extraFieldTimestampLength);
|
|
6150
6424
|
extraFieldExtendedTimestampFlag = 0x1 + (lastAccessDate ? 0x2 : 0) + (creationDate ? 0x4 : 0);
|
|
@@ -6162,19 +6436,26 @@
|
|
|
6162
6436
|
} else {
|
|
6163
6437
|
rawExtraFieldExtendedTimestamp = EMPTY_UINT8_ARRAY;
|
|
6164
6438
|
}
|
|
6165
|
-
|
|
6166
|
-
|
|
6167
|
-
|
|
6168
|
-
|
|
6169
|
-
|
|
6170
|
-
|
|
6171
|
-
|
|
6172
|
-
|
|
6173
|
-
|
|
6174
|
-
|
|
6175
|
-
|
|
6176
|
-
|
|
6177
|
-
|
|
6439
|
+
const writeExtraFieldNTFS = ntfsTimestamp === UNDEFINED_VALUE ?
|
|
6440
|
+
!lastModTimeUnixInRange || Boolean(lastAccessDate || creationDate) :
|
|
6441
|
+
ntfsTimestamp;
|
|
6442
|
+
if (writeExtraFieldNTFS) {
|
|
6443
|
+
try {
|
|
6444
|
+
const lastModTimeNTFS = getTimeNTFS(lastModDate);
|
|
6445
|
+
const extraFieldNTFS = createRecordWriter(36);
|
|
6446
|
+
extraFieldNTFS.uint16(EXTRAFIELD_TYPE_NTFS);
|
|
6447
|
+
extraFieldNTFS.uint16(32);
|
|
6448
|
+
extraFieldNTFS.skip(4);
|
|
6449
|
+
extraFieldNTFS.uint16(EXTRAFIELD_TYPE_NTFS_TAG1);
|
|
6450
|
+
extraFieldNTFS.uint16(24);
|
|
6451
|
+
extraFieldNTFS.uint64(lastModTimeNTFS);
|
|
6452
|
+
extraFieldNTFS.uint64(getTimeNTFS(lastAccessDate) || lastModTimeNTFS);
|
|
6453
|
+
extraFieldNTFS.uint64(getTimeNTFS(creationDate) || lastModTimeNTFS);
|
|
6454
|
+
rawExtraFieldNTFS = extraFieldNTFS.array;
|
|
6455
|
+
} catch {
|
|
6456
|
+
rawExtraFieldNTFS = EMPTY_UINT8_ARRAY;
|
|
6457
|
+
}
|
|
6458
|
+
} else {
|
|
6178
6459
|
rawExtraFieldNTFS = EMPTY_UINT8_ARRAY;
|
|
6179
6460
|
}
|
|
6180
6461
|
} else {
|
|
@@ -6212,6 +6493,10 @@
|
|
|
6212
6493
|
if (compressionMethod === UNDEFINED_VALUE) {
|
|
6213
6494
|
compressionMethod = compressed ? COMPRESSION_METHOD_DEFLATE : COMPRESSION_METHOD_STORE;
|
|
6214
6495
|
}
|
|
6496
|
+
const { codecVersionNeeded } = options;
|
|
6497
|
+
if (compressed && codecVersionNeeded !== UNDEFINED_VALUE) {
|
|
6498
|
+
version = version > codecVersionNeeded ? version : codecVersionNeeded;
|
|
6499
|
+
}
|
|
6215
6500
|
if (zip64) {
|
|
6216
6501
|
version = version > VERSION_ZIP64 ? version : VERSION_ZIP64;
|
|
6217
6502
|
}
|
|
@@ -6225,6 +6510,7 @@
|
|
|
6225
6510
|
if (extraFieldLength > MAX_16_BITS) {
|
|
6226
6511
|
throw new Error(ERR_INVALID_EXTRAFIELD_DATA);
|
|
6227
6512
|
}
|
|
6513
|
+
const dosLastModDate = new Date(Math.ceil(lastModDate.getTime() / 2000) * 2000);
|
|
6228
6514
|
const {
|
|
6229
6515
|
headerArray,
|
|
6230
6516
|
headerView,
|
|
@@ -6234,7 +6520,7 @@
|
|
|
6234
6520
|
bitFlag: getBitFlag(level, useUnicodeFileNames, dataDescriptor, encrypted, compressionMethod),
|
|
6235
6521
|
compressionMethod,
|
|
6236
6522
|
uncompressedSize,
|
|
6237
|
-
lastModDate:
|
|
6523
|
+
lastModDate: dosLastModDate < MIN_DATE ? MIN_DATE : dosLastModDate > MAX_DATE ? MAX_DATE : dosLastModDate,
|
|
6238
6524
|
rawFilename,
|
|
6239
6525
|
zip64CompressedSize,
|
|
6240
6526
|
zip64UncompressedSize,
|
|
@@ -7352,7 +7638,7 @@
|
|
|
7352
7638
|
*/
|
|
7353
7639
|
|
|
7354
7640
|
|
|
7355
|
-
|
|
7641
|
+
a(setDefaultConfiguration);
|
|
7356
7642
|
|
|
7357
7643
|
exports.BlobReader = BlobReader;
|
|
7358
7644
|
exports.BlobWriter = BlobWriter;
|
|
@@ -7363,11 +7649,14 @@
|
|
|
7363
7649
|
exports.ERR_CENTRAL_DIRECTORY_NOT_FOUND = ERR_CENTRAL_DIRECTORY_NOT_FOUND;
|
|
7364
7650
|
exports.ERR_DUPLICATED_NAME = ERR_DUPLICATED_NAME;
|
|
7365
7651
|
exports.ERR_ENCRYPTED = ERR_ENCRYPTED;
|
|
7652
|
+
exports.ERR_ENCRYPTED_CENTRAL_DIRECTORY = ERR_ENCRYPTED_CENTRAL_DIRECTORY;
|
|
7366
7653
|
exports.ERR_EOCDR_LOCATOR_ZIP64_NOT_FOUND = ERR_EOCDR_LOCATOR_ZIP64_NOT_FOUND;
|
|
7367
7654
|
exports.ERR_EOCDR_NOT_FOUND = ERR_EOCDR_NOT_FOUND;
|
|
7368
7655
|
exports.ERR_EXTRAFIELD_ZIP64_NOT_FOUND = ERR_EXTRAFIELD_ZIP64_NOT_FOUND;
|
|
7369
7656
|
exports.ERR_HTTP_RANGE = ERR_HTTP_RANGE;
|
|
7370
7657
|
exports.ERR_HTTP_RESOURCE_CHANGED = ERR_HTTP_RESOURCE_CHANGED;
|
|
7658
|
+
exports.ERR_INVALID_CODEC_DEFINITION = ERR_INVALID_CODEC_DEFINITION;
|
|
7659
|
+
exports.ERR_INVALID_CODEC_MODULE = ERR_INVALID_CODEC_MODULE;
|
|
7371
7660
|
exports.ERR_INVALID_COMMENT = ERR_INVALID_COMMENT;
|
|
7372
7661
|
exports.ERR_INVALID_COMPRESSED_DATA = ERR_INVALID_COMPRESSED_DATA;
|
|
7373
7662
|
exports.ERR_INVALID_ENCRYPTION_STRENGTH = ERR_INVALID_ENCRYPTION_STRENGTH;
|
|
@@ -7382,11 +7671,13 @@
|
|
|
7382
7671
|
exports.ERR_ITERATOR_COMPLETED_TOO_SOON = ERR_ITERATOR_COMPLETED_TOO_SOON;
|
|
7383
7672
|
exports.ERR_LOCAL_FILE_HEADER_NOT_FOUND = ERR_LOCAL_FILE_HEADER_NOT_FOUND;
|
|
7384
7673
|
exports.ERR_OVERLAPPING_ENTRY = ERR_OVERLAPPING_ENTRY;
|
|
7674
|
+
exports.ERR_RESERVED_COMPRESSION_METHOD = ERR_RESERVED_COMPRESSION_METHOD;
|
|
7385
7675
|
exports.ERR_SPLIT_ZIP_FILE = ERR_SPLIT_ZIP_FILE;
|
|
7386
7676
|
exports.ERR_UNDEFINED_READER = ERR_UNDEFINED_READER;
|
|
7387
7677
|
exports.ERR_UNDEFINED_UNCOMPRESSED_SIZE = ERR_UNDEFINED_UNCOMPRESSED_SIZE;
|
|
7388
7678
|
exports.ERR_UNSUPPORTED_COMPRESSION = ERR_UNSUPPORTED_COMPRESSION$1;
|
|
7389
7679
|
exports.ERR_UNSUPPORTED_ENCRYPTION = ERR_UNSUPPORTED_ENCRYPTION;
|
|
7680
|
+
exports.ERR_UNSUPPORTED_ENCRYPTION_USDZ = ERR_UNSUPPORTED_ENCRYPTION_USDZ;
|
|
7390
7681
|
exports.ERR_UNSUPPORTED_FORMAT = ERR_UNSUPPORTED_FORMAT;
|
|
7391
7682
|
exports.ERR_WRITER_NOT_INITIALIZED = ERR_WRITER_NOT_INITIALIZED;
|
|
7392
7683
|
exports.ERR_ZIP_NOT_EMPTY = ERR_ZIP_NOT_EMPTY;
|
|
@@ -7409,7 +7700,9 @@
|
|
|
7409
7700
|
exports.createOPFSTempStream = createOPFSTempStream;
|
|
7410
7701
|
exports.createSyncAccessHandleTempStream = createSyncAccessHandleTempStream;
|
|
7411
7702
|
exports.getMimeType = getMimeType;
|
|
7703
|
+
exports.registerCodec = registerCodec;
|
|
7412
7704
|
exports.resetConfiguration = resetConfiguration;
|
|
7413
7705
|
exports.terminateWorkers = terminateWorkers;
|
|
7706
|
+
exports.unregisterCodec = unregisterCodec;
|
|
7414
7707
|
|
|
7415
7708
|
}));
|