@zip.js/zip.js 2.18.2 → 2.20.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/BENCHMARKS.md +172 -144
- package/deno.json +1 -1
- package/dist/zip-core-external.js +192 -120
- package/dist/zip-core-external.min.js +1 -1
- package/dist/zip-core.js +193 -119
- package/dist/zip-core.min.js +1 -1
- package/dist/zip-fs-core-external.js +192 -120
- package/dist/zip-fs-core-external.min.js +1 -1
- package/dist/zip-fs-core.js +193 -119
- package/dist/zip-fs-core.min.js +1 -1
- package/dist/zip-fs-external.js +192 -120
- package/dist/zip-fs-external.min.js +1 -1
- package/dist/zip-fs-native.js +195 -121
- package/dist/zip-fs-native.min.js +1 -1
- package/dist/zip-fs.js +194 -120
- package/dist/zip-fs.min.js +1 -1
- package/dist/zip-legacy.js +195 -121
- package/dist/zip-legacy.min.js +1 -1
- package/dist/zip-native.js +195 -121
- 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 +194 -120
- package/dist/zip.min.js +1 -1
- package/index-native.cjs +195 -121
- package/index-native.min.js +1 -1
- package/index.cjs +194 -120
- package/index.d.cts +95 -26
- package/index.d.ts +95 -26
- package/index.min.js +1 -1
- package/lib/core/codec-pool.js +1 -2
- package/lib/core/codec-worker-web.js +11 -39
- package/lib/core/codec-worker.js +1 -2
- package/lib/core/configuration.js +1 -1
- package/lib/core/options.js +0 -2
- package/lib/core/streams/codec-stream.js +1 -1
- package/lib/core/version.js +1 -1
- package/lib/core/web-worker-base.js +2 -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-reader.js +100 -40
- package/lib/core/zip-writer.js +75 -34
- package/lib/zip-core-reader.js +2 -0
- package/package.json +1 -1
- package/worker-message-property-names.js +1 -1
package/index-native.cjs
CHANGED
|
@@ -179,7 +179,6 @@ const OPTION_CHECK_CRC32 = "checkCrc32";
|
|
|
179
179
|
const OPTION_CHECK_AUTHENTICATION_CODE = "checkAuthenticationCode";
|
|
180
180
|
const OPTION_USE_WEB_WORKERS = "useWebWorkers";
|
|
181
181
|
const OPTION_USE_COMPRESSION_STREAM = "useCompressionStream";
|
|
182
|
-
const OPTION_TRANSFER_STREAMS = "transferStreams";
|
|
183
182
|
const OPTION_PREVENT_CLOSE = "preventClose";
|
|
184
183
|
const OPTION_ENCRYPTION_STRENGTH = "encryptionStrength";
|
|
185
184
|
const OPTION_EXTENDED_TIMESTAMP = "extendedTimestamp";
|
|
@@ -297,7 +296,7 @@ function toNumber(value) {
|
|
|
297
296
|
*/
|
|
298
297
|
|
|
299
298
|
|
|
300
|
-
const DEFAULT_CHUNK_SIZE$1 =
|
|
299
|
+
const DEFAULT_CHUNK_SIZE$1 = 256 * 1024;
|
|
301
300
|
const MINIMUM_CHUNK_SIZE = 64;
|
|
302
301
|
const MINIMUM_PROPERTY_VALUE = 1;
|
|
303
302
|
const ERR_INVALID_MAX_WORKERS = "Invalid maxWorkers (must be an integer greater than 0)";
|
|
@@ -439,7 +438,7 @@ function resetConfiguration() {
|
|
|
439
438
|
Object.assign(config, DEFAULT_CONFIGURATION);
|
|
440
439
|
}
|
|
441
440
|
|
|
442
|
-
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],o=[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],t=[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],n=[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],i=new Uint8Array(288);i.fill(8,0,144),i.fill(9,144,256),i.fill(7,256,280),i.fill(8,280,288);const w=new Uint8Array(30).fill(5);function L(r){const o=new Uint16Array(16);for(const t of r)o[t]++;o[0]=0;const t=new Uint16Array(17);for(let r=1;r<=15;r++)t[r+1]=t[r]+o[r];const n=new Uint16Array(r.length);for(let o=0;o<r.length;o++)r[o]&&(n[t[r[o]]++]=o);return {lengthCounts:o,symbols:n}}const u="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",f=(U=()=>function(u){let f=0,U=0,g=0,l=new Uint8Array(1024),d=0,s=0;for(;!s;){s=N(1);const r=N(2);if(0==r)C();else if(1==r)K(L(i),L(w));else {if(2!=r)throw new Error("invalid deflate block type");K(...V());}}return l.subarray(0,d);function q(){if(f>=u.length)throw new Error("unexpected end of deflate data");return u[f++]}function N(r){for(;g<r;)U|=q()<<g,g+=8;const o=U&(1<<r)-1;return U>>>=r,g-=r,o}function C(){U=0,g=0;const r=q()|q()<<8;f+=2,a(d+r);for(let o=0;o<r;o++)l[d++]=q();}function K(e,i){let w=c(e);for(;256!=w;){if(w<256)a(d+1),l[d++]=w;else {const e=w-257,L=r[e]+N(o[e]),u=c(i),f=t[u]+N(n[u]);a(d+L);const U=d-f;for(let r=0;r<L;r++)l[d++]=l[U+r];}w=c(e);}}function V(){const r=N(5)+257,o=N(5)+1,t=N(4)+4,n=new Uint8Array(19);for(let r=0;r<t;r++)n[e[r]]=N(3);const i=L(n),w=new Uint8Array(r+o);let u=0;for(;u<w.length;){const r=c(i);if(r<16)w[u++]=r;else if(16==r){const r=w[u-1];let o=N(2)+3;for(;o--;)w[u++]=r;}else u+=17==r?N(3)+3:N(7)+11;}return [L(w.subarray(0,r)),L(w.subarray(r))]}function c(r){const{lengthCounts:o,symbols:t}=r;let n=0,e=0,i=0;for(let r=1;r<=15;r++){n|=N(1);const w=o[r];if(n-e<w)return t[i+(n-e)];i+=w,e=e+w<<1,n<<=1;}throw new Error("invalid huffman code")}function a(r){if(l.length<r){let o=2*l.length;for(;o<r;)o*=2;const t=new Uint8Array(o);t.set(l.subarray(0,d)),l=t;}}}(function(r){const o=(r=String(r).replace(/[^A-Za-z0-9+/=]/g,"")).length,t=[];for(let n=0;n<o;n+=4){const o=u.indexOf(r[n])<<18|u.indexOf(r[n+1])<<12|(63&u.indexOf(r[n+2]))<<6|63&u.indexOf(r[n+3]);t.push(o>>16&255),"="!==r[n+2]&&t.push(o>>8&255),"="!==r[n+3]&&t.push(255&o);}return new Uint8Array(t)}("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")),r=>r({workerURI:r=>{const o="text/javascript";let t=U();if("string"==typeof t&&(t=(new TextEncoder).encode(t)),r){const r=new Blob([t],{type:o});return URL.createObjectURL(r)}return "data:"+o+";base64,"+function(r){let o="";const t=r.length;let n=0;for(;n+2<t;n+=3){const t=r[n]<<16|r[n+1]<<8|r[n+2];o+=u[t>>18&63]+u[t>>12&63]+u[t>>6&63]+u[63&t];}const e=t-n;if(1===e){const t=r[n]<<16;o+=u[t>>18&63]+u[t>>12&63]+"==";}else if(2===e){const t=r[n]<<16|r[n+1]<<8;o+=u[t>>18&63]+u[t>>12&63]+u[t>>6&63]+"=";}return o}(t)}}));var U;
|
|
441
|
+
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],l=[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0],s=[1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577],e=[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],n=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],f=new Uint8Array(288);f.fill(8,0,144),f.fill(9,144,256),f.fill(7,256,280),f.fill(8,280,288);const t=new Uint8Array(30).fill(5);function o(r){const l=new Uint16Array(16);for(const s of r)l[s]++;l[0]=0;const s=new Uint16Array(17);for(let r=1;r<=15;r++)s[r+1]=s[r]+l[r];const e=new Uint16Array(r.length);for(let l=0;l<r.length;l++)r[l]&&(e[s[r[l]]++]=l);return {lengthCounts:l,symbols:e}}const c="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",g$1=(a=()=>function(c){let g=0,a=0,W=0,y=new Uint8Array(1024),U=0,d=0;for(;!d;){d=F(1);const r=F(2);if(0==r)J();else if(1==r)i(o(f),o(t));else {if(2!=r)throw new Error("invalid deflate block type");i(...V());}}return y.subarray(0,U);function q(){if(g>=c.length)throw new Error("unexpected end of deflate data");return c[g++]}function F(r){for(;W<r;)a|=q()<<W,W+=8;const l=a&(1<<r)-1;return a>>>=r,W-=r,l}function J(){a=0,W=0;const r=q()|q()<<8;g+=2,Y(U+r);for(let l=0;l<r;l++)y[U++]=q();}function i(n,f){let t=T(n);for(;256!=t;){if(t<256)Y(U+1),y[U++]=t;else {const n=t-257,o=r[n]+F(l[n]),c=T(f),g=s[c]+F(e[c]);Y(U+o);const a=U-g;for(let r=0;r<o;r++)y[U++]=y[a+r];}t=T(n);}}function V(){const r=F(5)+257,l=F(5)+1,s=F(4)+4,e=new Uint8Array(19);for(let r=0;r<s;r++)e[n[r]]=F(3);const f=o(e),t=new Uint8Array(r+l);let c=0;for(;c<t.length;){const r=T(f);if(r<16)t[c++]=r;else if(16==r){const r=t[c-1];let l=F(2)+3;for(;l--;)t[c++]=r;}else c+=17==r?F(3)+3:F(7)+11;}return [o(t.subarray(0,r)),o(t.subarray(r))]}function T(r){const{lengthCounts:l,symbols:s}=r;let e=0,n=0,f=0;for(let r=1;r<=15;r++){e|=F(1);const t=l[r];if(e-n<t)return s[f+(e-n)];f+=t,n=n+t<<1,e<<=1;}throw new Error("invalid huffman code")}function Y(r){if(y.length<r){let l=2*y.length;for(;l<r;)l*=2;const s=new Uint8Array(l);s.set(y.subarray(0,U)),y=s;}}}(function(r){const l=(r=String(r).replace(/[^A-Za-z0-9+/=]/g,"")).length,s=[];for(let e=0;e<l;e+=4){const l=c.indexOf(r[e])<<18|c.indexOf(r[e+1])<<12|(63&c.indexOf(r[e+2]))<<6|63&c.indexOf(r[e+3]);s.push(l>>16&255),"="!==r[e+2]&&s.push(l>>8&255),"="!==r[e+3]&&s.push(255&l);}return new Uint8Array(s)}("zH0Lc9s4kvBfsVyzKmII8kjqYZkSpMpz4iROMnaSSUal5KMp0GYsgxoKsmJbut/+VTdAEno4m/He7l2VigJBPBuNRnej0aglcxHLNBMWJ3f7xcs+Y/JmyrNkb8yTVPB6Xf270dV4oIIWJyG3yMoqCyB3+/MZ35vJPI3lfjfOxEzePcrz6Cbk9O3ZNx7LUNI386sznoeCHkfyIszpszzP8jCjH1IhOyp1ii9+W70l+NYI1FtMj6qXiB5H03BOn0Yy+pjyRTij7/LsKp3xcELf8+/ymYizMc/DBY3zm6nMwjGdZjN5zGez6JyHF/R9HolZkuVXpzLn0VU4pSc8GkdnE64jbugfeSqNiCv6JLua5nw2SzOh4y7pUx5vxZ6t2IxPEnrNrrN0vOfRc7Y/Fwp64316yipw01sm+GIvpSdsOBzRXb9RN8lya8LlHmdel/eCVrvLbZvcQZRkfONzBz9K5tflQPb7ff9L47DTCQ6DRqcZYkT3ZOiNhnzE5Gp3yUWsZH5X9jpdCbXhqO4JdjKUjg/ZuydDicWIfr/f+YKFBq1WXYxWmHb4hL6jz+gH+p0e0Uf064iddONJNJvtHavC8nkssxzQT16kMzdjfLl0/FU0nXIxhmjVBm+pPneLFnhL7k64OJcXXUiRM6+bJpbos069zt2zeZLwvGhvhuCdWUU85e7ZjeRvk2TGJRWEpkw4HQRhN++xtJvbrFNk5kx+ydxzLhHzrJzWPEIFM6PsJkR2JfuKfeejL4+GHOBRD1qt0ZcjfPHb6u07vgVN9fZBQ+vLs6GocrzDlyLHE3zTOVYr3UzRzXGIJQL+CZZjyS98mI/IqKuBKVfnXFrkLudynov/VrGrlRqBl3v8u+RiPNubro2FgjnXoJYIvOPubD7luXUniyljcSrInXTLkaLC5eKvOZ8DcVjRZDKfXVgVyiCGW03SVWMhijFyZ1yqKW55VLrYXkK5ex1N5pyJ1YpQzqDhq1UxYfaeWpzKzaILfLClDpCu6vaegDpUCyEgaZGUUFEV+hmwrcjxA3xRL69VAQrL956zdpO+YIFH3+jWDP2gMyL0vX71Cf2Gwcga+geNoNVp+ocN2vSCRtBoNP0DGrTaQaPT8L2ABgf+QaPROejQRtBpNQ4OWoE3IvSxLitotQl9q0vDl4/myyvz5Q/jBSfKX6zmd8s+/6kAWTOoeJpYtb80CjCfwvQfZ3ecIX7xL7zX879YftCp80FwEHqEUMk07slez19/DdZfm4RCTlmHd3ZI6GMgHfq7BdmXst8/IBgOINxW4QaEWyrchHCTfDk8JKvFRTrhll9jnHQfD70ROzy8j1AW2AxVUsF+syShORO9XtBcQs1teHaW4ovsvoVW5fQj/sH0WuaQjL4qIvw2xPht+kcREzQhprP6i9W81coiXRM3I6vtQWXVYmtib4GM/X4ADbLbNGPNX63c9tWIpcwv+wRkrpz6w3zE+LD5az7CTmDQ9kfYF/USjKBLKtwwlxDR5b2sWkByJofc8Udd/g/BmDewcva7Bf1Zqr6RLykCIGW/WSkhoei363VM26zXVWLAA1xOhtwRoy/5Ss+kfIWEgmYaEk2gtr9YUvUtYR6NmUfnzKMT6BtmupvmWcxnMwUnWa+n7nw6jiS3OPWMyWsyLyax+qmZSyvIlyuIIq223+4xgDHz22RhESqBbBTkXxqEn3zJhjAzzQR2cy2J3YRE/maiznqiDiQKNhP5wXoqP4BkjRGBpS7vCXK3sEi3WqhL3KCwWMNK8IVlQ9nvByMcRqfzq9WoS7JaATGUy+VuuK7oOD3nMxlahPVTV71YZFWRjYVF7hKW2P7So8lyacUsxnC8XFpzNsfwfLm0JmwCYULUaHP2yUrIFzH0RlSyT1YMYX9EU/bJmkM4GNGIfbImEG6M6Iy91Yvl6MvHoTSWxFfDtFot/8C1Lxp9EcPmiC7YW0yqMqVrmaLNTBwytUZ0zN5iUpUpWsvENzNJyNQe0Qv2FpOqTHwtk9zMlEKmg1GXs7fDWZlpsZZpvJnpAjJ1AFhvManKNF7LdLGZaQaZDgGqbzGpynSxlmm2mWkBmXwP4P8W06pcs7Vci81cY8zlP2Sk/OAhQ+U3HjJWfvMhg+W3RvTvj5bffshw+QcPGq/Og8br8CHjFXgPGa/Af8h4BcFDxitoPGS8guZDxitoPWS8gvZDxis4eNB4dR40XocPGa+G95DxavgPGa9G8JDxajQeMl6N5kPGq9F6yHg12g8Zr8bBg8ar86DxOhzhKj5lTa+b932vXrf+/vg1vYeMX9N/yPg1g4eMX/NhnMeDWI/mg3iP5oOYj+bBiE5Zs0No3veDhw3eg3iR5oOYkdaDmJHWg5iR1oOYkdaDmJHWg5iRVgsGDyR6kDiY9bgYORT9Hpujh/LfY2MEQY57rAcROOvpiIJEAoUs1goZbxVysaOQmSrE9qGYAIsZrxVzsVXMbEcxC11MAMU0sJiLtWJmW8UsdhQz1sU0RoZ+6BdTIjR0G4VGT4mi30A5oYJ+G+RBpV55XgirhpKKJvpjR0kyWmYt5FUlRYWTQnDaqlKyzq9zKljuJpMsyy35X83gsHnYPggOYUhRiafEz4n1hnrUJ91Wu8biLplY79V7AuOuFIE0geFTKkKawBig7pAmAEdBk2FzxLIiZUuFMWVbhSHlwYhldGIl1KOdQlsR6U6+IHShIRAVEFgTM2WvFJ1B0lxUQmvzV0n5UI5K3RtHlds3Uor50coQJCcg4tNSUZsyaecg3M5tltOY3KFALntpvR73nneJGMa2DUoPadujbszY83rdWlgZ9bB8skoTS9rPeyxdVw7+lEJASf8qe1fa7DlZWIJKsioasVH/yhCHBfRhXfHkK70TKkXEmkLgV66QKKMp4yALJ4yDGBwzriRgDsLvHHQ7m2p/v9XlNmuRObPSXq+1RNJzQGzLir9EpJ58iYg9t/2W32l5XtA8tKF6ENJZ0us1vGUC6WnErDnknpe5ky8xqadfYmJHG7ltH/KnLMX8WB+NmRVB/qjMn35JSH3+JSF2vJk/gPxzNsf8WCNNmBVD/rjMP/+Sknr0JSV2spm/AfkjFmF+rJGmzEogf1Lmj77MST3+Mid2upm/CfljFmN+rLH7N6Dnt7bBlzEJgugXOezAI4CHN6IZy0CBCROs4VOIYtnPgzrbgjJW04TCD+GBFfrb1fhQzU+PSLY1GFhNCwv34NlUfdqqJ4B6fnrksq1Bg3qwAt+HZ0v1aauaBlTz0wOcbY1tNV8CmDBNT02YDBWTjbrqKXc6Zchv6qAPy/o2eCGWZXQLZ5IvscaXTuvw4KDVOGxgc7ZxhTtBWdtBVW/ZGNuH0FbNOn4XEqVfEo1A63VvIxB3/LLGdlV32SA7uKfuQNe9hVnzL6nGqvW6d2EV8ElQX6uquWyO3bin5oaueQvXoi9zjWfrNW/jmQYd1tis6vbKupv31N3UdW8hYPwl0si3Xvd9yAd412v/+5CvHi+tZBmTOqJg0PS8w9bhgdf5z6FgPVla6TIhdUTEjRb8RxCxni6t+TIldUTHjRb8B9CxPl9a0XJO6oiUG/X/R5CyHi2teBmROqLmRgvuQ802Ggj8++lio3HYarYPDzrBf54ubtT9H6WLG3X/B+niRs3/Ubq4Ufc68gGXi6yunS49Cswucrx2gm/BCBlfO8a3xgj5XzvCtyZucY7s+RK3VbeFNAh2yy1UkAfk7s1CzmS5lbUpzTw3rVtyVok3A5BlQq8rhnLEWs0vOc0gdBhUG5xldYJ69Dmhd2XtKBQYrYH3Ym/NEEarZnXLxJkqa60rLwoxLTez3NOKfGWIw78blg2PC9WIlrL5lpTNd0jZ3JB2PhmlcSzFareCjlfnBHebMTvGLFVVVdbfjKzKngCsCYKDXy0O2/6FNcXr0vysxs7r9eIFhKiTSIyzq49gGzJj7JRyzvaPxHU0Scd702g2W2T5eJ9KzvZv0+m3mROdZbl04gseXzrl90r+REM2MHl4TXSztmqxOOnKizxboFFIZu0/QVuyvUfvjvZEJvdm8+k0yyUf7xfNzzm7E9EVD/ffPX719Hmwv6IZDHM0m6Xnwrq7iGYXoU7x4vjRk/3Viuac0NRMlEqeR9DGWejzBjXznL545PhFpoSz4f6Y5+k1f5zK2f6IxpwNO9QPKGxFRZwN/TYNmhQU53POfI/OuAlfOuFsBiZ+7mx+JiccRdOFitPJJtwchwl30yvo8it+w9ipGV+1A8ZmzNmf2tjrgt9ja3RXDErIaR4t3hVvknKBRnvaoA4mYygoDmSR6K2Y3IS5ins0lxdcyDRGmD3JxjxMwBSjmGYxu1sVJkwzGeUwAW+4FVPQPwiyotHsRsR7pnVTYaJRNVHQWdGUhE7CiOY8Gt+E8xWL0fhsYEWLKJV7qizT2kPRgkLJoVJdc/3llFs59WiMehNQNWGEeoVy06E3qjHQ/yyX6dDHsD8iCinPOBo2IWpyTlZWTBNVJldlJiM7AIMqhlFFBM0H1hm3YqAxHGwwLVWE5ISQMLLgga2c09i90JND05/ZhsGVM+eO+UL+4beBlhXWYJcKzjPq0TkHS7kS3MpGrNDV3V2Fkl6HQoM112CVOEFVa/Lt1kTQMUGFUT+d6xaeKnpofoOGFeYlczTbKzplEFWYAhNWZOvN+cAPvQ1VzJyjfmeyZLMhH32JwBgyTaxJvZ4UtAQNP/kafEtiFa0h7B4Yqu4TWMkKqM3JCmzfrrgFxm80JoXZ3vR/Zi6tqvVu59TIHzo1MjoJEz2G8YrlCM2I3RZThN0/SaomCW6pIdSzoljnnlo53Zg+OSErK6cZWBklFeLGNN9ElQItosJSsETaIoCYO0eVZQRKxTUkBojMaZGZerTm/yQqZwCGDVTOtttXKJmFiaQJVNMtqNgptyo8xQll4sxTK6ExWUecnBicwI3mQ2iGpptqreH0TjUTap9YkvW5O2GS0HJ0zzlqOI0xdnx6Hd7Si7Dmr0hV/hVXZqHFMHI31wbVuKzyaMxzq2Ddbqw7BbvpfDJBC+D8RoMPjT9DSceZ4KFYaZTJsTSLdMWAu/Ekm3GLhFXvJVnFkYwvlDGxJo6C0NyNIxFzqMJVCcCw6Q4MS1crqr6FnPWtreRkBSOhbLbf5dmU5/LG4nS/6NQ+vTvnyk4qM8FwWeImzWhS4URMr8NoxXi3QCJgV9lTK6KSkBJJC/tVJ6MzNnfm//DbOHc27AcBn+p12S9Z3MqisGtxjUqSoIEtkEFScKx8BaNpzwidVVwoksoco7tKZw+oRj06I4TGbmWRl1TluNeIj3S2ZkeLK1I1DaC73L1gNY9Cc91xOptmyFwUQYus1omBmttCwY67BRoyMZ9MypkQ8aEAZfk91EQAiqeJteCkRKu9XKc2WRhrP48W+5TTjNOaTxNemQ0rYlHkqJgbq2LTZtFEhmJFU05oTju/ZkQj4d2Cs5pfgGqDF8gKuCcMtqporEcrI7TYgymQwG4Wy5m5GRMpQ2ZirEk+FczrCmXWSYXNXpC7uWFcXRRIgWkspIWIeiVBK6xNk2odLJbG1J1N0phba/XBdgRvKCPSssAUBRW6Vsr6uvkCc+CaydIhH61i7MsM2M8IznVYHs3dq1RYL2jmCEJgDdJgjNGYlHo0IysrowkNfo3twNhrumJjDogL/YoJxVAMqdCk/KJeV+wSxkNshbXnXM2qQp5ijF0PTANTmG6K0V0wdk7uOJsLPoujKbc4njP5cHIEZ0MywQUYm5M1+/mKW6rgocarGJeuwN0iMWLcjS+iHHjYRxLWgqJJGgq4MC6Iq2oFW3s4jCOrrpzyYjWt9uAK2OKKrviI27/PRxQfPvI8TTTrspsrX5G7DZbiiV6PCq5iFz+xJ9DSH6ldOe2XS+Eazai2VN8ByeIm3vgBIeuZ2VpepCDUqzFLbUNU6cweEWLKexxWWGZU4wdklQ+22eawYhZUy2AhLrm2k/8paP9rkEVLZ5r9Ewj/EH4GXmseDcGOEGW7IQp27fec0aA5Tv9nHPdagefKmB+s+GTG9zZzwTeva2TghGYmk5YriJcz4ck97I7Btpogz3eDPFuZpuamKJexYcNrNf3DzmGbtg79g5bvNQ9p56DjdQL/MECJwKz4NMzoCfJZx5YyHX9SvgUjsiI0J+uqqdzcaP8A/clRLkQArScVW0mFSUkk8MlaC1VC6B3fdZRGbtEqdfCgpFVw/kDA+YPvQIC+wFEEqmqE40flAlrV8+x/uB55Tz0fdD0TLocUaelpl7snxSklBF0xdv8NH/C8UVewR9zK3fRqPrEecUvYR9zKCKF+o3lw0Or4DWL7sII8KQtSlhhlaSmU9kSXxt1TNsyooKmhNvvOTaOUYMnd02EwKrpwVFYvqf9FElCiGcN0xDc0Z7z69sj8VpqVrCX5aiZ5nGUTHsGaVq/vZ3gwszrwybUO61gxkPNKVfbSLOMY+XlYe1Typ4Yabi6Kw5B8vDdLb/k+/czZPmBhvJfN5V6W7F3xqyy/2afPjXxPTp40gn36grP9MU8mkeQOcmZvONs/v02n+/Q9Z8OGT/3GIe2MtGbp2310ldO7+GIuLk/TW5Akto5tPo8mk7MovgzFjiOdxvq10kN8V/UqzAqJmo/DlM5nfLuEhN6mU6UqDGMKeeeSP8njRhBGdMKv+SScU93PdjOcUCDYkYSzqlVZx1xeZONwTFMxnUvsycWKcTqtiPkNvaKX9Ixha0tpS2PlNVvU6y+5tSD0nP3FrYTmICWfsqhez+r12qRer13X61YtXcJeYr1AjXOld6rXa/FyWYuWy9Pl0rpBjHhJz9gv3DqjNwSIb5pY1+SM/Q4xf3Dr2t2CBF3Qu6K/5oDs6qaJOrq3RJO6NLFOySU24TGnukZ4O7fe8J01rAgp2nqpCwFJ4Iz9CVHJ7jwIoEqMhMNwSb0uNEcgAeUR7LILZSneLrfe8ILrN9KtdCNl2QzVeLJK63UrHhiRJzC3SGhdYXlT5FH15ytCCH3FrSk9oyi2GqNiTd0YMIqdDi5VKFSCwo06PVkesTyvjliCTFvwJI/5j0+AwuE/r9xy8ciuM6BKyjIou+LdjTOWuAY6TNCatcZHCUKKJIqqrApSKjb1M4iNPdYxFWuWYE8Vl1VqT1KnQ2PdgKTU+pFuZihIhMkvxmSdf0ycGMCNJVfx66kwzebxVsk+A6fO9XhIE+J4YJi7m7i9lggPEJtHXdUAvf1J4rbj/LlB3nadTt9F4CqClRj0LVbsfUG6FJrNqUENF7sp4NggbxcFeZvumPdXwIQ9TuXzSXQeXtJsLgtidwbKA0DFc3pKb+nJJpVLEyuu161kcAKT5QTn0q2eS6eIthc4l/TnUxjcxboZ6CmXNGFTJJNTbdwJ5SbkBKbvCVC1xN0BQjpdH4N/2q8t4nYG460oU8lP/sWtMdIgaENUr9cu6vV5jbHrev1M/WVKn8GU4PFmHRNWBR2K2TUYQ9ZiTH0CNO+EjtdbbAwP0j3K1ynfxXJ5BmLwclkbb9LAqg33Ub/VKh5Yt6D2OWGbWyGlTmwvZtJdaBcLMB/A3QKqCCMmd+sO5yxH2RzZ5vAaR2xGF3TMPHrBaj6dwglnVfpVoWdUohIndwvGVxT1jeTu3CJr6r8pNPYc6l7XAGqis6Fiqqb+Wvu6lbap0MH5nuJvlVrtPSdagx1jzwFBu11yp+LOrOorKmW7pkKUbyhEX4P2LVEiLznLeXTZ3Sx6Na/X1+MKal4xwoVpM43YZyvT2qWSfM0Hc8XXhsr3gfm1SQXGoXpvvZqs6ohW1VbIpT58wn2hItlv0BfAG4DAJqgBqGiG2yV3OwAiC4BcWmq50cBIE2tsl8d86bgv1kT7p5x05/X63PBhsDB9GExhiYWeLYouGH2omcohI6VSC3ACmISqmap/UdG/q4qtviy9M+xFWr2tldQcFvvEulBcyFy3HNCYPufYzXGNCTP6aam7vEOwwFF09Rl4ddDcGiLFmT7rP63XF+6Yz9JckaUe84ihAJ1AO2aMm6oyldNQHs+6M3ZNYYhXK+uExvSMzmFlDk/uPfNuThmjup/dE8iLERfFnkD+k3sC5Wig+gABAyeiDUIgqum/ItAfTlZAim/rdetcM8F6RTlXzBmqX040f5ZY5+tLzMw6v58fw90dsHgHHwYmcj7nWn2EJX3cksdelSYmAtoicPGbWnfImMD6DoqRn9q6ECZa/FEqDwE51pu0byzye1e4yG2aQJhjyZW2sSz6ry29ZB3c04SiXodR/Gue5nx2nI3nEz4QofKaU+X+09xTSSsFuqzX80EeZstlDnp0t1zVBvtlEAXJ8IXiJSIk0UrPnljxFr8vl8tatlwmjGW697wb6eU2NpTRv0ODIpoaPfxlXYm8oT7me6mYSUCtLNm7KSZZ5Wfl4ZNCbEwK+eNJIbYmhfzJLTK5PjU4cafplL+/yLP5+QVMtsrmiG9u6d6z0Ge7+/3DJcDcDtQr5B6v1sRM80/cBbBUyTUkurg4rIpYvVKqKQoTbmuVytdWqayg4hWDsrl/9UnjASIa5uMuWiKV9OhutZnntx15NLCNTGXy13yTohZDrncLBsJYR4pRjsa4yvEVCQ2lmSaC5d6HexGB2dOAh7is4HbG4DMPS1WNoeAZRzLaN8Ydmb/SjQ7mxEI+g8OwKpkwk6F6ql7f//Pr8bPjr89OTt6e7DPYBsnGRpZcbqsQM9gDK738xNF8xhmnhSSZSbaP7aOpLJVK+1pxlMh7ZSuxJRsB+gKNv4Mmxe9vpjxMC9kk6aYu8pezP1J5YaWSDBL2jYdrsfupULUTkFfYW9gudCtJh3nFsbK1o1iJ8p0y35B7qLLAma5L4pLccfB9Ve4sxwbrIw2+xpBeS910Tu8qHVO8Qll0sl1LsTDgTm5ZkTCW27Vu2azadTSilSBjJuybn8kmk7Yhbd8pGZSvWNQ1O6Cj6WZHtrfw853r4HyNmM3WaVu0/jox1CjxvZhUEb+hOjudMTCE9qpVPLbWXdekhYJJFO5oRI93q/2GHE4apYw7opsV5kksHVjoNwYJH2z9Fp9gc+UiTcDiNSySmPqOFDZXaY5Hlar4FMtIy4UucxincmXVhJvOnqdCCRbLJe/5BI8RB+3AbzYJ3VIPIbpAL3J3CgMoCc0qnOhmfd4liQ0ztsSg2Krwk5O7DKaLzTJarV67OcrC3GHNl4+GLGicOSmcf+WE5kYjyj0EsCEiuGe3zTjh5N+vUNTAmgQQAfkKyQKlFVSqdBFdp+eRzHI0nizf3IsoHy+inD/JRDzPcy7im3rdiiT7YZJyCdBWIgpd5nRWBCZrJ12hHbpnCh3nOR8/mWR6zy4jBiuS6aJV+pqP/qvQChT2lTaWqbEsnfLRlCaVuHuXTZW5Kmi7RZKeK0sXUNG4SvlDqqVt2/iL3NWOuV546uAhbMcw320rme7TbjHZrTbsRc0wU81r7HSdq61WNdihuEIGdJ90j5W8zunfqBZ32LCLljIwgV03MMrUIKAxLmrxh5Ojda4Tl0AEkFr24iPM/jxKJ3wMhqx69DVDCrqdaFvXjh4nd6jgo10KLJV4l2YLGlks8KBtLsYPx3KXrk8ryjfNk2qcFDiladrHYt+oK5ZLS2jU/VhAWpBi/uKJWZjO4OkK9D0KpbVYAc7USpjkYGdTTW7D8ZgGNizXmyv0DuCFO6FEX+hxUYiLMAMSqOQUC0YLkL3i0MqNhp/LsBug0DuEdqmHxXEoNbR/p0W1HX0ttMP1+o6Pf07SM6BI92dj9+QitLYTiGZ1Oz6XFf4gK7s3Z2WmdHeRnl/8EUmeH0f5Zeiv9DH2LfnJXHFRwTFXi+NC4n7ChbSQiIf7kGGfXimHsUfjcCFXhC4ksxbS9sk/hHv86NPX00fPn309evP+2W/PTtbUdbkSy7JSLDNMNXNCM+DWCt3Yis5IVxmAXhXNLXR4itx2K9tY3WoJbg9nZdMloWXLM0kLDdnfaL0WcnJsjXaOkEgrphH6SOWLvVhaplRbcAhsH/z+ivNyI9mSLENDJq1uBpruyjy9sshAWJKEkgI3cSQkP+e5lZF6Peszf5C7V9F3K6PtJgkVW9G9jvI9SbOVFZFCCltsiJ1rr6l+zayE3k1zfs2FfAJQDmse1e+PQBgD/VhRYmLKpKWgaLKba5uw5ibFFBabCmUw7z7N+Ww+keE/z7wyFoICL9NBavDDIbq2NVcIQ3CQxTSHPYt6vZa4kyy+5GODQuzsW5FtWijAyhX+Qlb2m1rnphdyXAFKmw3VFOWm1RIMBrRyrQAmRZVvhRorPGkYkYPC2DkUpPDOcGFxOtSFjoo2AmgUWYVQtwoBZhhi7NQUEO802qNlOuyD5RQWgzCleIgmMQchpig5wu7W5tILhzsqhNcy5/4HcSmyhdhDXe8+WRdkBzxUyU5xSqDABUL3jP2tNuEmhwzjlR78CHjtmZZx1UmgyIW/YoKHkatDqtRIyc+EzlXGHVwFoRPFlZkHFi6sO+xXOKP4j8egwkLhXuLr3apKuCKraDx+BjPrdTqTXPDc2teN2afWHQjhIV+BSkkNDk4VaZAmQTdJJkfWMk2sfVy6gbLU68h9UslYJisd61x5DRakOwfGfcIl2nFzqyDDy6Vyr62LRjch+1F8CWUaSuyymNl6MaZOaKr2tgi9KOY76qD2V4iNd4Yb8xu55sf8Spquyy/llu/xM6l8ol9L7RT9XFKV+FSu2PkkO4sm70EMuZV4pMs/oH4HvLfQA3pI29T3aIv6Pm3C0a8G9Rs0oH6T+hROdJ4oWn4jLY/QJ+rlCl/eSZBN1010leeSd1IJbZx6jPFBJ2ySbhGHHmlg+j3bkd1vYv5n6/mbYaCyfCirH3rUp9DYJm1TfWRNHVWjzQ5tN+lhG/wFU/8wAPfItNFp0pYf0IN2h/pe0KR+q9Gmgdfs0IZ3ENCmd9imbb/ZpB3I4gdBp0P9NmQLmq2D9ojQ77sqb9E2PYAGeNiGJjbDg5YEHWyMB+1ptaFJHQ9bBemgZW1PtS5oUm9EKrn+SFbaauSFPVAn69Meys56XR0sNdm4kT/lvDZhYiO7YbAAZvwZKYorSO8afbahXaC44tJKqKm4fSQLxa1XYwLk+3+hncRN0skEHHtTaZt7AV8rr+R378ITST+EHj0KPfoo9OhXiDgOPfoy9OjT0KOfw/19KkOPpqFHn4cefVFsD1QlHsvS8m9PML/Xk8Ve2JuQ03kJDULfh4JehpJ+Cz36OPToNPTo29As62Ul5JrorQy2eWWwzYLCfzIeRsjgz/Y354NytKxnQyWgaDyUZAWz4qlkqE3aUEVK7Rf/I6hgIPCKSRX4g3mrFf18T7bS6hWS/llk/qXI/BcTKvCJ5SrwG8tMx0zPTf3sRAx5z2kvl7wfDA7DwOGj5XJ/v4LXC1nprrn7mT2vFN2WIBi1fztJz9SCubdv66VREnt/z9q3hb1P9ssD1VW5b9bGFE4Te7TQ7VTwlQjfnIFL7qVfFxRsM5nfLQXBsrz3ujzuvh5yl3Nw5mRU901/xmTosI1QlaU4Em1g8ONynigMQD/+NGPtVqvRqktQ0rmS29wVvDqf8HqYKn/noNB6PUxtX3vkgsJ1VAC+xyGbzRpwFN/x61gmqFD58AzMYW0BaObmcNKDuykfvpJWRsoIwUF7nhi687drgMSu0Xx3A/MR87Al4Eu8DIKPsbJR2BDxg+o+mtjD3fcON9i0V2sfwUH74FoM+Si8Br+qbVudBTcsZ/8wZuMnaR9QNb1pziz4J45PM3YttWs1S9q/Sccn//WbBKHF7/U69qeSFriui4TCbxEKdCHmYTOgEQ/hKJ0mKnTGw0Zw0D6gE2BSFri/BqzJBQ8zOlX070pakKZD6E0ZIeDUXZjS1wWx0SkuofgzVWiHcni7hsc5PE7hAUw+PYHHEx46AX0HwWfw+ACP7/A4gscjeHyFxzE8XsLjKTw+w+M5PF7A4w083quWXUor+DUXYMH8rSTeRczjsvURvgvImMDjLQcyLCH4ER6v4PEHDzv0r6Irf0LUL/D4HR6ZKutUWrEoKD9xr6Ip7iZadzkk+gSP3+DxmocebFOnZbbg1wwa8fNZuayyJn8vq5DhL3CGMtP/qfo3VoG//rVVgKbsT7AGT91PnOU0dV9zllG9DFTadYP+/GksirtabWw0VylxHXkqreEILQA+SwsPuZzA2T2Pgr1ntSdbdAi3sUJJJ8VZYGYK9arH1xJFcdd1eeF241Ra0oBx5URDKdhl36vXwVOGbRdaPJWpNAUtcuoDoBvl0XSNtMMBM6Zoe8pSW+ANBb2eTzNwqZf+yCFhsWAM5airuRg4NcGyoRjZdgF6BYW8gAJXbvHzgkEMfl0/d1LUB61Mq/rSoj7OxDAdLdHVjVShbj7M0GHg4A2wWZyEHi2iNtiAXLEBnyTr0N8ka9DXcHFGh3LBXgNFs30qIUgF0O82zQWDRcAODmkmWMOjiWD+IY0FUzObRoL5LTpXqWeCOT6dCDbcFxx2bVMc7Qhs8EF1w6OrPS7G+3R/n+4n6YRr0bb6qF9BkitfUjGbJ0kap1zI0qR/XzGFZaL9EV0I9lJa7yShYww9A02VKODsH5LuBTpOZwG9QF/orIGBzogdoMgwFex3aV41peGtp36nswMnESuY32x01WUIcsQ6xlfQLMkeLIXV90PjO9wbAt8PDqvvB+b3DpYfdA7M8qsTtoTQG2y1bmTD021sEUKvBPtLWlNB6CWGbgShZ5vne81dwOpoDDePxtypPUU4DDOApXCYj0IfvUrmIztz/G7aB9wXsJknekGrgy9Bq0OMCQpMMdw1UtQDuJ7BBRiZcQvUFtHTlacMjiyqygVUniARBJ1F1mdJvZ71WGKnjk/u8mE2YkIbX6yKmnZX4PhVFflmFSlWYefYP9ggzIzNSqylKobmK+u7pAtB6LXYQeU0AFp+YF4I4mzeuALYUN65kveYGACIQ+xqlRJTqatDShqU9/sHXakYG9EPWq1B0GqFgoxwkIy7t4LWQZf3Wn6AFM9j4K5pBOfDi1tV/JFxFNT6t+LK/zZyVFs4HyQdw65QZXwoDPs0xa8xxuRyWYZFYVnlayRXHDmHhVk5O1LsdFrusPe9bklS+gFvDALeCEVXOIzD3Uc5y205TG0bXIFmLLPzpadvHnIcMLn8B1QR+DTTgeKgboYelXI4zOUhdT8V/44L3qqr3b6gs2t9wdupeMgNb2o8T0V5wRsEjRveVKn6irfrKB/eCnoi6BNB3wn6TNAPgn4X9EiM2KmoRu0RKE+9yq5QFmPkdatxQ+yTa6fRc+Yt/5vj8psmliWQK0kFnBUt0pE+3NVWLQhwOl/rJeT917xl4OQ3s4uskuVfeOWkN9OXvJlR+pK3nB2Jwpn3d2F66/4g1nyNPxPanbi+0k0UN709EeZVbydi7a63W7Hjsresp+Zbrm6jgkToPSv/IocZ3Pam8a06/PdFI12lb0Ga57dBUns7sFDS5e4UDqZMUch7yzwwEXyLF+hZ783v/T7rQAqHmUcSj7FEyNEZlMVhCV69bub/yJlvW5Dfrx+sVWgoXMpZDQX4bUcMLEiopi4E4XYu7r4ldL3pEkDncPdtKSO/tZlw/DYJ7ytAJTF68hR7sslOZmscJYq8EkReg8oWSdONpOn9SblcT8plmRSrmKNYzXwKqAenVzkCS0AYzMSM6+rEhjUtoOt7dCSt/9U7d3/hjjOiL1R6f81Xx3PDO1XBu6gG9bSEv1wWnWE6pl4HXrrH8qEwhPQXYl0dgnWjNCR6Pb+cdNAaWLF7KvBcnRR7z4eZXTQ8g/9vsGOY2TatYZJ8/RPpEl0+K+IFy2jW64HUoL8Yep835jKpDIiZdD8Co+6+cv+kMf5/ohHTKz+0DgH/O2ex0J41YlzZvBpLFSAARd/zoW1D6hGLUEPyDev2SIiJXhc40IU0vaBLMraeqRcMbDsC1eYwK4f+G3QJ6z/njkMT0MK6p9xhCSR6zdV6LN0/WERFpfqAIv8rIF0B2i/hOAQHJQVr2IzFsJQJ9rmIovk6vjgO9FapeYzXvGyY7rWdDnP4L5tp6U73GQby0UBHhPqd2D7FzL9BITn+ZyWSwiDrdvrFhX7QkT4LSHetKUVzd7A+akxpQmM8OPSRghedP+hMj+8E/3+hC/z/i47x/zd6oUdHiXQsEijNcfcxBz2d+hYN9TT6nY/UgOLC8Du3fcAJgUhR4XvKomGkOgmpoev9cb1upWxML2ybUPz4mrOU1qy8P0cLOlWhbYNtIM37cGrXSthkmDuLEXiHiUqQn3Obxb9aqZ0QOtNogTEzVaydEOUCw6uxC3I3zu5U/8aO34VtGFVTl6SO09UvjkNVyPZHNgvUyxiiLxwW6BG56GvZKmVjEKnTbuo4yEHkZaFejeUlgjuOGNGalakeRgpvayzFNkMvrNTRseTXSKEY1REsJTR3HLynDqwaNp2EaScWNGXDkTKnxHb4wHxHivuG2+nEMNcaA8A6lmAyzcBKXFAL5kpVCx2Aqynx9RNnb6SVojYDvDOtVlZKAaegt8bi8X5HqxwfVQAeFIr3HkTsgM5ZExvgMeB8rYj5jQ6dswbcm4ja3NdcrVZUMe9ajMhYgoXlKgmtWbYd9+D8NmMJgDbuzQe4jiAIbRaHXo1lAytDYBtfQFXLJcjZ+EbCuMd8T+X1D1RkqN46OgO0PWUZbOAlA6PJYaYj2urV0h00lU3fNgEDYElLsKibHw9oxJqAmHgkGsuPWKMSN+COjTmAYg5aIDAFS7GMuQGNpBfX6zljKUHeMulFZJzdIUeBvclhMMvga14QGa/GHCfR9gSAuwMrrzGQJ3+QlyaOQ2iVAKD5yQhDEvyaOA0aEBImCGSjSAD1JyO8lqMBhrpG2o6RtrOW1vfpAchFDESSHEYoHRgQDHMd0Vavloa1qd98XJ3HzJhHFMg8O6cNQpG7U7yW0P//DbbFaJoJm5vua2gW5EejY9xNYQZn8XZ7XgB5Voy8V2PA0xAUrtCdhfuWD+MRGOZa1bvtj8ClLB4RwfdgRGPYgPAYyweKZ1RzVf2/5iS0UnYmgCHQn1O9V/LJfMGBZAvQ14E3IJiPmcO+g9ZO5QPPY0iDaMpegXJORUMGKAn/VSFjs5DcYR+qQuCYKymwLe5hj7u6WcDnfSoCgJMgHn4UbHiXyHCe0xh2O+fwmMFjIkNvReHbDL814VsTvnXgW3PrWwu++W342Nn62IaPjQA+NgL1dbJRrMrqt82vHfjq35vZ+Axb4xP820rQCIwEQWutgkaARQQdSALKTyjDC5rbaeBjlQb2/Vcj42icaZsW/AreSfvNwWHomefcNthny0L54IJ/EaQOzt42BKi/RLF1eMzZH2qGHsNjPpS2hTtOo8Jyn7tTPpR1sGoFruUGuIdjPqp22YoYMJoy1P9aosKvC1D4MI/Cdrx7A75cLRVJfoV39/Hn989Ov757dvL12etnx8/evDePoVUKLpjdsCArhpFBEV0J+g7pOMjH3AB7T/U/E32WD4STa2+nkuXrqac69XQjtbHHYEgUSmHE3aOi51k/R3VdTmAKZwMPhLQjh2X0CIx3gfV8R7n7Abw6+cCtvHAjPuBuykDt46ZUq6R2Svg2+NWjGQmDIifyGil79PN5gZB9UMcNHsFfZkD10w6ojrM79MzI3b+4w90P8HiGBi+iXkd+6xnXgQ98IFgeOj5+E8h1PeN9ltu4W1qvW0hW5+i0fA6uGB2kq39yB/eDn+n/d/r/BA7NPFN9POFYE6E48nB6Q0GYu2/co+ostGQwOu4brAAy2NAsRb4/wGEd9Y9ls99kyR5B3RCpRaNjqG2uEGHHZAA9JaTGlu34DnNlROg9k4SuzQ6JXMsJCEE1q2xc7zdwl0m6q1Jc+MB7HCBe011Wp/++9WBcyjFjZZe78E0McEL8xR1BZV8K9MUpBVFTbk7RHxl3vzFhS1BsfOsJW6eCgMPdbxS8b+LIf8P44qUsA9NgKTZbM7L8rTgUCpt1jJWG8uocGJT0Qk8aOI8q3Tc1xpfLZlBj0o15vd46KELtwyJ00ChCh34R8r0y0vfLYLvdVkHjPKEwbB8keJ+ihhmEcVYwt9Yg+qK7ZhCMeqYVga1wyQQyCH3uvtTQeUmo5rER178CWlDhvqbCveYKUMc2WpJea3R8qv5eOhjLOfzD7HI5x4Nn15wJ95KbjKfM14xG3Bdd4c45nDGec3chdxIF4b6urKQuua0rk6T4N8oX+ZrgiTWkiYUjulzKfmu5lL3yDD2axjgBYmSNu1+XS0TSo3q9xt13y2W73WYsx1Fp1pjclQ0n8sv1Ly3l9IHl7hNO4QFwqbHc5fqsMbogWM+JyWaCeqvCoxJ+P6rXX4FJdo+9EpYgu9qhajOaqvqwK1EzKNNAAIkwvDPfbxBafK0wqGNbuXvpdHq9JvB6ikzl7lOQ/5fL3H3Je8HACzHQHvghNuElHwRhg4olk71eW3UcSaFYskaABLDhO+IfDZ++hqOBghhpMIa7KWgOifqudwjcFBeAlPm0aDLVgNSg3YJkmlitA90npDmIWR5Onpw2fB3wG4c6BNdvunNO8MWCoHshwb04sdXbQg4CfFOUAeNu5MALm+txlxDXWY87gzi/TXRdMHcx/lrqGP1WmjNtxio19Fa0Ukfr6MNyBDaHqRl6mzWfwxSaTya1oiNKuWykOF1r22nVNgWorRmbu68pjgV8fwXqGByr9mHpJwxLK1ryz/5/sjfkZzECJ8phgeUgsiriY8Kg3HMA+iiYpdCvgIYD3VJKQ0hgi37unvFuwU7BiwMfoKYjaRXwoLpwhApwMxCJqammiPgFmZsf90CCisth2ere0oUq3QYrQqNs5q0QSgcNmBcHjS0oaMQtA6Xn6oIaYL8UU4XNx/arE8fqYPY/a7tg3koWE2SIHbZHahSlIfhL8NNj6Y5UDT/0oeGH/u6Gn8ky8G9t+NlPNVy12PcQ1r53D7AXkhRtsgNEJJhNa03Zbks5QYEiqjYgvSyIRknlVlj0T1NKtWrgCpi7HzgGpOZGqlVBME/PyXmOvQ9x0XjKB7v2vGt6b6FbWFkDf1evW8itU/1Oio/GvqPaakaa/V0pdd+qnaX5EPjEkWKKNZsOHrWLWZsA/LXXFjWty1LlShV4AgU28XSBmcerfBWofAMZNlQOwX+q+GJne6UA07gfMEojbsIGuWT2WiGEAk8RhYu1AZsKkmQTTBAJwgGoFp9x2OuzMiUh+MgLzUH3kjNm2xlq5Yx/GAXFg7+WMFc0Vu9O/PP/WS8FgeM7Z6+lY6VOBv36DtLRByWDfOeqK0UvoPmwd/OMU/34DmQYDXp9fHN+k3r4GX7ERhdBAAMJrX+CL+T/JMJ8FEOYWSM3UYQFd9UDxsRy2QDLiYJZa7fbOHnEchkYFhWKn8REOK2JWu+USAt/cs1lOuq6AlAnYuhKFGovHQINmhIYrJyELSUZPEaGDf10wyLdwHM/1p/CUiJtrkYVeDlc+t+pPwAgePdb43u3iVDhJRdACUxlBO6uBn5oBYpZHVj/jPYZMWvMkopaY5RUKY/KBI+2Snm0XcqjqhQSGrxqabeyi2XFTkP7cT5CgDnwLMkxsIWGCJPnWvpEoUWDyQkq2ZMKFA+N28UY2AK7U86ewP+N/n+tot9y9f9emWBc4ski6X7T0Y916nJLHUxBql1zfCs3xvFtzpm2xZbuJVqOgKQHfxL+fB+wdeA0TM1Tlm+QP+gIp4rkgOmRewS7Mdx9zuGOZaBeqHkZIPXCIOhcUctFZ+CplNMJUDS6QPpBx+y17C0Gr8FJ7wWbgJ53Cn+wc32DgcTxR/RKBUfdBHZEP+N2dx92M2ncX+A2x4KUiiNJJ0NhJ6Mau1ouMejABU83+DKqsQsVC3FTEmdCpmLOtSuRoNhVH9frUGU2YgwSZ6MuyWxbHZ3PaN5PNP3/E6TEhOWwxRhrtdCOhhdqFUuy+VDCfe/9CEU+x8lKgpT02GKQhIsK/qmGv7Xl7RF3F9AgTG8BcPcl73sDK1AqKsXhv3HltoEeFazpHTbaQbPZPNA6STS8bPhgQQFHPZgPkpdfL/Q/haHG+nKmvxwqm4bi1fc23htmTl9X2AjAu7pAkw2jLLmetqgOrIgJfaO0XkKWwUzCVu5WD7GO9zqJyuL+QaiOSVVOiNHFpBJUK4lw/K7ss4bWLnI5vAVTEtzHlI5j3IkBm62NX9HS2m7ZLbsJvlzgujk0b7Ib9kG/38D5cVq+WUmPpctlE4p+isrJlCWEhClLmLBbVNjNHuzZyYG5iUTCBHedFN1XG0lvFeWnl6Lc2mqqL9v3oyFaIzzULokTtA5oq9h7cfwynDtN2lRW2Vkvx63catPsFvaCcHewQbrfSsCChp5+K6EqHB+ddSh4274Gs+3TGI5BvDUGJIXxRCMhmtfrx1rDxUstqgNKWSpRN0vwqUgOkGX3jUF2k3zNz5aaMCj7F8ralwOU/kNY/3BLKNbmi9XmRrReCO/BiTzjEME837Z1gTwgNoJ91Hui915RU1oSolgRzLd2MwAEwMb0suUSubs37ksnQ/au6K3o5zYWgEZ7OkyoQHtcwTJCRQ/2dJUmHNbb5dJDO01RK5MTTYMS1sRVXrDiEwCFImppTiAhtDi05TSVkYp+a6BlYqeKCEbsv43vPrxiAjUcMIZWjrauOROEoibyDeoi37jHelDfcXAThDE2atsBAjrw1NZ6ePgXDqjaobBStV6VJcoiRFGEKIoQpVAH+/joJsdRQ0JjJNcxrB7vYT/olrNqaX7jfnBg58HYLHjjvkPse08QHSEbLfcElK5PK6af8R6Lkdg+Q9b2PV3bc1AZnyES3/JeADz+Ldcq+O3dBlLk1lz0G9y8gQbGyrM2MM0xZrYBBSH4HjcSgF/Xs6S6TAq09bqGb3o7IwE2/SNnHdogoRIWm/gs9jaUFAIv7+COPkRW3VNsylEfnWy84whMLPud7vnfhUFml4DdBYqsX0yHTO9BgH8Pa2PDhWYFXLIKLlkFF9wq2IaDOTOzcjZnNM6Jmt2ZGn5zhlp5H0i4lSMZlwRXxzXQ5T0GfjcsASUA+abFRKzSwJSsJqPaFkkMSoeorSYW0XZqMF4wdMHafutsQ2u+LrfrHZxN0ZSLn5FMxZpYagn2l2orjos6/oNgET1WbLWhFKd9/WlxETa8sCWIOn9qsTBXYqEGq47dFg+/czBtfIP+9z7ozTNM6QCBLTQIRsNMGxRICDMCEhXTdUPepOWuG8qauzbeMI9f3AyT/1g6Rd7w78mnSD1g7w755RBC/16JtUSdyf8S6oDAUAzCIwjp4WfY9wKxjnivGPn7cUyjSEtJycBTLZf4vdSkIHb1wZKhzItGBaoZhcZF4dkRN7dmcUfT+U12Neo+4phlDXV9p4xfQ94jUNvgHwsAU8EsFRaJLWCs4+sR1zusXxVuFjDRiP6TmFXo66EYpaVcR1rcJs7rdeSTPFKUrhG54JjKAS6mzldlQ2ukXelKcMnfrkJ1g9D/HTQHLm+Rs04roOOcfZB4cpWzPgc29CJn36XpsdHxSZWgQeg0Z89Ulmc5oTfl24ecdKfa62K7SQP4pt78ZkC1J46rnL2T+mo/D3Yby4Iud36BQq+KYtrUpwcN8KHhgTcQelmWD05HDgJ4dAo3IWflqcqh67oXoBsB3yVwAdb15qeG/nCew1nBq5zQUwxd5oTeriUe5zrpyWY0HE8+pM1Dv9WAO7Yw/zQn9B2GbnLjQNGzdX5a/iMY8JDbftu4VOqeJEHHuN5pe1cYl+0PKGcdo3z1DrnurzQCPT9cZABnK/oenbHcfYuhCcvdW0kXLHelpGM84J67J3jG/UK/5fg2Zbn7HvPcsNz9hqErlruPMXQJG8OSnrHUsaSDG+/XLIVTGC9BqILrgDIbbW9acB2QR28Z3NPg0ScgnYfabLg76/ktRWVrVtZLyiM3SD/3eHdug0W6bY96vRmd2ayD51UEmwzn9fFIE+gTVh1woXNwzXBCZw47oeoDeE5h7ITcxXjESp/YEJV+3m/XT7Cg0+IbPanD2dYTUrTyZFcj73L3nWR+O/C0sn+Pr7YbfGqzeR0AewJQNZq3+iEEfq5wBY3FcF6/+HlolP29/Xf09/be/iqidUonLHXOgGbd9ifFLsutM0Eq1r+p1y+1Q49Uu80cp8o7zJ7Msr0EJju4VqJlaw7L1qgVWHmLfMKmDlwJJHqSVIdvCocets2Jxodo+MS2R91C97XHN06ziR2J8bqhJyx1bstF5qonyN0TNrWvHOWAhzPhXKFVhsUf3gZ9rqdr23Ijsbr1iMOMojXr6l/t5tXubl4Z3VRgvfqPgBURUfaDbpEkxiT0R2/SYY0ucBYb0X1/M44of2/Yfqzv31pVSWnaTZh5u5EbL2jfhdQwv/UOviC2VU0uMtosOU2sRgABXYx/6JfFrNU6AV990eS/1NT+Ud2Te+vWHFvWO6/X0961sk19x2b9fqObOewdTPp3vV6Dzuu4sMwIMnAfUDI9ZimwhSzrnQ/OncxuhS3HypxzYJJesrR3Pbh2UjtoHYRB6wA23a5h/2HK5spFj/sW6tGHXo/yalPAOBG6ZqV1lNOcyYHfbLZDv9lsbrpr8ZS3lndgYOx3PPpMhjVfuW35gMHvYCV9BI9H8PiK5tPoRgpCY3jcwONWhoJKeJzAaw6Pl/B4Co/P8HgOjxeQ5I2sXL2gLUjxCh4H6DdZeFfJCX0MmZ6AS0n6FoIf4fFKhtKw+fuab95/0esFTTiX6LeXhh3wca4Oy+KmtFc5FyyyG8cmIaVvpmg3KUDLONyYV7bQlrKtJ1gtuNlRu1FYP7zqraher7Pk5S5UOY6fc3b3CoH9hwzPcvqXDM9z+qcMb3P6iwyf5PR3GQYe/QR22Qf0N4DAaxm2DgPKBWSTAjxu0ue6HA/KucZyTrGcEyznHZbjH6py2lCO46uCmliQhwX5hrOqF7l5NQjsMSi8iuiczugELoeiF3RK9V2J9Jrq+8ToE/qOPisdUbQJ/WC+fGfx4Hkefs7VQTBwht1jfqsbgXe7YVScEFOHVNQZlWdDOZyPwAMKfFmwzBWCTiDTpM98FEmfDSej7gRU9HA9eX9Sr1sLNkEV8KSQD767UgysU/Yyt3yYWQJOXbNTFfIhBAUzn3ok1EcWZ8zvznoTXcVs1J3ZtjpIs+jNsI4ZoVPm04j5Rj/SxJrCsUk6dRj0iU5L20XwCZBYU9xTBGlrufRrbEKqr1D4hyGaqatCdZkfhhH4jvowjEY2lLkFJdBEDefg3SAdfiggNmJz0p0t0sIXagTHcsIT9oSl9B377v4uFd3r4hc/PGHf3T8kfcK+u39JTPGpSDHmSQTeVyHJnyrJLyrJbxLI8RWDjT5o9YzesgTGaMxgU8+j13BM6QbcRi3oObtxfDREr9et7y4Xg5s+W+ThTX+RE9wZNz98d1/L8KYPf2R9BwlYv1P2JrdSOqcRvaBco95395Uk9BJqi5wLegaBMZ2xM5DFzxx2qTkV66rfvyD2WRfH/9bmI3ZaSeRnaph1MX73qn7ZJZfoAk3tVl0OrKs6u3R8emWzSxJi920bMM5xYIBwaYoA//QlYuDABkYF/YzjruVV/ZzUwA23PsMG9z5csAWht7Zq9ZhBF6b40h3bF4CKFiLV2L6Ao4BTuFmKdMnYtimiHLTuRuf+14B8za7q52pywGDa1yP2NbfGdEFvHYggK21+dIVHFnFeRc4FgRN/V13dpxr2SfcTewcIsjARRGUkekbe2mpcYDruAv5uyBeSPzaU3aiJvKDGRvabLXJGI0XQ5ngr4AC2HntxCH+234vJnB3nFtjs5ZRXl0OXSfsqKez5qksFffBFWZzOGMoRiIRdLCTBo9SOOvSrmTCVThWFBTnxvYn35qa33LW167CtViZLOHmpPZnjyvLe4BDot5zd5UjmE1EssC24XSIW4fucRvBc0cc/k6paId5WVuuFWb3FtVH6C1qzTCN76b4CzlG672QPeTSIeif7yHqR5bK2kaDjVQl8nxDTVvxjVS/j7is5eJyH33Iq2J0QobdS14Pn5iE5fZYVToCCiyLC3Tdw+NMuvBdpZzRG/GEZ3/HM+IMqvrNejnQTYTjdglcq3ViwlGbsUF1qgy1MVzTGQLaiUdFmKPVFbgGz+EZScLEKGMrd95JGlCNFS9WUyVgMf9x9LFkEIdWvRmA2p9XNWKurDntiollR9URX3RUwReb0RW4FqlI4REYnqk6h65RuJFiqdVZzvJ0JrANX3L2VYMwC6U4kO6TclRARQUQuWUu1D+pAZHyVK4+a5Z0u53Ljblx1zcn+G3CkdZXl4B91Opf7xPSf+Ud+z+n03SxJ4WuniUwBYutyqY4LwDGBDYN7J+jG5QoG6iPwinkiYT+cphBI9CH1FxQRGM5LvEOVbiF3BISeWHDDT0wXLKKXIMVW92vpRRhS63UY0TxU8rsAw6K7qqhKU/MBuaagLtDsv9Fq+y3G5uQOM11i/ZcMPC8K95HUdvIYPLXgj84JfWdBlCq641dFqyMc+OfOwZkZoTWw+YC2LJeW9d3qAN8KQhCcXSH/aPilJBdnec5juXeBV4zt4XW2+0UtpTgFtXRq7LvVJDrnXHv5jrduvdud+8hqEnqFJdgdutbpK0Kv+n5rubzqC3dTgbJIxThb6KvStwoW7pGExeWKCve7RHU73JD8SMKZOE9Dq+UH9fkAYHYY4pADINfYJQBnWI4RFjWnnZo6bguvD+1166DRbKoS1gvQ4E4m0flsb8blzr5Vo3ohQXrs1H0CPp6xwHq9qXHJWkeTDTwJqj4G4QcLT4AYJV9LNr+/0Nt7Cm1UhTbCAmpVoTPlRnWOke65avzfb3qzqqWJZ10x96AcpmMYJrPe0x92Zr0aEpo5byQ7kUbVrarqVog25Lr2et0aM6iajvsxvsSEjnUx+hwVHOTAwARsH66YbpsD2Uiv/HIki7rpFVLB8f1tfyRU4/NqvyOjmT0mdEwIjR02hj34MQLFYWMFnZIJvLZIF8HlVT1sVz1sQw/BU7jGVEXKYjP3mHnAdl8x8NA4BnWReW4ML6k8lr3yTXXsUg4hGhayq2KT7KpeH/dipOT/al+vjAYqBssc0Usc0a1uH1TdPoBuw6biA7s9Xuv2uOz22f9mt8+Kbuv+dqr+dkKjduyumkhFM+a14rQNtKMgecXCkMd7V+nsCtxW7yBW7yyyRrAWwDR8l/3+Yd2nxcLkk4o+P6ros6Hrqxp7qGlVmeFpbm0sgYdemfwQ19+acD+Uu4hPLEKD7q71QNVXZkXK30Lzq7axJw7DX6YJQlxmn0ly96hqQeC1dfc1U/DBasDHZ5LVat9BOXEEj+9WQEqRvWxBY11gTxPrYw4nQ8sEh9RszpEVEHq9vm4FVWltM74Rri2hZ3DpyR5cyGAO3ApK3ID6YQPaAT1UwNfoMCc1BqxD329/UWbWG4v0TGY5LypSetnZ7gURp6MudX0wm/Re6DerflZ0+RDpckGLEZ1NigxWudaYRag6GpvFHkkL2E1NcKt5FUEoMYhouQ7fg6OHbc0zNKEbTyX7brUI6H3pkYV83Gcd5RcRL6VigJoU2SHI1A867eWyJlBsgiz9hqegC1GDfdg3uorEjQbrfrgZs5fllSJ+dnN1lk1mO7mJ5yYdPKzo4OFBqDw9us+BlL2UXaLx+A3ai0K8bY9G7DvEHlnaA41K7x92yVZCryvcF0AAvsFR4VsISXi8gNcTyQ5QolESDMSu6JkOn8gV/WrIf5fsBQrvINf4h3RCz6gAueYrFSjXYD0TEIyw4DMIbXKQsEFQIOW9rNY6cCqiedhZA85TacMYaa1Id8qge8PvFtROQI9jTatTCz02I13yTN26rqfSlPT8NjkykylAa+DpuTHtFntW4JWwzKuJdmCb+WFMzOKQt34uN6BwlsoCYXI+5dEuMACnopsCJu9j1rCBdlGgFGql8Q+M1gAj1vhhU0CXpkrRmENC64N18BN5fN/+bh3AtwPlsgvhM+6XQ/CA7uGQjR1HY2wB8auV2kgPvEMlC1Y+IRCUb9BB7WgXVjkOrImzVJyDg2gnSxwkgTsxrJoQIGjjDDg2ZsBLYwY8LWYAor+v0B96To/pSzUBnpoT4LicAC9doTZwP7OnEETA3aq5V1qsfCZbc2R9T+3+aZJL1sbynyNgKk4FW1cNDn1hdO2NDudyRd9j+HM1uQP6HCklfUHfqK69N7v2QnUtl+yNCsm1zuzoSkEL7+sEgmTnEru25hyGorIY0LGBV7AZQKzjPmvX61EfXUbfAbuBZi4LpT3Y1C28lSCXG5iIUd7fISFTdfqpXitCQdPT+9g3bFqUpKfnDbGt75Z1U5Vl40vQJKTfN+NVpWsJd7bgyExDofk2q2KUjD/dSlHFUGPtn9KiE6TUlgReqxoi3cNGAJ8Rdlu8opGs3fwhPus94h34fCOZLsLC5bbhh0oFo1P61dD7oVAn9D9YEFASls2+67ejMhZ6XYQ/SsWflAUGVYFBWK4hUiFA/k8Q4AcDL/8vD/x9o7RhP7BjfMYVwpiD5beqxI0Koo3tIRr/0yHSxTSrYppalxeZhAF5zYUTYZl9zW8yeHHGFNalb8C+PZE/Z/+z1VUo4fHAGjtMuI/pBRPue2dMQgg81hUcV7oHk7/d8H09RtOUdJioq3SEOx9ejKhtJ9S2L9SexQVLHGg4LRUZ/7ys1CzFYK6Radb8suI8jg1dauB5GyJG4LV2QneYwFKMzYnAndaGtVaVva0ksYhrXgjElIXDIuUOZ0GF+1XCfyHULoodhrRarBJnQcG3YSkbKsFb0gUegwalryGaf5eDeYjSJ+z2kxrm2dKf4t0P92lPlXSsIw+qzhwUnambMjl0yZTJK8/Vdegd2aq7oHI/U3unqr0T6hG4ZD41Fr/AO6y+OI21T76nPznNciO50Luv1i5tXrsZ7VVujnZxT3O5IXBtKbM3lAffL5eLmjpKLdQuUuAd1uuWotBlVCcsg22yXKJfnmKsF2DVCVN2p3PUwilRDXxB4O5B7s61pSCcCXHnxY4DmpReoq8VYuyoKgTO8cxM7r5nKhnN3cd43Pob2EuD+zf3PUEvIXB8RpZO2Z3cfU9zPJFSZsjd991yPxEck7x3cvdxl+NJLK5PYkFBufvYLEpQTqgFvvjJwNpVl1BePB4zUdRDQit3H8O98hBd9uIxNDp3v/WKiG82A9N24+Am2IJXk4i7xw4crDomtFI0Fmjme9RpFnknaEwPs5S7L5XzuMm901X7szHn5Va1C1XtAu3/YYV9a6NyZtBuonMgg/ca+EGnjNP8/XKJSgWdIGi14YwhjKiyD1ng81KdDFJhOHVwycAc+LJC2nNEqso3OFKKR0LHhudFqMpxumYpfQZWK+q2sTOwEymd+1As5IwGG14Wb38y+9kwUK96+T0bNtS7Mloqim9uFH9iKRcUX9Ec+xiPgb9EY+132lg7xnGcM+FO6QzAXmV+YgFV+oqWcccsQUs4oMnv8Digsps7YjEVYAcHKzCbVZnfWeRurvbqqshnVqWRrW6kf5V3Y8ehc+0KFW7GIGC+C46y0V7X08bFpXl64b6+O+tx5GcMs3TDE6YyD+TEMc7WHMF3LJWDQaBBsB5Z+sNBfQafDuoz824sw6xM7a4PnCBUhmJ/qjOrbfpLzvZlHqUTkB5x9YgSyfM9ecFBmIRboyCorhjap7/nu+4yZH6bSvZnru8yvBDg9BmDU2Fci6FctOvrIThtEvTLrbOokwmFA0hCVjdgngBlVna8RdLyBhjZh11RxylsFHUCuFMKlzSVsF/67tsrSphNUXDTvvaNa55u8PLYnE94NMN7vdfr7Ole1etrzeZrG8uf8vXLa37PrUZA/8zxjq75ZFKlzK3K8uBSWOo+izPw9KbNgtSBeWGg3rm09uEq+b1EXX68t28LUl2jaRozZtj+/OZOulWHipuBzU6fSesOb/C1yN2KyuLWW1BQkjuxXMLxYYso89QYRG4F3Wt1oistb5s2G/lLaUGCVutR4WQ/6hXpu8VCqDGiiHciqi/lm5vsUkQjO1e8Yey+Y3Maux/gkLR7xIplsxu7R+VFMTmT7g3ANIXTaACG2P3Kchq7x5jtJcuLbIUT1HNhxWDHGpWfnFit4FHfKy4wqflgG3Iqwtw89BMRqmEcwpV2d3y5tDgDQ8gS9jl4KO+mEJmUd8wL5PWUtQ9AlNUMt0fgJXxj6Kd5FnOwfMD7h/f2bXB/mopoMrm5S5fLDC4pW5mjgyBZLiM7790/UKrGyGZwrXwyUbff4aFz4H6uC+cy3Q1cSBAXCvM5PQUV0PMC6In7lQmaINAT9yUTO4CegKeAuPzkJAro8RrQMwS6MIEe/3OgCwR6DpFpCfSsAnqlZNuGNcI1vY20U81tgOcAcLBcUxODu7fCSoqpG+PUjTfKBJpazdwY7qk2PI7m61cG3jcvy4tcZdkl7p6KQrVGqhbyEhCkHFlyB5XCKvBaGXXNreFwf8yTSST5Pt5FPdw/v02n+7ThQ1h/cvJosU8dvzWCA3nZw7JWce1mEdsemdcyy2zdNyhc+K3ooXF9VAXU9zdTjpdxW//vg5jNp3B5Oh/vAZwiGe79cidX/686CbiqGbZvd6viInogqKGkJwLuWeTIbTypbCvU7d/Po8kExGY4Fbr18c9JeobsyVMe/yjjjs+QtQsM9piDL6c/CZ3xSeJCk46z8XzCWTS7EfEeZ/07Wa9HiyiVe1J7urB+0FDwepBhkh80imVwbcLdvYWEu5b7asTLcTLAuuOrzKzXOcWbG2W9vi/mV2c8h6vdb6Ygl4GccM0nA/0P5tJ6wD7l1t2lwNm9dbUg3E9duVB5wfAOWgr3+tEzEXIjB4pdrENzOKKVsU9w868mLYmyca3xym4Lj4h+ZvuAmsqzlWRtQvOepy4vAGGp5/itKkfOnFztTOR9v4UXgwQ0d5jfRrzNev5ymfUPl8tODYY473WWyxxtjWQPLBPhUwqhtN9cLjuM5fW6X2NJVYOKs3J2WKzC2Nui+zE4YXjBYhq7bxinMfgHawY0Bi9TCY0NX02xe4lrIIqLsXtJY3fGWey+d3wauxPOMvuAxu6Cq+8TKGwMCcCvOY3dC84siC4v8IXSWXlhbQwCZQw+qLSNvo64MSIWHGK+4SJ8hfVkdpvG7uvSwu5X+ACJzjhTL1BLvQ4Fw/MGn68HVgxurWL3dbUoFDklxF9yW2dOOPjXgRcwS4vdl+BmKXafwh0vsfsHhyVq6+LBbT9AGtzokguYaYu7j2DSo8kXogxIggFVNqsSvExqv1jgIwvsH3nPQ7tUcP8l0f0XOPFiAQNzRz5oHcBdxyB6FjFooRAquwEJTtKcYK2piK0Znm0vfXf1WSzI+vG3WJh3ZKlbb1HUhxjz6tyt5IrDhQzaO1+KlaVVZfpK4PUSVKR529ZapemOSjeybFXMpbosxag42VVxUpWCd3etVczlrorXspgVg+8hpq/vRV9D+gLfK0EXgsJVFTQXNFIuKjIjaVomvRR0LKhHszJdaqSDa++MO4EvIGUi4OIQ8xo2dUebp1wcrSxJ0Ey7IgAeEioTL8DJCoP7cd/TP7XLhTecfRRDjs4F56DQ+GxExBDx3IiYQcQLI2Iile8aT/lPUl4Z8O+kdDGA/hi0n4GvpVMMUNu4L4hyagUXnWj/hVRfRO80CUV/d9RpEhI6zRVezdGhgnaAHz8XocjprQjzfEXUhUNdlL8WeSqjswk4GC+CSu7MeTTWH4qgO02n/P1Fns3PLyzgtIAj+sHK+OOVb5tGbH8DTiaj1SD9ncXskXZMcN96Vpotb65eig5p7tqBffuSbOWqVPRv8wJczOFigWcWs4GyQVJH93Zec6uqQj3C2lqpztFLvTrKHlzsV34XqFl8JXVLqGT/f7ol0NVitqbaGiV2diaaEAWgzWc2JqCLDUtAO6k1rWFHKXuX2BuaWRmawg86BCkB1aAldvmQQhgxbgraB1Wklw05pbIIfCIi5NBF8MBjNuhoPVxlOnyARANWeIeAy+4sMAkaISVaK6xSKNGLL0HUDCWI2y4M1WBFfwBomTvYh4jQLwGv3DLUKdELhdIV4JnHEtAqY7Bq8NAN9H73lNSc1JJU0PGPoPqlAOxafzAJXlOfBRqFLYGzPOAs5xJIRwkyqwkpTeAE6LToPCidnmcVDs58hZDMh571SnBlvRK8Wa9Ws1bTmgsA")),r=>r({workerURI:r=>{const l="text/javascript";let s=a();if("string"==typeof s&&(s=(new TextEncoder).encode(s)),r){const r=new Blob([s],{type:l});return URL.createObjectURL(r)}return "data:"+l+";base64,"+function(r){let l="";const s=r.length;let e=0;for(;e+2<s;e+=3){const s=r[e]<<16|r[e+1]<<8|r[e+2];l+=c[s>>18&63]+c[s>>12&63]+c[s>>6&63]+c[63&s];}const n=s-e;if(1===n){const s=r[e]<<16;l+=c[s>>18&63]+c[s>>12&63]+"==";}else if(2===n){const s=r[e]<<16|r[e+1]<<8;l+=c[s>>18&63]+c[s>>12&63]+c[s>>6&63]+"=";}return l}(s)}}));var a;
|
|
443
442
|
|
|
444
443
|
/*
|
|
445
444
|
Copyright (c) 2026 Gildas Lormeau. All rights reserved.
|
|
@@ -2388,7 +2387,7 @@ function mapInflateStreamError(readable, sourceErrors) {
|
|
|
2388
2387
|
*/
|
|
2389
2388
|
|
|
2390
2389
|
|
|
2391
|
-
const DEFAULT_CHUNK_SIZE =
|
|
2390
|
+
const DEFAULT_CHUNK_SIZE = 256 * 1024;
|
|
2392
2391
|
const MESSAGE_EVENT_TYPE = "message";
|
|
2393
2392
|
const MESSAGE_START = "start";
|
|
2394
2393
|
const MESSAGE_PULL = "pull";
|
|
@@ -2594,7 +2593,7 @@ function disableWebWorker(workerData) {
|
|
|
2594
2593
|
class CodecWorker {
|
|
2595
2594
|
|
|
2596
2595
|
constructor(workerData, { readable, writable }, workerOptions, onTaskFinished) {
|
|
2597
|
-
const { options, config, streamOptions, useWebWorkers,
|
|
2596
|
+
const { options, config, streamOptions, useWebWorkers, workerURI } = workerOptions;
|
|
2598
2597
|
let { createWorker } = workerOptions;
|
|
2599
2598
|
const { signal } = streamOptions;
|
|
2600
2599
|
if (createWorkerFailed) {
|
|
@@ -2611,7 +2610,6 @@ class CodecWorker {
|
|
|
2611
2610
|
workerOptions,
|
|
2612
2611
|
workerURI,
|
|
2613
2612
|
createWorker,
|
|
2614
|
-
transferStreams,
|
|
2615
2613
|
terminate() {
|
|
2616
2614
|
return new Promise(resolve => {
|
|
2617
2615
|
const { worker, busy } = workerData;
|
|
@@ -2789,12 +2787,6 @@ const MESSAGE_ERROR_EVENT_TYPE = "messageerror";
|
|
|
2789
2787
|
const ABORT_EVENT_TYPE = "abort";
|
|
2790
2788
|
|
|
2791
2789
|
let webWorkerSource, webWorkerURI, webWorkerOptions;
|
|
2792
|
-
let transferStreamsSupported = true;
|
|
2793
|
-
try {
|
|
2794
|
-
transferStreamsSupported = typeof structuredClone == FUNCTION_TYPE && structuredClone(new DOMException("", "AbortError")).code !== UNDEFINED_VALUE;
|
|
2795
|
-
} catch {
|
|
2796
|
-
// ignored
|
|
2797
|
-
}
|
|
2798
2790
|
|
|
2799
2791
|
setWebWorkerBackend(createWebWorkerInterface);
|
|
2800
2792
|
|
|
@@ -2881,14 +2873,11 @@ async function runWebWorker(workerData, config) {
|
|
|
2881
2873
|
});
|
|
2882
2874
|
const { readable, options } = workerData;
|
|
2883
2875
|
const { writable, closed, abortPipe } = watchClosedStream(workerData.writable, workerData);
|
|
2884
|
-
let streamsTransferred;
|
|
2885
2876
|
try {
|
|
2886
|
-
|
|
2877
|
+
sendMessage({
|
|
2887
2878
|
type: MESSAGE_START,
|
|
2888
2879
|
options,
|
|
2889
|
-
config
|
|
2890
|
-
readable,
|
|
2891
|
-
writable
|
|
2880
|
+
config
|
|
2892
2881
|
}, workerData);
|
|
2893
2882
|
} catch (error) {
|
|
2894
2883
|
abortPipe();
|
|
@@ -2900,12 +2889,10 @@ async function runWebWorker(workerData, config) {
|
|
|
2900
2889
|
workerData.onTaskFinished();
|
|
2901
2890
|
throw error;
|
|
2902
2891
|
}
|
|
2903
|
-
|
|
2904
|
-
|
|
2905
|
-
|
|
2906
|
-
|
|
2907
|
-
});
|
|
2908
|
-
}
|
|
2892
|
+
Object.assign(workerData, {
|
|
2893
|
+
reader: readable.getReader(),
|
|
2894
|
+
writer: writable.getWriter()
|
|
2895
|
+
});
|
|
2909
2896
|
const { workerStartupTimeout } = config;
|
|
2910
2897
|
if (!workerData.workerAlive && Number.isFinite(workerStartupTimeout) && workerStartupTimeout >= 0) {
|
|
2911
2898
|
workerData.startupTimeout = setTimeout(() => onStartupTimeout(workerData), workerStartupTimeout);
|
|
@@ -2938,7 +2925,7 @@ async function runWebWorker(workerData, config) {
|
|
|
2938
2925
|
}
|
|
2939
2926
|
|
|
2940
2927
|
async function closeWritable() {
|
|
2941
|
-
if (!
|
|
2928
|
+
if (!writable.locked) {
|
|
2942
2929
|
try {
|
|
2943
2930
|
await writable.getWriter().close();
|
|
2944
2931
|
} catch {
|
|
@@ -3129,31 +3116,14 @@ function onWorkerError(event, workerData) {
|
|
|
3129
3116
|
}
|
|
3130
3117
|
}
|
|
3131
3118
|
|
|
3132
|
-
function sendMessage(message, { worker, writer
|
|
3119
|
+
function sendMessage(message, { worker, writer }) {
|
|
3133
3120
|
try {
|
|
3134
|
-
const { value
|
|
3135
|
-
const transferables = [];
|
|
3121
|
+
const { value } = message;
|
|
3136
3122
|
if (value) {
|
|
3137
3123
|
message.value = toExactUint8Array(value);
|
|
3138
|
-
transferables.push(message.value.buffer);
|
|
3139
|
-
}
|
|
3140
|
-
if (transferStreams && transferStreamsSupported && workerAlive) {
|
|
3141
|
-
if (readable) {
|
|
3142
|
-
transferables.push(readable);
|
|
3143
|
-
}
|
|
3144
|
-
if (writable) {
|
|
3145
|
-
transferables.push(writable);
|
|
3146
|
-
}
|
|
3147
|
-
} else {
|
|
3148
|
-
message.readable = message.writable = null;
|
|
3149
|
-
}
|
|
3150
|
-
if (transferables.length) {
|
|
3151
3124
|
try {
|
|
3152
|
-
worker.postMessage(message,
|
|
3153
|
-
return true;
|
|
3125
|
+
worker.postMessage(message, [message.value.buffer]);
|
|
3154
3126
|
} catch {
|
|
3155
|
-
transferStreamsSupported = false;
|
|
3156
|
-
message.readable = message.writable = null;
|
|
3157
3127
|
worker.postMessage(message);
|
|
3158
3128
|
}
|
|
3159
3129
|
} else {
|
|
@@ -3302,7 +3272,7 @@ let indexWorker = 0;
|
|
|
3302
3272
|
|
|
3303
3273
|
async function runWorker(stream, workerOptions) {
|
|
3304
3274
|
const { options, config } = workerOptions;
|
|
3305
|
-
const {
|
|
3275
|
+
const { useWebWorkers, useCompressionStream, compressed, checkCrc32, computeCrc32, encrypted, format, codecURI } = options;
|
|
3306
3276
|
const { workerURI, createWorker, maxWorkers } = config;
|
|
3307
3277
|
if (format) {
|
|
3308
3278
|
if (codecURI) {
|
|
@@ -3310,7 +3280,6 @@ async function runWorker(stream, workerOptions) {
|
|
|
3310
3280
|
}
|
|
3311
3281
|
await ensureCodecStreams(format, options.codecURI);
|
|
3312
3282
|
}
|
|
3313
|
-
workerOptions.transferStreams = !format && (transferStreams || (transferStreams === UNDEFINED_VALUE && config.transferStreams));
|
|
3314
3283
|
const streamCopy = !compressed && !checkCrc32 && !computeCrc32 && !encrypted;
|
|
3315
3284
|
const workerSupported = format === UNDEFINED_VALUE || Boolean(options.codecURI);
|
|
3316
3285
|
workerOptions.useWebWorkers = !streamCopy && workerSupported && (useWebWorkers || (useWebWorkers === UNDEFINED_VALUE && config.useWebWorkers));
|
|
@@ -4826,6 +4795,8 @@ const WARNING_APPENDED_DATA = "appended data";
|
|
|
4826
4795
|
const WARNING_PREPENDED_DATA = "prepended data";
|
|
4827
4796
|
const WARNING_PREPENDED_CENTRAL_DIRECTORY = "prepended central directory";
|
|
4828
4797
|
const WARNING_TRAILING_CENTRAL_DIRECTORY_DATA = "trailing central directory data";
|
|
4798
|
+
const WARNING_MISMATCHED_CENTRAL_DIRECTORY_OFFSET = "mismatched central directory offset";
|
|
4799
|
+
const WARNING_MISSING_ZIP64_EXTRA_FIELD = "missing zip64 extra field";
|
|
4829
4800
|
const WARNING_DUPLICATE_FILENAME = "duplicate filename";
|
|
4830
4801
|
const WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY = "mismatched zip64 end of central directory record";
|
|
4831
4802
|
const WARNING_MULTIPLE_END_OF_CENTRAL_DIRECTORY = "multiple end of central directory records";
|
|
@@ -4988,6 +4959,8 @@ class ZipReader {
|
|
|
4988
4959
|
reportAmbiguity(checkAmbiguity, warnings, WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY);
|
|
4989
4960
|
}
|
|
4990
4961
|
directoryDataOffset = getDiskOffset$1(reader, diskNumber) + getBigUint64(endOfDirectoryView, 48) + prependedDataLength;
|
|
4962
|
+
} else if (directoryDataOffset == MAX_32_BITS || directoryDataLength == MAX_32_BITS || diskNumber == MAX_16_BITS) {
|
|
4963
|
+
throw new Error(ERR_EOCDR_LOCATOR_ZIP64_NOT_FOUND);
|
|
4991
4964
|
}
|
|
4992
4965
|
}
|
|
4993
4966
|
let declaredDirectoryDataLength = directoryDataLength;
|
|
@@ -5010,25 +4983,44 @@ class ZipReader {
|
|
|
5010
4983
|
if (directoryArray.length < 4) {
|
|
5011
4984
|
throw new Error(ERR_BAD_FORMAT);
|
|
5012
4985
|
}
|
|
5013
|
-
|
|
4986
|
+
let expectedDirectoryDataOffset = centralDirectoryEndOffset - directoryDataLength;
|
|
5014
4987
|
if (directoryDataOffset != expectedDirectoryDataOffset && diskNumber == lastDiskNumber) {
|
|
5015
4988
|
const storedPointsAtDirectory = getUint32$1(directoryView, offset) == CENTRAL_FILE_HEADER_SIGNATURE ||
|
|
5016
4989
|
Boolean(directoryEncryptionInfo && directoryEncryptionInfo.compressedSize) ||
|
|
5017
4990
|
detectEncryptedCentralDirectory(directoryView);
|
|
5018
4991
|
let reconcile = !storedPointsAtDirectory;
|
|
5019
|
-
if (
|
|
5020
|
-
const
|
|
5021
|
-
|
|
4992
|
+
if (expectedDirectoryDataOffset >= 0 && expectedDirectoryDataOffset + 4 <= reader.size) {
|
|
4993
|
+
const expectedPointsAtDirectory = await pointsAtDirectory(reader, expectedDirectoryDataOffset);
|
|
4994
|
+
if (storedPointsAtDirectory) {
|
|
4995
|
+
reconcile = expectedPointsAtDirectory;
|
|
4996
|
+
} else if (!expectedPointsAtDirectory) {
|
|
4997
|
+
const signatureRecordOffset = await findDigitalSignatureRecordOffset(reader, centralDirectoryEndOffset);
|
|
4998
|
+
const signedDirectoryDataOffset = signatureRecordOffset - directoryDataLength;
|
|
4999
|
+
if (signatureRecordOffset !== UNDEFINED_VALUE && signedDirectoryDataOffset >= 0 &&
|
|
5000
|
+
await pointsAtDirectory(reader, signedDirectoryDataOffset)) {
|
|
5001
|
+
expectedDirectoryDataOffset = signedDirectoryDataOffset;
|
|
5002
|
+
}
|
|
5003
|
+
}
|
|
5022
5004
|
}
|
|
5023
5005
|
if (reconcile) {
|
|
5024
5006
|
const originalDirectoryDataOffset = directoryDataOffset;
|
|
5025
5007
|
directoryDataOffset = expectedDirectoryDataOffset;
|
|
5008
|
+
directoryArray = await readUint8Array(reader, directoryDataOffset, directoryDataLength);
|
|
5009
|
+
directoryView = getDataView(directoryArray);
|
|
5026
5010
|
if (directoryDataOffset > originalDirectoryDataOffset) {
|
|
5027
5011
|
prependedDataLength += directoryDataOffset - originalDirectoryDataOffset;
|
|
5028
5012
|
prependedCentralDirectory = storedPointsAtDirectory;
|
|
5013
|
+
} else {
|
|
5014
|
+
reportAmbiguity(checkAmbiguity, warnings, WARNING_MISMATCHED_CENTRAL_DIRECTORY_OFFSET);
|
|
5015
|
+
const offsetDelta = directoryDataOffset - originalDirectoryDataOffset;
|
|
5016
|
+
if (directoryArray.length >= CENTRAL_FILE_HEADER_LENGTH) {
|
|
5017
|
+
const localHeaderOffset = getUint32$1(directoryView, 42);
|
|
5018
|
+
if (!await startsWithSignature(reader, localHeaderOffset, LOCAL_FILE_HEADER_SIGNATURE) &&
|
|
5019
|
+
await startsWithSignature(reader, localHeaderOffset + offsetDelta, LOCAL_FILE_HEADER_SIGNATURE)) {
|
|
5020
|
+
prependedDataLength += offsetDelta;
|
|
5021
|
+
}
|
|
5022
|
+
}
|
|
5029
5023
|
}
|
|
5030
|
-
directoryArray = await readUint8Array(reader, directoryDataOffset, directoryDataLength);
|
|
5031
|
-
directoryView = getDataView(directoryArray);
|
|
5032
5024
|
}
|
|
5033
5025
|
}
|
|
5034
5026
|
}
|
|
@@ -5112,17 +5104,6 @@ class ZipReader {
|
|
|
5112
5104
|
if (filename === UNDEFINED_VALUE) {
|
|
5113
5105
|
filename = decodeText(rawFilename, rawFilenameEncoding);
|
|
5114
5106
|
}
|
|
5115
|
-
if (normalizeFilename) {
|
|
5116
|
-
const normalizedFilename = normalizeFilename(filename);
|
|
5117
|
-
if (normalizedFilename !== UNDEFINED_VALUE) {
|
|
5118
|
-
filename = normalizedFilename;
|
|
5119
|
-
}
|
|
5120
|
-
}
|
|
5121
|
-
if (isUnsafeFilename(filename, filenameValidation)) {
|
|
5122
|
-
const error = new Error(ERR_UNSAFE_FILENAME);
|
|
5123
|
-
error.filename = filename;
|
|
5124
|
-
throw error;
|
|
5125
|
-
}
|
|
5126
5107
|
let comment = decode(rawComment, rawCommentEncoding, TEXT_TYPE_COMMENT);
|
|
5127
5108
|
if (comment === UNDEFINED_VALUE) {
|
|
5128
5109
|
comment = decodeText(rawComment, rawCommentEncoding);
|
|
@@ -5150,7 +5131,29 @@ class ZipReader {
|
|
|
5150
5131
|
filename,
|
|
5151
5132
|
comment
|
|
5152
5133
|
});
|
|
5153
|
-
|
|
5134
|
+
let malformedExtraField;
|
|
5135
|
+
try {
|
|
5136
|
+
malformedExtraField = readCommonFooter(fileEntry, fileEntry, directoryView, offset + 6);
|
|
5137
|
+
} catch (error) {
|
|
5138
|
+
if (checkAmbiguity || error.message != ERR_EXTRAFIELD_ZIP64_NOT_FOUND) {
|
|
5139
|
+
throw error;
|
|
5140
|
+
}
|
|
5141
|
+
fileEntry.zip64ExtraFieldMissing = true;
|
|
5142
|
+
addWarning(warnings, WARNING_MISSING_ZIP64_EXTRA_FIELD, fileEntry.filename);
|
|
5143
|
+
}
|
|
5144
|
+
filename = fileEntry.filename;
|
|
5145
|
+
if (normalizeFilename) {
|
|
5146
|
+
const normalizedFilename = normalizeFilename(filename);
|
|
5147
|
+
if (normalizedFilename !== UNDEFINED_VALUE) {
|
|
5148
|
+
filename = fileEntry.filename = normalizedFilename;
|
|
5149
|
+
}
|
|
5150
|
+
}
|
|
5151
|
+
if (isUnsafeFilename(filename, filenameValidation)) {
|
|
5152
|
+
const error = new Error(ERR_UNSAFE_FILENAME);
|
|
5153
|
+
error.filename = filename;
|
|
5154
|
+
throw error;
|
|
5155
|
+
}
|
|
5156
|
+
if (malformedExtraField) {
|
|
5154
5157
|
addWarning(warnings, WARNING_MALFORMED_EXTRA_FIELD, filename);
|
|
5155
5158
|
}
|
|
5156
5159
|
fileEntry.offset += prependedDataLength;
|
|
@@ -5179,11 +5182,12 @@ class ZipReader {
|
|
|
5179
5182
|
const sticky = Boolean(fileEntry.unixMode & FILE_ATTR_UNIX_STICKY_MASK);
|
|
5180
5183
|
const unixType = fileEntry.unixMode === UNDEFINED_VALUE ? unixExternalUpper : fileEntry.unixMode;
|
|
5181
5184
|
const symlink = (unixType & FILE_ATTR_UNIX_TYPE_MASK) == FILE_ATTR_UNIX_TYPE_SYMLINK;
|
|
5182
|
-
const executable = !symlink && ((fileEntry.unixMode !== UNDEFINED_VALUE)
|
|
5183
|
-
? ((fileEntry.unixMode & FILE_ATTR_UNIX_EXECUTABLE_MASK) != 0)
|
|
5184
|
-
: (unixCompatible && ((unixExternalUpper & FILE_ATTR_UNIX_EXECUTABLE_MASK) != 0)));
|
|
5185
5185
|
const modeIsDir = fileEntry.unixMode !== UNDEFINED_VALUE && ((fileEntry.unixMode & FILE_ATTR_UNIX_TYPE_MASK) == FILE_ATTR_UNIX_TYPE_DIR);
|
|
5186
5186
|
const upperIsDir = ((unixExternalUpper & FILE_ATTR_UNIX_TYPE_MASK) == FILE_ATTR_UNIX_TYPE_DIR);
|
|
5187
|
+
const directory = modeIsDir || upperIsDir || (msDosCompatible && msdosAttributes.directory) || fileEntry.filename.endsWith(DIRECTORY_SIGNATURE);
|
|
5188
|
+
const executable = !symlink && !directory && ((fileEntry.unixMode !== UNDEFINED_VALUE)
|
|
5189
|
+
? ((fileEntry.unixMode & FILE_ATTR_UNIX_EXECUTABLE_MASK) != 0)
|
|
5190
|
+
: (unixCompatible && ((unixExternalUpper & FILE_ATTR_UNIX_EXECUTABLE_MASK) != 0)));
|
|
5187
5191
|
Object.assign(fileEntry, {
|
|
5188
5192
|
setuid,
|
|
5189
5193
|
setgid,
|
|
@@ -5191,7 +5195,7 @@ class ZipReader {
|
|
|
5191
5195
|
symlink,
|
|
5192
5196
|
unixExternalUpper,
|
|
5193
5197
|
executable,
|
|
5194
|
-
directory
|
|
5198
|
+
directory,
|
|
5195
5199
|
zipCrypto: fileEntry.encrypted && !fileEntry.extraFieldAES
|
|
5196
5200
|
});
|
|
5197
5201
|
const entry = new Entry(fileEntry);
|
|
@@ -5247,10 +5251,10 @@ class ZipReader {
|
|
|
5247
5251
|
const extractAppendedData = getOptionValue$1(zipReader, options, OPTION_EXTRACT_APPENDED_DATA);
|
|
5248
5252
|
const splitZipSignatureLength = (checkAmbiguity || extractPrependedData) && filesLength &&
|
|
5249
5253
|
startOffset == SPLIT_ZIP_FILE_SIGNATURE_LENGTH && await startsWithSplitZipMarker(reader) ? SPLIT_ZIP_FILE_SIGNATURE_LENGTH : 0;
|
|
5250
|
-
if (checkAmbiguity && (prependedDataLength || (filesLength && startOffset > splitZipSignatureLength))) {
|
|
5254
|
+
if (checkAmbiguity && (prependedDataLength > 0 || (filesLength && startOffset > splitZipSignatureLength))) {
|
|
5251
5255
|
throwAmbiguousArchive(WARNING_PREPENDED_DATA);
|
|
5252
5256
|
}
|
|
5253
|
-
if (prependedDataLength || (filesLength && startOffset > SPLIT_ZIP_FILE_SIGNATURE_LENGTH)) {
|
|
5257
|
+
if (prependedDataLength > 0 || (filesLength && startOffset > SPLIT_ZIP_FILE_SIGNATURE_LENGTH)) {
|
|
5254
5258
|
addWarning(warnings, WARNING_PREPENDED_DATA);
|
|
5255
5259
|
}
|
|
5256
5260
|
if (prependedCentralDirectory) {
|
|
@@ -5410,6 +5414,9 @@ let ZipEntry$1 = class ZipEntry {
|
|
|
5410
5414
|
|
|
5411
5415
|
async getData(writer, fileEntry, readRanges, options = {}) {
|
|
5412
5416
|
const zipEntry = this;
|
|
5417
|
+
if (zipEntry.zip64ExtraFieldMissing) {
|
|
5418
|
+
throw new Error(ERR_EXTRAFIELD_ZIP64_NOT_FOUND);
|
|
5419
|
+
}
|
|
5413
5420
|
const config = getConfiguration();
|
|
5414
5421
|
const {
|
|
5415
5422
|
reader,
|
|
@@ -5554,7 +5561,6 @@ let ZipEntry$1 = class ZipEntry {
|
|
|
5554
5561
|
encrypted,
|
|
5555
5562
|
useWebWorkers: getOptionValue$1(zipEntry, options, OPTION_USE_WEB_WORKERS),
|
|
5556
5563
|
useCompressionStream,
|
|
5557
|
-
transferStreams: getOptionValue$1(zipEntry, options, OPTION_TRANSFER_STREAMS),
|
|
5558
5564
|
deflate64,
|
|
5559
5565
|
format: registeredCodec ? registeredCodec.format : UNDEFINED_VALUE,
|
|
5560
5566
|
codecURI: registeredCodec ? registeredCodec.codecURI : UNDEFINED_VALUE,
|
|
@@ -5648,6 +5654,30 @@ function getWrappedFilesLength(directoryView, directoryArray, offset) {
|
|
|
5648
5654
|
return wrappedFilesLength % (MAX_16_BITS + 1) ? 0 : wrappedFilesLength;
|
|
5649
5655
|
}
|
|
5650
5656
|
|
|
5657
|
+
function pointsAtDirectory(reader, offset) {
|
|
5658
|
+
return startsWithSignature(reader, offset, CENTRAL_FILE_HEADER_SIGNATURE);
|
|
5659
|
+
}
|
|
5660
|
+
|
|
5661
|
+
async function startsWithSignature(reader, offset, signature) {
|
|
5662
|
+
if (offset < 0 || offset + 4 > reader.size) {
|
|
5663
|
+
return false;
|
|
5664
|
+
}
|
|
5665
|
+
const signatureArray = await readUint8Array(reader, offset, 4);
|
|
5666
|
+
return getUint32$1(getDataView(signatureArray), 0) == signature;
|
|
5667
|
+
}
|
|
5668
|
+
|
|
5669
|
+
async function findDigitalSignatureRecordOffset(reader, endOffset) {
|
|
5670
|
+
const startOffset = Math.max(0, endOffset - (6 + MAX_16_BITS));
|
|
5671
|
+
const tailArray = await readUint8Array(reader, startOffset, endOffset - startOffset);
|
|
5672
|
+
const tailView = getDataView(tailArray);
|
|
5673
|
+
for (let indexByte = tailArray.length - 6; indexByte >= 0; indexByte--) {
|
|
5674
|
+
if (getUint32$1(tailView, indexByte) == DIGITAL_SIGNATURE_RECORD_SIGNATURE &&
|
|
5675
|
+
indexByte + 6 + getUint16$1(tailView, indexByte + 4) == tailArray.length) {
|
|
5676
|
+
return startOffset + indexByte;
|
|
5677
|
+
}
|
|
5678
|
+
}
|
|
5679
|
+
}
|
|
5680
|
+
|
|
5651
5681
|
function readDigitalSignature(signatureRecordArray) {
|
|
5652
5682
|
if (signatureRecordArray.length >= 6) {
|
|
5653
5683
|
const signatureRecordView = getDataView(signatureRecordArray);
|
|
@@ -5779,29 +5809,27 @@ function readCommonFooter(fileEntry, directory, dataView, offset, localDirectory
|
|
|
5779
5809
|
readExtraFieldUnixDates(extraFieldUnixType1, directory);
|
|
5780
5810
|
directory.extraFieldUnixType1 = extraFieldUnixType1;
|
|
5781
5811
|
}
|
|
5812
|
+
const extraFieldExtendedTimestamp = extraField.get(EXTRAFIELD_TYPE_EXTENDED_TIMESTAMP);
|
|
5813
|
+
if (extraFieldExtendedTimestamp) {
|
|
5814
|
+
readExtraFieldExtendedTimestamp(extraFieldExtendedTimestamp, directory, localDirectory);
|
|
5815
|
+
directory.extraFieldExtendedTimestamp = extraFieldExtendedTimestamp;
|
|
5816
|
+
}
|
|
5782
5817
|
const extraFieldNTFS = extraField.get(EXTRAFIELD_TYPE_NTFS);
|
|
5783
5818
|
if (extraFieldNTFS) {
|
|
5784
5819
|
readExtraFieldNTFS(extraFieldNTFS, directory);
|
|
5785
5820
|
directory.extraFieldNTFS = extraFieldNTFS;
|
|
5786
5821
|
}
|
|
5787
|
-
const
|
|
5822
|
+
const extraFieldInfoZip = extraField.get(EXTRAFIELD_TYPE_INFOZIP);
|
|
5788
5823
|
let unixIdsRead;
|
|
5824
|
+
if (extraFieldInfoZip) {
|
|
5825
|
+
unixIdsRead = readExtraFieldUnix(extraFieldInfoZip, directory, true);
|
|
5826
|
+
directory.extraFieldInfoZip = extraFieldInfoZip;
|
|
5827
|
+
}
|
|
5828
|
+
const extraFieldUnix = extraField.get(EXTRAFIELD_TYPE_UNIX);
|
|
5789
5829
|
if (extraFieldUnix) {
|
|
5790
|
-
|
|
5830
|
+
readExtraFieldUnix(extraFieldUnix, unixIdsRead ? {} : directory, false);
|
|
5791
5831
|
directory.extraFieldUnix = extraFieldUnix;
|
|
5792
5832
|
}
|
|
5793
|
-
if (!unixIdsRead) {
|
|
5794
|
-
const extraFieldInfoZip = extraField.get(EXTRAFIELD_TYPE_INFOZIP);
|
|
5795
|
-
if (extraFieldInfoZip) {
|
|
5796
|
-
readExtraFieldUnix(extraFieldInfoZip, directory, true);
|
|
5797
|
-
directory.extraFieldInfoZip = extraFieldInfoZip;
|
|
5798
|
-
}
|
|
5799
|
-
}
|
|
5800
|
-
const extraFieldExtendedTimestamp = extraField.get(EXTRAFIELD_TYPE_EXTENDED_TIMESTAMP);
|
|
5801
|
-
if (extraFieldExtendedTimestamp) {
|
|
5802
|
-
readExtraFieldExtendedTimestamp(extraFieldExtendedTimestamp, directory, localDirectory);
|
|
5803
|
-
directory.extraFieldExtendedTimestamp = extraFieldExtendedTimestamp;
|
|
5804
|
-
}
|
|
5805
5833
|
const extraFieldUSDZ = extraField.get(EXTRAFIELD_TYPE_USDZ);
|
|
5806
5834
|
if (extraFieldUSDZ) {
|
|
5807
5835
|
directory.extraFieldUSDZ = extraFieldUSDZ;
|
|
@@ -6440,11 +6468,13 @@ var zipReader = /*#__PURE__*/Object.freeze({
|
|
|
6440
6468
|
WARNING_COMPRESSED_PATCHED_DATA: WARNING_COMPRESSED_PATCHED_DATA,
|
|
6441
6469
|
WARNING_DUPLICATE_FILENAME: WARNING_DUPLICATE_FILENAME,
|
|
6442
6470
|
WARNING_MALFORMED_EXTRA_FIELD: WARNING_MALFORMED_EXTRA_FIELD,
|
|
6471
|
+
WARNING_MISMATCHED_CENTRAL_DIRECTORY_OFFSET: WARNING_MISMATCHED_CENTRAL_DIRECTORY_OFFSET,
|
|
6443
6472
|
WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG: WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG,
|
|
6444
6473
|
WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD: WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD,
|
|
6445
6474
|
WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES: WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES,
|
|
6446
6475
|
WARNING_MISMATCHED_LOCAL_FILE_HEADER_FILENAME: WARNING_MISMATCHED_LOCAL_FILE_HEADER_FILENAME,
|
|
6447
6476
|
WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY: WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY,
|
|
6477
|
+
WARNING_MISSING_ZIP64_EXTRA_FIELD: WARNING_MISSING_ZIP64_EXTRA_FIELD,
|
|
6448
6478
|
WARNING_MULTIPLE_END_OF_CENTRAL_DIRECTORY: WARNING_MULTIPLE_END_OF_CENTRAL_DIRECTORY,
|
|
6449
6479
|
WARNING_PREPENDED_CENTRAL_DIRECTORY: WARNING_PREPENDED_CENTRAL_DIRECTORY,
|
|
6450
6480
|
WARNING_PREPENDED_DATA: WARNING_PREPENDED_DATA,
|
|
@@ -6577,13 +6607,14 @@ class ZipWriter {
|
|
|
6577
6607
|
return watchPromiseError(this, prependZipEntries(this, reader));
|
|
6578
6608
|
}
|
|
6579
6609
|
|
|
6580
|
-
appendZip(reader) {
|
|
6581
|
-
return watchPromiseError(this, this.appendZipEntries(reader));
|
|
6610
|
+
appendZip(reader, options = {}) {
|
|
6611
|
+
return watchPromiseError(this, this.appendZipEntries(reader, options));
|
|
6582
6612
|
}
|
|
6583
6613
|
|
|
6584
|
-
async appendZipEntries(reader) {
|
|
6614
|
+
async appendZipEntries(reader, options = {}) {
|
|
6585
6615
|
const zipWriter = this;
|
|
6586
6616
|
const { pendingAddFileCalls, filenames, fileEntries } = zipWriter;
|
|
6617
|
+
const filter = checkFunctionOption(options.filter);
|
|
6587
6618
|
while (pendingAddFileCalls.size) {
|
|
6588
6619
|
await Promise.allSettled(Array.from(pendingAddFileCalls));
|
|
6589
6620
|
}
|
|
@@ -6602,10 +6633,16 @@ class ZipWriter {
|
|
|
6602
6633
|
const { ZipReader } = await Promise.resolve().then(function () { return zipReader; });
|
|
6603
6634
|
const zipReader$1 = new ZipReader(reader);
|
|
6604
6635
|
const entries = await zipReader$1.getEntries();
|
|
6636
|
+
const keptEntries = [];
|
|
6637
|
+
for (const entry of entries) {
|
|
6638
|
+
if (!filter || await filter(entry)) {
|
|
6639
|
+
keptEntries.push(entry);
|
|
6640
|
+
}
|
|
6641
|
+
}
|
|
6605
6642
|
await zipReader$1.close();
|
|
6606
6643
|
await initStream(zipWriter.writer);
|
|
6607
6644
|
const { directoryOffset } = zipReader$1;
|
|
6608
|
-
|
|
6645
|
+
keptEntries.forEach(({ filename }) => {
|
|
6609
6646
|
if (filenames.has(filename)) {
|
|
6610
6647
|
throw new Error(ERR_DUPLICATED_NAME);
|
|
6611
6648
|
}
|
|
@@ -6626,8 +6663,8 @@ class ZipWriter {
|
|
|
6626
6663
|
zipWriter.offset += SPLIT_ZIP_FILE_SIGNATURE_LENGTH;
|
|
6627
6664
|
}
|
|
6628
6665
|
}
|
|
6629
|
-
const entryPositions = await copyZipData(zipWriter, reader, entries, directoryOffset);
|
|
6630
|
-
|
|
6666
|
+
const entryPositions = await copyZipData(zipWriter, reader, entries, keptEntries, directoryOffset, Boolean(filter));
|
|
6667
|
+
keptEntries.forEach(entry => {
|
|
6631
6668
|
const {
|
|
6632
6669
|
version,
|
|
6633
6670
|
rawLastModDate,
|
|
@@ -6683,6 +6720,7 @@ class ZipWriter {
|
|
|
6683
6720
|
rawExtraFieldExtendedTimestamp: EMPTY_UINT8_ARRAY,
|
|
6684
6721
|
rawExtraFieldNTFS: EMPTY_UINT8_ARRAY,
|
|
6685
6722
|
rawExtraFieldUnix: EMPTY_UINT8_ARRAY,
|
|
6723
|
+
rawCentralExtraFieldUnix: EMPTY_UINT8_ARRAY,
|
|
6686
6724
|
rawExtraField,
|
|
6687
6725
|
rawCentralExtraField: EMPTY_UINT8_ARRAY,
|
|
6688
6726
|
headerArray,
|
|
@@ -7251,7 +7289,6 @@ function resolveMetadata(zipWriter, name, options) {
|
|
|
7251
7289
|
const ntfsTimestamp = getOptionValue(zipWriter, options, OPTION_NTFS_TIMESTAMP);
|
|
7252
7290
|
const keepOrder = getOptionValue(zipWriter, options, OPTION_KEEP_ORDER, true);
|
|
7253
7291
|
const useWebWorkers = getOptionValue(zipWriter, options, OPTION_USE_WEB_WORKERS);
|
|
7254
|
-
const transferStreams = getOptionValue(zipWriter, options, OPTION_TRANSFER_STREAMS);
|
|
7255
7292
|
const bufferedWrite = getOptionValue(zipWriter, options, OPTION_BUFFERED_WRITE);
|
|
7256
7293
|
const createTempStream = getFunctionOptionValue(zipWriter, options, OPTION_CREATE_TEMP_STREAM);
|
|
7257
7294
|
const dataDescriptorSignature = getOptionValue(zipWriter, options, OPTION_DATA_DESCRIPTOR_SIGNATURE, true);
|
|
@@ -7317,7 +7354,6 @@ function resolveMetadata(zipWriter, name, options) {
|
|
|
7317
7354
|
ntfsTimestamp,
|
|
7318
7355
|
keepOrder,
|
|
7319
7356
|
useWebWorkers,
|
|
7320
|
-
transferStreams,
|
|
7321
7357
|
bufferedWrite,
|
|
7322
7358
|
createTempStream,
|
|
7323
7359
|
dataDescriptorSignature,
|
|
@@ -7376,7 +7412,7 @@ async function resolveSizes(zipWriter, reader, { resolvedOptions: metadata }, op
|
|
|
7376
7412
|
if (reader) {
|
|
7377
7413
|
reader = new GenericReader(reader);
|
|
7378
7414
|
await initStream(reader);
|
|
7379
|
-
if (!reader.
|
|
7415
|
+
if (!reader.readUint8Array && !reader.readable) {
|
|
7380
7416
|
throw new Error(ERR_INVALID_READER);
|
|
7381
7417
|
}
|
|
7382
7418
|
({ size: contentSize } = reader);
|
|
@@ -7737,6 +7773,7 @@ async function createFileEntry(reader, writer, { diskNumberStart, lockFileEntry
|
|
|
7737
7773
|
extraFieldExtendedTimestampTime,
|
|
7738
7774
|
rawExtraFieldNTFS,
|
|
7739
7775
|
rawExtraFieldUnix,
|
|
7776
|
+
rawCentralExtraFieldUnix,
|
|
7740
7777
|
rawExtraFieldAES,
|
|
7741
7778
|
} = headerInfo;
|
|
7742
7779
|
const { dataDescriptorArray } = dataDescriptorInfo;
|
|
@@ -7761,7 +7798,6 @@ async function createFileEntry(reader, writer, { diskNumberStart, lockFileEntry
|
|
|
7761
7798
|
rawExtraField,
|
|
7762
7799
|
rawCentralExtraField,
|
|
7763
7800
|
useWebWorkers,
|
|
7764
|
-
transferStreams,
|
|
7765
7801
|
onstart,
|
|
7766
7802
|
onprogress,
|
|
7767
7803
|
onend,
|
|
@@ -7803,6 +7839,7 @@ async function createFileEntry(reader, writer, { diskNumberStart, lockFileEntry
|
|
|
7803
7839
|
rawExtraFieldExtendedTimestamp,
|
|
7804
7840
|
rawExtraFieldNTFS,
|
|
7805
7841
|
rawExtraFieldUnix,
|
|
7842
|
+
rawCentralExtraFieldUnix,
|
|
7806
7843
|
rawExtraFieldAES,
|
|
7807
7844
|
rawExtraField,
|
|
7808
7845
|
rawCentralExtraField,
|
|
@@ -7849,7 +7886,6 @@ async function createFileEntry(reader, writer, { diskNumberStart, lockFileEntry
|
|
|
7849
7886
|
encrypted: encrypted && !passThroughEncryption,
|
|
7850
7887
|
useWebWorkers,
|
|
7851
7888
|
useCompressionStream,
|
|
7852
|
-
transferStreams,
|
|
7853
7889
|
format,
|
|
7854
7890
|
codecURI,
|
|
7855
7891
|
compressionMethod
|
|
@@ -8027,6 +8063,7 @@ function getHeaderInfo(options) {
|
|
|
8027
8063
|
rawExtraFieldNTFS = rawExtraFieldExtendedTimestamp = EMPTY_UINT8_ARRAY;
|
|
8028
8064
|
}
|
|
8029
8065
|
let rawExtraFieldUnix;
|
|
8066
|
+
let rawCentralExtraFieldUnix;
|
|
8030
8067
|
try {
|
|
8031
8068
|
const { uid, gid, unixExtraFieldType } = options;
|
|
8032
8069
|
if (unixExtraFieldType == INFOZIP_EXTRA_FIELD_TYPE && (uid !== UNDEFINED_VALUE || gid !== UNDEFINED_VALUE)) {
|
|
@@ -8041,7 +8078,7 @@ function getHeaderInfo(options) {
|
|
|
8041
8078
|
extraFieldUnix.writeBytes(uidBytes);
|
|
8042
8079
|
extraFieldUnix.writeUint8(gidBytes.length);
|
|
8043
8080
|
extraFieldUnix.writeBytes(gidBytes);
|
|
8044
|
-
rawExtraFieldUnix = extraFieldUnix.array;
|
|
8081
|
+
rawExtraFieldUnix = rawCentralExtraFieldUnix = extraFieldUnix.array;
|
|
8045
8082
|
} else if (unixExtraFieldType == UNIX_EXTRA_FIELD_TYPE && (uid !== UNDEFINED_VALUE || gid !== UNDEFINED_VALUE)) {
|
|
8046
8083
|
const extraFieldUnix = createRecordWriter(8);
|
|
8047
8084
|
extraFieldUnix.writeUint16(EXTRAFIELD_TYPE_UNIX);
|
|
@@ -8049,11 +8086,15 @@ function getHeaderInfo(options) {
|
|
|
8049
8086
|
extraFieldUnix.writeUint16((uid === UNDEFINED_VALUE ? 0 : uid) & MAX_16_BITS);
|
|
8050
8087
|
extraFieldUnix.writeUint16((gid === UNDEFINED_VALUE ? 0 : gid) & MAX_16_BITS);
|
|
8051
8088
|
rawExtraFieldUnix = extraFieldUnix.array;
|
|
8089
|
+
const centralExtraFieldUnix = createRecordWriter(4);
|
|
8090
|
+
centralExtraFieldUnix.writeUint16(EXTRAFIELD_TYPE_UNIX);
|
|
8091
|
+
centralExtraFieldUnix.writeUint16(0);
|
|
8092
|
+
rawCentralExtraFieldUnix = centralExtraFieldUnix.array;
|
|
8052
8093
|
} else {
|
|
8053
|
-
rawExtraFieldUnix = EMPTY_UINT8_ARRAY;
|
|
8094
|
+
rawExtraFieldUnix = rawCentralExtraFieldUnix = EMPTY_UINT8_ARRAY;
|
|
8054
8095
|
}
|
|
8055
8096
|
} catch {
|
|
8056
|
-
rawExtraFieldUnix = EMPTY_UINT8_ARRAY;
|
|
8097
|
+
rawExtraFieldUnix = rawCentralExtraFieldUnix = EMPTY_UINT8_ARRAY;
|
|
8057
8098
|
}
|
|
8058
8099
|
if (compressionMethod === UNDEFINED_VALUE) {
|
|
8059
8100
|
compressionMethod = compressed ? COMPRESSION_METHOD_DEFLATE : COMPRESSION_METHOD_STORE;
|
|
@@ -8145,6 +8186,7 @@ function getHeaderInfo(options) {
|
|
|
8145
8186
|
rawExtraFieldExtendedTimestamp,
|
|
8146
8187
|
rawExtraFieldNTFS,
|
|
8147
8188
|
rawExtraFieldUnix,
|
|
8189
|
+
rawCentralExtraFieldUnix,
|
|
8148
8190
|
rawExtraFieldAES,
|
|
8149
8191
|
extraFieldLength
|
|
8150
8192
|
};
|
|
@@ -8320,7 +8362,7 @@ function createDirectoryRecords(files) {
|
|
|
8320
8362
|
rawExtraFieldAES,
|
|
8321
8363
|
rawComment,
|
|
8322
8364
|
rawExtraFieldNTFS,
|
|
8323
|
-
|
|
8365
|
+
rawCentralExtraFieldUnix,
|
|
8324
8366
|
rawExtraField,
|
|
8325
8367
|
rawCentralExtraField,
|
|
8326
8368
|
extraFieldExtendedTimestampFlag,
|
|
@@ -8382,7 +8424,7 @@ function createDirectoryRecords(files) {
|
|
|
8382
8424
|
rawExtraFieldZip64,
|
|
8383
8425
|
rawExtraFieldAES,
|
|
8384
8426
|
rawExtraFieldNTFS,
|
|
8385
|
-
|
|
8427
|
+
rawCentralExtraFieldUnix,
|
|
8386
8428
|
rawExtraFieldTimestamp,
|
|
8387
8429
|
rawExtraField,
|
|
8388
8430
|
rawCentralExtraField);
|
|
@@ -8411,7 +8453,7 @@ async function writeDirectoryRecords(zipWriter, directoryDataLength, options) {
|
|
|
8411
8453
|
rawExtraFieldAES,
|
|
8412
8454
|
rawExtraFieldExtendedTimestamp,
|
|
8413
8455
|
rawExtraFieldNTFS,
|
|
8414
|
-
|
|
8456
|
+
rawCentralExtraFieldUnix,
|
|
8415
8457
|
rawExtraField,
|
|
8416
8458
|
rawCentralExtraField,
|
|
8417
8459
|
rawComment,
|
|
@@ -8428,7 +8470,7 @@ async function writeDirectoryRecords(zipWriter, directoryDataLength, options) {
|
|
|
8428
8470
|
uncompressedSize,
|
|
8429
8471
|
compressedSize
|
|
8430
8472
|
} = fileEntry;
|
|
8431
|
-
const extraFieldLength = getLength(rawExtraFieldZip64, rawExtraFieldAES, rawExtraFieldExtendedTimestamp, rawExtraFieldNTFS,
|
|
8473
|
+
const extraFieldLength = getLength(rawExtraFieldZip64, rawExtraFieldAES, rawExtraFieldExtendedTimestamp, rawExtraFieldNTFS, rawCentralExtraFieldUnix, rawExtraField, rawCentralExtraField);
|
|
8432
8474
|
const directoryRecordLength = CENTRAL_FILE_HEADER_LENGTH + getLength(rawFilename, rawComment) + extraFieldLength;
|
|
8433
8475
|
if (exceedsAvailableSize(writer, offset + directoryRecordLength - directoryDiskOffset)) {
|
|
8434
8476
|
await writeData(writer, directoryArray.slice(directoryDiskOffset, offset));
|
|
@@ -8464,7 +8506,7 @@ async function writeDirectoryRecords(zipWriter, directoryDataLength, options) {
|
|
|
8464
8506
|
directoryRecord.writeBytes(rawExtraFieldAES);
|
|
8465
8507
|
directoryRecord.writeBytes(rawExtraFieldExtendedTimestamp);
|
|
8466
8508
|
directoryRecord.writeBytes(rawExtraFieldNTFS);
|
|
8467
|
-
directoryRecord.writeBytes(
|
|
8509
|
+
directoryRecord.writeBytes(rawCentralExtraFieldUnix);
|
|
8468
8510
|
directoryRecord.writeBytes(rawExtraField);
|
|
8469
8511
|
directoryRecord.writeBytes(rawCentralExtraField);
|
|
8470
8512
|
directoryRecord.writeBytes(rawComment);
|
|
@@ -8633,26 +8675,42 @@ function removeExtraFieldZip64(rawExtraField) {
|
|
|
8633
8675
|
return rawExtraField;
|
|
8634
8676
|
}
|
|
8635
8677
|
|
|
8636
|
-
async function copyZipData(zipWriter, reader, entries, directoryOffset) {
|
|
8678
|
+
async function copyZipData(zipWriter, reader, entries, keptEntries, directoryOffset, compact) {
|
|
8637
8679
|
const { writer } = zipWriter;
|
|
8638
8680
|
const entryPositions = new Map();
|
|
8639
|
-
if (writer.closeDisk) {
|
|
8681
|
+
if (writer.closeDisk || compact) {
|
|
8640
8682
|
const sortedEntries = Array.from(entries).sort((firstEntry, secondEntry) =>
|
|
8641
8683
|
getSourceOffset(reader, firstEntry) - getSourceOffset(reader, secondEntry));
|
|
8642
|
-
|
|
8643
|
-
|
|
8644
|
-
|
|
8645
|
-
|
|
8646
|
-
|
|
8647
|
-
|
|
8648
|
-
|
|
8649
|
-
|
|
8650
|
-
|
|
8651
|
-
|
|
8652
|
-
|
|
8653
|
-
|
|
8684
|
+
const regionEnds = getRegionEnds(reader, sortedEntries, directoryOffset);
|
|
8685
|
+
const keptEntrySet = new Set(keptEntries);
|
|
8686
|
+
let copiedOffset = 0;
|
|
8687
|
+
let lastPosition;
|
|
8688
|
+
for (let indexEntry = 0; indexEntry < sortedEntries.length; indexEntry++) {
|
|
8689
|
+
const entry = sortedEntries[indexEntry];
|
|
8690
|
+
if (keptEntrySet.has(entry)) {
|
|
8691
|
+
const sourceOffset = getSourceOffset(reader, entry);
|
|
8692
|
+
if (sourceOffset < copiedOffset) {
|
|
8693
|
+
entryPositions.set(entry, lastPosition);
|
|
8694
|
+
} else {
|
|
8695
|
+
if (!compact) {
|
|
8696
|
+
await copyData(zipWriter, reader, copiedOffset, sourceOffset - copiedOffset);
|
|
8697
|
+
}
|
|
8698
|
+
if (writer.closeDisk && exceedsAvailableSize(writer, await getLocalHeaderLength(reader, sourceOffset))) {
|
|
8699
|
+
await writer.closeDisk();
|
|
8700
|
+
}
|
|
8701
|
+
lastPosition = {
|
|
8702
|
+
offset: getSegmentOffset(zipWriter, writer),
|
|
8703
|
+
diskNumberStart: getDiskNumber(writer)
|
|
8704
|
+
};
|
|
8705
|
+
entryPositions.set(entry, lastPosition);
|
|
8706
|
+
await copyData(zipWriter, reader, sourceOffset, regionEnds[indexEntry] - sourceOffset);
|
|
8707
|
+
copiedOffset = regionEnds[indexEntry];
|
|
8708
|
+
}
|
|
8709
|
+
}
|
|
8710
|
+
}
|
|
8711
|
+
if (!compact) {
|
|
8712
|
+
await copyData(zipWriter, reader, copiedOffset, directoryOffset - copiedOffset);
|
|
8654
8713
|
}
|
|
8655
|
-
await copyData(zipWriter, reader, copiedLength, directoryOffset - copiedLength);
|
|
8656
8714
|
} else {
|
|
8657
8715
|
const baseOffset = zipWriter.offset;
|
|
8658
8716
|
await copyData(zipWriter, reader, 0, directoryOffset);
|
|
@@ -8664,6 +8722,20 @@ async function copyZipData(zipWriter, reader, entries, directoryOffset) {
|
|
|
8664
8722
|
return entryPositions;
|
|
8665
8723
|
}
|
|
8666
8724
|
|
|
8725
|
+
function getRegionEnds(reader, sortedEntries, directoryOffset) {
|
|
8726
|
+
const regionEnds = new Array(sortedEntries.length);
|
|
8727
|
+
let regionEnd = directoryOffset;
|
|
8728
|
+
for (let indexEntry = sortedEntries.length - 1; indexEntry >= 0; indexEntry--) {
|
|
8729
|
+
const sourceOffset = getSourceOffset(reader, sortedEntries[indexEntry]);
|
|
8730
|
+
const nextEntry = sortedEntries[indexEntry + 1];
|
|
8731
|
+
if (nextEntry && getSourceOffset(reader, nextEntry) > sourceOffset) {
|
|
8732
|
+
regionEnd = getSourceOffset(reader, nextEntry);
|
|
8733
|
+
}
|
|
8734
|
+
regionEnds[indexEntry] = regionEnd;
|
|
8735
|
+
}
|
|
8736
|
+
return regionEnds;
|
|
8737
|
+
}
|
|
8738
|
+
|
|
8667
8739
|
async function copyData(zipWriter, reader, offset, size) {
|
|
8668
8740
|
if (size > 0) {
|
|
8669
8741
|
const { writer } = zipWriter;
|
|
@@ -9041,7 +9113,7 @@ function formatSupported(StreamClass, format) {
|
|
|
9041
9113
|
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
9042
9114
|
*/
|
|
9043
9115
|
|
|
9044
|
-
const VERSION = "2.
|
|
9116
|
+
const VERSION = "2.20.0";
|
|
9045
9117
|
|
|
9046
9118
|
/*
|
|
9047
9119
|
Copyright (c) 2025 Gildas Lormeau. All rights reserved.
|
|
@@ -11120,7 +11192,7 @@ function decodeMimeTypes(data) {
|
|
|
11120
11192
|
*/
|
|
11121
11193
|
|
|
11122
11194
|
|
|
11123
|
-
|
|
11195
|
+
g$1(setDefaultConfiguration);
|
|
11124
11196
|
|
|
11125
11197
|
exports.BlobReader = BlobReader;
|
|
11126
11198
|
exports.BlobWriter = BlobWriter;
|
|
@@ -11235,11 +11307,13 @@ exports.WARNING_COMPRESSED_PATCHED_DATA = WARNING_COMPRESSED_PATCHED_DATA;
|
|
|
11235
11307
|
exports.WARNING_COMPRESSION_UNAVAILABLE = WARNING_COMPRESSION_UNAVAILABLE;
|
|
11236
11308
|
exports.WARNING_DUPLICATE_FILENAME = WARNING_DUPLICATE_FILENAME;
|
|
11237
11309
|
exports.WARNING_MALFORMED_EXTRA_FIELD = WARNING_MALFORMED_EXTRA_FIELD;
|
|
11310
|
+
exports.WARNING_MISMATCHED_CENTRAL_DIRECTORY_OFFSET = WARNING_MISMATCHED_CENTRAL_DIRECTORY_OFFSET;
|
|
11238
11311
|
exports.WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG = WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG;
|
|
11239
11312
|
exports.WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD = WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD;
|
|
11240
11313
|
exports.WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES = WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES;
|
|
11241
11314
|
exports.WARNING_MISMATCHED_LOCAL_FILE_HEADER_FILENAME = WARNING_MISMATCHED_LOCAL_FILE_HEADER_FILENAME;
|
|
11242
11315
|
exports.WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY = WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY;
|
|
11316
|
+
exports.WARNING_MISSING_ZIP64_EXTRA_FIELD = WARNING_MISSING_ZIP64_EXTRA_FIELD;
|
|
11243
11317
|
exports.WARNING_MULTIPLE_END_OF_CENTRAL_DIRECTORY = WARNING_MULTIPLE_END_OF_CENTRAL_DIRECTORY;
|
|
11244
11318
|
exports.WARNING_PREPENDED_CENTRAL_DIRECTORY = WARNING_PREPENDED_CENTRAL_DIRECTORY;
|
|
11245
11319
|
exports.WARNING_PREPENDED_DATA = WARNING_PREPENDED_DATA;
|