Mercurial > hg > LGMap
comparison geotemco/platin.js @ 8:8f05c2a84bba
Apply new platin and Add tree layers
author | nylin@mpiwg-berlin.mpg.de |
---|---|
date | Wed, 07 Oct 2015 11:09:20 +0200 |
parents | 0330b2138c87 |
children | 8f5635197895 |
comparison
equal
deleted
inserted
replaced
7:0330b2138c87 | 8:8f05c2a84bba |
---|---|
18301 done(); | 18301 done(); |
18302 }); | 18302 }); |
18303 }; | 18303 }; |
18304 | 18304 |
18305 })(jQuery); | 18305 })(jQuery); |
18306 /** | 18306 /*! |
18307 | 18307 |
18308 JSZip - A Javascript class for generating and reading zip files | 18308 JSZip - A Javascript class for generating and reading zip files |
18309 <http://stuartk.com/jszip> | 18309 <http://stuartk.com/jszip> |
18310 | 18310 |
18311 (c) 2009-2012 Stuart Knightley <stuart [at] stuartk.com> | 18311 (c) 2009-2014 Stuart Knightley <stuart [at] stuartk.com> |
18312 Dual licenced under the MIT license or GPLv3. See LICENSE.markdown. | 18312 Dual licenced under the MIT license or GPLv3. See https://raw.github.com/Stuk/jszip/master/LICENSE.markdown. |
18313 | 18313 |
18314 Usage: | 18314 JSZip uses the library pako released under the MIT license : |
18315 zip = new JSZip(); | 18315 https://github.com/nodeca/pako/blob/master/LICENSE |
18316 zip.file("hello.txt", "Hello, World!").add("tempfile", "nothing"); | 18316 */ |
18317 zip.folder("images").file("smile.gif", base64Data, {base64: true}); | 18317 !function(a){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=a();else if("function"==typeof define&&define.amd)define([],a);else{var b;"undefined"!=typeof window?b=window:"undefined"!=typeof global?b=global:"undefined"!=typeof self&&(b=self),b.JSZip=a()}}(function(){return function a(b,c,d){function e(g,h){if(!c[g]){if(!b[g]){var i="function"==typeof require&&require;if(!h&&i)return i(g,!0);if(f)return f(g,!0);throw new Error("Cannot find module '"+g+"'")}var j=c[g]={exports:{}};b[g][0].call(j.exports,function(a){var c=b[g][1][a];return e(c?c:a)},j,j.exports,a,b,c,d)}return c[g].exports}for(var f="function"==typeof require&&require,g=0;g<d.length;g++)e(d[g]);return e}({1:[function(a,b,c){"use strict";var d="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";c.encode=function(a){for(var b,c,e,f,g,h,i,j="",k=0;k<a.length;)b=a.charCodeAt(k++),c=a.charCodeAt(k++),e=a.charCodeAt(k++),f=b>>2,g=(3&b)<<4|c>>4,h=(15&c)<<2|e>>6,i=63&e,isNaN(c)?h=i=64:isNaN(e)&&(i=64),j=j+d.charAt(f)+d.charAt(g)+d.charAt(h)+d.charAt(i);return j},c.decode=function(a){var b,c,e,f,g,h,i,j="",k=0;for(a=a.replace(/[^A-Za-z0-9\+\/\=]/g,"");k<a.length;)f=d.indexOf(a.charAt(k++)),g=d.indexOf(a.charAt(k++)),h=d.indexOf(a.charAt(k++)),i=d.indexOf(a.charAt(k++)),b=f<<2|g>>4,c=(15&g)<<4|h>>2,e=(3&h)<<6|i,j+=String.fromCharCode(b),64!=h&&(j+=String.fromCharCode(c)),64!=i&&(j+=String.fromCharCode(e));return j}},{}],2:[function(a,b){"use strict";function c(){this.compressedSize=0,this.uncompressedSize=0,this.crc32=0,this.compressionMethod=null,this.compressedContent=null}c.prototype={getContent:function(){return null},getCompressedContent:function(){return null}},b.exports=c},{}],3:[function(a,b,c){"use strict";c.STORE={magic:"\x00\x00",compress:function(a){return a},uncompress:function(a){return a},compressInputType:null,uncompressInputType:null},c.DEFLATE=a("./flate")},{"./flate":8}],4:[function(a,b){"use strict";var c=a("./utils"),d=[0,1996959894,3993919788,2567524794,124634137,1886057615,3915621685,2657392035,249268274,2044508324,3772115230,2547177864,162941995,2125561021,3887607047,2428444049,498536548,1789927666,4089016648,2227061214,450548861,1843258603,4107580753,2211677639,325883990,1684777152,4251122042,2321926636,335633487,1661365465,4195302755,2366115317,997073096,1281953886,3579855332,2724688242,1006888145,1258607687,3524101629,2768942443,901097722,1119000684,3686517206,2898065728,853044451,1172266101,3705015759,2882616665,651767980,1373503546,3369554304,3218104598,565507253,1454621731,3485111705,3099436303,671266974,1594198024,3322730930,2970347812,795835527,1483230225,3244367275,3060149565,1994146192,31158534,2563907772,4023717930,1907459465,112637215,2680153253,3904427059,2013776290,251722036,2517215374,3775830040,2137656763,141376813,2439277719,3865271297,1802195444,476864866,2238001368,4066508878,1812370925,453092731,2181625025,4111451223,1706088902,314042704,2344532202,4240017532,1658658271,366619977,2362670323,4224994405,1303535960,984961486,2747007092,3569037538,1256170817,1037604311,2765210733,3554079995,1131014506,879679996,2909243462,3663771856,1141124467,855842277,2852801631,3708648649,1342533948,654459306,3188396048,3373015174,1466479909,544179635,3110523913,3462522015,1591671054,702138776,2966460450,3352799412,1504918807,783551873,3082640443,3233442989,3988292384,2596254646,62317068,1957810842,3939845945,2647816111,81470997,1943803523,3814918930,2489596804,225274430,2053790376,3826175755,2466906013,167816743,2097651377,4027552580,2265490386,503444072,1762050814,4150417245,2154129355,426522225,1852507879,4275313526,2312317920,282753626,1742555852,4189708143,2394877945,397917763,1622183637,3604390888,2714866558,953729732,1340076626,3518719985,2797360999,1068828381,1219638859,3624741850,2936675148,906185462,1090812512,3747672003,2825379669,829329135,1181335161,3412177804,3160834842,628085408,1382605366,3423369109,3138078467,570562233,1426400815,3317316542,2998733608,733239954,1555261956,3268935591,3050360625,752459403,1541320221,2607071920,3965973030,1969922972,40735498,2617837225,3943577151,1913087877,83908371,2512341634,3803740692,2075208622,213261112,2463272603,3855990285,2094854071,198958881,2262029012,4057260610,1759359992,534414190,2176718541,4139329115,1873836001,414664567,2282248934,4279200368,1711684554,285281116,2405801727,4167216745,1634467795,376229701,2685067896,3608007406,1308918612,956543938,2808555105,3495958263,1231636301,1047427035,2932959818,3654703836,1088359270,936918e3,2847714899,3736837829,1202900863,817233897,3183342108,3401237130,1404277552,615818150,3134207493,3453421203,1423857449,601450431,3009837614,3294710456,1567103746,711928724,3020668471,3272380065,1510334235,755167117];b.exports=function(a,b){if("undefined"==typeof a||!a.length)return 0;var e="string"!==c.getTypeOf(a);"undefined"==typeof b&&(b=0);var f=0,g=0,h=0;b=-1^b;for(var i=0,j=a.length;j>i;i++)h=e?a[i]:a.charCodeAt(i),g=255&(b^h),f=d[g],b=b>>>8^f;return-1^b}},{"./utils":21}],5:[function(a,b){"use strict";function c(){this.data=null,this.length=0,this.index=0}var d=a("./utils");c.prototype={checkOffset:function(a){this.checkIndex(this.index+a)},checkIndex:function(a){if(this.length<a||0>a)throw new Error("End of data reached (data length = "+this.length+", asked index = "+a+"). Corrupted zip ?")},setIndex:function(a){this.checkIndex(a),this.index=a},skip:function(a){this.setIndex(this.index+a)},byteAt:function(){},readInt:function(a){var b,c=0;for(this.checkOffset(a),b=this.index+a-1;b>=this.index;b--)c=(c<<8)+this.byteAt(b);return this.index+=a,c},readString:function(a){return d.transformTo("string",this.readData(a))},readData:function(){},lastIndexOfSignature:function(){},readDate:function(){var a=this.readInt(4);return new Date((a>>25&127)+1980,(a>>21&15)-1,a>>16&31,a>>11&31,a>>5&63,(31&a)<<1)}},b.exports=c},{"./utils":21}],6:[function(a,b,c){"use strict";c.base64=!1,c.binary=!1,c.dir=!1,c.createFolders=!1,c.date=null,c.compression=null,c.comment=null},{}],7:[function(a,b,c){"use strict";var d=a("./utils");c.string2binary=function(a){return d.string2binary(a)},c.string2Uint8Array=function(a){return d.transformTo("uint8array",a)},c.uint8Array2String=function(a){return d.transformTo("string",a)},c.string2Blob=function(a){var b=d.transformTo("arraybuffer",a);return d.arrayBuffer2Blob(b)},c.arrayBuffer2Blob=function(a){return d.arrayBuffer2Blob(a)},c.transformTo=function(a,b){return d.transformTo(a,b)},c.getTypeOf=function(a){return d.getTypeOf(a)},c.checkSupport=function(a){return d.checkSupport(a)},c.MAX_VALUE_16BITS=d.MAX_VALUE_16BITS,c.MAX_VALUE_32BITS=d.MAX_VALUE_32BITS,c.pretty=function(a){return d.pretty(a)},c.findCompression=function(a){return d.findCompression(a)},c.isRegExp=function(a){return d.isRegExp(a)}},{"./utils":21}],8:[function(a,b,c){"use strict";var d="undefined"!=typeof Uint8Array&&"undefined"!=typeof Uint16Array&&"undefined"!=typeof Uint32Array,e=a("pako");c.uncompressInputType=d?"uint8array":"array",c.compressInputType=d?"uint8array":"array",c.magic="\b\x00",c.compress=function(a){return e.deflateRaw(a)},c.uncompress=function(a){return e.inflateRaw(a)}},{pako:24}],9:[function(a,b){"use strict";function c(a,b){return this instanceof c?(this.files={},this.comment=null,this.root="",a&&this.load(a,b),void(this.clone=function(){var a=new c;for(var b in this)"function"!=typeof this[b]&&(a[b]=this[b]);return a})):new c(a,b)}var d=a("./base64");c.prototype=a("./object"),c.prototype.load=a("./load"),c.support=a("./support"),c.defaults=a("./defaults"),c.utils=a("./deprecatedPublicUtils"),c.base64={encode:function(a){return d.encode(a)},decode:function(a){return d.decode(a)}},c.compressions=a("./compressions"),b.exports=c},{"./base64":1,"./compressions":3,"./defaults":6,"./deprecatedPublicUtils":7,"./load":10,"./object":13,"./support":17}],10:[function(a,b){"use strict";var c=a("./base64"),d=a("./zipEntries");b.exports=function(a,b){var e,f,g,h;for(b=b||{},b.base64&&(a=c.decode(a)),f=new d(a,b),e=f.files,g=0;g<e.length;g++)h=e[g],this.file(h.fileName,h.decompressed,{binary:!0,optimizedBinaryString:!0,date:h.date,dir:h.dir,comment:h.fileComment.length?h.fileComment:null,createFolders:b.createFolders});return f.zipComment.length&&(this.comment=f.zipComment),this}},{"./base64":1,"./zipEntries":22}],11:[function(a,b){(function(a){"use strict";b.exports=function(b,c){return new a(b,c)},b.exports.test=function(b){return a.isBuffer(b)}}).call(this,"undefined"!=typeof Buffer?Buffer:void 0)},{}],12:[function(a,b){"use strict";function c(a){this.data=a,this.length=this.data.length,this.index=0}var d=a("./uint8ArrayReader");c.prototype=new d,c.prototype.readData=function(a){this.checkOffset(a);var b=this.data.slice(this.index,this.index+a);return this.index+=a,b},b.exports=c},{"./uint8ArrayReader":18}],13:[function(a,b){"use strict";var c=a("./support"),d=a("./utils"),e=a("./crc32"),f=a("./signature"),g=a("./defaults"),h=a("./base64"),i=a("./compressions"),j=a("./compressedObject"),k=a("./nodeBuffer"),l=a("./utf8"),m=a("./stringWriter"),n=a("./uint8ArrayWriter"),o=function(a){if(a._data instanceof j&&(a._data=a._data.getContent(),a.options.binary=!0,a.options.base64=!1,"uint8array"===d.getTypeOf(a._data))){var b=a._data;a._data=new Uint8Array(b.length),0!==b.length&&a._data.set(b,0)}return a._data},p=function(a){var b=o(a),e=d.getTypeOf(b);return"string"===e?!a.options.binary&&c.nodebuffer?k(b,"utf-8"):a.asBinary():b},q=function(a){var b=o(this);return null===b||"undefined"==typeof b?"":(this.options.base64&&(b=h.decode(b)),b=a&&this.options.binary?A.utf8decode(b):d.transformTo("string",b),a||this.options.binary||(b=d.transformTo("string",A.utf8encode(b))),b)},r=function(a,b,c){this.name=a,this.dir=c.dir,this.date=c.date,this.comment=c.comment,this._data=b,this.options=c,this._initialMetadata={dir:c.dir,date:c.date}};r.prototype={asText:function(){return q.call(this,!0)},asBinary:function(){return q.call(this,!1)},asNodeBuffer:function(){var a=p(this);return d.transformTo("nodebuffer",a)},asUint8Array:function(){var a=p(this);return d.transformTo("uint8array",a)},asArrayBuffer:function(){return this.asUint8Array().buffer}};var s=function(a,b){var c,d="";for(c=0;b>c;c++)d+=String.fromCharCode(255&a),a>>>=8;return d},t=function(){var a,b,c={};for(a=0;a<arguments.length;a++)for(b in arguments[a])arguments[a].hasOwnProperty(b)&&"undefined"==typeof c[b]&&(c[b]=arguments[a][b]);return c},u=function(a){return a=a||{},a.base64!==!0||null!==a.binary&&void 0!==a.binary||(a.binary=!0),a=t(a,g),a.date=a.date||new Date,null!==a.compression&&(a.compression=a.compression.toUpperCase()),a},v=function(a,b,c){var e,f=d.getTypeOf(b);if(c=u(c),c.createFolders&&(e=w(a))&&x.call(this,e,!0),c.dir||null===b||"undefined"==typeof b)c.base64=!1,c.binary=!1,b=null;else if("string"===f)c.binary&&!c.base64&&c.optimizedBinaryString!==!0&&(b=d.string2binary(b));else{if(c.base64=!1,c.binary=!0,!(f||b instanceof j))throw new Error("The data of '"+a+"' is in an unsupported format !");"arraybuffer"===f&&(b=d.transformTo("uint8array",b))}var g=new r(a,b,c);return this.files[a]=g,g},w=function(a){"/"==a.slice(-1)&&(a=a.substring(0,a.length-1));var b=a.lastIndexOf("/");return b>0?a.substring(0,b):""},x=function(a,b){return"/"!=a.slice(-1)&&(a+="/"),b="undefined"!=typeof b?b:!1,this.files[a]||v.call(this,a,null,{dir:!0,createFolders:b}),this.files[a]},y=function(a,b){var c,f=new j;return a._data instanceof j?(f.uncompressedSize=a._data.uncompressedSize,f.crc32=a._data.crc32,0===f.uncompressedSize||a.dir?(b=i.STORE,f.compressedContent="",f.crc32=0):a._data.compressionMethod===b.magic?f.compressedContent=a._data.getCompressedContent():(c=a._data.getContent(),f.compressedContent=b.compress(d.transformTo(b.compressInputType,c)))):(c=p(a),(!c||0===c.length||a.dir)&&(b=i.STORE,c=""),f.uncompressedSize=c.length,f.crc32=e(c),f.compressedContent=b.compress(d.transformTo(b.compressInputType,c))),f.compressedSize=f.compressedContent.length,f.compressionMethod=b.magic,f},z=function(a,b,c,g){var h,i,j,k,m=(c.compressedContent,d.transformTo("string",l.utf8encode(b.name))),n=b.comment||"",o=d.transformTo("string",l.utf8encode(n)),p=m.length!==b.name.length,q=o.length!==n.length,r=b.options,t="",u="",v="";j=b._initialMetadata.dir!==b.dir?b.dir:r.dir,k=b._initialMetadata.date!==b.date?b.date:r.date,h=k.getHours(),h<<=6,h|=k.getMinutes(),h<<=5,h|=k.getSeconds()/2,i=k.getFullYear()-1980,i<<=4,i|=k.getMonth()+1,i<<=5,i|=k.getDate(),p&&(u=s(1,1)+s(e(m),4)+m,t+="up"+s(u.length,2)+u),q&&(v=s(1,1)+s(this.crc32(o),4)+o,t+="uc"+s(v.length,2)+v);var w="";w+="\n\x00",w+=p||q?"\x00\b":"\x00\x00",w+=c.compressionMethod,w+=s(h,2),w+=s(i,2),w+=s(c.crc32,4),w+=s(c.compressedSize,4),w+=s(c.uncompressedSize,4),w+=s(m.length,2),w+=s(t.length,2);var x=f.LOCAL_FILE_HEADER+w+m+t,y=f.CENTRAL_FILE_HEADER+"\x00"+w+s(o.length,2)+"\x00\x00\x00\x00"+(j===!0?"\x00\x00\x00":"\x00\x00\x00\x00")+s(g,4)+m+t+o;return{fileRecord:x,dirRecord:y,compressedObject:c}},A={load:function(){throw new Error("Load method is not defined. Is the file jszip-load.js included ?")},filter:function(a){var b,c,d,e,f=[];for(b in this.files)this.files.hasOwnProperty(b)&&(d=this.files[b],e=new r(d.name,d._data,t(d.options)),c=b.slice(this.root.length,b.length),b.slice(0,this.root.length)===this.root&&a(c,e)&&f.push(e));return f},file:function(a,b,c){if(1===arguments.length){if(d.isRegExp(a)){var e=a;return this.filter(function(a,b){return!b.dir&&e.test(a)})}return this.filter(function(b,c){return!c.dir&&b===a})[0]||null}return a=this.root+a,v.call(this,a,b,c),this},folder:function(a){if(!a)return this;if(d.isRegExp(a))return this.filter(function(b,c){return c.dir&&a.test(b)});var b=this.root+a,c=x.call(this,b),e=this.clone();return e.root=c.name,e},remove:function(a){a=this.root+a;var b=this.files[a];if(b||("/"!=a.slice(-1)&&(a+="/"),b=this.files[a]),b&&!b.dir)delete this.files[a];else for(var c=this.filter(function(b,c){return c.name.slice(0,a.length)===a}),d=0;d<c.length;d++)delete this.files[c[d].name];return this},generate:function(a){a=t(a||{},{base64:!0,compression:"STORE",type:"base64",comment:null}),d.checkSupport(a.type);var b,c,e=[],g=0,j=0,k=d.transformTo("string",this.utf8encode(a.comment||this.comment||""));for(var l in this.files)if(this.files.hasOwnProperty(l)){var o=this.files[l],p=o.options.compression||a.compression.toUpperCase(),q=i[p];if(!q)throw new Error(p+" is not a valid compression method !");var r=y.call(this,o,q),u=z.call(this,l,o,r,g);g+=u.fileRecord.length+r.compressedSize,j+=u.dirRecord.length,e.push(u)}var v="";v=f.CENTRAL_DIRECTORY_END+"\x00\x00\x00\x00"+s(e.length,2)+s(e.length,2)+s(j,4)+s(g,4)+s(k.length,2)+k;var w=a.type.toLowerCase();for(b="uint8array"===w||"arraybuffer"===w||"blob"===w||"nodebuffer"===w?new n(g+j+v.length):new m(g+j+v.length),c=0;c<e.length;c++)b.append(e[c].fileRecord),b.append(e[c].compressedObject.compressedContent);for(c=0;c<e.length;c++)b.append(e[c].dirRecord);b.append(v);var x=b.finalize();switch(a.type.toLowerCase()){case"uint8array":case"arraybuffer":case"nodebuffer":return d.transformTo(a.type.toLowerCase(),x);case"blob":return d.arrayBuffer2Blob(d.transformTo("arraybuffer",x));case"base64":return a.base64?h.encode(x):x;default:return x}},crc32:function(a,b){return e(a,b)},utf8encode:function(a){return d.transformTo("string",l.utf8encode(a))},utf8decode:function(a){return l.utf8decode(a)}};b.exports=A},{"./base64":1,"./compressedObject":2,"./compressions":3,"./crc32":4,"./defaults":6,"./nodeBuffer":11,"./signature":14,"./stringWriter":16,"./support":17,"./uint8ArrayWriter":19,"./utf8":20,"./utils":21}],14:[function(a,b,c){"use strict";c.LOCAL_FILE_HEADER="PK",c.CENTRAL_FILE_HEADER="PK",c.CENTRAL_DIRECTORY_END="PK",c.ZIP64_CENTRAL_DIRECTORY_LOCATOR="PK",c.ZIP64_CENTRAL_DIRECTORY_END="PK",c.DATA_DESCRIPTOR="PK\b"},{}],15:[function(a,b){"use strict";function c(a,b){this.data=a,b||(this.data=e.string2binary(this.data)),this.length=this.data.length,this.index=0}var d=a("./dataReader"),e=a("./utils");c.prototype=new d,c.prototype.byteAt=function(a){return this.data.charCodeAt(a)},c.prototype.lastIndexOfSignature=function(a){return this.data.lastIndexOf(a)},c.prototype.readData=function(a){this.checkOffset(a);var b=this.data.slice(this.index,this.index+a);return this.index+=a,b},b.exports=c},{"./dataReader":5,"./utils":21}],16:[function(a,b){"use strict";var c=a("./utils"),d=function(){this.data=[]};d.prototype={append:function(a){a=c.transformTo("string",a),this.data.push(a)},finalize:function(){return this.data.join("")}},b.exports=d},{"./utils":21}],17:[function(a,b,c){(function(a){"use strict";if(c.base64=!0,c.array=!0,c.string=!0,c.arraybuffer="undefined"!=typeof ArrayBuffer&&"undefined"!=typeof Uint8Array,c.nodebuffer="undefined"!=typeof a,c.uint8array="undefined"!=typeof Uint8Array,"undefined"==typeof ArrayBuffer)c.blob=!1;else{var b=new ArrayBuffer(0);try{c.blob=0===new Blob([b],{type:"application/zip"}).size}catch(d){try{var e=window.BlobBuilder||window.WebKitBlobBuilder||window.MozBlobBuilder||window.MSBlobBuilder,f=new e;f.append(b),c.blob=0===f.getBlob("application/zip").size}catch(d){c.blob=!1}}}}).call(this,"undefined"!=typeof Buffer?Buffer:void 0)},{}],18:[function(a,b){"use strict";function c(a){a&&(this.data=a,this.length=this.data.length,this.index=0)}var d=a("./dataReader");c.prototype=new d,c.prototype.byteAt=function(a){return this.data[a]},c.prototype.lastIndexOfSignature=function(a){for(var b=a.charCodeAt(0),c=a.charCodeAt(1),d=a.charCodeAt(2),e=a.charCodeAt(3),f=this.length-4;f>=0;--f)if(this.data[f]===b&&this.data[f+1]===c&&this.data[f+2]===d&&this.data[f+3]===e)return f;return-1},c.prototype.readData=function(a){if(this.checkOffset(a),0===a)return new Uint8Array(0);var b=this.data.subarray(this.index,this.index+a);return this.index+=a,b},b.exports=c},{"./dataReader":5}],19:[function(a,b){"use strict";var c=a("./utils"),d=function(a){this.data=new Uint8Array(a),this.index=0};d.prototype={append:function(a){0!==a.length&&(a=c.transformTo("uint8array",a),this.data.set(a,this.index),this.index+=a.length)},finalize:function(){return this.data}},b.exports=d},{"./utils":21}],20:[function(a,b,c){"use strict";for(var d=a("./utils"),e=a("./support"),f=a("./nodeBuffer"),g=new Array(256),h=0;256>h;h++)g[h]=h>=252?6:h>=248?5:h>=240?4:h>=224?3:h>=192?2:1;g[254]=g[254]=1;var i=function(a){var b,c,d,f,g,h=a.length,i=0;for(f=0;h>f;f++)c=a.charCodeAt(f),55296===(64512&c)&&h>f+1&&(d=a.charCodeAt(f+1),56320===(64512&d)&&(c=65536+(c-55296<<10)+(d-56320),f++)),i+=128>c?1:2048>c?2:65536>c?3:4;for(b=e.uint8array?new Uint8Array(i):new Array(i),g=0,f=0;i>g;f++)c=a.charCodeAt(f),55296===(64512&c)&&h>f+1&&(d=a.charCodeAt(f+1),56320===(64512&d)&&(c=65536+(c-55296<<10)+(d-56320),f++)),128>c?b[g++]=c:2048>c?(b[g++]=192|c>>>6,b[g++]=128|63&c):65536>c?(b[g++]=224|c>>>12,b[g++]=128|c>>>6&63,b[g++]=128|63&c):(b[g++]=240|c>>>18,b[g++]=128|c>>>12&63,b[g++]=128|c>>>6&63,b[g++]=128|63&c);return b},j=function(a,b){var c;for(b=b||a.length,b>a.length&&(b=a.length),c=b-1;c>=0&&128===(192&a[c]);)c--;return 0>c?b:0===c?b:c+g[a[c]]>b?c:b},k=function(a){var b,c,e,f,h=a.length,i=new Array(2*h);for(c=0,b=0;h>b;)if(e=a[b++],128>e)i[c++]=e;else if(f=g[e],f>4)i[c++]=65533,b+=f-1;else{for(e&=2===f?31:3===f?15:7;f>1&&h>b;)e=e<<6|63&a[b++],f--;f>1?i[c++]=65533:65536>e?i[c++]=e:(e-=65536,i[c++]=55296|e>>10&1023,i[c++]=56320|1023&e)}return i.length!==c&&(i.subarray?i=i.subarray(0,c):i.length=c),d.applyFromCharCode(i)};c.utf8encode=function(a){return e.nodebuffer?f(a,"utf-8"):i(a)},c.utf8decode=function(a){if(e.nodebuffer)return d.transformTo("nodebuffer",a).toString("utf-8");a=d.transformTo(e.uint8array?"uint8array":"array",a);for(var b=[],c=0,f=a.length,g=65536;f>c;){var h=j(a,Math.min(c+g,f));b.push(e.uint8array?k(a.subarray(c,h)):k(a.slice(c,h))),c=h}return b.join("")}},{"./nodeBuffer":11,"./support":17,"./utils":21}],21:[function(a,b,c){"use strict";function d(a){return a}function e(a,b){for(var c=0;c<a.length;++c)b[c]=255&a.charCodeAt(c);return b}function f(a){var b=65536,d=[],e=a.length,f=c.getTypeOf(a),g=0,h=!0;try{switch(f){case"uint8array":String.fromCharCode.apply(null,new Uint8Array(0));break;case"nodebuffer":String.fromCharCode.apply(null,j(0))}}catch(i){h=!1}if(!h){for(var k="",l=0;l<a.length;l++)k+=String.fromCharCode(a[l]);return k}for(;e>g&&b>1;)try{d.push("array"===f||"nodebuffer"===f?String.fromCharCode.apply(null,a.slice(g,Math.min(g+b,e))):String.fromCharCode.apply(null,a.subarray(g,Math.min(g+b,e)))),g+=b}catch(i){b=Math.floor(b/2)}return d.join("")}function g(a,b){for(var c=0;c<a.length;c++)b[c]=a[c];return b}var h=a("./support"),i=a("./compressions"),j=a("./nodeBuffer");c.string2binary=function(a){for(var b="",c=0;c<a.length;c++)b+=String.fromCharCode(255&a.charCodeAt(c));return b},c.arrayBuffer2Blob=function(a){c.checkSupport("blob");try{return new Blob([a],{type:"application/zip"})}catch(b){try{var d=window.BlobBuilder||window.WebKitBlobBuilder||window.MozBlobBuilder||window.MSBlobBuilder,e=new d;return e.append(a),e.getBlob("application/zip")}catch(b){throw new Error("Bug : can't construct the Blob.")}}},c.applyFromCharCode=f;var k={};k.string={string:d,array:function(a){return e(a,new Array(a.length))},arraybuffer:function(a){return k.string.uint8array(a).buffer},uint8array:function(a){return e(a,new Uint8Array(a.length))},nodebuffer:function(a){return e(a,j(a.length))}},k.array={string:f,array:d,arraybuffer:function(a){return new Uint8Array(a).buffer},uint8array:function(a){return new Uint8Array(a)},nodebuffer:function(a){return j(a)}},k.arraybuffer={string:function(a){return f(new Uint8Array(a))},array:function(a){return g(new Uint8Array(a),new Array(a.byteLength))},arraybuffer:d,uint8array:function(a){return new Uint8Array(a)},nodebuffer:function(a){return j(new Uint8Array(a))}},k.uint8array={string:f,array:function(a){return g(a,new Array(a.length))},arraybuffer:function(a){return a.buffer},uint8array:d,nodebuffer:function(a){return j(a)}},k.nodebuffer={string:f,array:function(a){return g(a,new Array(a.length))},arraybuffer:function(a){return k.nodebuffer.uint8array(a).buffer},uint8array:function(a){return g(a,new Uint8Array(a.length))},nodebuffer:d},c.transformTo=function(a,b){if(b||(b=""),!a)return b;c.checkSupport(a);var d=c.getTypeOf(b),e=k[d][a](b);return e},c.getTypeOf=function(a){return"string"==typeof a?"string":"[object Array]"===Object.prototype.toString.call(a)?"array":h.nodebuffer&&j.test(a)?"nodebuffer":h.uint8array&&a instanceof Uint8Array?"uint8array":h.arraybuffer&&a instanceof ArrayBuffer?"arraybuffer":void 0},c.checkSupport=function(a){var b=h[a.toLowerCase()];if(!b)throw new Error(a+" is not supported by this browser")},c.MAX_VALUE_16BITS=65535,c.MAX_VALUE_32BITS=-1,c.pretty=function(a){var b,c,d="";for(c=0;c<(a||"").length;c++)b=a.charCodeAt(c),d+="\\x"+(16>b?"0":"")+b.toString(16).toUpperCase();return d},c.findCompression=function(a){for(var b in i)if(i.hasOwnProperty(b)&&i[b].magic===a)return i[b];return null},c.isRegExp=function(a){return"[object RegExp]"===Object.prototype.toString.call(a)}},{"./compressions":3,"./nodeBuffer":11,"./support":17}],22:[function(a,b){"use strict";function c(a,b){this.files=[],this.loadOptions=b,a&&this.load(a)}var d=a("./stringReader"),e=a("./nodeBufferReader"),f=a("./uint8ArrayReader"),g=a("./utils"),h=a("./signature"),i=a("./zipEntry"),j=a("./support"),k=a("./object");c.prototype={checkSignature:function(a){var b=this.reader.readString(4);if(b!==a)throw new Error("Corrupted zip or bug : unexpected signature ("+g.pretty(b)+", expected "+g.pretty(a)+")")},readBlockEndOfCentral:function(){this.diskNumber=this.reader.readInt(2),this.diskWithCentralDirStart=this.reader.readInt(2),this.centralDirRecordsOnThisDisk=this.reader.readInt(2),this.centralDirRecords=this.reader.readInt(2),this.centralDirSize=this.reader.readInt(4),this.centralDirOffset=this.reader.readInt(4),this.zipCommentLength=this.reader.readInt(2),this.zipComment=this.reader.readString(this.zipCommentLength),this.zipComment=k.utf8decode(this.zipComment)},readBlockZip64EndOfCentral:function(){this.zip64EndOfCentralSize=this.reader.readInt(8),this.versionMadeBy=this.reader.readString(2),this.versionNeeded=this.reader.readInt(2),this.diskNumber=this.reader.readInt(4),this.diskWithCentralDirStart=this.reader.readInt(4),this.centralDirRecordsOnThisDisk=this.reader.readInt(8),this.centralDirRecords=this.reader.readInt(8),this.centralDirSize=this.reader.readInt(8),this.centralDirOffset=this.reader.readInt(8),this.zip64ExtensibleData={};for(var a,b,c,d=this.zip64EndOfCentralSize-44,e=0;d>e;)a=this.reader.readInt(2),b=this.reader.readInt(4),c=this.reader.readString(b),this.zip64ExtensibleData[a]={id:a,length:b,value:c}},readBlockZip64EndOfCentralLocator:function(){if(this.diskWithZip64CentralDirStart=this.reader.readInt(4),this.relativeOffsetEndOfZip64CentralDir=this.reader.readInt(8),this.disksCount=this.reader.readInt(4),this.disksCount>1)throw new Error("Multi-volumes zip are not supported")},readLocalFiles:function(){var a,b;for(a=0;a<this.files.length;a++)b=this.files[a],this.reader.setIndex(b.localHeaderOffset),this.checkSignature(h.LOCAL_FILE_HEADER),b.readLocalPart(this.reader),b.handleUTF8()},readCentralDir:function(){var a;for(this.reader.setIndex(this.centralDirOffset);this.reader.readString(4)===h.CENTRAL_FILE_HEADER;)a=new i({zip64:this.zip64},this.loadOptions),a.readCentralPart(this.reader),this.files.push(a)},readEndOfCentral:function(){var a=this.reader.lastIndexOfSignature(h.CENTRAL_DIRECTORY_END);if(-1===a)throw new Error("Corrupted zip : can't find end of central directory");if(this.reader.setIndex(a),this.checkSignature(h.CENTRAL_DIRECTORY_END),this.readBlockEndOfCentral(),this.diskNumber===g.MAX_VALUE_16BITS||this.diskWithCentralDirStart===g.MAX_VALUE_16BITS||this.centralDirRecordsOnThisDisk===g.MAX_VALUE_16BITS||this.centralDirRecords===g.MAX_VALUE_16BITS||this.centralDirSize===g.MAX_VALUE_32BITS||this.centralDirOffset===g.MAX_VALUE_32BITS){if(this.zip64=!0,a=this.reader.lastIndexOfSignature(h.ZIP64_CENTRAL_DIRECTORY_LOCATOR),-1===a)throw new Error("Corrupted zip : can't find the ZIP64 end of central directory locator");this.reader.setIndex(a),this.checkSignature(h.ZIP64_CENTRAL_DIRECTORY_LOCATOR),this.readBlockZip64EndOfCentralLocator(),this.reader.setIndex(this.relativeOffsetEndOfZip64CentralDir),this.checkSignature(h.ZIP64_CENTRAL_DIRECTORY_END),this.readBlockZip64EndOfCentral()}},prepareReader:function(a){var b=g.getTypeOf(a);this.reader="string"!==b||j.uint8array?"nodebuffer"===b?new e(a):new f(g.transformTo("uint8array",a)):new d(a,this.loadOptions.optimizedBinaryString)},load:function(a){this.prepareReader(a),this.readEndOfCentral(),this.readCentralDir(),this.readLocalFiles()}},b.exports=c},{"./nodeBufferReader":12,"./object":13,"./signature":14,"./stringReader":15,"./support":17,"./uint8ArrayReader":18,"./utils":21,"./zipEntry":23}],23:[function(a,b){"use strict";function c(a,b){this.options=a,this.loadOptions=b}var d=a("./stringReader"),e=a("./utils"),f=a("./compressedObject"),g=a("./object");c.prototype={isEncrypted:function(){return 1===(1&this.bitFlag)},useUTF8:function(){return 2048===(2048&this.bitFlag)},prepareCompressedContent:function(a,b,c){return function(){var d=a.index;a.setIndex(b);var e=a.readData(c);return a.setIndex(d),e}},prepareContent:function(a,b,c,d,f){return function(){var a=e.transformTo(d.uncompressInputType,this.getCompressedContent()),b=d.uncompress(a);if(b.length!==f)throw new Error("Bug : uncompressed data size mismatch");return b}},readLocalPart:function(a){var b,c;if(a.skip(22),this.fileNameLength=a.readInt(2),c=a.readInt(2),this.fileName=a.readString(this.fileNameLength),a.skip(c),-1==this.compressedSize||-1==this.uncompressedSize)throw new Error("Bug or corrupted zip : didn't get enough informations from the central directory (compressedSize == -1 || uncompressedSize == -1)");if(b=e.findCompression(this.compressionMethod),null===b)throw new Error("Corrupted zip : compression "+e.pretty(this.compressionMethod)+" unknown (inner file : "+this.fileName+")");if(this.decompressed=new f,this.decompressed.compressedSize=this.compressedSize,this.decompressed.uncompressedSize=this.uncompressedSize,this.decompressed.crc32=this.crc32,this.decompressed.compressionMethod=this.compressionMethod,this.decompressed.getCompressedContent=this.prepareCompressedContent(a,a.index,this.compressedSize,b),this.decompressed.getContent=this.prepareContent(a,a.index,this.compressedSize,b,this.uncompressedSize),this.loadOptions.checkCRC32&&(this.decompressed=e.transformTo("string",this.decompressed.getContent()),g.crc32(this.decompressed)!==this.crc32))throw new Error("Corrupted zip : CRC32 mismatch")},readCentralPart:function(a){if(this.versionMadeBy=a.readString(2),this.versionNeeded=a.readInt(2),this.bitFlag=a.readInt(2),this.compressionMethod=a.readString(2),this.date=a.readDate(),this.crc32=a.readInt(4),this.compressedSize=a.readInt(4),this.uncompressedSize=a.readInt(4),this.fileNameLength=a.readInt(2),this.extraFieldsLength=a.readInt(2),this.fileCommentLength=a.readInt(2),this.diskNumberStart=a.readInt(2),this.internalFileAttributes=a.readInt(2),this.externalFileAttributes=a.readInt(4),this.localHeaderOffset=a.readInt(4),this.isEncrypted())throw new Error("Encrypted zip are not supported");this.fileName=a.readString(this.fileNameLength),this.readExtraFields(a),this.parseZIP64ExtraField(a),this.fileComment=a.readString(this.fileCommentLength),this.dir=16&this.externalFileAttributes?!0:!1},parseZIP64ExtraField:function(){if(this.extraFields[1]){var a=new d(this.extraFields[1].value);this.uncompressedSize===e.MAX_VALUE_32BITS&&(this.uncompressedSize=a.readInt(8)),this.compressedSize===e.MAX_VALUE_32BITS&&(this.compressedSize=a.readInt(8)),this.localHeaderOffset===e.MAX_VALUE_32BITS&&(this.localHeaderOffset=a.readInt(8)),this.diskNumberStart===e.MAX_VALUE_32BITS&&(this.diskNumberStart=a.readInt(4))}},readExtraFields:function(a){var b,c,d,e=a.index;for(this.extraFields=this.extraFields||{};a.index<e+this.extraFieldsLength;)b=a.readInt(2),c=a.readInt(2),d=a.readString(c),this.extraFields[b]={id:b,length:c,value:d}},handleUTF8:function(){if(this.useUTF8())this.fileName=g.utf8decode(this.fileName),this.fileComment=g.utf8decode(this.fileComment);else{var a=this.findExtraFieldUnicodePath();null!==a&&(this.fileName=a);var b=this.findExtraFieldUnicodeComment();null!==b&&(this.fileComment=b)}},findExtraFieldUnicodePath:function(){var a=this.extraFields[28789];if(a){var b=new d(a.value);return 1!==b.readInt(1)?null:g.crc32(this.fileName)!==b.readInt(4)?null:g.utf8decode(b.readString(a.length-5))}return null},findExtraFieldUnicodeComment:function(){var a=this.extraFields[25461];if(a){var b=new d(a.value);return 1!==b.readInt(1)?null:g.crc32(this.fileComment)!==b.readInt(4)?null:g.utf8decode(b.readString(a.length-5))}return null}},b.exports=c},{"./compressedObject":2,"./object":13,"./stringReader":15,"./utils":21}],24:[function(a,b){"use strict";var c=a("./lib/utils/common").assign,d=a("./lib/deflate"),e=a("./lib/inflate"),f=a("./lib/zlib/constants"),g={};c(g,d,e,f),b.exports=g},{"./lib/deflate":25,"./lib/inflate":26,"./lib/utils/common":27,"./lib/zlib/constants":30}],25:[function(a,b,c){"use strict";function d(a,b){var c=new s(b);if(c.push(a,!0),c.err)throw c.msg;return c.result}function e(a,b){return b=b||{},b.raw=!0,d(a,b)}function f(a,b){return b=b||{},b.gzip=!0,d(a,b)}var g=a("./zlib/deflate.js"),h=a("./utils/common"),i=a("./utils/strings"),j=a("./zlib/messages"),k=a("./zlib/zstream"),l=0,m=4,n=0,o=1,p=-1,q=0,r=8,s=function(a){this.options=h.assign({level:p,method:r,chunkSize:16384,windowBits:15,memLevel:8,strategy:q,to:""},a||{});var b=this.options;b.raw&&b.windowBits>0?b.windowBits=-b.windowBits:b.gzip&&b.windowBits>0&&b.windowBits<16&&(b.windowBits+=16),this.err=0,this.msg="",this.ended=!1,this.chunks=[],this.strm=new k,this.strm.avail_out=0;var c=g.deflateInit2(this.strm,b.level,b.method,b.windowBits,b.memLevel,b.strategy);if(c!==n)throw new Error(j[c]);b.header&&g.deflateSetHeader(this.strm,b.header) |
18318 zip.file("Xmas.txt", "Ho ho ho !", {date : new Date("December 25, 2007 00:00:01")}); | 18318 };s.prototype.push=function(a,b){var c,d,e=this.strm,f=this.options.chunkSize;if(this.ended)return!1;d=b===~~b?b:b===!0?m:l,e.input="string"==typeof a?i.string2buf(a):a,e.next_in=0,e.avail_in=e.input.length;do{if(0===e.avail_out&&(e.output=new h.Buf8(f),e.next_out=0,e.avail_out=f),c=g.deflate(e,d),c!==o&&c!==n)return this.onEnd(c),this.ended=!0,!1;(0===e.avail_out||0===e.avail_in&&d===m)&&this.onData("string"===this.options.to?i.buf2binstring(h.shrinkBuf(e.output,e.next_out)):h.shrinkBuf(e.output,e.next_out))}while((e.avail_in>0||0===e.avail_out)&&c!==o);return d===m?(c=g.deflateEnd(this.strm),this.onEnd(c),this.ended=!0,c===n):!0},s.prototype.onData=function(a){this.chunks.push(a)},s.prototype.onEnd=function(a){a===n&&(this.result="string"===this.options.to?this.chunks.join(""):h.flattenChunks(this.chunks)),this.chunks=[],this.err=a,this.msg=this.strm.msg},c.Deflate=s,c.deflate=d,c.deflateRaw=e,c.gzip=f},{"./utils/common":27,"./utils/strings":28,"./zlib/deflate.js":32,"./zlib/messages":37,"./zlib/zstream":39}],26:[function(a,b,c){"use strict";function d(a,b){var c=new m(b);if(c.push(a,!0),c.err)throw c.msg;return c.result}function e(a,b){return b=b||{},b.raw=!0,d(a,b)}var f=a("./zlib/inflate.js"),g=a("./utils/common"),h=a("./utils/strings"),i=a("./zlib/constants"),j=a("./zlib/messages"),k=a("./zlib/zstream"),l=a("./zlib/gzheader"),m=function(a){this.options=g.assign({chunkSize:16384,windowBits:0,to:""},a||{});var b=this.options;b.raw&&b.windowBits>=0&&b.windowBits<16&&(b.windowBits=-b.windowBits,0===b.windowBits&&(b.windowBits=-15)),!(b.windowBits>=0&&b.windowBits<16)||a&&a.windowBits||(b.windowBits+=32),b.windowBits>15&&b.windowBits<48&&0===(15&b.windowBits)&&(b.windowBits|=15),this.err=0,this.msg="",this.ended=!1,this.chunks=[],this.strm=new k,this.strm.avail_out=0;var c=f.inflateInit2(this.strm,b.windowBits);if(c!==i.Z_OK)throw new Error(j[c]);this.header=new l,f.inflateGetHeader(this.strm,this.header)};m.prototype.push=function(a,b){var c,d,e,j,k,l=this.strm,m=this.options.chunkSize;if(this.ended)return!1;d=b===~~b?b:b===!0?i.Z_FINISH:i.Z_NO_FLUSH,l.input="string"==typeof a?h.binstring2buf(a):a,l.next_in=0,l.avail_in=l.input.length;do{if(0===l.avail_out&&(l.output=new g.Buf8(m),l.next_out=0,l.avail_out=m),c=f.inflate(l,i.Z_NO_FLUSH),c!==i.Z_STREAM_END&&c!==i.Z_OK)return this.onEnd(c),this.ended=!0,!1;l.next_out&&(0===l.avail_out||c===i.Z_STREAM_END||0===l.avail_in&&d===i.Z_FINISH)&&("string"===this.options.to?(e=h.utf8border(l.output,l.next_out),j=l.next_out-e,k=h.buf2string(l.output,e),l.next_out=j,l.avail_out=m-j,j&&g.arraySet(l.output,l.output,e,j,0),this.onData(k)):this.onData(g.shrinkBuf(l.output,l.next_out)))}while(l.avail_in>0&&c!==i.Z_STREAM_END);return c===i.Z_STREAM_END&&(d=i.Z_FINISH),d===i.Z_FINISH?(c=f.inflateEnd(this.strm),this.onEnd(c),this.ended=!0,c===i.Z_OK):!0},m.prototype.onData=function(a){this.chunks.push(a)},m.prototype.onEnd=function(a){a===i.Z_OK&&(this.result="string"===this.options.to?this.chunks.join(""):g.flattenChunks(this.chunks)),this.chunks=[],this.err=a,this.msg=this.strm.msg},c.Inflate=m,c.inflate=d,c.inflateRaw=e,c.ungzip=d},{"./utils/common":27,"./utils/strings":28,"./zlib/constants":30,"./zlib/gzheader":33,"./zlib/inflate.js":35,"./zlib/messages":37,"./zlib/zstream":39}],27:[function(a,b,c){"use strict";var d="undefined"!=typeof Uint8Array&&"undefined"!=typeof Uint16Array&&"undefined"!=typeof Int32Array;c.assign=function(a){for(var b=Array.prototype.slice.call(arguments,1);b.length;){var c=b.shift();if(c){if("object"!=typeof c)throw new TypeError(c+"must be non-object");for(var d in c)c.hasOwnProperty(d)&&(a[d]=c[d])}}return a},c.shrinkBuf=function(a,b){return a.length===b?a:a.subarray?a.subarray(0,b):(a.length=b,a)};var e={arraySet:function(a,b,c,d,e){if(b.subarray&&a.subarray)return void a.set(b.subarray(c,c+d),e);for(var f=0;d>f;f++)a[e+f]=b[c+f]},flattenChunks:function(a){var b,c,d,e,f,g;for(d=0,b=0,c=a.length;c>b;b++)d+=a[b].length;for(g=new Uint8Array(d),e=0,b=0,c=a.length;c>b;b++)f=a[b],g.set(f,e),e+=f.length;return g}},f={arraySet:function(a,b,c,d,e){for(var f=0;d>f;f++)a[e+f]=b[c+f]},flattenChunks:function(a){return[].concat.apply([],a)}};c.setTyped=function(a){a?(c.Buf8=Uint8Array,c.Buf16=Uint16Array,c.Buf32=Int32Array,c.assign(c,e)):(c.Buf8=Array,c.Buf16=Array,c.Buf32=Array,c.assign(c,f))},c.setTyped(d)},{}],28:[function(a,b,c){"use strict";function d(a,b){if(65537>b&&(a.subarray&&g||!a.subarray&&f))return String.fromCharCode.apply(null,e.shrinkBuf(a,b));for(var c="",d=0;b>d;d++)c+=String.fromCharCode(a[d]);return c}var e=a("./common"),f=!0,g=!0;try{String.fromCharCode.apply(null,[0])}catch(h){f=!1}try{String.fromCharCode.apply(null,new Uint8Array(1))}catch(h){g=!1}for(var i=new e.Buf8(256),j=0;256>j;j++)i[j]=j>=252?6:j>=248?5:j>=240?4:j>=224?3:j>=192?2:1;i[254]=i[254]=1,c.string2buf=function(a){var b,c,d,f,g,h=a.length,i=0;for(f=0;h>f;f++)c=a.charCodeAt(f),55296===(64512&c)&&h>f+1&&(d=a.charCodeAt(f+1),56320===(64512&d)&&(c=65536+(c-55296<<10)+(d-56320),f++)),i+=128>c?1:2048>c?2:65536>c?3:4;for(b=new e.Buf8(i),g=0,f=0;i>g;f++)c=a.charCodeAt(f),55296===(64512&c)&&h>f+1&&(d=a.charCodeAt(f+1),56320===(64512&d)&&(c=65536+(c-55296<<10)+(d-56320),f++)),128>c?b[g++]=c:2048>c?(b[g++]=192|c>>>6,b[g++]=128|63&c):65536>c?(b[g++]=224|c>>>12,b[g++]=128|c>>>6&63,b[g++]=128|63&c):(b[g++]=240|c>>>18,b[g++]=128|c>>>12&63,b[g++]=128|c>>>6&63,b[g++]=128|63&c);return b},c.buf2binstring=function(a){return d(a,a.length)},c.binstring2buf=function(a){for(var b=new e.Buf8(a.length),c=0,d=b.length;d>c;c++)b[c]=a.charCodeAt(c);return b},c.buf2string=function(a,b){var c,e,f,g,h=b||a.length,j=new Array(2*h);for(e=0,c=0;h>c;)if(f=a[c++],128>f)j[e++]=f;else if(g=i[f],g>4)j[e++]=65533,c+=g-1;else{for(f&=2===g?31:3===g?15:7;g>1&&h>c;)f=f<<6|63&a[c++],g--;g>1?j[e++]=65533:65536>f?j[e++]=f:(f-=65536,j[e++]=55296|f>>10&1023,j[e++]=56320|1023&f)}return d(j,e)},c.utf8border=function(a,b){var c;for(b=b||a.length,b>a.length&&(b=a.length),c=b-1;c>=0&&128===(192&a[c]);)c--;return 0>c?b:0===c?b:c+i[a[c]]>b?c:b}},{"./common":27}],29:[function(a,b){"use strict";function c(a,b,c,d){for(var e=65535&a|0,f=a>>>16&65535|0,g=0;0!==c;){g=c>2e3?2e3:c,c-=g;do e=e+b[d++]|0,f=f+e|0;while(--g);e%=65521,f%=65521}return e|f<<16|0}b.exports=c},{}],30:[function(a,b){b.exports={Z_NO_FLUSH:0,Z_PARTIAL_FLUSH:1,Z_SYNC_FLUSH:2,Z_FULL_FLUSH:3,Z_FINISH:4,Z_BLOCK:5,Z_TREES:6,Z_OK:0,Z_STREAM_END:1,Z_NEED_DICT:2,Z_ERRNO:-1,Z_STREAM_ERROR:-2,Z_DATA_ERROR:-3,Z_BUF_ERROR:-5,Z_NO_COMPRESSION:0,Z_BEST_SPEED:1,Z_BEST_COMPRESSION:9,Z_DEFAULT_COMPRESSION:-1,Z_FILTERED:1,Z_HUFFMAN_ONLY:2,Z_RLE:3,Z_FIXED:4,Z_DEFAULT_STRATEGY:0,Z_BINARY:0,Z_TEXT:1,Z_UNKNOWN:2,Z_DEFLATED:8}},{}],31:[function(a,b){"use strict";function c(){for(var a,b=[],c=0;256>c;c++){a=c;for(var d=0;8>d;d++)a=1&a?3988292384^a>>>1:a>>>1;b[c]=a}return b}function d(a,b,c,d){var f=e,g=d+c;a=-1^a;for(var h=d;g>h;h++)a=a>>>8^f[255&(a^b[h])];return-1^a}var e=c();b.exports=d},{}],32:[function(a,b,c){"use strict";function d(a,b){return a.msg=G[b],b}function e(a){return(a<<1)-(a>4?9:0)}function f(a){for(var b=a.length;--b>=0;)a[b]=0}function g(a){var b=a.state,c=b.pending;c>a.avail_out&&(c=a.avail_out),0!==c&&(C.arraySet(a.output,b.pending_buf,b.pending_out,c,a.next_out),a.next_out+=c,b.pending_out+=c,a.total_out+=c,a.avail_out-=c,b.pending-=c,0===b.pending&&(b.pending_out=0))}function h(a,b){D._tr_flush_block(a,a.block_start>=0?a.block_start:-1,a.strstart-a.block_start,b),a.block_start=a.strstart,g(a.strm)}function i(a,b){a.pending_buf[a.pending++]=b}function j(a,b){a.pending_buf[a.pending++]=b>>>8&255,a.pending_buf[a.pending++]=255&b}function k(a,b,c,d){var e=a.avail_in;return e>d&&(e=d),0===e?0:(a.avail_in-=e,C.arraySet(b,a.input,a.next_in,e,c),1===a.state.wrap?a.adler=E(a.adler,b,e,c):2===a.state.wrap&&(a.adler=F(a.adler,b,e,c)),a.next_in+=e,a.total_in+=e,e)}function l(a,b){var c,d,e=a.max_chain_length,f=a.strstart,g=a.prev_length,h=a.nice_match,i=a.strstart>a.w_size-jb?a.strstart-(a.w_size-jb):0,j=a.window,k=a.w_mask,l=a.prev,m=a.strstart+ib,n=j[f+g-1],o=j[f+g];a.prev_length>=a.good_match&&(e>>=2),h>a.lookahead&&(h=a.lookahead);do if(c=b,j[c+g]===o&&j[c+g-1]===n&&j[c]===j[f]&&j[++c]===j[f+1]){f+=2,c++;do;while(j[++f]===j[++c]&&j[++f]===j[++c]&&j[++f]===j[++c]&&j[++f]===j[++c]&&j[++f]===j[++c]&&j[++f]===j[++c]&&j[++f]===j[++c]&&j[++f]===j[++c]&&m>f);if(d=ib-(m-f),f=m-ib,d>g){if(a.match_start=b,g=d,d>=h)break;n=j[f+g-1],o=j[f+g]}}while((b=l[b&k])>i&&0!==--e);return g<=a.lookahead?g:a.lookahead}function m(a){var b,c,d,e,f,g=a.w_size;do{if(e=a.window_size-a.lookahead-a.strstart,a.strstart>=g+(g-jb)){C.arraySet(a.window,a.window,g,g,0),a.match_start-=g,a.strstart-=g,a.block_start-=g,c=a.hash_size,b=c;do d=a.head[--b],a.head[b]=d>=g?d-g:0;while(--c);c=g,b=c;do d=a.prev[--b],a.prev[b]=d>=g?d-g:0;while(--c);e+=g}if(0===a.strm.avail_in)break;if(c=k(a.strm,a.window,a.strstart+a.lookahead,e),a.lookahead+=c,a.lookahead+a.insert>=hb)for(f=a.strstart-a.insert,a.ins_h=a.window[f],a.ins_h=(a.ins_h<<a.hash_shift^a.window[f+1])&a.hash_mask;a.insert&&(a.ins_h=(a.ins_h<<a.hash_shift^a.window[f+hb-1])&a.hash_mask,a.prev[f&a.w_mask]=a.head[a.ins_h],a.head[a.ins_h]=f,f++,a.insert--,!(a.lookahead+a.insert<hb)););}while(a.lookahead<jb&&0!==a.strm.avail_in)}function n(a,b){var c=65535;for(c>a.pending_buf_size-5&&(c=a.pending_buf_size-5);;){if(a.lookahead<=1){if(m(a),0===a.lookahead&&b===H)return sb;if(0===a.lookahead)break}a.strstart+=a.lookahead,a.lookahead=0;var d=a.block_start+c;if((0===a.strstart||a.strstart>=d)&&(a.lookahead=a.strstart-d,a.strstart=d,h(a,!1),0===a.strm.avail_out))return sb;if(a.strstart-a.block_start>=a.w_size-jb&&(h(a,!1),0===a.strm.avail_out))return sb}return a.insert=0,b===K?(h(a,!0),0===a.strm.avail_out?ub:vb):a.strstart>a.block_start&&(h(a,!1),0===a.strm.avail_out)?sb:sb}function o(a,b){for(var c,d;;){if(a.lookahead<jb){if(m(a),a.lookahead<jb&&b===H)return sb;if(0===a.lookahead)break}if(c=0,a.lookahead>=hb&&(a.ins_h=(a.ins_h<<a.hash_shift^a.window[a.strstart+hb-1])&a.hash_mask,c=a.prev[a.strstart&a.w_mask]=a.head[a.ins_h],a.head[a.ins_h]=a.strstart),0!==c&&a.strstart-c<=a.w_size-jb&&(a.match_length=l(a,c)),a.match_length>=hb)if(d=D._tr_tally(a,a.strstart-a.match_start,a.match_length-hb),a.lookahead-=a.match_length,a.match_length<=a.max_lazy_match&&a.lookahead>=hb){a.match_length--;do a.strstart++,a.ins_h=(a.ins_h<<a.hash_shift^a.window[a.strstart+hb-1])&a.hash_mask,c=a.prev[a.strstart&a.w_mask]=a.head[a.ins_h],a.head[a.ins_h]=a.strstart;while(0!==--a.match_length);a.strstart++}else a.strstart+=a.match_length,a.match_length=0,a.ins_h=a.window[a.strstart],a.ins_h=(a.ins_h<<a.hash_shift^a.window[a.strstart+1])&a.hash_mask;else d=D._tr_tally(a,0,a.window[a.strstart]),a.lookahead--,a.strstart++;if(d&&(h(a,!1),0===a.strm.avail_out))return sb}return a.insert=a.strstart<hb-1?a.strstart:hb-1,b===K?(h(a,!0),0===a.strm.avail_out?ub:vb):a.last_lit&&(h(a,!1),0===a.strm.avail_out)?sb:tb}function p(a,b){for(var c,d,e;;){if(a.lookahead<jb){if(m(a),a.lookahead<jb&&b===H)return sb;if(0===a.lookahead)break}if(c=0,a.lookahead>=hb&&(a.ins_h=(a.ins_h<<a.hash_shift^a.window[a.strstart+hb-1])&a.hash_mask,c=a.prev[a.strstart&a.w_mask]=a.head[a.ins_h],a.head[a.ins_h]=a.strstart),a.prev_length=a.match_length,a.prev_match=a.match_start,a.match_length=hb-1,0!==c&&a.prev_length<a.max_lazy_match&&a.strstart-c<=a.w_size-jb&&(a.match_length=l(a,c),a.match_length<=5&&(a.strategy===S||a.match_length===hb&&a.strstart-a.match_start>4096)&&(a.match_length=hb-1)),a.prev_length>=hb&&a.match_length<=a.prev_length){e=a.strstart+a.lookahead-hb,d=D._tr_tally(a,a.strstart-1-a.prev_match,a.prev_length-hb),a.lookahead-=a.prev_length-1,a.prev_length-=2;do++a.strstart<=e&&(a.ins_h=(a.ins_h<<a.hash_shift^a.window[a.strstart+hb-1])&a.hash_mask,c=a.prev[a.strstart&a.w_mask]=a.head[a.ins_h],a.head[a.ins_h]=a.strstart);while(0!==--a.prev_length);if(a.match_available=0,a.match_length=hb-1,a.strstart++,d&&(h(a,!1),0===a.strm.avail_out))return sb}else if(a.match_available){if(d=D._tr_tally(a,0,a.window[a.strstart-1]),d&&h(a,!1),a.strstart++,a.lookahead--,0===a.strm.avail_out)return sb}else a.match_available=1,a.strstart++,a.lookahead--}return a.match_available&&(d=D._tr_tally(a,0,a.window[a.strstart-1]),a.match_available=0),a.insert=a.strstart<hb-1?a.strstart:hb-1,b===K?(h(a,!0),0===a.strm.avail_out?ub:vb):a.last_lit&&(h(a,!1),0===a.strm.avail_out)?sb:tb}function q(a,b){for(var c,d,e,f,g=a.window;;){if(a.lookahead<=ib){if(m(a),a.lookahead<=ib&&b===H)return sb;if(0===a.lookahead)break}if(a.match_length=0,a.lookahead>=hb&&a.strstart>0&&(e=a.strstart-1,d=g[e],d===g[++e]&&d===g[++e]&&d===g[++e])){f=a.strstart+ib;do;while(d===g[++e]&&d===g[++e]&&d===g[++e]&&d===g[++e]&&d===g[++e]&&d===g[++e]&&d===g[++e]&&d===g[++e]&&f>e);a.match_length=ib-(f-e),a.match_length>a.lookahead&&(a.match_length=a.lookahead)}if(a.match_length>=hb?(c=D._tr_tally(a,1,a.match_length-hb),a.lookahead-=a.match_length,a.strstart+=a.match_length,a.match_length=0):(c=D._tr_tally(a,0,a.window[a.strstart]),a.lookahead--,a.strstart++),c&&(h(a,!1),0===a.strm.avail_out))return sb}return a.insert=0,b===K?(h(a,!0),0===a.strm.avail_out?ub:vb):a.last_lit&&(h(a,!1),0===a.strm.avail_out)?sb:tb}function r(a,b){for(var c;;){if(0===a.lookahead&&(m(a),0===a.lookahead)){if(b===H)return sb;break}if(a.match_length=0,c=D._tr_tally(a,0,a.window[a.strstart]),a.lookahead--,a.strstart++,c&&(h(a,!1),0===a.strm.avail_out))return sb}return a.insert=0,b===K?(h(a,!0),0===a.strm.avail_out?ub:vb):a.last_lit&&(h(a,!1),0===a.strm.avail_out)?sb:tb}function s(a){a.window_size=2*a.w_size,f(a.head),a.max_lazy_match=B[a.level].max_lazy,a.good_match=B[a.level].good_length,a.nice_match=B[a.level].nice_length,a.max_chain_length=B[a.level].max_chain,a.strstart=0,a.block_start=0,a.lookahead=0,a.insert=0,a.match_length=a.prev_length=hb-1,a.match_available=0,a.ins_h=0}function t(){this.strm=null,this.status=0,this.pending_buf=null,this.pending_buf_size=0,this.pending_out=0,this.pending=0,this.wrap=0,this.gzhead=null,this.gzindex=0,this.method=Y,this.last_flush=-1,this.w_size=0,this.w_bits=0,this.w_mask=0,this.window=null,this.window_size=0,this.prev=null,this.head=null,this.ins_h=0,this.hash_size=0,this.hash_bits=0,this.hash_mask=0,this.hash_shift=0,this.block_start=0,this.match_length=0,this.prev_match=0,this.match_available=0,this.strstart=0,this.match_start=0,this.lookahead=0,this.prev_length=0,this.max_chain_length=0,this.max_lazy_match=0,this.level=0,this.strategy=0,this.good_match=0,this.nice_match=0,this.dyn_ltree=new C.Buf16(2*fb),this.dyn_dtree=new C.Buf16(2*(2*db+1)),this.bl_tree=new C.Buf16(2*(2*eb+1)),f(this.dyn_ltree),f(this.dyn_dtree),f(this.bl_tree),this.l_desc=null,this.d_desc=null,this.bl_desc=null,this.bl_count=new C.Buf16(gb+1),this.heap=new C.Buf16(2*cb+1),f(this.heap),this.heap_len=0,this.heap_max=0,this.depth=new C.Buf16(2*cb+1),f(this.depth),this.l_buf=0,this.lit_bufsize=0,this.last_lit=0,this.d_buf=0,this.opt_len=0,this.static_len=0,this.matches=0,this.insert=0,this.bi_buf=0,this.bi_valid=0}function u(a){var b;return a&&a.state?(a.total_in=a.total_out=0,a.data_type=X,b=a.state,b.pending=0,b.pending_out=0,b.wrap<0&&(b.wrap=-b.wrap),b.status=b.wrap?lb:qb,a.adler=2===b.wrap?0:1,b.last_flush=H,D._tr_init(b),M):d(a,O)}function v(a){var b=u(a);return b===M&&s(a.state),b}function w(a,b){return a&&a.state?2!==a.state.wrap?O:(a.state.gzhead=b,M):O}function x(a,b,c,e,f,g){if(!a)return O;var h=1;if(b===R&&(b=6),0>e?(h=0,e=-e):e>15&&(h=2,e-=16),1>f||f>Z||c!==Y||8>e||e>15||0>b||b>9||0>g||g>V)return d(a,O);8===e&&(e=9);var i=new t;return a.state=i,i.strm=a,i.wrap=h,i.gzhead=null,i.w_bits=e,i.w_size=1<<i.w_bits,i.w_mask=i.w_size-1,i.hash_bits=f+7,i.hash_size=1<<i.hash_bits,i.hash_mask=i.hash_size-1,i.hash_shift=~~((i.hash_bits+hb-1)/hb),i.window=new C.Buf8(2*i.w_size),i.head=new C.Buf16(i.hash_size),i.prev=new C.Buf16(i.w_size),i.lit_bufsize=1<<f+6,i.pending_buf_size=4*i.lit_bufsize,i.pending_buf=new C.Buf8(i.pending_buf_size),i.d_buf=i.lit_bufsize>>1,i.l_buf=3*i.lit_bufsize,i.level=b,i.strategy=g,i.method=c,v(a)}function y(a,b){return x(a,b,Y,$,_,W)}function z(a,b){var c,h,k,l;if(!a||!a.state||b>L||0>b)return a?d(a,O):O;if(h=a.state,!a.output||!a.input&&0!==a.avail_in||h.status===rb&&b!==K)return d(a,0===a.avail_out?Q:O);if(h.strm=a,c=h.last_flush,h.last_flush=b,h.status===lb)if(2===h.wrap)a.adler=0,i(h,31),i(h,139),i(h,8),h.gzhead?(i(h,(h.gzhead.text?1:0)+(h.gzhead.hcrc?2:0)+(h.gzhead.extra?4:0)+(h.gzhead.name?8:0)+(h.gzhead.comment?16:0)),i(h,255&h.gzhead.time),i(h,h.gzhead.time>>8&255),i(h,h.gzhead.time>>16&255),i(h,h.gzhead.time>>24&255),i(h,9===h.level?2:h.strategy>=T||h.level<2?4:0),i(h,255&h.gzhead.os),h.gzhead.extra&&h.gzhead.extra.length&&(i(h,255&h.gzhead.extra.length),i(h,h.gzhead.extra.length>>8&255)),h.gzhead.hcrc&&(a.adler=F(a.adler,h.pending_buf,h.pending,0)),h.gzindex=0,h.status=mb):(i(h,0),i(h,0),i(h,0),i(h,0),i(h,0),i(h,9===h.level?2:h.strategy>=T||h.level<2?4:0),i(h,wb),h.status=qb);else{var m=Y+(h.w_bits-8<<4)<<8,n=-1;n=h.strategy>=T||h.level<2?0:h.level<6?1:6===h.level?2:3,m|=n<<6,0!==h.strstart&&(m|=kb),m+=31-m%31,h.status=qb,j(h,m),0!==h.strstart&&(j(h,a.adler>>>16),j(h,65535&a.adler)),a.adler=1}if(h.status===mb)if(h.gzhead.extra){for(k=h.pending;h.gzindex<(65535&h.gzhead.extra.length)&&(h.pending!==h.pending_buf_size||(h.gzhead.hcrc&&h.pending>k&&(a.adler=F(a.adler,h.pending_buf,h.pending-k,k)),g(a),k=h.pending,h.pending!==h.pending_buf_size));)i(h,255&h.gzhead.extra[h.gzindex]),h.gzindex++;h.gzhead.hcrc&&h.pending>k&&(a.adler=F(a.adler,h.pending_buf,h.pending-k,k)),h.gzindex===h.gzhead.extra.length&&(h.gzindex=0,h.status=nb)}else h.status=nb;if(h.status===nb)if(h.gzhead.name){k=h.pending;do{if(h.pending===h.pending_buf_size&&(h.gzhead.hcrc&&h.pending>k&&(a.adler=F(a.adler,h.pending_buf,h.pending-k,k)),g(a),k=h.pending,h.pending===h.pending_buf_size)){l=1;break}l=h.gzindex<h.gzhead.name.length?255&h.gzhead.name.charCodeAt(h.gzindex++):0,i(h,l)}while(0!==l);h.gzhead.hcrc&&h.pending>k&&(a.adler=F(a.adler,h.pending_buf,h.pending-k,k)),0===l&&(h.gzindex=0,h.status=ob)}else h.status=ob;if(h.status===ob)if(h.gzhead.comment){k=h.pending;do{if(h.pending===h.pending_buf_size&&(h.gzhead.hcrc&&h.pending>k&&(a.adler=F(a.adler,h.pending_buf,h.pending-k,k)),g(a),k=h.pending,h.pending===h.pending_buf_size)){l=1;break}l=h.gzindex<h.gzhead.comment.length?255&h.gzhead.comment.charCodeAt(h.gzindex++):0,i(h,l)}while(0!==l);h.gzhead.hcrc&&h.pending>k&&(a.adler=F(a.adler,h.pending_buf,h.pending-k,k)),0===l&&(h.status=pb)}else h.status=pb;if(h.status===pb&&(h.gzhead.hcrc?(h.pending+2>h.pending_buf_size&&g(a),h.pending+2<=h.pending_buf_size&&(i(h,255&a.adler),i(h,a.adler>>8&255),a.adler=0,h.status=qb)):h.status=qb),0!==h.pending){if(g(a),0===a.avail_out)return h.last_flush=-1,M}else if(0===a.avail_in&&e(b)<=e(c)&&b!==K)return d(a,Q);if(h.status===rb&&0!==a.avail_in)return d(a,Q);if(0!==a.avail_in||0!==h.lookahead||b!==H&&h.status!==rb){var o=h.strategy===T?r(h,b):h.strategy===U?q(h,b):B[h.level].func(h,b);if((o===ub||o===vb)&&(h.status=rb),o===sb||o===ub)return 0===a.avail_out&&(h.last_flush=-1),M;if(o===tb&&(b===I?D._tr_align(h):b!==L&&(D._tr_stored_block(h,0,0,!1),b===J&&(f(h.head),0===h.lookahead&&(h.strstart=0,h.block_start=0,h.insert=0))),g(a),0===a.avail_out))return h.last_flush=-1,M}return b!==K?M:h.wrap<=0?N:(2===h.wrap?(i(h,255&a.adler),i(h,a.adler>>8&255),i(h,a.adler>>16&255),i(h,a.adler>>24&255),i(h,255&a.total_in),i(h,a.total_in>>8&255),i(h,a.total_in>>16&255),i(h,a.total_in>>24&255)):(j(h,a.adler>>>16),j(h,65535&a.adler)),g(a),h.wrap>0&&(h.wrap=-h.wrap),0!==h.pending?M:N)}function A(a){var b;return a&&a.state?(b=a.state.status,b!==lb&&b!==mb&&b!==nb&&b!==ob&&b!==pb&&b!==qb&&b!==rb?d(a,O):(a.state=null,b===qb?d(a,P):M)):O}var B,C=a("../utils/common"),D=a("./trees"),E=a("./adler32"),F=a("./crc32"),G=a("./messages"),H=0,I=1,J=3,K=4,L=5,M=0,N=1,O=-2,P=-3,Q=-5,R=-1,S=1,T=2,U=3,V=4,W=0,X=2,Y=8,Z=9,$=15,_=8,ab=29,bb=256,cb=bb+1+ab,db=30,eb=19,fb=2*cb+1,gb=15,hb=3,ib=258,jb=ib+hb+1,kb=32,lb=42,mb=69,nb=73,ob=91,pb=103,qb=113,rb=666,sb=1,tb=2,ub=3,vb=4,wb=3,xb=function(a,b,c,d,e){this.good_length=a,this.max_lazy=b,this.nice_length=c,this.max_chain=d,this.func=e};B=[new xb(0,0,0,0,n),new xb(4,4,8,4,o),new xb(4,5,16,8,o),new xb(4,6,32,32,o),new xb(4,4,16,16,p),new xb(8,16,32,32,p),new xb(8,16,128,128,p),new xb(8,32,128,256,p),new xb(32,128,258,1024,p),new xb(32,258,258,4096,p)],c.deflateInit=y,c.deflateInit2=x,c.deflateReset=v,c.deflateResetKeep=u,c.deflateSetHeader=w,c.deflate=z,c.deflateEnd=A,c.deflateInfo="pako deflate (from Nodeca project)"},{"../utils/common":27,"./adler32":29,"./crc32":31,"./messages":37,"./trees":38}],33:[function(a,b){"use strict";function c(){this.text=0,this.time=0,this.xflags=0,this.os=0,this.extra=null,this.extra_len=0,this.name="",this.comment="",this.hcrc=0,this.done=!1}b.exports=c},{}],34:[function(a,b){"use strict";var c=30,d=12;b.exports=function(a,b){var e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C;e=a.state,f=a.next_in,B=a.input,g=f+(a.avail_in-5),h=a.next_out,C=a.output,i=h-(b-a.avail_out),j=h+(a.avail_out-257),k=e.dmax,l=e.wsize,m=e.whave,n=e.wnext,o=e.window,p=e.hold,q=e.bits,r=e.lencode,s=e.distcode,t=(1<<e.lenbits)-1,u=(1<<e.distbits)-1;a:do{15>q&&(p+=B[f++]<<q,q+=8,p+=B[f++]<<q,q+=8),v=r[p&t];b:for(;;){if(w=v>>>24,p>>>=w,q-=w,w=v>>>16&255,0===w)C[h++]=65535&v;else{if(!(16&w)){if(0===(64&w)){v=r[(65535&v)+(p&(1<<w)-1)];continue b}if(32&w){e.mode=d;break a}a.msg="invalid literal/length code",e.mode=c;break a}x=65535&v,w&=15,w&&(w>q&&(p+=B[f++]<<q,q+=8),x+=p&(1<<w)-1,p>>>=w,q-=w),15>q&&(p+=B[f++]<<q,q+=8,p+=B[f++]<<q,q+=8),v=s[p&u];c:for(;;){if(w=v>>>24,p>>>=w,q-=w,w=v>>>16&255,!(16&w)){if(0===(64&w)){v=s[(65535&v)+(p&(1<<w)-1)];continue c}a.msg="invalid distance code",e.mode=c;break a}if(y=65535&v,w&=15,w>q&&(p+=B[f++]<<q,q+=8,w>q&&(p+=B[f++]<<q,q+=8)),y+=p&(1<<w)-1,y>k){a.msg="invalid distance too far back",e.mode=c;break a}if(p>>>=w,q-=w,w=h-i,y>w){if(w=y-w,w>m&&e.sane){a.msg="invalid distance too far back",e.mode=c;break a}if(z=0,A=o,0===n){if(z+=l-w,x>w){x-=w;do C[h++]=o[z++];while(--w);z=h-y,A=C}}else if(w>n){if(z+=l+n-w,w-=n,x>w){x-=w;do C[h++]=o[z++];while(--w);if(z=0,x>n){w=n,x-=w;do C[h++]=o[z++];while(--w);z=h-y,A=C}}}else if(z+=n-w,x>w){x-=w;do C[h++]=o[z++];while(--w);z=h-y,A=C}for(;x>2;)C[h++]=A[z++],C[h++]=A[z++],C[h++]=A[z++],x-=3;x&&(C[h++]=A[z++],x>1&&(C[h++]=A[z++]))}else{z=h-y;do C[h++]=C[z++],C[h++]=C[z++],C[h++]=C[z++],x-=3;while(x>2);x&&(C[h++]=C[z++],x>1&&(C[h++]=C[z++]))}break}}break}}while(g>f&&j>h);x=q>>3,f-=x,q-=x<<3,p&=(1<<q)-1,a.next_in=f,a.next_out=h,a.avail_in=g>f?5+(g-f):5-(f-g),a.avail_out=j>h?257+(j-h):257-(h-j),e.hold=p,e.bits=q}},{}],35:[function(a,b,c){"use strict";function d(a){return(a>>>24&255)+(a>>>8&65280)+((65280&a)<<8)+((255&a)<<24)}function e(){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 r.Buf16(320),this.work=new r.Buf16(288),this.lendyn=null,this.distdyn=null,this.sane=0,this.back=0,this.was=0}function f(a){var b;return a&&a.state?(b=a.state,a.total_in=a.total_out=b.total=0,a.msg="",b.wrap&&(a.adler=1&b.wrap),b.mode=K,b.last=0,b.havedict=0,b.dmax=32768,b.head=null,b.hold=0,b.bits=0,b.lencode=b.lendyn=new r.Buf32(ob),b.distcode=b.distdyn=new r.Buf32(pb),b.sane=1,b.back=-1,C):F}function g(a){var b;return a&&a.state?(b=a.state,b.wsize=0,b.whave=0,b.wnext=0,f(a)):F}function h(a,b){var c,d;return a&&a.state?(d=a.state,0>b?(c=0,b=-b):(c=(b>>4)+1,48>b&&(b&=15)),b&&(8>b||b>15)?F:(null!==d.window&&d.wbits!==b&&(d.window=null),d.wrap=c,d.wbits=b,g(a))):F}function i(a,b){var c,d;return a?(d=new e,a.state=d,d.window=null,c=h(a,b),c!==C&&(a.state=null),c):F}function j(a){return i(a,rb)}function k(a){if(sb){var b;for(p=new r.Buf32(512),q=new r.Buf32(32),b=0;144>b;)a.lens[b++]=8;for(;256>b;)a.lens[b++]=9;for(;280>b;)a.lens[b++]=7;for(;288>b;)a.lens[b++]=8;for(v(x,a.lens,0,288,p,0,a.work,{bits:9}),b=0;32>b;)a.lens[b++]=5;v(y,a.lens,0,32,q,0,a.work,{bits:5}),sb=!1}a.lencode=p,a.lenbits=9,a.distcode=q,a.distbits=5}function l(a,b,c,d){var e,f=a.state;return null===f.window&&(f.wsize=1<<f.wbits,f.wnext=0,f.whave=0,f.window=new r.Buf8(f.wsize)),d>=f.wsize?(r.arraySet(f.window,b,c-f.wsize,f.wsize,0),f.wnext=0,f.whave=f.wsize):(e=f.wsize-f.wnext,e>d&&(e=d),r.arraySet(f.window,b,c-d,e,f.wnext),d-=e,d?(r.arraySet(f.window,b,c-d,d,0),f.wnext=d,f.whave=f.wsize):(f.wnext+=e,f.wnext===f.wsize&&(f.wnext=0),f.whave<f.wsize&&(f.whave+=e))),0}function m(a,b){var c,e,f,g,h,i,j,m,n,o,p,q,ob,pb,qb,rb,sb,tb,ub,vb,wb,xb,yb,zb,Ab=0,Bb=new r.Buf8(4),Cb=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15];if(!a||!a.state||!a.output||!a.input&&0!==a.avail_in)return F;c=a.state,c.mode===V&&(c.mode=W),h=a.next_out,f=a.output,j=a.avail_out,g=a.next_in,e=a.input,i=a.avail_in,m=c.hold,n=c.bits,o=i,p=j,xb=C;a:for(;;)switch(c.mode){case K:if(0===c.wrap){c.mode=W;break}for(;16>n;){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}if(2&c.wrap&&35615===m){c.check=0,Bb[0]=255&m,Bb[1]=m>>>8&255,c.check=t(c.check,Bb,2,0),m=0,n=0,c.mode=L;break}if(c.flags=0,c.head&&(c.head.done=!1),!(1&c.wrap)||(((255&m)<<8)+(m>>8))%31){a.msg="incorrect header check",c.mode=lb;break}if((15&m)!==J){a.msg="unknown compression method",c.mode=lb;break}if(m>>>=4,n-=4,wb=(15&m)+8,0===c.wbits)c.wbits=wb;else if(wb>c.wbits){a.msg="invalid window size",c.mode=lb;break}c.dmax=1<<wb,a.adler=c.check=1,c.mode=512&m?T:V,m=0,n=0;break;case L:for(;16>n;){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}if(c.flags=m,(255&c.flags)!==J){a.msg="unknown compression method",c.mode=lb;break}if(57344&c.flags){a.msg="unknown header flags set",c.mode=lb;break}c.head&&(c.head.text=m>>8&1),512&c.flags&&(Bb[0]=255&m,Bb[1]=m>>>8&255,c.check=t(c.check,Bb,2,0)),m=0,n=0,c.mode=M;case M:for(;32>n;){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}c.head&&(c.head.time=m),512&c.flags&&(Bb[0]=255&m,Bb[1]=m>>>8&255,Bb[2]=m>>>16&255,Bb[3]=m>>>24&255,c.check=t(c.check,Bb,4,0)),m=0,n=0,c.mode=N;case N:for(;16>n;){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}c.head&&(c.head.xflags=255&m,c.head.os=m>>8),512&c.flags&&(Bb[0]=255&m,Bb[1]=m>>>8&255,c.check=t(c.check,Bb,2,0)),m=0,n=0,c.mode=O;case O:if(1024&c.flags){for(;16>n;){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}c.length=m,c.head&&(c.head.extra_len=m),512&c.flags&&(Bb[0]=255&m,Bb[1]=m>>>8&255,c.check=t(c.check,Bb,2,0)),m=0,n=0}else c.head&&(c.head.extra=null);c.mode=P;case P:if(1024&c.flags&&(q=c.length,q>i&&(q=i),q&&(c.head&&(wb=c.head.extra_len-c.length,c.head.extra||(c.head.extra=new Array(c.head.extra_len)),r.arraySet(c.head.extra,e,g,q,wb)),512&c.flags&&(c.check=t(c.check,e,q,g)),i-=q,g+=q,c.length-=q),c.length))break a;c.length=0,c.mode=Q;case Q:if(2048&c.flags){if(0===i)break a;q=0;do wb=e[g+q++],c.head&&wb&&c.length<65536&&(c.head.name+=String.fromCharCode(wb));while(wb&&i>q);if(512&c.flags&&(c.check=t(c.check,e,q,g)),i-=q,g+=q,wb)break a}else c.head&&(c.head.name=null);c.length=0,c.mode=R;case R:if(4096&c.flags){if(0===i)break a;q=0;do wb=e[g+q++],c.head&&wb&&c.length<65536&&(c.head.comment+=String.fromCharCode(wb));while(wb&&i>q);if(512&c.flags&&(c.check=t(c.check,e,q,g)),i-=q,g+=q,wb)break a}else c.head&&(c.head.comment=null);c.mode=S;case S:if(512&c.flags){for(;16>n;){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}if(m!==(65535&c.check)){a.msg="header crc mismatch",c.mode=lb;break}m=0,n=0}c.head&&(c.head.hcrc=c.flags>>9&1,c.head.done=!0),a.adler=c.check=0,c.mode=V;break;case T:for(;32>n;){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}a.adler=c.check=d(m),m=0,n=0,c.mode=U;case U:if(0===c.havedict)return a.next_out=h,a.avail_out=j,a.next_in=g,a.avail_in=i,c.hold=m,c.bits=n,E;a.adler=c.check=1,c.mode=V;case V:if(b===A||b===B)break a;case W:if(c.last){m>>>=7&n,n-=7&n,c.mode=ib;break}for(;3>n;){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}switch(c.last=1&m,m>>>=1,n-=1,3&m){case 0:c.mode=X;break;case 1:if(k(c),c.mode=bb,b===B){m>>>=2,n-=2;break a}break;case 2:c.mode=$;break;case 3:a.msg="invalid block type",c.mode=lb}m>>>=2,n-=2;break;case X:for(m>>>=7&n,n-=7&n;32>n;){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}if((65535&m)!==(m>>>16^65535)){a.msg="invalid stored block lengths",c.mode=lb;break}if(c.length=65535&m,m=0,n=0,c.mode=Y,b===B)break a;case Y:c.mode=Z;case Z:if(q=c.length){if(q>i&&(q=i),q>j&&(q=j),0===q)break a;r.arraySet(f,e,g,q,h),i-=q,g+=q,j-=q,h+=q,c.length-=q;break}c.mode=V;break;case $:for(;14>n;){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}if(c.nlen=(31&m)+257,m>>>=5,n-=5,c.ndist=(31&m)+1,m>>>=5,n-=5,c.ncode=(15&m)+4,m>>>=4,n-=4,c.nlen>286||c.ndist>30){a.msg="too many length or distance symbols",c.mode=lb;break}c.have=0,c.mode=_;case _:for(;c.have<c.ncode;){for(;3>n;){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}c.lens[Cb[c.have++]]=7&m,m>>>=3,n-=3}for(;c.have<19;)c.lens[Cb[c.have++]]=0;if(c.lencode=c.lendyn,c.lenbits=7,yb={bits:c.lenbits},xb=v(w,c.lens,0,19,c.lencode,0,c.work,yb),c.lenbits=yb.bits,xb){a.msg="invalid code lengths set",c.mode=lb;break}c.have=0,c.mode=ab;case ab:for(;c.have<c.nlen+c.ndist;){for(;Ab=c.lencode[m&(1<<c.lenbits)-1],qb=Ab>>>24,rb=Ab>>>16&255,sb=65535&Ab,!(n>=qb);){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}if(16>sb)m>>>=qb,n-=qb,c.lens[c.have++]=sb;else{if(16===sb){for(zb=qb+2;zb>n;){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}if(m>>>=qb,n-=qb,0===c.have){a.msg="invalid bit length repeat",c.mode=lb;break}wb=c.lens[c.have-1],q=3+(3&m),m>>>=2,n-=2}else if(17===sb){for(zb=qb+3;zb>n;){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}m>>>=qb,n-=qb,wb=0,q=3+(7&m),m>>>=3,n-=3}else{for(zb=qb+7;zb>n;){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}m>>>=qb,n-=qb,wb=0,q=11+(127&m),m>>>=7,n-=7}if(c.have+q>c.nlen+c.ndist){a.msg="invalid bit length repeat",c.mode=lb;break}for(;q--;)c.lens[c.have++]=wb}}if(c.mode===lb)break;if(0===c.lens[256]){a.msg="invalid code -- missing end-of-block",c.mode=lb;break}if(c.lenbits=9,yb={bits:c.lenbits},xb=v(x,c.lens,0,c.nlen,c.lencode,0,c.work,yb),c.lenbits=yb.bits,xb){a.msg="invalid literal/lengths set",c.mode=lb;break}if(c.distbits=6,c.distcode=c.distdyn,yb={bits:c.distbits},xb=v(y,c.lens,c.nlen,c.ndist,c.distcode,0,c.work,yb),c.distbits=yb.bits,xb){a.msg="invalid distances set",c.mode=lb;break}if(c.mode=bb,b===B)break a;case bb:c.mode=cb;case cb:if(i>=6&&j>=258){a.next_out=h,a.avail_out=j,a.next_in=g,a.avail_in=i,c.hold=m,c.bits=n,u(a,p),h=a.next_out,f=a.output,j=a.avail_out,g=a.next_in,e=a.input,i=a.avail_in,m=c.hold,n=c.bits,c.mode===V&&(c.back=-1);break}for(c.back=0;Ab=c.lencode[m&(1<<c.lenbits)-1],qb=Ab>>>24,rb=Ab>>>16&255,sb=65535&Ab,!(n>=qb);){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}if(rb&&0===(240&rb)){for(tb=qb,ub=rb,vb=sb;Ab=c.lencode[vb+((m&(1<<tb+ub)-1)>>tb)],qb=Ab>>>24,rb=Ab>>>16&255,sb=65535&Ab,!(n>=tb+qb);){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}m>>>=tb,n-=tb,c.back+=tb}if(m>>>=qb,n-=qb,c.back+=qb,c.length=sb,0===rb){c.mode=hb;break}if(32&rb){c.back=-1,c.mode=V;break}if(64&rb){a.msg="invalid literal/length code",c.mode=lb;break}c.extra=15&rb,c.mode=db;case db:if(c.extra){for(zb=c.extra;zb>n;){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}c.length+=m&(1<<c.extra)-1,m>>>=c.extra,n-=c.extra,c.back+=c.extra}c.was=c.length,c.mode=eb;case eb:for(;Ab=c.distcode[m&(1<<c.distbits)-1],qb=Ab>>>24,rb=Ab>>>16&255,sb=65535&Ab,!(n>=qb);){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}if(0===(240&rb)){for(tb=qb,ub=rb,vb=sb;Ab=c.distcode[vb+((m&(1<<tb+ub)-1)>>tb)],qb=Ab>>>24,rb=Ab>>>16&255,sb=65535&Ab,!(n>=tb+qb);){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}m>>>=tb,n-=tb,c.back+=tb}if(m>>>=qb,n-=qb,c.back+=qb,64&rb){a.msg="invalid distance code",c.mode=lb;break}c.offset=sb,c.extra=15&rb,c.mode=fb;case fb:if(c.extra){for(zb=c.extra;zb>n;){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}c.offset+=m&(1<<c.extra)-1,m>>>=c.extra,n-=c.extra,c.back+=c.extra}if(c.offset>c.dmax){a.msg="invalid distance too far back",c.mode=lb;break}c.mode=gb;case gb:if(0===j)break a; |
18319 zip.remove("tempfile"); | 18319 if(q=p-j,c.offset>q){if(q=c.offset-q,q>c.whave&&c.sane){a.msg="invalid distance too far back",c.mode=lb;break}q>c.wnext?(q-=c.wnext,ob=c.wsize-q):ob=c.wnext-q,q>c.length&&(q=c.length),pb=c.window}else pb=f,ob=h-c.offset,q=c.length;q>j&&(q=j),j-=q,c.length-=q;do f[h++]=pb[ob++];while(--q);0===c.length&&(c.mode=cb);break;case hb:if(0===j)break a;f[h++]=c.length,j--,c.mode=cb;break;case ib:if(c.wrap){for(;32>n;){if(0===i)break a;i--,m|=e[g++]<<n,n+=8}if(p-=j,a.total_out+=p,c.total+=p,p&&(a.adler=c.check=c.flags?t(c.check,f,p,h-p):s(c.check,f,p,h-p)),p=j,(c.flags?m:d(m))!==c.check){a.msg="incorrect data check",c.mode=lb;break}m=0,n=0}c.mode=jb;case jb:if(c.wrap&&c.flags){for(;32>n;){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}if(m!==(4294967295&c.total)){a.msg="incorrect length check",c.mode=lb;break}m=0,n=0}c.mode=kb;case kb:xb=D;break a;case lb:xb=G;break a;case mb:return H;case nb:default:return F}return a.next_out=h,a.avail_out=j,a.next_in=g,a.avail_in=i,c.hold=m,c.bits=n,(c.wsize||p!==a.avail_out&&c.mode<lb&&(c.mode<ib||b!==z))&&l(a,a.output,a.next_out,p-a.avail_out)?(c.mode=mb,H):(o-=a.avail_in,p-=a.avail_out,a.total_in+=o,a.total_out+=p,c.total+=p,c.wrap&&p&&(a.adler=c.check=c.flags?t(c.check,f,p,a.next_out-p):s(c.check,f,p,a.next_out-p)),a.data_type=c.bits+(c.last?64:0)+(c.mode===V?128:0)+(c.mode===bb||c.mode===Y?256:0),(0===o&&0===p||b===z)&&xb===C&&(xb=I),xb)}function n(a){if(!a||!a.state)return F;var b=a.state;return b.window&&(b.window=null),a.state=null,C}function o(a,b){var c;return a&&a.state?(c=a.state,0===(2&c.wrap)?F:(c.head=b,b.done=!1,C)):F}var p,q,r=a("../utils/common"),s=a("./adler32"),t=a("./crc32"),u=a("./inffast"),v=a("./inftrees"),w=0,x=1,y=2,z=4,A=5,B=6,C=0,D=1,E=2,F=-2,G=-3,H=-4,I=-5,J=8,K=1,L=2,M=3,N=4,O=5,P=6,Q=7,R=8,S=9,T=10,U=11,V=12,W=13,X=14,Y=15,Z=16,$=17,_=18,ab=19,bb=20,cb=21,db=22,eb=23,fb=24,gb=25,hb=26,ib=27,jb=28,kb=29,lb=30,mb=31,nb=32,ob=852,pb=592,qb=15,rb=qb,sb=!0;c.inflateReset=g,c.inflateReset2=h,c.inflateResetKeep=f,c.inflateInit=j,c.inflateInit2=i,c.inflate=m,c.inflateEnd=n,c.inflateGetHeader=o,c.inflateInfo="pako inflate (from Nodeca project)"},{"../utils/common":27,"./adler32":29,"./crc32":31,"./inffast":34,"./inftrees":36}],36:[function(a,b){"use strict";var c=a("../utils/common"),d=15,e=852,f=592,g=0,h=1,i=2,j=[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],k=[16,16,16,16,16,16,16,16,17,17,17,17,18,18,18,18,19,19,19,19,20,20,20,20,21,21,21,21,16,72,78],l=[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,0,0],m=[16,16,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23,24,24,25,25,26,26,27,27,28,28,29,29,64,64];b.exports=function(a,b,n,o,p,q,r,s){var t,u,v,w,x,y,z,A,B,C=s.bits,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=null,O=0,P=new c.Buf16(d+1),Q=new c.Buf16(d+1),R=null,S=0;for(D=0;d>=D;D++)P[D]=0;for(E=0;o>E;E++)P[b[n+E]]++;for(H=C,G=d;G>=1&&0===P[G];G--);if(H>G&&(H=G),0===G)return p[q++]=20971520,p[q++]=20971520,s.bits=1,0;for(F=1;G>F&&0===P[F];F++);for(F>H&&(H=F),K=1,D=1;d>=D;D++)if(K<<=1,K-=P[D],0>K)return-1;if(K>0&&(a===g||1!==G))return-1;for(Q[1]=0,D=1;d>D;D++)Q[D+1]=Q[D]+P[D];for(E=0;o>E;E++)0!==b[n+E]&&(r[Q[b[n+E]]++]=E);if(a===g?(N=R=r,y=19):a===h?(N=j,O-=257,R=k,S-=257,y=256):(N=l,R=m,y=-1),M=0,E=0,D=F,x=q,I=H,J=0,v=-1,L=1<<H,w=L-1,a===h&&L>e||a===i&&L>f)return 1;for(var T=0;;){T++,z=D-J,r[E]<y?(A=0,B=r[E]):r[E]>y?(A=R[S+r[E]],B=N[O+r[E]]):(A=96,B=0),t=1<<D-J,u=1<<I,F=u;do u-=t,p[x+(M>>J)+u]=z<<24|A<<16|B|0;while(0!==u);for(t=1<<D-1;M&t;)t>>=1;if(0!==t?(M&=t-1,M+=t):M=0,E++,0===--P[D]){if(D===G)break;D=b[n+r[E]]}if(D>H&&(M&w)!==v){for(0===J&&(J=H),x+=F,I=D-J,K=1<<I;G>I+J&&(K-=P[I+J],!(0>=K));)I++,K<<=1;if(L+=1<<I,a===h&&L>e||a===i&&L>f)return 1;v=M&w,p[v]=H<<24|I<<16|x-q|0}}return 0!==M&&(p[x+M]=D-J<<24|64<<16|0),s.bits=H,0}},{"../utils/common":27}],37:[function(a,b){"use strict";b.exports={2:"need dictionary",1:"stream end",0:"","-1":"file error","-2":"stream error","-3":"data error","-4":"insufficient memory","-5":"buffer error","-6":"incompatible version"}},{}],38:[function(a,b,c){"use strict";function d(a){for(var b=a.length;--b>=0;)a[b]=0}function e(a){return 256>a?gb[a]:gb[256+(a>>>7)]}function f(a,b){a.pending_buf[a.pending++]=255&b,a.pending_buf[a.pending++]=b>>>8&255}function g(a,b,c){a.bi_valid>V-c?(a.bi_buf|=b<<a.bi_valid&65535,f(a,a.bi_buf),a.bi_buf=b>>V-a.bi_valid,a.bi_valid+=c-V):(a.bi_buf|=b<<a.bi_valid&65535,a.bi_valid+=c)}function h(a,b,c){g(a,c[2*b],c[2*b+1])}function i(a,b){var c=0;do c|=1&a,a>>>=1,c<<=1;while(--b>0);return c>>>1}function j(a){16===a.bi_valid?(f(a,a.bi_buf),a.bi_buf=0,a.bi_valid=0):a.bi_valid>=8&&(a.pending_buf[a.pending++]=255&a.bi_buf,a.bi_buf>>=8,a.bi_valid-=8)}function k(a,b){var c,d,e,f,g,h,i=b.dyn_tree,j=b.max_code,k=b.stat_desc.static_tree,l=b.stat_desc.has_stree,m=b.stat_desc.extra_bits,n=b.stat_desc.extra_base,o=b.stat_desc.max_length,p=0;for(f=0;U>=f;f++)a.bl_count[f]=0;for(i[2*a.heap[a.heap_max]+1]=0,c=a.heap_max+1;T>c;c++)d=a.heap[c],f=i[2*i[2*d+1]+1]+1,f>o&&(f=o,p++),i[2*d+1]=f,d>j||(a.bl_count[f]++,g=0,d>=n&&(g=m[d-n]),h=i[2*d],a.opt_len+=h*(f+g),l&&(a.static_len+=h*(k[2*d+1]+g)));if(0!==p){do{for(f=o-1;0===a.bl_count[f];)f--;a.bl_count[f]--,a.bl_count[f+1]+=2,a.bl_count[o]--,p-=2}while(p>0);for(f=o;0!==f;f--)for(d=a.bl_count[f];0!==d;)e=a.heap[--c],e>j||(i[2*e+1]!==f&&(a.opt_len+=(f-i[2*e+1])*i[2*e],i[2*e+1]=f),d--)}}function l(a,b,c){var d,e,f=new Array(U+1),g=0;for(d=1;U>=d;d++)f[d]=g=g+c[d-1]<<1;for(e=0;b>=e;e++){var h=a[2*e+1];0!==h&&(a[2*e]=i(f[h]++,h))}}function m(){var a,b,c,d,e,f=new Array(U+1);for(c=0,d=0;O-1>d;d++)for(ib[d]=c,a=0;a<1<<_[d];a++)hb[c++]=d;for(hb[c-1]=d,e=0,d=0;16>d;d++)for(jb[d]=e,a=0;a<1<<ab[d];a++)gb[e++]=d;for(e>>=7;R>d;d++)for(jb[d]=e<<7,a=0;a<1<<ab[d]-7;a++)gb[256+e++]=d;for(b=0;U>=b;b++)f[b]=0;for(a=0;143>=a;)eb[2*a+1]=8,a++,f[8]++;for(;255>=a;)eb[2*a+1]=9,a++,f[9]++;for(;279>=a;)eb[2*a+1]=7,a++,f[7]++;for(;287>=a;)eb[2*a+1]=8,a++,f[8]++;for(l(eb,Q+1,f),a=0;R>a;a++)fb[2*a+1]=5,fb[2*a]=i(a,5);kb=new nb(eb,_,P+1,Q,U),lb=new nb(fb,ab,0,R,U),mb=new nb(new Array(0),bb,0,S,W)}function n(a){var b;for(b=0;Q>b;b++)a.dyn_ltree[2*b]=0;for(b=0;R>b;b++)a.dyn_dtree[2*b]=0;for(b=0;S>b;b++)a.bl_tree[2*b]=0;a.dyn_ltree[2*X]=1,a.opt_len=a.static_len=0,a.last_lit=a.matches=0}function o(a){a.bi_valid>8?f(a,a.bi_buf):a.bi_valid>0&&(a.pending_buf[a.pending++]=a.bi_buf),a.bi_buf=0,a.bi_valid=0}function p(a,b,c,d){o(a),d&&(f(a,c),f(a,~c)),E.arraySet(a.pending_buf,a.window,b,c,a.pending),a.pending+=c}function q(a,b,c,d){var e=2*b,f=2*c;return a[e]<a[f]||a[e]===a[f]&&d[b]<=d[c]}function r(a,b,c){for(var d=a.heap[c],e=c<<1;e<=a.heap_len&&(e<a.heap_len&&q(b,a.heap[e+1],a.heap[e],a.depth)&&e++,!q(b,d,a.heap[e],a.depth));)a.heap[c]=a.heap[e],c=e,e<<=1;a.heap[c]=d}function s(a,b,c){var d,f,i,j,k=0;if(0!==a.last_lit)do d=a.pending_buf[a.d_buf+2*k]<<8|a.pending_buf[a.d_buf+2*k+1],f=a.pending_buf[a.l_buf+k],k++,0===d?h(a,f,b):(i=hb[f],h(a,i+P+1,b),j=_[i],0!==j&&(f-=ib[i],g(a,f,j)),d--,i=e(d),h(a,i,c),j=ab[i],0!==j&&(d-=jb[i],g(a,d,j)));while(k<a.last_lit);h(a,X,b)}function t(a,b){var c,d,e,f=b.dyn_tree,g=b.stat_desc.static_tree,h=b.stat_desc.has_stree,i=b.stat_desc.elems,j=-1;for(a.heap_len=0,a.heap_max=T,c=0;i>c;c++)0!==f[2*c]?(a.heap[++a.heap_len]=j=c,a.depth[c]=0):f[2*c+1]=0;for(;a.heap_len<2;)e=a.heap[++a.heap_len]=2>j?++j:0,f[2*e]=1,a.depth[e]=0,a.opt_len--,h&&(a.static_len-=g[2*e+1]);for(b.max_code=j,c=a.heap_len>>1;c>=1;c--)r(a,f,c);e=i;do c=a.heap[1],a.heap[1]=a.heap[a.heap_len--],r(a,f,1),d=a.heap[1],a.heap[--a.heap_max]=c,a.heap[--a.heap_max]=d,f[2*e]=f[2*c]+f[2*d],a.depth[e]=(a.depth[c]>=a.depth[d]?a.depth[c]:a.depth[d])+1,f[2*c+1]=f[2*d+1]=e,a.heap[1]=e++,r(a,f,1);while(a.heap_len>=2);a.heap[--a.heap_max]=a.heap[1],k(a,b),l(f,j,a.bl_count)}function u(a,b,c){var d,e,f=-1,g=b[1],h=0,i=7,j=4;for(0===g&&(i=138,j=3),b[2*(c+1)+1]=65535,d=0;c>=d;d++)e=g,g=b[2*(d+1)+1],++h<i&&e===g||(j>h?a.bl_tree[2*e]+=h:0!==e?(e!==f&&a.bl_tree[2*e]++,a.bl_tree[2*Y]++):10>=h?a.bl_tree[2*Z]++:a.bl_tree[2*$]++,h=0,f=e,0===g?(i=138,j=3):e===g?(i=6,j=3):(i=7,j=4))}function v(a,b,c){var d,e,f=-1,i=b[1],j=0,k=7,l=4;for(0===i&&(k=138,l=3),d=0;c>=d;d++)if(e=i,i=b[2*(d+1)+1],!(++j<k&&e===i)){if(l>j){do h(a,e,a.bl_tree);while(0!==--j)}else 0!==e?(e!==f&&(h(a,e,a.bl_tree),j--),h(a,Y,a.bl_tree),g(a,j-3,2)):10>=j?(h(a,Z,a.bl_tree),g(a,j-3,3)):(h(a,$,a.bl_tree),g(a,j-11,7));j=0,f=e,0===i?(k=138,l=3):e===i?(k=6,l=3):(k=7,l=4)}}function w(a){var b;for(u(a,a.dyn_ltree,a.l_desc.max_code),u(a,a.dyn_dtree,a.d_desc.max_code),t(a,a.bl_desc),b=S-1;b>=3&&0===a.bl_tree[2*cb[b]+1];b--);return a.opt_len+=3*(b+1)+5+5+4,b}function x(a,b,c,d){var e;for(g(a,b-257,5),g(a,c-1,5),g(a,d-4,4),e=0;d>e;e++)g(a,a.bl_tree[2*cb[e]+1],3);v(a,a.dyn_ltree,b-1),v(a,a.dyn_dtree,c-1)}function y(a){var b,c=4093624447;for(b=0;31>=b;b++,c>>>=1)if(1&c&&0!==a.dyn_ltree[2*b])return G;if(0!==a.dyn_ltree[18]||0!==a.dyn_ltree[20]||0!==a.dyn_ltree[26])return H;for(b=32;P>b;b++)if(0!==a.dyn_ltree[2*b])return H;return G}function z(a){pb||(m(),pb=!0),a.l_desc=new ob(a.dyn_ltree,kb),a.d_desc=new ob(a.dyn_dtree,lb),a.bl_desc=new ob(a.bl_tree,mb),a.bi_buf=0,a.bi_valid=0,n(a)}function A(a,b,c,d){g(a,(J<<1)+(d?1:0),3),p(a,b,c,!0)}function B(a){g(a,K<<1,3),h(a,X,eb),j(a)}function C(a,b,c,d){var e,f,h=0;a.level>0?(a.strm.data_type===I&&(a.strm.data_type=y(a)),t(a,a.l_desc),t(a,a.d_desc),h=w(a),e=a.opt_len+3+7>>>3,f=a.static_len+3+7>>>3,e>=f&&(e=f)):e=f=c+5,e>=c+4&&-1!==b?A(a,b,c,d):a.strategy===F||f===e?(g(a,(K<<1)+(d?1:0),3),s(a,eb,fb)):(g(a,(L<<1)+(d?1:0),3),x(a,a.l_desc.max_code+1,a.d_desc.max_code+1,h+1),s(a,a.dyn_ltree,a.dyn_dtree)),n(a),d&&o(a)}function D(a,b,c){return a.pending_buf[a.d_buf+2*a.last_lit]=b>>>8&255,a.pending_buf[a.d_buf+2*a.last_lit+1]=255&b,a.pending_buf[a.l_buf+a.last_lit]=255&c,a.last_lit++,0===b?a.dyn_ltree[2*c]++:(a.matches++,b--,a.dyn_ltree[2*(hb[c]+P+1)]++,a.dyn_dtree[2*e(b)]++),a.last_lit===a.lit_bufsize-1}var E=a("../utils/common"),F=4,G=0,H=1,I=2,J=0,K=1,L=2,M=3,N=258,O=29,P=256,Q=P+1+O,R=30,S=19,T=2*Q+1,U=15,V=16,W=7,X=256,Y=16,Z=17,$=18,_=[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],ab=[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],bb=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7],cb=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],db=512,eb=new Array(2*(Q+2));d(eb);var fb=new Array(2*R);d(fb);var gb=new Array(db);d(gb);var hb=new Array(N-M+1);d(hb);var ib=new Array(O);d(ib);var jb=new Array(R);d(jb);var kb,lb,mb,nb=function(a,b,c,d,e){this.static_tree=a,this.extra_bits=b,this.extra_base=c,this.elems=d,this.max_length=e,this.has_stree=a&&a.length},ob=function(a,b){this.dyn_tree=a,this.max_code=0,this.stat_desc=b},pb=!1;c._tr_init=z,c._tr_stored_block=A,c._tr_flush_block=C,c._tr_tally=D,c._tr_align=B},{"../utils/common":27}],39:[function(a,b){"use strict";function c(){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}b.exports=c},{}]},{},[9])(9)}); |
18320 | 18320 // From https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys |
18321 base64zip = zip.generate(); | 18321 if (!Object.keys) { |
18322 | 18322 Object.keys = (function () { |
18323 **/ | 18323 var hasOwnProperty = Object.prototype.hasOwnProperty, |
18324 | 18324 hasDontEnumBug = !({toString: null}).propertyIsEnumerable('toString'), |
18325 /** | 18325 dontEnums = [ |
18326 * Representation a of zip file in js | 18326 'toString', |
18327 * @constructor | 18327 'toLocaleString', |
18328 * @param {String=|ArrayBuffer=|Uint8Array=} data the data to load, if any (optional). | 18328 'valueOf', |
18329 * @param {Object=} options the options for creating this objects (optional). | 18329 'hasOwnProperty', |
18330 */ | 18330 'isPrototypeOf', |
18331 var JSZip = function(data, options) { | 18331 'propertyIsEnumerable', |
18332 // object containing the files : | 18332 'constructor' |
18333 // { | 18333 ], |
18334 // "folder/" : {...}, | 18334 dontEnumsLength = dontEnums.length; |
18335 // "folder/data.txt" : {...} | 18335 |
18336 // } | 18336 return function (obj) { |
18337 this.files = {}; | 18337 if (typeof obj !== 'object' && typeof obj !== 'function' || obj === null) throw new TypeError('Object.keys called on non-object'); |
18338 | 18338 |
18339 // Where we are in the hierarchy | 18339 var result = []; |
18340 this.root = ""; | 18340 |
18341 | 18341 for (var prop in obj) { |
18342 if (data) { | 18342 if (hasOwnProperty.call(obj, prop)) result.push(prop); |
18343 this.load(data, options); | |
18344 } | |
18345 }; | |
18346 | |
18347 JSZip.signature = { | |
18348 LOCAL_FILE_HEADER : "\x50\x4b\x03\x04", | |
18349 CENTRAL_FILE_HEADER : "\x50\x4b\x01\x02", | |
18350 CENTRAL_DIRECTORY_END : "\x50\x4b\x05\x06", | |
18351 ZIP64_CENTRAL_DIRECTORY_LOCATOR : "\x50\x4b\x06\x07", | |
18352 ZIP64_CENTRAL_DIRECTORY_END : "\x50\x4b\x06\x06", | |
18353 DATA_DESCRIPTOR : "\x50\x4b\x07\x08" | |
18354 }; | |
18355 | |
18356 // Default properties for a new file | |
18357 JSZip.defaults = { | |
18358 base64: false, | |
18359 binary: false, | |
18360 dir: false, | |
18361 date: null | |
18362 }; | |
18363 | |
18364 | |
18365 JSZip.prototype = (function () { | |
18366 /** | |
18367 * A simple object representing a file in the zip file. | |
18368 * @constructor | |
18369 * @param {string} name the name of the file | |
18370 * @param {string} data the data | |
18371 * @param {Object} options the options of the file | |
18372 */ | |
18373 var ZipObject = function (name, data, options) { | |
18374 this.name = name; | |
18375 this.data = data; | |
18376 this.options = options; | |
18377 }; | |
18378 | |
18379 ZipObject.prototype = { | |
18380 /** | |
18381 * Return the content as UTF8 string. | |
18382 * @return {string} the UTF8 string. | |
18383 */ | |
18384 asText : function () { | |
18385 var result = this.data; | |
18386 if (result === null || typeof result === "undefined") { | |
18387 return ""; | |
18388 } | |
18389 if (this.options.base64) { | |
18390 result = JSZipBase64.decode(result); | |
18391 } | |
18392 if (this.options.binary) { | |
18393 result = JSZip.prototype.utf8decode(result); | |
18394 } | |
18395 return result; | |
18396 }, | |
18397 /** | |
18398 * Returns the binary content. | |
18399 * @return {string} the content as binary. | |
18400 */ | |
18401 asBinary : function () { | |
18402 var result = this.data; | |
18403 if (result === null || typeof result === "undefined") { | |
18404 return ""; | |
18405 } | |
18406 if (this.options.base64) { | |
18407 result = JSZipBase64.decode(result); | |
18408 } | |
18409 if (!this.options.binary) { | |
18410 result = JSZip.prototype.utf8encode(result); | |
18411 } | |
18412 return result; | |
18413 }, | |
18414 /** | |
18415 * Returns the content as an Uint8Array. | |
18416 * @return {Uint8Array} the content as an Uint8Array. | |
18417 */ | |
18418 asUint8Array : function () { | |
18419 return JSZip.utils.string2Uint8Array(this.asBinary()); | |
18420 }, | |
18421 /** | |
18422 * Returns the content as an ArrayBuffer. | |
18423 * @return {ArrayBuffer} the content as an ArrayBufer. | |
18424 */ | |
18425 asArrayBuffer : function () { | |
18426 return JSZip.utils.string2Uint8Array(this.asBinary()).buffer; | |
18427 } | 18343 } |
18428 }; | 18344 |
18429 | 18345 if (hasDontEnumBug) { |
18430 /** | 18346 for (var i=0; i < dontEnumsLength; i++) { |
18431 * Transform an integer into a string in hexadecimal. | 18347 if (hasOwnProperty.call(obj, dontEnums[i])) result.push(dontEnums[i]); |
18432 * @private | 18348 } |
18433 * @param {number} dec the number to convert. | |
18434 * @param {number} bytes the number of bytes to generate. | |
18435 * @returns {string} the result. | |
18436 */ | |
18437 var decToHex = function(dec, bytes) { | |
18438 var hex = "", i; | |
18439 for(i = 0; i < bytes; i++) { | |
18440 hex += String.fromCharCode(dec&0xff); | |
18441 dec=dec>>>8; | |
18442 } | |
18443 return hex; | |
18444 }; | |
18445 | |
18446 /** | |
18447 * Merge the objects passed as parameters into a new one. | |
18448 * @private | |
18449 * @param {...Object} var_args All objects to merge. | |
18450 * @return {Object} a new object with the data of the others. | |
18451 */ | |
18452 var extend = function () { | |
18453 var result = {}, i, attr; | |
18454 for (i = 0; i < arguments.length; i++) { // arguments is not enumerable in some browsers | |
18455 for (attr in arguments[i]) { | |
18456 if (arguments[i].hasOwnProperty(attr) && typeof result[attr] === "undefined") { | |
18457 result[attr] = arguments[i][attr]; | |
18458 } | |
18459 } | |
18460 } | 18349 } |
18461 return result; | 18350 return result; |
18462 }; | 18351 }; |
18463 | 18352 })(); |
18464 /** | 18353 } |
18465 * Transforms the (incomplete) options from the user into the complete | 18354 |
18466 * set of options to create a file. | 18355 // From https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter |
18467 * @private | 18356 if (!Array.prototype.filter) |
18468 * @param {Object} o the options from the user. | 18357 { |
18469 * @return {Object} the complete set of options. | 18358 Array.prototype.filter = function(fun /*, thisp */) |
18470 */ | 18359 { |
18471 var prepareFileAttrs = function (o) { | 18360 "use strict"; |
18472 o = o || {}; | 18361 |
18473 if (o.base64 === true && o.binary == null) { | 18362 if (this == null) |
18474 o.binary = true; | 18363 throw new TypeError(); |
18364 | |
18365 var t = Object(this); | |
18366 var len = t.length >>> 0; | |
18367 if (typeof fun != "function") | |
18368 throw new TypeError(); | |
18369 | |
18370 var res = []; | |
18371 var thisp = arguments[1]; | |
18372 for (var i = 0; i < len; i++) | |
18373 { | |
18374 if (i in t) | |
18375 { | |
18376 var val = t[i]; // in case fun mutates this | |
18377 if (fun.call(thisp, val, i, t)) | |
18378 res.push(val); | |
18475 } | 18379 } |
18476 o = extend(o, JSZip.defaults); | 18380 } |
18477 o.date = o.date || new Date(); | 18381 |
18478 | 18382 return res; |
18479 return o; | 18383 }; |
18480 }; | 18384 } |
18481 | 18385 |
18482 /** | 18386 // From https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/Trim |
18483 * Add a file in the current folder. | 18387 if (!String.prototype.trim) { |
18484 * @private | 18388 String.prototype.trim = function () { |
18485 * @param {string} name the name of the file | 18389 return this.replace(/^\s+|\s+$/g, ''); |
18486 * @param {String|ArrayBuffer|Uint8Array} data the data of the file | 18390 }; |
18487 * @param {Object} o the options of the file | 18391 } |
18488 * @return {Object} the new file. | 18392 |
18489 */ | 18393 // From https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach |
18490 var fileAdd = function (name, data, o) { | 18394 if (!Array.prototype.forEach) |
18491 // be sure sub folders exist | 18395 { |
18492 var parent = parentFolder(name); | 18396 Array.prototype.forEach = function(fun /*, thisArg */) |
18493 if (parent) { | 18397 { |
18494 folderAdd.call(this, parent); | 18398 "use strict"; |
18399 | |
18400 if (this === void 0 || this === null) | |
18401 throw new TypeError(); | |
18402 | |
18403 var t = Object(this); | |
18404 var len = t.length >>> 0; | |
18405 if (typeof fun !== "function") | |
18406 throw new TypeError(); | |
18407 | |
18408 var thisArg = arguments.length >= 2 ? arguments[1] : void 0; | |
18409 for (var i = 0; i < len; i++) | |
18410 { | |
18411 if (i in t) | |
18412 fun.call(thisArg, t[i], i, t); | |
18413 } | |
18414 }; | |
18415 } | |
18416 | |
18417 // Production steps of ECMA-262, Edition 5, 15.4.4.19 | |
18418 // Reference: http://es5.github.com/#x15.4.4.19 | |
18419 if (!Array.prototype.map) { | |
18420 Array.prototype.map = function(callback, thisArg) { | |
18421 | |
18422 var T, A, k; | |
18423 | |
18424 if (this == null) { | |
18425 throw new TypeError(" this is null or not defined"); | |
18426 } | |
18427 | |
18428 // 1. Let O be the result of calling ToObject passing the |this| value as the argument. | |
18429 var O = Object(this); | |
18430 | |
18431 // 2. Let lenValue be the result of calling the Get internal method of O with the argument "length". | |
18432 // 3. Let len be ToUint32(lenValue). | |
18433 var len = O.length >>> 0; | |
18434 | |
18435 // 4. If IsCallable(callback) is false, throw a TypeError exception. | |
18436 // See: http://es5.github.com/#x9.11 | |
18437 if (typeof callback !== "function") { | |
18438 throw new TypeError(callback + " is not a function"); | |
18439 } | |
18440 | |
18441 // 5. If thisArg was supplied, let T be thisArg; else let T be undefined. | |
18442 if (thisArg) { | |
18443 T = thisArg; | |
18444 } | |
18445 | |
18446 // 6. Let A be a new array created as if by the expression new Array(len) where Array is | |
18447 // the standard built-in constructor with that name and len is the value of len. | |
18448 A = new Array(len); | |
18449 | |
18450 // 7. Let k be 0 | |
18451 k = 0; | |
18452 | |
18453 // 8. Repeat, while k < len | |
18454 while(k < len) { | |
18455 | |
18456 var kValue, mappedValue; | |
18457 | |
18458 // a. Let Pk be ToString(k). | |
18459 // This is implicit for LHS operands of the in operator | |
18460 // b. Let kPresent be the result of calling the HasProperty internal method of O with argument Pk. | |
18461 // This step can be combined with c | |
18462 // c. If kPresent is true, then | |
18463 if (k in O) { | |
18464 | |
18465 // i. Let kValue be the result of calling the Get internal method of O with argument Pk. | |
18466 kValue = O[ k ]; | |
18467 | |
18468 // ii. Let mappedValue be the result of calling the Call internal method of callback | |
18469 // with T as the this value and argument list containing kValue, k, and O. | |
18470 mappedValue = callback.call(T, kValue, k, O); | |
18471 | |
18472 // iii. Call the DefineOwnProperty internal method of A with arguments | |
18473 // Pk, Property Descriptor {Value: mappedValue, : true, Enumerable: true, Configurable: true}, | |
18474 // and false. | |
18475 | |
18476 // In browsers that support Object.defineProperty, use the following: | |
18477 // Object.defineProperty(A, Pk, { value: mappedValue, writable: true, enumerable: true, configurable: true }); | |
18478 | |
18479 // For best browser support, use the following: | |
18480 A[ k ] = mappedValue; | |
18495 } | 18481 } |
18496 | 18482 // d. Increase k by 1. |
18497 o = prepareFileAttrs(o); | 18483 k++; |
18498 | 18484 } |
18499 if (o.dir || data === null || typeof data === "undefined") { | 18485 |
18500 o.base64 = false; | 18486 // 9. return A |
18501 o.binary = false; | 18487 return A; |
18502 data = null; | 18488 }; |
18503 } else if (JSZip.support.uint8array && data instanceof Uint8Array) { | 18489 } |
18504 o.base64 = false; | 18490 |
18505 o.binary = true; | 18491 // From https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf |
18506 data = JSZip.utils.uint8Array2String(data); | 18492 if (!Array.prototype.indexOf) { |
18507 } else if (JSZip.support.arraybuffer && data instanceof ArrayBuffer) { | 18493 Array.prototype.indexOf = function (searchElement, fromIndex) { |
18508 o.base64 = false; | 18494 if ( this === undefined || this === null ) { |
18509 o.binary = true; | 18495 throw new TypeError( '"this" is null or not defined' ); |
18510 var bufferView = new Uint8Array(data); | 18496 } |
18511 data = JSZip.utils.uint8Array2String(bufferView); | 18497 |
18512 } else if (o.binary && !o.base64) { | 18498 var length = this.length >>> 0; // Hack to convert object.length to a UInt32 |
18513 // optimizedBinaryString == true means that the file has already been filtered with a 0xFF mask | 18499 |
18514 if (o.optimizedBinaryString !== true) { | 18500 fromIndex = +fromIndex || 0; |
18515 // this is a string, not in a base64 format. | 18501 |
18516 // Be sure that this is a correct "binary string" | 18502 if (Math.abs(fromIndex) === Infinity) { |
18517 data = JSZip.utils.string2binary(data); | 18503 fromIndex = 0; |
18518 } | 18504 } |
18519 // we remove this option since it's only relevant here | 18505 |
18520 delete o.optimizedBinaryString; | 18506 if (fromIndex < 0) { |
18507 fromIndex += length; | |
18508 if (fromIndex < 0) { | |
18509 fromIndex = 0; | |
18521 } | 18510 } |
18522 | 18511 } |
18523 return this.files[name] = new ZipObject(name, data, o); | 18512 |
18524 }; | 18513 for (;fromIndex < length; fromIndex++) { |
18525 | 18514 if (this[fromIndex] === searchElement) { |
18526 | 18515 return fromIndex; |
18527 /** | |
18528 * Find the parent folder of the path. | |
18529 * @private | |
18530 * @param {string} path the path to use | |
18531 * @return {string} the parent folder, or "" | |
18532 */ | |
18533 var parentFolder = function (path) { | |
18534 if (path.slice(-1) == '/') { | |
18535 path = path.substring(0, path.length - 1); | |
18536 } | 18516 } |
18537 var lastSlash = path.lastIndexOf('/'); | 18517 } |
18538 return (lastSlash > 0) ? path.substring(0, lastSlash) : ""; | 18518 |
18539 }; | 18519 return -1; |
18540 | 18520 }; |
18541 /** | 18521 } |
18542 * Add a (sub) folder in the current folder. | 18522 // Based on https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/isArray |
18543 * @private | 18523 |
18544 * @param {string} name the folder's name | 18524 if (! Array.isArray) { |
18545 * @return {Object} the new folder. | 18525 Array.isArray = function(obj) { |
18546 */ | 18526 return Object.prototype.toString.call(obj) === "[object Array]"; |
18547 var folderAdd = function (name) { | 18527 }; |
18548 // Check the name ends with a / | 18528 } |
18549 if (name.slice(-1) != "/") { | 18529 |
18550 name += "/"; // IE doesn't like substr(-1) | 18530 // https://github.com/ttaubert/node-arraybuffer-slice |
18551 } | 18531 // (c) 2013 Tim Taubert <tim@timtaubert.de> |
18552 | 18532 // arraybuffer-slice may be freely distributed under the MIT license. |
18553 // Does this folder already exist? | 18533 |
18554 if (!this.files[name]) { | 18534 "use strict"; |
18555 // be sure sub folders exist | 18535 |
18556 var parent = parentFolder(name); | 18536 if (typeof ArrayBuffer !== 'undefined' && !ArrayBuffer.prototype.slice) { |
18557 if (parent) { | 18537 ArrayBuffer.prototype.slice = function (begin, end) { |
18558 folderAdd.call(this, parent); | 18538 begin = (begin|0) || 0; |
18559 } | 18539 var num = this.byteLength; |
18560 | 18540 end = end === (void 0) ? num : (end|0); |
18561 fileAdd.call(this, name, null, {dir:true}); | 18541 |
18562 } | 18542 // Handle negative values. |
18563 return this.files[name]; | 18543 if (begin < 0) begin += num; |
18564 }; | 18544 if (end < 0) end += num; |
18565 | 18545 |
18566 /** | 18546 if (num === 0 || begin >= num || begin >= end) { |
18567 * Generate the data found in the local header of a zip file. | 18547 return new ArrayBuffer(0); |
18568 * Do not create it now, as some parts are re-used later. | 18548 } |
18569 * @private | 18549 |
18570 * @param {Object} file the file to use. | 18550 var length = Math.min(num - begin, end - begin); |
18571 * @param {string} utfEncodedFileName the file name, utf8 encoded. | 18551 var target = new ArrayBuffer(length); |
18572 * @param {string} compressionType the compression to use. | 18552 var targetArray = new Uint8Array(target); |
18573 * @return {Object} an object containing header and compressedData. | 18553 targetArray.set(new Uint8Array(this, begin, length)); |
18574 */ | 18554 return target; |
18575 var prepareLocalHeaderData = function(file, utfEncodedFileName, compressionType) { | 18555 }; |
18576 var useUTF8 = utfEncodedFileName !== file.name, | 18556 } |
18577 data = file.asBinary(), | 18557 /* xls.js (C) 2013-2014 SheetJS -- http://sheetjs.com */ |
18578 o = file.options, | 18558 var XLS={};(function make_xls(XLS){XLS.version="0.7.1";var current_codepage=1252,current_cptable;if(typeof module!=="undefined"&&typeof require!=="undefined"){if(typeof cptable==="undefined")cptable=require("./dist/cpexcel");current_cptable=cptable[current_codepage]}function reset_cp(){set_cp(1252)}function set_cp(cp){current_codepage=cp;if(typeof cptable!=="undefined")current_cptable=cptable[cp]}var _getchar=function _gc1(x){return String.fromCharCode(x)};if(typeof cptable!=="undefined")_getchar=function _gc2(x){if(current_codepage===1200)return String.fromCharCode(x);return cptable.utils.decode(current_codepage,[x&255,x>>8])[0]};var has_buf=typeof Buffer!=="undefined";function new_buf(len){return new(has_buf?Buffer:Array)(len)}var Base64=function make_b64(){var map="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";return{decode:function b64_decode(input,utf8){var o="";var c1,c2,c3;var e1,e2,e3,e4;input=input.replace(/[^A-Za-z0-9\+\/\=]/g,"");for(var i=0;i<input.length;){e1=map.indexOf(input.charAt(i++));e2=map.indexOf(input.charAt(i++));e3=map.indexOf(input.charAt(i++));e4=map.indexOf(input.charAt(i++));c1=e1<<2|e2>>4;c2=(e2&15)<<4|e3>>2;c3=(e3&3)<<6|e4;o+=String.fromCharCode(c1);if(e3!=64){o+=String.fromCharCode(c2)}if(e4!=64){o+=String.fromCharCode(c3)}}return o}}}();function s2a(s){if(has_buf)return new Buffer(s,"binary");var w=s.split("").map(function(x){return x.charCodeAt(0)&255});return w}function readIEEE754(buf,idx,isLE,nl,ml){if(isLE===undefined)isLE=true;if(!nl)nl=8;if(!ml&&nl===8)ml=52;var e,m,el=nl*8-ml-1,eMax=(1<<el)-1,eBias=eMax>>1;var bits=-7,d=isLE?-1:1,i=isLE?nl-1:0,s=buf[idx+i];i+=d;e=s&(1<<-bits)-1;s>>>=-bits;bits+=el;for(;bits>0;e=e*256+buf[idx+i],i+=d,bits-=8);m=e&(1<<-bits)-1;e>>>=-bits;bits+=ml;for(;bits>0;m=m*256+buf[idx+i],i+=d,bits-=8);if(e===eMax)return m?NaN:(s?-1:1)*Infinity;else if(e===0)e=1-eBias;else{m=m+Math.pow(2,ml);e=e-eBias}return(s?-1:1)*m*Math.pow(2,e-ml)}var chr0=/\u0000/g,chr1=/[\u0001-\u0006]/;var __toBuffer,___toBuffer;__toBuffer=___toBuffer=function toBuffer_(bufs){var x=[];for(var i=0;i<bufs[0].length;++i){x.push.apply(x,bufs[0][i])}return x};var __utf16le,___utf16le;__utf16le=___utf16le=function utf16le_(b,s,e){var ss=[];for(var i=s;i<e;i+=2)ss.push(String.fromCharCode(__readUInt16LE(b,i)));return ss.join("")};var __hexlify,___hexlify;__hexlify=___hexlify=function hexlify_(b,s,l){return b.slice(s,s+l).map(function(x){return(x<16?"0":"")+x.toString(16)}).join("")};var __utf8,___utf8;__utf8=___utf8=function(b,s,e){var ss=[];for(var i=s;i<e;i++)ss.push(String.fromCharCode(__readUInt8(b,i)));return ss.join("")};var __lpstr,___lpstr;__lpstr=___lpstr=function lpstr_(b,i){var len=__readUInt32LE(b,i);return len>0?__utf8(b,i+4,i+4+len-1):""};var __lpwstr,___lpwstr;__lpwstr=___lpwstr=function lpwstr_(b,i){var len=2*__readUInt32LE(b,i);return len>0?__utf8(b,i+4,i+4+len-1):""};var __double,___double;__double=___double=function(b,idx){return readIEEE754(b,idx)};var bconcat=function(bufs){return[].concat.apply([],bufs)};if(typeof Buffer!=="undefined"){__utf16le=function utf16le_b(b,s,e){if(!Buffer.isBuffer(b))return ___utf16le(b,s,e);return b.toString("utf16le",s,e)};__hexlify=function(b,s,l){return Buffer.isBuffer(b)?b.toString("hex",s,s+l):___hexlify(b,s,l)};__lpstr=function lpstr_b(b,i){if(!Buffer.isBuffer(b))return ___lpstr(b,i);var len=b.readUInt32LE(i);return len>0?b.toString("utf8",i+4,i+4+len-1):""};__lpwstr=function lpwstr_b(b,i){if(!Buffer.isBuffer(b))return ___lpwstr(b,i);var len=2*b.readUInt32LE(i);return b.toString("utf16le",i+4,i+4+len-1)};__utf8=function utf8_b(s,e){return this.toString("utf8",s,e)};__toBuffer=function(bufs){return bufs[0].length>0&&Buffer.isBuffer(bufs[0][0])?Buffer.concat(bufs[0]):___toBuffer(bufs)};bconcat=function(bufs){return Buffer.isBuffer(bufs[0])?Buffer.concat(bufs):[].concat.apply([],bufs)};__double=function double_(b,i){if(Buffer.isBuffer(b))return b.readDoubleLE(i);return ___double(b,i)}}var __readUInt8=function(b,idx){return b[idx]};var __readUInt16LE=function(b,idx){return b[idx+1]*(1<<8)+b[idx]};var __readInt16LE=function(b,idx){var u=b[idx+1]*(1<<8)+b[idx];return u<32768?u:(65535-u+1)*-1};var __readUInt32LE=function(b,idx){return b[idx+3]*(1<<24)+(b[idx+2]<<16)+(b[idx+1]<<8)+b[idx]};var __readInt32LE=function(b,idx){return b[idx+3]<<24|b[idx+2]<<16|b[idx+1]<<8|b[idx]};var ___unhexlify=function(s){return s.match(/../g).map(function(x){return parseInt(x,16)})};var __unhexlify=typeof Buffer!=="undefined"?function(s){return Buffer.isBuffer(s)?new Buffer(s,"hex"):___unhexlify(s)}:___unhexlify;if(typeof cptable!=="undefined"){__utf16le=function(b,s,e){return cptable.utils.decode(1200,b.slice(s,e))};__utf8=function(b,s,e){return cptable.utils.decode(65001,b.slice(s,e))};__lpstr=function(b,i){var len=__readUInt32LE(b,i);return len>0?cptable.utils.decode(current_codepage,b.slice(i+4,i+4+len-1)):""};__lpwstr=function(b,i){var len=2*__readUInt32LE(b,i);return len>0?cptable.utils.decode(1200,b.slice(i+4,i+4+len-1)):""}}function ReadShift(size,t){var o,oI,oR,oo=[],w,vv,i,loc;switch(t){case"lpstr":o=__lpstr(this,this.l);size=5+o.length;break;case"lpwstr":o=__lpwstr(this,this.l);size=5+o.length;if(o[o.length-1]=="\x00")size+=2;break;case"cstr":size=0;o="";while((w=__readUInt8(this,this.l+size++))!==0)oo.push(_getchar(w));o=oo.join("");break;case"wstr":size=0;o="";while((w=__readUInt16LE(this,this.l+size))!==0){oo.push(_getchar(w));size+=2}size+=2;o=oo.join("");break;case"dbcs":o="";loc=this.l;for(i=0;i!=size;++i){if(this.lens&&this.lens.indexOf(loc)!==-1){w=__readUInt8(this,loc);this.l=loc+1;vv=ReadShift.call(this,size-i,w?"dbcs":"sbcs");return oo.join("")+vv}oo.push(_getchar(__readUInt16LE(this,loc)));loc+=2}o=oo.join("");size*=2;break;case"sbcs":o="";loc=this.l;for(i=0;i!=size;++i){if(this.lens&&this.lens.indexOf(loc)!==-1){w=__readUInt8(this,loc);this.l=loc+1;vv=ReadShift.call(this,size-i,w?"dbcs":"sbcs");return oo.join("")+vv}oo.push(_getchar(__readUInt8(this,loc)));loc+=1}o=oo.join("");break;case"utf8":o=__utf8(this,this.l,this.l+size);break;case"utf16le":size*=2;o=__utf16le(this,this.l,this.l+size);break;default:switch(size){case 1:oI=__readUInt8(this,this.l);this.l++;return oI;case 2:oI=t!=="i"?__readUInt16LE(this,this.l):__readInt16LE(this,this.l);this.l+=2;return oI;case 4:if(t==="i"||(this[this.l+3]&128)===0){oI=__readInt32LE(this,this.l);this.l+=4;return oI}else{oR=__readUInt32LE(this,this.l);this.l+=4;return oR}break;case 8:if(t==="f"){oR=__double(this,this.l);this.l+=8;return oR}case 16:o=__hexlify(this,this.l,size);break}}this.l+=size;return o}function CheckField(hexstr,fld){var m=__hexlify(this,this.l,hexstr.length>>1);if(m!==hexstr)throw fld+"Expected "+hexstr+" saw "+m;this.l+=hexstr.length>>1}function prep_blob(blob,pos){blob.l=pos;blob.read_shift=ReadShift;blob.chk=CheckField}var SSF={};var make_ssf=function make_ssf(SSF){SSF.version="0.8.1";function _strrev(x){var o="",i=x.length-1;while(i>=0)o+=x.charAt(i--);return o}function fill(c,l){var o="";while(o.length<l)o+=c;return o}function pad0(v,d){var t=""+v;return t.length>=d?t:fill("0",d-t.length)+t}function pad_(v,d){var t=""+v;return t.length>=d?t:fill(" ",d-t.length)+t}function rpad_(v,d){var t=""+v;return t.length>=d?t:t+fill(" ",d-t.length)}function pad0r1(v,d){var t=""+Math.round(v);return t.length>=d?t:fill("0",d-t.length)+t}function pad0r2(v,d){var t=""+v;return t.length>=d?t:fill("0",d-t.length)+t}var p2_32=Math.pow(2,32);function pad0r(v,d){if(v>p2_32||v<-p2_32)return pad0r1(v,d);var i=Math.round(v);return pad0r2(i,d)}function isgeneral(s,i){return s.length>=7+i&&(s.charCodeAt(i)|32)===103&&(s.charCodeAt(i+1)|32)===101&&(s.charCodeAt(i+2)|32)===110&&(s.charCodeAt(i+3)|32)===101&&(s.charCodeAt(i+4)|32)===114&&(s.charCodeAt(i+5)|32)===97&&(s.charCodeAt(i+6)|32)===108}var opts_fmt=[["date1904",0],["output",""],["WTF",false]];function fixopts(o){for(var y=0;y!=opts_fmt.length;++y)if(o[opts_fmt[y][0]]===undefined)o[opts_fmt[y][0]]=opts_fmt[y][1]}SSF.opts=opts_fmt;var table_fmt={0:"General",1:"0",2:"0.00",3:"#,##0",4:"#,##0.00",9:"0%",10:"0.00%",11:"0.00E+00",12:"# ?/?",13:"# ??/??",14:"m/d/yy",15:"d-mmm-yy",16:"d-mmm",17:"mmm-yy",18:"h:mm AM/PM",19:"h:mm:ss AM/PM",20:"h:mm",21:"h:mm:ss",22:"m/d/yy h:mm",37:"#,##0 ;(#,##0)",38:"#,##0 ;[Red](#,##0)",39:"#,##0.00;(#,##0.00)",40:"#,##0.00;[Red](#,##0.00)",45:"mm:ss",46:"[h]:mm:ss",47:"mmss.0",48:"##0.0E+0",49:"@",56:'"上午/下午 "hh"時"mm"分"ss"秒 "',65535:"General"};var days=[["Sun","Sunday"],["Mon","Monday"],["Tue","Tuesday"],["Wed","Wednesday"],["Thu","Thursday"],["Fri","Friday"],["Sat","Saturday"]];var months=[["J","Jan","January"],["F","Feb","February"],["M","Mar","March"],["A","Apr","April"],["M","May","May"],["J","Jun","June"],["J","Jul","July"],["A","Aug","August"],["S","Sep","September"],["O","Oct","October"],["N","Nov","November"],["D","Dec","December"]];function frac(x,D,mixed){var sgn=x<0?-1:1;var B=x*sgn;var P_2=0,P_1=1,P=0;var Q_2=1,Q_1=0,Q=0;var A=Math.floor(B);while(Q_1<D){A=Math.floor(B);P=A*P_1+P_2;Q=A*Q_1+Q_2;if(B-A<5e-10)break;B=1/(B-A);P_2=P_1;P_1=P;Q_2=Q_1;Q_1=Q}if(Q>D){Q=Q_1;P=P_1}if(Q>D){Q=Q_2;P=P_2}if(!mixed)return[0,sgn*P,Q];if(Q===0)throw"Unexpected state: "+P+" "+P_1+" "+P_2+" "+Q+" "+Q_1+" "+Q_2;var q=Math.floor(sgn*P/Q);return[q,sgn*P-q*Q,Q]}function general_fmt_int(v,opts){return""+v}SSF._general_int=general_fmt_int;var general_fmt_num=function make_general_fmt_num(){var gnr1=/\.(\d*[1-9])0+$/,gnr2=/\.0*$/,gnr4=/\.(\d*[1-9])0+/,gnr5=/\.0*[Ee]/,gnr6=/(E[+-])(\d)$/;function gfn2(v){var w=v<0?12:11;var o=gfn5(v.toFixed(12));if(o.length<=w)return o;o=v.toPrecision(10);if(o.length<=w)return o;return v.toExponential(5)}function gfn3(v){var o=v.toFixed(11).replace(gnr1,".$1");if(o.length>(v<0?12:11))o=v.toPrecision(6);return o}function gfn4(o){for(var i=0;i!=o.length;++i)if((o.charCodeAt(i)|32)===101)return o.replace(gnr4,".$1").replace(gnr5,"E").replace("e","E").replace(gnr6,"$10$2");return o}function gfn5(o){return o.indexOf(".")>-1?o.replace(gnr2,"").replace(gnr1,".$1"):o}return function general_fmt_num(v,opts){var V=Math.floor(Math.log(Math.abs(v))*Math.LOG10E),o;if(V>=-4&&V<=-1)o=v.toPrecision(10+V);else if(Math.abs(V)<=9)o=gfn2(v);else if(V===10)o=v.toFixed(10).substr(0,12);else o=gfn3(v);return gfn5(gfn4(o))}}();SSF._general_num=general_fmt_num;function general_fmt(v,opts){switch(typeof v){case"string":return v;case"boolean":return v?"TRUE":"FALSE";case"number":return(v|0)===v?general_fmt_int(v,opts):general_fmt_num(v,opts)}throw new Error("unsupported value in General format: "+v)}SSF._general=general_fmt;function fix_hijri(date,o){return 0}function parse_date_code(v,opts,b2){if(v>2958465||v<0)return null;var date=v|0,time=Math.floor(86400*(v-date)),dow=0;var dout=[];var out={D:date,T:time,u:86400*(v-date)-time,y:0,m:0,d:0,H:0,M:0,S:0,q:0};if(Math.abs(out.u)<1e-6)out.u=0;fixopts(opts!=null?opts:opts=[]);if(opts.date1904)date+=1462;if(out.u>.999){out.u=0;if(++time==86400){time=0;++date}}if(date===60){dout=b2?[1317,10,29]:[1900,2,29];dow=3}else if(date===0){dout=b2?[1317,8,29]:[1900,1,0];dow=6}else{if(date>60)--date;var d=new Date(1900,0,1);d.setDate(d.getDate()+date-1);dout=[d.getFullYear(),d.getMonth()+1,d.getDate()];dow=d.getDay();if(date<60)dow=(dow+6)%7;if(b2)dow=fix_hijri(d,dout)}out.y=dout[0];out.m=dout[1];out.d=dout[2];out.S=time%60;time=Math.floor(time/60);out.M=time%60;time=Math.floor(time/60);out.H=time;out.q=dow;return out}SSF.parse_date_code=parse_date_code;function write_date(type,fmt,val,ss0){var o="",ss=0,tt=0,y=val.y,out,outl=0;switch(type){case 98:y=val.y+543;case 121:switch(fmt.length){case 1:case 2:out=y%100;outl=2;break;default:out=y%1e4;outl=4;break}break;case 109:switch(fmt.length){case 1:case 2:out=val.m;outl=fmt.length;break;case 3:return months[val.m-1][1];case 5:return months[val.m-1][0];default:return months[val.m-1][2]}break;case 100:switch(fmt.length){case 1:case 2:out=val.d;outl=fmt.length;break;case 3:return days[val.q][0];default:return days[val.q][1]}break;case 104:switch(fmt.length){case 1:case 2:out=1+(val.H+11)%12;outl=fmt.length;break;default:throw"bad hour format: "+fmt}break;case 72:switch(fmt.length){case 1:case 2:out=val.H;outl=fmt.length;break;default:throw"bad hour format: "+fmt}break;case 77:switch(fmt.length){case 1:case 2:out=val.M;outl=fmt.length;break;default:throw"bad minute format: "+fmt}break;case 115:if(val.u===0)switch(fmt){case"s":case"ss":return pad0(val.S,fmt.length);case".0":case".00":case".000":}switch(fmt){case"s":case"ss":case".0":case".00":case".000":if(ss0>=2)tt=ss0===3?1e3:100;else tt=ss0===1?10:1;ss=Math.round(tt*(val.S+val.u));if(ss>=60*tt)ss=0;if(fmt==="s")return ss===0?"0":""+ss/tt;o=pad0(ss,2+ss0);if(fmt==="ss")return o.substr(0,2);return"."+o.substr(2,fmt.length-1);default:throw"bad second format: "+fmt}case 90:switch(fmt){case"[h]":case"[hh]":out=val.D*24+val.H;break;case"[m]":case"[mm]":out=(val.D*24+val.H)*60+val.M;break;case"[s]":case"[ss]":out=((val.D*24+val.H)*60+val.M)*60+Math.round(val.S+val.u);break;default:throw"bad abstime format: "+fmt}outl=fmt.length===3?1:2;break;case 101:out=y;outl=1}if(outl>0)return pad0(out,outl);else return""}function commaify(s){if(s.length<=3)return s;var j=s.length%3,o=s.substr(0,j);for(;j!=s.length;j+=3)o+=(o.length>0?",":"")+s.substr(j,3);return o}var write_num=function make_write_num(){var pct1=/%/g;function write_num_pct(type,fmt,val){var sfmt=fmt.replace(pct1,""),mul=fmt.length-sfmt.length;return write_num(type,sfmt,val*Math.pow(10,2*mul))+fill("%",mul)}function write_num_cm(type,fmt,val){var idx=fmt.length-1;while(fmt.charCodeAt(idx-1)===44)--idx;return write_num(type,fmt.substr(0,idx),val/Math.pow(10,3*(fmt.length-idx)))}function write_num_exp(fmt,val){var o;var idx=fmt.indexOf("E")-fmt.indexOf(".")-1;if(fmt.match(/^#+0.0E\+0$/)){var period=fmt.indexOf(".");if(period===-1)period=fmt.indexOf("E");var ee=Math.floor(Math.log(Math.abs(val))*Math.LOG10E)%period;if(ee<0)ee+=period;o=(val/Math.pow(10,ee)).toPrecision(idx+1+(period+ee)%period);if(o.indexOf("e")===-1){var fakee=Math.floor(Math.log(Math.abs(val))*Math.LOG10E);if(o.indexOf(".")===-1)o=o[0]+"."+o.substr(1)+"E+"+(fakee-o.length+ee);else o+="E+"+(fakee-ee);while(o.substr(0,2)==="0."){o=o[0]+o.substr(2,period)+"."+o.substr(2+period);o=o.replace(/^0+([1-9])/,"$1").replace(/^0+\./,"0.")}o=o.replace(/\+-/,"-")}o=o.replace(/^([+-]?)(\d*)\.(\d*)[Ee]/,function($$,$1,$2,$3){return $1+$2+$3.substr(0,(period+ee)%period)+"."+$3.substr(ee)+"E"})}else o=val.toExponential(idx);if(fmt.match(/E\+00$/)&&o.match(/e[+-]\d$/))o=o.substr(0,o.length-1)+"0"+o[o.length-1];if(fmt.match(/E\-/)&&o.match(/e\+/))o=o.replace(/e\+/,"e");return o.replace("e","E")}var frac1=/# (\?+)( ?)\/( ?)(\d+)/;function write_num_f1(r,aval,sign){var den=parseInt(r[4]),rr=Math.round(aval*den),base=Math.floor(rr/den);var myn=rr-base*den,myd=den;return sign+(base===0?"":""+base)+" "+(myn===0?fill(" ",r[1].length+1+r[4].length):pad_(myn,r[1].length)+r[2]+"/"+r[3]+pad0(myd,r[4].length))}function write_num_f2(r,aval,sign){return sign+(aval===0?"":""+aval)+fill(" ",r[1].length+2+r[4].length)}var dec1=/^#*0*\.(0+)/;var closeparen=/\).*[0#]/;var phone=/\(###\) ###\\?-####/;function hashq(str){var o="",cc;for(var i=0;i!=str.length;++i)switch(cc=str.charCodeAt(i)){case 35:break;case 63:o+=" ";break;case 48:o+="0";break;default:o+=String.fromCharCode(cc)}return o}function rnd(val,d){var dd=Math.pow(10,d);return""+Math.round(val*dd)/dd}function dec(val,d){return Math.round((val-Math.floor(val))*Math.pow(10,d))}function flr(val){if(val<2147483647&&val>-2147483648)return""+(val>=0?val|0:val-1|0);return""+Math.floor(val)}function write_num_flt(type,fmt,val){if(type.charCodeAt(0)===40&&!fmt.match(closeparen)){var ffmt=fmt.replace(/\( */,"").replace(/ \)/,"").replace(/\)/,"");if(val>=0)return write_num_flt("n",ffmt,val);return"("+write_num_flt("n",ffmt,-val)+")"}if(fmt.charCodeAt(fmt.length-1)===44)return write_num_cm(type,fmt,val);if(fmt.indexOf("%")!==-1)return write_num_pct(type,fmt,val);if(fmt.indexOf("E")!==-1)return write_num_exp(fmt,val);if(fmt.charCodeAt(0)===36)return"$"+write_num_flt(type,fmt.substr(fmt[1]==" "?2:1),val);var o,oo;var r,ri,ff,aval=Math.abs(val),sign=val<0?"-":"";if(fmt.match(/^00+$/))return sign+pad0r(aval,fmt.length);if(fmt.match(/^[#?]+$/)){o=pad0r(val,0);if(o==="0")o="";return o.length>fmt.length?o:hashq(fmt.substr(0,fmt.length-o.length))+o}if((r=fmt.match(frac1))!==null)return write_num_f1(r,aval,sign);if(fmt.match(/^#+0+$/)!==null)return sign+pad0r(aval,fmt.length-fmt.indexOf("0"));if((r=fmt.match(dec1))!==null){o=rnd(val,r[1].length).replace(/^([^\.]+)$/,"$1."+r[1]).replace(/\.$/,"."+r[1]).replace(/\.(\d*)$/,function($$,$1){return"."+$1+fill("0",r[1].length-$1.length)});return fmt.indexOf("0.")!==-1?o:o.replace(/^0\./,".")}fmt=fmt.replace(/^#+([0.])/,"$1");if((r=fmt.match(/^(0*)\.(#*)$/))!==null){return sign+rnd(aval,r[2].length).replace(/\.(\d*[1-9])0*$/,".$1").replace(/^(-?\d*)$/,"$1.").replace(/^0\./,r[1].length?"0.":".")}if((r=fmt.match(/^#,##0(\.?)$/))!==null)return sign+commaify(pad0r(aval,0));if((r=fmt.match(/^#,##0\.([#0]*0)$/))!==null){return val<0?"-"+write_num_flt(type,fmt,-val):commaify(""+Math.floor(val))+"."+pad0(dec(val,r[1].length),r[1].length)}if((r=fmt.match(/^#,#*,#0/))!==null)return write_num_flt(type,fmt.replace(/^#,#*,/,""),val);if((r=fmt.match(/^([0#]+)(\\?-([0#]+))+$/))!==null){o=_strrev(write_num_flt(type,fmt.replace(/[\\-]/g,""),val));ri=0;return _strrev(_strrev(fmt.replace(/\\/g,"")).replace(/[0#]/g,function(x){return ri<o.length?o[ri++]:x==="0"?"0":""}))}if(fmt.match(phone)!==null){o=write_num_flt(type,"##########",val);return"("+o.substr(0,3)+") "+o.substr(3,3)+"-"+o.substr(6)}var oa="";if((r=fmt.match(/^([#0?]+)( ?)\/( ?)([#0?]+)/))!==null){ri=Math.min(r[4].length,7);ff=frac(aval,Math.pow(10,ri)-1,false);o=""+sign;oa=write_num("n",r[1],ff[1]);if(oa[oa.length-1]==" ")oa=oa.substr(0,oa.length-1)+"0";o+=oa+r[2]+"/"+r[3];oa=rpad_(ff[2],ri);if(oa.length<r[4].length)oa=hashq(r[4].substr(r[4].length-oa.length))+oa;o+=oa;return o}if((r=fmt.match(/^# ([#0?]+)( ?)\/( ?)([#0?]+)/))!==null){ri=Math.min(Math.max(r[1].length,r[4].length),7);ff=frac(aval,Math.pow(10,ri)-1,true);return sign+(ff[0]||(ff[1]?"":"0"))+" "+(ff[1]?pad_(ff[1],ri)+r[2]+"/"+r[3]+rpad_(ff[2],ri):fill(" ",2*ri+1+r[2].length+r[3].length))}if((r=fmt.match(/^[#0?]+$/))!==null){o=pad0r(val,0);if(fmt.length<=o.length)return o;return hashq(fmt.substr(0,fmt.length-o.length))+o}if((r=fmt.match(/^([#0?]+)\.([#0]+)$/))!==null){o=""+val.toFixed(Math.min(r[2].length,10)).replace(/([^0])0+$/,"$1");ri=o.indexOf(".");var lres=fmt.indexOf(".")-ri,rres=fmt.length-o.length-lres;return hashq(fmt.substr(0,lres)+o+fmt.substr(fmt.length-rres))}if((r=fmt.match(/^00,000\.([#0]*0)$/))!==null){ri=dec(val,r[1].length);return val<0?"-"+write_num_flt(type,fmt,-val):commaify(flr(val)).replace(/^\d,\d{3}$/,"0$&").replace(/^\d*$/,function($$){return"00,"+($$.length<3?pad0(0,3-$$.length):"")+$$})+"."+pad0(ri,r[1].length)}switch(fmt){case"#,###":var x=commaify(pad0r(aval,0));return x!=="0"?sign+x:"";default:}throw new Error("unsupported format |"+fmt+"|")}function write_num_cm2(type,fmt,val){var idx=fmt.length-1;while(fmt.charCodeAt(idx-1)===44)--idx;return write_num(type,fmt.substr(0,idx),val/Math.pow(10,3*(fmt.length-idx)))}function write_num_pct2(type,fmt,val){var sfmt=fmt.replace(pct1,""),mul=fmt.length-sfmt.length;return write_num(type,sfmt,val*Math.pow(10,2*mul))+fill("%",mul)}function write_num_exp2(fmt,val){var o;var idx=fmt.indexOf("E")-fmt.indexOf(".")-1;if(fmt.match(/^#+0.0E\+0$/)){var period=fmt.indexOf(".");if(period===-1)period=fmt.indexOf("E");var ee=Math.floor(Math.log(Math.abs(val))*Math.LOG10E)%period;if(ee<0)ee+=period;o=(val/Math.pow(10,ee)).toPrecision(idx+1+(period+ee)%period);if(!o.match(/[Ee]/)){var fakee=Math.floor(Math.log(Math.abs(val))*Math.LOG10E);if(o.indexOf(".")===-1)o=o[0]+"."+o.substr(1)+"E+"+(fakee-o.length+ee);else o+="E+"+(fakee-ee);o=o.replace(/\+-/,"-")}o=o.replace(/^([+-]?)(\d*)\.(\d*)[Ee]/,function($$,$1,$2,$3){return $1+$2+$3.substr(0,(period+ee)%period)+"."+$3.substr(ee)+"E"})}else o=val.toExponential(idx);if(fmt.match(/E\+00$/)&&o.match(/e[+-]\d$/))o=o.substr(0,o.length-1)+"0"+o[o.length-1];if(fmt.match(/E\-/)&&o.match(/e\+/))o=o.replace(/e\+/,"e");return o.replace("e","E")}function write_num_int(type,fmt,val){if(type.charCodeAt(0)===40&&!fmt.match(closeparen)){var ffmt=fmt.replace(/\( */,"").replace(/ \)/,"").replace(/\)/,"");if(val>=0)return write_num_int("n",ffmt,val);return"("+write_num_int("n",ffmt,-val)+")"}if(fmt.charCodeAt(fmt.length-1)===44)return write_num_cm2(type,fmt,val);if(fmt.indexOf("%")!==-1)return write_num_pct2(type,fmt,val);if(fmt.indexOf("E")!==-1)return write_num_exp2(fmt,val);if(fmt.charCodeAt(0)===36)return"$"+write_num_int(type,fmt.substr(fmt[1]==" "?2:1),val);var o;var r,ri,ff,aval=Math.abs(val),sign=val<0?"-":"";if(fmt.match(/^00+$/))return sign+pad0(aval,fmt.length);if(fmt.match(/^[#?]+$/)){o=""+val;if(val===0)o="";return o.length>fmt.length?o:hashq(fmt.substr(0,fmt.length-o.length))+o}if((r=fmt.match(frac1))!==null)return write_num_f2(r,aval,sign);if(fmt.match(/^#+0+$/)!==null)return sign+pad0(aval,fmt.length-fmt.indexOf("0"));if((r=fmt.match(dec1))!==null){o=(""+val).replace(/^([^\.]+)$/,"$1."+r[1]).replace(/\.$/,"."+r[1]).replace(/\.(\d*)$/,function($$,$1){return"."+$1+fill("0",r[1].length-$1.length)});return fmt.indexOf("0.")!==-1?o:o.replace(/^0\./,".")}fmt=fmt.replace(/^#+([0.])/,"$1");if((r=fmt.match(/^(0*)\.(#*)$/))!==null){return sign+(""+aval).replace(/\.(\d*[1-9])0*$/,".$1").replace(/^(-?\d*)$/,"$1.").replace(/^0\./,r[1].length?"0.":".")}if((r=fmt.match(/^#,##0(\.?)$/))!==null)return sign+commaify(""+aval);if((r=fmt.match(/^#,##0\.([#0]*0)$/))!==null){return val<0?"-"+write_num_int(type,fmt,-val):commaify(""+val)+"."+fill("0",r[1].length)}if((r=fmt.match(/^#,#*,#0/))!==null)return write_num_int(type,fmt.replace(/^#,#*,/,""),val);if((r=fmt.match(/^([0#]+)(\\?-([0#]+))+$/))!==null){o=_strrev(write_num_int(type,fmt.replace(/[\\-]/g,""),val));ri=0;return _strrev(_strrev(fmt.replace(/\\/g,"")).replace(/[0#]/g,function(x){return ri<o.length?o[ri++]:x==="0"?"0":""}))}if(fmt.match(phone)!==null){o=write_num_int(type,"##########",val);return"("+o.substr(0,3)+") "+o.substr(3,3)+"-"+o.substr(6)}var oa="";if((r=fmt.match(/^([#0?]+)( ?)\/( ?)([#0?]+)/))!==null){ri=Math.min(r[4].length,7);ff=frac(aval,Math.pow(10,ri)-1,false);o=""+sign;oa=write_num("n",r[1],ff[1]);if(oa[oa.length-1]==" ")oa=oa.substr(0,oa.length-1)+"0";o+=oa+r[2]+"/"+r[3];oa=rpad_(ff[2],ri);if(oa.length<r[4].length)oa=hashq(r[4].substr(r[4].length-oa.length))+oa;o+=oa;return o}if((r=fmt.match(/^# ([#0?]+)( ?)\/( ?)([#0?]+)/))!==null){ri=Math.min(Math.max(r[1].length,r[4].length),7);ff=frac(aval,Math.pow(10,ri)-1,true);return sign+(ff[0]||(ff[1]?"":"0"))+" "+(ff[1]?pad_(ff[1],ri)+r[2]+"/"+r[3]+rpad_(ff[2],ri):fill(" ",2*ri+1+r[2].length+r[3].length))}if((r=fmt.match(/^[#0?]+$/))!==null){o=""+val;if(fmt.length<=o.length)return o;return hashq(fmt.substr(0,fmt.length-o.length))+o}if((r=fmt.match(/^([#0]+)\.([#0]+)$/))!==null){o=""+val.toFixed(Math.min(r[2].length,10)).replace(/([^0])0+$/,"$1");ri=o.indexOf(".");var lres=fmt.indexOf(".")-ri,rres=fmt.length-o.length-lres;return hashq(fmt.substr(0,lres)+o+fmt.substr(fmt.length-rres))}if((r=fmt.match(/^00,000\.([#0]*0)$/))!==null){return val<0?"-"+write_num_int(type,fmt,-val):commaify(""+val).replace(/^\d,\d{3}$/,"0$&").replace(/^\d*$/,function($$){return"00,"+($$.length<3?pad0(0,3-$$.length):"")+$$})+"."+pad0(0,r[1].length)}switch(fmt){case"#,###":var x=commaify(""+aval);return x!=="0"?sign+x:"";default:}throw new Error("unsupported format |"+fmt+"|")}return function write_num(type,fmt,val){return(val|0)===val?write_num_int(type,fmt,val):write_num_flt(type,fmt,val)}}();function split_fmt(fmt){var out=[];var in_str=false,cc;for(var i=0,j=0;i<fmt.length;++i)switch(cc=fmt.charCodeAt(i)){case 34:in_str=!in_str;break;case 95:case 42:case 92:++i;break;case 59:out[out.length]=fmt.substr(j,i-j);j=i+1}out[out.length]=fmt.substr(j);if(in_str===true)throw new Error("Format |"+fmt+"| unterminated string ");return out}SSF._split=split_fmt;var abstime=/\[[HhMmSs]*\]/;function eval_fmt(fmt,v,opts,flen){var out=[],o="",i=0,c="",lst="t",q,dt,j,cc;var hr="H";while(i<fmt.length){switch(c=fmt[i]){case"G":if(!isgeneral(fmt,i))throw new Error("unrecognized character "+c+" in "+fmt);out[out.length]={t:"G",v:"General"};i+=7;break;case'"':for(o="";(cc=fmt.charCodeAt(++i))!==34&&i<fmt.length;)o+=String.fromCharCode(cc);out[out.length]={t:"t",v:o};++i;break;case"\\":var w=fmt[++i],t=w==="("||w===")"?w:"t";out[out.length]={t:t,v:w};++i;break;case"_":out[out.length]={t:"t",v:" "};i+=2;break;case"@":out[out.length]={t:"T",v:v};++i;break;case"B":case"b":if(fmt[i+1]==="1"||fmt[i+1]==="2"){if(dt==null){dt=parse_date_code(v,opts,fmt[i+1]==="2");if(dt==null)return""}out[out.length]={t:"X",v:fmt.substr(i,2)};lst=c;i+=2;break}case"M":case"D":case"Y":case"H":case"S":case"E":c=c.toLowerCase();case"m":case"d":case"y":case"h":case"s":case"e":case"g":if(v<0)return"";if(dt==null){dt=parse_date_code(v,opts);if(dt==null)return""}o=c;while(++i<fmt.length&&fmt[i].toLowerCase()===c)o+=c;if(c==="m"&&lst.toLowerCase()==="h")c="M";if(c==="h")c=hr;out[out.length]={t:c,v:o};lst=c;break;case"A":q={t:c,v:"A"};if(dt==null)dt=parse_date_code(v,opts);if(fmt.substr(i,3)==="A/P"){if(dt!=null)q.v=dt.H>=12?"P":"A";q.t="T";hr="h";i+=3}else if(fmt.substr(i,5)==="AM/PM"){if(dt!=null)q.v=dt.H>=12?"PM":"AM";q.t="T";i+=5;hr="h"}else{q.t="t";++i}if(dt==null&&q.t==="T")return"";out[out.length]=q;lst=c;break;case"[":o=c;while(fmt[i++]!=="]"&&i<fmt.length)o+=fmt[i];if(o.substr(-1)!=="]")throw'unterminated "[" block: |'+o+"|";if(o.match(abstime)){if(dt==null){dt=parse_date_code(v,opts);if(dt==null)return""}out[out.length]={t:"Z",v:o.toLowerCase()}}else{o=""}break;case".":if(dt!=null){o=c;while((c=fmt[++i])==="0")o+=c;out[out.length]={t:"s",v:o};break}case"0":case"#":o=c;while("0#?.,E+-%".indexOf(c=fmt[++i])>-1||c=="\\"&&fmt[i+1]=="-"&&"0#".indexOf(fmt[i+2])>-1)o+=c;out[out.length]={t:"n",v:o};break;case"?":o=c;while(fmt[++i]===c)o+=c;q={t:c,v:o};out[out.length]=q;lst=c;break;case"*":++i;if(fmt[i]==" "||fmt[i]=="*")++i;break;case"(":case")":out[out.length]={t:flen===1?"t":c,v:c};++i;break;case"1":case"2":case"3":case"4":case"5":case"6":case"7":case"8":case"9":o=c;while("0123456789".indexOf(fmt[++i])>-1)o+=fmt[i];out[out.length]={t:"D",v:o};break;case" ":out[out.length]={t:c,v:c};++i;break;default:if(",$-+/():!^&'~{}<>=€acfijklopqrtuvwxz".indexOf(c)===-1)throw new Error("unrecognized character "+c+" in "+fmt);out[out.length]={t:"t",v:c};++i;break}}var bt=0,ss0=0,ssm;for(i=out.length-1,lst="t";i>=0;--i){switch(out[i].t){case"h":case"H":out[i].t=hr;lst="h";if(bt<1)bt=1;break;case"s":if(ssm=out[i].v.match(/\.0+$/))ss0=Math.max(ss0,ssm[0].length-1);if(bt<3)bt=3;case"d":case"y":case"M":case"e":lst=out[i].t;break;case"m":if(lst==="s"){out[i].t="M";if(bt<2)bt=2}break;case"X":if(out[i].v==="B2");break;case"Z":if(bt<1&&out[i].v.match(/[Hh]/))bt=1;if(bt<2&&out[i].v.match(/[Mm]/))bt=2;if(bt<3&&out[i].v.match(/[Ss]/))bt=3}}switch(bt){case 0:break;case 1:if(dt.u>=.5){dt.u=0;++dt.S}if(dt.S>=60){dt.S=0;++dt.M}if(dt.M>=60){dt.M=0;++dt.H}break;case 2:if(dt.u>=.5){dt.u=0;++dt.S}if(dt.S>=60){dt.S=0;++dt.M}break}var nstr="",jj;for(i=0;i<out.length;++i){switch(out[i].t){case"t":case"T":case" ":case"D":break;case"X":out[i]=undefined;break;case"d":case"m":case"y":case"h":case"H":case"M":case"s":case"e":case"b":case"Z":out[i].v=write_date(out[i].t.charCodeAt(0),out[i].v,dt,ss0);out[i].t="t";break;case"n":case"(":case"?":jj=i+1;while(out[jj]!=null&&((c=out[jj].t)==="?"||c==="D"||(c===" "||c==="t")&&out[jj+1]!=null&&(out[jj+1].t==="?"||out[jj+1].t==="t"&&out[jj+1].v==="/")||out[i].t==="("&&(c===" "||c==="n"||c===")")||c==="t"&&(out[jj].v==="/"||"$€".indexOf(out[jj].v)>-1||out[jj].v===" "&&out[jj+1]!=null&&out[jj+1].t=="?"))){out[i].v+=out[jj].v;out[jj]=undefined;++jj}nstr+=out[i].v;i=jj-1;break;case"G":out[i].t="t";out[i].v=general_fmt(v,opts);break}}var vv="",myv,ostr;if(nstr.length>0){myv=v<0&&nstr.charCodeAt(0)===45?-v:v;ostr=write_num(nstr.charCodeAt(0)===40?"(":"n",nstr,myv);jj=ostr.length-1;var decpt=out.length;for(i=0;i<out.length;++i)if(out[i]!=null&&out[i].v.indexOf(".")>-1){decpt=i;break}var lasti=out.length;if(decpt===out.length&&ostr.indexOf("E")===-1){for(i=out.length-1;i>=0;--i){if(out[i]==null||"n?(".indexOf(out[i].t)===-1)continue;if(jj>=out[i].v.length-1){jj-=out[i].v.length;out[i].v=ostr.substr(jj+1,out[i].v.length)}else if(jj<0)out[i].v="";else{out[i].v=ostr.substr(0,jj+1);jj=-1}out[i].t="t";lasti=i}if(jj>=0&&lasti<out.length)out[lasti].v=ostr.substr(0,jj+1)+out[lasti].v}else if(decpt!==out.length&&ostr.indexOf("E")===-1){jj=ostr.indexOf(".")-1;for(i=decpt;i>=0;--i){if(out[i]==null||"n?(".indexOf(out[i].t)===-1)continue;j=out[i].v.indexOf(".")>-1&&i===decpt?out[i].v.indexOf(".")-1:out[i].v.length-1;vv=out[i].v.substr(j+1);for(;j>=0;--j){if(jj>=0&&(out[i].v[j]==="0"||out[i].v[j]==="#"))vv=ostr[jj--]+vv}out[i].v=vv;out[i].t="t";lasti=i}if(jj>=0&&lasti<out.length)out[lasti].v=ostr.substr(0,jj+1)+out[lasti].v;jj=ostr.indexOf(".")+1;for(i=decpt;i<out.length;++i){if(out[i]==null||"n?(".indexOf(out[i].t)===-1&&i!==decpt)continue;j=out[i].v.indexOf(".")>-1&&i===decpt?out[i].v.indexOf(".")+1:0;vv=out[i].v.substr(0,j);for(;j<out[i].v.length;++j){if(jj<ostr.length)vv+=ostr[jj++]}out[i].v=vv;out[i].t="t";lasti=i}}}for(i=0;i<out.length;++i)if(out[i]!=null&&"n(?".indexOf(out[i].t)>-1){myv=flen>1&&v<0&&i>0&&out[i-1].v==="-"?-v:v;out[i].v=write_num(out[i].t,out[i].v,myv);out[i].t="t"}var retval="";for(i=0;i!==out.length;++i)if(out[i]!=null)retval+=out[i].v;return retval}SSF._eval=eval_fmt;var cfregex=/\[[=<>]/;var cfregex2=/\[([=<>]*)(-?\d+\.?\d*)\]/;function chkcond(v,rr){if(rr==null)return false;var thresh=parseFloat(rr[2]);switch(rr[1]){case"=":if(v==thresh)return true;break;case">":if(v>thresh)return true;break;case"<":if(v<thresh)return true;break;case"<>":if(v!=thresh)return true;break;case">=":if(v>=thresh)return true;break;case"<=":if(v<=thresh)return true;break}return false}function choose_fmt(f,v){var fmt=split_fmt(f);var l=fmt.length,lat=fmt[l-1].indexOf("@");if(l<4&&lat>-1)--l;if(fmt.length>4)throw"cannot find right format for |"+fmt+"|";if(typeof v!=="number")return[4,fmt.length===4||lat>-1?fmt[fmt.length-1]:"@"];switch(fmt.length){case 1:fmt=lat>-1?["General","General","General",fmt[0]]:[fmt[0],fmt[0],fmt[0],"@"];break;case 2:fmt=lat>-1?[fmt[0],fmt[0],fmt[0],fmt[1]]:[fmt[0],fmt[1],fmt[0],"@"];break;case 3:fmt=lat>-1?[fmt[0],fmt[1],fmt[0],fmt[2]]:[fmt[0],fmt[1],fmt[2],"@"];break;case 4:break}var ff=v>0?fmt[0]:v<0?fmt[1]:fmt[2];if(fmt[0].indexOf("[")===-1&&fmt[1].indexOf("[")===-1)return[l,ff];if(fmt[0].match(cfregex)!=null||fmt[1].match(cfregex)!=null){var m1=fmt[0].match(cfregex2);var m2=fmt[1].match(cfregex2);return chkcond(v,m1)?[l,fmt[0]]:chkcond(v,m2)?[l,fmt[1]]:[l,fmt[m1!=null&&m2!=null?2:1]]}return[l,ff]}function format(fmt,v,o){fixopts(o!=null?o:o=[]);var sfmt="";switch(typeof fmt){case"string":sfmt=fmt;break;case"number":sfmt=(o.table!=null?o.table:table_fmt)[fmt];break}if(isgeneral(sfmt,0))return general_fmt(v,o);var f=choose_fmt(sfmt,v);if(isgeneral(f[1]))return general_fmt(v,o);if(v===true)v="TRUE";else if(v===false)v="FALSE";else if(v===""||v==null)return"";return eval_fmt(f[1],v,o,f[0])}SSF._table=table_fmt;SSF.load=function load_entry(fmt,idx){table_fmt[idx]=fmt};SSF.format=format;SSF.get_table=function get_table(){return table_fmt};SSF.load_table=function load_table(tbl){for(var i=0;i!=392;++i)if(tbl[i]!==undefined)SSF.load(tbl[i],i)}};make_ssf(SSF);{var VT_EMPTY=0;var VT_NULL=1;var VT_I2=2;var VT_I4=3;var VT_R4=4;var VT_R8=5;var VT_CY=6;var VT_DATE=7;var VT_BSTR=8;var VT_ERROR=10;var VT_BOOL=11;var VT_VARIANT=12;var VT_DECIMAL=14;var VT_I1=16;var VT_UI1=17;var VT_UI2=18;var VT_UI4=19;var VT_I8=20;var VT_UI8=21;var VT_INT=22;var VT_UINT=23;var VT_LPSTR=30;var VT_LPWSTR=31;var VT_FILETIME=64;var VT_BLOB=65;var VT_STREAM=66;var VT_STORAGE=67;var VT_STREAMED_Object=68; |
18579 dosTime, | 18559 var VT_STORED_Object=69;var VT_BLOB_Object=70;var VT_CF=71;var VT_CLSID=72;var VT_VERSIONED_STREAM=73;var VT_VECTOR=4096;var VT_ARRAY=8192;var VT_STRING=80;var VT_USTR=81;var VT_CUSTOM=[VT_STRING,VT_USTR]}var DocSummaryPIDDSI={1:{n:"CodePage",t:VT_I2},2:{n:"Category",t:VT_STRING},3:{n:"PresentationFormat",t:VT_STRING},4:{n:"ByteCount",t:VT_I4},5:{n:"LineCount",t:VT_I4},6:{n:"ParagraphCount",t:VT_I4},7:{n:"SlideCount",t:VT_I4},8:{n:"NoteCount",t:VT_I4},9:{n:"HiddenCount",t:VT_I4},10:{n:"MultimediaClipCount",t:VT_I4},11:{n:"Scale",t:VT_BOOL},12:{n:"HeadingPair",t:VT_VECTOR|VT_VARIANT},13:{n:"DocParts",t:VT_VECTOR|VT_LPSTR},14:{n:"Manager",t:VT_STRING},15:{n:"Company",t:VT_STRING},16:{n:"LinksDirty",t:VT_BOOL},17:{n:"CharacterCount",t:VT_I4},19:{n:"SharedDoc",t:VT_BOOL},22:{n:"HLinksChanged",t:VT_BOOL},23:{n:"AppVersion",t:VT_I4,p:"version"},26:{n:"ContentType",t:VT_STRING},27:{n:"ContentStatus",t:VT_STRING},28:{n:"Language",t:VT_STRING},29:{n:"Version",t:VT_STRING},255:{}};var SummaryPIDSI={1:{n:"CodePage",t:VT_I2},2:{n:"Title",t:VT_STRING},3:{n:"Subject",t:VT_STRING},4:{n:"Author",t:VT_STRING},5:{n:"Keywords",t:VT_STRING},6:{n:"Comments",t:VT_STRING},7:{n:"Template",t:VT_STRING},8:{n:"LastAuthor",t:VT_STRING},9:{n:"RevNumber",t:VT_STRING},10:{n:"EditTime",t:VT_FILETIME},11:{n:"LastPrinted",t:VT_FILETIME},12:{n:"CreatedDate",t:VT_FILETIME},13:{n:"ModifiedDate",t:VT_FILETIME},14:{n:"PageCount",t:VT_I4},15:{n:"WordCount",t:VT_I4},16:{n:"CharCount",t:VT_I4},17:{n:"Thumbnail",t:VT_CF},18:{n:"ApplicationName",t:VT_LPSTR},19:{n:"DocumentSecurity",t:VT_I4},255:{}};var SpecialProperties={2147483648:{n:"Locale",t:VT_UI4},2147483651:{n:"Behavior",t:VT_UI4},1768515945:{}};(function(){for(var y in SpecialProperties)if(SpecialProperties.hasOwnProperty(y))DocSummaryPIDDSI[y]=SummaryPIDSI[y]=SpecialProperties[y]})();function parse_FILETIME(blob){var dwLowDateTime=blob.read_shift(4),dwHighDateTime=blob.read_shift(4);return new Date((dwHighDateTime/1e7*Math.pow(2,32)+dwLowDateTime/1e7-11644473600)*1e3).toISOString().replace(/\.000/,"")}function parse_lpstr(blob,type,pad){var str=blob.read_shift(0,"lpstr");if(pad)blob.l+=4-(str.length+1&3)&3;return str}function parse_lpwstr(blob,type,pad){var str=blob.read_shift(0,"lpwstr");if(pad)blob.l+=4-(str.length+1&3)&3;return str}function parse_VtStringBase(blob,stringType,pad){if(stringType===31)return parse_lpwstr(blob);return parse_lpstr(blob,stringType,pad)}function parse_VtString(blob,t,pad){return parse_VtStringBase(blob,t,pad===false?0:4)}function parse_VtUnalignedString(blob,t){if(!t)throw new Error("dafuq?");return parse_VtStringBase(blob,t,0)}function parse_VtVecUnalignedLpstrValue(blob){var length=blob.read_shift(4);var ret=[];for(var i=0;i!=length;++i)ret[i]=blob.read_shift(0,"lpstr");return ret}function parse_VtVecUnalignedLpstr(blob){return parse_VtVecUnalignedLpstrValue(blob)}function parse_VtHeadingPair(blob){var headingString=parse_TypedPropertyValue(blob,VT_USTR);var headerParts=parse_TypedPropertyValue(blob,VT_I4);return[headingString,headerParts]}function parse_VtVecHeadingPairValue(blob){var cElements=blob.read_shift(4);var out=[];for(var i=0;i!=cElements/2;++i)out.push(parse_VtHeadingPair(blob));return out}function parse_VtVecHeadingPair(blob){return parse_VtVecHeadingPairValue(blob)}function parse_dictionary(blob,CodePage){var cnt=blob.read_shift(4);var dict={};for(var j=0;j!=cnt;++j){var pid=blob.read_shift(4);var len=blob.read_shift(4);dict[pid]=blob.read_shift(len,CodePage===1200?"utf16le":"utf8").replace(chr0,"").replace(chr1,"!")}if(blob.l&3)blob.l=blob.l>>2+1<<2;return dict}function parse_BLOB(blob){var size=blob.read_shift(4);var bytes=blob.slice(blob.l,blob.l+size);if(size&3>0)blob.l+=4-(size&3)&3;return bytes}function parse_ClipboardData(blob){var o={};o.Size=blob.read_shift(4);blob.l+=o.Size;return o}function parse_VtVector(blob,cb){}function parse_TypedPropertyValue(blob,type,_opts){var t=blob.read_shift(2),ret,opts=_opts||{};blob.l+=2;if(type!==VT_VARIANT)if(t!==type&&VT_CUSTOM.indexOf(type)===-1)throw new Error("Expected type "+type+" saw "+t);switch(type===VT_VARIANT?t:type){case 2:ret=blob.read_shift(2,"i");if(!opts.raw)blob.l+=2;return ret;case 3:ret=blob.read_shift(4,"i");return ret;case 11:return blob.read_shift(4)!==0;case 19:ret=blob.read_shift(4);return ret;case 30:return parse_lpstr(blob,t,4).replace(chr0,"");case 31:return parse_lpwstr(blob);case 64:return parse_FILETIME(blob);case 65:return parse_BLOB(blob);case 71:return parse_ClipboardData(blob);case 80:return parse_VtString(blob,t,!opts.raw&&4).replace(chr0,"");case 81:return parse_VtUnalignedString(blob,t,4).replace(chr0,"");case 4108:return parse_VtVecHeadingPair(blob);case 4126:return parse_VtVecUnalignedLpstr(blob);default:throw new Error("TypedPropertyValue unrecognized type "+type+" "+t)}}function parse_PropertySet(blob,PIDSI){var start_addr=blob.l;var size=blob.read_shift(4);var NumProps=blob.read_shift(4);var Props=[],i=0;var CodePage=0;var Dictionary=-1,DictObj;for(i=0;i!=NumProps;++i){var PropID=blob.read_shift(4);var Offset=blob.read_shift(4);Props[i]=[PropID,Offset+start_addr]}var PropH={};for(i=0;i!=NumProps;++i){if(blob.l!==Props[i][1]){var fail=true;if(i>0&&PIDSI)switch(PIDSI[Props[i-1][0]].t){case 2:if(blob.l+2===Props[i][1]){blob.l+=2;fail=false}break;case 80:if(blob.l<=Props[i][1]){blob.l=Props[i][1];fail=false}break;case 4108:if(blob.l<=Props[i][1]){blob.l=Props[i][1];fail=false}break}if(!PIDSI&&blob.l<=Props[i][1]){fail=false;blob.l=Props[i][1]}if(fail)throw new Error("Read Error: Expected address "+Props[i][1]+" at "+blob.l+" :"+i)}if(PIDSI){var piddsi=PIDSI[Props[i][0]];PropH[piddsi.n]=parse_TypedPropertyValue(blob,piddsi.t,{raw:true});if(piddsi.p==="version")PropH[piddsi.n]=String(PropH[piddsi.n]>>16)+"."+String(PropH[piddsi.n]&65535);if(piddsi.n=="CodePage")switch(PropH[piddsi.n]){case 0:PropH[piddsi.n]=1252;case 1e4:case 1252:case 874:case 1250:case 1251:case 1253:case 1254:case 1255:case 1256:case 1257:case 1258:case 932:case 936:case 949:case 950:case 1200:case 1201:case 65e3:case-536:case 65001:case-535:set_cp(CodePage=PropH[piddsi.n]);break;default:throw new Error("Unsupported CodePage: "+PropH[piddsi.n])}}else{if(Props[i][0]===1){CodePage=PropH.CodePage=parse_TypedPropertyValue(blob,VT_I2);set_cp(CodePage);if(Dictionary!==-1){var oldpos=blob.l;blob.l=Props[Dictionary][1];DictObj=parse_dictionary(blob,CodePage);blob.l=oldpos}}else if(Props[i][0]===0){if(CodePage===0){Dictionary=i;blob.l=Props[i+1][1];continue}DictObj=parse_dictionary(blob,CodePage)}else{var name=DictObj[Props[i][0]];var val;switch(blob[blob.l]){case 65:blob.l+=4;val=parse_BLOB(blob);break;case 30:blob.l+=4;val=parse_VtString(blob,blob[blob.l-4]);break;case 31:blob.l+=4;val=parse_VtString(blob,blob[blob.l-4]);break;case 3:blob.l+=4;val=blob.read_shift(4,"i");break;case 19:blob.l+=4;val=blob.read_shift(4);break;case 5:blob.l+=4;val=blob.read_shift(8,"f");break;case 11:blob.l+=4;val=parsebool(blob,4);break;case 64:blob.l+=4;val=new Date(parse_FILETIME(blob));break;default:throw new Error("unparsed value: "+blob[blob.l])}PropH[name]=val}}}blob.l=start_addr+size;return PropH}function parse_PropertySetStream(file,PIDSI){var blob=file.content;prep_blob(blob,0);var NumSets,FMTID0,FMTID1,Offset0,Offset1;blob.chk("feff","Byte Order: ");var vers=blob.read_shift(2);var SystemIdentifier=blob.read_shift(4);blob.chk(CFB.utils.consts.HEADER_CLSID,"CLSID: ");NumSets=blob.read_shift(4);if(NumSets!==1&&NumSets!==2)throw"Unrecognized #Sets: "+NumSets;FMTID0=blob.read_shift(16);Offset0=blob.read_shift(4);if(NumSets===1&&Offset0!==blob.l)throw"Length mismatch";else if(NumSets===2){FMTID1=blob.read_shift(16);Offset1=blob.read_shift(4)}var PSet0=parse_PropertySet(blob,PIDSI);var rval={SystemIdentifier:SystemIdentifier};for(var y in PSet0)rval[y]=PSet0[y];rval.FMTID=FMTID0;if(NumSets===1)return rval;if(blob.l!==Offset1)throw"Length mismatch 2: "+blob.l+" !== "+Offset1;var PSet1;try{PSet1=parse_PropertySet(blob,null)}catch(e){}for(y in PSet1)rval[y]=PSet1[y];rval.FMTID=[FMTID0,FMTID1];return rval}var DO_NOT_EXPORT_CFB=true;var CFB=function _CFB(){var exports={};exports.version="0.10.0";function parse(file){var mver=3;var ssz=512;var nmfs=0;var ndfs=0;var dir_start=0;var minifat_start=0;var difat_start=0;var fat_addrs=[];var blob=file.slice(0,512);prep_blob(blob,0);mver=check_get_mver(blob);switch(mver){case 3:ssz=512;break;case 4:ssz=4096;break;default:throw"Major Version: Expected 3 or 4 saw "+mver}if(ssz!==512){blob=file.slice(0,ssz);prep_blob(blob,28)}var header=file.slice(0,ssz);check_shifts(blob,mver);var nds=blob.read_shift(4,"i");if(mver===3&&nds!==0)throw"# Directory Sectors: Expected 0 saw "+nds;blob.l+=4;dir_start=blob.read_shift(4,"i");blob.l+=4;blob.chk("00100000","Mini Stream Cutoff Size: ");minifat_start=blob.read_shift(4,"i");nmfs=blob.read_shift(4,"i");difat_start=blob.read_shift(4,"i");ndfs=blob.read_shift(4,"i");for(var q,j=0;j<109;++j){q=blob.read_shift(4,"i");if(q<0)break;fat_addrs[j]=q}var sectors=sectorify(file,ssz);sleuth_fat(difat_start,ndfs,sectors,ssz,fat_addrs);var sector_list=make_sector_list(sectors,dir_start,fat_addrs,ssz);sector_list[dir_start].name="!Directory";if(nmfs>0&&minifat_start!==ENDOFCHAIN)sector_list[minifat_start].name="!MiniFAT";sector_list[fat_addrs[0]].name="!FAT";var files={},Paths=[],FileIndex=[],FullPaths=[],FullPathDir={};read_directory(dir_start,sector_list,sectors,Paths,nmfs,files,FileIndex);build_full_paths(FileIndex,FullPathDir,FullPaths,Paths);var root_name=Paths.shift();Paths.root=root_name;var find_path=make_find_path(FullPaths,Paths,FileIndex,files,root_name);return{raw:{header:header,sectors:sectors},FileIndex:FileIndex,FullPaths:FullPaths,FullPathDir:FullPathDir,find:find_path}}function check_get_mver(blob){blob.chk(HEADER_SIGNATURE,"Header Signature: ");blob.chk(HEADER_CLSID,"CLSID: ");blob.l+=2;return blob.read_shift(2,"u")}function check_shifts(blob,mver){var shift=9;blob.chk("feff","Byte Order: ");switch(shift=blob.read_shift(2)){case 9:if(mver!==3)throw"MajorVersion/SectorShift Mismatch";break;case 12:if(mver!==4)throw"MajorVersion/SectorShift Mismatch";break;default:throw"Sector Shift: Expected 9 or 12 saw "+shift}blob.chk("0600","Mini Sector Shift: ");blob.chk("000000000000","Reserved: ")}function sectorify(file,ssz){var nsectors=Math.ceil(file.length/ssz)-1;var sectors=new Array(nsectors);for(var i=1;i<nsectors;++i)sectors[i-1]=file.slice(i*ssz,(i+1)*ssz);sectors[nsectors-1]=file.slice(nsectors*ssz);return sectors}function build_full_paths(FI,FPD,FP,Paths){var i=0,L=0,R=0,C=0,j=0,pl=Paths.length;var dad=new Array(pl),q=new Array(pl);for(;i<pl;++i){dad[i]=q[i]=i;FP[i]=Paths[i]}for(;j<q.length;++j){i=q[j];L=FI[i].L;R=FI[i].R;C=FI[i].C;if(dad[i]===i){if(L!==-1&&dad[L]!==L)dad[i]=dad[L];if(R!==-1&&dad[R]!==R)dad[i]=dad[R]}if(C!==-1)dad[C]=i;if(L!==-1){dad[L]=dad[i];q.push(L)}if(R!==-1){dad[R]=dad[i];q.push(R)}}for(i=1;i!==pl;++i)if(dad[i]===i){if(R!==-1&&dad[R]!==R)dad[i]=dad[R];else if(L!==-1&&dad[L]!==L)dad[i]=dad[L]}for(i=1;i<pl;++i){if(FI[i].type===0)continue;j=dad[i];if(j===0)FP[i]=FP[0]+"/"+FP[i];else while(j!==0){FP[i]=FP[j]+"/"+FP[i];j=dad[j]}dad[i]=0}FP[0]+="/";for(i=1;i<pl;++i){if(FI[i].type!==2)FP[i]+="/";FPD[FP[i]]=FI[i]}}function make_find_path(FullPaths,Paths,FileIndex,files,root_name){var UCFullPaths=new Array(FullPaths.length);var UCPaths=new Array(Paths.length),i;for(i=0;i<FullPaths.length;++i)UCFullPaths[i]=FullPaths[i].toUpperCase();for(i=0;i<Paths.length;++i)UCPaths[i]=Paths[i].toUpperCase();return function find_path(path){var k;if(path.charCodeAt(0)===47){k=true;path=root_name+path}else k=path.indexOf("/")!==-1;var UCPath=path.toUpperCase();var w=k===true?UCFullPaths.indexOf(UCPath):UCPaths.indexOf(UCPath);if(w===-1)return null;return k===true?FileIndex[w]:files[Paths[w]]}}function sleuth_fat(idx,cnt,sectors,ssz,fat_addrs){var q;if(idx===ENDOFCHAIN){if(cnt!==0)throw"DIFAT chain shorter than expected"}else if(idx!==-1){var sector=sectors[idx],m=(ssz>>>2)-1;for(var i=0;i<m;++i){if((q=__readInt32LE(sector,i*4))===ENDOFCHAIN)break;fat_addrs.push(q)}sleuth_fat(__readInt32LE(sector,ssz-4),cnt-1,sectors,ssz,fat_addrs)}}function make_sector_list(sectors,dir_start,fat_addrs,ssz){var sl=sectors.length,sector_list=new Array(sl);var chkd=new Array(sl),buf,buf_chain;var modulus=ssz-1,i,j,k,jj;for(i=0;i<sl;++i){buf=[];k=i+dir_start;if(k>=sl)k-=sl;if(chkd[k]===true)continue;buf_chain=[];for(j=k;j>=0;){chkd[j]=true;buf[buf.length]=j;buf_chain.push(sectors[j]);var addr=fat_addrs[Math.floor(j*4/ssz)];jj=j*4&modulus;if(ssz<4+jj)throw"FAT boundary crossed: "+j+" 4 "+ssz;j=__readInt32LE(sectors[addr],jj)}sector_list[k]={nodes:buf,data:__toBuffer([buf_chain])}}return sector_list}function read_directory(dir_start,sector_list,sectors,Paths,nmfs,files,FileIndex){var blob;var minifat_store=0,pl=Paths.length?2:0;var sector=sector_list[dir_start].data;var i=0,namelen=0,name,o,ctime,mtime;for(;i<sector.length;i+=128){blob=sector.slice(i,i+128);prep_blob(blob,64);namelen=blob.read_shift(2);if(namelen===0)continue;name=__utf16le(blob,0,namelen-pl).replace(chr0,"").replace(chr1,"!");Paths.push(name);o={name:name,type:blob.read_shift(1),color:blob.read_shift(1),L:blob.read_shift(4,"i"),R:blob.read_shift(4,"i"),C:blob.read_shift(4,"i"),clsid:blob.read_shift(16),state:blob.read_shift(4,"i")};ctime=blob.read_shift(2)+blob.read_shift(2)+blob.read_shift(2)+blob.read_shift(2);if(ctime!==0){o.ctime=ctime;o.ct=read_date(blob,blob.l-8)}mtime=blob.read_shift(2)+blob.read_shift(2)+blob.read_shift(2)+blob.read_shift(2);if(mtime!==0){o.mtime=mtime;o.mt=read_date(blob,blob.l-8)}o.start=blob.read_shift(4,"i");o.size=blob.read_shift(4,"i");if(o.type===5){minifat_store=o.start;if(nmfs>0&&minifat_store!==ENDOFCHAIN)sector_list[minifat_store].name="!StreamData"}else if(o.size>=4096){o.storage="fat";if(sector_list[o.start]===undefined)if((o.start+=dir_start)>=sectors.length)o.start-=sectors.length;sector_list[o.start].name=o.name;o.content=sector_list[o.start].data.slice(0,o.size);prep_blob(o.content,0)}else{o.storage="minifat";if(minifat_store!==ENDOFCHAIN&&o.start!==ENDOFCHAIN){o.content=sector_list[minifat_store].data.slice(o.start*MSSZ,o.start*MSSZ+o.size);prep_blob(o.content,0)}}files[name]=o;FileIndex.push(o)}}function read_date(blob,offset){return new Date((__readUInt32LE(blob,offset+4)/1e7*Math.pow(2,32)+__readUInt32LE(blob,offset)/1e7-11644473600)*1e3)}var fs;function readFileSync(filename){if(fs===undefined)fs=require("fs");return parse(fs.readFileSync(filename))}function readSync(blob,options){switch(options!==undefined&&options.type!==undefined?options.type:"base64"){case"file":return readFileSync(blob);case"base64":return parse(s2a(Base64.decode(blob)));case"binary":return parse(s2a(blob))}return parse(blob)}var MSSZ=64;var ENDOFCHAIN=-2;var HEADER_SIGNATURE="d0cf11e0a1b11ae1";var HEADER_CLSID="00000000000000000000000000000000";var consts={MAXREGSECT:-6,DIFSECT:-4,FATSECT:-3,ENDOFCHAIN:ENDOFCHAIN,FREESECT:-1,HEADER_SIGNATURE:HEADER_SIGNATURE,HEADER_MINOR_VERSION:"3e00",MAXREGSID:-6,NOSTREAM:-1,HEADER_CLSID:HEADER_CLSID,EntryTypes:["unknown","storage","stream","lockbytes","property","root"]};exports.read=readSync;exports.parse=parse;exports.utils={ReadShift:ReadShift,CheckField:CheckField,prep_blob:prep_blob,bconcat:bconcat,consts:consts};return exports}();if(typeof require!=="undefined"&&typeof module!=="undefined"&&typeof DO_NOT_EXPORT_CFB==="undefined"){module.exports=CFB}function parsenoop(blob,length){blob.read_shift(length);return}function parsenoop2(blob,length){blob.read_shift(length);return null}function parslurp(blob,length,cb){var arr=[],target=blob.l+length;while(blob.l<target)arr.push(cb(blob,target-blob.l));if(target!==blob.l)throw new Error("Slurp error");return arr}function parslurp2(blob,length,cb){var arr=[],target=blob.l+length,len=blob.read_shift(2);while(len--!==0)arr.push(cb(blob,target-blob.l));if(target!==blob.l)throw new Error("Slurp error");return arr}function parsebool(blob,length){return blob.read_shift(length)===1}function parseuint16(blob){return blob.read_shift(2,"u")}function parseuint16a(blob,length){return parslurp(blob,length,parseuint16)}var parse_Boolean=parsebool;function parse_Bes(blob){var v=blob.read_shift(1),t=blob.read_shift(1);return t===1?BERR[v]:v===1}function parse_ShortXLUnicodeString(blob,length,opts){var cch=blob.read_shift(1);var width=1,encoding="sbcs";if(opts===undefined||opts.biff!==5){var fHighByte=blob.read_shift(1);if(fHighByte){width=2;encoding="dbcs"}}return cch?blob.read_shift(cch,encoding):""}function parse_XLUnicodeRichExtendedString(blob){var cch=blob.read_shift(2),flags=blob.read_shift(1);var fHighByte=flags&1,fExtSt=flags&4,fRichSt=flags&8;var width=1+(flags&1);var cRun,cbExtRst;var z={};if(fRichSt)cRun=blob.read_shift(2);if(fExtSt)cbExtRst=blob.read_shift(4);var encoding=flags&1?"dbcs":"sbcs";var msg=cch===0?"":blob.read_shift(cch,encoding);if(fRichSt)blob.l+=4*cRun;if(fExtSt)blob.l+=cbExtRst;z.t=msg;if(!fRichSt){z.raw="<t>"+z.t+"</t>";z.r=z.t}return z}function parse_XLUnicodeStringNoCch(blob,cch,opts){var retval;var fHighByte=blob.read_shift(1);if(fHighByte===0){retval=blob.read_shift(cch,"sbcs")}else{retval=blob.read_shift(cch,"dbcs")}return retval}function parse_XLUnicodeString(blob,length,opts){var cch=blob.read_shift(opts!==undefined&&opts.biff===5?1:2);if(cch===0){blob.l++;return""}return parse_XLUnicodeStringNoCch(blob,cch,opts)}function parse_XLUnicodeString2(blob,length,opts){if(opts.biff!==5)return parse_XLUnicodeString(blob,length,opts);var cch=blob.read_shift(1);if(cch===0){blob.l++;return""}return blob.read_shift(cch,"sbcs")}function parse_Xnum(blob){return blob.read_shift(8,"f")}var parse_ControlInfo=parsenoop;var parse_URLMoniker=function(blob,length){var len=blob.read_shift(4),start=blob.l;var extra=false;if(len>24){blob.l+=len-24;if(blob.read_shift(16)==="795881f43b1d7f48af2c825dc4852763")extra=true;blob.l=start}var url=blob.read_shift((extra?len-24:len)>>1,"utf16le").replace(chr0,"");if(extra)blob.l+=24;return url};var parse_FileMoniker=function(blob,length){var cAnti=blob.read_shift(2);var ansiLength=blob.read_shift(4);var ansiPath=blob.read_shift(ansiLength,"cstr");var endServer=blob.read_shift(2);var versionNumber=blob.read_shift(2);var cbUnicodePathSize=blob.read_shift(4);if(cbUnicodePathSize===0)return ansiPath.replace(/\\/g,"/");var cbUnicodePathBytes=blob.read_shift(4);var usKeyValue=blob.read_shift(2);var unicodePath=blob.read_shift(cbUnicodePathBytes>>1,"utf16le").replace(chr0,"");return unicodePath};var parse_HyperlinkMoniker=function(blob,length){var clsid=blob.read_shift(16);length-=16;switch(clsid){case"e0c9ea79f9bace118c8200aa004ba90b":return parse_URLMoniker(blob,length);case"0303000000000000c000000000000046":return parse_FileMoniker(blob,length);default:throw"unsupported moniker "+clsid}};var parse_HyperlinkString=function(blob,length){var len=blob.read_shift(4);var o=blob.read_shift(len,"utf16le").replace(chr0,"");return o};var parse_Hyperlink=function(blob,length){var end=blob.l+length;var sVer=blob.read_shift(4);if(sVer!==2)throw new Error("Unrecognized streamVersion: "+sVer);var flags=blob.read_shift(2);blob.l+=2;var displayName,targetFrameName,moniker,oleMoniker,location,guid,fileTime;if(flags&16)displayName=parse_HyperlinkString(blob,end-blob.l);if(flags&128)targetFrameName=parse_HyperlinkString(blob,end-blob.l);if((flags&257)===257)moniker=parse_HyperlinkString(blob,end-blob.l);if((flags&257)===1)oleMoniker=parse_HyperlinkMoniker(blob,end-blob.l);if(flags&8)location=parse_HyperlinkString(blob,end-blob.l);if(flags&32)guid=blob.read_shift(16);if(flags&64)fileTime=parse_FILETIME(blob,8);blob.l=end;var target=targetFrameName||moniker||oleMoniker;if(location)target+="#"+location;return{Target:target}};function isval(x){return x!==undefined&&x!==null}function keys(o){return Object.keys(o)}function evert(obj,arr){var o={};var K=keys(obj);for(var i=0;i<K.length;++i){var k=K[i];if(!arr)o[obj[k]]=k;else(o[obj[k]]=o[obj[k]]||[]).push(k)}return o}function parse_Cell(blob,length){var rw=blob.read_shift(2);var col=blob.read_shift(2);var ixfe=blob.read_shift(2);return{r:rw,c:col,ixfe:ixfe}}function parse_frtHeader(blob){var rt=blob.read_shift(2);var flags=blob.read_shift(2);blob.l+=8;return{type:rt,flags:flags}}function parse_OptXLUnicodeString(blob,length,opts){return length===0?"":parse_XLUnicodeString2(blob,length,opts)}var HIDEOBJENUM=["SHOWALL","SHOWPLACEHOLDER","HIDEALL"];var parse_HideObjEnum=parseuint16;function parse_XTI(blob,length){var iSupBook=blob.read_shift(2),itabFirst=blob.read_shift(2,"i"),itabLast=blob.read_shift(2,"i");return[iSupBook,itabFirst,itabLast]}function parse_RkNumber(blob){var b=blob.slice(blob.l,blob.l+4);var fX100=b[0]&1,fInt=b[0]&2;blob.l+=4;b[0]&=~3;var RK=fInt===0?__double([0,0,0,0,b[0],b[1],b[2],b[3]],0):__readInt32LE(b,0)>>2;return fX100?RK/100:RK}function parse_RkRec(blob,length){var ixfe=blob.read_shift(2);var RK=parse_RkNumber(blob);return[ixfe,RK]}function parse_AddinUdf(blob,length){blob.l+=4;length-=4;var l=blob.l+length;var udfName=parse_ShortXLUnicodeString(blob,length);var cb=blob.read_shift(2);l-=blob.l;if(cb!==l)throw"Malformed AddinUdf: padding = "+l+" != "+cb;blob.l+=cb;return udfName}function parse_Ref8U(blob,length){var rwFirst=blob.read_shift(2);var rwLast=blob.read_shift(2);var colFirst=blob.read_shift(2);var colLast=blob.read_shift(2);return{s:{c:colFirst,r:rwFirst},e:{c:colLast,r:rwLast}}}function parse_RefU(blob,length){var rwFirst=blob.read_shift(2);var rwLast=blob.read_shift(2);var colFirst=blob.read_shift(1);var colLast=blob.read_shift(1);return{s:{c:colFirst,r:rwFirst},e:{c:colLast,r:rwLast}}}var parse_Ref=parse_RefU;function parse_FtCmo(blob,length){blob.l+=4;var ot=blob.read_shift(2);var id=blob.read_shift(2);var flags=blob.read_shift(2);blob.l+=12;return[id,ot,flags]}function parse_FtNts(blob,length){var out={};blob.l+=4;blob.l+=16;out.fSharedNote=blob.read_shift(2);blob.l+=4;return out}function parse_FtCf(blob,length){var out={};blob.l+=4;blob.cf=blob.read_shift(2);return out}var FtTab={21:parse_FtCmo,19:parsenoop,18:function(blob,length){blob.l+=12},17:function(blob,length){blob.l+=8},16:parsenoop,15:parsenoop,13:parse_FtNts,12:function(blob,length){blob.l+=24},11:function(blob,length){blob.l+=10},10:function(blob,length){blob.l+=16},9:parsenoop,8:function(blob,length){blob.l+=6},7:parse_FtCf,6:function(blob,length){blob.l+=6},4:parsenoop,0:function(blob,length){blob.l+=4}};function parse_FtArray(blob,length,ot){var s=blob.l;var fts=[];while(blob.l<s+length){var ft=blob.read_shift(2);blob.l-=2;try{fts.push(FtTab[ft](blob,s+length-blob.l))}catch(e){blob.l=s+length;return fts}}if(blob.l!=s+length)blob.l=s+length;return fts}var parse_FontIndex=parseuint16;function parse_BOF(blob,length){var o={};o.BIFFVer=blob.read_shift(2);length-=2;if(o.BIFFVer!==1536&&o.BIFFVer!==1280)throw"Unexpected BIFF Ver "+o.BIFFVer;blob.read_shift(length);return o}function parse_InterfaceHdr(blob,length){if(length===0)return 1200;var q;if((q=blob.read_shift(2))!==1200)throw"InterfaceHdr codePage "+q;return 1200}function parse_WriteAccess(blob,length,opts){if(opts.enc){blob.l+=length;return""}var l=blob.l;var UserName=parse_XLUnicodeString(blob,0,opts);blob.read_shift(length+l-blob.l);return UserName}function parse_BoundSheet8(blob,length,opts){var pos=blob.read_shift(4);var hidden=blob.read_shift(1)>>6;var dt=blob.read_shift(1);switch(dt){case 0:dt="Worksheet";break;case 1:dt="Macrosheet";break;case 2:dt="Chartsheet";break;case 6:dt="VBAModule";break}var name=parse_ShortXLUnicodeString(blob,0,opts);return{pos:pos,hs:hidden,dt:dt,name:name}}function parse_SST(blob,length){var cnt=blob.read_shift(4);var ucnt=blob.read_shift(4);var strs=[];for(var i=0;i!=ucnt;++i){strs.push(parse_XLUnicodeRichExtendedString(blob))}strs.Count=cnt;strs.Unique=ucnt;return strs}function parse_ExtSST(blob,length){var extsst={};extsst.dsst=blob.read_shift(2);blob.l+=length-2;return extsst}function parse_Row(blob,length){var rw=blob.read_shift(2),col=blob.read_shift(2),Col=blob.read_shift(2),rht=blob.read_shift(2);blob.read_shift(4);var flags=blob.read_shift(1);blob.read_shift(1);blob.read_shift(2);return{r:rw,c:col,cnt:Col-col}}function parse_ForceFullCalculation(blob,length){var header=parse_frtHeader(blob);if(header.type!=2211)throw"Invalid Future Record "+header.type;var fullcalc=blob.read_shift(4);return fullcalc!==0}var parse_CompressPictures=parsenoop2;function parse_RecalcId(blob,length){blob.read_shift(2);return blob.read_shift(4)}function parse_DefaultRowHeight(blob,length){var f=blob.read_shift(2),miyRw;miyRw=blob.read_shift(2);var fl={Unsynced:f&1,DyZero:(f&2)>>1,ExAsc:(f&4)>>2,ExDsc:(f&8)>>3};return[fl,miyRw]}function parse_Window1(blob,length){var xWn=blob.read_shift(2),yWn=blob.read_shift(2),dxWn=blob.read_shift(2),dyWn=blob.read_shift(2);var flags=blob.read_shift(2),iTabCur=blob.read_shift(2),iTabFirst=blob.read_shift(2);var ctabSel=blob.read_shift(2),wTabRatio=blob.read_shift(2);return{Pos:[xWn,yWn],Dim:[dxWn,dyWn],Flags:flags,CurTab:iTabCur,FirstTab:iTabFirst,Selected:ctabSel,TabRatio:wTabRatio}}function parse_Font(blob,length,opts){blob.l+=14;var name=parse_ShortXLUnicodeString(blob,0,opts);return name}function parse_LabelSst(blob,length){var cell=parse_Cell(blob);cell.isst=blob.read_shift(4);return cell}function parse_Label(blob,length,opts){var cell=parse_Cell(blob,6);var str=parse_XLUnicodeString(blob,length-6,opts);cell.val=str;return cell}function parse_Format(blob,length,opts){var ifmt=blob.read_shift(2);var fmtstr=parse_XLUnicodeString2(blob,0,opts);return[ifmt,fmtstr]}function parse_Dimensions(blob,length){var w=length===10?2:4;var r=blob.read_shift(w),R=blob.read_shift(w),c=blob.read_shift(2),C=blob.read_shift(2);blob.l+=2;return{s:{r:r,c:c},e:{r:R,c:C}}}function parse_RK(blob,length){var rw=blob.read_shift(2),col=blob.read_shift(2);var rkrec=parse_RkRec(blob);return{r:rw,c:col,ixfe:rkrec[0],rknum:rkrec[1]}}function parse_MulRk(blob,length){var target=blob.l+length-2;var rw=blob.read_shift(2),col=blob.read_shift(2);var rkrecs=[];while(blob.l<target)rkrecs.push(parse_RkRec(blob));if(blob.l!==target)throw"MulRK read error";var lastcol=blob.read_shift(2);if(rkrecs.length!=lastcol-col+1)throw"MulRK length mismatch";return{r:rw,c:col,C:lastcol,rkrec:rkrecs}}var parse_CellXF=parsenoop;var parse_StyleXF=parsenoop;function parse_XF(blob,length){var o={};o.ifnt=blob.read_shift(2);o.ifmt=blob.read_shift(2);o.flags=blob.read_shift(2);o.fStyle=o.flags>>2&1;length-=6;o.data=o.fStyle?parse_StyleXF(blob,length):parse_CellXF(blob,length);return o}function parse_Guts(blob,length){blob.l+=4;var out=[blob.read_shift(2),blob.read_shift(2)];if(out[0]!==0)out[0]--;if(out[1]!==0)out[1]--;if(out[0]>7||out[1]>7)throw"Bad Gutters: "+out;return out}function parse_BoolErr(blob,length){var cell=parse_Cell(blob,6);var val=parse_Bes(blob,2);cell.val=val;cell.t=val===true||val===false?"b":"e";return cell}function parse_Number(blob,length){var cell=parse_Cell(blob,6);var xnum=parse_Xnum(blob,8);cell.val=xnum;return cell}var parse_XLHeaderFooter=parse_OptXLUnicodeString;function parse_SupBook(blob,length,opts){var end=blob.l+length;var ctab=blob.read_shift(2);var cch=blob.read_shift(2);var virtPath;if(cch>=1&&cch<=255)virtPath=parse_XLUnicodeStringNoCch(blob,cch);var rgst=blob.read_shift(end-blob.l);opts.sbcch=cch;return[cch,ctab,virtPath,rgst]}function parse_ExternName(blob,length,opts){var flags=blob.read_shift(2);var body;var o={fBuiltIn:flags&1,fWantAdvise:flags>>>1&1,fWantPict:flags>>>2&1,fOle:flags>>>3&1,fOleLink:flags>>>4&1,cf:flags>>>5&1023,fIcon:flags>>>15&1};if(opts.sbcch===14849)body=parse_AddinUdf(blob,length-2);o.body=body||blob.read_shift(length-2);return o}function parse_Lbl(blob,length,opts){if(opts.biff<8)return parse_Label(blob,length,opts);var target=blob.l+length;var flags=blob.read_shift(2);var chKey=blob.read_shift(1);var cch=blob.read_shift(1);var cce=blob.read_shift(2);blob.l+=2;var itab=blob.read_shift(2);blob.l+=4;var name=parse_XLUnicodeStringNoCch(blob,cch,opts);var rgce=parse_NameParsedFormula(blob,target-blob.l,opts,cce);return{chKey:chKey,Name:name,rgce:rgce}}function parse_ExternSheet(blob,length,opts){if(opts.biff<8)return parse_ShortXLUnicodeString(blob,length,opts);var o=parslurp2(blob,length,parse_XTI);var oo=[];if(opts.sbcch===1025){for(var i=0;i!=o.length;++i)oo.push(opts.snames[o[i][1]]);return oo}else return o}function parse_ShrFmla(blob,length,opts){var ref=parse_RefU(blob,6);blob.l++;var cUse=blob.read_shift(1);length-=8;return[parse_SharedParsedFormula(blob,length,opts),cUse]}function parse_Array(blob,length,opts){var ref=parse_Ref(blob,6);blob.l+=6;length-=12;return[ref,parse_ArrayParsedFormula(blob,length,opts,ref)]}function parse_MTRSettings(blob,length){var fMTREnabled=blob.read_shift(4)!==0;var fUserSetThreadCount=blob.read_shift(4)!==0;var cUserThreadCount=blob.read_shift(4);return[fMTREnabled,fUserSetThreadCount,cUserThreadCount]}function parse_NoteSh(blob,length,opts){if(opts.biff<8)return;var row=blob.read_shift(2),col=blob.read_shift(2);var flags=blob.read_shift(2),idObj=blob.read_shift(2);var stAuthor=parse_XLUnicodeString2(blob,0,opts);if(opts.biff<8)blob.read_shift(1);return[{r:row,c:col},stAuthor,idObj,flags]}function parse_Note(blob,length,opts){return parse_NoteSh(blob,length,opts)}function parse_MergeCells(blob,length){var merges=[];var cmcs=blob.read_shift(2);while(cmcs--)merges.push(parse_Ref8U(blob,length));return merges}function parse_Obj(blob,length){var cmo=parse_FtCmo(blob,22);var fts=parse_FtArray(blob,length-22,cmo[1]);return{cmo:cmo,ft:fts}}function parse_TxO(blob,length,opts){var s=blob.l;try{blob.l+=4;var ot=(opts.lastobj||{cmo:[0,0]}).cmo[1];var controlInfo;if([0,5,7,11,12,14].indexOf(ot)==-1)blob.l+=6;else controlInfo=parse_ControlInfo(blob,6,opts);var cchText=blob.read_shift(2);var cbRuns=blob.read_shift(2);var ifntEmpty=parse_FontIndex(blob,2);var len=blob.read_shift(2);blob.l+=len;var texts="";for(var i=1;i<blob.lens.length-1;++i){if(blob.l-s!=blob.lens[i])throw"TxO: bad continue record";var hdr=blob[blob.l];var t=parse_XLUnicodeStringNoCch(blob,blob.lens[i+1]-blob.lens[i]-1);texts+=t;if(texts.length>=(hdr?cchText:2*cchText))break}if(texts.length!==cchText&&texts.length!==cchText*2){throw"cchText: "+cchText+" != "+texts.length}blob.l=s+length;return{t:texts}}catch(e){blob.l=s+length;return{t:texts||""}}}var parse_HLink=function(blob,length){var ref=parse_Ref8U(blob,8);blob.l+=16;var hlink=parse_Hyperlink(blob,length-24);return[ref,hlink]};var parse_HLinkTooltip=function(blob,length){var end=blob.l+length;blob.read_shift(2);var ref=parse_Ref8U(blob,8);var wzTooltip=blob.read_shift((length-10)/2,"dbcs");wzTooltip=wzTooltip.replace(chr0,"");return[ref,wzTooltip]};function parse_Country(blob,length){var o=[],d;d=blob.read_shift(2);o[0]=CountryEnum[d]||d;d=blob.read_shift(2);o[1]=CountryEnum[d]||d;return o}var parse_Backup=parsebool;var parse_Blank=parse_Cell;var parse_BottomMargin=parse_Xnum;var parse_BuiltInFnGroupCount=parseuint16;var parse_CalcCount=parseuint16;var parse_CalcDelta=parse_Xnum;var parse_CalcIter=parsebool;var parse_CalcMode=parseuint16;var parse_CalcPrecision=parsebool;var parse_CalcRefMode=parsenoop2;var parse_CalcSaveRecalc=parsebool;var parse_CodePage=parseuint16;var parse_Compat12=parsebool;var parse_Date1904=parsebool;var parse_DefColWidth=parseuint16;var parse_DSF=parsenoop2;var parse_EntExU2=parsenoop2;var parse_EOF=parsenoop2;var parse_Excel9File=parsenoop2;var parse_FeatHdr=parsenoop2;var parse_FontX=parseuint16;var parse_Footer=parse_XLHeaderFooter;var parse_GridSet=parseuint16;var parse_HCenter=parsebool;var parse_Header=parse_XLHeaderFooter;var parse_HideObj=parse_HideObjEnum;var parse_InterfaceEnd=parsenoop2;var parse_LeftMargin=parse_Xnum;var parse_Mms=parsenoop2;var parse_ObjProtect=parsebool;var parse_Password=parseuint16;var parse_PrintGrid=parsebool;var parse_PrintRowCol=parsebool;var parse_PrintSize=parseuint16;var parse_Prot4Rev=parsebool;var parse_Prot4RevPass=parseuint16;var parse_Protect=parsebool;var parse_RefreshAll=parsebool;var parse_RightMargin=parse_Xnum; |
18580 dosDate; | 18560 var parse_RRTabId=parseuint16a;var parse_ScenarioProtect=parsebool;var parse_Scl=parseuint16a;var parse_String=parse_XLUnicodeString;var parse_SxBool=parsebool;var parse_TopMargin=parse_Xnum;var parse_UsesELFs=parsebool;var parse_VCenter=parsebool;var parse_WinProtect=parsebool;var parse_WriteProtect=parsenoop;var parse_VerticalPageBreaks=parsenoop;var parse_HorizontalPageBreaks=parsenoop;var parse_Selection=parsenoop;var parse_Continue=parsenoop;var parse_Pane=parsenoop;var parse_Pls=parsenoop;var parse_DCon=parsenoop;var parse_DConRef=parsenoop;var parse_DConName=parsenoop;var parse_XCT=parsenoop;var parse_CRN=parsenoop;var parse_FileSharing=parsenoop;var parse_Uncalced=parsenoop;var parse_Template=parsenoop;var parse_Intl=parsenoop;var parse_ColInfo=parsenoop;var parse_WsBool=parsenoop;var parse_Sort=parsenoop;var parse_Palette=parsenoop;var parse_Sync=parsenoop;var parse_LPr=parsenoop;var parse_DxGCol=parsenoop;var parse_FnGroupName=parsenoop;var parse_FilterMode=parsenoop;var parse_AutoFilterInfo=parsenoop;var parse_AutoFilter=parsenoop;var parse_Setup=parsenoop;var parse_ScenMan=parsenoop;var parse_SCENARIO=parsenoop;var parse_SxView=parsenoop;var parse_Sxvd=parsenoop;var parse_SXVI=parsenoop;var parse_SxIvd=parsenoop;var parse_SXLI=parsenoop;var parse_SXPI=parsenoop;var parse_DocRoute=parsenoop;var parse_RecipName=parsenoop;var parse_MulBlank=parsenoop;var parse_SXDI=parsenoop;var parse_SXDB=parsenoop;var parse_SXFDB=parsenoop;var parse_SXDBB=parsenoop;var parse_SXNum=parsenoop;var parse_SxErr=parsenoop;var parse_SXInt=parsenoop;var parse_SXString=parsenoop;var parse_SXDtr=parsenoop;var parse_SxNil=parsenoop;var parse_SXTbl=parsenoop;var parse_SXTBRGIITM=parsenoop;var parse_SxTbpg=parsenoop;var parse_ObProj=parsenoop;var parse_SXStreamID=parsenoop;var parse_DBCell=parsenoop;var parse_SXRng=parsenoop;var parse_SxIsxoper=parsenoop;var parse_BookBool=parsenoop;var parse_DbOrParamQry=parsenoop;var parse_OleObjectSize=parsenoop;var parse_SXVS=parsenoop;var parse_BkHim=parsenoop;var parse_MsoDrawingGroup=parsenoop;var parse_MsoDrawing=parsenoop;var parse_MsoDrawingSelection=parsenoop;var parse_PhoneticInfo=parsenoop;var parse_SxRule=parsenoop;var parse_SXEx=parsenoop;var parse_SxFilt=parsenoop;var parse_SxDXF=parsenoop;var parse_SxItm=parsenoop;var parse_SxName=parsenoop;var parse_SxSelect=parsenoop;var parse_SXPair=parsenoop;var parse_SxFmla=parsenoop;var parse_SxFormat=parsenoop;var parse_SXVDEx=parsenoop;var parse_SXFormula=parsenoop;var parse_SXDBEx=parsenoop;var parse_RRDInsDel=parsenoop;var parse_RRDHead=parsenoop;var parse_RRDChgCell=parsenoop;var parse_RRDRenSheet=parsenoop;var parse_RRSort=parsenoop;var parse_RRDMove=parsenoop;var parse_RRFormat=parsenoop;var parse_RRAutoFmt=parsenoop;var parse_RRInsertSh=parsenoop;var parse_RRDMoveBegin=parsenoop;var parse_RRDMoveEnd=parsenoop;var parse_RRDInsDelBegin=parsenoop;var parse_RRDInsDelEnd=parsenoop;var parse_RRDConflict=parsenoop;var parse_RRDDefName=parsenoop;var parse_RRDRstEtxp=parsenoop;var parse_LRng=parsenoop;var parse_CUsr=parsenoop;var parse_CbUsr=parsenoop;var parse_UsrInfo=parsenoop;var parse_UsrExcl=parsenoop;var parse_FileLock=parsenoop;var parse_RRDInfo=parsenoop;var parse_BCUsrs=parsenoop;var parse_UsrChk=parsenoop;var parse_UserBView=parsenoop;var parse_UserSViewBegin=parsenoop;var parse_UserSViewEnd=parsenoop;var parse_RRDUserView=parsenoop;var parse_Qsi=parsenoop;var parse_CondFmt=parsenoop;var parse_CF=parsenoop;var parse_DVal=parsenoop;var parse_DConBin=parsenoop;var parse_Lel=parsenoop;var parse_CodeName=parse_XLUnicodeString;var parse_SXFDBType=parsenoop;var parse_ObNoMacros=parsenoop;var parse_Dv=parsenoop;var parse_Index=parsenoop;var parse_Table=parsenoop;var parse_Window2=parsenoop;var parse_Style=parsenoop;var parse_BigName=parsenoop;var parse_ContinueBigName=parsenoop;var parse_WebPub=parsenoop;var parse_QsiSXTag=parsenoop;var parse_DBQueryExt=parsenoop;var parse_ExtString=parsenoop;var parse_TxtQry=parsenoop;var parse_Qsir=parsenoop;var parse_Qsif=parsenoop;var parse_RRDTQSIF=parsenoop;var parse_OleDbConn=parsenoop;var parse_WOpt=parsenoop;var parse_SXViewEx=parsenoop;var parse_SXTH=parsenoop;var parse_SXPIEx=parsenoop;var parse_SXVDTEx=parsenoop;var parse_SXViewEx9=parsenoop;var parse_ContinueFrt=parsenoop;var parse_RealTimeData=parsenoop;var parse_ChartFrtInfo=parsenoop;var parse_FrtWrapper=parsenoop;var parse_StartBlock=parsenoop;var parse_EndBlock=parsenoop;var parse_StartObject=parsenoop;var parse_EndObject=parsenoop;var parse_CatLab=parsenoop;var parse_YMult=parsenoop;var parse_SXViewLink=parsenoop;var parse_PivotChartBits=parsenoop;var parse_FrtFontList=parsenoop;var parse_SheetExt=parsenoop;var parse_BookExt=parsenoop;var parse_SXAddl=parsenoop;var parse_CrErr=parsenoop;var parse_HFPicture=parsenoop;var parse_Feat=parsenoop;var parse_DataLabExt=parsenoop;var parse_DataLabExtContents=parsenoop;var parse_CellWatch=parsenoop;var parse_FeatHdr11=parsenoop;var parse_Feature11=parsenoop;var parse_DropDownObjIds=parsenoop;var parse_ContinueFrt11=parsenoop;var parse_DConn=parsenoop;var parse_List12=parsenoop;var parse_Feature12=parsenoop;var parse_CondFmt12=parsenoop;var parse_CF12=parsenoop;var parse_CFEx=parsenoop;var parse_XFCRC=parsenoop;var parse_XFExt=parsenoop;var parse_AutoFilter12=parsenoop;var parse_ContinueFrt12=parsenoop;var parse_MDTInfo=parsenoop;var parse_MDXStr=parsenoop;var parse_MDXTuple=parsenoop;var parse_MDXSet=parsenoop;var parse_MDXProp=parsenoop;var parse_MDXKPI=parsenoop;var parse_MDB=parsenoop;var parse_PLV=parsenoop;var parse_DXF=parsenoop;var parse_TableStyles=parsenoop;var parse_TableStyle=parsenoop;var parse_TableStyleElement=parsenoop;var parse_StyleExt=parsenoop;var parse_NamePublish=parsenoop;var parse_NameCmt=parsenoop;var parse_SortData=parsenoop;var parse_Theme=parsenoop;var parse_GUIDTypeLib=parsenoop;var parse_FnGrp12=parsenoop;var parse_NameFnGrp12=parsenoop;var parse_HeaderFooter=parsenoop;var parse_CrtLayout12=parsenoop;var parse_CrtMlFrt=parsenoop;var parse_CrtMlFrtContinue=parsenoop;var parse_ShapePropsStream=parsenoop;var parse_TextPropsStream=parsenoop;var parse_RichTextStream=parsenoop;var parse_CrtLayout12A=parsenoop;var parse_Units=parsenoop;var parse_Chart=parsenoop;var parse_Series=parsenoop;var parse_DataFormat=parsenoop;var parse_LineFormat=parsenoop;var parse_MarkerFormat=parsenoop;var parse_AreaFormat=parsenoop;var parse_PieFormat=parsenoop;var parse_AttachedLabel=parsenoop;var parse_SeriesText=parsenoop;var parse_ChartFormat=parsenoop;var parse_Legend=parsenoop;var parse_SeriesList=parsenoop;var parse_Bar=parsenoop;var parse_Line=parsenoop;var parse_Pie=parsenoop;var parse_Area=parsenoop;var parse_Scatter=parsenoop;var parse_CrtLine=parsenoop;var parse_Axis=parsenoop;var parse_Tick=parsenoop;var parse_ValueRange=parsenoop;var parse_CatSerRange=parsenoop;var parse_AxisLine=parsenoop;var parse_CrtLink=parsenoop;var parse_DefaultText=parsenoop;var parse_Text=parsenoop;var parse_ObjectLink=parsenoop;var parse_Frame=parsenoop;var parse_Begin=parsenoop;var parse_End=parsenoop;var parse_PlotArea=parsenoop;var parse_Chart3d=parsenoop;var parse_PicF=parsenoop;var parse_DropBar=parsenoop;var parse_Radar=parsenoop;var parse_Surf=parsenoop;var parse_RadarArea=parsenoop;var parse_AxisParent=parsenoop;var parse_LegendException=parsenoop;var parse_ShtProps=parsenoop;var parse_SerToCrt=parsenoop;var parse_AxesUsed=parsenoop;var parse_SBaseRef=parsenoop;var parse_SerParent=parsenoop;var parse_SerAuxTrend=parsenoop;var parse_IFmtRecord=parsenoop;var parse_Pos=parsenoop;var parse_AlRuns=parsenoop;var parse_BRAI=parsenoop;var parse_SerAuxErrBar=parsenoop;var parse_ClrtClient=parsenoop;var parse_SerFmt=parsenoop;var parse_Chart3DBarShape=parsenoop;var parse_Fbi=parsenoop;var parse_BopPop=parsenoop;var parse_AxcExt=parsenoop;var parse_Dat=parsenoop;var parse_PlotGrowth=parsenoop;var parse_SIIndex=parsenoop;var parse_GelFrame=parsenoop;var parse_BopPopCustom=parsenoop;var parse_Fbi2=parsenoop;function parse_BIFF5String(blob){var len=blob.read_shift(1);return blob.read_shift(len,"sbcs")}var _chr=function(c){return String.fromCharCode(c)};var attregexg=/([\w:]+)=((?:")([^"]*)(?:")|(?:')([^']*)(?:'))/g;var attregex=/([\w:]+)=((?:")(?:[^"]*)(?:")|(?:')(?:[^']*)(?:'))/;function parsexmltag(tag,skip_root){var words=tag.split(/\s+/);var z=[];if(!skip_root)z[0]=words[0];if(words.length===1)return z;var m=tag.match(attregexg),y,j,w,i;if(m)for(i=0;i!=m.length;++i){y=m[i].match(attregex);if((j=y[1].indexOf(":"))===-1)z[y[1]]=y[2].substr(1,y[2].length-2);else{if(y[1].substr(0,6)==="xmlns:")w="xmlns"+y[1].substr(6);else w=y[1].substr(j+1);z[w]=y[2].substr(1,y[2].length-2)}}return z}function parsexmltagobj(tag){var words=tag.split(/\s+/);var z={};if(words.length===1)return z;var m=tag.match(attregexg),y,j,w,i;if(m)for(i=0;i!=m.length;++i){y=m[i].match(attregex);if((j=y[1].indexOf(":"))===-1)z[y[1]]=y[2].substr(1,y[2].length-2);else{if(y[1].substr(0,6)==="xmlns:")w="xmlns"+y[1].substr(6);else w=y[1].substr(j+1);z[w]=y[2].substr(1,y[2].length-2)}}return z}var encodings={""":'"',"'":"'",">":">","<":"<","&":"&"};var rencoding=evert(encodings);var rencstr="&<>'\"".split("");var XML_HEADER='<?xml version="1.0" encoding="UTF-8" standalone="yes"?>\r\n';var OFFCRYPTO={};var make_offcrypto=function(O,_crypto){var crypto;if(typeof _crypto!=="undefined")crypto=_crypto;else if(typeof require!=="undefined"){try{crypto=require("cry"+"pto")}catch(e){crypto=null}}O.rc4=function(key,data){var S=new Array(256);var c=0,i=0,j=0,t=0;for(i=0;i!=256;++i)S[i]=i;for(i=0;i!=256;++i){j=j+S[i]+key[i%key.length].charCodeAt(0)&255;t=S[i];S[i]=S[j];S[j]=t}i=j=0;out=Buffer(data.length);for(c=0;c!=data.length;++c){i=i+1&255;j=(j+S[i])%256;t=S[i];S[i]=S[j];S[j]=t;out[c]=data[c]^S[S[i]+S[j]&255]}return out};if(crypto){O.md5=function(hex){return crypto.createHash("md5").update(hex).digest("hex")}}else{O.md5=function(hex){throw"unimplemented"}}};make_offcrypto(OFFCRYPTO,typeof crypto!=="undefined"?crypto:undefined);function _JS2ANSI(str){if(typeof cptable!=="undefined")return cptable.utils.encode(1252,str);return str.split("").map(function(x){return x.charCodeAt(0)})}function parse_Version(blob,length){var o={};o.Major=blob.read_shift(2);o.Minor=blob.read_shift(2);return o}function parse_EncryptionHeader(blob,length){var o={};o.Flags=blob.read_shift(4);var tmp=blob.read_shift(4);if(tmp!==0)throw"Unrecognized SizeExtra: "+tmp;o.AlgID=blob.read_shift(4);switch(o.AlgID){case 0:case 26625:case 26126:case 26127:case 26128:break;default:throw"Unrecognized encryption algorithm: "+o.AlgID}parsenoop(blob,length-12);return o}function parse_EncryptionVerifier(blob,length){return parsenoop(blob,length)}function parse_RC4CryptoHeader(blob,length){var o={};var vers=o.EncryptionVersionInfo=parse_Version(blob,4);length-=4;if(vers.Minor!=2)throw"unrecognized minor version code: "+vers.Minor;if(vers.Major>4||vers.Major<2)throw"unrecognized major version code: "+vers.Major;o.Flags=blob.read_shift(4);length-=4;var sz=blob.read_shift(4);length-=4;o.EncryptionHeader=parse_EncryptionHeader(blob,sz);length-=sz;o.EncryptionVerifier=parse_EncryptionVerifier(blob,length);return o}function parse_RC4Header(blob,length){var o={};var vers=o.EncryptionVersionInfo=parse_Version(blob,4);length-=4;if(vers.Major!=1||vers.Minor!=1)throw"unrecognized version code "+vers.Major+" : "+vers.Minor;o.Salt=blob.read_shift(16);o.EncryptedVerifier=blob.read_shift(16);o.EncryptedVerifierHash=blob.read_shift(16);return o}function crypto_CreatePasswordVerifier_Method1(Password){var Verifier=0,PasswordArray;var PasswordDecoded=_JS2ANSI(Password);var len=PasswordDecoded.length+1,i,PasswordByte;var Intermediate1,Intermediate2,Intermediate3;PasswordArray=new_buf(len);PasswordArray[0]=PasswordDecoded.length;for(i=1;i!=len;++i)PasswordArray[i]=PasswordDecoded[i-1];for(i=len-1;i>=0;--i){PasswordByte=PasswordArray[i];Intermediate1=(Verifier&16384)===0?0:1;Intermediate2=Verifier<<1&32767;Intermediate3=Intermediate1|Intermediate2;Verifier=Intermediate3^PasswordByte}return Verifier^52811}var crypto_CreateXorArray_Method1=function(){var PadArray=[187,255,255,186,255,255,185,128,0,190,15,0,191,15,0];var InitialCode=[57840,7439,52380,33984,4364,3600,61902,12606,6258,57657,54287,34041,10252,43370,20163];var XorMatrix=[44796,19929,39858,10053,20106,40212,10761,31585,63170,64933,60267,50935,40399,11199,17763,35526,1453,2906,5812,11624,23248,885,1770,3540,7080,14160,28320,56640,55369,41139,20807,41614,21821,43642,17621,28485,56970,44341,19019,38038,14605,29210,60195,50791,40175,10751,21502,43004,24537,18387,36774,3949,7898,15796,31592,63184,47201,24803,49606,37805,14203,28406,56812,17824,35648,1697,3394,6788,13576,27152,43601,17539,35078,557,1114,2228,4456,30388,60776,51953,34243,7079,14158,28316,14128,28256,56512,43425,17251,34502,7597,13105,26210,52420,35241,883,1766,3532,4129,8258,16516,33032,4657,9314,18628];var Ror=function(Byte){return(Byte/2|Byte*128)&255};var XorRor=function(byte1,byte2){return Ror(byte1^byte2)};var CreateXorKey_Method1=function(Password){var XorKey=InitialCode[Password.length-1];var CurrentElement=104;for(var i=Password.length-1;i>=0;--i){var Char=Password[i];for(var j=0;j!=7;++j){if(Char&64)XorKey^=XorMatrix[CurrentElement];Char*=2;--CurrentElement}}return XorKey};return function(password){var Password=_JS2ANSI(password);var XorKey=CreateXorKey_Method1(Password);var Index=Password.length;var ObfuscationArray=new_buf(16);for(var i=0;i!=16;++i)ObfuscationArray[i]=0;var Temp,PasswordLastChar,PadIndex;if((Index&1)===1){Temp=XorKey>>8;ObfuscationArray[Index]=XorRor(PadArray[0],Temp);--Index;Temp=XorKey&255;PasswordLastChar=Password[Password.length-1];ObfuscationArray[Index]=XorRor(PasswordLastChar,Temp)}while(Index>0){--Index;Temp=XorKey>>8;ObfuscationArray[Index]=XorRor(Password[Index],Temp);--Index;Temp=XorKey&255;ObfuscationArray[Index]=XorRor(Password[Index],Temp)}Index=15;PadIndex=15-Password.length;while(PadIndex>0){Temp=XorKey>>8;ObfuscationArray[Index]=XorRor(PadArray[PadIndex],Temp);--Index;--PadIndex;Temp=XorKey&255;ObfuscationArray[Index]=XorRor(Password[Index],Temp);--Index;--PadIndex}return ObfuscationArray}}();var crypto_DecryptData_Method1=function(password,Data,XorArrayIndex,XorArray,O){if(!O)O=Data;if(!XorArray)XorArray=crypto_CreateXorArray_Method1(password);var Index,Value;for(Index=0;Index!=Data.length;++Index){Value=Data[Index];Value^=XorArray[XorArrayIndex];Value=(Value>>5|Value<<3)&255;O[Index]=Value;++XorArrayIndex}return[O,XorArrayIndex,XorArray]};var crypto_MakeXorDecryptor=function(password){var XorArrayIndex=0,XorArray=crypto_CreateXorArray_Method1(password);return function(Data){var O=crypto_DecryptData_Method1(null,Data,XorArrayIndex,XorArray);XorArrayIndex=O[1];return O[0]}};function parse_XORObfuscation(blob,length,opts,out){var o={key:parseuint16(blob),verificationBytes:parseuint16(blob)};if(opts.password)o.verifier=crypto_CreatePasswordVerifier_Method1(opts.password);out.valid=o.verificationBytes===o.verifier;if(out.valid)out.insitu_decrypt=crypto_MakeXorDecryptor(opts.password);return o}function parse_FilePassHeader(blob,length,oo){var o=oo||{};o.Info=blob.read_shift(2);blob.l-=2;if(o.Info===1)o.Data=parse_RC4Header(blob,length);else o.Data=parse_RC4CryptoHeader(blob,length);return o}function parse_FilePass(blob,length,opts){var o={Type:blob.read_shift(2)};if(o.Type)parse_FilePassHeader(blob,length-2,o);else parse_XORObfuscation(blob,length-2,opts,o);return o}function parseread(l){return function(blob,length){blob.l+=l;return}}function parseread1(blob,length){blob.l+=1;return}function parse_ColRelU(blob,length){var c=blob.read_shift(2);return[c&16383,c>>14&1,c>>15&1]}function parse_RgceArea(blob,length){var r=blob.read_shift(2),R=blob.read_shift(2);var c=parse_ColRelU(blob,2);var C=parse_ColRelU(blob,2);return{s:{r:r,c:c[0],cRel:c[1],rRel:c[2]},e:{r:R,c:C[0],cRel:C[1],rRel:C[2]}}}function parse_RgceAreaRel(blob,length){var r=blob.read_shift(2),R=blob.read_shift(2);var c=parse_ColRelU(blob,2);var C=parse_ColRelU(blob,2);return{s:{r:r,c:c[0],cRel:c[1],rRel:c[2]},e:{r:R,c:C[0],cRel:C[1],rRel:C[2]}}}function parse_RgceLoc(blob,length){var r=blob.read_shift(2);var c=parse_ColRelU(blob,2);return{r:r,c:c[0],cRel:c[1],rRel:c[2]}}function parse_RgceLocRel(blob,length){var r=blob.read_shift(2);var cl=blob.read_shift(2);var cRel=(cl&32768)>>15,rRel=(cl&16384)>>14;cl&=16383;if(cRel!==0)while(cl>=256)cl-=256;return{r:r,c:cl,cRel:cRel,rRel:rRel}}function parse_PtgArea(blob,length){var type=(blob[blob.l++]&96)>>5;var area=parse_RgceArea(blob,8);return[type,area]}function parse_PtgArea3d(blob,length){var type=(blob[blob.l++]&96)>>5;var ixti=blob.read_shift(2);var area=parse_RgceArea(blob,8);return[type,ixti,area]}function parse_PtgAreaErr(blob,length){var type=(blob[blob.l++]&96)>>5;blob.l+=8;return[type]}function parse_PtgAreaErr3d(blob,length){var type=(blob[blob.l++]&96)>>5;var ixti=blob.read_shift(2);blob.l+=8;return[type,ixti]}function parse_PtgAreaN(blob,length){var type=(blob[blob.l++]&96)>>5;var area=parse_RgceAreaRel(blob,8);return[type,area]}function parse_PtgArray(blob,length){var type=(blob[blob.l++]&96)>>5;blob.l+=7;return[type]}function parse_PtgAttrBaxcel(blob,length){var bitSemi=blob[blob.l+1]&1;var bitBaxcel=1;blob.l+=4;return[bitSemi,bitBaxcel]}function parse_PtgAttrChoose(blob,length){blob.l+=2;var offset=blob.read_shift(2);var o=[];for(var i=0;i<=offset;++i)o.push(blob.read_shift(2));return o}function parse_PtgAttrGoto(blob,length){var bitGoto=blob[blob.l+1]&255?1:0;blob.l+=2;return[bitGoto,blob.read_shift(2)]}function parse_PtgAttrIf(blob,length){var bitIf=blob[blob.l+1]&255?1:0;blob.l+=2;return[bitIf,blob.read_shift(2)]}function parse_PtgAttrSemi(blob,length){var bitSemi=blob[blob.l+1]&255?1:0;blob.l+=4;return[bitSemi]}function parse_PtgAttrSpaceType(blob,length){var type=blob.read_shift(1),cch=blob.read_shift(1);return[type,cch]}function parse_PtgAttrSpace(blob,length){blob.read_shift(2);return parse_PtgAttrSpaceType(blob,2)}function parse_PtgAttrSpaceSemi(blob,length){blob.read_shift(2);return parse_PtgAttrSpaceType(blob,2)}function parse_PtgRef(blob,length){var ptg=blob[blob.l]&31;var type=(blob[blob.l]&96)>>5;blob.l+=1;var loc=parse_RgceLoc(blob,4);return[type,loc]}function parse_PtgRefN(blob,length){var ptg=blob[blob.l]&31;var type=(blob[blob.l]&96)>>5;blob.l+=1;var loc=parse_RgceLocRel(blob,4);return[type,loc]}function parse_PtgRef3d(blob,length){var ptg=blob[blob.l]&31;var type=(blob[blob.l]&96)>>5;blob.l+=1;var ixti=blob.read_shift(2);var loc=parse_RgceLoc(blob,4);return[type,ixti,loc]}function parse_PtgFunc(blob,length){var ptg=blob[blob.l]&31;var type=(blob[blob.l]&96)>>5;blob.l+=1;var iftab=blob.read_shift(2);return[FtabArgc[iftab],Ftab[iftab]]}function parse_PtgFuncVar(blob,length){blob.l++;var cparams=blob.read_shift(1),tab=parsetab(blob);return[cparams,(tab[0]===0?Ftab:Cetab)[tab[1]]]}function parsetab(blob,length){return[blob[blob.l+1]>>7,blob.read_shift(2)&32767]}var parse_PtgAttrSum=parseread(4);var parse_PtgConcat=parseread1;function parse_PtgExp(blob,length){blob.l++;var row=blob.read_shift(2);var col=blob.read_shift(2);return[row,col]}function parse_PtgErr(blob,length){blob.l++;return BERR[blob.read_shift(1)]}function parse_PtgInt(blob,length){blob.l++;return blob.read_shift(2)}function parse_PtgBool(blob,length){blob.l++;return blob.read_shift(1)!==0}function parse_PtgNum(blob,length){blob.l++;return parse_Xnum(blob,8)}function parse_PtgStr(blob,length){blob.l++;return parse_ShortXLUnicodeString(blob)}function parse_SerAr(blob){var val=[];switch(val[0]=blob.read_shift(1)){case 4:val[1]=parsebool(blob,1)?"TRUE":"FALSE";blob.l+=7;break;case 16:val[1]=BERR[blob[blob.l]];blob.l+=8;break;case 0:blob.l+=8;break;case 1:val[1]=parse_Xnum(blob,8);break;case 2:val[1]=parse_XLUnicodeString(blob);break}return val}function parse_PtgExtraMem(blob,cce){var count=blob.read_shift(2);var out=[];for(var i=0;i!=count;++i)out.push(parse_Ref8U(blob,8));return out}function parse_PtgExtraArray(blob){var cols=1+blob.read_shift(1);var rows=1+blob.read_shift(2);for(var i=0,o=[];i!=rows&&(o[i]=[]);++i)for(var j=0;j!=cols;++j)o[i][j]=parse_SerAr(blob);return o}function parse_PtgName(blob,length){var type=blob.read_shift(1)>>>5&3;var nameindex=blob.read_shift(4);return[type,0,nameindex]}function parse_PtgNameX(blob,length){var type=blob.read_shift(1)>>>5&3;var ixti=blob.read_shift(2);var nameindex=blob.read_shift(4);return[type,ixti,nameindex]}function parse_PtgMemArea(blob,length){var type=blob.read_shift(1)>>>5&3;blob.l+=4;var cce=blob.read_shift(2);return[type,cce]}function parse_PtgMemFunc(blob,length){var type=blob.read_shift(1)>>>5&3;var cce=blob.read_shift(2);return[type,cce]}function parse_PtgRefErr(blob,length){var type=blob.read_shift(1)>>>5&3;blob.l+=4;return[type]}var parse_PtgAdd=parseread1;var parse_PtgDiv=parseread1;var parse_PtgEq=parseread1;var parse_PtgGe=parseread1;var parse_PtgGt=parseread1;var parse_PtgIsect=parseread1;var parse_PtgLe=parseread1;var parse_PtgLt=parseread1;var parse_PtgMissArg=parseread1;var parse_PtgMul=parseread1;var parse_PtgNe=parseread1;var parse_PtgParen=parseread1;var parse_PtgPercent=parseread1;var parse_PtgPower=parseread1;var parse_PtgRange=parseread1;var parse_PtgSub=parseread1;var parse_PtgUminus=parseread1;var parse_PtgUnion=parseread1;var parse_PtgUplus=parseread1;var parse_PtgMemErr=parsenoop;var parse_PtgMemNoMem=parsenoop;var parse_PtgRefErr3d=parsenoop;var parse_PtgTbl=parsenoop;var PtgTypes={1:{n:"PtgExp",f:parse_PtgExp},2:{n:"PtgTbl",f:parse_PtgTbl},3:{n:"PtgAdd",f:parse_PtgAdd},4:{n:"PtgSub",f:parse_PtgSub},5:{n:"PtgMul",f:parse_PtgMul},6:{n:"PtgDiv",f:parse_PtgDiv},7:{n:"PtgPower",f:parse_PtgPower},8:{n:"PtgConcat",f:parse_PtgConcat},9:{n:"PtgLt",f:parse_PtgLt},10:{n:"PtgLe",f:parse_PtgLe},11:{n:"PtgEq",f:parse_PtgEq},12:{n:"PtgGe",f:parse_PtgGe},13:{n:"PtgGt",f:parse_PtgGt},14:{n:"PtgNe",f:parse_PtgNe},15:{n:"PtgIsect",f:parse_PtgIsect},16:{n:"PtgUnion",f:parse_PtgUnion},17:{n:"PtgRange",f:parse_PtgRange},18:{n:"PtgUplus",f:parse_PtgUplus},19:{n:"PtgUminus",f:parse_PtgUminus},20:{n:"PtgPercent",f:parse_PtgPercent},21:{n:"PtgParen",f:parse_PtgParen},22:{n:"PtgMissArg",f:parse_PtgMissArg},23:{n:"PtgStr",f:parse_PtgStr},28:{n:"PtgErr",f:parse_PtgErr},29:{n:"PtgBool",f:parse_PtgBool},30:{n:"PtgInt",f:parse_PtgInt},31:{n:"PtgNum",f:parse_PtgNum},32:{n:"PtgArray",f:parse_PtgArray},33:{n:"PtgFunc",f:parse_PtgFunc},34:{n:"PtgFuncVar",f:parse_PtgFuncVar},35:{n:"PtgName",f:parse_PtgName},36:{n:"PtgRef",f:parse_PtgRef},37:{n:"PtgArea",f:parse_PtgArea},38:{n:"PtgMemArea",f:parse_PtgMemArea},39:{n:"PtgMemErr",f:parse_PtgMemErr},40:{n:"PtgMemNoMem",f:parse_PtgMemNoMem},41:{n:"PtgMemFunc",f:parse_PtgMemFunc},42:{n:"PtgRefErr",f:parse_PtgRefErr},43:{n:"PtgAreaErr",f:parse_PtgAreaErr},44:{n:"PtgRefN",f:parse_PtgRefN},45:{n:"PtgAreaN",f:parse_PtgAreaN},57:{n:"PtgNameX",f:parse_PtgNameX},58:{n:"PtgRef3d",f:parse_PtgRef3d},59:{n:"PtgArea3d",f:parse_PtgArea3d},60:{n:"PtgRefErr3d",f:parse_PtgRefErr3d},61:{n:"PtgAreaErr3d",f:parse_PtgAreaErr3d},255:{}};var PtgDupes={64:32,96:32,65:33,97:33,66:34,98:34,67:35,99:35,68:36,100:36,69:37,101:37,70:38,102:38,71:39,103:39,72:40,104:40,73:41,105:41,74:42,106:42,75:43,107:43,76:44,108:44,77:45,109:45,89:57,121:57,90:58,122:58,91:59,123:59,92:60,124:60,93:61,125:61};(function(){for(var y in PtgDupes)PtgTypes[y]=PtgTypes[PtgDupes[y]]})();var Ptg18={};var Ptg19={1:{n:"PtgAttrSemi",f:parse_PtgAttrSemi},2:{n:"PtgAttrIf",f:parse_PtgAttrIf},4:{n:"PtgAttrChoose",f:parse_PtgAttrChoose},8:{n:"PtgAttrGoto",f:parse_PtgAttrGoto},16:{n:"PtgAttrSum",f:parse_PtgAttrSum},32:{n:"PtgAttrBaxcel",f:parse_PtgAttrBaxcel},64:{n:"PtgAttrSpace",f:parse_PtgAttrSpace},65:{n:"PtgAttrSpaceSemi",f:parse_PtgAttrSpaceSemi},255:{}};var rcregex=/(^|[^A-Za-z])R(\[?)(-?\d+|)\]?C(\[?)(-?\d+|)\]?/g;var rcbase;function rcfunc($$,$1,$2,$3,$4,$5){var R=$3.length>0?parseInt($3,10)|0:0,C=$5.length>0?parseInt($5,10)|0:0;if(C<0&&$4.length===0)C=0;if($4.length>0)C+=rcbase.c;if($2.length>0)R+=rcbase.r;return $1+encode_col(C)+encode_row(R)}function rc_to_a1(fstr,base){rcbase=base;return fstr.replace(rcregex,rcfunc)}function parse_Formula(blob,length,opts){var cell=parse_Cell(blob,6);var val=parse_FormulaValue(blob,8);var flags=blob.read_shift(1);blob.read_shift(1);var chn=blob.read_shift(4);var cbf="";if(opts.biff===5)blob.l+=length-20;else cbf=parse_CellParsedFormula(blob,length-20,opts);return{cell:cell,val:val[0],formula:cbf,shared:flags>>3&1,tt:val[1]}}function parse_FormulaValue(blob){var b;if(__readUInt16LE(blob,blob.l+6)!==65535)return[parse_Xnum(blob),"n"];switch(blob[blob.l]){case 0:blob.l+=8;return["String","s"];case 1:b=blob[blob.l+2]===1;blob.l+=8;return[b,"b"];case 2:b=BERR[blob[blob.l+2]];blob.l+=8;return[b,"e"];case 3:blob.l+=8;return["","s"]}}function parse_RgbExtra(blob,length,rgce,opts){if(opts.biff<8)return parsenoop(blob,length);var target=blob.l+length;var o=[];for(var i=0;i!==rgce.length;++i){switch(rgce[i][0]){case"PtgArray":rgce[i][1]=parse_PtgExtraArray(blob);o.push(rgce[i][1]);break;case"PtgMemArea":rgce[i][2]=parse_PtgExtraMem(blob,rgce[i][1]);o.push(rgce[i][2]);break;default:break}}length=target-blob.l;if(length!==0)o.push(parsenoop(blob,length));return o}function parse_NameParsedFormula(blob,length,opts,cce){var target=blob.l+length;var rgce=parse_Rgce(blob,cce);var rgcb;if(target!==blob.l)rgcb=parse_RgbExtra(blob,target-blob.l,rgce,opts);return[rgce,rgcb]}function parse_CellParsedFormula(blob,length,opts){var target=blob.l+length;var rgcb,cce=blob.read_shift(2);if(cce==65535)return[[],parsenoop(blob,length-2)];var rgce=parse_Rgce(blob,cce);if(length!==cce+2)rgcb=parse_RgbExtra(blob,length-cce-2,rgce,opts);return[rgce,rgcb]}function parse_SharedParsedFormula(blob,length,opts){var target=blob.l+length;var rgcb,cce=blob.read_shift(2);var rgce=parse_Rgce(blob,cce);if(cce==65535)return[[],parsenoop(blob,length-2)];if(length!==cce+2)rgcb=parse_RgbExtra(blob,target-cce-2,rgce,opts);return[rgce,rgcb]}function parse_ArrayParsedFormula(blob,length,opts,ref){var target=blob.l+length;var rgcb,cce=blob.read_shift(2);if(cce==65535)return[[],parsenoop(blob,length-2)];var rgce=parse_Rgce(blob,cce);if(length!==cce+2)rgcb=parse_RgbExtra(blob,target-cce-2,rgce,opts);return[rgce,rgcb]}function parse_Rgce(blob,length){var target=blob.l+length;var R,id,ptgs=[];while(target!=blob.l){length=target-blob.l;id=blob[blob.l];R=PtgTypes[id];if(id===24||id===25){id=blob[blob.l+1];R=(id===24?Ptg18:Ptg19)[id]}if(!R||!R.f){ptgs.push(parsenoop(blob,length))}else{ptgs.push([R.n,R.f(blob,length)])}}return ptgs}function mapper(x){return x.map(function f2(y){return y[1]}).join(",")}function stringify_formula(formula,range,cell,supbooks,opts){if(opts!==undefined&&opts.biff===5)return"BIFF5??";var _range=range!==undefined?range:{s:{c:0,r:0}};var stack=[],e1,e2,type,c,ixti,nameidx,r;if(!formula[0]||!formula[0][0])return"";for(var ff=0,fflen=formula[0].length;ff<fflen;++ff){var f=formula[0][ff];switch(f[0]){case"PtgUminus":stack.push("-"+stack.pop());break;case"PtgUplus":stack.push("+"+stack.pop());break;case"PtgPercent":stack.push(stack.pop()+"%");break;case"PtgAdd":e1=stack.pop();e2=stack.pop();stack.push(e2+"+"+e1);break;case"PtgSub":e1=stack.pop();e2=stack.pop();stack.push(e2+"-"+e1);break;case"PtgMul":e1=stack.pop();e2=stack.pop();stack.push(e2+"*"+e1);break;case"PtgDiv":e1=stack.pop();e2=stack.pop();stack.push(e2+"/"+e1);break;case"PtgPower":e1=stack.pop();e2=stack.pop();stack.push(e2+"^"+e1);break;case"PtgConcat":e1=stack.pop();e2=stack.pop();stack.push(e2+"&"+e1);break;case"PtgLt":e1=stack.pop();e2=stack.pop();stack.push(e2+"<"+e1);break;case"PtgLe":e1=stack.pop();e2=stack.pop();stack.push(e2+"<="+e1);break;case"PtgEq":e1=stack.pop();e2=stack.pop();stack.push(e2+"="+e1);break;case"PtgGe":e1=stack.pop();e2=stack.pop();stack.push(e2+">="+e1);break;case"PtgGt":e1=stack.pop();e2=stack.pop();stack.push(e2+">"+e1);break;case"PtgNe":e1=stack.pop();e2=stack.pop();stack.push(e2+"<>"+e1);break;case"PtgIsect":e1=stack.pop();e2=stack.pop();stack.push(e2+" "+e1);break;case"PtgUnion":e1=stack.pop();e2=stack.pop();stack.push(e2+","+e1);break;case"PtgRange":break;case"PtgAttrChoose":break;case"PtgAttrGoto":break;case"PtgAttrIf":break;case"PtgRef":type=f[1][0];c=shift_cell(decode_cell(encode_cell(f[1][1])),_range);stack.push(encode_cell(c));break;case"PtgRefN":type=f[1][0];c=shift_cell(decode_cell(encode_cell(f[1][1])),cell);stack.push(encode_cell(c));break;case"PtgRef3d":type=f[1][0];ixti=f[1][1];c=shift_cell(f[1][2],_range);stack.push(supbooks[1][ixti+1]+"!"+encode_cell(c));break;case"PtgFunc":case"PtgFuncVar":var argc=f[1][0],func=f[1][1];if(!argc)argc=0;var args=stack.slice(-argc);stack.length-=argc;if(func==="User")func=args.shift();stack.push(func+"("+args.join(",")+")");break;case"PtgBool":stack.push(f[1]?"TRUE":"FALSE");break;case"PtgInt":stack.push(f[1]);break;case"PtgNum":stack.push(String(f[1]));break;case"PtgStr":stack.push('"'+f[1]+'"');break;case"PtgErr":stack.push(f[1]);break;case"PtgArea":type=f[1][0];r=shift_range(f[1][1],_range);stack.push(encode_range(r));break;case"PtgArea3d":type=f[1][0];ixti=f[1][1];r=f[1][2];stack.push(supbooks[1][ixti+1]+"!"+encode_range(r));break;case"PtgAttrSum":stack.push("SUM("+stack.pop()+")");break;case"PtgAttrSemi":break;case"PtgName":nameidx=f[1][2];var lbl=supbooks[0][nameidx];var name=lbl.Name;if(name in XLSXFutureFunctions)name=XLSXFutureFunctions[name];stack.push(name);break;case"PtgNameX":var bookidx=f[1][1];nameidx=f[1][2];var externbook;if(supbooks[bookidx+1])externbook=supbooks[bookidx+1][nameidx];else if(supbooks[bookidx-1])externbook=supbooks[bookidx-1][nameidx];if(!externbook)externbook={body:"??NAMEX??"};stack.push(externbook.body);break;case"PtgParen":stack.push("("+stack.pop()+")");break;case"PtgRefErr":stack.push("#REF!");break;case"PtgExp":c={c:f[1][1],r:f[1][0]};var q={c:cell.c,r:cell.r};if(supbooks.sharedf[encode_cell(c)]){var parsedf=supbooks.sharedf[encode_cell(c)];stack.push(stringify_formula(parsedf,_range,q,supbooks,opts))}else{var fnd=false;for(e1=0;e1!=supbooks.arrayf.length;++e1){e2=supbooks.arrayf[e1];if(c.c<e2[0].s.c||c.c>e2[0].e.c)continue;if(c.r<e2[0].s.r||c.r>e2[0].e.r)continue;stack.push(stringify_formula(e2[1],_range,q,supbooks,opts))}if(!fnd)stack.push(f[1])}break;case"PtgArray":stack.push("{"+f[1].map(mapper).join(";")+"}");break;case"PtgMemArea":break;case"PtgAttrSpace":break;case"PtgTbl":break;case"PtgMemErr":break;case"PtgMissArg":stack.push("");break;case"PtgAreaErr":break;case"PtgAreaN":stack.push("");break;case"PtgRefErr3d":break;case"PtgMemFunc":break;default:throw"Unrecognized Formula Token: "+f}}return stack[0]}var PtgDataType={1:"REFERENCE",2:"VALUE",3:"ARRAY"};var BERR={0:"#NULL!",7:"#DIV/0!",15:"#VALUE!",23:"#REF!",29:"#NAME?",36:"#NUM!",42:"#N/A",43:"#GETTING_DATA",255:"#WTF?"};var Cetab={0:"BEEP",1:"OPEN",2:"OPEN.LINKS",3:"CLOSE.ALL",4:"SAVE",5:"SAVE.AS",6:"FILE.DELETE",7:"PAGE.SETUP",8:"PRINT",9:"PRINTER.SETUP",10:"QUIT",11:"NEW.WINDOW",12:"ARRANGE.ALL",13:"WINDOW.SIZE",14:"WINDOW.MOVE",15:"FULL",16:"CLOSE",17:"RUN",22:"SET.PRINT.AREA",23:"SET.PRINT.TITLES",24:"SET.PAGE.BREAK",25:"REMOVE.PAGE.BREAK",26:"FONT",27:"DISPLAY",28:"PROTECT.DOCUMENT",29:"PRECISION",30:"A1.R1C1",31:"CALCULATE.NOW",32:"CALCULATION",34:"DATA.FIND",35:"EXTRACT",36:"DATA.DELETE",37:"SET.DATABASE",38:"SET.CRITERIA",39:"SORT",40:"DATA.SERIES",41:"TABLE",42:"FORMAT.NUMBER",43:"ALIGNMENT",44:"STYLE",45:"BORDER",46:"CELL.PROTECTION",47:"COLUMN.WIDTH",48:"UNDO",49:"CUT",50:"COPY",51:"PASTE",52:"CLEAR",53:"PASTE.SPECIAL",54:"EDIT.DELETE",55:"INSERT",56:"FILL.RIGHT",57:"FILL.DOWN",61:"DEFINE.NAME",62:"CREATE.NAMES",63:"FORMULA.GOTO",64:"FORMULA.FIND",65:"SELECT.LAST.CELL",66:"SHOW.ACTIVE.CELL",67:"GALLERY.AREA",68:"GALLERY.BAR",69:"GALLERY.COLUMN",70:"GALLERY.LINE",71:"GALLERY.PIE",72:"GALLERY.SCATTER",73:"COMBINATION",74:"PREFERRED",75:"ADD.OVERLAY",76:"GRIDLINES",77:"SET.PREFERRED",78:"AXES",79:"LEGEND",80:"ATTACH.TEXT",81:"ADD.ARROW",82:"SELECT.CHART",83:"SELECT.PLOT.AREA",84:"PATTERNS",85:"MAIN.CHART",86:"OVERLAY",87:"SCALE",88:"FORMAT.LEGEND",89:"FORMAT.TEXT",90:"EDIT.REPEAT",91:"PARSE",92:"JUSTIFY",93:"HIDE",94:"UNHIDE",95:"WORKSPACE",96:"FORMULA",97:"FORMULA.FILL",98:"FORMULA.ARRAY",99:"DATA.FIND.NEXT",100:"DATA.FIND.PREV",101:"FORMULA.FIND.NEXT",102:"FORMULA.FIND.PREV",103:"ACTIVATE",104:"ACTIVATE.NEXT",105:"ACTIVATE.PREV",106:"UNLOCKED.NEXT",107:"UNLOCKED.PREV",108:"COPY.PICTURE",109:"SELECT",110:"DELETE.NAME",111:"DELETE.FORMAT",112:"VLINE",113:"HLINE",114:"VPAGE",115:"HPAGE",116:"VSCROLL",117:"HSCROLL",118:"ALERT",119:"NEW",120:"CANCEL.COPY",121:"SHOW.CLIPBOARD",122:"MESSAGE",124:"PASTE.LINK",125:"APP.ACTIVATE",126:"DELETE.ARROW",127:"ROW.HEIGHT",128:"FORMAT.MOVE",129:"FORMAT.SIZE",130:"FORMULA.REPLACE",131:"SEND.KEYS",132:"SELECT.SPECIAL",133:"APPLY.NAMES",134:"REPLACE.FONT",135:"FREEZE.PANES",136:"SHOW.INFO",137:"SPLIT",138:"ON.WINDOW",139:"ON.DATA",140:"DISABLE.INPUT",142:"OUTLINE",143:"LIST.NAMES",144:"FILE.CLOSE",145:"SAVE.WORKBOOK",146:"DATA.FORM",147:"COPY.CHART",148:"ON.TIME",149:"WAIT",150:"FORMAT.FONT",151:"FILL.UP",152:"FILL.LEFT",153:"DELETE.OVERLAY",155:"SHORT.MENUS",159:"SET.UPDATE.STATUS",161:"COLOR.PALETTE",162:"DELETE.STYLE",163:"WINDOW.RESTORE",164:"WINDOW.MAXIMIZE",166:"CHANGE.LINK",167:"CALCULATE.DOCUMENT",168:"ON.KEY",169:"APP.RESTORE",170:"APP.MOVE",171:"APP.SIZE",172:"APP.MINIMIZE",173:"APP.MAXIMIZE",174:"BRING.TO.FRONT",175:"SEND.TO.BACK",185:"MAIN.CHART.TYPE",186:"OVERLAY.CHART.TYPE",187:"SELECT.END",188:"OPEN.MAIL",189:"SEND.MAIL",190:"STANDARD.FONT",191:"CONSOLIDATE",192:"SORT.SPECIAL",193:"GALLERY.3D.AREA",194:"GALLERY.3D.COLUMN",195:"GALLERY.3D.LINE",196:"GALLERY.3D.PIE",197:"VIEW.3D",198:"GOAL.SEEK",199:"WORKGROUP",200:"FILL.GROUP",201:"UPDATE.LINK",202:"PROMOTE",203:"DEMOTE",204:"SHOW.DETAIL",206:"UNGROUP",207:"OBJECT.PROPERTIES",208:"SAVE.NEW.OBJECT",209:"SHARE",210:"SHARE.NAME",211:"DUPLICATE",212:"APPLY.STYLE",213:"ASSIGN.TO.OBJECT",214:"OBJECT.PROTECTION",215:"HIDE.OBJECT",216:"SET.EXTRACT",217:"CREATE.PUBLISHER",218:"SUBSCRIBE.TO",219:"ATTRIBUTES",220:"SHOW.TOOLBAR",222:"PRINT.PREVIEW",223:"EDIT.COLOR",224:"SHOW.LEVELS",225:"FORMAT.MAIN",226:"FORMAT.OVERLAY",227:"ON.RECALC",228:"EDIT.SERIES",229:"DEFINE.STYLE",240:"LINE.PRINT",243:"ENTER.DATA",249:"GALLERY.RADAR",250:"MERGE.STYLES",251:"EDITION.OPTIONS",252:"PASTE.PICTURE",253:"PASTE.PICTURE.LINK",254:"SPELLING",256:"ZOOM",259:"INSERT.OBJECT",260:"WINDOW.MINIMIZE",265:"SOUND.NOTE",266:"SOUND.PLAY",267:"FORMAT.SHAPE",268:"EXTEND.POLYGON",269:"FORMAT.AUTO",272:"GALLERY.3D.BAR",273:"GALLERY.3D.SURFACE",274:"FILL.AUTO",276:"CUSTOMIZE.TOOLBAR",277:"ADD.TOOL",278:"EDIT.OBJECT",279:"ON.DOUBLECLICK",280:"ON.ENTRY",281:"WORKBOOK.ADD",282:"WORKBOOK.MOVE",283:"WORKBOOK.COPY",284:"WORKBOOK.OPTIONS",285:"SAVE.WORKSPACE",288:"CHART.WIZARD",289:"DELETE.TOOL",290:"MOVE.TOOL",291:"WORKBOOK.SELECT",292:"WORKBOOK.ACTIVATE",293:"ASSIGN.TO.TOOL",295:"COPY.TOOL",296:"RESET.TOOL",297:"CONSTRAIN.NUMERIC",298:"PASTE.TOOL",302:"WORKBOOK.NEW",305:"SCENARIO.CELLS",306:"SCENARIO.DELETE",307:"SCENARIO.ADD",308:"SCENARIO.EDIT",309:"SCENARIO.SHOW",310:"SCENARIO.SHOW.NEXT",311:"SCENARIO.SUMMARY",312:"PIVOT.TABLE.WIZARD",313:"PIVOT.FIELD.PROPERTIES",314:"PIVOT.FIELD",315:"PIVOT.ITEM",316:"PIVOT.ADD.FIELDS",318:"OPTIONS.CALCULATION",319:"OPTIONS.EDIT",320:"OPTIONS.VIEW",321:"ADDIN.MANAGER",322:"MENU.EDITOR",323:"ATTACH.TOOLBARS",324:"VBAActivate",325:"OPTIONS.CHART",328:"VBA.INSERT.FILE",330:"VBA.PROCEDURE.DEFINITION",336:"ROUTING.SLIP",338:"ROUTE.DOCUMENT",339:"MAIL.LOGON",342:"INSERT.PICTURE",343:"EDIT.TOOL",344:"GALLERY.DOUGHNUT",350:"CHART.TREND",352:"PIVOT.ITEM.PROPERTIES",354:"WORKBOOK.INSERT",355:"OPTIONS.TRANSITION",356:"OPTIONS.GENERAL",370:"FILTER.ADVANCED",373:"MAIL.ADD.MAILER",374:"MAIL.DELETE.MAILER",375:"MAIL.REPLY",376:"MAIL.REPLY.ALL",377:"MAIL.FORWARD",378:"MAIL.NEXT.LETTER",379:"DATA.LABEL",380:"INSERT.TITLE",381:"FONT.PROPERTIES",382:"MACRO.OPTIONS",383:"WORKBOOK.HIDE",384:"WORKBOOK.UNHIDE",385:"WORKBOOK.DELETE",386:"WORKBOOK.NAME",388:"GALLERY.CUSTOM",390:"ADD.CHART.AUTOFORMAT",391:"DELETE.CHART.AUTOFORMAT",392:"CHART.ADD.DATA",393:"AUTO.OUTLINE",394:"TAB.ORDER",395:"SHOW.DIALOG",396:"SELECT.ALL",397:"UNGROUP.SHEETS",398:"SUBTOTAL.CREATE",399:"SUBTOTAL.REMOVE",400:"RENAME.OBJECT",412:"WORKBOOK.SCROLL",413:"WORKBOOK.NEXT",414:"WORKBOOK.PREV",415:"WORKBOOK.TAB.SPLIT",416:"FULL.SCREEN",417:"WORKBOOK.PROTECT",420:"SCROLLBAR.PROPERTIES",421:"PIVOT.SHOW.PAGES",422:"TEXT.TO.COLUMNS",423:"FORMAT.CHARTTYPE",424:"LINK.FORMAT",425:"TRACER.DISPLAY",430:"TRACER.NAVIGATE",431:"TRACER.CLEAR",432:"TRACER.ERROR",433:"PIVOT.FIELD.GROUP",434:"PIVOT.FIELD.UNGROUP",435:"CHECKBOX.PROPERTIES",436:"LABEL.PROPERTIES",437:"LISTBOX.PROPERTIES",438:"EDITBOX.PROPERTIES",439:"PIVOT.REFRESH",440:"LINK.COMBO",441:"OPEN.TEXT",442:"HIDE.DIALOG",443:"SET.DIALOG.FOCUS",444:"ENABLE.OBJECT",445:"PUSHBUTTON.PROPERTIES",446:"SET.DIALOG.DEFAULT",447:"FILTER",448:"FILTER.SHOW.ALL",449:"CLEAR.OUTLINE",450:"FUNCTION.WIZARD",451:"ADD.LIST.ITEM",452:"SET.LIST.ITEM",453:"REMOVE.LIST.ITEM",454:"SELECT.LIST.ITEM",455:"SET.CONTROL.VALUE",456:"SAVE.COPY.AS",458:"OPTIONS.LISTS.ADD",459:"OPTIONS.LISTS.DELETE",460:"SERIES.AXES",461:"SERIES.X",462:"SERIES.Y",463:"ERRORBAR.X",464:"ERRORBAR.Y",465:"FORMAT.CHART",466:"SERIES.ORDER",467:"MAIL.LOGOFF",468:"CLEAR.ROUTING.SLIP",469:"APP.ACTIVATE.MICROSOFT",470:"MAIL.EDIT.MAILER",471:"ON.SHEET",472:"STANDARD.WIDTH",473:"SCENARIO.MERGE",474:"SUMMARY.INFO",475:"FIND.FILE",476:"ACTIVE.CELL.FONT",477:"ENABLE.TIPWIZARD",478:"VBA.MAKE.ADDIN",480:"INSERTDATATABLE",481:"WORKGROUP.OPTIONS",482:"MAIL.SEND.MAILER",485:"AUTOCORRECT",489:"POST.DOCUMENT",491:"PICKLIST",493:"VIEW.SHOW",494:"VIEW.DEFINE",495:"VIEW.DELETE",509:"SHEET.BACKGROUND",510:"INSERT.MAP.OBJECT",511:"OPTIONS.MENONO",517:"MSOCHECKS",518:"NORMAL",519:"LAYOUT",520:"RM.PRINT.AREA",521:"CLEAR.PRINT.AREA",522:"ADD.PRINT.AREA",523:"MOVE.BRK",545:"HIDECURR.NOTE",546:"HIDEALL.NOTES",547:"DELETE.NOTE",548:"TRAVERSE.NOTES",549:"ACTIVATE.NOTES",620:"PROTECT.REVISIONS",621:"UNPROTECT.REVISIONS",647:"OPTIONS.ME",653:"WEB.PUBLISH",667:"NEWWEBQUERY",673:"PIVOT.TABLE.CHART",753:"OPTIONS.SAVE",755:"OPTIONS.SPELL",808:"HIDEALL.INKANNOTS"}; |
18581 | 18561 var Ftab={0:"COUNT",1:"IF",2:"ISNA",3:"ISERROR",4:"SUM",5:"AVERAGE",6:"MIN",7:"MAX",8:"ROW",9:"COLUMN",10:"NA",11:"NPV",12:"STDEV",13:"DOLLAR",14:"FIXED",15:"SIN",16:"COS",17:"TAN",18:"ATAN",19:"PI",20:"SQRT",21:"EXP",22:"LN",23:"LOG10",24:"ABS",25:"INT",26:"SIGN",27:"ROUND",28:"LOOKUP",29:"INDEX",30:"REPT",31:"MID",32:"LEN",33:"VALUE",34:"TRUE",35:"FALSE",36:"AND",37:"OR",38:"NOT",39:"MOD",40:"DCOUNT",41:"DSUM",42:"DAVERAGE",43:"DMIN",44:"DMAX",45:"DSTDEV",46:"VAR",47:"DVAR",48:"TEXT",49:"LINEST",50:"TREND",51:"LOGEST",52:"GROWTH",53:"GOTO",54:"HALT",55:"RETURN",56:"PV",57:"FV",58:"NPER",59:"PMT",60:"RATE",61:"MIRR",62:"IRR",63:"RAND",64:"MATCH",65:"DATE",66:"TIME",67:"DAY",68:"MONTH",69:"YEAR",70:"WEEKDAY",71:"HOUR",72:"MINUTE",73:"SECOND",74:"NOW",75:"AREAS",76:"ROWS",77:"COLUMNS",78:"OFFSET",79:"ABSREF",80:"RELREF",81:"ARGUMENT",82:"SEARCH",83:"TRANSPOSE",84:"ERROR",85:"STEP",86:"TYPE",87:"ECHO",88:"SET.NAME",89:"CALLER",90:"DEREF",91:"WINDOWS",92:"SERIES",93:"DOCUMENTS",94:"ACTIVE.CELL",95:"SELECTION",96:"RESULT",97:"ATAN2",98:"ASIN",99:"ACOS",100:"CHOOSE",101:"HLOOKUP",102:"VLOOKUP",103:"LINKS",104:"INPUT",105:"ISREF",106:"GET.FORMULA",107:"GET.NAME",108:"SET.VALUE",109:"LOG",110:"EXEC",111:"CHAR",112:"LOWER",113:"UPPER",114:"PROPER",115:"LEFT",116:"RIGHT",117:"EXACT",118:"TRIM",119:"REPLACE",120:"SUBSTITUTE",121:"CODE",122:"NAMES",123:"DIRECTORY",124:"FIND",125:"CELL",126:"ISERR",127:"ISTEXT",128:"ISNUMBER",129:"ISBLANK",130:"T",131:"N",132:"FOPEN",133:"FCLOSE",134:"FSIZE",135:"FREADLN",136:"FREAD",137:"FWRITELN",138:"FWRITE",139:"FPOS",140:"DATEVALUE",141:"TIMEVALUE",142:"SLN",143:"SYD",144:"DDB",145:"GET.DEF",146:"REFTEXT",147:"TEXTREF",148:"INDIRECT",149:"REGISTER",150:"CALL",151:"ADD.BAR",152:"ADD.MENU",153:"ADD.COMMAND",154:"ENABLE.COMMAND",155:"CHECK.COMMAND",156:"RENAME.COMMAND",157:"SHOW.BAR",158:"DELETE.MENU",159:"DELETE.COMMAND",160:"GET.CHART.ITEM",161:"DIALOG.BOX",162:"CLEAN",163:"MDETERM",164:"MINVERSE",165:"MMULT",166:"FILES",167:"IPMT",168:"PPMT",169:"COUNTA",170:"CANCEL.KEY",171:"FOR",172:"WHILE",173:"BREAK",174:"NEXT",175:"INITIATE",176:"REQUEST",177:"POKE",178:"EXECUTE",179:"TERMINATE",180:"RESTART",181:"HELP",182:"GET.BAR",183:"PRODUCT",184:"FACT",185:"GET.CELL",186:"GET.WORKSPACE",187:"GET.WINDOW",188:"GET.DOCUMENT",189:"DPRODUCT",190:"ISNONTEXT",191:"GET.NOTE",192:"NOTE",193:"STDEVP",194:"VARP",195:"DSTDEVP",196:"DVARP",197:"TRUNC",198:"ISLOGICAL",199:"DCOUNTA",200:"DELETE.BAR",201:"UNREGISTER",204:"USDOLLAR",205:"FINDB",206:"SEARCHB",207:"REPLACEB",208:"LEFTB",209:"RIGHTB",210:"MIDB",211:"LENB",212:"ROUNDUP",213:"ROUNDDOWN",214:"ASC",215:"DBCS",216:"RANK",219:"ADDRESS",220:"DAYS360",221:"TODAY",222:"VDB",223:"ELSE",224:"ELSE.IF",225:"END.IF",226:"FOR.CELL",227:"MEDIAN",228:"SUMPRODUCT",229:"SINH",230:"COSH",231:"TANH",232:"ASINH",233:"ACOSH",234:"ATANH",235:"DGET",236:"CREATE.OBJECT",237:"VOLATILE",238:"LAST.ERROR",239:"CUSTOM.UNDO",240:"CUSTOM.REPEAT",241:"FORMULA.CONVERT",242:"GET.LINK.INFO",243:"TEXT.BOX",244:"INFO",245:"GROUP",246:"GET.OBJECT",247:"DB",248:"PAUSE",251:"RESUME",252:"FREQUENCY",253:"ADD.TOOLBAR",254:"DELETE.TOOLBAR",255:"User",256:"RESET.TOOLBAR",257:"EVALUATE",258:"GET.TOOLBAR",259:"GET.TOOL",260:"SPELLING.CHECK",261:"ERROR.TYPE",262:"APP.TITLE",263:"WINDOW.TITLE",264:"SAVE.TOOLBAR",265:"ENABLE.TOOL",266:"PRESS.TOOL",267:"REGISTER.ID",268:"GET.WORKBOOK",269:"AVEDEV",270:"BETADIST",271:"GAMMALN",272:"BETAINV",273:"BINOMDIST",274:"CHIDIST",275:"CHIINV",276:"COMBIN",277:"CONFIDENCE",278:"CRITBINOM",279:"EVEN",280:"EXPONDIST",281:"FDIST",282:"FINV",283:"FISHER",284:"FISHERINV",285:"FLOOR",286:"GAMMADIST",287:"GAMMAINV",288:"CEILING",289:"HYPGEOMDIST",290:"LOGNORMDIST",291:"LOGINV",292:"NEGBINOMDIST",293:"NORMDIST",294:"NORMSDIST",295:"NORMINV",296:"NORMSINV",297:"STANDARDIZE",298:"ODD",299:"PERMUT",300:"POISSON",301:"TDIST",302:"WEIBULL",303:"SUMXMY2",304:"SUMX2MY2",305:"SUMX2PY2",306:"CHITEST",307:"CORREL",308:"COVAR",309:"FORECAST",310:"FTEST",311:"INTERCEPT",312:"PEARSON",313:"RSQ",314:"STEYX",315:"SLOPE",316:"TTEST",317:"PROB",318:"DEVSQ",319:"GEOMEAN",320:"HARMEAN",321:"SUMSQ",322:"KURT",323:"SKEW",324:"ZTEST",325:"LARGE",326:"SMALL",327:"QUARTILE",328:"PERCENTILE",329:"PERCENTRANK",330:"MODE",331:"TRIMMEAN",332:"TINV",334:"MOVIE.COMMAND",335:"GET.MOVIE",336:"CONCATENATE",337:"POWER",338:"PIVOT.ADD.DATA",339:"GET.PIVOT.TABLE",340:"GET.PIVOT.FIELD",341:"GET.PIVOT.ITEM",342:"RADIANS",343:"DEGREES",344:"SUBTOTAL",345:"SUMIF",346:"COUNTIF",347:"COUNTBLANK",348:"SCENARIO.GET",349:"OPTIONS.LISTS.GET",350:"ISPMT",351:"DATEDIF",352:"DATESTRING",353:"NUMBERSTRING",354:"ROMAN",355:"OPEN.DIALOG",356:"SAVE.DIALOG",357:"VIEW.GET",358:"GETPIVOTDATA",359:"HYPERLINK",360:"PHONETIC",361:"AVERAGEA",362:"MAXA",363:"MINA",364:"STDEVPA",365:"VARPA",366:"STDEVA",367:"VARA",368:"BAHTTEXT",369:"THAIDAYOFWEEK",370:"THAIDIGIT",371:"THAIMONTHOFYEAR",372:"THAINUMSOUND",373:"THAINUMSTRING",374:"THAISTRINGLENGTH",375:"ISTHAIDIGIT",376:"ROUNDBAHTDOWN",377:"ROUNDBAHTUP",378:"THAIYEAR",379:"RTD"};var FtabArgc={2:1,3:1,15:1,16:1,17:1,18:1,20:1,21:1,22:1,23:1,24:1,25:1,26:1,27:2,30:2,31:3,32:1,33:1,38:1,39:2,40:3,41:3,42:3,43:3,44:3,45:3,47:3,48:2,53:1,61:3,65:3,66:3,67:1,68:1,69:1,71:1,72:1,73:1,75:1,76:1,77:1,79:2,80:2,83:1,86:1,90:1,97:2,98:1,99:1,105:1,111:1,112:1,113:1,114:1,117:2,118:1,119:4,121:1,126:1,127:1,128:1,129:1,130:1,131:1,133:1,134:1,135:1,136:2,137:2,138:2,140:1,141:1,142:3,143:4,162:1,163:1,164:1,165:2,172:1,175:2,176:2,177:3,178:2,179:1,184:1,189:3,190:1,195:3,196:3,198:1,199:3,201:1,207:4,210:3,211:1,212:2,213:2,214:1,215:1,229:1,230:1,231:1,232:1,233:1,234:1,235:3,244:1,252:2,257:1,261:1,271:1,273:4,274:2,275:2,276:2,277:3,278:3,279:1,280:3,281:3,282:3,283:1,284:1,285:2,286:4,287:3,288:2,289:4,290:3,291:3,292:3,293:4,294:1,295:3,296:1,297:3,298:1,299:2,300:3,301:3,302:4,303:2,304:2,305:2,306:2,307:2,308:2,309:3,310:2,311:2,312:2,313:2,314:2,315:2,316:4,325:2,326:2,327:2,328:2,331:2,332:2,337:2,342:1,343:1,346:2,347:1,350:4,351:3,352:1,353:2,360:1,368:1,369:1,370:1,371:1,372:1,373:1,374:1,375:1,376:1,377:1,378:1,65535:0};var XLSXFutureFunctions={"_xlfn.ACOT":"ACOT","_xlfn.ACOTH":"ACOTH","_xlfn.AGGREGATE":"AGGREGATE","_xlfn.ARABIC":"ARABIC","_xlfn.AVERAGEIF":"AVERAGEIF","_xlfn.AVERAGEIFS":"AVERAGEIFS","_xlfn.BASE":"BASE","_xlfn.BETA.DIST":"BETA.DIST","_xlfn.BETA.INV":"BETA.INV","_xlfn.BINOM.DIST":"BINOM.DIST","_xlfn.BINOM.DIST.RANGE":"BINOM.DIST.RANGE","_xlfn.BINOM.INV":"BINOM.INV","_xlfn.BITAND":"BITAND","_xlfn.BITLSHIFT":"BITLSHIFT","_xlfn.BITOR":"BITOR","_xlfn.BITRSHIFT":"BITRSHIFT","_xlfn.BITXOR":"BITXOR","_xlfn.CEILING.MATH":"CEILING.MATH","_xlfn.CEILING.PRECISE":"CEILING.PRECISE","_xlfn.CHISQ.DIST":"CHISQ.DIST","_xlfn.CHISQ.DIST.RT":"CHISQ.DIST.RT","_xlfn.CHISQ.INV":"CHISQ.INV","_xlfn.CHISQ.INV.RT":"CHISQ.INV.RT","_xlfn.CHISQ.TEST":"CHISQ.TEST","_xlfn.COMBINA":"COMBINA","_xlfn.CONFIDENCE.NORM":"CONFIDENCE.NORM","_xlfn.CONFIDENCE.T":"CONFIDENCE.T","_xlfn.COT":"COT","_xlfn.COTH":"COTH","_xlfn.COUNTIFS":"COUNTIFS","_xlfn.COVARIANCE.P":"COVARIANCE.P","_xlfn.COVARIANCE.S":"COVARIANCE.S","_xlfn.CSC":"CSC","_xlfn.CSCH":"CSCH","_xlfn.DAYS":"DAYS","_xlfn.DECIMAL":"DECIMAL","_xlfn.ECMA.CEILING":"ECMA.CEILING","_xlfn.ERF.PRECISE":"ERF.PRECISE","_xlfn.ERFC.PRECISE":"ERFC.PRECISE","_xlfn.EXPON.DIST":"EXPON.DIST","_xlfn.F.DIST":"F.DIST","_xlfn.F.DIST.RT":"F.DIST.RT","_xlfn.F.INV":"F.INV","_xlfn.F.INV.RT":"F.INV.RT","_xlfn.F.TEST":"F.TEST","_xlfn.FILTERXML":"FILTERXML","_xlfn.FLOOR.MATH":"FLOOR.MATH","_xlfn.FLOOR.PRECISE":"FLOOR.PRECISE","_xlfn.FORMULATEXT":"FORMULATEXT","_xlfn.GAMMA":"GAMMA","_xlfn.GAMMA.DIST":"GAMMA.DIST","_xlfn.GAMMA.INV":"GAMMA.INV","_xlfn.GAMMALN.PRECISE":"GAMMALN.PRECISE","_xlfn.GAUSS":"GAUSS","_xlfn.HYPGEOM.DIST":"HYPGEOM.DIST","_xlfn.IFNA":"IFNA","_xlfn.IFERROR":"IFERROR","_xlfn.IMCOSH":"IMCOSH","_xlfn.IMCOT":"IMCOT","_xlfn.IMCSC":"IMCSC","_xlfn.IMCSCH":"IMCSCH","_xlfn.IMSEC":"IMSEC","_xlfn.IMSECH":"IMSECH","_xlfn.IMSINH":"IMSINH","_xlfn.IMTAN":"IMTAN","_xlfn.ISFORMULA":"ISFORMULA","_xlfn.ISO.CEILING":"ISO.CEILING","_xlfn.ISOWEEKNUM":"ISOWEEKNUM","_xlfn.LOGNORM.DIST":"LOGNORM.DIST","_xlfn.LOGNORM.INV":"LOGNORM.INV","_xlfn.MODE.MULT":"MODE.MULT","_xlfn.MODE.SNGL":"MODE.SNGL","_xlfn.MUNIT":"MUNIT","_xlfn.NEGBINOM.DIST":"NEGBINOM.DIST","_xlfn.NETWORKDAYS.INTL":"NETWORKDAYS.INTL","_xlfn.NIGBINOM":"NIGBINOM","_xlfn.NORM.DIST":"NORM.DIST","_xlfn.NORM.INV":"NORM.INV","_xlfn.NORM.S.DIST":"NORM.S.DIST","_xlfn.NORM.S.INV":"NORM.S.INV","_xlfn.NUMBERVALUE":"NUMBERVALUE","_xlfn.PDURATION":"PDURATION","_xlfn.PERCENTILE.EXC":"PERCENTILE.EXC","_xlfn.PERCENTILE.INC":"PERCENTILE.INC","_xlfn.PERCENTRANK.EXC":"PERCENTRANK.EXC","_xlfn.PERCENTRANK.INC":"PERCENTRANK.INC","_xlfn.PERMUTATIONA":"PERMUTATIONA","_xlfn.PHI":"PHI","_xlfn.POISSON.DIST":"POISSON.DIST","_xlfn.QUARTILE.EXC":"QUARTILE.EXC","_xlfn.QUARTILE.INC":"QUARTILE.INC","_xlfn.QUERYSTRING":"QUERYSTRING","_xlfn.RANK.AVG":"RANK.AVG","_xlfn.RANK.EQ":"RANK.EQ","_xlfn.RRI":"RRI","_xlfn.SEC":"SEC","_xlfn.SECH":"SECH","_xlfn.SHEET":"SHEET","_xlfn.SHEETS":"SHEETS","_xlfn.SKEW.P":"SKEW.P","_xlfn.STDEV.P":"STDEV.P","_xlfn.STDEV.S":"STDEV.S","_xlfn.SUMIFS":"SUMIFS","_xlfn.T.DIST":"T.DIST","_xlfn.T.DIST.2T":"T.DIST.2T","_xlfn.T.DIST.RT":"T.DIST.RT","_xlfn.T.INV":"T.INV","_xlfn.T.INV.2T":"T.INV.2T","_xlfn.T.TEST":"T.TEST","_xlfn.UNICHAR":"UNICHAR","_xlfn.UNICODE":"UNICODE","_xlfn.VAR.P":"VAR.P","_xlfn.VAR.S":"VAR.S","_xlfn.WEBSERVICE":"WEBSERVICE","_xlfn.WEIBULL.DIST":"WEIBULL.DIST","_xlfn.WORKDAY.INTL":"WORKDAY.INTL","_xlfn.XOR":"XOR","_xlfn.Z.TEST":"Z.TEST"};var RecordEnum={6:{n:"Formula",f:parse_Formula},10:{n:"EOF",f:parse_EOF},12:{n:"CalcCount",f:parse_CalcCount},13:{n:"CalcMode",f:parse_CalcMode},14:{n:"CalcPrecision",f:parse_CalcPrecision},15:{n:"CalcRefMode",f:parse_CalcRefMode},16:{n:"CalcDelta",f:parse_CalcDelta},17:{n:"CalcIter",f:parse_CalcIter},18:{n:"Protect",f:parse_Protect},19:{n:"Password",f:parse_Password},20:{n:"Header",f:parse_Header},21:{n:"Footer",f:parse_Footer},23:{n:"ExternSheet",f:parse_ExternSheet},24:{n:"Lbl",f:parse_Lbl},25:{n:"WinProtect",f:parse_WinProtect},26:{n:"VerticalPageBreaks",f:parse_VerticalPageBreaks},27:{n:"HorizontalPageBreaks",f:parse_HorizontalPageBreaks},28:{n:"Note",f:parse_Note},29:{n:"Selection",f:parse_Selection},34:{n:"Date1904",f:parse_Date1904},35:{n:"ExternName",f:parse_ExternName},38:{n:"LeftMargin",f:parse_LeftMargin},39:{n:"RightMargin",f:parse_RightMargin},40:{n:"TopMargin",f:parse_TopMargin},41:{n:"BottomMargin",f:parse_BottomMargin},42:{n:"PrintRowCol",f:parse_PrintRowCol},43:{n:"PrintGrid",f:parse_PrintGrid},47:{n:"FilePass",f:parse_FilePass},49:{n:"Font",f:parse_Font},51:{n:"PrintSize",f:parse_PrintSize},60:{n:"Continue",f:parse_Continue},61:{n:"Window1",f:parse_Window1},64:{n:"Backup",f:parse_Backup},65:{n:"Pane",f:parse_Pane},66:{n:"CodePage",f:parse_CodePage},77:{n:"Pls",f:parse_Pls},80:{n:"DCon",f:parse_DCon},81:{n:"DConRef",f:parse_DConRef},82:{n:"DConName",f:parse_DConName},85:{n:"DefColWidth",f:parse_DefColWidth},89:{n:"XCT",f:parse_XCT},90:{n:"CRN",f:parse_CRN},91:{n:"FileSharing",f:parse_FileSharing},92:{n:"WriteAccess",f:parse_WriteAccess},93:{n:"Obj",f:parse_Obj},94:{n:"Uncalced",f:parse_Uncalced},95:{n:"CalcSaveRecalc",f:parse_CalcSaveRecalc},96:{n:"Template",f:parse_Template},97:{n:"Intl",f:parse_Intl},99:{n:"ObjProtect",f:parse_ObjProtect},125:{n:"ColInfo",f:parse_ColInfo},128:{n:"Guts",f:parse_Guts},129:{n:"WsBool",f:parse_WsBool},130:{n:"GridSet",f:parse_GridSet},131:{n:"HCenter",f:parse_HCenter},132:{n:"VCenter",f:parse_VCenter},133:{n:"BoundSheet8",f:parse_BoundSheet8},134:{n:"WriteProtect",f:parse_WriteProtect},140:{n:"Country",f:parse_Country},141:{n:"HideObj",f:parse_HideObj},144:{n:"Sort",f:parse_Sort},146:{n:"Palette",f:parse_Palette},151:{n:"Sync",f:parse_Sync},152:{n:"LPr",f:parse_LPr},153:{n:"DxGCol",f:parse_DxGCol},154:{n:"FnGroupName",f:parse_FnGroupName},155:{n:"FilterMode",f:parse_FilterMode},156:{n:"BuiltInFnGroupCount",f:parse_BuiltInFnGroupCount},157:{n:"AutoFilterInfo",f:parse_AutoFilterInfo},158:{n:"AutoFilter",f:parse_AutoFilter},160:{n:"Scl",f:parse_Scl},161:{n:"Setup",f:parse_Setup},174:{n:"ScenMan",f:parse_ScenMan},175:{n:"SCENARIO",f:parse_SCENARIO},176:{n:"SxView",f:parse_SxView},177:{n:"Sxvd",f:parse_Sxvd},178:{n:"SXVI",f:parse_SXVI},180:{n:"SxIvd",f:parse_SxIvd},181:{n:"SXLI",f:parse_SXLI},182:{n:"SXPI",f:parse_SXPI},184:{n:"DocRoute",f:parse_DocRoute},185:{n:"RecipName",f:parse_RecipName},189:{n:"MulRk",f:parse_MulRk},190:{n:"MulBlank",f:parse_MulBlank},193:{n:"Mms",f:parse_Mms},197:{n:"SXDI",f:parse_SXDI},198:{n:"SXDB",f:parse_SXDB},199:{n:"SXFDB",f:parse_SXFDB},200:{n:"SXDBB",f:parse_SXDBB},201:{n:"SXNum",f:parse_SXNum},202:{n:"SxBool",f:parse_SxBool},203:{n:"SxErr",f:parse_SxErr},204:{n:"SXInt",f:parse_SXInt},205:{n:"SXString",f:parse_SXString},206:{n:"SXDtr",f:parse_SXDtr},207:{n:"SxNil",f:parse_SxNil},208:{n:"SXTbl",f:parse_SXTbl},209:{n:"SXTBRGIITM",f:parse_SXTBRGIITM},210:{n:"SxTbpg",f:parse_SxTbpg},211:{n:"ObProj",f:parse_ObProj},213:{n:"SXStreamID",f:parse_SXStreamID},215:{n:"DBCell",f:parse_DBCell},216:{n:"SXRng",f:parse_SXRng},217:{n:"SxIsxoper",f:parse_SxIsxoper},218:{n:"BookBool",f:parse_BookBool},220:{n:"DbOrParamQry",f:parse_DbOrParamQry},221:{n:"ScenarioProtect",f:parse_ScenarioProtect},222:{n:"OleObjectSize",f:parse_OleObjectSize},224:{n:"XF",f:parse_XF},225:{n:"InterfaceHdr",f:parse_InterfaceHdr},226:{n:"InterfaceEnd",f:parse_InterfaceEnd},227:{n:"SXVS",f:parse_SXVS},229:{n:"MergeCells",f:parse_MergeCells},233:{n:"BkHim",f:parse_BkHim},235:{n:"MsoDrawingGroup",f:parse_MsoDrawingGroup},236:{n:"MsoDrawing",f:parse_MsoDrawing},237:{n:"MsoDrawingSelection",f:parse_MsoDrawingSelection},239:{n:"PhoneticInfo",f:parse_PhoneticInfo},240:{n:"SxRule",f:parse_SxRule},241:{n:"SXEx",f:parse_SXEx},242:{n:"SxFilt",f:parse_SxFilt},244:{n:"SxDXF",f:parse_SxDXF},245:{n:"SxItm",f:parse_SxItm},246:{n:"SxName",f:parse_SxName},247:{n:"SxSelect",f:parse_SxSelect},248:{n:"SXPair",f:parse_SXPair},249:{n:"SxFmla",f:parse_SxFmla},251:{n:"SxFormat",f:parse_SxFormat},252:{n:"SST",f:parse_SST},253:{n:"LabelSst",f:parse_LabelSst},255:{n:"ExtSST",f:parse_ExtSST},256:{n:"SXVDEx",f:parse_SXVDEx},259:{n:"SXFormula",f:parse_SXFormula},290:{n:"SXDBEx",f:parse_SXDBEx},311:{n:"RRDInsDel",f:parse_RRDInsDel},312:{n:"RRDHead",f:parse_RRDHead},315:{n:"RRDChgCell",f:parse_RRDChgCell},317:{n:"RRTabId",f:parse_RRTabId},318:{n:"RRDRenSheet",f:parse_RRDRenSheet},319:{n:"RRSort",f:parse_RRSort},320:{n:"RRDMove",f:parse_RRDMove},330:{n:"RRFormat",f:parse_RRFormat},331:{n:"RRAutoFmt",f:parse_RRAutoFmt},333:{n:"RRInsertSh",f:parse_RRInsertSh},334:{n:"RRDMoveBegin",f:parse_RRDMoveBegin},335:{n:"RRDMoveEnd",f:parse_RRDMoveEnd},336:{n:"RRDInsDelBegin",f:parse_RRDInsDelBegin},337:{n:"RRDInsDelEnd",f:parse_RRDInsDelEnd},338:{n:"RRDConflict",f:parse_RRDConflict},339:{n:"RRDDefName",f:parse_RRDDefName},340:{n:"RRDRstEtxp",f:parse_RRDRstEtxp},351:{n:"LRng",f:parse_LRng},352:{n:"UsesELFs",f:parse_UsesELFs},353:{n:"DSF",f:parse_DSF},401:{n:"CUsr",f:parse_CUsr},402:{n:"CbUsr",f:parse_CbUsr},403:{n:"UsrInfo",f:parse_UsrInfo},404:{n:"UsrExcl",f:parse_UsrExcl},405:{n:"FileLock",f:parse_FileLock},406:{n:"RRDInfo",f:parse_RRDInfo},407:{n:"BCUsrs",f:parse_BCUsrs},408:{n:"UsrChk",f:parse_UsrChk},425:{n:"UserBView",f:parse_UserBView},426:{n:"UserSViewBegin",f:parse_UserSViewBegin},427:{n:"UserSViewEnd",f:parse_UserSViewEnd},428:{n:"RRDUserView",f:parse_RRDUserView},429:{n:"Qsi",f:parse_Qsi},430:{n:"SupBook",f:parse_SupBook},431:{n:"Prot4Rev",f:parse_Prot4Rev},432:{n:"CondFmt",f:parse_CondFmt},433:{n:"CF",f:parse_CF},434:{n:"DVal",f:parse_DVal},437:{n:"DConBin",f:parse_DConBin},438:{n:"TxO",f:parse_TxO},439:{n:"RefreshAll",f:parse_RefreshAll},440:{n:"HLink",f:parse_HLink},441:{n:"Lel",f:parse_Lel},442:{n:"CodeName",f:parse_CodeName},443:{n:"SXFDBType",f:parse_SXFDBType},444:{n:"Prot4RevPass",f:parse_Prot4RevPass},445:{n:"ObNoMacros",f:parse_ObNoMacros},446:{n:"Dv",f:parse_Dv},448:{n:"Excel9File",f:parse_Excel9File},449:{n:"RecalcId",f:parse_RecalcId,r:2},450:{n:"EntExU2",f:parse_EntExU2},512:{n:"Dimensions",f:parse_Dimensions},513:{n:"Blank",f:parse_Blank},515:{n:"Number",f:parse_Number},516:{n:"Label",f:parse_Label},517:{n:"BoolErr",f:parse_BoolErr},519:{n:"String",f:parse_String},520:{n:"Row",f:parse_Row},523:{n:"Index",f:parse_Index},545:{n:"Array",f:parse_Array},549:{n:"DefaultRowHeight",f:parse_DefaultRowHeight},566:{n:"Table",f:parse_Table},574:{n:"Window2",f:parse_Window2},638:{n:"RK",f:parse_RK},659:{n:"Style",f:parse_Style},1048:{n:"BigName",f:parse_BigName},1054:{n:"Format",f:parse_Format},1084:{n:"ContinueBigName",f:parse_ContinueBigName},1212:{n:"ShrFmla",f:parse_ShrFmla},2048:{n:"HLinkTooltip",f:parse_HLinkTooltip},2049:{n:"WebPub",f:parse_WebPub},2050:{n:"QsiSXTag",f:parse_QsiSXTag},2051:{n:"DBQueryExt",f:parse_DBQueryExt},2052:{n:"ExtString",f:parse_ExtString},2053:{n:"TxtQry",f:parse_TxtQry},2054:{n:"Qsir",f:parse_Qsir},2055:{n:"Qsif",f:parse_Qsif},2056:{n:"RRDTQSIF",f:parse_RRDTQSIF},2057:{n:"BOF",f:parse_BOF},2058:{n:"OleDbConn",f:parse_OleDbConn},2059:{n:"WOpt",f:parse_WOpt},2060:{n:"SXViewEx",f:parse_SXViewEx},2061:{n:"SXTH",f:parse_SXTH},2062:{n:"SXPIEx",f:parse_SXPIEx},2063:{n:"SXVDTEx",f:parse_SXVDTEx},2064:{n:"SXViewEx9",f:parse_SXViewEx9},2066:{n:"ContinueFrt",f:parse_ContinueFrt},2067:{n:"RealTimeData",f:parse_RealTimeData},2128:{n:"ChartFrtInfo",f:parse_ChartFrtInfo},2129:{n:"FrtWrapper",f:parse_FrtWrapper},2130:{n:"StartBlock",f:parse_StartBlock},2131:{n:"EndBlock",f:parse_EndBlock},2132:{n:"StartObject",f:parse_StartObject},2133:{n:"EndObject",f:parse_EndObject},2134:{n:"CatLab",f:parse_CatLab},2135:{n:"YMult",f:parse_YMult},2136:{n:"SXViewLink",f:parse_SXViewLink},2137:{n:"PivotChartBits",f:parse_PivotChartBits},2138:{n:"FrtFontList",f:parse_FrtFontList},2146:{n:"SheetExt",f:parse_SheetExt},2147:{n:"BookExt",f:parse_BookExt,r:12},2148:{n:"SXAddl",f:parse_SXAddl},2149:{n:"CrErr",f:parse_CrErr},2150:{n:"HFPicture",f:parse_HFPicture},2151:{n:"FeatHdr",f:parse_FeatHdr},2152:{n:"Feat",f:parse_Feat},2154:{n:"DataLabExt",f:parse_DataLabExt},2155:{n:"DataLabExtContents",f:parse_DataLabExtContents},2156:{n:"CellWatch",f:parse_CellWatch},2161:{n:"FeatHdr11",f:parse_FeatHdr11},2162:{n:"Feature11",f:parse_Feature11},2164:{n:"DropDownObjIds",f:parse_DropDownObjIds},2165:{n:"ContinueFrt11",f:parse_ContinueFrt11},2166:{n:"DConn",f:parse_DConn},2167:{n:"List12",f:parse_List12},2168:{n:"Feature12",f:parse_Feature12},2169:{n:"CondFmt12",f:parse_CondFmt12},2170:{n:"CF12",f:parse_CF12},2171:{n:"CFEx",f:parse_CFEx},2172:{n:"XFCRC",f:parse_XFCRC},2173:{n:"XFExt",f:parse_XFExt},2174:{n:"AutoFilter12",f:parse_AutoFilter12},2175:{n:"ContinueFrt12",f:parse_ContinueFrt12},2180:{n:"MDTInfo",f:parse_MDTInfo},2181:{n:"MDXStr",f:parse_MDXStr},2182:{n:"MDXTuple",f:parse_MDXTuple},2183:{n:"MDXSet",f:parse_MDXSet},2184:{n:"MDXProp",f:parse_MDXProp},2185:{n:"MDXKPI",f:parse_MDXKPI},2186:{n:"MDB",f:parse_MDB},2187:{n:"PLV",f:parse_PLV},2188:{n:"Compat12",f:parse_Compat12,r:12},2189:{n:"DXF",f:parse_DXF},2190:{n:"TableStyles",f:parse_TableStyles,r:12},2191:{n:"TableStyle",f:parse_TableStyle},2192:{n:"TableStyleElement",f:parse_TableStyleElement},2194:{n:"StyleExt",f:parse_StyleExt},2195:{n:"NamePublish",f:parse_NamePublish},2196:{n:"NameCmt",f:parse_NameCmt},2197:{n:"SortData",f:parse_SortData},2198:{n:"Theme",f:parse_Theme},2199:{n:"GUIDTypeLib",f:parse_GUIDTypeLib},2200:{n:"FnGrp12",f:parse_FnGrp12},2201:{n:"NameFnGrp12",f:parse_NameFnGrp12},2202:{n:"MTRSettings",f:parse_MTRSettings,r:12},2203:{n:"CompressPictures",f:parse_CompressPictures},2204:{n:"HeaderFooter",f:parse_HeaderFooter},2205:{n:"CrtLayout12",f:parse_CrtLayout12},2206:{n:"CrtMlFrt",f:parse_CrtMlFrt},2207:{n:"CrtMlFrtContinue",f:parse_CrtMlFrtContinue},2211:{n:"ForceFullCalculation",f:parse_ForceFullCalculation},2212:{n:"ShapePropsStream",f:parse_ShapePropsStream},2213:{n:"TextPropsStream",f:parse_TextPropsStream},2214:{n:"RichTextStream",f:parse_RichTextStream},2215:{n:"CrtLayout12A",f:parse_CrtLayout12A},4097:{n:"Units",f:parse_Units},4098:{n:"Chart",f:parse_Chart},4099:{n:"Series",f:parse_Series},4102:{n:"DataFormat",f:parse_DataFormat},4103:{n:"LineFormat",f:parse_LineFormat},4105:{n:"MarkerFormat",f:parse_MarkerFormat},4106:{n:"AreaFormat",f:parse_AreaFormat},4107:{n:"PieFormat",f:parse_PieFormat},4108:{n:"AttachedLabel",f:parse_AttachedLabel},4109:{n:"SeriesText",f:parse_SeriesText},4116:{n:"ChartFormat",f:parse_ChartFormat},4117:{n:"Legend",f:parse_Legend},4118:{n:"SeriesList",f:parse_SeriesList},4119:{n:"Bar",f:parse_Bar},4120:{n:"Line",f:parse_Line},4121:{n:"Pie",f:parse_Pie},4122:{n:"Area",f:parse_Area},4123:{n:"Scatter",f:parse_Scatter},4124:{n:"CrtLine",f:parse_CrtLine},4125:{n:"Axis",f:parse_Axis},4126:{n:"Tick",f:parse_Tick},4127:{n:"ValueRange",f:parse_ValueRange},4128:{n:"CatSerRange",f:parse_CatSerRange},4129:{n:"AxisLine",f:parse_AxisLine},4130:{n:"CrtLink",f:parse_CrtLink},4132:{n:"DefaultText",f:parse_DefaultText},4133:{n:"Text",f:parse_Text},4134:{n:"FontX",f:parse_FontX},4135:{n:"ObjectLink",f:parse_ObjectLink},4146:{n:"Frame",f:parse_Frame},4147:{n:"Begin",f:parse_Begin},4148:{n:"End",f:parse_End},4149:{n:"PlotArea",f:parse_PlotArea},4154:{n:"Chart3d",f:parse_Chart3d},4156:{n:"PicF",f:parse_PicF},4157:{n:"DropBar",f:parse_DropBar},4158:{n:"Radar",f:parse_Radar},4159:{n:"Surf",f:parse_Surf},4160:{n:"RadarArea",f:parse_RadarArea},4161:{n:"AxisParent",f:parse_AxisParent},4163:{n:"LegendException",f:parse_LegendException},4164:{n:"ShtProps",f:parse_ShtProps},4165:{n:"SerToCrt",f:parse_SerToCrt},4166:{n:"AxesUsed",f:parse_AxesUsed},4168:{n:"SBaseRef",f:parse_SBaseRef},4170:{n:"SerParent",f:parse_SerParent},4171:{n:"SerAuxTrend",f:parse_SerAuxTrend},4174:{n:"IFmtRecord",f:parse_IFmtRecord},4175:{n:"Pos",f:parse_Pos},4176:{n:"AlRuns",f:parse_AlRuns},4177:{n:"BRAI",f:parse_BRAI},4187:{n:"SerAuxErrBar",f:parse_SerAuxErrBar},4188:{n:"ClrtClient",f:parse_ClrtClient},4189:{n:"SerFmt",f:parse_SerFmt},4191:{n:"Chart3DBarShape",f:parse_Chart3DBarShape},4192:{n:"Fbi",f:parse_Fbi},4193:{n:"BopPop",f:parse_BopPop},4194:{n:"AxcExt",f:parse_AxcExt},4195:{n:"Dat",f:parse_Dat},4196:{n:"PlotGrowth",f:parse_PlotGrowth},4197:{n:"SIIndex",f:parse_SIIndex},4198:{n:"GelFrame",f:parse_GelFrame},4199:{n:"BopPopCustom",f:parse_BopPopCustom},4200:{n:"Fbi2",f:parse_Fbi2},22:{n:"ExternCount",f:parsenoop},126:{n:"RK",f:parsenoop},127:{n:"ImData",f:parsenoop},135:{n:"Addin",f:parsenoop},136:{n:"Edg",f:parsenoop},137:{n:"Pub",f:parsenoop},145:{n:"Sub",f:parsenoop},148:{n:"LHRecord",f:parsenoop},149:{n:"LHNGraph",f:parsenoop},150:{n:"Sound",f:parsenoop},169:{n:"CoordList",f:parsenoop},171:{n:"GCW",f:parsenoop},188:{n:"ShrFmla",f:parsenoop},194:{n:"AddMenu",f:parsenoop},195:{n:"DelMenu",f:parsenoop},214:{n:"RString",f:parsenoop},223:{n:"UDDesc",f:parsenoop},234:{n:"TabIdConf",f:parsenoop},354:{n:"XL5Modify",f:parsenoop},421:{n:"FileSharing2",f:parsenoop},536:{n:"Name",f:parsenoop},547:{n:"ExternName",f:parse_ExternName},561:{n:"Font",f:parsenoop},1030:{n:"Formula",f:parse_Formula},2157:{n:"FeatInfo",f:parsenoop},2163:{n:"FeatInfo11",f:parsenoop},2177:{n:"SXAddl12",f:parsenoop},2240:{n:"AutoWebPub",f:parsenoop},2241:{n:"ListObj",f:parsenoop},2242:{n:"ListField",f:parsenoop},2243:{n:"ListDV",f:parsenoop},2244:{n:"ListCondFmt",f:parsenoop},2245:{n:"ListCF",f:parsenoop},2246:{n:"FMQry",f:parsenoop},2247:{n:"FMSQry",f:parsenoop},2248:{n:"PLV",f:parsenoop},2249:{n:"LnExt",f:parsenoop},2250:{n:"MkrExt",f:parsenoop},2251:{n:"CrtCoopt",f:parsenoop},0:{}};var CountryEnum={1:"US",2:"CA",3:"",7:"RU",20:"EG",30:"GR",31:"NL",32:"BE",33:"FR",34:"ES",36:"HU",39:"IT",41:"CH",43:"AT",44:"GB",45:"DK",46:"SE",47:"NO",48:"PL",49:"DE",52:"MX",55:"BR",61:"AU",64:"NZ",66:"TH",81:"JP",82:"KR",84:"VN",86:"CN",90:"TR",105:"JS",213:"DZ",216:"MA",218:"LY",351:"PT",354:"IS",358:"FI",420:"CZ",886:"TW",961:"LB",962:"JO",963:"SY",964:"IQ",965:"KW",966:"SA",971:"AE",972:"IL",974:"QA",981:"IR",65535:"US"};function fix_opts_func(defaults){return function fix_opts(opts){for(var i=0;i!=defaults.length;++i){var d=defaults[i];if(typeof opts[d[0]]==="undefined")opts[d[0]]=d[1];if(d[2]==="n")opts[d[0]]=Number(opts[d[0]])}}}var fixopts=fix_opts_func([["cellNF",false],["cellFormula",true],["sheetRows",0,"n"],["bookSheets",false],["bookProps",false],["bookFiles",false],["password",""],["WTF",false]]);function parse_compobj(obj){var v={};var o=obj.content;var l=28,m;m=__lpstr(o,l);l+=4+__readUInt32LE(o,l);v.UserType=m;m=__readUInt32LE(o,l);l+=4;switch(m){case 0:break;case 4294967295:case 4294967294:l+=4;break;default:if(m>400)throw new Error("Unsupported Clipboard: "+m.toString(16));l+=m}m=__lpstr(o,l);l+=m.length===0?0:5+m.length;v.Reserved1=m;if((m=__readUInt32LE(o,l))!==1907550708)return v;throw"Unsupported Unicode Extension"}function parse_xlscfb(cfb,options){if(!options)options={};fixopts(options);reset_cp();var CompObj=cfb.find("!CompObj");var Summary=cfb.find("!SummaryInformation");var Workbook=cfb.find("/Workbook");if(!Workbook)Workbook=cfb.find("/Book");var CompObjP,SummaryP,WorkbookP;function slurp(R,blob,length,opts){var l=length;var bufs=[];var d=blob.slice(blob.l,blob.l+l);if(opts.enc&&opts.enc.insitu_decrypt)switch(R.n){case"BOF":case"FilePass":case"FileLock":case"InterfaceHdr":case"RRDInfo":case"RRDHead":case"UsrExcl":break;default:if(d.length===0)break;opts.enc.insitu_decrypt(d)}bufs.push(d);blob.l+=l;var next=RecordEnum[__readUInt16LE(blob,blob.l)];while(next!=null&&next.n==="Continue"){l=__readUInt16LE(blob,blob.l+2);bufs.push(blob.slice(blob.l+4,blob.l+4+l));blob.l+=4+l;next=RecordEnum[__readUInt16LE(blob,blob.l)]}var b=bconcat(bufs);prep_blob(b,0);var ll=0;b.lens=[];for(var j=0;j<bufs.length;++j){b.lens.push(ll);ll+=bufs[j].length}return R.f(b,b.length,opts)}function safe_format_xf(p,opts){if(!p.XF)return;try{var fmtid=p.XF.ifmt||0;if(fmtid===0){if(p.t==="n"){if((p.v|0)===p.v)p.w=SSF._general_int(p.v);else p.w=SSF._general_num(p.v)}else p.w=SSF._general(p.v)}else p.w=SSF.format(fmtid,p.v);if(opts.cellNF)p.z=SSF._table[fmtid]}catch(e){if(opts.WTF)throw e}}function make_cell(val,ixfe,t){return{v:val,ixfe:ixfe,t:t}}function parse_workbook(blob,options){var wb={opts:{}};var Sheets={};var out={};var Directory={};var found_sheet=false;var range={};var last_formula=null;var sst=[];var cur_sheet="";var Preamble={};var lastcell,last_cell,cc,cmnt,rng,rngC,rngR;var shared_formulae={};var array_formulae=[];var temp_val;var country;var cell_valid=true;var XFs=[];var addline=function addline(cell,line,options){if(!cell_valid)return;lastcell=cell;last_cell=encode_cell(cell);if(range.s){if(cell.r<range.s.r)range.s.r=cell.r;if(cell.c<range.s.c)range.s.c=cell.c}if(range.e){if(cell.r+1>range.e.r)range.e.r=cell.r+1;if(cell.c+1>range.e.c)range.e.c=cell.c+1}if(options.sheetRows&&lastcell.r>=options.sheetRows)cell_valid=false;else out[last_cell]=line};var opts={enc:false,sbcch:0,snames:[],sharedf:shared_formulae,arrayf:array_formulae,rrtabid:[],lastuser:"",biff:8,codepage:0,winlocked:0,wtf:false};if(options.password)opts.password=options.password;var mergecells=[];var objects=[];var supbooks=[[]];var sbc=0,sbci=0,sbcli=0;supbooks.SheetNames=opts.snames;supbooks.sharedf=opts.sharedf;supbooks.arrayf=opts.arrayf;var last_Rn="";var file_depth=0;while(blob.l<blob.length-1){var s=blob.l;var RecordType=blob.read_shift(2);if(RecordType===0&&last_Rn==="EOF")break;var length=blob.l===blob.length?0:blob.read_shift(2),y;var R=RecordEnum[RecordType];if(R&&R.f){if(options.bookSheets){if(last_Rn==="BoundSheet8"&&R.n!=="BoundSheet8")break}last_Rn=R.n;if(R.r===2||R.r==12){var rt=blob.read_shift(2);length-=2;if(!opts.enc&&rt!==RecordType)throw"rt mismatch";if(R.r==12){blob.l+=10;length-=10}}var val;if(R.n==="EOF")val=R.f(blob,length,opts);else val=slurp(R,blob,length,opts);var Rn=R.n;if(opts.biff===5)switch(Rn){case"Lbl":Rn="Label";break}switch(Rn){case"Date1904":wb.opts.Date1904=val;break;case"WriteProtect":wb.opts.WriteProtect=true;break;case"FilePass":if(!opts.enc)blob.l=0;opts.enc=val;if(opts.WTF)console.error(val);if(!options.password)throw new Error("File is password-protected");if(val.Type!==0)throw new Error("Encryption scheme unsupported");if(!val.valid)throw new Error("Password is incorrect");break;case"WriteAccess":opts.lastuser=val;break;case"FileSharing":break;case"CodePage":if(val===21010)val=1200;opts.codepage=val;set_cp(val);break;case"RRTabId":opts.rrtabid=val;break;case"WinProtect":opts.winlocked=val;break;case"Template":break;case"RefreshAll":wb.opts.RefreshAll=val;break;case"BookBool":break;case"UsesELFs":break;case"MTRSettings":{if(val[0]&&val[1])throw"Unsupported threads: "+val}break;case"CalcCount":wb.opts.CalcCount=val;break;case"CalcDelta":wb.opts.CalcDelta=val;break;case"CalcIter":wb.opts.CalcIter=val;break;case"CalcMode":wb.opts.CalcMode=val;break;case"CalcPrecision":wb.opts.CalcPrecision=val;break;case"CalcSaveRecalc":wb.opts.CalcSaveRecalc=val;break;case"CalcRefMode":opts.CalcRefMode=val;break;case"Uncalced":break;case"ForceFullCalculation":wb.opts.FullCalc=val;break;case"WsBool":break;case"XF":XFs.push(val);break;case"ExtSST":break;case"BookExt":break;case"RichTextStream":break;case"BkHim":break;case"SupBook":supbooks[++sbc]=[val];sbci=0;break;case"ExternName":supbooks[sbc][++sbci]=val;break;case"Index":break;case"Lbl":supbooks[0][++sbcli]=val;break;case"ExternSheet":supbooks[sbc]=supbooks[sbc].concat(val);sbci+=val.length;break;case"Protect":out["!protect"]=val;break;case"Password":if(val!==0&&opts.WTF)console.error("Password verifier: "+val);break;case"Prot4Rev":case"Prot4RevPass":break;case"BoundSheet8":{Directory[val.pos]=val;opts.snames.push(val.name)}break;case"EOF":{if(--file_depth)break;if(range.e){out["!range"]=range;if(range.e.r>0&&range.e.c>0){range.e.r--;range.e.c--;out["!ref"]=encode_range(range);range.e.r++;range.e.c++}if(mergecells.length>0)out["!merges"]=mergecells;if(objects.length>0)out["!objects"]=objects}if(cur_sheet==="")Preamble=out;else Sheets[cur_sheet]=out;out={}}break;case"BOF":{if(val.BIFFVer===1280)opts.biff=5;if(file_depth++)break;cell_valid=true;out={};cur_sheet=(Directory[s]||{name:""}).name;mergecells=[];objects=[]}break;case"Number":{temp_val={ixfe:val.ixfe,XF:XFs[val.ixfe],v:val.val,t:"n"};if(temp_val.XF)safe_format_xf(temp_val,options);addline({c:val.c,r:val.r},temp_val,options)}break;case"BoolErr":{temp_val={ixfe:val.ixfe,XF:XFs[val.ixfe],v:val.val,t:val.t};if(temp_val.XF)safe_format_xf(temp_val,options);addline({c:val.c,r:val.r},temp_val,options)}break;case"RK":{temp_val={ixfe:val.ixfe,XF:XFs[val.ixfe],v:val.rknum,t:"n"};if(temp_val.XF)safe_format_xf(temp_val,options);addline({c:val.c,r:val.r},temp_val,options)}break;case"MulRk":{for(var j=val.c;j<=val.C;++j){var ixfe=val.rkrec[j-val.c][0];temp_val={ixfe:ixfe,XF:XFs[ixfe],v:val.rkrec[j-val.c][1],t:"n"};if(temp_val.XF)safe_format_xf(temp_val,options);addline({c:j,r:val.r},temp_val,options)}}break;case"Formula":{switch(val.val){case"String":last_formula=val;break;case"Array Formula":throw"Array Formula unsupported";default:temp_val={v:val.val,ixfe:val.cell.ixfe,t:val.tt};temp_val.XF=XFs[temp_val.ixfe];if(options.cellFormula)temp_val.f="="+stringify_formula(val.formula,range,val.cell,supbooks,opts);if(temp_val.XF)safe_format_xf(temp_val,options);addline(val.cell,temp_val,options);last_formula=val}}break;case"String":{if(last_formula){last_formula.val=val;temp_val={v:last_formula.val,ixfe:last_formula.cell.ixfe,t:"s"};temp_val.XF=XFs[temp_val.ixfe];if(options.cellFormula)temp_val.f="="+stringify_formula(last_formula.formula,range,last_formula.cell,supbooks,opts);if(temp_val.XF)safe_format_xf(temp_val,options);addline(last_formula.cell,temp_val,options);last_formula=null}}break;case"Array":{array_formulae.push(val)}break;case"ShrFmla":{if(!cell_valid)break;shared_formulae[encode_cell(last_formula.cell)]=val[0]}break;case"LabelSst":temp_val=make_cell(sst[val.isst].t,val.ixfe,"s");temp_val.XF=XFs[temp_val.ixfe];if(temp_val.XF)safe_format_xf(temp_val,options);addline({c:val.c,r:val.r},temp_val,options);break;case"Label":temp_val=make_cell(val.val,val.ixfe,"s");temp_val.XF=XFs[temp_val.ixfe]; |
18582 // date | 18562 if(temp_val.XF)safe_format_xf(temp_val,options);addline({c:val.c,r:val.r},temp_val,options);break;case"Dimensions":{if(file_depth===1)range=val}break;case"SST":{sst=val}break;case"Format":{SSF.load(val[1],val[0])}break;case"MergeCells":mergecells=mergecells.concat(val);break;case"Obj":objects[val.cmo[0]]=opts.lastobj=val;break;case"TxO":opts.lastobj.TxO=val;break;case"HLink":{for(rngR=val[0].s.r;rngR<=val[0].e.r;++rngR)for(rngC=val[0].s.c;rngC<=val[0].e.c;++rngC)if(out[encode_cell({c:rngC,r:rngR})])out[encode_cell({c:rngC,r:rngR})].l=val[1]}break;case"HLinkTooltip":{for(rngR=val[0].s.r;rngR<=val[0].e.r;++rngR)for(rngC=val[0].s.c;rngC<=val[0].e.c;++rngC)if(out[encode_cell({c:rngC,r:rngR})])out[encode_cell({c:rngC,r:rngR})].l.tooltip=val[1]}break;case"Note":{if(opts.biff===5)break;cc=out[encode_cell(val[0])];var noteobj=objects[val[2]];if(!cc)break;if(!cc.c)cc.c=[];cmnt={a:val[1],t:noteobj.TxO.t};cc.c.push(cmnt)}break;case"NameCmt":break;default:switch(R.n){case"Header":break;case"Footer":break;case"HCenter":break;case"VCenter":break;case"Pls":break;case"Setup":break;case"DefColWidth":break;case"GCW":break;case"LHRecord":break;case"ColInfo":break;case"Row":break;case"DBCell":break;case"MulBlank":break;case"EntExU2":break;case"SxView":break;case"Sxvd":break;case"SXVI":break;case"SXVDEx":break;case"SxIvd":break;case"SXDI":break;case"SXLI":break;case"SXEx":break;case"QsiSXTag":break;case"Selection":break;case"Feat":break;case"FeatHdr":case"FeatHdr11":break;case"Feature11":case"Feature12":case"List12":break;case"Blank":break;case"Country":country=val;break;case"RecalcId":break;case"DefaultRowHeight":case"DxGCol":break;case"Fbi":case"Fbi2":case"GelFrame":break;case"Font":break;case"XFCRC":break;case"XFExt":break;case"Style":break;case"StyleExt":break;case"Palette":break;case"ClrtClient":break;case"Theme":break;case"ScenarioProtect":break;case"ObjProtect":break;case"CondFmt12":break;case"Table":break;case"TableStyles":break;case"TableStyle":break;case"TableStyleElement":break;case"SXStreamID":break;case"SXVS":break;case"DConRef":break;case"SXAddl":break;case"DConName":break;case"SXPI":break;case"SxFormat":break;case"SxSelect":break;case"SxRule":break;case"SxFilt":break;case"SxItm":break;case"SxDXF":break;case"ScenMan":break;case"DCon":break;case"CellWatch":break;case"PrintRowCol":break;case"PrintGrid":break;case"PrintSize":break;case"XCT":break;case"CRN":break;case"Scl":{}break;case"SheetExt":{}break;case"SheetExtOptional":{}break;case"ObNoMacros":{}break;case"ObProj":{}break;case"CodeName":{}break;case"GUIDTypeLib":{}break;case"WOpt":break;case"PhoneticInfo":break;case"OleObjectSize":break;case"DXF":case"DXFN":case"DXFN12":case"DXFN12List":case"DXFN12NoCB":break;case"Dv":case"DVal":break;case"BRAI":case"Series":case"SeriesText":break;case"DConn":break;case"DbOrParamQry":break;case"DBQueryExt":break;case"IFmtRecord":break;case"CondFmt":case"CF":case"CF12":case"CFEx":break;case"Excel9File":break;case"Units":break;case"InterfaceHdr":case"Mms":case"InterfaceEnd":case"DSF":case"BuiltInFnGroupCount":case"Window1":case"Window2":case"HideObj":case"GridSet":case"Guts":case"UserBView":case"UserSViewBegin":case"UserSViewEnd":case"Pane":break;default:switch(R.n){case"Dat":case"Begin":case"End":case"StartBlock":case"EndBlock":case"Frame":case"Area":case"Axis":case"AxisLine":case"Tick":break;case"AxesUsed":case"CrtLayout12":case"CrtLayout12A":case"CrtLink":case"CrtLine":case"CrtMlFrt":break;case"LineFormat":case"AreaFormat":case"Chart":case"Chart3d":case"Chart3DBarShape":case"ChartFormat":case"ChartFrtInfo":break;case"PlotArea":case"PlotGrowth":break;case"SeriesList":case"SerParent":case"SerAuxTrend":break;case"DataFormat":case"SerToCrt":case"FontX":break;case"CatSerRange":case"AxcExt":case"SerFmt":break;case"ShtProps":break;case"DefaultText":case"Text":case"CatLab":break;case"DataLabExtContents":break;case"Legend":case"LegendException":break;case"Pie":case"Scatter":break;case"PieFormat":case"MarkerFormat":break;case"StartObject":case"EndObject":break;case"AlRuns":case"ObjectLink":break;case"SIIndex":break;case"AttachedLabel":break;case"Line":case"Bar":break;case"Surf":break;case"AxisParent":break;case"Pos":break;case"ValueRange":break;case"SXViewEx9":break;case"SXViewLink":break;case"PivotChartBits":break;case"SBaseRef":break;case"TextPropsStream":break;case"LnExt":break;case"MkrExt":break;case"CrtCoopt":break;case"Qsi":case"Qsif":case"Qsir":case"QsiSXTag":break;case"TxtQry":break;case"FilterMode":break;case"AutoFilter":case"AutoFilterInfo":break;case"AutoFilter12":break;case"DropDownObjIds":break;case"Sort":break;case"SortData":break;case"ShapePropsStream":break;case"MsoDrawing":case"MsoDrawingGroup":case"MsoDrawingSelection":break;case"ImData":break;case"WebPub":case"AutoWebPub":case"RightMargin":case"LeftMargin":case"TopMargin":case"BottomMargin":case"HeaderFooter":case"HFPicture":case"PLV":case"HorizontalPageBreaks":case"VerticalPageBreaks":case"Backup":case"CompressPictures":case"Compat12":break;case"Continue":case"ContinueFrt12":break;case"ExternCount":break;case"RString":break;case"TabIdConf":case"Radar":case"RadarArea":case"DropBar":case"Intl":case"CoordList":case"SerAuxErrBar":break;default:if(options.WTF)throw"Unrecognized Record "+R.n}}}}else blob.l+=length}var sheetnamesraw=Object.keys(Directory).sort(function(a,b){return Number(a)-Number(b)}).map(function(x){return Directory[x].name});var sheetnames=sheetnamesraw.slice();wb.Directory=sheetnamesraw;wb.SheetNames=sheetnamesraw;if(!options.bookSheets)wb.Sheets=Sheets;wb.Preamble=Preamble;wb.Strings=sst;wb.SSF=SSF.get_table();if(opts.enc)wb.Encryption=opts.enc;wb.Metadata={};if(country!==undefined)wb.Metadata.Country=country;return wb}if(CompObj)CompObjP=parse_compobj(CompObj);if(options.bookProps&&!options.bookSheets)WorkbookP={};else{if(Workbook)WorkbookP=parse_workbook(Workbook.content,options);else throw new Error("Cannot find Workbook stream")}parse_props(cfb);var props={};for(var y in cfb.Summary)props[y]=cfb.Summary[y];for(y in cfb.DocSummary)props[y]=cfb.DocSummary[y];WorkbookP.Props=WorkbookP.Custprops=props;if(options.bookFiles)WorkbookP.cfb=cfb;WorkbookP.CompObjP=CompObjP;return WorkbookP}function parse_props(cfb){var DSI=cfb.find("!DocumentSummaryInformation");if(DSI)try{cfb.DocSummary=parse_PropertySetStream(DSI,DocSummaryPIDDSI)}catch(e){}var SI=cfb.find("!SummaryInformation");if(SI)try{cfb.Summary=parse_PropertySetStream(SI,SummaryPIDSI)}catch(e){}}var encregex=/&[a-z]*;/g,coderegex=/_x([0-9a-fA-F]+)_/g;function coderepl(m,c){return _chr(parseInt(c,16))}function encrepl($$){return encodings[$$]}function unescapexml(s){if(s.indexOf("&")>-1)s=s.replace(encregex,encrepl);return s.indexOf("_")===-1?s:s.replace(coderegex,coderepl)}function parsexmlbool(value,tag){switch(value){case"1":case"true":case"TRUE":return true;default:return false}}function matchtag(f,g){return new RegExp("<"+f+'(?: xml:space="preserve")?>([^☃]*)</'+f+">",(g||"")+"m")}var entregex=/&#(\d+);/g;function entrepl($$,$1){return String.fromCharCode(parseInt($1,10))}function fixstr(str){return str.replace(entregex,entrepl)}var everted_BERR=evert(BERR);var magic_formats={"General Number":"General","General Date":SSF._table[22],"Long Date":"dddd, mmmm dd, yyyy","Medium Date":SSF._table[15],"Short Date":SSF._table[14],"Long Time":SSF._table[19],"Medium Time":SSF._table[18],"Short Time":SSF._table[20],Currency:'"$"#,##0.00_);[Red]\\("$"#,##0.00\\)',Fixed:SSF._table[2],Standard:SSF._table[4],Percent:SSF._table[10],Scientific:SSF._table[11],"Yes/No":'"Yes";"Yes";"No";@',"True/False":'"True";"True";"False";@',"On/Off":'"Yes";"Yes";"No";@'};function xlml_format(format,value){var fmt=magic_formats[format]||unescapexml(format);if(fmt==="General")return SSF._general(value);return SSF.format(fmt,value)}function xlml_set_prop(Props,tag,val){switch(tag){case"Description":tag="Comments";break}Props[tag]=val}function xlml_set_custprop(Custprops,Rn,cp,val){switch((cp[0].match(/dt:dt="([\w.]+)"/)||["",""])[1]){case"boolean":val=parsexmlbool(val);break;case"i2":case"int":val=parseInt(val,10);break;case"r4":case"float":val=parseFloat(val);break;case"date":case"dateTime.tz":val=new Date(val);break;case"i8":case"string":case"fixed":case"uuid":case"bin.base64":break;default:throw"bad custprop:"+cp[0]}Custprops[unescapexml(Rn[3])]=val}function safe_format_xlml(cell,nf,o){try{if(nf==="General"){if(cell.t==="n"){if((cell.v|0)===cell.v)cell.w=SSF._general_int(cell.v);else cell.w=SSF._general_num(cell.v)}else cell.w=SSF._general(cell.v)}else cell.w=xlml_format(nf||"General",cell.v);if(o.cellNF)cell.z=magic_formats[nf]||nf||"General"}catch(e){if(o.WTF)throw e}}function parse_xlml_data(xml,ss,data,cell,base,styles,csty,o){var nf="General",sid=cell.StyleID;o=o||{};if(sid===undefined&&csty)sid=csty.StyleID;while(styles[sid]!==undefined){if(styles[sid].nf)nf=styles[sid].nf;if(!styles[sid].Parent)break;sid=styles[sid].Parent}switch(data.Type){case"Boolean":cell.t="b";cell.v=parsexmlbool(xml);break;case"String":cell.t="str";cell.r=fixstr(unescapexml(xml));cell.v=xml.indexOf("<")>-1?ss:cell.r;break;case"DateTime":cell.v=(Date.parse(xml)-new Date(Date.UTC(1899,11,30)))/(24*60*60*1e3);if(cell.v!==cell.v)cell.v=unescapexml(xml);else if(cell.v>=1&&cell.v<60)cell.v=cell.v-1;if(!nf||nf=="General")nf="yyyy-mm-dd";case"Number":if(cell.v===undefined)cell.v=+xml;if(!cell.t)cell.t="n";break;case"Error":cell.t="e";cell.v=xml;cell.w=xml;break;default:cell.t="s";cell.v=fixstr(ss);break}if(cell.t!=="e")safe_format_xlml(cell,nf,o);if(o.cellFormula!=null&&cell.Formula){cell.f=rc_to_a1(unescapexml(cell.Formula),base);cell.Formula=undefined}cell.ixfe=cell.StyleID!==undefined?cell.StyleID:"Default"}function xlml_clean_comment(comment){comment.t=comment.v;comment.v=comment.w=comment.ixfe=undefined}function xlml_normalize(d){if(has_buf&&Buffer.isBuffer(d))return d.toString("utf8");if(typeof d==="string")return d;throw"badf"}var xlmlregex=/<(\/?)([a-z0-9]*:|)(\w+)[^>]*>/gm;function parse_xlml_xml(d,opts){var str=xlml_normalize(d);var Rn;var state=[],tmp;var sheets={},sheetnames=[],cursheet={},sheetname="";var table={},cell={},row={},dtag,didx;var c=0,r=0;var refguess={s:{r:1e6,c:1e6},e:{r:0,c:0}};var styles={},stag={};var ss="",fidx=0;var mergecells=[];var Props={},Custprops={},pidx=0,cp={};var comments=[],comment={};var cstys=[],csty;while(Rn=xlmlregex.exec(str))switch(Rn[3]){case"Data":if(state[state.length-1][1])break;if(Rn[1]==="/")parse_xlml_data(str.slice(didx,Rn.index),ss,dtag,state[state.length-1][0]=="Comment"?comment:cell,{c:c,r:r},styles,cstys[c],opts);else{ss="";dtag=parsexmltag(Rn[0]);didx=Rn.index+Rn[0].length}break;case"Cell":if(Rn[1]==="/"){if(comments.length>0)cell.c=comments;if((!opts.sheetRows||opts.sheetRows>r)&&cell.v!==undefined)cursheet[encode_col(c)+encode_row(r)]=cell;if(cell.HRef){cell.l={Target:cell.HRef,tooltip:cell.HRefScreenTip};cell.HRef=cell.HRefScreenTip=undefined}if(cell.MergeAcross||cell.MergeDown){var cc=c+(parseInt(cell.MergeAcross,10)|0);var rr=r+(parseInt(cell.MergeDown,10)|0);mergecells.push({s:{c:c,r:r},e:{c:cc,r:rr}})}++c;if(cell.MergeAcross)c+=+cell.MergeAcross}else{cell=parsexmltagobj(Rn[0]);if(cell.Index)c=+cell.Index-1;if(c<refguess.s.c)refguess.s.c=c;if(c>refguess.e.c)refguess.e.c=c;if(Rn[0].substr(-2)==="/>")++c;comments=[]}break;case"Row":if(Rn[1]==="/"||Rn[0].substr(-2)==="/>"){if(r<refguess.s.r)refguess.s.r=r;if(r>refguess.e.r)refguess.e.r=r;if(Rn[0].substr(-2)==="/>"){row=parsexmltag(Rn[0]);if(row.Index)r=+row.Index-1}c=0;++r}else{row=parsexmltag(Rn[0]);if(row.Index)r=+row.Index-1}break;case"Worksheet":if(Rn[1]==="/"){if((tmp=state.pop())[0]!==Rn[3])throw"Bad state: "+tmp;sheetnames.push(sheetname);if(refguess.s.r<=refguess.e.r&&refguess.s.c<=refguess.e.c)cursheet["!ref"]=encode_range(refguess);if(mergecells.length)cursheet["!merges"]=mergecells;sheets[sheetname]=cursheet}else{refguess={s:{r:1e6,c:1e6},e:{r:0,c:0}};r=c=0;state.push([Rn[3],false]);tmp=parsexmltag(Rn[0]);sheetname=tmp.Name;cursheet={};mergecells=[]}break;case"Table":if(Rn[1]==="/"){if((tmp=state.pop())[0]!==Rn[3])throw"Bad state: "+tmp}else if(Rn[0].slice(-2)=="/>")break;else{table=parsexmltag(Rn[0]);state.push([Rn[3],false]);cstys=[]}break;case"Style":if(Rn[1]==="/")styles[stag.ID]=stag;else stag=parsexmltag(Rn[0]);break;case"NumberFormat":stag.nf=parsexmltag(Rn[0]).Format||"General";break;case"Column":if(state[state.length-1][0]!=="Table")break;csty=parsexmltag(Rn[0]);cstys[csty.Index-1||cstys.length]=csty;for(var i=0;i<+csty.Span;++i)cstys[cstys.length]=csty;break;case"NamedRange":break;case"NamedCell":break;case"B":break;case"I":break;case"U":break;case"S":break;case"Sub":break;case"Sup":break;case"Span":break;case"Border":break;case"Alignment":break;case"Borders":break;case"Font":if(Rn[0].substr(-2)==="/>")break;else if(Rn[1]==="/")ss+=str.slice(fidx,Rn.index);else fidx=Rn.index+Rn[0].length;break;case"Interior":break;case"Protection":break;case"Author":case"Title":case"Description":case"Created":case"Keywords":case"Subject":case"Category":case"Company":case"LastAuthor":case"LastSaved":case"LastPrinted":case"Version":case"Revision":case"TotalTime":case"HyperlinkBase":case"Manager":if(Rn[0].substr(-2)==="/>")break;else if(Rn[1]==="/")xlml_set_prop(Props,Rn[3],str.slice(pidx,Rn.index));else pidx=Rn.index+Rn[0].length;break;case"Paragraphs":break;case"Styles":case"Workbook":if(Rn[1]==="/"){if((tmp=state.pop())[0]!==Rn[3])throw"Bad state: "+tmp}else state.push([Rn[3],false]);break;case"Comment":if(Rn[1]==="/"){if((tmp=state.pop())[0]!==Rn[3])throw"Bad state: "+tmp;xlml_clean_comment(comment);comments.push(comment)}else{state.push([Rn[3],false]);tmp=parsexmltag(Rn[0]);comment={a:tmp.Author}}break;case"Name":break;case"ComponentOptions":case"DocumentProperties":case"CustomDocumentProperties":case"OfficeDocumentSettings":case"PivotTable":case"PivotCache":case"Names":case"MapInfo":case"PageBreaks":case"QueryTable":case"DataValidation":case"AutoFilter":case"Sorting":case"Schema":case"data":case"ConditionalFormatting":case"SmartTagType":case"SmartTags":case"ExcelWorkbook":case"WorkbookOptions":case"WorksheetOptions":if(Rn[1]==="/"){if((tmp=state.pop())[0]!==Rn[3])throw"Bad state: "+tmp}else if(Rn[0].charAt(Rn[0].length-2)!=="/")state.push([Rn[3],true]);break;default:var seen=true;switch(state[state.length-1][0]){case"OfficeDocumentSettings":switch(Rn[3]){case"AllowPNG":break;case"RemovePersonalInformation":break;case"DownloadComponents":break;case"LocationOfComponents":break;case"Colors":break;case"Color":break;case"Index":break;case"RGB":break;case"PixelsPerInch":break;case"TargetScreenSize":break;case"ReadOnlyRecommended":break;default:seen=false}break;case"ComponentOptions":switch(Rn[3]){case"Toolbar":break;case"HideOfficeLogo":break;case"SpreadsheetAutoFit":break;case"Label":break;case"Caption":break;case"MaxHeight":break;case"MaxWidth":break;case"NextSheetNumber":break;default:seen=false}break;case"ExcelWorkbook":switch(Rn[3]){case"WindowHeight":break;case"WindowWidth":break;case"WindowTopX":break;case"WindowTopY":break;case"TabRatio":break;case"ProtectStructure":break;case"ProtectWindows":break;case"ActiveSheet":break;case"DisplayInkNotes":break;case"FirstVisibleSheet":break;case"SupBook":break;case"SheetName":break;case"SheetIndex":break;case"SheetIndexFirst":break;case"SheetIndexLast":break;case"Dll":break;case"AcceptLabelsInFormulas":break;case"DoNotSaveLinkValues":break;case"Date1904":break;case"Iteration":break;case"MaxIterations":break;case"MaxChange":break;case"Path":break;case"Xct":break;case"Count":break;case"SelectedSheets":break;case"Calculation":break;case"Uncalced":break;case"StartupPrompt":break;case"Crn":break;case"ExternName":break;case"Formula":break;case"ColFirst":break;case"ColLast":break;case"WantAdvise":break;case"Boolean":break;case"Error":break;case"Text":break;case"OLE":break;case"NoAutoRecover":break;case"PublishObjects":break;case"DoNotCalculateBeforeSave":break;case"Number":break;case"RefModeR1C1":break;case"EmbedSaveSmartTags":break;default:seen=false}break;case"WorkbookOptions":switch(Rn[3]){case"OWCVersion":break;case"Height":break;case"Width":break;default:seen=false}break;case"WorksheetOptions":switch(Rn[3]){case"Unsynced":break;case"Visible":break;case"Print":break;case"Panes":break;case"Scale":break;case"Pane":break;case"Number":break;case"Layout":break;case"Header":break;case"Footer":break;case"PageSetup":break;case"PageMargins":break;case"Selected":break;case"ProtectObjects":break;case"EnableSelection":break;case"ProtectScenarios":break;case"ValidPrinterInfo":break;case"HorizontalResolution":break;case"VerticalResolution":break;case"NumberofCopies":break;case"ActiveRow":break;case"ActiveCol":break;case"ActivePane":break;case"TopRowVisible":break;case"TopRowBottomPane":break;case"LeftColumnVisible":break;case"LeftColumnRightPane":break;case"FitToPage":break;case"RangeSelection":break;case"PaperSizeIndex":break;case"PageLayoutZoom":break;case"PageBreakZoom":break;case"FilterOn":break;case"DoNotDisplayGridlines":break;case"SplitHorizontal":break;case"SplitVertical":break;case"FreezePanes":break;case"FrozenNoSplit":break;case"FitWidth":break;case"FitHeight":break;case"CommentsLayout":break;case"Zoom":break;case"LeftToRight":break;case"Gridlines":break;case"AllowSort":break;case"AllowFilter":break;case"AllowInsertRows":break;case"AllowDeleteRows":break;case"AllowInsertCols":break;case"AllowDeleteCols":break;case"AllowInsertHyperlinks":break;case"AllowFormatCells":break;case"AllowSizeCols":break;case"AllowSizeRows":break;case"NoSummaryRowsBelowDetail":break;case"TabColorIndex":break;case"DoNotDisplayHeadings":break;case"ShowPageLayoutZoom":break;case"NoSummaryColumnsRightDetail":break;case"BlackAndWhite":break;case"DoNotDisplayZeros":break;case"DisplayPageBreak":break;case"RowColHeadings":break;case"DoNotDisplayOutline":break;case"NoOrientation":break;case"AllowUsePivotTables":break;case"ZeroHeight":break;case"ViewableRange":break;case"Selection":break;case"ProtectContents":break;default:seen=false}break;case"PivotTable":case"PivotCache":switch(Rn[3]){case"ImmediateItemsOnDrop":break;case"ShowPageMultipleItemLabel":break;case"CompactRowIndent":break;case"Location":break;case"PivotField":break;case"Orientation":break;case"LayoutForm":break;case"LayoutSubtotalLocation":break;case"LayoutCompactRow":break;case"Position":break;case"PivotItem":break;case"DataType":break;case"DataField":break;case"SourceName":break;case"ParentField":break;case"PTLineItems":break;case"PTLineItem":break;case"CountOfSameItems":break;case"Item":break;case"ItemType":break;case"PTSource":break;case"CacheIndex":break;case"ConsolidationReference":break;case"FileName":break;case"Reference":break;case"NoColumnGrand":break;case"NoRowGrand":break;case"BlankLineAfterItems":break;case"Hidden":break;case"Subtotal":break;case"BaseField":break;case"MapChildItems":break;case"Function":break;case"RefreshOnFileOpen":break;case"PrintSetTitles":break;case"MergeLabels":break;case"DefaultVersion":break;case"RefreshName":break;case"RefreshDate":break;case"RefreshDateCopy":break;case"VersionLastRefresh":break;case"VersionLastUpdate":break;case"VersionUpdateableMin":break;case"VersionRefreshableMin":break;case"Calculation":break;default:seen=false}break;case"PageBreaks":switch(Rn[3]){case"ColBreaks":break;case"ColBreak":break;case"RowBreaks":break;case"RowBreak":break;case"ColStart":break;case"ColEnd":break;case"RowEnd":break;default:seen=false}break;case"AutoFilter":switch(Rn[3]){case"AutoFilterColumn":break;case"AutoFilterCondition":break;case"AutoFilterAnd":break;case"AutoFilterOr":break;default:seen=false}break;case"QueryTable":switch(Rn[3]){case"Id":break;case"AutoFormatFont":break;case"AutoFormatPattern":break;case"QuerySource":break;case"QueryType":break;case"EnableRedirections":break;case"RefreshedInXl9":break;case"URLString":break;case"HTMLTables":break;case"Connection":break;case"CommandText":break;case"RefreshInfo":break;case"NoTitles":break;case"NextId":break;case"ColumnInfo":break;case"OverwriteCells":break;case"DoNotPromptForFile":break;case"TextWizardSettings":break;case"Source":break;case"Number":break;case"Decimal":break;case"ThousandSeparator":break;case"TrailingMinusNumbers":break;case"FormatSettings":break;case"FieldType":break;case"Delimiters":break;case"Tab":break;case"Comma":break;case"AutoFormatName":break;case"VersionLastEdit":break;case"VersionLastRefresh":break;default:seen=false}break;case"Sorting":case"ConditionalFormatting":case"DataValidation":switch(Rn[3]){case"Range":break;case"Type":break;case"Min":break;case"Max":break;case"Sort":break;case"Descending":break;case"Order":break;case"CaseSensitive":break;case"Value":break;case"ErrorStyle":break;case"ErrorMessage":break;case"ErrorTitle":break;case"CellRangeList":break;case"InputMessage":break;case"InputTitle":break;case"ComboHide":break;case"InputHide":break;case"Condition":break;case"Qualifier":break;case"UseBlank":break;case"Value1":break;case"Value2":break;case"Format":break;default:seen=false}break;case"MapInfo":case"Schema":case"data":switch(Rn[3]){case"Map":break;case"Entry":break;case"Range":break;case"XPath":break;case"Field":break;case"XSDType":break;case"FilterOn":break;case"Aggregate":break;case"ElementType":break;case"AttributeType":break;case"schema":case"element":case"complexType":case"datatype":case"all":case"attribute":case"extends":break;case"row":break;default:seen=false}break;case"SmartTags":break;default:seen=false;break}if(seen)break;if(!state[state.length-1][1])throw"Unrecognized tag: "+Rn[3]+"|"+state.join("|");if(state[state.length-1][0]==="CustomDocumentProperties"){if(Rn[0].substr(-2)==="/>")break;else if(Rn[1]==="/")xlml_set_custprop(Custprops,Rn,cp,str.slice(pidx,Rn.index));else{cp=Rn;pidx=Rn.index+Rn[0].length}break}if(opts.WTF)throw"Unrecognized tag: "+Rn[3]+"|"+state.join("|")}var out={};if(!opts.bookSheets&&!opts.bookProps)out.Sheets=sheets;out.SheetNames=sheetnames;out.SSF=SSF.get_table();out.Props=Props;out.Custprops=Custprops;return out}function parse_xlml(data,opts){fixopts(opts=opts||{});switch(opts.type||"base64"){case"base64":return parse_xlml_xml(Base64.decode(data),opts);case"binary":case"buffer":case"file":return parse_xlml_xml(data,opts);case"array":return parse_xlml_xml(data.map(_chr).join(""),opts)}}function write_xlml(wb,opts){}var fs;if(typeof exports!=="undefined"){if(typeof module!=="undefined"&&module.exports){fs=require("fs")}}function firstbyte(f,o){switch((o||{}).type||"base64"){case"buffer":return f[0];case"base64":return Base64.decode(f.substr(0,12)).charCodeAt(0);case"binary":return f.charCodeAt(0);case"array":return f[0];default:throw new Error("Unrecognized type "+o.type)}}function xlsread(f,o){if(!o)o={};if(!o.type)o.type=has_buf&&Buffer.isBuffer(f)?"buffer":"base64";switch(firstbyte(f,o)){case 208:return parse_xlscfb(CFB.read(f,o),o);case 60:return parse_xlml(f,o);default:throw"Unsupported file"}}var readFile=function(f,o){var d=fs.readFileSync(f);if(!o)o={};switch(firstbyte(d,{type:"buffer"})){case 208:return parse_xlscfb(CFB.read(d,{type:"buffer"}),o);case 60:return parse_xlml(d,(o.type="buffer",o));default:throw"Unsupported file"}};function writeSync(wb,opts){var o=opts||{};switch(o.bookType){case"xml":return write_xlml(wb,o);default:throw"unsupported output format "+o.bookType}}function writeFileSync(wb,filename,opts){var o=opts|{};o.type="file";o.file=filename;switch(o.file.substr(-4).toLowerCase()){case".xls":o.bookType="xls";break;case".xml":o.bookType="xml";break}return writeSync(wb,o)}function shift_cell(cell,tgt){if(tgt.s){if(cell.cRel)cell.c+=tgt.s.c;if(cell.rRel)cell.r+=tgt.s.r}else{cell.c+=tgt.c;cell.r+=tgt.r}cell.cRel=cell.rRel=0;while(cell.c>=256)cell.c-=256;while(cell.r>=65536)cell.r-=65536;return cell}function shift_range(cell,range){cell.s=shift_cell(cell.s,range.s);cell.e=shift_cell(cell.e,range.s);return cell}function decode_row(rowstr){return parseInt(unfix_row(rowstr),10)-1}function encode_row(row){return""+(row+1)}function fix_row(cstr){return cstr.replace(/([A-Z]|^)(\d+)$/,"$1$$$2")}function unfix_row(cstr){return cstr.replace(/\$(\d+)$/,"$1")}function decode_col(colstr){var c=unfix_col(colstr),d=0,i=0;for(;i!==c.length;++i)d=26*d+c.charCodeAt(i)-64;return d-1}function encode_col(col){var s="";for(++col;col;col=Math.floor((col-1)/26))s=String.fromCharCode((col-1)%26+65)+s;return s}function fix_col(cstr){return cstr.replace(/^([A-Z])/,"$$$1")}function unfix_col(cstr){return cstr.replace(/^\$([A-Z])/,"$1")}function split_cell(cstr){return cstr.replace(/(\$?[A-Z]*)(\$?\d*)/,"$1,$2").split(",")}function decode_cell(cstr){var splt=split_cell(cstr);return{c:decode_col(splt[0]),r:decode_row(splt[1])}}function encode_cell(cell){return encode_col(cell.c)+encode_row(cell.r)}function fix_cell(cstr){return fix_col(fix_row(cstr))}function unfix_cell(cstr){return unfix_col(unfix_row(cstr))}function decode_range(range){var x=range.split(":").map(decode_cell);return{s:x[0],e:x[x.length-1]}}function encode_range(cs,ce){if(ce===undefined||typeof ce==="number")return encode_range(cs.s,cs.e);if(typeof cs!=="string")cs=encode_cell(cs);if(typeof ce!=="string")ce=encode_cell(ce);return cs==ce?cs:cs+":"+ce}function safe_decode_range(range){var o={s:{c:0,r:0},e:{c:0,r:0}};var idx=0,i=0,cc=0;var len=range.length;for(idx=0;i<len;++i){if((cc=range.charCodeAt(i)-64)<1||cc>26)break;idx=26*idx+cc}o.s.c=--idx;for(idx=0;i<len;++i){if((cc=range.charCodeAt(i)-48)<0||cc>9)break;idx=10*idx+cc}o.s.r=--idx;if(i===len||range.charCodeAt(++i)===58){o.e.c=o.s.c;o.e.r=o.s.r;return o}for(idx=0;i!=len;++i){if((cc=range.charCodeAt(i)-64)<1||cc>26)break;idx=26*idx+cc}o.e.c=--idx;for(idx=0;i!=len;++i){if((cc=range.charCodeAt(i)-48)<0||cc>9)break;idx=10*idx+cc}o.e.r=--idx;return o}function safe_format_cell(cell,v){if(cell.z!==undefined)try{return cell.w=SSF.format(cell.z,v)}catch(e){}if(!cell.XF)return v;try{return cell.w=SSF.format(cell.XF.ifmt||0,v)}catch(e){return""+v}}function format_cell(cell,v){if(cell==null||cell.t==null)return"";if(cell.w!==undefined)return cell.w;if(v===undefined)return safe_format_cell(cell,cell.v);return safe_format_cell(cell,v)}function sheet_to_json(sheet,opts){var val,row,range,header=0,offset=1,r,hdr=[],isempty,R,C,v;var o=opts!=null?opts:{};var raw=o.raw;if(sheet==null||sheet["!ref"]==null)return[];range=o.range!==undefined?o.range:sheet["!ref"];if(o.header===1)header=1;else if(o.header==="A")header=2;else if(Array.isArray(o.header))header=3;switch(typeof range){case"string":r=safe_decode_range(range);break;case"number":r=safe_decode_range(sheet["!ref"]);r.s.r=range;break;default:r=range}if(header>0)offset=0;var rr=encode_row(r.s.r);var cols=new Array(r.e.c-r.s.c+1);var out=new Array(r.e.r-r.s.r-offset+1);var outi=0;for(C=r.s.c;C<=r.e.c;++C){cols[C]=encode_col(C);val=sheet[cols[C]+rr];switch(header){case 1:hdr[C]=C;break;case 2:hdr[C]=cols[C];break;case 3:hdr[C]=o.header[C-r.s.c];break;default:if(val===undefined)continue;hdr[C]=format_cell(val)}}for(R=r.s.r+offset;R<=r.e.r;++R){rr=encode_row(R);isempty=true;row=header===1?[]:Object.create({__rowNum__:R});for(C=r.s.c;C<=r.e.c;++C){val=sheet[cols[C]+rr];if(val===undefined||val.t===undefined)continue;v=val.v;switch(val.t){case"e":continue;case"s":case"str":break;case"b":case"n":break;default:throw"unrecognized type "+val.t}if(v!==undefined){row[hdr[C]]=raw?v:format_cell(val,v);isempty=false}}if(isempty===false)out[outi++]=row}out.length=outi;return out}function sheet_to_row_object_array(sheet,opts){return sheet_to_json(sheet,opts!=null?opts:{})}function sheet_to_csv(sheet,opts){var out="",txt="",qreg=/"/g;var o=opts==null?{}:opts;if(sheet==null||sheet["!ref"]==null)return"";var r=safe_decode_range(sheet["!ref"]);var FS=o.FS!==undefined?o.FS:",",fs=FS.charCodeAt(0);var RS=o.RS!==undefined?o.RS:"\n",rs=RS.charCodeAt(0);var row="",rr="",cols=[];var i=0,cc=0,val;var R=0,C=0;for(C=r.s.c;C<=r.e.c;++C)cols[C]=encode_col(C);for(R=r.s.r;R<=r.e.r;++R){row="";rr=encode_row(R);for(C=r.s.c;C<=r.e.c;++C){val=sheet[cols[C]+rr];txt=val!==undefined?""+format_cell(val):"";for(i=0,cc=0;i!==txt.length;++i)if((cc=txt.charCodeAt(i))===fs||cc===rs||cc===34){txt='"'+txt.replace(qreg,'""')+'"';break}row+=(C===r.s.c?"":FS)+txt}out+=row+RS}return out}var make_csv=sheet_to_csv;function sheet_to_formulae(sheet){var cmds,y="",x,val="";if(sheet==null||sheet["!ref"]==null)return"";var r=safe_decode_range(sheet["!ref"]),rr="",cols=[],C;cmds=new Array((r.e.r-r.s.r+1)*(r.e.c-r.s.c+1));var i=0;for(C=r.s.c;C<=r.e.c;++C)cols[C]=encode_col(C);for(var R=r.s.r;R<=r.e.r;++R){rr=encode_row(R);for(C=r.s.c;C<=r.e.c;++C){y=cols[C]+rr;x=sheet[y];val="";if(x===undefined)continue;if(x.f!=null)val=x.f;else if(x.w!==undefined)val="'"+x.w;else if(x.v===undefined)continue;else val=""+x.v;cmds[i++]=y+"="+val}}cmds.length=i;return cmds}var utils={encode_col:encode_col,encode_row:encode_row,encode_cell:encode_cell,encode_range:encode_range,decode_col:decode_col,decode_row:decode_row,split_cell:split_cell,decode_cell:decode_cell,decode_range:decode_range,format_cell:format_cell,get_formulae:sheet_to_formulae,make_csv:sheet_to_csv,make_json:sheet_to_json,make_formulae:sheet_to_formulae,sheet_to_csv:sheet_to_csv,sheet_to_json:sheet_to_json,sheet_to_formulae:sheet_to_formulae,sheet_to_row_object_array:sheet_to_row_object_array};XLS.parse_xlscfb=parse_xlscfb;XLS.read=xlsread;XLS.readFile=readFile;XLS.utils=utils;XLS.CFB=CFB;XLS.SSF=SSF})(typeof exports!=="undefined"?exports:XLS); |
18583 // @see http://www.delorie.com/djgpp/doc/rbinter/it/52/13.html | 18563 //# sourceMappingURL=dist/xls.min.map |
18584 // @see http://www.delorie.com/djgpp/doc/rbinter/it/65/16.html | 18564 /* xlsx.js (C) 2013-2014 SheetJS -- http://sheetjs.com */ |
18585 // @see http://www.delorie.com/djgpp/doc/rbinter/it/66/16.html | 18565 /* vim: set ts=2: */ |
18586 | 18566 /*jshint -W041 */ |
18587 dosTime = o.date.getHours(); | 18567 var XLSX = {}; |
18588 dosTime = dosTime << 6; | 18568 (function(XLSX){ |
18589 dosTime = dosTime | o.date.getMinutes(); | 18569 XLSX.version = '0.7.8'; |
18590 dosTime = dosTime << 5; | 18570 var current_codepage = 1252, current_cptable; |
18591 dosTime = dosTime | o.date.getSeconds() / 2; | 18571 if(typeof module !== "undefined" && typeof require !== 'undefined') { |
18592 | 18572 if(typeof cptable === 'undefined') cptable = require('./dist/cpexcel'); |
18593 dosDate = o.date.getFullYear() - 1980; | 18573 current_cptable = cptable[current_codepage]; |
18594 dosDate = dosDate << 4; | 18574 } |
18595 dosDate = dosDate | (o.date.getMonth() + 1); | 18575 function reset_cp() { set_cp(1252); } |
18596 dosDate = dosDate << 5; | 18576 var set_cp = function(cp) { current_codepage = cp; }; |
18597 dosDate = dosDate | o.date.getDate(); | 18577 |
18598 | 18578 function char_codes(data) { var o = []; for(var i = 0, len = data.length; i < len; ++i) o[i] = data.charCodeAt(i); return o; } |
18599 var hasData = data !== null && data.length !== 0; | 18579 var debom_xml = function(data) { return data; }; |
18600 | 18580 |
18601 var compression = JSZip.compressions[compressionType]; | 18581 if(typeof cptable !== 'undefined') { |
18602 var compressedData = hasData ? compression.compress(data) : ''; | 18582 set_cp = function(cp) { current_codepage = cp; current_cptable = cptable[cp]; }; |
18603 | 18583 debom_xml = function(data) { |
18604 var header = ""; | 18584 if(data.charCodeAt(0) === 0xFF && data.charCodeAt(1) === 0xFE) { return cptable.utils.decode(1200, char_codes(data.substr(2))); } |
18605 | 18585 return data; |
18606 // version needed to extract | 18586 }; |
18607 header += "\x0A\x00"; | 18587 } |
18608 // general purpose bit flag | 18588 /* ssf.js (C) 2013-2014 SheetJS -- http://sheetjs.com */ |
18609 // set bit 11 if utf8 | 18589 /*jshint -W041 */ |
18610 header += useUTF8 ? "\x00\x08" : "\x00\x00"; | 18590 var SSF = {}; |
18611 // compression method | 18591 var make_ssf = function make_ssf(SSF){ |
18612 header += hasData ? compression.magic : JSZip.compressions['STORE'].magic; | 18592 SSF.version = '0.8.1'; |
18613 // last mod file time | 18593 function _strrev(x) { var o = "", i = x.length-1; while(i>=0) o += x.charAt(i--); return o; } |
18614 header += decToHex(dosTime, 2); | 18594 function fill(c,l) { var o = ""; while(o.length < l) o+=c; return o; } |
18615 // last mod file date | 18595 function pad0(v,d){var t=""+v; return t.length>=d?t:fill('0',d-t.length)+t;} |
18616 header += decToHex(dosDate, 2); | 18596 function pad_(v,d){var t=""+v;return t.length>=d?t:fill(' ',d-t.length)+t;} |
18617 // crc-32 | 18597 function rpad_(v,d){var t=""+v; return t.length>=d?t:t+fill(' ',d-t.length);} |
18618 header += hasData ? decToHex(this.crc32(data), 4) : '\x00\x00\x00\x00'; | 18598 function pad0r1(v,d){var t=""+Math.round(v); return t.length>=d?t:fill('0',d-t.length)+t;} |
18619 // compressed size | 18599 function pad0r2(v,d){var t=""+v; return t.length>=d?t:fill('0',d-t.length)+t;} |
18620 header += hasData ? decToHex(compressedData.length, 4) : '\x00\x00\x00\x00'; | 18600 var p2_32 = Math.pow(2,32); |
18621 // uncompressed size | 18601 function pad0r(v,d){if(v>p2_32||v<-p2_32) return pad0r1(v,d); var i = Math.round(v); return pad0r2(i,d); } |
18622 header += hasData ? decToHex(data.length, 4) : '\x00\x00\x00\x00'; | 18602 function isgeneral(s, i) { return s.length >= 7 + i && (s.charCodeAt(i)|32) === 103 && (s.charCodeAt(i+1)|32) === 101 && (s.charCodeAt(i+2)|32) === 110 && (s.charCodeAt(i+3)|32) === 101 && (s.charCodeAt(i+4)|32) === 114 && (s.charCodeAt(i+5)|32) === 97 && (s.charCodeAt(i+6)|32) === 108; } |
18623 // file name length | 18603 /* Options */ |
18624 header += decToHex(utfEncodedFileName.length, 2); | 18604 var opts_fmt = [ |
18625 // extra field length | 18605 ["date1904", 0], |
18626 header += "\x00\x00"; | 18606 ["output", ""], |
18627 | 18607 ["WTF", false] |
18628 return { | 18608 ]; |
18629 header:header, | 18609 function fixopts(o){ |
18630 compressedData:compressedData | 18610 for(var y = 0; y != opts_fmt.length; ++y) if(o[opts_fmt[y][0]]===undefined) o[opts_fmt[y][0]]=opts_fmt[y][1]; |
18631 }; | 18611 } |
18632 }; | 18612 SSF.opts = opts_fmt; |
18633 | 18613 var table_fmt = { |
18634 | 18614 0: 'General', |
18635 // return the actual prototype of JSZip | 18615 1: '0', |
18636 return { | 18616 2: '0.00', |
18637 /** | 18617 3: '#,##0', |
18638 * Read an existing zip and merge the data in the current JSZip object. | 18618 4: '#,##0.00', |
18639 * The implementation is in jszip-load.js, don't forget to include it. | 18619 9: '0%', |
18640 * @param {String|ArrayBuffer|Uint8Array} stream The stream to load | 18620 10: '0.00%', |
18641 * @param {Object} options Options for loading the stream. | 18621 11: '0.00E+00', |
18642 * options.base64 : is the stream in base64 ? default : false | 18622 12: '# ?/?', |
18643 * @return {JSZip} the current JSZip object | 18623 13: '# ??/??', |
18644 */ | 18624 14: 'm/d/yy', |
18645 load : function (stream, options) { | 18625 15: 'd-mmm-yy', |
18646 throw new Error("Load method is not defined. Is the file jszip-load.js included ?"); | 18626 16: 'd-mmm', |
18647 }, | 18627 17: 'mmm-yy', |
18648 | 18628 18: 'h:mm AM/PM', |
18649 /** | 18629 19: 'h:mm:ss AM/PM', |
18650 * Filter nested files/folders with the specified function. | 18630 20: 'h:mm', |
18651 * @param {Function} search the predicate to use : | 18631 21: 'h:mm:ss', |
18652 * function (relativePath, file) {...} | 18632 22: 'm/d/yy h:mm', |
18653 * It takes 2 arguments : the relative path and the file. | 18633 37: '#,##0 ;(#,##0)', |
18654 * @return {Array} An array of matching elements. | 18634 38: '#,##0 ;[Red](#,##0)', |
18655 */ | 18635 39: '#,##0.00;(#,##0.00)', |
18656 filter : function (search) { | 18636 40: '#,##0.00;[Red](#,##0.00)', |
18657 var result = [], filename, relativePath, file, fileClone; | 18637 45: 'mm:ss', |
18658 for (filename in this.files) { | 18638 46: '[h]:mm:ss', |
18659 if ( !this.files.hasOwnProperty(filename) ) { continue; } | 18639 47: 'mmss.0', |
18660 file = this.files[filename]; | 18640 48: '##0.0E+0', |
18661 // return a new object, don't let the user mess with our internal objects :) | 18641 49: '@', |
18662 fileClone = new ZipObject(file.name, file.data, extend(file.options)); | 18642 56: '"上午/下午 "hh"時"mm"分"ss"秒 "', |
18663 relativePath = filename.slice(this.root.length, filename.length); | 18643 65535: 'General' |
18664 if (filename.slice(0, this.root.length) === this.root && // the file is in the current root | 18644 }; |
18665 search(relativePath, fileClone)) { // and the file matches the function | 18645 var days = [ |
18666 result.push(fileClone); | 18646 ['Sun', 'Sunday'], |
18667 } | 18647 ['Mon', 'Monday'], |
18668 } | 18648 ['Tue', 'Tuesday'], |
18669 return result; | 18649 ['Wed', 'Wednesday'], |
18670 }, | 18650 ['Thu', 'Thursday'], |
18671 | 18651 ['Fri', 'Friday'], |
18672 /** | 18652 ['Sat', 'Saturday'] |
18673 * Add a file to the zip file, or search a file. | 18653 ]; |
18674 * @param {string|RegExp} name The name of the file to add (if data is defined), | 18654 var months = [ |
18675 * the name of the file to find (if no data) or a regex to match files. | 18655 ['J', 'Jan', 'January'], |
18676 * @param {String|ArrayBuffer|Uint8Array} data The file data, either raw or base64 encoded | 18656 ['F', 'Feb', 'February'], |
18677 * @param {Object} o File options | 18657 ['M', 'Mar', 'March'], |
18678 * @return {JSZip|Object|Array} this JSZip object (when adding a file), | 18658 ['A', 'Apr', 'April'], |
18679 * a file (when searching by string) or an array of files (when searching by regex). | 18659 ['M', 'May', 'May'], |
18680 */ | 18660 ['J', 'Jun', 'June'], |
18681 file : function(name, data, o) { | 18661 ['J', 'Jul', 'July'], |
18682 if (arguments.length === 1) { | 18662 ['A', 'Aug', 'August'], |
18683 if (name instanceof RegExp) { | 18663 ['S', 'Sep', 'September'], |
18684 var regexp = name; | 18664 ['O', 'Oct', 'October'], |
18685 return this.filter(function(relativePath, file) { | 18665 ['N', 'Nov', 'November'], |
18686 return !file.options.dir && regexp.test(relativePath); | 18666 ['D', 'Dec', 'December'] |
18687 }); | 18667 ]; |
18688 } else { // text | 18668 function frac(x, D, mixed) { |
18689 return this.filter(function (relativePath, file) { | 18669 var sgn = x < 0 ? -1 : 1; |
18690 return !file.options.dir && relativePath === name; | 18670 var B = x * sgn; |
18691 })[0]||null; | 18671 var P_2 = 0, P_1 = 1, P = 0; |
18692 } | 18672 var Q_2 = 1, Q_1 = 0, Q = 0; |
18693 } else { // more than one argument : we have data ! | 18673 var A = Math.floor(B); |
18694 name = this.root+name; | 18674 while(Q_1 < D) { |
18695 fileAdd.call(this, name, data, o); | 18675 A = Math.floor(B); |
18696 } | 18676 P = A * P_1 + P_2; |
18697 return this; | 18677 Q = A * Q_1 + Q_2; |
18698 }, | 18678 if((B - A) < 0.0000000005) break; |
18699 | 18679 B = 1 / (B - A); |
18700 /** | 18680 P_2 = P_1; P_1 = P; |
18701 * Add a directory to the zip file, or search. | 18681 Q_2 = Q_1; Q_1 = Q; |
18702 * @param {String|RegExp} arg The name of the directory to add, or a regex to search folders. | 18682 } |
18703 * @return {JSZip} an object with the new directory as the root, or an array containing matching folders. | 18683 if(Q > D) { Q = Q_1; P = P_1; } |
18704 */ | 18684 if(Q > D) { Q = Q_2; P = P_2; } |
18705 folder : function(arg) { | 18685 if(!mixed) return [0, sgn * P, Q]; |
18706 if (!arg) { | 18686 if(Q===0) throw "Unexpected state: "+P+" "+P_1+" "+P_2+" "+Q+" "+Q_1+" "+Q_2; |
18707 return this; | 18687 var q = Math.floor(sgn * P/Q); |
18708 } | 18688 return [q, sgn*P - q*Q, Q]; |
18709 | 18689 } |
18710 if (arg instanceof RegExp) { | 18690 function general_fmt_int(v, opts) { return ""+v; } |
18711 return this.filter(function(relativePath, file) { | 18691 SSF._general_int = general_fmt_int; |
18712 return file.options.dir && arg.test(relativePath); | 18692 var general_fmt_num = (function make_general_fmt_num() { |
18713 }); | 18693 var gnr1 = /\.(\d*[1-9])0+$/, gnr2 = /\.0*$/, gnr4 = /\.(\d*[1-9])0+/, gnr5 = /\.0*[Ee]/, gnr6 = /(E[+-])(\d)$/; |
18714 } | 18694 function gfn2(v) { |
18715 | 18695 var w = (v<0?12:11); |
18716 // else, name is a new folder | 18696 var o = gfn5(v.toFixed(12)); if(o.length <= w) return o; |
18717 var name = this.root + arg; | 18697 o = v.toPrecision(10); if(o.length <= w) return o; |
18718 var newFolder = folderAdd.call(this, name); | 18698 return v.toExponential(5); |
18719 | 18699 } |
18720 // Allow chaining by returning a new object with this folder as the root | 18700 function gfn3(v) { |
18721 var ret = this.clone(); | 18701 var o = v.toFixed(11).replace(gnr1,".$1"); |
18722 ret.root = newFolder.name; | 18702 if(o.length > (v<0?12:11)) o = v.toPrecision(6); |
18723 return ret; | 18703 return o; |
18724 }, | 18704 } |
18725 | 18705 function gfn4(o) { |
18726 /** | 18706 for(var i = 0; i != o.length; ++i) if((o.charCodeAt(i) | 0x20) === 101) return o.replace(gnr4,".$1").replace(gnr5,"E").replace("e","E").replace(gnr6,"$10$2"); |
18727 * Delete a file, or a directory and all sub-files, from the zip | 18707 return o; |
18728 * @param {string} name the name of the file to delete | 18708 } |
18729 * @return {JSZip} this JSZip object | 18709 function gfn5(o) { |
18730 */ | 18710 //for(var i = 0; i != o.length; ++i) if(o.charCodeAt(i) === 46) return o.replace(gnr2,"").replace(gnr1,".$1"); |
18731 remove : function(name) { | 18711 //return o; |
18732 name = this.root + name; | 18712 return o.indexOf(".") > -1 ? o.replace(gnr2,"").replace(gnr1,".$1") : o; |
18733 var file = this.files[name]; | 18713 } |
18734 if (!file) { | 18714 return function general_fmt_num(v, opts) { |
18735 // Look for any folders | 18715 var V = Math.floor(Math.log(Math.abs(v))*Math.LOG10E), o; |
18736 if (name.slice(-1) != "/") { | 18716 if(V >= -4 && V <= -1) o = v.toPrecision(10+V); |
18737 name += "/"; | 18717 else if(Math.abs(V) <= 9) o = gfn2(v); |
18738 } | 18718 else if(V === 10) o = v.toFixed(10).substr(0,12); |
18739 file = this.files[name]; | 18719 else o = gfn3(v); |
18740 } | 18720 return gfn5(gfn4(o)); |
18741 | 18721 };})(); |
18742 if (file) { | 18722 SSF._general_num = general_fmt_num; |
18743 if (!file.options.dir) { | 18723 function general_fmt(v, opts) { |
18744 // file | 18724 switch(typeof v) { |
18745 delete this.files[name]; | 18725 case 'string': return v; |
18746 } else { | 18726 case 'boolean': return v ? "TRUE" : "FALSE"; |
18747 // folder | 18727 case 'number': return (v|0) === v ? general_fmt_int(v, opts) : general_fmt_num(v, opts); |
18748 var kids = this.filter(function (relativePath, file) { | 18728 } |
18749 return file.name.slice(0, name.length) === name; | 18729 throw new Error("unsupported value in General format: " + v); |
18750 }); | 18730 } |
18751 for (var i = 0; i < kids.length; i++) { | 18731 SSF._general = general_fmt; |
18752 delete this.files[kids[i].name]; | 18732 function fix_hijri(date, o) { return 0; } |
18753 } | 18733 function parse_date_code(v,opts,b2) { |
18754 } | 18734 if(v > 2958465 || v < 0) return null; |
18755 } | 18735 var date = (v|0), time = Math.floor(86400 * (v - date)), dow=0; |
18756 | 18736 var dout=[]; |
18757 return this; | 18737 var out={D:date, T:time, u:86400*(v-date)-time,y:0,m:0,d:0,H:0,M:0,S:0,q:0}; |
18758 }, | 18738 if(Math.abs(out.u) < 1e-6) out.u = 0; |
18759 | 18739 fixopts(opts != null ? opts : (opts=[])); |
18760 /** | 18740 if(opts.date1904) date += 1462; |
18761 * Generate the complete zip file | 18741 if(out.u > 0.999) { |
18762 * @param {Object} options the options to generate the zip file : | 18742 out.u = 0; |
18763 * - base64, (deprecated, use type instead) true to generate base64. | 18743 if(++time == 86400) { time = 0; ++date; } |
18764 * - compression, "STORE" by default. | 18744 } |
18765 * - type, "base64" by default. Values are : string, base64, uint8array, arraybuffer, blob. | 18745 if(date === 60) {dout = b2 ? [1317,10,29] : [1900,2,29]; dow=3;} |
18766 * @return {String|Uint8Array|ArrayBuffer|Blob} the zip file | 18746 else if(date === 0) {dout = b2 ? [1317,8,29] : [1900,1,0]; dow=6;} |
18767 */ | 18747 else { |
18768 generate : function(options) { | 18748 if(date > 60) --date; |
18769 options = extend(options || {}, { | 18749 /* 1 = Jan 1 1900 */ |
18770 base64 : true, | 18750 var d = new Date(1900,0,1); |
18771 compression : "STORE", | 18751 d.setDate(d.getDate() + date - 1); |
18772 type : "base64" | 18752 dout = [d.getFullYear(), d.getMonth()+1,d.getDate()]; |
18773 }); | 18753 dow = d.getDay(); |
18774 var compression = options.compression.toUpperCase(); | 18754 if(date < 60) dow = (dow + 6) % 7; |
18775 | 18755 if(b2) dow = fix_hijri(d, dout); |
18776 // The central directory, and files data | 18756 } |
18777 var directory = [], files = [], fileOffset = 0; | 18757 out.y = dout[0]; out.m = dout[1]; out.d = dout[2]; |
18778 | 18758 out.S = time % 60; time = Math.floor(time / 60); |
18779 if (!JSZip.compressions[compression]) { | 18759 out.M = time % 60; time = Math.floor(time / 60); |
18780 throw compression + " is not a valid compression method !"; | 18760 out.H = time; |
18781 } | 18761 out.q = dow; |
18782 | 18762 return out; |
18783 for (var name in this.files) { | 18763 } |
18784 if ( !this.files.hasOwnProperty(name) ) { continue; } | 18764 SSF.parse_date_code = parse_date_code; |
18785 | 18765 /*jshint -W086 */ |
18786 var file = this.files[name]; | 18766 function write_date(type, fmt, val, ss0) { |
18787 | 18767 var o="", ss=0, tt=0, y = val.y, out, outl = 0; |
18788 var utfEncodedFileName = this.utf8encode(file.name); | 18768 switch(type) { |
18789 | 18769 case 98: /* 'b' buddhist year */ |
18790 var fileRecord = "", | 18770 y = val.y + 543; |
18791 dirRecord = "", | 18771 /* falls through */ |
18792 data = prepareLocalHeaderData.call(this, file, utfEncodedFileName, compression); | 18772 case 121: /* 'y' year */ |
18793 fileRecord = JSZip.signature.LOCAL_FILE_HEADER + data.header + utfEncodedFileName + data.compressedData; | 18773 switch(fmt.length) { |
18794 | 18774 case 1: case 2: out = y % 100; outl = 2; break; |
18795 dirRecord = JSZip.signature.CENTRAL_FILE_HEADER + | 18775 default: out = y % 10000; outl = 4; break; |
18796 // version made by (00: DOS) | 18776 } break; |
18797 "\x14\x00" + | 18777 case 109: /* 'm' month */ |
18798 // file header (common to file and central directory) | 18778 switch(fmt.length) { |
18799 data.header + | 18779 case 1: case 2: out = val.m; outl = fmt.length; break; |
18800 // file comment length | 18780 case 3: return months[val.m-1][1]; |
18801 "\x00\x00" + | 18781 case 5: return months[val.m-1][0]; |
18802 // disk number start | 18782 default: return months[val.m-1][2]; |
18803 "\x00\x00" + | 18783 } break; |
18804 // internal file attributes TODO | 18784 case 100: /* 'd' day */ |
18805 "\x00\x00" + | 18785 switch(fmt.length) { |
18806 // external file attributes | 18786 case 1: case 2: out = val.d; outl = fmt.length; break; |
18807 (this.files[name].options.dir===true?"\x10\x00\x00\x00":"\x00\x00\x00\x00")+ | 18787 case 3: return days[val.q][0]; |
18808 // relative offset of local header | 18788 default: return days[val.q][1]; |
18809 decToHex(fileOffset, 4) + | 18789 } break; |
18810 // file name | 18790 case 104: /* 'h' 12-hour */ |
18811 utfEncodedFileName; | 18791 switch(fmt.length) { |
18812 | 18792 case 1: case 2: out = 1+(val.H+11)%12; outl = fmt.length; break; |
18813 fileOffset += fileRecord.length; | 18793 default: throw 'bad hour format: ' + fmt; |
18814 | 18794 } break; |
18815 files.push(fileRecord); | 18795 case 72: /* 'H' 24-hour */ |
18816 directory.push(dirRecord); | 18796 switch(fmt.length) { |
18817 } | 18797 case 1: case 2: out = val.H; outl = fmt.length; break; |
18818 | 18798 default: throw 'bad hour format: ' + fmt; |
18819 var fileData = files.join(""); | 18799 } break; |
18820 var dirData = directory.join(""); | 18800 case 77: /* 'M' minutes */ |
18821 | 18801 switch(fmt.length) { |
18822 var dirEnd = ""; | 18802 case 1: case 2: out = val.M; outl = fmt.length; break; |
18823 | 18803 default: throw 'bad minute format: ' + fmt; |
18824 // end of central dir signature | 18804 } break; |
18825 dirEnd = JSZip.signature.CENTRAL_DIRECTORY_END + | 18805 case 115: /* 's' seconds */ |
18826 // number of this disk | 18806 if(val.u === 0) switch(fmt) { |
18827 "\x00\x00" + | 18807 case 's': case 'ss': return pad0(val.S, fmt.length); |
18828 // number of the disk with the start of the central directory | 18808 case '.0': case '.00': case '.000': |
18829 "\x00\x00" + | 18809 } |
18830 // total number of entries in the central directory on this disk | 18810 switch(fmt) { |
18831 decToHex(files.length, 2) + | 18811 case 's': case 'ss': case '.0': case '.00': case '.000': |
18832 // total number of entries in the central directory | 18812 if(ss0 >= 2) tt = ss0 === 3 ? 1000 : 100; |
18833 decToHex(files.length, 2) + | 18813 else tt = ss0 === 1 ? 10 : 1; |
18834 // size of the central directory 4 bytes | 18814 ss = Math.round((tt)*(val.S + val.u)); |
18835 decToHex(dirData.length, 4) + | 18815 if(ss >= 60*tt) ss = 0; |
18836 // offset of start of central directory with respect to the starting disk number | 18816 if(fmt === 's') return ss === 0 ? "0" : ""+ss/tt; |
18837 decToHex(fileData.length, 4) + | 18817 o = pad0(ss,2 + ss0); |
18838 // .ZIP file comment length | 18818 if(fmt === 'ss') return o.substr(0,2); |
18839 "\x00\x00"; | 18819 return "." + o.substr(2,fmt.length-1); |
18840 | 18820 default: throw 'bad second format: ' + fmt; |
18841 var zip = fileData + dirData + dirEnd; | 18821 } |
18842 | 18822 case 90: /* 'Z' absolute time */ |
18843 | 18823 switch(fmt) { |
18844 switch(options.type.toLowerCase()) { | 18824 case '[h]': case '[hh]': out = val.D*24+val.H; break; |
18845 case "uint8array" : | 18825 case '[m]': case '[mm]': out = (val.D*24+val.H)*60+val.M; break; |
18846 return JSZip.utils.string2Uint8Array(zip); | 18826 case '[s]': case '[ss]': out = ((val.D*24+val.H)*60+val.M)*60+Math.round(val.S+val.u); break; |
18847 case "arraybuffer" : | 18827 default: throw 'bad abstime format: ' + fmt; |
18848 return JSZip.utils.string2Uint8Array(zip).buffer; | 18828 } outl = fmt.length === 3 ? 1 : 2; break; |
18849 case "blob" : | 18829 case 101: /* 'e' era */ |
18850 return JSZip.utils.string2Blob(zip); | 18830 out = y; outl = 1; |
18851 case "base64" : | 18831 } |
18852 return (options.base64) ? JSZipBase64.encode(zip) : zip; | 18832 if(outl > 0) return pad0(out, outl); else return ""; |
18853 default : // case "string" : | 18833 } |
18854 return zip; | 18834 /*jshint +W086 */ |
18855 } | 18835 function commaify(s) { |
18856 }, | 18836 if(s.length <= 3) return s; |
18857 | 18837 var j = (s.length % 3), o = s.substr(0,j); |
18858 /** | 18838 for(; j!=s.length; j+=3) o+=(o.length > 0 ? "," : "") + s.substr(j,3); |
18859 * | 18839 return o; |
18860 * Javascript crc32 | 18840 } |
18861 * http://www.webtoolkit.info/ | 18841 var write_num = (function make_write_num(){ |
18862 * | 18842 var pct1 = /%/g; |
18863 */ | 18843 function write_num_pct(type, fmt, val){ |
18864 crc32 : function(str, crc) { | 18844 var sfmt = fmt.replace(pct1,""), mul = fmt.length - sfmt.length; |
18865 | 18845 return write_num(type, sfmt, val * Math.pow(10,2*mul)) + fill("%",mul); |
18866 if (str === "" || typeof str === "undefined") { | 18846 } |
18867 return 0; | 18847 function write_num_cm(type, fmt, val){ |
18868 } | 18848 var idx = fmt.length - 1; |
18869 | 18849 while(fmt.charCodeAt(idx-1) === 44) --idx; |
18870 var table = [ | 18850 return write_num(type, fmt.substr(0,idx), val / Math.pow(10,3*(fmt.length-idx))); |
18871 0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA, | 18851 } |
18872 0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3, | 18852 function write_num_exp(fmt, val){ |
18873 0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988, | 18853 var o; |
18874 0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91, | 18854 var idx = fmt.indexOf("E") - fmt.indexOf(".") - 1; |
18875 0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE, | 18855 if(fmt.match(/^#+0.0E\+0$/)) { |
18876 0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7, | 18856 var period = fmt.indexOf("."); if(period === -1) period=fmt.indexOf('E'); |
18877 0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC, | 18857 var ee = Math.floor(Math.log(Math.abs(val))*Math.LOG10E)%period; |
18878 0x14015C4F, 0x63066CD9, 0xFA0F3D63, 0x8D080DF5, | 18858 if(ee < 0) ee += period; |
18879 0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172, | 18859 o = (val/Math.pow(10,ee)).toPrecision(idx+1+(period+ee)%period); |
18880 0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B, | 18860 if(o.indexOf("e") === -1) { |
18881 0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6, 0xACBCF940, | 18861 var fakee = Math.floor(Math.log(Math.abs(val))*Math.LOG10E); |
18882 0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59, | 18862 if(o.indexOf(".") === -1) o = o[0] + "." + o.substr(1) + "E+" + (fakee - o.length+ee); |
18883 0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116, | 18863 else o += "E+" + (fakee - ee); |
18884 0x21B4F4B5, 0x56B3C423, 0xCFBA9599, 0xB8BDA50F, | 18864 while(o.substr(0,2) === "0.") { |
18885 0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924, | 18865 o = o[0] + o.substr(2,period) + "." + o.substr(2+period); |
18886 0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D, | 18866 o = o.replace(/^0+([1-9])/,"$1").replace(/^0+\./,"0."); |
18887 0x76DC4190, 0x01DB7106, 0x98D220BC, 0xEFD5102A, | 18867 } |
18888 0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433, | 18868 o = o.replace(/\+-/,"-"); |
18889 0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818, | 18869 } |
18890 0x7F6A0DBB, 0x086D3D2D, 0x91646C97, 0xE6635C01, | 18870 o = o.replace(/^([+-]?)(\d*)\.(\d*)[Ee]/,function($$,$1,$2,$3) { return $1 + $2 + $3.substr(0,(period+ee)%period) + "." + $3.substr(ee) + "E"; }); |
18891 0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E, | 18871 } else o = val.toExponential(idx); |
18892 0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457, | 18872 if(fmt.match(/E\+00$/) && o.match(/e[+-]\d$/)) o = o.substr(0,o.length-1) + "0" + o[o.length-1]; |
18893 0x65B0D9C6, 0x12B7E950, 0x8BBEB8EA, 0xFCB9887C, | 18873 if(fmt.match(/E\-/) && o.match(/e\+/)) o = o.replace(/e\+/,"e"); |
18894 0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65, | 18874 return o.replace("e","E"); |
18895 0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2, | 18875 } |
18896 0x4ADFA541, 0x3DD895D7, 0xA4D1C46D, 0xD3D6F4FB, | 18876 var frac1 = /# (\?+)( ?)\/( ?)(\d+)/; |
18897 0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0, | 18877 function write_num_f1(r, aval, sign) { |
18898 0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9, | 18878 var den = parseInt(r[4]), rr = Math.round(aval * den), base = Math.floor(rr/den); |
18899 0x5005713C, 0x270241AA, 0xBE0B1010, 0xC90C2086, | 18879 var myn = (rr - base*den), myd = den; |
18900 0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F, | 18880 return sign + (base === 0 ? "" : ""+base) + " " + (myn === 0 ? fill(" ", r[1].length + 1 + r[4].length) : pad_(myn,r[1].length) + r[2] + "/" + r[3] + pad0(myd,r[4].length)); |
18901 0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4, | 18881 } |
18902 0x59B33D17, 0x2EB40D81, 0xB7BD5C3B, 0xC0BA6CAD, | 18882 function write_num_f2(r, aval, sign) { |
18903 0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A, | 18883 return sign + (aval === 0 ? "" : ""+aval) + fill(" ", r[1].length + 2 + r[4].length); |
18904 0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683, | 18884 } |
18905 0xE3630B12, 0x94643B84, 0x0D6D6A3E, 0x7A6A5AA8, | 18885 var dec1 = /^#*0*\.(0+)/; |
18906 0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1, | 18886 var closeparen = /\).*[0#]/; |
18907 0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE, | 18887 var phone = /\(###\) ###\\?-####/; |
18908 0xF762575D, 0x806567CB, 0x196C3671, 0x6E6B06E7, | 18888 function hashq(str) { |
18909 0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC, | 18889 var o = "", cc; |
18910 0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5, | 18890 for(var i = 0; i != str.length; ++i) switch((cc=str.charCodeAt(i))) { |
18911 0xD6D6A3E8, 0xA1D1937E, 0x38D8C2C4, 0x4FDFF252, | 18891 case 35: break; |
18912 0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B, | 18892 case 63: o+= " "; break; |
18913 0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60, | 18893 case 48: o+= "0"; break; |
18914 0xDF60EFC3, 0xA867DF55, 0x316E8EEF, 0x4669BE79, | 18894 default: o+= String.fromCharCode(cc); |
18915 0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236, | 18895 } |
18916 0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F, | 18896 return o; |
18917 0xC5BA3BBE, 0xB2BD0B28, 0x2BB45A92, 0x5CB36A04, | 18897 } |
18918 0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D, | 18898 function rnd(val, d) { var dd = Math.pow(10,d); return ""+(Math.round(val * dd)/dd); } |
18919 0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A, | 18899 function dec(val, d) { return Math.round((val-Math.floor(val))*Math.pow(10,d)); } |
18920 0x9C0906A9, 0xEB0E363F, 0x72076785, 0x05005713, | 18900 function flr(val) { if(val < 2147483647 && val > -2147483648) return ""+(val >= 0 ? (val|0) : (val-1|0)); return ""+Math.floor(val); } |
18921 0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38, | 18901 function write_num_flt(type, fmt, val) { |
18922 0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21, | 18902 if(type.charCodeAt(0) === 40 && !fmt.match(closeparen)) { |
18923 0x86D3D2D4, 0xF1D4E242, 0x68DDB3F8, 0x1FDA836E, | 18903 var ffmt = fmt.replace(/\( */,"").replace(/ \)/,"").replace(/\)/,""); |
18924 0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777, | 18904 if(val >= 0) return write_num_flt('n', ffmt, val); |
18925 0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C, | 18905 return '(' + write_num_flt('n', ffmt, -val) + ')'; |
18926 0x8F659EFF, 0xF862AE69, 0x616BFFD3, 0x166CCF45, | 18906 } |
18927 0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2, | 18907 if(fmt.charCodeAt(fmt.length - 1) === 44) return write_num_cm(type, fmt, val); |
18928 0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB, | 18908 if(fmt.indexOf('%') !== -1) return write_num_pct(type, fmt, val); |
18929 0xAED16A4A, 0xD9D65ADC, 0x40DF0B66, 0x37D83BF0, | 18909 if(fmt.indexOf('E') !== -1) return write_num_exp(fmt, val); |
18930 0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9, | 18910 if(fmt.charCodeAt(0) === 36) return "$"+write_num_flt(type,fmt.substr(fmt[1]==' '?2:1),val); |
18931 0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6, | 18911 var o, oo; |
18932 0xBAD03605, 0xCDD70693, 0x54DE5729, 0x23D967BF, | 18912 var r, ri, ff, aval = Math.abs(val), sign = val < 0 ? "-" : ""; |
18933 0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94, | 18913 if(fmt.match(/^00+$/)) return sign + pad0r(aval,fmt.length); |
18934 0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D | 18914 if(fmt.match(/^[#?]+$/)) { |
18935 ]; | 18915 o = pad0r(val,0); if(o === "0") o = ""; |
18936 | 18916 return o.length > fmt.length ? o : hashq(fmt.substr(0,fmt.length-o.length)) + o; |
18937 if (typeof(crc) == "undefined") { crc = 0; } | 18917 } |
18938 var x = 0; | 18918 if((r = fmt.match(frac1)) !== null) return write_num_f1(r, aval, sign); |
18939 var y = 0; | 18919 if(fmt.match(/^#+0+$/) !== null) return sign + pad0r(aval,fmt.length - fmt.indexOf("0")); |
18940 | 18920 if((r = fmt.match(dec1)) !== null) { |
18941 crc = crc ^ (-1); | 18921 o = rnd(val, r[1].length).replace(/^([^\.]+)$/,"$1."+r[1]).replace(/\.$/,"."+r[1]).replace(/\.(\d*)$/,function($$, $1) { return "." + $1 + fill("0", r[1].length-$1.length); }); |
18942 for( var i = 0, iTop = str.length; i < iTop; i++ ) { | 18922 return fmt.indexOf("0.") !== -1 ? o : o.replace(/^0\./,"."); |
18943 y = ( crc ^ str.charCodeAt( i ) ) & 0xFF; | 18923 } |
18944 x = table[y]; | 18924 fmt = fmt.replace(/^#+([0.])/, "$1"); |
18945 crc = ( crc >>> 8 ) ^ x; | 18925 if((r = fmt.match(/^(0*)\.(#*)$/)) !== null) { |
18946 } | 18926 return sign + rnd(aval, r[2].length).replace(/\.(\d*[1-9])0*$/,".$1").replace(/^(-?\d*)$/,"$1.").replace(/^0\./,r[1].length?"0.":"."); |
18947 | 18927 } |
18948 return crc ^ (-1); | 18928 if((r = fmt.match(/^#,##0(\.?)$/)) !== null) return sign + commaify(pad0r(aval,0)); |
18949 }, | 18929 if((r = fmt.match(/^#,##0\.([#0]*0)$/)) !== null) { |
18950 | 18930 return val < 0 ? "-" + write_num_flt(type, fmt, -val) : commaify(""+(Math.floor(val))) + "." + pad0(dec(val, r[1].length),r[1].length); |
18951 // Inspired by http://my.opera.com/GreyWyvern/blog/show.dml/1725165 | 18931 } |
18952 clone : function() { | 18932 if((r = fmt.match(/^#,#*,#0/)) !== null) return write_num_flt(type,fmt.replace(/^#,#*,/,""),val); |
18953 var newObj = new JSZip(); | 18933 if((r = fmt.match(/^([0#]+)(\\?-([0#]+))+$/)) !== null) { |
18954 for (var i in this) { | 18934 o = _strrev(write_num_flt(type, fmt.replace(/[\\-]/g,""), val)); |
18955 if (typeof this[i] !== "function") { | 18935 ri = 0; |
18956 newObj[i] = this[i]; | 18936 return _strrev(_strrev(fmt.replace(/\\/g,"")).replace(/[0#]/g,function(x){return ri<o.length?o[ri++]:x==='0'?'0':"";})); |
18957 } | 18937 } |
18958 } | 18938 if(fmt.match(phone) !== null) { |
18959 return newObj; | 18939 o = write_num_flt(type, "##########", val); |
18960 }, | 18940 return "(" + o.substr(0,3) + ") " + o.substr(3, 3) + "-" + o.substr(6); |
18961 | 18941 } |
18962 | 18942 var oa = ""; |
18963 /** | 18943 if((r = fmt.match(/^([#0?]+)( ?)\/( ?)([#0?]+)/)) !== null) { |
18964 * http://www.webtoolkit.info/javascript-utf8.html | 18944 ri = Math.min(r[4].length,7); |
18965 */ | 18945 ff = frac(aval, Math.pow(10,ri)-1, false); |
18966 utf8encode : function (string) { | 18946 o = "" + sign; |
18967 string = string.replace(/\r\n/g,"\n"); | 18947 oa = write_num("n", r[1], ff[1]); |
18968 var utftext = ""; | 18948 if(oa[oa.length-1] == " ") oa = oa.substr(0,oa.length-1) + "0"; |
18969 | 18949 o += oa + r[2] + "/" + r[3]; |
18970 for (var n = 0; n < string.length; n++) { | 18950 oa = rpad_(ff[2],ri); |
18971 | 18951 if(oa.length < r[4].length) oa = hashq(r[4].substr(r[4].length-oa.length)) + oa; |
18972 var c = string.charCodeAt(n); | 18952 o += oa; |
18973 | 18953 return o; |
18974 if (c < 128) { | 18954 } |
18975 utftext += String.fromCharCode(c); | 18955 if((r = fmt.match(/^# ([#0?]+)( ?)\/( ?)([#0?]+)/)) !== null) { |
18976 } else if ((c > 127) && (c < 2048)) { | 18956 ri = Math.min(Math.max(r[1].length, r[4].length),7); |
18977 utftext += String.fromCharCode((c >> 6) | 192); | 18957 ff = frac(aval, Math.pow(10,ri)-1, true); |
18978 utftext += String.fromCharCode((c & 63) | 128); | 18958 return sign + (ff[0]||(ff[1] ? "" : "0")) + " " + (ff[1] ? pad_(ff[1],ri) + r[2] + "/" + r[3] + rpad_(ff[2],ri): fill(" ", 2*ri+1 + r[2].length + r[3].length)); |
18979 } else { | 18959 } |
18980 utftext += String.fromCharCode((c >> 12) | 224); | 18960 if((r = fmt.match(/^[#0?]+$/)) !== null) { |
18981 utftext += String.fromCharCode(((c >> 6) & 63) | 128); | 18961 o = pad0r(val, 0); |
18982 utftext += String.fromCharCode((c & 63) | 128); | 18962 if(fmt.length <= o.length) return o; |
18983 } | 18963 return hashq(fmt.substr(0,fmt.length-o.length)) + o; |
18984 | 18964 } |
18985 } | 18965 if((r = fmt.match(/^([#0?]+)\.([#0]+)$/)) !== null) { |
18986 | 18966 o = "" + val.toFixed(Math.min(r[2].length,10)).replace(/([^0])0+$/,"$1"); |
18987 return utftext; | 18967 ri = o.indexOf("."); |
18988 }, | 18968 var lres = fmt.indexOf(".") - ri, rres = fmt.length - o.length - lres; |
18989 | 18969 return hashq(fmt.substr(0,lres) + o + fmt.substr(fmt.length-rres)); |
18990 /** | 18970 } |
18991 * http://www.webtoolkit.info/javascript-utf8.html | 18971 if((r = fmt.match(/^00,000\.([#0]*0)$/)) !== null) { |
18992 */ | 18972 ri = dec(val, r[1].length); |
18993 utf8decode : function (utftext) { | 18973 return val < 0 ? "-" + write_num_flt(type, fmt, -val) : commaify(flr(val)).replace(/^\d,\d{3}$/,"0$&").replace(/^\d*$/,function($$) { return "00," + ($$.length < 3 ? pad0(0,3-$$.length) : "") + $$; }) + "." + pad0(ri,r[1].length); |
18994 var string = ""; | 18974 } |
18995 var i = 0; | 18975 switch(fmt) { |
18996 var c = 0, c1 = 0, c2 = 0, c3 = 0; | 18976 case "#,###": var x = commaify(pad0r(aval,0)); return x !== "0" ? sign + x : ""; |
18997 | 18977 default: |
18998 while ( i < utftext.length ) { | 18978 } |
18999 | 18979 throw new Error("unsupported format |" + fmt + "|"); |
19000 c = utftext.charCodeAt(i); | 18980 } |
19001 | 18981 function write_num_cm2(type, fmt, val){ |
19002 if (c < 128) { | 18982 var idx = fmt.length - 1; |
19003 string += String.fromCharCode(c); | 18983 while(fmt.charCodeAt(idx-1) === 44) --idx; |
19004 i++; | 18984 return write_num(type, fmt.substr(0,idx), val / Math.pow(10,3*(fmt.length-idx))); |
19005 } else if ((c > 191) && (c < 224)) { | 18985 } |
19006 c2 = utftext.charCodeAt(i+1); | 18986 function write_num_pct2(type, fmt, val){ |
19007 string += String.fromCharCode(((c & 31) << 6) | (c2 & 63)); | 18987 var sfmt = fmt.replace(pct1,""), mul = fmt.length - sfmt.length; |
19008 i += 2; | 18988 return write_num(type, sfmt, val * Math.pow(10,2*mul)) + fill("%",mul); |
19009 } else { | 18989 } |
19010 c2 = utftext.charCodeAt(i+1); | 18990 function write_num_exp2(fmt, val){ |
19011 c3 = utftext.charCodeAt(i+2); | 18991 var o; |
19012 string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63)); | 18992 var idx = fmt.indexOf("E") - fmt.indexOf(".") - 1; |
19013 i += 3; | 18993 if(fmt.match(/^#+0.0E\+0$/)) { |
19014 } | 18994 var period = fmt.indexOf("."); if(period === -1) period=fmt.indexOf('E'); |
19015 | 18995 var ee = Math.floor(Math.log(Math.abs(val))*Math.LOG10E)%period; |
19016 } | 18996 if(ee < 0) ee += period; |
19017 | 18997 o = (val/Math.pow(10,ee)).toPrecision(idx+1+(period+ee)%period); |
19018 return string; | 18998 if(!o.match(/[Ee]/)) { |
19019 } | 18999 var fakee = Math.floor(Math.log(Math.abs(val))*Math.LOG10E); |
19020 }; | 19000 if(o.indexOf(".") === -1) o = o[0] + "." + o.substr(1) + "E+" + (fakee - o.length+ee); |
19021 }()); | 19001 else o += "E+" + (fakee - ee); |
19022 | 19002 o = o.replace(/\+-/,"-"); |
19003 } | |
19004 o = o.replace(/^([+-]?)(\d*)\.(\d*)[Ee]/,function($$,$1,$2,$3) { return $1 + $2 + $3.substr(0,(period+ee)%period) + "." + $3.substr(ee) + "E"; }); | |
19005 } else o = val.toExponential(idx); | |
19006 if(fmt.match(/E\+00$/) && o.match(/e[+-]\d$/)) o = o.substr(0,o.length-1) + "0" + o[o.length-1]; | |
19007 if(fmt.match(/E\-/) && o.match(/e\+/)) o = o.replace(/e\+/,"e"); | |
19008 return o.replace("e","E"); | |
19009 } | |
19010 function write_num_int(type, fmt, val) { | |
19011 if(type.charCodeAt(0) === 40 && !fmt.match(closeparen)) { | |
19012 var ffmt = fmt.replace(/\( */,"").replace(/ \)/,"").replace(/\)/,""); | |
19013 if(val >= 0) return write_num_int('n', ffmt, val); | |
19014 return '(' + write_num_int('n', ffmt, -val) + ')'; | |
19015 } | |
19016 if(fmt.charCodeAt(fmt.length - 1) === 44) return write_num_cm2(type, fmt, val); | |
19017 if(fmt.indexOf('%') !== -1) return write_num_pct2(type, fmt, val); | |
19018 if(fmt.indexOf('E') !== -1) return write_num_exp2(fmt, val); | |
19019 if(fmt.charCodeAt(0) === 36) return "$"+write_num_int(type,fmt.substr(fmt[1]==' '?2:1),val); | |
19020 var o; | |
19021 var r, ri, ff, aval = Math.abs(val), sign = val < 0 ? "-" : ""; | |
19022 if(fmt.match(/^00+$/)) return sign + pad0(aval,fmt.length); | |
19023 if(fmt.match(/^[#?]+$/)) { | |
19024 o = (""+val); if(val === 0) o = ""; | |
19025 return o.length > fmt.length ? o : hashq(fmt.substr(0,fmt.length-o.length)) + o; | |
19026 } | |
19027 if((r = fmt.match(frac1)) !== null) return write_num_f2(r, aval, sign); | |
19028 if(fmt.match(/^#+0+$/) !== null) return sign + pad0(aval,fmt.length - fmt.indexOf("0")); | |
19029 if((r = fmt.match(dec1)) !== null) { | |
19030 o = (""+val).replace(/^([^\.]+)$/,"$1."+r[1]).replace(/\.$/,"."+r[1]).replace(/\.(\d*)$/,function($$, $1) { return "." + $1 + fill("0", r[1].length-$1.length); }); | |
19031 return fmt.indexOf("0.") !== -1 ? o : o.replace(/^0\./,"."); | |
19032 } | |
19033 fmt = fmt.replace(/^#+([0.])/, "$1"); | |
19034 if((r = fmt.match(/^(0*)\.(#*)$/)) !== null) { | |
19035 return sign + (""+aval).replace(/\.(\d*[1-9])0*$/,".$1").replace(/^(-?\d*)$/,"$1.").replace(/^0\./,r[1].length?"0.":"."); | |
19036 } | |
19037 if((r = fmt.match(/^#,##0(\.?)$/)) !== null) return sign + commaify((""+aval)); | |
19038 if((r = fmt.match(/^#,##0\.([#0]*0)$/)) !== null) { | |
19039 return val < 0 ? "-" + write_num_int(type, fmt, -val) : commaify((""+val)) + "." + fill('0',r[1].length); | |
19040 } | |
19041 if((r = fmt.match(/^#,#*,#0/)) !== null) return write_num_int(type,fmt.replace(/^#,#*,/,""),val); | |
19042 if((r = fmt.match(/^([0#]+)(\\?-([0#]+))+$/)) !== null) { | |
19043 o = _strrev(write_num_int(type, fmt.replace(/[\\-]/g,""), val)); | |
19044 ri = 0; | |
19045 return _strrev(_strrev(fmt.replace(/\\/g,"")).replace(/[0#]/g,function(x){return ri<o.length?o[ri++]:x==='0'?'0':"";})); | |
19046 } | |
19047 if(fmt.match(phone) !== null) { | |
19048 o = write_num_int(type, "##########", val); | |
19049 return "(" + o.substr(0,3) + ") " + o.substr(3, 3) + "-" + o.substr(6); | |
19050 } | |
19051 var oa = ""; | |
19052 if((r = fmt.match(/^([#0?]+)( ?)\/( ?)([#0?]+)/)) !== null) { | |
19053 ri = Math.min(r[4].length,7); | |
19054 ff = frac(aval, Math.pow(10,ri)-1, false); | |
19055 o = "" + sign; | |
19056 oa = write_num("n", r[1], ff[1]); | |
19057 if(oa[oa.length-1] == " ") oa = oa.substr(0,oa.length-1) + "0"; | |
19058 o += oa + r[2] + "/" + r[3]; | |
19059 oa = rpad_(ff[2],ri); | |
19060 if(oa.length < r[4].length) oa = hashq(r[4].substr(r[4].length-oa.length)) + oa; | |
19061 o += oa; | |
19062 return o; | |
19063 } | |
19064 if((r = fmt.match(/^# ([#0?]+)( ?)\/( ?)([#0?]+)/)) !== null) { | |
19065 ri = Math.min(Math.max(r[1].length, r[4].length),7); | |
19066 ff = frac(aval, Math.pow(10,ri)-1, true); | |
19067 return sign + (ff[0]||(ff[1] ? "" : "0")) + " " + (ff[1] ? pad_(ff[1],ri) + r[2] + "/" + r[3] + rpad_(ff[2],ri): fill(" ", 2*ri+1 + r[2].length + r[3].length)); | |
19068 } | |
19069 if((r = fmt.match(/^[#0?]+$/)) !== null) { | |
19070 o = "" + val; | |
19071 if(fmt.length <= o.length) return o; | |
19072 return hashq(fmt.substr(0,fmt.length-o.length)) + o; | |
19073 } | |
19074 if((r = fmt.match(/^([#0]+)\.([#0]+)$/)) !== null) { | |
19075 o = "" + val.toFixed(Math.min(r[2].length,10)).replace(/([^0])0+$/,"$1"); | |
19076 ri = o.indexOf("."); | |
19077 var lres = fmt.indexOf(".") - ri, rres = fmt.length - o.length - lres; | |
19078 return hashq(fmt.substr(0,lres) + o + fmt.substr(fmt.length-rres)); | |
19079 } | |
19080 if((r = fmt.match(/^00,000\.([#0]*0)$/)) !== null) { | |
19081 return val < 0 ? "-" + write_num_int(type, fmt, -val) : commaify(""+val).replace(/^\d,\d{3}$/,"0$&").replace(/^\d*$/,function($$) { return "00," + ($$.length < 3 ? pad0(0,3-$$.length) : "") + $$; }) + "." + pad0(0,r[1].length); | |
19082 } | |
19083 switch(fmt) { | |
19084 case "#,###": var x = commaify(""+aval); return x !== "0" ? sign + x : ""; | |
19085 default: | |
19086 } | |
19087 throw new Error("unsupported format |" + fmt + "|"); | |
19088 } | |
19089 return function write_num(type, fmt, val) { | |
19090 return (val|0) === val ? write_num_int(type, fmt, val) : write_num_flt(type, fmt, val); | |
19091 };})(); | |
19092 function split_fmt(fmt) { | |
19093 var out = []; | |
19094 var in_str = false, cc; | |
19095 for(var i = 0, j = 0; i < fmt.length; ++i) switch((cc=fmt.charCodeAt(i))) { | |
19096 case 34: /* '"' */ | |
19097 in_str = !in_str; break; | |
19098 case 95: case 42: case 92: /* '_' '*' '\\' */ | |
19099 ++i; break; | |
19100 case 59: /* ';' */ | |
19101 out[out.length] = fmt.substr(j,i-j); | |
19102 j = i+1; | |
19103 } | |
19104 out[out.length] = fmt.substr(j); | |
19105 if(in_str === true) throw new Error("Format |" + fmt + "| unterminated string "); | |
19106 return out; | |
19107 } | |
19108 SSF._split = split_fmt; | |
19109 var abstime = /\[[HhMmSs]*\]/; | |
19110 function eval_fmt(fmt, v, opts, flen) { | |
19111 var out = [], o = "", i = 0, c = "", lst='t', q, dt, j, cc; | |
19112 var hr='H'; | |
19113 /* Tokenize */ | |
19114 while(i < fmt.length) { | |
19115 switch((c = fmt[i])) { | |
19116 case 'G': /* General */ | |
19117 if(!isgeneral(fmt, i)) throw new Error('unrecognized character ' + c + ' in ' +fmt); | |
19118 out[out.length] = {t:'G', v:'General'}; i+=7; break; | |
19119 case '"': /* Literal text */ | |
19120 for(o="";(cc=fmt.charCodeAt(++i)) !== 34 && i < fmt.length;) o += String.fromCharCode(cc); | |
19121 out[out.length] = {t:'t', v:o}; ++i; break; | |
19122 case '\\': var w = fmt[++i], t = (w === "(" || w === ")") ? w : 't'; | |
19123 out[out.length] = {t:t, v:w}; ++i; break; | |
19124 case '_': out[out.length] = {t:'t', v:" "}; i+=2; break; | |
19125 case '@': /* Text Placeholder */ | |
19126 out[out.length] = {t:'T', v:v}; ++i; break; | |
19127 case 'B': case 'b': | |
19128 if(fmt[i+1] === "1" || fmt[i+1] === "2") { | |
19129 if(dt==null) { dt=parse_date_code(v, opts, fmt[i+1] === "2"); if(dt==null) return ""; } | |
19130 out[out.length] = {t:'X', v:fmt.substr(i,2)}; lst = c; i+=2; break; | |
19131 } | |
19132 /* falls through */ | |
19133 case 'M': case 'D': case 'Y': case 'H': case 'S': case 'E': | |
19134 c = c.toLowerCase(); | |
19135 /* falls through */ | |
19136 case 'm': case 'd': case 'y': case 'h': case 's': case 'e': case 'g': | |
19137 if(v < 0) return ""; | |
19138 if(dt==null) { dt=parse_date_code(v, opts); if(dt==null) return ""; } | |
19139 o = c; while(++i<fmt.length && fmt[i].toLowerCase() === c) o+=c; | |
19140 if(c === 'm' && lst.toLowerCase() === 'h') c = 'M'; /* m = minute */ | |
19141 if(c === 'h') c = hr; | |
19142 out[out.length] = {t:c, v:o}; lst = c; break; | |
19143 case 'A': | |
19144 q={t:c, v:"A"}; | |
19145 if(dt==null) dt=parse_date_code(v, opts); | |
19146 if(fmt.substr(i, 3) === "A/P") { if(dt!=null) q.v = dt.H >= 12 ? "P" : "A"; q.t = 'T'; hr='h';i+=3;} | |
19147 else if(fmt.substr(i,5) === "AM/PM") { if(dt!=null) q.v = dt.H >= 12 ? "PM" : "AM"; q.t = 'T'; i+=5; hr='h'; } | |
19148 else { q.t = "t"; ++i; } | |
19149 if(dt==null && q.t === 'T') return ""; | |
19150 out[out.length] = q; lst = c; break; | |
19151 case '[': | |
19152 o = c; | |
19153 while(fmt[i++] !== ']' && i < fmt.length) o += fmt[i]; | |
19154 if(o.substr(-1) !== ']') throw 'unterminated "[" block: |' + o + '|'; | |
19155 if(o.match(abstime)) { | |
19156 if(dt==null) { dt=parse_date_code(v, opts); if(dt==null) return ""; } | |
19157 out[out.length] = {t:'Z', v:o.toLowerCase()}; | |
19158 } else { o=""; } | |
19159 break; | |
19160 /* Numbers */ | |
19161 case '.': | |
19162 if(dt != null) { | |
19163 o = c; while((c=fmt[++i]) === "0") o += c; | |
19164 out[out.length] = {t:'s', v:o}; break; | |
19165 } | |
19166 /* falls through */ | |
19167 case '0': case '#': | |
19168 o = c; while("0#?.,E+-%".indexOf(c=fmt[++i]) > -1 || c=='\\' && fmt[i+1] == "-" && "0#".indexOf(fmt[i+2])>-1) o += c; | |
19169 out[out.length] = {t:'n', v:o}; break; | |
19170 case '?': | |
19171 o = c; while(fmt[++i] === c) o+=c; | |
19172 q={t:c, v:o}; out[out.length] = q; lst = c; break; | |
19173 case '*': ++i; if(fmt[i] == ' ' || fmt[i] == '*') ++i; break; // ** | |
19174 case '(': case ')': out[out.length] = {t:(flen===1?'t':c), v:c}; ++i; break; | |
19175 case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': | |
19176 o = c; while("0123456789".indexOf(fmt[++i]) > -1) o+=fmt[i]; | |
19177 out[out.length] = {t:'D', v:o}; break; | |
19178 case ' ': out[out.length] = {t:c, v:c}; ++i; break; | |
19179 default: | |
19180 if(",$-+/():!^&'~{}<>=€acfijklopqrtuvwxz".indexOf(c) === -1) throw new Error('unrecognized character ' + c + ' in ' + fmt); | |
19181 out[out.length] = {t:'t', v:c}; ++i; break; | |
19182 } | |
19183 } | |
19184 var bt = 0, ss0 = 0, ssm; | |
19185 for(i=out.length-1, lst='t'; i >= 0; --i) { | |
19186 switch(out[i].t) { | |
19187 case 'h': case 'H': out[i].t = hr; lst='h'; if(bt < 1) bt = 1; break; | |
19188 case 's': | |
19189 if((ssm=out[i].v.match(/\.0+$/))) ss0=Math.max(ss0,ssm[0].length-1); | |
19190 if(bt < 3) bt = 3; | |
19191 /* falls through */ | |
19192 case 'd': case 'y': case 'M': case 'e': lst=out[i].t; break; | |
19193 case 'm': if(lst === 's') { out[i].t = 'M'; if(bt < 2) bt = 2; } break; | |
19194 case 'X': if(out[i].v === "B2"); | |
19195 break; | |
19196 case 'Z': | |
19197 if(bt < 1 && out[i].v.match(/[Hh]/)) bt = 1; | |
19198 if(bt < 2 && out[i].v.match(/[Mm]/)) bt = 2; | |
19199 if(bt < 3 && out[i].v.match(/[Ss]/)) bt = 3; | |
19200 } | |
19201 } | |
19202 switch(bt) { | |
19203 case 0: break; | |
19204 case 1: | |
19205 if(dt.u >= 0.5) { dt.u = 0; ++dt.S; } | |
19206 if(dt.S >= 60) { dt.S = 0; ++dt.M; } | |
19207 if(dt.M >= 60) { dt.M = 0; ++dt.H; } | |
19208 break; | |
19209 case 2: | |
19210 if(dt.u >= 0.5) { dt.u = 0; ++dt.S; } | |
19211 if(dt.S >= 60) { dt.S = 0; ++dt.M; } | |
19212 break; | |
19213 } | |
19214 /* replace fields */ | |
19215 var nstr = "", jj; | |
19216 for(i=0; i < out.length; ++i) { | |
19217 switch(out[i].t) { | |
19218 case 't': case 'T': case ' ': case 'D': break; | |
19219 case 'X': out[i] = undefined; break; | |
19220 case 'd': case 'm': case 'y': case 'h': case 'H': case 'M': case 's': case 'e': case 'b': case 'Z': | |
19221 out[i].v = write_date(out[i].t.charCodeAt(0), out[i].v, dt, ss0); | |
19222 out[i].t = 't'; break; | |
19223 case 'n': case '(': case '?': | |
19224 jj = i+1; | |
19225 while(out[jj] != null && ( | |
19226 (c=out[jj].t) === "?" || c === "D" || | |
19227 (c === " " || c === "t") && out[jj+1] != null && (out[jj+1].t === '?' || out[jj+1].t === "t" && out[jj+1].v === '/') || | |
19228 out[i].t === '(' && (c === ' ' || c === 'n' || c === ')') || | |
19229 c === 't' && (out[jj].v === '/' || '$€'.indexOf(out[jj].v) > -1 || out[jj].v === ' ' && out[jj+1] != null && out[jj+1].t == '?') | |
19230 )) { | |
19231 out[i].v += out[jj].v; | |
19232 out[jj] = undefined; ++jj; | |
19233 } | |
19234 nstr += out[i].v; | |
19235 i = jj-1; break; | |
19236 case 'G': out[i].t = 't'; out[i].v = general_fmt(v,opts); break; | |
19237 } | |
19238 } | |
19239 var vv = "", myv, ostr; | |
19240 if(nstr.length > 0) { | |
19241 myv = (v<0&&nstr.charCodeAt(0) === 45 ? -v : v); /* '-' */ | |
19242 ostr = write_num(nstr.charCodeAt(0) === 40 ? '(' : 'n', nstr, myv); /* '(' */ | |
19243 jj=ostr.length-1; | |
19244 var decpt = out.length; | |
19245 for(i=0; i < out.length; ++i) if(out[i] != null && out[i].v.indexOf(".") > -1) { decpt = i; break; } | |
19246 var lasti=out.length; | |
19247 if(decpt === out.length && ostr.indexOf("E") === -1) { | |
19248 for(i=out.length-1; i>= 0;--i) { | |
19249 if(out[i] == null || 'n?('.indexOf(out[i].t) === -1) continue; | |
19250 if(jj>=out[i].v.length-1) { jj -= out[i].v.length; out[i].v = ostr.substr(jj+1, out[i].v.length); } | |
19251 else if(jj < 0) out[i].v = ""; | |
19252 else { out[i].v = ostr.substr(0, jj+1); jj = -1; } | |
19253 out[i].t = 't'; | |
19254 lasti = i; | |
19255 } | |
19256 if(jj>=0 && lasti<out.length) out[lasti].v = ostr.substr(0,jj+1) + out[lasti].v; | |
19257 } | |
19258 else if(decpt !== out.length && ostr.indexOf("E") === -1) { | |
19259 jj = ostr.indexOf(".")-1; | |
19260 for(i=decpt; i>= 0; --i) { | |
19261 if(out[i] == null || 'n?('.indexOf(out[i].t) === -1) continue; | |
19262 j=out[i].v.indexOf(".")>-1&&i===decpt?out[i].v.indexOf(".")-1:out[i].v.length-1; | |
19263 vv = out[i].v.substr(j+1); | |
19264 for(; j>=0; --j) { | |
19265 if(jj>=0 && (out[i].v[j] === "0" || out[i].v[j] === "#")) vv = ostr[jj--] + vv; | |
19266 } | |
19267 out[i].v = vv; | |
19268 out[i].t = 't'; | |
19269 lasti = i; | |
19270 } | |
19271 if(jj>=0 && lasti<out.length) out[lasti].v = ostr.substr(0,jj+1) + out[lasti].v; | |
19272 jj = ostr.indexOf(".")+1; | |
19273 for(i=decpt; i<out.length; ++i) { | |
19274 if(out[i] == null || 'n?('.indexOf(out[i].t) === -1 && i !== decpt ) continue; | |
19275 j=out[i].v.indexOf(".")>-1&&i===decpt?out[i].v.indexOf(".")+1:0; | |
19276 vv = out[i].v.substr(0,j); | |
19277 for(; j<out[i].v.length; ++j) { | |
19278 if(jj<ostr.length) vv += ostr[jj++]; | |
19279 } | |
19280 out[i].v = vv; | |
19281 out[i].t = 't'; | |
19282 lasti = i; | |
19283 } | |
19284 } | |
19285 } | |
19286 for(i=0; i<out.length; ++i) if(out[i] != null && 'n(?'.indexOf(out[i].t)>-1) { | |
19287 myv = (flen >1 && v < 0 && i>0 && out[i-1].v === "-" ? -v:v); | |
19288 out[i].v = write_num(out[i].t, out[i].v, myv); | |
19289 out[i].t = 't'; | |
19290 } | |
19291 var retval = ""; | |
19292 for(i=0; i !== out.length; ++i) if(out[i] != null) retval += out[i].v; | |
19293 return retval; | |
19294 } | |
19295 SSF._eval = eval_fmt; | |
19296 var cfregex = /\[[=<>]/; | |
19297 var cfregex2 = /\[([=<>]*)(-?\d+\.?\d*)\]/; | |
19298 function chkcond(v, rr) { | |
19299 if(rr == null) return false; | |
19300 var thresh = parseFloat(rr[2]); | |
19301 switch(rr[1]) { | |
19302 case "=": if(v == thresh) return true; break; | |
19303 case ">": if(v > thresh) return true; break; | |
19304 case "<": if(v < thresh) return true; break; | |
19305 case "<>": if(v != thresh) return true; break; | |
19306 case ">=": if(v >= thresh) return true; break; | |
19307 case "<=": if(v <= thresh) return true; break; | |
19308 } | |
19309 return false; | |
19310 } | |
19311 function choose_fmt(f, v) { | |
19312 var fmt = split_fmt(f); | |
19313 var l = fmt.length, lat = fmt[l-1].indexOf("@"); | |
19314 if(l<4 && lat>-1) --l; | |
19315 if(fmt.length > 4) throw "cannot find right format for |" + fmt + "|"; | |
19316 if(typeof v !== "number") return [4, fmt.length === 4 || lat>-1?fmt[fmt.length-1]:"@"]; | |
19317 switch(fmt.length) { | |
19318 case 1: fmt = lat>-1 ? ["General", "General", "General", fmt[0]] : [fmt[0], fmt[0], fmt[0], "@"]; break; | |
19319 case 2: fmt = lat>-1 ? [fmt[0], fmt[0], fmt[0], fmt[1]] : [fmt[0], fmt[1], fmt[0], "@"]; break; | |
19320 case 3: fmt = lat>-1 ? [fmt[0], fmt[1], fmt[0], fmt[2]] : [fmt[0], fmt[1], fmt[2], "@"]; break; | |
19321 case 4: break; | |
19322 } | |
19323 var ff = v > 0 ? fmt[0] : v < 0 ? fmt[1] : fmt[2]; | |
19324 if(fmt[0].indexOf("[") === -1 && fmt[1].indexOf("[") === -1) return [l, ff]; | |
19325 if(fmt[0].match(cfregex) != null || fmt[1].match(cfregex) != null) { | |
19326 var m1 = fmt[0].match(cfregex2); | |
19327 var m2 = fmt[1].match(cfregex2); | |
19328 return chkcond(v, m1) ? [l, fmt[0]] : chkcond(v, m2) ? [l, fmt[1]] : [l, fmt[m1 != null && m2 != null ? 2 : 1]]; | |
19329 } | |
19330 return [l, ff]; | |
19331 } | |
19332 function format(fmt,v,o) { | |
19333 fixopts(o != null ? o : (o=[])); | |
19334 var sfmt = ""; | |
19335 switch(typeof fmt) { | |
19336 case "string": sfmt = fmt; break; | |
19337 case "number": sfmt = (o.table != null ? o.table : table_fmt)[fmt]; break; | |
19338 } | |
19339 if(isgeneral(sfmt,0)) return general_fmt(v, o); | |
19340 var f = choose_fmt(sfmt, v); | |
19341 if(isgeneral(f[1])) return general_fmt(v, o); | |
19342 if(v === true) v = "TRUE"; else if(v === false) v = "FALSE"; | |
19343 else if(v === "" || v == null) return ""; | |
19344 return eval_fmt(f[1], v, o, f[0]); | |
19345 } | |
19346 SSF._table = table_fmt; | |
19347 SSF.load = function load_entry(fmt, idx) { table_fmt[idx] = fmt; }; | |
19348 SSF.format = format; | |
19349 SSF.get_table = function get_table() { return table_fmt; }; | |
19350 SSF.load_table = function load_table(tbl) { for(var i=0; i!=0x0188; ++i) if(tbl[i] !== undefined) SSF.load(tbl[i], i); }; | |
19351 }; | |
19352 make_ssf(SSF); | |
19353 function isval(x) { return x !== undefined && x !== null; } | |
19354 | |
19355 function keys(o) { return Object.keys(o); } | |
19356 | |
19357 function evert_key(obj, key) { | |
19358 var o = [], K = keys(obj); | |
19359 for(var i = 0; i !== K.length; ++i) o[obj[K[i]][key]] = K[i]; | |
19360 return o; | |
19361 } | |
19362 | |
19363 function evert(obj) { | |
19364 var o = [], K = keys(obj); | |
19365 for(var i = 0; i !== K.length; ++i) o[obj[K[i]]] = K[i]; | |
19366 return o; | |
19367 } | |
19368 | |
19369 function evert_num(obj) { | |
19370 var o = [], K = keys(obj); | |
19371 for(var i = 0; i !== K.length; ++i) o[obj[K[i]]] = parseInt(K[i],10); | |
19372 return o; | |
19373 } | |
19374 | |
19375 function evert_arr(obj) { | |
19376 var o = [], K = keys(obj); | |
19377 for(var i = 0; i !== K.length; ++i) { | |
19378 if(o[obj[K[i]]] == null) o[obj[K[i]]] = []; | |
19379 o[obj[K[i]]].push(K[i]); | |
19380 } | |
19381 return o; | |
19382 } | |
19383 | |
19384 /* TODO: date1904 logic */ | |
19385 function datenum(v, date1904) { | |
19386 if(date1904) v+=1462; | |
19387 var epoch = Date.parse(v); | |
19388 return (epoch + 2209161600000) / (24 * 60 * 60 * 1000); | |
19389 } | |
19390 | |
19391 function cc2str(arr) { | |
19392 var o = ""; | |
19393 for(var i = 0; i != arr.length; ++i) o += String.fromCharCode(arr[i]); | |
19394 return o; | |
19395 } | |
19396 | |
19397 var has_buf = (typeof Buffer !== 'undefined'); | |
19398 function getdata(data) { | |
19399 if(!data) return null; | |
19400 if(data.name.substr(-4) === ".bin") { | |
19401 if(data.data) return char_codes(data.data); | |
19402 if(data.asNodeBuffer && has_buf) return data.asNodeBuffer(); | |
19403 if(data._data && data._data.getContent) return Array.prototype.slice.call(data._data.getContent()); | |
19404 } else { | |
19405 if(data.data) return data.name.substr(-4) !== ".bin" ? debom_xml(data.data) : char_codes(data.data); | |
19406 if(data.asNodeBuffer && has_buf) return debom_xml(data.asNodeBuffer().toString('binary')); | |
19407 if(data.asBinary) return debom_xml(data.asBinary()); | |
19408 if(data._data && data._data.getContent) return debom_xml(cc2str(Array.prototype.slice.call(data._data.getContent(),0))); | |
19409 } | |
19410 return null; | |
19411 } | |
19412 | |
19413 function getzipfile(zip, file) { | |
19414 var f = file; if(zip.files[f]) return zip.files[f]; | |
19415 f = file.toLowerCase(); if(zip.files[f]) return zip.files[f]; | |
19416 f = f.replace(/\//g,'\\'); if(zip.files[f]) return zip.files[f]; | |
19417 throw new Error("Cannot find file " + file + " in zip"); | |
19418 } | |
19419 | |
19420 function getzipdata(zip, file, safe) { | |
19421 if(!safe) return getdata(getzipfile(zip, file)); | |
19422 if(!file) return null; | |
19423 try { return getzipdata(zip, file); } catch(e) { return null; } | |
19424 } | |
19425 | |
19426 var _fs, jszip; | |
19427 if(typeof JSZip !== 'undefined') jszip = JSZip; | |
19428 if (typeof exports !== 'undefined') { | |
19429 if (typeof module !== 'undefined' && module.exports) { | |
19430 if(has_buf && typeof jszip === 'undefined') jszip = require('js'+'zip'); | |
19431 if(typeof jszip === 'undefined') jszip = require('./js'+'zip').JSZip; | |
19432 _fs = require('f'+'s'); | |
19433 } | |
19434 } | |
19435 var attregexg=/\b[\w:]+=["'][^"]*['"]/g; | |
19436 var tagregex=/<[^>]*>/g; | |
19437 var nsregex=/<\w*:/, nsregex2 = /<(\/?)\w+:/; | |
19438 function parsexmltag(tag, skip_root) { | |
19439 var z = []; | |
19440 var eq = 0, c = 0; | |
19441 for(; eq !== tag.length; ++eq) if((c = tag.charCodeAt(eq)) === 32 || c === 10 || c === 13) break; | |
19442 if(!skip_root) z[0] = tag.substr(0, eq); | |
19443 if(eq === tag.length) return z; | |
19444 var m = tag.match(attregexg), j=0, w="", v="", i=0, q="", cc=""; | |
19445 if(m) for(i = 0; i != m.length; ++i) { | |
19446 cc = m[i]; | |
19447 for(c=0; c != cc.length; ++c) if(cc.charCodeAt(c) === 61) break; | |
19448 q = cc.substr(0,c); v = cc.substring(c+2, cc.length-1); | |
19449 for(j=0;j!=q.length;++j) if(q.charCodeAt(j) === 58) break; | |
19450 if(j===q.length) z[q] = v; | |
19451 else z[(j===5 && q.substr(0,5)==="xmlns"?"xmlns":"")+q.substr(j+1)] = v; | |
19452 } | |
19453 return z; | |
19454 } | |
19455 function strip_ns(x) { return x.replace(nsregex2, "<$1"); } | |
19456 | |
19457 var encodings = { | |
19458 '"': '"', | |
19459 ''': "'", | |
19460 '>': '>', | |
19461 '<': '<', | |
19462 '&': '&' | |
19463 }; | |
19464 var rencoding = evert(encodings); | |
19465 var rencstr = "&<>'\"".split(""); | |
19466 | |
19467 // TODO: CP remap (need to read file version to determine OS) | |
19468 var encregex = /&[a-z]*;/g, coderegex = /_x([\da-fA-F]+)_/g; | |
19469 function unescapexml(text){ | |
19470 var s = text + ''; | |
19471 return s.replace(encregex, function($$) { return encodings[$$]; }).replace(coderegex,function(m,c) {return String.fromCharCode(parseInt(c,16));}); | |
19472 } | |
19473 var decregex=/[&<>'"]/g, charegex = /[\u0000-\u0008\u000b-\u001f]/g; | |
19474 function escapexml(text){ | |
19475 var s = text + ''; | |
19476 return s.replace(decregex, function(y) { return rencoding[y]; }).replace(charegex,function(s) { return "_x" + ("000"+s.charCodeAt(0).toString(16)).substr(-4) + "_";}); | |
19477 } | |
19478 | |
19479 function parsexmlbool(value, tag) { | |
19480 switch(value) { | |
19481 case '1': case 'true': case 'TRUE': return true; | |
19482 /* case '0': case 'false': case 'FALSE':*/ | |
19483 default: return false; | |
19484 } | |
19485 } | |
19486 | |
19487 var utf8read = function utf8reada(orig) { | |
19488 var out = "", i = 0, c = 0, d = 0, e = 0, f = 0, w = 0; | |
19489 while (i < orig.length) { | |
19490 c = orig.charCodeAt(i++); | |
19491 if (c < 128) { out += String.fromCharCode(c); continue; } | |
19492 d = orig.charCodeAt(i++); | |
19493 if (c>191 && c<224) { out += String.fromCharCode(((c & 31) << 6) | (d & 63)); continue; } | |
19494 e = orig.charCodeAt(i++); | |
19495 if (c < 240) { out += String.fromCharCode(((c & 15) << 12) | ((d & 63) << 6) | (e & 63)); continue; } | |
19496 f = orig.charCodeAt(i++); | |
19497 w = (((c & 7) << 18) | ((d & 63) << 12) | ((e & 63) << 6) | (f & 63))-65536; | |
19498 out += String.fromCharCode(0xD800 + ((w>>>10)&1023)); | |
19499 out += String.fromCharCode(0xDC00 + (w&1023)); | |
19500 } | |
19501 return out; | |
19502 }; | |
19503 | |
19504 | |
19505 if(has_buf) { | |
19506 var utf8readb = function utf8readb(data) { | |
19507 var out = new Buffer(2*data.length), w, i, j = 1, k = 0, ww=0, c; | |
19508 for(i = 0; i < data.length; i+=j) { | |
19509 j = 1; | |
19510 if((c=data.charCodeAt(i)) < 128) w = c; | |
19511 else if(c < 224) { w = (c&31)*64+(data.charCodeAt(i+1)&63); j=2; } | |
19512 else if(c < 240) { w=(c&15)*4096+(data.charCodeAt(i+1)&63)*64+(data.charCodeAt(i+2)&63); j=3; } | |
19513 else { j = 4; | |
19514 w = (c & 7)*262144+(data.charCodeAt(i+1)&63)*4096+(data.charCodeAt(i+2)&63)*64+(data.charCodeAt(i+3)&63); | |
19515 w -= 65536; ww = 0xD800 + ((w>>>10)&1023); w = 0xDC00 + (w&1023); | |
19516 } | |
19517 if(ww !== 0) { out[k++] = ww&255; out[k++] = ww>>>8; ww = 0; } | |
19518 out[k++] = w%256; out[k++] = w>>>8; | |
19519 } | |
19520 out.length = k; | |
19521 return out.toString('ucs2'); | |
19522 }; | |
19523 var corpus = "foo bar baz\u00e2\u0098\u0083\u00f0\u009f\u008d\u00a3"; | |
19524 if(utf8read(corpus) == utf8readb(corpus)) utf8read = utf8readb; | |
19525 var utf8readc = function utf8readc(data) { return Buffer(data, 'binary').toString('utf8'); }; | |
19526 if(utf8read(corpus) == utf8readc(corpus)) utf8read = utf8readc; | |
19527 } | |
19528 | |
19529 // matches <foo>...</foo> extracts content | |
19530 var matchtag = (function() { | |
19531 var mtcache = {}; | |
19532 return function matchtag(f,g) { | |
19533 var t = f+"|"+g; | |
19534 if(mtcache[t] !== undefined) return mtcache[t]; | |
19535 return (mtcache[t] = new RegExp('<(?:\\w+:)?'+f+'(?: xml:space="preserve")?(?:[^>]*)>([^\u2603]*)</(?:\\w+:)?'+f+'>',(g||""))); | |
19536 }; | |
19537 })(); | |
19538 | |
19539 var vtregex = (function(){ var vt_cache = {}; | |
19540 return function vt_regex(bt) { | |
19541 if(vt_cache[bt] !== undefined) return vt_cache[bt]; | |
19542 return (vt_cache[bt] = new RegExp("<vt:" + bt + ">(.*?)</vt:" + bt + ">", 'g') ); | |
19543 };})(); | |
19544 var vtvregex = /<\/?vt:variant>/g, vtmregex = /<vt:([^>]*)>(.*)</; | |
19545 function parseVector(data) { | |
19546 var h = parsexmltag(data); | |
19547 | |
19548 var matches = data.match(vtregex(h.baseType))||[]; | |
19549 if(matches.length != h.size) throw "unexpected vector length " + matches.length + " != " + h.size; | |
19550 var res = []; | |
19551 matches.forEach(function(x) { | |
19552 var v = x.replace(vtvregex,"").match(vtmregex); | |
19553 res.push({v:v[2], t:v[1]}); | |
19554 }); | |
19555 return res; | |
19556 } | |
19557 | |
19558 var wtregex = /(^\s|\s$|\n)/; | |
19559 function writetag(f,g) {return '<' + f + (g.match(wtregex)?' xml:space="preserve"' : "") + '>' + g + '</' + f + '>';} | |
19560 | |
19561 function wxt_helper(h) { return keys(h).map(function(k) { return " " + k + '="' + h[k] + '"';}).join(""); } | |
19562 function writextag(f,g,h) { return '<' + f + (isval(h) ? wxt_helper(h) : "") + (isval(g) ? (g.match(wtregex)?' xml:space="preserve"' : "") + '>' + g + '</' + f : "/") + '>';} | |
19563 | |
19564 function write_w3cdtf(d, t) { try { return d.toISOString().replace(/\.\d*/,""); } catch(e) { if(t) throw e; } } | |
19565 | |
19566 function write_vt(s) { | |
19567 switch(typeof s) { | |
19568 case 'string': return writextag('vt:lpwstr', s); | |
19569 case 'number': return writextag((s|0)==s?'vt:i4':'vt:r8', String(s)); | |
19570 case 'boolean': return writextag('vt:bool',s?'true':'false'); | |
19571 } | |
19572 if(s instanceof Date) return writextag('vt:filetime', write_w3cdtf(s)); | |
19573 throw new Error("Unable to serialize " + s); | |
19574 } | |
19575 | |
19576 var XML_HEADER = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>\r\n'; | |
19577 var XMLNS = { | |
19578 'dc': 'http://purl.org/dc/elements/1.1/', | |
19579 'dcterms': 'http://purl.org/dc/terms/', | |
19580 'dcmitype': 'http://purl.org/dc/dcmitype/', | |
19581 'mx': 'http://schemas.microsoft.com/office/mac/excel/2008/main', | |
19582 'r': 'http://schemas.openxmlformats.org/officeDocument/2006/relationships', | |
19583 'sjs': 'http://schemas.openxmlformats.org/package/2006/sheetjs/core-properties', | |
19584 'vt': 'http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes', | |
19585 'xsi': 'http://www.w3.org/2001/XMLSchema-instance', | |
19586 'xsd': 'http://www.w3.org/2001/XMLSchema' | |
19587 }; | |
19588 | |
19589 XMLNS.main = [ | |
19590 'http://schemas.openxmlformats.org/spreadsheetml/2006/main', | |
19591 'http://purl.oclc.org/ooxml/spreadsheetml/main', | |
19592 'http://schemas.microsoft.com/office/excel/2006/main', | |
19593 'http://schemas.microsoft.com/office/excel/2006/2' | |
19594 ]; | |
19595 function readIEEE754(buf, idx, isLE, nl, ml) { | |
19596 if(isLE === undefined) isLE = true; | |
19597 if(!nl) nl = 8; | |
19598 if(!ml && nl === 8) ml = 52; | |
19599 var e, m, el = nl * 8 - ml - 1, eMax = (1 << el) - 1, eBias = eMax >> 1; | |
19600 var bits = -7, d = isLE ? -1 : 1, i = isLE ? (nl - 1) : 0, s = buf[idx + i]; | |
19601 | |
19602 i += d; | |
19603 e = s & ((1 << (-bits)) - 1); s >>>= (-bits); bits += el; | |
19604 for (; bits > 0; e = e * 256 + buf[idx + i], i += d, bits -= 8); | |
19605 m = e & ((1 << (-bits)) - 1); e >>>= (-bits); bits += ml; | |
19606 for (; bits > 0; m = m * 256 + buf[idx + i], i += d, bits -= 8); | |
19607 if (e === eMax) return m ? NaN : ((s ? -1 : 1) * Infinity); | |
19608 else if (e === 0) e = 1 - eBias; | |
19609 else { m = m + Math.pow(2, ml); e = e - eBias; } | |
19610 return (s ? -1 : 1) * m * Math.pow(2, e - ml); | |
19611 } | |
19612 | |
19613 var __toBuffer, ___toBuffer; | |
19614 __toBuffer = ___toBuffer = function toBuffer_(bufs) { var x = []; for(var i = 0; i < bufs[0].length; ++i) { x.push.apply(x, bufs[0][i]); } return x; }; | |
19615 var __double, ___double; | |
19616 __double = ___double = function(b, idx) { return readIEEE754(b, idx);}; | |
19617 | |
19618 var is_buf = function is_buf_a(a) { return Array.isArray(a); }; | |
19619 if(has_buf) { | |
19620 __toBuffer = function(bufs) { return (bufs[0].length > 0 && Buffer.isBuffer(bufs[0][0])) ? Buffer.concat(bufs[0]) : ___toBuffer(bufs);}; | |
19621 __double = function double_(b,i) { if(Buffer.isBuffer(b)) return b.readDoubleLE(i); return ___double(b,i); }; | |
19622 is_buf = function is_buf_b(a) { return Buffer.isBuffer(a) || Array.isArray(a); }; | |
19623 } | |
19624 | |
19625 | |
19626 var __readUInt8 = function(b, idx) { return b[idx]; }; | |
19627 var __readUInt16LE = function(b, idx) { return b[idx+1]*(1<<8)+b[idx]; }; | |
19628 var __readInt16LE = function(b, idx) { var u = b[idx+1]*(1<<8)+b[idx]; return (u < 0x8000) ? u : (0xffff - u + 1) * -1; }; | |
19629 var __readUInt32LE = function(b, idx) { return b[idx+3]*(1<<24)+(b[idx+2]<<16)+(b[idx+1]<<8)+b[idx]; }; | |
19630 var __readInt32LE = function(b, idx) { return (b[idx+3]<<24)|(b[idx+2]<<16)|(b[idx+1]<<8)|b[idx]; }; | |
19631 | |
19632 | |
19633 function ReadShift(size, t) { | |
19634 var o="", oo=[], w, vv, i, loc; | |
19635 if(t === 'dbcs') { | |
19636 loc = this.l; | |
19637 if(has_buf && Buffer.isBuffer(this)) o = this.slice(this.l, this.l+2*size).toString("utf16le"); | |
19638 else for(i = 0; i != size; ++i) { o+=String.fromCharCode(__readUInt16LE(this, loc)); loc+=2; } | |
19639 size *= 2; | |
19640 } else switch(size) { | |
19641 case 1: o = __readUInt8(this, this.l); break; | |
19642 case 2: o = (t === 'i' ? __readInt16LE : __readUInt16LE)(this, this.l); break; | |
19643 case 4: o = __readUInt32LE(this, this.l); break; | |
19644 case 8: if(t === 'f') { o = __double(this, this.l); break; } | |
19645 } | |
19646 this.l+=size; return o; | |
19647 } | |
19648 | |
19649 function WriteShift(t, val, f) { | |
19650 var size, i; | |
19651 if(f === 'dbcs') { | |
19652 for(i = 0; i != val.length; ++i) this.writeUInt16LE(val.charCodeAt(i), this.l + 2 * i); | |
19653 size = 2 * val.length; | |
19654 } else switch(t) { | |
19655 case 1: size = 1; this[this.l] = val&255; break; | |
19656 case 3: size = 3; this[this.l+2] = val & 255; val >>>= 8; this[this.l+1] = val&255; val >>>= 8; this[this.l] = val&255; break; | |
19657 case 4: size = 4; this.writeUInt32LE(val, this.l); break; | |
19658 case 8: size = 8; if(f === 'f') { this.writeDoubleLE(val, this.l); break; } | |
19659 /* falls through */ | |
19660 case 16: break; | |
19661 case -4: size = 4; this.writeInt32LE(val, this.l); break; | |
19662 } | |
19663 this.l += size; return this; | |
19664 } | |
19665 | |
19666 function prep_blob(blob, pos) { | |
19667 blob.l = pos; | |
19668 blob.read_shift = ReadShift; | |
19669 blob.write_shift = WriteShift; | |
19670 } | |
19671 | |
19672 function parsenoop(blob, length) { blob.l += length; } | |
19673 | |
19674 function writenoop(blob, length) { blob.l += length; } | |
19675 | |
19676 function new_buf(sz) { | |
19677 var o = has_buf ? new Buffer(sz) : new Array(sz); | |
19678 prep_blob(o, 0); | |
19679 return o; | |
19680 } | |
19681 | |
19682 /* [MS-XLSB] 2.1.4 Record */ | |
19683 function recordhopper(data, cb, opts) { | |
19684 var tmpbyte, cntbyte, length; | |
19685 prep_blob(data, data.l || 0); | |
19686 while(data.l < data.length) { | |
19687 var RT = data.read_shift(1); | |
19688 if(RT & 0x80) RT = (RT & 0x7F) + ((data.read_shift(1) & 0x7F)<<7); | |
19689 var R = RecordEnum[RT] || RecordEnum[0xFFFF]; | |
19690 tmpbyte = data.read_shift(1); | |
19691 length = tmpbyte & 0x7F; | |
19692 for(cntbyte = 1; cntbyte <4 && (tmpbyte & 0x80); ++cntbyte) length += ((tmpbyte = data.read_shift(1)) & 0x7F)<<(7*cntbyte); | |
19693 var d = R.f(data, length, opts); | |
19694 if(cb(d, R, RT)) return; | |
19695 } | |
19696 } | |
19697 | |
19698 /* control buffer usage for fixed-length buffers */ | |
19699 function buf_array() { | |
19700 var bufs = [], blksz = 2048; | |
19701 var newblk = function ba_newblk(sz) { | |
19702 var o = new_buf(sz); | |
19703 prep_blob(o, 0); | |
19704 return o; | |
19705 }; | |
19706 | |
19707 var curbuf = newblk(blksz); | |
19708 | |
19709 var endbuf = function ba_endbuf() { | |
19710 curbuf.length = curbuf.l; | |
19711 if(curbuf.length > 0) bufs.push(curbuf); | |
19712 curbuf = null; | |
19713 }; | |
19714 | |
19715 var next = function ba_next(sz) { | |
19716 if(sz < curbuf.length - curbuf.l) return curbuf; | |
19717 endbuf(); | |
19718 return (curbuf = newblk(Math.max(sz+1, blksz))); | |
19719 }; | |
19720 | |
19721 var end = function ba_end() { | |
19722 endbuf(); | |
19723 return __toBuffer([bufs]); | |
19724 }; | |
19725 | |
19726 var push = function ba_push(buf) { endbuf(); curbuf = buf; next(blksz); }; | |
19727 | |
19728 return { next:next, push:push, end:end, _bufs:bufs }; | |
19729 } | |
19730 | |
19731 function write_record(ba, type, payload, length) { | |
19732 var t = evert_RE[type], l; | |
19733 if(!length) length = RecordEnum[t].p || (payload||[]).length || 0; | |
19734 l = 1 + (t >= 0x80 ? 1 : 0) + 1 + length; | |
19735 if(length >= 0x80) ++l; if(length >= 0x4000) ++l; if(length >= 0x200000) ++l; | |
19736 var o = ba.next(l); | |
19737 if(t <= 0x7F) o.write_shift(1, t); | |
19738 else { | |
19739 o.write_shift(1, (t & 0x7F) + 0x80); | |
19740 o.write_shift(1, (t >> 7)); | |
19741 } | |
19742 for(var i = 0; i != 4; ++i) { | |
19743 if(length >= 0x80) { o.write_shift(1, (length & 0x7F)+0x80); length >>= 7; } | |
19744 else { o.write_shift(1, length); break; } | |
19745 } | |
19746 if(length > 0 && is_buf(payload)) ba.push(payload); | |
19747 } | |
19748 | |
19749 /* [MS-XLSB] 2.5.143 */ | |
19750 function parse_StrRun(data, length) { | |
19751 return { ich: data.read_shift(2), ifnt: data.read_shift(2) }; | |
19752 } | |
19753 | |
19754 /* [MS-XLSB] 2.1.7.121 */ | |
19755 function parse_RichStr(data, length) { | |
19756 var start = data.l; | |
19757 var flags = data.read_shift(1); | |
19758 var str = parse_XLWideString(data); | |
19759 var rgsStrRun = []; | |
19760 var z = { t: str, h: str }; | |
19761 if((flags & 1) !== 0) { /* fRichStr */ | |
19762 /* TODO: formatted string */ | |
19763 var dwSizeStrRun = data.read_shift(4); | |
19764 for(var i = 0; i != dwSizeStrRun; ++i) rgsStrRun.push(parse_StrRun(data)); | |
19765 z.r = rgsStrRun; | |
19766 } | |
19767 else z.r = "<t>" + escapexml(str) + "</t>"; | |
19768 if((flags & 2) !== 0) { /* fExtStr */ | |
19769 /* TODO: phonetic string */ | |
19770 } | |
19771 data.l = start + length; | |
19772 return z; | |
19773 } | |
19774 function write_RichStr(str, o) { | |
19775 /* TODO: formatted string */ | |
19776 if(o == null) o = new_buf(5+2*str.t.length); | |
19777 o.write_shift(1,0); | |
19778 write_XLWideString(str.t, o); | |
19779 return o; | |
19780 } | |
19781 | |
19782 /* [MS-XLSB] 2.5.9 */ | |
19783 function parse_Cell(data) { | |
19784 var col = data.read_shift(4); | |
19785 var iStyleRef = data.read_shift(2); | |
19786 iStyleRef += data.read_shift(1) <<16; | |
19787 var fPhShow = data.read_shift(1); | |
19788 return { c:col, iStyleRef: iStyleRef }; | |
19789 } | |
19790 function write_Cell(cell, o) { | |
19791 if(o == null) o = new_buf(8); | |
19792 o.write_shift(-4, cell.c); | |
19793 o.write_shift(3, cell.iStyleRef === undefined ? cell.iStyleRef : cell.s); | |
19794 o.write_shift(1, 0); /* fPhShow */ | |
19795 return o; | |
19796 } | |
19797 | |
19798 | |
19799 /* [MS-XLSB] 2.5.21 */ | |
19800 function parse_CodeName (data, length) { return parse_XLWideString(data, length); } | |
19801 | |
19802 /* [MS-XLSB] 2.5.166 */ | |
19803 function parse_XLNullableWideString(data) { | |
19804 var cchCharacters = data.read_shift(4); | |
19805 return cchCharacters === 0 || cchCharacters === 0xFFFFFFFF ? "" : data.read_shift(cchCharacters, 'dbcs'); | |
19806 } | |
19807 function write_XLNullableWideString(data, o) { | |
19808 if(!o) o = new_buf(127); | |
19809 o.write_shift(4, data.length > 0 ? data.length : 0xFFFFFFFF); | |
19810 if(data.length > 0) o.write_shift(0, data, 'dbcs'); | |
19811 return o; | |
19812 } | |
19813 | |
19814 /* [MS-XLSB] 2.5.168 */ | |
19815 function parse_XLWideString(data) { | |
19816 var cchCharacters = data.read_shift(4); | |
19817 return cchCharacters === 0 ? "" : data.read_shift(cchCharacters, 'dbcs'); | |
19818 } | |
19819 function write_XLWideString(data, o) { | |
19820 if(o == null) o = new_buf(4+2*data.length); | |
19821 o.write_shift(4, data.length); | |
19822 if(data.length > 0) o.write_shift(0, data, 'dbcs'); | |
19823 return o; | |
19824 } | |
19825 | |
19826 /* [MS-XLSB] 2.5.114 */ | |
19827 var parse_RelID = parse_XLNullableWideString; | |
19828 var write_RelID = write_XLNullableWideString; | |
19829 | |
19830 | |
19831 /* [MS-XLSB] 2.5.122 */ | |
19832 function parse_RkNumber(data) { | |
19833 var b = data.slice(data.l, data.l+4); | |
19834 var fX100 = b[0] & 1, fInt = b[0] & 2; | |
19835 data.l+=4; | |
19836 b[0] &= 0xFC; | |
19837 var RK = fInt === 0 ? __double([0,0,0,0,b[0],b[1],b[2],b[3]],0) : __readInt32LE(b,0)>>2; | |
19838 return fX100 ? RK/100 : RK; | |
19839 } | |
19840 | |
19841 /* [MS-XLSB] 2.5.153 */ | |
19842 function parse_UncheckedRfX(data) { | |
19843 var cell = {s: {}, e: {}}; | |
19844 cell.s.r = data.read_shift(4); | |
19845 cell.e.r = data.read_shift(4); | |
19846 cell.s.c = data.read_shift(4); | |
19847 cell.e.c = data.read_shift(4); | |
19848 return cell; | |
19849 } | |
19850 | |
19851 function write_UncheckedRfX(r, o) { | |
19852 if(!o) o = new_buf(16); | |
19853 o.write_shift(4, r.s.r); | |
19854 o.write_shift(4, r.e.r); | |
19855 o.write_shift(4, r.s.c); | |
19856 o.write_shift(4, r.e.c); | |
19857 return o; | |
19858 } | |
19859 | |
19860 /* [MS-XLSB] 2.5.171 */ | |
19861 function parse_Xnum(data, length) { return data.read_shift(8, 'f'); } | |
19862 function write_Xnum(data, o) { return (o || new_buf(8)).write_shift(8, 'f', data); } | |
19863 | |
19864 /* [MS-XLSB] 2.5.198.2 */ | |
19865 var BErr = { | |
19866 0x00: "#NULL!", | |
19867 0x07: "#DIV/0!", | |
19868 0x0F: "#VALUE!", | |
19869 0x17: "#REF!", | |
19870 0x1D: "#NAME?", | |
19871 0x24: "#NUM!", | |
19872 0x2A: "#N/A", | |
19873 0x2B: "#GETTING_DATA", | |
19874 0xFF: "#WTF?" | |
19875 }; | |
19876 var RBErr = evert_num(BErr); | |
19877 | |
19878 /* [MS-XLSB] 2.4.321 BrtColor */ | |
19879 function parse_BrtColor(data, length) { | |
19880 var out = {}; | |
19881 var d = data.read_shift(1); | |
19882 out.fValidRGB = d & 1; | |
19883 out.xColorType = d >>> 1; | |
19884 out.index = data.read_shift(1); | |
19885 out.nTintAndShade = data.read_shift(2, 'i'); | |
19886 out.bRed = data.read_shift(1); | |
19887 out.bGreen = data.read_shift(1); | |
19888 out.bBlue = data.read_shift(1); | |
19889 out.bAlpha = data.read_shift(1); | |
19890 } | |
19891 | |
19892 /* [MS-XLSB] 2.5.52 */ | |
19893 function parse_FontFlags(data, length) { | |
19894 var d = data.read_shift(1); | |
19895 data.l++; | |
19896 var out = { | |
19897 fItalic: d & 0x2, | |
19898 fStrikeout: d & 0x8, | |
19899 fOutline: d & 0x10, | |
19900 fShadow: d & 0x20, | |
19901 fCondense: d & 0x40, | |
19902 fExtend: d & 0x80 | |
19903 }; | |
19904 return out; | |
19905 } | |
19906 /* Parts enumerated in OPC spec, MS-XLSB and MS-XLSX */ | |
19907 /* 12.3 Part Summary <SpreadsheetML> */ | |
19908 /* 14.2 Part Summary <DrawingML> */ | |
19909 /* [MS-XLSX] 2.1 Part Enumerations */ | |
19910 /* [MS-XLSB] 2.1.7 Part Enumeration */ | |
19911 var ct2type = { | |
19912 /* Workbook */ | |
19913 "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml": "workbooks", | |
19914 | |
19915 /* Worksheet */ | |
19916 "application/vnd.ms-excel.binIndexWs": "TODO", /* Binary Index */ | |
19917 | |
19918 /* Chartsheet */ | |
19919 "application/vnd.ms-excel.chartsheet": "TODO", | |
19920 "application/vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml": "TODO", | |
19921 | |
19922 /* Dialogsheet */ | |
19923 "application/vnd.ms-excel.dialogsheet": "TODO", | |
19924 "application/vnd.openxmlformats-officedocument.spreadsheetml.dialogsheet+xml": "TODO", | |
19925 | |
19926 /* Macrosheet */ | |
19927 "application/vnd.ms-excel.macrosheet": "TODO", | |
19928 "application/vnd.ms-excel.macrosheet+xml": "TODO", | |
19929 "application/vnd.ms-excel.intlmacrosheet": "TODO", | |
19930 "application/vnd.ms-excel.binIndexMs": "TODO", /* Binary Index */ | |
19931 | |
19932 /* File Properties */ | |
19933 "application/vnd.openxmlformats-package.core-properties+xml": "coreprops", | |
19934 "application/vnd.openxmlformats-officedocument.custom-properties+xml": "custprops", | |
19935 "application/vnd.openxmlformats-officedocument.extended-properties+xml": "extprops", | |
19936 | |
19937 /* Custom Data Properties */ | |
19938 "application/vnd.openxmlformats-officedocument.customXmlProperties+xml": "TODO", | |
19939 | |
19940 /* Comments */ | |
19941 "application/vnd.ms-excel.comments": "comments", | |
19942 "application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml": "comments", | |
19943 | |
19944 /* PivotTable */ | |
19945 "application/vnd.ms-excel.pivotTable": "TODO", | |
19946 "application/vnd.openxmlformats-officedocument.spreadsheetml.pivotTable+xml": "TODO", | |
19947 | |
19948 /* Calculation Chain */ | |
19949 "application/vnd.ms-excel.calcChain": "calcchains", | |
19950 "application/vnd.openxmlformats-officedocument.spreadsheetml.calcChain+xml": "calcchains", | |
19951 | |
19952 /* Printer Settings */ | |
19953 "application/vnd.openxmlformats-officedocument.spreadsheetml.printerSettings": "TODO", | |
19954 | |
19955 /* ActiveX */ | |
19956 "application/vnd.ms-office.activeX": "TODO", | |
19957 "application/vnd.ms-office.activeX+xml": "TODO", | |
19958 | |
19959 /* Custom Toolbars */ | |
19960 "application/vnd.ms-excel.attachedToolbars": "TODO", | |
19961 | |
19962 /* External Data Connections */ | |
19963 "application/vnd.ms-excel.connections": "TODO", | |
19964 "application/vnd.openxmlformats-officedocument.spreadsheetml.connections+xml": "TODO", | |
19965 | |
19966 /* External Links */ | |
19967 "application/vnd.ms-excel.externalLink": "TODO", | |
19968 "application/vnd.openxmlformats-officedocument.spreadsheetml.externalLink+xml": "TODO", | |
19969 | |
19970 /* Metadata */ | |
19971 "application/vnd.ms-excel.sheetMetadata": "TODO", | |
19972 "application/vnd.openxmlformats-officedocument.spreadsheetml.sheetMetadata+xml": "TODO", | |
19973 | |
19974 /* PivotCache */ | |
19975 "application/vnd.ms-excel.pivotCacheDefinition": "TODO", | |
19976 "application/vnd.ms-excel.pivotCacheRecords": "TODO", | |
19977 "application/vnd.openxmlformats-officedocument.spreadsheetml.pivotCacheDefinition+xml": "TODO", | |
19978 "application/vnd.openxmlformats-officedocument.spreadsheetml.pivotCacheRecords+xml": "TODO", | |
19979 | |
19980 /* Query Table */ | |
19981 "application/vnd.ms-excel.queryTable": "TODO", | |
19982 "application/vnd.openxmlformats-officedocument.spreadsheetml.queryTable+xml": "TODO", | |
19983 | |
19984 /* Shared Workbook */ | |
19985 "application/vnd.ms-excel.userNames": "TODO", | |
19986 "application/vnd.ms-excel.revisionHeaders": "TODO", | |
19987 "application/vnd.ms-excel.revisionLog": "TODO", | |
19988 "application/vnd.openxmlformats-officedocument.spreadsheetml.revisionHeaders+xml": "TODO", | |
19989 "application/vnd.openxmlformats-officedocument.spreadsheetml.revisionLog+xml": "TODO", | |
19990 "application/vnd.openxmlformats-officedocument.spreadsheetml.userNames+xml": "TODO", | |
19991 | |
19992 /* Single Cell Table */ | |
19993 "application/vnd.ms-excel.tableSingleCells": "TODO", | |
19994 "application/vnd.openxmlformats-officedocument.spreadsheetml.tableSingleCells+xml": "TODO", | |
19995 | |
19996 /* Slicer */ | |
19997 "application/vnd.ms-excel.slicer": "TODO", | |
19998 "application/vnd.ms-excel.slicerCache": "TODO", | |
19999 "application/vnd.ms-excel.slicer+xml": "TODO", | |
20000 "application/vnd.ms-excel.slicerCache+xml": "TODO", | |
20001 | |
20002 /* Sort Map */ | |
20003 "application/vnd.ms-excel.wsSortMap": "TODO", | |
20004 | |
20005 /* Table */ | |
20006 "application/vnd.ms-excel.table": "TODO", | |
20007 "application/vnd.openxmlformats-officedocument.spreadsheetml.table+xml": "TODO", | |
20008 | |
20009 /* Themes */ | |
20010 "application/vnd.openxmlformats-officedocument.theme+xml": "themes", | |
20011 | |
20012 /* Timeline */ | |
20013 "application/vnd.ms-excel.Timeline+xml": "TODO", /* verify */ | |
20014 "application/vnd.ms-excel.TimelineCache+xml": "TODO", /* verify */ | |
20015 | |
20016 /* VBA */ | |
20017 "application/vnd.ms-office.vbaProject": "vba", | |
20018 "application/vnd.ms-office.vbaProjectSignature": "vba", | |
20019 | |
20020 /* Volatile Dependencies */ | |
20021 "application/vnd.ms-office.volatileDependencies": "TODO", | |
20022 "application/vnd.openxmlformats-officedocument.spreadsheetml.volatileDependencies+xml": "TODO", | |
20023 | |
20024 /* Control Properties */ | |
20025 "application/vnd.ms-excel.controlproperties+xml": "TODO", | |
20026 | |
20027 /* Data Model */ | |
20028 "application/vnd.openxmlformats-officedocument.model+data": "TODO", | |
20029 | |
20030 /* Survey */ | |
20031 "application/vnd.ms-excel.Survey+xml": "TODO", | |
20032 | |
20033 /* Drawing */ | |
20034 "application/vnd.openxmlformats-officedocument.drawing+xml": "TODO", | |
20035 "application/vnd.openxmlformats-officedocument.drawingml.chart+xml": "TODO", | |
20036 "application/vnd.openxmlformats-officedocument.drawingml.chartshapes+xml": "TODO", | |
20037 "application/vnd.openxmlformats-officedocument.drawingml.diagramColors+xml": "TODO", | |
20038 "application/vnd.openxmlformats-officedocument.drawingml.diagramData+xml": "TODO", | |
20039 "application/vnd.openxmlformats-officedocument.drawingml.diagramLayout+xml": "TODO", | |
20040 "application/vnd.openxmlformats-officedocument.drawingml.diagramStyle+xml": "TODO", | |
20041 | |
20042 /* VML */ | |
20043 "application/vnd.openxmlformats-officedocument.vmlDrawing": "TODO", | |
20044 | |
20045 "application/vnd.openxmlformats-package.relationships+xml": "rels", | |
20046 "application/vnd.openxmlformats-officedocument.oleObject": "TODO", | |
20047 | |
20048 "sheet": "js" | |
20049 }; | |
20050 | |
20051 var CT_LIST = (function(){ | |
20052 var o = { | |
20053 workbooks: { | |
20054 xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml", | |
20055 xlsm: "application/vnd.ms-excel.sheet.macroEnabled.main+xml", | |
20056 xlsb: "application/vnd.ms-excel.sheet.binary.macroEnabled.main", | |
20057 xltx: "application/vnd.openxmlformats-officedocument.spreadsheetml.template.main+xml" | |
20058 }, | |
20059 strs: { /* Shared Strings */ | |
20060 xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml", | |
20061 xlsb: "application/vnd.ms-excel.sharedStrings" | |
20062 }, | |
20063 sheets: { | |
20064 xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml", | |
20065 xlsb: "application/vnd.ms-excel.worksheet" | |
20066 }, | |
20067 styles: {/* Styles */ | |
20068 xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml", | |
20069 xlsb: "application/vnd.ms-excel.styles" | |
20070 } | |
20071 }; | |
20072 keys(o).forEach(function(k) { if(!o[k].xlsm) o[k].xlsm = o[k].xlsx; }); | |
20073 keys(o).forEach(function(k){ keys(o[k]).forEach(function(v) { ct2type[o[k][v]] = k; }); }); | |
20074 return o; | |
20075 })(); | |
20076 | |
20077 var type2ct = evert_arr(ct2type); | |
20078 | |
20079 XMLNS.CT = 'http://schemas.openxmlformats.org/package/2006/content-types'; | |
20080 | |
20081 function parse_ct(data, opts) { | |
20082 var ctext = {}; | |
20083 if(!data || !data.match) return data; | |
20084 var ct = { workbooks: [], sheets: [], calcchains: [], themes: [], styles: [], | |
20085 coreprops: [], extprops: [], custprops: [], strs:[], comments: [], vba: [], | |
20086 TODO:[], rels:[], xmlns: "" }; | |
20087 (data.match(tagregex)||[]).forEach(function(x) { | |
20088 var y = parsexmltag(x); | |
20089 switch(y[0].replace(nsregex,"<")) { | |
20090 case '<?xml': break; | |
20091 case '<Types': ct.xmlns = y['xmlns' + (y[0].match(/<(\w+):/)||["",""])[1] ]; break; | |
20092 case '<Default': ctext[y.Extension] = y.ContentType; break; | |
20093 case '<Override': | |
20094 if(ct[ct2type[y.ContentType]] !== undefined) ct[ct2type[y.ContentType]].push(y.PartName); | |
20095 else if(opts.WTF) console.error(y); | |
20096 break; | |
20097 } | |
20098 }); | |
20099 if(ct.xmlns !== XMLNS.CT) throw new Error("Unknown Namespace: " + ct.xmlns); | |
20100 ct.calcchain = ct.calcchains.length > 0 ? ct.calcchains[0] : ""; | |
20101 ct.sst = ct.strs.length > 0 ? ct.strs[0] : ""; | |
20102 ct.style = ct.styles.length > 0 ? ct.styles[0] : ""; | |
20103 ct.defaults = ctext; | |
20104 delete ct.calcchains; | |
20105 return ct; | |
20106 } | |
20107 | |
20108 var CTYPE_XML_ROOT = writextag('Types', null, { | |
20109 'xmlns': XMLNS.CT, | |
20110 'xmlns:xsd': XMLNS.xsd, | |
20111 'xmlns:xsi': XMLNS.xsi | |
20112 }); | |
20113 | |
20114 var CTYPE_DEFAULTS = [ | |
20115 ['xml', 'application/xml'], | |
20116 ['bin', 'application/vnd.ms-excel.sheet.binary.macroEnabled.main'], | |
20117 ['rels', type2ct.rels[0]] | |
20118 ].map(function(x) { | |
20119 return writextag('Default', null, {'Extension':x[0], 'ContentType': x[1]}); | |
20120 }); | |
20121 | |
20122 function write_ct(ct, opts) { | |
20123 var o = [], v; | |
20124 o[o.length] = (XML_HEADER); | |
20125 o[o.length] = (CTYPE_XML_ROOT); | |
20126 o = o.concat(CTYPE_DEFAULTS); | |
20127 var f1 = function(w) { | |
20128 if(ct[w] && ct[w].length > 0) { | |
20129 v = ct[w][0]; | |
20130 o[o.length] = (writextag('Override', null, { | |
20131 'PartName': (v[0] == '/' ? "":"/") + v, | |
20132 'ContentType': CT_LIST[w][opts.bookType || 'xlsx'] | |
20133 })); | |
20134 } | |
20135 }; | |
20136 var f2 = function(w) { | |
20137 ct[w].forEach(function(v) { | |
20138 o[o.length] = (writextag('Override', null, { | |
20139 'PartName': (v[0] == '/' ? "":"/") + v, | |
20140 'ContentType': CT_LIST[w][opts.bookType || 'xlsx'] | |
20141 })); | |
20142 }); | |
20143 }; | |
20144 var f3 = function(t) { | |
20145 (ct[t]||[]).forEach(function(v) { | |
20146 o[o.length] = (writextag('Override', null, { | |
20147 'PartName': (v[0] == '/' ? "":"/") + v, | |
20148 'ContentType': type2ct[t][0] | |
20149 })); | |
20150 }); | |
20151 }; | |
20152 f1('workbooks'); | |
20153 f2('sheets'); | |
20154 f3('themes'); | |
20155 ['strs', 'styles'].forEach(f1); | |
20156 ['coreprops', 'extprops', 'custprops'].forEach(f3); | |
20157 if(o.length>2){ o[o.length] = ('</Types>'); o[1]=o[1].replace("/>",">"); } | |
20158 return o.join(""); | |
20159 } | |
20160 /* 9.3.2 OPC Relationships Markup */ | |
20161 var RELS = { | |
20162 WB: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument", | |
20163 SHEET: "http://sheetjs.openxmlformats.org/officeDocument/2006/relationships/officeDocument" | |
20164 }; | |
20165 | |
20166 function parse_rels(data, currentFilePath) { | |
20167 if (!data) return data; | |
20168 if (currentFilePath.charAt(0) !== '/') { | |
20169 currentFilePath = '/'+currentFilePath; | |
20170 } | |
20171 var rels = {}; | |
20172 var hash = {}; | |
20173 var resolveRelativePathIntoAbsolute = function (to) { | |
20174 var toksFrom = currentFilePath.split('/'); | |
20175 toksFrom.pop(); // folder path | |
20176 var toksTo = to.split('/'); | |
20177 var reversed = []; | |
20178 while (toksTo.length !== 0) { | |
20179 var tokTo = toksTo.shift(); | |
20180 if (tokTo === '..') { | |
20181 toksFrom.pop(); | |
20182 } else if (tokTo !== '.') { | |
20183 toksFrom.push(tokTo); | |
20184 } | |
20185 } | |
20186 return toksFrom.join('/'); | |
20187 }; | |
20188 | |
20189 data.match(tagregex).forEach(function(x) { | |
20190 var y = parsexmltag(x); | |
20191 /* 9.3.2.2 OPC_Relationships */ | |
20192 if (y[0] === '<Relationship') { | |
20193 var rel = {}; rel.Type = y.Type; rel.Target = y.Target; rel.Id = y.Id; rel.TargetMode = y.TargetMode; | |
20194 var canonictarget = y.TargetMode === 'External' ? y.Target : resolveRelativePathIntoAbsolute(y.Target); | |
20195 rels[canonictarget] = rel; | |
20196 hash[y.Id] = rel; | |
20197 } | |
20198 }); | |
20199 rels["!id"] = hash; | |
20200 return rels; | |
20201 } | |
20202 | |
20203 XMLNS.RELS = 'http://schemas.openxmlformats.org/package/2006/relationships'; | |
20204 | |
20205 var RELS_ROOT = writextag('Relationships', null, { | |
20206 //'xmlns:ns0': XMLNS.RELS, | |
20207 'xmlns': XMLNS.RELS | |
20208 }); | |
20209 | |
20210 /* TODO */ | |
20211 function write_rels(rels) { | |
20212 var o = []; | |
20213 o[o.length] = (XML_HEADER); | |
20214 o[o.length] = (RELS_ROOT); | |
20215 keys(rels['!id']).forEach(function(rid) { var rel = rels['!id'][rid]; | |
20216 o[o.length] = (writextag('Relationship', null, rel)); | |
20217 }); | |
20218 if(o.length>2){ o[o.length] = ('</Relationships>'); o[1]=o[1].replace("/>",">"); } | |
20219 return o.join(""); | |
20220 } | |
20221 /* ECMA-376 Part II 11.1 Core Properties Part */ | |
20222 /* [MS-OSHARED] 2.3.3.2.[1-2].1 (PIDSI/PIDDSI) */ | |
20223 var CORE_PROPS = [ | |
20224 ["cp:category", "Category"], | |
20225 ["cp:contentStatus", "ContentStatus"], | |
20226 ["cp:keywords", "Keywords"], | |
20227 ["cp:lastModifiedBy", "LastAuthor"], | |
20228 ["cp:lastPrinted", "LastPrinted"], | |
20229 ["cp:revision", "RevNumber"], | |
20230 ["cp:version", "Version"], | |
20231 ["dc:creator", "Author"], | |
20232 ["dc:description", "Comments"], | |
20233 ["dc:identifier", "Identifier"], | |
20234 ["dc:language", "Language"], | |
20235 ["dc:subject", "Subject"], | |
20236 ["dc:title", "Title"], | |
20237 ["dcterms:created", "CreatedDate", 'date'], | |
20238 ["dcterms:modified", "ModifiedDate", 'date'] | |
20239 ]; | |
20240 | |
20241 XMLNS.CORE_PROPS = "http://schemas.openxmlformats.org/package/2006/metadata/core-properties"; | |
20242 RELS.CORE_PROPS = 'http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties'; | |
20243 | |
20244 var CORE_PROPS_REGEX = (function() { | |
20245 var r = new Array(CORE_PROPS.length); | |
20246 for(var i = 0; i < CORE_PROPS.length; ++i) { | |
20247 var f = CORE_PROPS[i]; | |
20248 var g = "(?:"+ f[0].substr(0,f[0].indexOf(":")) +":)"+ f[0].substr(f[0].indexOf(":")+1); | |
20249 r[i] = new RegExp("<" + g + "[^>]*>(.*)<\/" + g + ">"); | |
20250 } | |
20251 return r; | |
20252 })(); | |
20253 | |
20254 function parse_core_props(data) { | |
20255 var p = {}; | |
20256 | |
20257 for(var i = 0; i < CORE_PROPS.length; ++i) { | |
20258 var f = CORE_PROPS[i], cur = data.match(CORE_PROPS_REGEX[i]); | |
20259 if(cur != null && cur.length > 0) p[f[1]] = cur[1]; | |
20260 if(f[2] === 'date' && p[f[1]]) p[f[1]] = new Date(p[f[1]]); | |
20261 } | |
20262 | |
20263 return p; | |
20264 } | |
20265 | |
20266 var CORE_PROPS_XML_ROOT = writextag('cp:coreProperties', null, { | |
20267 //'xmlns': XMLNS.CORE_PROPS, | |
20268 'xmlns:cp': XMLNS.CORE_PROPS, | |
20269 'xmlns:dc': XMLNS.dc, | |
20270 'xmlns:dcterms': XMLNS.dcterms, | |
20271 'xmlns:dcmitype': XMLNS.dcmitype, | |
20272 'xmlns:xsi': XMLNS.xsi | |
20273 }); | |
20274 | |
20275 function cp_doit(f, g, h, o, p) { | |
20276 if(p[f] != null || g == null || g === "") return; | |
20277 p[f] = g; | |
20278 o[o.length] = (h ? writextag(f,g,h) : writetag(f,g)); | |
20279 } | |
20280 | |
20281 function write_core_props(cp, opts) { | |
20282 var o = [XML_HEADER, CORE_PROPS_XML_ROOT], p = {}; | |
20283 if(!cp) return o.join(""); | |
20284 | |
20285 | |
20286 if(cp.CreatedDate != null) cp_doit("dcterms:created", typeof cp.CreatedDate === "string" ? cp.CreatedDate : write_w3cdtf(cp.CreatedDate, opts.WTF), {"xsi:type":"dcterms:W3CDTF"}, o, p); | |
20287 if(cp.ModifiedDate != null) cp_doit("dcterms:modified", typeof cp.ModifiedDate === "string" ? cp.ModifiedDate : write_w3cdtf(cp.ModifiedDate, opts.WTF), {"xsi:type":"dcterms:W3CDTF"}, o, p); | |
20288 | |
20289 for(var i = 0; i != CORE_PROPS.length; ++i) { var f = CORE_PROPS[i]; cp_doit(f[0], cp[f[1]], null, o, p); } | |
20290 if(o.length>2){ o[o.length] = ('</cp:coreProperties>'); o[1]=o[1].replace("/>",">"); } | |
20291 return o.join(""); | |
20292 } | |
20293 /* 15.2.12.3 Extended File Properties Part */ | |
20294 /* [MS-OSHARED] 2.3.3.2.[1-2].1 (PIDSI/PIDDSI) */ | |
20295 var EXT_PROPS = [ | |
20296 ["Application", "Application", "string"], | |
20297 ["AppVersion", "AppVersion", "string"], | |
20298 ["Company", "Company", "string"], | |
20299 ["DocSecurity", "DocSecurity", "string"], | |
20300 ["Manager", "Manager", "string"], | |
20301 ["HyperlinksChanged", "HyperlinksChanged", "bool"], | |
20302 ["SharedDoc", "SharedDoc", "bool"], | |
20303 ["LinksUpToDate", "LinksUpToDate", "bool"], | |
20304 ["ScaleCrop", "ScaleCrop", "bool"], | |
20305 ["HeadingPairs", "HeadingPairs", "raw"], | |
20306 ["TitlesOfParts", "TitlesOfParts", "raw"] | |
20307 ]; | |
20308 | |
20309 XMLNS.EXT_PROPS = "http://schemas.openxmlformats.org/officeDocument/2006/extended-properties"; | |
20310 RELS.EXT_PROPS = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties'; | |
20311 | |
20312 function parse_ext_props(data, p) { | |
20313 var q = {}; if(!p) p = {}; | |
20314 | |
20315 EXT_PROPS.forEach(function(f) { | |
20316 switch(f[2]) { | |
20317 case "string": p[f[1]] = (data.match(matchtag(f[0]))||[])[1]; break; | |
20318 case "bool": p[f[1]] = (data.match(matchtag(f[0]))||[])[1] === "true"; break; | |
20319 case "raw": | |
20320 var cur = data.match(new RegExp("<" + f[0] + "[^>]*>(.*)<\/" + f[0] + ">")); | |
20321 if(cur && cur.length > 0) q[f[1]] = cur[1]; | |
20322 break; | |
20323 } | |
20324 }); | |
20325 | |
20326 if(q.HeadingPairs && q.TitlesOfParts) { | |
20327 var v = parseVector(q.HeadingPairs); | |
20328 var j = 0, widx = 0; | |
20329 for(var i = 0; i !== v.length; ++i) { | |
20330 switch(v[i].v) { | |
20331 case "Worksheets": widx = j; p.Worksheets = +(v[++i].v); break; | |
20332 case "Named Ranges": ++i; break; // TODO: Handle Named Ranges | |
20333 } | |
20334 } | |
20335 var parts = parseVector(q.TitlesOfParts).map(function(x) { return utf8read(x.v); }); | |
20336 p.SheetNames = parts.slice(widx, widx + p.Worksheets); | |
20337 } | |
20338 return p; | |
20339 } | |
20340 | |
20341 var EXT_PROPS_XML_ROOT = writextag('Properties', null, { | |
20342 'xmlns': XMLNS.EXT_PROPS, | |
20343 'xmlns:vt': XMLNS.vt | |
20344 }); | |
20345 | |
20346 function write_ext_props(cp, opts) { | |
20347 var o = [], p = {}, W = writextag; | |
20348 if(!cp) cp = {}; | |
20349 cp.Application = "SheetJS"; | |
20350 o[o.length] = (XML_HEADER); | |
20351 o[o.length] = (EXT_PROPS_XML_ROOT); | |
20352 | |
20353 EXT_PROPS.forEach(function(f) { | |
20354 if(cp[f[1]] === undefined) return; | |
20355 var v; | |
20356 switch(f[2]) { | |
20357 case 'string': v = cp[f[1]]; break; | |
20358 case 'bool': v = cp[f[1]] ? 'true' : 'false'; break; | |
20359 } | |
20360 if(v !== undefined) o[o.length] = (W(f[0], v)); | |
20361 }); | |
20362 | |
20363 /* TODO: HeadingPairs, TitlesOfParts */ | |
20364 o[o.length] = (W('HeadingPairs', W('vt:vector', W('vt:variant', '<vt:lpstr>Worksheets</vt:lpstr>')+W('vt:variant', W('vt:i4', String(cp.Worksheets))), {size:2, baseType:"variant"}))); | |
20365 o[o.length] = (W('TitlesOfParts', W('vt:vector', cp.SheetNames.map(function(s) { return "<vt:lpstr>" + s + "</vt:lpstr>"; }).join(""), {size: cp.Worksheets, baseType:"lpstr"}))); | |
20366 if(o.length>2){ o[o.length] = ('</Properties>'); o[1]=o[1].replace("/>",">"); } | |
20367 return o.join(""); | |
20368 } | |
20369 /* 15.2.12.2 Custom File Properties Part */ | |
20370 XMLNS.CUST_PROPS = "http://schemas.openxmlformats.org/officeDocument/2006/custom-properties"; | |
20371 RELS.CUST_PROPS = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/custom-properties'; | |
20372 | |
20373 var custregex = /<[^>]+>[^<]*/g; | |
20374 function parse_cust_props(data, opts) { | |
20375 var p = {}, name; | |
20376 var m = data.match(custregex); | |
20377 if(m) for(var i = 0; i != m.length; ++i) { | |
20378 var x = m[i], y = parsexmltag(x); | |
20379 switch(y[0]) { | |
20380 case '<?xml': break; | |
20381 case '<Properties': | |
20382 if(y.xmlns !== XMLNS.CUST_PROPS) throw "unrecognized xmlns " + y.xmlns; | |
20383 if(y.xmlnsvt && y.xmlnsvt !== XMLNS.vt) throw "unrecognized vt " + y.xmlnsvt; | |
20384 break; | |
20385 case '<property': name = y.name; break; | |
20386 case '</property>': name = null; break; | |
20387 default: if (x.indexOf('<vt:') === 0) { | |
20388 var toks = x.split('>'); | |
20389 var type = toks[0].substring(4), text = toks[1]; | |
20390 /* 22.4.2.32 (CT_Variant). Omit the binary types from 22.4 (Variant Types) */ | |
20391 switch(type) { | |
20392 case 'lpstr': case 'lpwstr': case 'bstr': case 'lpwstr': | |
20393 p[name] = unescapexml(text); | |
20394 break; | |
20395 case 'bool': | |
20396 p[name] = parsexmlbool(text, '<vt:bool>'); | |
20397 break; | |
20398 case 'i1': case 'i2': case 'i4': case 'i8': case 'int': case 'uint': | |
20399 p[name] = parseInt(text, 10); | |
20400 break; | |
20401 case 'r4': case 'r8': case 'decimal': | |
20402 p[name] = parseFloat(text); | |
20403 break; | |
20404 case 'filetime': case 'date': | |
20405 p[name] = new Date(text); | |
20406 break; | |
20407 case 'cy': case 'error': | |
20408 p[name] = unescapexml(text); | |
20409 break; | |
20410 default: | |
20411 if(typeof console !== 'undefined') console.warn('Unexpected', x, type, toks); | |
20412 } | |
20413 } else if(x.substr(0,2) === "</") { | |
20414 } else if(opts.WTF) throw new Error(x); | |
20415 } | |
20416 } | |
20417 return p; | |
20418 } | |
20419 | |
20420 var CUST_PROPS_XML_ROOT = writextag('Properties', null, { | |
20421 'xmlns': XMLNS.CUST_PROPS, | |
20422 'xmlns:vt': XMLNS.vt | |
20423 }); | |
20424 | |
20425 function write_cust_props(cp, opts) { | |
20426 var o = [XML_HEADER, CUST_PROPS_XML_ROOT]; | |
20427 if(!cp) return o.join(""); | |
20428 var pid = 1; | |
20429 keys(cp).forEach(function custprop(k) { ++pid; | |
20430 o[o.length] = (writextag('property', write_vt(cp[k]), { | |
20431 'fmtid': '{D5CDD505-2E9C-101B-9397-08002B2CF9AE}', | |
20432 'pid': pid, | |
20433 'name': k | |
20434 })); | |
20435 }); | |
20436 if(o.length>2){ o[o.length] = '</Properties>'; o[1]=o[1].replace("/>",">"); } | |
20437 return o.join(""); | |
20438 } | |
20439 /* 18.4.1 charset to codepage mapping */ | |
20440 var CS2CP = { | |
20441 0: 1252, /* ANSI */ | |
20442 1: 65001, /* DEFAULT */ | |
20443 2: 65001, /* SYMBOL */ | |
20444 77: 10000, /* MAC */ | |
20445 128: 932, /* SHIFTJIS */ | |
20446 129: 949, /* HANGUL */ | |
20447 130: 1361, /* JOHAB */ | |
20448 134: 936, /* GB2312 */ | |
20449 136: 950, /* CHINESEBIG5 */ | |
20450 161: 1253, /* GREEK */ | |
20451 162: 1254, /* TURKISH */ | |
20452 163: 1258, /* VIETNAMESE */ | |
20453 177: 1255, /* HEBREW */ | |
20454 178: 1256, /* ARABIC */ | |
20455 186: 1257, /* BALTIC */ | |
20456 204: 1251, /* RUSSIAN */ | |
20457 222: 874, /* THAI */ | |
20458 238: 1250, /* EASTEUROPE */ | |
20459 255: 1252, /* OEM */ | |
20460 69: 6969 /* MISC */ | |
20461 }; | |
20462 | |
20463 /* Parse a list of <r> tags */ | |
20464 var parse_rs = (function parse_rs_factory() { | |
20465 var tregex = matchtag("t"), rpregex = matchtag("rPr"), rregex = /<r>/g, rend = /<\/r>/, nlregex = /\r\n/g; | |
20466 /* 18.4.7 rPr CT_RPrElt */ | |
20467 var parse_rpr = function parse_rpr(rpr, intro, outro) { | |
20468 var font = {}, cp = 65001; | |
20469 var m = rpr.match(tagregex), i = 0; | |
20470 if(m) for(;i!=m.length; ++i) { | |
20471 var y = parsexmltag(m[i]); | |
20472 switch(y[0]) { | |
20473 /* 18.8.12 condense CT_BooleanProperty */ | |
20474 /* ** not required . */ | |
20475 case '<condense': break; | |
20476 /* 18.8.17 extend CT_BooleanProperty */ | |
20477 /* ** not required . */ | |
20478 case '<extend': break; | |
20479 /* 18.8.36 shadow CT_BooleanProperty */ | |
20480 /* ** not required . */ | |
20481 case '<shadow': | |
20482 /* falls through */ | |
20483 case '<shadow/>': break; | |
20484 | |
20485 /* 18.4.1 charset CT_IntProperty TODO */ | |
20486 case '<charset': | |
20487 if(y.val == '1') break; | |
20488 cp = CS2CP[parseInt(y.val, 10)]; | |
20489 break; | |
20490 | |
20491 /* 18.4.2 outline CT_BooleanProperty TODO */ | |
20492 case '<outline': | |
20493 /* falls through */ | |
20494 case '<outline/>': break; | |
20495 | |
20496 /* 18.4.5 rFont CT_FontName */ | |
20497 case '<rFont': font.name = y.val; break; | |
20498 | |
20499 /* 18.4.11 sz CT_FontSize */ | |
20500 case '<sz': font.sz = y.val; break; | |
20501 | |
20502 /* 18.4.10 strike CT_BooleanProperty */ | |
20503 case '<strike': | |
20504 if(!y.val) break; | |
20505 /* falls through */ | |
20506 case '<strike/>': font.strike = 1; break; | |
20507 case '</strike>': break; | |
20508 | |
20509 /* 18.4.13 u CT_UnderlineProperty */ | |
20510 case '<u': | |
20511 if(!y.val) break; | |
20512 /* falls through */ | |
20513 case '<u/>': font.u = 1; break; | |
20514 case '</u>': break; | |
20515 | |
20516 /* 18.8.2 b */ | |
20517 case '<b': | |
20518 if(!y.val) break; | |
20519 /* falls through */ | |
20520 case '<b/>': font.b = 1; break; | |
20521 case '</b>': break; | |
20522 | |
20523 /* 18.8.26 i */ | |
20524 case '<i': | |
20525 if(!y.val) break; | |
20526 /* falls through */ | |
20527 case '<i/>': font.i = 1; break; | |
20528 case '</i>': break; | |
20529 | |
20530 /* 18.3.1.15 color CT_Color TODO: tint, theme, auto, indexed */ | |
20531 case '<color': | |
20532 if(y.rgb) font.color = y.rgb.substr(2,6); | |
20533 break; | |
20534 | |
20535 /* 18.8.18 family ST_FontFamily */ | |
20536 case '<family': font.family = y.val; break; | |
20537 | |
20538 /* 18.4.14 vertAlign CT_VerticalAlignFontProperty TODO */ | |
20539 case '<vertAlign': break; | |
20540 | |
20541 /* 18.8.35 scheme CT_FontScheme TODO */ | |
20542 case '<scheme': break; | |
20543 | |
20544 default: | |
20545 if(y[0].charCodeAt(1) !== 47) throw 'Unrecognized rich format ' + y[0]; | |
20546 } | |
20547 } | |
20548 /* TODO: These should be generated styles, not inline */ | |
20549 var style = []; | |
20550 if(font.b) style.push("font-weight: bold;"); | |
20551 if(font.i) style.push("font-style: italic;"); | |
20552 intro.push('<span style="' + style.join("") + '">'); | |
20553 outro.push("</span>"); | |
20554 return cp; | |
20555 }; | |
20556 | |
20557 /* 18.4.4 r CT_RElt */ | |
20558 function parse_r(r) { | |
20559 var terms = [[],"",[]]; | |
20560 /* 18.4.12 t ST_Xstring */ | |
20561 var t = r.match(tregex), cp = 65001; | |
20562 if(!isval(t)) return ""; | |
20563 terms[1] = t[1]; | |
20564 | |
20565 var rpr = r.match(rpregex); | |
20566 if(isval(rpr)) cp = parse_rpr(rpr[1], terms[0], terms[2]); | |
20567 | |
20568 return terms[0].join("") + terms[1].replace(nlregex,'<br/>') + terms[2].join(""); | |
20569 } | |
20570 return function parse_rs(rs) { | |
20571 return rs.replace(rregex,"").split(rend).map(parse_r).join(""); | |
20572 }; | |
20573 })(); | |
20574 | |
20575 /* 18.4.8 si CT_Rst */ | |
20576 var sitregex = /<t[^>]*>([^<]*)<\/t>/g, sirregex = /<r>/; | |
20577 function parse_si(x, opts) { | |
20578 var html = opts ? opts.cellHTML : true; | |
20579 var z = {}; | |
20580 if(!x) return null; | |
20581 var y; | |
20582 /* 18.4.12 t ST_Xstring (Plaintext String) */ | |
20583 if(x.charCodeAt(1) === 116) { | |
20584 z.t = utf8read(unescapexml(x.substr(x.indexOf(">")+1).split(/<\/t>/)[0])); | |
20585 z.r = x; | |
20586 if(html) z.h = z.t; | |
20587 } | |
20588 /* 18.4.4 r CT_RElt (Rich Text Run) */ | |
20589 else if((y = x.match(sirregex))) { | |
20590 z.r = x; | |
20591 z.t = utf8read(unescapexml(x.match(sitregex).join("").replace(tagregex,""))); | |
20592 if(html) z.h = parse_rs(x); | |
20593 } | |
20594 /* 18.4.3 phoneticPr CT_PhoneticPr (TODO: needed for Asian support) */ | |
20595 /* 18.4.6 rPh CT_PhoneticRun (TODO: needed for Asian support) */ | |
20596 return z; | |
20597 } | |
20598 | |
20599 /* 18.4 Shared String Table */ | |
20600 var sstr0 = /<sst([^>]*)>([\s\S]*)<\/sst>/; | |
20601 var sstr1 = /<(?:si|sstItem)>/g; | |
20602 var sstr2 = /<\/(?:si|sstItem)>/; | |
20603 function parse_sst_xml(data, opts) { | |
20604 var s = [], ss; | |
20605 /* 18.4.9 sst CT_Sst */ | |
20606 var sst = data.match(sstr0); | |
20607 if(isval(sst)) { | |
20608 ss = sst[2].replace(sstr1,"").split(sstr2); | |
20609 for(var i = 0; i != ss.length; ++i) { | |
20610 var o = parse_si(ss[i], opts); | |
20611 if(o != null) s[s.length] = o; | |
20612 } | |
20613 sst = parsexmltag(sst[1]); s.Count = sst.count; s.Unique = sst.uniqueCount; | |
20614 } | |
20615 return s; | |
20616 } | |
20617 | |
20618 RELS.SST = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings"; | |
20619 var straywsregex = /^\s|\s$|[\t\n\r]/; | |
20620 function write_sst_xml(sst, opts) { | |
20621 if(!opts.bookSST) return ""; | |
20622 var o = [XML_HEADER]; | |
20623 o[o.length] = (writextag('sst', null, { | |
20624 xmlns: XMLNS.main[0], | |
20625 count: sst.Count, | |
20626 uniqueCount: sst.Unique | |
20627 })); | |
20628 for(var i = 0; i != sst.length; ++i) { if(sst[i] == null) continue; | |
20629 var s = sst[i]; | |
20630 var sitag = "<si>"; | |
20631 if(s.r) sitag += s.r; | |
20632 else { | |
20633 sitag += "<t"; | |
20634 if(s.t.match(straywsregex)) sitag += ' xml:space="preserve"'; | |
20635 sitag += ">" + escapexml(s.t) + "</t>"; | |
20636 } | |
20637 sitag += "</si>"; | |
20638 o[o.length] = (sitag); | |
20639 } | |
20640 if(o.length>2){ o[o.length] = ('</sst>'); o[1]=o[1].replace("/>",">"); } | |
20641 return o.join(""); | |
20642 } | |
20643 /* [MS-XLSB] 2.4.219 BrtBeginSst */ | |
20644 function parse_BrtBeginSst(data, length) { | |
20645 return [data.read_shift(4), data.read_shift(4)]; | |
20646 } | |
20647 | |
20648 /* [MS-XLSB] 2.1.7.45 Shared Strings */ | |
20649 function parse_sst_bin(data, opts) { | |
20650 var s = []; | |
20651 var pass = false; | |
20652 recordhopper(data, function hopper_sst(val, R, RT) { | |
20653 switch(R.n) { | |
20654 case 'BrtBeginSst': s.Count = val[0]; s.Unique = val[1]; break; | |
20655 case 'BrtSSTItem': s.push(val); break; | |
20656 case 'BrtEndSst': return true; | |
20657 /* TODO: produce a test case with a future record */ | |
20658 case 'BrtFRTBegin': pass = true; break; | |
20659 case 'BrtFRTEnd': pass = false; break; | |
20660 default: if(!pass || opts.WTF) throw new Error("Unexpected record " + RT + " " + R.n); | |
20661 } | |
20662 }); | |
20663 return s; | |
20664 } | |
20665 | |
20666 function write_BrtBeginSst(sst, o) { | |
20667 if(!o) o = new_buf(8); | |
20668 o.write_shift(4, sst.Count); | |
20669 o.write_shift(4, sst.Unique); | |
20670 return o; | |
20671 } | |
20672 | |
20673 var write_BrtSSTItem = write_RichStr; | |
20674 | |
20675 function write_sst_bin(sst, opts) { | |
20676 var ba = buf_array(); | |
20677 write_record(ba, "BrtBeginSst", write_BrtBeginSst(sst)); | |
20678 for(var i = 0; i < sst.length; ++i) write_record(ba, "BrtSSTItem", write_BrtSSTItem(sst[i])); | |
20679 write_record(ba, "BrtEndSst"); | |
20680 return ba.end(); | |
20681 } | |
20682 function hex2RGB(h) { | |
20683 var o = h.substr(h[0]==="#"?1:0,6); | |
20684 return [parseInt(o.substr(0,2),16),parseInt(o.substr(0,2),16),parseInt(o.substr(0,2),16)]; | |
20685 } | |
20686 function rgb2Hex(rgb) { | |
20687 for(var i=0,o=1; i!=3; ++i) o = o*256 + (rgb[i]>255?255:rgb[i]<0?0:rgb[i]); | |
20688 return o.toString(16).toUpperCase().substr(1); | |
20689 } | |
20690 | |
20691 function rgb2HSL(rgb) { | |
20692 var R = rgb[0]/255, G = rgb[1]/255, B=rgb[2]/255; | |
20693 var M = Math.max(R, G, B), m = Math.min(R, G, B), C = M - m; | |
20694 if(C === 0) return [0, 0, R]; | |
20695 | |
20696 var H6 = 0, S = 0, L2 = (M + m); | |
20697 S = C / (L2 > 1 ? 2 - L2 : L2); | |
20698 switch(M){ | |
20699 case R: H6 = ((G - B) / C + 6)%6; break; | |
20700 case G: H6 = ((B - R) / C + 2); break; | |
20701 case B: H6 = ((R - G) / C + 4); break; | |
20702 } | |
20703 return [H6 / 6, S, L2 / 2]; | |
20704 } | |
20705 | |
20706 function hsl2RGB(hsl){ | |
20707 var H = hsl[0], S = hsl[1], L = hsl[2]; | |
20708 var C = S * 2 * (L < 0.5 ? L : 1 - L), m = L - C/2; | |
20709 var rgb = [m,m,m], h6 = 6*H; | |
20710 | |
20711 var X; | |
20712 if(S !== 0) switch(h6|0) { | |
20713 case 0: case 6: X = C * h6; rgb[0] += C; rgb[1] += X; break; | |
20714 case 1: X = C * (2 - h6); rgb[0] += X; rgb[1] += C; break; | |
20715 case 2: X = C * (h6 - 2); rgb[1] += C; rgb[2] += X; break; | |
20716 case 3: X = C * (4 - h6); rgb[1] += X; rgb[2] += C; break; | |
20717 case 4: X = C * (h6 - 4); rgb[2] += C; rgb[0] += X; break; | |
20718 case 5: X = C * (6 - h6); rgb[2] += X; rgb[0] += C; break; | |
20719 } | |
20720 for(var i = 0; i != 3; ++i) rgb[i] = Math.round(rgb[i]*255); | |
20721 return rgb; | |
20722 } | |
20723 | |
20724 /* 18.8.3 bgColor tint algorithm */ | |
20725 function rgb_tint(hex, tint) { | |
20726 if(tint === 0) return hex; | |
20727 var hsl = rgb2HSL(hex2RGB(hex)); | |
20728 if (tint < 0) hsl[2] = hsl[2] * (1 + tint); | |
20729 else hsl[2] = 1 - (1 - hsl[2]) * (1 - tint); | |
20730 return rgb2Hex(hsl2RGB(hsl)); | |
20731 } | |
20732 | |
20733 /* 18.3.1.13 width calculations */ | |
20734 var DEF_MDW = 7, MAX_MDW = 15, MIN_MDW = 1, MDW = DEF_MDW; | |
20735 function width2px(width) { return (( width + ((128/MDW)|0)/256 )* MDW )|0; } | |
20736 function px2char(px) { return (((px - 5)/MDW * 100 + 0.5)|0)/100; } | |
20737 function char2width(chr) { return (((chr * MDW + 5)/MDW*256)|0)/256; } | |
20738 function cycle_width(collw) { return char2width(px2char(width2px(collw))); } | |
20739 function find_mdw(collw, coll) { | |
20740 if(cycle_width(collw) != collw) { | |
20741 for(MDW=DEF_MDW; MDW>MIN_MDW; --MDW) if(cycle_width(collw) === collw) break; | |
20742 if(MDW === MIN_MDW) for(MDW=DEF_MDW+1; MDW<MAX_MDW; ++MDW) if(cycle_width(collw) === collw) break; | |
20743 if(MDW === MAX_MDW) MDW = DEF_MDW; | |
20744 } | |
20745 } | |
20746 var styles = {}; // shared styles | |
20747 | |
20748 var themes = {}; // shared themes | |
20749 | |
20750 /* 18.8.21 fills CT_Fills */ | |
20751 function parse_fills(t, opts) { | |
20752 styles.Fills = []; | |
20753 var fill = {}; | |
20754 t[0].match(tagregex).forEach(function(x) { | |
20755 var y = parsexmltag(x); | |
20756 switch(y[0]) { | |
20757 case '<fills': case '<fills>': case '</fills>': break; | |
20758 | |
20759 /* 18.8.20 fill CT_Fill */ | |
20760 case '<fill>': break; | |
20761 case '</fill>': styles.Fills.push(fill); fill = {}; break; | |
20762 | |
20763 /* 18.8.32 patternFill CT_PatternFill */ | |
20764 case '<patternFill': | |
20765 if(y.patternType) fill.patternType = y.patternType; | |
20766 break; | |
20767 case '<patternFill/>': case '</patternFill>': break; | |
20768 | |
20769 /* 18.8.3 bgColor CT_Color */ | |
20770 case '<bgColor': | |
20771 if(!fill.bgColor) fill.bgColor = {}; | |
20772 if(y.indexed) fill.bgColor.indexed = parseInt(y.indexed, 10); | |
20773 if(y.theme) fill.bgColor.theme = parseInt(y.theme, 10); | |
20774 if(y.tint) fill.bgColor.tint = parseFloat(y.tint); | |
20775 /* Excel uses ARGB strings */ | |
20776 if(y.rgb) fill.bgColor.rgb = y.rgb.substring(y.rgb.length - 6); | |
20777 break; | |
20778 case '<bgColor/>': case '</bgColor>': break; | |
20779 | |
20780 /* 18.8.19 fgColor CT_Color */ | |
20781 case '<fgColor': | |
20782 if(!fill.fgColor) fill.fgColor = {}; | |
20783 if(y.theme) fill.fgColor.theme = parseInt(y.theme, 10); | |
20784 if(y.tint) fill.fgColor.tint = parseFloat(y.tint); | |
20785 /* Excel uses ARGB strings */ | |
20786 if(y.rgb) fill.fgColor.rgb = y.rgb.substring(y.rgb.length - 6); | |
20787 break; | |
20788 case '<bgColor/>': case '</fgColor>': break; | |
20789 | |
20790 default: if(opts.WTF) throw 'unrecognized ' + y[0] + ' in fills'; | |
20791 } | |
20792 }); | |
20793 } | |
20794 | |
20795 /* 18.8.31 numFmts CT_NumFmts */ | |
20796 function parse_numFmts(t, opts) { | |
20797 styles.NumberFmt = []; | |
20798 var k = keys(SSF._table); | |
20799 for(var i=0; i < k.length; ++i) styles.NumberFmt[k[i]] = SSF._table[k[i]]; | |
20800 var m = t[0].match(tagregex); | |
20801 for(i=0; i < m.length; ++i) { | |
20802 var y = parsexmltag(m[i]); | |
20803 switch(y[0]) { | |
20804 case '<numFmts': case '</numFmts>': case '<numFmts/>': case '<numFmts>': break; | |
20805 case '<numFmt': { | |
20806 var f=unescapexml(utf8read(y.formatCode)), j=parseInt(y.numFmtId,10); | |
20807 styles.NumberFmt[j] = f; if(j>0) SSF.load(f,j); | |
20808 } break; | |
20809 default: if(opts.WTF) throw 'unrecognized ' + y[0] + ' in numFmts'; | |
20810 } | |
20811 } | |
20812 } | |
20813 | |
20814 function write_numFmts(NF, opts) { | |
20815 var o = ["<numFmts>"]; | |
20816 [[5,8],[23,26],[41,44],[63,66],[164,392]].forEach(function(r) { | |
20817 for(var i = r[0]; i <= r[1]; ++i) if(NF[i] !== undefined) o[o.length] = (writextag('numFmt',null,{numFmtId:i,formatCode:escapexml(NF[i])})); | |
20818 }); | |
20819 if(o.length === 1) return ""; | |
20820 o[o.length] = ("</numFmts>"); | |
20821 o[0] = writextag('numFmts', null, { count:o.length-2 }).replace("/>", ">"); | |
20822 return o.join(""); | |
20823 } | |
20824 | |
20825 /* 18.8.10 cellXfs CT_CellXfs */ | |
20826 function parse_cellXfs(t, opts) { | |
20827 styles.CellXf = []; | |
20828 t[0].match(tagregex).forEach(function(x) { | |
20829 var y = parsexmltag(x); | |
20830 switch(y[0]) { | |
20831 case '<cellXfs': case '<cellXfs>': case '<cellXfs/>': case '</cellXfs>': break; | |
20832 | |
20833 /* 18.8.45 xf CT_Xf */ | |
20834 case '<xf': delete y[0]; | |
20835 if(y.numFmtId) y.numFmtId = parseInt(y.numFmtId, 10); | |
20836 if(y.fillId) y.fillId = parseInt(y.fillId, 10); | |
20837 styles.CellXf.push(y); break; | |
20838 case '</xf>': break; | |
20839 | |
20840 /* 18.8.1 alignment CT_CellAlignment */ | |
20841 case '<alignment': case '<alignment/>': break; | |
20842 | |
20843 /* 18.8.33 protection CT_CellProtection */ | |
20844 case '<protection': case '</protection>': case '<protection/>': break; | |
20845 | |
20846 case '<extLst': case '</extLst>': break; | |
20847 case '<ext': break; | |
20848 default: if(opts.WTF) throw 'unrecognized ' + y[0] + ' in cellXfs'; | |
20849 } | |
20850 }); | |
20851 } | |
20852 | |
20853 function write_cellXfs(cellXfs) { | |
20854 var o = []; | |
20855 o[o.length] = (writextag('cellXfs',null)); | |
20856 cellXfs.forEach(function(c) { o[o.length] = (writextag('xf', null, c)); }); | |
20857 o[o.length] = ("</cellXfs>"); | |
20858 if(o.length === 2) return ""; | |
20859 o[0] = writextag('cellXfs',null, {count:o.length-2}).replace("/>",">"); | |
20860 return o.join(""); | |
20861 } | |
20862 | |
20863 /* 18.8 Styles CT_Stylesheet*/ | |
20864 var parse_sty_xml= (function make_pstyx() { | |
20865 var numFmtRegex = /<numFmts([^>]*)>.*<\/numFmts>/; | |
20866 var cellXfRegex = /<cellXfs([^>]*)>.*<\/cellXfs>/; | |
20867 var fillsRegex = /<fills([^>]*)>.*<\/fills>/; | |
20868 | |
20869 return function parse_sty_xml(data, opts) { | |
20870 /* 18.8.39 styleSheet CT_Stylesheet */ | |
20871 var t; | |
20872 | |
20873 /* numFmts CT_NumFmts ? */ | |
20874 if((t=data.match(numFmtRegex))) parse_numFmts(t, opts); | |
20875 | |
20876 /* fonts CT_Fonts ? */ | |
20877 // if((t=data.match(/<fonts([^>]*)>.*<\/fonts>/))) parse_fonts(t, opts); | |
20878 | |
20879 /* fills CT_Fills */ | |
20880 if((t=data.match(fillsRegex))) parse_fills(t, opts); | |
20881 | |
20882 /* borders CT_Borders ? */ | |
20883 /* cellStyleXfs CT_CellStyleXfs ? */ | |
20884 | |
20885 /* cellXfs CT_CellXfs ? */ | |
20886 if((t=data.match(cellXfRegex))) parse_cellXfs(t, opts); | |
20887 | |
20888 /* dxfs CT_Dxfs ? */ | |
20889 /* tableStyles CT_TableStyles ? */ | |
20890 /* colors CT_Colors ? */ | |
20891 /* extLst CT_ExtensionList ? */ | |
20892 | |
20893 return styles; | |
20894 }; | |
20895 })(); | |
20896 | |
20897 var STYLES_XML_ROOT = writextag('styleSheet', null, { | |
20898 'xmlns': XMLNS.main[0], | |
20899 'xmlns:vt': XMLNS.vt | |
20900 }); | |
20901 | |
20902 RELS.STY = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles"; | |
20903 | |
20904 function write_sty_xml(wb, opts) { | |
20905 var o = [XML_HEADER, STYLES_XML_ROOT], w; | |
20906 if((w = write_numFmts(wb.SSF)) != null) o[o.length] = w; | |
20907 o[o.length] = ('<fonts count="1"><font><sz val="12"/><color theme="1"/><name val="Calibri"/><family val="2"/><scheme val="minor"/></font></fonts>'); | |
20908 o[o.length] = ('<fills count="2"><fill><patternFill patternType="none"/></fill><fill><patternFill patternType="gray125"/></fill></fills>'); | |
20909 o[o.length] = ('<borders count="1"><border><left/><right/><top/><bottom/><diagonal/></border></borders>'); | |
20910 o[o.length] = ('<cellStyleXfs count="1"><xf numFmtId="0" fontId="0" fillId="0" borderId="0"/></cellStyleXfs>'); | |
20911 if((w = write_cellXfs(opts.cellXfs))) o[o.length] = (w); | |
20912 o[o.length] = ('<cellStyles count="1"><cellStyle name="Normal" xfId="0" builtinId="0"/></cellStyles>'); | |
20913 o[o.length] = ('<dxfs count="0"/>'); | |
20914 o[o.length] = ('<tableStyles count="0" defaultTableStyle="TableStyleMedium9" defaultPivotStyle="PivotStyleMedium4"/>'); | |
20915 | |
20916 if(o.length>2){ o[o.length] = ('</styleSheet>'); o[1]=o[1].replace("/>",">"); } | |
20917 return o.join(""); | |
20918 } | |
20919 /* [MS-XLSB] 2.4.651 BrtFmt */ | |
20920 function parse_BrtFmt(data, length) { | |
20921 var ifmt = data.read_shift(2); | |
20922 var stFmtCode = parse_XLWideString(data,length-2); | |
20923 return [ifmt, stFmtCode]; | |
20924 } | |
20925 | |
20926 /* [MS-XLSB] 2.4.653 BrtFont TODO */ | |
20927 function parse_BrtFont(data, length) { | |
20928 var out = {flags:{}}; | |
20929 out.dyHeight = data.read_shift(2); | |
20930 out.grbit = parse_FontFlags(data, 2); | |
20931 out.bls = data.read_shift(2); | |
20932 out.sss = data.read_shift(2); | |
20933 out.uls = data.read_shift(1); | |
20934 out.bFamily = data.read_shift(1); | |
20935 out.bCharSet = data.read_shift(1); | |
20936 data.l++; | |
20937 out.brtColor = parse_BrtColor(data, 8); | |
20938 out.bFontScheme = data.read_shift(1); | |
20939 out.name = parse_XLWideString(data, length - 21); | |
20940 | |
20941 out.flags.Bold = out.bls === 0x02BC; | |
20942 out.flags.Italic = out.grbit.fItalic; | |
20943 out.flags.Strikeout = out.grbit.fStrikeout; | |
20944 out.flags.Outline = out.grbit.fOutline; | |
20945 out.flags.Shadow = out.grbit.fShadow; | |
20946 out.flags.Condense = out.grbit.fCondense; | |
20947 out.flags.Extend = out.grbit.fExtend; | |
20948 out.flags.Sub = out.sss & 0x2; | |
20949 out.flags.Sup = out.sss & 0x1; | |
20950 return out; | |
20951 } | |
20952 | |
20953 /* [MS-XLSB] 2.4.816 BrtXF */ | |
20954 function parse_BrtXF(data, length) { | |
20955 var ixfeParent = data.read_shift(2); | |
20956 var ifmt = data.read_shift(2); | |
20957 parsenoop(data, length-4); | |
20958 return {ixfe:ixfeParent, ifmt:ifmt }; | |
20959 } | |
20960 | |
20961 /* [MS-XLSB] 2.1.7.50 Styles */ | |
20962 function parse_sty_bin(data, opts) { | |
20963 styles.NumberFmt = []; | |
20964 for(var y in SSF._table) styles.NumberFmt[y] = SSF._table[y]; | |
20965 | |
20966 styles.CellXf = []; | |
20967 var state = ""; /* TODO: this should be a stack */ | |
20968 var pass = false; | |
20969 recordhopper(data, function hopper_sty(val, R, RT) { | |
20970 switch(R.n) { | |
20971 case 'BrtFmt': | |
20972 styles.NumberFmt[val[0]] = val[1]; SSF.load(val[1], val[0]); | |
20973 break; | |
20974 case 'BrtFont': break; /* TODO */ | |
20975 case 'BrtKnownFonts': break; /* TODO */ | |
20976 case 'BrtFill': break; /* TODO */ | |
20977 case 'BrtBorder': break; /* TODO */ | |
20978 case 'BrtXF': | |
20979 if(state === "CELLXFS") { | |
20980 styles.CellXf.push(val); | |
20981 } | |
20982 break; /* TODO */ | |
20983 case 'BrtStyle': break; /* TODO */ | |
20984 case 'BrtDXF': break; /* TODO */ | |
20985 case 'BrtMRUColor': break; /* TODO */ | |
20986 case 'BrtIndexedColor': break; /* TODO */ | |
20987 case 'BrtBeginStyleSheet': break; | |
20988 case 'BrtEndStyleSheet': break; | |
20989 case 'BrtBeginTableStyle': break; | |
20990 case 'BrtTableStyleElement': break; | |
20991 case 'BrtEndTableStyle': break; | |
20992 case 'BrtBeginFmts': state = "FMTS"; break; | |
20993 case 'BrtEndFmts': state = ""; break; | |
20994 case 'BrtBeginFonts': state = "FONTS"; break; | |
20995 case 'BrtEndFonts': state = ""; break; | |
20996 case 'BrtACBegin': state = "ACFONTS"; break; | |
20997 case 'BrtACEnd': state = ""; break; | |
20998 case 'BrtBeginFills': state = "FILLS"; break; | |
20999 case 'BrtEndFills': state = ""; break; | |
21000 case 'BrtBeginBorders': state = "BORDERS"; break; | |
21001 case 'BrtEndBorders': state = ""; break; | |
21002 case 'BrtBeginCellStyleXFs': state = "CELLSTYLEXFS"; break; | |
21003 case 'BrtEndCellStyleXFs': state = ""; break; | |
21004 case 'BrtBeginCellXFs': state = "CELLXFS"; break; | |
21005 case 'BrtEndCellXFs': state = ""; break; | |
21006 case 'BrtBeginStyles': state = "STYLES"; break; | |
21007 case 'BrtEndStyles': state = ""; break; | |
21008 case 'BrtBeginDXFs': state = "DXFS"; break; | |
21009 case 'BrtEndDXFs': state = ""; break; | |
21010 case 'BrtBeginTableStyles': state = "TABLESTYLES"; break; | |
21011 case 'BrtEndTableStyles': state = ""; break; | |
21012 case 'BrtBeginColorPalette': state = "COLORPALETTE"; break; | |
21013 case 'BrtEndColorPalette': state = ""; break; | |
21014 case 'BrtBeginIndexedColors': state = "INDEXEDCOLORS"; break; | |
21015 case 'BrtEndIndexedColors': state = ""; break; | |
21016 case 'BrtBeginMRUColors': state = "MRUCOLORS"; break; | |
21017 case 'BrtEndMRUColors': state = ""; break; | |
21018 case 'BrtFRTBegin': pass = true; break; | |
21019 case 'BrtFRTEnd': pass = false; break; | |
21020 case 'BrtBeginStyleSheetExt14': break; | |
21021 case 'BrtBeginSlicerStyles': break; | |
21022 case 'BrtEndSlicerStyles': break; | |
21023 case 'BrtBeginTimelineStylesheetExt15': break; | |
21024 case 'BrtEndTimelineStylesheetExt15': break; | |
21025 case 'BrtBeginTimelineStyles': break; | |
21026 case 'BrtEndTimelineStyles': break; | |
21027 case 'BrtEndStyleSheetExt14': break; | |
21028 default: if(!pass || opts.WTF) throw new Error("Unexpected record " + RT + " " + R.n); | |
21029 } | |
21030 }); | |
21031 return styles; | |
21032 } | |
21033 | |
21034 /* [MS-XLSB] 2.1.7.50 Styles */ | |
21035 function write_sty_bin(data, opts) { | |
21036 var ba = buf_array(); | |
21037 write_record(ba, "BrtBeginStyleSheet"); | |
21038 /* [FMTS] */ | |
21039 /* [FONTS] */ | |
21040 /* [FILLS] */ | |
21041 /* [BORDERS] */ | |
21042 /* CELLSTYLEXFS */ | |
21043 /* CELLXFS*/ | |
21044 /* STYLES */ | |
21045 /* DXFS */ | |
21046 /* TABLESTYLES */ | |
21047 /* [COLORPALETTE] */ | |
21048 /* FRTSTYLESHEET*/ | |
21049 write_record(ba, "BrtEndStyleSheet"); | |
21050 return ba.end(); | |
21051 } | |
21052 RELS.THEME = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme"; | |
21053 | |
21054 /* 20.1.6.2 clrScheme CT_ColorScheme */ | |
21055 function parse_clrScheme(t, opts) { | |
21056 themes.themeElements.clrScheme = []; | |
21057 var color = {}; | |
21058 t[0].match(tagregex).forEach(function(x) { | |
21059 var y = parsexmltag(x); | |
21060 switch(y[0]) { | |
21061 case '<a:clrScheme': case '</a:clrScheme>': break; | |
21062 | |
21063 /* 20.1.2.3.32 srgbClr CT_SRgbColor */ | |
21064 case '<a:srgbClr': color.rgb = y.val; break; | |
21065 | |
21066 /* 20.1.2.3.33 sysClr CT_SystemColor */ | |
21067 case '<a:sysClr': color.rgb = y.lastClr; break; | |
21068 | |
21069 /* 20.1.4.1.9 dk1 (Dark 1) */ | |
21070 case '<a:dk1>': | |
21071 case '</a:dk1>': | |
21072 /* 20.1.4.1.10 dk2 (Dark 2) */ | |
21073 case '<a:dk2>': | |
21074 case '</a:dk2>': | |
21075 /* 20.1.4.1.22 lt1 (Light 1) */ | |
21076 case '<a:lt1>': | |
21077 case '</a:lt1>': | |
21078 /* 20.1.4.1.23 lt2 (Light 2) */ | |
21079 case '<a:lt2>': | |
21080 case '</a:lt2>': | |
21081 /* 20.1.4.1.1 accent1 (Accent 1) */ | |
21082 case '<a:accent1>': | |
21083 case '</a:accent1>': | |
21084 /* 20.1.4.1.2 accent2 (Accent 2) */ | |
21085 case '<a:accent2>': | |
21086 case '</a:accent2>': | |
21087 /* 20.1.4.1.3 accent3 (Accent 3) */ | |
21088 case '<a:accent3>': | |
21089 case '</a:accent3>': | |
21090 /* 20.1.4.1.4 accent4 (Accent 4) */ | |
21091 case '<a:accent4>': | |
21092 case '</a:accent4>': | |
21093 /* 20.1.4.1.5 accent5 (Accent 5) */ | |
21094 case '<a:accent5>': | |
21095 case '</a:accent5>': | |
21096 /* 20.1.4.1.6 accent6 (Accent 6) */ | |
21097 case '<a:accent6>': | |
21098 case '</a:accent6>': | |
21099 /* 20.1.4.1.19 hlink (Hyperlink) */ | |
21100 case '<a:hlink>': | |
21101 case '</a:hlink>': | |
21102 /* 20.1.4.1.15 folHlink (Followed Hyperlink) */ | |
21103 case '<a:folHlink>': | |
21104 case '</a:folHlink>': | |
21105 if (y[0][1] === '/') { | |
21106 themes.themeElements.clrScheme.push(color); | |
21107 color = {}; | |
21108 } else { | |
21109 color.name = y[0].substring(3, y[0].length - 1); | |
21110 } | |
21111 break; | |
21112 | |
21113 default: if(opts.WTF) throw 'unrecognized ' + y[0] + ' in clrScheme'; | |
21114 } | |
21115 }); | |
21116 } | |
21117 | |
21118 var clrsregex = /<a:clrScheme([^>]*)>.*<\/a:clrScheme>/; | |
21119 /* 14.2.7 Theme Part */ | |
21120 function parse_theme_xml(data, opts) { | |
21121 if(!data || data.length === 0) return themes; | |
21122 themes.themeElements = {}; | |
21123 | |
21124 var t; | |
21125 | |
21126 /* clrScheme CT_ColorScheme */ | |
21127 if((t=data.match(clrsregex))) parse_clrScheme(t, opts); | |
21128 | |
21129 return themes; | |
21130 } | |
21131 | |
21132 function write_theme() { return '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>\n<a:theme xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" name="Office Theme"><a:themeElements><a:clrScheme name="Office"><a:dk1><a:sysClr val="windowText" lastClr="000000"/></a:dk1><a:lt1><a:sysClr val="window" lastClr="FFFFFF"/></a:lt1><a:dk2><a:srgbClr val="1F497D"/></a:dk2><a:lt2><a:srgbClr val="EEECE1"/></a:lt2><a:accent1><a:srgbClr val="4F81BD"/></a:accent1><a:accent2><a:srgbClr val="C0504D"/></a:accent2><a:accent3><a:srgbClr val="9BBB59"/></a:accent3><a:accent4><a:srgbClr val="8064A2"/></a:accent4><a:accent5><a:srgbClr val="4BACC6"/></a:accent5><a:accent6><a:srgbClr val="F79646"/></a:accent6><a:hlink><a:srgbClr val="0000FF"/></a:hlink><a:folHlink><a:srgbClr val="800080"/></a:folHlink></a:clrScheme><a:fontScheme name="Office"><a:majorFont><a:latin typeface="Cambria"/><a:ea typeface=""/><a:cs typeface=""/><a:font script="Jpan" typeface="MS Pゴシック"/><a:font script="Hang" typeface="맑은 고딕"/><a:font script="Hans" typeface="宋体"/><a:font script="Hant" typeface="新細明體"/><a:font script="Arab" typeface="Times New Roman"/><a:font script="Hebr" typeface="Times New Roman"/><a:font script="Thai" typeface="Tahoma"/><a:font script="Ethi" typeface="Nyala"/><a:font script="Beng" typeface="Vrinda"/><a:font script="Gujr" typeface="Shruti"/><a:font script="Khmr" typeface="MoolBoran"/><a:font script="Knda" typeface="Tunga"/><a:font script="Guru" typeface="Raavi"/><a:font script="Cans" typeface="Euphemia"/><a:font script="Cher" typeface="Plantagenet Cherokee"/><a:font script="Yiii" typeface="Microsoft Yi Baiti"/><a:font script="Tibt" typeface="Microsoft Himalaya"/><a:font script="Thaa" typeface="MV Boli"/><a:font script="Deva" typeface="Mangal"/><a:font script="Telu" typeface="Gautami"/><a:font script="Taml" typeface="Latha"/><a:font script="Syrc" typeface="Estrangelo Edessa"/><a:font script="Orya" typeface="Kalinga"/><a:font script="Mlym" typeface="Kartika"/><a:font script="Laoo" typeface="DokChampa"/><a:font script="Sinh" typeface="Iskoola Pota"/><a:font script="Mong" typeface="Mongolian Baiti"/><a:font script="Viet" typeface="Times New Roman"/><a:font script="Uigh" typeface="Microsoft Uighur"/><a:font script="Geor" typeface="Sylfaen"/></a:majorFont><a:minorFont><a:latin typeface="Calibri"/><a:ea typeface=""/><a:cs typeface=""/><a:font script="Jpan" typeface="MS Pゴシック"/><a:font script="Hang" typeface="맑은 고딕"/><a:font script="Hans" typeface="宋体"/><a:font script="Hant" typeface="新細明體"/><a:font script="Arab" typeface="Arial"/><a:font script="Hebr" typeface="Arial"/><a:font script="Thai" typeface="Tahoma"/><a:font script="Ethi" typeface="Nyala"/><a:font script="Beng" typeface="Vrinda"/><a:font script="Gujr" typeface="Shruti"/><a:font script="Khmr" typeface="DaunPenh"/><a:font script="Knda" typeface="Tunga"/><a:font script="Guru" typeface="Raavi"/><a:font script="Cans" typeface="Euphemia"/><a:font script="Cher" typeface="Plantagenet Cherokee"/><a:font script="Yiii" typeface="Microsoft Yi Baiti"/><a:font script="Tibt" typeface="Microsoft Himalaya"/><a:font script="Thaa" typeface="MV Boli"/><a:font script="Deva" typeface="Mangal"/><a:font script="Telu" typeface="Gautami"/><a:font script="Taml" typeface="Latha"/><a:font script="Syrc" typeface="Estrangelo Edessa"/><a:font script="Orya" typeface="Kalinga"/><a:font script="Mlym" typeface="Kartika"/><a:font script="Laoo" typeface="DokChampa"/><a:font script="Sinh" typeface="Iskoola Pota"/><a:font script="Mong" typeface="Mongolian Baiti"/><a:font script="Viet" typeface="Arial"/><a:font script="Uigh" typeface="Microsoft Uighur"/><a:font script="Geor" typeface="Sylfaen"/></a:minorFont></a:fontScheme><a:fmtScheme name="Office"><a:fillStyleLst><a:solidFill><a:schemeClr val="phClr"/></a:solidFill><a:gradFill rotWithShape="1"><a:gsLst><a:gs pos="0"><a:schemeClr val="phClr"><a:tint val="50000"/><a:satMod val="300000"/></a:schemeClr></a:gs><a:gs pos="35000"><a:schemeClr val="phClr"><a:tint val="37000"/><a:satMod val="300000"/></a:schemeClr></a:gs><a:gs pos="100000"><a:schemeClr val="phClr"><a:tint val="15000"/><a:satMod val="350000"/></a:schemeClr></a:gs></a:gsLst><a:lin ang="16200000" scaled="1"/></a:gradFill><a:gradFill rotWithShape="1"><a:gsLst><a:gs pos="0"><a:schemeClr val="phClr"><a:tint val="100000"/><a:shade val="100000"/><a:satMod val="130000"/></a:schemeClr></a:gs><a:gs pos="100000"><a:schemeClr val="phClr"><a:tint val="50000"/><a:shade val="100000"/><a:satMod val="350000"/></a:schemeClr></a:gs></a:gsLst><a:lin ang="16200000" scaled="0"/></a:gradFill></a:fillStyleLst><a:lnStyleLst><a:ln w="9525" cap="flat" cmpd="sng" algn="ctr"><a:solidFill><a:schemeClr val="phClr"><a:shade val="95000"/><a:satMod val="105000"/></a:schemeClr></a:solidFill><a:prstDash val="solid"/></a:ln><a:ln w="25400" cap="flat" cmpd="sng" algn="ctr"><a:solidFill><a:schemeClr val="phClr"/></a:solidFill><a:prstDash val="solid"/></a:ln><a:ln w="38100" cap="flat" cmpd="sng" algn="ctr"><a:solidFill><a:schemeClr val="phClr"/></a:solidFill><a:prstDash val="solid"/></a:ln></a:lnStyleLst><a:effectStyleLst><a:effectStyle><a:effectLst><a:outerShdw blurRad="40000" dist="20000" dir="5400000" rotWithShape="0"><a:srgbClr val="000000"><a:alpha val="38000"/></a:srgbClr></a:outerShdw></a:effectLst></a:effectStyle><a:effectStyle><a:effectLst><a:outerShdw blurRad="40000" dist="23000" dir="5400000" rotWithShape="0"><a:srgbClr val="000000"><a:alpha val="35000"/></a:srgbClr></a:outerShdw></a:effectLst></a:effectStyle><a:effectStyle><a:effectLst><a:outerShdw blurRad="40000" dist="23000" dir="5400000" rotWithShape="0"><a:srgbClr val="000000"><a:alpha val="35000"/></a:srgbClr></a:outerShdw></a:effectLst><a:scene3d><a:camera prst="orthographicFront"><a:rot lat="0" lon="0" rev="0"/></a:camera><a:lightRig rig="threePt" dir="t"><a:rot lat="0" lon="0" rev="1200000"/></a:lightRig></a:scene3d><a:sp3d><a:bevelT w="63500" h="25400"/></a:sp3d></a:effectStyle></a:effectStyleLst><a:bgFillStyleLst><a:solidFill><a:schemeClr val="phClr"/></a:solidFill><a:gradFill rotWithShape="1"><a:gsLst><a:gs pos="0"><a:schemeClr val="phClr"><a:tint val="40000"/><a:satMod val="350000"/></a:schemeClr></a:gs><a:gs pos="40000"><a:schemeClr val="phClr"><a:tint val="45000"/><a:shade val="99000"/><a:satMod val="350000"/></a:schemeClr></a:gs><a:gs pos="100000"><a:schemeClr val="phClr"><a:shade val="20000"/><a:satMod val="255000"/></a:schemeClr></a:gs></a:gsLst><a:path path="circle"><a:fillToRect l="50000" t="-80000" r="50000" b="180000"/></a:path></a:gradFill><a:gradFill rotWithShape="1"><a:gsLst><a:gs pos="0"><a:schemeClr val="phClr"><a:tint val="80000"/><a:satMod val="300000"/></a:schemeClr></a:gs><a:gs pos="100000"><a:schemeClr val="phClr"><a:shade val="30000"/><a:satMod val="200000"/></a:schemeClr></a:gs></a:gsLst><a:path path="circle"><a:fillToRect l="50000" t="50000" r="50000" b="50000"/></a:path></a:gradFill></a:bgFillStyleLst></a:fmtScheme></a:themeElements><a:objectDefaults><a:spDef><a:spPr/><a:bodyPr/><a:lstStyle/><a:style><a:lnRef idx="1"><a:schemeClr val="accent1"/></a:lnRef><a:fillRef idx="3"><a:schemeClr val="accent1"/></a:fillRef><a:effectRef idx="2"><a:schemeClr val="accent1"/></a:effectRef><a:fontRef idx="minor"><a:schemeClr val="lt1"/></a:fontRef></a:style></a:spDef><a:lnDef><a:spPr/><a:bodyPr/><a:lstStyle/><a:style><a:lnRef idx="2"><a:schemeClr val="accent1"/></a:lnRef><a:fillRef idx="0"><a:schemeClr val="accent1"/></a:fillRef><a:effectRef idx="1"><a:schemeClr val="accent1"/></a:effectRef><a:fontRef idx="minor"><a:schemeClr val="tx1"/></a:fontRef></a:style></a:lnDef></a:objectDefaults><a:extraClrSchemeLst/></a:theme>'; } | |
21133 /* 18.6 Calculation Chain */ | |
21134 function parse_cc_xml(data, opts) { | |
21135 var d = []; | |
21136 var l = 0, i = 1; | |
21137 (data.match(tagregex)||[]).forEach(function(x) { | |
21138 var y = parsexmltag(x); | |
21139 switch(y[0]) { | |
21140 case '<?xml': break; | |
21141 /* 18.6.2 calcChain CT_CalcChain 1 */ | |
21142 case '<calcChain': case '<calcChain>': case '</calcChain>': break; | |
21143 /* 18.6.1 c CT_CalcCell 1 */ | |
21144 case '<c': delete y[0]; if(y.i) i = y.i; else y.i = i; d.push(y); break; | |
21145 } | |
21146 }); | |
21147 return d; | |
21148 } | |
21149 | |
21150 function write_cc_xml(data, opts) { } | |
21151 /* [MS-XLSB] 2.6.4.1 */ | |
21152 function parse_BrtCalcChainItem$(data, length) { | |
21153 var out = {}; | |
21154 out.i = data.read_shift(4); | |
21155 var cell = {}; | |
21156 cell.r = data.read_shift(4); | |
21157 cell.c = data.read_shift(4); | |
21158 out.r = encode_cell(cell); | |
21159 var flags = data.read_shift(1); | |
21160 if(flags & 0x2) out.l = '1'; | |
21161 if(flags & 0x8) out.a = '1'; | |
21162 return out; | |
21163 } | |
21164 | |
21165 /* 18.6 Calculation Chain */ | |
21166 function parse_cc_bin(data, opts) { | |
21167 var out = []; | |
21168 var pass = false; | |
21169 recordhopper(data, function hopper_cc(val, R, RT) { | |
21170 switch(R.n) { | |
21171 case 'BrtCalcChainItem$': out.push(val); break; | |
21172 case 'BrtBeginCalcChain$': break; | |
21173 case 'BrtEndCalcChain$': break; | |
21174 default: if(!pass || opts.WTF) throw new Error("Unexpected record " + RT + " " + R.n); | |
21175 } | |
21176 }); | |
21177 return out; | |
21178 } | |
21179 | |
21180 function write_cc_bin(data, opts) { } | |
21181 | |
21182 function parse_comments(zip, dirComments, sheets, sheetRels, opts) { | |
21183 for(var i = 0; i != dirComments.length; ++i) { | |
21184 var canonicalpath=dirComments[i]; | |
21185 var comments=parse_cmnt(getzipdata(zip, canonicalpath.replace(/^\//,''), true), canonicalpath, opts); | |
21186 if(!comments || !comments.length) continue; | |
21187 // find the sheets targeted by these comments | |
21188 var sheetNames = keys(sheets); | |
21189 for(var j = 0; j != sheetNames.length; ++j) { | |
21190 var sheetName = sheetNames[j]; | |
21191 var rels = sheetRels[sheetName]; | |
21192 if(rels) { | |
21193 var rel = rels[canonicalpath]; | |
21194 if(rel) insertCommentsIntoSheet(sheetName, sheets[sheetName], comments); | |
21195 } | |
21196 } | |
21197 } | |
21198 } | |
21199 | |
21200 function insertCommentsIntoSheet(sheetName, sheet, comments) { | |
21201 comments.forEach(function(comment) { | |
21202 var cell = sheet[comment.ref]; | |
21203 if (!cell) { | |
21204 cell = {}; | |
21205 sheet[comment.ref] = cell; | |
21206 var range = safe_decode_range(sheet["!ref"]||"BDWGO1000001:A1"); | |
21207 var thisCell = decode_cell(comment.ref); | |
21208 if(range.s.r > thisCell.r) range.s.r = thisCell.r; | |
21209 if(range.e.r < thisCell.r) range.e.r = thisCell.r; | |
21210 if(range.s.c > thisCell.c) range.s.c = thisCell.c; | |
21211 if(range.e.c < thisCell.c) range.e.c = thisCell.c; | |
21212 var encoded = encode_range(range); | |
21213 if (encoded !== sheet["!ref"]) sheet["!ref"] = encoded; | |
21214 } | |
21215 | |
21216 if (!cell.c) cell.c = []; | |
21217 var o = {a: comment.author, t: comment.t, r: comment.r}; | |
21218 if(comment.h) o.h = comment.h; | |
21219 cell.c.push(o); | |
21220 }); | |
21221 } | |
21222 | |
21223 /* 18.7.3 CT_Comment */ | |
21224 function parse_comments_xml(data, opts) { | |
21225 if(data.match(/<(?:\w+:)?comments *\/>/)) return []; | |
21226 var authors = []; | |
21227 var commentList = []; | |
21228 data.match(/<(?:\w+:)?authors>([^\u2603]*)<\/(?:\w+:)?authors>/)[1].split(/<\/\w*:?author>/).forEach(function(x) { | |
21229 if(x === "" || x.trim() === "") return; | |
21230 authors.push(x.match(/<(?:\w+:)?author[^>]*>(.*)/)[1]); | |
21231 }); | |
21232 (data.match(/<(?:\w+:)?commentList>([^\u2603]*)<\/(?:\w+:)?commentList>/)||["",""])[1].split(/<\/\w*:?comment>/).forEach(function(x, index) { | |
21233 if(x === "" || x.trim() === "") return; | |
21234 var y = parsexmltag(x.match(/<(?:\w+:)?comment[^>]*>/)[0]); | |
21235 var comment = { author: y.authorId && authors[y.authorId] ? authors[y.authorId] : undefined, ref: y.ref, guid: y.guid }; | |
21236 var cell = decode_cell(y.ref); | |
21237 if(opts.sheetRows && opts.sheetRows <= cell.r) return; | |
21238 var textMatch = x.match(/<text>([^\u2603]*)<\/text>/); | |
21239 if (!textMatch || !textMatch[1]) return; // a comment may contain an empty text tag. | |
21240 var rt = parse_si(textMatch[1]); | |
21241 comment.r = rt.r; | |
21242 comment.t = rt.t; | |
21243 if(opts.cellHTML) comment.h = rt.h; | |
21244 commentList.push(comment); | |
21245 }); | |
21246 return commentList; | |
21247 } | |
21248 | |
21249 function write_comments_xml(data, opts) { } | |
21250 /* [MS-XLSB] 2.4.28 BrtBeginComment */ | |
21251 function parse_BrtBeginComment(data, length) { | |
21252 var out = {}; | |
21253 out.iauthor = data.read_shift(4); | |
21254 var rfx = parse_UncheckedRfX(data, 16); | |
21255 out.rfx = rfx.s; | |
21256 out.ref = encode_cell(rfx.s); | |
21257 data.l += 16; /*var guid = parse_GUID(data); */ | |
21258 return out; | |
21259 } | |
21260 | |
21261 /* [MS-XLSB] 2.4.324 BrtCommentAuthor */ | |
21262 var parse_BrtCommentAuthor = parse_XLWideString; | |
21263 | |
21264 /* [MS-XLSB] 2.4.325 BrtCommentText */ | |
21265 var parse_BrtCommentText = parse_RichStr; | |
21266 | |
21267 /* [MS-XLSB] 2.1.7.8 Comments */ | |
21268 function parse_comments_bin(data, opts) { | |
21269 var out = []; | |
21270 var authors = []; | |
21271 var c = {}; | |
21272 var pass = false; | |
21273 recordhopper(data, function hopper_cmnt(val, R, RT) { | |
21274 switch(R.n) { | |
21275 case 'BrtCommentAuthor': authors.push(val); break; | |
21276 case 'BrtBeginComment': c = val; break; | |
21277 case 'BrtCommentText': c.t = val.t; c.h = val.h; c.r = val.r; break; | |
21278 case 'BrtEndComment': | |
21279 c.author = authors[c.iauthor]; | |
21280 delete c.iauthor; | |
21281 if(opts.sheetRows && opts.sheetRows <= c.rfx.r) break; | |
21282 delete c.rfx; out.push(c); break; | |
21283 case 'BrtBeginComments': break; | |
21284 case 'BrtEndComments': break; | |
21285 case 'BrtBeginCommentAuthors': break; | |
21286 case 'BrtEndCommentAuthors': break; | |
21287 case 'BrtBeginCommentList': break; | |
21288 case 'BrtEndCommentList': break; | |
21289 default: if(!pass || opts.WTF) throw new Error("Unexpected record " + RT + " " + R.n); | |
21290 } | |
21291 }); | |
21292 return out; | |
21293 } | |
21294 | |
21295 function write_comments_bin(data, opts) { } | |
21296 /* [MS-XLSB] 2.5.97.4 CellParsedFormula TODO: use similar logic to js-xls */ | |
21297 function parse_CellParsedFormula(data, length) { | |
21298 var cce = data.read_shift(4); | |
21299 return parsenoop(data, length-4); | |
21300 } | |
21301 var strs = {}; // shared strings | |
21302 var _ssfopts = {}; // spreadsheet formatting options | |
21303 | |
21304 RELS.WS = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet"; | |
21305 | |
21306 function get_sst_id(sst, str) { | |
21307 for(var i = 0, len = sst.length; i < len; ++i) if(sst[i].t === str) { sst.Count ++; return i; } | |
21308 sst[len] = {t:str}; sst.Count ++; sst.Unique ++; return len; | |
21309 } | |
21310 | |
21311 function get_cell_style(styles, cell, opts) { | |
21312 var z = opts.revssf[cell.z != null ? cell.z : "General"]; | |
21313 for(var i = 0, len = styles.length; i != len; ++i) if(styles[i].numFmtId === z) return i; | |
21314 styles[len] = { | |
21315 numFmtId:z, | |
21316 fontId:0, | |
21317 fillId:0, | |
21318 borderId:0, | |
21319 xfId:0, | |
21320 applyNumberFormat:1 | |
21321 }; | |
21322 return len; | |
21323 } | |
21324 | |
21325 function safe_format(p, fmtid, fillid, opts) { | |
21326 try { | |
21327 if(fmtid === 0) { | |
21328 if(p.t === 'n') { | |
21329 if((p.v|0) === p.v) p.w = SSF._general_int(p.v,_ssfopts); | |
21330 else p.w = SSF._general_num(p.v,_ssfopts); | |
21331 } | |
21332 else if(p.v === undefined) return ""; | |
21333 else p.w = SSF._general(p.v,_ssfopts); | |
21334 } | |
21335 else p.w = SSF.format(fmtid,p.v,_ssfopts); | |
21336 if(opts.cellNF) p.z = SSF._table[fmtid]; | |
21337 } catch(e) { if(opts.WTF) throw e; } | |
21338 if(fillid) try { | |
21339 p.s = styles.Fills[fillid]; | |
21340 if (p.s.fgColor && p.s.fgColor.theme) { | |
21341 p.s.fgColor.rgb = rgb_tint(themes.themeElements.clrScheme[p.s.fgColor.theme].rgb, p.s.fgColor.tint || 0); | |
21342 if(opts.WTF) p.s.fgColor.raw_rgb = themes.themeElements.clrScheme[p.s.fgColor.theme].rgb; | |
21343 } | |
21344 if (p.s.bgColor && p.s.bgColor.theme) { | |
21345 p.s.bgColor.rgb = rgb_tint(themes.themeElements.clrScheme[p.s.bgColor.theme].rgb, p.s.bgColor.tint || 0); | |
21346 if(opts.WTF) p.s.bgColor.raw_rgb = themes.themeElements.clrScheme[p.s.bgColor.theme].rgb; | |
21347 } | |
21348 } catch(e) { if(opts.WTF) throw e; } | |
21349 } | |
21350 function parse_ws_xml_dim(ws, s) { | |
21351 var d = safe_decode_range(s); | |
21352 if(d.s.r<=d.e.r && d.s.c<=d.e.c && d.s.r>=0 && d.s.c>=0) ws["!ref"] = encode_range(d); | |
21353 } | |
21354 var mergecregex = /<mergeCell ref="[A-Z0-9:]+"\s*\/>/g; | |
21355 var sheetdataregex = /<(?:\w+:)?sheetData>([^\u2603]*)<\/(?:\w+:)?sheetData>/; | |
21356 var hlinkregex = /<hyperlink[^>]*\/>/g; | |
21357 var dimregex = /"(\w*:\w*)"/; | |
21358 var colregex = /<col[^>]*\/>/g; | |
21359 /* 18.3 Worksheets */ | |
21360 function parse_ws_xml(data, opts, rels) { | |
21361 if(!data) return data; | |
21362 /* 18.3.1.99 worksheet CT_Worksheet */ | |
21363 var s = {}; | |
21364 | |
21365 /* 18.3.1.35 dimension CT_SheetDimension ? */ | |
21366 var ridx = data.indexOf("<dimension"); | |
21367 if(ridx > 0) { | |
21368 var ref = data.substr(ridx,50).match(dimregex); | |
21369 if(ref != null) parse_ws_xml_dim(s, ref[1]); | |
21370 } | |
21371 | |
21372 /* 18.3.1.55 mergeCells CT_MergeCells */ | |
21373 var mergecells = []; | |
21374 if(data.indexOf("</mergeCells>")!==-1) { | |
21375 var merges = data.match(mergecregex); | |
21376 for(ridx = 0; ridx != merges.length; ++ridx) | |
21377 mergecells[ridx] = safe_decode_range(merges[ridx].substr(merges[ridx].indexOf("\"")+1)); | |
21378 } | |
21379 | |
21380 /* 18.3.1.17 cols CT_Cols */ | |
21381 var columns = []; | |
21382 if(opts.cellStyles && data.indexOf("</cols>")!==-1) { | |
21383 /* 18.3.1.13 col CT_Col */ | |
21384 var cols = data.match(colregex); | |
21385 parse_ws_xml_cols(columns, cols); | |
21386 } | |
21387 | |
21388 var refguess = {s: {r:1000000, c:1000000}, e: {r:0, c:0} }; | |
21389 | |
21390 /* 18.3.1.80 sheetData CT_SheetData ? */ | |
21391 var mtch=data.match(sheetdataregex); | |
21392 if(mtch) parse_ws_xml_data(mtch[1], s, opts, refguess); | |
21393 | |
21394 /* 18.3.1.48 hyperlinks CT_Hyperlinks */ | |
21395 if(data.indexOf("</hyperlinks>")!==-1) parse_ws_xml_hlinks(s, data.match(hlinkregex), rels); | |
21396 | |
21397 if(!s["!ref"] && refguess.e.c >= refguess.s.c && refguess.e.r >= refguess.s.r) s["!ref"] = encode_range(refguess); | |
21398 if(opts.sheetRows > 0 && s["!ref"]) { | |
21399 var tmpref = safe_decode_range(s["!ref"]); | |
21400 if(opts.sheetRows < +tmpref.e.r) { | |
21401 tmpref.e.r = opts.sheetRows - 1; | |
21402 if(tmpref.e.r > refguess.e.r) tmpref.e.r = refguess.e.r; | |
21403 if(tmpref.e.r < tmpref.s.r) tmpref.s.r = tmpref.e.r; | |
21404 if(tmpref.e.c > refguess.e.c) tmpref.e.c = refguess.e.c; | |
21405 if(tmpref.e.c < tmpref.s.c) tmpref.s.c = tmpref.e.c; | |
21406 s["!fullref"] = s["!ref"]; | |
21407 s["!ref"] = encode_range(tmpref); | |
21408 } | |
21409 } | |
21410 if(mergecells.length > 0) s["!merges"] = mergecells; | |
21411 if(columns.length > 0) s["!cols"] = columns; | |
21412 return s; | |
21413 } | |
21414 | |
21415 | |
21416 function parse_ws_xml_hlinks(s, data, rels) { | |
21417 for(var i = 0; i != data.length; ++i) { | |
21418 var val = parsexmltag(data[i], true); | |
21419 if(!val.ref) return; | |
21420 var rel = rels['!id'][val.id]; | |
21421 if(rel) { | |
21422 val.Target = rel.Target; | |
21423 if(val.location) val.Target += "#"+val.location; | |
21424 val.Rel = rel; | |
21425 } | |
21426 var rng = safe_decode_range(val.ref); | |
21427 for(var R=rng.s.r;R<=rng.e.r;++R) for(var C=rng.s.c;C<=rng.e.c;++C) { | |
21428 var addr = encode_cell({c:C,r:R}); | |
21429 if(!s[addr]) s[addr] = {t:"str",v:undefined}; | |
21430 s[addr].l = val; | |
21431 } | |
21432 } | |
21433 } | |
21434 | |
21435 function parse_ws_xml_cols(columns, cols) { | |
21436 var seencol = false; | |
21437 for(var coli = 0; coli != cols.length; ++coli) { | |
21438 var coll = parsexmltag(cols[coli], true); | |
21439 var colm=parseInt(coll.min, 10)-1, colM=parseInt(coll.max,10)-1; | |
21440 delete coll.min; delete coll.max; | |
21441 if(!seencol && coll.width) { seencol = true; find_mdw(+coll.width, coll); } | |
21442 if(coll.width) { | |
21443 coll.wpx = width2px(+coll.width); | |
21444 coll.wch = px2char(coll.wpx); | |
21445 coll.MDW = MDW; | |
21446 } | |
21447 while(colm <= colM) columns[colm++] = coll; | |
21448 } | |
21449 } | |
21450 | |
21451 function write_ws_xml_cols(ws, cols) { | |
21452 var o = ["<cols>"], col, width; | |
21453 for(var i = 0; i != cols.length; ++i) { | |
21454 if(!(col = cols[i])) continue; | |
21455 var p = {min:i+1,max:i+1}; | |
21456 /* wch (chars), wpx (pixels) */ | |
21457 width = -1; | |
21458 if(col.wpx) width = px2char(col.wpx); | |
21459 else if(col.wch) width = col.wch; | |
21460 if(width > -1) { p.width = char2width(width); p.customWidth= 1; } | |
21461 o[o.length] = (writextag('col', null, p)); | |
21462 } | |
21463 o[o.length] = "</cols>"; | |
21464 return o.join(""); | |
21465 } | |
21466 | |
21467 function write_ws_xml_cell(cell, ref, ws, opts, idx, wb) { | |
21468 if(cell.v === undefined) return ""; | |
21469 var vv = ""; | |
21470 switch(cell.t) { | |
21471 case 'b': vv = cell.v ? "1" : "0"; break; | |
21472 case 'n': case 'e': vv = ''+cell.v; break; | |
21473 default: vv = cell.v; break; | |
21474 } | |
21475 var v = writetag('v', escapexml(vv)), o = {r:ref}; | |
21476 /* TODO: cell style */ | |
21477 var os = get_cell_style(opts.cellXfs, cell, opts); | |
21478 if(os !== 0) o.s = os; | |
21479 switch(cell.t) { | |
21480 case 'n': break; | |
21481 case 'b': o.t = "b"; break; | |
21482 case 'e': o.t = "e"; break; | |
21483 default: | |
21484 if(opts.bookSST) { | |
21485 v = writetag('v', ''+get_sst_id(opts.Strings, cell.v)); | |
21486 o.t = "s"; break; | |
21487 } | |
21488 o.t = "str"; break; | |
21489 } | |
21490 return writextag('c', v, o); | |
21491 } | |
21492 | |
21493 var parse_ws_xml_data = (function parse_ws_xml_data_factory() { | |
21494 var cellregex = /<(?:\w+:)?c /, rowregex = /<\/(?:\w+:)?row>/; | |
21495 var rregex = /r=["']([^"']*)["']/, isregex = /<is>([\S\s]*?)<\/is>/; | |
21496 var match_v = matchtag("v"), match_f = matchtag("f"); | |
21497 | |
21498 return function parse_ws_xml_data(sdata, s, opts, guess) { | |
21499 var ri = 0, x = "", cells = [], cref = [], idx = 0, i=0, cc=0, d="", p; | |
21500 var tag; | |
21501 var sstr; | |
21502 var fmtid = 0, fillid = 0, do_format = Array.isArray(styles.CellXf), cf; | |
21503 for(var marr = sdata.split(rowregex), mt = 0, marrlen = marr.length; mt != marrlen; ++mt) { | |
21504 x = marr[mt].trim(); | |
21505 var xlen = x.length; | |
21506 if(xlen === 0) continue; | |
21507 | |
21508 /* 18.3.1.73 row CT_Row */ | |
21509 for(ri = 0; ri < xlen; ++ri) if(x.charCodeAt(ri) === 62) break; ++ri; | |
21510 tag = parsexmltag(x.substr(0,ri), true); | |
21511 var tagr = parseInt(tag.r, 10); | |
21512 if(opts.sheetRows && opts.sheetRows < tagr) continue; | |
21513 if(guess.s.r > tagr - 1) guess.s.r = tagr - 1; | |
21514 if(guess.e.r < tagr - 1) guess.e.r = tagr - 1; | |
21515 | |
21516 /* 18.3.1.4 c CT_Cell */ | |
21517 cells = x.substr(ri).split(cellregex); | |
21518 for(ri = 1, cellen = cells.length; ri != cellen; ++ri) { | |
21519 x = cells[ri].trim(); | |
21520 if(x.length === 0) continue; | |
21521 cref = x.match(rregex); idx = ri; i=0; cc=0; | |
21522 x = "<c " + x; | |
21523 if(cref !== null && cref.length === 2) { | |
21524 idx = 0; d=cref[1]; | |
21525 for(i=0; i != d.length; ++i) { | |
21526 if((cc=d.charCodeAt(i)-64) < 1 || cc > 26) break; | |
21527 idx = 26*idx + cc; | |
21528 } | |
21529 --idx; | |
21530 } | |
21531 | |
21532 for(i = 0; i != x.length; ++i) if(x.charCodeAt(i) === 62) break; ++i; | |
21533 tag = parsexmltag(x.substr(0,i), true); | |
21534 d = x.substr(i); | |
21535 p = {t:""}; | |
21536 | |
21537 if((cref=d.match(match_v))!== null) p.v=unescapexml(cref[1]); | |
21538 if(opts.cellFormula && (cref=d.match(match_f))!== null) p.f=unescapexml(cref[1]); | |
21539 | |
21540 /* SCHEMA IS ACTUALLY INCORRECT HERE. IF A CELL HAS NO T, EMIT "" */ | |
21541 if(tag.t === undefined && p.v === undefined) { | |
21542 if(!opts.sheetStubs) continue; | |
21543 p.t = "str"; | |
21544 } | |
21545 else p.t = tag.t || "n"; | |
21546 if(guess.s.c > idx) guess.s.c = idx; | |
21547 if(guess.e.c < idx) guess.e.c = idx; | |
21548 /* 18.18.11 t ST_CellType */ | |
21549 switch(p.t) { | |
21550 case 'n': p.v = parseFloat(p.v); break; | |
21551 case 's': | |
21552 sstr = strs[parseInt(p.v, 10)]; | |
21553 p.v = sstr.t; | |
21554 p.r = sstr.r; | |
21555 if(opts.cellHTML) p.h = sstr.h; | |
21556 break; | |
21557 case 'str': if(p.v != null) p.v = utf8read(p.v); else p.v = ""; break; | |
21558 case 'inlineStr': | |
21559 cref = d.match(isregex); | |
21560 p.t = 'str'; | |
21561 if(cref !== null) { sstr = parse_si(cref[1]); p.v = sstr.t; } else p.v = ""; | |
21562 break; // inline string | |
21563 case 'b': p.v = parsexmlbool(p.v); break; | |
21564 case 'd': | |
21565 p.v = datenum(p.v); | |
21566 p.t = 'n'; | |
21567 break; | |
21568 /* in case of error, stick value in .raw */ | |
21569 case 'e': p.raw = RBErr[p.v]; break; | |
21570 } | |
21571 /* formatting */ | |
21572 fmtid = fillid = 0; | |
21573 if(do_format && tag.s !== undefined) { | |
21574 cf = styles.CellXf[tag.s]; | |
21575 if(cf != null) { | |
21576 if(cf.numFmtId != null) fmtid = cf.numFmtId; | |
21577 if(opts.cellStyles && cf.fillId != null) fillid = cf.fillId; | |
21578 } | |
21579 } | |
21580 safe_format(p, fmtid, fillid, opts); | |
21581 s[tag.r] = p; | |
21582 } | |
21583 } | |
21584 }; })(); | |
21585 | |
21586 function write_ws_xml_data(ws, opts, idx, wb) { | |
21587 var o = [], r = [], range = safe_decode_range(ws['!ref']), cell, ref, rr = "", cols = [], R, C; | |
21588 for(C = range.s.c; C <= range.e.c; ++C) cols[C] = encode_col(C); | |
21589 for(R = range.s.r; R <= range.e.r; ++R) { | |
21590 r = []; | |
21591 rr = encode_row(R); | |
21592 for(C = range.s.c; C <= range.e.c; ++C) { | |
21593 ref = cols[C] + rr; | |
21594 if(ws[ref] === undefined) continue; | |
21595 if((cell = write_ws_xml_cell(ws[ref], ref, ws, opts, idx, wb)) != null) r.push(cell); | |
21596 } | |
21597 if(r.length > 0) o[o.length] = (writextag('row', r.join(""), {r:rr})); | |
21598 } | |
21599 return o.join(""); | |
21600 } | |
21601 | |
21602 var WS_XML_ROOT = writextag('worksheet', null, { | |
21603 'xmlns': XMLNS.main[0], | |
21604 'xmlns:r': XMLNS.r | |
21605 }); | |
21606 | |
21607 function write_ws_xml(idx, opts, wb) { | |
21608 var o = [XML_HEADER, WS_XML_ROOT]; | |
21609 var s = wb.SheetNames[idx], sidx = 0, rdata = ""; | |
21610 var ws = wb.Sheets[s]; | |
21611 if(ws === undefined) ws = {}; | |
21612 var ref = ws['!ref']; if(ref === undefined) ref = 'A1'; | |
21613 o[o.length] = (writextag('dimension', null, {'ref': ref})); | |
21614 | |
21615 if(ws['!cols'] !== undefined && ws['!cols'].length > 0) o[o.length] = (write_ws_xml_cols(ws, ws['!cols'])); | |
21616 o[sidx = o.length] = '<sheetData/>'; | |
21617 if(ws['!ref'] !== undefined) { | |
21618 rdata = write_ws_xml_data(ws, opts, idx, wb); | |
21619 if(rdata.length > 0) o[o.length] = (rdata); | |
21620 } | |
21621 if(o.length>sidx+1) { o[o.length] = ('</sheetData>'); o[sidx]=o[sidx].replace("/>",">"); } | |
21622 | |
21623 if(o.length>2) { o[o.length] = ('</worksheet>'); o[1]=o[1].replace("/>",">"); } | |
21624 return o.join(""); | |
21625 } | |
21626 | |
21627 /* [MS-XLSB] 2.4.718 BrtRowHdr */ | |
21628 function parse_BrtRowHdr(data, length) { | |
21629 var z = []; | |
21630 z.r = data.read_shift(4); | |
21631 data.l += length-4; | |
21632 return z; | |
21633 } | |
21634 | |
21635 /* [MS-XLSB] 2.4.812 BrtWsDim */ | |
21636 var parse_BrtWsDim = parse_UncheckedRfX; | |
21637 var write_BrtWsDim = write_UncheckedRfX; | |
21638 | |
21639 /* [MS-XLSB] 2.4.815 BrtWsProp */ | |
21640 function parse_BrtWsProp(data, length) { | |
21641 var z = {}; | |
21642 /* TODO: pull flags */ | |
21643 data.l += 19; | |
21644 z.name = parse_CodeName(data, length - 19); | |
21645 return z; | |
21646 } | |
21647 | |
21648 /* [MS-XLSB] 2.4.303 BrtCellBlank */ | |
21649 function parse_BrtCellBlank(data, length) { | |
21650 var cell = parse_Cell(data); | |
21651 return [cell]; | |
21652 } | |
21653 function write_BrtCellBlank(cell, val, o) { | |
21654 if(o == null) o = new_buf(8); | |
21655 return write_Cell(val, o); | |
21656 } | |
21657 | |
21658 | |
21659 /* [MS-XLSB] 2.4.304 BrtCellBool */ | |
21660 function parse_BrtCellBool(data, length) { | |
21661 var cell = parse_Cell(data); | |
21662 var fBool = data.read_shift(1); | |
21663 return [cell, fBool, 'b']; | |
21664 } | |
21665 | |
21666 /* [MS-XLSB] 2.4.305 BrtCellError */ | |
21667 function parse_BrtCellError(data, length) { | |
21668 var cell = parse_Cell(data); | |
21669 var fBool = data.read_shift(1); | |
21670 return [cell, fBool, 'e']; | |
21671 } | |
21672 | |
21673 /* [MS-XLSB] 2.4.308 BrtCellIsst */ | |
21674 function parse_BrtCellIsst(data, length) { | |
21675 var cell = parse_Cell(data); | |
21676 var isst = data.read_shift(4); | |
21677 return [cell, isst, 's']; | |
21678 } | |
21679 | |
21680 /* [MS-XLSB] 2.4.310 BrtCellReal */ | |
21681 function parse_BrtCellReal(data, length) { | |
21682 var cell = parse_Cell(data); | |
21683 var value = parse_Xnum(data); | |
21684 return [cell, value, 'n']; | |
21685 } | |
21686 | |
21687 /* [MS-XLSB] 2.4.311 BrtCellRk */ | |
21688 function parse_BrtCellRk(data, length) { | |
21689 var cell = parse_Cell(data); | |
21690 var value = parse_RkNumber(data); | |
21691 return [cell, value, 'n']; | |
21692 } | |
21693 | |
21694 /* [MS-XLSB] 2.4.314 BrtCellSt */ | |
21695 function parse_BrtCellSt(data, length) { | |
21696 var cell = parse_Cell(data); | |
21697 var value = parse_XLWideString(data); | |
21698 return [cell, value, 'str']; | |
21699 } | |
21700 | |
21701 /* [MS-XLSB] 2.4.647 BrtFmlaBool */ | |
21702 function parse_BrtFmlaBool(data, length, opts) { | |
21703 var cell = parse_Cell(data); | |
21704 var value = data.read_shift(1); | |
21705 var o = [cell, value, 'b']; | |
21706 if(opts.cellFormula) { | |
21707 var formula = parse_CellParsedFormula(data, length-9); | |
21708 o[3] = ""; /* TODO */ | |
21709 } | |
21710 else data.l += length-9; | |
21711 return o; | |
21712 } | |
21713 | |
21714 /* [MS-XLSB] 2.4.648 BrtFmlaError */ | |
21715 function parse_BrtFmlaError(data, length, opts) { | |
21716 var cell = parse_Cell(data); | |
21717 var value = data.read_shift(1); | |
21718 var o = [cell, value, 'e']; | |
21719 if(opts.cellFormula) { | |
21720 var formula = parse_CellParsedFormula(data, length-9); | |
21721 o[3] = ""; /* TODO */ | |
21722 } | |
21723 else data.l += length-9; | |
21724 return o; | |
21725 } | |
21726 | |
21727 /* [MS-XLSB] 2.4.649 BrtFmlaNum */ | |
21728 function parse_BrtFmlaNum(data, length, opts) { | |
21729 var cell = parse_Cell(data); | |
21730 var value = parse_Xnum(data); | |
21731 var o = [cell, value, 'n']; | |
21732 if(opts.cellFormula) { | |
21733 var formula = parse_CellParsedFormula(data, length - 16); | |
21734 o[3] = ""; /* TODO */ | |
21735 } | |
21736 else data.l += length-16; | |
21737 return o; | |
21738 } | |
21739 | |
21740 /* [MS-XLSB] 2.4.650 BrtFmlaString */ | |
21741 function parse_BrtFmlaString(data, length, opts) { | |
21742 var start = data.l; | |
21743 var cell = parse_Cell(data); | |
21744 var value = parse_XLWideString(data); | |
21745 var o = [cell, value, 'str']; | |
21746 if(opts.cellFormula) { | |
21747 var formula = parse_CellParsedFormula(data, start + length - data.l); | |
21748 } | |
21749 else data.l = start + length; | |
21750 return o; | |
21751 } | |
21752 | |
21753 /* [MS-XLSB] 2.4.676 BrtMergeCell */ | |
21754 var parse_BrtMergeCell = parse_UncheckedRfX; | |
21755 | |
21756 /* [MS-XLSB] 2.4.656 BrtHLink */ | |
21757 function parse_BrtHLink(data, length, opts) { | |
21758 var end = data.l + length; | |
21759 var rfx = parse_UncheckedRfX(data, 16); | |
21760 var relId = parse_XLNullableWideString(data); | |
21761 var loc = parse_XLWideString(data); | |
21762 var tooltip = parse_XLWideString(data); | |
21763 var display = parse_XLWideString(data); | |
21764 data.l = end; | |
21765 return {rfx:rfx, relId:relId, loc:loc, tooltip:tooltip, display:display}; | |
21766 } | |
21767 | |
21768 /* [MS-XLSB] 2.1.7.61 Worksheet */ | |
21769 function parse_ws_bin(data, opts, rels) { | |
21770 if(!data) return data; | |
21771 if(!rels) rels = {'!id':{}}; | |
21772 var s = {}; | |
21773 | |
21774 var ref; | |
21775 var refguess = {s: {r:1000000, c:1000000}, e: {r:0, c:0} }; | |
21776 | |
21777 var pass = false, end = false; | |
21778 var row, p, cf, R, C, addr, sstr, rr; | |
21779 var mergecells = []; | |
21780 recordhopper(data, function ws_parse(val, R) { | |
21781 if(end) return; | |
21782 switch(R.n) { | |
21783 case 'BrtWsDim': ref = val; break; | |
21784 case 'BrtRowHdr': | |
21785 row = val; | |
21786 if(opts.sheetRows && opts.sheetRows <= row.r) end=true; | |
21787 rr = encode_row(row.r); | |
21788 break; | |
21789 | |
21790 case 'BrtFmlaBool': | |
21791 case 'BrtFmlaError': | |
21792 case 'BrtFmlaNum': | |
21793 case 'BrtFmlaString': | |
21794 case 'BrtCellBool': | |
21795 case 'BrtCellError': | |
21796 case 'BrtCellIsst': | |
21797 case 'BrtCellReal': | |
21798 case 'BrtCellRk': | |
21799 case 'BrtCellSt': | |
21800 p = {t:val[2]}; | |
21801 switch(val[2]) { | |
21802 case 'n': p.v = val[1]; break; | |
21803 case 's': sstr = strs[val[1]]; p.v = sstr.t; p.r = sstr.r; break; | |
21804 case 'b': p.v = val[1] ? true : false; break; | |
21805 case 'e': p.raw = val[1]; p.v = BErr[p.raw]; break; | |
21806 case 'str': p.v = utf8read(val[1]); break; | |
21807 } | |
21808 if(opts.cellFormula && val.length > 3) p.f = val[3]; | |
21809 if((cf = styles.CellXf[val[0].iStyleRef])) safe_format(p,cf.ifmt,null,opts); | |
21810 s[encode_col(C=val[0].c) + rr] = p; | |
21811 if(refguess.s.r > row.r) refguess.s.r = row.r; | |
21812 if(refguess.s.c > C) refguess.s.c = C; | |
21813 if(refguess.e.r < row.r) refguess.e.r = row.r; | |
21814 if(refguess.e.c < C) refguess.e.c = C; | |
21815 break; | |
21816 | |
21817 case 'BrtCellBlank': if(!opts.sheetStubs) break; | |
21818 p = {t:'str',v:undefined}; | |
21819 s[encode_col(C=val[0].c) + rr] = p; | |
21820 if(refguess.s.r > row.r) refguess.s.r = row.r; | |
21821 if(refguess.s.c > C) refguess.s.c = C; | |
21822 if(refguess.e.r < row.r) refguess.e.r = row.r; | |
21823 if(refguess.e.c < C) refguess.e.c = C; | |
21824 break; | |
21825 | |
21826 /* Merge Cells */ | |
21827 case 'BrtBeginMergeCells': break; | |
21828 case 'BrtEndMergeCells': break; | |
21829 case 'BrtMergeCell': mergecells.push(val); break; | |
21830 | |
21831 case 'BrtHLink': | |
21832 var rel = rels['!id'][val.relId]; | |
21833 if(rel) { | |
21834 val.Target = rel.Target; | |
21835 if(val.loc) val.Target += "#"+val.loc; | |
21836 val.Rel = rel; | |
21837 } | |
21838 for(R=val.rfx.s.r;R<=val.rfx.e.r;++R) for(C=val.rfx.s.c;C<=val.rfx.e.c;++C) { | |
21839 addr = encode_cell({c:C,r:R}); | |
21840 if(!s[addr]) s[addr] = {t:"str",v:undefined}; | |
21841 s[addr].l = val; | |
21842 } | |
21843 break; | |
21844 | |
21845 case 'BrtArrFmla': break; // TODO | |
21846 case 'BrtShrFmla': break; // TODO | |
21847 case 'BrtBeginSheet': break; | |
21848 case 'BrtWsProp': break; // TODO | |
21849 case 'BrtSheetCalcProp': break; // TODO | |
21850 case 'BrtBeginWsViews': break; // TODO | |
21851 case 'BrtBeginWsView': break; // TODO | |
21852 case 'BrtPane': break; // TODO | |
21853 case 'BrtSel': break; // TODO | |
21854 case 'BrtEndWsView': break; // TODO | |
21855 case 'BrtEndWsViews': break; // TODO | |
21856 case 'BrtACBegin': break; // TODO | |
21857 case 'BrtRwDescent': break; // TODO | |
21858 case 'BrtACEnd': break; // TODO | |
21859 case 'BrtWsFmtInfoEx14': break; // TODO | |
21860 case 'BrtWsFmtInfo': break; // TODO | |
21861 case 'BrtBeginColInfos': break; // TODO | |
21862 case 'BrtColInfo': break; // TODO | |
21863 case 'BrtEndColInfos': break; // TODO | |
21864 case 'BrtBeginSheetData': break; // TODO | |
21865 case 'BrtEndSheetData': break; // TODO | |
21866 case 'BrtSheetProtection': break; // TODO | |
21867 case 'BrtPrintOptions': break; // TODO | |
21868 case 'BrtMargins': break; // TODO | |
21869 case 'BrtPageSetup': break; // TODO | |
21870 case 'BrtFRTBegin': pass = true; break; | |
21871 case 'BrtFRTEnd': pass = false; break; | |
21872 case 'BrtEndSheet': break; // TODO | |
21873 case 'BrtDrawing': break; // TODO | |
21874 case 'BrtLegacyDrawing': break; // TODO | |
21875 case 'BrtLegacyDrawingHF': break; // TODO | |
21876 case 'BrtPhoneticInfo': break; // TODO | |
21877 case 'BrtBeginHeaderFooter': break; // TODO | |
21878 case 'BrtEndHeaderFooter': break; // TODO | |
21879 case 'BrtBrk': break; // TODO | |
21880 case 'BrtBeginRwBrk': break; // TODO | |
21881 case 'BrtEndRwBrk': break; // TODO | |
21882 case 'BrtBeginColBrk': break; // TODO | |
21883 case 'BrtEndColBrk': break; // TODO | |
21884 case 'BrtBeginUserShViews': break; // TODO | |
21885 case 'BrtBeginUserShView': break; // TODO | |
21886 case 'BrtEndUserShView': break; // TODO | |
21887 case 'BrtEndUserShViews': break; // TODO | |
21888 case 'BrtBkHim': break; // TODO | |
21889 case 'BrtBeginOleObjects': break; // TODO | |
21890 case 'BrtOleObject': break; // TODO | |
21891 case 'BrtEndOleObjects': break; // TODO | |
21892 case 'BrtBeginListParts': break; // TODO | |
21893 case 'BrtListPart': break; // TODO | |
21894 case 'BrtEndListParts': break; // TODO | |
21895 case 'BrtBeginSortState': break; // TODO | |
21896 case 'BrtBeginSortCond': break; // TODO | |
21897 case 'BrtEndSortCond': break; // TODO | |
21898 case 'BrtEndSortState': break; // TODO | |
21899 case 'BrtBeginConditionalFormatting': break; // TODO | |
21900 case 'BrtEndConditionalFormatting': break; // TODO | |
21901 case 'BrtBeginCFRule': break; // TODO | |
21902 case 'BrtEndCFRule': break; // TODO | |
21903 case 'BrtBeginDVals': break; // TODO | |
21904 case 'BrtDVal': break; // TODO | |
21905 case 'BrtEndDVals': break; // TODO | |
21906 case 'BrtRangeProtection': break; // TODO | |
21907 case 'BrtBeginDCon': break; // TODO | |
21908 case 'BrtEndDCon': break; // TODO | |
21909 case 'BrtBeginDRefs': break; | |
21910 case 'BrtDRef': break; | |
21911 case 'BrtEndDRefs': break; | |
21912 | |
21913 /* ActiveX */ | |
21914 case 'BrtBeginActiveXControls': break; | |
21915 case 'BrtActiveX': break; | |
21916 case 'BrtEndActiveXControls': break; | |
21917 | |
21918 /* AutoFilter */ | |
21919 case 'BrtBeginAFilter': break; | |
21920 case 'BrtEndAFilter': break; | |
21921 case 'BrtBeginFilterColumn': break; | |
21922 case 'BrtBeginFilters': break; | |
21923 case 'BrtFilter': break; | |
21924 case 'BrtEndFilters': break; | |
21925 case 'BrtEndFilterColumn': break; | |
21926 case 'BrtDynamicFilter': break; | |
21927 case 'BrtTop10Filter': break; | |
21928 case 'BrtBeginCustomFilters': break; | |
21929 case 'BrtCustomFilter': break; | |
21930 case 'BrtEndCustomFilters': break; | |
21931 | |
21932 /* Smart Tags */ | |
21933 case 'BrtBeginSmartTags': break; | |
21934 case 'BrtBeginCellSmartTags': break; | |
21935 case 'BrtBeginCellSmartTag': break; | |
21936 case 'BrtCellSmartTagProperty': break; | |
21937 case 'BrtEndCellSmartTag': break; | |
21938 case 'BrtEndCellSmartTags': break; | |
21939 case 'BrtEndSmartTags': break; | |
21940 | |
21941 /* Cell Watch */ | |
21942 case 'BrtBeginCellWatches': break; | |
21943 case 'BrtCellWatch': break; | |
21944 case 'BrtEndCellWatches': break; | |
21945 | |
21946 /* Table */ | |
21947 case 'BrtTable': break; | |
21948 | |
21949 /* Ignore Cell Errors */ | |
21950 case 'BrtBeginCellIgnoreECs': break; | |
21951 case 'BrtCellIgnoreEC': break; | |
21952 case 'BrtEndCellIgnoreECs': break; | |
21953 | |
21954 default: if(!pass || opts.WTF) throw new Error("Unexpected record " + R.n); | |
21955 } | |
21956 }, opts); | |
21957 if(!s["!ref"] && (refguess.s.r < 1000000 || ref.e.r > 0 || ref.e.c > 0 || ref.s.r > 0 || ref.s.c > 0)) s["!ref"] = encode_range(ref); | |
21958 if(opts.sheetRows && s["!ref"]) { | |
21959 var tmpref = safe_decode_range(s["!ref"]); | |
21960 if(opts.sheetRows < +tmpref.e.r) { | |
21961 tmpref.e.r = opts.sheetRows - 1; | |
21962 if(tmpref.e.r > refguess.e.r) tmpref.e.r = refguess.e.r; | |
21963 if(tmpref.e.r < tmpref.s.r) tmpref.s.r = tmpref.e.r; | |
21964 if(tmpref.e.c > refguess.e.c) tmpref.e.c = refguess.e.c; | |
21965 if(tmpref.e.c < tmpref.s.c) tmpref.s.c = tmpref.e.c; | |
21966 s["!fullref"] = s["!ref"]; | |
21967 s["!ref"] = encode_range(tmpref); | |
21968 } | |
21969 } | |
21970 if(mergecells.length > 0) s["!merges"] = mergecells; | |
21971 return s; | |
21972 } | |
21973 | |
21974 /* TODO: something useful -- this is a stub */ | |
21975 function write_ws_bin_cell(ba, cell, R, C, opts) { | |
21976 if(cell.v === undefined) return ""; | |
21977 var vv = ""; | |
21978 switch(cell.t) { | |
21979 case 'b': vv = cell.v ? "1" : "0"; break; | |
21980 case 'n': case 'e': vv = ''+cell.v; break; | |
21981 default: vv = cell.v; break; | |
21982 } | |
21983 var o = {r:R, c:C}; | |
21984 /* TODO: cell style */ | |
21985 o.s = get_cell_style(opts.cellXfs, cell, opts); | |
21986 switch(cell.t) { | |
21987 case 's': case 'str': | |
21988 if(opts.bookSST) { | |
21989 vv = get_sst_id(opts.Strings, cell.v); | |
21990 o.t = "s"; break; | |
21991 } | |
21992 o.t = "str"; break; | |
21993 case 'n': break; | |
21994 case 'b': o.t = "b"; break; | |
21995 case 'e': o.t = "e"; break; | |
21996 } | |
21997 write_record(ba, "BrtCellBlank", write_BrtCellBlank(cell, o)); | |
21998 } | |
21999 | |
22000 function write_CELLTABLE(ba, ws, idx, opts, wb) { | |
22001 var range = safe_decode_range(ws['!ref'] || "A1"), ref, rr = "", cols = []; | |
22002 write_record(ba, 'BrtBeginSheetData'); | |
22003 for(var R = range.s.r; R <= range.e.r; ++R) { | |
22004 rr = encode_row(R); | |
22005 /* [ACCELLTABLE] */ | |
22006 /* BrtRowHdr */ | |
22007 for(var C = range.s.c; C <= range.e.c; ++C) { | |
22008 /* *16384CELL */ | |
22009 if(R === range.s.r) cols[C] = encode_col(C); | |
22010 ref = cols[C] + rr; | |
22011 if(!ws[ref]) continue; | |
22012 /* write cell */ | |
22013 write_ws_bin_cell(ba, ws[ref], R, C, opts); | |
22014 } | |
22015 } | |
22016 write_record(ba, 'BrtEndSheetData'); | |
22017 } | |
22018 | |
22019 function write_ws_bin(idx, opts, wb) { | |
22020 var ba = buf_array(); | |
22021 var s = wb.SheetNames[idx], ws = wb.Sheets[s] || {}; | |
22022 var r = safe_decode_range(ws['!ref'] || "A1"); | |
22023 write_record(ba, "BrtBeginSheet"); | |
22024 /* [BrtWsProp] */ | |
22025 write_record(ba, "BrtWsDim", write_BrtWsDim(r)); | |
22026 /* [WSVIEWS2] */ | |
22027 /* [WSFMTINFO] */ | |
22028 /* *COLINFOS */ | |
22029 write_CELLTABLE(ba, ws, idx, opts, wb); | |
22030 /* [BrtSheetCalcProp] */ | |
22031 /* [[BrtSheetProtectionIso] BrtSheetProtection] */ | |
22032 /* *([BrtRangeProtectionIso] BrtRangeProtection) */ | |
22033 /* [SCENMAN] */ | |
22034 /* [AUTOFILTER] */ | |
22035 /* [SORTSTATE] */ | |
22036 /* [DCON] */ | |
22037 /* [USERSHVIEWS] */ | |
22038 /* [MERGECELLS] */ | |
22039 /* [BrtPhoneticInfo] */ | |
22040 /* *CONDITIONALFORMATTING */ | |
22041 /* [DVALS] */ | |
22042 /* *BrtHLink */ | |
22043 /* [BrtPrintOptions] */ | |
22044 /* [BrtMargins] */ | |
22045 /* [BrtPageSetup] */ | |
22046 /* [HEADERFOOTER] */ | |
22047 /* [RWBRK] */ | |
22048 /* [COLBRK] */ | |
22049 /* *BrtBigName */ | |
22050 /* [CELLWATCHES] */ | |
22051 /* [IGNOREECS] */ | |
22052 /* [SMARTTAGS] */ | |
22053 /* [BrtDrawing] */ | |
22054 /* [BrtLegacyDrawing] */ | |
22055 /* [BrtLegacyDrawingHF] */ | |
22056 /* [BrtBkHim] */ | |
22057 /* [OLEOBJECTS] */ | |
22058 /* [ACTIVEXCONTROLS] */ | |
22059 /* [WEBPUBITEMS] */ | |
22060 /* [LISTPARTS] */ | |
22061 /* FRTWORKSHEET */ | |
22062 write_record(ba, "BrtEndSheet"); | |
22063 return ba.end(); | |
22064 } | |
22065 /* 18.2.28 (CT_WorkbookProtection) Defaults */ | |
22066 var WBPropsDef = [ | |
22067 ['allowRefreshQuery', '0'], | |
22068 ['autoCompressPictures', '1'], | |
22069 ['backupFile', '0'], | |
22070 ['checkCompatibility', '0'], | |
22071 ['codeName', ''], | |
22072 ['date1904', '0'], | |
22073 ['dateCompatibility', '1'], | |
22074 //['defaultThemeVersion', '0'], | |
22075 ['filterPrivacy', '0'], | |
22076 ['hidePivotFieldList', '0'], | |
22077 ['promptedSolutions', '0'], | |
22078 ['publishItems', '0'], | |
22079 ['refreshAllConnections', false], | |
22080 ['saveExternalLinkValues', '1'], | |
22081 ['showBorderUnselectedTables', '1'], | |
22082 ['showInkAnnotation', '1'], | |
22083 ['showObjects', 'all'], | |
22084 ['showPivotChartFilter', '0'] | |
22085 //['updateLinks', 'userSet'] | |
22086 ]; | |
22087 | |
22088 /* 18.2.30 (CT_BookView) Defaults */ | |
22089 var WBViewDef = [ | |
22090 ['activeTab', '0'], | |
22091 ['autoFilterDateGrouping', '1'], | |
22092 ['firstSheet', '0'], | |
22093 ['minimized', '0'], | |
22094 ['showHorizontalScroll', '1'], | |
22095 ['showSheetTabs', '1'], | |
22096 ['showVerticalScroll', '1'], | |
22097 ['tabRatio', '600'], | |
22098 ['visibility', 'visible'] | |
22099 //window{Height,Width}, {x,y}Window | |
22100 ]; | |
22101 | |
22102 /* 18.2.19 (CT_Sheet) Defaults */ | |
22103 var SheetDef = [ | |
22104 ['state', 'visible'] | |
22105 ]; | |
22106 | |
22107 /* 18.2.2 (CT_CalcPr) Defaults */ | |
22108 var CalcPrDef = [ | |
22109 ['calcCompleted', 'true'], | |
22110 ['calcMode', 'auto'], | |
22111 ['calcOnSave', 'true'], | |
22112 ['concurrentCalc', 'true'], | |
22113 ['fullCalcOnLoad', 'false'], | |
22114 ['fullPrecision', 'true'], | |
22115 ['iterate', 'false'], | |
22116 ['iterateCount', '100'], | |
22117 ['iterateDelta', '0.001'], | |
22118 ['refMode', 'A1'] | |
22119 ]; | |
22120 | |
22121 /* 18.2.3 (CT_CustomWorkbookView) Defaults */ | |
22122 var CustomWBViewDef = [ | |
22123 ['autoUpdate', 'false'], | |
22124 ['changesSavedWin', 'false'], | |
22125 ['includeHiddenRowCol', 'true'], | |
22126 ['includePrintSettings', 'true'], | |
22127 ['maximized', 'false'], | |
22128 ['minimized', 'false'], | |
22129 ['onlySync', 'false'], | |
22130 ['personalView', 'false'], | |
22131 ['showComments', 'commIndicator'], | |
22132 ['showFormulaBar', 'true'], | |
22133 ['showHorizontalScroll', 'true'], | |
22134 ['showObjects', 'all'], | |
22135 ['showSheetTabs', 'true'], | |
22136 ['showStatusbar', 'true'], | |
22137 ['showVerticalScroll', 'true'], | |
22138 ['tabRatio', '600'], | |
22139 ['xWindow', '0'], | |
22140 ['yWindow', '0'] | |
22141 ]; | |
22142 | |
22143 function push_defaults_array(target, defaults) { | |
22144 for(var j = 0; j != target.length; ++j) { var w = target[j]; | |
22145 for(var i=0; i != defaults.length; ++i) { var z = defaults[i]; | |
22146 if(w[z[0]] == null) w[z[0]] = z[1]; | |
22147 } | |
22148 } | |
22149 } | |
22150 function push_defaults(target, defaults) { | |
22151 for(var i = 0; i != defaults.length; ++i) { var z = defaults[i]; | |
22152 if(target[z[0]] == null) target[z[0]] = z[1]; | |
22153 } | |
22154 } | |
22155 | |
22156 function parse_wb_defaults(wb) { | |
22157 push_defaults(wb.WBProps, WBPropsDef); | |
22158 push_defaults(wb.CalcPr, CalcPrDef); | |
22159 | |
22160 push_defaults_array(wb.WBView, WBViewDef); | |
22161 push_defaults_array(wb.Sheets, SheetDef); | |
22162 | |
22163 _ssfopts.date1904 = parsexmlbool(wb.WBProps.date1904, 'date1904'); | |
22164 } | |
22165 /* 18.2 Workbook */ | |
22166 var wbnsregex = /<\w+:workbook/; | |
22167 function parse_wb_xml(data, opts) { | |
22168 var wb = { AppVersion:{}, WBProps:{}, WBView:[], Sheets:[], CalcPr:{}, xmlns: "" }; | |
22169 var pass = false, xmlns = "xmlns"; | |
22170 data.match(tagregex).forEach(function xml_wb(x) { | |
22171 var y = parsexmltag(x); | |
22172 switch(strip_ns(y[0])) { | |
22173 case '<?xml': break; | |
22174 | |
22175 /* 18.2.27 workbook CT_Workbook 1 */ | |
22176 case '<workbook': | |
22177 if(x.match(wbnsregex)) xmlns = "xmlns" + x.match(/<(\w+):/)[1]; | |
22178 wb.xmlns = y[xmlns]; | |
22179 break; | |
22180 case '</workbook>': break; | |
22181 | |
22182 /* 18.2.13 fileVersion CT_FileVersion ? */ | |
22183 case '<fileVersion': delete y[0]; wb.AppVersion = y; break; | |
22184 case '<fileVersion/>': break; | |
22185 | |
22186 /* 18.2.12 fileSharing CT_FileSharing ? */ | |
22187 case '<fileSharing': case '<fileSharing/>': break; | |
22188 | |
22189 /* 18.2.28 workbookPr CT_WorkbookPr ? */ | |
22190 case '<workbookPr': delete y[0]; wb.WBProps = y; break; | |
22191 case '<workbookPr/>': delete y[0]; wb.WBProps = y; break; | |
22192 | |
22193 /* 18.2.29 workbookProtection CT_WorkbookProtection ? */ | |
22194 case '<workbookProtection': break; | |
22195 case '<workbookProtection/>': break; | |
22196 | |
22197 /* 18.2.1 bookViews CT_BookViews ? */ | |
22198 case '<bookViews>': case '</bookViews>': break; | |
22199 /* 18.2.30 workbookView CT_BookView + */ | |
22200 case '<workbookView': delete y[0]; wb.WBView.push(y); break; | |
22201 | |
22202 /* 18.2.20 sheets CT_Sheets 1 */ | |
22203 case '<sheets>': case '</sheets>': break; // aggregate sheet | |
22204 /* 18.2.19 sheet CT_Sheet + */ | |
22205 case '<sheet': delete y[0]; y.name = utf8read(y.name); wb.Sheets.push(y); break; | |
22206 | |
22207 /* 18.2.15 functionGroups CT_FunctionGroups ? */ | |
22208 case '<functionGroups': case '<functionGroups/>': break; | |
22209 /* 18.2.14 functionGroup CT_FunctionGroup + */ | |
22210 case '<functionGroup': break; | |
22211 | |
22212 /* 18.2.9 externalReferences CT_ExternalReferences ? */ | |
22213 case '<externalReferences': case '</externalReferences>': case '<externalReferences>': break; | |
22214 /* 18.2.8 externalReference CT_ExternalReference + */ | |
22215 case '<externalReference': break; | |
22216 | |
22217 /* 18.2.6 definedNames CT_DefinedNames ? */ | |
22218 case '<definedNames/>': break; | |
22219 case '<definedNames>': case '<definedNames': pass=true; break; | |
22220 case '</definedNames>': pass=false; break; | |
22221 /* 18.2.5 definedName CT_DefinedName + */ | |
22222 case '<definedName': case '<definedName/>': case '</definedName>': break; | |
22223 | |
22224 /* 18.2.2 calcPr CT_CalcPr ? */ | |
22225 case '<calcPr': delete y[0]; wb.CalcPr = y; break; | |
22226 case '<calcPr/>': delete y[0]; wb.CalcPr = y; break; | |
22227 | |
22228 /* 18.2.16 oleSize CT_OleSize ? (ref required) */ | |
22229 case '<oleSize': break; | |
22230 | |
22231 /* 18.2.4 customWorkbookViews CT_CustomWorkbookViews ? */ | |
22232 case '<customWorkbookViews>': case '</customWorkbookViews>': case '<customWorkbookViews': break; | |
22233 /* 18.2.3 customWorkbookView CT_CustomWorkbookView + */ | |
22234 case '<customWorkbookView': case '</customWorkbookView>': break; | |
22235 | |
22236 /* 18.2.18 pivotCaches CT_PivotCaches ? */ | |
22237 case '<pivotCaches>': case '</pivotCaches>': case '<pivotCaches': break; | |
22238 /* 18.2.17 pivotCache CT_PivotCache ? */ | |
22239 case '<pivotCache': break; | |
22240 | |
22241 /* 18.2.21 smartTagPr CT_SmartTagPr ? */ | |
22242 case '<smartTagPr': case '<smartTagPr/>': break; | |
22243 | |
22244 /* 18.2.23 smartTagTypes CT_SmartTagTypes ? */ | |
22245 case '<smartTagTypes': case '<smartTagTypes>': case '</smartTagTypes>': break; | |
22246 /* 18.2.22 smartTagType CT_SmartTagType ? */ | |
22247 case '<smartTagType': break; | |
22248 | |
22249 /* 18.2.24 webPublishing CT_WebPublishing ? */ | |
22250 case '<webPublishing': case '<webPublishing/>': break; | |
22251 | |
22252 /* 18.2.11 fileRecoveryPr CT_FileRecoveryPr ? */ | |
22253 case '<fileRecoveryPr': case '<fileRecoveryPr/>': break; | |
22254 | |
22255 /* 18.2.26 webPublishObjects CT_WebPublishObjects ? */ | |
22256 case '<webPublishObjects>': case '<webPublishObjects': case '</webPublishObjects>': break; | |
22257 /* 18.2.25 webPublishObject CT_WebPublishObject ? */ | |
22258 case '<webPublishObject': break; | |
22259 | |
22260 /* 18.2.10 extLst CT_ExtensionList ? */ | |
22261 case '<extLst>': case '</extLst>': case '<extLst/>': break; | |
22262 /* 18.2.7 ext CT_Extension + */ | |
22263 case '<ext': pass=true; break; //TODO: check with versions of excel | |
22264 case '</ext>': pass=false; break; | |
22265 | |
22266 /* Others */ | |
22267 case '<ArchID': break; | |
22268 case '<AlternateContent': pass=true; break; | |
22269 case '</AlternateContent>': pass=false; break; | |
22270 | |
22271 default: if(!pass && opts.WTF) throw 'unrecognized ' + y[0] + ' in workbook'; | |
22272 } | |
22273 }); | |
22274 if(XMLNS.main.indexOf(wb.xmlns) === -1) throw new Error("Unknown Namespace: " + wb.xmlns); | |
22275 | |
22276 parse_wb_defaults(wb); | |
22277 | |
22278 return wb; | |
22279 } | |
22280 | |
22281 var WB_XML_ROOT = writextag('workbook', null, { | |
22282 'xmlns': XMLNS.main[0], | |
22283 //'xmlns:mx': XMLNS.mx, | |
22284 //'xmlns:s': XMLNS.main[0], | |
22285 'xmlns:r': XMLNS.r | |
22286 }); | |
22287 | |
22288 function safe1904(wb) { | |
22289 /* TODO: store date1904 somewhere else */ | |
22290 try { return parsexmlbool(wb.Workbook.WBProps.date1904) ? "true" : "false"; } catch(e) { return "false"; } | |
22291 } | |
22292 | |
22293 function write_wb_xml(wb, opts) { | |
22294 var o = [XML_HEADER]; | |
22295 o[o.length] = WB_XML_ROOT; | |
22296 o[o.length] = (writextag('workbookPr', null, {date1904:safe1904(wb)})); | |
22297 o[o.length] = "<sheets>"; | |
22298 for(var i = 0; i != wb.SheetNames.length; ++i) | |
22299 o[o.length] = (writextag('sheet',null,{name:wb.SheetNames[i].substr(0,31), sheetId:""+(i+1), "r:id":"rId"+(i+1)})); | |
22300 o[o.length] = "</sheets>"; | |
22301 if(o.length>2){ o[o.length] = '</workbook>'; o[1]=o[1].replace("/>",">"); } | |
22302 return o.join(""); | |
22303 } | |
22304 /* [MS-XLSB] 2.4.301 BrtBundleSh */ | |
22305 function parse_BrtBundleSh(data, length) { | |
22306 var z = {}; | |
22307 z.hsState = data.read_shift(4); //ST_SheetState | |
22308 z.iTabID = data.read_shift(4); | |
22309 z.strRelID = parse_RelID(data,length-8); | |
22310 z.name = parse_XLWideString(data); | |
22311 return z; | |
22312 } | |
22313 function write_BrtBundleSh(data, o) { | |
22314 if(!o) o = new_buf(127); | |
22315 o.write_shift(4, data.hsState); | |
22316 o.write_shift(4, data.iTabID); | |
22317 write_RelID(data.strRelID, o); | |
22318 write_XLWideString(data.name.substr(0,31), o); | |
22319 return o; | |
22320 } | |
22321 | |
22322 /* [MS-XLSB] 2.4.807 BrtWbProp */ | |
22323 function parse_BrtWbProp(data, length) { | |
22324 data.read_shift(4); | |
22325 var dwThemeVersion = data.read_shift(4); | |
22326 var strName = (length > 8) ? parse_XLWideString(data) : ""; | |
22327 return [dwThemeVersion, strName]; | |
22328 } | |
22329 function write_BrtWbProp(data, o) { | |
22330 if(!o) o = new_buf(8); | |
22331 o.write_shift(4, 0); | |
22332 o.write_shift(4, 0); | |
22333 return o; | |
22334 } | |
22335 | |
22336 function parse_BrtFRTArchID$(data, length) { | |
22337 var o = {}; | |
22338 data.read_shift(4); | |
22339 o.ArchID = data.read_shift(4); | |
22340 data.l += length - 8; | |
22341 return o; | |
22342 } | |
22343 | |
22344 /* [MS-XLSB] 2.1.7.60 Workbook */ | |
22345 function parse_wb_bin(data, opts) { | |
22346 var wb = { AppVersion:{}, WBProps:{}, WBView:[], Sheets:[], CalcPr:{}, xmlns: "" }; | |
22347 var pass = false, z; | |
22348 | |
22349 recordhopper(data, function hopper_wb(val, R) { | |
22350 switch(R.n) { | |
22351 case 'BrtBundleSh': wb.Sheets.push(val); break; | |
22352 | |
22353 case 'BrtBeginBook': break; | |
22354 case 'BrtFileVersion': break; | |
22355 case 'BrtWbProp': break; | |
22356 case 'BrtACBegin': break; | |
22357 case 'BrtAbsPath15': break; | |
22358 case 'BrtACEnd': break; | |
22359 case 'BrtWbFactoid': break; | |
22360 /*case 'BrtBookProtectionIso': break;*/ | |
22361 case 'BrtBookProtection': break; | |
22362 case 'BrtBeginBookViews': break; | |
22363 case 'BrtBookView': break; | |
22364 case 'BrtEndBookViews': break; | |
22365 case 'BrtBeginBundleShs': break; | |
22366 case 'BrtEndBundleShs': break; | |
22367 case 'BrtBeginFnGroup': break; | |
22368 case 'BrtEndFnGroup': break; | |
22369 case 'BrtBeginExternals': break; | |
22370 case 'BrtSupSelf': break; | |
22371 case 'BrtSupBookSrc': break; | |
22372 case 'BrtExternSheet': break; | |
22373 case 'BrtEndExternals': break; | |
22374 case 'BrtName': break; | |
22375 case 'BrtCalcProp': break; | |
22376 case 'BrtUserBookView': break; | |
22377 case 'BrtBeginPivotCacheIDs': break; | |
22378 case 'BrtBeginPivotCacheID': break; | |
22379 case 'BrtEndPivotCacheID': break; | |
22380 case 'BrtEndPivotCacheIDs': break; | |
22381 case 'BrtWebOpt': break; | |
22382 case 'BrtFileRecover': break; | |
22383 case 'BrtFileSharing': break; | |
22384 /*case 'BrtBeginWebPubItems': break; | |
22385 case 'BrtBeginWebPubItem': break; | |
22386 case 'BrtEndWebPubItem': break; | |
22387 case 'BrtEndWebPubItems': break;*/ | |
22388 | |
22389 /* Smart Tags */ | |
22390 case 'BrtBeginSmartTagTypes': break; | |
22391 case 'BrtSmartTagType': break; | |
22392 case 'BrtEndSmartTagTypes': break; | |
22393 | |
22394 case 'BrtFRTBegin': pass = true; break; | |
22395 case 'BrtFRTArchID$': break; | |
22396 case 'BrtWorkBookPr15': break; | |
22397 case 'BrtFRTEnd': pass = false; break; | |
22398 case 'BrtEndBook': break; | |
22399 default: if(!pass || opts.WTF) throw new Error("Unexpected record " + R.n); | |
22400 } | |
22401 }); | |
22402 | |
22403 parse_wb_defaults(wb); | |
22404 | |
22405 return wb; | |
22406 } | |
22407 | |
22408 /* [MS-XLSB] 2.1.7.60 Workbook */ | |
22409 function write_BUNDLESHS(ba, wb, opts) { | |
22410 write_record(ba, "BrtBeginBundleShs"); | |
22411 for(var idx = 0; idx != wb.SheetNames.length; ++idx) { | |
22412 var d = { hsState: 0, iTabID: idx+1, strRelID: 'rId' + (idx+1), name: wb.SheetNames[idx] }; | |
22413 write_record(ba, "BrtBundleSh", write_BrtBundleSh(d)); | |
22414 } | |
22415 write_record(ba, "BrtEndBundleShs"); | |
22416 } | |
22417 | |
22418 /* [MS-XLSB] 2.4.643 BrtFileVersion */ | |
22419 function write_BrtFileVersion(data, o) { | |
22420 if(!o) o = new_buf(127); | |
22421 for(var i = 0; i != 4; ++i) o.write_shift(4, 0); | |
22422 write_XLWideString("SheetJS", o); | |
22423 write_XLWideString(XLSX.version, o); | |
22424 write_XLWideString(XLSX.version, o); | |
22425 write_XLWideString("7262", o); | |
22426 o.length = o.l; | |
22427 return o; | |
22428 } | |
22429 | |
22430 /* [MS-XLSB] 2.1.7.60 Workbook */ | |
22431 function write_BOOKVIEWS(ba, wb, opts) { | |
22432 write_record(ba, "BrtBeginBookViews"); | |
22433 /* 1*(BrtBookView *FRT) */ | |
22434 write_record(ba, "BrtEndBookViews"); | |
22435 } | |
22436 | |
22437 /* [MS-XLSB] 2.4.302 BrtCalcProp */ | |
22438 function write_BrtCalcProp(data, o) { | |
22439 if(!o) o = new_buf(26); | |
22440 o.write_shift(4,0); /* force recalc */ | |
22441 o.write_shift(4,1); | |
22442 o.write_shift(4,0); | |
22443 write_Xnum(0, o); | |
22444 o.write_shift(-4, 1023); | |
22445 o.write_shift(1, 0x33); | |
22446 o.write_shift(1, 0x00); | |
22447 return o; | |
22448 } | |
22449 | |
22450 function write_BrtFileRecover(data, o) { | |
22451 if(!o) o = new_buf(1); | |
22452 o.write_shift(1,0); | |
22453 return o; | |
22454 } | |
22455 | |
22456 /* [MS-XLSB] 2.1.7.60 Workbook */ | |
22457 function write_wb_bin(wb, opts) { | |
22458 var ba = buf_array(); | |
22459 write_record(ba, "BrtBeginBook"); | |
22460 write_record(ba, "BrtFileVersion", write_BrtFileVersion()); | |
22461 /* [[BrtFileSharingIso] BrtFileSharing] */ | |
22462 write_record(ba, "BrtWbProp", write_BrtWbProp()); | |
22463 /* [ACABSPATH] */ | |
22464 /* [[BrtBookProtectionIso] BrtBookProtection] */ | |
22465 write_BOOKVIEWS(ba, wb, opts); | |
22466 write_BUNDLESHS(ba, wb, opts); | |
22467 /* [FNGROUP] */ | |
22468 /* [EXTERNALS] */ | |
22469 /* *BrtName */ | |
22470 write_record(ba, "BrtCalcProp", write_BrtCalcProp()); | |
22471 /* [BrtOleSize] */ | |
22472 /* *(BrtUserBookView *FRT) */ | |
22473 /* [PIVOTCACHEIDS] */ | |
22474 /* [BrtWbFactoid] */ | |
22475 /* [SMARTTAGTYPES] */ | |
22476 /* [BrtWebOpt] */ | |
22477 write_record(ba, "BrtFileRecover", write_BrtFileRecover()); | |
22478 /* [WEBPUBITEMS] */ | |
22479 /* [CRERRS] */ | |
22480 /* FRTWORKBOOK */ | |
22481 write_record(ba, "BrtEndBook"); | |
22482 | |
22483 return ba.end(); | |
22484 } | |
22485 function parse_wb(data, name, opts) { | |
22486 return (name.substr(-4)===".bin" ? parse_wb_bin : parse_wb_xml)(data, opts); | |
22487 } | |
22488 | |
22489 function parse_ws(data, name, opts, rels) { | |
22490 return (name.substr(-4)===".bin" ? parse_ws_bin : parse_ws_xml)(data, opts, rels); | |
22491 } | |
22492 | |
22493 function parse_sty(data, name, opts) { | |
22494 return (name.substr(-4)===".bin" ? parse_sty_bin : parse_sty_xml)(data, opts); | |
22495 } | |
22496 | |
22497 function parse_theme(data, name, opts) { | |
22498 return parse_theme_xml(data, opts); | |
22499 } | |
22500 | |
22501 function parse_sst(data, name, opts) { | |
22502 return (name.substr(-4)===".bin" ? parse_sst_bin : parse_sst_xml)(data, opts); | |
22503 } | |
22504 | |
22505 function parse_cmnt(data, name, opts) { | |
22506 return (name.substr(-4)===".bin" ? parse_comments_bin : parse_comments_xml)(data, opts); | |
22507 } | |
22508 | |
22509 function parse_cc(data, name, opts) { | |
22510 return (name.substr(-4)===".bin" ? parse_cc_bin : parse_cc_xml)(data, opts); | |
22511 } | |
22512 | |
22513 function write_wb(wb, name, opts) { | |
22514 return (name.substr(-4)===".bin" ? write_wb_bin : write_wb_xml)(wb, opts); | |
22515 } | |
22516 | |
22517 function write_ws(data, name, opts, wb) { | |
22518 return (name.substr(-4)===".bin" ? write_ws_bin : write_ws_xml)(data, opts, wb); | |
22519 } | |
22520 | |
22521 function write_sty(data, name, opts) { | |
22522 return (name.substr(-4)===".bin" ? write_sty_bin : write_sty_xml)(data, opts); | |
22523 } | |
22524 | |
22525 function write_sst(data, name, opts) { | |
22526 return (name.substr(-4)===".bin" ? write_sst_bin : write_sst_xml)(data, opts); | |
22527 } | |
19023 /* | 22528 /* |
19024 * Compression methods | 22529 function write_cmnt(data, name, opts) { |
19025 * This object is filled in as follow : | 22530 return (name.substr(-4)===".bin" ? write_comments_bin : write_comments_xml)(data, opts); |
19026 * name : { | 22531 } |
19027 * magic // the 2 bytes indentifying the compression method | 22532 |
19028 * compress // function, take the uncompressed content and return it compressed. | 22533 function write_cc(data, name, opts) { |
19029 * uncompress // function, take the compressed content and return it uncompressed. | 22534 return (name.substr(-4)===".bin" ? write_cc_bin : write_cc_xml)(data, opts); |
19030 * } | 22535 } |
19031 * | 22536 */ |
19032 * STORE is the default compression method, so it's included in this file. | 22537 /* [MS-XLSB] 2.3 Record Enumeration */ |
19033 * Other methods should go to separated files : the user wants modularity. | 22538 var RecordEnum = { |
19034 */ | 22539 0x0000: { n:"BrtRowHdr", f:parse_BrtRowHdr }, |
19035 JSZip.compressions = { | 22540 0x0001: { n:"BrtCellBlank", f:parse_BrtCellBlank }, |
19036 "STORE" : { | 22541 0x0002: { n:"BrtCellRk", f:parse_BrtCellRk }, |
19037 magic : "\x00\x00", | 22542 0x0003: { n:"BrtCellError", f:parse_BrtCellError }, |
19038 compress : function (content) { | 22543 0x0004: { n:"BrtCellBool", f:parse_BrtCellBool }, |
19039 return content; // no compression | 22544 0x0005: { n:"BrtCellReal", f:parse_BrtCellReal }, |
19040 }, | 22545 0x0006: { n:"BrtCellSt", f:parse_BrtCellSt }, |
19041 uncompress : function (content) { | 22546 0x0007: { n:"BrtCellIsst", f:parse_BrtCellIsst }, |
19042 return content; // no compression | 22547 0x0008: { n:"BrtFmlaString", f:parse_BrtFmlaString }, |
19043 } | 22548 0x0009: { n:"BrtFmlaNum", f:parse_BrtFmlaNum }, |
19044 } | 22549 0x000A: { n:"BrtFmlaBool", f:parse_BrtFmlaBool }, |
22550 0x000B: { n:"BrtFmlaError", f:parse_BrtFmlaError }, | |
22551 0x0010: { n:"BrtFRTArchID$", f:parse_BrtFRTArchID$ }, | |
22552 0x0013: { n:"BrtSSTItem", f:parse_RichStr }, | |
22553 0x0014: { n:"BrtPCDIMissing", f:parsenoop }, | |
22554 0x0015: { n:"BrtPCDINumber", f:parsenoop }, | |
22555 0x0016: { n:"BrtPCDIBoolean", f:parsenoop }, | |
22556 0x0017: { n:"BrtPCDIError", f:parsenoop }, | |
22557 0x0018: { n:"BrtPCDIString", f:parsenoop }, | |
22558 0x0019: { n:"BrtPCDIDatetime", f:parsenoop }, | |
22559 0x001A: { n:"BrtPCDIIndex", f:parsenoop }, | |
22560 0x001B: { n:"BrtPCDIAMissing", f:parsenoop }, | |
22561 0x001C: { n:"BrtPCDIANumber", f:parsenoop }, | |
22562 0x001D: { n:"BrtPCDIABoolean", f:parsenoop }, | |
22563 0x001E: { n:"BrtPCDIAError", f:parsenoop }, | |
22564 0x001F: { n:"BrtPCDIAString", f:parsenoop }, | |
22565 0x0020: { n:"BrtPCDIADatetime", f:parsenoop }, | |
22566 0x0021: { n:"BrtPCRRecord", f:parsenoop }, | |
22567 0x0022: { n:"BrtPCRRecordDt", f:parsenoop }, | |
22568 0x0023: { n:"BrtFRTBegin", f:parsenoop }, | |
22569 0x0024: { n:"BrtFRTEnd", f:parsenoop }, | |
22570 0x0025: { n:"BrtACBegin", f:parsenoop }, | |
22571 0x0026: { n:"BrtACEnd", f:parsenoop }, | |
22572 0x0027: { n:"BrtName", f:parsenoop }, | |
22573 0x0028: { n:"BrtIndexRowBlock", f:parsenoop }, | |
22574 0x002A: { n:"BrtIndexBlock", f:parsenoop }, | |
22575 0x002B: { n:"BrtFont", f:parse_BrtFont }, | |
22576 0x002C: { n:"BrtFmt", f:parse_BrtFmt }, | |
22577 0x002D: { n:"BrtFill", f:parsenoop }, | |
22578 0x002E: { n:"BrtBorder", f:parsenoop }, | |
22579 0x002F: { n:"BrtXF", f:parse_BrtXF }, | |
22580 0x0030: { n:"BrtStyle", f:parsenoop }, | |
22581 0x0031: { n:"BrtCellMeta", f:parsenoop }, | |
22582 0x0032: { n:"BrtValueMeta", f:parsenoop }, | |
22583 0x0033: { n:"BrtMdb", f:parsenoop }, | |
22584 0x0034: { n:"BrtBeginFmd", f:parsenoop }, | |
22585 0x0035: { n:"BrtEndFmd", f:parsenoop }, | |
22586 0x0036: { n:"BrtBeginMdx", f:parsenoop }, | |
22587 0x0037: { n:"BrtEndMdx", f:parsenoop }, | |
22588 0x0038: { n:"BrtBeginMdxTuple", f:parsenoop }, | |
22589 0x0039: { n:"BrtEndMdxTuple", f:parsenoop }, | |
22590 0x003A: { n:"BrtMdxMbrIstr", f:parsenoop }, | |
22591 0x003B: { n:"BrtStr", f:parsenoop }, | |
22592 0x003C: { n:"BrtColInfo", f:parsenoop }, | |
22593 0x003E: { n:"BrtCellRString", f:parsenoop }, | |
22594 0x003F: { n:"BrtCalcChainItem$", f:parse_BrtCalcChainItem$ }, | |
22595 0x0040: { n:"BrtDVal", f:parsenoop }, | |
22596 0x0041: { n:"BrtSxvcellNum", f:parsenoop }, | |
22597 0x0042: { n:"BrtSxvcellStr", f:parsenoop }, | |
22598 0x0043: { n:"BrtSxvcellBool", f:parsenoop }, | |
22599 0x0044: { n:"BrtSxvcellErr", f:parsenoop }, | |
22600 0x0045: { n:"BrtSxvcellDate", f:parsenoop }, | |
22601 0x0046: { n:"BrtSxvcellNil", f:parsenoop }, | |
22602 0x0080: { n:"BrtFileVersion", f:parsenoop }, | |
22603 0x0081: { n:"BrtBeginSheet", f:parsenoop }, | |
22604 0x0082: { n:"BrtEndSheet", f:parsenoop }, | |
22605 0x0083: { n:"BrtBeginBook", f:parsenoop, p:0 }, | |
22606 0x0084: { n:"BrtEndBook", f:parsenoop }, | |
22607 0x0085: { n:"BrtBeginWsViews", f:parsenoop }, | |
22608 0x0086: { n:"BrtEndWsViews", f:parsenoop }, | |
22609 0x0087: { n:"BrtBeginBookViews", f:parsenoop }, | |
22610 0x0088: { n:"BrtEndBookViews", f:parsenoop }, | |
22611 0x0089: { n:"BrtBeginWsView", f:parsenoop }, | |
22612 0x008A: { n:"BrtEndWsView", f:parsenoop }, | |
22613 0x008B: { n:"BrtBeginCsViews", f:parsenoop }, | |
22614 0x008C: { n:"BrtEndCsViews", f:parsenoop }, | |
22615 0x008D: { n:"BrtBeginCsView", f:parsenoop }, | |
22616 0x008E: { n:"BrtEndCsView", f:parsenoop }, | |
22617 0x008F: { n:"BrtBeginBundleShs", f:parsenoop }, | |
22618 0x0090: { n:"BrtEndBundleShs", f:parsenoop }, | |
22619 0x0091: { n:"BrtBeginSheetData", f:parsenoop }, | |
22620 0x0092: { n:"BrtEndSheetData", f:parsenoop }, | |
22621 0x0093: { n:"BrtWsProp", f:parse_BrtWsProp }, | |
22622 0x0094: { n:"BrtWsDim", f:parse_BrtWsDim, p:16 }, | |
22623 0x0097: { n:"BrtPane", f:parsenoop }, | |
22624 0x0098: { n:"BrtSel", f:parsenoop }, | |
22625 0x0099: { n:"BrtWbProp", f:parse_BrtWbProp }, | |
22626 0x009A: { n:"BrtWbFactoid", f:parsenoop }, | |
22627 0x009B: { n:"BrtFileRecover", f:parsenoop }, | |
22628 0x009C: { n:"BrtBundleSh", f:parse_BrtBundleSh }, | |
22629 0x009D: { n:"BrtCalcProp", f:parsenoop }, | |
22630 0x009E: { n:"BrtBookView", f:parsenoop }, | |
22631 0x009F: { n:"BrtBeginSst", f:parse_BrtBeginSst }, | |
22632 0x00A0: { n:"BrtEndSst", f:parsenoop }, | |
22633 0x00A1: { n:"BrtBeginAFilter", f:parsenoop }, | |
22634 0x00A2: { n:"BrtEndAFilter", f:parsenoop }, | |
22635 0x00A3: { n:"BrtBeginFilterColumn", f:parsenoop }, | |
22636 0x00A4: { n:"BrtEndFilterColumn", f:parsenoop }, | |
22637 0x00A5: { n:"BrtBeginFilters", f:parsenoop }, | |
22638 0x00A6: { n:"BrtEndFilters", f:parsenoop }, | |
22639 0x00A7: { n:"BrtFilter", f:parsenoop }, | |
22640 0x00A8: { n:"BrtColorFilter", f:parsenoop }, | |
22641 0x00A9: { n:"BrtIconFilter", f:parsenoop }, | |
22642 0x00AA: { n:"BrtTop10Filter", f:parsenoop }, | |
22643 0x00AB: { n:"BrtDynamicFilter", f:parsenoop }, | |
22644 0x00AC: { n:"BrtBeginCustomFilters", f:parsenoop }, | |
22645 0x00AD: { n:"BrtEndCustomFilters", f:parsenoop }, | |
22646 0x00AE: { n:"BrtCustomFilter", f:parsenoop }, | |
22647 0x00AF: { n:"BrtAFilterDateGroupItem", f:parsenoop }, | |
22648 0x00B0: { n:"BrtMergeCell", f:parse_BrtMergeCell }, | |
22649 0x00B1: { n:"BrtBeginMergeCells", f:parsenoop }, | |
22650 0x00B2: { n:"BrtEndMergeCells", f:parsenoop }, | |
22651 0x00B3: { n:"BrtBeginPivotCacheDef", f:parsenoop }, | |
22652 0x00B4: { n:"BrtEndPivotCacheDef", f:parsenoop }, | |
22653 0x00B5: { n:"BrtBeginPCDFields", f:parsenoop }, | |
22654 0x00B6: { n:"BrtEndPCDFields", f:parsenoop }, | |
22655 0x00B7: { n:"BrtBeginPCDField", f:parsenoop }, | |
22656 0x00B8: { n:"BrtEndPCDField", f:parsenoop }, | |
22657 0x00B9: { n:"BrtBeginPCDSource", f:parsenoop }, | |
22658 0x00BA: { n:"BrtEndPCDSource", f:parsenoop }, | |
22659 0x00BB: { n:"BrtBeginPCDSRange", f:parsenoop }, | |
22660 0x00BC: { n:"BrtEndPCDSRange", f:parsenoop }, | |
22661 0x00BD: { n:"BrtBeginPCDFAtbl", f:parsenoop }, | |
22662 0x00BE: { n:"BrtEndPCDFAtbl", f:parsenoop }, | |
22663 0x00BF: { n:"BrtBeginPCDIRun", f:parsenoop }, | |
22664 0x00C0: { n:"BrtEndPCDIRun", f:parsenoop }, | |
22665 0x00C1: { n:"BrtBeginPivotCacheRecords", f:parsenoop }, | |
22666 0x00C2: { n:"BrtEndPivotCacheRecords", f:parsenoop }, | |
22667 0x00C3: { n:"BrtBeginPCDHierarchies", f:parsenoop }, | |
22668 0x00C4: { n:"BrtEndPCDHierarchies", f:parsenoop }, | |
22669 0x00C5: { n:"BrtBeginPCDHierarchy", f:parsenoop }, | |
22670 0x00C6: { n:"BrtEndPCDHierarchy", f:parsenoop }, | |
22671 0x00C7: { n:"BrtBeginPCDHFieldsUsage", f:parsenoop }, | |
22672 0x00C8: { n:"BrtEndPCDHFieldsUsage", f:parsenoop }, | |
22673 0x00C9: { n:"BrtBeginExtConnection", f:parsenoop }, | |
22674 0x00CA: { n:"BrtEndExtConnection", f:parsenoop }, | |
22675 0x00CB: { n:"BrtBeginECDbProps", f:parsenoop }, | |
22676 0x00CC: { n:"BrtEndECDbProps", f:parsenoop }, | |
22677 0x00CD: { n:"BrtBeginECOlapProps", f:parsenoop }, | |
22678 0x00CE: { n:"BrtEndECOlapProps", f:parsenoop }, | |
22679 0x00CF: { n:"BrtBeginPCDSConsol", f:parsenoop }, | |
22680 0x00D0: { n:"BrtEndPCDSConsol", f:parsenoop }, | |
22681 0x00D1: { n:"BrtBeginPCDSCPages", f:parsenoop }, | |
22682 0x00D2: { n:"BrtEndPCDSCPages", f:parsenoop }, | |
22683 0x00D3: { n:"BrtBeginPCDSCPage", f:parsenoop }, | |
22684 0x00D4: { n:"BrtEndPCDSCPage", f:parsenoop }, | |
22685 0x00D5: { n:"BrtBeginPCDSCPItem", f:parsenoop }, | |
22686 0x00D6: { n:"BrtEndPCDSCPItem", f:parsenoop }, | |
22687 0x00D7: { n:"BrtBeginPCDSCSets", f:parsenoop }, | |
22688 0x00D8: { n:"BrtEndPCDSCSets", f:parsenoop }, | |
22689 0x00D9: { n:"BrtBeginPCDSCSet", f:parsenoop }, | |
22690 0x00DA: { n:"BrtEndPCDSCSet", f:parsenoop }, | |
22691 0x00DB: { n:"BrtBeginPCDFGroup", f:parsenoop }, | |
22692 0x00DC: { n:"BrtEndPCDFGroup", f:parsenoop }, | |
22693 0x00DD: { n:"BrtBeginPCDFGItems", f:parsenoop }, | |
22694 0x00DE: { n:"BrtEndPCDFGItems", f:parsenoop }, | |
22695 0x00DF: { n:"BrtBeginPCDFGRange", f:parsenoop }, | |
22696 0x00E0: { n:"BrtEndPCDFGRange", f:parsenoop }, | |
22697 0x00E1: { n:"BrtBeginPCDFGDiscrete", f:parsenoop }, | |
22698 0x00E2: { n:"BrtEndPCDFGDiscrete", f:parsenoop }, | |
22699 0x00E3: { n:"BrtBeginPCDSDTupleCache", f:parsenoop }, | |
22700 0x00E4: { n:"BrtEndPCDSDTupleCache", f:parsenoop }, | |
22701 0x00E5: { n:"BrtBeginPCDSDTCEntries", f:parsenoop }, | |
22702 0x00E6: { n:"BrtEndPCDSDTCEntries", f:parsenoop }, | |
22703 0x00E7: { n:"BrtBeginPCDSDTCEMembers", f:parsenoop }, | |
22704 0x00E8: { n:"BrtEndPCDSDTCEMembers", f:parsenoop }, | |
22705 0x00E9: { n:"BrtBeginPCDSDTCEMember", f:parsenoop }, | |
22706 0x00EA: { n:"BrtEndPCDSDTCEMember", f:parsenoop }, | |
22707 0x00EB: { n:"BrtBeginPCDSDTCQueries", f:parsenoop }, | |
22708 0x00EC: { n:"BrtEndPCDSDTCQueries", f:parsenoop }, | |
22709 0x00ED: { n:"BrtBeginPCDSDTCQuery", f:parsenoop }, | |
22710 0x00EE: { n:"BrtEndPCDSDTCQuery", f:parsenoop }, | |
22711 0x00EF: { n:"BrtBeginPCDSDTCSets", f:parsenoop }, | |
22712 0x00F0: { n:"BrtEndPCDSDTCSets", f:parsenoop }, | |
22713 0x00F1: { n:"BrtBeginPCDSDTCSet", f:parsenoop }, | |
22714 0x00F2: { n:"BrtEndPCDSDTCSet", f:parsenoop }, | |
22715 0x00F3: { n:"BrtBeginPCDCalcItems", f:parsenoop }, | |
22716 0x00F4: { n:"BrtEndPCDCalcItems", f:parsenoop }, | |
22717 0x00F5: { n:"BrtBeginPCDCalcItem", f:parsenoop }, | |
22718 0x00F6: { n:"BrtEndPCDCalcItem", f:parsenoop }, | |
22719 0x00F7: { n:"BrtBeginPRule", f:parsenoop }, | |
22720 0x00F8: { n:"BrtEndPRule", f:parsenoop }, | |
22721 0x00F9: { n:"BrtBeginPRFilters", f:parsenoop }, | |
22722 0x00FA: { n:"BrtEndPRFilters", f:parsenoop }, | |
22723 0x00FB: { n:"BrtBeginPRFilter", f:parsenoop }, | |
22724 0x00FC: { n:"BrtEndPRFilter", f:parsenoop }, | |
22725 0x00FD: { n:"BrtBeginPNames", f:parsenoop }, | |
22726 0x00FE: { n:"BrtEndPNames", f:parsenoop }, | |
22727 0x00FF: { n:"BrtBeginPName", f:parsenoop }, | |
22728 0x0100: { n:"BrtEndPName", f:parsenoop }, | |
22729 0x0101: { n:"BrtBeginPNPairs", f:parsenoop }, | |
22730 0x0102: { n:"BrtEndPNPairs", f:parsenoop }, | |
22731 0x0103: { n:"BrtBeginPNPair", f:parsenoop }, | |
22732 0x0104: { n:"BrtEndPNPair", f:parsenoop }, | |
22733 0x0105: { n:"BrtBeginECWebProps", f:parsenoop }, | |
22734 0x0106: { n:"BrtEndECWebProps", f:parsenoop }, | |
22735 0x0107: { n:"BrtBeginEcWpTables", f:parsenoop }, | |
22736 0x0108: { n:"BrtEndECWPTables", f:parsenoop }, | |
22737 0x0109: { n:"BrtBeginECParams", f:parsenoop }, | |
22738 0x010A: { n:"BrtEndECParams", f:parsenoop }, | |
22739 0x010B: { n:"BrtBeginECParam", f:parsenoop }, | |
22740 0x010C: { n:"BrtEndECParam", f:parsenoop }, | |
22741 0x010D: { n:"BrtBeginPCDKPIs", f:parsenoop }, | |
22742 0x010E: { n:"BrtEndPCDKPIs", f:parsenoop }, | |
22743 0x010F: { n:"BrtBeginPCDKPI", f:parsenoop }, | |
22744 0x0110: { n:"BrtEndPCDKPI", f:parsenoop }, | |
22745 0x0111: { n:"BrtBeginDims", f:parsenoop }, | |
22746 0x0112: { n:"BrtEndDims", f:parsenoop }, | |
22747 0x0113: { n:"BrtBeginDim", f:parsenoop }, | |
22748 0x0114: { n:"BrtEndDim", f:parsenoop }, | |
22749 0x0115: { n:"BrtIndexPartEnd", f:parsenoop }, | |
22750 0x0116: { n:"BrtBeginStyleSheet", f:parsenoop }, | |
22751 0x0117: { n:"BrtEndStyleSheet", f:parsenoop }, | |
22752 0x0118: { n:"BrtBeginSXView", f:parsenoop }, | |
22753 0x0119: { n:"BrtEndSXVI", f:parsenoop }, | |
22754 0x011A: { n:"BrtBeginSXVI", f:parsenoop }, | |
22755 0x011B: { n:"BrtBeginSXVIs", f:parsenoop }, | |
22756 0x011C: { n:"BrtEndSXVIs", f:parsenoop }, | |
22757 0x011D: { n:"BrtBeginSXVD", f:parsenoop }, | |
22758 0x011E: { n:"BrtEndSXVD", f:parsenoop }, | |
22759 0x011F: { n:"BrtBeginSXVDs", f:parsenoop }, | |
22760 0x0120: { n:"BrtEndSXVDs", f:parsenoop }, | |
22761 0x0121: { n:"BrtBeginSXPI", f:parsenoop }, | |
22762 0x0122: { n:"BrtEndSXPI", f:parsenoop }, | |
22763 0x0123: { n:"BrtBeginSXPIs", f:parsenoop }, | |
22764 0x0124: { n:"BrtEndSXPIs", f:parsenoop }, | |
22765 0x0125: { n:"BrtBeginSXDI", f:parsenoop }, | |
22766 0x0126: { n:"BrtEndSXDI", f:parsenoop }, | |
22767 0x0127: { n:"BrtBeginSXDIs", f:parsenoop }, | |
22768 0x0128: { n:"BrtEndSXDIs", f:parsenoop }, | |
22769 0x0129: { n:"BrtBeginSXLI", f:parsenoop }, | |
22770 0x012A: { n:"BrtEndSXLI", f:parsenoop }, | |
22771 0x012B: { n:"BrtBeginSXLIRws", f:parsenoop }, | |
22772 0x012C: { n:"BrtEndSXLIRws", f:parsenoop }, | |
22773 0x012D: { n:"BrtBeginSXLICols", f:parsenoop }, | |
22774 0x012E: { n:"BrtEndSXLICols", f:parsenoop }, | |
22775 0x012F: { n:"BrtBeginSXFormat", f:parsenoop }, | |
22776 0x0130: { n:"BrtEndSXFormat", f:parsenoop }, | |
22777 0x0131: { n:"BrtBeginSXFormats", f:parsenoop }, | |
22778 0x0132: { n:"BrtEndSxFormats", f:parsenoop }, | |
22779 0x0133: { n:"BrtBeginSxSelect", f:parsenoop }, | |
22780 0x0134: { n:"BrtEndSxSelect", f:parsenoop }, | |
22781 0x0135: { n:"BrtBeginISXVDRws", f:parsenoop }, | |
22782 0x0136: { n:"BrtEndISXVDRws", f:parsenoop }, | |
22783 0x0137: { n:"BrtBeginISXVDCols", f:parsenoop }, | |
22784 0x0138: { n:"BrtEndISXVDCols", f:parsenoop }, | |
22785 0x0139: { n:"BrtEndSXLocation", f:parsenoop }, | |
22786 0x013A: { n:"BrtBeginSXLocation", f:parsenoop }, | |
22787 0x013B: { n:"BrtEndSXView", f:parsenoop }, | |
22788 0x013C: { n:"BrtBeginSXTHs", f:parsenoop }, | |
22789 0x013D: { n:"BrtEndSXTHs", f:parsenoop }, | |
22790 0x013E: { n:"BrtBeginSXTH", f:parsenoop }, | |
22791 0x013F: { n:"BrtEndSXTH", f:parsenoop }, | |
22792 0x0140: { n:"BrtBeginISXTHRws", f:parsenoop }, | |
22793 0x0141: { n:"BrtEndISXTHRws", f:parsenoop }, | |
22794 0x0142: { n:"BrtBeginISXTHCols", f:parsenoop }, | |
22795 0x0143: { n:"BrtEndISXTHCols", f:parsenoop }, | |
22796 0x0144: { n:"BrtBeginSXTDMPS", f:parsenoop }, | |
22797 0x0145: { n:"BrtEndSXTDMPs", f:parsenoop }, | |
22798 0x0146: { n:"BrtBeginSXTDMP", f:parsenoop }, | |
22799 0x0147: { n:"BrtEndSXTDMP", f:parsenoop }, | |
22800 0x0148: { n:"BrtBeginSXTHItems", f:parsenoop }, | |
22801 0x0149: { n:"BrtEndSXTHItems", f:parsenoop }, | |
22802 0x014A: { n:"BrtBeginSXTHItem", f:parsenoop }, | |
22803 0x014B: { n:"BrtEndSXTHItem", f:parsenoop }, | |
22804 0x014C: { n:"BrtBeginMetadata", f:parsenoop }, | |
22805 0x014D: { n:"BrtEndMetadata", f:parsenoop }, | |
22806 0x014E: { n:"BrtBeginEsmdtinfo", f:parsenoop }, | |
22807 0x014F: { n:"BrtMdtinfo", f:parsenoop }, | |
22808 0x0150: { n:"BrtEndEsmdtinfo", f:parsenoop }, | |
22809 0x0151: { n:"BrtBeginEsmdb", f:parsenoop }, | |
22810 0x0152: { n:"BrtEndEsmdb", f:parsenoop }, | |
22811 0x0153: { n:"BrtBeginEsfmd", f:parsenoop }, | |
22812 0x0154: { n:"BrtEndEsfmd", f:parsenoop }, | |
22813 0x0155: { n:"BrtBeginSingleCells", f:parsenoop }, | |
22814 0x0156: { n:"BrtEndSingleCells", f:parsenoop }, | |
22815 0x0157: { n:"BrtBeginList", f:parsenoop }, | |
22816 0x0158: { n:"BrtEndList", f:parsenoop }, | |
22817 0x0159: { n:"BrtBeginListCols", f:parsenoop }, | |
22818 0x015A: { n:"BrtEndListCols", f:parsenoop }, | |
22819 0x015B: { n:"BrtBeginListCol", f:parsenoop }, | |
22820 0x015C: { n:"BrtEndListCol", f:parsenoop }, | |
22821 0x015D: { n:"BrtBeginListXmlCPr", f:parsenoop }, | |
22822 0x015E: { n:"BrtEndListXmlCPr", f:parsenoop }, | |
22823 0x015F: { n:"BrtListCCFmla", f:parsenoop }, | |
22824 0x0160: { n:"BrtListTrFmla", f:parsenoop }, | |
22825 0x0161: { n:"BrtBeginExternals", f:parsenoop }, | |
22826 0x0162: { n:"BrtEndExternals", f:parsenoop }, | |
22827 0x0163: { n:"BrtSupBookSrc", f:parsenoop }, | |
22828 0x0165: { n:"BrtSupSelf", f:parsenoop }, | |
22829 0x0166: { n:"BrtSupSame", f:parsenoop }, | |
22830 0x0167: { n:"BrtSupTabs", f:parsenoop }, | |
22831 0x0168: { n:"BrtBeginSupBook", f:parsenoop }, | |
22832 0x0169: { n:"BrtPlaceholderName", f:parsenoop }, | |
22833 0x016A: { n:"BrtExternSheet", f:parsenoop }, | |
22834 0x016B: { n:"BrtExternTableStart", f:parsenoop }, | |
22835 0x016C: { n:"BrtExternTableEnd", f:parsenoop }, | |
22836 0x016E: { n:"BrtExternRowHdr", f:parsenoop }, | |
22837 0x016F: { n:"BrtExternCellBlank", f:parsenoop }, | |
22838 0x0170: { n:"BrtExternCellReal", f:parsenoop }, | |
22839 0x0171: { n:"BrtExternCellBool", f:parsenoop }, | |
22840 0x0172: { n:"BrtExternCellError", f:parsenoop }, | |
22841 0x0173: { n:"BrtExternCellString", f:parsenoop }, | |
22842 0x0174: { n:"BrtBeginEsmdx", f:parsenoop }, | |
22843 0x0175: { n:"BrtEndEsmdx", f:parsenoop }, | |
22844 0x0176: { n:"BrtBeginMdxSet", f:parsenoop }, | |
22845 0x0177: { n:"BrtEndMdxSet", f:parsenoop }, | |
22846 0x0178: { n:"BrtBeginMdxMbrProp", f:parsenoop }, | |
22847 0x0179: { n:"BrtEndMdxMbrProp", f:parsenoop }, | |
22848 0x017A: { n:"BrtBeginMdxKPI", f:parsenoop }, | |
22849 0x017B: { n:"BrtEndMdxKPI", f:parsenoop }, | |
22850 0x017C: { n:"BrtBeginEsstr", f:parsenoop }, | |
22851 0x017D: { n:"BrtEndEsstr", f:parsenoop }, | |
22852 0x017E: { n:"BrtBeginPRFItem", f:parsenoop }, | |
22853 0x017F: { n:"BrtEndPRFItem", f:parsenoop }, | |
22854 0x0180: { n:"BrtBeginPivotCacheIDs", f:parsenoop }, | |
22855 0x0181: { n:"BrtEndPivotCacheIDs", f:parsenoop }, | |
22856 0x0182: { n:"BrtBeginPivotCacheID", f:parsenoop }, | |
22857 0x0183: { n:"BrtEndPivotCacheID", f:parsenoop }, | |
22858 0x0184: { n:"BrtBeginISXVIs", f:parsenoop }, | |
22859 0x0185: { n:"BrtEndISXVIs", f:parsenoop }, | |
22860 0x0186: { n:"BrtBeginColInfos", f:parsenoop }, | |
22861 0x0187: { n:"BrtEndColInfos", f:parsenoop }, | |
22862 0x0188: { n:"BrtBeginRwBrk", f:parsenoop }, | |
22863 0x0189: { n:"BrtEndRwBrk", f:parsenoop }, | |
22864 0x018A: { n:"BrtBeginColBrk", f:parsenoop }, | |
22865 0x018B: { n:"BrtEndColBrk", f:parsenoop }, | |
22866 0x018C: { n:"BrtBrk", f:parsenoop }, | |
22867 0x018D: { n:"BrtUserBookView", f:parsenoop }, | |
22868 0x018E: { n:"BrtInfo", f:parsenoop }, | |
22869 0x018F: { n:"BrtCUsr", f:parsenoop }, | |
22870 0x0190: { n:"BrtUsr", f:parsenoop }, | |
22871 0x0191: { n:"BrtBeginUsers", f:parsenoop }, | |
22872 0x0193: { n:"BrtEOF", f:parsenoop }, | |
22873 0x0194: { n:"BrtUCR", f:parsenoop }, | |
22874 0x0195: { n:"BrtRRInsDel", f:parsenoop }, | |
22875 0x0196: { n:"BrtRREndInsDel", f:parsenoop }, | |
22876 0x0197: { n:"BrtRRMove", f:parsenoop }, | |
22877 0x0198: { n:"BrtRREndMove", f:parsenoop }, | |
22878 0x0199: { n:"BrtRRChgCell", f:parsenoop }, | |
22879 0x019A: { n:"BrtRREndChgCell", f:parsenoop }, | |
22880 0x019B: { n:"BrtRRHeader", f:parsenoop }, | |
22881 0x019C: { n:"BrtRRUserView", f:parsenoop }, | |
22882 0x019D: { n:"BrtRRRenSheet", f:parsenoop }, | |
22883 0x019E: { n:"BrtRRInsertSh", f:parsenoop }, | |
22884 0x019F: { n:"BrtRRDefName", f:parsenoop }, | |
22885 0x01A0: { n:"BrtRRNote", f:parsenoop }, | |
22886 0x01A1: { n:"BrtRRConflict", f:parsenoop }, | |
22887 0x01A2: { n:"BrtRRTQSIF", f:parsenoop }, | |
22888 0x01A3: { n:"BrtRRFormat", f:parsenoop }, | |
22889 0x01A4: { n:"BrtRREndFormat", f:parsenoop }, | |
22890 0x01A5: { n:"BrtRRAutoFmt", f:parsenoop }, | |
22891 0x01A6: { n:"BrtBeginUserShViews", f:parsenoop }, | |
22892 0x01A7: { n:"BrtBeginUserShView", f:parsenoop }, | |
22893 0x01A8: { n:"BrtEndUserShView", f:parsenoop }, | |
22894 0x01A9: { n:"BrtEndUserShViews", f:parsenoop }, | |
22895 0x01AA: { n:"BrtArrFmla", f:parsenoop }, | |
22896 0x01AB: { n:"BrtShrFmla", f:parsenoop }, | |
22897 0x01AC: { n:"BrtTable", f:parsenoop }, | |
22898 0x01AD: { n:"BrtBeginExtConnections", f:parsenoop }, | |
22899 0x01AE: { n:"BrtEndExtConnections", f:parsenoop }, | |
22900 0x01AF: { n:"BrtBeginPCDCalcMems", f:parsenoop }, | |
22901 0x01B0: { n:"BrtEndPCDCalcMems", f:parsenoop }, | |
22902 0x01B1: { n:"BrtBeginPCDCalcMem", f:parsenoop }, | |
22903 0x01B2: { n:"BrtEndPCDCalcMem", f:parsenoop }, | |
22904 0x01B3: { n:"BrtBeginPCDHGLevels", f:parsenoop }, | |
22905 0x01B4: { n:"BrtEndPCDHGLevels", f:parsenoop }, | |
22906 0x01B5: { n:"BrtBeginPCDHGLevel", f:parsenoop }, | |
22907 0x01B6: { n:"BrtEndPCDHGLevel", f:parsenoop }, | |
22908 0x01B7: { n:"BrtBeginPCDHGLGroups", f:parsenoop }, | |
22909 0x01B8: { n:"BrtEndPCDHGLGroups", f:parsenoop }, | |
22910 0x01B9: { n:"BrtBeginPCDHGLGroup", f:parsenoop }, | |
22911 0x01BA: { n:"BrtEndPCDHGLGroup", f:parsenoop }, | |
22912 0x01BB: { n:"BrtBeginPCDHGLGMembers", f:parsenoop }, | |
22913 0x01BC: { n:"BrtEndPCDHGLGMembers", f:parsenoop }, | |
22914 0x01BD: { n:"BrtBeginPCDHGLGMember", f:parsenoop }, | |
22915 0x01BE: { n:"BrtEndPCDHGLGMember", f:parsenoop }, | |
22916 0x01BF: { n:"BrtBeginQSI", f:parsenoop }, | |
22917 0x01C0: { n:"BrtEndQSI", f:parsenoop }, | |
22918 0x01C1: { n:"BrtBeginQSIR", f:parsenoop }, | |
22919 0x01C2: { n:"BrtEndQSIR", f:parsenoop }, | |
22920 0x01C3: { n:"BrtBeginDeletedNames", f:parsenoop }, | |
22921 0x01C4: { n:"BrtEndDeletedNames", f:parsenoop }, | |
22922 0x01C5: { n:"BrtBeginDeletedName", f:parsenoop }, | |
22923 0x01C6: { n:"BrtEndDeletedName", f:parsenoop }, | |
22924 0x01C7: { n:"BrtBeginQSIFs", f:parsenoop }, | |
22925 0x01C8: { n:"BrtEndQSIFs", f:parsenoop }, | |
22926 0x01C9: { n:"BrtBeginQSIF", f:parsenoop }, | |
22927 0x01CA: { n:"BrtEndQSIF", f:parsenoop }, | |
22928 0x01CB: { n:"BrtBeginAutoSortScope", f:parsenoop }, | |
22929 0x01CC: { n:"BrtEndAutoSortScope", f:parsenoop }, | |
22930 0x01CD: { n:"BrtBeginConditionalFormatting", f:parsenoop }, | |
22931 0x01CE: { n:"BrtEndConditionalFormatting", f:parsenoop }, | |
22932 0x01CF: { n:"BrtBeginCFRule", f:parsenoop }, | |
22933 0x01D0: { n:"BrtEndCFRule", f:parsenoop }, | |
22934 0x01D1: { n:"BrtBeginIconSet", f:parsenoop }, | |
22935 0x01D2: { n:"BrtEndIconSet", f:parsenoop }, | |
22936 0x01D3: { n:"BrtBeginDatabar", f:parsenoop }, | |
22937 0x01D4: { n:"BrtEndDatabar", f:parsenoop }, | |
22938 0x01D5: { n:"BrtBeginColorScale", f:parsenoop }, | |
22939 0x01D6: { n:"BrtEndColorScale", f:parsenoop }, | |
22940 0x01D7: { n:"BrtCFVO", f:parsenoop }, | |
22941 0x01D8: { n:"BrtExternValueMeta", f:parsenoop }, | |
22942 0x01D9: { n:"BrtBeginColorPalette", f:parsenoop }, | |
22943 0x01DA: { n:"BrtEndColorPalette", f:parsenoop }, | |
22944 0x01DB: { n:"BrtIndexedColor", f:parsenoop }, | |
22945 0x01DC: { n:"BrtMargins", f:parsenoop }, | |
22946 0x01DD: { n:"BrtPrintOptions", f:parsenoop }, | |
22947 0x01DE: { n:"BrtPageSetup", f:parsenoop }, | |
22948 0x01DF: { n:"BrtBeginHeaderFooter", f:parsenoop }, | |
22949 0x01E0: { n:"BrtEndHeaderFooter", f:parsenoop }, | |
22950 0x01E1: { n:"BrtBeginSXCrtFormat", f:parsenoop }, | |
22951 0x01E2: { n:"BrtEndSXCrtFormat", f:parsenoop }, | |
22952 0x01E3: { n:"BrtBeginSXCrtFormats", f:parsenoop }, | |
22953 0x01E4: { n:"BrtEndSXCrtFormats", f:parsenoop }, | |
22954 0x01E5: { n:"BrtWsFmtInfo", f:parsenoop }, | |
22955 0x01E6: { n:"BrtBeginMgs", f:parsenoop }, | |
22956 0x01E7: { n:"BrtEndMGs", f:parsenoop }, | |
22957 0x01E8: { n:"BrtBeginMGMaps", f:parsenoop }, | |
22958 0x01E9: { n:"BrtEndMGMaps", f:parsenoop }, | |
22959 0x01EA: { n:"BrtBeginMG", f:parsenoop }, | |
22960 0x01EB: { n:"BrtEndMG", f:parsenoop }, | |
22961 0x01EC: { n:"BrtBeginMap", f:parsenoop }, | |
22962 0x01ED: { n:"BrtEndMap", f:parsenoop }, | |
22963 0x01EE: { n:"BrtHLink", f:parse_BrtHLink }, | |
22964 0x01EF: { n:"BrtBeginDCon", f:parsenoop }, | |
22965 0x01F0: { n:"BrtEndDCon", f:parsenoop }, | |
22966 0x01F1: { n:"BrtBeginDRefs", f:parsenoop }, | |
22967 0x01F2: { n:"BrtEndDRefs", f:parsenoop }, | |
22968 0x01F3: { n:"BrtDRef", f:parsenoop }, | |
22969 0x01F4: { n:"BrtBeginScenMan", f:parsenoop }, | |
22970 0x01F5: { n:"BrtEndScenMan", f:parsenoop }, | |
22971 0x01F6: { n:"BrtBeginSct", f:parsenoop }, | |
22972 0x01F7: { n:"BrtEndSct", f:parsenoop }, | |
22973 0x01F8: { n:"BrtSlc", f:parsenoop }, | |
22974 0x01F9: { n:"BrtBeginDXFs", f:parsenoop }, | |
22975 0x01FA: { n:"BrtEndDXFs", f:parsenoop }, | |
22976 0x01FB: { n:"BrtDXF", f:parsenoop }, | |
22977 0x01FC: { n:"BrtBeginTableStyles", f:parsenoop }, | |
22978 0x01FD: { n:"BrtEndTableStyles", f:parsenoop }, | |
22979 0x01FE: { n:"BrtBeginTableStyle", f:parsenoop }, | |
22980 0x01FF: { n:"BrtEndTableStyle", f:parsenoop }, | |
22981 0x0200: { n:"BrtTableStyleElement", f:parsenoop }, | |
22982 0x0201: { n:"BrtTableStyleClient", f:parsenoop }, | |
22983 0x0202: { n:"BrtBeginVolDeps", f:parsenoop }, | |
22984 0x0203: { n:"BrtEndVolDeps", f:parsenoop }, | |
22985 0x0204: { n:"BrtBeginVolType", f:parsenoop }, | |
22986 0x0205: { n:"BrtEndVolType", f:parsenoop }, | |
22987 0x0206: { n:"BrtBeginVolMain", f:parsenoop }, | |
22988 0x0207: { n:"BrtEndVolMain", f:parsenoop }, | |
22989 0x0208: { n:"BrtBeginVolTopic", f:parsenoop }, | |
22990 0x0209: { n:"BrtEndVolTopic", f:parsenoop }, | |
22991 0x020A: { n:"BrtVolSubtopic", f:parsenoop }, | |
22992 0x020B: { n:"BrtVolRef", f:parsenoop }, | |
22993 0x020C: { n:"BrtVolNum", f:parsenoop }, | |
22994 0x020D: { n:"BrtVolErr", f:parsenoop }, | |
22995 0x020E: { n:"BrtVolStr", f:parsenoop }, | |
22996 0x020F: { n:"BrtVolBool", f:parsenoop }, | |
22997 0x0210: { n:"BrtBeginCalcChain$", f:parsenoop }, | |
22998 0x0211: { n:"BrtEndCalcChain$", f:parsenoop }, | |
22999 0x0212: { n:"BrtBeginSortState", f:parsenoop }, | |
23000 0x0213: { n:"BrtEndSortState", f:parsenoop }, | |
23001 0x0214: { n:"BrtBeginSortCond", f:parsenoop }, | |
23002 0x0215: { n:"BrtEndSortCond", f:parsenoop }, | |
23003 0x0216: { n:"BrtBookProtection", f:parsenoop }, | |
23004 0x0217: { n:"BrtSheetProtection", f:parsenoop }, | |
23005 0x0218: { n:"BrtRangeProtection", f:parsenoop }, | |
23006 0x0219: { n:"BrtPhoneticInfo", f:parsenoop }, | |
23007 0x021A: { n:"BrtBeginECTxtWiz", f:parsenoop }, | |
23008 0x021B: { n:"BrtEndECTxtWiz", f:parsenoop }, | |
23009 0x021C: { n:"BrtBeginECTWFldInfoLst", f:parsenoop }, | |
23010 0x021D: { n:"BrtEndECTWFldInfoLst", f:parsenoop }, | |
23011 0x021E: { n:"BrtBeginECTwFldInfo", f:parsenoop }, | |
23012 0x0224: { n:"BrtFileSharing", f:parsenoop }, | |
23013 0x0225: { n:"BrtOleSize", f:parsenoop }, | |
23014 0x0226: { n:"BrtDrawing", f:parsenoop }, | |
23015 0x0227: { n:"BrtLegacyDrawing", f:parsenoop }, | |
23016 0x0228: { n:"BrtLegacyDrawingHF", f:parsenoop }, | |
23017 0x0229: { n:"BrtWebOpt", f:parsenoop }, | |
23018 0x022A: { n:"BrtBeginWebPubItems", f:parsenoop }, | |
23019 0x022B: { n:"BrtEndWebPubItems", f:parsenoop }, | |
23020 0x022C: { n:"BrtBeginWebPubItem", f:parsenoop }, | |
23021 0x022D: { n:"BrtEndWebPubItem", f:parsenoop }, | |
23022 0x022E: { n:"BrtBeginSXCondFmt", f:parsenoop }, | |
23023 0x022F: { n:"BrtEndSXCondFmt", f:parsenoop }, | |
23024 0x0230: { n:"BrtBeginSXCondFmts", f:parsenoop }, | |
23025 0x0231: { n:"BrtEndSXCondFmts", f:parsenoop }, | |
23026 0x0232: { n:"BrtBkHim", f:parsenoop }, | |
23027 0x0234: { n:"BrtColor", f:parsenoop }, | |
23028 0x0235: { n:"BrtBeginIndexedColors", f:parsenoop }, | |
23029 0x0236: { n:"BrtEndIndexedColors", f:parsenoop }, | |
23030 0x0239: { n:"BrtBeginMRUColors", f:parsenoop }, | |
23031 0x023A: { n:"BrtEndMRUColors", f:parsenoop }, | |
23032 0x023C: { n:"BrtMRUColor", f:parsenoop }, | |
23033 0x023D: { n:"BrtBeginDVals", f:parsenoop }, | |
23034 0x023E: { n:"BrtEndDVals", f:parsenoop }, | |
23035 0x0241: { n:"BrtSupNameStart", f:parsenoop }, | |
23036 0x0242: { n:"BrtSupNameValueStart", f:parsenoop }, | |
23037 0x0243: { n:"BrtSupNameValueEnd", f:parsenoop }, | |
23038 0x0244: { n:"BrtSupNameNum", f:parsenoop }, | |
23039 0x0245: { n:"BrtSupNameErr", f:parsenoop }, | |
23040 0x0246: { n:"BrtSupNameSt", f:parsenoop }, | |
23041 0x0247: { n:"BrtSupNameNil", f:parsenoop }, | |
23042 0x0248: { n:"BrtSupNameBool", f:parsenoop }, | |
23043 0x0249: { n:"BrtSupNameFmla", f:parsenoop }, | |
23044 0x024A: { n:"BrtSupNameBits", f:parsenoop }, | |
23045 0x024B: { n:"BrtSupNameEnd", f:parsenoop }, | |
23046 0x024C: { n:"BrtEndSupBook", f:parsenoop }, | |
23047 0x024D: { n:"BrtCellSmartTagProperty", f:parsenoop }, | |
23048 0x024E: { n:"BrtBeginCellSmartTag", f:parsenoop }, | |
23049 0x024F: { n:"BrtEndCellSmartTag", f:parsenoop }, | |
23050 0x0250: { n:"BrtBeginCellSmartTags", f:parsenoop }, | |
23051 0x0251: { n:"BrtEndCellSmartTags", f:parsenoop }, | |
23052 0x0252: { n:"BrtBeginSmartTags", f:parsenoop }, | |
23053 0x0253: { n:"BrtEndSmartTags", f:parsenoop }, | |
23054 0x0254: { n:"BrtSmartTagType", f:parsenoop }, | |
23055 0x0255: { n:"BrtBeginSmartTagTypes", f:parsenoop }, | |
23056 0x0256: { n:"BrtEndSmartTagTypes", f:parsenoop }, | |
23057 0x0257: { n:"BrtBeginSXFilters", f:parsenoop }, | |
23058 0x0258: { n:"BrtEndSXFilters", f:parsenoop }, | |
23059 0x0259: { n:"BrtBeginSXFILTER", f:parsenoop }, | |
23060 0x025A: { n:"BrtEndSXFilter", f:parsenoop }, | |
23061 0x025B: { n:"BrtBeginFills", f:parsenoop }, | |
23062 0x025C: { n:"BrtEndFills", f:parsenoop }, | |
23063 0x025D: { n:"BrtBeginCellWatches", f:parsenoop }, | |
23064 0x025E: { n:"BrtEndCellWatches", f:parsenoop }, | |
23065 0x025F: { n:"BrtCellWatch", f:parsenoop }, | |
23066 0x0260: { n:"BrtBeginCRErrs", f:parsenoop }, | |
23067 0x0261: { n:"BrtEndCRErrs", f:parsenoop }, | |
23068 0x0262: { n:"BrtCrashRecErr", f:parsenoop }, | |
23069 0x0263: { n:"BrtBeginFonts", f:parsenoop }, | |
23070 0x0264: { n:"BrtEndFonts", f:parsenoop }, | |
23071 0x0265: { n:"BrtBeginBorders", f:parsenoop }, | |
23072 0x0266: { n:"BrtEndBorders", f:parsenoop }, | |
23073 0x0267: { n:"BrtBeginFmts", f:parsenoop }, | |
23074 0x0268: { n:"BrtEndFmts", f:parsenoop }, | |
23075 0x0269: { n:"BrtBeginCellXFs", f:parsenoop }, | |
23076 0x026A: { n:"BrtEndCellXFs", f:parsenoop }, | |
23077 0x026B: { n:"BrtBeginStyles", f:parsenoop }, | |
23078 0x026C: { n:"BrtEndStyles", f:parsenoop }, | |
23079 0x0271: { n:"BrtBigName", f:parsenoop }, | |
23080 0x0272: { n:"BrtBeginCellStyleXFs", f:parsenoop }, | |
23081 0x0273: { n:"BrtEndCellStyleXFs", f:parsenoop }, | |
23082 0x0274: { n:"BrtBeginComments", f:parsenoop }, | |
23083 0x0275: { n:"BrtEndComments", f:parsenoop }, | |
23084 0x0276: { n:"BrtBeginCommentAuthors", f:parsenoop }, | |
23085 0x0277: { n:"BrtEndCommentAuthors", f:parsenoop }, | |
23086 0x0278: { n:"BrtCommentAuthor", f:parse_BrtCommentAuthor }, | |
23087 0x0279: { n:"BrtBeginCommentList", f:parsenoop }, | |
23088 0x027A: { n:"BrtEndCommentList", f:parsenoop }, | |
23089 0x027B: { n:"BrtBeginComment", f:parse_BrtBeginComment}, | |
23090 0x027C: { n:"BrtEndComment", f:parsenoop }, | |
23091 0x027D: { n:"BrtCommentText", f:parse_BrtCommentText }, | |
23092 0x027E: { n:"BrtBeginOleObjects", f:parsenoop }, | |
23093 0x027F: { n:"BrtOleObject", f:parsenoop }, | |
23094 0x0280: { n:"BrtEndOleObjects", f:parsenoop }, | |
23095 0x0281: { n:"BrtBeginSxrules", f:parsenoop }, | |
23096 0x0282: { n:"BrtEndSxRules", f:parsenoop }, | |
23097 0x0283: { n:"BrtBeginActiveXControls", f:parsenoop }, | |
23098 0x0284: { n:"BrtActiveX", f:parsenoop }, | |
23099 0x0285: { n:"BrtEndActiveXControls", f:parsenoop }, | |
23100 0x0286: { n:"BrtBeginPCDSDTCEMembersSortBy", f:parsenoop }, | |
23101 0x0288: { n:"BrtBeginCellIgnoreECs", f:parsenoop }, | |
23102 0x0289: { n:"BrtCellIgnoreEC", f:parsenoop }, | |
23103 0x028A: { n:"BrtEndCellIgnoreECs", f:parsenoop }, | |
23104 0x028B: { n:"BrtCsProp", f:parsenoop }, | |
23105 0x028C: { n:"BrtCsPageSetup", f:parsenoop }, | |
23106 0x028D: { n:"BrtBeginUserCsViews", f:parsenoop }, | |
23107 0x028E: { n:"BrtEndUserCsViews", f:parsenoop }, | |
23108 0x028F: { n:"BrtBeginUserCsView", f:parsenoop }, | |
23109 0x0290: { n:"BrtEndUserCsView", f:parsenoop }, | |
23110 0x0291: { n:"BrtBeginPcdSFCIEntries", f:parsenoop }, | |
23111 0x0292: { n:"BrtEndPCDSFCIEntries", f:parsenoop }, | |
23112 0x0293: { n:"BrtPCDSFCIEntry", f:parsenoop }, | |
23113 0x0294: { n:"BrtBeginListParts", f:parsenoop }, | |
23114 0x0295: { n:"BrtListPart", f:parsenoop }, | |
23115 0x0296: { n:"BrtEndListParts", f:parsenoop }, | |
23116 0x0297: { n:"BrtSheetCalcProp", f:parsenoop }, | |
23117 0x0298: { n:"BrtBeginFnGroup", f:parsenoop }, | |
23118 0x0299: { n:"BrtFnGroup", f:parsenoop }, | |
23119 0x029A: { n:"BrtEndFnGroup", f:parsenoop }, | |
23120 0x029B: { n:"BrtSupAddin", f:parsenoop }, | |
23121 0x029C: { n:"BrtSXTDMPOrder", f:parsenoop }, | |
23122 0x029D: { n:"BrtCsProtection", f:parsenoop }, | |
23123 0x029F: { n:"BrtBeginWsSortMap", f:parsenoop }, | |
23124 0x02A0: { n:"BrtEndWsSortMap", f:parsenoop }, | |
23125 0x02A1: { n:"BrtBeginRRSort", f:parsenoop }, | |
23126 0x02A2: { n:"BrtEndRRSort", f:parsenoop }, | |
23127 0x02A3: { n:"BrtRRSortItem", f:parsenoop }, | |
23128 0x02A4: { n:"BrtFileSharingIso", f:parsenoop }, | |
23129 0x02A5: { n:"BrtBookProtectionIso", f:parsenoop }, | |
23130 0x02A6: { n:"BrtSheetProtectionIso", f:parsenoop }, | |
23131 0x02A7: { n:"BrtCsProtectionIso", f:parsenoop }, | |
23132 0x02A8: { n:"BrtRangeProtectionIso", f:parsenoop }, | |
23133 0x0400: { n:"BrtRwDescent", f:parsenoop }, | |
23134 0x0401: { n:"BrtKnownFonts", f:parsenoop }, | |
23135 0x0402: { n:"BrtBeginSXTupleSet", f:parsenoop }, | |
23136 0x0403: { n:"BrtEndSXTupleSet", f:parsenoop }, | |
23137 0x0404: { n:"BrtBeginSXTupleSetHeader", f:parsenoop }, | |
23138 0x0405: { n:"BrtEndSXTupleSetHeader", f:parsenoop }, | |
23139 0x0406: { n:"BrtSXTupleSetHeaderItem", f:parsenoop }, | |
23140 0x0407: { n:"BrtBeginSXTupleSetData", f:parsenoop }, | |
23141 0x0408: { n:"BrtEndSXTupleSetData", f:parsenoop }, | |
23142 0x0409: { n:"BrtBeginSXTupleSetRow", f:parsenoop }, | |
23143 0x040A: { n:"BrtEndSXTupleSetRow", f:parsenoop }, | |
23144 0x040B: { n:"BrtSXTupleSetRowItem", f:parsenoop }, | |
23145 0x040C: { n:"BrtNameExt", f:parsenoop }, | |
23146 0x040D: { n:"BrtPCDH14", f:parsenoop }, | |
23147 0x040E: { n:"BrtBeginPCDCalcMem14", f:parsenoop }, | |
23148 0x040F: { n:"BrtEndPCDCalcMem14", f:parsenoop }, | |
23149 0x0410: { n:"BrtSXTH14", f:parsenoop }, | |
23150 0x0411: { n:"BrtBeginSparklineGroup", f:parsenoop }, | |
23151 0x0412: { n:"BrtEndSparklineGroup", f:parsenoop }, | |
23152 0x0413: { n:"BrtSparkline", f:parsenoop }, | |
23153 0x0414: { n:"BrtSXDI14", f:parsenoop }, | |
23154 0x0415: { n:"BrtWsFmtInfoEx14", f:parsenoop }, | |
23155 0x0416: { n:"BrtBeginConditionalFormatting14", f:parsenoop }, | |
23156 0x0417: { n:"BrtEndConditionalFormatting14", f:parsenoop }, | |
23157 0x0418: { n:"BrtBeginCFRule14", f:parsenoop }, | |
23158 0x0419: { n:"BrtEndCFRule14", f:parsenoop }, | |
23159 0x041A: { n:"BrtCFVO14", f:parsenoop }, | |
23160 0x041B: { n:"BrtBeginDatabar14", f:parsenoop }, | |
23161 0x041C: { n:"BrtBeginIconSet14", f:parsenoop }, | |
23162 0x041D: { n:"BrtDVal14", f:parsenoop }, | |
23163 0x041E: { n:"BrtBeginDVals14", f:parsenoop }, | |
23164 0x041F: { n:"BrtColor14", f:parsenoop }, | |
23165 0x0420: { n:"BrtBeginSparklines", f:parsenoop }, | |
23166 0x0421: { n:"BrtEndSparklines", f:parsenoop }, | |
23167 0x0422: { n:"BrtBeginSparklineGroups", f:parsenoop }, | |
23168 0x0423: { n:"BrtEndSparklineGroups", f:parsenoop }, | |
23169 0x0425: { n:"BrtSXVD14", f:parsenoop }, | |
23170 0x0426: { n:"BrtBeginSxview14", f:parsenoop }, | |
23171 0x0427: { n:"BrtEndSxview14", f:parsenoop }, | |
23172 0x042A: { n:"BrtBeginPCD14", f:parsenoop }, | |
23173 0x042B: { n:"BrtEndPCD14", f:parsenoop }, | |
23174 0x042C: { n:"BrtBeginExtConn14", f:parsenoop }, | |
23175 0x042D: { n:"BrtEndExtConn14", f:parsenoop }, | |
23176 0x042E: { n:"BrtBeginSlicerCacheIDs", f:parsenoop }, | |
23177 0x042F: { n:"BrtEndSlicerCacheIDs", f:parsenoop }, | |
23178 0x0430: { n:"BrtBeginSlicerCacheID", f:parsenoop }, | |
23179 0x0431: { n:"BrtEndSlicerCacheID", f:parsenoop }, | |
23180 0x0433: { n:"BrtBeginSlicerCache", f:parsenoop }, | |
23181 0x0434: { n:"BrtEndSlicerCache", f:parsenoop }, | |
23182 0x0435: { n:"BrtBeginSlicerCacheDef", f:parsenoop }, | |
23183 0x0436: { n:"BrtEndSlicerCacheDef", f:parsenoop }, | |
23184 0x0437: { n:"BrtBeginSlicersEx", f:parsenoop }, | |
23185 0x0438: { n:"BrtEndSlicersEx", f:parsenoop }, | |
23186 0x0439: { n:"BrtBeginSlicerEx", f:parsenoop }, | |
23187 0x043A: { n:"BrtEndSlicerEx", f:parsenoop }, | |
23188 0x043B: { n:"BrtBeginSlicer", f:parsenoop }, | |
23189 0x043C: { n:"BrtEndSlicer", f:parsenoop }, | |
23190 0x043D: { n:"BrtSlicerCachePivotTables", f:parsenoop }, | |
23191 0x043E: { n:"BrtBeginSlicerCacheOlapImpl", f:parsenoop }, | |
23192 0x043F: { n:"BrtEndSlicerCacheOlapImpl", f:parsenoop }, | |
23193 0x0440: { n:"BrtBeginSlicerCacheLevelsData", f:parsenoop }, | |
23194 0x0441: { n:"BrtEndSlicerCacheLevelsData", f:parsenoop }, | |
23195 0x0442: { n:"BrtBeginSlicerCacheLevelData", f:parsenoop }, | |
23196 0x0443: { n:"BrtEndSlicerCacheLevelData", f:parsenoop }, | |
23197 0x0444: { n:"BrtBeginSlicerCacheSiRanges", f:parsenoop }, | |
23198 0x0445: { n:"BrtEndSlicerCacheSiRanges", f:parsenoop }, | |
23199 0x0446: { n:"BrtBeginSlicerCacheSiRange", f:parsenoop }, | |
23200 0x0447: { n:"BrtEndSlicerCacheSiRange", f:parsenoop }, | |
23201 0x0448: { n:"BrtSlicerCacheOlapItem", f:parsenoop }, | |
23202 0x0449: { n:"BrtBeginSlicerCacheSelections", f:parsenoop }, | |
23203 0x044A: { n:"BrtSlicerCacheSelection", f:parsenoop }, | |
23204 0x044B: { n:"BrtEndSlicerCacheSelections", f:parsenoop }, | |
23205 0x044C: { n:"BrtBeginSlicerCacheNative", f:parsenoop }, | |
23206 0x044D: { n:"BrtEndSlicerCacheNative", f:parsenoop }, | |
23207 0x044E: { n:"BrtSlicerCacheNativeItem", f:parsenoop }, | |
23208 0x044F: { n:"BrtRangeProtection14", f:parsenoop }, | |
23209 0x0450: { n:"BrtRangeProtectionIso14", f:parsenoop }, | |
23210 0x0451: { n:"BrtCellIgnoreEC14", f:parsenoop }, | |
23211 0x0457: { n:"BrtList14", f:parsenoop }, | |
23212 0x0458: { n:"BrtCFIcon", f:parsenoop }, | |
23213 0x0459: { n:"BrtBeginSlicerCachesPivotCacheIDs", f:parsenoop }, | |
23214 0x045A: { n:"BrtEndSlicerCachesPivotCacheIDs", f:parsenoop }, | |
23215 0x045B: { n:"BrtBeginSlicers", f:parsenoop }, | |
23216 0x045C: { n:"BrtEndSlicers", f:parsenoop }, | |
23217 0x045D: { n:"BrtWbProp14", f:parsenoop }, | |
23218 0x045E: { n:"BrtBeginSXEdit", f:parsenoop }, | |
23219 0x045F: { n:"BrtEndSXEdit", f:parsenoop }, | |
23220 0x0460: { n:"BrtBeginSXEdits", f:parsenoop }, | |
23221 0x0461: { n:"BrtEndSXEdits", f:parsenoop }, | |
23222 0x0462: { n:"BrtBeginSXChange", f:parsenoop }, | |
23223 0x0463: { n:"BrtEndSXChange", f:parsenoop }, | |
23224 0x0464: { n:"BrtBeginSXChanges", f:parsenoop }, | |
23225 0x0465: { n:"BrtEndSXChanges", f:parsenoop }, | |
23226 0x0466: { n:"BrtSXTupleItems", f:parsenoop }, | |
23227 0x0468: { n:"BrtBeginSlicerStyle", f:parsenoop }, | |
23228 0x0469: { n:"BrtEndSlicerStyle", f:parsenoop }, | |
23229 0x046A: { n:"BrtSlicerStyleElement", f:parsenoop }, | |
23230 0x046B: { n:"BrtBeginStyleSheetExt14", f:parsenoop }, | |
23231 0x046C: { n:"BrtEndStyleSheetExt14", f:parsenoop }, | |
23232 0x046D: { n:"BrtBeginSlicerCachesPivotCacheID", f:parsenoop }, | |
23233 0x046E: { n:"BrtEndSlicerCachesPivotCacheID", f:parsenoop }, | |
23234 0x046F: { n:"BrtBeginConditionalFormattings", f:parsenoop }, | |
23235 0x0470: { n:"BrtEndConditionalFormattings", f:parsenoop }, | |
23236 0x0471: { n:"BrtBeginPCDCalcMemExt", f:parsenoop }, | |
23237 0x0472: { n:"BrtEndPCDCalcMemExt", f:parsenoop }, | |
23238 0x0473: { n:"BrtBeginPCDCalcMemsExt", f:parsenoop }, | |
23239 0x0474: { n:"BrtEndPCDCalcMemsExt", f:parsenoop }, | |
23240 0x0475: { n:"BrtPCDField14", f:parsenoop }, | |
23241 0x0476: { n:"BrtBeginSlicerStyles", f:parsenoop }, | |
23242 0x0477: { n:"BrtEndSlicerStyles", f:parsenoop }, | |
23243 0x0478: { n:"BrtBeginSlicerStyleElements", f:parsenoop }, | |
23244 0x0479: { n:"BrtEndSlicerStyleElements", f:parsenoop }, | |
23245 0x047A: { n:"BrtCFRuleExt", f:parsenoop }, | |
23246 0x047B: { n:"BrtBeginSXCondFmt14", f:parsenoop }, | |
23247 0x047C: { n:"BrtEndSXCondFmt14", f:parsenoop }, | |
23248 0x047D: { n:"BrtBeginSXCondFmts14", f:parsenoop }, | |
23249 0x047E: { n:"BrtEndSXCondFmts14", f:parsenoop }, | |
23250 0x0480: { n:"BrtBeginSortCond14", f:parsenoop }, | |
23251 0x0481: { n:"BrtEndSortCond14", f:parsenoop }, | |
23252 0x0482: { n:"BrtEndDVals14", f:parsenoop }, | |
23253 0x0483: { n:"BrtEndIconSet14", f:parsenoop }, | |
23254 0x0484: { n:"BrtEndDatabar14", f:parsenoop }, | |
23255 0x0485: { n:"BrtBeginColorScale14", f:parsenoop }, | |
23256 0x0486: { n:"BrtEndColorScale14", f:parsenoop }, | |
23257 0x0487: { n:"BrtBeginSxrules14", f:parsenoop }, | |
23258 0x0488: { n:"BrtEndSxrules14", f:parsenoop }, | |
23259 0x0489: { n:"BrtBeginPRule14", f:parsenoop }, | |
23260 0x048A: { n:"BrtEndPRule14", f:parsenoop }, | |
23261 0x048B: { n:"BrtBeginPRFilters14", f:parsenoop }, | |
23262 0x048C: { n:"BrtEndPRFilters14", f:parsenoop }, | |
23263 0x048D: { n:"BrtBeginPRFilter14", f:parsenoop }, | |
23264 0x048E: { n:"BrtEndPRFilter14", f:parsenoop }, | |
23265 0x048F: { n:"BrtBeginPRFItem14", f:parsenoop }, | |
23266 0x0490: { n:"BrtEndPRFItem14", f:parsenoop }, | |
23267 0x0491: { n:"BrtBeginCellIgnoreECs14", f:parsenoop }, | |
23268 0x0492: { n:"BrtEndCellIgnoreECs14", f:parsenoop }, | |
23269 0x0493: { n:"BrtDxf14", f:parsenoop }, | |
23270 0x0494: { n:"BrtBeginDxF14s", f:parsenoop }, | |
23271 0x0495: { n:"BrtEndDxf14s", f:parsenoop }, | |
23272 0x0499: { n:"BrtFilter14", f:parsenoop }, | |
23273 0x049A: { n:"BrtBeginCustomFilters14", f:parsenoop }, | |
23274 0x049C: { n:"BrtCustomFilter14", f:parsenoop }, | |
23275 0x049D: { n:"BrtIconFilter14", f:parsenoop }, | |
23276 0x049E: { n:"BrtPivotCacheConnectionName", f:parsenoop }, | |
23277 0x0800: { n:"BrtBeginDecoupledPivotCacheIDs", f:parsenoop }, | |
23278 0x0801: { n:"BrtEndDecoupledPivotCacheIDs", f:parsenoop }, | |
23279 0x0802: { n:"BrtDecoupledPivotCacheID", f:parsenoop }, | |
23280 0x0803: { n:"BrtBeginPivotTableRefs", f:parsenoop }, | |
23281 0x0804: { n:"BrtEndPivotTableRefs", f:parsenoop }, | |
23282 0x0805: { n:"BrtPivotTableRef", f:parsenoop }, | |
23283 0x0806: { n:"BrtSlicerCacheBookPivotTables", f:parsenoop }, | |
23284 0x0807: { n:"BrtBeginSxvcells", f:parsenoop }, | |
23285 0x0808: { n:"BrtEndSxvcells", f:parsenoop }, | |
23286 0x0809: { n:"BrtBeginSxRow", f:parsenoop }, | |
23287 0x080A: { n:"BrtEndSxRow", f:parsenoop }, | |
23288 0x080C: { n:"BrtPcdCalcMem15", f:parsenoop }, | |
23289 0x0813: { n:"BrtQsi15", f:parsenoop }, | |
23290 0x0814: { n:"BrtBeginWebExtensions", f:parsenoop }, | |
23291 0x0815: { n:"BrtEndWebExtensions", f:parsenoop }, | |
23292 0x0816: { n:"BrtWebExtension", f:parsenoop }, | |
23293 0x0817: { n:"BrtAbsPath15", f:parsenoop }, | |
23294 0x0818: { n:"BrtBeginPivotTableUISettings", f:parsenoop }, | |
23295 0x0819: { n:"BrtEndPivotTableUISettings", f:parsenoop }, | |
23296 0x081B: { n:"BrtTableSlicerCacheIDs", f:parsenoop }, | |
23297 0x081C: { n:"BrtTableSlicerCacheID", f:parsenoop }, | |
23298 0x081D: { n:"BrtBeginTableSlicerCache", f:parsenoop }, | |
23299 0x081E: { n:"BrtEndTableSlicerCache", f:parsenoop }, | |
23300 0x081F: { n:"BrtSxFilter15", f:parsenoop }, | |
23301 0x0820: { n:"BrtBeginTimelineCachePivotCacheIDs", f:parsenoop }, | |
23302 0x0821: { n:"BrtEndTimelineCachePivotCacheIDs", f:parsenoop }, | |
23303 0x0822: { n:"BrtTimelineCachePivotCacheID", f:parsenoop }, | |
23304 0x0823: { n:"BrtBeginTimelineCacheIDs", f:parsenoop }, | |
23305 0x0824: { n:"BrtEndTimelineCacheIDs", f:parsenoop }, | |
23306 0x0825: { n:"BrtBeginTimelineCacheID", f:parsenoop }, | |
23307 0x0826: { n:"BrtEndTimelineCacheID", f:parsenoop }, | |
23308 0x0827: { n:"BrtBeginTimelinesEx", f:parsenoop }, | |
23309 0x0828: { n:"BrtEndTimelinesEx", f:parsenoop }, | |
23310 0x0829: { n:"BrtBeginTimelineEx", f:parsenoop }, | |
23311 0x082A: { n:"BrtEndTimelineEx", f:parsenoop }, | |
23312 0x082B: { n:"BrtWorkBookPr15", f:parsenoop }, | |
23313 0x082C: { n:"BrtPCDH15", f:parsenoop }, | |
23314 0x082D: { n:"BrtBeginTimelineStyle", f:parsenoop }, | |
23315 0x082E: { n:"BrtEndTimelineStyle", f:parsenoop }, | |
23316 0x082F: { n:"BrtTimelineStyleElement", f:parsenoop }, | |
23317 0x0830: { n:"BrtBeginTimelineStylesheetExt15", f:parsenoop }, | |
23318 0x0831: { n:"BrtEndTimelineStylesheetExt15", f:parsenoop }, | |
23319 0x0832: { n:"BrtBeginTimelineStyles", f:parsenoop }, | |
23320 0x0833: { n:"BrtEndTimelineStyles", f:parsenoop }, | |
23321 0x0834: { n:"BrtBeginTimelineStyleElements", f:parsenoop }, | |
23322 0x0835: { n:"BrtEndTimelineStyleElements", f:parsenoop }, | |
23323 0x0836: { n:"BrtDxf15", f:parsenoop }, | |
23324 0x0837: { n:"BrtBeginDxfs15", f:parsenoop }, | |
23325 0x0838: { n:"brtEndDxfs15", f:parsenoop }, | |
23326 0x0839: { n:"BrtSlicerCacheHideItemsWithNoData", f:parsenoop }, | |
23327 0x083A: { n:"BrtBeginItemUniqueNames", f:parsenoop }, | |
23328 0x083B: { n:"BrtEndItemUniqueNames", f:parsenoop }, | |
23329 0x083C: { n:"BrtItemUniqueName", f:parsenoop }, | |
23330 0x083D: { n:"BrtBeginExtConn15", f:parsenoop }, | |
23331 0x083E: { n:"BrtEndExtConn15", f:parsenoop }, | |
23332 0x083F: { n:"BrtBeginOledbPr15", f:parsenoop }, | |
23333 0x0840: { n:"BrtEndOledbPr15", f:parsenoop }, | |
23334 0x0841: { n:"BrtBeginDataFeedPr15", f:parsenoop }, | |
23335 0x0842: { n:"BrtEndDataFeedPr15", f:parsenoop }, | |
23336 0x0843: { n:"BrtTextPr15", f:parsenoop }, | |
23337 0x0844: { n:"BrtRangePr15", f:parsenoop }, | |
23338 0x0845: { n:"BrtDbCommand15", f:parsenoop }, | |
23339 0x0846: { n:"BrtBeginDbTables15", f:parsenoop }, | |
23340 0x0847: { n:"BrtEndDbTables15", f:parsenoop }, | |
23341 0x0848: { n:"BrtDbTable15", f:parsenoop }, | |
23342 0x0849: { n:"BrtBeginDataModel", f:parsenoop }, | |
23343 0x084A: { n:"BrtEndDataModel", f:parsenoop }, | |
23344 0x084B: { n:"BrtBeginModelTables", f:parsenoop }, | |
23345 0x084C: { n:"BrtEndModelTables", f:parsenoop }, | |
23346 0x084D: { n:"BrtModelTable", f:parsenoop }, | |
23347 0x084E: { n:"BrtBeginModelRelationships", f:parsenoop }, | |
23348 0x084F: { n:"BrtEndModelRelationships", f:parsenoop }, | |
23349 0x0850: { n:"BrtModelRelationship", f:parsenoop }, | |
23350 0x0851: { n:"BrtBeginECTxtWiz15", f:parsenoop }, | |
23351 0x0852: { n:"BrtEndECTxtWiz15", f:parsenoop }, | |
23352 0x0853: { n:"BrtBeginECTWFldInfoLst15", f:parsenoop }, | |
23353 0x0854: { n:"BrtEndECTWFldInfoLst15", f:parsenoop }, | |
23354 0x0855: { n:"BrtBeginECTWFldInfo15", f:parsenoop }, | |
23355 0x0856: { n:"BrtFieldListActiveItem", f:parsenoop }, | |
23356 0x0857: { n:"BrtPivotCacheIdVersion", f:parsenoop }, | |
23357 0x0858: { n:"BrtSXDI15", f:parsenoop }, | |
23358 0xFFFF: { n:"", f:parsenoop } | |
19045 }; | 23359 }; |
19046 | 23360 |
19047 /* | 23361 var evert_RE = evert_key(RecordEnum, 'n'); |
19048 * List features that require a modern browser, and if the current browser support them. | 23362 function fix_opts_func(defaults) { |
19049 */ | 23363 return function fix_opts(opts) { |
19050 JSZip.support = { | 23364 for(var i = 0; i != defaults.length; ++i) { |
19051 // contains true if JSZip can read/generate ArrayBuffer, false otherwise. | 23365 var d = defaults[i]; |
19052 arraybuffer : (function(){ | 23366 if(opts[d[0]] === undefined) opts[d[0]] = d[1]; |
19053 return typeof ArrayBuffer !== "undefined" && typeof Uint8Array !== "undefined"; | 23367 if(d[2] === 'n') opts[d[0]] = Number(opts[d[0]]); |
19054 })(), | 23368 } |
19055 // contains true if JSZip can read/generate Uint8Array, false otherwise. | 23369 }; |
19056 uint8array : (function(){ | 23370 } |
19057 return typeof Uint8Array !== "undefined"; | 23371 |
19058 })(), | 23372 var fix_read_opts = fix_opts_func([ |
19059 // contains true if JSZip can read/generate Blob, false otherwise. | 23373 ['cellNF', false], /* emit cell number format string as .z */ |
19060 blob : (function(){ | 23374 ['cellHTML', true], /* emit html string as .h */ |
19061 // the spec started with BlobBuilder then replaced it with a construtor for Blob. | 23375 ['cellFormula', true], /* emit formulae as .f */ |
19062 // Result : we have browsers that : | 23376 ['cellStyles', false], /* emits style/theme as .s */ |
19063 // * know the BlobBuilder (but with prefix) | 23377 |
19064 // * know the Blob constructor | 23378 ['sheetStubs', false], /* emit empty cells */ |
19065 // * know about Blob but not about how to build them | 23379 ['sheetRows', 0, 'n'], /* read n rows (0 = read all rows) */ |
19066 // About the "=== 0" test : if given the wrong type, it may be converted to a string. | 23380 |
19067 // Instead of an empty content, we will get "[object Uint8Array]" for example. | 23381 ['bookDeps', false], /* parse calculation chains */ |
19068 if (typeof ArrayBuffer === "undefined") { | 23382 ['bookSheets', false], /* only try to get sheet names (no Sheets) */ |
19069 return false; | 23383 ['bookProps', false], /* only try to get properties (no Sheets) */ |
19070 } | 23384 ['bookFiles', false], /* include raw file structure (keys, files) */ |
19071 var buffer = new ArrayBuffer(0); | 23385 ['bookVBA', false], /* include vba raw data (vbaraw) */ |
19072 try { | 23386 |
19073 return new Blob([buffer], { type: "application/zip" }).size === 0; | 23387 ['WTF', false] /* WTF mode (throws errors) */ |
19074 } | 23388 ]); |
19075 catch(e) {} | 23389 |
19076 | 23390 |
19077 try { | 23391 var fix_write_opts = fix_opts_func([ |
19078 var builder = new (window.BlobBuilder || window.WebKitBlobBuilder || | 23392 ['bookSST', false], /* Generate Shared String Table */ |
19079 window.MozBlobBuilder || window.MSBlobBuilder)(); | 23393 |
19080 builder.append(buffer); | 23394 ['bookType', 'xlsx'], /* Type of workbook (xlsx/m/b) */ |
19081 return builder.getBlob('application/zip').size === 0; | 23395 |
19082 } | 23396 ['WTF', false] /* WTF mode (throws errors) */ |
19083 catch(e) {} | 23397 ]); |
19084 | 23398 function safe_parse_wbrels(wbrels, sheets) { |
19085 return false; | 23399 if(!wbrels) return 0; |
19086 })() | 23400 try { |
23401 wbrels = sheets.map(function pwbr(w) { return [w.name, wbrels['!id'][w.id].Target]; }); | |
23402 } catch(e) { return null; } | |
23403 return !wbrels || wbrels.length === 0 ? null : wbrels; | |
23404 } | |
23405 | |
23406 function safe_parse_ws(zip, path, relsPath, sheet, sheetRels, sheets, opts) { | |
23407 try { | |
23408 sheetRels[sheet]=parse_rels(getzipdata(zip, relsPath, true), path); | |
23409 sheets[sheet]=parse_ws(getzipdata(zip, path),path,opts,sheetRels[sheet]); | |
23410 } catch(e) { if(opts.WTF) throw e; } | |
23411 } | |
23412 | |
23413 var nodirs = function nodirs(x){return x.substr(-1) != '/';}; | |
23414 function parse_zip(zip, opts) { | |
23415 make_ssf(SSF); | |
23416 opts = opts || {}; | |
23417 fix_read_opts(opts); | |
23418 reset_cp(); | |
23419 var entries = keys(zip.files).filter(nodirs).sort(); | |
23420 var dir = parse_ct(getzipdata(zip, '[Content_Types].xml'), opts); | |
23421 var xlsb = false; | |
23422 var sheets, binname; | |
23423 if(dir.workbooks.length === 0) { | |
23424 binname = "xl/workbook.xml"; | |
23425 if(getzipdata(zip,binname, true)) dir.workbooks.push(binname); | |
23426 } | |
23427 if(dir.workbooks.length === 0) { | |
23428 binname = "xl/workbook.bin"; | |
23429 if(!getzipfile(zip,binname,true)) throw new Error("Could not find workbook"); | |
23430 dir.workbooks.push(binname); | |
23431 xlsb = true; | |
23432 } | |
23433 if(dir.workbooks[0].substr(-3) == "bin") xlsb = true; | |
23434 if(xlsb) set_cp(1200); | |
23435 | |
23436 if(!opts.bookSheets && !opts.bookProps) { | |
23437 strs = []; | |
23438 if(dir.sst) strs=parse_sst(getzipdata(zip, dir.sst.replace(/^\//,'')), dir.sst, opts); | |
23439 | |
23440 styles = {}; | |
23441 if(dir.style) styles = parse_sty(getzipdata(zip, dir.style.replace(/^\//,'')),dir.style, opts); | |
23442 | |
23443 themes = {}; | |
23444 if(opts.cellStyles && dir.themes.length) themes = parse_theme(getzipdata(zip, dir.themes[0].replace(/^\//,''), true),dir.themes[0], opts); | |
23445 } | |
23446 | |
23447 var wb = parse_wb(getzipdata(zip, dir.workbooks[0].replace(/^\//,'')), dir.workbooks[0], opts); | |
23448 | |
23449 var props = {}, propdata = ""; | |
23450 | |
23451 if(dir.coreprops.length !== 0) { | |
23452 propdata = getzipdata(zip, dir.coreprops[0].replace(/^\//,''), true); | |
23453 if(propdata) props = parse_core_props(propdata); | |
23454 if(dir.extprops.length !== 0) { | |
23455 propdata = getzipdata(zip, dir.extprops[0].replace(/^\//,''), true); | |
23456 if(propdata) parse_ext_props(propdata, props); | |
23457 } | |
23458 } | |
23459 | |
23460 var custprops = {}; | |
23461 if(!opts.bookSheets || opts.bookProps) { | |
23462 if (dir.custprops.length !== 0) { | |
23463 propdata = getzipdata(zip, dir.custprops[0].replace(/^\//,''), true); | |
23464 if(propdata) custprops = parse_cust_props(propdata, opts); | |
23465 } | |
23466 } | |
23467 | |
23468 var out = {}; | |
23469 if(opts.bookSheets || opts.bookProps) { | |
23470 if(props.Worksheets && props.SheetNames.length > 0) sheets=props.SheetNames; | |
23471 else if(wb.Sheets) sheets = wb.Sheets.map(function pluck(x){ return x.name; }); | |
23472 if(opts.bookProps) { out.Props = props; out.Custprops = custprops; } | |
23473 if(typeof sheets !== 'undefined') out.SheetNames = sheets; | |
23474 if(opts.bookSheets ? out.SheetNames : opts.bookProps) return out; | |
23475 } | |
23476 sheets = {}; | |
23477 | |
23478 var deps = {}; | |
23479 if(opts.bookDeps && dir.calcchain) deps=parse_cc(getzipdata(zip, dir.calcchain.replace(/^\//,'')),dir.calcchain,opts); | |
23480 | |
23481 var i=0; | |
23482 var sheetRels = {}; | |
23483 var path, relsPath; | |
23484 if(!props.Worksheets) { | |
23485 var wbsheets = wb.Sheets; | |
23486 props.Worksheets = wbsheets.length; | |
23487 props.SheetNames = []; | |
23488 for(var j = 0; j != wbsheets.length; ++j) { | |
23489 props.SheetNames[j] = wbsheets[j].name; | |
23490 } | |
23491 } | |
23492 | |
23493 var wbext = xlsb ? "bin" : "xml"; | |
23494 var wbrelsfile = 'xl/_rels/workbook.' + wbext + '.rels'; | |
23495 var wbrels = parse_rels(getzipdata(zip, wbrelsfile, true), wbrelsfile); | |
23496 if(wbrels) wbrels = safe_parse_wbrels(wbrels, wb.Sheets); | |
23497 /* Numbers iOS hack */ | |
23498 var nmode = (getzipdata(zip,"xl/worksheets/sheet.xml",true))?1:0; | |
23499 for(i = 0; i != props.Worksheets; ++i) { | |
23500 if(wbrels) path = 'xl/' + (wbrels[i][1]).replace(/[\/]?xl\//, ""); | |
23501 else { | |
23502 path = 'xl/worksheets/sheet'+(i+1-nmode)+"." + wbext; | |
23503 path = path.replace(/sheet0\./,"sheet."); | |
23504 } | |
23505 relsPath = path.replace(/^(.*)(\/)([^\/]*)$/, "$1/_rels/$3.rels"); | |
23506 safe_parse_ws(zip, path, relsPath, props.SheetNames[i], sheetRels, sheets, opts); | |
23507 } | |
23508 | |
23509 if(dir.comments) parse_comments(zip, dir.comments, sheets, sheetRels, opts); | |
23510 | |
23511 out = { | |
23512 Directory: dir, | |
23513 Workbook: wb, | |
23514 Props: props, | |
23515 Custprops: custprops, | |
23516 Deps: deps, | |
23517 Sheets: sheets, | |
23518 SheetNames: props.SheetNames, | |
23519 Strings: strs, | |
23520 Styles: styles, | |
23521 Themes: themes, | |
23522 SSF: SSF.get_table() | |
23523 }; | |
23524 if(opts.bookFiles) { | |
23525 out.keys = entries; | |
23526 out.files = zip.files; | |
23527 } | |
23528 if(opts.bookVBA) { | |
23529 if(dir.vba.length > 0) out.vbaraw = getzipdata(zip,dir.vba[0],true); | |
23530 else if(dir.defaults.bin === 'application/vnd.ms-office.vbaProject') out.vbaraw = getzipdata(zip,'xl/vbaProject.bin',true); | |
23531 } | |
23532 return out; | |
23533 } | |
23534 function add_rels(rels, rId, f, type, relobj) { | |
23535 if(!relobj) relobj = {}; | |
23536 if(!rels['!id']) rels['!id'] = {}; | |
23537 relobj.Id = 'rId' + rId; | |
23538 relobj.Type = type; | |
23539 relobj.Target = f; | |
23540 if(rels['!id'][relobj.Id]) throw new Error("Cannot rewrite rId " + rId); | |
23541 rels['!id'][relobj.Id] = relobj; | |
23542 rels[('/' + relobj.Target).replace("//","/")] = relobj; | |
23543 } | |
23544 | |
23545 function write_zip(wb, opts) { | |
23546 if(wb && !wb.SSF) { | |
23547 wb.SSF = SSF.get_table(); | |
23548 } | |
23549 if(wb && wb.SSF) { | |
23550 make_ssf(SSF); SSF.load_table(wb.SSF); | |
23551 opts.revssf = evert_num(wb.SSF); opts.revssf[wb.SSF[65535]] = 0; | |
23552 } | |
23553 opts.rels = {}; opts.wbrels = {}; | |
23554 opts.Strings = []; opts.Strings.Count = 0; opts.Strings.Unique = 0; | |
23555 var wbext = opts.bookType == "xlsb" ? "bin" : "xml"; | |
23556 var ct = { workbooks: [], sheets: [], calcchains: [], themes: [], styles: [], | |
23557 coreprops: [], extprops: [], custprops: [], strs:[], comments: [], vba: [], | |
23558 TODO:[], rels:[], xmlns: "" }; | |
23559 fix_write_opts(opts = opts || {}); | |
23560 var zip = new jszip(); | |
23561 var f = "", rId = 0; | |
23562 | |
23563 opts.cellXfs = []; | |
23564 get_cell_style(opts.cellXfs, {}, {revssf:{"General":0}}); | |
23565 | |
23566 f = "docProps/core.xml"; | |
23567 zip.file(f, write_core_props(wb.Props, opts)); | |
23568 ct.coreprops.push(f); | |
23569 add_rels(opts.rels, 2, f, RELS.CORE_PROPS); | |
23570 | |
23571 f = "docProps/app.xml"; | |
23572 if(!wb.Props) wb.Props = {}; | |
23573 wb.Props.SheetNames = wb.SheetNames; | |
23574 wb.Props.Worksheets = wb.SheetNames.length; | |
23575 zip.file(f, write_ext_props(wb.Props, opts)); | |
23576 ct.extprops.push(f); | |
23577 add_rels(opts.rels, 3, f, RELS.EXT_PROPS); | |
23578 | |
23579 if(wb.Custprops !== wb.Props && keys(wb.Custprops||{}).length > 0) { | |
23580 f = "docProps/custom.xml"; | |
23581 zip.file(f, write_cust_props(wb.Custprops, opts)); | |
23582 ct.custprops.push(f); | |
23583 add_rels(opts.rels, 4, f, RELS.CUST_PROPS); | |
23584 } | |
23585 | |
23586 f = "xl/workbook." + wbext; | |
23587 zip.file(f, write_wb(wb, f, opts)); | |
23588 ct.workbooks.push(f); | |
23589 add_rels(opts.rels, 1, f, RELS.WB); | |
23590 | |
23591 for(rId=1;rId <= wb.SheetNames.length; ++rId) { | |
23592 f = "xl/worksheets/sheet" + rId + "." + wbext; | |
23593 zip.file(f, write_ws(rId-1, f, opts, wb)); | |
23594 ct.sheets.push(f); | |
23595 add_rels(opts.wbrels, rId, "worksheets/sheet" + rId + "." + wbext, RELS.WS); | |
23596 } | |
23597 | |
23598 if(opts.Strings != null && opts.Strings.length > 0) { | |
23599 f = "xl/sharedStrings." + wbext; | |
23600 zip.file(f, write_sst(opts.Strings, f, opts)); | |
23601 ct.strs.push(f); | |
23602 add_rels(opts.wbrels, ++rId, "sharedStrings." + wbext, RELS.SST); | |
23603 } | |
23604 | |
23605 /* TODO: something more intelligent with themes */ | |
23606 | |
23607 f = "xl/theme/theme1.xml"; | |
23608 zip.file(f, write_theme()); | |
23609 ct.themes.push(f); | |
23610 add_rels(opts.wbrels, ++rId, "theme/theme1.xml", RELS.THEME); | |
23611 | |
23612 /* TODO: something more intelligent with styles */ | |
23613 | |
23614 f = "xl/styles." + wbext; | |
23615 zip.file(f, write_sty(wb, f, opts)); | |
23616 ct.styles.push(f); | |
23617 add_rels(opts.wbrels, ++rId, "styles." + wbext, RELS.STY); | |
23618 | |
23619 zip.file("[Content_Types].xml", write_ct(ct, opts)); | |
23620 zip.file('_rels/.rels', write_rels(opts.rels)); | |
23621 zip.file('xl/_rels/workbook.' + wbext + '.rels', write_rels(opts.wbrels)); | |
23622 return zip; | |
23623 } | |
23624 function readSync(data, opts) { | |
23625 var zip, d = data; | |
23626 var o = opts||{}; | |
23627 if(!o.type) o.type = (has_buf && Buffer.isBuffer(data)) ? "buffer" : "base64"; | |
23628 switch(o.type) { | |
23629 case "base64": zip = new jszip(d, { base64:true }); break; | |
23630 case "binary": zip = new jszip(d, { base64:false }); break; | |
23631 case "buffer": zip = new jszip(d); break; | |
23632 case "file": zip=new jszip(d=_fs.readFileSync(data)); break; | |
23633 default: throw new Error("Unrecognized type " + o.type); | |
23634 } | |
23635 return parse_zip(zip, o); | |
23636 } | |
23637 | |
23638 function readFileSync(data, opts) { | |
23639 var o = opts||{}; o.type = 'file'; | |
23640 return readSync(data, o); | |
23641 } | |
23642 | |
23643 function writeSync(wb, opts) { | |
23644 var o = opts||{}; | |
23645 var z = write_zip(wb, o); | |
23646 switch(o.type) { | |
23647 case "base64": return z.generate({type:"base64"}); | |
23648 case "binary": return z.generate({type:"string"}); | |
23649 case "buffer": return z.generate({type:"nodebuffer"}); | |
23650 case "file": return _fs.writeFileSync(o.file, z.generate({type:"nodebuffer"})); | |
23651 default: throw new Error("Unrecognized type " + o.type); | |
23652 } | |
23653 } | |
23654 | |
23655 function writeFileSync(wb, filename, opts) { | |
23656 var o = opts||{}; o.type = 'file'; | |
23657 o.file = filename; | |
23658 switch(o.file.substr(-5).toLowerCase()) { | |
23659 case '.xlsm': o.bookType = 'xlsm'; break; | |
23660 case '.xlsb': o.bookType = 'xlsb'; break; | |
23661 } | |
23662 return writeSync(wb, o); | |
23663 } | |
23664 | |
23665 function decode_row(rowstr) { return parseInt(unfix_row(rowstr),10) - 1; } | |
23666 function encode_row(row) { return "" + (row + 1); } | |
23667 function fix_row(cstr) { return cstr.replace(/([A-Z]|^)(\d+)$/,"$1$$$2"); } | |
23668 function unfix_row(cstr) { return cstr.replace(/\$(\d+)$/,"$1"); } | |
23669 | |
23670 function decode_col(colstr) { var c = unfix_col(colstr), d = 0, i = 0; for(; i !== c.length; ++i) d = 26*d + c.charCodeAt(i) - 64; return d - 1; } | |
23671 function encode_col(col) { var s=""; for(++col; col; col=Math.floor((col-1)/26)) s = String.fromCharCode(((col-1)%26) + 65) + s; return s; } | |
23672 function fix_col(cstr) { return cstr.replace(/^([A-Z])/,"$$$1"); } | |
23673 function unfix_col(cstr) { return cstr.replace(/^\$([A-Z])/,"$1"); } | |
23674 | |
23675 function split_cell(cstr) { return cstr.replace(/(\$?[A-Z]*)(\$?\d*)/,"$1,$2").split(","); } | |
23676 function decode_cell(cstr) { var splt = split_cell(cstr); return { c:decode_col(splt[0]), r:decode_row(splt[1]) }; } | |
23677 function encode_cell(cell) { return encode_col(cell.c) + encode_row(cell.r); } | |
23678 function fix_cell(cstr) { return fix_col(fix_row(cstr)); } | |
23679 function unfix_cell(cstr) { return unfix_col(unfix_row(cstr)); } | |
23680 function decode_range(range) { var x =range.split(":").map(decode_cell); return {s:x[0],e:x[x.length-1]}; } | |
23681 function encode_range(cs,ce) { | |
23682 if(ce === undefined || typeof ce === 'number') return encode_range(cs.s, cs.e); | |
23683 if(typeof cs !== 'string') cs = encode_cell(cs); if(typeof ce !== 'string') ce = encode_cell(ce); | |
23684 return cs == ce ? cs : cs + ":" + ce; | |
23685 } | |
23686 | |
23687 function safe_decode_range(range) { | |
23688 var o = {s:{c:0,r:0},e:{c:0,r:0}}; | |
23689 var idx = 0, i = 0, cc = 0; | |
23690 var len = range.length; | |
23691 for(idx = 0; i < len; ++i) { | |
23692 if((cc=range.charCodeAt(i)-64) < 1 || cc > 26) break; | |
23693 idx = 26*idx + cc; | |
23694 } | |
23695 o.s.c = --idx; | |
23696 | |
23697 for(idx = 0; i < len; ++i) { | |
23698 if((cc=range.charCodeAt(i)-48) < 0 || cc > 9) break; | |
23699 idx = 10*idx + cc; | |
23700 } | |
23701 o.s.r = --idx; | |
23702 | |
23703 if(i === len || range.charCodeAt(++i) === 58) { o.e.c=o.s.c; o.e.r=o.s.r; return o; } | |
23704 | |
23705 for(idx = 0; i != len; ++i) { | |
23706 if((cc=range.charCodeAt(i)-64) < 1 || cc > 26) break; | |
23707 idx = 26*idx + cc; | |
23708 } | |
23709 o.e.c = --idx; | |
23710 | |
23711 for(idx = 0; i != len; ++i) { | |
23712 if((cc=range.charCodeAt(i)-48) < 0 || cc > 9) break; | |
23713 idx = 10*idx + cc; | |
23714 } | |
23715 o.e.r = --idx; | |
23716 return o; | |
23717 } | |
23718 | |
23719 function safe_format_cell(cell, v) { | |
23720 if(cell.z !== undefined) try { return (cell.w = SSF.format(cell.z, v)); } catch(e) { } | |
23721 if(!cell.XF) return v; | |
23722 try { return (cell.w = SSF.format(cell.XF.ifmt||0, v)); } catch(e) { return ''+v; } | |
23723 } | |
23724 | |
23725 function format_cell(cell, v) { | |
23726 if(cell == null || cell.t == null) return ""; | |
23727 if(cell.w !== undefined) return cell.w; | |
23728 if(v === undefined) return safe_format_cell(cell, cell.v); | |
23729 return safe_format_cell(cell, v); | |
23730 } | |
23731 | |
23732 function sheet_to_json(sheet, opts){ | |
23733 var val, row, range, header = 0, offset = 1, r, hdr = [], isempty, R, C, v; | |
23734 var o = opts != null ? opts : {}; | |
23735 var raw = o.raw; | |
23736 if(sheet == null || sheet["!ref"] == null) return []; | |
23737 range = o.range !== undefined ? o.range : sheet["!ref"]; | |
23738 if(o.header === 1) header = 1; | |
23739 else if(o.header === "A") header = 2; | |
23740 else if(Array.isArray(o.header)) header = 3; | |
23741 switch(typeof range) { | |
23742 case 'string': r = safe_decode_range(range); break; | |
23743 case 'number': r = safe_decode_range(sheet["!ref"]); r.s.r = range; break; | |
23744 default: r = range; | |
23745 } | |
23746 if(header > 0) offset = 0; | |
23747 var rr = encode_row(r.s.r); | |
23748 var cols = new Array(r.e.c-r.s.c+1); | |
23749 var out = new Array(r.e.r-r.s.r-offset+1); | |
23750 var outi = 0; | |
23751 for(C = r.s.c; C <= r.e.c; ++C) { | |
23752 cols[C] = encode_col(C); | |
23753 val = sheet[cols[C] + rr]; | |
23754 switch(header) { | |
23755 case 1: hdr[C] = C; break; | |
23756 case 2: hdr[C] = cols[C]; break; | |
23757 case 3: hdr[C] = o.header[C - r.s.c]; break; | |
23758 default: | |
23759 if(val === undefined) continue; | |
23760 hdr[C] = format_cell(val); | |
23761 } | |
23762 } | |
23763 | |
23764 for (R = r.s.r + offset; R <= r.e.r; ++R) { | |
23765 rr = encode_row(R); | |
23766 isempty = true; | |
23767 row = header === 1 ? [] : Object.create({ __rowNum__ : R }); | |
23768 for (C = r.s.c; C <= r.e.c; ++C) { | |
23769 val = sheet[cols[C] + rr]; | |
23770 if(val === undefined || val.t === undefined) continue; | |
23771 v = val.v; | |
23772 switch(val.t){ | |
23773 case 'e': continue; | |
23774 case 's': case 'str': break; | |
23775 case 'b': case 'n': break; | |
23776 default: throw 'unrecognized type ' + val.t; | |
23777 } | |
23778 if(v !== undefined) { | |
23779 row[hdr[C]] = raw ? v : format_cell(val,v); | |
23780 isempty = false; | |
23781 } | |
23782 } | |
23783 if(isempty === false) out[outi++] = row; | |
23784 } | |
23785 out.length = outi; | |
23786 return out; | |
23787 } | |
23788 | |
23789 function sheet_to_row_object_array(sheet, opts) { return sheet_to_json(sheet, opts != null ? opts : {}); } | |
23790 | |
23791 function sheet_to_csv(sheet, opts) { | |
23792 var out = "", txt = "", qreg = /"/g; | |
23793 var o = opts == null ? {} : opts; | |
23794 if(sheet == null || sheet["!ref"] == null) return ""; | |
23795 var r = safe_decode_range(sheet["!ref"]); | |
23796 var FS = o.FS !== undefined ? o.FS : ",", fs = FS.charCodeAt(0); | |
23797 var RS = o.RS !== undefined ? o.RS : "\n", rs = RS.charCodeAt(0); | |
23798 var row = "", rr = "", cols = []; | |
23799 var i = 0, cc = 0, val; | |
23800 var R = 0, C = 0; | |
23801 for(C = r.s.c; C <= r.e.c; ++C) cols[C] = encode_col(C); | |
23802 for(R = r.s.r; R <= r.e.r; ++R) { | |
23803 row = ""; | |
23804 rr = encode_row(R); | |
23805 for(C = r.s.c; C <= r.e.c; ++C) { | |
23806 val = sheet[cols[C] + rr]; | |
23807 txt = val !== undefined ? ''+format_cell(val) : ""; | |
23808 for(i = 0, cc = 0; i !== txt.length; ++i) if((cc = txt.charCodeAt(i)) === fs || cc === rs || cc === 34) { | |
23809 txt = "\"" + txt.replace(qreg, '""') + "\""; break; } | |
23810 row += (C === r.s.c ? "" : FS) + txt; | |
23811 } | |
23812 out += row + RS; | |
23813 } | |
23814 return out; | |
23815 } | |
23816 var make_csv = sheet_to_csv; | |
23817 | |
23818 function sheet_to_formulae(sheet) { | |
23819 var cmds, y = "", x, val=""; | |
23820 if(sheet == null || sheet["!ref"] == null) return ""; | |
23821 var r = safe_decode_range(sheet['!ref']), rr = "", cols = [], C; | |
23822 cmds = new Array((r.e.r-r.s.r+1)*(r.e.c-r.s.c+1)); | |
23823 var i = 0; | |
23824 for(C = r.s.c; C <= r.e.c; ++C) cols[C] = encode_col(C); | |
23825 for(var R = r.s.r; R <= r.e.r; ++R) { | |
23826 rr = encode_row(R); | |
23827 for(C = r.s.c; C <= r.e.c; ++C) { | |
23828 y = cols[C] + rr; | |
23829 x = sheet[y]; | |
23830 val = ""; | |
23831 if(x === undefined) continue; | |
23832 if(x.f != null) val = x.f; | |
23833 else if(x.w !== undefined) val = "'" + x.w; | |
23834 else if(x.v === undefined) continue; | |
23835 else val = ""+x.v; | |
23836 cmds[i++] = y + "=" + val; | |
23837 } | |
23838 } | |
23839 cmds.length = i; | |
23840 return cmds; | |
23841 } | |
23842 | |
23843 var utils = { | |
23844 encode_col: encode_col, | |
23845 encode_row: encode_row, | |
23846 encode_cell: encode_cell, | |
23847 encode_range: encode_range, | |
23848 decode_col: decode_col, | |
23849 decode_row: decode_row, | |
23850 split_cell: split_cell, | |
23851 decode_cell: decode_cell, | |
23852 decode_range: decode_range, | |
23853 format_cell: format_cell, | |
23854 get_formulae: sheet_to_formulae, | |
23855 make_csv: sheet_to_csv, | |
23856 make_json: sheet_to_json, | |
23857 make_formulae: sheet_to_formulae, | |
23858 sheet_to_csv: sheet_to_csv, | |
23859 sheet_to_json: sheet_to_json, | |
23860 sheet_to_formulae: sheet_to_formulae, | |
23861 sheet_to_row_object_array: sheet_to_row_object_array | |
19087 }; | 23862 }; |
19088 | 23863 XLSX.parseZip = parse_zip; |
19089 JSZip.utils = { | 23864 XLSX.read = readSync; |
19090 /** | 23865 XLSX.readFile = readFileSync; |
19091 * Convert a string to a "binary string" : a string containing only char codes between 0 and 255. | 23866 XLSX.write = writeSync; |
19092 * @param {string} str the string to transform. | 23867 XLSX.writeFile = writeFileSync; |
19093 * @return {String} the binary string. | 23868 XLSX.utils = utils; |
19094 */ | 23869 XLSX.SSF = SSF; |
19095 string2binary : function (str) { | 23870 })(typeof exports !== 'undefined' ? exports : XLSX); |
19096 var result = ""; | |
19097 for (var i = 0; i < str.length; i++) { | |
19098 result += String.fromCharCode(str.charCodeAt(i) & 0xff); | |
19099 } | |
19100 return result; | |
19101 }, | |
19102 /** | |
19103 * Create a Uint8Array from the string. | |
19104 * @param {string} str the string to transform. | |
19105 * @return {Uint8Array} the typed array. | |
19106 * @throws {Error} an Error if the browser doesn't support the requested feature. | |
19107 */ | |
19108 string2Uint8Array : function (str) { | |
19109 if (!JSZip.support.uint8array) { | |
19110 throw new Error("Uint8Array is not supported by this browser"); | |
19111 } | |
19112 var buffer = new ArrayBuffer(str.length); | |
19113 var bufferView = new Uint8Array(buffer); | |
19114 for(var i = 0; i < str.length; i++) { | |
19115 bufferView[i] = str.charCodeAt(i); | |
19116 } | |
19117 | |
19118 return bufferView; | |
19119 }, | |
19120 | |
19121 /** | |
19122 * Create a string from the Uint8Array. | |
19123 * @param {Uint8Array} array the array to transform. | |
19124 * @return {string} the string. | |
19125 * @throws {Error} an Error if the browser doesn't support the requested feature. | |
19126 */ | |
19127 uint8Array2String : function (array) { | |
19128 if (!JSZip.support.uint8array) { | |
19129 throw new Error("Uint8Array is not supported by this browser"); | |
19130 } | |
19131 var result = ""; | |
19132 for(var i = 0; i < array.length; i++) { | |
19133 result += String.fromCharCode(array[i]); | |
19134 } | |
19135 | |
19136 return result; | |
19137 }, | |
19138 /** | |
19139 * Create a blob from the given string. | |
19140 * @param {string} str the string to transform. | |
19141 * @return {Blob} the string. | |
19142 * @throws {Error} an Error if the browser doesn't support the requested feature. | |
19143 */ | |
19144 string2Blob : function (str) { | |
19145 if (!JSZip.support.blob) { | |
19146 throw new Error("Blob is not supported by this browser"); | |
19147 } | |
19148 | |
19149 var buffer = JSZip.utils.string2Uint8Array(str).buffer; | |
19150 try { | |
19151 // Blob constructor | |
19152 return new Blob([buffer], { type: "application/zip" }); | |
19153 } | |
19154 catch(e) {} | |
19155 | |
19156 try { | |
19157 // deprecated, browser only, old way | |
19158 var builder = new (window.BlobBuilder || window.WebKitBlobBuilder || | |
19159 window.MozBlobBuilder || window.MSBlobBuilder)(); | |
19160 builder.append(buffer); | |
19161 return builder.getBlob('application/zip'); | |
19162 } | |
19163 catch(e) {} | |
19164 | |
19165 // well, fuck ?! | |
19166 throw new Error("Bug : can't construct the Blob."); | |
19167 } | |
19168 }; | |
19169 | |
19170 /** | |
19171 * | |
19172 * Base64 encode / decode | |
19173 * http://www.webtoolkit.info/ | |
19174 * | |
19175 * Hacked so that it doesn't utf8 en/decode everything | |
19176 **/ | |
19177 var JSZipBase64 = (function() { | |
19178 // private property | |
19179 var _keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; | |
19180 | |
19181 return { | |
19182 // public method for encoding | |
19183 encode : function(input, utf8) { | |
19184 var output = ""; | |
19185 var chr1, chr2, chr3, enc1, enc2, enc3, enc4; | |
19186 var i = 0; | |
19187 | |
19188 while (i < input.length) { | |
19189 | |
19190 chr1 = input.charCodeAt(i++); | |
19191 chr2 = input.charCodeAt(i++); | |
19192 chr3 = input.charCodeAt(i++); | |
19193 | |
19194 enc1 = chr1 >> 2; | |
19195 enc2 = ((chr1 & 3) << 4) | (chr2 >> 4); | |
19196 enc3 = ((chr2 & 15) << 2) | (chr3 >> 6); | |
19197 enc4 = chr3 & 63; | |
19198 | |
19199 if (isNaN(chr2)) { | |
19200 enc3 = enc4 = 64; | |
19201 } else if (isNaN(chr3)) { | |
19202 enc4 = 64; | |
19203 } | |
19204 | |
19205 output = output + | |
19206 _keyStr.charAt(enc1) + _keyStr.charAt(enc2) + | |
19207 _keyStr.charAt(enc3) + _keyStr.charAt(enc4); | |
19208 | |
19209 } | |
19210 | |
19211 return output; | |
19212 }, | |
19213 | |
19214 // public method for decoding | |
19215 decode : function(input, utf8) { | |
19216 var output = ""; | |
19217 var chr1, chr2, chr3; | |
19218 var enc1, enc2, enc3, enc4; | |
19219 var i = 0; | |
19220 | |
19221 input = input.replace(/[^A-Za-z0-9\+\/\=]/g, ""); | |
19222 | |
19223 while (i < input.length) { | |
19224 | |
19225 enc1 = _keyStr.indexOf(input.charAt(i++)); | |
19226 enc2 = _keyStr.indexOf(input.charAt(i++)); | |
19227 enc3 = _keyStr.indexOf(input.charAt(i++)); | |
19228 enc4 = _keyStr.indexOf(input.charAt(i++)); | |
19229 | |
19230 chr1 = (enc1 << 2) | (enc2 >> 4); | |
19231 chr2 = ((enc2 & 15) << 4) | (enc3 >> 2); | |
19232 chr3 = ((enc3 & 3) << 6) | enc4; | |
19233 | |
19234 output = output + String.fromCharCode(chr1); | |
19235 | |
19236 if (enc3 != 64) { | |
19237 output = output + String.fromCharCode(chr2); | |
19238 } | |
19239 if (enc4 != 64) { | |
19240 output = output + String.fromCharCode(chr3); | |
19241 } | |
19242 | |
19243 } | |
19244 | |
19245 return output; | |
19246 | |
19247 } | |
19248 }; | |
19249 }()); | |
19250 | |
19251 // enforcing Stuk's coding style | |
19252 // vim: set shiftwidth=3 softtabstop=3: | |
19253 /* | |
19254 * Port of a script by Masanao Izumo. | |
19255 * | |
19256 * Only changes : wrap all the variables in a function and add the | |
19257 * main function to JSZip (DEFLATE compression method). | |
19258 * Everything else was written by M. Izumo. | |
19259 * | |
19260 * Original code can be found here: http://www.onicos.com/staff/iz/amuse/javascript/expert/deflate.txt | |
19261 */ | |
19262 | |
19263 if(!JSZip) { | |
19264 throw "JSZip not defined"; | |
19265 } | |
19266 | |
19267 /* | |
19268 * Original: | |
19269 * http://www.onicos.com/staff/iz/amuse/javascript/expert/deflate.txt | |
19270 */ | |
19271 | |
19272 (function(){ | |
19273 | |
19274 /* Copyright (C) 1999 Masanao Izumo <iz@onicos.co.jp> | |
19275 * Version: 1.0.1 | |
19276 * LastModified: Dec 25 1999 | |
19277 */ | |
19278 | |
19279 /* Interface: | |
19280 * data = zip_deflate(src); | |
19281 */ | |
19282 | |
19283 /* constant parameters */ | |
19284 var zip_WSIZE = 32768; // Sliding Window size | |
19285 var zip_STORED_BLOCK = 0; | |
19286 var zip_STATIC_TREES = 1; | |
19287 var zip_DYN_TREES = 2; | |
19288 | |
19289 /* for deflate */ | |
19290 var zip_DEFAULT_LEVEL = 6; | |
19291 var zip_FULL_SEARCH = true; | |
19292 var zip_INBUFSIZ = 32768; // Input buffer size | |
19293 var zip_INBUF_EXTRA = 64; // Extra buffer | |
19294 var zip_OUTBUFSIZ = 1024 * 8; | |
19295 var zip_window_size = 2 * zip_WSIZE; | |
19296 var zip_MIN_MATCH = 3; | |
19297 var zip_MAX_MATCH = 258; | |
19298 var zip_BITS = 16; | |
19299 // for SMALL_MEM | |
19300 var zip_LIT_BUFSIZE = 0x2000; | |
19301 var zip_HASH_BITS = 13; | |
19302 // for MEDIUM_MEM | |
19303 // var zip_LIT_BUFSIZE = 0x4000; | |
19304 // var zip_HASH_BITS = 14; | |
19305 // for BIG_MEM | |
19306 // var zip_LIT_BUFSIZE = 0x8000; | |
19307 // var zip_HASH_BITS = 15; | |
19308 if(zip_LIT_BUFSIZE > zip_INBUFSIZ) | |
19309 alert("error: zip_INBUFSIZ is too small"); | |
19310 if((zip_WSIZE<<1) > (1<<zip_BITS)) | |
19311 alert("error: zip_WSIZE is too large"); | |
19312 if(zip_HASH_BITS > zip_BITS-1) | |
19313 alert("error: zip_HASH_BITS is too large"); | |
19314 if(zip_HASH_BITS < 8 || zip_MAX_MATCH != 258) | |
19315 alert("error: Code too clever"); | |
19316 var zip_DIST_BUFSIZE = zip_LIT_BUFSIZE; | |
19317 var zip_HASH_SIZE = 1 << zip_HASH_BITS; | |
19318 var zip_HASH_MASK = zip_HASH_SIZE - 1; | |
19319 var zip_WMASK = zip_WSIZE - 1; | |
19320 var zip_NIL = 0; // Tail of hash chains | |
19321 var zip_TOO_FAR = 4096; | |
19322 var zip_MIN_LOOKAHEAD = zip_MAX_MATCH + zip_MIN_MATCH + 1; | |
19323 var zip_MAX_DIST = zip_WSIZE - zip_MIN_LOOKAHEAD; | |
19324 var zip_SMALLEST = 1; | |
19325 var zip_MAX_BITS = 15; | |
19326 var zip_MAX_BL_BITS = 7; | |
19327 var zip_LENGTH_CODES = 29; | |
19328 var zip_LITERALS =256; | |
19329 var zip_END_BLOCK = 256; | |
19330 var zip_L_CODES = zip_LITERALS + 1 + zip_LENGTH_CODES; | |
19331 var zip_D_CODES = 30; | |
19332 var zip_BL_CODES = 19; | |
19333 var zip_REP_3_6 = 16; | |
19334 var zip_REPZ_3_10 = 17; | |
19335 var zip_REPZ_11_138 = 18; | |
19336 var zip_HEAP_SIZE = 2 * zip_L_CODES + 1; | |
19337 var zip_H_SHIFT = parseInt((zip_HASH_BITS + zip_MIN_MATCH - 1) / | |
19338 zip_MIN_MATCH); | |
19339 | |
19340 /* variables */ | |
19341 var zip_free_queue; | |
19342 var zip_qhead, zip_qtail; | |
19343 var zip_initflag; | |
19344 var zip_outbuf = null; | |
19345 var zip_outcnt, zip_outoff; | |
19346 var zip_complete; | |
19347 var zip_window; | |
19348 var zip_d_buf; | |
19349 var zip_l_buf; | |
19350 var zip_prev; | |
19351 var zip_bi_buf; | |
19352 var zip_bi_valid; | |
19353 var zip_block_start; | |
19354 var zip_ins_h; | |
19355 var zip_hash_head; | |
19356 var zip_prev_match; | |
19357 var zip_match_available; | |
19358 var zip_match_length; | |
19359 var zip_prev_length; | |
19360 var zip_strstart; | |
19361 var zip_match_start; | |
19362 var zip_eofile; | |
19363 var zip_lookahead; | |
19364 var zip_max_chain_length; | |
19365 var zip_max_lazy_match; | |
19366 var zip_compr_level; | |
19367 var zip_good_match; | |
19368 var zip_nice_match; | |
19369 var zip_dyn_ltree; | |
19370 var zip_dyn_dtree; | |
19371 var zip_static_ltree; | |
19372 var zip_static_dtree; | |
19373 var zip_bl_tree; | |
19374 var zip_l_desc; | |
19375 var zip_d_desc; | |
19376 var zip_bl_desc; | |
19377 var zip_bl_count; | |
19378 var zip_heap; | |
19379 var zip_heap_len; | |
19380 var zip_heap_max; | |
19381 var zip_depth; | |
19382 var zip_length_code; | |
19383 var zip_dist_code; | |
19384 var zip_base_length; | |
19385 var zip_base_dist; | |
19386 var zip_flag_buf; | |
19387 var zip_last_lit; | |
19388 var zip_last_dist; | |
19389 var zip_last_flags; | |
19390 var zip_flags; | |
19391 var zip_flag_bit; | |
19392 var zip_opt_len; | |
19393 var zip_static_len; | |
19394 var zip_deflate_data; | |
19395 var zip_deflate_pos; | |
19396 | |
19397 /* objects (deflate) */ | |
19398 | |
19399 var zip_DeflateCT = function() { | |
19400 this.fc = 0; // frequency count or bit string | |
19401 this.dl = 0; // father node in Huffman tree or length of bit string | |
19402 } | |
19403 | |
19404 var zip_DeflateTreeDesc = function() { | |
19405 this.dyn_tree = null; // the dynamic tree | |
19406 this.static_tree = null; // corresponding static tree or NULL | |
19407 this.extra_bits = null; // extra bits for each code or NULL | |
19408 this.extra_base = 0; // base index for extra_bits | |
19409 this.elems = 0; // max number of elements in the tree | |
19410 this.max_length = 0; // max bit length for the codes | |
19411 this.max_code = 0; // largest code with non zero frequency | |
19412 } | |
19413 | |
19414 /* Values for max_lazy_match, good_match and max_chain_length, depending on | |
19415 * the desired pack level (0..9). The values given below have been tuned to | |
19416 * exclude worst case performance for pathological files. Better values may be | |
19417 * found for specific files. | |
19418 */ | |
19419 var zip_DeflateConfiguration = function(a, b, c, d) { | |
19420 this.good_length = a; // reduce lazy search above this match length | |
19421 this.max_lazy = b; // do not perform lazy search above this match length | |
19422 this.nice_length = c; // quit search above this match length | |
19423 this.max_chain = d; | |
19424 } | |
19425 | |
19426 var zip_DeflateBuffer = function() { | |
19427 this.next = null; | |
19428 this.len = 0; | |
19429 this.ptr = new Array(zip_OUTBUFSIZ); | |
19430 this.off = 0; | |
19431 } | |
19432 | |
19433 /* constant tables */ | |
19434 var zip_extra_lbits = new Array( | |
19435 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); | |
19436 var zip_extra_dbits = new Array( | |
19437 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); | |
19438 var zip_extra_blbits = new Array( | |
19439 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7); | |
19440 var zip_bl_order = new Array( | |
19441 16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15); | |
19442 var zip_configuration_table = new Array( | |
19443 new zip_DeflateConfiguration(0, 0, 0, 0), | |
19444 new zip_DeflateConfiguration(4, 4, 8, 4), | |
19445 new zip_DeflateConfiguration(4, 5, 16, 8), | |
19446 new zip_DeflateConfiguration(4, 6, 32, 32), | |
19447 new zip_DeflateConfiguration(4, 4, 16, 16), | |
19448 new zip_DeflateConfiguration(8, 16, 32, 32), | |
19449 new zip_DeflateConfiguration(8, 16, 128, 128), | |
19450 new zip_DeflateConfiguration(8, 32, 128, 256), | |
19451 new zip_DeflateConfiguration(32, 128, 258, 1024), | |
19452 new zip_DeflateConfiguration(32, 258, 258, 4096)); | |
19453 | |
19454 | |
19455 /* routines (deflate) */ | |
19456 | |
19457 var zip_deflate_start = function(level) { | |
19458 var i; | |
19459 | |
19460 if(!level) | |
19461 level = zip_DEFAULT_LEVEL; | |
19462 else if(level < 1) | |
19463 level = 1; | |
19464 else if(level > 9) | |
19465 level = 9; | |
19466 | |
19467 zip_compr_level = level; | |
19468 zip_initflag = false; | |
19469 zip_eofile = false; | |
19470 if(zip_outbuf != null) | |
19471 return; | |
19472 | |
19473 zip_free_queue = zip_qhead = zip_qtail = null; | |
19474 zip_outbuf = new Array(zip_OUTBUFSIZ); | |
19475 zip_window = new Array(zip_window_size); | |
19476 zip_d_buf = new Array(zip_DIST_BUFSIZE); | |
19477 zip_l_buf = new Array(zip_INBUFSIZ + zip_INBUF_EXTRA); | |
19478 zip_prev = new Array(1 << zip_BITS); | |
19479 zip_dyn_ltree = new Array(zip_HEAP_SIZE); | |
19480 for(i = 0; i < zip_HEAP_SIZE; i++) | |
19481 zip_dyn_ltree[i] = new zip_DeflateCT(); | |
19482 zip_dyn_dtree = new Array(2*zip_D_CODES+1); | |
19483 for(i = 0; i < 2*zip_D_CODES+1; i++) | |
19484 zip_dyn_dtree[i] = new zip_DeflateCT(); | |
19485 zip_static_ltree = new Array(zip_L_CODES+2); | |
19486 for(i = 0; i < zip_L_CODES+2; i++) | |
19487 zip_static_ltree[i] = new zip_DeflateCT(); | |
19488 zip_static_dtree = new Array(zip_D_CODES); | |
19489 for(i = 0; i < zip_D_CODES; i++) | |
19490 zip_static_dtree[i] = new zip_DeflateCT(); | |
19491 zip_bl_tree = new Array(2*zip_BL_CODES+1); | |
19492 for(i = 0; i < 2*zip_BL_CODES+1; i++) | |
19493 zip_bl_tree[i] = new zip_DeflateCT(); | |
19494 zip_l_desc = new zip_DeflateTreeDesc(); | |
19495 zip_d_desc = new zip_DeflateTreeDesc(); | |
19496 zip_bl_desc = new zip_DeflateTreeDesc(); | |
19497 zip_bl_count = new Array(zip_MAX_BITS+1); | |
19498 zip_heap = new Array(2*zip_L_CODES+1); | |
19499 zip_depth = new Array(2*zip_L_CODES+1); | |
19500 zip_length_code = new Array(zip_MAX_MATCH-zip_MIN_MATCH+1); | |
19501 zip_dist_code = new Array(512); | |
19502 zip_base_length = new Array(zip_LENGTH_CODES); | |
19503 zip_base_dist = new Array(zip_D_CODES); | |
19504 zip_flag_buf = new Array(parseInt(zip_LIT_BUFSIZE / 8)); | |
19505 } | |
19506 | |
19507 var zip_deflate_end = function() { | |
19508 zip_free_queue = zip_qhead = zip_qtail = null; | |
19509 zip_outbuf = null; | |
19510 zip_window = null; | |
19511 zip_d_buf = null; | |
19512 zip_l_buf = null; | |
19513 zip_prev = null; | |
19514 zip_dyn_ltree = null; | |
19515 zip_dyn_dtree = null; | |
19516 zip_static_ltree = null; | |
19517 zip_static_dtree = null; | |
19518 zip_bl_tree = null; | |
19519 zip_l_desc = null; | |
19520 zip_d_desc = null; | |
19521 zip_bl_desc = null; | |
19522 zip_bl_count = null; | |
19523 zip_heap = null; | |
19524 zip_depth = null; | |
19525 zip_length_code = null; | |
19526 zip_dist_code = null; | |
19527 zip_base_length = null; | |
19528 zip_base_dist = null; | |
19529 zip_flag_buf = null; | |
19530 } | |
19531 | |
19532 var zip_reuse_queue = function(p) { | |
19533 p.next = zip_free_queue; | |
19534 zip_free_queue = p; | |
19535 } | |
19536 | |
19537 var zip_new_queue = function() { | |
19538 var p; | |
19539 | |
19540 if(zip_free_queue != null) | |
19541 { | |
19542 p = zip_free_queue; | |
19543 zip_free_queue = zip_free_queue.next; | |
19544 } | |
19545 else | |
19546 p = new zip_DeflateBuffer(); | |
19547 p.next = null; | |
19548 p.len = p.off = 0; | |
19549 | |
19550 return p; | |
19551 } | |
19552 | |
19553 var zip_head1 = function(i) { | |
19554 return zip_prev[zip_WSIZE + i]; | |
19555 } | |
19556 | |
19557 var zip_head2 = function(i, val) { | |
19558 return zip_prev[zip_WSIZE + i] = val; | |
19559 } | |
19560 | |
19561 /* put_byte is used for the compressed output, put_ubyte for the | |
19562 * uncompressed output. However unlzw() uses window for its | |
19563 * suffix table instead of its output buffer, so it does not use put_ubyte | |
19564 * (to be cleaned up). | |
19565 */ | |
19566 var zip_put_byte = function(c) { | |
19567 zip_outbuf[zip_outoff + zip_outcnt++] = c; | |
19568 if(zip_outoff + zip_outcnt == zip_OUTBUFSIZ) | |
19569 zip_qoutbuf(); | |
19570 } | |
19571 | |
19572 /* Output a 16 bit value, lsb first */ | |
19573 var zip_put_short = function(w) { | |
19574 w &= 0xffff; | |
19575 if(zip_outoff + zip_outcnt < zip_OUTBUFSIZ - 2) { | |
19576 zip_outbuf[zip_outoff + zip_outcnt++] = (w & 0xff); | |
19577 zip_outbuf[zip_outoff + zip_outcnt++] = (w >>> 8); | |
19578 } else { | |
19579 zip_put_byte(w & 0xff); | |
19580 zip_put_byte(w >>> 8); | |
19581 } | |
19582 } | |
19583 | |
19584 /* ========================================================================== | |
19585 * Insert string s in the dictionary and set match_head to the previous head | |
19586 * of the hash chain (the most recent string with same hash key). Return | |
19587 * the previous length of the hash chain. | |
19588 * IN assertion: all calls to to INSERT_STRING are made with consecutive | |
19589 * input characters and the first MIN_MATCH bytes of s are valid | |
19590 * (except for the last MIN_MATCH-1 bytes of the input file). | |
19591 */ | |
19592 var zip_INSERT_STRING = function() { | |
19593 zip_ins_h = ((zip_ins_h << zip_H_SHIFT) | |
19594 ^ (zip_window[zip_strstart + zip_MIN_MATCH - 1] & 0xff)) | |
19595 & zip_HASH_MASK; | |
19596 zip_hash_head = zip_head1(zip_ins_h); | |
19597 zip_prev[zip_strstart & zip_WMASK] = zip_hash_head; | |
19598 zip_head2(zip_ins_h, zip_strstart); | |
19599 } | |
19600 | |
19601 /* Send a code of the given tree. c and tree must not have side effects */ | |
19602 var zip_SEND_CODE = function(c, tree) { | |
19603 zip_send_bits(tree[c].fc, tree[c].dl); | |
19604 } | |
19605 | |
19606 /* Mapping from a distance to a distance code. dist is the distance - 1 and | |
19607 * must not have side effects. dist_code[256] and dist_code[257] are never | |
19608 * used. | |
19609 */ | |
19610 var zip_D_CODE = function(dist) { | |
19611 return (dist < 256 ? zip_dist_code[dist] | |
19612 : zip_dist_code[256 + (dist>>7)]) & 0xff; | |
19613 } | |
19614 | |
19615 /* ========================================================================== | |
19616 * Compares to subtrees, using the tree depth as tie breaker when | |
19617 * the subtrees have equal frequency. This minimizes the worst case length. | |
19618 */ | |
19619 var zip_SMALLER = function(tree, n, m) { | |
19620 return tree[n].fc < tree[m].fc || | |
19621 (tree[n].fc == tree[m].fc && zip_depth[n] <= zip_depth[m]); | |
19622 } | |
19623 | |
19624 /* ========================================================================== | |
19625 * read string data | |
19626 */ | |
19627 var zip_read_buff = function(buff, offset, n) { | |
19628 var i; | |
19629 for(i = 0; i < n && zip_deflate_pos < zip_deflate_data.length; i++) | |
19630 buff[offset + i] = | |
19631 zip_deflate_data.charCodeAt(zip_deflate_pos++) & 0xff; | |
19632 return i; | |
19633 } | |
19634 | |
19635 /* ========================================================================== | |
19636 * Initialize the "longest match" routines for a new file | |
19637 */ | |
19638 var zip_lm_init = function() { | |
19639 var j; | |
19640 | |
19641 /* Initialize the hash table. */ | |
19642 for(j = 0; j < zip_HASH_SIZE; j++) | |
19643 // zip_head2(j, zip_NIL); | |
19644 zip_prev[zip_WSIZE + j] = 0; | |
19645 /* prev will be initialized on the fly */ | |
19646 | |
19647 /* Set the default configuration parameters: | |
19648 */ | |
19649 zip_max_lazy_match = zip_configuration_table[zip_compr_level].max_lazy; | |
19650 zip_good_match = zip_configuration_table[zip_compr_level].good_length; | |
19651 if(!zip_FULL_SEARCH) | |
19652 zip_nice_match = zip_configuration_table[zip_compr_level].nice_length; | |
19653 zip_max_chain_length = zip_configuration_table[zip_compr_level].max_chain; | |
19654 | |
19655 zip_strstart = 0; | |
19656 zip_block_start = 0; | |
19657 | |
19658 zip_lookahead = zip_read_buff(zip_window, 0, 2 * zip_WSIZE); | |
19659 if(zip_lookahead <= 0) { | |
19660 zip_eofile = true; | |
19661 zip_lookahead = 0; | |
19662 return; | |
19663 } | |
19664 zip_eofile = false; | |
19665 /* Make sure that we always have enough lookahead. This is important | |
19666 * if input comes from a device such as a tty. | |
19667 */ | |
19668 while(zip_lookahead < zip_MIN_LOOKAHEAD && !zip_eofile) | |
19669 zip_fill_window(); | |
19670 | |
19671 /* If lookahead < MIN_MATCH, ins_h is garbage, but this is | |
19672 * not important since only literal bytes will be emitted. | |
19673 */ | |
19674 zip_ins_h = 0; | |
19675 for(j = 0; j < zip_MIN_MATCH - 1; j++) { | |
19676 // UPDATE_HASH(ins_h, window[j]); | |
19677 zip_ins_h = ((zip_ins_h << zip_H_SHIFT) ^ (zip_window[j] & 0xff)) & zip_HASH_MASK; | |
19678 } | |
19679 } | |
19680 | |
19681 /* ========================================================================== | |
19682 * Set match_start to the longest match starting at the given string and | |
19683 * return its length. Matches shorter or equal to prev_length are discarded, | |
19684 * in which case the result is equal to prev_length and match_start is | |
19685 * garbage. | |
19686 * IN assertions: cur_match is the head of the hash chain for the current | |
19687 * string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1 | |
19688 */ | |
19689 var zip_longest_match = function(cur_match) { | |
19690 var chain_length = zip_max_chain_length; // max hash chain length | |
19691 var scanp = zip_strstart; // current string | |
19692 var matchp; // matched string | |
19693 var len; // length of current match | |
19694 var best_len = zip_prev_length; // best match length so far | |
19695 | |
19696 /* Stop when cur_match becomes <= limit. To simplify the code, | |
19697 * we prevent matches with the string of window index 0. | |
19698 */ | |
19699 var limit = (zip_strstart > zip_MAX_DIST ? zip_strstart - zip_MAX_DIST : zip_NIL); | |
19700 | |
19701 var strendp = zip_strstart + zip_MAX_MATCH; | |
19702 var scan_end1 = zip_window[scanp + best_len - 1]; | |
19703 var scan_end = zip_window[scanp + best_len]; | |
19704 | |
19705 /* Do not waste too much time if we already have a good match: */ | |
19706 if(zip_prev_length >= zip_good_match) | |
19707 chain_length >>= 2; | |
19708 | |
19709 // Assert(encoder->strstart <= window_size-MIN_LOOKAHEAD, "insufficient lookahead"); | |
19710 | |
19711 do { | |
19712 // Assert(cur_match < encoder->strstart, "no future"); | |
19713 matchp = cur_match; | |
19714 | |
19715 /* Skip to next match if the match length cannot increase | |
19716 * or if the match length is less than 2: | |
19717 */ | |
19718 if(zip_window[matchp + best_len] != scan_end || | |
19719 zip_window[matchp + best_len - 1] != scan_end1 || | |
19720 zip_window[matchp] != zip_window[scanp] || | |
19721 zip_window[++matchp] != zip_window[scanp + 1]) { | |
19722 continue; | |
19723 } | |
19724 | |
19725 /* The check at best_len-1 can be removed because it will be made | |
19726 * again later. (This heuristic is not always a win.) | |
19727 * It is not necessary to compare scan[2] and match[2] since they | |
19728 * are always equal when the other bytes match, given that | |
19729 * the hash keys are equal and that HASH_BITS >= 8. | |
19730 */ | |
19731 scanp += 2; | |
19732 matchp++; | |
19733 | |
19734 /* We check for insufficient lookahead only every 8th comparison; | |
19735 * the 256th check will be made at strstart+258. | |
19736 */ | |
19737 do { | |
19738 } while(zip_window[++scanp] == zip_window[++matchp] && | |
19739 zip_window[++scanp] == zip_window[++matchp] && | |
19740 zip_window[++scanp] == zip_window[++matchp] && | |
19741 zip_window[++scanp] == zip_window[++matchp] && | |
19742 zip_window[++scanp] == zip_window[++matchp] && | |
19743 zip_window[++scanp] == zip_window[++matchp] && | |
19744 zip_window[++scanp] == zip_window[++matchp] && | |
19745 zip_window[++scanp] == zip_window[++matchp] && | |
19746 scanp < strendp); | |
19747 | |
19748 len = zip_MAX_MATCH - (strendp - scanp); | |
19749 scanp = strendp - zip_MAX_MATCH; | |
19750 | |
19751 if(len > best_len) { | |
19752 zip_match_start = cur_match; | |
19753 best_len = len; | |
19754 if(zip_FULL_SEARCH) { | |
19755 if(len >= zip_MAX_MATCH) break; | |
19756 } else { | |
19757 if(len >= zip_nice_match) break; | |
19758 } | |
19759 | |
19760 scan_end1 = zip_window[scanp + best_len-1]; | |
19761 scan_end = zip_window[scanp + best_len]; | |
19762 } | |
19763 } while((cur_match = zip_prev[cur_match & zip_WMASK]) > limit | |
19764 && --chain_length != 0); | |
19765 | |
19766 return best_len; | |
19767 } | |
19768 | |
19769 /* ========================================================================== | |
19770 * Fill the window when the lookahead becomes insufficient. | |
19771 * Updates strstart and lookahead, and sets eofile if end of input file. | |
19772 * IN assertion: lookahead < MIN_LOOKAHEAD && strstart + lookahead > 0 | |
19773 * OUT assertions: at least one byte has been read, or eofile is set; | |
19774 * file reads are performed for at least two bytes (required for the | |
19775 * translate_eol option). | |
19776 */ | |
19777 var zip_fill_window = function() { | |
19778 var n, m; | |
19779 | |
19780 // Amount of free space at the end of the window. | |
19781 var more = zip_window_size - zip_lookahead - zip_strstart; | |
19782 | |
19783 /* If the window is almost full and there is insufficient lookahead, | |
19784 * move the upper half to the lower one to make room in the upper half. | |
19785 */ | |
19786 if(more == -1) { | |
19787 /* Very unlikely, but possible on 16 bit machine if strstart == 0 | |
19788 * and lookahead == 1 (input done one byte at time) | |
19789 */ | |
19790 more--; | |
19791 } else if(zip_strstart >= zip_WSIZE + zip_MAX_DIST) { | |
19792 /* By the IN assertion, the window is not empty so we can't confuse | |
19793 * more == 0 with more == 64K on a 16 bit machine. | |
19794 */ | |
19795 // Assert(window_size == (ulg)2*WSIZE, "no sliding with BIG_MEM"); | |
19796 | |
19797 // System.arraycopy(window, WSIZE, window, 0, WSIZE); | |
19798 for(n = 0; n < zip_WSIZE; n++) | |
19799 zip_window[n] = zip_window[n + zip_WSIZE]; | |
19800 | |
19801 zip_match_start -= zip_WSIZE; | |
19802 zip_strstart -= zip_WSIZE; /* we now have strstart >= MAX_DIST: */ | |
19803 zip_block_start -= zip_WSIZE; | |
19804 | |
19805 for(n = 0; n < zip_HASH_SIZE; n++) { | |
19806 m = zip_head1(n); | |
19807 zip_head2(n, m >= zip_WSIZE ? m - zip_WSIZE : zip_NIL); | |
19808 } | |
19809 for(n = 0; n < zip_WSIZE; n++) { | |
19810 /* If n is not on any hash chain, prev[n] is garbage but | |
19811 * its value will never be used. | |
19812 */ | |
19813 m = zip_prev[n]; | |
19814 zip_prev[n] = (m >= zip_WSIZE ? m - zip_WSIZE : zip_NIL); | |
19815 } | |
19816 more += zip_WSIZE; | |
19817 } | |
19818 // At this point, more >= 2 | |
19819 if(!zip_eofile) { | |
19820 n = zip_read_buff(zip_window, zip_strstart + zip_lookahead, more); | |
19821 if(n <= 0) | |
19822 zip_eofile = true; | |
19823 else | |
19824 zip_lookahead += n; | |
19825 } | |
19826 } | |
19827 | |
19828 /* ========================================================================== | |
19829 * Processes a new input file and return its compressed length. This | |
19830 * function does not perform lazy evaluationof matches and inserts | |
19831 * new strings in the dictionary only for unmatched strings or for short | |
19832 * matches. It is used only for the fast compression options. | |
19833 */ | |
19834 var zip_deflate_fast = function() { | |
19835 while(zip_lookahead != 0 && zip_qhead == null) { | |
19836 var flush; // set if current block must be flushed | |
19837 | |
19838 /* Insert the string window[strstart .. strstart+2] in the | |
19839 * dictionary, and set hash_head to the head of the hash chain: | |
19840 */ | |
19841 zip_INSERT_STRING(); | |
19842 | |
19843 /* Find the longest match, discarding those <= prev_length. | |
19844 * At this point we have always match_length < MIN_MATCH | |
19845 */ | |
19846 if(zip_hash_head != zip_NIL && | |
19847 zip_strstart - zip_hash_head <= zip_MAX_DIST) { | |
19848 /* To simplify the code, we prevent matches with the string | |
19849 * of window index 0 (in particular we have to avoid a match | |
19850 * of the string with itself at the start of the input file). | |
19851 */ | |
19852 zip_match_length = zip_longest_match(zip_hash_head); | |
19853 /* longest_match() sets match_start */ | |
19854 if(zip_match_length > zip_lookahead) | |
19855 zip_match_length = zip_lookahead; | |
19856 } | |
19857 if(zip_match_length >= zip_MIN_MATCH) { | |
19858 // check_match(strstart, match_start, match_length); | |
19859 | |
19860 flush = zip_ct_tally(zip_strstart - zip_match_start, | |
19861 zip_match_length - zip_MIN_MATCH); | |
19862 zip_lookahead -= zip_match_length; | |
19863 | |
19864 /* Insert new strings in the hash table only if the match length | |
19865 * is not too large. This saves time but degrades compression. | |
19866 */ | |
19867 if(zip_match_length <= zip_max_lazy_match) { | |
19868 zip_match_length--; // string at strstart already in hash table | |
19869 do { | |
19870 zip_strstart++; | |
19871 zip_INSERT_STRING(); | |
19872 /* strstart never exceeds WSIZE-MAX_MATCH, so there are | |
19873 * always MIN_MATCH bytes ahead. If lookahead < MIN_MATCH | |
19874 * these bytes are garbage, but it does not matter since | |
19875 * the next lookahead bytes will be emitted as literals. | |
19876 */ | |
19877 } while(--zip_match_length != 0); | |
19878 zip_strstart++; | |
19879 } else { | |
19880 zip_strstart += zip_match_length; | |
19881 zip_match_length = 0; | |
19882 zip_ins_h = zip_window[zip_strstart] & 0xff; | |
19883 // UPDATE_HASH(ins_h, window[strstart + 1]); | |
19884 zip_ins_h = ((zip_ins_h<<zip_H_SHIFT) ^ (zip_window[zip_strstart + 1] & 0xff)) & zip_HASH_MASK; | |
19885 | |
19886 //#if MIN_MATCH != 3 | |
19887 // Call UPDATE_HASH() MIN_MATCH-3 more times | |
19888 //#endif | |
19889 | |
19890 } | |
19891 } else { | |
19892 /* No match, output a literal byte */ | |
19893 flush = zip_ct_tally(0, zip_window[zip_strstart] & 0xff); | |
19894 zip_lookahead--; | |
19895 zip_strstart++; | |
19896 } | |
19897 if(flush) { | |
19898 zip_flush_block(0); | |
19899 zip_block_start = zip_strstart; | |
19900 } | |
19901 | |
19902 /* Make sure that we always have enough lookahead, except | |
19903 * at the end of the input file. We need MAX_MATCH bytes | |
19904 * for the next match, plus MIN_MATCH bytes to insert the | |
19905 * string following the next match. | |
19906 */ | |
19907 while(zip_lookahead < zip_MIN_LOOKAHEAD && !zip_eofile) | |
19908 zip_fill_window(); | |
19909 } | |
19910 } | |
19911 | |
19912 var zip_deflate_better = function() { | |
19913 /* Process the input block. */ | |
19914 while(zip_lookahead != 0 && zip_qhead == null) { | |
19915 /* Insert the string window[strstart .. strstart+2] in the | |
19916 * dictionary, and set hash_head to the head of the hash chain: | |
19917 */ | |
19918 zip_INSERT_STRING(); | |
19919 | |
19920 /* Find the longest match, discarding those <= prev_length. | |
19921 */ | |
19922 zip_prev_length = zip_match_length; | |
19923 zip_prev_match = zip_match_start; | |
19924 zip_match_length = zip_MIN_MATCH - 1; | |
19925 | |
19926 if(zip_hash_head != zip_NIL && | |
19927 zip_prev_length < zip_max_lazy_match && | |
19928 zip_strstart - zip_hash_head <= zip_MAX_DIST) { | |
19929 /* To simplify the code, we prevent matches with the string | |
19930 * of window index 0 (in particular we have to avoid a match | |
19931 * of the string with itself at the start of the input file). | |
19932 */ | |
19933 zip_match_length = zip_longest_match(zip_hash_head); | |
19934 /* longest_match() sets match_start */ | |
19935 if(zip_match_length > zip_lookahead) | |
19936 zip_match_length = zip_lookahead; | |
19937 | |
19938 /* Ignore a length 3 match if it is too distant: */ | |
19939 if(zip_match_length == zip_MIN_MATCH && | |
19940 zip_strstart - zip_match_start > zip_TOO_FAR) { | |
19941 /* If prev_match is also MIN_MATCH, match_start is garbage | |
19942 * but we will ignore the current match anyway. | |
19943 */ | |
19944 zip_match_length--; | |
19945 } | |
19946 } | |
19947 /* If there was a match at the previous step and the current | |
19948 * match is not better, output the previous match: | |
19949 */ | |
19950 if(zip_prev_length >= zip_MIN_MATCH && | |
19951 zip_match_length <= zip_prev_length) { | |
19952 var flush; // set if current block must be flushed | |
19953 | |
19954 // check_match(strstart - 1, prev_match, prev_length); | |
19955 flush = zip_ct_tally(zip_strstart - 1 - zip_prev_match, | |
19956 zip_prev_length - zip_MIN_MATCH); | |
19957 | |
19958 /* Insert in hash table all strings up to the end of the match. | |
19959 * strstart-1 and strstart are already inserted. | |
19960 */ | |
19961 zip_lookahead -= zip_prev_length - 1; | |
19962 zip_prev_length -= 2; | |
19963 do { | |
19964 zip_strstart++; | |
19965 zip_INSERT_STRING(); | |
19966 /* strstart never exceeds WSIZE-MAX_MATCH, so there are | |
19967 * always MIN_MATCH bytes ahead. If lookahead < MIN_MATCH | |
19968 * these bytes are garbage, but it does not matter since the | |
19969 * next lookahead bytes will always be emitted as literals. | |
19970 */ | |
19971 } while(--zip_prev_length != 0); | |
19972 zip_match_available = 0; | |
19973 zip_match_length = zip_MIN_MATCH - 1; | |
19974 zip_strstart++; | |
19975 if(flush) { | |
19976 zip_flush_block(0); | |
19977 zip_block_start = zip_strstart; | |
19978 } | |
19979 } else if(zip_match_available != 0) { | |
19980 /* If there was no match at the previous position, output a | |
19981 * single literal. If there was a match but the current match | |
19982 * is longer, truncate the previous match to a single literal. | |
19983 */ | |
19984 if(zip_ct_tally(0, zip_window[zip_strstart - 1] & 0xff)) { | |
19985 zip_flush_block(0); | |
19986 zip_block_start = zip_strstart; | |
19987 } | |
19988 zip_strstart++; | |
19989 zip_lookahead--; | |
19990 } else { | |
19991 /* There is no previous match to compare with, wait for | |
19992 * the next step to decide. | |
19993 */ | |
19994 zip_match_available = 1; | |
19995 zip_strstart++; | |
19996 zip_lookahead--; | |
19997 } | |
19998 | |
19999 /* Make sure that we always have enough lookahead, except | |
20000 * at the end of the input file. We need MAX_MATCH bytes | |
20001 * for the next match, plus MIN_MATCH bytes to insert the | |
20002 * string following the next match. | |
20003 */ | |
20004 while(zip_lookahead < zip_MIN_LOOKAHEAD && !zip_eofile) | |
20005 zip_fill_window(); | |
20006 } | |
20007 } | |
20008 | |
20009 var zip_init_deflate = function() { | |
20010 if(zip_eofile) | |
20011 return; | |
20012 zip_bi_buf = 0; | |
20013 zip_bi_valid = 0; | |
20014 zip_ct_init(); | |
20015 zip_lm_init(); | |
20016 | |
20017 zip_qhead = null; | |
20018 zip_outcnt = 0; | |
20019 zip_outoff = 0; | |
20020 | |
20021 if(zip_compr_level <= 3) | |
20022 { | |
20023 zip_prev_length = zip_MIN_MATCH - 1; | |
20024 zip_match_length = 0; | |
20025 } | |
20026 else | |
20027 { | |
20028 zip_match_length = zip_MIN_MATCH - 1; | |
20029 zip_match_available = 0; | |
20030 } | |
20031 | |
20032 zip_complete = false; | |
20033 } | |
20034 | |
20035 /* ========================================================================== | |
20036 * Same as above, but achieves better compression. We use a lazy | |
20037 * evaluation for matches: a match is finally adopted only if there is | |
20038 * no better match at the next window position. | |
20039 */ | |
20040 var zip_deflate_internal = function(buff, off, buff_size) { | |
20041 var n; | |
20042 | |
20043 if(!zip_initflag) | |
20044 { | |
20045 zip_init_deflate(); | |
20046 zip_initflag = true; | |
20047 if(zip_lookahead == 0) { // empty | |
20048 zip_complete = true; | |
20049 return 0; | |
20050 } | |
20051 } | |
20052 | |
20053 if((n = zip_qcopy(buff, off, buff_size)) == buff_size) | |
20054 return buff_size; | |
20055 | |
20056 if(zip_complete) | |
20057 return n; | |
20058 | |
20059 if(zip_compr_level <= 3) // optimized for speed | |
20060 zip_deflate_fast(); | |
20061 else | |
20062 zip_deflate_better(); | |
20063 if(zip_lookahead == 0) { | |
20064 if(zip_match_available != 0) | |
20065 zip_ct_tally(0, zip_window[zip_strstart - 1] & 0xff); | |
20066 zip_flush_block(1); | |
20067 zip_complete = true; | |
20068 } | |
20069 return n + zip_qcopy(buff, n + off, buff_size - n); | |
20070 } | |
20071 | |
20072 var zip_qcopy = function(buff, off, buff_size) { | |
20073 var n, i, j; | |
20074 | |
20075 n = 0; | |
20076 while(zip_qhead != null && n < buff_size) | |
20077 { | |
20078 i = buff_size - n; | |
20079 if(i > zip_qhead.len) | |
20080 i = zip_qhead.len; | |
20081 // System.arraycopy(qhead.ptr, qhead.off, buff, off + n, i); | |
20082 for(j = 0; j < i; j++) | |
20083 buff[off + n + j] = zip_qhead.ptr[zip_qhead.off + j]; | |
20084 | |
20085 zip_qhead.off += i; | |
20086 zip_qhead.len -= i; | |
20087 n += i; | |
20088 if(zip_qhead.len == 0) { | |
20089 var p; | |
20090 p = zip_qhead; | |
20091 zip_qhead = zip_qhead.next; | |
20092 zip_reuse_queue(p); | |
20093 } | |
20094 } | |
20095 | |
20096 if(n == buff_size) | |
20097 return n; | |
20098 | |
20099 if(zip_outoff < zip_outcnt) { | |
20100 i = buff_size - n; | |
20101 if(i > zip_outcnt - zip_outoff) | |
20102 i = zip_outcnt - zip_outoff; | |
20103 // System.arraycopy(outbuf, outoff, buff, off + n, i); | |
20104 for(j = 0; j < i; j++) | |
20105 buff[off + n + j] = zip_outbuf[zip_outoff + j]; | |
20106 zip_outoff += i; | |
20107 n += i; | |
20108 if(zip_outcnt == zip_outoff) | |
20109 zip_outcnt = zip_outoff = 0; | |
20110 } | |
20111 return n; | |
20112 } | |
20113 | |
20114 /* ========================================================================== | |
20115 * Allocate the match buffer, initialize the various tables and save the | |
20116 * location of the internal file attribute (ascii/binary) and method | |
20117 * (DEFLATE/STORE). | |
20118 */ | |
20119 var zip_ct_init = function() { | |
20120 var n; // iterates over tree elements | |
20121 var bits; // bit counter | |
20122 var length; // length value | |
20123 var code; // code value | |
20124 var dist; // distance index | |
20125 | |
20126 if(zip_static_dtree[0].dl != 0) return; // ct_init already called | |
20127 | |
20128 zip_l_desc.dyn_tree = zip_dyn_ltree; | |
20129 zip_l_desc.static_tree = zip_static_ltree; | |
20130 zip_l_desc.extra_bits = zip_extra_lbits; | |
20131 zip_l_desc.extra_base = zip_LITERALS + 1; | |
20132 zip_l_desc.elems = zip_L_CODES; | |
20133 zip_l_desc.max_length = zip_MAX_BITS; | |
20134 zip_l_desc.max_code = 0; | |
20135 | |
20136 zip_d_desc.dyn_tree = zip_dyn_dtree; | |
20137 zip_d_desc.static_tree = zip_static_dtree; | |
20138 zip_d_desc.extra_bits = zip_extra_dbits; | |
20139 zip_d_desc.extra_base = 0; | |
20140 zip_d_desc.elems = zip_D_CODES; | |
20141 zip_d_desc.max_length = zip_MAX_BITS; | |
20142 zip_d_desc.max_code = 0; | |
20143 | |
20144 zip_bl_desc.dyn_tree = zip_bl_tree; | |
20145 zip_bl_desc.static_tree = null; | |
20146 zip_bl_desc.extra_bits = zip_extra_blbits; | |
20147 zip_bl_desc.extra_base = 0; | |
20148 zip_bl_desc.elems = zip_BL_CODES; | |
20149 zip_bl_desc.max_length = zip_MAX_BL_BITS; | |
20150 zip_bl_desc.max_code = 0; | |
20151 | |
20152 // Initialize the mapping length (0..255) -> length code (0..28) | |
20153 length = 0; | |
20154 for(code = 0; code < zip_LENGTH_CODES-1; code++) { | |
20155 zip_base_length[code] = length; | |
20156 for(n = 0; n < (1<<zip_extra_lbits[code]); n++) | |
20157 zip_length_code[length++] = code; | |
20158 } | |
20159 // Assert (length == 256, "ct_init: length != 256"); | |
20160 | |
20161 /* Note that the length 255 (match length 258) can be represented | |
20162 * in two different ways: code 284 + 5 bits or code 285, so we | |
20163 * overwrite length_code[255] to use the best encoding: | |
20164 */ | |
20165 zip_length_code[length-1] = code; | |
20166 | |
20167 /* Initialize the mapping dist (0..32K) -> dist code (0..29) */ | |
20168 dist = 0; | |
20169 for(code = 0 ; code < 16; code++) { | |
20170 zip_base_dist[code] = dist; | |
20171 for(n = 0; n < (1<<zip_extra_dbits[code]); n++) { | |
20172 zip_dist_code[dist++] = code; | |
20173 } | |
20174 } | |
20175 // Assert (dist == 256, "ct_init: dist != 256"); | |
20176 dist >>= 7; // from now on, all distances are divided by 128 | |
20177 for( ; code < zip_D_CODES; code++) { | |
20178 zip_base_dist[code] = dist << 7; | |
20179 for(n = 0; n < (1<<(zip_extra_dbits[code]-7)); n++) | |
20180 zip_dist_code[256 + dist++] = code; | |
20181 } | |
20182 // Assert (dist == 256, "ct_init: 256+dist != 512"); | |
20183 | |
20184 // Construct the codes of the static literal tree | |
20185 for(bits = 0; bits <= zip_MAX_BITS; bits++) | |
20186 zip_bl_count[bits] = 0; | |
20187 n = 0; | |
20188 while(n <= 143) { zip_static_ltree[n++].dl = 8; zip_bl_count[8]++; } | |
20189 while(n <= 255) { zip_static_ltree[n++].dl = 9; zip_bl_count[9]++; } | |
20190 while(n <= 279) { zip_static_ltree[n++].dl = 7; zip_bl_count[7]++; } | |
20191 while(n <= 287) { zip_static_ltree[n++].dl = 8; zip_bl_count[8]++; } | |
20192 /* Codes 286 and 287 do not exist, but we must include them in the | |
20193 * tree construction to get a canonical Huffman tree (longest code | |
20194 * all ones) | |
20195 */ | |
20196 zip_gen_codes(zip_static_ltree, zip_L_CODES + 1); | |
20197 | |
20198 /* The static distance tree is trivial: */ | |
20199 for(n = 0; n < zip_D_CODES; n++) { | |
20200 zip_static_dtree[n].dl = 5; | |
20201 zip_static_dtree[n].fc = zip_bi_reverse(n, 5); | |
20202 } | |
20203 | |
20204 // Initialize the first block of the first file: | |
20205 zip_init_block(); | |
20206 } | |
20207 | |
20208 /* ========================================================================== | |
20209 * Initialize a new block. | |
20210 */ | |
20211 var zip_init_block = function() { | |
20212 var n; // iterates over tree elements | |
20213 | |
20214 // Initialize the trees. | |
20215 for(n = 0; n < zip_L_CODES; n++) zip_dyn_ltree[n].fc = 0; | |
20216 for(n = 0; n < zip_D_CODES; n++) zip_dyn_dtree[n].fc = 0; | |
20217 for(n = 0; n < zip_BL_CODES; n++) zip_bl_tree[n].fc = 0; | |
20218 | |
20219 zip_dyn_ltree[zip_END_BLOCK].fc = 1; | |
20220 zip_opt_len = zip_static_len = 0; | |
20221 zip_last_lit = zip_last_dist = zip_last_flags = 0; | |
20222 zip_flags = 0; | |
20223 zip_flag_bit = 1; | |
20224 } | |
20225 | |
20226 /* ========================================================================== | |
20227 * Restore the heap property by moving down the tree starting at node k, | |
20228 * exchanging a node with the smallest of its two sons if necessary, stopping | |
20229 * when the heap property is re-established (each father smaller than its | |
20230 * two sons). | |
20231 */ | |
20232 var zip_pqdownheap = function( | |
20233 tree, // the tree to restore | |
20234 k) { // node to move down | |
20235 var v = zip_heap[k]; | |
20236 var j = k << 1; // left son of k | |
20237 | |
20238 while(j <= zip_heap_len) { | |
20239 // Set j to the smallest of the two sons: | |
20240 if(j < zip_heap_len && | |
20241 zip_SMALLER(tree, zip_heap[j + 1], zip_heap[j])) | |
20242 j++; | |
20243 | |
20244 // Exit if v is smaller than both sons | |
20245 if(zip_SMALLER(tree, v, zip_heap[j])) | |
20246 break; | |
20247 | |
20248 // Exchange v with the smallest son | |
20249 zip_heap[k] = zip_heap[j]; | |
20250 k = j; | |
20251 | |
20252 // And continue down the tree, setting j to the left son of k | |
20253 j <<= 1; | |
20254 } | |
20255 zip_heap[k] = v; | |
20256 } | |
20257 | |
20258 /* ========================================================================== | |
20259 * Compute the optimal bit lengths for a tree and update the total bit length | |
20260 * for the current block. | |
20261 * IN assertion: the fields freq and dad are set, heap[heap_max] and | |
20262 * above are the tree nodes sorted by increasing frequency. | |
20263 * OUT assertions: the field len is set to the optimal bit length, the | |
20264 * array bl_count contains the frequencies for each bit length. | |
20265 * The length opt_len is updated; static_len is also updated if stree is | |
20266 * not null. | |
20267 */ | |
20268 var zip_gen_bitlen = function(desc) { // the tree descriptor | |
20269 var tree = desc.dyn_tree; | |
20270 var extra = desc.extra_bits; | |
20271 var base = desc.extra_base; | |
20272 var max_code = desc.max_code; | |
20273 var max_length = desc.max_length; | |
20274 var stree = desc.static_tree; | |
20275 var h; // heap index | |
20276 var n, m; // iterate over the tree elements | |
20277 var bits; // bit length | |
20278 var xbits; // extra bits | |
20279 var f; // frequency | |
20280 var overflow = 0; // number of elements with bit length too large | |
20281 | |
20282 for(bits = 0; bits <= zip_MAX_BITS; bits++) | |
20283 zip_bl_count[bits] = 0; | |
20284 | |
20285 /* In a first pass, compute the optimal bit lengths (which may | |
20286 * overflow in the case of the bit length tree). | |
20287 */ | |
20288 tree[zip_heap[zip_heap_max]].dl = 0; // root of the heap | |
20289 | |
20290 for(h = zip_heap_max + 1; h < zip_HEAP_SIZE; h++) { | |
20291 n = zip_heap[h]; | |
20292 bits = tree[tree[n].dl].dl + 1; | |
20293 if(bits > max_length) { | |
20294 bits = max_length; | |
20295 overflow++; | |
20296 } | |
20297 tree[n].dl = bits; | |
20298 // We overwrite tree[n].dl which is no longer needed | |
20299 | |
20300 if(n > max_code) | |
20301 continue; // not a leaf node | |
20302 | |
20303 zip_bl_count[bits]++; | |
20304 xbits = 0; | |
20305 if(n >= base) | |
20306 xbits = extra[n - base]; | |
20307 f = tree[n].fc; | |
20308 zip_opt_len += f * (bits + xbits); | |
20309 if(stree != null) | |
20310 zip_static_len += f * (stree[n].dl + xbits); | |
20311 } | |
20312 if(overflow == 0) | |
20313 return; | |
20314 | |
20315 // This happens for example on obj2 and pic of the Calgary corpus | |
20316 | |
20317 // Find the first bit length which could increase: | |
20318 do { | |
20319 bits = max_length - 1; | |
20320 while(zip_bl_count[bits] == 0) | |
20321 bits--; | |
20322 zip_bl_count[bits]--; // move one leaf down the tree | |
20323 zip_bl_count[bits + 1] += 2; // move one overflow item as its brother | |
20324 zip_bl_count[max_length]--; | |
20325 /* The brother of the overflow item also moves one step up, | |
20326 * but this does not affect bl_count[max_length] | |
20327 */ | |
20328 overflow -= 2; | |
20329 } while(overflow > 0); | |
20330 | |
20331 /* Now recompute all bit lengths, scanning in increasing frequency. | |
20332 * h is still equal to HEAP_SIZE. (It is simpler to reconstruct all | |
20333 * lengths instead of fixing only the wrong ones. This idea is taken | |
20334 * from 'ar' written by Haruhiko Okumura.) | |
20335 */ | |
20336 for(bits = max_length; bits != 0; bits--) { | |
20337 n = zip_bl_count[bits]; | |
20338 while(n != 0) { | |
20339 m = zip_heap[--h]; | |
20340 if(m > max_code) | |
20341 continue; | |
20342 if(tree[m].dl != bits) { | |
20343 zip_opt_len += (bits - tree[m].dl) * tree[m].fc; | |
20344 tree[m].fc = bits; | |
20345 } | |
20346 n--; | |
20347 } | |
20348 } | |
20349 } | |
20350 | |
20351 /* ========================================================================== | |
20352 * Generate the codes for a given tree and bit counts (which need not be | |
20353 * optimal). | |
20354 * IN assertion: the array bl_count contains the bit length statistics for | |
20355 * the given tree and the field len is set for all tree elements. | |
20356 * OUT assertion: the field code is set for all tree elements of non | |
20357 * zero code length. | |
20358 */ | |
20359 var zip_gen_codes = function(tree, // the tree to decorate | |
20360 max_code) { // largest code with non zero frequency | |
20361 var next_code = new Array(zip_MAX_BITS+1); // next code value for each bit length | |
20362 var code = 0; // running code value | |
20363 var bits; // bit index | |
20364 var n; // code index | |
20365 | |
20366 /* The distribution counts are first used to generate the code values | |
20367 * without bit reversal. | |
20368 */ | |
20369 for(bits = 1; bits <= zip_MAX_BITS; bits++) { | |
20370 code = ((code + zip_bl_count[bits-1]) << 1); | |
20371 next_code[bits] = code; | |
20372 } | |
20373 | |
20374 /* Check that the bit counts in bl_count are consistent. The last code | |
20375 * must be all ones. | |
20376 */ | |
20377 // Assert (code + encoder->bl_count[MAX_BITS]-1 == (1<<MAX_BITS)-1, | |
20378 // "inconsistent bit counts"); | |
20379 // Tracev((stderr,"\ngen_codes: max_code %d ", max_code)); | |
20380 | |
20381 for(n = 0; n <= max_code; n++) { | |
20382 var len = tree[n].dl; | |
20383 if(len == 0) | |
20384 continue; | |
20385 // Now reverse the bits | |
20386 tree[n].fc = zip_bi_reverse(next_code[len]++, len); | |
20387 | |
20388 // Tracec(tree != static_ltree, (stderr,"\nn %3d %c l %2d c %4x (%x) ", | |
20389 // n, (isgraph(n) ? n : ' '), len, tree[n].fc, next_code[len]-1)); | |
20390 } | |
20391 } | |
20392 | |
20393 /* ========================================================================== | |
20394 * Construct one Huffman tree and assigns the code bit strings and lengths. | |
20395 * Update the total bit length for the current block. | |
20396 * IN assertion: the field freq is set for all tree elements. | |
20397 * OUT assertions: the fields len and code are set to the optimal bit length | |
20398 * and corresponding code. The length opt_len is updated; static_len is | |
20399 * also updated if stree is not null. The field max_code is set. | |
20400 */ | |
20401 var zip_build_tree = function(desc) { // the tree descriptor | |
20402 var tree = desc.dyn_tree; | |
20403 var stree = desc.static_tree; | |
20404 var elems = desc.elems; | |
20405 var n, m; // iterate over heap elements | |
20406 var max_code = -1; // largest code with non zero frequency | |
20407 var node = elems; // next internal node of the tree | |
20408 | |
20409 /* Construct the initial heap, with least frequent element in | |
20410 * heap[SMALLEST]. The sons of heap[n] are heap[2*n] and heap[2*n+1]. | |
20411 * heap[0] is not used. | |
20412 */ | |
20413 zip_heap_len = 0; | |
20414 zip_heap_max = zip_HEAP_SIZE; | |
20415 | |
20416 for(n = 0; n < elems; n++) { | |
20417 if(tree[n].fc != 0) { | |
20418 zip_heap[++zip_heap_len] = max_code = n; | |
20419 zip_depth[n] = 0; | |
20420 } else | |
20421 tree[n].dl = 0; | |
20422 } | |
20423 | |
20424 /* The pkzip format requires that at least one distance code exists, | |
20425 * and that at least one bit should be sent even if there is only one | |
20426 * possible code. So to avoid special checks later on we force at least | |
20427 * two codes of non zero frequency. | |
20428 */ | |
20429 while(zip_heap_len < 2) { | |
20430 var xnew = zip_heap[++zip_heap_len] = (max_code < 2 ? ++max_code : 0); | |
20431 tree[xnew].fc = 1; | |
20432 zip_depth[xnew] = 0; | |
20433 zip_opt_len--; | |
20434 if(stree != null) | |
20435 zip_static_len -= stree[xnew].dl; | |
20436 // new is 0 or 1 so it does not have extra bits | |
20437 } | |
20438 desc.max_code = max_code; | |
20439 | |
20440 /* The elements heap[heap_len/2+1 .. heap_len] are leaves of the tree, | |
20441 * establish sub-heaps of increasing lengths: | |
20442 */ | |
20443 for(n = zip_heap_len >> 1; n >= 1; n--) | |
20444 zip_pqdownheap(tree, n); | |
20445 | |
20446 /* Construct the Huffman tree by repeatedly combining the least two | |
20447 * frequent nodes. | |
20448 */ | |
20449 do { | |
20450 n = zip_heap[zip_SMALLEST]; | |
20451 zip_heap[zip_SMALLEST] = zip_heap[zip_heap_len--]; | |
20452 zip_pqdownheap(tree, zip_SMALLEST); | |
20453 | |
20454 m = zip_heap[zip_SMALLEST]; // m = node of next least frequency | |
20455 | |
20456 // keep the nodes sorted by frequency | |
20457 zip_heap[--zip_heap_max] = n; | |
20458 zip_heap[--zip_heap_max] = m; | |
20459 | |
20460 // Create a new node father of n and m | |
20461 tree[node].fc = tree[n].fc + tree[m].fc; | |
20462 // depth[node] = (char)(MAX(depth[n], depth[m]) + 1); | |
20463 if(zip_depth[n] > zip_depth[m] + 1) | |
20464 zip_depth[node] = zip_depth[n]; | |
20465 else | |
20466 zip_depth[node] = zip_depth[m] + 1; | |
20467 tree[n].dl = tree[m].dl = node; | |
20468 | |
20469 // and insert the new node in the heap | |
20470 zip_heap[zip_SMALLEST] = node++; | |
20471 zip_pqdownheap(tree, zip_SMALLEST); | |
20472 | |
20473 } while(zip_heap_len >= 2); | |
20474 | |
20475 zip_heap[--zip_heap_max] = zip_heap[zip_SMALLEST]; | |
20476 | |
20477 /* At this point, the fields freq and dad are set. We can now | |
20478 * generate the bit lengths. | |
20479 */ | |
20480 zip_gen_bitlen(desc); | |
20481 | |
20482 // The field len is now set, we can generate the bit codes | |
20483 zip_gen_codes(tree, max_code); | |
20484 } | |
20485 | |
20486 /* ========================================================================== | |
20487 * Scan a literal or distance tree to determine the frequencies of the codes | |
20488 * in the bit length tree. Updates opt_len to take into account the repeat | |
20489 * counts. (The contribution of the bit length codes will be added later | |
20490 * during the construction of bl_tree.) | |
20491 */ | |
20492 var zip_scan_tree = function(tree,// the tree to be scanned | |
20493 max_code) { // and its largest code of non zero frequency | |
20494 var n; // iterates over all tree elements | |
20495 var prevlen = -1; // last emitted length | |
20496 var curlen; // length of current code | |
20497 var nextlen = tree[0].dl; // length of next code | |
20498 var count = 0; // repeat count of the current code | |
20499 var max_count = 7; // max repeat count | |
20500 var min_count = 4; // min repeat count | |
20501 | |
20502 if(nextlen == 0) { | |
20503 max_count = 138; | |
20504 min_count = 3; | |
20505 } | |
20506 tree[max_code + 1].dl = 0xffff; // guard | |
20507 | |
20508 for(n = 0; n <= max_code; n++) { | |
20509 curlen = nextlen; | |
20510 nextlen = tree[n + 1].dl; | |
20511 if(++count < max_count && curlen == nextlen) | |
20512 continue; | |
20513 else if(count < min_count) | |
20514 zip_bl_tree[curlen].fc += count; | |
20515 else if(curlen != 0) { | |
20516 if(curlen != prevlen) | |
20517 zip_bl_tree[curlen].fc++; | |
20518 zip_bl_tree[zip_REP_3_6].fc++; | |
20519 } else if(count <= 10) | |
20520 zip_bl_tree[zip_REPZ_3_10].fc++; | |
20521 else | |
20522 zip_bl_tree[zip_REPZ_11_138].fc++; | |
20523 count = 0; prevlen = curlen; | |
20524 if(nextlen == 0) { | |
20525 max_count = 138; | |
20526 min_count = 3; | |
20527 } else if(curlen == nextlen) { | |
20528 max_count = 6; | |
20529 min_count = 3; | |
20530 } else { | |
20531 max_count = 7; | |
20532 min_count = 4; | |
20533 } | |
20534 } | |
20535 } | |
20536 | |
20537 /* ========================================================================== | |
20538 * Send a literal or distance tree in compressed form, using the codes in | |
20539 * bl_tree. | |
20540 */ | |
20541 var zip_send_tree = function(tree, // the tree to be scanned | |
20542 max_code) { // and its largest code of non zero frequency | |
20543 var n; // iterates over all tree elements | |
20544 var prevlen = -1; // last emitted length | |
20545 var curlen; // length of current code | |
20546 var nextlen = tree[0].dl; // length of next code | |
20547 var count = 0; // repeat count of the current code | |
20548 var max_count = 7; // max repeat count | |
20549 var min_count = 4; // min repeat count | |
20550 | |
20551 /* tree[max_code+1].dl = -1; */ /* guard already set */ | |
20552 if(nextlen == 0) { | |
20553 max_count = 138; | |
20554 min_count = 3; | |
20555 } | |
20556 | |
20557 for(n = 0; n <= max_code; n++) { | |
20558 curlen = nextlen; | |
20559 nextlen = tree[n+1].dl; | |
20560 if(++count < max_count && curlen == nextlen) { | |
20561 continue; | |
20562 } else if(count < min_count) { | |
20563 do { zip_SEND_CODE(curlen, zip_bl_tree); } while(--count != 0); | |
20564 } else if(curlen != 0) { | |
20565 if(curlen != prevlen) { | |
20566 zip_SEND_CODE(curlen, zip_bl_tree); | |
20567 count--; | |
20568 } | |
20569 // Assert(count >= 3 && count <= 6, " 3_6?"); | |
20570 zip_SEND_CODE(zip_REP_3_6, zip_bl_tree); | |
20571 zip_send_bits(count - 3, 2); | |
20572 } else if(count <= 10) { | |
20573 zip_SEND_CODE(zip_REPZ_3_10, zip_bl_tree); | |
20574 zip_send_bits(count-3, 3); | |
20575 } else { | |
20576 zip_SEND_CODE(zip_REPZ_11_138, zip_bl_tree); | |
20577 zip_send_bits(count-11, 7); | |
20578 } | |
20579 count = 0; | |
20580 prevlen = curlen; | |
20581 if(nextlen == 0) { | |
20582 max_count = 138; | |
20583 min_count = 3; | |
20584 } else if(curlen == nextlen) { | |
20585 max_count = 6; | |
20586 min_count = 3; | |
20587 } else { | |
20588 max_count = 7; | |
20589 min_count = 4; | |
20590 } | |
20591 } | |
20592 } | |
20593 | |
20594 /* ========================================================================== | |
20595 * Construct the Huffman tree for the bit lengths and return the index in | |
20596 * bl_order of the last bit length code to send. | |
20597 */ | |
20598 var zip_build_bl_tree = function() { | |
20599 var max_blindex; // index of last bit length code of non zero freq | |
20600 | |
20601 // Determine the bit length frequencies for literal and distance trees | |
20602 zip_scan_tree(zip_dyn_ltree, zip_l_desc.max_code); | |
20603 zip_scan_tree(zip_dyn_dtree, zip_d_desc.max_code); | |
20604 | |
20605 // Build the bit length tree: | |
20606 zip_build_tree(zip_bl_desc); | |
20607 /* opt_len now includes the length of the tree representations, except | |
20608 * the lengths of the bit lengths codes and the 5+5+4 bits for the counts. | |
20609 */ | |
20610 | |
20611 /* Determine the number of bit length codes to send. The pkzip format | |
20612 * requires that at least 4 bit length codes be sent. (appnote.txt says | |
20613 * 3 but the actual value used is 4.) | |
20614 */ | |
20615 for(max_blindex = zip_BL_CODES-1; max_blindex >= 3; max_blindex--) { | |
20616 if(zip_bl_tree[zip_bl_order[max_blindex]].dl != 0) break; | |
20617 } | |
20618 /* Update opt_len to include the bit length tree and counts */ | |
20619 zip_opt_len += 3*(max_blindex+1) + 5+5+4; | |
20620 // Tracev((stderr, "\ndyn trees: dyn %ld, stat %ld", | |
20621 // encoder->opt_len, encoder->static_len)); | |
20622 | |
20623 return max_blindex; | |
20624 } | |
20625 | |
20626 /* ========================================================================== | |
20627 * Send the header for a block using dynamic Huffman trees: the counts, the | |
20628 * lengths of the bit length codes, the literal tree and the distance tree. | |
20629 * IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4. | |
20630 */ | |
20631 var zip_send_all_trees = function(lcodes, dcodes, blcodes) { // number of codes for each tree | |
20632 var rank; // index in bl_order | |
20633 | |
20634 // Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, "not enough codes"); | |
20635 // Assert (lcodes <= L_CODES && dcodes <= D_CODES && blcodes <= BL_CODES, | |
20636 // "too many codes"); | |
20637 // Tracev((stderr, "\nbl counts: ")); | |
20638 zip_send_bits(lcodes-257, 5); // not +255 as stated in appnote.txt | |
20639 zip_send_bits(dcodes-1, 5); | |
20640 zip_send_bits(blcodes-4, 4); // not -3 as stated in appnote.txt | |
20641 for(rank = 0; rank < blcodes; rank++) { | |
20642 // Tracev((stderr, "\nbl code %2d ", bl_order[rank])); | |
20643 zip_send_bits(zip_bl_tree[zip_bl_order[rank]].dl, 3); | |
20644 } | |
20645 | |
20646 // send the literal tree | |
20647 zip_send_tree(zip_dyn_ltree,lcodes-1); | |
20648 | |
20649 // send the distance tree | |
20650 zip_send_tree(zip_dyn_dtree,dcodes-1); | |
20651 } | |
20652 | |
20653 /* ========================================================================== | |
20654 * Determine the best encoding for the current block: dynamic trees, static | |
20655 * trees or store, and output the encoded block to the zip file. | |
20656 */ | |
20657 var zip_flush_block = function(eof) { // true if this is the last block for a file | |
20658 var opt_lenb, static_lenb; // opt_len and static_len in bytes | |
20659 var max_blindex; // index of last bit length code of non zero freq | |
20660 var stored_len; // length of input block | |
20661 | |
20662 stored_len = zip_strstart - zip_block_start; | |
20663 zip_flag_buf[zip_last_flags] = zip_flags; // Save the flags for the last 8 items | |
20664 | |
20665 // Construct the literal and distance trees | |
20666 zip_build_tree(zip_l_desc); | |
20667 // Tracev((stderr, "\nlit data: dyn %ld, stat %ld", | |
20668 // encoder->opt_len, encoder->static_len)); | |
20669 | |
20670 zip_build_tree(zip_d_desc); | |
20671 // Tracev((stderr, "\ndist data: dyn %ld, stat %ld", | |
20672 // encoder->opt_len, encoder->static_len)); | |
20673 /* At this point, opt_len and static_len are the total bit lengths of | |
20674 * the compressed block data, excluding the tree representations. | |
20675 */ | |
20676 | |
20677 /* Build the bit length tree for the above two trees, and get the index | |
20678 * in bl_order of the last bit length code to send. | |
20679 */ | |
20680 max_blindex = zip_build_bl_tree(); | |
20681 | |
20682 // Determine the best encoding. Compute first the block length in bytes | |
20683 opt_lenb = (zip_opt_len +3+7)>>3; | |
20684 static_lenb = (zip_static_len+3+7)>>3; | |
20685 | |
20686 // Trace((stderr, "\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u dist %u ", | |
20687 // opt_lenb, encoder->opt_len, | |
20688 // static_lenb, encoder->static_len, stored_len, | |
20689 // encoder->last_lit, encoder->last_dist)); | |
20690 | |
20691 if(static_lenb <= opt_lenb) | |
20692 opt_lenb = static_lenb; | |
20693 if(stored_len + 4 <= opt_lenb // 4: two words for the lengths | |
20694 && zip_block_start >= 0) { | |
20695 var i; | |
20696 | |
20697 /* The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE. | |
20698 * Otherwise we can't have processed more than WSIZE input bytes since | |
20699 * the last block flush, because compression would have been | |
20700 * successful. If LIT_BUFSIZE <= WSIZE, it is never too late to | |
20701 * transform a block into a stored block. | |
20702 */ | |
20703 zip_send_bits((zip_STORED_BLOCK<<1)+eof, 3); /* send block type */ | |
20704 zip_bi_windup(); /* align on byte boundary */ | |
20705 zip_put_short(stored_len); | |
20706 zip_put_short(~stored_len); | |
20707 | |
20708 // copy block | |
20709 /* | |
20710 p = &window[block_start]; | |
20711 for(i = 0; i < stored_len; i++) | |
20712 put_byte(p[i]); | |
20713 */ | |
20714 for(i = 0; i < stored_len; i++) | |
20715 zip_put_byte(zip_window[zip_block_start + i]); | |
20716 | |
20717 } else if(static_lenb == opt_lenb) { | |
20718 zip_send_bits((zip_STATIC_TREES<<1)+eof, 3); | |
20719 zip_compress_block(zip_static_ltree, zip_static_dtree); | |
20720 } else { | |
20721 zip_send_bits((zip_DYN_TREES<<1)+eof, 3); | |
20722 zip_send_all_trees(zip_l_desc.max_code+1, | |
20723 zip_d_desc.max_code+1, | |
20724 max_blindex+1); | |
20725 zip_compress_block(zip_dyn_ltree, zip_dyn_dtree); | |
20726 } | |
20727 | |
20728 zip_init_block(); | |
20729 | |
20730 if(eof != 0) | |
20731 zip_bi_windup(); | |
20732 } | |
20733 | |
20734 /* ========================================================================== | |
20735 * Save the match info and tally the frequency counts. Return true if | |
20736 * the current block must be flushed. | |
20737 */ | |
20738 var zip_ct_tally = function( | |
20739 dist, // distance of matched string | |
20740 lc) { // match length-MIN_MATCH or unmatched char (if dist==0) | |
20741 zip_l_buf[zip_last_lit++] = lc; | |
20742 if(dist == 0) { | |
20743 // lc is the unmatched char | |
20744 zip_dyn_ltree[lc].fc++; | |
20745 } else { | |
20746 // Here, lc is the match length - MIN_MATCH | |
20747 dist--; // dist = match distance - 1 | |
20748 // Assert((ush)dist < (ush)MAX_DIST && | |
20749 // (ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) && | |
20750 // (ush)D_CODE(dist) < (ush)D_CODES, "ct_tally: bad match"); | |
20751 | |
20752 zip_dyn_ltree[zip_length_code[lc]+zip_LITERALS+1].fc++; | |
20753 zip_dyn_dtree[zip_D_CODE(dist)].fc++; | |
20754 | |
20755 zip_d_buf[zip_last_dist++] = dist; | |
20756 zip_flags |= zip_flag_bit; | |
20757 } | |
20758 zip_flag_bit <<= 1; | |
20759 | |
20760 // Output the flags if they fill a byte | |
20761 if((zip_last_lit & 7) == 0) { | |
20762 zip_flag_buf[zip_last_flags++] = zip_flags; | |
20763 zip_flags = 0; | |
20764 zip_flag_bit = 1; | |
20765 } | |
20766 // Try to guess if it is profitable to stop the current block here | |
20767 if(zip_compr_level > 2 && (zip_last_lit & 0xfff) == 0) { | |
20768 // Compute an upper bound for the compressed length | |
20769 var out_length = zip_last_lit * 8; | |
20770 var in_length = zip_strstart - zip_block_start; | |
20771 var dcode; | |
20772 | |
20773 for(dcode = 0; dcode < zip_D_CODES; dcode++) { | |
20774 out_length += zip_dyn_dtree[dcode].fc * (5 + zip_extra_dbits[dcode]); | |
20775 } | |
20776 out_length >>= 3; | |
20777 // Trace((stderr,"\nlast_lit %u, last_dist %u, in %ld, out ~%ld(%ld%%) ", | |
20778 // encoder->last_lit, encoder->last_dist, in_length, out_length, | |
20779 // 100L - out_length*100L/in_length)); | |
20780 if(zip_last_dist < parseInt(zip_last_lit/2) && | |
20781 out_length < parseInt(in_length/2)) | |
20782 return true; | |
20783 } | |
20784 return (zip_last_lit == zip_LIT_BUFSIZE-1 || | |
20785 zip_last_dist == zip_DIST_BUFSIZE); | |
20786 /* We avoid equality with LIT_BUFSIZE because of wraparound at 64K | |
20787 * on 16 bit machines and because stored blocks are restricted to | |
20788 * 64K-1 bytes. | |
20789 */ | |
20790 } | |
20791 | |
20792 /* ========================================================================== | |
20793 * Send the block data compressed using the given Huffman trees | |
20794 */ | |
20795 var zip_compress_block = function( | |
20796 ltree, // literal tree | |
20797 dtree) { // distance tree | |
20798 var dist; // distance of matched string | |
20799 var lc; // match length or unmatched char (if dist == 0) | |
20800 var lx = 0; // running index in l_buf | |
20801 var dx = 0; // running index in d_buf | |
20802 var fx = 0; // running index in flag_buf | |
20803 var flag = 0; // current flags | |
20804 var code; // the code to send | |
20805 var extra; // number of extra bits to send | |
20806 | |
20807 if(zip_last_lit != 0) do { | |
20808 if((lx & 7) == 0) | |
20809 flag = zip_flag_buf[fx++]; | |
20810 lc = zip_l_buf[lx++] & 0xff; | |
20811 if((flag & 1) == 0) { | |
20812 zip_SEND_CODE(lc, ltree); /* send a literal byte */ | |
20813 // Tracecv(isgraph(lc), (stderr," '%c' ", lc)); | |
20814 } else { | |
20815 // Here, lc is the match length - MIN_MATCH | |
20816 code = zip_length_code[lc]; | |
20817 zip_SEND_CODE(code+zip_LITERALS+1, ltree); // send the length code | |
20818 extra = zip_extra_lbits[code]; | |
20819 if(extra != 0) { | |
20820 lc -= zip_base_length[code]; | |
20821 zip_send_bits(lc, extra); // send the extra length bits | |
20822 } | |
20823 dist = zip_d_buf[dx++]; | |
20824 // Here, dist is the match distance - 1 | |
20825 code = zip_D_CODE(dist); | |
20826 // Assert (code < D_CODES, "bad d_code"); | |
20827 | |
20828 zip_SEND_CODE(code, dtree); // send the distance code | |
20829 extra = zip_extra_dbits[code]; | |
20830 if(extra != 0) { | |
20831 dist -= zip_base_dist[code]; | |
20832 zip_send_bits(dist, extra); // send the extra distance bits | |
20833 } | |
20834 } // literal or match pair ? | |
20835 flag >>= 1; | |
20836 } while(lx < zip_last_lit); | |
20837 | |
20838 zip_SEND_CODE(zip_END_BLOCK, ltree); | |
20839 } | |
20840 | |
20841 /* ========================================================================== | |
20842 * Send a value on a given number of bits. | |
20843 * IN assertion: length <= 16 and value fits in length bits. | |
20844 */ | |
20845 var zip_Buf_size = 16; // bit size of bi_buf | |
20846 var zip_send_bits = function( | |
20847 value, // value to send | |
20848 length) { // number of bits | |
20849 /* If not enough room in bi_buf, use (valid) bits from bi_buf and | |
20850 * (16 - bi_valid) bits from value, leaving (width - (16-bi_valid)) | |
20851 * unused bits in value. | |
20852 */ | |
20853 if(zip_bi_valid > zip_Buf_size - length) { | |
20854 zip_bi_buf |= (value << zip_bi_valid); | |
20855 zip_put_short(zip_bi_buf); | |
20856 zip_bi_buf = (value >> (zip_Buf_size - zip_bi_valid)); | |
20857 zip_bi_valid += length - zip_Buf_size; | |
20858 } else { | |
20859 zip_bi_buf |= value << zip_bi_valid; | |
20860 zip_bi_valid += length; | |
20861 } | |
20862 } | |
20863 | |
20864 /* ========================================================================== | |
20865 * Reverse the first len bits of a code, using straightforward code (a faster | |
20866 * method would use a table) | |
20867 * IN assertion: 1 <= len <= 15 | |
20868 */ | |
20869 var zip_bi_reverse = function( | |
20870 code, // the value to invert | |
20871 len) { // its bit length | |
20872 var res = 0; | |
20873 do { | |
20874 res |= code & 1; | |
20875 code >>= 1; | |
20876 res <<= 1; | |
20877 } while(--len > 0); | |
20878 return res >> 1; | |
20879 } | |
20880 | |
20881 /* ========================================================================== | |
20882 * Write out any remaining bits in an incomplete byte. | |
20883 */ | |
20884 var zip_bi_windup = function() { | |
20885 if(zip_bi_valid > 8) { | |
20886 zip_put_short(zip_bi_buf); | |
20887 } else if(zip_bi_valid > 0) { | |
20888 zip_put_byte(zip_bi_buf); | |
20889 } | |
20890 zip_bi_buf = 0; | |
20891 zip_bi_valid = 0; | |
20892 } | |
20893 | |
20894 var zip_qoutbuf = function() { | |
20895 if(zip_outcnt != 0) { | |
20896 var q, i; | |
20897 q = zip_new_queue(); | |
20898 if(zip_qhead == null) | |
20899 zip_qhead = zip_qtail = q; | |
20900 else | |
20901 zip_qtail = zip_qtail.next = q; | |
20902 q.len = zip_outcnt - zip_outoff; | |
20903 // System.arraycopy(zip_outbuf, zip_outoff, q.ptr, 0, q.len); | |
20904 for(i = 0; i < q.len; i++) | |
20905 q.ptr[i] = zip_outbuf[zip_outoff + i]; | |
20906 zip_outcnt = zip_outoff = 0; | |
20907 } | |
20908 } | |
20909 | |
20910 var zip_deflate = function(str, level) { | |
20911 var i, j; | |
20912 | |
20913 zip_deflate_data = str; | |
20914 zip_deflate_pos = 0; | |
20915 if(typeof level == "undefined") | |
20916 level = zip_DEFAULT_LEVEL; | |
20917 zip_deflate_start(level); | |
20918 | |
20919 var buff = new Array(1024); | |
20920 var aout = []; | |
20921 while((i = zip_deflate_internal(buff, 0, buff.length)) > 0) { | |
20922 var cbuf = new Array(i); | |
20923 for(j = 0; j < i; j++){ | |
20924 cbuf[j] = String.fromCharCode(buff[j]); | |
20925 } | |
20926 aout[aout.length] = cbuf.join(""); | |
20927 } | |
20928 zip_deflate_data = null; // G.C. | |
20929 return aout.join(""); | |
20930 } | |
20931 | |
20932 // | |
20933 // end of the script of Masanao Izumo. | |
20934 // | |
20935 | |
20936 // we add the compression method for JSZip | |
20937 if(!JSZip.compressions["DEFLATE"]) { | |
20938 JSZip.compressions["DEFLATE"] = { | |
20939 magic : "\x08\x00", | |
20940 compress : zip_deflate | |
20941 } | |
20942 } else { | |
20943 JSZip.compressions["DEFLATE"].compress = zip_deflate; | |
20944 } | |
20945 | |
20946 })(); | |
20947 | |
20948 // enforcing Stuk's coding style | |
20949 // vim: set shiftwidth=3 softtabstop=3: | |
20950 /* | |
20951 * Port of a script by Masanao Izumo. | |
20952 * | |
20953 * Only changes : wrap all the variables in a function and add the | |
20954 * main function to JSZip (DEFLATE compression method). | |
20955 * Everything else was written by M. Izumo. | |
20956 * | |
20957 * Original code can be found here: http://www.onicos.com/staff/iz/amuse/javascript/expert/inflate.txt | |
20958 */ | |
20959 | |
20960 if(!JSZip) { | |
20961 throw "JSZip not defined"; | |
20962 } | |
20963 | |
20964 /* | |
20965 * Original: | |
20966 * http://www.onicos.com/staff/iz/amuse/javascript/expert/inflate.txt | |
20967 */ | |
20968 | |
20969 (function(){ | |
20970 // the original implementation leaks a global variable. | |
20971 // Defining the variable here doesn't break anything. | |
20972 var zip_fixed_bd; | |
20973 | |
20974 /* Copyright (C) 1999 Masanao Izumo <iz@onicos.co.jp> | |
20975 * Version: 1.0.0.1 | |
20976 * LastModified: Dec 25 1999 | |
20977 */ | |
20978 | |
20979 /* Interface: | |
20980 * data = zip_inflate(src); | |
20981 */ | |
20982 | |
20983 /* constant parameters */ | |
20984 var zip_WSIZE = 32768; // Sliding Window size | |
20985 var zip_STORED_BLOCK = 0; | |
20986 var zip_STATIC_TREES = 1; | |
20987 var zip_DYN_TREES = 2; | |
20988 | |
20989 /* for inflate */ | |
20990 var zip_lbits = 9; // bits in base literal/length lookup table | |
20991 var zip_dbits = 6; // bits in base distance lookup table | |
20992 var zip_INBUFSIZ = 32768; // Input buffer size | |
20993 var zip_INBUF_EXTRA = 64; // Extra buffer | |
20994 | |
20995 /* variables (inflate) */ | |
20996 var zip_slide; | |
20997 var zip_wp; // current position in slide | |
20998 var zip_fixed_tl = null; // inflate static | |
20999 var zip_fixed_td; // inflate static | |
21000 var zip_fixed_bl, fixed_bd; // inflate static | |
21001 var zip_bit_buf; // bit buffer | |
21002 var zip_bit_len; // bits in bit buffer | |
21003 var zip_method; | |
21004 var zip_eof; | |
21005 var zip_copy_leng; | |
21006 var zip_copy_dist; | |
21007 var zip_tl, zip_td; // literal/length and distance decoder tables | |
21008 var zip_bl, zip_bd; // number of bits decoded by tl and td | |
21009 | |
21010 var zip_inflate_data; | |
21011 var zip_inflate_pos; | |
21012 | |
21013 | |
21014 /* constant tables (inflate) */ | |
21015 var zip_MASK_BITS = new Array( | |
21016 0x0000, | |
21017 0x0001, 0x0003, 0x0007, 0x000f, 0x001f, 0x003f, 0x007f, 0x00ff, | |
21018 0x01ff, 0x03ff, 0x07ff, 0x0fff, 0x1fff, 0x3fff, 0x7fff, 0xffff); | |
21019 // Tables for deflate from PKZIP's appnote.txt. | |
21020 var zip_cplens = new Array( // Copy lengths for literal codes 257..285 | |
21021 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, | |
21022 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0); | |
21023 /* note: see note #13 above about the 258 in this list. */ | |
21024 var zip_cplext = new Array( // Extra bits for literal codes 257..285 | |
21025 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, | |
21026 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, 99, 99); // 99==invalid | |
21027 var zip_cpdist = new Array( // Copy offsets for distance codes 0..29 | |
21028 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, | |
21029 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, | |
21030 8193, 12289, 16385, 24577); | |
21031 var zip_cpdext = new Array( // Extra bits for distance codes | |
21032 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, | |
21033 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, | |
21034 12, 12, 13, 13); | |
21035 var zip_border = new Array( // Order of the bit length code lengths | |
21036 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15); | |
21037 /* objects (inflate) */ | |
21038 | |
21039 function zip_HuftList() { | |
21040 this.next = null; | |
21041 this.list = null; | |
21042 } | |
21043 | |
21044 function zip_HuftNode() { | |
21045 this.e = 0; // number of extra bits or operation | |
21046 this.b = 0; // number of bits in this code or subcode | |
21047 | |
21048 // union | |
21049 this.n = 0; // literal, length base, or distance base | |
21050 this.t = null; // (zip_HuftNode) pointer to next level of table | |
21051 } | |
21052 | |
21053 function zip_HuftBuild(b, // code lengths in bits (all assumed <= BMAX) | |
21054 n, // number of codes (assumed <= N_MAX) | |
21055 s, // number of simple-valued codes (0..s-1) | |
21056 d, // list of base values for non-simple codes | |
21057 e, // list of extra bits for non-simple codes | |
21058 mm // maximum lookup bits | |
21059 ) { | |
21060 this.BMAX = 16; // maximum bit length of any code | |
21061 this.N_MAX = 288; // maximum number of codes in any set | |
21062 this.status = 0; // 0: success, 1: incomplete table, 2: bad input | |
21063 this.root = null; // (zip_HuftList) starting table | |
21064 this.m = 0; // maximum lookup bits, returns actual | |
21065 | |
21066 /* Given a list of code lengths and a maximum table size, make a set of | |
21067 tables to decode that set of codes. Return zero on success, one if | |
21068 the given code set is incomplete (the tables are still built in this | |
21069 case), two if the input is invalid (all zero length codes or an | |
21070 oversubscribed set of lengths), and three if not enough memory. | |
21071 The code with value 256 is special, and the tables are constructed | |
21072 so that no bits beyond that code are fetched when that code is | |
21073 decoded. */ | |
21074 { | |
21075 var a; // counter for codes of length k | |
21076 var c = new Array(this.BMAX+1); // bit length count table | |
21077 var el; // length of EOB code (value 256) | |
21078 var f; // i repeats in table every f entries | |
21079 var g; // maximum code length | |
21080 var h; // table level | |
21081 var i; // counter, current code | |
21082 var j; // counter | |
21083 var k; // number of bits in current code | |
21084 var lx = new Array(this.BMAX+1); // stack of bits per table | |
21085 var p; // pointer into c[], b[], or v[] | |
21086 var pidx; // index of p | |
21087 var q; // (zip_HuftNode) points to current table | |
21088 var r = new zip_HuftNode(); // table entry for structure assignment | |
21089 var u = new Array(this.BMAX); // zip_HuftNode[BMAX][] table stack | |
21090 var v = new Array(this.N_MAX); // values in order of bit length | |
21091 var w; | |
21092 var x = new Array(this.BMAX+1);// bit offsets, then code stack | |
21093 var xp; // pointer into x or c | |
21094 var y; // number of dummy codes added | |
21095 var z; // number of entries in current table | |
21096 var o; | |
21097 var tail; // (zip_HuftList) | |
21098 | |
21099 tail = this.root = null; | |
21100 for(i = 0; i < c.length; i++) | |
21101 c[i] = 0; | |
21102 for(i = 0; i < lx.length; i++) | |
21103 lx[i] = 0; | |
21104 for(i = 0; i < u.length; i++) | |
21105 u[i] = null; | |
21106 for(i = 0; i < v.length; i++) | |
21107 v[i] = 0; | |
21108 for(i = 0; i < x.length; i++) | |
21109 x[i] = 0; | |
21110 | |
21111 // Generate counts for each bit length | |
21112 el = n > 256 ? b[256] : this.BMAX; // set length of EOB code, if any | |
21113 p = b; pidx = 0; | |
21114 i = n; | |
21115 do { | |
21116 c[p[pidx]]++; // assume all entries <= BMAX | |
21117 pidx++; | |
21118 } while(--i > 0); | |
21119 if(c[0] == n) { // null input--all zero length codes | |
21120 this.root = null; | |
21121 this.m = 0; | |
21122 this.status = 0; | |
21123 return; | |
21124 } | |
21125 | |
21126 // Find minimum and maximum length, bound *m by those | |
21127 for(j = 1; j <= this.BMAX; j++) | |
21128 if(c[j] != 0) | |
21129 break; | |
21130 k = j; // minimum code length | |
21131 if(mm < j) | |
21132 mm = j; | |
21133 for(i = this.BMAX; i != 0; i--) | |
21134 if(c[i] != 0) | |
21135 break; | |
21136 g = i; // maximum code length | |
21137 if(mm > i) | |
21138 mm = i; | |
21139 | |
21140 // Adjust last length count to fill out codes, if needed | |
21141 for(y = 1 << j; j < i; j++, y <<= 1) | |
21142 if((y -= c[j]) < 0) { | |
21143 this.status = 2; // bad input: more codes than bits | |
21144 this.m = mm; | |
21145 return; | |
21146 } | |
21147 if((y -= c[i]) < 0) { | |
21148 this.status = 2; | |
21149 this.m = mm; | |
21150 return; | |
21151 } | |
21152 c[i] += y; | |
21153 | |
21154 // Generate starting offsets into the value table for each length | |
21155 x[1] = j = 0; | |
21156 p = c; | |
21157 pidx = 1; | |
21158 xp = 2; | |
21159 while(--i > 0) // note that i == g from above | |
21160 x[xp++] = (j += p[pidx++]); | |
21161 | |
21162 // Make a table of values in order of bit lengths | |
21163 p = b; pidx = 0; | |
21164 i = 0; | |
21165 do { | |
21166 if((j = p[pidx++]) != 0) | |
21167 v[x[j]++] = i; | |
21168 } while(++i < n); | |
21169 n = x[g]; // set n to length of v | |
21170 | |
21171 // Generate the Huffman codes and for each, make the table entries | |
21172 x[0] = i = 0; // first Huffman code is zero | |
21173 p = v; pidx = 0; // grab values in bit order | |
21174 h = -1; // no tables yet--level -1 | |
21175 w = lx[0] = 0; // no bits decoded yet | |
21176 q = null; // ditto | |
21177 z = 0; // ditto | |
21178 | |
21179 // go through the bit lengths (k already is bits in shortest code) | |
21180 for(; k <= g; k++) { | |
21181 a = c[k]; | |
21182 while(a-- > 0) { | |
21183 // here i is the Huffman code of length k bits for value p[pidx] | |
21184 // make tables up to required level | |
21185 while(k > w + lx[1 + h]) { | |
21186 w += lx[1 + h]; // add bits already decoded | |
21187 h++; | |
21188 | |
21189 // compute minimum size table less than or equal to *m bits | |
21190 z = (z = g - w) > mm ? mm : z; // upper limit | |
21191 if((f = 1 << (j = k - w)) > a + 1) { // try a k-w bit table | |
21192 // too few codes for k-w bit table | |
21193 f -= a + 1; // deduct codes from patterns left | |
21194 xp = k; | |
21195 while(++j < z) { // try smaller tables up to z bits | |
21196 if((f <<= 1) <= c[++xp]) | |
21197 break; // enough codes to use up j bits | |
21198 f -= c[xp]; // else deduct codes from patterns | |
21199 } | |
21200 } | |
21201 if(w + j > el && w < el) | |
21202 j = el - w; // make EOB code end at table | |
21203 z = 1 << j; // table entries for j-bit table | |
21204 lx[1 + h] = j; // set table size in stack | |
21205 | |
21206 // allocate and link in new table | |
21207 q = new Array(z); | |
21208 for(o = 0; o < z; o++) { | |
21209 q[o] = new zip_HuftNode(); | |
21210 } | |
21211 | |
21212 if(tail == null) | |
21213 tail = this.root = new zip_HuftList(); | |
21214 else | |
21215 tail = tail.next = new zip_HuftList(); | |
21216 tail.next = null; | |
21217 tail.list = q; | |
21218 u[h] = q; // table starts after link | |
21219 | |
21220 /* connect to last table, if there is one */ | |
21221 if(h > 0) { | |
21222 x[h] = i; // save pattern for backing up | |
21223 r.b = lx[h]; // bits to dump before this table | |
21224 r.e = 16 + j; // bits in this table | |
21225 r.t = q; // pointer to this table | |
21226 j = (i & ((1 << w) - 1)) >> (w - lx[h]); | |
21227 u[h-1][j].e = r.e; | |
21228 u[h-1][j].b = r.b; | |
21229 u[h-1][j].n = r.n; | |
21230 u[h-1][j].t = r.t; | |
21231 } | |
21232 } | |
21233 | |
21234 // set up table entry in r | |
21235 r.b = k - w; | |
21236 if(pidx >= n) | |
21237 r.e = 99; // out of values--invalid code | |
21238 else if(p[pidx] < s) { | |
21239 r.e = (p[pidx] < 256 ? 16 : 15); // 256 is end-of-block code | |
21240 r.n = p[pidx++]; // simple code is just the value | |
21241 } else { | |
21242 r.e = e[p[pidx] - s]; // non-simple--look up in lists | |
21243 r.n = d[p[pidx++] - s]; | |
21244 } | |
21245 | |
21246 // fill code-like entries with r // | |
21247 f = 1 << (k - w); | |
21248 for(j = i >> w; j < z; j += f) { | |
21249 q[j].e = r.e; | |
21250 q[j].b = r.b; | |
21251 q[j].n = r.n; | |
21252 q[j].t = r.t; | |
21253 } | |
21254 | |
21255 // backwards increment the k-bit code i | |
21256 for(j = 1 << (k - 1); (i & j) != 0; j >>= 1) | |
21257 i ^= j; | |
21258 i ^= j; | |
21259 | |
21260 // backup over finished tables | |
21261 while((i & ((1 << w) - 1)) != x[h]) { | |
21262 w -= lx[h]; // don't need to update q | |
21263 h--; | |
21264 } | |
21265 } | |
21266 } | |
21267 | |
21268 /* return actual size of base table */ | |
21269 this.m = lx[1]; | |
21270 | |
21271 /* Return true (1) if we were given an incomplete table */ | |
21272 this.status = ((y != 0 && g != 1) ? 1 : 0); | |
21273 } /* end of constructor */ | |
21274 } | |
21275 | |
21276 | |
21277 /* routines (inflate) */ | |
21278 | |
21279 function zip_GET_BYTE() { | |
21280 if(zip_inflate_data.length == zip_inflate_pos) | |
21281 return -1; | |
21282 return zip_inflate_data.charCodeAt(zip_inflate_pos++) & 0xff; | |
21283 } | |
21284 | |
21285 function zip_NEEDBITS(n) { | |
21286 while(zip_bit_len < n) { | |
21287 zip_bit_buf |= zip_GET_BYTE() << zip_bit_len; | |
21288 zip_bit_len += 8; | |
21289 } | |
21290 } | |
21291 | |
21292 function zip_GETBITS(n) { | |
21293 return zip_bit_buf & zip_MASK_BITS[n]; | |
21294 } | |
21295 | |
21296 function zip_DUMPBITS(n) { | |
21297 zip_bit_buf >>= n; | |
21298 zip_bit_len -= n; | |
21299 } | |
21300 | |
21301 function zip_inflate_codes(buff, off, size) { | |
21302 /* inflate (decompress) the codes in a deflated (compressed) block. | |
21303 Return an error code or zero if it all goes ok. */ | |
21304 var e; // table entry flag/number of extra bits | |
21305 var t; // (zip_HuftNode) pointer to table entry | |
21306 var n; | |
21307 | |
21308 if(size == 0) | |
21309 return 0; | |
21310 | |
21311 // inflate the coded data | |
21312 n = 0; | |
21313 for(;;) { // do until end of block | |
21314 zip_NEEDBITS(zip_bl); | |
21315 t = zip_tl.list[zip_GETBITS(zip_bl)]; | |
21316 e = t.e; | |
21317 while(e > 16) { | |
21318 if(e == 99) | |
21319 return -1; | |
21320 zip_DUMPBITS(t.b); | |
21321 e -= 16; | |
21322 zip_NEEDBITS(e); | |
21323 t = t.t[zip_GETBITS(e)]; | |
21324 e = t.e; | |
21325 } | |
21326 zip_DUMPBITS(t.b); | |
21327 | |
21328 if(e == 16) { // then it's a literal | |
21329 zip_wp &= zip_WSIZE - 1; | |
21330 buff[off + n++] = zip_slide[zip_wp++] = t.n; | |
21331 if(n == size) | |
21332 return size; | |
21333 continue; | |
21334 } | |
21335 | |
21336 // exit if end of block | |
21337 if(e == 15) | |
21338 break; | |
21339 | |
21340 // it's an EOB or a length | |
21341 | |
21342 // get length of block to copy | |
21343 zip_NEEDBITS(e); | |
21344 zip_copy_leng = t.n + zip_GETBITS(e); | |
21345 zip_DUMPBITS(e); | |
21346 | |
21347 // decode distance of block to copy | |
21348 zip_NEEDBITS(zip_bd); | |
21349 t = zip_td.list[zip_GETBITS(zip_bd)]; | |
21350 e = t.e; | |
21351 | |
21352 while(e > 16) { | |
21353 if(e == 99) | |
21354 return -1; | |
21355 zip_DUMPBITS(t.b); | |
21356 e -= 16; | |
21357 zip_NEEDBITS(e); | |
21358 t = t.t[zip_GETBITS(e)]; | |
21359 e = t.e; | |
21360 } | |
21361 zip_DUMPBITS(t.b); | |
21362 zip_NEEDBITS(e); | |
21363 zip_copy_dist = zip_wp - t.n - zip_GETBITS(e); | |
21364 zip_DUMPBITS(e); | |
21365 | |
21366 // do the copy | |
21367 while(zip_copy_leng > 0 && n < size) { | |
21368 zip_copy_leng--; | |
21369 zip_copy_dist &= zip_WSIZE - 1; | |
21370 zip_wp &= zip_WSIZE - 1; | |
21371 buff[off + n++] = zip_slide[zip_wp++] | |
21372 = zip_slide[zip_copy_dist++]; | |
21373 } | |
21374 | |
21375 if(n == size) | |
21376 return size; | |
21377 } | |
21378 | |
21379 zip_method = -1; // done | |
21380 return n; | |
21381 } | |
21382 | |
21383 function zip_inflate_stored(buff, off, size) { | |
21384 /* "decompress" an inflated type 0 (stored) block. */ | |
21385 var n; | |
21386 | |
21387 // go to byte boundary | |
21388 n = zip_bit_len & 7; | |
21389 zip_DUMPBITS(n); | |
21390 | |
21391 // get the length and its complement | |
21392 zip_NEEDBITS(16); | |
21393 n = zip_GETBITS(16); | |
21394 zip_DUMPBITS(16); | |
21395 zip_NEEDBITS(16); | |
21396 if(n != ((~zip_bit_buf) & 0xffff)) | |
21397 return -1; // error in compressed data | |
21398 zip_DUMPBITS(16); | |
21399 | |
21400 // read and output the compressed data | |
21401 zip_copy_leng = n; | |
21402 | |
21403 n = 0; | |
21404 while(zip_copy_leng > 0 && n < size) { | |
21405 zip_copy_leng--; | |
21406 zip_wp &= zip_WSIZE - 1; | |
21407 zip_NEEDBITS(8); | |
21408 buff[off + n++] = zip_slide[zip_wp++] = | |
21409 zip_GETBITS(8); | |
21410 zip_DUMPBITS(8); | |
21411 } | |
21412 | |
21413 if(zip_copy_leng == 0) | |
21414 zip_method = -1; // done | |
21415 return n; | |
21416 } | |
21417 | |
21418 function zip_inflate_fixed(buff, off, size) { | |
21419 /* decompress an inflated type 1 (fixed Huffman codes) block. We should | |
21420 either replace this with a custom decoder, or at least precompute the | |
21421 Huffman tables. */ | |
21422 | |
21423 // if first time, set up tables for fixed blocks | |
21424 if(zip_fixed_tl == null) { | |
21425 var i; // temporary variable | |
21426 var l = new Array(288); // length list for huft_build | |
21427 var h; // zip_HuftBuild | |
21428 | |
21429 // literal table | |
21430 for(i = 0; i < 144; i++) | |
21431 l[i] = 8; | |
21432 for(; i < 256; i++) | |
21433 l[i] = 9; | |
21434 for(; i < 280; i++) | |
21435 l[i] = 7; | |
21436 for(; i < 288; i++) // make a complete, but wrong code set | |
21437 l[i] = 8; | |
21438 zip_fixed_bl = 7; | |
21439 | |
21440 h = new zip_HuftBuild(l, 288, 257, zip_cplens, zip_cplext, | |
21441 zip_fixed_bl); | |
21442 if(h.status != 0) { | |
21443 alert("HufBuild error: "+h.status); | |
21444 return -1; | |
21445 } | |
21446 zip_fixed_tl = h.root; | |
21447 zip_fixed_bl = h.m; | |
21448 | |
21449 // distance table | |
21450 for(i = 0; i < 30; i++) // make an incomplete code set | |
21451 l[i] = 5; | |
21452 zip_fixed_bd = 5; | |
21453 | |
21454 h = new zip_HuftBuild(l, 30, 0, zip_cpdist, zip_cpdext, zip_fixed_bd); | |
21455 if(h.status > 1) { | |
21456 zip_fixed_tl = null; | |
21457 alert("HufBuild error: "+h.status); | |
21458 return -1; | |
21459 } | |
21460 zip_fixed_td = h.root; | |
21461 zip_fixed_bd = h.m; | |
21462 } | |
21463 | |
21464 zip_tl = zip_fixed_tl; | |
21465 zip_td = zip_fixed_td; | |
21466 zip_bl = zip_fixed_bl; | |
21467 zip_bd = zip_fixed_bd; | |
21468 return zip_inflate_codes(buff, off, size); | |
21469 } | |
21470 | |
21471 function zip_inflate_dynamic(buff, off, size) { | |
21472 // decompress an inflated type 2 (dynamic Huffman codes) block. | |
21473 var i; // temporary variables | |
21474 var j; | |
21475 var l; // last length | |
21476 var n; // number of lengths to get | |
21477 var t; // (zip_HuftNode) literal/length code table | |
21478 var nb; // number of bit length codes | |
21479 var nl; // number of literal/length codes | |
21480 var nd; // number of distance codes | |
21481 var ll = new Array(286+30); // literal/length and distance code lengths | |
21482 var h; // (zip_HuftBuild) | |
21483 | |
21484 for(i = 0; i < ll.length; i++) | |
21485 ll[i] = 0; | |
21486 | |
21487 // read in table lengths | |
21488 zip_NEEDBITS(5); | |
21489 nl = 257 + zip_GETBITS(5); // number of literal/length codes | |
21490 zip_DUMPBITS(5); | |
21491 zip_NEEDBITS(5); | |
21492 nd = 1 + zip_GETBITS(5); // number of distance codes | |
21493 zip_DUMPBITS(5); | |
21494 zip_NEEDBITS(4); | |
21495 nb = 4 + zip_GETBITS(4); // number of bit length codes | |
21496 zip_DUMPBITS(4); | |
21497 if(nl > 286 || nd > 30) | |
21498 return -1; // bad lengths | |
21499 | |
21500 // read in bit-length-code lengths | |
21501 for(j = 0; j < nb; j++) | |
21502 { | |
21503 zip_NEEDBITS(3); | |
21504 ll[zip_border[j]] = zip_GETBITS(3); | |
21505 zip_DUMPBITS(3); | |
21506 } | |
21507 for(; j < 19; j++) | |
21508 ll[zip_border[j]] = 0; | |
21509 | |
21510 // build decoding table for trees--single level, 7 bit lookup | |
21511 zip_bl = 7; | |
21512 h = new zip_HuftBuild(ll, 19, 19, null, null, zip_bl); | |
21513 if(h.status != 0) | |
21514 return -1; // incomplete code set | |
21515 | |
21516 zip_tl = h.root; | |
21517 zip_bl = h.m; | |
21518 | |
21519 // read in literal and distance code lengths | |
21520 n = nl + nd; | |
21521 i = l = 0; | |
21522 while(i < n) { | |
21523 zip_NEEDBITS(zip_bl); | |
21524 t = zip_tl.list[zip_GETBITS(zip_bl)]; | |
21525 j = t.b; | |
21526 zip_DUMPBITS(j); | |
21527 j = t.n; | |
21528 if(j < 16) // length of code in bits (0..15) | |
21529 ll[i++] = l = j; // save last length in l | |
21530 else if(j == 16) { // repeat last length 3 to 6 times | |
21531 zip_NEEDBITS(2); | |
21532 j = 3 + zip_GETBITS(2); | |
21533 zip_DUMPBITS(2); | |
21534 if(i + j > n) | |
21535 return -1; | |
21536 while(j-- > 0) | |
21537 ll[i++] = l; | |
21538 } else if(j == 17) { // 3 to 10 zero length codes | |
21539 zip_NEEDBITS(3); | |
21540 j = 3 + zip_GETBITS(3); | |
21541 zip_DUMPBITS(3); | |
21542 if(i + j > n) | |
21543 return -1; | |
21544 while(j-- > 0) | |
21545 ll[i++] = 0; | |
21546 l = 0; | |
21547 } else { // j == 18: 11 to 138 zero length codes | |
21548 zip_NEEDBITS(7); | |
21549 j = 11 + zip_GETBITS(7); | |
21550 zip_DUMPBITS(7); | |
21551 if(i + j > n) | |
21552 return -1; | |
21553 while(j-- > 0) | |
21554 ll[i++] = 0; | |
21555 l = 0; | |
21556 } | |
21557 } | |
21558 | |
21559 // build the decoding tables for literal/length and distance codes | |
21560 zip_bl = zip_lbits; | |
21561 h = new zip_HuftBuild(ll, nl, 257, zip_cplens, zip_cplext, zip_bl); | |
21562 if(zip_bl == 0) // no literals or lengths | |
21563 h.status = 1; | |
21564 if(h.status != 0) { | |
21565 if(h.status == 1) | |
21566 ;// **incomplete literal tree** | |
21567 return -1; // incomplete code set | |
21568 } | |
21569 zip_tl = h.root; | |
21570 zip_bl = h.m; | |
21571 | |
21572 for(i = 0; i < nd; i++) | |
21573 ll[i] = ll[i + nl]; | |
21574 zip_bd = zip_dbits; | |
21575 h = new zip_HuftBuild(ll, nd, 0, zip_cpdist, zip_cpdext, zip_bd); | |
21576 zip_td = h.root; | |
21577 zip_bd = h.m; | |
21578 | |
21579 if(zip_bd == 0 && nl > 257) { // lengths but no distances | |
21580 // **incomplete distance tree** | |
21581 return -1; | |
21582 } | |
21583 | |
21584 if(h.status == 1) { | |
21585 ;// **incomplete distance tree** | |
21586 } | |
21587 if(h.status != 0) | |
21588 return -1; | |
21589 | |
21590 // decompress until an end-of-block code | |
21591 return zip_inflate_codes(buff, off, size); | |
21592 } | |
21593 | |
21594 function zip_inflate_start() { | |
21595 var i; | |
21596 | |
21597 if(zip_slide == null) | |
21598 zip_slide = new Array(2 * zip_WSIZE); | |
21599 zip_wp = 0; | |
21600 zip_bit_buf = 0; | |
21601 zip_bit_len = 0; | |
21602 zip_method = -1; | |
21603 zip_eof = false; | |
21604 zip_copy_leng = zip_copy_dist = 0; | |
21605 zip_tl = null; | |
21606 } | |
21607 | |
21608 function zip_inflate_internal(buff, off, size) { | |
21609 // decompress an inflated entry | |
21610 var n, i; | |
21611 | |
21612 n = 0; | |
21613 while(n < size) { | |
21614 if(zip_eof && zip_method == -1) | |
21615 return n; | |
21616 | |
21617 if(zip_copy_leng > 0) { | |
21618 if(zip_method != zip_STORED_BLOCK) { | |
21619 // STATIC_TREES or DYN_TREES | |
21620 while(zip_copy_leng > 0 && n < size) { | |
21621 zip_copy_leng--; | |
21622 zip_copy_dist &= zip_WSIZE - 1; | |
21623 zip_wp &= zip_WSIZE - 1; | |
21624 buff[off + n++] = zip_slide[zip_wp++] = | |
21625 zip_slide[zip_copy_dist++]; | |
21626 } | |
21627 } else { | |
21628 while(zip_copy_leng > 0 && n < size) { | |
21629 zip_copy_leng--; | |
21630 zip_wp &= zip_WSIZE - 1; | |
21631 zip_NEEDBITS(8); | |
21632 buff[off + n++] = zip_slide[zip_wp++] = zip_GETBITS(8); | |
21633 zip_DUMPBITS(8); | |
21634 } | |
21635 if(zip_copy_leng == 0) | |
21636 zip_method = -1; // done | |
21637 } | |
21638 if(n == size) | |
21639 return n; | |
21640 } | |
21641 | |
21642 if(zip_method == -1) { | |
21643 if(zip_eof) | |
21644 break; | |
21645 | |
21646 // read in last block bit | |
21647 zip_NEEDBITS(1); | |
21648 if(zip_GETBITS(1) != 0) | |
21649 zip_eof = true; | |
21650 zip_DUMPBITS(1); | |
21651 | |
21652 // read in block type | |
21653 zip_NEEDBITS(2); | |
21654 zip_method = zip_GETBITS(2); | |
21655 zip_DUMPBITS(2); | |
21656 zip_tl = null; | |
21657 zip_copy_leng = 0; | |
21658 } | |
21659 | |
21660 switch(zip_method) { | |
21661 case 0: // zip_STORED_BLOCK | |
21662 i = zip_inflate_stored(buff, off + n, size - n); | |
21663 break; | |
21664 | |
21665 case 1: // zip_STATIC_TREES | |
21666 if(zip_tl != null) | |
21667 i = zip_inflate_codes(buff, off + n, size - n); | |
21668 else | |
21669 i = zip_inflate_fixed(buff, off + n, size - n); | |
21670 break; | |
21671 | |
21672 case 2: // zip_DYN_TREES | |
21673 if(zip_tl != null) | |
21674 i = zip_inflate_codes(buff, off + n, size - n); | |
21675 else | |
21676 i = zip_inflate_dynamic(buff, off + n, size - n); | |
21677 break; | |
21678 | |
21679 default: // error | |
21680 i = -1; | |
21681 break; | |
21682 } | |
21683 | |
21684 if(i == -1) { | |
21685 if(zip_eof) | |
21686 return 0; | |
21687 return -1; | |
21688 } | |
21689 n += i; | |
21690 } | |
21691 return n; | |
21692 } | |
21693 | |
21694 function zip_inflate(str) { | |
21695 var out, buff; | |
21696 var i, j; | |
21697 | |
21698 zip_inflate_start(); | |
21699 zip_inflate_data = str; | |
21700 zip_inflate_pos = 0; | |
21701 | |
21702 buff = new Array(1024); | |
21703 out = ""; | |
21704 while((i = zip_inflate_internal(buff, 0, buff.length)) > 0) { | |
21705 for(j = 0; j < i; j++) | |
21706 out += String.fromCharCode(buff[j]); | |
21707 } | |
21708 zip_inflate_data = null; // G.C. | |
21709 return out; | |
21710 } | |
21711 | |
21712 // | |
21713 // end of the script of Masanao Izumo. | |
21714 // | |
21715 | |
21716 // we add the compression method for JSZip | |
21717 if(!JSZip.compressions["DEFLATE"]) { | |
21718 JSZip.compressions["DEFLATE"] = { | |
21719 magic : "\x08\x00", | |
21720 uncompress : zip_inflate | |
21721 } | |
21722 } else { | |
21723 JSZip.compressions["DEFLATE"].uncompress = zip_inflate; | |
21724 } | |
21725 | |
21726 })(); | |
21727 | |
21728 // enforcing Stuk's coding style | |
21729 // vim: set shiftwidth=3 softtabstop=3: | |
21730 /** | |
21731 | |
21732 JSZip - A Javascript class for generating and reading zip files | |
21733 <http://stuartk.com/jszip> | |
21734 | |
21735 (c) 2011 David Duponchel <d.duponchel@gmail.com> | |
21736 Dual licenced under the MIT license or GPLv3. See LICENSE.markdown. | |
21737 | |
21738 **/ | |
21739 /*global JSZip,JSZipBase64 */ | |
21740 (function () { | |
21741 | |
21742 var MAX_VALUE_16BITS = 65535; | |
21743 var MAX_VALUE_32BITS = -1; // well, "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF" is parsed as -1 | |
21744 | |
21745 /** | |
21746 * Prettify a string read as binary. | |
21747 * @param {string} str the string to prettify. | |
21748 * @return {string} a pretty string. | |
21749 */ | |
21750 var pretty = function (str) { | |
21751 var res = '', code, i; | |
21752 for (i = 0; i < (str||"").length; i++) { | |
21753 code = str.charCodeAt(i); | |
21754 res += '\\x' + (code < 16 ? "0" : "") + code.toString(16).toUpperCase(); | |
21755 } | |
21756 return res; | |
21757 }; | |
21758 | |
21759 /** | |
21760 * Find a compression registered in JSZip. | |
21761 * @param {string} compressionMethod the method magic to find. | |
21762 * @return {Object|null} the JSZip compression object, null if none found. | |
21763 */ | |
21764 var findCompression = function (compressionMethod) { | |
21765 for (var method in JSZip.compressions) { | |
21766 if( !JSZip.compressions.hasOwnProperty(method) ) { continue; } | |
21767 if (JSZip.compressions[method].magic === compressionMethod) { | |
21768 return JSZip.compressions[method]; | |
21769 } | |
21770 } | |
21771 return null; | |
21772 }; | |
21773 | |
21774 // class StreamReader {{{ | |
21775 /** | |
21776 * Read bytes from a stream. | |
21777 * Developer tip : when debugging, a watch on pretty(this.reader.stream.slice(this.reader.index)) | |
21778 * is very useful :) | |
21779 * @constructor | |
21780 * @param {String|ArrayBuffer|Uint8Array} stream the stream to read. | |
21781 */ | |
21782 function StreamReader(stream) { | |
21783 this.stream = ""; | |
21784 if (JSZip.support.uint8array && stream instanceof Uint8Array) { | |
21785 this.stream = JSZip.utils.uint8Array2String(stream); | |
21786 } else if (JSZip.support.arraybuffer && stream instanceof ArrayBuffer) { | |
21787 var bufferView = new Uint8Array(stream); | |
21788 this.stream = JSZip.utils.uint8Array2String(bufferView); | |
21789 } else { | |
21790 this.stream = JSZip.utils.string2binary(stream); | |
21791 } | |
21792 this.index = 0; | |
21793 } | |
21794 StreamReader.prototype = { | |
21795 /** | |
21796 * Check that the offset will not go too far. | |
21797 * @param {string} offset the additional offset to check. | |
21798 * @throws {Error} an Error if the offset is out of bounds. | |
21799 */ | |
21800 checkOffset : function (offset) { | |
21801 this.checkIndex(this.index + offset); | |
21802 }, | |
21803 /** | |
21804 * Check that the specifed index will not be too far. | |
21805 * @param {string} newIndex the index to check. | |
21806 * @throws {Error} an Error if the index is out of bounds. | |
21807 */ | |
21808 checkIndex : function (newIndex) { | |
21809 if (this.stream.length < newIndex || newIndex < 0) { | |
21810 throw new Error("End of stream reached (stream length = " + | |
21811 this.stream.length + ", asked index = " + | |
21812 (newIndex) + "). Corrupted zip ?"); | |
21813 } | |
21814 }, | |
21815 /** | |
21816 * Change the index. | |
21817 * @param {number} newIndex The new index. | |
21818 * @throws {Error} if the new index is out of the stream. | |
21819 */ | |
21820 setIndex : function (newIndex) { | |
21821 this.checkIndex(newIndex); | |
21822 this.index = newIndex; | |
21823 }, | |
21824 /** | |
21825 * Skip the next n bytes. | |
21826 * @param {number} n the number of bytes to skip. | |
21827 * @throws {Error} if the new index is out of the stream. | |
21828 */ | |
21829 skip : function (n) { | |
21830 this.setIndex(this.index + n); | |
21831 }, | |
21832 /** | |
21833 * Get the byte at the specified index. | |
21834 * @param {number} i the index to use. | |
21835 * @return {number} a byte. | |
21836 */ | |
21837 byteAt : function(i) { | |
21838 return this.stream.charCodeAt(i); | |
21839 }, | |
21840 /** | |
21841 * Get the next number with a given byte size. | |
21842 * @param {number} size the number of bytes to read. | |
21843 * @return {number} the corresponding number. | |
21844 */ | |
21845 readInt : function (size) { | |
21846 var result = 0, i; | |
21847 this.checkOffset(size); | |
21848 for(i = this.index + size - 1; i >= this.index; i--) { | |
21849 result = (result << 8) + this.byteAt(i); | |
21850 } | |
21851 this.index += size; | |
21852 return result; | |
21853 }, | |
21854 /** | |
21855 * Get the next string with a given byte size. | |
21856 * @param {number} size the number of bytes to read. | |
21857 * @return {string} the corresponding string. | |
21858 */ | |
21859 readString : function (size) { | |
21860 this.checkOffset(size); | |
21861 // this will work because the constructor applied the "& 0xff" mask. | |
21862 var result = this.stream.slice(this.index, this.index + size); | |
21863 this.index += size; | |
21864 return result; | |
21865 }, | |
21866 /** | |
21867 * Get the next date. | |
21868 * @return {Date} the date. | |
21869 */ | |
21870 readDate : function () { | |
21871 var dostime = this.readInt(4); | |
21872 return new Date( | |
21873 ((dostime >> 25) & 0x7f) + 1980, // year | |
21874 ((dostime >> 21) & 0x0f) - 1, // month | |
21875 (dostime >> 16) & 0x1f, // day | |
21876 (dostime >> 11) & 0x1f, // hour | |
21877 (dostime >> 5) & 0x3f, // minute | |
21878 (dostime & 0x1f) << 1); // second | |
21879 } | |
21880 }; | |
21881 // }}} end of StreamReader | |
21882 | |
21883 // class ZipEntry {{{ | |
21884 /** | |
21885 * An entry in the zip file. | |
21886 * @constructor | |
21887 * @param {Object} options Options of the current file. | |
21888 * @param {Object} loadOptions Options for loading the stream. | |
21889 */ | |
21890 function ZipEntry(options, loadOptions) { | |
21891 this.options = options; | |
21892 this.loadOptions = loadOptions; | |
21893 } | |
21894 ZipEntry.prototype = { | |
21895 /** | |
21896 * say if the file is encrypted. | |
21897 * @return {boolean} true if the file is encrypted, false otherwise. | |
21898 */ | |
21899 isEncrypted : function () { | |
21900 // bit 1 is set | |
21901 return (this.bitFlag & 0x0001) === 0x0001; | |
21902 }, | |
21903 /** | |
21904 * say if the file has utf-8 filename/comment. | |
21905 * @return {boolean} true if the filename/comment is in utf-8, false otherwise. | |
21906 */ | |
21907 useUTF8 : function () { | |
21908 // bit 11 is set | |
21909 return (this.bitFlag & 0x0800) === 0x0800; | |
21910 }, | |
21911 /** | |
21912 * Read the local part of a zip file and add the info in this object. | |
21913 * @param {StreamReader} reader the reader to use. | |
21914 */ | |
21915 readLocalPart : function(reader) { | |
21916 var compression, localExtraFieldsLength; | |
21917 | |
21918 // we already know everything from the central dir ! | |
21919 // If the central dir data are false, we are doomed. | |
21920 // On the bright side, the local part is scary : zip64, data descriptors, both, etc. | |
21921 // The less data we get here, the more reliable this should be. | |
21922 // Let's skip the whole header and dash to the data ! | |
21923 reader.skip(22); | |
21924 // in some zip created on windows, the filename stored in the central dir contains \ instead of /. | |
21925 // Strangely, the filename here is OK. | |
21926 // I would love to treat these zip files as corrupted (see http://www.info-zip.org/FAQ.html#backslashes | |
21927 // or APPNOTE#4.4.17.1, "All slashes MUST be forward slashes '/'") but there are a lot of bad zip generators... | |
21928 // Search "unzip mismatching "local" filename continuing with "central" filename version" on | |
21929 // the internet. | |
21930 // | |
21931 // I think I see the logic here : the central directory is used to display | |
21932 // content and the local directory is used to extract the files. Mixing / and \ | |
21933 // may be used to display \ to windows users and use / when extracting the files. | |
21934 // Unfortunately, this lead also to some issues : http://seclists.org/fulldisclosure/2009/Sep/394 | |
21935 this.fileNameLength = reader.readInt(2); | |
21936 localExtraFieldsLength = reader.readInt(2); // can't be sure this will be the same as the central dir | |
21937 this.fileName = reader.readString(this.fileNameLength); | |
21938 reader.skip(localExtraFieldsLength); | |
21939 | |
21940 if (this.compressedSize == -1 || this.uncompressedSize == -1) { | |
21941 throw new Error("Bug or corrupted zip : didn't get enough informations from the central directory " + | |
21942 "(compressedSize == -1 || uncompressedSize == -1)"); | |
21943 } | |
21944 this.compressedFileData = reader.readString(this.compressedSize); | |
21945 | |
21946 compression = findCompression(this.compressionMethod); | |
21947 if (compression === null) { // no compression found | |
21948 throw new Error("Corrupted zip : compression " + pretty(this.compressionMethod) + | |
21949 " unknown (inner file : " + this.fileName + ")"); | |
21950 } | |
21951 this.uncompressedFileData = compression.uncompress(this.compressedFileData); | |
21952 | |
21953 if (this.uncompressedFileData.length !== this.uncompressedSize) { | |
21954 throw new Error("Bug : uncompressed data size mismatch"); | |
21955 } | |
21956 | |
21957 if (this.loadOptions.checkCRC32 && JSZip.prototype.crc32(this.uncompressedFileData) !== this.crc32) { | |
21958 throw new Error("Corrupted zip : CRC32 mismatch"); | |
21959 } | |
21960 }, | |
21961 | |
21962 /** | |
21963 * Read the central part of a zip file and add the info in this object. | |
21964 * @param {StreamReader} reader the reader to use. | |
21965 */ | |
21966 readCentralPart : function(reader) { | |
21967 this.versionMadeBy = reader.readString(2); | |
21968 this.versionNeeded = reader.readInt(2); | |
21969 this.bitFlag = reader.readInt(2); | |
21970 this.compressionMethod = reader.readString(2); | |
21971 this.date = reader.readDate(); | |
21972 this.crc32 = reader.readInt(4); | |
21973 this.compressedSize = reader.readInt(4); | |
21974 this.uncompressedSize = reader.readInt(4); | |
21975 this.fileNameLength = reader.readInt(2); | |
21976 this.extraFieldsLength = reader.readInt(2); | |
21977 this.fileCommentLength = reader.readInt(2); | |
21978 this.diskNumberStart = reader.readInt(2); | |
21979 this.internalFileAttributes = reader.readInt(2); | |
21980 this.externalFileAttributes = reader.readInt(4); | |
21981 this.localHeaderOffset = reader.readInt(4); | |
21982 | |
21983 if (this.isEncrypted()) { | |
21984 throw new Error("Encrypted zip are not supported"); | |
21985 } | |
21986 | |
21987 this.fileName = reader.readString(this.fileNameLength); | |
21988 this.readExtraFields(reader); | |
21989 this.parseZIP64ExtraField(reader); | |
21990 this.fileComment = reader.readString(this.fileCommentLength); | |
21991 | |
21992 // warning, this is true only for zip with madeBy == DOS (plateform dependent feature) | |
21993 this.dir = this.externalFileAttributes & 0x00000010 ? true : false; | |
21994 }, | |
21995 /** | |
21996 * Parse the ZIP64 extra field and merge the info in the current ZipEntry. | |
21997 * @param {StreamReader} reader the reader to use. | |
21998 */ | |
21999 parseZIP64ExtraField : function(reader) { | |
22000 | |
22001 if(!this.extraFields[0x0001]) { | |
22002 return; | |
22003 } | |
22004 | |
22005 // should be something, preparing the extra reader | |
22006 var extraReader = new StreamReader(this.extraFields[0x0001].value); | |
22007 | |
22008 // I really hope that these 64bits integer can fit in 32 bits integer, because js | |
22009 // won't let us have more. | |
22010 if(this.uncompressedSize === MAX_VALUE_32BITS) { | |
22011 this.uncompressedSize = extraReader.readInt(8); | |
22012 } | |
22013 if(this.compressedSize === MAX_VALUE_32BITS) { | |
22014 this.compressedSize = extraReader.readInt(8); | |
22015 } | |
22016 if(this.localHeaderOffset === MAX_VALUE_32BITS) { | |
22017 this.localHeaderOffset = extraReader.readInt(8); | |
22018 } | |
22019 if(this.diskNumberStart === MAX_VALUE_32BITS) { | |
22020 this.diskNumberStart = extraReader.readInt(4); | |
22021 } | |
22022 }, | |
22023 /** | |
22024 * Read the central part of a zip file and add the info in this object. | |
22025 * @param {StreamReader} reader the reader to use. | |
22026 */ | |
22027 readExtraFields : function(reader) { | |
22028 var start = reader.index, | |
22029 extraFieldId, | |
22030 extraFieldLength, | |
22031 extraFieldValue; | |
22032 | |
22033 this.extraFields = this.extraFields || {}; | |
22034 | |
22035 while (reader.index < start + this.extraFieldsLength) { | |
22036 extraFieldId = reader.readInt(2); | |
22037 extraFieldLength = reader.readInt(2); | |
22038 extraFieldValue = reader.readString(extraFieldLength); | |
22039 | |
22040 this.extraFields[extraFieldId] = { | |
22041 id: extraFieldId, | |
22042 length: extraFieldLength, | |
22043 value: extraFieldValue | |
22044 }; | |
22045 } | |
22046 }, | |
22047 /** | |
22048 * Apply an UTF8 transformation if needed. | |
22049 */ | |
22050 handleUTF8 : function() { | |
22051 if (this.useUTF8()) { | |
22052 this.fileName = JSZip.prototype.utf8decode(this.fileName); | |
22053 this.fileComment = JSZip.prototype.utf8decode(this.fileComment); | |
22054 } | |
22055 } | |
22056 }; | |
22057 // }}} end of ZipEntry | |
22058 | |
22059 // class ZipEntries {{{ | |
22060 /** | |
22061 * All the entries in the zip file. | |
22062 * @constructor | |
22063 * @param {String|ArrayBuffer|Uint8Array} data the binary stream to load. | |
22064 * @param {Object} loadOptions Options for loading the stream. | |
22065 */ | |
22066 function ZipEntries(data, loadOptions) { | |
22067 this.files = []; | |
22068 this.loadOptions = loadOptions; | |
22069 if (data) { | |
22070 this.load(data); | |
22071 } | |
22072 } | |
22073 ZipEntries.prototype = { | |
22074 /** | |
22075 * Check that the reader is on the speficied signature. | |
22076 * @param {string} expectedSignature the expected signature. | |
22077 * @throws {Error} if it is an other signature. | |
22078 */ | |
22079 checkSignature : function(expectedSignature) { | |
22080 var signature = this.reader.readString(4); | |
22081 if (signature !== expectedSignature) { | |
22082 throw new Error("Corrupted zip or bug : unexpected signature " + | |
22083 "(" + pretty(signature) + ", expected " + pretty(expectedSignature) + ")"); | |
22084 } | |
22085 }, | |
22086 /** | |
22087 * Read the end of the central directory. | |
22088 */ | |
22089 readBlockEndOfCentral : function () { | |
22090 this.diskNumber = this.reader.readInt(2); | |
22091 this.diskWithCentralDirStart = this.reader.readInt(2); | |
22092 this.centralDirRecordsOnThisDisk = this.reader.readInt(2); | |
22093 this.centralDirRecords = this.reader.readInt(2); | |
22094 this.centralDirSize = this.reader.readInt(4); | |
22095 this.centralDirOffset = this.reader.readInt(4); | |
22096 | |
22097 this.zipCommentLength = this.reader.readInt(2); | |
22098 this.zipComment = this.reader.readString(this.zipCommentLength); | |
22099 }, | |
22100 /** | |
22101 * Read the end of the Zip 64 central directory. | |
22102 * Not merged with the method readEndOfCentral : | |
22103 * The end of central can coexist with its Zip64 brother, | |
22104 * I don't want to read the wrong number of bytes ! | |
22105 */ | |
22106 readBlockZip64EndOfCentral : function () { | |
22107 this.zip64EndOfCentralSize = this.reader.readInt(8); | |
22108 this.versionMadeBy = this.reader.readString(2); | |
22109 this.versionNeeded = this.reader.readInt(2); | |
22110 this.diskNumber = this.reader.readInt(4); | |
22111 this.diskWithCentralDirStart = this.reader.readInt(4); | |
22112 this.centralDirRecordsOnThisDisk = this.reader.readInt(8); | |
22113 this.centralDirRecords = this.reader.readInt(8); | |
22114 this.centralDirSize = this.reader.readInt(8); | |
22115 this.centralDirOffset = this.reader.readInt(8); | |
22116 | |
22117 this.zip64ExtensibleData = {}; | |
22118 var extraDataSize = this.zip64EndOfCentralSize - 44, | |
22119 index = 0, | |
22120 extraFieldId, | |
22121 extraFieldLength, | |
22122 extraFieldValue; | |
22123 while(index < extraDataSize) { | |
22124 extraFieldId = this.reader.readInt(2); | |
22125 extraFieldLength = this.reader.readInt(4); | |
22126 extraFieldValue = this.reader.readString(extraFieldLength); | |
22127 this.zip64ExtensibleData[extraFieldId] = { | |
22128 id: extraFieldId, | |
22129 length: extraFieldLength, | |
22130 value: extraFieldValue | |
22131 }; | |
22132 } | |
22133 }, | |
22134 /** | |
22135 * Read the end of the Zip 64 central directory locator. | |
22136 */ | |
22137 readBlockZip64EndOfCentralLocator : function () { | |
22138 this.diskWithZip64CentralDirStart = this.reader.readInt(4); | |
22139 this.relativeOffsetEndOfZip64CentralDir = this.reader.readInt(8); | |
22140 this.disksCount = this.reader.readInt(4); | |
22141 if (this.disksCount > 1) { | |
22142 throw new Error("Multi-volumes zip are not supported"); | |
22143 } | |
22144 }, | |
22145 /** | |
22146 * Read the local files, based on the offset read in the central part. | |
22147 */ | |
22148 readLocalFiles : function() { | |
22149 var i, file; | |
22150 for(i = 0; i < this.files.length; i++) { | |
22151 file = this.files[i]; | |
22152 this.reader.setIndex(file.localHeaderOffset); | |
22153 this.checkSignature(JSZip.signature.LOCAL_FILE_HEADER); | |
22154 file.readLocalPart(this.reader); | |
22155 file.handleUTF8(); | |
22156 } | |
22157 }, | |
22158 /** | |
22159 * Read the central directory. | |
22160 */ | |
22161 readCentralDir : function() { | |
22162 var file; | |
22163 | |
22164 this.reader.setIndex(this.centralDirOffset); | |
22165 while(this.reader.readString(4) === JSZip.signature.CENTRAL_FILE_HEADER) { | |
22166 file = new ZipEntry({ | |
22167 zip64: this.zip64 | |
22168 }, this.loadOptions); | |
22169 file.readCentralPart(this.reader); | |
22170 this.files.push(file); | |
22171 } | |
22172 }, | |
22173 /** | |
22174 * Read the end of central directory. | |
22175 */ | |
22176 readEndOfCentral : function() { | |
22177 var offset = this.reader.stream.lastIndexOf(JSZip.signature.CENTRAL_DIRECTORY_END); | |
22178 if (offset === -1) { | |
22179 throw new Error("Corrupted zip : can't find end of central directory"); | |
22180 } | |
22181 this.reader.setIndex(offset); | |
22182 this.checkSignature(JSZip.signature.CENTRAL_DIRECTORY_END); | |
22183 this.readBlockEndOfCentral(); | |
22184 | |
22185 | |
22186 /* extract from the zip spec : | |
22187 4) If one of the fields in the end of central directory | |
22188 record is too small to hold required data, the field | |
22189 should be set to -1 (0xFFFF or 0xFFFFFFFF) and the | |
22190 ZIP64 format record should be created. | |
22191 5) The end of central directory record and the | |
22192 Zip64 end of central directory locator record must | |
22193 reside on the same disk when splitting or spanning | |
22194 an archive. | |
22195 */ | |
22196 if ( this.diskNumber === MAX_VALUE_16BITS | |
22197 || this.diskWithCentralDirStart === MAX_VALUE_16BITS | |
22198 || this.centralDirRecordsOnThisDisk === MAX_VALUE_16BITS | |
22199 || this.centralDirRecords === MAX_VALUE_16BITS | |
22200 || this.centralDirSize === MAX_VALUE_32BITS | |
22201 || this.centralDirOffset === MAX_VALUE_32BITS | |
22202 ) { | |
22203 this.zip64 = true; | |
22204 | |
22205 /* | |
22206 Warning : the zip64 extension is supported, but ONLY if the 64bits integer read from | |
22207 the zip file can fit into a 32bits integer. This cannot be solved : Javascript represents | |
22208 all numbers as 64-bit double precision IEEE 754 floating point numbers. | |
22209 So, we have 53bits for integers and bitwise operations treat everything as 32bits. | |
22210 see https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/Bitwise_Operators | |
22211 and http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-262.pdf section 8.5 | |
22212 */ | |
22213 | |
22214 // should look for a zip64 EOCD locator | |
22215 offset = this.reader.stream.lastIndexOf(JSZip.signature.ZIP64_CENTRAL_DIRECTORY_LOCATOR); | |
22216 if (offset === -1) { | |
22217 throw new Error("Corrupted zip : can't find the ZIP64 end of central directory locator"); | |
22218 } | |
22219 this.reader.setIndex(offset); | |
22220 this.checkSignature(JSZip.signature.ZIP64_CENTRAL_DIRECTORY_LOCATOR); | |
22221 this.readBlockZip64EndOfCentralLocator(); | |
22222 | |
22223 // now the zip64 EOCD record | |
22224 this.reader.setIndex(this.relativeOffsetEndOfZip64CentralDir); | |
22225 this.checkSignature(JSZip.signature.ZIP64_CENTRAL_DIRECTORY_END); | |
22226 this.readBlockZip64EndOfCentral(); | |
22227 } | |
22228 }, | |
22229 /** | |
22230 * Read a zip file and create ZipEntries. | |
22231 * @param {String|ArrayBuffer|Uint8Array} data the binary string representing a zip file. | |
22232 */ | |
22233 load : function(data) { | |
22234 this.reader = new StreamReader(data); | |
22235 | |
22236 this.readEndOfCentral(); | |
22237 this.readCentralDir(); | |
22238 this.readLocalFiles(); | |
22239 } | |
22240 }; | |
22241 // }}} end of ZipEntries | |
22242 | |
22243 /** | |
22244 * Implementation of the load method of JSZip. | |
22245 * It uses the above classes to decode a zip file, and load every files. | |
22246 * @param {String|ArrayBuffer|Uint8Array} data the data to load. | |
22247 * @param {Object} options Options for loading the stream. | |
22248 * options.base64 : is the stream in base64 ? default : false | |
22249 */ | |
22250 JSZip.prototype.load = function(data, options) { | |
22251 var files, zipEntries, i, input; | |
22252 options = options || {}; | |
22253 if(options.base64) { | |
22254 data = JSZipBase64.decode(data); | |
22255 } | |
22256 | |
22257 zipEntries = new ZipEntries(data, options); | |
22258 files = zipEntries.files; | |
22259 for (i = 0; i < files.length; i++) { | |
22260 input = files[i]; | |
22261 this.file(input.fileName, input.uncompressedFileData, { | |
22262 binary:true, | |
22263 optimizedBinaryString:true, | |
22264 date:input.date, | |
22265 dir:input.dir | |
22266 }); | |
22267 } | |
22268 | |
22269 return this; | |
22270 }; | |
22271 | |
22272 }()); | |
22273 // enforcing Stuk's coding style | |
22274 // vim: set shiftwidth=3 softtabstop=3 foldmethod=marker: | |
22275 //! moment.js | 23871 //! moment.js |
22276 //! version : 2.5.1 | 23872 //! version : 2.5.1 |
22277 //! authors : Tim Wood, Iskren Chernev, Moment.js contributors | 23873 //! authors : Tim Wood, Iskren Chernev, Moment.js contributors |
22278 //! license : MIT | 23874 //! license : MIT |
22279 //! momentjs.com | 23875 //! momentjs.com |
29664 $tip.appendTo('body').hide().css({position: 'absolute'}); | 31260 $tip.appendTo('body').hide().css({position: 'absolute'}); |
29665 | 31261 |
29666 if(this.tooltipOptions.defaultTheme) { | 31262 if(this.tooltipOptions.defaultTheme) { |
29667 $tip.css({ | 31263 $tip.css({ |
29668 'background': '#fff', | 31264 'background': '#fff', |
29669 'z-index': '21040',//***lchang | 31265 'z-index': '1040', |
29670 'padding': '0.4em 0.6em', | 31266 'padding': '0.4em 0.6em', |
29671 'border-radius': '0.5em', | 31267 'border-radius': '0.5em', |
29672 'font-size': '0.8em', | 31268 'font-size': '0.8em', |
29673 'border': '1px solid #111', | 31269 'border': '1px solid #111', |
29674 'display': 'none', | 31270 'display': 'none', |
30214 // this turns MapConfig.useGraphics auto-on, but uses circles as default | 31810 // this turns MapConfig.useGraphics auto-on, but uses circles as default |
30215 loadColorFromDataset : false, // if DataObject color should be loaded automatically (from column "color") | 31811 loadColorFromDataset : false, // if DataObject color should be loaded automatically (from column "color") |
30216 allowColumnRenaming : true, | 31812 allowColumnRenaming : true, |
30217 //proxy : 'php/proxy.php?address=', //set this if a HTTP proxy shall be used (e.g. to bypass X-Domain problems) | 31813 //proxy : 'php/proxy.php?address=', //set this if a HTTP proxy shall be used (e.g. to bypass X-Domain problems) |
30218 //colors for several datasets; rgb1 will be used for selected objects, rgb0 for unselected | 31814 //colors for several datasets; rgb1 will be used for selected objects, rgb0 for unselected |
30219 colors : [{//blue /***lchang changed the color set***/ | 31815 colors : [{ |
30220 r1 : 0, | |
30221 g1 : 128, | |
30222 b1 : 255, | |
30223 r0 : 205, | |
30224 g0 : 230, | |
30225 b0 : 255 | |
30226 },{//red | |
30227 r1 : 255, | 31816 r1 : 255, |
30228 g1 : 84, | 31817 g1 : 101, |
30229 b1 : 22, | 31818 b1 : 0, |
30230 r0 : 255, | 31819 r0 : 253, |
30231 g0 : 218, | 31820 g0 : 229, |
30232 b0 : 205 | 31821 b0 : 205 |
30233 }, {//purple | 31822 }, { |
30234 r1 : 132, | 31823 r1 : 144, |
30235 g1 : 0, | 31824 g1 : 26, |
30236 b1 : 255, | 31825 b1 : 255, |
30237 r0 : 231, | 31826 r0 : 230, |
30238 g0 : 205, | 31827 g0 : 225, |
30239 b0 : 255 | 31828 b0 : 255 |
30240 }, {//green | 31829 }, { |
30241 r1 : 0, | 31830 r1 : 0, |
30242 g1 : 225, | 31831 g1 : 217, |
30243 b1 : 116, | |
30244 r0 : 180, | |
30245 g0 : 225, | |
30246 b0 : 204 | |
30247 }, {//yellow | |
30248 r1 : 255, | |
30249 g1 : 191, | |
30250 b1 : 0, | 31832 b1 : 0, |
30251 r0 : 255, | 31833 r0 : 213, |
30252 g0 : 243, | 31834 g0 : 255, |
30253 b0 : 205 | 31835 b0 : 213 |
31836 }, { | |
31837 r1 : 240, | |
31838 g1 : 220, | |
31839 b1 : 0, | |
31840 r0 : 247, | |
31841 g0 : 244, | |
31842 b0 : 197 | |
30254 }] | 31843 }] |
30255 | 31844 |
30256 } | 31845 } |
30257 | 31846 |
30258 GeoTemConfig.ie = false; | 31847 GeoTemConfig.ie = false; |
30312 } | 31901 } |
30313 | 31902 |
30314 GeoTemConfig.applySettings = function(settings) { | 31903 GeoTemConfig.applySettings = function(settings) { |
30315 $.extend(this, settings); | 31904 $.extend(this, settings); |
30316 }; | 31905 }; |
30317 function HSVtoRGB(h, s, v) { | 31906 |
30318 var r, g, b, i, f, p, q, t; | |
30319 if (h && s === undefined && v === undefined) { | |
30320 s = h.s, v = h.v, h = h.h; | |
30321 } | |
30322 i = Math.floor(h * 6); | |
30323 f = h * 6 - i; | |
30324 p = v * (1 - s); | |
30325 q = v * (1 - f * s); | |
30326 t = v * (1 - (1 - f) * s); | |
30327 switch (i % 6) { | |
30328 case 0: r = v, g = t, b = p; break; | |
30329 case 1: r = q, g = v, b = p; break; | |
30330 case 2: r = p, g = v, b = t; break; | |
30331 case 3: r = p, g = q, b = v; break; | |
30332 case 4: r = t, g = p, b = v; break; | |
30333 case 5: r = v, g = p, b = q; break; | |
30334 } | |
30335 return { | |
30336 r: Math.floor(r * 255), | |
30337 g: Math.floor(g * 255), | |
30338 b: Math.floor(b * 255) | |
30339 }; | |
30340 } | |
30341 //Keeps track of how many colors where assigned yet. | 31907 //Keeps track of how many colors where assigned yet. |
30342 GeoTemConfig.assignedColorCount = 0; | 31908 GeoTemConfig.assignedColorCount = 0; |
30343 GeoTemConfig.getColor = function(id){ | 31909 GeoTemConfig.getColor = function(id){ |
30344 if (typeof GeoTemConfig.datasets[id].color === "undefined"){ | 31910 if (typeof GeoTemConfig.datasets[id].color === "undefined"){ |
30345 var color; | 31911 var color; |
30346 | 31912 |
30347 while (true){ | 31913 while (true){ |
30348 if( GeoTemConfig.colors.length <= GeoTemConfig.assignedColorCount ){ | 31914 if( GeoTemConfig.colors.length <= GeoTemConfig.assignedColorCount ){ |
30349 var h=Math.random(); | |
30350 var rgb=HSVtoRGB(h,1.0,1.0); | |
30351 var rgb0=HSVtoRGB(h,0.2,1.0); | |
30352 color = { | |
30353 r1 : rgb.r, | |
30354 g1 : rgb.g, | |
30355 b1 : rgb.b, | |
30356 r0 : rgb0.r, | |
30357 g0 : rgb0.g, | |
30358 b0 : rgb0.b | |
30359 }; | |
30360 /* | |
30361 color = { | 31915 color = { |
30362 r1 : Math.floor((Math.random()*255)+1), | 31916 r1 : Math.floor((Math.random()*255)+1), |
30363 g1 : Math.floor((Math.random()*255)+1), | 31917 g1 : Math.floor((Math.random()*255)+1), |
30364 b1 : Math.floor((Math.random()*255)+1), | 31918 b1 : Math.floor((Math.random()*255)+1), |
30365 r0 : 230, | 31919 r0 : 230, |
30366 g0 : 230, | 31920 g0 : 230, |
30367 b0 : 230 | 31921 b0 : 230 |
30368 };*/ | 31922 }; |
30369 } else | 31923 } else |
30370 color = GeoTemConfig.colors[GeoTemConfig.assignedColorCount]; | 31924 color = GeoTemConfig.colors[GeoTemConfig.assignedColorCount]; |
30371 | 31925 |
30372 //make sure that no other dataset has this color | 31926 //make sure that no other dataset has this color |
30373 //TODO: one could also check that they are not too much alike | 31927 //TODO: one could also check that they are not too much alike |
30384 found = true; | 31938 found = true; |
30385 break; | 31939 break; |
30386 } | 31940 } |
30387 } | 31941 } |
30388 if (found === true){ | 31942 if (found === true){ |
30389 //***lchang: GeoTemConfig.colors.length is never <= GeoTemConfig.assignedColorCount, so the GeoTemConfig.assignedColorCount never changes, and infinite loops occurs | |
30390 GeoTemConfig.assignedColorCount++; | |
30391 if( GeoTemConfig.colors.length <= GeoTemConfig.assignedColorCount ){ | 31943 if( GeoTemConfig.colors.length <= GeoTemConfig.assignedColorCount ){ |
30392 //next time skip over this color | 31944 //next time skip over this color |
30393 //GeoTemConfig.assignedColorCount++;//***lchang | 31945 GeoTemConfig.assignedColorCount++; |
30394 } | 31946 } |
30395 continue; | 31947 continue; |
30396 } else { | 31948 } else { |
30397 GeoTemConfig.colors.push(color); | 31949 GeoTemConfig.colors.push(color); |
30398 break; | 31950 break; |
30478 /** | 32030 /** |
30479 * returns the json object of the file from the given url | 32031 * returns the json object of the file from the given url |
30480 * @param {String} url the url of the file to load | 32032 * @param {String} url the url of the file to load |
30481 * @return json object of given file | 32033 * @return json object of given file |
30482 */ | 32034 */ |
30483 GeoTemConfig.getJson = function(url) { | 32035 GeoTemConfig.getJson = function(url,asyncFunc) { |
32036 var async = false; | |
32037 if( asyncFunc ){ | |
32038 async = true; | |
32039 } | |
32040 | |
30484 var data; | 32041 var data; |
30485 $.ajax({ | 32042 $.ajax({ |
30486 url : url, | 32043 url : url, |
30487 async : false, | 32044 async : async, |
30488 dataType : 'json', | 32045 dataType : 'json', |
30489 success : function(json) { | 32046 success : function(json) { |
30490 data = json; | 32047 data = json; |
32048 if (async){ | |
32049 asyncFunc(data); | |
32050 } | |
30491 } | 32051 } |
30492 }); | 32052 }); |
30493 return data; | 32053 |
32054 if (async){ | |
32055 return data; | |
32056 } | |
30494 } | 32057 } |
30495 | 32058 |
30496 GeoTemConfig.mergeObjects = function(set1, set2) { | 32059 GeoTemConfig.mergeObjects = function(set1, set2) { |
30497 var inside = []; | 32060 var inside = []; |
30498 var newSet = []; | 32061 var newSet = []; |
30620 tableContent[header] = ""+innerArray[j]; | 32183 tableContent[header] = ""+innerArray[j]; |
30621 } | 32184 } |
30622 } | 32185 } |
30623 | 32186 |
30624 dataObject["tableContent"] = tableContent; | 32187 dataObject["tableContent"] = tableContent; |
30625 | 32188 |
30626 json.push(dataObject); | 32189 json.push(dataObject); |
30627 } | 32190 } |
30628 | 32191 |
30629 | |
30630 return json; | 32192 return json; |
30631 }; | 32193 }; |
30632 | 32194 |
30633 /** | 32195 /** |
30634 * returns the xml dom object of the file from the given url | 32196 * returns the xml dom object of the file from the given url |
30719 //can only be set on asynchronous now | 32281 //can only be set on asynchronous now |
30720 //req.responseType = "text"; | 32282 //req.responseType = "text"; |
30721 var json; | 32283 var json; |
30722 req.onload = function() { | 32284 req.onload = function() { |
30723 json = GeoTemConfig.convertCsv(req.response); | 32285 json = GeoTemConfig.convertCsv(req.response); |
30724 | |
30725 if( asyncFunc ) | 32286 if( asyncFunc ) |
30726 asyncFunc(json); | 32287 asyncFunc(json); |
30727 }; | 32288 }; |
30728 | |
30729 req.send(); | 32289 req.send(); |
30730 | 32290 |
30731 if( !async ){ | 32291 if( !async ){ |
30732 return json; | 32292 return json; |
30733 } | 32293 } |
30734 | 32294 }; |
32295 | |
32296 /** | |
32297 * loads a binary file | |
32298 * @param {String} url of the file to load | |
32299 * @return binary data | |
32300 */ | |
32301 GeoTemConfig.getBinary = function(url,asyncFunc) { | |
32302 var async = true; | |
32303 | |
32304 var req = new XMLHttpRequest(); | |
32305 req.open("GET",url,async); | |
32306 req.responseType = "arraybuffer"; | |
32307 | |
32308 var binaryData; | |
32309 req.onload = function() { | |
32310 var arrayBuffer = req.response; | |
32311 asyncFunc(arrayBuffer); | |
32312 }; | |
32313 req.send(); | |
30735 }; | 32314 }; |
30736 | 32315 |
30737 /** | 32316 /** |
30738 * returns a Date and a SimileAjax.DateTime granularity value for a given XML time | 32317 * returns a Date and a SimileAjax.DateTime granularity value for a given XML time |
30739 * @param {String} xmlTime the XML time as String | 32318 * @param {String} xmlTime the XML time as String |
31643 * @version date: 2012-07-27 | 33222 * @version date: 2012-07-27 |
31644 * | 33223 * |
31645 * @param {Object} parent parent to call filter functions | 33224 * @param {Object} parent parent to call filter functions |
31646 * @param {HTML object} parentDiv div to append filter buttons | 33225 * @param {HTML object} parentDiv div to append filter buttons |
31647 */ | 33226 */ |
33227 FilterBarFactory = { | |
33228 filterBarArray :[], | |
33229 push : function(newFilterBar){ | |
33230 FilterBarFactory.filterBarArray.push(newFilterBar); | |
33231 }, | |
33232 resetAll : function(show) { | |
33233 $(FilterBarFactory.filterBarArray).each(function(){ | |
33234 if (show) { | |
33235 this.filter.setAttribute('class', 'smallButton filter'); | |
33236 this.filterInverse.setAttribute('class', 'smallButton filterInverse'); | |
33237 this.cancelSelection.setAttribute('class', 'smallButton filterCancel'); | |
33238 } else { | |
33239 this.filter.setAttribute('class', 'smallButton filterDisabled'); | |
33240 this.filterInverse.setAttribute('class', 'smallButton filterInverseDisabled'); | |
33241 this.cancelSelection.setAttribute('class', 'smallButton filterCancelDisabled'); | |
33242 } | |
33243 }); | |
33244 } | |
33245 }; | |
33246 | |
31648 function FilterBar(parent, parentDiv) { | 33247 function FilterBar(parent, parentDiv) { |
33248 FilterBarFactory.push(this); | |
31649 | 33249 |
31650 var bar = this; | 33250 var bar = this; |
31651 | 33251 |
31652 this.filter = document.createElement('div'); | 33252 this.filter = document.createElement('div'); |
31653 this.filter.setAttribute('class', 'smallButton filterDisabled'); | 33253 this.filter.setAttribute('class', 'smallButton filterDisabled'); |
31678 if ( typeof parentDiv != 'undefined') { | 33278 if ( typeof parentDiv != 'undefined') { |
31679 this.appendTo(parentDiv); | 33279 this.appendTo(parentDiv); |
31680 } | 33280 } |
31681 | 33281 |
31682 this.reset = function(show) { | 33282 this.reset = function(show) { |
31683 if (show) { | 33283 FilterBarFactory.resetAll(show); |
31684 this.filter.setAttribute('class', 'smallButton filter'); | |
31685 this.filterInverse.setAttribute('class', 'smallButton filterInverse'); | |
31686 this.cancelSelection.setAttribute('class', 'smallButton filterCancel'); | |
31687 } else { | |
31688 this.filter.setAttribute('class', 'smallButton filterDisabled'); | |
31689 this.filterInverse.setAttribute('class', 'smallButton filterInverseDisabled'); | |
31690 this.cancelSelection.setAttribute('class', 'smallButton filterCancelDisabled'); | |
31691 } | |
31692 }; | 33284 }; |
31693 | 33285 |
31694 }; | 33286 }; |
31695 /* | 33287 /* |
31696 * Selection.js | 33288 * Selection.js |
32465 */ | 34057 */ |
32466 function MapConfig(options) { | 34058 function MapConfig(options) { |
32467 | 34059 |
32468 this.options = { | 34060 this.options = { |
32469 mapWidth : false, // false or desired width css definition for the map | 34061 mapWidth : false, // false or desired width css definition for the map |
32470 mapHeight : false, // false or desired height css definition for the map | 34062 mapHeight : '580px', // false or desired height css definition for the map |
32471 mapTitle : 'GeoTemCo Map View', // title will be shown in map header | 34063 mapTitle : 'GeoTemCo Map View', // title will be shown in map header |
32472 mapIndex : 0, // index = position in location array; for multiple locations the 2nd map refers to index 1 | 34064 mapIndex : 0, // index = position in location array; for multiple locations the 2nd map refers to index 1 |
32473 alternativeMap : [ | 34065 alternativeMap : [ |
32474 /* { | 34066 { |
32475 name: 'Barrington Roman Empire', | 34067 name: 'Barrington Roman Empire', |
32476 url: 'http://pelagios.dme.ait.ac.at/tilesets/imperium/${z}/${x}/${y}.png', | 34068 url: 'http://pelagios.dme.ait.ac.at/tilesets/imperium/${z}/${x}/${y}.png', |
32477 type:'XYZ', | 34069 type:'XYZ', |
32478 attribution: "(c) Barrington Roman Empiry, <a href='http://pelagios.dme.ait.ac.at/maps/greco-roman/'>Pelagios</a>" | 34070 attribution: "(c) Barrington Roman Empiry, <a href='http://pelagios.dme.ait.ac.at/maps/greco-roman/'>Pelagios</a>" |
32479 }, | 34071 }, |
32619 name: 'Historical Map of 500 BC', | 34211 name: 'Historical Map of 500 BC', |
32620 url: 'http://geoserver.mpiwg-berlin.mpg.de/geoserver/mpiwg/wms', | 34212 url: 'http://geoserver.mpiwg-berlin.mpg.de/geoserver/mpiwg/wms', |
32621 layer: 'historic:cntry500bc', | 34213 layer: 'historic:cntry500bc', |
32622 attribution: "(c) <a href='http://webcache.googleusercontent.com/search?q=cache:NbaEeiehhzQJ:library.thinkquest.org/C006628/citations.html&client=ubuntu&hl=de&gl=de&strip=1'> ThinkQuest Team C006628</a>" | 34214 attribution: "(c) <a href='http://webcache.googleusercontent.com/search?q=cache:NbaEeiehhzQJ:library.thinkquest.org/C006628/citations.html&client=ubuntu&hl=de&gl=de&strip=1'> ThinkQuest Team C006628</a>" |
32623 }, | 34215 }, |
32624 */ | |
32625 { | 34216 { |
32626 name: 'Historical Map of 1000 BC', | 34217 name: 'Historical Map of 1000 BC', |
32627 url: 'http://geoserver.mpiwg-berlin.mpg.de/geoserver/mpiwg/wms', | 34218 url: 'http://geoserver.mpiwg-berlin.mpg.de/geoserver/mpiwg/wms', |
32628 layer: 'historic:cntry1000bc', | 34219 layer: 'historic:cntry1000bc', |
32629 attribution: "(c) <a href='http://webcache.googleusercontent.com/search?q=cache:NbaEeiehhzQJ:library.thinkquest.org/C006628/citations.html&client=ubuntu&hl=de&gl=de&strip=1'> ThinkQuest Team C006628</a>" | 34220 attribution: "(c) <a href='http://webcache.googleusercontent.com/search?q=cache:NbaEeiehhzQJ:library.thinkquest.org/C006628/citations.html&client=ubuntu&hl=de&gl=de&strip=1'> ThinkQuest Team C006628</a>" |
32696 ieHoveredLabel : "color: COLOR1; font-weight: bold;", // css code for a hovered place label in IE | 34287 ieHoveredLabel : "color: COLOR1; font-weight: bold;", // css code for a hovered place label in IE |
32697 hoveredLabel : "color: COLOR1; font-weight: bold;", // css code for a hovered place label | 34288 hoveredLabel : "color: COLOR1; font-weight: bold;", // css code for a hovered place label |
32698 circleGap : 0, // gap between the circles on the map (>=0) | 34289 circleGap : 0, // gap between the circles on the map (>=0) |
32699 circleOverlap : { | 34290 circleOverlap : { |
32700 type: 'area', // 'area' or 'diameter' is possible | 34291 type: 'area', // 'area' or 'diameter' is possible |
32701 overlap: 1 // the percentage of allowed overlap (0<=overlap<=1) | 34292 overlap: 0 // the percentage of allowed overlap (0<=overlap<=1) |
32702 }, // maximum allowed overlap in percent (if circleGap = 0, circleOverlap will be used) | 34293 }, // maximum allowed overlap in percent (if circleGap = 0, circleOverlap will be used) |
32703 minimumRadius : 1, // minimum radius of a circle with mimimal weight (>0) | 34294 minimumRadius : 4, // minimum radius of a circle with mimimal weight (>0) |
32704 circleOutline : 2, // false for no outline or a pixel value v with 0 < v | 34295 circleOutline : 2, // false for no outline or a pixel value v with 0 < v |
32705 circleOpacity : 'balloon', // 'balloon' for dynamic opacity of the circles or a value t with 0 <= t <= 1 | 34296 circleOpacity : 'balloon', // 'balloon' for dynamic opacity of the circles or a value t with 0 <= t <= 1 |
32706 minTransparency : 0.55, // maximum transparency of a circle | 34297 minTransparency : 0.55, // maximum transparency of a circle |
32707 maxTransparency : 0.8, // minimum transparency of a circle | 34298 maxTransparency : 0.8, // minimum transparency of a circle |
32708 binning : 'generic', // binning algorithm for the map, possible values are: 'generic', 'square', 'hexagonal', 'triangular' or false for 'no binning' | 34299 binning : 'generic', // binning algorithm for the map, possible values are: 'generic', 'square', 'hexagonal', 'triangular' or false for 'no binning' |
32714 binningSelection : false, // show/hide binning algorithms dropdown | 34305 binningSelection : false, // show/hide binning algorithms dropdown |
32715 mapSelectionTools : true, // show/hide map selector tools | 34306 mapSelectionTools : true, // show/hide map selector tools |
32716 dataInformation : true, // show/hide data information | 34307 dataInformation : true, // show/hide data information |
32717 overlayVisibility : false, // initial visibility of additional overlays | 34308 overlayVisibility : false, // initial visibility of additional overlays |
32718 //proxyHost : 'php/proxy.php?address=', //required for selectCountry feature, if the requested GeoServer and GeoTemCo are NOT on the same server | 34309 //proxyHost : 'php/proxy.php?address=', //required for selectCountry feature, if the requested GeoServer and GeoTemCo are NOT on the same server |
32719 placenameTagsStyle : 'value' // the style of the placenames "surrounding" a circle on hover. 'zoom' for tags based on zoom level (old behaviour), 'value' for new value-based | 34310 placenameTagsStyle : 'value', // the style of the placenames "surrounding" a circle on hover. 'zoom' for tags based on zoom level (old behaviour), 'value' for new value-based |
34311 hideUnselected : false //hide unselected circles (features) on highlight/selection | |
32720 | 34312 |
32721 }; | 34313 }; |
32722 if ( typeof options != 'undefined') { | 34314 if ( typeof options != 'undefined') { |
32723 $.extend(this.options, options); | 34315 $.extend(this.options, options); |
32724 } | 34316 } |
32786 * @param {HTML object} div parent div to append the map gui | 34378 * @param {HTML object} div parent div to append the map gui |
32787 * @param {JSON} options map configuration | 34379 * @param {JSON} options map configuration |
32788 */ | 34380 */ |
32789 function MapGui(map, div, options, iid) { | 34381 function MapGui(map, div, options, iid) { |
32790 | 34382 |
34383 var gui = this; | |
32791 this.map = map; | 34384 this.map = map; |
32792 | 34385 |
32793 this.container = div; | 34386 this.container = div; |
32794 if (options.mapWidth) { | 34387 if (options.mapWidth) { |
32795 this.container.style.width = options.mapWidth; | 34388 this.container.style.width = options.mapWidth; |
32881 map.navigation.activate(); | 34474 map.navigation.activate(); |
32882 } | 34475 } |
32883 var lockMapControl = new MapControl(this.map, lockButton, 'lock', activateLock, deactivateLock); | 34476 var lockMapControl = new MapControl(this.map, lockButton, 'lock', activateLock, deactivateLock); |
32884 tools.appendChild(lockMapControl.button); | 34477 tools.appendChild(lockMapControl.button); |
32885 | 34478 |
32886 | 34479 this.fullscreenTitle = document.createElement("td"); |
32887 var gui = this; | 34480 titles.appendChild(this.fullscreenTitle); |
34481 this.fullscreenIcon = document.createElement("td"); | |
34482 var fullscreenButton = document.createElement("div"); | |
34483 $(fullscreenButton).addClass('mapControl'); | |
34484 var prevWidth; | |
34485 var prevHeight; | |
34486 var prevParent; | |
34487 var activateFullscreen = function() { | |
34488 $div=$(div); | |
34489 $window = $(window); | |
34490 | |
34491 prevWidth = $div.width(); | |
34492 prevHeight = $div.height(); | |
34493 prevParent = $div.parent(); | |
34494 | |
34495 $div.appendTo("body"); | |
34496 $div.css("position","absolute"); | |
34497 $div.css("top","0"); | |
34498 $div.css("left","0"); | |
34499 $div.css("z-Index","10000"); | |
34500 $div.width($window.width()); | |
34501 $div.height($window.height()); | |
34502 | |
34503 gui.resize(); | |
34504 } | |
34505 var deactivateFullscreen = function() { | |
34506 $div=$(div); | |
34507 | |
34508 $div.appendTo(prevParent); | |
34509 $div.css("position","relative"); | |
34510 $div.width(prevWidth); | |
34511 $div.height(prevHeight); | |
34512 | |
34513 gui.resize(); | |
34514 } | |
34515 var fullscreenMapControl = new MapControl(this.map, fullscreenButton, 'fullscreen', activateFullscreen, deactivateFullscreen); | |
34516 tools.appendChild(fullscreenMapControl.button); | |
34517 | |
32888 if (navigator.geolocation && options.geoLocation) { | 34518 if (navigator.geolocation && options.geoLocation) { |
32889 this.geoActive = false; | 34519 this.geoActive = false; |
32890 this.geoLocation = document.createElement("div"); | 34520 this.geoLocation = document.createElement("div"); |
32891 this.geoLocation.setAttribute('class', 'geoLocationOff'); | 34521 this.geoLocation.setAttribute('class', 'geoLocationOff'); |
32892 this.geoLocation.title = GeoTemConfig.getString('activateGeoLocation'); | 34522 this.geoLocation.title = GeoTemConfig.getString('activateGeoLocation'); |
34242 | 35872 |
34243 /** | 35873 /** |
34244 * updates the the object layer of the map after selections had been executed in timeplot or table or zoom level has changed | 35874 * updates the the object layer of the map after selections had been executed in timeplot or table or zoom level has changed |
34245 */ | 35875 */ |
34246 highlightChanged : function(mapObjects) { | 35876 highlightChanged : function(mapObjects) { |
35877 var hideEmptyCircles = false; | |
35878 | |
35879 if (this.config.options.hideUnselected){ | |
35880 var overallCnt = 0; | |
35881 for (var i in mapObjects){ | |
35882 overallCnt += mapObjects[i].length; | |
35883 } | |
35884 if (overallCnt > 0){ | |
35885 hideEmptyCircles = true; | |
35886 } | |
35887 } | |
35888 | |
34247 if( !GeoTemConfig.highlightEvents ){ | 35889 if( !GeoTemConfig.highlightEvents ){ |
34248 return; | 35890 return; |
34249 } | 35891 } |
34250 this.mds.clearOverlay(); | 35892 this.mds.clearOverlay(); |
34251 if (this.selection.valid()) { | 35893 if (this.selection.valid()) { |
34255 } | 35897 } |
34256 var points = this.mds.getObjectsByZoom(); | 35898 var points = this.mds.getObjectsByZoom(); |
34257 var polygon = this.openlayersMap.getExtent().toGeometry(); | 35899 var polygon = this.openlayersMap.getExtent().toGeometry(); |
34258 for (var i in points ) { | 35900 for (var i in points ) { |
34259 for (var j in points[i] ) { | 35901 for (var j in points[i] ) { |
35902 var point = points[i][j]; | |
35903 | |
35904 if (hideEmptyCircles){ | |
35905 point.feature.style.display = 'none'; | |
35906 } else { | |
35907 point.feature.style.display = ''; | |
35908 } | |
35909 | |
34260 this.updatePoint(points[i][j], polygon); | 35910 this.updatePoint(points[i][j], polygon); |
34261 } | 35911 } |
34262 } | 35912 } |
34263 this.displayConnections(); | 35913 this.displayConnections(); |
35914 this.objectLayer.redraw(); | |
34264 }, | 35915 }, |
34265 | 35916 |
34266 selectionChanged : function(selection) { | 35917 selectionChanged : function(selection) { |
34267 if( !GeoTemConfig.selectionEvents ){ | 35918 if( !GeoTemConfig.selectionEvents ){ |
34268 return; | 35919 return; |
36733 if (this.activeTable != index) { | 38384 if (this.activeTable != index) { |
36734 if ( typeof this.activeTable != 'undefined') { | 38385 if ( typeof this.activeTable != 'undefined') { |
36735 this.tables[this.activeTable].hide(); | 38386 this.tables[this.activeTable].hide(); |
36736 var c = GeoTemConfig.getColor(this.activeTable); | 38387 var c = GeoTemConfig.getColor(this.activeTable); |
36737 this.tableTabs[this.activeTable].style.backgroundColor = 'rgb(' + c.r0 + ',' + c.g0 + ',' + c.b0 + ')'; | 38388 this.tableTabs[this.activeTable].style.backgroundColor = 'rgb(' + c.r0 + ',' + c.g0 + ',' + c.b0 + ')'; |
36738 this.tableTabs[this.activeTable].style.paddingBottom = '5px'; | |
36739 } | 38389 } |
36740 this.activeTable = index; | 38390 this.activeTable = index; |
36741 this.tables[this.activeTable].show(); | 38391 this.tables[this.activeTable].show(); |
36742 var c = GeoTemConfig.getColor(this.activeTable); | 38392 var c = GeoTemConfig.getColor(this.activeTable); |
36743 this.tableTabs[this.activeTable].style.backgroundColor = 'rgb(' + c.r1 + ',' + c.g1 + ',' + c.b1 + ')'; | 38393 this.tableTabs[this.activeTable].style.backgroundColor = 'rgb(' + c.r1 + ',' + c.g1 + ',' + c.b1 + ')'; |
36744 this.tableTabs[this.activeTable].style.paddingBottom = '8px'; | |
36745 this.gui.tabs.style.borderBottom = '6px solid rgb(' + c.r1 + ',' + c.g1 + ',' + c.b1 + ')'; | |
36746 this.core.triggerRise(index); | 38394 this.core.triggerRise(index); |
36747 } | 38395 } |
36748 | 38396 |
36749 }, | 38397 }, |
36750 | 38398 |
37687 this.addKMLLoader(); | 39335 this.addKMLLoader(); |
37688 this.addKMZLoader(); | 39336 this.addKMZLoader(); |
37689 this.addCSVLoader(); | 39337 this.addCSVLoader(); |
37690 this.addLocalKMLLoader(); | 39338 this.addLocalKMLLoader(); |
37691 this.addLocalCSVLoader(); | 39339 this.addLocalCSVLoader(); |
39340 this.addLocalXLSXLoader(); | |
37692 | 39341 |
37693 // trigger change event on the select so | 39342 // trigger change event on the select so |
37694 // that only the first loader div will be shown | 39343 // that only the first loader div will be shown |
37695 $(this.parent.gui.loaderTypeSelect).change(); | 39344 $(this.parent.gui.loaderTypeSelect).change(); |
37696 }, | 39345 }, |
37999 if (dataSet != null) | 39648 if (dataSet != null) |
38000 dataLoader.distributeDataset(dataSet); | 39649 dataLoader.distributeDataset(dataSet); |
38001 },this)); | 39650 },this)); |
38002 | 39651 |
38003 $(this.parent.gui.loaders).append(this.localStorageLoaderTab); | 39652 $(this.parent.gui.loaders).append(this.localStorageLoaderTab); |
38004 } | 39653 }, |
39654 | |
39655 addLocalXLSXLoader : function() { | |
39656 //taken from http://oss.sheetjs.com/js-xlsx/ | |
39657 var fixdata = function(data) { | |
39658 var o = "", l = 0, w = 10240; | |
39659 for(; l<data.byteLength/w; ++l) o+=String.fromCharCode.apply(null,new Uint8Array(data.slice(l*w,l*w+w))); | |
39660 o+=String.fromCharCode.apply(null, new Uint8Array(data.slice(o.length))); | |
39661 return o; | |
39662 } | |
39663 | |
39664 $(this.parent.gui.loaderTypeSelect).append("<option value='LocalXLSXLoader'>local XLS/XLSX File</option>"); | |
39665 | |
39666 this.LocalXLSXLoader = document.createElement("div"); | |
39667 $(this.LocalXLSXLoader).attr("id","LocalXLSXLoader"); | |
39668 | |
39669 this.xlsxFile = document.createElement("input"); | |
39670 $(this.xlsxFile).attr("type","file"); | |
39671 $(this.LocalXLSXLoader).append(this.xlsxFile); | |
39672 | |
39673 this.loadLocalXLSXButton = document.createElement("button"); | |
39674 $(this.loadLocalXLSXButton).text("load XLS/XLSX"); | |
39675 $(this.LocalXLSXLoader).append(this.loadLocalXLSXButton); | |
39676 | |
39677 $(this.loadLocalXLSXButton).click($.proxy(function(){ | |
39678 var filelist = $(this.xlsxFile).get(0).files; | |
39679 if (filelist.length > 0){ | |
39680 var file = filelist[0]; | |
39681 var fileName = file.name; | |
39682 var reader = new FileReader(); | |
39683 | |
39684 reader.onloadend = ($.proxy(function(theFile) { | |
39685 return function(e) { | |
39686 var workbook; | |
39687 var json; | |
39688 if (fileName.toLowerCase().indexOf("xlsx")!=-1){ | |
39689 workbook = XLSX.read(btoa(fixdata(reader.result)), {type: 'base64'}); | |
39690 var csv = XLSX.utils.sheet_to_csv(workbook.Sheets[workbook.SheetNames[0]]); | |
39691 var json = GeoTemConfig.convertCsv(csv); | |
39692 } else { | |
39693 workbook = XLS.read(btoa(fixdata(reader.result)), {type: 'base64'}); | |
39694 var csv = XLS.utils.sheet_to_csv(workbook.Sheets[workbook.SheetNames[0]]); | |
39695 var json = GeoTemConfig.convertCsv(csv); | |
39696 } | |
39697 | |
39698 var dataSet = new Dataset(GeoTemConfig.loadJson(json), fileName); | |
39699 if (dataSet != null) | |
39700 this.distributeDataset(dataSet); | |
39701 }; | |
39702 }(file),this)); | |
39703 | |
39704 reader.readAsArrayBuffer(file); | |
39705 } | |
39706 },this)); | |
39707 | |
39708 $(this.parent.gui.loaders).append(this.LocalXLSXLoader); | |
39709 }, | |
38005 }; | 39710 }; |
38006 /* | 39711 /* |
38007 * DataloaderConfig.js | 39712 * DataloaderConfig.js |
38008 * | 39713 * |
38009 * Copyright (c) 2013, Sebastian Kruse. All rights reserved. | 39714 * Copyright (c) 2013, Sebastian Kruse. All rights reserved. |
38132 | 39837 |
38133 this.options = (new DataloaderConfig(options)).options; | 39838 this.options = (new DataloaderConfig(options)).options; |
38134 this.gui = new DataloaderGui(this, div, this.options); | 39839 this.gui = new DataloaderGui(this, div, this.options); |
38135 | 39840 |
38136 this.dataLoader = new Dataloader(this); | 39841 this.dataLoader = new Dataloader(this); |
39842 | |
39843 this.datasets = []; | |
38137 } | 39844 } |
38138 | 39845 |
38139 DataloaderWidget.prototype = { | 39846 DataloaderWidget.prototype = { |
38140 | 39847 |
38141 initWidget : function() { | 39848 initWidget : function() { |
38174 }, | 39881 }, |
38175 | 39882 |
38176 reset : function() { | 39883 reset : function() { |
38177 }, | 39884 }, |
38178 | 39885 |
38179 loadFromURL : function() { | 39886 loadRenames : function(){ |
38180 var dataLoaderWidget = this; | |
38181 //using jQuery-URL-Parser (https://github.com/skruse/jQuery-URL-Parser) | |
38182 var datasets = []; | |
38183 $.each($.url().param(),function(paramName, paramValue){ | |
38184 //startsWith and endsWith defined in SIMILE Ajax (string.js) | |
38185 var fileName = dataLoaderWidget.dataLoader.getFileName(paramValue); | |
38186 var origURL = paramValue; | |
38187 if (typeof GeoTemConfig.proxy != 'undefined') | |
38188 paramValue = GeoTemConfig.proxy + paramValue; | |
38189 if (paramName.toLowerCase().startsWith("kml")){ | |
38190 var kmlDoc = GeoTemConfig.getKml(paramValue); | |
38191 var dataSet = new Dataset(GeoTemConfig.loadKml(kmlDoc), fileName, origURL); | |
38192 if (dataSet != null){ | |
38193 var datasetID = parseInt(paramName.substr(3)); | |
38194 if (!isNaN(datasetID)){ | |
38195 datasets[datasetID] = dataSet; | |
38196 } else { | |
38197 datasets.push(dataSet); | |
38198 } | |
38199 } | |
38200 } | |
38201 else if (paramName.toLowerCase().startsWith("csv")){ | |
38202 var json = GeoTemConfig.getCsv(paramValue); | |
38203 var dataSet = new Dataset(GeoTemConfig.loadJson(json), fileName, origURL); | |
38204 if (dataSet != null){ | |
38205 var datasetID = parseInt(paramName.substr(3)); | |
38206 if (!isNaN(datasetID)){ | |
38207 datasets[datasetID] = dataSet; | |
38208 } else { | |
38209 datasets.push(dataSet); | |
38210 } | |
38211 } | |
38212 } | |
38213 else if (paramName.toLowerCase().startsWith("json")){ | |
38214 var json = GeoTemConfig.getJson(paramValue); | |
38215 var dataSet = new Dataset(GeoTemConfig.loadJson(json), fileName, origURL); | |
38216 if (dataSet != null){ | |
38217 var datasetID = parseInt(paramName.substr(4)); | |
38218 if (!isNaN(datasetID)){ | |
38219 datasets[datasetID] = dataSet; | |
38220 } else { | |
38221 datasets.push(dataSet); | |
38222 } | |
38223 } | |
38224 } | |
38225 else if (paramName.toLowerCase().startsWith("local")){ | |
38226 var csv = $.remember({name:encodeURIComponent(origURL)}); | |
38227 //TODO: this is a bad idea and will be changed upon having a better | |
38228 //usage model for local stored data | |
38229 var fileName = origURL.substring("GeoBrowser_dataset_".length); | |
38230 var json = GeoTemConfig.convertCsv(csv); | |
38231 var dataSet = new Dataset(GeoTemConfig.loadJson(json), fileName, origURL, "local"); | |
38232 if (dataSet != null){ | |
38233 var datasetID = parseInt(paramName.substr(5)); | |
38234 if (!isNaN(datasetID)){ | |
38235 datasets[datasetID] = dataSet; | |
38236 } else { | |
38237 datasets.push(dataSet); | |
38238 } | |
38239 } | |
38240 } | |
38241 }); | |
38242 //load (optional!) attribute renames | 39887 //load (optional!) attribute renames |
38243 //each rename param is {latitude:..,longitude:..,place:..,date:..,timeSpanBegin:..,timeSpanEnd:..} | 39888 //each rename param is {latitude:..,longitude:..,place:..,date:..,timeSpanBegin:..,timeSpanEnd:..} |
38244 //examples: | 39889 //examples: |
38245 // &rename1={"latitude":"lat1","longitude":"lon1"} | 39890 // &rename1={"latitude":"lat1","longitude":"lon1"} |
38246 // &rename2=[{"latitude":"lat1","longitude":"lon1"},{"latitude":"lat2","longitude":"lon2"}] | 39891 // &rename2=[{"latitude":"lat1","longitude":"lon1"},{"latitude":"lat2","longitude":"lon2"}] |
39892 var dataLoaderWidget = this; | |
39893 var datasets = dataLoaderWidget.datasets; | |
38247 $.each($.url().param(),function(paramName, paramValue){ | 39894 $.each($.url().param(),function(paramName, paramValue){ |
38248 if (paramName.toLowerCase().startsWith("rename")){ | 39895 if (paramName.toLowerCase().startsWith("rename")){ |
38249 var datasetID = parseInt(paramName.substr(6)); | 39896 var datasetID = parseInt(paramName.replace(/\D/g,'')); |
38250 var dataset; | 39897 var dataset; |
38251 if (isNaN(datasetID)){ | 39898 if (isNaN(datasetID)){ |
38252 var dataset; | 39899 var dataset; |
38253 for (datasetID in datasets){ | 39900 for (datasetID in datasets){ |
38254 break; | 39901 break; |
38325 renameFunc(0,renames.latitude,renames.longitude,renames.place,renames.date, | 39972 renameFunc(0,renames.latitude,renames.longitude,renames.place,renames.date, |
38326 renames.timeSpanBegin,renames.timeSpanEnd,renames.index); | 39973 renames.timeSpanBegin,renames.timeSpanEnd,renames.index); |
38327 } | 39974 } |
38328 } | 39975 } |
38329 }); | 39976 }); |
39977 }, | |
39978 | |
39979 loadFilters : function(){ | |
38330 //load (optional!) filters | 39980 //load (optional!) filters |
38331 //those will create a new(!) dataset, that only contains the filtered IDs | 39981 //those will create a new(!) dataset, that only contains the filtered IDs |
39982 var dataLoaderWidget = this; | |
39983 var datasets = dataLoaderWidget.datasets; | |
38332 $.each($.url().param(),function(paramName, paramValue){ | 39984 $.each($.url().param(),function(paramName, paramValue){ |
38333 //startsWith and endsWith defined in SIMILE Ajax (string.js) | 39985 //startsWith and endsWith defined in SIMILE Ajax (string.js) |
38334 if (paramName.toLowerCase().startsWith("filter")){ | 39986 if (paramName.toLowerCase().startsWith("filter")){ |
38335 var datasetID = parseInt(paramName.substr(6)); | 39987 var datasetID = parseInt(paramName.replace(/\D/g,'')); |
38336 var dataset; | 39988 var dataset; |
38337 if (isNaN(datasetID)){ | 39989 if (isNaN(datasetID)){ |
38338 var dataset; | 39990 var dataset; |
38339 for (datasetID in datasets){ | 39991 for (datasetID in datasets){ |
38340 break; | 39992 break; |
38365 } else { | 40017 } else { |
38366 filterValues(paramValue); | 40018 filterValues(paramValue); |
38367 } | 40019 } |
38368 | 40020 |
38369 } | 40021 } |
38370 }); | 40022 }); |
40023 }, | |
40024 | |
40025 loadColors : function(){ | |
38371 //Load the (optional!) dataset colors | 40026 //Load the (optional!) dataset colors |
40027 var dataLoaderWidget = this; | |
40028 var datasets = dataLoaderWidget.datasets; | |
38372 $.each($.url().param(),function(paramName, paramValue){ | 40029 $.each($.url().param(),function(paramName, paramValue){ |
38373 if (paramName.toLowerCase().startsWith("color")){ | 40030 if (paramName.toLowerCase().startsWith("color")){ |
38374 //color is 1-based, index is 0-based! | 40031 //color is 1-based, index is 0-based! |
38375 var datasetID = parseInt(paramName.substring("color".length))-1; | 40032 var datasetID = parseInt(paramName.replace(/\D/g,'')); |
38376 if (datasets.length > datasetID){ | 40033 if (datasets.length > datasetID){ |
38377 if (typeof datasets[datasetID].color === "undefined"){ | 40034 if (typeof datasets[datasetID].color === "undefined"){ |
38378 var color = new Object(); | 40035 var color = new Object(); |
38379 var colorsSelectedUnselected = paramValue.split(","); | 40036 var colorsSelectedUnselected = paramValue.split(","); |
38380 if (colorsSelectedUnselected.length > 2) | 40037 if (colorsSelectedUnselected.length > 2) |
38406 | 40063 |
38407 datasets[datasetID].color = color; | 40064 datasets[datasetID].color = color; |
38408 } | 40065 } |
38409 } | 40066 } |
38410 } | 40067 } |
40068 }); | |
40069 }, | |
40070 | |
40071 loadFromURL : function() { | |
40072 var dataLoaderWidget = this; | |
40073 dataLoaderWidget.datasets = []; | |
40074 //using jQuery-URL-Parser (https://github.com/skruse/jQuery-URL-Parser) | |
40075 var datasets = dataLoaderWidget.datasets; | |
40076 var parametersHash = $.url().param(); | |
40077 var parametersArray = []; | |
40078 $.each(parametersHash,function(paramName, paramValue){ | |
40079 parametersArray.push({paramName:paramName, paramValue:paramValue}); | |
38411 }); | 40080 }); |
38412 //delete undefined entries in the array | |
38413 //(can happen if the sequence given in the URL is not complete | |
38414 // e.g. kml0=..,kml2=..) | |
38415 //this also reorders the array, starting with 0 | |
38416 var tempDatasets = []; | |
38417 for(var index in datasets){ | |
38418 if (datasets[index] instanceof Dataset){ | |
38419 tempDatasets.push(datasets[index]); | |
38420 } | |
38421 } | |
38422 datasets = tempDatasets; | |
38423 | 40081 |
38424 if (datasets.length > 0) | 40082 var parseParam = function(paramNr){ |
38425 dataLoaderWidget.dataLoader.distributeDatasets(datasets); | 40083 |
40084 if (paramNr==parametersArray.length){ | |
40085 dataLoaderWidget.loadRenames(); | |
40086 dataLoaderWidget.loadFilters(); | |
40087 dataLoaderWidget.loadColors(); | |
40088 | |
40089 //delete undefined entries in the array | |
40090 //(can happen if the sequence given in the URL is not complete | |
40091 // e.g. kml0=..,kml2=..) | |
40092 //this also reorders the array, starting with 0 | |
40093 var tempDatasets = []; | |
40094 for(var index in datasets){ | |
40095 if (datasets[index] instanceof Dataset){ | |
40096 tempDatasets.push(datasets[index]); | |
40097 } | |
40098 } | |
40099 datasets = tempDatasets; | |
40100 | |
40101 if (datasets.length > 0){ | |
40102 dataLoaderWidget.dataLoader.distributeDatasets(datasets); | |
40103 } | |
40104 return; | |
40105 } | |
40106 | |
40107 var paramName = parametersArray[paramNr].paramName; | |
40108 var paramValue = parametersArray[paramNr].paramValue; | |
40109 | |
40110 var datasetID = parseInt(paramName.replace(/\D/g,'')); | |
40111 | |
40112 //startsWith and endsWith defined in SIMILE Ajax (string.js) | |
40113 var fileName = dataLoaderWidget.dataLoader.getFileName(paramValue); | |
40114 var origURL = paramValue; | |
40115 if (typeof GeoTemConfig.proxy != 'undefined') | |
40116 paramValue = GeoTemConfig.proxy + paramValue; | |
40117 if (paramName.toLowerCase().startsWith("kml")){ | |
40118 GeoTemConfig.getKml(paramValue, function(kmlDoc){ | |
40119 var dataSet = new Dataset(GeoTemConfig.loadKml(kmlDoc), fileName, origURL); | |
40120 if (dataSet != null){ | |
40121 if (!isNaN(datasetID)){ | |
40122 datasets[datasetID] = dataSet; | |
40123 } else { | |
40124 datasets.push(dataSet); | |
40125 } | |
40126 } | |
40127 setTimeout(function(){parseParam(paramNr+1)},1); | |
40128 }); | |
40129 } | |
40130 else if (paramName.toLowerCase().startsWith("csv")){ | |
40131 GeoTemConfig.getCsv(paramValue,function(json){ | |
40132 var dataSet = new Dataset(GeoTemConfig.loadJson(json), fileName, origURL); | |
40133 if (dataSet != null){ | |
40134 if (!isNaN(datasetID)){ | |
40135 datasets[datasetID] = dataSet; | |
40136 } else { | |
40137 datasets.push(dataSet); | |
40138 } | |
40139 } | |
40140 setTimeout(function(){parseParam(paramNr+1)},1); | |
40141 }); | |
40142 } | |
40143 else if (paramName.toLowerCase().startsWith("json")){ | |
40144 GeoTemConfig.getJson(paramValue,function(json ){ | |
40145 var dataSet = new Dataset(GeoTemConfig.loadJson(json), fileName, origURL); | |
40146 if (dataSet != null){ | |
40147 if (!isNaN(datasetID)){ | |
40148 datasets[datasetID] = dataSet; | |
40149 } else { | |
40150 datasets.push(dataSet); | |
40151 } | |
40152 } | |
40153 setTimeout(function(){parseParam(paramNr+1)},1); | |
40154 }); | |
40155 } | |
40156 else if (paramName.toLowerCase().startsWith("local")){ | |
40157 var csv = $.remember({name:encodeURIComponent(origURL)}); | |
40158 //TODO: this is a bad idea and will be changed upon having a better | |
40159 //usage model for local stored data | |
40160 var fileName = origURL.substring("GeoBrowser_dataset_".length); | |
40161 var json = GeoTemConfig.convertCsv(csv); | |
40162 var dataSet = new Dataset(GeoTemConfig.loadJson(json), fileName, origURL, "local"); | |
40163 if (dataSet != null){ | |
40164 if (!isNaN(datasetID)){ | |
40165 datasets[datasetID] = dataSet; | |
40166 } else { | |
40167 datasets.push(dataSet); | |
40168 } | |
40169 } | |
40170 setTimeout(function(){parseParam(paramNr+1)},1); | |
40171 } else if (paramName.toLowerCase().startsWith("xls")){ | |
40172 GeoTemConfig.getBinary(paramValue,function(binaryData){ | |
40173 var data = new Uint8Array(binaryData); | |
40174 var arr = new Array(); | |
40175 for(var i = 0; i != data.length; ++i){ | |
40176 arr[i] = String.fromCharCode(data[i]); | |
40177 } | |
40178 | |
40179 var workbook; | |
40180 var json; | |
40181 if (paramName.toLowerCase().startsWith("xlsx")){ | |
40182 workbook = XLSX.read(arr.join(""), {type:"binary"}); | |
40183 var csv = XLSX.utils.sheet_to_csv(workbook.Sheets[workbook.SheetNames[0]]); | |
40184 var json = GeoTemConfig.convertCsv(csv); | |
40185 } else { | |
40186 workbook = XLS.read(arr.join(""), {type:"binary"}); | |
40187 var csv = XLS.utils.sheet_to_csv(workbook.Sheets[workbook.SheetNames[0]]); | |
40188 var json = GeoTemConfig.convertCsv(csv); | |
40189 } | |
40190 | |
40191 var dataSet = new Dataset(GeoTemConfig.loadJson(json), fileName, origURL); | |
40192 if (dataSet != null){ | |
40193 if (!isNaN(datasetID)){ | |
40194 datasets[datasetID] = dataSet; | |
40195 } else { | |
40196 datasets.push(dataSet); | |
40197 } | |
40198 } | |
40199 setTimeout(function(){parseParam(paramNr+1)},1); | |
40200 }); | |
40201 } else { | |
40202 setTimeout(function(){parseParam(paramNr+1)},1); | |
40203 } | |
40204 }; | |
40205 | |
40206 if (parametersArray.length>0){ | |
40207 parseParam(0) | |
40208 } | |
38426 } | 40209 } |
38427 }; | 40210 }; |
38428 /* | 40211 /* |
38429 * FuzzyTimelineConfig.js | 40212 * FuzzyTimelineConfig.js |
38430 * | 40213 * |
39191 weight = this.weight * ticks.firstTickPercentage; | 40974 weight = this.weight * ticks.firstTickPercentage; |
39192 else if (i == ticks.lastTick) | 40975 else if (i == ticks.lastTick) |
39193 weight = this.weight * ticks.lastTickPercentage; | 40976 weight = this.weight * ticks.lastTickPercentage; |
39194 else | 40977 else |
39195 weight = this.weight; | 40978 weight = this.weight; |
39196 | |
39197 weight = this.weight; | |
39198 } | 40979 } |
39199 | 40980 |
39200 chartDataCounter[i] += weight; | 40981 chartDataCounter[i] += weight; |
39201 //add this object to the hash | 40982 //add this object to the hash |
39202 if (typeof objectHash[i] === "undefined") | 40983 if (typeof objectHash[i] === "undefined") |
39967 moment.duration(10000, 'years'), | 41748 moment.duration(10000, 'years'), |
39968 ]; | 41749 ]; |
39969 var overallSpan = rangeSlider.parent.overallMax-rangeSlider.parent.overallMin; | 41750 var overallSpan = rangeSlider.parent.overallMax-rangeSlider.parent.overallMin; |
39970 //only add spans that are not too small for the data | 41751 //only add spans that are not too small for the data |
39971 for (var i = 0; i < fixedSpans.length; i++){ | 41752 for (var i = 0; i < fixedSpans.length; i++){ |
39972 if ( (fixedSpans[i].asMilliseconds() > (smallestSpan.asMilliseconds() * 0.5)) && | 41753 if ( (fixedSpans[i].asMilliseconds() > (smallestSpan.asMilliseconds() * 0.25)) && |
39973 (fixedSpans[i].asMilliseconds() < overallSpan) | 41754 (fixedSpans[i].asMilliseconds() < overallSpan) |
39974 && | 41755 && |
39975 ( | 41756 ( |
39976 rangeSlider.parent.options.showAllPossibleSpans || | 41757 rangeSlider.parent.options.showAllPossibleSpans || |
39977 ((rangeSlider.parent.overallMax-rangeSlider.parent.overallMin)/fixedSpans[i]<rangeSlider.options.maxBars) | 41758 ((rangeSlider.parent.overallMax-rangeSlider.parent.overallMin)/fixedSpans[i]<rangeSlider.options.maxBars) |
40311 selectionChanged : function(selection) { | 42092 selectionChanged : function(selection) { |
40312 var fuzzyTimeline = this; | 42093 var fuzzyTimeline = this; |
40313 if( !GeoTemConfig.selectionEvents ){ | 42094 if( !GeoTemConfig.selectionEvents ){ |
40314 return; | 42095 return; |
40315 } | 42096 } |
40316 if (selection.valid()) | 42097 if ((typeof selection.objects !== "undefined")&& |
40317 fuzzyTimeline.selected = selection.objects; | 42098 (selection.objects.length == GeoTemConfig.datasets.length)){ |
40318 else | 42099 var objectCount = 0; |
42100 for (var i=0, il=selection.objects.length; i < il; i++){ | |
42101 objectCount += selection.objects[i].length; | |
42102 } | |
42103 if (objectCount > 0){ | |
42104 fuzzyTimeline.selected = selection.objects; | |
42105 } else { | |
42106 delete fuzzyTimeline.selected; | |
42107 } | |
42108 } else | |
40319 delete fuzzyTimeline.selected; | 42109 delete fuzzyTimeline.selected; |
40320 if (fuzzyTimeline.viewMode === "density") | 42110 if (fuzzyTimeline.viewMode === "density") |
40321 this.density.selectionChanged(fuzzyTimeline.selected); | 42111 this.density.selectionChanged(fuzzyTimeline.selected); |
40322 else if (fuzzyTimeline.viewMode === "barchart") | 42112 else if (fuzzyTimeline.viewMode === "barchart") |
40323 this.rangeBars.selectionChanged(fuzzyTimeline.selected); | 42113 this.rangeBars.selectionChanged(fuzzyTimeline.selected); |
40732 var fuzzyTimeline = this; | 42522 var fuzzyTimeline = this; |
40733 var oldZoomFactor = fuzzyTimeline.zoomFactor; | 42523 var oldZoomFactor = fuzzyTimeline.zoomFactor; |
40734 fuzzyTimeline.zoomFactor = zoomFactor; | 42524 fuzzyTimeline.zoomFactor = zoomFactor; |
40735 if (zoomFactor > 1){ | 42525 if (zoomFactor > 1){ |
40736 $(fuzzyTimeline.gui.plotDiv).width(zoomFactor*100+"%"); | 42526 $(fuzzyTimeline.gui.plotDiv).width(zoomFactor*100+"%"); |
40737 //leave place for the scrollbar | |
40738 $(fuzzyTimeline.gui.plotDiv).height(fuzzyTimeline.gui.plotDIVHeight-20); | |
40739 } else{ | 42527 } else{ |
40740 $(fuzzyTimeline.gui.plotDiv).width("100%"); | 42528 $(fuzzyTimeline.gui.plotDiv).width("100%"); |
40741 $(fuzzyTimeline.gui.plotDiv).height(fuzzyTimeline.gui.plotDIVHeight); | 42529 } |
40742 } | 42530 //leave place for the scrollbar |
42531 $(fuzzyTimeline.gui.plotDiv).height(fuzzyTimeline.gui.plotDIVHeight-20); | |
40743 | 42532 |
40744 //fit handles | 42533 //fit handles |
40745 //this does not make much sense, as the selections are _completely_ different | 42534 //this does not make much sense, as the selections are _completely_ different |
40746 //for each scale rate, as the objects may reside in different "ticks" of the graph | 42535 //for each scale rate, as the objects may reside in different "ticks" of the graph |
40747 $(fuzzyTimeline.handles).each(function(){ | 42536 $(fuzzyTimeline.handles).each(function(){ |
41597 | 43386 |
41598 if (chartData.length>0){ | 43387 if (chartData.length>0){ |
41599 $(this.pieChartDiv).empty(); | 43388 $(this.pieChartDiv).empty(); |
41600 | 43389 |
41601 //calculate height (flot NEEDS a height) | 43390 //calculate height (flot NEEDS a height) |
41602 var parentHeight = $(this.parent.gui.pieChartsDiv).outerHeight(true);// - $(this.parent.gui.columnSelectorDiv).outerHeight(true);//***lchang | 43391 var parentHeight = $(this.parent.gui.pieChartsDiv).outerHeight(true) - $(this.parent.gui.columnSelectorDiv).outerHeight(true); |
41603 var pieChartCount = 0; | 43392 var pieChartCount = 0; |
41604 $(this.parent.pieCharts).each(function(){ | 43393 $(this.parent.pieCharts).each(function(){ |
41605 if (this instanceof PieChart) | 43394 if (this instanceof PieChart) |
41606 pieChartCount++; | 43395 pieChartCount++; |
41607 }); | 43396 }); |
41608 var height = (parentHeight/pieChartCount) - $(this.informationDIV).outerHeight(true); | 43397 var height = (parentHeight/pieChartCount) - $(this.informationDIV).outerHeight(true); |
41609 if (pieChart.options.restrictPieChartSize !== false) | 43398 if (pieChart.options.restrictPieChartSize !== false) |
41610 height = Math.min(height, /*$(window).height()*/parentHeight * pieChart.options.restrictPieChartSize);//***lchang | 43399 height = Math.min(height, $(window).height() * pieChart.options.restrictPieChartSize); |
41611 if(height>300) | |
41612 height=300; | |
41613 if(height<150) | |
41614 height=150; | |
41615 $(this.pieChartDiv).height(height); | 43400 $(this.pieChartDiv).height(height); |
41616 | 43401 |
41617 $.plot($(this.pieChartDiv), chartData, | 43402 $.plot($(this.pieChartDiv), chartData, |
41618 { | 43403 { |
41619 series: { | 43404 series: { |
41759 | 43544 |
41760 this.dialog = $("<div></div>"); | 43545 this.dialog = $("<div></div>"); |
41761 this.dialog.html("").dialog({modal: true}).dialog('open'); | 43546 this.dialog.html("").dialog({modal: true}).dialog('open'); |
41762 | 43547 |
41763 //to asure that the dialog is above (z-index of) the toolbars | 43548 //to asure that the dialog is above (z-index of) the toolbars |
41764 $(".ui-front").css("z-index","20011"); | 43549 $(".ui-front").css("z-index","10001"); |
41765 | 43550 |
41766 var allNumeric = this.loadValues(datasetIndex, columnName); | 43551 var allNumeric = this.loadValues(datasetIndex, columnName); |
41767 | 43552 |
41768 if (typeof allNumeric === "undefined") | 43553 if (typeof allNumeric === "undefined") |
41769 return; | 43554 return; |
42117 * @author Sebastian Kruse (skruse@mpiwg-berlin.mpg.de) | 43902 * @author Sebastian Kruse (skruse@mpiwg-berlin.mpg.de) |
42118 */ | 43903 */ |
42119 function PieChartConfig(options) { | 43904 function PieChartConfig(options) { |
42120 | 43905 |
42121 this.options = { | 43906 this.options = { |
42122 restrictPieChartSize : 0.8, // restrict size to percantage of window size (false for no restriction) | 43907 restrictPieChartSize : 0.25, // restrict size to percantage of window size (false for no restriction) |
42123 localStoragePrefix : "GeoBrowser_PieChart_", // prefix for value name in LocalStorage | 43908 localStoragePrefix : "GeoBrowser_PieChart_", // prefix for value name in LocalStorage |
42124 allowLocalStorage : true, //whether LocalStorage save and load should be allowed (and buttons shown) | 43909 allowLocalStorage : true, //whether LocalStorage save and load should be allowed (and buttons shown) |
42125 }; | 43910 }; |
42126 if ( typeof options != 'undefined') { | 43911 if ( typeof options != 'undefined') { |
42127 $.extend(this.options, options); | 43912 $.extend(this.options, options); |
42257 | 44042 |
42258 this.pieChartsDiv = document.createElement("div"); | 44043 this.pieChartsDiv = document.createElement("div"); |
42259 this.pieChartsDiv.id = "pieChartsDivID"; | 44044 this.pieChartsDiv.id = "pieChartsDivID"; |
42260 div.appendChild(this.pieChartsDiv); | 44045 div.appendChild(this.pieChartsDiv); |
42261 $(this.pieChartsDiv).height("100%"); | 44046 $(this.pieChartsDiv).height("100%"); |
42262 var h=$(div).height(); | |
42263 h-=30; | |
42264 $(this.pieChartsDiv).height(h); | |
42265 }; | 44047 }; |
42266 | 44048 |
42267 PieChartGui.prototype = { | 44049 PieChartGui.prototype = { |
42268 | 44050 |
42269 refreshColumnSelector : function(){ | 44051 refreshColumnSelector : function(){ |
43208 highlightChanged : function(objects) { | 44990 highlightChanged : function(objects) { |
43209 }, | 44991 }, |
43210 | 44992 |
43211 selectionChanged : function(selection) { | 44993 selectionChanged : function(selection) { |
43212 }, | 44994 }, |
44995 }; | |
44996 /* | |
44997 * LineOverlay.js | |
44998 * | |
44999 * Copyright (c) 2013, Sebastian Kruse. All rights reserved. | |
45000 * | |
45001 * This library is free software; you can redistribute it and/or | |
45002 * modify it under the terms of the GNU Lesser General Public | |
45003 * License as published by the Free Software Foundation; either | |
45004 * version 3 of the License, or (at your option) any later version. | |
45005 * | |
45006 * This library is distributed in the hope that it will be useful, | |
45007 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
45008 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
45009 * Lesser General Public License for more details. | |
45010 * | |
45011 * You should have received a copy of the GNU Lesser General Public | |
45012 * License along with this library; if not, write to the Free Software | |
45013 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, | |
45014 * MA 02110-1301 USA | |
45015 */ | |
45016 | |
45017 /** | |
45018 * @class LineOverlay | |
45019 * Implementation for an overlay showing lines between points | |
45020 * @author Sebastian Kruse (skruse@mpiwg-berlin.mpg.de) | |
45021 * | |
45022 * @param {HTML object} parent div to append the LineOverlay | |
45023 */ | |
45024 function LineOverlay(parent) { | |
45025 | |
45026 this.lineOverlay = this; | |
45027 | |
45028 this.parent = parent; | |
45029 this.options = parent.options; | |
45030 this.attachedMapWidgets = parent.attachedMapWidgets; | |
45031 | |
45032 this.overlays = []; | |
45033 | |
45034 this.initialize(); | |
45035 } | |
45036 | |
45037 LineOverlay.prototype = { | |
45038 | |
45039 initialize : function() { | |
45040 } | |
45041 }; | |
45042 /* | |
45043 * LineOverlayConfig.js | |
45044 * | |
45045 * Copyright (c) 2013, Sebastian Kruse. All rights reserved. | |
45046 * | |
45047 * This library is free software; you can redistribute it and/or | |
45048 * modify it under the terms of the GNU Lesser General Public | |
45049 * License as published by the Free Software Foundation; either | |
45050 * version 3 of the License, or (at your option) any later version. | |
45051 * | |
45052 * This library is distributed in the hope that it will be useful, | |
45053 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
45054 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
45055 * Lesser General Public License for more details. | |
45056 * | |
45057 * You should have received a copy of the GNU Lesser General Public | |
45058 * License along with this library; if not, write to the Free Software | |
45059 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, | |
45060 * MA 02110-1301 USA | |
45061 */ | |
45062 | |
45063 /** | |
45064 * @class LineOverlayConfig | |
45065 * LineOverlay Configuration File | |
45066 * @author Sebastian Kruse (skruse@mpiwg-berlin.mpg.de) | |
45067 */ | |
45068 function LineOverlayConfig(options) { | |
45069 this.options = { | |
45070 showArrows : true, | |
45071 showLines : "both", //which directions will be shown: "both", "inbound", "outbound" | |
45072 onlyShowSelectedOrHighlighted : false, //only show lines in case of selection/highlight | |
45073 } | |
45074 | |
45075 if ( typeof options != 'undefined') { | |
45076 $.extend(this.options, options); | |
45077 } | |
45078 | |
45079 }; | |
45080 /* | |
45081 * LineOverlayWidget.js | |
45082 * | |
45083 * Copyright (c) 2013, Sebastian Kruse. All rights reserved. | |
45084 * | |
45085 * This library is free software; you can redistribute it and/or | |
45086 * modify it under the terms of the GNU Lesser General Public | |
45087 * License as published by the Free Software Foundation; either | |
45088 * version 3 of the License, or (at your option) any later version. | |
45089 * | |
45090 * This library is distributed in the hope that it will be useful, | |
45091 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
45092 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
45093 * Lesser General Public License for more details. | |
45094 * | |
45095 * You should have received a copy of the GNU Lesser General Public | |
45096 * License along with this library; if not, write to the Free Software | |
45097 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, | |
45098 * MA 02110-1301 USA | |
45099 */ | |
45100 | |
45101 //calculate angle between line and x-axis | |
45102 //credits: geometricnet (http://geometricnet.sourceforge.net/examples/directions.html) | |
45103 bearing = function(x1,y1,x2,y2) { | |
45104 b_x = 0; | |
45105 b_y = 1; | |
45106 a_x = x2 - x1; | |
45107 a_y = y2 - y1; | |
45108 angle_rad = Math.acos((a_x*b_x+a_y*b_y)/Math.sqrt(a_x*a_x+a_y*a_y)) ; | |
45109 angle = 360/(2*Math.PI)*angle_rad; | |
45110 if (a_x < 0) { | |
45111 return 360 - angle; | |
45112 } else { | |
45113 return angle; | |
45114 } | |
45115 }; | |
45116 | |
45117 /** | |
45118 * @class LineOverlayWidget | |
45119 * Implementation for the widget interactions of an overlay showing lines between points | |
45120 * @author Sebastian Kruse (skruse@mpiwg-berlin.mpg.de) | |
45121 * | |
45122 * @param {WidgetWrapper} core wrapper for interaction to other widgets | |
45123 * @param {JSON} options user specified configuration that overwrites options in OverlayloaderConfig.js | |
45124 */ | |
45125 LineOverlayWidget = function (core, options) { | |
45126 | |
45127 this.core = core; | |
45128 this.core.setWidget(this); | |
45129 | |
45130 this.options = (new LineOverlayConfig(options)).options; | |
45131 | |
45132 this.attachedMapWidgets = new Array(); | |
45133 | |
45134 this.lineOverlay = new LineOverlay(this); | |
45135 this.lines = []; | |
45136 this.multiLineFeature; | |
45137 | |
45138 this.selected = []; | |
45139 } | |
45140 | |
45141 /** | |
45142 * @param {Number} dataSet number of dataSet in dataSet array | |
45143 * @param {Number} objectID number of DataObject in objects array | |
45144 */ | |
45145 | |
45146 function Line(objectStart, objectEnd ) { | |
45147 this.objectStart = objectStart; | |
45148 this.objectEnd = objectEnd; | |
45149 } | |
45150 | |
45151 LineOverlayWidget.prototype = { | |
45152 | |
45153 initWidget : function() { | |
45154 var lineOverlayWidget = this; | |
45155 this.drawLines(); | |
45156 }, | |
45157 | |
45158 highlightChanged : function(objects) { | |
45159 if( !GeoTemConfig.highlightEvents ){ | |
45160 return; | |
45161 } | |
45162 this.drawLines(GeoTemConfig.mergeObjects(objects,this.selected)); | |
45163 }, | |
45164 | |
45165 selectionChanged : function(selection) { | |
45166 if( !GeoTemConfig.selectionEvents ){ | |
45167 return; | |
45168 } | |
45169 if (selection.valid()) | |
45170 this.selected = selection.objects; | |
45171 else | |
45172 this.selected = []; | |
45173 | |
45174 this.drawLines(this.selected); | |
45175 }, | |
45176 | |
45177 triggerHighlight : function(item) { | |
45178 }, | |
45179 | |
45180 tableSelection : function() { | |
45181 }, | |
45182 | |
45183 deselection : function() { | |
45184 }, | |
45185 | |
45186 filtering : function() { | |
45187 }, | |
45188 | |
45189 inverseFiltering : function() { | |
45190 }, | |
45191 | |
45192 triggerRefining : function() { | |
45193 }, | |
45194 | |
45195 reset : function() { | |
45196 }, | |
45197 | |
45198 //identical to the function in PieChartWidget | |
45199 //here cause widgets may be used independed of each other | |
45200 getElementData : function(dataObject, watchedColumn, selectionFunction) { | |
45201 var columnData; | |
45202 if (watchedColumn.indexOf("[") === -1){ | |
45203 columnData = dataObject[watchedColumn]; | |
45204 if (typeof columnData === "undefined"){ | |
45205 columnData = dataObject.tableContent[watchedColumn]; | |
45206 }; | |
45207 } else { | |
45208 try { | |
45209 var columnName = watchedColumn.split("[")[0]; | |
45210 var IndexAndAttribute = watchedColumn.split("[")[1]; | |
45211 if (IndexAndAttribute.indexOf("]") != -1){ | |
45212 var arrayIndex = IndexAndAttribute.split("]")[0]; | |
45213 var attribute = IndexAndAttribute.split("]")[1]; | |
45214 | |
45215 if (typeof attribute === "undefined") | |
45216 columnData = dataObject[columnName][arrayIndex]; | |
45217 else{ | |
45218 attribute = attribute.split(".")[1]; | |
45219 columnData = dataObject[columnName][arrayIndex][attribute]; | |
45220 } | |
45221 } | |
45222 } catch(e) { | |
45223 if (typeof console !== undefined) | |
45224 console.error(e); | |
45225 | |
45226 delete columnData; | |
45227 } | |
45228 } | |
45229 | |
45230 if ( (typeof columnData !== "undefined") && (typeof selectionFunction !== "undefined") ) | |
45231 columnData = selectionFunction(columnData); | |
45232 | |
45233 return(columnData); | |
45234 }, | |
45235 | |
45236 matchColumns : function(dataSet1, columnName1, dataSet2, columnName2) { | |
45237 var lineOverlayWidget = this; | |
45238 lineOverlayWidget.lines; | |
45239 $(GeoTemConfig.datasets[dataSet1].objects).each(function(){ | |
45240 var object1 = this; | |
45241 var data1 = lineOverlayWidget.getElementData(object1, columnName1); | |
45242 //split because there could be multiple comma separated values | |
45243 data1 = data1.split(","); | |
45244 | |
45245 $(GeoTemConfig.datasets[dataSet2].objects).each(function(){ | |
45246 var object2 = this; | |
45247 //avoid reflexive and double entries | |
45248 if ((columnName1 === columnName2)&&(dataSet1 === dataSet2)&&(object1.index<=object2.index)) | |
45249 return; | |
45250 var data2 = lineOverlayWidget.getElementData(object2, columnName2); | |
45251 //split because there could be multiple comma separated values | |
45252 data2 = data2.split(","); | |
45253 | |
45254 //check if at least one pair matches | |
45255 for(var i = 0; i < data1.length; i++ ){ | |
45256 var firstVal = data1[i]; | |
45257 if (data2.indexOf(firstVal) !== -1){ | |
45258 lineOverlayWidget.lines.push(new Line(object1, object2)); | |
45259 break; | |
45260 } | |
45261 } | |
45262 }); | |
45263 }); | |
45264 }, | |
45265 | |
45266 getXYofObject : function(cs,dataObject){ | |
45267 //iterata over datasets | |
45268 var x,y; | |
45269 var found = false; | |
45270 $(cs).each(function(){ | |
45271 //iterate over circles | |
45272 $(this).each(function(){ | |
45273 var circle = this; | |
45274 //iterata over objects in this circle; | |
45275 var index = $.inArray(dataObject,circle.elements); | |
45276 if (index !== -1){ | |
45277 x = circle.feature.geometry.x; | |
45278 y = circle.feature.geometry.y; | |
45279 found = true; | |
45280 return false; | |
45281 } | |
45282 }); | |
45283 //break loop | |
45284 if (found === true) | |
45285 return false; | |
45286 }); | |
45287 | |
45288 return ({x:x,y:y}); | |
45289 }, | |
45290 | |
45291 /** | |
45292 * @param {DataObjects[][]} objects set of objects to limit to | |
45293 */ | |
45294 drawLines : function(objects) { | |
45295 var flatObjects = []; | |
45296 if ( (typeof objects !== "undefined") && | |
45297 (objects instanceof Array) && | |
45298 (objects.length > 0) ) { | |
45299 $(objects).each(function(){ | |
45300 $.merge(flatObjects, this); | |
45301 }); | |
45302 } | |
45303 var lineOverlayWidget = this; | |
45304 | |
45305 $(lineOverlayWidget.attachedMapWidgets).each(function(){ | |
45306 var mapWidget = this.mapWidget; | |
45307 var lineLayer = this.lineLayer; | |
45308 | |
45309 var map = mapWidget.openlayersMap; | |
45310 var cs = mapWidget.mds.getObjectsByZoom(); | |
45311 | |
45312 mapWidget.openlayersMap.setLayerIndex(lineLayer, 99); | |
45313 | |
45314 lineLayer.removeAllFeatures(); | |
45315 | |
45316 var lineElements = []; | |
45317 | |
45318 var checkIfLineInPreset = function(){return false;}; | |
45319 if (lineOverlayWidget.options.showLines === "inbound"){ | |
45320 checkIfLineInPreset = function(objectStart,objectEnd,flatObjects){ | |
45321 return ($.inArray(objectEnd, flatObjects) === -1); | |
45322 }; | |
45323 } else if (lineOverlayWidget.options.showLines === "outbound"){ | |
45324 checkIfLineInPreset = function(objectStart,objectEnd,flatObjects){ | |
45325 return ($.inArray(objectStart, flatObjects) === -1); | |
45326 }; | |
45327 } else /*if (lineOverlayWidget.options.showLines === "both")*/{ | |
45328 checkIfLineInPreset = function(objectStart,objectEnd,flatObjects){ | |
45329 return ( ($.inArray(objectStart, flatObjects) === -1) && | |
45330 ($.inArray(objectEnd, flatObjects) === -1) ); | |
45331 }; | |
45332 } | |
45333 | |
45334 $(lineOverlayWidget.lines).each(function(){ | |
45335 var line = this; | |
45336 | |
45337 if ((lineOverlayWidget.options.onlyShowSelectedOrHighlighted === true) || (flatObjects.length > 0)){ | |
45338 //if objects are limited, check whether start or end are within | |
45339 if (checkIfLineInPreset(line.objectStart, line.objectEnd, flatObjects)) | |
45340 return; | |
45341 } | |
45342 //get XY-val of start Object | |
45343 var xyStart = lineOverlayWidget.getXYofObject(cs, line.objectStart); | |
45344 //continue if no valid XY-coords where found | |
45345 if ( (typeof xyStart.x === "undefined") && (typeof xyStart.y === "undefined") ) | |
45346 return; | |
45347 var xyEnd = lineOverlayWidget.getXYofObject(cs, line.objectEnd); | |
45348 //continue if no valid XY-coords where found | |
45349 if ( (typeof xyEnd.x === "undefined") && (typeof xyEnd.y === "undefined") ) | |
45350 return; | |
45351 | |
45352 //do not draw 0-length lines (from same circle) | |
45353 if ( (xyStart.x === xyEnd.x) && (xyStart.y === xyEnd.y) ) | |
45354 return; | |
45355 | |
45356 var points = new Array( | |
45357 new OpenLayers.Geometry.Point(xyStart.x, xyStart.y), | |
45358 new OpenLayers.Geometry.Point(xyEnd.x, xyEnd.y) | |
45359 ); | |
45360 | |
45361 var line = new OpenLayers.Geometry.LineString(points); | |
45362 | |
45363 //Only draw each line once. Unfortunately this check is faster | |
45364 //than drawing multiple lines. | |
45365 var found = false; | |
45366 $(lineElements).each(function(){ | |
45367 var checkLine = this.line; | |
45368 if (( (checkLine.components[0].x === line.components[0].x) && | |
45369 (checkLine.components[0].y === line.components[0].y) && | |
45370 (checkLine.components[1].x === line.components[1].x) && | |
45371 (checkLine.components[1].y === line.components[1].y) ) || | |
45372 // if lines are "directional" (arrows) the opposite one isn't the same anymore! | |
45373 ( (lineOverlayWidget.options.showArrows === false) && | |
45374 (checkLine.components[0].x === line.components[1].x) && | |
45375 (checkLine.components[0].y === line.components[1].y) && | |
45376 (checkLine.components[1].x === line.components[0].x) && | |
45377 (checkLine.components[1].y === line.components[0].y) ) ){ | |
45378 found = true; | |
45379 //increase width of this line | |
45380 this.width++; | |
45381 //and don't draw it again | |
45382 return false; | |
45383 } | |
45384 }); | |
45385 | |
45386 if (found === true) | |
45387 return; | |
45388 | |
45389 lineElements.push({line:line,width:1}); | |
45390 }); | |
45391 | |
45392 $(lineElements).each(function(){ | |
45393 var line = this.line; | |
45394 var width = this.width; | |
45395 | |
45396 if (lineOverlayWidget.options.showArrows === true){ | |
45397 var xyStart = line.components[0]; | |
45398 var xyEnd = line.components[1]; | |
45399 var arrowFeature = new OpenLayers.Feature.Vector( | |
45400 new OpenLayers.Geometry.Point(xyEnd.x-((xyEnd.x-xyStart.x)*0.03), xyEnd.y-((xyEnd.y-xyStart.y)*0.03)), | |
45401 { | |
45402 type: "triangle", | |
45403 angle: bearing(xyStart.x,xyStart.y,xyEnd.x,xyEnd.y), | |
45404 width: width+1 | |
45405 } | |
45406 ); | |
45407 lineLayer.addFeatures(arrowFeature); | |
45408 } | |
45409 | |
45410 var lineFeature = new OpenLayers.Feature.Vector(line,{width:width}); | |
45411 lineLayer.addFeatures(lineFeature); | |
45412 }); | |
45413 }); | |
45414 }, | |
45415 | |
45416 attachMapWidget : function(mapWidget) { | |
45417 var styles = new OpenLayers.StyleMap({ | |
45418 "default": { | |
45419 graphicName: "${type}", | |
45420 rotation: "${angle}", | |
45421 pointRadius: "${width}", | |
45422 strokeColor: '#0000ff', | |
45423 strokeOpacity: 0.5, | |
45424 strokeWidth: "${width}", | |
45425 fillOpacity: 1 | |
45426 } | |
45427 }); | |
45428 | |
45429 var lineOverlayWidget = this; | |
45430 var lineLayer = new OpenLayers.Layer.Vector("Line Layer", { | |
45431 styleMap: styles, | |
45432 isBaseLayer:false | |
45433 }); | |
45434 mapWidget.openlayersMap.addLayer(lineLayer); | |
45435 mapWidget.openlayersMap.setLayerIndex(lineLayer, 99); | |
45436 this.attachedMapWidgets.push({mapWidget:mapWidget,lineLayer:lineLayer}); | |
45437 //register zoom event | |
45438 mapWidget.openlayersMap.events.register("zoomend", lineOverlayWidget, function(){ | |
45439 this.drawLines(this.selected); | |
45440 }); | |
45441 } | |
43213 }; | 45442 }; |
43214 /* | 45443 /* |
43215 * DataObject.js | 45444 * DataObject.js |
43216 * | 45445 * |
43217 * Copyright (c) 2012, Stefan Jänicke. All rights reserved. | 45446 * Copyright (c) 2012, Stefan Jänicke. All rights reserved. |