diff --git a/o2web/source/o2_core/o2.js b/o2web/source/o2_core/o2.js index 6d2a76575a1ddb6a03ac029e0d1f07dbc842a24d..e36e98b24acca58059002fd70b429100d039f34a 100644 --- a/o2web/source/o2_core/o2.js +++ b/o2web/source/o2_core/o2.js @@ -65,7 +65,7 @@ if (!window.Promise){ var _href = window.location.href; var _debug = (_href.indexOf("debugger")!==-1); var _par = _href.substr(_href.lastIndexOf("?")+1, _href.length); - var _lp = "zh-cn"; + var _lp = navigator.language || "zh-cn"; if (_par){ var _parList = _par.split("&"); for (var i=0; i<_parList.length; i++){ @@ -85,6 +85,11 @@ if (!window.Promise){ "isDebugger": _debug, "path": "../o2_core/o2" }; + + this.o2.languageName = _lp; + _lp = _lp.toLocaleLowerCase(); + var supportedLanguages = ["zh-CN", "en"]; + if (supportedLanguages.indexOf(_lp)==-1) _lp = "zh-cn"; this.o2.language = _lp; this.o2.splitStr = /\s*(?:,|;)\s*/; @@ -1486,6 +1491,8 @@ if (!window.Promise){ res.setHeader("Content-Type", "application/json; charset=utf-8"); res.setHeader("Accept", "text/html,application/json,*/*"); + res.setHeader("Accept-Language", o2.languageName); + if (window.layout) { if (layout["debugger"]){ res.setHeader("x-debugger", "true"); diff --git a/o2web/source/o2_core/o2/lp/zh-cn.js b/o2web/source/o2_core/o2/lp/zh-cn.js index 54212caa903b5d30c9c1246ecdac29368d5a4cb2..3adcfea8c3657fef2e9daa5963f1fde2bee30e68 100644 --- a/o2web/source/o2_core/o2/lp/zh-cn.js +++ b/o2web/source/o2_core/o2/lp/zh-cn.js @@ -140,6 +140,7 @@ o2.LP.desktop = { "showMessage": "消息", "logout": "注销", "userConfig": "个人设置", + "userLanguage": "语言设置", "application": "组件", "widget": "小工具", "process": "应用", diff --git a/o2web/source/o2_core/o2/widget/$AttachmentController/icon.json b/o2web/source/o2_core/o2/widget/$AttachmentController/icon.json index 5d22ec41b51acbe622961625b963bc88c04cd87e..cbeccc6aeb7c3af90f1267f868235dd81785ed2f 100644 --- a/o2web/source/o2_core/o2/widget/$AttachmentController/icon.json +++ b/o2web/source/o2_core/o2/widget/$AttachmentController/icon.json @@ -28,26 +28,27 @@ "pot": "pptx_win.png", "potx": "pptx_win.png", "potm": "pptx_win.png", - + "css": "css.png", "mp3": "mp3.png", "wav": "wav.png", "wma": "wma.png", "wmv": "wmv.png", - + "bmp": "bmp.png", "gif": "gif.png", "png": "png.png", "psd": "psd.png", "jpeg": "jpeg.png", "jpg": "jpeg.png", - + "pdf": "pdf.png", "rar": "rar.png", "txt": "text.png", "zip": "zip.png", - + "exe": "exe.png", - + "ofd": "ofd.png", + "unknow": "unknow.png" -} \ No newline at end of file +} diff --git a/o2web/source/o2_core/o2/xDesktop/$Default/lp/en.png b/o2web/source/o2_core/o2/xDesktop/$Default/lp/en.png new file mode 100644 index 0000000000000000000000000000000000000000..e941cfd9cfa42a649046f2b0fd3d80621b9956f6 Binary files /dev/null and b/o2web/source/o2_core/o2/xDesktop/$Default/lp/en.png differ diff --git a/o2web/source/o2_core/o2/xDesktop/$Default/lp/zh-cn.png b/o2web/source/o2_core/o2/xDesktop/$Default/lp/zh-cn.png new file mode 100644 index 0000000000000000000000000000000000000000..d8184b957cf30c3773b61b3a12e876eb3062d0e6 Binary files /dev/null and b/o2web/source/o2_core/o2/xDesktop/$Default/lp/zh-cn.png differ diff --git a/o2web/source/o2_core/o2/xDesktop/Default.js b/o2web/source/o2_core/o2/xDesktop/Default.js index 89440dd3de7f7759d92b3eddbdb5896136eaa733..4feb728c23de3c3ccf24e19a23e10e76f2fd3657 100644 --- a/o2web/source/o2_core/o2/xDesktop/Default.js +++ b/o2web/source/o2_core/o2/xDesktop/Default.js @@ -524,6 +524,13 @@ o2.xDesktop.Default = new Class({ var img = this.path+this.options.style+"/icons/config.png"; this.userMenu.addMenuItem(o2.LP.desktop.userConfig, "click", function(e){this.userConfig(e);}.bind(this), img); + // var lpMenu = new o2.xDesktop.Menu(this.userInforNode, { + // "event": "click", "style": "flatUser", "offsetX": 30, "offsetY":6, "container": this.node + // }); + // + // img = this.path+"/lp/zh-cn.png"; + // var lp = this.userMenu.addMenuMenu(o2.LP.desktop.userLanguage, "click", function(e){this.userConfig(e);}.bind(this), img); + this.userMenu.addMenuLine(); img = this.path+this.options.style+"/icons/logout.png"; diff --git a/o2web/source/o2_lib/jszip/jszip-utils.min.js b/o2web/source/o2_lib/jszip/jszip-utils.min.js new file mode 100644 index 0000000000000000000000000000000000000000..5a7fdc8e66a7d43ed68d64fadb9ecb9255619d0e --- /dev/null +++ b/o2web/source/o2_lib/jszip/jszip-utils.min.js @@ -0,0 +1 @@ +!function(e){"object"==typeof exports?module.exports=e():"function"==typeof define&&define.amd?define(e):"undefined"!=typeof window?window.JSZipUtils=e():"undefined"!=typeof global?global.JSZipUtils=e():"undefined"!=typeof self&&(self.JSZipUtils=e())}(function(){var define,module,exports;return(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a){return a(o,!0)}if(i){return i(o,!0)}throw new Error("Cannot find module '"+o+"'")}var f=n[o]={exports:{}};t[o][0].call(f.exports,function(e){var n=t[o][1][e];return s(n?n:e)},f,f.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o + +(c) 2009-2016 Stuart Knightley +Dual licenced under the MIT license or GPLv3. See https://raw.github.com/Stuk/jszip/master/LICENSE.markdown. + +JSZip uses the library pako released under the MIT license : +https://github.com/nodeca/pako/blob/master/LICENSE +*/ + +!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{("undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this).JSZip=e()}}(function(){return function s(a,o,u){function h(r,e){if(!o[r]){if(!a[r]){var t="function"==typeof require&&require;if(!e&&t)return t(r,!0);if(f)return f(r,!0);var n=new Error("Cannot find module '"+r+"'");throw n.code="MODULE_NOT_FOUND",n}var i=o[r]={exports:{}};a[r][0].call(i.exports,function(e){var t=a[r][1][e];return h(t||e)},i,i.exports,s,a,o,u)}return o[r].exports}for(var f="function"==typeof require&&require,e=0;e>2,s=(3&t)<<4|r>>4,a=1>6:64,o=2>4,r=(15&i)<<4|(s=p.indexOf(e.charAt(o++)))>>2,n=(3&s)<<6|(a=p.indexOf(e.charAt(o++))),h[u++]=t,64!==s&&(h[u++]=r),64!==a&&(h[u++]=n);return h}},{"./support":30,"./utils":32}],2:[function(e,t,r){"use strict";var n=e("./external"),i=e("./stream/DataWorker"),s=e("./stream/Crc32Probe"),a=e("./stream/DataLengthProbe");function o(e,t,r,n,i){this.compressedSize=e,this.uncompressedSize=t,this.crc32=r,this.compression=n,this.compressedContent=i}o.prototype={getContentWorker:function(){var e=new i(n.Promise.resolve(this.compressedContent)).pipe(this.compression.uncompressWorker()).pipe(new a("data_length")),t=this;return e.on("end",function(){if(this.streamInfo.data_length!==t.uncompressedSize)throw new Error("Bug : uncompressed data size mismatch")}),e},getCompressedWorker:function(){return new i(n.Promise.resolve(this.compressedContent)).withStreamInfo("compressedSize",this.compressedSize).withStreamInfo("uncompressedSize",this.uncompressedSize).withStreamInfo("crc32",this.crc32).withStreamInfo("compression",this.compression)}},o.createWorkerFrom=function(e,t,r){return e.pipe(new s).pipe(new a("uncompressedSize")).pipe(t.compressWorker(r)).pipe(new a("compressedSize")).withStreamInfo("compression",t)},t.exports=o},{"./external":6,"./stream/Crc32Probe":25,"./stream/DataLengthProbe":26,"./stream/DataWorker":27}],3:[function(e,t,r){"use strict";var n=e("./stream/GenericWorker");r.STORE={magic:"\0\0",compressWorker:function(e){return new n("STORE compression")},uncompressWorker:function(){return new n("STORE decompression")}},r.DEFLATE=e("./flate")},{"./flate":7,"./stream/GenericWorker":28}],4:[function(e,t,r){"use strict";var n=e("./utils"),a=function(){for(var e,t=[],r=0;r<256;r++){e=r;for(var n=0;n<8;n++)e=1&e?3988292384^e>>>1:e>>>1;t[r]=e}return t}();t.exports=function(e,t){return void 0!==e&&e.length?"string"!==n.getTypeOf(e)?function(e,t,r){var n=a,i=0+r;e^=-1;for(var s=0;s>>8^n[255&(e^t[s])];return-1^e}(0|t,e,e.length):function(e,t,r){var n=a,i=0+r;e^=-1;for(var s=0;s>>8^n[255&(e^t.charCodeAt(s))];return-1^e}(0|t,e,e.length):0}},{"./utils":32}],5:[function(e,t,r){"use strict";r.base64=!1,r.binary=!1,r.dir=!1,r.createFolders=!0,r.date=null,r.compression=null,r.compressionOptions=null,r.comment=null,r.unixPermissions=null,r.dosPermissions=null},{}],6:[function(e,t,r){"use strict";var n;n="undefined"!=typeof Promise?Promise:e("lie"),t.exports={Promise:n}},{lie:37}],7:[function(e,t,r){"use strict";var n="undefined"!=typeof Uint8Array&&"undefined"!=typeof Uint16Array&&"undefined"!=typeof Uint32Array,i=e("pako"),s=e("./utils"),a=e("./stream/GenericWorker"),o=n?"uint8array":"array";function u(e,t){a.call(this,"FlateWorker/"+e),this._pako=null,this._pakoAction=e,this._pakoOptions=t,this.meta={}}r.magic="\b\0",s.inherits(u,a),u.prototype.processChunk=function(e){this.meta=e.meta,null===this._pako&&this._createPako(),this._pako.push(s.transformTo(o,e.data),!1)},u.prototype.flush=function(){a.prototype.flush.call(this),null===this._pako&&this._createPako(),this._pako.push([],!0)},u.prototype.cleanUp=function(){a.prototype.cleanUp.call(this),this._pako=null},u.prototype._createPako=function(){this._pako=new i[this._pakoAction]({raw:!0,level:this._pakoOptions.level||-1});var t=this;this._pako.onData=function(e){t.push({data:e,meta:t.meta})}},r.compressWorker=function(e){return new u("Deflate",e)},r.uncompressWorker=function(){return new u("Inflate",{})}},{"./stream/GenericWorker":28,"./utils":32,pako:38}],8:[function(e,t,r){"use strict";function I(e,t){var r,n="";for(r=0;r>>=8;return n}function i(e,t,r,n,i,s){var a,o,u=e.file,h=e.compression,f=s!==B.utf8encode,l=O.transformTo("string",s(u.name)),d=O.transformTo("string",B.utf8encode(u.name)),c=u.comment,p=O.transformTo("string",s(c)),m=O.transformTo("string",B.utf8encode(c)),_=d.length!==u.name.length,g=m.length!==c.length,v="",b="",w="",y=u.dir,k=u.date,x={crc32:0,compressedSize:0,uncompressedSize:0};t&&!r||(x.crc32=e.crc32,x.compressedSize=e.compressedSize,x.uncompressedSize=e.uncompressedSize);var S=0;t&&(S|=8),f||!_&&!g||(S|=2048);var z,E=0,C=0;y&&(E|=16),"UNIX"===i?(C=798,E|=((z=u.unixPermissions)||(z=y?16893:33204),(65535&z)<<16)):(C=20,E|=63&(u.dosPermissions||0)),a=k.getUTCHours(),a<<=6,a|=k.getUTCMinutes(),a<<=5,a|=k.getUTCSeconds()/2,o=k.getUTCFullYear()-1980,o<<=4,o|=k.getUTCMonth()+1,o<<=5,o|=k.getUTCDate(),_&&(v+="up"+I((b=I(1,1)+I(T(l),4)+d).length,2)+b),g&&(v+="uc"+I((w=I(1,1)+I(T(p),4)+m).length,2)+w);var A="";return A+="\n\0",A+=I(S,2),A+=h.magic,A+=I(a,2),A+=I(o,2),A+=I(x.crc32,4),A+=I(x.compressedSize,4),A+=I(x.uncompressedSize,4),A+=I(l.length,2),A+=I(v.length,2),{fileRecord:R.LOCAL_FILE_HEADER+A+l+v,dirRecord:R.CENTRAL_FILE_HEADER+I(C,2)+A+I(p.length,2)+"\0\0\0\0"+I(E,4)+I(n,4)+l+v+p}}var O=e("../utils"),s=e("../stream/GenericWorker"),B=e("../utf8"),T=e("../crc32"),R=e("../signature");function n(e,t,r,n){s.call(this,"ZipFileWorker"),this.bytesWritten=0,this.zipComment=t,this.zipPlatform=r,this.encodeFileName=n,this.streamFiles=e,this.accumulate=!1,this.contentBuffer=[],this.dirRecords=[],this.currentSourceOffset=0,this.entriesCount=0,this.currentFile=null,this._sources=[]}O.inherits(n,s),n.prototype.push=function(e){var t=e.meta.percent||0,r=this.entriesCount,n=this._sources.length;this.accumulate?this.contentBuffer.push(e):(this.bytesWritten+=e.data.length,s.prototype.push.call(this,{data:e.data,meta:{currentFile:this.currentFile,percent:r?(t+100*(r-n-1))/r:100}}))},n.prototype.openedSource=function(e){this.currentSourceOffset=this.bytesWritten,this.currentFile=e.file.name;var t=this.streamFiles&&!e.file.dir;if(t){var r=i(e,t,!1,this.currentSourceOffset,this.zipPlatform,this.encodeFileName);this.push({data:r.fileRecord,meta:{percent:0}})}else this.accumulate=!0},n.prototype.closedSource=function(e){this.accumulate=!1;var t,r=this.streamFiles&&!e.file.dir,n=i(e,r,!0,this.currentSourceOffset,this.zipPlatform,this.encodeFileName);if(this.dirRecords.push(n.dirRecord),r)this.push({data:(t=e,R.DATA_DESCRIPTOR+I(t.crc32,4)+I(t.compressedSize,4)+I(t.uncompressedSize,4)),meta:{percent:100}});else for(this.push({data:n.fileRecord,meta:{percent:0}});this.contentBuffer.length;)this.push(this.contentBuffer.shift());this.currentFile=null},n.prototype.flush=function(){for(var e=this.bytesWritten,t=0;t=this.index;t--)r=(r<<8)+this.byteAt(t);return this.index+=e,r},readString:function(e){return n.transformTo("string",this.readData(e))},readData:function(e){},lastIndexOfSignature:function(e){},readAndCheckSignature:function(e){},readDate:function(){var e=this.readInt(4);return new Date(Date.UTC(1980+(e>>25&127),(e>>21&15)-1,e>>16&31,e>>11&31,e>>5&63,(31&e)<<1))}},t.exports=i},{"../utils":32}],19:[function(e,t,r){"use strict";var n=e("./Uint8ArrayReader");function i(e){n.call(this,e)}e("../utils").inherits(i,n),i.prototype.readData=function(e){this.checkOffset(e);var t=this.data.slice(this.zero+this.index,this.zero+this.index+e);return this.index+=e,t},t.exports=i},{"../utils":32,"./Uint8ArrayReader":21}],20:[function(e,t,r){"use strict";var n=e("./DataReader");function i(e){n.call(this,e)}e("../utils").inherits(i,n),i.prototype.byteAt=function(e){return this.data.charCodeAt(this.zero+e)},i.prototype.lastIndexOfSignature=function(e){return this.data.lastIndexOf(e)-this.zero},i.prototype.readAndCheckSignature=function(e){return e===this.readData(4)},i.prototype.readData=function(e){this.checkOffset(e);var t=this.data.slice(this.zero+this.index,this.zero+this.index+e);return this.index+=e,t},t.exports=i},{"../utils":32,"./DataReader":18}],21:[function(e,t,r){"use strict";var n=e("./ArrayReader");function i(e){n.call(this,e)}e("../utils").inherits(i,n),i.prototype.readData=function(e){if(this.checkOffset(e),0===e)return new Uint8Array(0);var t=this.data.subarray(this.zero+this.index,this.zero+this.index+e);return this.index+=e,t},t.exports=i},{"../utils":32,"./ArrayReader":17}],22:[function(e,t,r){"use strict";var n=e("../utils"),i=e("../support"),s=e("./ArrayReader"),a=e("./StringReader"),o=e("./NodeBufferReader"),u=e("./Uint8ArrayReader");t.exports=function(e){var t=n.getTypeOf(e);return n.checkSupport(t),"string"!==t||i.uint8array?"nodebuffer"===t?new o(e):i.uint8array?new u(n.transformTo("uint8array",e)):new s(n.transformTo("array",e)):new a(e)}},{"../support":30,"../utils":32,"./ArrayReader":17,"./NodeBufferReader":19,"./StringReader":20,"./Uint8ArrayReader":21}],23:[function(e,t,r){"use strict";r.LOCAL_FILE_HEADER="PK",r.CENTRAL_FILE_HEADER="PK",r.CENTRAL_DIRECTORY_END="PK",r.ZIP64_CENTRAL_DIRECTORY_LOCATOR="PK",r.ZIP64_CENTRAL_DIRECTORY_END="PK",r.DATA_DESCRIPTOR="PK\b"},{}],24:[function(e,t,r){"use strict";var n=e("./GenericWorker"),i=e("../utils");function s(e){n.call(this,"ConvertWorker to "+e),this.destType=e}i.inherits(s,n),s.prototype.processChunk=function(e){this.push({data:i.transformTo(this.destType,e.data),meta:e.meta})},t.exports=s},{"../utils":32,"./GenericWorker":28}],25:[function(e,t,r){"use strict";var n=e("./GenericWorker"),i=e("../crc32");function s(){n.call(this,"Crc32Probe"),this.withStreamInfo("crc32",0)}e("../utils").inherits(s,n),s.prototype.processChunk=function(e){this.streamInfo.crc32=i(e.data,this.streamInfo.crc32||0),this.push(e)},t.exports=s},{"../crc32":4,"../utils":32,"./GenericWorker":28}],26:[function(e,t,r){"use strict";var n=e("../utils"),i=e("./GenericWorker");function s(e){i.call(this,"DataLengthProbe for "+e),this.propName=e,this.withStreamInfo(e,0)}n.inherits(s,i),s.prototype.processChunk=function(e){if(e){var t=this.streamInfo[this.propName]||0;this.streamInfo[this.propName]=t+e.data.length}i.prototype.processChunk.call(this,e)},t.exports=s},{"../utils":32,"./GenericWorker":28}],27:[function(e,t,r){"use strict";var n=e("../utils"),i=e("./GenericWorker");function s(e){i.call(this,"DataWorker");var t=this;this.dataIsReady=!1,this.index=0,this.max=0,this.data=null,this.type="",this._tickScheduled=!1,e.then(function(e){t.dataIsReady=!0,t.data=e,t.max=e&&e.length||0,t.type=n.getTypeOf(e),t.isPaused||t._tickAndRepeat()},function(e){t.error(e)})}n.inherits(s,i),s.prototype.cleanUp=function(){i.prototype.cleanUp.call(this),this.data=null},s.prototype.resume=function(){return!!i.prototype.resume.call(this)&&(!this._tickScheduled&&this.dataIsReady&&(this._tickScheduled=!0,n.delay(this._tickAndRepeat,[],this)),!0)},s.prototype._tickAndRepeat=function(){this._tickScheduled=!1,this.isPaused||this.isFinished||(this._tick(),this.isFinished||(n.delay(this._tickAndRepeat,[],this),this._tickScheduled=!0))},s.prototype._tick=function(){if(this.isPaused||this.isFinished)return!1;var e=null,t=Math.min(this.max,this.index+16384);if(this.index>=this.max)return this.end();switch(this.type){case"string":e=this.data.substring(this.index,t);break;case"uint8array":e=this.data.subarray(this.index,t);break;case"array":case"nodebuffer":e=this.data.slice(this.index,t)}return this.index=t,this.push({data:e,meta:{percent:this.max?this.index/this.max*100:0}})},t.exports=s},{"../utils":32,"./GenericWorker":28}],28:[function(e,t,r){"use strict";function n(e){this.name=e||"default",this.streamInfo={},this.generatedError=null,this.extraStreamInfo={},this.isPaused=!0,this.isFinished=!1,this.isLocked=!1,this._listeners={data:[],end:[],error:[]},this.previous=null}n.prototype={push:function(e){this.emit("data",e)},end:function(){if(this.isFinished)return!1;this.flush();try{this.emit("end"),this.cleanUp(),this.isFinished=!0}catch(e){this.emit("error",e)}return!0},error:function(e){return!this.isFinished&&(this.isPaused?this.generatedError=e:(this.isFinished=!0,this.emit("error",e),this.previous&&this.previous.error(e),this.cleanUp()),!0)},on:function(e,t){return this._listeners[e].push(t),this},cleanUp:function(){this.streamInfo=this.generatedError=this.extraStreamInfo=null,this._listeners=[]},emit:function(e,t){if(this._listeners[e])for(var r=0;r "+e:e}},t.exports=n},{}],29:[function(e,t,r){"use strict";var h=e("../utils"),i=e("./ConvertWorker"),s=e("./GenericWorker"),f=e("../base64"),n=e("../support"),a=e("../external"),o=null;if(n.nodestream)try{o=e("../nodejs/NodejsStreamOutputAdapter")}catch(e){}function u(e,t,r){var n=t;switch(t){case"blob":case"arraybuffer":n="uint8array";break;case"base64":n="string"}try{this._internalType=n,this._outputType=t,this._mimeType=r,h.checkSupport(n),this._worker=e.pipe(new i(n)),e.lock()}catch(e){this._worker=new s("error"),this._worker.error(e)}}u.prototype={accumulate:function(e){return o=this,u=e,new a.Promise(function(t,r){var n=[],i=o._internalType,s=o._outputType,a=o._mimeType;o.on("data",function(e,t){n.push(e),u&&u(t)}).on("error",function(e){n=[],r(e)}).on("end",function(){try{var e=function(e,t,r){switch(e){case"blob":return h.newBlob(h.transformTo("arraybuffer",t),r);case"base64":return f.encode(t);default:return h.transformTo(e,t)}}(s,function(e,t){var r,n=0,i=null,s=0;for(r=0;r>>6:(r<65536?t[s++]=224|r>>>12:(t[s++]=240|r>>>18,t[s++]=128|r>>>12&63),t[s++]=128|r>>>6&63),t[s++]=128|63&r);return t}(e)},s.utf8decode=function(e){return u.nodebuffer?o.transformTo("nodebuffer",e).toString("utf-8"):function(e){var t,r,n,i,s=e.length,a=new Array(2*s);for(t=r=0;t>10&1023,a[r++]=56320|1023&n)}return a.length!==r&&(a.subarray?a=a.subarray(0,r):a.length=r),o.applyFromCharCode(a)}(e=o.transformTo(u.uint8array?"uint8array":"array",e))},o.inherits(a,n),a.prototype.processChunk=function(e){var t=o.transformTo(u.uint8array?"uint8array":"array",e.data);if(this.leftOver&&this.leftOver.length){if(u.uint8array){var r=t;(t=new Uint8Array(r.length+this.leftOver.length)).set(this.leftOver,0),t.set(r,this.leftOver.length)}else t=this.leftOver.concat(t);this.leftOver=null}var n=function(e,t){var r;for((t=t||e.length)>e.length&&(t=e.length),r=t-1;0<=r&&128==(192&e[r]);)r--;return r<0?t:0===r?t:r+h[e[r]]>t?r:t}(t),i=t;n!==t.length&&(u.uint8array?(i=t.subarray(0,n),this.leftOver=t.subarray(n,t.length)):(i=t.slice(0,n),this.leftOver=t.slice(n,t.length))),this.push({data:s.utf8decode(i),meta:e.meta})},a.prototype.flush=function(){this.leftOver&&this.leftOver.length&&(this.push({data:s.utf8decode(this.leftOver),meta:{}}),this.leftOver=null)},s.Utf8DecodeWorker=a,o.inherits(f,n),f.prototype.processChunk=function(e){this.push({data:s.utf8encode(e.data),meta:e.meta})},s.Utf8EncodeWorker=f},{"./nodejsUtils":14,"./stream/GenericWorker":28,"./support":30,"./utils":32}],32:[function(e,t,o){"use strict";var u=e("./support"),h=e("./base64"),r=e("./nodejsUtils"),n=e("set-immediate-shim"),f=e("./external");function i(e){return e}function l(e,t){for(var r=0;r>8;this.dir=!!(16&this.externalFileAttributes),0==e&&(this.dosPermissions=63&this.externalFileAttributes),3==e&&(this.unixPermissions=this.externalFileAttributes>>16&65535),this.dir||"/"!==this.fileNameStr.slice(-1)||(this.dir=!0)},parseZIP64ExtraField:function(e){if(this.extraFields[1]){var t=n(this.extraFields[1].value);this.uncompressedSize===s.MAX_VALUE_32BITS&&(this.uncompressedSize=t.readInt(8)),this.compressedSize===s.MAX_VALUE_32BITS&&(this.compressedSize=t.readInt(8)),this.localHeaderOffset===s.MAX_VALUE_32BITS&&(this.localHeaderOffset=t.readInt(8)),this.diskNumberStart===s.MAX_VALUE_32BITS&&(this.diskNumberStart=t.readInt(4))}},readExtraFields:function(e){var t,r,n,i=e.index+this.extraFieldsLength;for(this.extraFields||(this.extraFields={});e.index+4>>6:(r<65536?t[s++]=224|r>>>12:(t[s++]=240|r>>>18,t[s++]=128|r>>>12&63),t[s++]=128|r>>>6&63),t[s++]=128|63&r);return t},r.buf2binstring=function(e){return f(e,e.length)},r.binstring2buf=function(e){for(var t=new u.Buf8(e.length),r=0,n=t.length;r>10&1023,o[n++]=56320|1023&i)}return f(o,n)},r.utf8border=function(e,t){var r;for((t=t||e.length)>e.length&&(t=e.length),r=t-1;0<=r&&128==(192&e[r]);)r--;return r<0?t:0===r?t:r+h[e[r]]>t?r:t}},{"./common":41}],43:[function(e,t,r){"use strict";t.exports=function(e,t,r,n){for(var i=65535&e|0,s=e>>>16&65535|0,a=0;0!==r;){for(r-=a=2e3>>1:e>>>1;t[r]=e}return t}();t.exports=function(e,t,r,n){var i=o,s=n+r;e^=-1;for(var a=n;a>>8^i[255&(e^t[a])];return-1^e}},{}],46:[function(e,t,r){"use strict";var u,d=e("../utils/common"),h=e("./trees"),c=e("./adler32"),p=e("./crc32"),n=e("./messages"),f=0,l=0,m=-2,i=2,_=8,s=286,a=30,o=19,g=2*s+1,v=15,b=3,w=258,y=w+b+1,k=42,x=113;function S(e,t){return e.msg=n[t],t}function z(e){return(e<<1)-(4e.avail_out&&(r=e.avail_out),0!==r&&(d.arraySet(e.output,t.pending_buf,t.pending_out,r,e.next_out),e.next_out+=r,t.pending_out+=r,e.total_out+=r,e.avail_out-=r,t.pending-=r,0===t.pending&&(t.pending_out=0))}function A(e,t){h._tr_flush_block(e,0<=e.block_start?e.block_start:-1,e.strstart-e.block_start,t),e.block_start=e.strstart,C(e.strm)}function I(e,t){e.pending_buf[e.pending++]=t}function O(e,t){e.pending_buf[e.pending++]=t>>>8&255,e.pending_buf[e.pending++]=255&t}function B(e,t){var r,n,i=e.max_chain_length,s=e.strstart,a=e.prev_length,o=e.nice_match,u=e.strstart>e.w_size-y?e.strstart-(e.w_size-y):0,h=e.window,f=e.w_mask,l=e.prev,d=e.strstart+w,c=h[s+a-1],p=h[s+a];e.prev_length>=e.good_match&&(i>>=2),o>e.lookahead&&(o=e.lookahead);do{if(h[(r=t)+a]===p&&h[r+a-1]===c&&h[r]===h[s]&&h[++r]===h[s+1]){s+=2,r++;do{}while(h[++s]===h[++r]&&h[++s]===h[++r]&&h[++s]===h[++r]&&h[++s]===h[++r]&&h[++s]===h[++r]&&h[++s]===h[++r]&&h[++s]===h[++r]&&h[++s]===h[++r]&&su&&0!=--i);return a<=e.lookahead?a:e.lookahead}function T(e){var t,r,n,i,s,a,o,u,h,f,l=e.w_size;do{if(i=e.window_size-e.lookahead-e.strstart,e.strstart>=l+(l-y)){for(d.arraySet(e.window,e.window,l,l,0),e.match_start-=l,e.strstart-=l,e.block_start-=l,t=r=e.hash_size;n=e.head[--t],e.head[t]=l<=n?n-l:0,--r;);for(t=r=l;n=e.prev[--t],e.prev[t]=l<=n?n-l:0,--r;);i+=l}if(0===e.strm.avail_in)break;if(a=e.strm,o=e.window,u=e.strstart+e.lookahead,f=void 0,(h=i)<(f=a.avail_in)&&(f=h),r=0===f?0:(a.avail_in-=f,d.arraySet(o,a.input,a.next_in,f,u),1===a.state.wrap?a.adler=c(a.adler,o,f,u):2===a.state.wrap&&(a.adler=p(a.adler,o,f,u)),a.next_in+=f,a.total_in+=f,f),e.lookahead+=r,e.lookahead+e.insert>=b)for(s=e.strstart-e.insert,e.ins_h=e.window[s],e.ins_h=(e.ins_h<=b&&(e.ins_h=(e.ins_h<=b)if(n=h._tr_tally(e,e.strstart-e.match_start,e.match_length-b),e.lookahead-=e.match_length,e.match_length<=e.max_lazy_match&&e.lookahead>=b){for(e.match_length--;e.strstart++,e.ins_h=(e.ins_h<=b&&(e.ins_h=(e.ins_h<=b&&e.match_length<=e.prev_length){for(i=e.strstart+e.lookahead-b,n=h._tr_tally(e,e.strstart-1-e.prev_match,e.prev_length-b),e.lookahead-=e.prev_length-1,e.prev_length-=2;++e.strstart<=i&&(e.ins_h=(e.ins_h<e.pending_buf_size-5&&(r=e.pending_buf_size-5);;){if(e.lookahead<=1){if(T(e),0===e.lookahead&&t===f)return 1;if(0===e.lookahead)break}e.strstart+=e.lookahead,e.lookahead=0;var n=e.block_start+r;if((0===e.strstart||e.strstart>=n)&&(e.lookahead=e.strstart-n,e.strstart=n,A(e,!1),0===e.strm.avail_out))return 1;if(e.strstart-e.block_start>=e.w_size-y&&(A(e,!1),0===e.strm.avail_out))return 1}return e.insert=0,4===t?(A(e,!0),0===e.strm.avail_out?3:4):(e.strstart>e.block_start&&(A(e,!1),e.strm.avail_out),1)}),new F(4,4,8,4,R),new F(4,5,16,8,R),new F(4,6,32,32,R),new F(4,4,16,16,D),new F(8,16,32,32,D),new F(8,16,128,128,D),new F(8,32,128,256,D),new F(32,128,258,1024,D),new F(32,258,258,4096,D)],r.deflateInit=function(e,t){return L(e,t,_,15,8,0)},r.deflateInit2=L,r.deflateReset=P,r.deflateResetKeep=U,r.deflateSetHeader=function(e,t){return e&&e.state?2!==e.state.wrap?m:(e.state.gzhead=t,l):m},r.deflate=function(e,t){var r,n,i,s;if(!e||!e.state||5>8&255),I(n,n.gzhead.time>>16&255),I(n,n.gzhead.time>>24&255),I(n,9===n.level?2:2<=n.strategy||n.level<2?4:0),I(n,255&n.gzhead.os),n.gzhead.extra&&n.gzhead.extra.length&&(I(n,255&n.gzhead.extra.length),I(n,n.gzhead.extra.length>>8&255)),n.gzhead.hcrc&&(e.adler=p(e.adler,n.pending_buf,n.pending,0)),n.gzindex=0,n.status=69):(I(n,0),I(n,0),I(n,0),I(n,0),I(n,0),I(n,9===n.level?2:2<=n.strategy||n.level<2?4:0),I(n,3),n.status=x);else{var a=_+(n.w_bits-8<<4)<<8;a|=(2<=n.strategy||n.level<2?0:n.level<6?1:6===n.level?2:3)<<6,0!==n.strstart&&(a|=32),a+=31-a%31,n.status=x,O(n,a),0!==n.strstart&&(O(n,e.adler>>>16),O(n,65535&e.adler)),e.adler=1}if(69===n.status)if(n.gzhead.extra){for(i=n.pending;n.gzindex<(65535&n.gzhead.extra.length)&&(n.pending!==n.pending_buf_size||(n.gzhead.hcrc&&n.pending>i&&(e.adler=p(e.adler,n.pending_buf,n.pending-i,i)),C(e),i=n.pending,n.pending!==n.pending_buf_size));)I(n,255&n.gzhead.extra[n.gzindex]),n.gzindex++;n.gzhead.hcrc&&n.pending>i&&(e.adler=p(e.adler,n.pending_buf,n.pending-i,i)),n.gzindex===n.gzhead.extra.length&&(n.gzindex=0,n.status=73)}else n.status=73;if(73===n.status)if(n.gzhead.name){i=n.pending;do{if(n.pending===n.pending_buf_size&&(n.gzhead.hcrc&&n.pending>i&&(e.adler=p(e.adler,n.pending_buf,n.pending-i,i)),C(e),i=n.pending,n.pending===n.pending_buf_size)){s=1;break}s=n.gzindexi&&(e.adler=p(e.adler,n.pending_buf,n.pending-i,i)),0===s&&(n.gzindex=0,n.status=91)}else n.status=91;if(91===n.status)if(n.gzhead.comment){i=n.pending;do{if(n.pending===n.pending_buf_size&&(n.gzhead.hcrc&&n.pending>i&&(e.adler=p(e.adler,n.pending_buf,n.pending-i,i)),C(e),i=n.pending,n.pending===n.pending_buf_size)){s=1;break}s=n.gzindexi&&(e.adler=p(e.adler,n.pending_buf,n.pending-i,i)),0===s&&(n.status=103)}else n.status=103;if(103===n.status&&(n.gzhead.hcrc?(n.pending+2>n.pending_buf_size&&C(e),n.pending+2<=n.pending_buf_size&&(I(n,255&e.adler),I(n,e.adler>>8&255),e.adler=0,n.status=x)):n.status=x),0!==n.pending){if(C(e),0===e.avail_out)return n.last_flush=-1,l}else if(0===e.avail_in&&z(t)<=z(r)&&4!==t)return S(e,-5);if(666===n.status&&0!==e.avail_in)return S(e,-5);if(0!==e.avail_in||0!==n.lookahead||t!==f&&666!==n.status){var o=2===n.strategy?function(e,t){for(var r;;){if(0===e.lookahead&&(T(e),0===e.lookahead)){if(t===f)return 1;break}if(e.match_length=0,r=h._tr_tally(e,0,e.window[e.strstart]),e.lookahead--,e.strstart++,r&&(A(e,!1),0===e.strm.avail_out))return 1}return e.insert=0,4===t?(A(e,!0),0===e.strm.avail_out?3:4):e.last_lit&&(A(e,!1),0===e.strm.avail_out)?1:2}(n,t):3===n.strategy?function(e,t){for(var r,n,i,s,a=e.window;;){if(e.lookahead<=w){if(T(e),e.lookahead<=w&&t===f)return 1;if(0===e.lookahead)break}if(e.match_length=0,e.lookahead>=b&&0e.lookahead&&(e.match_length=e.lookahead)}if(e.match_length>=b?(r=h._tr_tally(e,1,e.match_length-b),e.lookahead-=e.match_length,e.strstart+=e.match_length,e.match_length=0):(r=h._tr_tally(e,0,e.window[e.strstart]),e.lookahead--,e.strstart++),r&&(A(e,!1),0===e.strm.avail_out))return 1}return e.insert=0,4===t?(A(e,!0),0===e.strm.avail_out?3:4):e.last_lit&&(A(e,!1),0===e.strm.avail_out)?1:2}(n,t):u[n.level].func(n,t);if(3!==o&&4!==o||(n.status=666),1===o||3===o)return 0===e.avail_out&&(n.last_flush=-1),l;if(2===o&&(1===t?h._tr_align(n):5!==t&&(h._tr_stored_block(n,0,0,!1),3===t&&(E(n.head),0===n.lookahead&&(n.strstart=0,n.block_start=0,n.insert=0))),C(e),0===e.avail_out))return n.last_flush=-1,l}return 4!==t?l:n.wrap<=0?1:(2===n.wrap?(I(n,255&e.adler),I(n,e.adler>>8&255),I(n,e.adler>>16&255),I(n,e.adler>>24&255),I(n,255&e.total_in),I(n,e.total_in>>8&255),I(n,e.total_in>>16&255),I(n,e.total_in>>24&255)):(O(n,e.adler>>>16),O(n,65535&e.adler)),C(e),0=r.w_size&&(0===s&&(E(r.head),r.strstart=0,r.block_start=0,r.insert=0),h=new d.Buf8(r.w_size),d.arraySet(h,t,f-r.w_size,r.w_size,0),t=h,f=r.w_size),a=e.avail_in,o=e.next_in,u=e.input,e.avail_in=f,e.next_in=0,e.input=t,T(r);r.lookahead>=b;){for(n=r.strstart,i=r.lookahead-(b-1);r.ins_h=(r.ins_h<>>=w=b>>>24,p-=w,0==(w=b>>>16&255))E[s++]=65535&b;else{if(!(16&w)){if(0==(64&w)){b=m[(65535&b)+(c&(1<>>=w,p-=w),p<15&&(c+=z[n++]<>>=w=b>>>24,p-=w,!(16&(w=b>>>16&255))){if(0==(64&w)){b=_[(65535&b)+(c&(1<>>=w,p-=w,(w=s-a)>3,c&=(1<<(p-=y<<3))-1,e.next_in=n,e.next_out=s,e.avail_in=n>>24&255)+(e>>>8&65280)+((65280&e)<<8)+((255&e)<<24)}function s(){this.mode=0,this.last=!1,this.wrap=0,this.havedict=!1,this.flags=0,this.dmax=0,this.check=0,this.total=0,this.head=null,this.wbits=0,this.wsize=0,this.whave=0,this.wnext=0,this.window=null,this.hold=0,this.bits=0,this.length=0,this.offset=0,this.extra=0,this.lencode=null,this.distcode=null,this.lenbits=0,this.distbits=0,this.ncode=0,this.nlen=0,this.ndist=0,this.have=0,this.next=null,this.lens=new I.Buf16(320),this.work=new I.Buf16(288),this.lendyn=null,this.distdyn=null,this.sane=0,this.back=0,this.was=0}function a(e){var t;return e&&e.state?(t=e.state,e.total_in=e.total_out=t.total=0,e.msg="",t.wrap&&(e.adler=1&t.wrap),t.mode=P,t.last=0,t.havedict=0,t.dmax=32768,t.head=null,t.hold=0,t.bits=0,t.lencode=t.lendyn=new I.Buf32(n),t.distcode=t.distdyn=new I.Buf32(i),t.sane=1,t.back=-1,N):U}function o(e){var t;return e&&e.state?((t=e.state).wsize=0,t.whave=0,t.wnext=0,a(e)):U}function u(e,t){var r,n;return e&&e.state?(n=e.state,t<0?(r=0,t=-t):(r=1+(t>>4),t<48&&(t&=15)),t&&(t<8||15=s.wsize?(I.arraySet(s.window,t,r-s.wsize,s.wsize,0),s.wnext=0,s.whave=s.wsize):(n<(i=s.wsize-s.wnext)&&(i=n),I.arraySet(s.window,t,r-n,i,s.wnext),(n-=i)?(I.arraySet(s.window,t,r-n,n,0),s.wnext=n,s.whave=s.wsize):(s.wnext+=i,s.wnext===s.wsize&&(s.wnext=0),s.whave>>8&255,r.check=B(r.check,C,2,0),f=h=0,r.mode=2;break}if(r.flags=0,r.head&&(r.head.done=!1),!(1&r.wrap)||(((255&h)<<8)+(h>>8))%31){e.msg="incorrect header check",r.mode=30;break}if(8!=(15&h)){e.msg="unknown compression method",r.mode=30;break}if(f-=4,k=8+(15&(h>>>=4)),0===r.wbits)r.wbits=k;else if(k>r.wbits){e.msg="invalid window size",r.mode=30;break}r.dmax=1<>8&1),512&r.flags&&(C[0]=255&h,C[1]=h>>>8&255,r.check=B(r.check,C,2,0)),f=h=0,r.mode=3;case 3:for(;f<32;){if(0===o)break e;o--,h+=n[s++]<>>8&255,C[2]=h>>>16&255,C[3]=h>>>24&255,r.check=B(r.check,C,4,0)),f=h=0,r.mode=4;case 4:for(;f<16;){if(0===o)break e;o--,h+=n[s++]<>8),512&r.flags&&(C[0]=255&h,C[1]=h>>>8&255,r.check=B(r.check,C,2,0)),f=h=0,r.mode=5;case 5:if(1024&r.flags){for(;f<16;){if(0===o)break e;o--,h+=n[s++]<>>8&255,r.check=B(r.check,C,2,0)),f=h=0}else r.head&&(r.head.extra=null);r.mode=6;case 6:if(1024&r.flags&&(o<(c=r.length)&&(c=o),c&&(r.head&&(k=r.head.extra_len-r.length,r.head.extra||(r.head.extra=new Array(r.head.extra_len)),I.arraySet(r.head.extra,n,s,c,k)),512&r.flags&&(r.check=B(r.check,n,c,s)),o-=c,s+=c,r.length-=c),r.length))break e;r.length=0,r.mode=7;case 7:if(2048&r.flags){if(0===o)break e;for(c=0;k=n[s+c++],r.head&&k&&r.length<65536&&(r.head.name+=String.fromCharCode(k)),k&&c>9&1,r.head.done=!0),e.adler=r.check=0,r.mode=12;break;case 10:for(;f<32;){if(0===o)break e;o--,h+=n[s++]<>>=7&f,f-=7&f,r.mode=27;break}for(;f<3;){if(0===o)break e;o--,h+=n[s++]<>>=1)){case 0:r.mode=14;break;case 1:if(j(r),r.mode=20,6!==t)break;h>>>=2,f-=2;break e;case 2:r.mode=17;break;case 3:e.msg="invalid block type",r.mode=30}h>>>=2,f-=2;break;case 14:for(h>>>=7&f,f-=7&f;f<32;){if(0===o)break e;o--,h+=n[s++]<>>16^65535)){e.msg="invalid stored block lengths",r.mode=30;break}if(r.length=65535&h,f=h=0,r.mode=15,6===t)break e;case 15:r.mode=16;case 16:if(c=r.length){if(o>>=5,f-=5,r.ndist=1+(31&h),h>>>=5,f-=5,r.ncode=4+(15&h),h>>>=4,f-=4,286>>=3,f-=3}for(;r.have<19;)r.lens[A[r.have++]]=0;if(r.lencode=r.lendyn,r.lenbits=7,S={bits:r.lenbits},x=R(0,r.lens,0,19,r.lencode,0,r.work,S),r.lenbits=S.bits,x){e.msg="invalid code lengths set",r.mode=30;break}r.have=0,r.mode=19;case 19:for(;r.have>>16&255,v=65535&E,!((_=E>>>24)<=f);){if(0===o)break e;o--,h+=n[s++]<>>=_,f-=_,r.lens[r.have++]=v;else{if(16===v){for(z=_+2;f>>=_,f-=_,0===r.have){e.msg="invalid bit length repeat",r.mode=30;break}k=r.lens[r.have-1],c=3+(3&h),h>>>=2,f-=2}else if(17===v){for(z=_+3;f>>=_)),h>>>=3,f-=3}else{for(z=_+7;f>>=_)),h>>>=7,f-=7}if(r.have+c>r.nlen+r.ndist){e.msg="invalid bit length repeat",r.mode=30;break}for(;c--;)r.lens[r.have++]=k}}if(30===r.mode)break;if(0===r.lens[256]){e.msg="invalid code -- missing end-of-block",r.mode=30;break}if(r.lenbits=9,S={bits:r.lenbits},x=R(D,r.lens,0,r.nlen,r.lencode,0,r.work,S),r.lenbits=S.bits,x){e.msg="invalid literal/lengths set",r.mode=30;break}if(r.distbits=6,r.distcode=r.distdyn,S={bits:r.distbits},x=R(F,r.lens,r.nlen,r.ndist,r.distcode,0,r.work,S),r.distbits=S.bits,x){e.msg="invalid distances set",r.mode=30;break}if(r.mode=20,6===t)break e;case 20:r.mode=21;case 21:if(6<=o&&258<=u){e.next_out=a,e.avail_out=u,e.next_in=s,e.avail_in=o,r.hold=h,r.bits=f,T(e,d),a=e.next_out,i=e.output,u=e.avail_out,s=e.next_in,n=e.input,o=e.avail_in,h=r.hold,f=r.bits,12===r.mode&&(r.back=-1);break}for(r.back=0;g=(E=r.lencode[h&(1<>>16&255,v=65535&E,!((_=E>>>24)<=f);){if(0===o)break e;o--,h+=n[s++]<>b)])>>>16&255,v=65535&E,!(b+(_=E>>>24)<=f);){if(0===o)break e;o--,h+=n[s++]<>>=b,f-=b,r.back+=b}if(h>>>=_,f-=_,r.back+=_,r.length=v,0===g){r.mode=26;break}if(32&g){r.back=-1,r.mode=12;break}if(64&g){e.msg="invalid literal/length code",r.mode=30;break}r.extra=15&g,r.mode=22;case 22:if(r.extra){for(z=r.extra;f>>=r.extra,f-=r.extra,r.back+=r.extra}r.was=r.length,r.mode=23;case 23:for(;g=(E=r.distcode[h&(1<>>16&255,v=65535&E,!((_=E>>>24)<=f);){if(0===o)break e;o--,h+=n[s++]<>b)])>>>16&255,v=65535&E,!(b+(_=E>>>24)<=f);){if(0===o)break e;o--,h+=n[s++]<>>=b,f-=b,r.back+=b}if(h>>>=_,f-=_,r.back+=_,64&g){e.msg="invalid distance code",r.mode=30;break}r.offset=v,r.extra=15&g,r.mode=24;case 24:if(r.extra){for(z=r.extra;f>>=r.extra,f-=r.extra,r.back+=r.extra}if(r.offset>r.dmax){e.msg="invalid distance too far back",r.mode=30;break}r.mode=25;case 25:if(0===u)break e;if(c=d-u,r.offset>c){if((c=r.offset-c)>r.whave&&r.sane){e.msg="invalid distance too far back",r.mode=30;break}p=c>r.wnext?(c-=r.wnext,r.wsize-c):r.wnext-c,c>r.length&&(c=r.length),m=r.window}else m=i,p=a-r.offset,c=r.length;for(uc?(m=T[R+a[b]],A[I+a[b]]):(m=96,0),u=1<>S)+(h-=u)]=p<<24|m<<16|_|0,0!==h;);for(u=1<>=1;if(0!==u?(C&=u-1,C+=u):C=0,b++,0==--O[v]){if(v===y)break;v=t[r+a[b]]}if(k>>7)]}function x(e,t){e.pending_buf[e.pending++]=255&t,e.pending_buf[e.pending++]=t>>>8&255}function S(e,t,r){e.bi_valid>i-r?(e.bi_buf|=t<>i-e.bi_valid,e.bi_valid+=r-i):(e.bi_buf|=t<>>=1,r<<=1,0<--t;);return r>>>1}function C(e,t,r){var n,i,s=new Array(_+1),a=0;for(n=1;n<=_;n++)s[n]=a=a+r[n-1]<<1;for(i=0;i<=t;i++){var o=e[2*i+1];0!==o&&(e[2*i]=E(s[o]++,o))}}function A(e){var t;for(t=0;t<286;t++)e.dyn_ltree[2*t]=0;for(t=0;t<30;t++)e.dyn_dtree[2*t]=0;for(t=0;t<19;t++)e.bl_tree[2*t]=0;e.dyn_ltree[512]=1,e.opt_len=e.static_len=0,e.last_lit=e.matches=0}function I(e){8>1;1<=r;r--)B(e,s,r);for(i=u;r=e.heap[1],e.heap[1]=e.heap[e.heap_len--],B(e,s,1),n=e.heap[1],e.heap[--e.heap_max]=r,e.heap[--e.heap_max]=n,s[2*i]=s[2*r]+s[2*n],e.depth[i]=(e.depth[r]>=e.depth[n]?e.depth[r]:e.depth[n])+1,s[2*r+1]=s[2*n+1]=i,e.heap[1]=i++,B(e,s,1),2<=e.heap_len;);e.heap[--e.heap_max]=e.heap[1],function(e,t){var r,n,i,s,a,o,u=t.dyn_tree,h=t.max_code,f=t.stat_desc.static_tree,l=t.stat_desc.has_stree,d=t.stat_desc.extra_bits,c=t.stat_desc.extra_base,p=t.stat_desc.max_length,m=0;for(s=0;s<=_;s++)e.bl_count[s]=0;for(u[2*e.heap[e.heap_max]+1]=0,r=e.heap_max+1;r<573;r++)p<(s=u[2*u[2*(n=e.heap[r])+1]+1]+1)&&(s=p,m++),u[2*n+1]=s,h>=7;n<30;n++)for(w[n]=i<<7,e=0;e<1<>>=1)if(1&r&&0!==e.dyn_ltree[2*t])return 0;if(0!==e.dyn_ltree[18]||0!==e.dyn_ltree[20]||0!==e.dyn_ltree[26])return 1;for(t=32;t<256;t++)if(0!==e.dyn_ltree[2*t])return 1;return 0}(e)),R(e,e.l_desc),R(e,e.d_desc),a=function(e){var t;for(D(e,e.dyn_ltree,e.l_desc.max_code),D(e,e.dyn_dtree,e.d_desc.max_code),R(e,e.bl_desc),t=18;3<=t&&0===e.bl_tree[2*f[t]+1];t--);return e.opt_len+=3*(t+1)+5+5+4,t}(e),i=e.opt_len+3+7>>>3,(s=e.static_len+3+7>>>3)<=i&&(i=s)):i=s=r+5,r+4<=i&&-1!==t?U(e,t,r,n):4===e.strategy||s===i?(S(e,2+(n?1:0),3),T(e,l,d)):(S(e,4+(n?1:0),3),function(e,t,r,n){var i;for(S(e,t-257,5),S(e,r-1,5),S(e,n-4,4),i=0;i>>8&255,e.pending_buf[e.d_buf+2*e.last_lit+1]=255&t,e.pending_buf[e.l_buf+e.last_lit]=255&r,e.last_lit++,0===t?e.dyn_ltree[2*r]++:(e.matches++,t--,e.dyn_ltree[2*(p[r]+256+1)]++,e.dyn_dtree[2*k(t)]++),e.last_lit===e.lit_bufsize-1},r._tr_align=function(e){var t;S(e,2,3),z(e,256,l),16===(t=e).bi_valid?(x(t,t.bi_buf),t.bi_buf=0,t.bi_valid=0):8<=t.bi_valid&&(t.pending_buf[t.pending++]=255&t.bi_buf,t.bi_buf>>=8,t.bi_valid-=8)}},{"../utils/common":41}],53:[function(e,t,r){"use strict";t.exports=function(){this.input=null,this.next_in=0,this.avail_in=0,this.total_in=0,this.output=null,this.next_out=0,this.avail_out=0,this.total_out=0,this.msg="",this.state=null,this.data_type=2,this.adler=0}},{}],54:[function(e,t,r){"use strict";t.exports="function"==typeof setImmediate?setImmediate:function(){var e=[].slice.apply(arguments);e.splice(1,0,0),setTimeout.apply(null,e)}},{}]},{},[10])(10)})}).call(this,void 0!==r?r:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}]},{},[1])(1)})}).call(this,void 0!==r?r:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}]},{},[1])(1)})}).call(this,void 0!==r?r:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}]},{},[1])(1)})}).call(this,void 0!==r?r:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}]},{},[1])(1)})}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}]},{},[1])(1)}); diff --git a/o2web/source/o2_lib/zTree/img/diy/1_close.png b/o2web/source/o2_lib/zTree/img/diy/1_close.png deleted file mode 100644 index 68ccb3c3b90170df7cddab1fe6e8e455c3854573..0000000000000000000000000000000000000000 Binary files a/o2web/source/o2_lib/zTree/img/diy/1_close.png and /dev/null differ diff --git a/o2web/source/o2_lib/zTree/img/diy/1_open.png b/o2web/source/o2_lib/zTree/img/diy/1_open.png deleted file mode 100644 index d6ff36d3a99012028c6cf3d4009719108e31bc79..0000000000000000000000000000000000000000 Binary files a/o2web/source/o2_lib/zTree/img/diy/1_open.png and /dev/null differ diff --git a/o2web/source/o2_lib/zTree/img/diy/2.png b/o2web/source/o2_lib/zTree/img/diy/2.png deleted file mode 100644 index 9eff506ba391fa1ddf0dc44d02ae84403700321b..0000000000000000000000000000000000000000 Binary files a/o2web/source/o2_lib/zTree/img/diy/2.png and /dev/null differ diff --git a/o2web/source/o2_lib/zTree/img/diy/3.png b/o2web/source/o2_lib/zTree/img/diy/3.png deleted file mode 100644 index d7ba6d0c675c35197e2dae8a379155e67c0ac6cb..0000000000000000000000000000000000000000 Binary files a/o2web/source/o2_lib/zTree/img/diy/3.png and /dev/null differ diff --git a/o2web/source/o2_lib/zTree/img/diy/4.png b/o2web/source/o2_lib/zTree/img/diy/4.png deleted file mode 100644 index 753e2bfd5725b1f32cda4e41c36a448a4b12c280..0000000000000000000000000000000000000000 Binary files a/o2web/source/o2_lib/zTree/img/diy/4.png and /dev/null differ diff --git a/o2web/source/o2_lib/zTree/img/diy/5.png b/o2web/source/o2_lib/zTree/img/diy/5.png deleted file mode 100644 index 0c5eccd562c303cf5197629ef5f2666b6180bd48..0000000000000000000000000000000000000000 Binary files a/o2web/source/o2_lib/zTree/img/diy/5.png and /dev/null differ diff --git a/o2web/source/o2_lib/zTree/img/diy/6.png b/o2web/source/o2_lib/zTree/img/diy/6.png deleted file mode 100644 index 070b8352d7770e6be4b6f3cbc61f7ee21ae3e4da..0000000000000000000000000000000000000000 Binary files a/o2web/source/o2_lib/zTree/img/diy/6.png and /dev/null differ diff --git a/o2web/source/o2_lib/zTree/img/diy/7.png b/o2web/source/o2_lib/zTree/img/diy/7.png deleted file mode 100644 index 532b037f2045cfa26c62d23cb928ff7405f6fc18..0000000000000000000000000000000000000000 Binary files a/o2web/source/o2_lib/zTree/img/diy/7.png and /dev/null differ diff --git a/o2web/source/o2_lib/zTree/img/diy/8.png b/o2web/source/o2_lib/zTree/img/diy/8.png deleted file mode 100644 index a8f3a86e7091de4acdd38745f74b30f0f3d40f9e..0000000000000000000000000000000000000000 Binary files a/o2web/source/o2_lib/zTree/img/diy/8.png and /dev/null differ diff --git a/o2web/source/o2_lib/zTree/img/diy/9.png b/o2web/source/o2_lib/zTree/img/diy/9.png deleted file mode 100644 index 4db73cd41c95bc74496175625ce9ed3737e599f5..0000000000000000000000000000000000000000 Binary files a/o2web/source/o2_lib/zTree/img/diy/9.png and /dev/null differ diff --git a/o2web/source/o2_lib/zTree/img/line_conn.gif b/o2web/source/o2_lib/zTree/img/line_conn.gif deleted file mode 100644 index d561d36a915776730eb3069cee4c949f027667ed..0000000000000000000000000000000000000000 Binary files a/o2web/source/o2_lib/zTree/img/line_conn.gif and /dev/null differ diff --git a/o2web/source/o2_lib/zTree/img/loading.gif b/o2web/source/o2_lib/zTree/img/loading.gif deleted file mode 100644 index e8c289293b11c889703d83dce6631fce90da4630..0000000000000000000000000000000000000000 Binary files a/o2web/source/o2_lib/zTree/img/loading.gif and /dev/null differ diff --git a/o2web/source/o2_lib/zTree/img/zTreeStandard.gif b/o2web/source/o2_lib/zTree/img/zTreeStandard.gif deleted file mode 100644 index 50c94fd41ef9f1f7c07442d669923fd7a3226f55..0000000000000000000000000000000000000000 Binary files a/o2web/source/o2_lib/zTree/img/zTreeStandard.gif and /dev/null differ diff --git a/o2web/source/o2_lib/zTree/img/zTreeStandard.png b/o2web/source/o2_lib/zTree/img/zTreeStandard.png deleted file mode 100644 index ffda01ef1cccc398ee4e2327f4093ba1130a4961..0000000000000000000000000000000000000000 Binary files a/o2web/source/o2_lib/zTree/img/zTreeStandard.png and /dev/null differ diff --git a/o2web/source/o2_lib/zipjs/zip-fs.js b/o2web/source/o2_lib/zipjs/zip-fs.js deleted file mode 100644 index 2437749fcd99b9dc65c24512dde4ce456d60a5b9..0000000000000000000000000000000000000000 --- a/o2web/source/o2_lib/zipjs/zip-fs.js +++ /dev/null @@ -1,3903 +0,0 @@ -(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : - typeof define === 'function' && define.amd ? define(['exports'], factory) : - (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.zip = {})); -}(this, (function (exports) { 'use strict'; - - /* - Copyright (c) 2021 Gildas Lormeau. All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the distribution. - - 3. The names of the authors may not be used to endorse or promote products - derived from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, - INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND - FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT, - INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, - INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, - OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, - EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - - const DEFAULT_CONFIGURATION = { - chunkSize: 512 * 1024, - maxWorkers: (typeof navigator != "undefined" && navigator.hardwareConcurrency) || 2, - useWebWorkers: true, - workerScripts: undefined - }; - - const config = Object.assign({}, DEFAULT_CONFIGURATION); - - function getConfiguration() { - return config; - } - - function configure(configuration) { - if (configuration.chunkSize !== undefined) { - config.chunkSize = configuration.chunkSize; - } - if (configuration.maxWorkers !== undefined) { - config.maxWorkers = configuration.maxWorkers; - } - if (configuration.useWebWorkers !== undefined) { - config.useWebWorkers = configuration.useWebWorkers; - } - if (configuration.Deflate !== undefined) { - config.Deflate = configuration.Deflate; - } - if (configuration.Inflate !== undefined) { - config.Inflate = configuration.Inflate; - } - if (configuration.workerScripts !== undefined) { - if (configuration.workerScripts.deflate) { - if (!Array.isArray(configuration.workerScripts.deflate)) { - throw new Error("workerScripts.deflate must be an array"); - } - if (!config.workerScripts) { - config.workerScripts = {}; - } - config.workerScripts.deflate = configuration.workerScripts.deflate; - } - if (configuration.workerScripts.inflate) { - if (!Array.isArray(configuration.workerScripts.inflate)) { - throw new Error("workerScripts.inflate must be an array"); - } - if (!config.workerScripts) { - config.workerScripts = {}; - } - config.workerScripts.inflate = configuration.workerScripts.inflate; - } - } - } - - var configureWebWorker = ()=>{if("function"==typeof URL.createObjectURL){const e=(()=>{const t=[];for(let e=0;e<256;e++){let n=e;for(let t=0;t<8;t++)1&n?n=n>>>1^3988292384:n>>>=1;t[e]=n;}class e{constructor(t){this.crc=t||-1;}append(e){let n=0|this.crc;for(let i=0,a=0|e.length;i>>8^t[255&(n^e[i])];this.crc=n;}get(){return ~this.crc}}const n={concat(t,e){if(0===t.length||0===e.length)return t.concat(e);const i=t[t.length-1],a=n.getPartial(i);return 32===a?t.concat(e):n._shiftRight(e,a,0|i,t.slice(0,t.length-1))},bitLength(t){const e=t.length;if(0===e)return 0;const i=t[e-1];return 32*(e-1)+n.getPartial(i)},clamp(t,e){if(32*t.length0&&e&&(t[i-1]=n.partial(e,t[i-1]&2147483648>>e-1,1)),t},partial:(t,e,n)=>32===t?e:(n?0|e:e<<32-t)+1099511627776*t,getPartial:t=>Math.round(t/1099511627776)||32,_shiftRight(t,e,i,a){for(void 0===a&&(a=[]);e>=32;e-=32)a.push(i),i=0;if(0===e)return a.concat(t);for(let n=0;n>>e),i=t[n]<<32-e;const r=t.length?t[t.length-1]:0,s=n.getPartial(r);return a.push(n.partial(e+s&31,e+s>32?i:a.pop(),1)),a}},i={bytes:{fromBits(t){const e=n.bitLength(t)/8,i=new Uint8Array(e);let a;for(let n=0;n>>24,a<<=8;return i},toBits(t){const e=[];let i,a=0;for(i=0;i9007199254740991)throw new Error("Cannot hash more than 2^53 - 1 bits");const o=new Uint32Array(a);let l=0;for(let t=e.blockSize+r-(e.blockSize+r&e.blockSize-1);t<=s;t+=e.blockSize)e._block(o.subarray(16*l,16*(l+1))),l+=1;return a.splice(0,16*l),e},finalize:function(){const t=this;let e=t._buffer;const i=t._h;e=n.concat(e,[n.partial(1,1)]);for(let t=e.length+2;15&t;t++)e.push(0);for(e.push(Math.floor(t._length/4294967296)),e.push(0|t._length);e.length;)t._block(e.splice(0,16));return t.reset(),i},_init:[1732584193,4023233417,2562383102,271733878,3285377520],_key:[1518500249,1859775393,2400959708,3395469782],_f:function(t,e,n,i){return t<=19?e&n|~e&i:t<=39?e^n^i:t<=59?e&n|e&i|n&i:t<=79?e^n^i:void 0},_S:function(t,e){return e<>>32-t},_block:function(t){const e=this,n=e._h,i=Array(80);for(let e=0;e<16;e++)i[e]=t[e];let a=n[0],r=n[1],s=n[2],o=n[3],l=n[4];for(let t=0;t<=79;t++){t>=16&&(i[t]=e._S(1,i[t-3]^i[t-8]^i[t-14]^i[t-16]));const n=e._S(5,a)+e._f(t,r,s,o)+l+i[t]+e._key[Math.floor(t/20)]|0;l=o,o=s,s=e._S(30,r),r=a,a=n;}n[0]=n[0]+a|0,n[1]=n[1]+r|0,n[2]=n[2]+s|0,n[3]=n[3]+o|0,n[4]=n[4]+l|0;}};const r=class{constructor(t){const e=this;e._tables=[[[],[],[],[],[]],[[],[],[],[],[]]],e._tables[0][0][0]||e._precompute();const n=e._tables[0][4],i=e._tables[1],a=t.length;let r,s,o,l=1;if(4!==a&&6!==a&&8!==a)throw new Error("invalid aes key size");for(e._key=[s=t.slice(0),o=[]],r=a;r<4*a+28;r++){let t=s[r-1];(r%a==0||8===a&&r%a==4)&&(t=n[t>>>24]<<24^n[t>>16&255]<<16^n[t>>8&255]<<8^n[255&t],r%a==0&&(t=t<<8^t>>>24^l<<24,l=l<<1^283*(l>>7))),s[r]=s[r-a]^t;}for(let t=0;r;t++,r--){const e=s[3&t?r:r-4];o[t]=r<=4||t<4?e:i[0][n[e>>>24]]^i[1][n[e>>16&255]]^i[2][n[e>>8&255]]^i[3][n[255&e]];}}encrypt(t){return this._crypt(t,0)}decrypt(t){return this._crypt(t,1)}_precompute(){const t=this._tables[0],e=this._tables[1],n=t[4],i=e[4],a=[],r=[];let s,o,l,_;for(let t=0;t<256;t++)r[(a[t]=t<<1^283*(t>>7))^t]=t;for(let d=s=0;!n[d];d^=o||1,s=r[s]||1){let r=s^s<<1^s<<2^s<<3^s<<4;r=r>>8^255&r^99,n[d]=r,i[r]=d,_=a[l=a[o=a[d]]];let c=16843009*_^65537*l^257*o^16843008*d,f=257*a[r]^16843008*r;for(let n=0;n<4;n++)t[n][d]=f=f<<24^f>>>8,e[n][r]=c=c<<24^c>>>8;}for(let n=0;n<5;n++)t[n]=t[n].slice(0),e[n]=e[n].slice(0);}_crypt(t,e){if(4!==t.length)throw new Error("invalid aes block size");const n=this._key[e],i=n.length/4-2,a=[0,0,0,0],r=this._tables[e],s=r[0],o=r[1],l=r[2],_=r[3],d=r[4];let c,f,u,h=t[0]^n[0],b=t[e?3:1]^n[1],w=t[2]^n[2],p=t[e?1:3]^n[3],x=4;for(let t=0;t>>24]^o[b>>16&255]^l[w>>8&255]^_[255&p]^n[x],f=s[b>>>24]^o[w>>16&255]^l[p>>8&255]^_[255&h]^n[x+1],u=s[w>>>24]^o[p>>16&255]^l[h>>8&255]^_[255&b]^n[x+2],p=s[p>>>24]^o[h>>16&255]^l[b>>8&255]^_[255&w]^n[x+3],x+=4,h=c,b=f,w=u;for(let t=0;t<4;t++)a[e?3&-t:t]=d[h>>>24]<<24^d[b>>16&255]<<16^d[w>>8&255]<<8^d[255&p]^n[x++],c=h,h=b,b=w,w=p,p=c;return a}},s=class{constructor(t,e){this._prf=t,this._initIv=e,this._iv=e;}reset(){this._iv=this._initIv;}update(t){return this.calculate(this._prf,t,this._iv)}incWord(t){if(255==(t>>24&255)){let e=t>>16&255,n=t>>8&255,i=255&t;255===e?(e=0,255===n?(n=0,255===i?i=0:++i):++n):++e,t=0,t+=e<<16,t+=n<<8,t+=i;}else t+=1<<24;return t}incCounter(t){0===(t[0]=this.incWord(t[0]))&&(t[1]=this.incWord(t[1]));}calculate(t,e,i){let a;if(!(a=e.length))return [];const r=n.bitLength(e);for(let n=0;nr&&(t=n.hash(t));for(let e=0;et.length){const n=t;(t=new Uint8Array(e)).set(n,0);}return t}(n,s-s%16)),o=0;o<=s-16;o+=16){const a=w.toBits(U(e,o,o+16));r&&t.hmac.update(a);const s=t.aesCtrGladman.update(a);r||t.hmac.update(s),n.set(w.fromBits(s),o+i);}return t.pendingInput=U(e,o),n}async function v(t,e,n){const i=(new TextEncoder).encode(e),a=await b.importKey("raw",i,_,!1,c),r=await b.deriveBits(Object.assign({salt:n},d),a,8*(2*u[t.strength]+2)),s=new Uint8Array(r);t.keys={key:w.toBits(U(s,0,u[t.strength])),authentication:w.toBits(U(s,u[t.strength],2*u[t.strength])),passwordVerification:U(s,2*u[t.strength])};}function A(t,e){let n=t;return t.length+e.length&&(n=new Uint8Array(t.length+e.length),n.set(t,0),n.set(e,t.length)),n}function U(t,e,n){return t.subarray(e,n)}class S{constructor(t,e){Object.assign(this,{password:t,passwordVerification:e}),C(this,t);}async append(t){const e=this;if(e.password){const n=I(e,t.subarray(0,12));if(e.password=null,n[11]!=e.passwordVerification)throw new Error("Invalid pasword");t=t.subarray(12);}return I(e,t)}async flush(){return {valid:!0,data:new Uint8Array(0)}}}class z{constructor(t,e){Object.assign(this,{password:t,passwordVerification:e}),C(this,t);}async append(t){const e=this;let n,i;if(e.password){e.password=null;const a=crypto.getRandomValues(new Uint8Array(12));a[11]=e.passwordVerification,n=new Uint8Array(t.length+a.length),n.set(E(e,a),0),i=12;}else n=new Uint8Array(t.length),i=0;return n.set(E(e,t),i),n}async flush(){return {data:new Uint8Array(0)}}}function I(t,e){const n=new Uint8Array(e.length);for(let i=0;i>>24]),t.keys[2]=~t.crcKey2.get();}function B(t){const e=2|t.keys[2];return j(Math.imul(e,1^e)>>>8)}function j(t){return 255&t}function H(t){return 4294967295&t}class V{constructor(t,{signature:n,password:i,signed:a,compressed:r,zipCrypto:s,passwordVerification:o,encryptionStrength:l},{chunkSize:_}){const d=Boolean(i);Object.assign(this,{signature:n,encrypted:d,signed:a,compressed:r,inflate:r&&new t({chunkSize:_}),crc32:a&&new e,zipCrypto:s,decrypt:d&&s?new S(i,o):new y(i,a,l)});}async append(t){const e=this;return e.encrypted&&t.length&&(t=await e.decrypt.append(t)),e.compressed&&t.length&&(t=await e.inflate.append(t)),(!e.encrypted||e.zipCrypto)&&e.signed&&t.length&&e.crc32.append(t),t}async flush(){const t=this;let e,n=new Uint8Array(0);if(t.encrypted){const e=await t.decrypt.flush();if(!e.valid)throw new Error("Invalid signature");n=e.data;}if((!t.encrypted||t.zipCrypto)&&t.signed){const n=new DataView(new Uint8Array(4).buffer);if(e=t.crc32.get(),n.setUint32(0,e),t.cipher!=n.getUint32(0,!1))throw new Error("Invalid signature")}return t.compressed&&(n=await t.inflate.append(n)||new Uint8Array(0),await t.inflate.flush()),{data:n,signature:e}}}class O{constructor(t,{encrypted:n,signed:i,compressed:a,level:r,zipCrypto:s,password:o,passwordVerification:l,encryptionStrength:_},{chunkSize:d}){Object.assign(this,{encrypted:n,signed:i,compressed:a,deflate:a&&new t({level:r||5,chunkSize:d}),crc32:i&&new e,zipCrypto:s,encrypt:n&&s?new z(o,l):new m(o,_)});}async append(t){const e=this;let n=t;return e.compressed&&t.length&&(n=await e.deflate.append(t)),e.encrypted&&n.length&&(n=await e.encrypt.append(n)),(!e.encrypted||e.zipCrypto)&&e.signed&&t.length&&e.crc32.append(t),n}async flush(){const t=this;let e,n=new Uint8Array(0);if(t.compressed&&(n=await t.deflate.flush()||new Uint8Array(0)),t.encrypted){n=await t.encrypt.append(n);const i=await t.encrypt.flush();e=i.signature;const a=new Uint8Array(n.length+i.data.length);a.set(n,0),a.set(i.data,n.length),n=a;}return t.encrypted&&!t.zipCrypto||!t.signed||(e=t.crc32.get()),{data:n,signature:e}}}const D={init(t){t.scripts&&t.scripts.length&&importScripts.apply(void 0,t.scripts);const e=t.options;let n;self.initCodec&&self.initCodec(),e.codecType.startsWith("deflate")?n=self.Deflate:e.codecType.startsWith("inflate")&&(n=self.Inflate),L=function(t,e,n){return e.codecType.startsWith("deflate")?new O(t,e,n):e.codecType.startsWith("inflate")?new V(t,e,n):void 0}(n,e,t.config);},append:async t=>({data:await L.append(t.data)}),flush:()=>L.flush()};let L;function P(t){return t.map((([t,e])=>new Array(t).fill(e,0,t))).flat()}addEventListener("message",(async t=>{const e=t.data,n=e.type,i=D[n];if(i)try{e.data&&(e.data=new Uint8Array(e.data));const t=await i(e)||{};if(t.type=n,t.data)try{t.data=t.data.buffer,postMessage(t,[t.data]);}catch(e){postMessage(t);}else postMessage(t);}catch(t){postMessage({type:n,error:{message:t.message,stack:t.stack}});}}));const K=[0,1,2,3].concat(...P([[2,4],[2,5],[4,6],[4,7],[8,8],[8,9],[16,10],[16,11],[32,12],[32,13],[64,14],[64,15],[2,0],[1,16],[1,17],[2,18],[2,19],[4,20],[4,21],[8,22],[8,23],[16,24],[16,25],[32,26],[32,27],[64,28],[64,29]]));function R(){const t=this;function e(t,e){let n=0;do{n|=1&t,t>>>=1,n<<=1;}while(--e>0);return n>>>1}t.build_tree=function(n){const i=t.dyn_tree,a=t.stat_desc.static_tree,r=t.stat_desc.elems;let s,o,l,_=-1;for(n.heap_len=0,n.heap_max=573,s=0;s=1;s--)n.pqdownheap(i,s);l=r;do{s=n.heap[1],n.heap[1]=n.heap[n.heap_len--],n.pqdownheap(i,1),o=n.heap[1],n.heap[--n.heap_max]=s,n.heap[--n.heap_max]=o,i[2*l]=i[2*s]+i[2*o],n.depth[l]=Math.max(n.depth[s],n.depth[o])+1,i[2*s+1]=i[2*o+1]=l,n.heap[1]=l++,n.pqdownheap(i,1);}while(n.heap_len>=2);n.heap[--n.heap_max]=n.heap[1],function(e){const n=t.dyn_tree,i=t.stat_desc.static_tree,a=t.stat_desc.extra_bits,r=t.stat_desc.extra_base,s=t.stat_desc.max_length;let o,l,_,d,c,f,u=0;for(d=0;d<=15;d++)e.bl_count[d]=0;for(n[2*e.heap[e.heap_max]+1]=0,o=e.heap_max+1;o<573;o++)l=e.heap[o],d=n[2*n[2*l+1]+1]+1,d>s&&(d=s,u++),n[2*l+1]=d,l>t.max_code||(e.bl_count[d]++,c=0,l>=r&&(c=a[l-r]),f=n[2*l],e.opt_len+=f*(d+c),i&&(e.static_len+=f*(i[2*l+1]+c)));if(0!==u){do{for(d=s-1;0===e.bl_count[d];)d--;e.bl_count[d]--,e.bl_count[d+1]+=2,e.bl_count[s]--,u-=2;}while(u>0);for(d=s;0!==d;d--)for(l=e.bl_count[d];0!==l;)_=e.heap[--o],_>t.max_code||(n[2*_+1]!=d&&(e.opt_len+=(d-n[2*_+1])*n[2*_],n[2*_+1]=d),l--);}}(n),function(t,n,i){const a=[];let r,s,o,l=0;for(r=1;r<=15;r++)a[r]=l=l+i[r-1]<<1;for(s=0;s<=n;s++)o=t[2*s+1],0!==o&&(t[2*s]=e(a[o]++,o));}(i,t.max_code,n.bl_count);};}function W(t,e,n,i,a){const r=this;r.static_tree=t,r.extra_bits=e,r.extra_base=n,r.elems=i,r.max_length=a;}function G(t,e,n,i,a){const r=this;r.good_length=t,r.max_lazy=e,r.nice_length=n,r.max_chain=i,r.func=a;}R._length_code=[0,1,2,3,4,5,6,7].concat(...P([[2,8],[2,9],[2,10],[2,11],[4,12],[4,13],[4,14],[4,15],[8,16],[8,17],[8,18],[8,19],[16,20],[16,21],[16,22],[16,23],[32,24],[32,25],[32,26],[31,27],[1,28]])),R.base_length=[0,1,2,3,4,5,6,7,8,10,12,14,16,20,24,28,32,40,48,56,64,80,96,112,128,160,192,224,0],R.base_dist=[0,1,2,3,4,6,8,12,16,24,32,48,64,96,128,192,256,384,512,768,1024,1536,2048,3072,4096,6144,8192,12288,16384,24576],R.d_code=function(t){return t<256?K[t]:K[256+(t>>>7)]},R.extra_lbits=[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],R.extra_dbits=[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],R.extra_blbits=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7],R.bl_order=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],W.static_ltree=[12,8,140,8,76,8,204,8,44,8,172,8,108,8,236,8,28,8,156,8,92,8,220,8,60,8,188,8,124,8,252,8,2,8,130,8,66,8,194,8,34,8,162,8,98,8,226,8,18,8,146,8,82,8,210,8,50,8,178,8,114,8,242,8,10,8,138,8,74,8,202,8,42,8,170,8,106,8,234,8,26,8,154,8,90,8,218,8,58,8,186,8,122,8,250,8,6,8,134,8,70,8,198,8,38,8,166,8,102,8,230,8,22,8,150,8,86,8,214,8,54,8,182,8,118,8,246,8,14,8,142,8,78,8,206,8,46,8,174,8,110,8,238,8,30,8,158,8,94,8,222,8,62,8,190,8,126,8,254,8,1,8,129,8,65,8,193,8,33,8,161,8,97,8,225,8,17,8,145,8,81,8,209,8,49,8,177,8,113,8,241,8,9,8,137,8,73,8,201,8,41,8,169,8,105,8,233,8,25,8,153,8,89,8,217,8,57,8,185,8,121,8,249,8,5,8,133,8,69,8,197,8,37,8,165,8,101,8,229,8,21,8,149,8,85,8,213,8,53,8,181,8,117,8,245,8,13,8,141,8,77,8,205,8,45,8,173,8,109,8,237,8,29,8,157,8,93,8,221,8,61,8,189,8,125,8,253,8,19,9,275,9,147,9,403,9,83,9,339,9,211,9,467,9,51,9,307,9,179,9,435,9,115,9,371,9,243,9,499,9,11,9,267,9,139,9,395,9,75,9,331,9,203,9,459,9,43,9,299,9,171,9,427,9,107,9,363,9,235,9,491,9,27,9,283,9,155,9,411,9,91,9,347,9,219,9,475,9,59,9,315,9,187,9,443,9,123,9,379,9,251,9,507,9,7,9,263,9,135,9,391,9,71,9,327,9,199,9,455,9,39,9,295,9,167,9,423,9,103,9,359,9,231,9,487,9,23,9,279,9,151,9,407,9,87,9,343,9,215,9,471,9,55,9,311,9,183,9,439,9,119,9,375,9,247,9,503,9,15,9,271,9,143,9,399,9,79,9,335,9,207,9,463,9,47,9,303,9,175,9,431,9,111,9,367,9,239,9,495,9,31,9,287,9,159,9,415,9,95,9,351,9,223,9,479,9,63,9,319,9,191,9,447,9,127,9,383,9,255,9,511,9,0,7,64,7,32,7,96,7,16,7,80,7,48,7,112,7,8,7,72,7,40,7,104,7,24,7,88,7,56,7,120,7,4,7,68,7,36,7,100,7,20,7,84,7,52,7,116,7,3,8,131,8,67,8,195,8,35,8,163,8,99,8,227,8],W.static_dtree=[0,5,16,5,8,5,24,5,4,5,20,5,12,5,28,5,2,5,18,5,10,5,26,5,6,5,22,5,14,5,30,5,1,5,17,5,9,5,25,5,5,5,21,5,13,5,29,5,3,5,19,5,11,5,27,5,7,5,23,5],W.static_l_desc=new W(W.static_ltree,R.extra_lbits,257,286,15),W.static_d_desc=new W(W.static_dtree,R.extra_dbits,0,30,15),W.static_bl_desc=new W(null,R.extra_blbits,0,19,7);const T=[new G(0,0,0,0,0),new G(4,4,8,4,1),new G(4,5,16,8,1),new G(4,6,32,32,1),new G(4,4,16,16,2),new G(8,16,32,32,2),new G(8,16,128,128,2),new G(8,32,128,256,2),new G(32,128,258,1024,2),new G(32,258,258,4096,2)],q=["need dictionary","stream end","","","stream error","data error","","buffer error","",""];function F(t,e,n,i){const a=t[2*e],r=t[2*n];return a>>8&255);}function tt(t,e){let n;const i=e;Q>16-i?(n=t,N|=n<>>16-Q,Q+=i-16):(N|=t<=8&&(Z(255&N),N>>>=8,Q-=8);}function at(e,n){let i,a,r;if(t.pending_buf[K+2*P]=e>>>8&255,t.pending_buf[K+2*P+1]=255&e,t.pending_buf[D+P]=255&n,P++,0===e?M[2*n]++:(G++,e--,M[2*(R._length_code[n]+256+1)]++,B[2*R.d_code(e)]++),0==(8191&P)&&z>2){for(i=8*P,a=m-p,r=0;r<30;r++)i+=B[2*r]*(5+R.extra_dbits[r]);if(i>>>=3,G8?$(N):Q>0&&Z(255&N),N=0,Q=0;}function ot(e,n,i){tt(0+(i?1:0),3),function(e,n,i){st(),J=8,$(n),$(~n),t.pending_buf.set(l.subarray(e,e+n),t.pending),t.pending+=n;}(e,n);}function lt(e,n,i){let a,r,s=0;z>0?(H.build_tree(t),V.build_tree(t),s=function(){let e;for(Y(M,H.max_code),Y(B,V.max_code),O.build_tree(t),e=18;e>=3&&0===j[2*R.bl_order[e]+1];e--);return t.opt_len+=3*(e+1)+5+5+4,e}(),a=t.opt_len+3+7>>>3,r=t.static_len+3+7>>>3,r<=a&&(a=r)):a=r=n+5,n+4<=a&&-1!=e?ot(e,n,i):r==a?(tt(2+(i?1:0),3),rt(W.static_ltree,W.static_dtree)):(tt(4+(i?1:0),3),function(t,e,n){let i;for(tt(t-257,5),tt(e-1,5),tt(n-4,4),i=0;i=0?p:-1,m-p,t),p=m,e.flush_pending();}function dt(){let t,n,i,a;do{if(a=_-v-m,0===a&&0===m&&0===v)a=r;else if(-1==a)a--;else if(m>=r+r-262){l.set(l.subarray(r,r+r),0),k-=r,m-=r,p-=r,t=u,i=t;do{n=65535&c[--i],c[i]=n>=r?n-r:0;}while(0!=--t);t=r,i=t;do{n=65535&d[--i],d[i]=n>=r?n-r:0;}while(0!=--t);a+=r;}if(0===e.avail_in)return;t=e.read_buf(l,m+v,a),v+=t,v>=3&&(f=255&l[m],f=(f<r-262?m-(r-262):0;let c=C;const f=o,u=m+258;let h=l[a+s-1],b=l[a+s];A>=E&&(i>>=2),c>v&&(c=v);do{if(e=t,l[e+s]==b&&l[e+s-1]==h&&l[e]==l[a]&&l[++e]==l[a+1]){a+=2,e++;do{}while(l[++a]==l[++e]&&l[++a]==l[++e]&&l[++a]==l[++e]&&l[++a]==l[++e]&&l[++a]==l[++e]&&l[++a]==l[++e]&&l[++a]==l[++e]&&l[++a]==l[++e]&&as){if(k=t,s=n,n>=c)break;h=l[a+s-1],b=l[a+s];}}}while((t=65535&d[t&f])>_&&0!=--i);return s<=v?s:v}function ft(e){return e.total_in=e.total_out=0,e.msg=null,t.pending=0,t.pending_out=0,n=113,a=0,H.dyn_tree=M,H.stat_desc=W.static_l_desc,V.dyn_tree=B,V.stat_desc=W.static_d_desc,O.dyn_tree=j,O.stat_desc=W.static_bl_desc,N=0,Q=0,J=8,X(),function(){_=2*r,c[u-1]=0;for(let t=0;t9||8!=_||a<9||a>15||n<0||n>9||p<0||p>2?-2:(e.dstate=t,s=a,r=1<9||n<0||n>2?-2:(T[z].func!=T[e].func&&0!==t.total_in&&(i=t.deflate(1)),z!=e&&(z=e,S=T[z].max_lazy,E=T[z].good_length,C=T[z].nice_length,U=T[z].max_chain),I=n,i)},t.deflateSetDictionary=function(t,e,i){let a,s=i,_=0;if(!e||42!=n)return -2;if(s<3)return 0;for(s>r-262&&(s=r-262,_=i-s),l.set(e.subarray(_,_+s),0),m=s,p=s,f=255&l[0],f=(f<4||h<0)return -2;if(!_.next_out||!_.next_in&&0!==_.avail_in||666==n&&4!=h)return _.msg=q[4],-2;if(0===_.avail_out)return _.msg=q[7],-5;var j;if(e=_,M=a,a=h,42==n&&(E=8+(s-8<<4)<<8,C=(z-1&255)>>1,C>3&&(C=3),E|=C<<6,0!==m&&(E|=32),E+=31-E%31,n=113,Z((j=E)>>8&255),Z(255&j)),0!==t.pending){if(e.flush_pending(),0===e.avail_out)return a=-1,0}else if(0===e.avail_in&&h<=M&&4!=h)return e.msg=q[7],-5;if(666==n&&0!==e.avail_in)return _.msg=q[7],-5;if(0!==e.avail_in||0!==v||0!=h&&666!=n){switch(B=-1,T[z].func){case 0:B=function(t){let n,a=65535;for(a>i-5&&(a=i-5);;){if(v<=1){if(dt(),0===v&&0==t)return 0;if(0===v)break}if(m+=v,v=0,n=p+a,(0===m||m>=n)&&(v=m-n,m=n,_t(!1),0===e.avail_out))return 0;if(m-p>=r-262&&(_t(!1),0===e.avail_out))return 0}return _t(4==t),0===e.avail_out?4==t?2:0:4==t?3:1}(h);break;case 1:B=function(t){let n,i=0;for(;;){if(v<262){if(dt(),v<262&&0==t)return 0;if(0===v)break}if(v>=3&&(f=(f<=3)if(n=at(m-k,x-3),v-=x,x<=S&&v>=3){x--;do{m++,f=(f<=3&&(f=(f<4096)&&(x=2)),A>=3&&x<=A){i=m+v-3,n=at(m-1-g,A-3),v-=A-1,A-=2;do{++m<=i&&(f=(f<0&&e.next_in_index!=o&&(a(e.next_in_index),o=e.next_in_index);}while(e.avail_in>0||0===e.avail_out);return d.length>1?(s=new Uint8Array(_),d.forEach((function(t){s.set(t,l),l+=t.length;}))):s=d[0]||new Uint8Array(0),s}},this.flush=function(){let t,a,r=0,s=0;const o=[];do{if(e.next_out_index=0,e.avail_out=n,t=e.deflate(4),1!=t&&0!=t)throw new Error("deflating: "+e.msg);n-e.avail_out>0&&o.push(i.slice(0,e.next_out_index)),s+=e.next_out_index;}while(e.avail_in>0||0===e.avail_out);return e.deflateEnd(),a=new Uint8Array(s),o.forEach((function(t){a.set(t,r),r+=t.length;})),a};}N.prototype={deflateInit:function(t,e){const n=this;return n.dstate=new J,e||(e=15),n.dstate.deflateInit(n,t,e)},deflate:function(t){const e=this;return e.dstate?e.dstate.deflate(e,t):-2},deflateEnd:function(){const t=this;if(!t.dstate)return -2;const e=t.dstate.deflateEnd();return t.dstate=null,e},deflateParams:function(t,e){const n=this;return n.dstate?n.dstate.deflateParams(n,t,e):-2},deflateSetDictionary:function(t,e){const n=this;return n.dstate?n.dstate.deflateSetDictionary(n,t,e):-2},read_buf:function(t,e,n){const i=this;let a=i.avail_in;return a>n&&(a=n),0===a?0:(i.avail_in-=a,t.set(i.next_in.subarray(i.next_in_index,i.next_in_index+a),e),i.next_in_index+=a,i.total_in+=a,a)},flush_pending:function(){const t=this;let e=t.dstate.pending;e>t.avail_out&&(e=t.avail_out),0!==e&&(t.next_out.set(t.dstate.pending_buf.subarray(t.dstate.pending_out,t.dstate.pending_out+e),t.next_out_index),t.next_out_index+=e,t.dstate.pending_out+=e,t.total_out+=e,t.avail_out-=e,t.dstate.pending-=e,0===t.dstate.pending&&(t.dstate.pending_out=0));}};const X=[0,1,3,7,15,31,63,127,255,511,1023,2047,4095,8191,16383,32767,65535],Y=[96,7,256,0,8,80,0,8,16,84,8,115,82,7,31,0,8,112,0,8,48,0,9,192,80,7,10,0,8,96,0,8,32,0,9,160,0,8,0,0,8,128,0,8,64,0,9,224,80,7,6,0,8,88,0,8,24,0,9,144,83,7,59,0,8,120,0,8,56,0,9,208,81,7,17,0,8,104,0,8,40,0,9,176,0,8,8,0,8,136,0,8,72,0,9,240,80,7,4,0,8,84,0,8,20,85,8,227,83,7,43,0,8,116,0,8,52,0,9,200,81,7,13,0,8,100,0,8,36,0,9,168,0,8,4,0,8,132,0,8,68,0,9,232,80,7,8,0,8,92,0,8,28,0,9,152,84,7,83,0,8,124,0,8,60,0,9,216,82,7,23,0,8,108,0,8,44,0,9,184,0,8,12,0,8,140,0,8,76,0,9,248,80,7,3,0,8,82,0,8,18,85,8,163,83,7,35,0,8,114,0,8,50,0,9,196,81,7,11,0,8,98,0,8,34,0,9,164,0,8,2,0,8,130,0,8,66,0,9,228,80,7,7,0,8,90,0,8,26,0,9,148,84,7,67,0,8,122,0,8,58,0,9,212,82,7,19,0,8,106,0,8,42,0,9,180,0,8,10,0,8,138,0,8,74,0,9,244,80,7,5,0,8,86,0,8,22,192,8,0,83,7,51,0,8,118,0,8,54,0,9,204,81,7,15,0,8,102,0,8,38,0,9,172,0,8,6,0,8,134,0,8,70,0,9,236,80,7,9,0,8,94,0,8,30,0,9,156,84,7,99,0,8,126,0,8,62,0,9,220,82,7,27,0,8,110,0,8,46,0,9,188,0,8,14,0,8,142,0,8,78,0,9,252,96,7,256,0,8,81,0,8,17,85,8,131,82,7,31,0,8,113,0,8,49,0,9,194,80,7,10,0,8,97,0,8,33,0,9,162,0,8,1,0,8,129,0,8,65,0,9,226,80,7,6,0,8,89,0,8,25,0,9,146,83,7,59,0,8,121,0,8,57,0,9,210,81,7,17,0,8,105,0,8,41,0,9,178,0,8,9,0,8,137,0,8,73,0,9,242,80,7,4,0,8,85,0,8,21,80,8,258,83,7,43,0,8,117,0,8,53,0,9,202,81,7,13,0,8,101,0,8,37,0,9,170,0,8,5,0,8,133,0,8,69,0,9,234,80,7,8,0,8,93,0,8,29,0,9,154,84,7,83,0,8,125,0,8,61,0,9,218,82,7,23,0,8,109,0,8,45,0,9,186,0,8,13,0,8,141,0,8,77,0,9,250,80,7,3,0,8,83,0,8,19,85,8,195,83,7,35,0,8,115,0,8,51,0,9,198,81,7,11,0,8,99,0,8,35,0,9,166,0,8,3,0,8,131,0,8,67,0,9,230,80,7,7,0,8,91,0,8,27,0,9,150,84,7,67,0,8,123,0,8,59,0,9,214,82,7,19,0,8,107,0,8,43,0,9,182,0,8,11,0,8,139,0,8,75,0,9,246,80,7,5,0,8,87,0,8,23,192,8,0,83,7,51,0,8,119,0,8,55,0,9,206,81,7,15,0,8,103,0,8,39,0,9,174,0,8,7,0,8,135,0,8,71,0,9,238,80,7,9,0,8,95,0,8,31,0,9,158,84,7,99,0,8,127,0,8,63,0,9,222,82,7,27,0,8,111,0,8,47,0,9,190,0,8,15,0,8,143,0,8,79,0,9,254,96,7,256,0,8,80,0,8,16,84,8,115,82,7,31,0,8,112,0,8,48,0,9,193,80,7,10,0,8,96,0,8,32,0,9,161,0,8,0,0,8,128,0,8,64,0,9,225,80,7,6,0,8,88,0,8,24,0,9,145,83,7,59,0,8,120,0,8,56,0,9,209,81,7,17,0,8,104,0,8,40,0,9,177,0,8,8,0,8,136,0,8,72,0,9,241,80,7,4,0,8,84,0,8,20,85,8,227,83,7,43,0,8,116,0,8,52,0,9,201,81,7,13,0,8,100,0,8,36,0,9,169,0,8,4,0,8,132,0,8,68,0,9,233,80,7,8,0,8,92,0,8,28,0,9,153,84,7,83,0,8,124,0,8,60,0,9,217,82,7,23,0,8,108,0,8,44,0,9,185,0,8,12,0,8,140,0,8,76,0,9,249,80,7,3,0,8,82,0,8,18,85,8,163,83,7,35,0,8,114,0,8,50,0,9,197,81,7,11,0,8,98,0,8,34,0,9,165,0,8,2,0,8,130,0,8,66,0,9,229,80,7,7,0,8,90,0,8,26,0,9,149,84,7,67,0,8,122,0,8,58,0,9,213,82,7,19,0,8,106,0,8,42,0,9,181,0,8,10,0,8,138,0,8,74,0,9,245,80,7,5,0,8,86,0,8,22,192,8,0,83,7,51,0,8,118,0,8,54,0,9,205,81,7,15,0,8,102,0,8,38,0,9,173,0,8,6,0,8,134,0,8,70,0,9,237,80,7,9,0,8,94,0,8,30,0,9,157,84,7,99,0,8,126,0,8,62,0,9,221,82,7,27,0,8,110,0,8,46,0,9,189,0,8,14,0,8,142,0,8,78,0,9,253,96,7,256,0,8,81,0,8,17,85,8,131,82,7,31,0,8,113,0,8,49,0,9,195,80,7,10,0,8,97,0,8,33,0,9,163,0,8,1,0,8,129,0,8,65,0,9,227,80,7,6,0,8,89,0,8,25,0,9,147,83,7,59,0,8,121,0,8,57,0,9,211,81,7,17,0,8,105,0,8,41,0,9,179,0,8,9,0,8,137,0,8,73,0,9,243,80,7,4,0,8,85,0,8,21,80,8,258,83,7,43,0,8,117,0,8,53,0,9,203,81,7,13,0,8,101,0,8,37,0,9,171,0,8,5,0,8,133,0,8,69,0,9,235,80,7,8,0,8,93,0,8,29,0,9,155,84,7,83,0,8,125,0,8,61,0,9,219,82,7,23,0,8,109,0,8,45,0,9,187,0,8,13,0,8,141,0,8,77,0,9,251,80,7,3,0,8,83,0,8,19,85,8,195,83,7,35,0,8,115,0,8,51,0,9,199,81,7,11,0,8,99,0,8,35,0,9,167,0,8,3,0,8,131,0,8,67,0,9,231,80,7,7,0,8,91,0,8,27,0,9,151,84,7,67,0,8,123,0,8,59,0,9,215,82,7,19,0,8,107,0,8,43,0,9,183,0,8,11,0,8,139,0,8,75,0,9,247,80,7,5,0,8,87,0,8,23,192,8,0,83,7,51,0,8,119,0,8,55,0,9,207,81,7,15,0,8,103,0,8,39,0,9,175,0,8,7,0,8,135,0,8,71,0,9,239,80,7,9,0,8,95,0,8,31,0,9,159,84,7,99,0,8,127,0,8,63,0,9,223,82,7,27,0,8,111,0,8,47,0,9,191,0,8,15,0,8,143,0,8,79,0,9,255],Z=[80,5,1,87,5,257,83,5,17,91,5,4097,81,5,5,89,5,1025,85,5,65,93,5,16385,80,5,3,88,5,513,84,5,33,92,5,8193,82,5,9,90,5,2049,86,5,129,192,5,24577,80,5,2,87,5,385,83,5,25,91,5,6145,81,5,7,89,5,1537,85,5,97,93,5,24577,80,5,4,88,5,769,84,5,49,92,5,12289,82,5,13,90,5,3073,86,5,193,192,5,24577],$=[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,0,0],tt=[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,112,112],et=[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],nt=[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];function it(){let t,e,n,i,a,r;function s(t,e,s,o,l,_,d,c,f,u,h){let b,w,p,x,g,y,m,k,v,A,U,S,z,I,E;A=0,g=s;do{n[t[e+A]]++,A++,g--;}while(0!==g);if(n[0]==s)return d[0]=-1,c[0]=0,0;for(k=c[0],y=1;y<=15&&0===n[y];y++);for(m=y,kg&&(k=g),c[0]=k,I=1<S+k;){if(x++,S+=k,E=p-S,E=E>k?k:E,(w=1<<(y=m-S))>b+1&&(w-=b+1,z=m,y1440)return -3;a[x]=U=u[0],u[0]+=E,0!==x?(r[x]=g,i[0]=y,i[1]=k,y=g>>>S-k,i[2]=U-a[x-1]-y,f.set(i,3*(a[x-1]+y))):d[0]=U;}for(i[1]=m-S,A>=s?i[0]=192:h[A]>>S;y>>=1)g^=y;for(g^=y,v=(1<257?(-3==u?f.msg="oversubscribed distance tree":-5==u?(f.msg="incomplete distance tree",u=-3):-4!=u&&(f.msg="empty distance tree with lengths",u=-3),u):0)};}function at(){const t=this;let e,n,i,a,r=0,s=0,o=0,l=0,_=0,d=0,c=0,f=0,u=0,h=0;function b(t,e,n,i,a,r,s,o){let l,_,d,c,f,u,h,b,w,p,x,g,y,m,k,v;h=o.next_in_index,b=o.avail_in,f=s.bitb,u=s.bitk,w=s.write,p=w>=_[v+1],u-=_[v+1],0!=(16&c)){for(c&=15,y=_[v+2]+(f&X[c]),f>>=c,u-=c;u<15;)b--,f|=(255&o.read_byte(h++))<>=_[v+1],u-=_[v+1],0!=(16&c)){for(c&=15;u>=c,u-=c,p-=y,w>=m)k=w-m,w-k>0&&2>w-k?(s.window[w++]=s.window[k++],s.window[w++]=s.window[k++],y-=2):(s.window.set(s.window.subarray(k,k+2),w),w+=2,k+=2,y-=2);else {k=w-m;do{k+=s.end;}while(k<0);if(c=s.end-k,y>c){if(y-=c,w-k>0&&c>w-k)do{s.window[w++]=s.window[k++];}while(0!=--c);else s.window.set(s.window.subarray(k,k+c),w),w+=c,k+=c,c=0;k=0;}}if(w-k>0&&y>w-k)do{s.window[w++]=s.window[k++];}while(0!=--y);else s.window.set(s.window.subarray(k,k+y),w),w+=y,k+=y,y=0;break}if(0!=(64&c))return o.msg="invalid distance code",y=o.avail_in-b,y=u>>3>3:y,b+=y,h-=y,u-=y<<3,s.bitb=f,s.bitk=u,o.avail_in=b,o.total_in+=h-o.next_in_index,o.next_in_index=h,s.write=w,-3;l+=_[v+2],l+=f&X[c],v=3*(d+l),c=_[v];}break}if(0!=(64&c))return 0!=(32&c)?(y=o.avail_in-b,y=u>>3>3:y,b+=y,h-=y,u-=y<<3,s.bitb=f,s.bitk=u,o.avail_in=b,o.total_in+=h-o.next_in_index,o.next_in_index=h,s.write=w,1):(o.msg="invalid literal/length code",y=o.avail_in-b,y=u>>3>3:y,b+=y,h-=y,u-=y<<3,s.bitb=f,s.bitk=u,o.avail_in=b,o.total_in+=h-o.next_in_index,o.next_in_index=h,s.write=w,-3);if(l+=_[v+2],l+=f&X[c],v=3*(d+l),0===(c=_[v])){f>>=_[v+1],u-=_[v+1],s.window[w++]=_[v+2],p--;break}}else f>>=_[v+1],u-=_[v+1],s.window[w++]=_[v+2],p--;}while(p>=258&&b>=10);return y=o.avail_in-b,y=u>>3>3:y,b+=y,h-=y,u-=y<<3,s.bitb=f,s.bitk=u,o.avail_in=b,o.total_in+=h-o.next_in_index,o.next_in_index=h,s.write=w,0}t.init=function(t,r,s,o,l,_){e=0,c=t,f=r,i=s,u=o,a=l,h=_,n=null;},t.proc=function(t,w,p){let x,g,y,m,k,v,A,U=0,S=0,z=0;for(z=w.next_in_index,m=w.avail_in,U=t.bitb,S=t.bitk,k=t.write,v=k=258&&m>=10&&(t.bitb=U,t.bitk=S,w.avail_in=m,w.total_in+=z-w.next_in_index,w.next_in_index=z,t.write=k,p=b(c,f,i,u,a,h,t,w),z=w.next_in_index,m=w.avail_in,U=t.bitb,S=t.bitk,k=t.write,v=k>>=n[g+1],S-=n[g+1],y=n[g],0===y){l=n[g+2],e=6;break}if(0!=(16&y)){_=15&y,r=n[g+2],e=2;break}if(0==(64&y)){o=y,s=g/3+n[g+2];break}if(0!=(32&y)){e=7;break}return e=9,w.msg="invalid literal/length code",p=-3,t.bitb=U,t.bitk=S,w.avail_in=m,w.total_in+=z-w.next_in_index,w.next_in_index=z,t.write=k,t.inflate_flush(w,p);case 2:for(x=_;S>=x,S-=x,o=f,n=a,s=h,e=3;case 3:for(x=o;S>=n[g+1],S-=n[g+1],y=n[g],0!=(16&y)){_=15&y,d=n[g+2],e=4;break}if(0==(64&y)){o=y,s=g/3+n[g+2];break}return e=9,w.msg="invalid distance code",p=-3,t.bitb=U,t.bitk=S,w.avail_in=m,w.total_in+=z-w.next_in_index,w.next_in_index=z,t.write=k,t.inflate_flush(w,p);case 4:for(x=_;S>=x,S-=x,e=5;case 5:for(A=k-d;A<0;)A+=t.end;for(;0!==r;){if(0===v&&(k==t.end&&0!==t.read&&(k=0,v=k7&&(S-=8,m++,z--),t.write=k,p=t.inflate_flush(w,p),k=t.write,v=kt.avail_out&&(i=t.avail_out),0!==i&&-5==e&&(e=0),t.avail_out-=i,t.total_out+=i,t.next_out.set(n.window.subarray(r,r+i),a),a+=i,r+=i,r==n.end&&(r=0,n.write==n.end&&(n.write=0),i=n.write-r,i>t.avail_out&&(i=t.avail_out),0!==i&&-5==e&&(e=0),t.avail_out-=i,t.total_out+=i,t.next_out.set(n.window.subarray(r,r+i),a),a+=i,r+=i),t.next_out_index=a,n.read=r,e},n.proc=function(t,e){let h,b,w,p,x,g,y,m;for(p=t.next_in_index,x=t.avail_in,b=n.bitb,w=n.bitk,g=n.write,y=g>>1){case 0:b>>>=3,w-=3,h=7&w,b>>>=h,w-=h,a=1;break;case 1:k=[],v=[],A=[[]],U=[[]],it.inflate_trees_fixed(k,v,A,U),d.init(k[0],v[0],A[0],0,U[0],0),b>>>=3,w-=3,a=6;break;case 2:b>>>=3,w-=3,a=3;break;case 3:return b>>>=3,w-=3,a=9,t.msg="invalid block type",e=-3,n.bitb=b,n.bitk=w,t.avail_in=x,t.total_in+=p-t.next_in_index,t.next_in_index=p,n.write=g,n.inflate_flush(t,e)}break;case 1:for(;w<32;){if(0===x)return n.bitb=b,n.bitk=w,t.avail_in=x,t.total_in+=p-t.next_in_index,t.next_in_index=p,n.write=g,n.inflate_flush(t,e);e=0,x--,b|=(255&t.read_byte(p++))<>>16&65535)!=(65535&b))return a=9,t.msg="invalid stored block lengths",e=-3,n.bitb=b,n.bitk=w,t.avail_in=x,t.total_in+=p-t.next_in_index,t.next_in_index=p,n.write=g,n.inflate_flush(t,e);r=65535&b,b=w=0,a=0!==r?2:0!==c?7:0;break;case 2:if(0===x)return n.bitb=b,n.bitk=w,t.avail_in=x,t.total_in+=p-t.next_in_index,t.next_in_index=p,n.write=g,n.inflate_flush(t,e);if(0===y&&(g==n.end&&0!==n.read&&(g=0,y=gx&&(h=x),h>y&&(h=y),n.window.set(t.read_buf(p,h),g),p+=h,x-=h,g+=h,y-=h,0!=(r-=h))break;a=0!==c?7:0;break;case 3:for(;w<14;){if(0===x)return n.bitb=b,n.bitk=w,t.avail_in=x,t.total_in+=p-t.next_in_index,t.next_in_index=p,n.write=g,n.inflate_flush(t,e);e=0,x--,b|=(255&t.read_byte(p++))<29||(h>>5&31)>29)return a=9,t.msg="too many length or distance symbols",e=-3,n.bitb=b,n.bitk=w,t.avail_in=x,t.total_in+=p-t.next_in_index,t.next_in_index=p,n.write=g,n.inflate_flush(t,e);if(h=258+(31&h)+(h>>5&31),!i||i.length>>=14,w-=14,o=0,a=4;case 4:for(;o<4+(s>>>10);){for(;w<3;){if(0===x)return n.bitb=b,n.bitk=w,t.avail_in=x,t.total_in+=p-t.next_in_index,t.next_in_index=p,n.write=g,n.inflate_flush(t,e);e=0,x--,b|=(255&t.read_byte(p++))<>>=3,w-=3;}for(;o<19;)i[rt[o++]]=0;if(l[0]=7,h=u.inflate_trees_bits(i,l,_,f,t),0!=h)return -3==(e=h)&&(i=null,a=9),n.bitb=b,n.bitk=w,t.avail_in=x,t.total_in+=p-t.next_in_index,t.next_in_index=p,n.write=g,n.inflate_flush(t,e);o=0,a=5;case 5:for(;h=s,!(o>=258+(31&h)+(h>>5&31));){let r,d;for(h=l[0];w>>=h,w-=h,i[o++]=d;else {for(m=18==d?7:d-14,r=18==d?11:3;w>>=h,w-=h,r+=b&X[m],b>>>=m,w-=m,m=o,h=s,m+r>258+(31&h)+(h>>5&31)||16==d&&m<1)return i=null,a=9,t.msg="invalid bit length repeat",e=-3,n.bitb=b,n.bitk=w,t.avail_in=x,t.total_in+=p-t.next_in_index,t.next_in_index=p,n.write=g,n.inflate_flush(t,e);d=16==d?i[m-1]:0;do{i[m++]=d;}while(0!=--r);o=m;}}if(_[0]=-1,S=[],z=[],I=[],E=[],S[0]=9,z[0]=6,h=s,h=u.inflate_trees_dynamic(257+(31&h),1+(h>>5&31),i,S,z,I,E,f,t),0!=h)return -3==h&&(i=null,a=9),e=h,n.bitb=b,n.bitk=w,t.avail_in=x,t.total_in+=p-t.next_in_index,t.next_in_index=p,n.write=g,n.inflate_flush(t,e);d.init(S[0],z[0],f,I[0],f,E[0]),a=6;case 6:if(n.bitb=b,n.bitk=w,t.avail_in=x,t.total_in+=p-t.next_in_index,t.next_in_index=p,n.write=g,1!=(e=d.proc(n,t,e)))return n.inflate_flush(t,e);if(e=0,d.free(t),p=t.next_in_index,x=t.avail_in,b=n.bitb,w=n.bitk,g=n.write,y=g15?(t.inflateEnd(n),-2):(t.wbits=i,n.istate.blocks=new st(n,1<>4)>a.wbits){a.mode=13,t.msg="invalid window size",a.marker=5;break}a.mode=1;case 1:if(0===t.avail_in)return n;if(n=e,t.avail_in--,t.total_in++,i=255&t.read_byte(t.next_in_index++),((a.method<<8)+i)%31!=0){a.mode=13,t.msg="incorrect header check",a.marker=5;break}if(0==(32&i)){a.mode=7;break}a.mode=2;case 2:if(0===t.avail_in)return n;n=e,t.avail_in--,t.total_in++,a.need=(255&t.read_byte(t.next_in_index++))<<24&4278190080,a.mode=3;case 3:if(0===t.avail_in)return n;n=e,t.avail_in--,t.total_in++,a.need+=(255&t.read_byte(t.next_in_index++))<<16&16711680,a.mode=4;case 4:if(0===t.avail_in)return n;n=e,t.avail_in--,t.total_in++,a.need+=(255&t.read_byte(t.next_in_index++))<<8&65280,a.mode=5;case 5:return 0===t.avail_in?n:(n=e,t.avail_in--,t.total_in++,a.need+=255&t.read_byte(t.next_in_index++),a.mode=6,2);case 6:return a.mode=13,t.msg="need dictionary",a.marker=0,-2;case 7:if(n=a.blocks.proc(t,n),-3==n){a.mode=13,a.marker=0;break}if(0==n&&(n=e),1!=n)return n;n=e,a.blocks.reset(t,a.was),a.mode=12;case 12:return 1;case 13:return -3;default:return -2}},t.inflateSetDictionary=function(t,e,n){let i=0,a=n;if(!t||!t.istate||6!=t.istate.mode)return -2;const r=t.istate;return a>=1<0&&e.next_in_index!=_&&(r(e.next_in_index),_=e.next_in_index);}while(e.avail_in>0||0===e.avail_out);return s.length>1?(l=new Uint8Array(c),s.forEach((function(t){l.set(t,d),d+=t.length;}))):l=s[0]||new Uint8Array(0),l}},this.flush=function(){e.inflateEnd();};}_t.prototype={inflateInit:function(t){const e=this;return e.istate=new lt,t||(t=15),e.istate.inflateInit(e,t)},inflate:function(t){const e=this;return e.istate?e.istate.inflate(e,t):-2},inflateEnd:function(){const t=this;if(!t.istate)return -2;const e=t.istate.inflateEnd(t);return t.istate=null,e},inflateSync:function(){const t=this;return t.istate?t.istate.inflateSync(t):-2},inflateSetDictionary:function(t,e){const n=this;return n.istate?n.istate.inflateSetDictionary(n,t,e):-2},read_byte:function(t){return this.next_in[t]},read_buf:function(t,e){return this.next_in.subarray(t,t+e)}},self.initCodec=()=>{self.Deflate=Q,self.Inflate=dt;};}).toString(),n=URL.createObjectURL(new Blob(["("+e+")()"],{type:"text/javascript"}));configure({workerScripts:{inflate:[n],deflate:[n]}});}}; - - /* - Copyright (c) 2021 Gildas Lormeau. All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the distribution. - - 3. The names of the authors may not be used to endorse or promote products - derived from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, - INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND - FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT, - INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, - INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, - OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, - EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - - function getMimeType() { - return "application/octet-stream"; - } - - var streamCodecShim = (library, options = {}, registerDataHandler) => { - return { - Deflate: createCodecClass(library.Deflate, options.deflate, registerDataHandler), - Inflate: createCodecClass(library.Inflate, options.inflate, registerDataHandler) - }; - }; - - function createCodecClass(constructor, constructorOptions, registerDataHandler) { - return class { - - constructor(options) { - const codecAdapter = this; - const onData = data => { - if (codecAdapter.pendingData) { - const pendingData = codecAdapter.pendingData; - codecAdapter.pendingData = new Uint8Array(pendingData.length + data.length); - codecAdapter.pendingData.set(pendingData, 0); - codecAdapter.pendingData.set(data, pendingData.length); - } else { - codecAdapter.pendingData = new Uint8Array(data); - } - }; - codecAdapter.codec = new constructor(Object.assign({}, constructorOptions, options)); - registerDataHandler(codecAdapter.codec, onData); - } - async append(data) { - this.codec.push(data); - return getResponse(this); - } - async flush() { - this.codec.push(new Uint8Array(0), true); - return getResponse(this); - } - }; - - function getResponse(codec) { - if (codec.pendingData) { - const output = codec.pendingData; - codec.pendingData = null; - return output; - } else { - return new Uint8Array(0); - } - } - } - - /* - Copyright (c) 2021 Gildas Lormeau. All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the distribution. - - 3. The names of the authors may not be used to endorse or promote products - derived from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, - INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND - FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT, - INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, - INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, - OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, - EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - - const ERR_HTTP_STATUS = "HTTP error "; - const ERR_HTTP_RANGE = "HTTP Range not supported"; - - const CONTENT_TYPE_TEXT_PLAIN = "text/plain"; - const HTTP_HEADER_CONTENT_LENGTH = "Content-Length"; - const HTTP_HEADER_ACCEPT_RANGES = "Accept-Ranges"; - const HTTP_HEADER_RANGE = "Range"; - const HTTP_METHOD_HEAD = "HEAD"; - const HTTP_METHOD_GET = "GET"; - const HTTP_RANGE_UNIT = "bytes"; - - class Stream { - - constructor() { - this.size = 0; - } - - init() { - this.initialized = true; - } - } - - class Reader extends Stream { - } - - class Writer extends Stream { - - writeUint8Array(array) { - this.size += array.length; - } - } - - class TextReader extends Reader { - - constructor(text) { - super(); - this.blobReader = new BlobReader(new Blob([text], { type: CONTENT_TYPE_TEXT_PLAIN })); - } - - async init() { - super.init(); - this.blobReader.init(); - this.size = this.blobReader.size; - } - - async readUint8Array(offset, length) { - return this.blobReader.readUint8Array(offset, length); - } - } - - class TextWriter extends Writer { - - constructor(encoding) { - super(); - this.encoding = encoding; - this.blob = new Blob([], { type: CONTENT_TYPE_TEXT_PLAIN }); - } - - async writeUint8Array(array) { - super.writeUint8Array(array); - this.blob = new Blob([this.blob, array.buffer], { type: CONTENT_TYPE_TEXT_PLAIN }); - } - - getData() { - const reader = new FileReader(); - return new Promise((resolve, reject) => { - reader.onload = event => resolve(event.target.result); - reader.onerror = reject; - reader.readAsText(this.blob, this.encoding); - }); - } - } - - class Data64URIReader extends Reader { - - constructor(dataURI) { - super(); - this.dataURI = dataURI; - let dataEnd = dataURI.length; - while (dataURI.charAt(dataEnd - 1) == "=") { - dataEnd--; - } - this.dataStart = dataURI.indexOf(",") + 1; - this.size = Math.floor((dataEnd - this.dataStart) * 0.75); - } - - async readUint8Array(offset, length) { - const dataArray = new Uint8Array(length); - const start = Math.floor(offset / 3) * 4; - const bytes = atob(this.dataURI.substring(start + this.dataStart, Math.ceil((offset + length) / 3) * 4 + this.dataStart)); - const delta = offset - Math.floor(start / 4) * 3; - for (let indexByte = delta; indexByte < delta + length; indexByte++) { - dataArray[indexByte - delta] = bytes.charCodeAt(indexByte); - } - return dataArray; - } - } - - class Data64URIWriter extends Writer { - - constructor(contentType) { - super(); - this.data = "data:" + (contentType || "") + ";base64,"; - this.pending = []; - } - - async writeUint8Array(array) { - super.writeUint8Array(array); - let indexArray = 0; - let dataString = this.pending; - const delta = this.pending.length; - this.pending = ""; - for (indexArray = 0; indexArray < (Math.floor((delta + array.length) / 3) * 3) - delta; indexArray++) { - dataString += String.fromCharCode(array[indexArray]); - } - for (; indexArray < array.length; indexArray++) { - this.pending += String.fromCharCode(array[indexArray]); - } - if (dataString.length > 2) { - this.data += btoa(dataString); - } else { - this.pending = dataString; - } - } - - getData() { - return this.data + btoa(this.pending); - } - } - - class BlobReader extends Reader { - - constructor(blob) { - super(); - this.blob = blob; - this.size = blob.size; - } - - async readUint8Array(offset, length) { - const reader = new FileReader(); - return new Promise((resolve, reject) => { - reader.onload = event => resolve(new Uint8Array(event.target.result)); - reader.onerror = reject; - reader.readAsArrayBuffer(this.blob.slice(offset, offset + length)); - }); - } - } - - class BlobWriter extends Writer { - - constructor(contentType) { - super(); - this.offset = 0; - this.contentType = contentType; - this.blob = new Blob([], { type: contentType }); - } - - async writeUint8Array(array) { - super.writeUint8Array(array); - this.blob = new Blob([this.blob, array.buffer], { type: this.contentType }); - this.offset = this.blob.size; - } - - getData() { - return this.blob; - } - } - - class FetchReader extends Reader { - - constructor(url, options) { - super(); - this.url = url; - this.preventHeadRequest = options.preventHeadRequest; - this.useRangeHeader = options.useRangeHeader; - this.forceRangeRequests = options.forceRangeRequests; - this.options = Object.assign({}, options); - delete this.options.preventHeadRequest; - delete this.options.useRangeHeader; - delete this.options.forceRangeRequests; - delete this.options.useXHR; - } - - async init() { - super.init(); - if (isHttpFamily(this.url) && !this.preventHeadRequest) { - const response = await sendFetchRequest(HTTP_METHOD_HEAD, this.url, this.options); - this.size = Number(response.headers.get(HTTP_HEADER_CONTENT_LENGTH)); - if (!this.forceRangeRequests && this.useRangeHeader && response.headers.get(HTTP_HEADER_ACCEPT_RANGES) != HTTP_RANGE_UNIT) { - throw new Error(ERR_HTTP_RANGE); - } else if (this.size === undefined) { - await getFetchData(this, this.options); - } - } else { - await getFetchData(this, this.options); - } - } - - async readUint8Array(index, length) { - if (this.useRangeHeader) { - const response = await sendFetchRequest(HTTP_METHOD_GET, this.url, this.options, Object.assign({}, this.options.headers, - { HEADER_RANGE: HTTP_RANGE_UNIT + "=" + index + "-" + (index + length - 1) })); - if (response.status != 206) { - throw new Error(ERR_HTTP_RANGE); - } - return new Uint8Array(await response.arrayBuffer()); - } else { - if (!this.data) { - await getFetchData(this, this.options); - } - return new Uint8Array(this.data.subarray(index, index + length)); - } - } - } - - async function getFetchData(httpReader, options) { - const response = await sendFetchRequest(HTTP_METHOD_GET, httpReader.url, options); - httpReader.data = new Uint8Array(await response.arrayBuffer()); - if (!httpReader.size) { - httpReader.size = httpReader.data.length; - } - } - - async function sendFetchRequest(method, url, options, headers) { - headers = Object.assign({}, options.headers, headers); - const response = await fetch(url, Object.assign({}, options, { method, headers })); - if (response.status < 400) { - return response; - } else { - throw new Error(ERR_HTTP_STATUS + (response.statusText || response.status)); - } - } - - class XHRReader extends Reader { - - constructor(url, options) { - super(); - this.url = url; - this.preventHeadRequest = options.preventHeadRequest; - this.useRangeHeader = options.useRangeHeader; - this.forceRangeRequests = options.forceRangeRequests; - } - - async init() { - super.init(); - if (isHttpFamily(this.url) && !this.preventHeadRequest) { - return new Promise((resolve, reject) => sendXHR(HTTP_METHOD_HEAD, this.url, request => { - this.size = Number(request.getResponseHeader(HTTP_HEADER_CONTENT_LENGTH)); - if (this.useRangeHeader) { - if (this.forceRangeRequests || request.getResponseHeader(HTTP_HEADER_ACCEPT_RANGES) == HTTP_RANGE_UNIT) { - resolve(); - } else { - reject(new Error(ERR_HTTP_RANGE)); - } - } else if (this.size === undefined) { - getXHRData(this, this.url).then(() => resolve()).catch(reject); - } else { - resolve(); - } - }, reject)); - } else { - await getXHRData(this, this.url); - } - } - - async readUint8Array(index, length) { - if (this.useRangeHeader) { - const request = await new Promise((resolve, reject) => sendXHR(HTTP_METHOD_GET, this.url, request => resolve(new Uint8Array(request.response)), reject, - [[HTTP_HEADER_RANGE, HTTP_RANGE_UNIT + "=" + index + "-" + (index + length - 1)]])); - if (request.status != 206) { - throw new Error(ERR_HTTP_RANGE); - } - } else { - if (!this.data) { - await getXHRData(this, this.url); - } - return new Uint8Array(this.data.subarray(index, index + length)); - } - } - } - - function getXHRData(httpReader, url) { - return new Promise((resolve, reject) => sendXHR(HTTP_METHOD_GET, url, request => { - httpReader.data = new Uint8Array(request.response); - if (!httpReader.size) { - httpReader.size = httpReader.data.length; - } - resolve(); - }, reject)); - } - - function sendXHR(method, url, onload, onerror, headers = []) { - const request = new XMLHttpRequest(); - request.addEventListener("load", () => { - if (request.status < 400) { - onload(request); - } else { - onerror(ERR_HTTP_STATUS + (request.statusText || request.status)); - } - }, false); - request.addEventListener("error", onerror, false); - request.open(method, url); - headers.forEach(header => request.setRequestHeader(header[0], header[1])); - request.responseType = "arraybuffer"; - request.send(); - return request; - } - - class HttpReader extends Reader { - - constructor(url, options = {}) { - super(); - this.url = url; - if (options.useXHR) { - this.reader = new XHRReader(url, options); - } else { - this.reader = new FetchReader(url, options); - } - } - - set size(value) { - // ignored - } - - get size() { - return this.reader.size; - } - - async init() { - super.init(); - await this.reader.init(); - } - - async readUint8Array(index, length) { - return this.reader.readUint8Array(index, length); - } - } - - class HttpRangeReader extends HttpReader { - - constructor(url, options = {}) { - options.useRangeHeader = true; - super(url, options); - } - } - - - class Uint8ArrayReader extends Reader { - - constructor(array) { - super(); - this.array = array; - this.size = array.length; - } - - async readUint8Array(index, length) { - return this.array.slice(index, index + length); - } - } - - class Uint8ArrayWriter extends Writer { - - constructor() { - super(); - this.array = new Uint8Array(0); - } - - async writeUint8Array(array) { - super.writeUint8Array(array); - const previousArray = this.array; - this.array = new Uint8Array(previousArray.length + array.length); - this.array.set(previousArray); - this.array.set(array, previousArray.length); - } - - getData() { - return this.array; - } - } - - function isHttpFamily(url) { - if (typeof document != "undefined") { - const anchor = document.createElement("a"); - anchor.href = url; - return anchor.protocol == "http:" || anchor.protocol == "https:"; - } else { - return /^https?:\/\//i.test(url); - } - } - - /* - Copyright (c) 2021 Gildas Lormeau. All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the distribution. - - 3. The names of the authors may not be used to endorse or promote products - derived from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, - INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND - FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT, - INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, - INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, - OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, - EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - - const MAX_32_BITS = 0xffffffff; - const MAX_16_BITS = 0xffff; - const COMPRESSION_METHOD_DEFLATE = 0x08; - const COMPRESSION_METHOD_STORE = 0x00; - const COMPRESSION_METHOD_AES = 0x63; - - const LOCAL_FILE_HEADER_SIGNATURE = 0x04034b50; - const DATA_DESCRIPTOR_RECORD_SIGNATURE = 0x08074b50; - const CENTRAL_FILE_HEADER_SIGNATURE = 0x02014b50; - const END_OF_CENTRAL_DIR_SIGNATURE = 0x06054b50; - const ZIP64_END_OF_CENTRAL_DIR_SIGNATURE = 0x06064b50; - const ZIP64_END_OF_CENTRAL_DIR_LOCATOR_SIGNATURE = 0x07064b50; - const END_OF_CENTRAL_DIR_LENGTH = 22; - const ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH = 20; - const ZIP64_END_OF_CENTRAL_DIR_LENGTH = 56; - const ZIP64_END_OF_CENTRAL_DIR_TOTAL_LENGTH = END_OF_CENTRAL_DIR_LENGTH + ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH + ZIP64_END_OF_CENTRAL_DIR_LENGTH; - - const ZIP64_TOTAL_NUMBER_OF_DISKS = 1; - - const EXTRAFIELD_TYPE_ZIP64 = 0x0001; - const EXTRAFIELD_TYPE_AES = 0x9901; - const EXTRAFIELD_TYPE_UNICODE_PATH = 0x7075; - const EXTRAFIELD_TYPE_UNICODE_COMMENT = 0x6375; - - const BITFLAG_ENCRYPTED = 0x01; - const BITFLAG_LEVEL = 0x06; - const BITFLAG_DATA_DESCRIPTOR = 0x0008; - const BITFLAG_LANG_ENCODING_FLAG = 0x0800; - const FILE_ATTR_MSDOS_DIR_MASK = 0x10; - - const VERSION_DEFLATE = 0x14; - const VERSION_ZIP64 = 0x2D; - const VERSION_AES = 0x33; - - const DIRECTORY_SIGNATURE = "/"; - - const MAX_DATE = new Date(2107, 11, 31); - const MIN_DATE = new Date(1980, 0, 1); - - /* - Copyright (c) 2021 Gildas Lormeau. All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the distribution. - - 3. The names of the authors may not be used to endorse or promote products - derived from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, - INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND - FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT, - INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, - INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, - OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, - EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - - const CP437 = "\0☺☻♥♦♣♠•◘○◙♂♀♪♫☼►◄↕‼¶§▬↨↑↓→←∟↔▲▼ !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~⌂ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜ¢£¥₧ƒáíóúñѪº¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ ".split(""); - - var decodeCP437 = stringValue => { - let result = ""; - for (let indexCharacter = 0; indexCharacter < stringValue.length; indexCharacter++) { - result += CP437[stringValue[indexCharacter]]; - } - return result; - }; - - /* - Copyright (c) 2021 Gildas Lormeau. All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the distribution. - - 3. The names of the authors may not be used to endorse or promote products - derived from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, - INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND - FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT, - INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, - INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, - OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, - EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - - const table = []; - for (let i = 0; i < 256; i++) { - let t = i; - for (let j = 0; j < 8; j++) { - if (t & 1) { - t = (t >>> 1) ^ 0xEDB88320; - } else { - t = t >>> 1; - } - } - table[i] = t; - } - - class Crc32 { - - constructor(crc) { - this.crc = crc || -1; - } - - append(data) { - let crc = this.crc | 0; - for (let offset = 0, length = data.length | 0; offset < length; offset++) { - crc = (crc >>> 8) ^ table[(crc ^ data[offset]) & 0xFF]; - } - this.crc = crc; - } - - get() { - return ~this.crc; - } - } - - // Derived from https://github.com/xqdoo00o/jszip/blob/master/lib/sjcl.js - /*jslint indent: 2, bitwise: false, nomen: false, plusplus: false, white: false, regexp: false */ - - /** @fileOverview Arrays of bits, encoded as arrays of Numbers. - * - * @author Emily Stark - * @author Mike Hamburg - * @author Dan Boneh - */ - - /** - * Arrays of bits, encoded as arrays of Numbers. - * @namespace - * @description - *

- * These objects are the currency accepted by SJCL's crypto functions. - *

- * - *

- * Most of our crypto primitives operate on arrays of 4-byte words internally, - * but many of them can take arguments that are not a multiple of 4 bytes. - * This library encodes arrays of bits (whose size need not be a multiple of 8 - * bits) as arrays of 32-bit words. The bits are packed, big-endian, into an - * array of words, 32 bits at a time. Since the words are double-precision - * floating point numbers, they fit some extra data. We use this (in a private, - * possibly-changing manner) to encode the number of bits actually present - * in the last word of the array. - *

- * - *

- * Because bitwise ops clear this out-of-band data, these arrays can be passed - * to ciphers like AES which want arrays of words. - *

- */ - const bitArray = { - /** - * Concatenate two bit arrays. - * @param {bitArray} a1 The first array. - * @param {bitArray} a2 The second array. - * @return {bitArray} The concatenation of a1 and a2. - */ - concat(a1, a2) { - if (a1.length === 0 || a2.length === 0) { - return a1.concat(a2); - } - - const last = a1[a1.length - 1], shift = bitArray.getPartial(last); - if (shift === 32) { - return a1.concat(a2); - } else { - return bitArray._shiftRight(a2, shift, last | 0, a1.slice(0, a1.length - 1)); - } - }, - - /** - * Find the length of an array of bits. - * @param {bitArray} a The array. - * @return {Number} The length of a, in bits. - */ - bitLength(a) { - const l = a.length; - if (l === 0) { - return 0; - } - const x = a[l - 1]; - return (l - 1) * 32 + bitArray.getPartial(x); - }, - - /** - * Truncate an array. - * @param {bitArray} a The array. - * @param {Number} len The length to truncate to, in bits. - * @return {bitArray} A new array, truncated to len bits. - */ - clamp(a, len) { - if (a.length * 32 < len) { - return a; - } - a = a.slice(0, Math.ceil(len / 32)); - const l = a.length; - len = len & 31; - if (l > 0 && len) { - a[l - 1] = bitArray.partial(len, a[l - 1] & 0x80000000 >> (len - 1), 1); - } - return a; - }, - - /** - * Make a partial word for a bit array. - * @param {Number} len The number of bits in the word. - * @param {Number} x The bits. - * @param {Number} [_end=0] Pass 1 if x has already been shifted to the high side. - * @return {Number} The partial word. - */ - partial(len, x, _end) { - if (len === 32) { - return x; - } - return (_end ? x | 0 : x << (32 - len)) + len * 0x10000000000; - }, - - /** - * Get the number of bits used by a partial word. - * @param {Number} x The partial word. - * @return {Number} The number of bits used by the partial word. - */ - getPartial(x) { - return Math.round(x / 0x10000000000) || 32; - }, - - /** Shift an array right. - * @param {bitArray} a The array to shift. - * @param {Number} shift The number of bits to shift. - * @param {Number} [carry=0] A byte to carry in - * @param {bitArray} [out=[]] An array to prepend to the output. - * @private - */ - _shiftRight(a, shift, carry, out) { - if (out === undefined) { - out = []; - } - - for (; shift >= 32; shift -= 32) { - out.push(carry); - carry = 0; - } - if (shift === 0) { - return out.concat(a); - } - - for (let i = 0; i < a.length; i++) { - out.push(carry | a[i] >>> shift); - carry = a[i] << (32 - shift); - } - const last2 = a.length ? a[a.length - 1] : 0; - const shift2 = bitArray.getPartial(last2); - out.push(bitArray.partial(shift + shift2 & 31, (shift + shift2 > 32) ? carry : out.pop(), 1)); - return out; - } - }; - - /** @fileOverview Bit array codec implementations. - * - * @author Emily Stark - * @author Mike Hamburg - * @author Dan Boneh - */ - - /** - * Arrays of bytes - * @namespace - */ - const codec = { - bytes: { - /** Convert from a bitArray to an array of bytes. */ - fromBits(arr) { - const bl = bitArray.bitLength(arr); - const byteLength = bl / 8; - const out = new Uint8Array(byteLength); - let tmp; - for (let i = 0; i < byteLength; i++) { - if ((i & 3) === 0) { - tmp = arr[i / 4]; - } - out[i] = tmp >>> 24; - tmp <<= 8; - } - return out; - }, - /** Convert from an array of bytes to a bitArray. */ - toBits(bytes) { - const out = []; - let i; - let tmp = 0; - for (i = 0; i < bytes.length; i++) { - tmp = tmp << 8 | bytes[i]; - if ((i & 3) === 3) { - out.push(tmp); - tmp = 0; - } - } - if (i & 3) { - out.push(bitArray.partial(8 * (i & 3), tmp)); - } - return out; - } - } - }; - - const hash = {}; - - /** - * Context for a SHA-1 operation in progress. - * @constructor - */ - hash.sha1 = function (hash) { - if (hash) { - this._h = hash._h.slice(0); - this._buffer = hash._buffer.slice(0); - this._length = hash._length; - } else { - this.reset(); - } - }; - - hash.sha1.prototype = { - /** - * The hash's block size, in bits. - * @constant - */ - blockSize: 512, - - /** - * Reset the hash state. - * @return this - */ - reset: function () { - const sha1 = this; - sha1._h = this._init.slice(0); - sha1._buffer = []; - sha1._length = 0; - return sha1; - }, - - /** - * Input several words to the hash. - * @param {bitArray|String} data the data to hash. - * @return this - */ - update: function (data) { - const sha1 = this; - if (typeof data === "string") { - data = codec.utf8String.toBits(data); - } - const b = sha1._buffer = bitArray.concat(sha1._buffer, data); - const ol = sha1._length; - const nl = sha1._length = ol + bitArray.bitLength(data); - if (nl > 9007199254740991) { - throw new Error("Cannot hash more than 2^53 - 1 bits"); - } - const c = new Uint32Array(b); - let j = 0; - for (let i = sha1.blockSize + ol - ((sha1.blockSize + ol) & (sha1.blockSize - 1)); i <= nl; - i += sha1.blockSize) { - sha1._block(c.subarray(16 * j, 16 * (j + 1))); - j += 1; - } - b.splice(0, 16 * j); - return sha1; - }, - - /** - * Complete hashing and output the hash value. - * @return {bitArray} The hash value, an array of 5 big-endian words. TODO - */ - finalize: function () { - const sha1 = this; - let b = sha1._buffer; - const h = sha1._h; - - // Round out and push the buffer - b = bitArray.concat(b, [bitArray.partial(1, 1)]); - // Round out the buffer to a multiple of 16 words, less the 2 length words. - for (let i = b.length + 2; i & 15; i++) { - b.push(0); - } - - // append the length - b.push(Math.floor(sha1._length / 0x100000000)); - b.push(sha1._length | 0); - - while (b.length) { - sha1._block(b.splice(0, 16)); - } - - sha1.reset(); - return h; - }, - - /** - * The SHA-1 initialization vector. - * @private - */ - _init: [0x67452301, 0xEFCDAB89, 0x98BADCFE, 0x10325476, 0xC3D2E1F0], - - /** - * The SHA-1 hash key. - * @private - */ - _key: [0x5A827999, 0x6ED9EBA1, 0x8F1BBCDC, 0xCA62C1D6], - - /** - * The SHA-1 logical functions f(0), f(1), ..., f(79). - * @private - */ - _f: function (t, b, c, d) { - if (t <= 19) { - return (b & c) | (~b & d); - } else if (t <= 39) { - return b ^ c ^ d; - } else if (t <= 59) { - return (b & c) | (b & d) | (c & d); - } else if (t <= 79) { - return b ^ c ^ d; - } - }, - - /** - * Circular left-shift operator. - * @private - */ - _S: function (n, x) { - return (x << n) | (x >>> 32 - n); - }, - - /** - * Perform one cycle of SHA-1. - * @param {Uint32Array|bitArray} words one block of words. - * @private - */ - _block: function (words) { - const sha1 = this; - const h = sha1._h; - // When words is passed to _block, it has 16 elements. SHA1 _block - // function extends words with new elements (at the end there are 80 elements). - // The problem is that if we use Uint32Array instead of Array, - // the length of Uint32Array cannot be changed. Thus, we replace words with a - // normal Array here. - const w = Array(80); // do not use Uint32Array here as the instantiation is slower - for (let j = 0; j < 16; j++) { - w[j] = words[j]; - } - - let a = h[0]; - let b = h[1]; - let c = h[2]; - let d = h[3]; - let e = h[4]; - - for (let t = 0; t <= 79; t++) { - if (t >= 16) { - w[t] = sha1._S(1, w[t - 3] ^ w[t - 8] ^ w[t - 14] ^ w[t - 16]); - } - const tmp = (sha1._S(5, a) + sha1._f(t, b, c, d) + e + w[t] + - sha1._key[Math.floor(t / 20)]) | 0; - e = d; - d = c; - c = sha1._S(30, b); - b = a; - a = tmp; - } - - h[0] = (h[0] + a) | 0; - h[1] = (h[1] + b) | 0; - h[2] = (h[2] + c) | 0; - h[3] = (h[3] + d) | 0; - h[4] = (h[4] + e) | 0; - } - }; - - /** @fileOverview Low-level AES implementation. - * - * This file contains a low-level implementation of AES, optimized for - * size and for efficiency on several browsers. It is based on - * OpenSSL's aes_core.c, a public-domain implementation by Vincent - * Rijmen, Antoon Bosselaers and Paulo Barreto. - * - * An older version of this implementation is available in the public - * domain, but this one is (c) Emily Stark, Mike Hamburg, Dan Boneh, - * Stanford University 2008-2010 and BSD-licensed for liability - * reasons. - * - * @author Emily Stark - * @author Mike Hamburg - * @author Dan Boneh - */ - - const cipher = {}; - - /** - * Schedule out an AES key for both encryption and decryption. This - * is a low-level class. Use a cipher mode to do bulk encryption. - * - * @constructor - * @param {Array} key The key as an array of 4, 6 or 8 words. - */ - cipher.aes = class { - constructor(key) { - /** - * The expanded S-box and inverse S-box tables. These will be computed - * on the client so that we don't have to send them down the wire. - * - * There are two tables, _tables[0] is for encryption and - * _tables[1] is for decryption. - * - * The first 4 sub-tables are the expanded S-box with MixColumns. The - * last (_tables[01][4]) is the S-box itself. - * - * @private - */ - const aes = this; - aes._tables = [[[], [], [], [], []], [[], [], [], [], []]]; - - if (!aes._tables[0][0][0]) { - aes._precompute(); - } - - const sbox = aes._tables[0][4]; - const decTable = aes._tables[1]; - const keyLen = key.length; - - let i, encKey, decKey, rcon = 1; - - if (keyLen !== 4 && keyLen !== 6 && keyLen !== 8) { - throw new Error("invalid aes key size"); - } - - aes._key = [encKey = key.slice(0), decKey = []]; - - // schedule encryption keys - for (i = keyLen; i < 4 * keyLen + 28; i++) { - let tmp = encKey[i - 1]; - - // apply sbox - if (i % keyLen === 0 || (keyLen === 8 && i % keyLen === 4)) { - tmp = sbox[tmp >>> 24] << 24 ^ sbox[tmp >> 16 & 255] << 16 ^ sbox[tmp >> 8 & 255] << 8 ^ sbox[tmp & 255]; - - // shift rows and add rcon - if (i % keyLen === 0) { - tmp = tmp << 8 ^ tmp >>> 24 ^ rcon << 24; - rcon = rcon << 1 ^ (rcon >> 7) * 283; - } - } - - encKey[i] = encKey[i - keyLen] ^ tmp; - } - - // schedule decryption keys - for (let j = 0; i; j++, i--) { - const tmp = encKey[j & 3 ? i : i - 4]; - if (i <= 4 || j < 4) { - decKey[j] = tmp; - } else { - decKey[j] = decTable[0][sbox[tmp >>> 24]] ^ - decTable[1][sbox[tmp >> 16 & 255]] ^ - decTable[2][sbox[tmp >> 8 & 255]] ^ - decTable[3][sbox[tmp & 255]]; - } - } - } - // public - /* Something like this might appear here eventually - name: "AES", - blockSize: 4, - keySizes: [4,6,8], - */ - - /** - * Encrypt an array of 4 big-endian words. - * @param {Array} data The plaintext. - * @return {Array} The ciphertext. - */ - encrypt(data) { - return this._crypt(data, 0); - } - - /** - * Decrypt an array of 4 big-endian words. - * @param {Array} data The ciphertext. - * @return {Array} The plaintext. - */ - decrypt(data) { - return this._crypt(data, 1); - } - - /** - * Expand the S-box tables. - * - * @private - */ - _precompute() { - const encTable = this._tables[0]; - const decTable = this._tables[1]; - const sbox = encTable[4]; - const sboxInv = decTable[4]; - const d = []; - const th = []; - let xInv, x2, x4, x8; - - // Compute double and third tables - for (let i = 0; i < 256; i++) { - th[(d[i] = i << 1 ^ (i >> 7) * 283) ^ i] = i; - } - - for (let x = xInv = 0; !sbox[x]; x ^= x2 || 1, xInv = th[xInv] || 1) { - // Compute sbox - let s = xInv ^ xInv << 1 ^ xInv << 2 ^ xInv << 3 ^ xInv << 4; - s = s >> 8 ^ s & 255 ^ 99; - sbox[x] = s; - sboxInv[s] = x; - - // Compute MixColumns - x8 = d[x4 = d[x2 = d[x]]]; - let tDec = x8 * 0x1010101 ^ x4 * 0x10001 ^ x2 * 0x101 ^ x * 0x1010100; - let tEnc = d[s] * 0x101 ^ s * 0x1010100; - - for (let i = 0; i < 4; i++) { - encTable[i][x] = tEnc = tEnc << 24 ^ tEnc >>> 8; - decTable[i][s] = tDec = tDec << 24 ^ tDec >>> 8; - } - } - - // Compactify. Considerable speedup on Firefox. - for (let i = 0; i < 5; i++) { - encTable[i] = encTable[i].slice(0); - decTable[i] = decTable[i].slice(0); - } - } - - /** - * Encryption and decryption core. - * @param {Array} input Four words to be encrypted or decrypted. - * @param dir The direction, 0 for encrypt and 1 for decrypt. - * @return {Array} The four encrypted or decrypted words. - * @private - */ - _crypt(input, dir) { - if (input.length !== 4) { - throw new Error("invalid aes block size"); - } - - const key = this._key[dir]; - - const nInnerRounds = key.length / 4 - 2; - const out = [0, 0, 0, 0]; - const table = this._tables[dir]; - - // load up the tables - const t0 = table[0]; - const t1 = table[1]; - const t2 = table[2]; - const t3 = table[3]; - const sbox = table[4]; - - // state variables a,b,c,d are loaded with pre-whitened data - let a = input[0] ^ key[0]; - let b = input[dir ? 3 : 1] ^ key[1]; - let c = input[2] ^ key[2]; - let d = input[dir ? 1 : 3] ^ key[3]; - let kIndex = 4; - let a2, b2, c2; - - // Inner rounds. Cribbed from OpenSSL. - for (let i = 0; i < nInnerRounds; i++) { - a2 = t0[a >>> 24] ^ t1[b >> 16 & 255] ^ t2[c >> 8 & 255] ^ t3[d & 255] ^ key[kIndex]; - b2 = t0[b >>> 24] ^ t1[c >> 16 & 255] ^ t2[d >> 8 & 255] ^ t3[a & 255] ^ key[kIndex + 1]; - c2 = t0[c >>> 24] ^ t1[d >> 16 & 255] ^ t2[a >> 8 & 255] ^ t3[b & 255] ^ key[kIndex + 2]; - d = t0[d >>> 24] ^ t1[a >> 16 & 255] ^ t2[b >> 8 & 255] ^ t3[c & 255] ^ key[kIndex + 3]; - kIndex += 4; - a = a2; b = b2; c = c2; - } - - // Last round. - for (let i = 0; i < 4; i++) { - out[dir ? 3 & -i : i] = - sbox[a >>> 24] << 24 ^ - sbox[b >> 16 & 255] << 16 ^ - sbox[c >> 8 & 255] << 8 ^ - sbox[d & 255] ^ - key[kIndex++]; - a2 = a; a = b; b = c; c = d; d = a2; - } - - return out; - } - }; - - /** @fileOverview CTR mode implementation. - * - * Special thanks to Roy Nicholson for pointing out a bug in our - * implementation. - * - * @author Emily Stark - * @author Mike Hamburg - * @author Dan Boneh - */ - - /** Brian Gladman's CTR Mode. - * @constructor - * @param {Object} _prf The aes instance to generate key. - * @param {bitArray} _iv The iv for ctr mode, it must be 128 bits. - */ - - const mode = {}; - - /** - * Brian Gladman's CTR Mode. - * @namespace - */ - mode.ctrGladman = class { - constructor(prf, iv) { - this._prf = prf; - this._initIv = iv; - this._iv = iv; - } - - reset() { - this._iv = this._initIv; - } - - /** Input some data to calculate. - * @param {bitArray} data the data to process, it must be intergral multiple of 128 bits unless it's the last. - */ - update(data) { - return this.calculate(this._prf, data, this._iv); - } - - incWord(word) { - if (((word >> 24) & 0xff) === 0xff) { //overflow - let b1 = (word >> 16) & 0xff; - let b2 = (word >> 8) & 0xff; - let b3 = word & 0xff; - - if (b1 === 0xff) { // overflow b1 - b1 = 0; - if (b2 === 0xff) { - b2 = 0; - if (b3 === 0xff) { - b3 = 0; - } else { - ++b3; - } - } else { - ++b2; - } - } else { - ++b1; - } - - word = 0; - word += (b1 << 16); - word += (b2 << 8); - word += b3; - } else { - word += (0x01 << 24); - } - return word; - } - - incCounter(counter) { - if ((counter[0] = this.incWord(counter[0])) === 0) { - // encr_data in fileenc.c from Dr Brian Gladman's counts only with DWORD j < 8 - counter[1] = this.incWord(counter[1]); - } - } - - calculate(prf, data, iv) { - let l; - if (!(l = data.length)) { - return []; - } - const bl = bitArray.bitLength(data); - for (let i = 0; i < l; i += 4) { - this.incCounter(iv); - const e = prf.encrypt(iv); - data[i] ^= e[0]; - data[i + 1] ^= e[1]; - data[i + 2] ^= e[2]; - data[i + 3] ^= e[3]; - } - return bitArray.clamp(data, bl); - } - }; - - - const misc = {}; - - /** @fileOverview HMAC implementation. - * - * @author Emily Stark - * @author Mike Hamburg - * @author Dan Boneh - */ - - /** HMAC with the specified hash function. - * @constructor - * @param {bitArray} key the key for HMAC. - * @param {Object} [Hash=hash.sha1] The hash function to use. - */ - misc.hmacSha1 = class { - - constructor(key) { - const hmac = this; - const Hash = hmac._hash = hash.sha1; - const exKey = [[], []]; - const bs = Hash.prototype.blockSize / 32; - hmac._baseHash = [new Hash(), new Hash()]; - - if (key.length > bs) { - key = Hash.hash(key); - } - - for (let i = 0; i < bs; i++) { - exKey[0][i] = key[i] ^ 0x36363636; - exKey[1][i] = key[i] ^ 0x5C5C5C5C; - } - - hmac._baseHash[0].update(exKey[0]); - hmac._baseHash[1].update(exKey[1]); - hmac._resultHash = new Hash(hmac._baseHash[0]); - } - reset() { - const hmac = this; - hmac._resultHash = new hmac._hash(hmac._baseHash[0]); - hmac._updated = false; - } - - update(data) { - const hmac = this; - hmac._updated = true; - hmac._resultHash.update(data); - } - - digest() { - const hmac = this; - const w = hmac._resultHash.finalize(); - const result = new (hmac._hash)(hmac._baseHash[1]).update(w).finalize(); - - hmac.reset(); - - return result; - } - }; - - /* - Copyright (c) 2021 Gildas Lormeau. All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the distribution. - - 3. The names of the authors may not be used to endorse or promote products - derived from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, - INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND - FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT, - INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, - INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, - OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, - EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - - const ERR_INVALID_PASSWORD = "Invalid pasword"; - const BLOCK_LENGTH = 16; - const RAW_FORMAT = "raw"; - const PBKDF2_ALGORITHM = { name: "PBKDF2" }; - const HASH_ALGORITHM = { name: "HMAC" }; - const HASH_FUNCTION = "SHA-1"; - const BASE_KEY_ALGORITHM = Object.assign({ hash: HASH_ALGORITHM }, PBKDF2_ALGORITHM); - const DERIVED_BITS_ALGORITHM = Object.assign({ iterations: 1000, hash: { name: HASH_FUNCTION } }, PBKDF2_ALGORITHM); - const DERIVED_BITS_USAGE = ["deriveBits"]; - const SALT_LENGTH = [8, 12, 16]; - const KEY_LENGTH = [16, 24, 32]; - const SIGNATURE_LENGTH = 10; - const COUNTER_DEFAULT_VALUE = [0, 0, 0, 0]; - const subtle = crypto.subtle; - const codecBytes = codec.bytes; - const Aes = cipher.aes; - const CtrGladman = mode.ctrGladman; - const HmacSha1 = misc.hmacSha1; - class AESDecrypt { - - constructor(password, signed, strength) { - Object.assign(this, { - password, - signed, - strength: strength - 1, - pendingInput: new Uint8Array(0) - }); - } - - async append(input) { - const aesCrypto = this; - if (aesCrypto.password) { - const preamble = subarray(input, 0, SALT_LENGTH[aesCrypto.strength] + 2); - await createDecryptionKeys(aesCrypto, preamble, aesCrypto.password); - aesCrypto.password = null; - aesCrypto.aesCtrGladman = new CtrGladman(new Aes(aesCrypto.keys.key), Array.from(COUNTER_DEFAULT_VALUE)); - aesCrypto.hmac = new HmacSha1(aesCrypto.keys.authentication); - input = subarray(input, SALT_LENGTH[aesCrypto.strength] + 2); - } - const output = new Uint8Array(input.length - SIGNATURE_LENGTH - ((input.length - SIGNATURE_LENGTH) % BLOCK_LENGTH)); - return append(aesCrypto, input, output, 0, SIGNATURE_LENGTH, true); - } - - async flush() { - const aesCrypto = this; - const pendingInput = aesCrypto.pendingInput; - const chunkToDecrypt = subarray(pendingInput, 0, pendingInput.length - SIGNATURE_LENGTH); - const originalSignature = subarray(pendingInput, pendingInput.length - SIGNATURE_LENGTH); - let decryptedChunkArray = new Uint8Array(0); - if (chunkToDecrypt.length) { - const encryptedChunk = codecBytes.toBits(chunkToDecrypt); - aesCrypto.hmac.update(encryptedChunk); - const decryptedChunk = aesCrypto.aesCtrGladman.update(encryptedChunk); - decryptedChunkArray = codecBytes.fromBits(decryptedChunk); - } - let valid = true; - if (aesCrypto.signed) { - const signature = subarray(codecBytes.fromBits(aesCrypto.hmac.digest()), 0, SIGNATURE_LENGTH); - for (let indexSignature = 0; indexSignature < SIGNATURE_LENGTH; indexSignature++) { - if (signature[indexSignature] != originalSignature[indexSignature]) { - valid = false; - } - } - } - return { - valid, - data: decryptedChunkArray - }; - } - } - - class AESEncrypt { - - constructor(password, strength) { - Object.assign(this, { - password, - strength: strength - 1, - pendingInput: new Uint8Array(0) - }); - } - - async append(input) { - const aesCrypto = this; - let preamble = new Uint8Array(0); - if (aesCrypto.password) { - preamble = await createEncryptionKeys(aesCrypto, aesCrypto.password); - aesCrypto.password = null; - aesCrypto.aesCtrGladman = new CtrGladman(new Aes(aesCrypto.keys.key), Array.from(COUNTER_DEFAULT_VALUE)); - aesCrypto.hmac = new HmacSha1(aesCrypto.keys.authentication); - } - const output = new Uint8Array(preamble.length + input.length - (input.length % BLOCK_LENGTH)); - output.set(preamble, 0); - return append(aesCrypto, input, output, preamble.length, 0); - } - - async flush() { - const aesCrypto = this; - let encryptedChunkArray = new Uint8Array(0); - if (aesCrypto.pendingInput.length) { - const encryptedChunk = aesCrypto.aesCtrGladman.update(codecBytes.toBits(aesCrypto.pendingInput)); - aesCrypto.hmac.update(encryptedChunk); - encryptedChunkArray = codecBytes.fromBits(encryptedChunk); - } - const signature = subarray(codecBytes.fromBits(aesCrypto.hmac.digest()), 0, SIGNATURE_LENGTH); - return { - data: concat(encryptedChunkArray, signature), - signature - }; - } - } - - function append(aesCrypto, input, output, paddingStart, paddingEnd, verifySignature) { - const inputLength = input.length - paddingEnd; - if (aesCrypto.pendingInput.length) { - input = concat(aesCrypto.pendingInput, input); - output = expand(output, inputLength - (inputLength % BLOCK_LENGTH)); - } - let offset; - for (offset = 0; offset <= inputLength - BLOCK_LENGTH; offset += BLOCK_LENGTH) { - const inputChunk = codecBytes.toBits(subarray(input, offset, offset + BLOCK_LENGTH)); - if (verifySignature) { - aesCrypto.hmac.update(inputChunk); - } - const outputChunk = aesCrypto.aesCtrGladman.update(inputChunk); - if (!verifySignature) { - aesCrypto.hmac.update(outputChunk); - } - output.set(codecBytes.fromBits(outputChunk), offset + paddingStart); - } - aesCrypto.pendingInput = subarray(input, offset); - return output; - } - - async function createDecryptionKeys(decrypt, preambleArray, password) { - await createKeys$1(decrypt, password, subarray(preambleArray, 0, SALT_LENGTH[decrypt.strength])); - const passwordVerification = subarray(preambleArray, SALT_LENGTH[decrypt.strength]); - const passwordVerificationKey = decrypt.keys.passwordVerification; - if (passwordVerificationKey[0] != passwordVerification[0] || passwordVerificationKey[1] != passwordVerification[1]) { - throw new Error(ERR_INVALID_PASSWORD); - } - } - - async function createEncryptionKeys(encrypt, password) { - const salt = crypto.getRandomValues(new Uint8Array(SALT_LENGTH[encrypt.strength])); - await createKeys$1(encrypt, password, salt); - return concat(salt, encrypt.keys.passwordVerification); - } - - async function createKeys$1(target, password, salt) { - const encodedPassword = (new TextEncoder()).encode(password); - const basekey = await subtle.importKey(RAW_FORMAT, encodedPassword, BASE_KEY_ALGORITHM, false, DERIVED_BITS_USAGE); - const derivedBits = await subtle.deriveBits(Object.assign({ salt }, DERIVED_BITS_ALGORITHM), basekey, 8 * ((KEY_LENGTH[target.strength] * 2) + 2)); - const compositeKey = new Uint8Array(derivedBits); - target.keys = { - key: codecBytes.toBits(subarray(compositeKey, 0, KEY_LENGTH[target.strength])), - authentication: codecBytes.toBits(subarray(compositeKey, KEY_LENGTH[target.strength], KEY_LENGTH[target.strength] * 2)), - passwordVerification: subarray(compositeKey, KEY_LENGTH[target.strength] * 2) - }; - } - - function concat(leftArray, rightArray) { - let array = leftArray; - if (leftArray.length + rightArray.length) { - array = new Uint8Array(leftArray.length + rightArray.length); - array.set(leftArray, 0); - array.set(rightArray, leftArray.length); - } - return array; - } - - function expand(inputArray, length) { - if (length && length > inputArray.length) { - const array = inputArray; - inputArray = new Uint8Array(length); - inputArray.set(array, 0); - } - return inputArray; - } - - function subarray(array, begin, end) { - return array.subarray(begin, end); - } - - /* - Copyright (c) 2021 Gildas Lormeau. All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the distribution. - - 3. The names of the authors may not be used to endorse or promote products - derived from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, - INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND - FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT, - INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, - INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, - OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, - EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - - const HEADER_LENGTH = 12; - - class ZipCryptoDecrypt { - - constructor(password, passwordVerification) { - const zipCrypto = this; - Object.assign(zipCrypto, { - password, - passwordVerification - }); - createKeys(zipCrypto, password); - } - - async append(input) { - const zipCrypto = this; - if (zipCrypto.password) { - const decryptedHeader = decrypt(zipCrypto, input.subarray(0, HEADER_LENGTH)); - zipCrypto.password = null; - if (decryptedHeader[HEADER_LENGTH - 1] != zipCrypto.passwordVerification) { - throw new Error(ERR_INVALID_PASSWORD); - } - input = input.subarray(HEADER_LENGTH); - } - return decrypt(zipCrypto, input); - } - - async flush() { - return { - valid: true, - data: new Uint8Array(0) - }; - } - } - - class ZipCryptoEncrypt { - - constructor(password, passwordVerification) { - const zipCrypto = this; - Object.assign(zipCrypto, { - password, - passwordVerification - }); - createKeys(zipCrypto, password); - } - - async append(input) { - const zipCrypto = this; - let output; - let offset; - if (zipCrypto.password) { - zipCrypto.password = null; - const header = crypto.getRandomValues(new Uint8Array(HEADER_LENGTH)); - header[HEADER_LENGTH - 1] = zipCrypto.passwordVerification; - output = new Uint8Array(input.length + header.length); - output.set(encrypt(zipCrypto, header), 0); - offset = HEADER_LENGTH; - } else { - output = new Uint8Array(input.length); - offset = 0; - } - output.set(encrypt(zipCrypto, input), offset); - return output; - } - - async flush() { - return { - data: new Uint8Array(0) - }; - } - } - - function decrypt(target, input) { - const output = new Uint8Array(input.length); - for (let index = 0; index < input.length; index++) { - output[index] = getByte(target) ^ input[index]; - updateKeys(target, output[index]); - } - return output; - } - - function encrypt(target, input) { - const output = new Uint8Array(input.length); - for (let index = 0; index < input.length; index++) { - output[index] = getByte(target) ^ input[index]; - updateKeys(target, input[index]); - } - return output; - } - - function createKeys(target, password) { - target.keys = [0x12345678, 0x23456789, 0x34567890]; - target.crcKey0 = new Crc32(target.keys[0]); - target.crcKey2 = new Crc32(target.keys[2]); - for (let index = 0; index < password.length; index++) { - updateKeys(target, password.charCodeAt(index)); - } - } - - function updateKeys(target, byte) { - target.crcKey0.append([byte]); - target.keys[0] = ~target.crcKey0.get(); - target.keys[1] = getInt32(target.keys[1] + getInt8(target.keys[0])); - target.keys[1] = getInt32(Math.imul(target.keys[1], 134775813) + 1); - target.crcKey2.append([target.keys[1] >>> 24]); - target.keys[2] = ~target.crcKey2.get(); - } - - function getByte(target) { - const temp = target.keys[2] | 2; - return getInt8(Math.imul(temp, (temp ^ 1)) >>> 8); - } - - function getInt8(number) { - return number & 0xFF; - } - - function getInt32(number) { - return number & 0xFFFFFFFF; - } - - /* - Copyright (c) 2021 Gildas Lormeau. All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the distribution. - - 3. The names of the authors may not be used to endorse or promote products - derived from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, - INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND - FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT, - INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, - INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, - OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, - EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - - const CODEC_DEFLATE = "deflate"; - const CODEC_INFLATE = "inflate"; - const ERR_INVALID_SIGNATURE = "Invalid signature"; - - class Inflate { - - constructor(codecConstructor, { - signature, - password, - signed, - compressed, - zipCrypto, - passwordVerification, - encryptionStrength - }, { chunkSize }) { - const encrypted = Boolean(password); - Object.assign(this, { - signature, - encrypted, - signed, - compressed, - inflate: compressed && new codecConstructor({ chunkSize }), - crc32: signed && new Crc32(), - zipCrypto, - decrypt: encrypted && zipCrypto ? - new ZipCryptoDecrypt(password, passwordVerification) : - new AESDecrypt(password, signed, encryptionStrength) - }); - } - - async append(data) { - const codec = this; - if (codec.encrypted && data.length) { - data = await codec.decrypt.append(data); - } - if (codec.compressed && data.length) { - data = await codec.inflate.append(data); - } - if ((!codec.encrypted || codec.zipCrypto) && codec.signed && data.length) { - codec.crc32.append(data); - } - return data; - } - - async flush() { - const codec = this; - let signature; - let data = new Uint8Array(0); - if (codec.encrypted) { - const result = await codec.decrypt.flush(); - if (!result.valid) { - throw new Error(ERR_INVALID_SIGNATURE); - } - data = result.data; - } - if ((!codec.encrypted || codec.zipCrypto) && codec.signed) { - const dataViewSignature = new DataView(new Uint8Array(4).buffer); - signature = codec.crc32.get(); - dataViewSignature.setUint32(0, signature); - if (codec.cipher != dataViewSignature.getUint32(0, false)) { - throw new Error(ERR_INVALID_SIGNATURE); - } - } - if (codec.compressed) { - data = (await codec.inflate.append(data)) || new Uint8Array(0); - await codec.inflate.flush(); - } - return { data, signature }; - } - } - - class Deflate { - - constructor(codecConstructor, { - encrypted, - signed, - compressed, - level, - zipCrypto, - password, - passwordVerification, - encryptionStrength - }, { chunkSize }) { - Object.assign(this, { - encrypted, - signed, - compressed, - deflate: compressed && new codecConstructor({ level: level || 5, chunkSize }), - crc32: signed && new Crc32(), - zipCrypto, - encrypt: encrypted && zipCrypto ? - new ZipCryptoEncrypt(password, passwordVerification) : - new AESEncrypt(password, encryptionStrength) - }); - } - - async append(inputData) { - const codec = this; - let data = inputData; - if (codec.compressed && inputData.length) { - data = await codec.deflate.append(inputData); - } - if (codec.encrypted && data.length) { - data = await codec.encrypt.append(data); - } - if ((!codec.encrypted || codec.zipCrypto) && codec.signed && inputData.length) { - codec.crc32.append(inputData); - } - return data; - } - - async flush() { - const codec = this; - let signature; - let data = new Uint8Array(0); - if (codec.compressed) { - data = (await codec.deflate.flush()) || new Uint8Array(0); - } - if (codec.encrypted) { - data = await codec.encrypt.append(data); - const result = await codec.encrypt.flush(); - signature = result.signature; - const newData = new Uint8Array(data.length + result.data.length); - newData.set(data, 0); - newData.set(result.data, data.length); - data = newData; - } - if ((!codec.encrypted || codec.zipCrypto) && codec.signed) { - signature = codec.crc32.get(); - } - return { data, signature }; - } - } - - function createCodec$1(codecConstructor, options, config) { - if (options.codecType.startsWith(CODEC_DEFLATE)) { - return new Deflate(codecConstructor, options, config); - } else if (options.codecType.startsWith(CODEC_INFLATE)) { - return new Inflate(codecConstructor, options, config); - } - } - - /* - Copyright (c) 2021 Gildas Lormeau. All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the distribution. - - 3. The names of the authors may not be used to endorse or promote products - derived from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, - INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND - FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT, - INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, - INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, - OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, - EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - - const MESSAGE_INIT = "init"; - const MESSAGE_APPEND = "append"; - const MESSAGE_FLUSH = "flush"; - const MESSAGE_EVENT_TYPE = "message"; - - var getWorker = (workerData, codecConstructor, options, config, onTaskFinished, webWorker, scripts) => { - Object.assign(workerData, { - busy: true, - codecConstructor, - options: Object.assign({}, options), - scripts, - webWorker, - onTaskFinished() { - workerData.busy = false; - const terminateWorker = onTaskFinished(workerData); - if (terminateWorker && workerData.worker) { - workerData.worker.terminate(); - } - } - }); - return webWorker ? createWebWorkerInterface(workerData, config) : createWorkerInterface(workerData, config); - }; - - function createWorkerInterface(workerData, config) { - const interfaceCodec = createCodec$1(workerData.codecConstructor, workerData.options, config); - return { - async append(data) { - try { - return await interfaceCodec.append(data); - } catch (error) { - workerData.onTaskFinished(); - throw error; - } - }, - async flush() { - try { - return await interfaceCodec.flush(); - } finally { - workerData.onTaskFinished(); - } - } - }; - } - - function createWebWorkerInterface(workerData, config) { - let messageTask; - if (!workerData.interface) { - workerData.worker = new Worker(new URL(workerData.scripts[0], (typeof document === 'undefined' ? new (require('u' + 'rl').URL)('file:' + __filename).href : (document.currentScript && document.currentScript.src || new URL('zip-fs.js', document.baseURI).href)))); - workerData.worker.addEventListener(MESSAGE_EVENT_TYPE, onMessage, false); - workerData.interface = { - append(data) { - return initAndSendMessage({ type: MESSAGE_APPEND, data }); - }, - flush() { - return initAndSendMessage({ type: MESSAGE_FLUSH }); - } - }; - } - return workerData.interface; - - async function initAndSendMessage(message) { - if (!messageTask) { - const options = workerData.options; - const scripts = workerData.scripts.slice(1); - await sendMessage({ scripts, type: MESSAGE_INIT, options, config: { chunkSize: config.chunkSize } }); - } - return sendMessage(message); - } - - function sendMessage(message) { - const worker = workerData.worker; - const result = new Promise((resolve, reject) => messageTask = { resolve, reject }); - try { - if (message.data) { - try { - message.data = message.data.buffer; - worker.postMessage(message, [message.data]); - } catch (error) { - worker.postMessage(message); - } - } else { - worker.postMessage(message); - } - } catch (error) { - messageTask.reject(error); - messageTask = null; - workerData.onTaskFinished(); - } - return result; - } - - function onMessage(event) { - const message = event.data; - if (messageTask) { - const reponseError = message.error; - const type = message.type; - if (reponseError) { - const error = new Error(reponseError.message); - error.stack = reponseError.stack; - messageTask.reject(error); - messageTask = null; - workerData.onTaskFinished(); - } else if (type == MESSAGE_INIT || type == MESSAGE_FLUSH || type == MESSAGE_APPEND) { - const data = message.data; - if (type == MESSAGE_FLUSH) { - messageTask.resolve({ data: new Uint8Array(data), signature: message.signature }); - messageTask = null; - workerData.onTaskFinished(); - } else { - messageTask.resolve(data && new Uint8Array(data)); - } - } - } - } - } - - /* - Copyright (c) 2021 Gildas Lormeau. All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the distribution. - - 3. The names of the authors may not be used to endorse or promote products - derived from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, - INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND - FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT, - INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, - INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, - OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, - EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - - let pool = []; - let pendingRequests = []; - - function createCodec(codecConstructor, options, config) { - const streamCopy = !options.compressed && !options.signed && !options.encrypted; - const webWorker = !streamCopy && (options.useWebWorkers || (options.useWebWorkers === undefined && config.useWebWorkers)); - const scripts = webWorker && config.workerScripts ? config.workerScripts[options.codecType] : []; - if (pool.length < config.maxWorkers) { - const workerData = {}; - pool.push(workerData); - return getWorker(workerData, codecConstructor, options, config, onTaskFinished, webWorker, scripts); - } else { - const workerData = pool.find(workerData => !workerData.busy); - if (workerData) { - return getWorker(workerData, codecConstructor, options, config, onTaskFinished, webWorker, scripts); - } else { - return new Promise(resolve => pendingRequests.push({ resolve, codecConstructor, options, webWorker, scripts })); - } - } - - function onTaskFinished(workerData) { - const finished = !pendingRequests.length; - if (finished) { - pool = pool.filter(data => data != workerData); - } else { - const [{ resolve, codecConstructor, options, webWorker, scripts }] = pendingRequests.splice(0, 1); - resolve(getWorker(workerData, codecConstructor, options, config, onTaskFinished, webWorker, scripts)); - } - return finished; - } - } - - /* - Copyright (c) 2021 Gildas Lormeau. All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the distribution. - - 3. The names of the authors may not be used to endorse or promote products - derived from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, - INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND - FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT, - INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, - INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, - OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, - EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - - const MINIMUM_CHUNK_SIZE = 64; - const ERR_ABORT = "Abort error"; - - async function processData(codec, reader, writer, offset, inputLength, config, options) { - const chunkSize = Math.max(config.chunkSize, MINIMUM_CHUNK_SIZE); - return processChunk(); - - async function processChunk(chunkOffset = 0, outputLength = 0) { - const signal = options.signal; - if (chunkOffset < inputLength) { - testAborted(signal); - const inputData = await reader.readUint8Array(chunkOffset + offset, Math.min(chunkSize, inputLength - chunkOffset)); - const chunkLength = inputData.length; - testAborted(signal); - const data = await codec.append(inputData); - testAborted(signal); - outputLength += await writeData(writer, data); - if (options.onprogress) { - try { - options.onprogress(chunkOffset + chunkLength, inputLength); - } catch (error) { - // ignored - } - } - return processChunk(chunkOffset + chunkSize, outputLength); - } else { - const result = await codec.flush(); - outputLength += await writeData(writer, result.data); - return { signature: result.signature, length: outputLength }; - } - } - } - - function testAborted(signal) { - if (signal && signal.aborted) { - throw new Error(ERR_ABORT); - } - } - - async function writeData(writer, data) { - if (data.length) { - await writer.writeUint8Array(data); - } - return data.length; - } - - /* - Copyright (c) 2021 Gildas Lormeau. All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the distribution. - - 3. The names of the authors may not be used to endorse or promote products - derived from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, - INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND - FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT, - INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, - INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, - OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, - EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - - const PROPERTY_NAMES = [ - "filename", "rawFilename", "directory", "encrypted", "compressedSize", "uncompressedSize", - "lastModDate", "rawLastModDate", "comment", "rawComment", "signature", "extraField", - "rawExtraField", "bitFlag", "extraFieldZip64", "extraFieldUnicodePath", "extraFieldUnicodeComment", - "extraFieldAES", "filenameUTF8", "commentUTF8", "offset", "zip64"]; - - class Entry { - - constructor(data) { - PROPERTY_NAMES.forEach(name => this[name] = data[name]); - } - - } - - /* - Copyright (c) 2021 Gildas Lormeau. All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the distribution. - - 3. The names of the authors may not be used to endorse or promote products - derived from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, - INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND - FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT, - INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, - INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, - OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, - EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - - const ERR_BAD_FORMAT = "File format is not recognized"; - const ERR_EOCDR_NOT_FOUND = "End of central directory not found"; - const ERR_EOCDR_ZIP64_NOT_FOUND = "End of Zip64 central directory not found"; - const ERR_EOCDR_LOCATOR_ZIP64_NOT_FOUND = "End of Zip64 central directory locator not found"; - const ERR_CENTRAL_DIRECTORY_NOT_FOUND = "Central directory header not found"; - const ERR_LOCAL_FILE_HEADER_NOT_FOUND = "Local file header not found"; - const ERR_EXTRAFIELD_ZIP64_NOT_FOUND = "Zip64 extra field not found"; - const ERR_ENCRYPTED = "File contains encrypted entry"; - const ERR_UNSUPPORTED_ENCRYPTION = "Encryption method not supported"; - const ERR_UNSUPPORTED_COMPRESSION = "Compression method not supported"; - const CHARSET_UTF8 = "utf-8"; - const ZIP64_PROPERTIES = ["uncompressedSize", "compressedSize", "offset"]; - - class ZipReader { - - constructor(reader, options = {}) { - Object.assign(this, { - reader, - options, - config: getConfiguration() - }); - } - - async getEntries(options = {}) { - const zipReader = this; - const reader = zipReader.reader; - if (!reader.initialized) { - await reader.init(); - } - if (reader.size < END_OF_CENTRAL_DIR_LENGTH) { - throw new Error(ERR_BAD_FORMAT); - } - const endOfDirectoryInfo = await seekSignature(reader, END_OF_CENTRAL_DIR_SIGNATURE, reader.size, END_OF_CENTRAL_DIR_LENGTH, MAX_16_BITS * 16); - if (!endOfDirectoryInfo) { - throw new Error(ERR_EOCDR_NOT_FOUND); - } - const endOfDirectoryView = getDataView$1(endOfDirectoryInfo); - let directoryDataLength = getUint32(endOfDirectoryView, 12); - let directoryDataOffset = getUint32(endOfDirectoryView, 16); - let filesLength = getUint16(endOfDirectoryView, 8); - let prependedDataLength = 0; - if (directoryDataOffset == MAX_32_BITS || filesLength == MAX_16_BITS) { - const endOfDirectoryLocatorArray = await readUint8Array(reader, endOfDirectoryInfo.offset - ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH, ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH); - const endOfDirectoryLocatorView = getDataView$1(endOfDirectoryLocatorArray); - if (getUint32(endOfDirectoryLocatorView, 0) != ZIP64_END_OF_CENTRAL_DIR_LOCATOR_SIGNATURE) { - throw new Error(ERR_EOCDR_ZIP64_NOT_FOUND); - } - directoryDataOffset = getBigUint64(endOfDirectoryLocatorView, 8); - let endOfDirectoryArray = await readUint8Array(reader, directoryDataOffset, ZIP64_END_OF_CENTRAL_DIR_LENGTH); - let endOfDirectoryView = getDataView$1(endOfDirectoryArray); - const expectedDirectoryDataOffset = endOfDirectoryInfo.offset - ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH - ZIP64_END_OF_CENTRAL_DIR_LENGTH; - if (getUint32(endOfDirectoryView, 0) != ZIP64_END_OF_CENTRAL_DIR_SIGNATURE && directoryDataOffset != expectedDirectoryDataOffset) { - const originalDirectoryDataOffset = directoryDataOffset; - directoryDataOffset = expectedDirectoryDataOffset; - prependedDataLength = directoryDataOffset - originalDirectoryDataOffset; - endOfDirectoryArray = await readUint8Array(reader, directoryDataOffset, ZIP64_END_OF_CENTRAL_DIR_LENGTH); - endOfDirectoryView = getDataView$1(endOfDirectoryArray); - } - if (getUint32(endOfDirectoryView, 0) != ZIP64_END_OF_CENTRAL_DIR_SIGNATURE) { - throw new Error(ERR_EOCDR_LOCATOR_ZIP64_NOT_FOUND); - } - filesLength = getBigUint64(endOfDirectoryView, 24); - directoryDataLength = getUint32(endOfDirectoryLocatorView, 4); - directoryDataOffset -= getBigUint64(endOfDirectoryView, 40); - } - if (directoryDataOffset < 0 || directoryDataOffset >= reader.size) { - throw new Error(ERR_BAD_FORMAT); - } - let offset = 0; - let directoryArray = await readUint8Array(reader, directoryDataOffset, reader.size - directoryDataOffset); - let directoryView = getDataView$1(directoryArray); - const expectedDirectoryDataOffset = endOfDirectoryInfo.offset - directoryDataLength; - if (getUint32(directoryView, offset) != CENTRAL_FILE_HEADER_SIGNATURE && directoryDataOffset != expectedDirectoryDataOffset) { - const originalDirectoryDataOffset = directoryDataOffset; - directoryDataOffset = expectedDirectoryDataOffset; - prependedDataLength = directoryDataOffset - originalDirectoryDataOffset; - directoryArray = await readUint8Array(reader, directoryDataOffset, reader.size - directoryDataOffset); - directoryView = getDataView$1(directoryArray); - } - if (directoryDataOffset < 0 || directoryDataOffset >= reader.size) { - throw new Error(ERR_BAD_FORMAT); - } - const entries = []; - for (let indexFile = 0; indexFile < filesLength; indexFile++) { - const fileEntry = new ZipEntry$1(reader, zipReader.config, zipReader.options); - if (getUint32(directoryView, offset) != CENTRAL_FILE_HEADER_SIGNATURE) { - throw new Error(ERR_CENTRAL_DIRECTORY_NOT_FOUND); - } - readCommonHeader(fileEntry, directoryView, offset + 6); - const languageEncodingFlag = Boolean(fileEntry.bitFlag.languageEncodingFlag); - const filenameOffset = offset + 46; - const extraFieldOffset = filenameOffset + fileEntry.filenameLength; - const commentOffset = extraFieldOffset + fileEntry.extraFieldLength; - Object.assign(fileEntry, { - compressedSize: 0, - uncompressedSize: 0, - commentLength: getUint16(directoryView, offset + 32), - directory: (getUint8(directoryView, offset + 38) & FILE_ATTR_MSDOS_DIR_MASK) == FILE_ATTR_MSDOS_DIR_MASK, - offset: getUint32(directoryView, offset + 42) + prependedDataLength, - rawFilename: directoryArray.subarray(filenameOffset, extraFieldOffset), - filenameUTF8: languageEncodingFlag, - commentUTF8: languageEncodingFlag, - rawExtraField: directoryArray.subarray(extraFieldOffset, commentOffset) - }); - const endOffset = commentOffset + fileEntry.commentLength; - fileEntry.rawComment = directoryArray.subarray(commentOffset, endOffset); - fileEntry.filename = decodeString(fileEntry.rawFilename, fileEntry.filenameUTF8 ? CHARSET_UTF8 : getOptionValue$1(zipReader, options, "filenameEncoding")); - fileEntry.comment = decodeString(fileEntry.rawComment, fileEntry.commentUTF8 ? CHARSET_UTF8 : getOptionValue$1(zipReader, options, "commentEncoding")); - if (!fileEntry.directory && fileEntry.filename.endsWith(DIRECTORY_SIGNATURE)) { - fileEntry.directory = true; - } - readCommonFooter(fileEntry, fileEntry, directoryView, offset + 6); - const entry = new Entry(fileEntry); - entry.getData = (writer, options) => fileEntry.getData(writer, options); - entries.push(entry); - offset = endOffset; - } - return entries; - } - - async close() { - } - } - - class ZipEntry$1 { - - constructor(reader, config, options) { - Object.assign(this, { - reader, - config, - options - }); - } - - async getData(writer, options = {}) { - const zipEntry = this; - const { - reader, - offset, - extraFieldAES, - compressionMethod, - config, - bitFlag, - signature, - rawLastModDate, - compressedSize - } = zipEntry; - const localDirectory = zipEntry.localDirectory = {}; - if (!reader.initialized) { - await reader.init(); - } - const dataArray = await readUint8Array(reader, offset, 30); - const dataView = getDataView$1(dataArray); - let password = getOptionValue$1(zipEntry, options, "password"); - password = password && password.length && password; - if (extraFieldAES) { - if (extraFieldAES.originalCompressionMethod != COMPRESSION_METHOD_AES) { - throw new Error(ERR_UNSUPPORTED_COMPRESSION); - } - } - if (compressionMethod != COMPRESSION_METHOD_STORE && compressionMethod != COMPRESSION_METHOD_DEFLATE) { - throw new Error(ERR_UNSUPPORTED_COMPRESSION); - } - if (getUint32(dataView, 0) != LOCAL_FILE_HEADER_SIGNATURE) { - throw new Error(ERR_LOCAL_FILE_HEADER_NOT_FOUND); - } - readCommonHeader(localDirectory, dataView, 4); - const extraFieldOffset = offset + 30 + localDirectory.filenameLength; - const dataOffset = extraFieldOffset + localDirectory.extraFieldLength; - localDirectory.rawExtraField = dataArray.subarray(extraFieldOffset, dataOffset); - readCommonFooter(zipEntry, localDirectory, dataView, 4); - const encrypted = zipEntry.encrypted && localDirectory.encrypted; - const zipCrypto = encrypted && !extraFieldAES; - if (encrypted) { - if (!zipCrypto && extraFieldAES.strength === undefined) { - throw new Error(ERR_UNSUPPORTED_ENCRYPTION); - } else if (!password) { - throw new Error(ERR_ENCRYPTED); - } - } - const codec = await createCodec(config.Inflate, { - codecType: CODEC_INFLATE, - password, - zipCrypto, - encryptionStrength: extraFieldAES && extraFieldAES.strength, - signed: getOptionValue$1(zipEntry, options, "checkSignature"), - passwordVerification: zipCrypto && (bitFlag.dataDescriptor ? ((rawLastModDate >>> 8) & 0xFF) : ((signature >>> 24) & 0xFF)), - signature, - compressed: compressionMethod != 0, - encrypted, - useWebWorkers: getOptionValue$1(zipEntry, options, "useWebWorkers") - }, config); - if (!writer.initialized) { - await writer.init(); - } - const signal = getOptionValue$1(zipEntry, options, "signal"); - await processData(codec, reader, writer, dataOffset, compressedSize, config, { onprogress: options.onprogress, signal }); - return writer.getData(); - } - } - - function readCommonHeader(directory, dataView, offset) { - const rawBitFlag = directory.rawBitFlag = getUint16(dataView, offset + 2); - const encrypted = (rawBitFlag & BITFLAG_ENCRYPTED) == BITFLAG_ENCRYPTED; - Object.assign(directory, { - encrypted, - version: getUint16(dataView, offset), - bitFlag: { - level: (rawBitFlag & BITFLAG_LEVEL) >> 1, - dataDescriptor: (rawBitFlag & BITFLAG_DATA_DESCRIPTOR) == BITFLAG_DATA_DESCRIPTOR, - languageEncodingFlag: (rawBitFlag & BITFLAG_LANG_ENCODING_FLAG) == BITFLAG_LANG_ENCODING_FLAG - }, - rawLastModDate: getUint32(dataView, offset + 6), - lastModDate: getDate(directory.rawLastModDate), - filenameLength: getUint16(dataView, offset + 22), - extraFieldLength: getUint16(dataView, offset + 24) - }); - } - - function readCommonFooter(fileEntry, directory, dataView, offset) { - const rawExtraField = directory.rawExtraField; - const extraField = directory.extraField = new Map(); - const rawExtraFieldView = getDataView$1(new Uint8Array(rawExtraField)); - let offsetExtraField = 0; - try { - while (offsetExtraField < rawExtraField.length) { - const type = getUint16(rawExtraFieldView, offsetExtraField); - const size = getUint16(rawExtraFieldView, offsetExtraField + 2); - extraField.set(type, { - type, - data: rawExtraField.slice(offsetExtraField + 4, offsetExtraField + 4 + size) - }); - offsetExtraField += 4 + size; - } - } catch (error) { - // ignored - } - const compressionMethod = getUint16(dataView, offset + 4); - directory.signature = getUint32(dataView, offset + 10); - directory.uncompressedSize = getUint32(dataView, offset + 18); - directory.compressedSize = getUint32(dataView, offset + 14); - const extraFieldZip64 = directory.extraFieldZip64 = extraField.get(EXTRAFIELD_TYPE_ZIP64); - if (extraFieldZip64) { - readExtraFieldZip64(extraFieldZip64, directory); - } - const extraFieldUnicodePath = directory.extraFieldUnicodePath = extraField.get(EXTRAFIELD_TYPE_UNICODE_PATH); - if (extraFieldUnicodePath) { - readExtraFieldUnicode(extraFieldUnicodePath, "filename", "rawFilename", directory, fileEntry); - } - const extraFieldUnicodeComment = directory.extraFieldUnicodeComment = extraField.get(EXTRAFIELD_TYPE_UNICODE_COMMENT); - if (extraFieldUnicodeComment) { - readExtraFieldUnicode(extraFieldUnicodeComment, "comment", "rawComment", directory, fileEntry); - } - const extraFieldAES = directory.extraFieldAES = extraField.get(EXTRAFIELD_TYPE_AES); - if (extraFieldAES) { - readExtraFieldAES(extraFieldAES, directory, compressionMethod); - } else { - directory.compressionMethod = compressionMethod; - } - } - - function readExtraFieldZip64(extraFieldZip64, directory) { - directory.zip64 = true; - const extraFieldView = getDataView$1(extraFieldZip64.data); - extraFieldZip64.values = []; - for (let indexValue = 0; indexValue < Math.floor(extraFieldZip64.data.length / 8); indexValue++) { - extraFieldZip64.values.push(getBigUint64(extraFieldView, 0 + indexValue * 8)); - } - const missingProperties = ZIP64_PROPERTIES.filter(propertyName => directory[propertyName] == MAX_32_BITS); - for (let indexMissingProperty = 0; indexMissingProperty < missingProperties.length; indexMissingProperty++) { - extraFieldZip64[missingProperties[indexMissingProperty]] = extraFieldZip64.values[indexMissingProperty]; - } - ZIP64_PROPERTIES.forEach(propertyName => { - if (directory[propertyName] == MAX_32_BITS) { - if (extraFieldZip64 && extraFieldZip64[propertyName] !== undefined) { - directory[propertyName] = extraFieldZip64[propertyName]; - } else { - throw new Error(ERR_EXTRAFIELD_ZIP64_NOT_FOUND); - } - } - }); - } - - function readExtraFieldUnicode(extraFieldUnicode, propertyName, rawPropertyName, directory, fileEntry) { - const extraFieldView = getDataView$1(extraFieldUnicode.data); - extraFieldUnicode.version = getUint8(extraFieldView, 0); - extraFieldUnicode.signature = getUint32(extraFieldView, 1); - const crc32 = new Crc32(); - crc32.append(fileEntry[rawPropertyName]); - const dataViewSignature = getDataView$1(new Uint8Array(4)); - dataViewSignature.setUint32(0, crc32.get(), true); - extraFieldUnicode[propertyName] = (new TextDecoder()).decode(extraFieldUnicode.data.subarray(5)); - extraFieldUnicode.valid = !fileEntry.bitFlag.languageEncodingFlag && extraFieldUnicode.signature == getUint32(dataViewSignature, 0); - if (extraFieldUnicode.valid) { - directory[propertyName] = extraFieldUnicode[propertyName]; - directory[propertyName + "UTF8"] = true; - } - } - - function readExtraFieldAES(extraFieldAES, directory, compressionMethod) { - if (extraFieldAES) { - const extraFieldView = getDataView$1(extraFieldAES.data); - extraFieldAES.vendorVersion = getUint8(extraFieldView, 0); - extraFieldAES.vendorId = getUint8(extraFieldView, 2); - const strength = getUint8(extraFieldView, 4); - extraFieldAES.strength = strength; - extraFieldAES.originalCompressionMethod = compressionMethod; - directory.compressionMethod = extraFieldAES.compressionMethod = getUint16(extraFieldView, 5); - } else { - directory.compressionMethod = compressionMethod; - } - } - - async function seekSignature(reader, signature, startOffset, minimumBytes, maximumLength) { - const signatureArray = new Uint8Array(4); - const signatureView = getDataView$1(signatureArray); - setUint32$1(signatureView, 0, signature); - const maximumBytes = minimumBytes + maximumLength; - return (await seek(minimumBytes)) || await seek(Math.min(maximumBytes, startOffset)); - - async function seek(length) { - const offset = startOffset - length; - const bytes = await readUint8Array(reader, offset, length); - for (let indexByte = bytes.length - minimumBytes; indexByte >= 0; indexByte--) { - if (bytes[indexByte] == signatureArray[0] && bytes[indexByte + 1] == signatureArray[1] && - bytes[indexByte + 2] == signatureArray[2] && bytes[indexByte + 3] == signatureArray[3]) { - return { - offset: offset + indexByte, - buffer: bytes.slice(indexByte, indexByte + minimumBytes).buffer - }; - } - } - } - } - - function getOptionValue$1(zipReader, options, name) { - return options[name] === undefined ? zipReader.options[name] : options[name]; - } - - function decodeString(value, encoding) { - if (!encoding || encoding.trim().toLowerCase() == "cp437") { - return decodeCP437(value); - } else { - return (new TextDecoder(encoding)).decode(value); - } - } - - function getDate(timeRaw) { - const date = (timeRaw & 0xffff0000) >> 16, time = timeRaw & 0x0000ffff; - try { - return new Date(1980 + ((date & 0xFE00) >> 9), ((date & 0x01E0) >> 5) - 1, date & 0x001F, (time & 0xF800) >> 11, (time & 0x07E0) >> 5, (time & 0x001F) * 2, 0); - } catch (error) { - // ignored - } - } - - function getUint8(view, offset) { - return view.getUint8(offset); - } - - function getUint16(view, offset) { - return view.getUint16(offset, true); - } - - function getUint32(view, offset) { - return view.getUint32(offset, true); - } - - function getBigUint64(view, offset) { - return Number(view.getBigUint64(offset, true)); - } - - function setUint32$1(view, offset, value) { - view.setUint32(offset, value, true); - } - - function getDataView$1(array) { - return new DataView(array.buffer); - } - - function readUint8Array(reader, offset, size) { - return reader.readUint8Array(offset, size); - } - - /* - Copyright (c) 2021 Gildas Lormeau. All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the distribution. - - 3. The names of the authors may not be used to endorse or promote products - derived from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, - INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND - FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT, - INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, - INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, - OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, - EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - - const ERR_DUPLICATED_NAME = "File already exists"; - const ERR_INVALID_COMMENT = "Zip file comment exceeds 64KB"; - const ERR_INVALID_ENTRY_COMMENT = "File entry comment exceeds 64KB"; - const ERR_INVALID_ENTRY_NAME = "File entry name exceeds 64KB"; - const ERR_INVALID_VERSION = "Version exceeds 65535"; - const ERR_INVALID_DATE = "The modification date must be between 1/1/1980 and 12/31/2107"; - const ERR_INVALID_ENCRYPTION_STRENGTH = "The strength must equal 1, 2, or 3"; - const ERR_INVALID_EXTRAFIELD_TYPE = "Extra field type exceeds 65535"; - const ERR_INVALID_EXTRAFIELD_DATA = "Extra field data exceeds 64KB"; - - const EXTRAFIELD_DATA_AES = new Uint8Array([0x07, 0x00, 0x02, 0x00, 0x41, 0x45, 0x03, 0x00, 0x00]); - const EXTRAFIELD_LENGTH_ZIP64 = 24; - - class ZipWriter { - - constructor(writer, options = {}) { - Object.assign(this, { - writer, - options, - config: getConfiguration(), - files: new Map(), - offset: writer.size, - pendingOutputSize: 0 - }); - } - - async add(name = "", reader, options = {}) { - const zipWriter = this; - name = name.trim(); - if (options.directory && (!name.endsWith(DIRECTORY_SIGNATURE))) { - name += DIRECTORY_SIGNATURE; - } else { - options.directory = name.endsWith(DIRECTORY_SIGNATURE); - } - if (zipWriter.files.has(name)) { - throw new Error(ERR_DUPLICATED_NAME); - } - const rawFilename = (new TextEncoder()).encode(name); - if (rawFilename.length > MAX_16_BITS) { - throw new Error(ERR_INVALID_ENTRY_NAME); - } - const comment = options.comment || ""; - const rawComment = (new TextEncoder()).encode(comment); - if (rawComment.length > MAX_16_BITS) { - throw new Error(ERR_INVALID_ENTRY_COMMENT); - } - const version = zipWriter.options.version || options.version || 0; - if (version > MAX_16_BITS) { - throw new Error(ERR_INVALID_VERSION); - } - const lastModDate = options.lastModDate || new Date(); - if (lastModDate < MIN_DATE || lastModDate > MAX_DATE) { - throw new Error(ERR_INVALID_DATE); - } - const password = getOptionValue(zipWriter, options, "password"); - const encryptionStrength = getOptionValue(zipWriter, options, "encryptionStrength") || 3; - const zipCrypto = getOptionValue(zipWriter, options, "zipCrypto"); - if (password !== undefined && encryptionStrength !== undefined && (encryptionStrength < 1 || encryptionStrength > 3)) { - throw new Error(ERR_INVALID_ENCRYPTION_STRENGTH); - } - let rawExtraField = new Uint8Array(0); - const extraField = options.extraField; - if (extraField) { - let extraFieldSize = 0; - let offset = 0; - extraField.forEach(data => extraFieldSize += 4 + data.length); - rawExtraField = new Uint8Array(extraFieldSize); - extraField.forEach((data, type) => { - if (type > MAX_16_BITS) { - throw new Error(ERR_INVALID_EXTRAFIELD_TYPE); - } - if (data.length > MAX_16_BITS) { - throw new Error(ERR_INVALID_EXTRAFIELD_DATA); - } - arraySet(rawExtraField, new Uint16Array([type]), offset); - arraySet(rawExtraField, new Uint16Array([data.length]), offset + 2); - arraySet(rawExtraField, data, offset + 4); - offset += 4 + data.length; - }); - } - let zip64 = false; - let outputSize = 0; - const zip64Enabled = reader && options.zip64 !== false && zipWriter.options.zip64 !== false; - if (zip64Enabled) { - zip64 = options.zip64 || zipWriter.options.zip64; - if (!zip64) { - if (!reader.initialized) { - await reader.init(); - } - outputSize = Math.floor(reader.size * 1.05); - zipWriter.pendingOutputSize += outputSize; - zip64 = zipWriter.offset >= MAX_32_BITS || outputSize >= MAX_32_BITS || zipWriter.offset + zipWriter.pendingOutputSize >= MAX_32_BITS; - await Promise.resolve(); - } - } - const level = getOptionValue(zipWriter, options, "level"); - const useWebWorkers = getOptionValue(zipWriter, options, "useWebWorkers"); - const bufferedWrite = getOptionValue(zipWriter, options, "bufferedWrite"); - let keepOrder = getOptionValue(zipWriter, options, "keepOrder"); - let dataDescriptor = getOptionValue(zipWriter, options, "dataDescriptor"); - const signal = getOptionValue(zipWriter, options, "signal"); - if (dataDescriptor === undefined) { - dataDescriptor = true; - } - if (keepOrder === undefined) { - keepOrder = true; - } - const fileEntry = await addFile(zipWriter, name, reader, Object.assign({}, options, { - rawFilename, - rawComment, - version, - lastModDate, - rawExtraField, - zip64, - password, - level, - useWebWorkers, - encryptionStrength, - zipCrypto, - bufferedWrite, - keepOrder, - dataDescriptor, - signal - })); - if (zip64Enabled) { - zipWriter.pendingOutputSize -= outputSize; - } - Object.assign(fileEntry, { name, comment, extraField }); - return new Entry(fileEntry); - } - - async close(comment = new Uint8Array(0)) { - const zipWriter = this; - const writer = zipWriter.writer; - const files = zipWriter.files; - let offset = 0; - let directoryDataLength = 0; - let directoryOffset = zipWriter.offset; - let filesLength = files.size; - for (const [, fileEntry] of files) { - directoryDataLength += 46 + - fileEntry.rawFilename.length + - fileEntry.rawComment.length + - fileEntry.rawExtraFieldZip64.length + - fileEntry.rawExtraFieldAES.length + - fileEntry.rawExtraField.length; - } - const zip64 = zipWriter.options.zip64 || directoryOffset >= MAX_32_BITS || directoryDataLength >= MAX_32_BITS || filesLength >= MAX_16_BITS; - const directoryArray = new Uint8Array(directoryDataLength + (zip64 ? ZIP64_END_OF_CENTRAL_DIR_TOTAL_LENGTH : END_OF_CENTRAL_DIR_LENGTH)); - const directoryView = getDataView(directoryArray); - if (comment.length) { - if (comment.length <= MAX_16_BITS) { - setUint16(directoryView, offset + 20, comment.length); - } else { - throw new Error(ERR_INVALID_COMMENT); - } - } - for (const [, fileEntry] of files) { - const { - rawFilename, - rawExtraFieldZip64, - rawExtraFieldAES, - rawExtraField, - rawComment, - version, - headerArray, - directory, - zip64 - } = fileEntry; - const extraFieldLength = rawExtraFieldZip64.length + rawExtraFieldAES.length + rawExtraField.length; - setUint32(directoryView, offset, CENTRAL_FILE_HEADER_SIGNATURE); - setUint16(directoryView, offset + 4, version); - arraySet(directoryArray, headerArray, offset + 6); - setUint16(directoryView, offset + 30, extraFieldLength); - setUint16(directoryView, offset + 32, rawComment.length); - if (directory) { - setUint8(directoryView, offset + 38, FILE_ATTR_MSDOS_DIR_MASK); - } - if (zip64) { - setUint32(directoryView, offset + 42, MAX_32_BITS); - } else { - setUint32(directoryView, offset + 42, fileEntry.offset); - } - arraySet(directoryArray, rawFilename, offset + 46); - arraySet(directoryArray, rawExtraFieldZip64, offset + 46 + rawFilename.length); - arraySet(directoryArray, rawExtraFieldAES, offset + 46 + rawFilename.length + rawExtraFieldZip64.length); - arraySet(directoryArray, rawExtraField, 46 + rawFilename.length + rawExtraFieldZip64.length + rawExtraFieldAES.length); - arraySet(directoryArray, rawComment, offset + 46 + rawFilename.length + extraFieldLength); - offset += 46 + rawFilename.length + extraFieldLength + rawComment.length; - } - if (zip64) { - setUint32(directoryView, offset, ZIP64_END_OF_CENTRAL_DIR_SIGNATURE); - setBigUint64(directoryView, offset + 4, BigInt(44)); - setUint16(directoryView, offset + 12, 45); - setUint16(directoryView, offset + 14, 45); - setBigUint64(directoryView, offset + 24, BigInt(filesLength)); - setBigUint64(directoryView, offset + 32, BigInt(filesLength)); - setBigUint64(directoryView, offset + 40, BigInt(directoryDataLength)); - setBigUint64(directoryView, offset + 48, BigInt(directoryOffset)); - setUint32(directoryView, offset + 56, ZIP64_END_OF_CENTRAL_DIR_LOCATOR_SIGNATURE); - setBigUint64(directoryView, offset + 64, BigInt(directoryOffset) + BigInt(directoryDataLength)); - setUint32(directoryView, offset + 72, ZIP64_TOTAL_NUMBER_OF_DISKS); - filesLength = MAX_16_BITS; - directoryOffset = MAX_32_BITS; - directoryDataLength = MAX_32_BITS; - offset += 76; - } - setUint32(directoryView, offset, END_OF_CENTRAL_DIR_SIGNATURE); - setUint16(directoryView, offset + 8, filesLength); - setUint16(directoryView, offset + 10, filesLength); - setUint32(directoryView, offset + 12, directoryDataLength); - setUint32(directoryView, offset + 16, directoryOffset); - await writer.writeUint8Array(directoryArray); - if (comment.length) { - await writer.writeUint8Array(comment); - } - return writer.getData(); - } - } - - async function addFile(zipWriter, name, reader, options) { - const files = zipWriter.files; - const writer = zipWriter.writer; - files.set(name, null); - let resolveLockWrite; - let resolveLockPreviousFile; - try { - let lockPreviousFile; - let fileWriter; - let fileEntry; - try { - if (options.keepOrder) { - lockPreviousFile = zipWriter.lockPreviousFile; - zipWriter.lockPreviousFile = new Promise(resolve => resolveLockPreviousFile = resolve); - } - if (options.bufferedWrite || zipWriter.lockWrite || !options.dataDescriptor) { - fileWriter = new BlobWriter(); - fileWriter.init(); - } else { - zipWriter.lockWrite = new Promise(resolve => resolveLockWrite = resolve); - if (!writer.initialized) { - await writer.init(); - } - fileWriter = writer; - } - fileEntry = await createFileEntry(reader, fileWriter, zipWriter.config, options); - } catch (error) { - files.delete(name); - throw error; - } - files.set(name, fileEntry); - if (fileWriter != writer) { - const blob = fileWriter.getData(); - const fileReader = new FileReader(); - const arrayBufferPromise = new Promise((resolve, reject) => { - fileReader.onload = event => resolve(event.target.result); - fileReader.onerror = reject; - fileReader.readAsArrayBuffer(blob); - }); - const [arrayBuffer] = await Promise.all([arrayBufferPromise, zipWriter.lockWrite, lockPreviousFile]); - if (!options.dataDescriptor) { - const arrayBufferView = new DataView(arrayBuffer); - if (!fileEntry.encrypted || options.zipCrypto) { - setUint32(arrayBufferView, 14, fileEntry.signature); - } - if (fileEntry.zip64) { - setUint32(arrayBufferView, 18, MAX_32_BITS); - setUint32(arrayBufferView, 22, MAX_32_BITS); - } else { - setUint32(arrayBufferView, 18, fileEntry.compressedSize); - setUint32(arrayBufferView, 22, fileEntry.uncompressedSize); - } - } - await writer.writeUint8Array(new Uint8Array(arrayBuffer)); - } - fileEntry.offset = zipWriter.offset; - if (fileEntry.zip64) { - const rawExtraFieldZip64View = getDataView(fileEntry.rawExtraFieldZip64); - setBigUint64(rawExtraFieldZip64View, 20, BigInt(fileEntry.offset)); - } - zipWriter.offset += fileEntry.length; - return fileEntry; - } finally { - if (resolveLockPreviousFile) { - resolveLockPreviousFile(); - } - if (resolveLockWrite) { - resolveLockWrite(); - } - } - } - - async function createFileEntry(reader, writer, config, options) { - const { - rawFilename, - lastModDate, - password, - level, - zip64, - zipCrypto, - dataDescriptor, - directory, - version, - rawComment, - rawExtraField, - useWebWorkers, - onprogress, - signal, - encryptionStrength - } = options; - const encrypted = Boolean(password && password.length); - const compressed = level !== 0 && !directory; - let rawExtraFieldAES; - if (encrypted && !zipCrypto) { - rawExtraFieldAES = new Uint8Array(EXTRAFIELD_DATA_AES.length + 2); - const extraFieldAESView = getDataView(rawExtraFieldAES); - setUint16(extraFieldAESView, 0, EXTRAFIELD_TYPE_AES); - arraySet(rawExtraFieldAES, EXTRAFIELD_DATA_AES, 2); - setUint8(extraFieldAESView, 8, encryptionStrength); - } else { - rawExtraFieldAES = new Uint8Array(0); - } - const fileEntry = { - version: version || VERSION_DEFLATE, - zip64, - directory: Boolean(directory), - filenameUTF8: true, - rawFilename, - commentUTF8: true, - rawComment, - rawExtraFieldZip64: zip64 ? new Uint8Array(EXTRAFIELD_LENGTH_ZIP64 + 4) : new Uint8Array(0), - rawExtraFieldAES, - rawExtraField - }; - let bitFlag = BITFLAG_LANG_ENCODING_FLAG; - if (dataDescriptor) { - bitFlag = bitFlag | BITFLAG_DATA_DESCRIPTOR; - } - let compressionMethod = COMPRESSION_METHOD_STORE; - if (compressed) { - compressionMethod = COMPRESSION_METHOD_DEFLATE; - } - if (zip64) { - fileEntry.version = fileEntry.version > VERSION_ZIP64 ? fileEntry.version : VERSION_ZIP64; - } - if (encrypted) { - bitFlag = bitFlag | BITFLAG_ENCRYPTED; - if (!zipCrypto) { - fileEntry.version = fileEntry.version > VERSION_AES ? fileEntry.version : VERSION_AES; - compressionMethod = COMPRESSION_METHOD_AES; - if (compressed) { - fileEntry.rawExtraFieldAES[9] = COMPRESSION_METHOD_DEFLATE; - } - } - } - const headerArray = fileEntry.headerArray = new Uint8Array(26); - const headerView = getDataView(headerArray); - setUint16(headerView, 0, fileEntry.version); - setUint16(headerView, 2, bitFlag); - setUint16(headerView, 4, compressionMethod); - const dateArray = new Uint32Array(1); - const dateView = getDataView(dateArray); - setUint16(dateView, 0, (((lastModDate.getHours() << 6) | lastModDate.getMinutes()) << 5) | lastModDate.getSeconds() / 2); - setUint16(dateView, 2, ((((lastModDate.getFullYear() - 1980) << 4) | (lastModDate.getMonth() + 1)) << 5) | lastModDate.getDate()); - const rawLastModDate = dateArray[0]; - setUint32(headerView, 6, rawLastModDate); - setUint16(headerView, 22, rawFilename.length); - setUint16(headerView, 24, 0); - setUint16(headerView, 24, rawExtraFieldAES.length + fileEntry.rawExtraField.length); - const localHeaderArray = new Uint8Array(30 + rawFilename.length + rawExtraFieldAES.length + fileEntry.rawExtraField.length); - const localHeaderView = getDataView(localHeaderArray); - setUint32(localHeaderView, 0, LOCAL_FILE_HEADER_SIGNATURE); - arraySet(localHeaderArray, headerArray, 4); - arraySet(localHeaderArray, rawFilename, 30); - arraySet(localHeaderArray, rawExtraFieldAES, 30 + rawFilename.length); - arraySet(localHeaderArray, fileEntry.rawExtraField, 30 + rawFilename.length + rawExtraFieldAES.length); - let result; - let uncompressedSize = 0; - let compressedSize = 0; - if (reader) { - uncompressedSize = reader.size; - const codec = await createCodec(config.Deflate, { - codecType: CODEC_DEFLATE, - level, - password, - encryptionStrength, - zipCrypto: encrypted && zipCrypto, - passwordVerification: encrypted && zipCrypto && (rawLastModDate >> 8) & 0xFF, - signed: true, - compressed, - encrypted, - useWebWorkers - }, config); - await writer.writeUint8Array(localHeaderArray); - if (!reader.initialized) { - await reader.init(); - } - result = await processData(codec, reader, writer, 0, uncompressedSize, config, { onprogress, signal }); - compressedSize = result.length; - } else { - await writer.writeUint8Array(localHeaderArray); - } - let dataDescriptorArray = new Uint8Array(0); - let dataDescriptorView; - if (dataDescriptor) { - dataDescriptorArray = new Uint8Array(zip64 ? 24 : 16); - dataDescriptorView = getDataView(dataDescriptorArray); - setUint32(dataDescriptorView, 0, DATA_DESCRIPTOR_RECORD_SIGNATURE); - } - if (reader) { - const signature = result.signature; - if ((!encrypted || zipCrypto) && signature !== undefined) { - setUint32(headerView, 10, signature); - fileEntry.signature = signature; - if (dataDescriptor) { - setUint32(dataDescriptorView, 4, signature); - } - } - if (zip64) { - const rawExtraFieldZip64View = getDataView(fileEntry.rawExtraFieldZip64); - setUint16(rawExtraFieldZip64View, 0, EXTRAFIELD_TYPE_ZIP64); - setUint16(rawExtraFieldZip64View, 2, EXTRAFIELD_LENGTH_ZIP64); - setUint32(headerView, 14, MAX_32_BITS); - setBigUint64(rawExtraFieldZip64View, 12, BigInt(compressedSize)); - setUint32(headerView, 18, MAX_32_BITS); - setBigUint64(rawExtraFieldZip64View, 4, BigInt(uncompressedSize)); - if (dataDescriptor) { - setBigUint64(dataDescriptorView, 8, BigInt(compressedSize)); - setBigUint64(dataDescriptorView, 16, BigInt(uncompressedSize)); - } - } else { - setUint32(headerView, 14, compressedSize); - setUint32(headerView, 18, uncompressedSize); - if (dataDescriptor) { - setUint32(dataDescriptorView, 8, compressedSize); - setUint32(dataDescriptorView, 12, uncompressedSize); - } - } - } - if (dataDescriptor) { - await writer.writeUint8Array(dataDescriptorArray); - } - const length = localHeaderArray.length + compressedSize + dataDescriptorArray.length; - Object.assign(fileEntry, { compressedSize, uncompressedSize, lastModDate, rawLastModDate, encrypted, length }); - return fileEntry; - } - - function getOptionValue(zipWriter, options, name) { - return options[name] === undefined ? zipWriter.options[name] : options[name]; - } - - function setUint8(view, offset, value) { - view.setUint8(offset, value); - } - - function setUint16(view, offset, value) { - view.setUint16(offset, value, true); - } - - function setUint32(view, offset, value) { - view.setUint32(offset, value, true); - } - - function setBigUint64(view, offset, value) { - view.setBigUint64(offset, value, true); - } - - function arraySet(array, typedArray, offset) { - array.set(typedArray, offset); - } - - function getDataView(array) { - return new DataView(array.buffer); - } - - /* - Copyright (c) 2021 Gildas Lormeau. All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the distribution. - - 3. The names of the authors may not be used to endorse or promote products - derived from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, - INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND - FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT, - INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, - INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, - OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, - EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - - const CHUNK_SIZE = 512 * 1024; - - class ZipEntry { - - constructor(fs, name, params, parent) { - const zipEntry = this; - if (fs.root && parent && parent.getChildByName(name)) { - throw new Error("Entry filename already exists"); - } - if (!params) { - params = {}; - } - Object.assign(zipEntry, { - fs, - name, - data: params.data, - id: fs.entries.length, - parent, - children: [], - uncompressedSize: 0 - }); - fs.entries.push(zipEntry); - if (parent) { - zipEntry.parent.children.push(zipEntry); - } - } - - moveTo(target) { - // deprecated - const zipEntry = this; - zipEntry.fs.move(zipEntry, target); - } - - getFullname() { - return this.getRelativeName(); - } - - getRelativeName(ancestor = this.fs.root) { - const zipEntry = this; - let relativeName = zipEntry.name; - let entry = zipEntry.parent; - while (entry && entry != ancestor) { - relativeName = (entry.name ? entry.name + "/" : "") + relativeName; - entry = entry.parent; - } - return relativeName; - } - - isDescendantOf(ancestor) { - let entry = this.parent; - while (entry && entry.id != ancestor.id) { - entry = entry.parent; - } - return Boolean(entry); - } - } - - class ZipFileEntry extends ZipEntry { - - constructor(fs, name, params, parent) { - super(fs, name, params, parent); - const zipEntry = this; - zipEntry.Reader = params.Reader; - zipEntry.Writer = params.Writer; - if (params.getData) { - zipEntry.getData = params.getData; - } - } - - async getData(writer, options = {}) { - const zipEntry = this; - if (!writer || (writer.constructor == zipEntry.Writer && zipEntry.data)) { - return zipEntry.data; - } else { - zipEntry.reader = new zipEntry.Reader(zipEntry.data, options); - await zipEntry.reader.init(); - if (!writer.initialized) { - await writer.init(); - } - zipEntry.uncompressedSize = zipEntry.reader.size; - return pipe(zipEntry.reader, writer); - } - } - - getText(encoding, options) { - return this.getData(new TextWriter(encoding), options); - } - - getBlob(mimeType, options) { - return this.getData(new BlobWriter(mimeType), options); - } - - getData64URI(mimeType, options) { - return this.getData(new Data64URIWriter(mimeType), options); - } - - getUint8Array(options) { - return this.getData(new Uint8ArrayWriter(), options); - } - - replaceBlob(blob) { - Object.assign(this, { - data: blob, - Reader: BlobReader, - Writer: BlobWriter, - reader: null - }); - } - - replaceText(text) { - Object.assign(this, { - data: text, - Reader: TextReader, - Writer: TextWriter, - reader: null - }); - } - - replaceData64URI(dataURI) { - Object.assign(this, { - data: dataURI, - Reader: Data64URIReader, - Writer: Data64URIWriter, - reader: null - }); - } - - replaceUint8Array(array) { - Object.assign(this, { - data: array, - Reader: Uint8ArrayReader, - Writer: Uint8ArrayWriter, - reader: null - }); - } - } - - class ZipDirectoryEntry extends ZipEntry { - - constructor(fs, name, params, parent) { - super(fs, name, params, parent); - this.directory = true; - } - - addDirectory(name) { - return addChild(this, name, null, true); - } - - addText(name, text) { - return addChild(this, name, { - data: text, - Reader: TextReader, - Writer: TextWriter - }); - } - - addBlob(name, blob) { - return addChild(this, name, { - data: blob, - Reader: BlobReader, - Writer: BlobWriter - }); - } - - addData64URI(name, dataURI) { - return addChild(this, name, { - data: dataURI, - Reader: Data64URIReader, - Writer: Data64URIWriter - }); - } - - addUint8Array(name, array) { - return addChild(this, name, { - data: array, - Reader: Uint8ArrayReader, - Writer: Uint8ArrayWriter - }); - } - - addHttpContent(name, url, options = {}) { - return addChild(this, name, { - data: url, - Reader: class extends HttpReader { - constructor(url) { - super(url, options); - } - } - }); - } - - async addFileSystemEntry(fileSystemEntry) { - return addFileSystemEntry(this, fileSystemEntry); - } - - async addData(name, params) { - return addChild(this, name, params); - } - - async importBlob(blob, options = {}) { - await this.importZip(new BlobReader(blob), options); - } - - async importData64URI(dataURI, options = {}) { - await this.importZip(new Data64URIReader(dataURI), options); - } - - async importUint8Array(array, options = {}) { - await this.importZip(new Uint8ArrayReader(array), options); - } - - async importHttpContent(url, options = {}) { - await this.importZip(new HttpReader(url, options), options); - } - - async exportBlob(options = {}) { - return this.exportZip(new BlobWriter("application/zip"), options); - } - - async exportData64URI(options = {}) { - return this.exportZip(new Data64URIWriter("application/zip"), options); - } - - async exportUint8Array(options = {}) { - return this.exportZip(new Uint8ArrayWriter(), options); - } - - async importZip(reader, options) { - if (!reader.initialized) { - await reader.init(); - } - const zipReader = new ZipReader(reader, options); - const entries = await zipReader.getEntries(); - entries.forEach((entry) => { - let parent = this; - const path = entry.filename.split("/"); - const name = path.pop(); - path.forEach(pathPart => parent = parent.getChildByName(pathPart) || new ZipDirectoryEntry(this.fs, pathPart, null, parent)); - if (!entry.directory) { - addChild(parent, name, { - data: entry, - Reader: getZipBlobReader(Object.assign({}, options)) - }); - } - }); - } - - async exportZip(writer, options) { - const zipEntry = this; - await initReaders(zipEntry); - await writer.init(); - const zipWriter = new ZipWriter(writer, options); - await exportZip(zipWriter, zipEntry, getTotalSize([zipEntry], "uncompressedSize"), options); - await zipWriter.close(); - return writer.getData(); - } - - getChildByName(name) { - const children = this.children; - for (let childIndex = 0; childIndex < children.length; childIndex++) { - const child = children[childIndex]; - if (child.name == name) { - return child; - } - } - } - } - - - class FS { - - constructor() { - resetFS(this); - } - - get children() { - return this.root.children; - } - - remove(entry) { - detach(entry); - this.entries[entry.id] = null; - } - - move(entry, destination) { - if (entry == this.root) { - throw new Error("Root directory cannot be moved"); - } else { - if (destination.directory) { - if (!destination.isDescendantOf(entry)) { - if (entry != destination) { - if (destination.getChildByName(entry.name)) { - throw new Error("Entry filename already exists"); - } - detach(entry); - entry.parent = destination; - destination.children.push(entry); - } - } else { - throw new Error("Entry is a ancestor of target entry"); - } - } else { - throw new Error("Target entry is not a directory"); - } - } - } - - find(fullname) { - const path = fullname.split("/"); - let node = this.root; - for (let index = 0; node && index < path.length; index++) { - node = node.getChildByName(path[index]); - } - return node; - } - - getById(id) { - return this.entries[id]; - } - - getChildByName(name) { - return this.root.getChildByName(name); - } - - addDirectory(name) { - return this.root.addDirectory(name); - } - - addText(name, text) { - return this.root.addText(name, text); - } - - addBlob(name, blob) { - return this.root.addBlob(name, blob); - } - - addData64URI(name, dataURI) { - return this.root.addData64URI(name, dataURI); - } - - addHttpContent(name, url, options) { - return this.root.addHttpContent(name, url, options); - } - - async addFileSystemEntry(fileSystemEntry) { - return this.root.addFileSystemEntry(fileSystemEntry); - } - - async addData(name, params) { - return this.root.addData(name, params); - } - - async importBlob(blob, options) { - resetFS(this); - await this.root.importBlob(blob, options); - } - - async importData64URI(dataURI, options) { - resetFS(this); - await this.root.importData64URI(dataURI, options); - } - - async importHttpContent(url, options) { - resetFS(this); - await this.root.importHttpContent(url, options); - } - - async exportBlob(options) { - return this.root.exportBlob(options); - } - - async exportData64URI(options) { - return this.root.exportData64URI(options); - } - } - - const fs = { FS, ZipDirectoryEntry, ZipFileEntry }; - - function getTotalSize(entries, propertyName) { - let size = 0; - entries.forEach(process); - return size; - - function process(entry) { - size += entry[propertyName]; - if (entry.children) { - entry.children.forEach(process); - } - } - } - - function getZipBlobReader(options) { - return class extends Reader { - - constructor(entry, options = {}) { - super(); - this.entry = entry; - this.options = options; - } - - async init() { - const zipBlobReader = this; - zipBlobReader.size = zipBlobReader.entry.uncompressedSize; - const data = await zipBlobReader.entry.getData(new BlobWriter(), Object.assign({}, zipBlobReader.options, options)); - zipBlobReader.data = data; - zipBlobReader.blobReader = new BlobReader(data); - } - - async readUint8Array(index, length) { - return this.blobReader.readUint8Array(index, length); - } - }; - } - - async function initReaders(entry) { - if (entry.children.length) { - for (const child of entry.children) { - if (child.directory) { - await initReaders(child); - } else { - child.reader = new child.Reader(child.data); - await child.reader.init(); - child.uncompressedSize = child.reader.size; - } - } - } - } - - function detach(entry) { - const children = entry.parent.children; - children.forEach((child, index) => { - if (child.id == entry.id) { - children.splice(index, 1); - } - }); - } - - async function exportZip(zipWriter, entry, totalSize, options) { - const selectedEntry = entry; - const entryOffsets = new Map(); - await process(zipWriter, entry); - - async function process(zipWriter, entry) { - await exportChild(); - - async function exportChild() { - if (options.bufferedWrite) { - await Promise.all(entry.children.map(processChild)); - } else { - for (const child of entry.children) { - await processChild(child); - } - } - } - - async function processChild(child) { - const name = options.relativePath ? child.getRelativeName(selectedEntry) : child.getFullname(); - await zipWriter.add(name, child.reader, Object.assign({ - directory: child.directory - }, Object.assign({}, options, { - onprogress: indexProgress => { - if (options.onprogress) { - entryOffsets.set(name, indexProgress); - try { - options.onprogress(Array.from(entryOffsets.values()).reduce((previousValue, currentValue) => previousValue + currentValue), totalSize); - } catch (error) { - // ignored - } - } - } - }))); - await process(zipWriter, child); - } - } - } - - async function addFileSystemEntry(zipEntry, fileSystemEntry) { - if (fileSystemEntry.isDirectory) { - const entry = zipEntry.addDirectory(fileSystemEntry.name); - await addDirectory(entry, fileSystemEntry); - return entry; - } else { - return new Promise((resolve, reject) => fileSystemEntry.file(file => resolve(zipEntry.addBlob(fileSystemEntry.name, file)), reject)); - } - - async function addDirectory(zipEntry, fileEntry) { - const children = await getChildren(fileEntry); - for (const child of children) { - if (child.isDirectory) { - await addDirectory(zipEntry.addDirectory(child.name), child); - } else { - await new Promise((resolve, reject) => { - child.file(file => { - const childZipEntry = zipEntry.addBlob(child.name, file); - childZipEntry.uncompressedSize = file.size; - resolve(childZipEntry); - }, reject); - }); - } - } - } - - function getChildren(fileEntry) { - return new Promise((resolve, reject) => { - let entries = []; - if (fileEntry.isDirectory) { - readEntries(fileEntry.createReader()); - } - if (fileEntry.isFile) { - resolve(entries); - } - - function readEntries(directoryReader) { - directoryReader.readEntries(temporaryEntries => { - if (!temporaryEntries.length) { - resolve(entries); - } else { - entries = entries.concat(temporaryEntries); - readEntries(directoryReader); - } - }, reject); - } - }); - } - } - - function resetFS(fs) { - fs.entries = []; - fs.root = new ZipDirectoryEntry(fs); - } - - async function pipe(reader, writer) { - return copyChunk(); - - async function copyChunk(chunkIndex = 0) { - const index = chunkIndex * CHUNK_SIZE; - if (index < reader.size) { - const array = await reader.readUint8Array(index, Math.min(CHUNK_SIZE, reader.size - index)); - await writer.writeUint8Array(array); - return copyChunk(chunkIndex + 1); - } else { - return writer.getData(); - } - } - } - - function addChild(parent, name, params, directory) { - if (parent.directory) { - return directory ? new ZipDirectoryEntry(parent.fs, name, params, parent) : new ZipFileEntry(parent.fs, name, params, parent); - } else { - throw new Error("Parent entry is not a directory"); - } - } - - /* - Copyright (c) 2021 Gildas Lormeau. All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the distribution. - - 3. The names of the authors may not be used to endorse or promote products - derived from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, - INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND - FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT, - INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, - INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, - OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, - EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - - configureWebWorker(); - - exports.BlobReader = BlobReader; - exports.BlobWriter = BlobWriter; - exports.Data64URIReader = Data64URIReader; - exports.Data64URIWriter = Data64URIWriter; - exports.ERR_ABORT = ERR_ABORT; - exports.ERR_BAD_FORMAT = ERR_BAD_FORMAT; - exports.ERR_CENTRAL_DIRECTORY_NOT_FOUND = ERR_CENTRAL_DIRECTORY_NOT_FOUND; - exports.ERR_DUPLICATED_NAME = ERR_DUPLICATED_NAME; - exports.ERR_ENCRYPTED = ERR_ENCRYPTED; - exports.ERR_EOCDR_LOCATOR_ZIP64_NOT_FOUND = ERR_EOCDR_LOCATOR_ZIP64_NOT_FOUND; - exports.ERR_EOCDR_NOT_FOUND = ERR_EOCDR_NOT_FOUND; - exports.ERR_EOCDR_ZIP64_NOT_FOUND = ERR_EOCDR_ZIP64_NOT_FOUND; - exports.ERR_EXTRAFIELD_ZIP64_NOT_FOUND = ERR_EXTRAFIELD_ZIP64_NOT_FOUND; - exports.ERR_HTTP_RANGE = ERR_HTTP_RANGE; - exports.ERR_INVALID_COMMENT = ERR_INVALID_COMMENT; - exports.ERR_INVALID_DATE = ERR_INVALID_DATE; - exports.ERR_INVALID_ENCRYPTION_STRENGTH = ERR_INVALID_ENCRYPTION_STRENGTH; - exports.ERR_INVALID_ENTRY_COMMENT = ERR_INVALID_ENTRY_COMMENT; - exports.ERR_INVALID_ENTRY_NAME = ERR_INVALID_ENTRY_NAME; - exports.ERR_INVALID_EXTRAFIELD_DATA = ERR_INVALID_EXTRAFIELD_DATA; - exports.ERR_INVALID_EXTRAFIELD_TYPE = ERR_INVALID_EXTRAFIELD_TYPE; - exports.ERR_INVALID_PASSWORD = ERR_INVALID_PASSWORD; - exports.ERR_INVALID_SIGNATURE = ERR_INVALID_SIGNATURE; - exports.ERR_INVALID_VERSION = ERR_INVALID_VERSION; - exports.ERR_LOCAL_FILE_HEADER_NOT_FOUND = ERR_LOCAL_FILE_HEADER_NOT_FOUND; - exports.ERR_UNSUPPORTED_COMPRESSION = ERR_UNSUPPORTED_COMPRESSION; - exports.ERR_UNSUPPORTED_ENCRYPTION = ERR_UNSUPPORTED_ENCRYPTION; - exports.HttpRangeReader = HttpRangeReader; - exports.HttpReader = HttpReader; - exports.Reader = Reader; - exports.TextReader = TextReader; - exports.TextWriter = TextWriter; - exports.Uint8ArrayReader = Uint8ArrayReader; - exports.Uint8ArrayWriter = Uint8ArrayWriter; - exports.Writer = Writer; - exports.ZipReader = ZipReader; - exports.ZipWriter = ZipWriter; - exports.configure = configure; - exports.fs = fs; - exports.getMimeType = getMimeType; - exports.initShimAsyncCodec = streamCodecShim; - - Object.defineProperty(exports, '__esModule', { value: true }); - -}))); diff --git a/o2web/source/x_component_File/$Main/default/file/ofd.png b/o2web/source/x_component_File/$Main/default/file/ofd.png new file mode 100644 index 0000000000000000000000000000000000000000..c7ca564c7d6a1151dc5f01ffea39afc9fc8f315a Binary files /dev/null and b/o2web/source/x_component_File/$Main/default/file/ofd.png differ diff --git a/o2web/source/x_component_File/$Main/icon.json b/o2web/source/x_component_File/$Main/icon.json index c9a0203d8c2ee27aef1a08e5f03c96003e74db40..f56143e44de065f31103c88667d079458016373b 100644 --- a/o2web/source/x_component_File/$Main/icon.json +++ b/o2web/source/x_component_File/$Main/icon.json @@ -4,7 +4,7 @@ "jsp": "url.png", "asp": "url.png", "js": "url.png", - + "avi": "avi.png", "mkv": "avi.png", "mov": "avi.png", @@ -20,21 +20,21 @@ "docx": "docx_win.png", "dotx": "docx_win.png", "dot": "docx_win.png", - + "vsd": "vsd.png", - + "xls": "xlsx_win.png", "xlsx": "xlsx_win.png", "xlsm": "xlsx_win.png", "xlt": "xlsx_win.png", "xltx": "xlsx_win.png", - + "pptx": "pptx_win.png", "ppt": "pptx_win.png", "pot": "pptx_win.png", "potx": "pptx_win.png", "potm": "pptx_win.png", - + "css": "css.png", "mp3": "mp3.png", "wav": "wav.png", @@ -49,13 +49,14 @@ "jpg": "jpeg.png", "jpe": "jpeg.png", "ico": "jpeg.png", - + "pdf": "pdf.png", "rar": "rar.png", "txt": "text.png", "zip": "zip.png", - + "exe": "exe.png", - + "ofd": "ofd.png", + "unknow": "unknow.png" -} \ No newline at end of file +} diff --git a/o2web/source/x_component_Profile/$Main/default/style.css b/o2web/source/x_component_Profile/$Main/default/style.css index 410a0fe9d5210aa1e3da3b05c66430440e4998bf..aa1f430e2789134ae902c00998adf7f82ef2d643 100644 --- a/o2web/source/x_component_Profile/$Main/default/style.css +++ b/o2web/source/x_component_Profile/$Main/default/style.css @@ -67,7 +67,7 @@ } .o2_profile_inforIconChange { - margin: 22px 10px; + margin: 16px 10px; cursor: pointer; float: left; border: 1px solid #999; diff --git a/o2web/source/x_component_Profile/$Main/newVersion/style.css b/o2web/source/x_component_Profile/$Main/newVersion/style.css index 97d76838e1d2b6501d43e64014dd34699116fd4b..1b996ecbebf9329c3a6f30ae52c740f0545d4026 100644 --- a/o2web/source/x_component_Profile/$Main/newVersion/style.css +++ b/o2web/source/x_component_Profile/$Main/newVersion/style.css @@ -61,29 +61,29 @@ float: left; } .o2_profile_inforIconContent { - width: 100px; - height: 100px; + width: 80px; + height: 80px; margin: auto; } .o2_profile_inforIconContentImg { border: 0px; - width: 100px; - height: 100px; + width: 80px; + height: 80px; border-radius: 166.67px; } .o2_profile_inforIconChange { cursor: pointer; - margin: 22px auto; + margin: 16px auto; width: 90px; - height: 36px; + height: 30px; border: 1px solid #4A90E2; border-radius: 100px; font-family: MicrosoftYaHei; font-size: 14px; color: #4A90E2; - line-height: 36px; + line-height: 30px; text-align: center; } .o2_profile_inforContent { @@ -110,18 +110,24 @@ .o2_profile_inforContentInput { background-color: #FFF; - background: #FFFFFF; border: 1px solid #DEDEDE; border-radius: 100px; width:77%; min-width: 300px; height: 32px; - font-family: MicrosoftYaHei; font-size: 14px; color: #666666; padding: 0 0 0 8px; outline:none; } +.o2_profile_inforContentSelect { + border: 1px solid #DEDEDE; + border-radius: 100px; + height: 32px; + font-size: 14px; + color: #666666; + padding: 0 0 0 8px; +} .o2_profile_signature{ diff --git a/o2web/source/x_component_Profile/$Main/newVersion/view.html b/o2web/source/x_component_Profile/$Main/newVersion/view.html index 12b0b1824cb7ce859119a4009f502bbb741581a1..878518a364c52571cb99f28bcf60b2f4a5326839 100644 --- a/o2web/source/x_component_Profile/$Main/newVersion/view.html +++ b/o2web/source/x_component_Profile/$Main/newVersion/view.html @@ -67,6 +67,12 @@ +
+
{{ $.lp.language }}
+
+ +
+
{{ $.lp.saveInfor }}
diff --git a/o2web/source/x_component_Profile/$Main/newVersion/viewBrowser.html b/o2web/source/x_component_Profile/$Main/newVersion/viewBrowser.html index 0039d27a1378131c4009b203f9da14b855a27146..798378609b1cc72787177cfc0e135b0991372a8f 100644 --- a/o2web/source/x_component_Profile/$Main/newVersion/viewBrowser.html +++ b/o2web/source/x_component_Profile/$Main/newVersion/viewBrowser.html @@ -68,6 +68,15 @@
+
+
{{ $.lp.language }}
+
+ +
+
+
{{ $.lp.saveInfor }}
diff --git a/o2web/source/x_component_Profile/Main.js b/o2web/source/x_component_Profile/Main.js index 7ee3d0a7ed097837a97aa6841ae3b2aa5d4dc28d..b230113e30f806c8bc79d7ebc965311e592dac39 100644 --- a/o2web/source/x_component_Profile/Main.js +++ b/o2web/source/x_component_Profile/Main.js @@ -71,7 +71,7 @@ MWF.xApplication.Profile.Main = new Class({ this.getSiblings().map(function(otabNode) { otabNode.getChildren().removeClass("mainColor_color"); - }) + }); }.bind(tabNode)); }.bind(this)); @@ -131,6 +131,14 @@ MWF.xApplication.Profile.Main = new Class({ this.removeClass("mainColor_border mainColor_color"); }); + this.languageSelectNode = this.tab.pages[0].contentNode.getElement("select"); + this.languageSelectNode.empty(); + if (!this.personData.language) this.personData.language = "zh-cn"; + Object.keys(this.lp.lps).each(function(key){ + var option = new Element("option", {"value": key, "text": this.lp.lps[key]}).inject(this.languageSelectNode); + if (this.personData.language === key) option.set("selected", true); + }.bind(this)); + this.content.getElement(".o2_profile_saveInforAction").addEvent("click", function(){ this.savePersonInfor(); }.bind(this)); @@ -840,6 +848,8 @@ MWF.xApplication.Profile.Main = new Class({ this.personData.qq = this.qqInputNode.get("value"); this.personData.ipAddress = this.ipAddressInputNode.get("value"); this.personData.signature = this.signatureInputNode.get("value"); + this.personData.language = this.languageSelectNode.options[this.languageSelectNode.selectedIndex].value; + this.action.updatePerson(this.personData, function(){ this.notice(this.lp.saveInforOk, "success"); }.bind(this)); diff --git a/o2web/source/x_component_Profile/lp/en.js b/o2web/source/x_component_Profile/lp/en.js index 8585af1f4f221bf7bb6d03a58164690a329e4add..74b478e9347486a62747da081a6c40840e9ebc43 100644 --- a/o2web/source/x_component_Profile/lp/en.js +++ b/o2web/source/x_component_Profile/lp/en.js @@ -4,101 +4,107 @@ MWF.xApplication.Profile.LP = { "layoutConfig": "UI", "ideaConfig": "Opinion", "passwordConfig": "Password", - "facelogin": "Face Login", - "openFaceSet": "Open FaceSet", + "ssoConfig": "SSO", + "facelogin": "FaceLogin", + "openFaceSet": "click here, Open FaceSet", - "clear": "清除界面数据", - "setDefault": "设置为默认界面", - "clearDefault": "清除默认界面", - "setForce": "设置强制打开应用", - "clearForce": "清除强制打开应用", - "setDefaultOk": "已设置为默认界面", - "setForceOk": "已设置强制打开应用", - "clearok": "桌面缓存记录已清除", - "saveIdea": "保存常用意见", - "saveIdeaDefault": "保存为默认常用意见", - "ideaSaveOk": "常用意见保存完成", + "clear": "Clear ui config data", + "setDefault": "Set as the default ui config", + "clearDefault": "Clear default ui config data", + "setForce": "Set force to open the application", + "clearForce": "Clear forced open application", + "setDefaultOk": "The default ui config has been set", + "setForceOk": "Forced to open the app has been set", + "clearok": "Desktop cache record has been cleared", + "saveIdea": "Save frequently opinions", + "saveIdeaDefault": "Save as default opinions", + "ideaSaveOk": "Frequently opinions saved", - "icon": "头像", - "changeIcon": "更换头像", - "name": "姓名", - "employee": "工号", - "display": "昵称", - "officePhone": "办公电话", - "mail": "邮件地址", - "mobile": "手机号码", - "weixin": "微信号", + "icon": "Avatar", + "changeIcon": "Change", + "name": "Name", + "employee": "Employee", + "display": "Nickname", + "officePhone": "OfficePhone", + "mail": "Mail", + "mobile": "Cellphone", + "weixin": "Wechat", "QQ": "QQ", - "signature": "个人签名", - "saveInfor": "保存个人信息", - "saveInforOk": "保存个人信息成功", - "ipAddress" : "登录IP", - "ipAddressPlaceHolder" : "如果不为空,匹配的ip地址才能登录该账号,用“,”分隔多值", - "ipAddressIncorrectNotice" : "IP地址格式不正确:", + "signature": "Signature", + "saveInfor": "Save personal information", + "saveInforOk": "Personal information saved successfully", + "ipAddress" : "Login IP", + "ipAddressPlaceHolder" : "If it is not empty, only the matching ip address can log in to the account. Separate multiple values with \",\"", + "ipAddressIncorrectNotice" : "IP address format is incorrect:", + "language": "Language", + "lps": { + "zh-CN": "简体中文", + "en": "English(US)" + }, - "passwordRule" : "密码规则", - "oldPassword": "原密码", - "password": "新密码", - "morePassword": "确认密码", - "passwordNotMatch": "新密码与确认密码不一致", - "changePasswordOk": "密码修改成功", + "passwordRule" : "Password rules", + "oldPassword": "Old password", + "password": "New password", + "morePassword": "Confirm password", + "passwordNotMatch": "The new password does not match the confirmed password", + "changePasswordOk": "Password reset complete", - "changePersonIcon": "修改个人头像", + "changePersonIcon": "Change Avatar", - "layoutAction": "界面操作", - "desktopBackground": "桌面背景", - "paswordRule" : "6位以上,包含数字和字母.", - "weak" : "弱", - "middle" : "中", - "high" : "强", + "layoutAction": "UI operation", + "desktopBackground": "Desktop background", + "paswordRule" : "6 or more digits, including numbers and letters.", + "weak" : "weak", + "middle" : "middle", + "high" : "high", "empower":{ - "fromPerson":"人员", - "fromIdentity":"身份", - "toPerson":"委托人员", - "toIdentity":"委托身份", - "application":"应用", - "applicationName":"应用名称", - "applicationAlias":"应用别名", - "process":"流程ID", - "processName":"流程名称", - "processAlias":"流程别名", - "type":"授权类型", - "startTime":"授权开始时间", - "completedTime":"授权结束时间", - "emPowerConfig": "外出授权", - "addEmPower": "新增", - "myEmPower": "我的委托", - "receiveEmPower": "收到的委托", - "ok":"保存", - "cancel":"关闭", - "noData":"暂时没有委托", - "withdraw":"撤回", - "alert1":"请选择流程或应用", - "alert2":"请联系管理员添加身份信息!", - "withdrawOk":"撤回委托成功", - "selectEmPower":"请选择委托", - "saveOk":"保存成功", - "type_all":"全部", - "type_application":"应用", - "type_process":"流程", - "type_filter":"文件类型", - "saveNotAll":"部分保存失败", - "title":"标题", - "activityName":"状态", - "createTime":"委托时间", - "edit":"编辑", - "editEmpower":"编辑外出授权", - "enable":"启用", - "disable":"禁用" + "fromPerson":"Person", + "fromIdentity":"Identity", + "toPerson":"EmpoweredPerson", + "toIdentity":"EmpoweredIdentity", + "application":"Application", + "applicationName":"Application Name", + "applicationAlias":"Application Alias", + "process":"Process", + "processName":"Process Name", + "processAlias":"Process Alias", + "type":"Type", + "startTime":"Start Time", + "completedTime":"Completed Time", + "emPowerConfig": "Empowerment", + "addEmPower": "create", + "myEmPower": "My Empowerment", + "receiveEmPower": "Empowered to me", + "ok":"Save", + "cancel":"Cancel", + "noData":"No Empowerment", + "withdraw":"Withdraw", + "alert1":"Please select a process or application", + "alert2":"Please contact the administrator to add identity information!", + "withdrawOk":"Withdraw the empowerment successfully", + "selectEmPower":"Select the empowerment", + "saveOk":"Saved successfully", + "type_all":"All", + "type_application":"Application", + "type_process":"Process", + "type_filter":"File type", + "saveNotAll":"Partial save failed", + "title":"Title", + "activityName":"Activity", + "createTime":"Commission time", + "edit":"Edit", + "editEmpower":"Edit empowerment", + "enable":"Enable", + "disable":"Disable" }, - "emPowerConfig": "外出授权", - "addEmPower": "新增", - "myEmPower": "我的委托", - "receiveEmPower": "收到的委托", - "myEmPowerLog": "委托的待办", - "receiveEmPowerLog": "收到的待办", - "ok":"保存", - "cancel":"关闭" + "emPowerConfig": "Empower", + "addEmPower": "create", + "myEmPower": "My Empowerment", + "receiveEmPower": "Empowered to me", + "myEmPowerLog": "Empowered Task", + "receiveEmPowerLog": "Empowered Task received", + "ok":"Save", + "cancel":"Cancel" }; diff --git a/o2web/source/x_component_Profile/lp/zh-cn.js b/o2web/source/x_component_Profile/lp/zh-cn.js index 0bff9f6496b8e1e6041666b1d73b9388acec3d5e..358b7984f526d684864d749b538a657dd7d4135a 100644 --- a/o2web/source/x_component_Profile/lp/zh-cn.js +++ b/o2web/source/x_component_Profile/lp/zh-cn.js @@ -6,7 +6,7 @@ MWF.xApplication.Profile.LP = { "passwordConfig": "修改密码", "ssoConfig": "单点登录", "facelogin": "人脸登录", - "openFaceSet": "打开人脸登录设置", + "openFaceSet": "点击此处,打开人脸登录设置", "clear": "清除界面数据", "setDefault": "设置为默认界面", @@ -36,6 +36,11 @@ MWF.xApplication.Profile.LP = { "ipAddress" : "登录IP", "ipAddressPlaceHolder" : "如果不为空,匹配的ip地址才能登录,用,分隔多值", "ipAddressIncorrectNotice" : "IP地址格式不正确:", + "language": "语言设置", + "lps": { + "zh-CN": "简体中文", + "en": "English" + }, "passwordRule" : "密码规则", "oldPassword": "原密码", diff --git a/o2web/source/x_component_process_ProcessManager/$Main/startMenu.json b/o2web/source/x_component_process_ProcessManager/$Main/startMenu.json index a03aeb56a1799e8f4e7ba579f8b5d00744a9bb3f..0df4b52547cecf1a1f3f33f7b7d9b0b833d3ba07 100644 --- a/o2web/source/x_component_process_ProcessManager/$Main/startMenu.json +++ b/o2web/source/x_component_process_ProcessManager/$Main/startMenu.json @@ -33,7 +33,7 @@ // "sub": [] // }, { - "title": "数据配置", + "title": MWF.xApplication.process.ProcessManager.LP.dataConfig, "id": "1.1", "action": "dataConfig", "icon": "process_data.png", @@ -41,7 +41,7 @@ "sub": [] }, { - "title": "脚本配置", + "title": MWF.xApplication.process.ProcessManager.LP.scriptConfig, "id": "1.1", "action": "scriptConfig", "icon": "process_script.png", @@ -49,7 +49,7 @@ "sub": [] }, { - "title": "资源文件", + "title": MWF.xApplication.process.ProcessManager.LP.fileConfig, "id": "1.1", "action": "fileConfig", "icon": "process_file.png", @@ -65,7 +65,7 @@ // "sub": [] // }, { - "title": "应用属性", + "title": MWF.xApplication.process.ProcessManager.LP.applicationConfig, "id": "1.1", "action": "applicationProperty", "icon": "process_property.png", diff --git a/o2web/source/x_component_process_ProcessManager/lp/en.js b/o2web/source/x_component_process_ProcessManager/lp/en.js index cab833900a8d5932e1386504bb1ef2b48eb135c3..90f981631504c84248084325c94fc19bd5eeb1d5 100644 --- a/o2web/source/x_component_process_ProcessManager/lp/en.js +++ b/o2web/source/x_component_process_ProcessManager/lp/en.js @@ -17,6 +17,13 @@ MWF.xApplication.process.ProcessManager.LP = { "copyConfirm_cancel": "Cancel", "copynew": "New", + "formConfig": "Form", + "processConfig": "Process", + "dataConfig": "Data", + "scriptConfig": "Script", + "fileConfig": "Resource", + "applicationConfig": "Attributes", + "findDesigner": "FindCode", "ok": "OK", diff --git a/o2web/source/x_component_process_ProcessManager/lp/zh-cn.js b/o2web/source/x_component_process_ProcessManager/lp/zh-cn.js index 85bb27346318463f9c20d1b835fdf5a0463ca5c6..9dedec47012d93cadd4b403dc4854d9139a515b6 100644 --- a/o2web/source/x_component_process_ProcessManager/lp/zh-cn.js +++ b/o2web/source/x_component_process_ProcessManager/lp/zh-cn.js @@ -18,11 +18,11 @@ MWF.xApplication.process.ProcessManager.LP = { "copynew": "新", "formConfig": "表单配置", - // "formConfig": "", - // "formConfig": "", - // "formConfig": "", - // "formConfig": "", - // "formConfig": "", + "processConfig": "流程配置", + "dataConfig": "数据配置", + "scriptConfig": "脚本配置", + "fileConfig": "资源文件", + "applicationConfig": "应用属性", "findDesigner": "查找设计", diff --git a/o2web/source/x_component_process_Xform/Attachment.js b/o2web/source/x_component_process_Xform/Attachment.js index 0d2991a5bcfc5ba2e2043712543d8babf664f882..0fcf87725d5d2fefac728ec11a4011379433132f 100644 --- a/o2web/source/x_component_process_Xform/Attachment.js +++ b/o2web/source/x_component_process_Xform/Attachment.js @@ -1441,7 +1441,7 @@ MWF.xApplication.process.Xform.Attachment = MWF.APPAttachment = new Class( }, null, null, this.form.json.confirmStyle); }, previewAttachment: function (attachments) { - var att = attachments[0].data; + var att = attachments[0]; new MWF.xApplication.process.Xform.AttachmenPreview(att,this); }, deleteAttachment: function (attachment) { @@ -1623,7 +1623,7 @@ MWF.xApplication.process.Xform.Attachment = MWF.APPAttachment = new Class( } else if (window.webkit && window.webkit.messageHandlers && window.webkit.messageHandlers.downloadAttachment) { window.webkit.messageHandlers.downloadAttachment.postMessage({ "id": att.data.id, "site": (this.json.site || this.json.id) }); } else if (window.wx && window.__wxjs_environment === 'miniprogram' && this.checkMiniProgramFile(att.data.extension)) { //微信小程序 - wx.miniProgram.navigateTo({ + wx.miniProgram.navigateTo({ url: '../file/download?attId=' + att.data.id + '&type=work&work=' + this.form.businessData.work.id }); } else { @@ -1647,7 +1647,7 @@ MWF.xApplication.process.Xform.Attachment = MWF.APPAttachment = new Class( } else if (window.webkit && window.webkit.messageHandlers && window.webkit.messageHandlers.downloadAttachment) { window.webkit.messageHandlers.downloadAttachment.postMessage({ "id": att.data.id, "site": (this.json.site || this.json.id) }); } else if (window.wx && window.__wxjs_environment === 'miniprogram' && this.checkMiniProgramFile(att.data.extension)) { //微信小程序 - wx.miniProgram.navigateTo({ + wx.miniProgram.navigateTo({ url: '../file/download?attId=' + att.data.id + '&type=work&workCompleted=' + this.form.businessData.workCompleted.id }); } else { @@ -1674,7 +1674,7 @@ MWF.xApplication.process.Xform.Attachment = MWF.APPAttachment = new Class( } else if (window.webkit && window.webkit.messageHandlers && window.webkit.messageHandlers.downloadAttachment) { window.webkit.messageHandlers.downloadAttachment.postMessage({ "id": att.data.id, "site": (this.json.site || this.json.id) }); } else if (window.wx && window.__wxjs_environment === 'miniprogram' && this.checkMiniProgramFile(att.data.extension)) { //微信小程序 - wx.miniProgram.navigateTo({ + wx.miniProgram.navigateTo({ url: '../file/download?attId=' + att.data.id + '&type=work&work=' + this.form.businessData.work.id }); } else { @@ -1699,7 +1699,7 @@ MWF.xApplication.process.Xform.Attachment = MWF.APPAttachment = new Class( } else if (window.webkit && window.webkit.messageHandlers && window.webkit.messageHandlers.downloadAttachment) { window.webkit.messageHandlers.downloadAttachment.postMessage({ "id": att.data.id, "site": (this.json.site || this.json.id) }); } else if (window.wx && window.__wxjs_environment === 'miniprogram' && this.checkMiniProgramFile(att.data.extension)) { //微信小程序 - wx.miniProgram.navigateTo({ + wx.miniProgram.navigateTo({ url: '../file/download?attId=' + att.data.id + '&type=work&workCompleted=' + this.form.businessData.workCompleted.id }); } else { @@ -1940,12 +1940,12 @@ MWF.xApplication.process.Xform.AttachmenPreview = new Class({ }, load:function(){ - var extension = this.att.extension; + var extension = this.att.data.extension; if(extension === "ofd"){ this.previewOfd(); } if(extension === "zip"){ - //this.previewZip(); + this.previewZip(); } if(extension === "pdf"){ this.previewPdf(); @@ -1978,105 +1978,158 @@ MWF.xApplication.process.Xform.AttachmenPreview = new Class({ this.previewAce("text"); } }, - // previewZip : function (){ - // //zip压缩包预览 - // var _self = this; - // var zipViewNode = new Element("div.ztree").inject(document.body); - // o2.load("/o2_lib/zipjs/zip-fs.js",function(){ - // - // this.app.form.workAction.getAttachmentUrl(this.att.id, this.app.form.businessData.work.id, function (url) { - // var cookie = Cookie.read("x-token"); - // url = url + "?x-token=" + cookie; - // unzip().catch(error => console.error(error)); - // async function unzip() { - // zip.configure({ chunkSize: 128 }); - // let zipFs = new zip.fs.FS(); - // let directory = zipFs.addDirectory("import"); - // await directory.importHttpContent(url); - // - // o2.loadCss("/o2_lib/zTree/zTreeStyle.css",function(){ - // o2.load(["/o2_lib/jquery/jquery.min.js","/o2_lib/zTree/jquery.ztree.core.min.js"], {"sequence": true}, function(){ - // jQuery = jQuery.noConflict(true); //避免js框架冲突 - // var nodes = []; - // loadNodes(directory,nodes); - // jQuery.fn.zTree.init(jQuery(zipViewNode), {}, nodes); - // - // var dlg = o2.DL.open({ - // "title": _self.att.name, - // "width": "660px", - // "height": "510px", - // "mask": true, - // "content": zipViewNode, - // "container": null, - // "positionNode": document.body, - // "onQueryClose": function () { - // zipViewNode.destroy(); - // }, - // "buttonList": [ - // { - // "text": "关闭", - // "action": function () { - // dlg.close(); - // } - // } - // ], - // "onPostShow": function () { - // dlg.reCenter(); - // } - // }); - // - // - // }.bind(this)); - // }) - // } - // - // function loadNodes(directory,nodes){ - // var folderList = []; - // var fileList = []; - // directory.children.each(function(file){ - // if(file.directory){ - // folderList.push(file) - // } - // }) - // directory.children.each(function(file){ - // if(!file.directory){ - // fileList.push(file) - // } - // }) - // folderList.append(fileList); - // folderList.each(function(file){ - // var node = { - // name : file.name - // } - // if(nodes.children){ - // nodes.children.push(node); - // }else{ - // nodes.push(node); - // } - // if(file.directory){ - // node.children = []; - // loadNodes(file,node); - // } - // }) - // } - // }.bind(this)); - // }.bind(this)); - // }, + previewZip: function () { + debugger + //zip压缩包预览 + var _self = this; + var zipViewNode = new Element("div",{"text":"loadding..."}); + o2.load(["../o2_lib/jszip/jszip.min.js", "../o2_lib/jszip/jszip-utils.min.js"], function () { + this.app.getAttachmentUrl(this.att, function (url) { + o2.require("MWF.widget.Tree", function(){ + var options = {"style":"form"}; + var dlg = o2.DL.open({ + "title": _self.att.data.name, + "width": "660px", + "height": "510px", + "mask": true, + "content": zipViewNode, + "container": null, + "positionNode": document.body, + "onQueryClose": function () { + zipViewNode.destroy(); + }, + "buttonList": [ + { + "text": "关闭", + "action": function () { + dlg.close(); + } + } + ], + "onPostShow": function () { + dlg.reCenter(); + }, + "onPostLoad" : function(){ + + } + }); + }.bind(this)); + zipViewNode.empty(); + JSZipUtils.getBinaryContent(url, function (err, data) { + JSZip.loadAsync(data).then(function (zip) { + var nodeList = []; + zip.forEach(function (relativePath, zipEntry) { + nodeList.push(zipEntry.name); + }); + var tree = new MWF.widget.Tree(zipViewNode, options); + var treeData = _pathToTree(nodeList); + tree.load(treeData); + + + }); + }); + + }.bind(this)); + }.bind(this)); + function _pathToTree(pathList) { + var pathJsonList = []; + for (var i = 0; i < pathList.length; i++) { + var chain = pathList[i].split("/"); + var currentNode = pathJsonList; + for (var j = 0; j < chain.length; j++) { + if (chain[j] === "") { + break; + } + var wantedNode = chain[j]; + var lastNode = currentNode; + for (var k = 0; k < currentNode.length; k++) { + if (currentNode[k].name == wantedNode) { + currentNode = currentNode[k].sub; + break; + } + } + if (lastNode == currentNode) { + var obj = { + key: pathList[i], + name: wantedNode, + title:wantedNode, + text:wantedNode, + sub: [] + }; + var newNode = (currentNode[k] = obj); + if (wantedNode.indexOf(".") > -1) { + obj.dir = false; + obj.icon = "file.png"; + delete obj.sub; + } else { + obj.dir = true; + obj.expand = false; + currentNode = newNode.sub; + //delete obj.sub; + } + } else { + delete currentNode.sub; + } + } + } + var nodes = []; + + var folder = { + "title" : _self.att.name, + "text" : _self.att.name, + "sub" : [] + }; + pathJsonList.each(function(path){ + folder.sub.push(path); + }) + _sortPath(folder, nodes); + return nodes; + } + function _sortPath(pathJsonList, nodes) { + var folderList = []; + pathJsonList.sub.each(function (file) { + if (file.dir) { + folderList.push(file); + } + }); + pathJsonList.sub.each(function (file) { + if (!file.dir) { + folderList.push(file); + } + }); + folderList.each(function (file) { + var node = { + text: file.name, + title: file.name, + expand : false + }; + if (!file.dir) { + node.icon = "file.png"; + } + nodes.push(node); + if(file.sub && file.sub.length>0){ + node.sub = []; + _sortPath(file,node.sub); + } + + }) + } + }, previewPdf : function(){ - this.app.form.workAction.getAttachmentUrl(this.att.id, this.app.form.businessData.work.id, function (url) { + this.app.getAttachmentUrl(this.att, function (url) { window.open("../o2_lib/pdfjs/web/viewer.html?file=" + url) }); }, previewOfd : function(){ - this.app.form.workAction.getAttachmentUrl(this.att.id, this.app.form.businessData.work.id, function (url) { + this.app.getAttachmentUrl(this.att, function (url) { window.open("../o2_lib/ofdjs/index.html?file=" + url) }); }, previewImage : function(){ - this.app.form.workAction.getAttachmentUrl(this.att.id, this.app.form.businessData.work.id, function (url) { + this.app.getAttachmentUrl(this.att, function (url) { var imgNode = new Element("img",{"src":url,"alt":this.att.name}).inject(document.body).hide(); - o2.loadCss("../m_app/yunFile/css/viewer.css", document.body,function(){ - o2.load("../m_app/yunFile/js/viewer.js", function(){ + o2.loadCss("../o2_lib/viewer/viewer.css", document.body,function(){ + o2.load("../o2_lib/viewer/viewer.js", function(){ this.viewer = new Viewer(imgNode,{ navbar : false, toolbar : false, @@ -2091,7 +2144,8 @@ MWF.xApplication.process.Xform.AttachmenPreview = new Class({ }.bind(this)); }, previewAce:function(type){ - this.app.form.workAction.getAttachmentUrl(this.att.id, this.app.form.businessData.work.id, function (url) { + debugger + this.app.getAttachmentUrl(this.att, function (url) { o2.require("o2.widget.ace", null, false); var fileRequest = new Request({ url: url, @@ -2109,7 +2163,7 @@ MWF.xApplication.process.Xform.AttachmenPreview = new Class({ }.bind(this)); var dlg = o2.DL.open({ - "title": this.att.name, + "title": this.att.data.name, "width": "960px", "height": "610px", "mask": true, diff --git a/o2web/source/x_component_service_ServiceManager/$Main/startMenu.json b/o2web/source/x_component_service_ServiceManager/$Main/startMenu.json index b59becaca52db14cd2b188ceb1348d406507ef3e..00f64c02b7ae856aa47a027d2116ecf308832e18 100644 --- a/o2web/source/x_component_service_ServiceManager/$Main/startMenu.json +++ b/o2web/source/x_component_service_ServiceManager/$Main/startMenu.json @@ -17,7 +17,7 @@ // }, { - "title": "代理配置", + "title": MWF.xApplication.service.ServiceManager.LP.agent.name, "id": "1.1", "action": "agentConfig", "icon": "agent_script.png", @@ -25,7 +25,7 @@ "sub": [] }, { - "title": "接口配置", + "title": MWF.xApplication.service.ServiceManager.LP.invoke.name, "id": "1.1", "action": "invokeConfig", "icon": "agent_script.png", diff --git a/o2web/source/x_component_service_ServiceManager/lp/en.js b/o2web/source/x_component_service_ServiceManager/lp/en.js new file mode 100644 index 0000000000000000000000000000000000000000..ddf28219ef76799e263071202397d47050abbc9c --- /dev/null +++ b/o2web/source/x_component_service_ServiceManager/lp/en.js @@ -0,0 +1,81 @@ +MWF.xApplication.service = MWF.xApplication.service || {}; +MWF.xApplication.service.ServiceManager = MWF.xApplication.service.ServiceManager || {}; +MWF.xApplication.service.ServiceManager.LP = { + "title": "Service Platform", + "categoryTitle": "Category", + "description": "Description", + "deleteItems": "Delete selected element", + "copy": "Copy", + "copyto": "Copyto...", + "copyInfor": "Select multiple elements, press Ctrl+C to copy the elements, press Ctrl+V to paste elements into the current application", + "copyed": "The selected element has been copied", + "copyConfirmTitle": "Copy element confirmation", + "copyConfirmInfor": "The target area already contains the same elements:", + "copySource": "Original file:", + "copyTarget": "Copy files:", + "copyConfirm_overwrite": "Replace", + "copyConfirm_new": "Create", + "copyConfirm_skip": "Skip", + "copyConfirm_cancel": "Cancel", + "copynew": "New", + + "edit": "Edit", + "save": "Save", + "cancel": "Cancel", + + "phone": "Phone", + "mail": "Mail", + + "deleteElementTitle": "Delete design confirmation", + "deleteElement": "Are you sure you want to delete the selected design element?", + + "agent": { + "name": "Agent", + "create": "Create Agent", + "search": "Search Agent", + "searchText": "Please enter key words", + + "noAgentNoticeText": "There is no Agent, you can click here to create a new Agent", + "loaded": "Agent loaded", + + "deleteProcessTitle": "Delete Agent confirmation", + "deleteProcess": "Are you sure you want to delete the current Agent?", + + "noPermission" : "You are not an administrator and cannot view Agents." + }, + + "invoke": { + "name": "Service", + "create": "Create Service", + "search": "Search Service", + "searchText": "Please enter key words", + + "noAgentNoticeText": "There is no Service, you can click here to create a new Service", + "loaded": "Service loaded", + + "deleteProcessTitle": "Delete Service confirmation", + "deleteProcess": "Are you sure you want to delete the current Service?", + "noPermission" : "You are not an administrator and cannot view Service." + }, + + // "application": { + // "inputApplicationName": "Enter the data application name", + // "property": "数据应用属性", + // "name": "数据应用名称", + // "alias": "数据应用别名", + // "description": "数据应用描述", + // "type": "数据应用类型", + // "icon": "数据应用图标", + // "id": "数据应用标识", + // "firstPage": "数据应用主页", + // "controllerList": "管理者", + // "available": "可用范围" + // }, + // "createSelectTemplate": "新建:选择模板", + // "templateCategory": "模板分类:", + "all": "All", + + "agentConfig" : "Agent Config", + "interfaceConfig" : "Service Config", + "disable" : "Disabled" +}; \ No newline at end of file diff --git a/o2web/source/x_component_service_ServiceManager/lp/zh-cn.js b/o2web/source/x_component_service_ServiceManager/lp/zh-cn.js index c42c963c42abc1c82bd64223ea73987192d07070..7a843b392561e89f6efd9814c7398bf19914e77a 100644 --- a/o2web/source/x_component_service_ServiceManager/lp/zh-cn.js +++ b/o2web/source/x_component_service_ServiceManager/lp/zh-cn.js @@ -30,6 +30,7 @@ MWF.xApplication.service.ServiceManager.LP = { "deleteElement": "是否确定要删除选中的设计元素?", "agent": { + "name": "代理配置", "create": "新建代理", "search": "搜索代理", "searchText": "请输入关键字", @@ -46,6 +47,7 @@ MWF.xApplication.service.ServiceManager.LP = { }, "invoke": { + "name": "接口配置", "create": "新建接口", "search": "搜索接口", "searchText": "请输入关键字", diff --git a/o2web/source/x_desktop/js/base_loader.js b/o2web/source/x_desktop/js/base_loader.js index 095f163a893563a850a3a5f866e651bd07bd1423..e78a5cac5f795c6fcb22ede0e613e73cf88f1565 100644 --- a/o2web/source/x_desktop/js/base_loader.js +++ b/o2web/source/x_desktop/js/base_loader.js @@ -127,7 +127,16 @@ o2.addReady(function () { layout.sessionPromise = new Promise(function(resolve, reject){ o2.Actions.get("x_organization_assemble_authentication").getAuthentication(function (json) { - if (resolve) resolve(json.data); + if (json.data.language !== o2.languageName){ + o2.language = json.data.language.toLowerCase(); + o2.languageName = json.data.language; + var lp = o2.session.path + "/lp/" + o2.language + ".js"; + o2.load(lp, {"reload": true}, function(){ + if (resolve) resolve(json.data); + }); + }else{ + if (resolve) resolve(json.data); + } }.bind(this), function (xhr, text, error) { if (reject) reject({"xhr": xhr, "text": text, "error": error}); }.bind(this));