{
"tiddlers": {
"$:/plugins/tiddlywiki/jszip/jszip.js": {
"text": "/*!\n\nJSZip - A Javascript class for generating and reading zip files\n<http://stuartk.com/jszip>\n\n(c) 2009-2014 Stuart Knightley <stuart [at] stuartk.com>\nDual licenced under the MIT license or GPLv3. See https://raw.github.com/Stuk/jszip/master/LICENSE.markdown.\n\nJSZip uses the library pako released under the MIT license :\nhttps://github.com/nodeca/pako/blob/master/LICENSE\n*/\n!function(a){if(\"object\"==typeof exports&&\"undefined\"!=typeof module)module.exports=a();else if(\"function\"==typeof define&&define.amd)define([],a);else{var b;b=\"undefined\"!=typeof window?window:\"undefined\"!=typeof global?global:\"undefined\"!=typeof self?self:this,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);var j=new Error(\"Cannot find module '\"+g+\"'\");throw j.code=\"MODULE_NOT_FOUND\",j}var k=c[g]={exports:{}};b[g][0].call(k.exports,function(a){var c=b[g][1][a];return e(c?c:a)},k,k.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\";function d(a){if(a){this.data=a,this.length=this.data.length,this.index=0,this.zero=0;for(var b=0;b<this.data.length;b++)a[b]=255&a[b]}}var e=a(\"./dataReader\");d.prototype=new e,d.prototype.byteAt=function(a){return this.data[this.zero+a]},d.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-this.zero;return-1},d.prototype.readData=function(a){if(this.checkOffset(a),0===a)return[];var b=this.data.slice(this.zero+this.index,this.zero+this.index+a);return this.index+=a,b},b.exports=d},{\"./dataReader\":6}],2:[function(a,b,c){\"use strict\";var d=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\";c.encode=function(a,b){for(var c,e,f,g,h,i,j,k=\"\",l=0;l<a.length;)c=a.charCodeAt(l++),e=a.charCodeAt(l++),f=a.charCodeAt(l++),g=c>>2,h=(3&c)<<4|e>>4,i=(15&e)<<2|f>>6,j=63&f,isNaN(e)?i=j=64:isNaN(f)&&(j=64),k=k+d.charAt(g)+d.charAt(h)+d.charAt(i)+d.charAt(j);return k},c.decode=function(a,b){var c,e,f,g,h,i,j,k=\"\",l=0;for(a=a.replace(/[^A-Za-z0-9\\+\\/\\=]/g,\"\");l<a.length;)g=d.indexOf(a.charAt(l++)),h=d.indexOf(a.charAt(l++)),i=d.indexOf(a.charAt(l++)),j=d.indexOf(a.charAt(l++)),c=g<<2|h>>4,e=(15&h)<<4|i>>2,f=(3&i)<<6|j,k+=String.fromCharCode(c),64!=i&&(k+=String.fromCharCode(e)),64!=j&&(k+=String.fromCharCode(f));return k}},{}],3:[function(a,b,c){\"use strict\";function d(){this.compressedSize=0,this.uncompressedSize=0,this.crc32=0,this.compressionMethod=null,this.compressedContent=null}d.prototype={getContent:function(){return null},getCompressedContent:function(){return null}},b.exports=d},{}],4:[function(a,b,c){\"use strict\";c.STORE={magic:\"\\0\\0\",compress:function(a,b){return a},uncompress:function(a){return a},compressInputType:null,uncompressInputType:null},c.DEFLATE=a(\"./flate\")},{\"./flate\":9}],5:[function(a,b,c){\"use strict\";var d=a(\"./utils\"),e=[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 c=\"string\"!==d.getTypeOf(a);\"undefined\"==typeof b&&(b=0);var f=0,g=0,h=0;b^=-1;for(var i=0,j=a.length;i<j;i++)h=c?a[i]:a.charCodeAt(i),g=255&(b^h),f=e[g],b=b>>>8^f;return b^-1}},{\"./utils\":22}],6:[function(a,b,c){\"use strict\";function d(a){this.data=null,this.length=0,this.index=0,this.zero=0}var e=a(\"./utils\");d.prototype={checkOffset:function(a){this.checkIndex(this.index+a)},checkIndex:function(a){if(this.length<this.zero+a||a<0)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(a){},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 e.transformTo(\"string\",this.readData(a))},readData:function(a){},lastIndexOfSignature:function(a){},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=d},{\"./utils\":22}],7:[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.compressionOptions=null,c.comment=null,c.unixPermissions=null,c.dosPermissions=null},{}],8:[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\":22}],9:[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\\0\",c.compress=function(a,b){return e.deflateRaw(a,{level:b.level||-1})},c.uncompress=function(a){return e.inflateRaw(a)}},{pako:25}],10:[function(a,b,c){\"use strict\";function d(a,b){return this instanceof d?(this.files={},this.comment=null,this.root=\"\",a&&this.load(a,b),void(this.clone=function(){var a=new d;for(var b in this)\"function\"!=typeof this[b]&&(a[b]=this[b]);return a})):new d(a,b)}var e=a(\"./base64\");d.prototype=a(\"./object\"),d.prototype.load=a(\"./load\"),d.support=a(\"./support\"),d.defaults=a(\"./defaults\"),d.utils=a(\"./deprecatedPublicUtils\"),d.base64={encode:function(a){return e.encode(a)},decode:function(a){return e.decode(a)}},d.compressions=a(\"./compressions\"),b.exports=d},{\"./base64\":2,\"./compressions\":4,\"./defaults\":7,\"./deprecatedPublicUtils\":8,\"./load\":11,\"./object\":14,\"./support\":18}],11:[function(a,b,c){\"use strict\";var d=a(\"./base64\"),e=a(\"./utf8\"),f=a(\"./utils\"),g=a(\"./zipEntries\");b.exports=function(a,b){var c,h,i,j;for(b=f.extend(b||{},{base64:!1,checkCRC32:!1,optimizedBinaryString:!1,createFolders:!1,decodeFileName:e.utf8decode}),b.base64&&(a=d.decode(a)),h=new g(a,b),c=h.files,i=0;i<c.length;i++)j=c[i],this.file(j.fileNameStr,j.decompressed,{binary:!0,optimizedBinaryString:!0,date:j.date,dir:j.dir,comment:j.fileCommentStr.length?j.fileCommentStr:null,unixPermissions:j.unixPermissions,dosPermissions:j.dosPermissions,createFolders:b.createFolders});return h.zipComment.length&&(this.comment=h.zipComment),this}},{\"./base64\":2,\"./utf8\":21,\"./utils\":22,\"./zipEntries\":23}],12:[function(a,b,c){(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)},{}],13:[function(a,b,c){\"use strict\";function d(a){this.data=a,this.length=this.data.length,this.index=0,this.zero=0}var e=a(\"./uint8ArrayReader\");d.prototype=new e,d.prototype.readData=function(a){this.checkOffset(a);var b=this.data.slice(this.zero+this.index,this.zero+this.index+a);return this.index+=a,b},b.exports=d},{\"./uint8ArrayReader\":19}],14:[function(a,b,c){\"use strict\";var d=a(\"./support\"),e=a(\"./utils\"),f=a(\"./crc32\"),g=a(\"./signature\"),h=a(\"./defaults\"),i=a(\"./base64\"),j=a(\"./compressions\"),k=a(\"./compressedObject\"),l=a(\"./nodeBuffer\"),m=a(\"./utf8\"),n=a(\"./stringWriter\"),o=a(\"./uint8ArrayWriter\"),p=function(a){if(a._data instanceof k&&(a._data=a._data.getContent(),a.options.binary=!0,a.options.base64=!1,\"uint8array\"===e.getTypeOf(a._data))){var b=a._data;a._data=new Uint8Array(b.length),0!==b.length&&a._data.set(b,0)}return a._data},q=function(a){var b=p(a),c=e.getTypeOf(b);return\"string\"===c?!a.options.binary&&d.nodebuffer?l(b,\"utf-8\"):a.asBinary():b},r=function(a){var b=p(this);return null===b||\"undefined\"==typeof b?\"\":(this.options.base64&&(b=i.decode(b)),b=a&&this.options.binary?D.utf8decode(b):e.transformTo(\"string\",b),a||this.options.binary||(b=e.transformTo(\"string\",D.utf8encode(b))),b)},s=function(a,b,c){this.name=a,this.dir=c.dir,this.date=c.date,this.comment=c.comment,this.unixPermissions=c.unixPermissions,this.dosPermissions=c.dosPermissions,this._data=b,this.options=c,this._initialMetadata={dir:c.dir,date:c.date}};s.prototype={asText:function(){return r.call(this,!0)},asBinary:function(){return r.call(this,!1)},asNodeBuffer:function(){var a=q(this);return e.transformTo(\"nodebuffer\",a)},asUint8Array:function(){var a=q(this);return e.transformTo(\"uint8array\",a)},asArrayBuffer:function(){return this.asUint8Array().buffer}};var t=function(a,b){var c,d=\"\";for(c=0;c<b;c++)d+=String.fromCharCode(255&a),a>>>=8;return d},u=function(a){return a=a||{},a.base64!==!0||null!==a.binary&&void 0!==a.binary||(a.binary=!0),a=e.extend(a,h),a.date=a.date||new Date,null!==a.compression&&(a.compression=a.compression.toUpperCase()),a},v=function(a,b,c){var d,f=e.getTypeOf(b);if(c=u(c),\"string\"==typeof c.unixPermissions&&(c.unixPermissions=parseInt(c.unixPermissions,8)),c.unixPermissions&&16384&c.unixPermissions&&(c.dir=!0),c.dosPermissions&&16&c.dosPermissions&&(c.dir=!0),c.dir&&(a=x(a)),c.createFolders&&(d=w(a))&&y.call(this,d,!0),c.dir||null===b||\"undefined\"==typeof b)c.base64=!1,c.binary=!1,b=null,f=null;else if(\"string\"===f)c.binary&&!c.base64&&c.optimizedBinaryString!==!0&&(b=e.string2binary(b));else{if(c.base64=!1,c.binary=!0,!(f||b instanceof k))throw new Error(\"The data of '\"+a+\"' is in an unsupported format !\");\"arraybuffer\"===f&&(b=e.transformTo(\"uint8array\",b))}var g=new s(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){return\"/\"!=a.slice(-1)&&(a+=\"/\"),a},y=function(a,b){return b=\"undefined\"!=typeof b&&b,a=x(a),this.files[a]||v.call(this,a,null,{dir:!0,createFolders:b}),this.files[a]},z=function(a,b,c){var d,g=new k;return a._data instanceof k?(g.uncompressedSize=a._data.uncompressedSize,g.crc32=a._data.crc32,0===g.uncompressedSize||a.dir?(b=j.STORE,g.compressedContent=\"\",g.crc32=0):a._data.compressionMethod===b.magic?g.compressedContent=a._data.getCompressedContent():(d=a._data.getContent(),g.compressedContent=b.compress(e.transformTo(b.compressInputType,d),c))):(d=q(a),d&&0!==d.length&&!a.dir||(b=j.STORE,d=\"\"),g.uncompressedSize=d.length,g.crc32=f(d),g.compressedContent=b.compress(e.transformTo(b.compressInputType,d),c)),g.compressedSize=g.compressedContent.length,g.compressionMethod=b.magic,g},A=function(a,b){var c=a;return a||(c=b?16893:33204),(65535&c)<<16},B=function(a,b){return 63&(a||0)},C=function(a,b,c,d,h,i){var j,k,l,n,o=(c.compressedContent,i!==m.utf8encode),p=e.transformTo(\"string\",i(b.name)),q=e.transformTo(\"string\",m.utf8encode(b.name)),r=b.comment||\"\",s=e.transformTo(\"string\",i(r)),u=e.transformTo(\"string\",m.utf8encode(r)),v=q.length!==b.name.length,w=u.length!==r.length,x=b.options,y=\"\",z=\"\",C=\"\";l=b._initialMetadata.dir!==b.dir?b.dir:x.dir,n=b._initialMetadata.date!==b.date?b.date:x.date;var D=0,E=0;l&&(D|=16),\"UNIX\"===h?(E=798,D|=A(b.unixPermissions,l)):(E=20,D|=B(b.dosPermissions,l)),j=n.getHours(),j<<=6,j|=n.getMinutes(),j<<=5,j|=n.getSeconds()/2,k=n.getFullYear()-1980,k<<=4,k|=n.getMonth()+1,k<<=5,k|=n.getDate(),v&&(z=t(1,1)+t(f(p),4)+q,y+=\"up\"+t(z.length,2)+z),w&&(C=t(1,1)+t(this.crc32(s),4)+u,y+=\"uc\"+t(C.length,2)+C);var F=\"\";F+=\"\\n\\0\",F+=o||!v&&!w?\"\\0\\0\":\"\\0\\b\",F+=c.compressionMethod,F+=t(j,2),F+=t(k,2),F+=t(c.crc32,4),F+=t(c.compressedSize,4),F+=t(c.uncompressedSize,4),F+=t(p.length,2),F+=t(y.length,2);var G=g.LOCAL_FILE_HEADER+F+p+y,H=g.CENTRAL_FILE_HEADER+t(E,2)+F+t(s.length,2)+\"\\0\\0\\0\\0\"+t(D,4)+t(d,4)+p+y+s;return{fileRecord:G,dirRecord:H,compressedObject:c}},D={load:function(a,b){throw new Error(\"Load method is not defined. Is the file jszip-load.js included ?\")},filter:function(a){var b,c,d,f,g=[];for(b in this.files)this.files.hasOwnProperty(b)&&(d=this.files[b],f=new s(d.name,d._data,e.extend(d.options)),c=b.slice(this.root.length,b.length),b.slice(0,this.root.length)===this.root&&a(c,f)&&g.push(f));return g},file:function(a,b,c){if(1===arguments.length){if(e.isRegExp(a)){var d=a;return this.filter(function(a,b){return!b.dir&&d.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(e.isRegExp(a))return this.filter(function(b,c){return c.dir&&a.test(b)});var b=this.root+a,c=y.call(this,b),d=this.clone();return d.root=c.name,d},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=e.extend(a||{},{base64:!0,compression:\"STORE\",compressionOptions:null,type:\"base64\",platform:\"DOS\",comment:null,mimeType:\"application/zip\",encodeFileName:m.utf8encode}),e.checkSupport(a.type),\"darwin\"!==a.platform&&\"freebsd\"!==a.platform&&\"linux\"!==a.platform&&\"sunos\"!==a.platform||(a.platform=\"UNIX\"),\"win32\"===a.platform&&(a.platform=\"DOS\");var b,c,d=[],f=0,h=0,k=e.transformTo(\"string\",a.encodeFileName(a.comment||this.comment||\"\"));for(var l in this.files)if(this.files.hasOwnProperty(l)){var p=this.files[l],q=p.options.compression||a.compression.toUpperCase(),r=j[q];if(!r)throw new Error(q+\" is not a valid compression method !\");var s=p.options.compressionOptions||a.compressionOptions||{},u=z.call(this,p,r,s),v=C.call(this,l,p,u,f,a.platform,a.encodeFileName);f+=v.fileRecord.length+u.compressedSize,h+=v.dirRecord.length,d.push(v)}var w=\"\";w=g.CENTRAL_DIRECTORY_END+\"\\0\\0\\0\\0\"+t(d.length,2)+t(d.length,2)+t(h,4)+t(f,4)+t(k.length,2)+k;var x=a.type.toLowerCase();for(b=\"uint8array\"===x||\"arraybuffer\"===x||\"blob\"===x||\"nodebuffer\"===x?new o(f+h+w.length):new n(f+h+w.length),c=0;c<d.length;c++)b.append(d[c].fileRecord),b.append(d[c].compressedObject.compressedContent);for(c=0;c<d.length;c++)b.append(d[c].dirRecord);b.append(w);var y=b.finalize();switch(a.type.toLowerCase()){case\"uint8array\":case\"arraybuffer\":case\"nodebuffer\":return e.transformTo(a.type.toLowerCase(),y);case\"blob\":return e.arrayBuffer2Blob(e.transformTo(\"arraybuffer\",y),a.mimeType);case\"base64\":return a.base64?i.encode(y):y;default:return y}},crc32:function(a,b){return f(a,b)},utf8encode:function(a){return e.transformTo(\"string\",m.utf8encode(a))},utf8decode:function(a){return m.utf8decode(a)}};b.exports=D},{\"./base64\":2,\"./compressedObject\":3,\"./compressions\":4,\"./crc32\":5,\"./defaults\":7,\"./nodeBuffer\":12,\"./signature\":15,\"./stringWriter\":17,\"./support\":18,\"./uint8ArrayWriter\":20,\"./utf8\":21,\"./utils\":22}],15:[function(a,b,c){\"use strict\";c.LOCAL_FILE_HEADER=\"PK\u0003\u0004\",c.CENTRAL_FILE_HEADER=\"PK\u0001\u0002\",c.CENTRAL_DIRECTORY_END=\"PK\u0005\u0006\",c.ZIP64_CENTRAL_DIRECTORY_LOCATOR=\"PK\u0006\u0007\",c.ZIP64_CENTRAL_DIRECTORY_END=\"PK\u0006\u0006\",c.DATA_DESCRIPTOR=\"PK\u0007\\b\"},{}],16:[function(a,b,c){\"use strict\";function d(a,b){this.data=a,b||(this.data=f.string2binary(this.data)),this.length=this.data.length,this.index=0,this.zero=0}var e=a(\"./dataReader\"),f=a(\"./utils\");d.prototype=new e,d.prototype.byteAt=function(a){return this.data.charCodeAt(this.zero+a)},d.prototype.lastIndexOfSignature=function(a){return this.data.lastIndexOf(a)-this.zero},d.prototype.readData=function(a){this.checkOffset(a);var b=this.data.slice(this.zero+this.index,this.zero+this.index+a);return this.index+=a,b},b.exports=d},{\"./dataReader\":6,\"./utils\":22}],17:[function(a,b,c){\"use strict\";var d=a(\"./utils\"),e=function(){this.data=[]};e.prototype={append:function(a){a=d.transformTo(\"string\",a),this.data.push(a)},finalize:function(){return this.data.join(\"\")}},b.exports=e},{\"./utils\":22}],18:[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)},{}],19:[function(a,b,c){\"use strict\";function d(a){a&&(this.data=a,this.length=this.data.length,this.index=0,this.zero=0)}var e=a(\"./arrayReader\");d.prototype=new e,d.prototype.readData=function(a){if(this.checkOffset(a),0===a)return new Uint8Array(0);var b=this.data.subarray(this.zero+this.index,this.zero+this.index+a);return this.index+=a,b},b.exports=d},{\"./arrayReader\":1}],20:[function(a,b,c){\"use strict\";var d=a(\"./utils\"),e=function(a){this.data=new Uint8Array(a),this.index=0};e.prototype={append:function(a){0!==a.length&&(a=d.transformTo(\"uint8array\",a),this.data.set(a,this.index),this.index+=a.length)},finalize:function(){return this.data}},b.exports=e},{\"./utils\":22}],21:[function(a,b,c){\"use strict\";for(var d=a(\"./utils\"),e=a(\"./support\"),f=a(\"./nodeBuffer\"),g=new Array(256),h=0;h<256;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;f<h;f++)c=a.charCodeAt(f),55296===(64512&c)&&f+1<h&&(d=a.charCodeAt(f+1),56320===(64512&d)&&(c=65536+(c-55296<<10)+(d-56320),f++)),i+=c<128?1:c<2048?2:c<65536?3:4;for(b=e.uint8array?new Uint8Array(i):new Array(i),g=0,f=0;g<i;f++)c=a.charCodeAt(f),55296===(64512&c)&&f+1<h&&(d=a.charCodeAt(f+1),56320===(64512&d)&&(c=65536+(c-55296<<10)+(d-56320),f++)),c<128?b[g++]=c:c<2048?(b[g++]=192|c>>>6,b[g++]=128|63&c):c<65536?(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 c<0?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;b<h;)if(e=a[b++],e<128)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&&b<h;)e=e<<6|63&a[b++],f--;f>1?i[c++]=65533:e<65536?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;c<f;){var h=j(a,Math.min(c+g,f));e.uint8array?b.push(k(a.subarray(c,h))):b.push(k(a.slice(c,h))),c=h}return b.join(\"\")}},{\"./nodeBuffer\":12,\"./support\":18,\"./utils\":22}],22:[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(;g<e&&b>1;)try{\"array\"===f||\"nodebuffer\"===f?d.push(String.fromCharCode.apply(null,a.slice(g,Math.min(g+b,e)))):d.push(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,b){c.checkSupport(\"blob\"),b=b||\"application/zip\";try{return new Blob([a],{type:b})}catch(d){try{var e=window.BlobBuilder||window.WebKitBlobBuilder||window.MozBlobBuilder||window.MSBlobBuilder,f=new e;return f.append(a),f.getBlob(b)}catch(d){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\"+(b<16?\"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)},c.extend=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}},{\"./compressions\":4,\"./nodeBuffer\":12,\"./support\":18}],23:[function(a,b,c){\"use strict\";function d(a,b){this.files=[],this.loadOptions=b,a&&this.load(a)}var e=a(\"./stringReader\"),f=a(\"./nodeBufferReader\"),g=a(\"./uint8ArrayReader\"),h=a(\"./arrayReader\"),i=a(\"./utils\"),j=a(\"./signature\"),k=a(\"./zipEntry\"),l=a(\"./support\");a(\"./object\");d.prototype={checkSignature:function(a){var b=this.reader.readString(4);if(b!==a)throw new Error(\"Corrupted zip or bug : unexpected signature (\"+i.pretty(b)+\", expected \"+i.pretty(a)+\")\")},isSignature:function(a,b){var c=this.reader.index;this.reader.setIndex(a);var d=this.reader.readString(4),e=d===b;return this.reader.setIndex(c),e},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);var a=this.reader.readData(this.zipCommentLength),b=l.uint8array?\"uint8array\":\"array\",c=i.transformTo(b,a);this.zipComment=this.loadOptions.decodeFileName(c)},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;e<d;)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(j.LOCAL_FILE_HEADER),b.readLocalPart(this.reader),b.handleUTF8(),b.processAttributes()},readCentralDir:function(){var a;for(this.reader.setIndex(this.centralDirOffset);this.reader.readString(4)===j.CENTRAL_FILE_HEADER;)a=new k({zip64:this.zip64},this.loadOptions),a.readCentralPart(this.reader),this.files.push(a);if(this.centralDirRecords!==this.files.length&&0!==this.centralDirRecords&&0===this.files.length)throw new Error(\"Corrupted zip or bug: expected \"+this.centralDirRecords+\" records in central dir, got \"+this.files.length)},readEndOfCentral:function(){var a=this.reader.lastIndexOfSignature(j.CENTRAL_DIRECTORY_END);if(a<0){var b=!this.isSignature(0,j.LOCAL_FILE_HEADER);throw b?new Error(\"Can't find end of central directory : is this a zip file ? If it is, see http://stuk.github.io/jszip/documentation/howto/read_zip.html\"):new Error(\"Corrupted zip : can't find end of central directory\")}this.reader.setIndex(a);var c=a;if(this.checkSignature(j.CENTRAL_DIRECTORY_END),this.readBlockEndOfCentral(),this.diskNumber===i.MAX_VALUE_16BITS||this.diskWithCentralDirStart===i.MAX_VALUE_16BITS||this.centralDirRecordsOnThisDisk===i.MAX_VALUE_16BITS||this.centralDirRecords===i.MAX_VALUE_16BITS||this.centralDirSize===i.MAX_VALUE_32BITS||this.centralDirOffset===i.MAX_VALUE_32BITS){if(this.zip64=!0,a=this.reader.lastIndexOfSignature(j.ZIP64_CENTRAL_DIRECTORY_LOCATOR),a<0)throw new Error(\"Corrupted zip : can't find the ZIP64 end of central directory locator\");if(this.reader.setIndex(a),this.checkSignature(j.ZIP64_CENTRAL_DIRECTORY_LOCATOR),this.readBlockZip64EndOfCentralLocator(),!this.isSignature(this.relativeOffsetEndOfZip64CentralDir,j.ZIP64_CENTRAL_DIRECTORY_END)&&(this.relativeOffsetEndOfZip64CentralDir=this.reader.lastIndexOfSignature(j.ZIP64_CENTRAL_DIRECTORY_END),this.relativeOffsetEndOfZip64CentralDir<0))throw new Error(\"Corrupted zip : can't find the ZIP64 end of central directory\");this.reader.setIndex(this.relativeOffsetEndOfZip64CentralDir),this.checkSignature(j.ZIP64_CENTRAL_DIRECTORY_END),this.readBlockZip64EndOfCentral()}var d=this.centralDirOffset+this.centralDirSize;this.zip64&&(d+=20,d+=12+this.zip64EndOfCentralSize);var e=c-d;if(e>0)this.isSignature(c,j.CENTRAL_FILE_HEADER)||(this.reader.zero=e);else if(e<0)throw new Error(\"Corrupted zip: missing \"+Math.abs(e)+\" bytes.\")},prepareReader:function(a){var b=i.getTypeOf(a);if(i.checkSupport(b),\"string\"!==b||l.uint8array)if(\"nodebuffer\"===b)this.reader=new f(a);else if(l.uint8array)this.reader=new g(i.transformTo(\"uint8array\",a));else{if(!l.array)throw new Error(\"Unexpected error: unsupported type '\"+b+\"'\");this.reader=new h(i.transformTo(\"array\",a))}else this.reader=new e(a,this.loadOptions.optimizedBinaryString)},load:function(a){this.prepareReader(a),this.readEndOfCentral(),this.readCentralDir(),this.readLocalFiles()}},b.exports=d},{\"./arrayReader\":1,\"./nodeBufferReader\":13,\"./object\":14,\"./signature\":15,\"./stringReader\":16,\"./support\":18,\"./uint8ArrayReader\":19,\"./utils\":22,\"./zipEntry\":24}],24:[function(a,b,c){\"use strict\";function d(a,b){this.options=a,this.loadOptions=b}var e=a(\"./stringReader\"),f=a(\"./utils\"),g=a(\"./compressedObject\"),h=a(\"./object\"),i=a(\"./support\"),j=0,k=3;d.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,e){return function(){var a=f.transformTo(d.uncompressInputType,this.getCompressedContent()),b=d.uncompress(a);if(b.length!==e)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.readData(this.fileNameLength),a.skip(c),this.compressedSize==-1||this.uncompressedSize==-1)throw new Error(\"Bug or corrupted zip : didn't get enough informations from the central directory (compressedSize == -1 || uncompressedSize == -1)\");if(b=f.findCompression(this.compressionMethod),null===b)throw new Error(\"Corrupted zip : compression \"+f.pretty(this.compressionMethod)+\" unknown (inner file : \"+f.transformTo(\"string\",this.fileName)+\")\");if(this.decompressed=new g,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=f.transformTo(\"string\",this.decompressed.getContent()),h.crc32(this.decompressed)!==this.crc32))throw new Error(\"Corrupted zip : CRC32 mismatch\");\n},readCentralPart:function(a){if(this.versionMadeBy=a.readInt(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.readData(this.fileNameLength),this.readExtraFields(a),this.parseZIP64ExtraField(a),this.fileComment=a.readData(this.fileCommentLength)},processAttributes:function(){this.unixPermissions=null,this.dosPermissions=null;var a=this.versionMadeBy>>8;this.dir=!!(16&this.externalFileAttributes),a===j&&(this.dosPermissions=63&this.externalFileAttributes),a===k&&(this.unixPermissions=this.externalFileAttributes>>16&65535),this.dir||\"/\"!==this.fileNameStr.slice(-1)||(this.dir=!0)},parseZIP64ExtraField:function(a){if(this.extraFields[1]){var b=new e(this.extraFields[1].value);this.uncompressedSize===f.MAX_VALUE_32BITS&&(this.uncompressedSize=b.readInt(8)),this.compressedSize===f.MAX_VALUE_32BITS&&(this.compressedSize=b.readInt(8)),this.localHeaderOffset===f.MAX_VALUE_32BITS&&(this.localHeaderOffset=b.readInt(8)),this.diskNumberStart===f.MAX_VALUE_32BITS&&(this.diskNumberStart=b.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(){var a=i.uint8array?\"uint8array\":\"array\";if(this.useUTF8())this.fileNameStr=h.utf8decode(this.fileName),this.fileCommentStr=h.utf8decode(this.fileComment);else{var b=this.findExtraFieldUnicodePath();if(null!==b)this.fileNameStr=b;else{var c=f.transformTo(a,this.fileName);this.fileNameStr=this.loadOptions.decodeFileName(c)}var d=this.findExtraFieldUnicodeComment();if(null!==d)this.fileCommentStr=d;else{var e=f.transformTo(a,this.fileComment);this.fileCommentStr=this.loadOptions.decodeFileName(e)}}},findExtraFieldUnicodePath:function(){var a=this.extraFields[28789];if(a){var b=new e(a.value);return 1!==b.readInt(1)?null:h.crc32(this.fileName)!==b.readInt(4)?null:h.utf8decode(b.readString(a.length-5))}return null},findExtraFieldUnicodeComment:function(){var a=this.extraFields[25461];if(a){var b=new e(a.value);return 1!==b.readInt(1)?null:h.crc32(this.fileComment)!==b.readInt(4)?null:h.utf8decode(b.readString(a.length-5))}return null}},b.exports=d},{\"./compressedObject\":3,\"./object\":14,\"./stringReader\":16,\"./support\":18,\"./utils\":22}],25:[function(a,b,c){\"use strict\";var d=a(\"./lib/utils/common\").assign,e=a(\"./lib/deflate\"),f=a(\"./lib/inflate\"),g=a(\"./lib/zlib/constants\"),h={};d(h,e,f,g),b.exports=h},{\"./lib/deflate\":26,\"./lib/inflate\":27,\"./lib/utils/common\":28,\"./lib/zlib/constants\":31}],26:[function(a,b,c){\"use strict\";function d(a){if(!(this instanceof d))return new d(a);this.options=i.assign({level:s,method:u,chunkSize:16384,windowBits:15,memLevel:8,strategy:t,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 l,this.strm.avail_out=0;var c=h.deflateInit2(this.strm,b.level,b.method,b.windowBits,b.memLevel,b.strategy);if(c!==p)throw new Error(k[c]);if(b.header&&h.deflateSetHeader(this.strm,b.header),b.dictionary){var e;if(e=\"string\"==typeof b.dictionary?j.string2buf(b.dictionary):\"[object ArrayBuffer]\"===m.call(b.dictionary)?new Uint8Array(b.dictionary):b.dictionary,c=h.deflateSetDictionary(this.strm,e),c!==p)throw new Error(k[c]);this._dict_set=!0}}function e(a,b){var c=new d(b);if(c.push(a,!0),c.err)throw c.msg;return c.result}function f(a,b){return b=b||{},b.raw=!0,e(a,b)}function g(a,b){return b=b||{},b.gzip=!0,e(a,b)}var h=a(\"./zlib/deflate\"),i=a(\"./utils/common\"),j=a(\"./utils/strings\"),k=a(\"./zlib/messages\"),l=a(\"./zlib/zstream\"),m=Object.prototype.toString,n=0,o=4,p=0,q=1,r=2,s=-1,t=0,u=8;d.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?o:n,\"string\"==typeof a?e.input=j.string2buf(a):\"[object ArrayBuffer]\"===m.call(a)?e.input=new Uint8Array(a):e.input=a,e.next_in=0,e.avail_in=e.input.length;do{if(0===e.avail_out&&(e.output=new i.Buf8(f),e.next_out=0,e.avail_out=f),c=h.deflate(e,d),c!==q&&c!==p)return this.onEnd(c),this.ended=!0,!1;0!==e.avail_out&&(0!==e.avail_in||d!==o&&d!==r)||(\"string\"===this.options.to?this.onData(j.buf2binstring(i.shrinkBuf(e.output,e.next_out))):this.onData(i.shrinkBuf(e.output,e.next_out)))}while((e.avail_in>0||0===e.avail_out)&&c!==q);return d===o?(c=h.deflateEnd(this.strm),this.onEnd(c),this.ended=!0,c===p):d!==r||(this.onEnd(p),e.avail_out=0,!0)},d.prototype.onData=function(a){this.chunks.push(a)},d.prototype.onEnd=function(a){a===p&&(\"string\"===this.options.to?this.result=this.chunks.join(\"\"):this.result=i.flattenChunks(this.chunks)),this.chunks=[],this.err=a,this.msg=this.strm.msg},c.Deflate=d,c.deflate=e,c.deflateRaw=f,c.gzip=g},{\"./utils/common\":28,\"./utils/strings\":29,\"./zlib/deflate\":33,\"./zlib/messages\":38,\"./zlib/zstream\":40}],27:[function(a,b,c){\"use strict\";function d(a){if(!(this instanceof d))return new d(a);this.options=h.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 l,this.strm.avail_out=0;var c=g.inflateInit2(this.strm,b.windowBits);if(c!==j.Z_OK)throw new Error(k[c]);this.header=new m,g.inflateGetHeader(this.strm,this.header)}function e(a,b){var c=new d(b);if(c.push(a,!0),c.err)throw c.msg;return c.result}function f(a,b){return b=b||{},b.raw=!0,e(a,b)}var g=a(\"./zlib/inflate\"),h=a(\"./utils/common\"),i=a(\"./utils/strings\"),j=a(\"./zlib/constants\"),k=a(\"./zlib/messages\"),l=a(\"./zlib/zstream\"),m=a(\"./zlib/gzheader\"),n=Object.prototype.toString;d.prototype.push=function(a,b){var c,d,e,f,k,l,m=this.strm,o=this.options.chunkSize,p=this.options.dictionary,q=!1;if(this.ended)return!1;d=b===~~b?b:b===!0?j.Z_FINISH:j.Z_NO_FLUSH,\"string\"==typeof a?m.input=i.binstring2buf(a):\"[object ArrayBuffer]\"===n.call(a)?m.input=new Uint8Array(a):m.input=a,m.next_in=0,m.avail_in=m.input.length;do{if(0===m.avail_out&&(m.output=new h.Buf8(o),m.next_out=0,m.avail_out=o),c=g.inflate(m,j.Z_NO_FLUSH),c===j.Z_NEED_DICT&&p&&(l=\"string\"==typeof p?i.string2buf(p):\"[object ArrayBuffer]\"===n.call(p)?new Uint8Array(p):p,c=g.inflateSetDictionary(this.strm,l)),c===j.Z_BUF_ERROR&&q===!0&&(c=j.Z_OK,q=!1),c!==j.Z_STREAM_END&&c!==j.Z_OK)return this.onEnd(c),this.ended=!0,!1;m.next_out&&(0!==m.avail_out&&c!==j.Z_STREAM_END&&(0!==m.avail_in||d!==j.Z_FINISH&&d!==j.Z_SYNC_FLUSH)||(\"string\"===this.options.to?(e=i.utf8border(m.output,m.next_out),f=m.next_out-e,k=i.buf2string(m.output,e),m.next_out=f,m.avail_out=o-f,f&&h.arraySet(m.output,m.output,e,f,0),this.onData(k)):this.onData(h.shrinkBuf(m.output,m.next_out)))),0===m.avail_in&&0===m.avail_out&&(q=!0)}while((m.avail_in>0||0===m.avail_out)&&c!==j.Z_STREAM_END);return c===j.Z_STREAM_END&&(d=j.Z_FINISH),d===j.Z_FINISH?(c=g.inflateEnd(this.strm),this.onEnd(c),this.ended=!0,c===j.Z_OK):d!==j.Z_SYNC_FLUSH||(this.onEnd(j.Z_OK),m.avail_out=0,!0)},d.prototype.onData=function(a){this.chunks.push(a)},d.prototype.onEnd=function(a){a===j.Z_OK&&(\"string\"===this.options.to?this.result=this.chunks.join(\"\"):this.result=h.flattenChunks(this.chunks)),this.chunks=[],this.err=a,this.msg=this.strm.msg},c.Inflate=d,c.inflate=e,c.inflateRaw=f,c.ungzip=e},{\"./utils/common\":28,\"./utils/strings\":29,\"./zlib/constants\":31,\"./zlib/gzheader\":34,\"./zlib/inflate\":36,\"./zlib/messages\":38,\"./zlib/zstream\":40}],28:[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;f<d;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;b<c;b++)d+=a[b].length;for(g=new Uint8Array(d),e=0,b=0,c=a.length;b<c;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;f<d;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)},{}],29:[function(a,b,c){\"use strict\";function d(a,b){if(b<65537&&(a.subarray&&g||!a.subarray&&f))return String.fromCharCode.apply(null,e.shrinkBuf(a,b));for(var c=\"\",d=0;d<b;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;j<256;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;f<h;f++)c=a.charCodeAt(f),55296===(64512&c)&&f+1<h&&(d=a.charCodeAt(f+1),56320===(64512&d)&&(c=65536+(c-55296<<10)+(d-56320),f++)),i+=c<128?1:c<2048?2:c<65536?3:4;for(b=new e.Buf8(i),g=0,f=0;g<i;f++)c=a.charCodeAt(f),55296===(64512&c)&&f+1<h&&(d=a.charCodeAt(f+1),56320===(64512&d)&&(c=65536+(c-55296<<10)+(d-56320),f++)),c<128?b[g++]=c:c<2048?(b[g++]=192|c>>>6,b[g++]=128|63&c):c<65536?(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;c<d;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;c<h;)if(f=a[c++],f<128)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&&c<h;)f=f<<6|63&a[c++],g--;g>1?j[e++]=65533:f<65536?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 c<0?b:0===c?b:c+i[a[c]]>b?c:b}},{\"./common\":28}],30:[function(a,b,c){\"use strict\";function d(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=d},{}],31:[function(a,b,c){\"use strict\";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}},{}],32:[function(a,b,c){\"use strict\";function d(){for(var a,b=[],c=0;c<256;c++){a=c;for(var d=0;d<8;d++)a=1&a?3988292384^a>>>1:a>>>1;b[c]=a}return b}function e(a,b,c,d){var e=f,g=d+c;a^=-1;for(var h=d;h<g;h++)a=a>>>8^e[255&(a^b[h])];return a^-1}var f=d();b.exports=e},{}],33:[function(a,b,c){\"use strict\";function d(a,b){return a.msg=I[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&&(E.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){F._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,E.arraySet(b,a.input,a.next_in,e,c),1===a.state.wrap?a.adler=G(a.adler,b,e,c):2===a.state.wrap&&(a.adler=H(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-la?a.strstart-(a.w_size-la):0,j=a.window,k=a.w_mask,l=a.prev,m=a.strstart+ka,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]&&f<m);if(d=ka-(m-f),f=m-ka,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-la)){E.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>=ja)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+ja-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<ja)););}while(a.lookahead<la&&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===J)return ua;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 ua;if(a.strstart-a.block_start>=a.w_size-la&&(h(a,!1),0===a.strm.avail_out))return ua}return a.insert=0,b===M?(h(a,!0),0===a.strm.avail_out?wa:xa):a.strstart>a.block_start&&(h(a,!1),0===a.strm.avail_out)?ua:ua}function o(a,b){for(var c,d;;){if(a.lookahead<la){if(m(a),a.lookahead<la&&b===J)return ua;if(0===a.lookahead)break}if(c=0,a.lookahead>=ja&&(a.ins_h=(a.ins_h<<a.hash_shift^a.window[a.strstart+ja-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-la&&(a.match_length=l(a,c)),a.match_length>=ja)if(d=F._tr_tally(a,a.strstart-a.match_start,a.match_length-ja),a.lookahead-=a.match_length,a.match_length<=a.max_lazy_match&&a.lookahead>=ja){a.match_length--;do a.strstart++,a.ins_h=(a.ins_h<<a.hash_shift^a.window[a.strstart+ja-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=F._tr_tally(a,0,a.window[a.strstart]),a.lookahead--,a.strstart++;if(d&&(h(a,!1),0===a.strm.avail_out))return ua}return a.insert=a.strstart<ja-1?a.strstart:ja-1,b===M?(h(a,!0),0===a.strm.avail_out?wa:xa):a.last_lit&&(h(a,!1),0===a.strm.avail_out)?ua:va}function p(a,b){for(var c,d,e;;){if(a.lookahead<la){if(m(a),a.lookahead<la&&b===J)return ua;if(0===a.lookahead)break}if(c=0,a.lookahead>=ja&&(a.ins_h=(a.ins_h<<a.hash_shift^a.window[a.strstart+ja-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=ja-1,0!==c&&a.prev_length<a.max_lazy_match&&a.strstart-c<=a.w_size-la&&(a.match_length=l(a,c),a.match_length<=5&&(a.strategy===U||a.match_length===ja&&a.strstart-a.match_start>4096)&&(a.match_length=ja-1)),a.prev_length>=ja&&a.match_length<=a.prev_length){e=a.strstart+a.lookahead-ja,d=F._tr_tally(a,a.strstart-1-a.prev_match,a.prev_length-ja),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+ja-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=ja-1,a.strstart++,d&&(h(a,!1),0===a.strm.avail_out))return ua}else if(a.match_available){if(d=F._tr_tally(a,0,a.window[a.strstart-1]),d&&h(a,!1),a.strstart++,a.lookahead--,0===a.strm.avail_out)return ua}else a.match_available=1,a.strstart++,a.lookahead--}return a.match_available&&(d=F._tr_tally(a,0,a.window[a.strstart-1]),a.match_available=0),a.insert=a.strstart<ja-1?a.strstart:ja-1,b===M?(h(a,!0),0===a.strm.avail_out?wa:xa):a.last_lit&&(h(a,!1),0===a.strm.avail_out)?ua:va}function q(a,b){for(var c,d,e,f,g=a.window;;){if(a.lookahead<=ka){if(m(a),a.lookahead<=ka&&b===J)return ua;if(0===a.lookahead)break}if(a.match_length=0,a.lookahead>=ja&&a.strstart>0&&(e=a.strstart-1,d=g[e],d===g[++e]&&d===g[++e]&&d===g[++e])){f=a.strstart+ka;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]&&e<f);a.match_length=ka-(f-e),a.match_length>a.lookahead&&(a.match_length=a.lookahead)}if(a.match_length>=ja?(c=F._tr_tally(a,1,a.match_length-ja),a.lookahead-=a.match_length,a.strstart+=a.match_length,a.match_length=0):(c=F._tr_tally(a,0,a.window[a.strstart]),a.lookahead--,a.strstart++),c&&(h(a,!1),0===a.strm.avail_out))return ua}return a.insert=0,b===M?(h(a,!0),0===a.strm.avail_out?wa:xa):a.last_lit&&(h(a,!1),0===a.strm.avail_out)?ua:va}function r(a,b){for(var c;;){if(0===a.lookahead&&(m(a),0===a.lookahead)){if(b===J)return ua;break}if(a.match_length=0,c=F._tr_tally(a,0,a.window[a.strstart]),a.lookahead--,a.strstart++,c&&(h(a,!1),0===a.strm.avail_out))return ua}return a.insert=0,b===M?(h(a,!0),0===a.strm.avail_out?wa:xa):a.last_lit&&(h(a,!1),0===a.strm.avail_out)?ua:va}function s(a,b,c,d,e){this.good_length=a,this.max_lazy=b,this.nice_length=c,this.max_chain=d,this.func=e}function t(a){a.window_size=2*a.w_size,f(a.head),a.max_lazy_match=D[a.level].max_lazy,a.good_match=D[a.level].good_length,a.nice_match=D[a.level].nice_length,a.max_chain_length=D[a.level].max_chain,a.strstart=0,a.block_start=0,a.lookahead=0,a.insert=0,a.match_length=a.prev_length=ja-1,a.match_available=0,a.ins_h=0}function u(){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=$,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 E.Buf16(2*ha),this.dyn_dtree=new E.Buf16(2*(2*fa+1)),this.bl_tree=new E.Buf16(2*(2*ga+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 E.Buf16(ia+1),this.heap=new E.Buf16(2*ea+1),f(this.heap),this.heap_len=0,this.heap_max=0,this.depth=new E.Buf16(2*ea+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 v(a){var b;return a&&a.state?(a.total_in=a.total_out=0,a.data_type=Z,b=a.state,b.pending=0,b.pending_out=0,b.wrap<0&&(b.wrap=-b.wrap),b.status=b.wrap?na:sa,a.adler=2===b.wrap?0:1,b.last_flush=J,F._tr_init(b),O):d(a,Q)}function w(a){var b=v(a);return b===O&&t(a.state),b}function x(a,b){return a&&a.state?2!==a.state.wrap?Q:(a.state.gzhead=b,O):Q}function y(a,b,c,e,f,g){if(!a)return Q;var h=1;if(b===T&&(b=6),e<0?(h=0,e=-e):e>15&&(h=2,e-=16),f<1||f>_||c!==$||e<8||e>15||b<0||b>9||g<0||g>X)return d(a,Q);8===e&&(e=9);var i=new u;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+ja-1)/ja),i.window=new E.Buf8(2*i.w_size),i.head=new E.Buf16(i.hash_size),i.prev=new E.Buf16(i.w_size),i.lit_bufsize=1<<f+6,i.pending_buf_size=4*i.lit_bufsize,i.pending_buf=new E.Buf8(i.pending_buf_size),i.d_buf=1*i.lit_bufsize,i.l_buf=3*i.lit_bufsize,i.level=b,i.strategy=g,i.method=c,w(a)}function z(a,b){return y(a,b,$,aa,ba,Y)}function A(a,b){var c,h,k,l;if(!a||!a.state||b>N||b<0)return a?d(a,Q):Q;if(h=a.state,!a.output||!a.input&&0!==a.avail_in||h.status===ta&&b!==M)return d(a,0===a.avail_out?S:Q);if(h.strm=a,c=h.last_flush,h.last_flush=b,h.status===na)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>=V||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=H(a.adler,h.pending_buf,h.pending,0)),h.gzindex=0,h.status=oa):(i(h,0),i(h,0),i(h,0),i(h,0),i(h,0),i(h,9===h.level?2:h.strategy>=V||h.level<2?4:0),i(h,ya),h.status=sa);else{var m=$+(h.w_bits-8<<4)<<8,n=-1;n=h.strategy>=V||h.level<2?0:h.level<6?1:6===h.level?2:3,m|=n<<6,0!==h.strstart&&(m|=ma),m+=31-m%31,h.status=sa,j(h,m),0!==h.strstart&&(j(h,a.adler>>>16),j(h,65535&a.adler)),a.adler=1}if(h.status===oa)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=H(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=H(a.adler,h.pending_buf,h.pending-k,k)),h.gzindex===h.gzhead.extra.length&&(h.gzindex=0,h.status=pa)}else h.status=pa;if(h.status===pa)if(h.gzhead.name){k=h.pending;do{if(h.pending===h.pending_buf_size&&(h.gzhead.hcrc&&h.pending>k&&(a.adler=H(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=H(a.adler,h.pending_buf,h.pending-k,k)),0===l&&(h.gzindex=0,h.status=qa)}else h.status=qa;if(h.status===qa)if(h.gzhead.comment){k=h.pending;do{if(h.pending===h.pending_buf_size&&(h.gzhead.hcrc&&h.pending>k&&(a.adler=H(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=H(a.adler,h.pending_buf,h.pending-k,k)),0===l&&(h.status=ra)}else h.status=ra;if(h.status===ra&&(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=sa)):h.status=sa),0!==h.pending){if(g(a),0===a.avail_out)return h.last_flush=-1,O}else if(0===a.avail_in&&e(b)<=e(c)&&b!==M)return d(a,S);if(h.status===ta&&0!==a.avail_in)return d(a,S);if(0!==a.avail_in||0!==h.lookahead||b!==J&&h.status!==ta){var o=h.strategy===V?r(h,b):h.strategy===W?q(h,b):D[h.level].func(h,b);if(o!==wa&&o!==xa||(h.status=ta),o===ua||o===wa)return 0===a.avail_out&&(h.last_flush=-1),O;if(o===va&&(b===K?F._tr_align(h):b!==N&&(F._tr_stored_block(h,0,0,!1),b===L&&(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,O}return b!==M?O:h.wrap<=0?P:(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?O:P)}function B(a){var b;return a&&a.state?(b=a.state.status,b!==na&&b!==oa&&b!==pa&&b!==qa&&b!==ra&&b!==sa&&b!==ta?d(a,Q):(a.state=null,b===sa?d(a,R):O)):Q}function C(a,b){var c,d,e,g,h,i,j,k,l=b.length;if(!a||!a.state)return Q;if(c=a.state,g=c.wrap,2===g||1===g&&c.status!==na||c.lookahead)return Q;for(1===g&&(a.adler=G(a.adler,b,l,0)),c.wrap=0,l>=c.w_size&&(0===g&&(f(c.head),c.strstart=0,c.block_start=0,c.insert=0),k=new E.Buf8(c.w_size),E.arraySet(k,b,l-c.w_size,c.w_size,0),b=k,l=c.w_size),h=a.avail_in,i=a.next_in,j=a.input,a.avail_in=l,a.next_in=0,a.input=b,m(c);c.lookahead>=ja;){d=c.strstart,e=c.lookahead-(ja-1);do c.ins_h=(c.ins_h<<c.hash_shift^c.window[d+ja-1])&c.hash_mask,c.prev[d&c.w_mask]=c.head[c.ins_h],c.head[c.ins_h]=d,d++;while(--e);c.strstart=d,c.lookahead=ja-1,m(c)}return c.strstart+=c.lookahead,c.block_start=c.strstart,c.insert=c.lookahead,c.lookahead=0,c.match_length=c.prev_length=ja-1,c.match_available=0,a.next_in=i,a.input=j,a.avail_in=h,c.wrap=g,O}var D,E=a(\"../utils/common\"),F=a(\"./trees\"),G=a(\"./adler32\"),H=a(\"./crc32\"),I=a(\"./messages\"),J=0,K=1,L=3,M=4,N=5,O=0,P=1,Q=-2,R=-3,S=-5,T=-1,U=1,V=2,W=3,X=4,Y=0,Z=2,$=8,_=9,aa=15,ba=8,ca=29,da=256,ea=da+1+ca,fa=30,ga=19,ha=2*ea+1,ia=15,ja=3,ka=258,la=ka+ja+1,ma=32,na=42,oa=69,pa=73,qa=91,ra=103,sa=113,ta=666,ua=1,va=2,wa=3,xa=4,ya=3;D=[new s(0,0,0,0,n),new s(4,4,8,4,o),new s(4,5,16,8,o),new s(4,6,32,32,o),new s(4,4,16,16,p),new s(8,16,32,32,p),new s(8,16,128,128,p),new s(8,32,128,256,p),new s(32,128,258,1024,p),new s(32,258,258,4096,p)],c.deflateInit=z,c.deflateInit2=y,c.deflateReset=w,c.deflateResetKeep=v,c.deflateSetHeader=x,c.deflate=A,c.deflateEnd=B,c.deflateSetDictionary=C,c.deflateInfo=\"pako deflate (from Nodeca project)\"},{\"../utils/common\":28,\"./adler32\":30,\"./crc32\":32,\"./messages\":38,\"./trees\":39}],34:[function(a,b,c){\"use strict\";function d(){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=d},{}],35:[function(a,b,c){\"use strict\";var d=30,e=12;b.exports=function(a,b){var c,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C;c=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=c.dmax,l=c.wsize,m=c.whave,n=c.wnext,o=c.window,p=c.hold,q=c.bits,r=c.lencode,s=c.distcode,t=(1<<c.lenbits)-1,u=(1<<c.distbits)-1;a:do{q<15&&(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){c.mode=e;break a}a.msg=\"invalid literal/length code\",c.mode=d;break a}x=65535&v,w&=15,w&&(q<w&&(p+=B[f++]<<q,q+=8),x+=p&(1<<w)-1,p>>>=w,q-=w),q<15&&(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\",c.mode=d;break a}if(y=65535&v,w&=15,q<w&&(p+=B[f++]<<q,q+=8,q<w&&(p+=B[f++]<<q,q+=8)),y+=p&(1<<w)-1,y>k){a.msg=\"invalid distance too far back\",c.mode=d;break a}if(p>>>=w,q-=w,w=h-i,y>w){if(w=y-w,w>m&&c.sane){a.msg=\"invalid distance too far back\",c.mode=d;break a}if(z=0,A=o,0===n){if(z+=l-w,w<x){x-=w;do C[h++]=o[z++];while(--w);z=h-y,A=C}}else if(n<w){if(z+=l+n-w,w-=n,w<x){x-=w;do C[h++]=o[z++];while(--w);if(z=0,n<x){w=n,x-=w;do C[h++]=o[z++];while(--w);z=h-y,A=C}}}else if(z+=n-w,w<x){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(f<g&&h<j);x=q>>3,f-=x,q-=x<<3,p&=(1<<q)-1,a.next_in=f,a.next_out=h,a.avail_in=f<g?5+(g-f):5-(f-g),a.avail_out=h<j?257+(j-h):257-(h-j),c.hold=p,c.bits=q}},{}],36:[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 s.Buf16(320),this.work=new s.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=L,b.last=0,b.havedict=0,b.dmax=32768,b.head=null,b.hold=0,b.bits=0,b.lencode=b.lendyn=new s.Buf32(pa),b.distcode=b.distdyn=new s.Buf32(qa),b.sane=1,b.back=-1,D):G}function g(a){var b;return a&&a.state?(b=a.state,b.wsize=0,b.whave=0,b.wnext=0,f(a)):G}function h(a,b){var c,d;return a&&a.state?(d=a.state,b<0?(c=0,b=-b):(c=(b>>4)+1,b<48&&(b&=15)),b&&(b<8||b>15)?G:(null!==d.window&&d.wbits!==b&&(d.window=null),d.wrap=c,d.wbits=b,g(a))):G}function i(a,b){var c,d;return a?(d=new e,a.state=d,d.window=null,c=h(a,b),c!==D&&(a.state=null),c):G}function j(a){return i(a,sa)}function k(a){if(ta){var b;for(q=new s.Buf32(512),r=new s.Buf32(32),b=0;b<144;)a.lens[b++]=8;for(;b<256;)a.lens[b++]=9;for(;b<280;)a.lens[b++]=7;for(;b<288;)a.lens[b++]=8;for(w(y,a.lens,0,288,q,0,a.work,{bits:9}),b=0;b<32;)a.lens[b++]=5;w(z,a.lens,0,32,r,0,a.work,{bits:5}),ta=!1}a.lencode=q,a.lenbits=9,a.distcode=r,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 s.Buf8(f.wsize)),d>=f.wsize?(s.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),s.arraySet(f.window,b,c-d,e,f.wnext),d-=e,d?(s.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,r,pa,qa,ra,sa,ta,ua,va,wa,xa,ya,za,Aa=0,Ba=new s.Buf8(4),Ca=[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 G;c=a.state,c.mode===W&&(c.mode=X),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,xa=D;a:for(;;)switch(c.mode){case L:if(0===c.wrap){c.mode=X;break}for(;n<16;){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}if(2&c.wrap&&35615===m){c.check=0,Ba[0]=255&m,Ba[1]=m>>>8&255,c.check=u(c.check,Ba,2,0),m=0,n=0,c.mode=M;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=ma;break}if((15&m)!==K){a.msg=\"unknown compression method\",c.mode=ma;break}if(m>>>=4,n-=4,wa=(15&m)+8,0===c.wbits)c.wbits=wa;else if(wa>c.wbits){a.msg=\"invalid window size\",c.mode=ma;break}c.dmax=1<<wa,a.adler=c.check=1,c.mode=512&m?U:W,m=0,n=0;break;case M:for(;n<16;){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}if(c.flags=m,(255&c.flags)!==K){a.msg=\"unknown compression method\",c.mode=ma;break}if(57344&c.flags){a.msg=\"unknown header flags set\",c.mode=ma;break}c.head&&(c.head.text=m>>8&1),512&c.flags&&(Ba[0]=255&m,Ba[1]=m>>>8&255,c.check=u(c.check,Ba,2,0)),m=0,n=0,c.mode=N;case N:for(;n<32;){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}c.head&&(c.head.time=m),512&c.flags&&(Ba[0]=255&m,Ba[1]=m>>>8&255,Ba[2]=m>>>16&255,Ba[3]=m>>>24&255,c.check=u(c.check,Ba,4,0)),m=0,n=0,c.mode=O;case O:for(;n<16;){if(0===i)break a;i--,m+=e[g++]<<n,\nn+=8}c.head&&(c.head.xflags=255&m,c.head.os=m>>8),512&c.flags&&(Ba[0]=255&m,Ba[1]=m>>>8&255,c.check=u(c.check,Ba,2,0)),m=0,n=0,c.mode=P;case P:if(1024&c.flags){for(;n<16;){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&&(Ba[0]=255&m,Ba[1]=m>>>8&255,c.check=u(c.check,Ba,2,0)),m=0,n=0}else c.head&&(c.head.extra=null);c.mode=Q;case Q:if(1024&c.flags&&(q=c.length,q>i&&(q=i),q&&(c.head&&(wa=c.head.extra_len-c.length,c.head.extra||(c.head.extra=new Array(c.head.extra_len)),s.arraySet(c.head.extra,e,g,q,wa)),512&c.flags&&(c.check=u(c.check,e,q,g)),i-=q,g+=q,c.length-=q),c.length))break a;c.length=0,c.mode=R;case R:if(2048&c.flags){if(0===i)break a;q=0;do wa=e[g+q++],c.head&&wa&&c.length<65536&&(c.head.name+=String.fromCharCode(wa));while(wa&&q<i);if(512&c.flags&&(c.check=u(c.check,e,q,g)),i-=q,g+=q,wa)break a}else c.head&&(c.head.name=null);c.length=0,c.mode=S;case S:if(4096&c.flags){if(0===i)break a;q=0;do wa=e[g+q++],c.head&&wa&&c.length<65536&&(c.head.comment+=String.fromCharCode(wa));while(wa&&q<i);if(512&c.flags&&(c.check=u(c.check,e,q,g)),i-=q,g+=q,wa)break a}else c.head&&(c.head.comment=null);c.mode=T;case T:if(512&c.flags){for(;n<16;){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}if(m!==(65535&c.check)){a.msg=\"header crc mismatch\",c.mode=ma;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=W;break;case U:for(;n<32;){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}a.adler=c.check=d(m),m=0,n=0,c.mode=V;case V: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,F;a.adler=c.check=1,c.mode=W;case W:if(b===B||b===C)break a;case X:if(c.last){m>>>=7&n,n-=7&n,c.mode=ja;break}for(;n<3;){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=Y;break;case 1:if(k(c),c.mode=ca,b===C){m>>>=2,n-=2;break a}break;case 2:c.mode=_;break;case 3:a.msg=\"invalid block type\",c.mode=ma}m>>>=2,n-=2;break;case Y:for(m>>>=7&n,n-=7&n;n<32;){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=ma;break}if(c.length=65535&m,m=0,n=0,c.mode=Z,b===C)break a;case Z:c.mode=$;case $:if(q=c.length){if(q>i&&(q=i),q>j&&(q=j),0===q)break a;s.arraySet(f,e,g,q,h),i-=q,g+=q,j-=q,h+=q,c.length-=q;break}c.mode=W;break;case _:for(;n<14;){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=ma;break}c.have=0,c.mode=aa;case aa:for(;c.have<c.ncode;){for(;n<3;){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}c.lens[Ca[c.have++]]=7&m,m>>>=3,n-=3}for(;c.have<19;)c.lens[Ca[c.have++]]=0;if(c.lencode=c.lendyn,c.lenbits=7,ya={bits:c.lenbits},xa=w(x,c.lens,0,19,c.lencode,0,c.work,ya),c.lenbits=ya.bits,xa){a.msg=\"invalid code lengths set\",c.mode=ma;break}c.have=0,c.mode=ba;case ba:for(;c.have<c.nlen+c.ndist;){for(;Aa=c.lencode[m&(1<<c.lenbits)-1],qa=Aa>>>24,ra=Aa>>>16&255,sa=65535&Aa,!(qa<=n);){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}if(sa<16)m>>>=qa,n-=qa,c.lens[c.have++]=sa;else{if(16===sa){for(za=qa+2;n<za;){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}if(m>>>=qa,n-=qa,0===c.have){a.msg=\"invalid bit length repeat\",c.mode=ma;break}wa=c.lens[c.have-1],q=3+(3&m),m>>>=2,n-=2}else if(17===sa){for(za=qa+3;n<za;){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}m>>>=qa,n-=qa,wa=0,q=3+(7&m),m>>>=3,n-=3}else{for(za=qa+7;n<za;){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}m>>>=qa,n-=qa,wa=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=ma;break}for(;q--;)c.lens[c.have++]=wa}}if(c.mode===ma)break;if(0===c.lens[256]){a.msg=\"invalid code -- missing end-of-block\",c.mode=ma;break}if(c.lenbits=9,ya={bits:c.lenbits},xa=w(y,c.lens,0,c.nlen,c.lencode,0,c.work,ya),c.lenbits=ya.bits,xa){a.msg=\"invalid literal/lengths set\",c.mode=ma;break}if(c.distbits=6,c.distcode=c.distdyn,ya={bits:c.distbits},xa=w(z,c.lens,c.nlen,c.ndist,c.distcode,0,c.work,ya),c.distbits=ya.bits,xa){a.msg=\"invalid distances set\",c.mode=ma;break}if(c.mode=ca,b===C)break a;case ca:c.mode=da;case da: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,v(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===W&&(c.back=-1);break}for(c.back=0;Aa=c.lencode[m&(1<<c.lenbits)-1],qa=Aa>>>24,ra=Aa>>>16&255,sa=65535&Aa,!(qa<=n);){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}if(ra&&0===(240&ra)){for(ta=qa,ua=ra,va=sa;Aa=c.lencode[va+((m&(1<<ta+ua)-1)>>ta)],qa=Aa>>>24,ra=Aa>>>16&255,sa=65535&Aa,!(ta+qa<=n);){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}m>>>=ta,n-=ta,c.back+=ta}if(m>>>=qa,n-=qa,c.back+=qa,c.length=sa,0===ra){c.mode=ia;break}if(32&ra){c.back=-1,c.mode=W;break}if(64&ra){a.msg=\"invalid literal/length code\",c.mode=ma;break}c.extra=15&ra,c.mode=ea;case ea:if(c.extra){for(za=c.extra;n<za;){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=fa;case fa:for(;Aa=c.distcode[m&(1<<c.distbits)-1],qa=Aa>>>24,ra=Aa>>>16&255,sa=65535&Aa,!(qa<=n);){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}if(0===(240&ra)){for(ta=qa,ua=ra,va=sa;Aa=c.distcode[va+((m&(1<<ta+ua)-1)>>ta)],qa=Aa>>>24,ra=Aa>>>16&255,sa=65535&Aa,!(ta+qa<=n);){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}m>>>=ta,n-=ta,c.back+=ta}if(m>>>=qa,n-=qa,c.back+=qa,64&ra){a.msg=\"invalid distance code\",c.mode=ma;break}c.offset=sa,c.extra=15&ra,c.mode=ga;case ga:if(c.extra){for(za=c.extra;n<za;){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=ma;break}c.mode=ha;case ha:if(0===j)break a;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=ma;break}q>c.wnext?(q-=c.wnext,r=c.wsize-q):r=c.wnext-q,q>c.length&&(q=c.length),pa=c.window}else pa=f,r=h-c.offset,q=c.length;q>j&&(q=j),j-=q,c.length-=q;do f[h++]=pa[r++];while(--q);0===c.length&&(c.mode=da);break;case ia:if(0===j)break a;f[h++]=c.length,j--,c.mode=da;break;case ja:if(c.wrap){for(;n<32;){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?u(c.check,f,p,h-p):t(c.check,f,p,h-p)),p=j,(c.flags?m:d(m))!==c.check){a.msg=\"incorrect data check\",c.mode=ma;break}m=0,n=0}c.mode=ka;case ka:if(c.wrap&&c.flags){for(;n<32;){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}if(m!==(4294967295&c.total)){a.msg=\"incorrect length check\",c.mode=ma;break}m=0,n=0}c.mode=la;case la:xa=E;break a;case ma:xa=H;break a;case na:return I;case oa:default:return G}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<ma&&(c.mode<ja||b!==A))&&l(a,a.output,a.next_out,p-a.avail_out)?(c.mode=na,I):(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?u(c.check,f,p,a.next_out-p):t(c.check,f,p,a.next_out-p)),a.data_type=c.bits+(c.last?64:0)+(c.mode===W?128:0)+(c.mode===ca||c.mode===Z?256:0),(0===o&&0===p||b===A)&&xa===D&&(xa=J),xa)}function n(a){if(!a||!a.state)return G;var b=a.state;return b.window&&(b.window=null),a.state=null,D}function o(a,b){var c;return a&&a.state?(c=a.state,0===(2&c.wrap)?G:(c.head=b,b.done=!1,D)):G}function p(a,b){var c,d,e,f=b.length;return a&&a.state?(c=a.state,0!==c.wrap&&c.mode!==V?G:c.mode===V&&(d=1,d=t(d,b,f,0),d!==c.check)?H:(e=l(a,b,f,f))?(c.mode=na,I):(c.havedict=1,D)):G}var q,r,s=a(\"../utils/common\"),t=a(\"./adler32\"),u=a(\"./crc32\"),v=a(\"./inffast\"),w=a(\"./inftrees\"),x=0,y=1,z=2,A=4,B=5,C=6,D=0,E=1,F=2,G=-2,H=-3,I=-4,J=-5,K=8,L=1,M=2,N=3,O=4,P=5,Q=6,R=7,S=8,T=9,U=10,V=11,W=12,X=13,Y=14,Z=15,$=16,_=17,aa=18,ba=19,ca=20,da=21,ea=22,fa=23,ga=24,ha=25,ia=26,ja=27,ka=28,la=29,ma=30,na=31,oa=32,pa=852,qa=592,ra=15,sa=ra,ta=!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.inflateSetDictionary=p,c.inflateInfo=\"pako inflate (from Nodeca project)\"},{\"../utils/common\":28,\"./adler32\":30,\"./crc32\":32,\"./inffast\":35,\"./inftrees\":37}],37:[function(a,b,c){\"use strict\";var d=a(\"../utils/common\"),e=15,f=852,g=592,h=0,i=1,j=2,k=[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],l=[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],m=[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],n=[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,c,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 d.Buf16(e+1),Q=new d.Buf16(e+1),R=null,S=0;for(D=0;D<=e;D++)P[D]=0;for(E=0;E<o;E++)P[b[c+E]]++;for(H=C,G=e;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;F<G&&0===P[F];F++);for(H<F&&(H=F),K=1,D=1;D<=e;D++)if(K<<=1,K-=P[D],K<0)return-1;if(K>0&&(a===h||1!==G))return-1;for(Q[1]=0,D=1;D<e;D++)Q[D+1]=Q[D]+P[D];for(E=0;E<o;E++)0!==b[c+E]&&(r[Q[b[c+E]]++]=E);if(a===h?(N=R=r,y=19):a===i?(N=k,O-=257,R=l,S-=257,y=256):(N=m,R=n,y=-1),M=0,E=0,D=F,x=q,I=H,J=0,v=-1,L=1<<H,w=L-1,a===i&&L>f||a===j&&L>g)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[c+r[E]]}if(D>H&&(M&w)!==v){for(0===J&&(J=H),x+=F,I=D-J,K=1<<I;I+J<G&&(K-=P[I+J],!(K<=0));)I++,K<<=1;if(L+=1<<I,a===i&&L>f||a===j&&L>g)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\":28}],38:[function(a,b,c){\"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\"}},{}],39:[function(a,b,c){\"use strict\";function d(a){for(var b=a.length;--b>=0;)a[b]=0}function e(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}function f(a,b){this.dyn_tree=a,this.max_code=0,this.stat_desc=b}function g(a){return a<256?ia[a]:ia[256+(a>>>7)]}function h(a,b){a.pending_buf[a.pending++]=255&b,a.pending_buf[a.pending++]=b>>>8&255}function i(a,b,c){a.bi_valid>X-c?(a.bi_buf|=b<<a.bi_valid&65535,h(a,a.bi_buf),a.bi_buf=b>>X-a.bi_valid,a.bi_valid+=c-X):(a.bi_buf|=b<<a.bi_valid&65535,a.bi_valid+=c)}function j(a,b,c){i(a,c[2*b],c[2*b+1])}function k(a,b){var c=0;do c|=1&a,a>>>=1,c<<=1;while(--b>0);return c>>>1}function l(a){16===a.bi_valid?(h(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 m(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;f<=W;f++)a.bl_count[f]=0;for(i[2*a.heap[a.heap_max]+1]=0,c=a.heap_max+1;c<V;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 n(a,b,c){var d,e,f=new Array(W+1),g=0;for(d=1;d<=W;d++)f[d]=g=g+c[d-1]<<1;for(e=0;e<=b;e++){var h=a[2*e+1];0!==h&&(a[2*e]=k(f[h]++,h))}}function o(){var a,b,c,d,f,g=new Array(W+1);for(c=0,d=0;d<Q-1;d++)for(ka[d]=c,a=0;a<1<<ba[d];a++)ja[c++]=d;for(ja[c-1]=d,f=0,d=0;d<16;d++)for(la[d]=f,a=0;a<1<<ca[d];a++)ia[f++]=d;for(f>>=7;d<T;d++)for(la[d]=f<<7,a=0;a<1<<ca[d]-7;a++)ia[256+f++]=d;for(b=0;b<=W;b++)g[b]=0;for(a=0;a<=143;)ga[2*a+1]=8,a++,g[8]++;for(;a<=255;)ga[2*a+1]=9,a++,g[9]++;for(;a<=279;)ga[2*a+1]=7,a++,g[7]++;for(;a<=287;)ga[2*a+1]=8,a++,g[8]++;for(n(ga,S+1,g),a=0;a<T;a++)ha[2*a+1]=5,ha[2*a]=k(a,5);ma=new e(ga,ba,R+1,S,W),na=new e(ha,ca,0,T,W),oa=new e(new Array(0),da,0,U,Y)}function p(a){var b;for(b=0;b<S;b++)a.dyn_ltree[2*b]=0;for(b=0;b<T;b++)a.dyn_dtree[2*b]=0;for(b=0;b<U;b++)a.bl_tree[2*b]=0;a.dyn_ltree[2*Z]=1,a.opt_len=a.static_len=0,a.last_lit=a.matches=0}function q(a){a.bi_valid>8?h(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 r(a,b,c,d){q(a),d&&(h(a,c),h(a,~c)),G.arraySet(a.pending_buf,a.window,b,c,a.pending),a.pending+=c}function s(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 t(a,b,c){for(var d=a.heap[c],e=c<<1;e<=a.heap_len&&(e<a.heap_len&&s(b,a.heap[e+1],a.heap[e],a.depth)&&e++,!s(b,d,a.heap[e],a.depth));)a.heap[c]=a.heap[e],c=e,e<<=1;a.heap[c]=d}function u(a,b,c){var d,e,f,h,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],e=a.pending_buf[a.l_buf+k],k++,0===d?j(a,e,b):(f=ja[e],j(a,f+R+1,b),h=ba[f],0!==h&&(e-=ka[f],i(a,e,h)),d--,f=g(d),j(a,f,c),h=ca[f],0!==h&&(d-=la[f],i(a,d,h)));while(k<a.last_lit);j(a,Z,b)}function v(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=V,c=0;c<i;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]=j<2?++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--)t(a,f,c);e=i;do c=a.heap[1],a.heap[1]=a.heap[a.heap_len--],t(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++,t(a,f,1);while(a.heap_len>=2);a.heap[--a.heap_max]=a.heap[1],m(a,b),n(f,j,a.bl_count)}function w(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;d<=c;d++)e=g,g=b[2*(d+1)+1],++h<i&&e===g||(h<j?a.bl_tree[2*e]+=h:0!==e?(e!==f&&a.bl_tree[2*e]++,a.bl_tree[2*$]++):h<=10?a.bl_tree[2*_]++:a.bl_tree[2*aa]++,h=0,f=e,0===g?(i=138,j=3):e===g?(i=6,j=3):(i=7,j=4))}function x(a,b,c){var d,e,f=-1,g=b[1],h=0,k=7,l=4;for(0===g&&(k=138,l=3),d=0;d<=c;d++)if(e=g,g=b[2*(d+1)+1],!(++h<k&&e===g)){if(h<l){do j(a,e,a.bl_tree);while(0!==--h)}else 0!==e?(e!==f&&(j(a,e,a.bl_tree),h--),j(a,$,a.bl_tree),i(a,h-3,2)):h<=10?(j(a,_,a.bl_tree),i(a,h-3,3)):(j(a,aa,a.bl_tree),i(a,h-11,7));h=0,f=e,0===g?(k=138,l=3):e===g?(k=6,l=3):(k=7,l=4)}}function y(a){var b;for(w(a,a.dyn_ltree,a.l_desc.max_code),w(a,a.dyn_dtree,a.d_desc.max_code),v(a,a.bl_desc),b=U-1;b>=3&&0===a.bl_tree[2*ea[b]+1];b--);return a.opt_len+=3*(b+1)+5+5+4,b}function z(a,b,c,d){var e;for(i(a,b-257,5),i(a,c-1,5),i(a,d-4,4),e=0;e<d;e++)i(a,a.bl_tree[2*ea[e]+1],3);x(a,a.dyn_ltree,b-1),x(a,a.dyn_dtree,c-1)}function A(a){var b,c=4093624447;for(b=0;b<=31;b++,c>>>=1)if(1&c&&0!==a.dyn_ltree[2*b])return I;if(0!==a.dyn_ltree[18]||0!==a.dyn_ltree[20]||0!==a.dyn_ltree[26])return J;for(b=32;b<R;b++)if(0!==a.dyn_ltree[2*b])return J;return I}function B(a){pa||(o(),pa=!0),a.l_desc=new f(a.dyn_ltree,ma),a.d_desc=new f(a.dyn_dtree,na),a.bl_desc=new f(a.bl_tree,oa),a.bi_buf=0,a.bi_valid=0,p(a)}function C(a,b,c,d){i(a,(L<<1)+(d?1:0),3),r(a,b,c,!0)}function D(a){i(a,M<<1,3),j(a,Z,ga),l(a)}function E(a,b,c,d){var e,f,g=0;a.level>0?(a.strm.data_type===K&&(a.strm.data_type=A(a)),v(a,a.l_desc),v(a,a.d_desc),g=y(a),e=a.opt_len+3+7>>>3,f=a.static_len+3+7>>>3,f<=e&&(e=f)):e=f=c+5,c+4<=e&&b!==-1?C(a,b,c,d):a.strategy===H||f===e?(i(a,(M<<1)+(d?1:0),3),u(a,ga,ha)):(i(a,(N<<1)+(d?1:0),3),z(a,a.l_desc.max_code+1,a.d_desc.max_code+1,g+1),u(a,a.dyn_ltree,a.dyn_dtree)),p(a),d&&q(a)}function F(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*(ja[c]+R+1)]++,a.dyn_dtree[2*g(b)]++),a.last_lit===a.lit_bufsize-1}var G=a(\"../utils/common\"),H=4,I=0,J=1,K=2,L=0,M=1,N=2,O=3,P=258,Q=29,R=256,S=R+1+Q,T=30,U=19,V=2*S+1,W=15,X=16,Y=7,Z=256,$=16,_=17,aa=18,ba=[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],ca=[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],da=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7],ea=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],fa=512,ga=new Array(2*(S+2));d(ga);var ha=new Array(2*T);d(ha);var ia=new Array(fa);d(ia);var ja=new Array(P-O+1);d(ja);var ka=new Array(Q);d(ka);var la=new Array(T);d(la);var ma,na,oa,pa=!1;c._tr_init=B,c._tr_stored_block=C,c._tr_flush_block=E,c._tr_tally=F,c._tr_align=D},{\"../utils/common\":28}],40:[function(a,b,c){\"use strict\";function d(){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=d},{}]},{},[10])(10)});",
"type": "application/javascript",
"title": "$:/plugins/tiddlywiki/jszip/jszip.js",
"module-type": "library"
},
"$:/plugins/tiddlywiki/jszip/license": {
"text": "JSZip is dual licensed. You may use it under the MIT license *or* the GPLv3\nlicense.\n\nThe MIT License\n===============\n\nCopyright (c) 2009-2014 Stuart Knightley, David Duponchel, Franz Buchinger, António Afonso\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\nGPL version 3\n=============\n\n GNU GENERAL PUBLIC LICENSE\n Version 3, 29 June 2007\n\n Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n Preamble\n\n The GNU General Public License is a free, copyleft license for\nsoftware and other kinds of works.\n\n The licenses for most software and other practical works are designed\nto take away your freedom to share and change the works. By contrast,\nthe GNU General Public License is intended to guarantee your freedom to\nshare and change all versions of a program--to make sure it remains free\nsoftware for all its users. We, the Free Software Foundation, use the\nGNU General Public License for most of our software; it applies also to\nany other work released this way by its authors. You can apply it to\nyour programs, too.\n\n When we speak of free software, we are referring to freedom, not\nprice. Our General Public Licenses are designed to make sure that you\nhave the freedom to distribute copies of free software (and charge for\nthem if you wish), that you receive source code or can get it if you\nwant it, that you can change the software or use pieces of it in new\nfree programs, and that you know you can do these things.\n\n To protect your rights, we need to prevent others from denying you\nthese rights or asking you to surrender the rights. Therefore, you have\ncertain responsibilities if you distribute copies of the software, or if\nyou modify it: responsibilities to respect the freedom of others.\n\n For example, if you distribute copies of such a program, whether\ngratis or for a fee, you must pass on to the recipients the same\nfreedoms that you received. You must make sure that they, too, receive\nor can get the source code. And you must show them these terms so they\nknow their rights.\n\n Developers that use the GNU GPL protect your rights with two steps:\n(1) assert copyright on the software, and (2) offer you this License\ngiving you legal permission to copy, distribute and/or modify it.\n\n For the developers' and authors' protection, the GPL clearly explains\nthat there is no warranty for this free software. For both users' and\nauthors' sake, the GPL requires that modified versions be marked as\nchanged, so that their problems will not be attributed erroneously to\nauthors of previous versions.\n\n Some devices are designed to deny users access to install or run\nmodified versions of the software inside them, although the manufacturer\ncan do so. This is fundamentally incompatible with the aim of\nprotecting users' freedom to change the software. The systematic\npattern of such abuse occurs in the area of products for individuals to\nuse, which is precisely where it is most unacceptable. Therefore, we\nhave designed this version of the GPL to prohibit the practice for those\nproducts. If such problems arise substantially in other domains, we\nstand ready to extend this provision to those domains in future versions\nof the GPL, as needed to protect the freedom of users.\n\n Finally, every program is threatened constantly by software patents.\nStates should not allow patents to restrict development and use of\nsoftware on general-purpose computers, but in those that do, we wish to\navoid the special danger that patents applied to a free program could\nmake it effectively proprietary. To prevent this, the GPL assures that\npatents cannot be used to render the program non-free.\n\n The precise terms and conditions for copying, distribution and\nmodification follow.\n\n TERMS AND CONDITIONS\n\n 0. Definitions.\n\n \"This License\" refers to version 3 of the GNU General Public License.\n\n \"Copyright\" also means copyright-like laws that apply to other kinds of\nworks, such as semiconductor masks.\n\n \"The Program\" refers to any copyrightable work licensed under this\nLicense. Each licensee is addressed as \"you\". \"Licensees\" and\n\"recipients\" may be individuals or organizations.\n\n To \"modify\" a work means to copy from or adapt all or part of the work\nin a fashion requiring copyright permission, other than the making of an\nexact copy. The resulting work is called a \"modified version\" of the\nearlier work or a work \"based on\" the earlier work.\n\n A \"covered work\" means either the unmodified Program or a work based\non the Program.\n\n To \"propagate\" a work means to do anything with it that, without\npermission, would make you directly or secondarily liable for\ninfringement under applicable copyright law, except executing it on a\ncomputer or modifying a private copy. Propagation includes copying,\ndistribution (with or without modification), making available to the\npublic, and in some countries other activities as well.\n\n To \"convey\" a work means any kind of propagation that enables other\nparties to make or receive copies. Mere interaction with a user through\na computer network, with no transfer of a copy, is not conveying.\n\n An interactive user interface displays \"Appropriate Legal Notices\"\nto the extent that it includes a convenient and prominently visible\nfeature that (1) displays an appropriate copyright notice, and (2)\ntells the user that there is no warranty for the work (except to the\nextent that warranties are provided), that licensees may convey the\nwork under this License, and how to view a copy of this License. If\nthe interface presents a list of user commands or options, such as a\nmenu, a prominent item in the list meets this criterion.\n\n 1. Source Code.\n\n The \"source code\" for a work means the preferred form of the work\nfor making modifications to it. \"Object code\" means any non-source\nform of a work.\n\n A \"Standard Interface\" means an interface that either is an official\nstandard defined by a recognized standards body, or, in the case of\ninterfaces specified for a particular programming language, one that\nis widely used among developers working in that language.\n\n The \"System Libraries\" of an executable work include anything, other\nthan the work as a whole, that (a) is included in the normal form of\npackaging a Major Component, but which is not part of that Major\nComponent, and (b) serves only to enable use of the work with that\nMajor Component, or to implement a Standard Interface for which an\nimplementation is available to the public in source code form. A\n\"Major Component\", in this context, means a major essential component\n(kernel, window system, and so on) of the specific operating system\n(if any) on which the executable work runs, or a compiler used to\nproduce the work, or an object code interpreter used to run it.\n\n The \"Corresponding Source\" for a work in object code form means all\nthe source code needed to generate, install, and (for an executable\nwork) run the object code and to modify the work, including scripts to\ncontrol those activities. However, it does not include the work's\nSystem Libraries, or general-purpose tools or generally available free\nprograms which are used unmodified in performing those activities but\nwhich are not part of the work. For example, Corresponding Source\nincludes interface definition files associated with source files for\nthe work, and the source code for shared libraries and dynamically\nlinked subprograms that the work is specifically designed to require,\nsuch as by intimate data communication or control flow between those\nsubprograms and other parts of the work.\n\n The Corresponding Source need not include anything that users\ncan regenerate automatically from other parts of the Corresponding\nSource.\n\n The Corresponding Source for a work in source code form is that\nsame work.\n\n 2. Basic Permissions.\n\n All rights granted under this License are granted for the term of\ncopyright on the Program, and are irrevocable provided the stated\nconditions are met. This License explicitly affirms your unlimited\npermission to run the unmodified Program. The output from running a\ncovered work is covered by this License only if the output, given its\ncontent, constitutes a covered work. This License acknowledges your\nrights of fair use or other equivalent, as provided by copyright law.\n\n You may make, run and propagate covered works that you do not\nconvey, without conditions so long as your license otherwise remains\nin force. You may convey covered works to others for the sole purpose\nof having them make modifications exclusively for you, or provide you\nwith facilities for running those works, provided that you comply with\nthe terms of this License in conveying all material for which you do\nnot control copyright. Those thus making or running the covered works\nfor you must do so exclusively on your behalf, under your direction\nand control, on terms that prohibit them from making any copies of\nyour copyrighted material outside their relationship with you.\n\n Conveying under any other circumstances is permitted solely under\nthe conditions stated below. Sublicensing is not allowed; section 10\nmakes it unnecessary.\n\n 3. Protecting Users' Legal Rights From Anti-Circumvention Law.\n\n No covered work shall be deemed part of an effective technological\nmeasure under any applicable law fulfilling obligations under article\n11 of the WIPO copyright treaty adopted on 20 December 1996, or\nsimilar laws prohibiting or restricting circumvention of such\nmeasures.\n\n When you convey a covered work, you waive any legal power to forbid\ncircumvention of technological measures to the extent such circumvention\nis effected by exercising rights under this License with respect to\nthe covered work, and you disclaim any intention to limit operation or\nmodification of the work as a means of enforcing, against the work's\nusers, your or third parties' legal rights to forbid circumvention of\ntechnological measures.\n\n 4. Conveying Verbatim Copies.\n\n You may convey verbatim copies of the Program's source code as you\nreceive it, in any medium, provided that you conspicuously and\nappropriately publish on each copy an appropriate copyright notice;\nkeep intact all notices stating that this License and any\nnon-permissive terms added in accord with section 7 apply to the code;\nkeep intact all notices of the absence of any warranty; and give all\nrecipients a copy of this License along with the Program.\n\n You may charge any price or no price for each copy that you convey,\nand you may offer support or warranty protection for a fee.\n\n 5. Conveying Modified Source Versions.\n\n You may convey a work based on the Program, or the modifications to\nproduce it from the Program, in the form of source code under the\nterms of section 4, provided that you also meet all of these conditions:\n\n a) The work must carry prominent notices stating that you modified\n it, and giving a relevant date.\n\n b) The work must carry prominent notices stating that it is\n released under this License and any conditions added under section\n 7. This requirement modifies the requirement in section 4 to\n \"keep intact all notices\".\n\n c) You must license the entire work, as a whole, under this\n License to anyone who comes into possession of a copy. This\n License will therefore apply, along with any applicable section 7\n additional terms, to the whole of the work, and all its parts,\n regardless of how they are packaged. This License gives no\n permission to license the work in any other way, but it does not\n invalidate such permission if you have separately received it.\n\n d) If the work has interactive user interfaces, each must display\n Appropriate Legal Notices; however, if the Program has interactive\n interfaces that do not display Appropriate Legal Notices, your\n work need not make them do so.\n\n A compilation of a covered work with other separate and independent\nworks, which are not by their nature extensions of the covered work,\nand which are not combined with it such as to form a larger program,\nin or on a volume of a storage or distribution medium, is called an\n\"aggregate\" if the compilation and its resulting copyright are not\nused to limit the access or legal rights of the compilation's users\nbeyond what the individual works permit. Inclusion of a covered work\nin an aggregate does not cause this License to apply to the other\nparts of the aggregate.\n\n 6. Conveying Non-Source Forms.\n\n You may convey a covered work in object code form under the terms\nof sections 4 and 5, provided that you also convey the\nmachine-readable Corresponding Source under the terms of this License,\nin one of these ways:\n\n a) Convey the object code in, or embodied in, a physical product\n (including a physical distribution medium), accompanied by the\n Corresponding Source fixed on a durable physical medium\n customarily used for software interchange.\n\n b) Convey the object code in, or embodied in, a physical product\n (including a physical distribution medium), accompanied by a\n written offer, valid for at least three years and valid for as\n long as you offer spare parts or customer support for that product\n model, to give anyone who possesses the object code either (1) a\n copy of the Corresponding Source for all the software in the\n product that is covered by this License, on a durable physical\n medium customarily used for software interchange, for a price no\n more than your reasonable cost of physically performing this\n conveying of source, or (2) access to copy the\n Corresponding Source from a network server at no charge.\n\n c) Convey individual copies of the object code with a copy of the\n written offer to provide the Corresponding Source. This\n alternative is allowed only occasionally and noncommercially, and\n only if you received the object code with such an offer, in accord\n with subsection 6b.\n\n d) Convey the object code by offering access from a designated\n place (gratis or for a charge), and offer equivalent access to the\n Corresponding Source in the same way through the same place at no\n further charge. You need not require recipients to copy the\n Corresponding Source along with the object code. If the place to\n copy the object code is a network server, the Corresponding Source\n may be on a different server (operated by you or a third party)\n that supports equivalent copying facilities, provided you maintain\n clear directions next to the object code saying where to find the\n Corresponding Source. Regardless of what server hosts the\n Corresponding Source, you remain obligated to ensure that it is\n available for as long as needed to satisfy these requirements.\n\n e) Convey the object code using peer-to-peer transmission, provided\n you inform other peers where the object code and Corresponding\n Source of the work are being offered to the general public at no\n charge under subsection 6d.\n\n A separable portion of the object code, whose source code is excluded\nfrom the Corresponding Source as a System Library, need not be\nincluded in conveying the object code work.\n\n A \"User Product\" is either (1) a \"consumer product\", which means any\ntangible personal property which is normally used for personal, family,\nor household purposes, or (2) anything designed or sold for incorporation\ninto a dwelling. In determining whether a product is a consumer product,\ndoubtful cases shall be resolved in favor of coverage. For a particular\nproduct received by a particular user, \"normally used\" refers to a\ntypical or common use of that class of product, regardless of the status\nof the particular user or of the way in which the particular user\nactually uses, or expects or is expected to use, the product. A product\nis a consumer product regardless of whether the product has substantial\ncommercial, industrial or non-consumer uses, unless such uses represent\nthe only significant mode of use of the product.\n\n \"Installation Information\" for a User Product means any methods,\nprocedures, authorization keys, or other information required to install\nand execute modified versions of a covered work in that User Product from\na modified version of its Corresponding Source. The information must\nsuffice to ensure that the continued functioning of the modified object\ncode is in no case prevented or interfered with solely because\nmodification has been made.\n\n If you convey an object code work under this section in, or with, or\nspecifically for use in, a User Product, and the conveying occurs as\npart of a transaction in which the right of possession and use of the\nUser Product is transferred to the recipient in perpetuity or for a\nfixed term (regardless of how the transaction is characterized), the\nCorresponding Source conveyed under this section must be accompanied\nby the Installation Information. But this requirement does not apply\nif neither you nor any third party retains the ability to install\nmodified object code on the User Product (for example, the work has\nbeen installed in ROM).\n\n The requirement to provide Installation Information does not include a\nrequirement to continue to provide support service, warranty, or updates\nfor a work that has been modified or installed by the recipient, or for\nthe User Product in which it has been modified or installed. Access to a\nnetwork may be denied when the modification itself materially and\nadversely affects the operation of the network or violates the rules and\nprotocols for communication across the network.\n\n Corresponding Source conveyed, and Installation Information provided,\nin accord with this section must be in a format that is publicly\ndocumented (and with an implementation available to the public in\nsource code form), and must require no special password or key for\nunpacking, reading or copying.\n\n 7. Additional Terms.\n\n \"Additional permissions\" are terms that supplement the terms of this\nLicense by making exceptions from one or more of its conditions.\nAdditional permissions that are applicable to the entire Program shall\nbe treated as though they were included in this License, to the extent\nthat they are valid under applicable law. If additional permissions\napply only to part of the Program, that part may be used separately\nunder those permissions, but the entire Program remains governed by\nthis License without regard to the additional permissions.\n\n When you convey a copy of a covered work, you may at your option\nremove any additional permissions from that copy, or from any part of\nit. (Additional permissions may be written to require their own\nremoval in certain cases when you modify the work.) You may place\nadditional permissions on material, added by you to a covered work,\nfor which you have or can give appropriate copyright permission.\n\n Notwithstanding any other provision of this License, for material you\nadd to a covered work, you may (if authorized by the copyright holders of\nthat material) supplement the terms of this License with terms:\n\n a) Disclaiming warranty or limiting liability differently from the\n terms of sections 15 and 16 of this License; or\n\n b) Requiring preservation of specified reasonable legal notices or\n author attributions in that material or in the Appropriate Legal\n Notices displayed by works containing it; or\n\n c) Prohibiting misrepresentation of the origin of that material, or\n requiring that modified versions of such material be marked in\n reasonable ways as different from the original version; or\n\n d) Limiting the use for publicity purposes of names of licensors or\n authors of the material; or\n\n e) Declining to grant rights under trademark law for use of some\n trade names, trademarks, or service marks; or\n\n f) Requiring indemnification of licensors and authors of that\n material by anyone who conveys the material (or modified versions of\n it) with contractual assumptions of liability to the recipient, for\n any liability that these contractual assumptions directly impose on\n those licensors and authors.\n\n All other non-permissive additional terms are considered \"further\nrestrictions\" within the meaning of section 10. If the Program as you\nreceived it, or any part of it, contains a notice stating that it is\ngoverned by this License along with a term that is a further\nrestriction, you may remove that term. If a license document contains\na further restriction but permits relicensing or conveying under this\nLicense, you may add to a covered work material governed by the terms\nof that license document, provided that the further restriction does\nnot survive such relicensing or conveying.\n\n If you add terms to a covered work in accord with this section, you\nmust place, in the relevant source files, a statement of the\nadditional terms that apply to those files, or a notice indicating\nwhere to find the applicable terms.\n\n Additional terms, permissive or non-permissive, may be stated in the\nform of a separately written license, or stated as exceptions;\nthe above requirements apply either way.\n\n 8. Termination.\n\n You may not propagate or modify a covered work except as expressly\nprovided under this License. Any attempt otherwise to propagate or\nmodify it is void, and will automatically terminate your rights under\nthis License (including any patent licenses granted under the third\nparagraph of section 11).\n\n However, if you cease all violation of this License, then your\nlicense from a particular copyright holder is reinstated (a)\nprovisionally, unless and until the copyright holder explicitly and\nfinally terminates your license, and (b) permanently, if the copyright\nholder fails to notify you of the violation by some reasonable means\nprior to 60 days after the cessation.\n\n Moreover, your license from a particular copyright holder is\nreinstated permanently if the copyright holder notifies you of the\nviolation by some reasonable means, this is the first time you have\nreceived notice of violation of this License (for any work) from that\ncopyright holder, and you cure the violation prior to 30 days after\nyour receipt of the notice.\n\n Termination of your rights under this section does not terminate the\nlicenses of parties who have received copies or rights from you under\nthis License. If your rights have been terminated and not permanently\nreinstated, you do not qualify to receive new licenses for the same\nmaterial under section 10.\n\n 9. Acceptance Not Required for Having Copies.\n\n You are not required to accept this License in order to receive or\nrun a copy of the Program. Ancillary propagation of a covered work\noccurring solely as a consequence of using peer-to-peer transmission\nto receive a copy likewise does not require acceptance. However,\nnothing other than this License grants you permission to propagate or\nmodify any covered work. These actions infringe copyright if you do\nnot accept this License. Therefore, by modifying or propagating a\ncovered work, you indicate your acceptance of this License to do so.\n\n 10. Automatic Licensing of Downstream Recipients.\n\n Each time you convey a covered work, the recipient automatically\nreceives a license from the original licensors, to run, modify and\npropagate that work, subject to this License. You are not responsible\nfor enforcing compliance by third parties with this License.\n\n An \"entity transaction\" is a transaction transferring control of an\norganization, or substantially all assets of one, or subdividing an\norganization, or merging organizations. If propagation of a covered\nwork results from an entity transaction, each party to that\ntransaction who receives a copy of the work also receives whatever\nlicenses to the work the party's predecessor in interest had or could\ngive under the previous paragraph, plus a right to possession of the\nCorresponding Source of the work from the predecessor in interest, if\nthe predecessor has it or can get it with reasonable efforts.\n\n You may not impose any further restrictions on the exercise of the\nrights granted or affirmed under this License. For example, you may\nnot impose a license fee, royalty, or other charge for exercise of\nrights granted under this License, and you may not initiate litigation\n(including a cross-claim or counterclaim in a lawsuit) alleging that\nany patent claim is infringed by making, using, selling, offering for\nsale, or importing the Program or any portion of it.\n\n 11. Patents.\n\n A \"contributor\" is a copyright holder who authorizes use under this\nLicense of the Program or a work on which the Program is based. The\nwork thus licensed is called the contributor's \"contributor version\".\n\n A contributor's \"essential patent claims\" are all patent claims\nowned or controlled by the contributor, whether already acquired or\nhereafter acquired, that would be infringed by some manner, permitted\nby this License, of making, using, or selling its contributor version,\nbut do not include claims that would be infringed only as a\nconsequence of further modification of the contributor version. For\npurposes of this definition, \"control\" includes the right to grant\npatent sublicenses in a manner consistent with the requirements of\nthis License.\n\n Each contributor grants you a non-exclusive, worldwide, royalty-free\npatent license under the contributor's essential patent claims, to\nmake, use, sell, offer for sale, import and otherwise run, modify and\npropagate the contents of its contributor version.\n\n In the following three paragraphs, a \"patent license\" is any express\nagreement or commitment, however denominated, not to enforce a patent\n(such as an express permission to practice a patent or covenant not to\nsue for patent infringement). To \"grant\" such a patent license to a\nparty means to make such an agreement or commitment not to enforce a\npatent against the party.\n\n If you convey a covered work, knowingly relying on a patent license,\nand the Corresponding Source of the work is not available for anyone\nto copy, free of charge and under the terms of this License, through a\npublicly available network server or other readily accessible means,\nthen you must either (1) cause the Corresponding Source to be so\navailable, or (2) arrange to deprive yourself of the benefit of the\npatent license for this particular work, or (3) arrange, in a manner\nconsistent with the requirements of this License, to extend the patent\nlicense to downstream recipients. \"Knowingly relying\" means you have\nactual knowledge that, but for the patent license, your conveying the\ncovered work in a country, or your recipient's use of the covered work\nin a country, would infringe one or more identifiable patents in that\ncountry that you have reason to believe are valid.\n\n If, pursuant to or in connection with a single transaction or\narrangement, you convey, or propagate by procuring conveyance of, a\ncovered work, and grant a patent license to some of the parties\nreceiving the covered work authorizing them to use, propagate, modify\nor convey a specific copy of the covered work, then the patent license\nyou grant is automatically extended to all recipients of the covered\nwork and works based on it.\n\n A patent license is \"discriminatory\" if it does not include within\nthe scope of its coverage, prohibits the exercise of, or is\nconditioned on the non-exercise of one or more of the rights that are\nspecifically granted under this License. You may not convey a covered\nwork if you are a party to an arrangement with a third party that is\nin the business of distributing software, under which you make payment\nto the third party based on the extent of your activity of conveying\nthe work, and under which the third party grants, to any of the\nparties who would receive the covered work from you, a discriminatory\npatent license (a) in connection with copies of the covered work\nconveyed by you (or copies made from those copies), or (b) primarily\nfor and in connection with specific products or compilations that\ncontain the covered work, unless you entered into that arrangement,\nor that patent license was granted, prior to 28 March 2007.\n\n Nothing in this License shall be construed as excluding or limiting\nany implied license or other defenses to infringement that may\notherwise be available to you under applicable patent law.\n\n 12. No Surrender of Others' Freedom.\n\n If conditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License. If you cannot convey a\ncovered work so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you may\nnot convey it at all. For example, if you agree to terms that obligate you\nto collect a royalty for further conveying from those to whom you convey\nthe Program, the only way you could satisfy both those terms and this\nLicense would be to refrain entirely from conveying the Program.\n\n 13. Use with the GNU Affero General Public License.\n\n Notwithstanding any other provision of this License, you have\npermission to link or combine any covered work with a work licensed\nunder version 3 of the GNU Affero General Public License into a single\ncombined work, and to convey the resulting work. The terms of this\nLicense will continue to apply to the part which is the covered work,\nbut the special requirements of the GNU Affero General Public License,\nsection 13, concerning interaction through a network will apply to the\ncombination as such.\n\n 14. Revised Versions of this License.\n\n The Free Software Foundation may publish revised and/or new versions of\nthe GNU General Public License from time to time. Such new versions will\nbe similar in spirit to the present version, but may differ in detail to\naddress new problems or concerns.\n\n Each version is given a distinguishing version number. If the\nProgram specifies that a certain numbered version of the GNU General\nPublic License \"or any later version\" applies to it, you have the\noption of following the terms and conditions either of that numbered\nversion or of any later version published by the Free Software\nFoundation. If the Program does not specify a version number of the\nGNU General Public License, you may choose any version ever published\nby the Free Software Foundation.\n\n If the Program specifies that a proxy can decide which future\nversions of the GNU General Public License can be used, that proxy's\npublic statement of acceptance of a version permanently authorizes you\nto choose that version for the Program.\n\n Later license versions may give you additional or different\npermissions. However, no additional obligations are imposed on any\nauthor or copyright holder as a result of your choosing to follow a\nlater version.\n\n 15. Disclaimer of Warranty.\n\n THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY\nAPPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT\nHOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY\nOF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,\nTHE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\nPURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM\nIS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF\nALL NECESSARY SERVICING, REPAIR OR CORRECTION.\n\n 16. Limitation of Liability.\n\n IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS\nTHE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY\nGENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE\nUSE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF\nDATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD\nPARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),\nEVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF\nSUCH DAMAGES.\n\n 17. Interpretation of Sections 15 and 16.\n\n If the disclaimer of warranty and limitation of liability provided\nabove cannot be given local legal effect according to their terms,\nreviewing courts shall apply local law that most closely approximates\nan absolute waiver of all civil liability in connection with the\nProgram, unless a warranty or assumption of liability accompanies a\ncopy of the Program in return for a fee.\n\n END OF TERMS AND CONDITIONS\n",
"type": "text/plain",
"title": "$:/plugins/tiddlywiki/jszip/license"
},
"$:/plugins/tiddlywiki/jszip/readme": {
"title": "$:/plugins/tiddlywiki/jszip/readme",
"text": "This plugin packages [[JSZip|https://stuk.github.io/jszip/]] for use by other plugins. It does not provide any end-user visible features.\n"
}
}
}
{
"tiddlers": {
"$:/plugins/tiddlywiki/xlsx-utils/controls": {
"title": "$:/plugins/tiddlywiki/xlsx-utils/controls",
"caption": "XLSX Utilities",
"tags": "$:/tags/ControlPanel",
"text": "\\define help-button(state)\n<$button popup=\"\"\"$:/state/expand-help/$state$\"\"\" class=\"tc-btn-invisible tc-popup-keep\">\n{{$:/core/images/help}}\n</$button>\n\\end\n\n\\define help-content(type,state)\n<$reveal tag=\"span\" state=\"\"\"$:/state/expand-help/$state$\"\"\" type=\"popup\" position=\"below\">\n<div class=\"tc-drop-down tc-popup-keep\" style=\"padding: 0.5em; max-width: 30em; white-space: normal;\">\n<$transclude tiddler=\"\"\"$:/plugins/tiddlywiki/xlsx-utils/docs/$type$\"\"\" mode=\"block\"/>\n</div>\n</$reveal>\n\\end\n\n\\define renameProxyTitle()\n$:/state/plugins/tiddlywiki/xlsx-utils/rename-$(currentTiddler)$\n\\end\n\n\\define rename-current-tiddler()\n<$edit-text tag=\"input\" tiddler=<<renameProxyTitle>> placeholder=\"Rename\" default=<<currentTiddler>> size=\"50\"/>\n<$reveal type=\"nomatch\" state=\"\"\"$(renameProxyTitle)$\"\"\" text=<<currentTiddler>> default=<<currentTiddler>> tag=\"span\">\n<$button>\n<$action-deletetiddler $tiddler=<<renameProxyTitle>>/>\ncancel\n</$button>\n<$button>\n<$action-sendmessage $message=\"tm-rename-tiddler\" from=<<currentTiddler>> to={{$(renameProxyTitle)$}}/>\n<$action-deletetiddler $tiddler=<<renameProxyTitle>>/>\nrename\n</$button>\n<$set name=\"proxy-title\" value={{$(renameProxyTitle)$}}>\n<$list filter=\"\"\"[<proxy-title>is[tiddler]]\"\"\">\nWarning: tiddler already exists\n</$list>\n</$set>\n</$reveal>\n\\end\n\n\\define expand-collapse-button(state)\n<$reveal state=\"\"\"$:/state/expand/$state$\"\"\" type=\"match\" text=\"yes\" default=\"no\" tag=\"span\">\n<$button class=\"tc-btn-invisible\">\n<$action-setfield $tiddler=\"\"\"$:/state/expand/$state$\"\"\" $value=\"no\"/>\n{{$:/core/images/down-arrow}}\n</$button>\n</$reveal>\n<$reveal state=\"\"\"$:/state/expand/$state$\"\"\" type=\"nomatch\" text=\"yes\" default=\"no\" tag=\"span\">\n<$button class=\"tc-btn-invisible\">\n<$action-setfield $tiddler=\"\"\"$:/state/expand/$state$\"\"\" $value=\"yes\"/>\n{{$:/core/images/right-arrow}}\n</$button>\n</$reveal>\n\\end\n\n\\define expand-collapse-content(state,content,class)\n<$reveal state=\"\"\"$:/state/expand/$state$\"\"\" type=\"match\" text=\"yes\" default=\"no\" tag=\"div\" class=\"\"\"$class$\"\"\" animate=\"yes\" retain=\"yes\">\n$content$\n</$reveal>\n\\end\n\n\\define up-down-buttons(parent,child)\n<$list filter=\"[list<$parent$>butfirst[]field:title<$child$>limit[1]]\" variable=\"listItem\">\n<$button class=\"tc-btn-invisible\">\n<$action-listops $tiddler=<<$parent$>> $subfilter=\"+[move:-1<$child$>]\"/>\n{{$:/core/images/chevron-up}}\n</$button>\n</$list>\n<$list filter=\"[list<$parent$>butlast[]field:title<$child$>limit[1]]\" variable=\"listItem\">\n<$button class=\"tc-btn-invisible\">\n<$action-listops $tiddler=<<$parent$>> $subfilter=\"+[move:1<$child$>]\"/>\n{{$:/core/images/chevron-down}}\n</$button>\n</$list>\n\\end\n\n\\define edit-button(state)\n<$reveal state=\"\"\"$:/state/edit/$state$\"\"\" type=\"nomatch\" text=\"yes\" default=\"no\" tag=\"span\">\n<$button class=\"tc-btn-invisible\">\n<$action-setfield $tiddler=\"\"\"$:/state/edit/$state$\"\"\" $value=\"yes\"/>\n<$action-setfield $tiddler=\"\"\"$:/state/expand/$state$\"\"\" $value=\"yes\"/>\n{{$:/core/images/edit-button}}\n</$button>\n</$reveal>\n<$reveal state=\"\"\"$:/state/edit/$state$\"\"\" type=\"match\" text=\"yes\" default=\"no\" tag=\"span\">\n<$button class=\"tc-btn-invisible\">\n<$action-setfield $tiddler=\"\"\"$:/state/edit/$state$\"\"\" $value=\"no\"/>\n{{$:/core/images/done-button}} Finish editing\n</$button>\n</$reveal>\n\\end\n\n\\define delete-item-button(filter,parent,title,prompt)\n<$button class=\"tc-btn-invisible\">\n<$action-deletetiddler $filter=\"\"\"$filter$\"\"\"/>\n<$action-listops $tiddler=\"\"\"$parent$\"\"\" $subfilter=\"-[[$title$]]\"/>\n{{$:/core/images/delete-button}}$prompt$\n</$button>\n\\end\n\n\\define edit-field()\n<$select tiddler=<<field>> field=\"import-field-list-op\" default=\"none\">\n<option value=\"none\">Set field</option>\n<option value=\"append\">Append to list field</option>\n</$select>\n<$edit-text tiddler=<<field>> field=\"import-field-name\" size=\"10\" tag=\"input\" placeholder=\"field name\"default=\"\"/>\n<$reveal state=\"\"\"$(field)$!!import-field-list-op\"\"\" type=\"match\" text=\"none\" default=\"none\" tag=\"span\">\nto\n</$reveal>\n<$reveal state=\"\"\"$(field)$!!import-field-list-op\"\"\" type=\"match\" text=\"append\" default=\"none\" tag=\"span\">\nthe\n</$reveal>\n<$select tiddler=<<field>> field=\"import-field-type\" default=\"string\">\n<option value=\"date\">date</option>\n<option value=\"string\">string</option>\n</$select>\n<$select tiddler=<<field>> field=\"import-field-source\" default=\"column\">\n<option value=\"column\">from column</option>\n<option value=\"constant\">constant</option>\n</$select>\n<$reveal state=\"\"\"$(field)$!!import-field-source\"\"\" type=\"match\" text=\"column\" default=\"column\" tag=\"span\">\n<$edit-text tiddler=<<field>> field=\"import-field-column\" tag=\"input\" placeholder=\"column\" default=\"\"/>\nprefixed\n<$edit-text tiddler=<<field>> field=\"import-field-prefix\" tag=\"input\" placeholder=\"prefix\" default=\"\"/>,\nsuffixed\n<$edit-text tiddler=<<field>> field=\"import-field-suffix\" tag=\"input\" placeholder=\"suffix\" default=\"\"/>\n</$reveal>\n<$reveal state=\"\"\"$(field)$!!import-field-source\"\"\" type=\"match\" text=\"constant\" default=\"column\" tag=\"span\">\n<$edit-text tiddler=<<field>> field=\"import-field-value\" tag=\"input\" placeholder=\"constant\" default=\"\"/>\n</$reveal>\n<$checkbox tiddler=<<field>> field=\"import-field-skip-tiddler-if-blank\" checked=\"yes\" unchecked=\"no\" default=\"no\">\nSkip this tiddler when field blank\n<br/>\nTitle:\n<$tiddler tiddler=<<field>>>\n<<rename-current-tiddler>>\n</$tiddler>\n\\end\n\n\\define view-field()\n<$link to=<<field>>>\n<$list filter=\"[<field>!has[import-field-list-op]]\" variable=\"listItem\">\nSet field ''<$view tiddler=<<field>> field=\"import-field-name\"/>'' to\n</$list>\n<$list filter=\"[<field>get[import-field-list-op]prefix[append]]\" variable=\"listItem\">\nAppend to list field ''<$view tiddler=<<field>> field=\"import-field-name\"/>''\n</$list>\n<$list filter=\"[<field>has[import-field-prefix]]\" variable=\"listItem\">\n''<code><$view tiddler=<<field>> field=\"import-field-prefix\"/></code>'' +\n</$list>\n<$list filter=\"[<field>get[import-field-type]prefix[date]]\" variable=\"listItem\">\ndate\n</$list>\n<$list filter=\"[<field>get[import-field-source]prefix[column]]\" variable=\"listItem\">\nvalue from column ''<$view tiddler=<<field>> field=\"import-field-column\"/>''\n</$list>\n<$list filter=\"[<field>get[import-field-source]prefix[constant]]\" variable=\"listItem\">\nconstant ''<code><$view tiddler=<<field>> field=\"import-field-value\"/></code>''\n</$list>\n<$list filter=\"[<field>has[import-field-suffix]]\" variable=\"listItem\">\n+ ''<code><$view tiddler=<<field>> field=\"import-field-suffix\"/></code>''\n</$list>\n</$link>\n\\end\n\n\\define list-fields()\n<ul class=\"tc-import-spec-row-list\">\n<$list filter=\"[list<row>]\" variable=\"field\" emptyMessage=\"<div>(No field import specifiers)</div>\">\n<li class=\"tc-import-spec-field-wrapper\">\n<$reveal state=\"\"\"$:/state/edit/$(row)$\"\"\" type=\"match\" text=\"yes\" default=\"no\" tag=\"span\">\n<<edit-field>>\n<<up-down-buttons parent:\"row\" child:\"field\">>\n<$macrocall $name=\"delete-item-button\" filter=\"[<field>]\" parent=<<row>> title=<<field>>/>\n</$reveal>\n<$reveal state=\"\"\"$:/state/edit/$(row)$\"\"\" type=\"nomatch\" text=\"yes\" default=\"no\" tag=\"span\">\n<<view-field>>\n</$reveal>\n</li>\n</$list>\n</ul>\n\\end\n\n\\define view-row-content()\n<$reveal state=\"\"\"$:/state/edit/$(row)$\"\"\" type=\"match\" text=\"yes\" default=\"no\" tag=\"ul\" class=\"tc-import-spec-row-controls\" animate=\"yes\" retain=\"yes\">\n<li>\n<$macrocall $name=\"delete-item-button\" filter=\"[<row>] [<row>getlist[]]\" parent=<<sheet>> title=<<row>> prompt=\" Delete this row\"/>\n</li>\n<li>\nTitle:\n<$tiddler tiddler=<<row>>>\n<<rename-current-tiddler>>\n</$tiddler>\n</li>\n<li>\nRow type:\n<$select tiddler=<<row>> field=\"import-row-type\" default=\"by-field\">\n<option value=\"by-field\">By field</option>\n<option value=\"by-column\">By column</option>\n</$select>\n</li>\n<li>\n<$button class=\"tc-btn-invisible\">\n<$action-createtiddler $basetitle=\"$:/_ExcelImporter/ImportSpecifiers/Field\" $savetitle=\"$:/temp/newtiddler\" import-spec-role=\"field\" import-field-name=\"fieldname\" import-field-type=\"string\" import-field-source=\"column\" import-field-column=\"Column Name\" />\n<$action-listops $tiddler=<<row>> $subfilter=\"[{$:/temp/newtiddler}] +[putfirst[]]\"/>\n{{$:/core/images/new-button}} Add new field\n</$button>\n</li>\n</$reveal>\n<<list-fields>>\n\\end\n\n\\define view-row()\n<div class=\"tc-import-spec-row-wrapper\">\n<h5>\n<$macrocall $name=\"expand-collapse-button\" state=<<row>>/>\nEach row: <$list filter=\"[list<row>import-field-name[title]]\" variable=\"field\" emptyMessage=\"\n<$link to=<<field>>>(title field not set)</$link>\"><<view-field>></$list>\n<$macrocall $name=\"edit-button\" state=<<row>>/>\n<<up-down-buttons parent:\"sheet\" child:\"row\">>\n<$macrocall $name=\"help-button\" state=<<row>>/>\n</h5>\n<$macrocall $name=\"help-content\" type=\"row\" state=<<row>>/>\n<$macrocall $name=\"expand-collapse-content\" state=<<row>> content=<<view-row-content>> class=\"tc-import-spec-row\"/>\n</div>\n\\end\n\n\\define list-rows()\n<div class=\"tc-import-spec-sheet-list\">\n<$list filter=\"[list<sheet>]\" variable=\"row\" emptyMessage=\"<div>(No row import specifiers)</div>\">\n<<view-row>>\n</$list>\n\\end\n\n\\define view-sheet-content()\n<$reveal state=\"\"\"$:/state/edit/$(sheet)$\"\"\" type=\"match\" text=\"yes\" default=\"no\" tag=\"ul\" class=\"tc-import-spec-sheet-controls\" animate=\"yes\" retain=\"yes\">\n<li>\n<$macrocall $name=\"delete-item-button\" filter=\"[<sheet>] [<sheet>getlist[]] [<sheet>getlist[]getlist[]]\" parent=<<workbook>> title=<<sheet>> prompt=\" Delete this sheet\"/>\n</li>\n<li>\nTitle:\n<$tiddler tiddler=<<sheet>>>\n<<rename-current-tiddler>>\n</$tiddler>\n</li>\n<li>\nImport sheet name:\n<$edit-text tiddler=<<sheet>> field=\"import-sheet-name\" size=\"50\"/>\n</li>\n<li>\n<$button class=\"tc-btn-invisible\">\n<$action-createtiddler $basetitle=\"$:/_ExcelImporter/ImportSpecifiers/Row\" $savetitle=\"$:/temp/newtiddler\" import-spec-role=\"row\"/>\n<$action-listops $tiddler=<<sheet>> $subfilter=\"[{$:/temp/newtiddler}] +[putfirst[]]\"/>\n<$action-setfield $tiddler={{{ [{$:/temp/newtiddler}addprefix[$:/state/edit/]] }}} $value=\"yes\"/>\n<$action-setfield $tiddler={{{ [{$:/temp/newtiddler}addprefix[$:/state/expand/]] }}} $value=\"yes\"/>\n{{$:/core/images/new-button}} Add new row\n</$button>\n</li>\n</$reveal>\n<<list-rows>>\n\\end\n\n\\define view-sheet()\n<div class=\"tc-import-spec-sheet-wrapper\">\n<h4>\n<$macrocall $name=\"expand-collapse-button\" state=<<sheet>>/>\nSheet: <$link to=<<sheet>>><$view tiddler=<<sheet>> field=\"import-sheet-name\"/></$link>\n<$macrocall $name=\"edit-button\" state=<<sheet>>/>\n<<up-down-buttons parent:\"workbook\" child:\"sheet\">>\n<$macrocall $name=\"help-button\" state=<<sheet>>/>\n</h4>\n<$macrocall $name=\"help-content\" type=\"sheet\" state=<<sheet>>/>\n<$macrocall $name=\"expand-collapse-content\" state=<<sheet>> content=<<view-sheet-content>> class=\"tc-import-spec-sheet\"/>\n</div>\n\\end\n\n\\define list-sheets()\n<div class=\"tc-import-spec-workbook-list\">\n<$list filter=\"[list<workbook>]\" variable=\"sheet\" emptyMessage=\"<div>(No sheet import specifiers)</div>\">\n<<view-sheet>>\n</$list>\n</div>\n\\end\n\n\\define view-workbook-content()\n<$reveal state=\"\"\"$:/state/edit/$(workbook)$\"\"\" type=\"match\" text=\"yes\" default=\"no\" tag=\"ul\" class=\"tc-import-spec-workbook-controls\" animate=\"yes\" retain=\"yes\">\n<li>\n<$macrocall $name=\"delete-item-button\" filter=\"[<workbook>] [<workbook>getlist[]] [<workbook>getlist[]getlist[]] [<workbook>getlist[]getlist[]getlist[]]\" prompt=\" Delete this workbook\"/>\n</li>\n<li>\nTitle:\n<$tiddler tiddler=<<workbook>>>\n<<rename-current-tiddler>>\n</$tiddler>\n</li>\n<li>\nCaption:\n<$edit-text tiddler=<<workbook>> field=\"caption\" size=\"50\"/>\n</li>\n<li>\n<$button class=\"tc-btn-invisible\">\n<$action-createtiddler $basetitle=\"$:/_ExcelImporter/ImportSpecifiers/Sheet\" $savetitle=\"$:/temp/newtiddler\" import-spec-role=\"sheet\" import-sheet-name=\"Sheet name\"/>\n<$action-listops $tiddler=<<workbook>> $subfilter=\"[{$:/temp/newtiddler}] +[putfirst[]]\"/>\n<$action-setfield $tiddler={{{ [{$:/temp/newtiddler}addprefix[$:/state/edit/]] }}} $value=\"yes\"/>\n<$action-setfield $tiddler={{{ [{$:/temp/newtiddler}addprefix[$:/state/expand/]] }}} $value=\"yes\"/>\n{{$:/core/images/new-button}} Add new sheet\n</$button>\n</li>\n</$reveal>\n<<list-sheets>>\n\\end\n\n\\define view-workbook()\n<div class=\"tc-import-spec-workbook-wrapper\">\n<h3>\n<$macrocall $name=\"expand-collapse-button\" state=<<workbook>>/>\nWorkbook: <$link to=<<workbook>>><$view tiddler=<<workbook>> field=\"caption\"/></$link>\n<$macrocall $name=\"edit-button\" state=<<workbook>>/>\n<$macrocall $name=\"help-button\" state=<<workbook>>/>\n</h3>\n<$macrocall $name=\"help-content\" type=\"workbook\" state=<<workbook>>/>\n<$macrocall $name=\"expand-collapse-content\" state=<<workbook>> content=<<view-workbook-content>> class=\"tc-import-spec-workbook\"/>\n</div>\n\\end\n\n\\define list-workbooks()\n<ul class=\"tc-import-spec-editor-controls\">\n<li>\n<$button class=\"tc-btn-invisible\">\n<$action-createtiddler $basetitle=\"$:/_ExcelImporter/ImportSpecifiers/Workbook\" $savetitle=\"$:/temp/newtiddler\" import-spec-role=\"workbook\" caption=\"New workbook\"/>\n<$action-setfield $tiddler={{{ [{$:/temp/newtiddler}addprefix[$:/state/edit/]] }}} $value=\"yes\"/>\n<$action-setfield $tiddler={{{ [{$:/temp/newtiddler}addprefix[$:/state/expand/]] }}} $value=\"yes\"/>\n{{$:/core/images/new-button}} Add new workbook\n</$button>\n</li>\n</ul>\n<div class=\"tc-import-spec-editor-list\">\n<$list filter=\"[all[shadows+tiddlers]import-spec-role[workbook]sort[caption]]\" variable=\"workbook\">\n<<view-workbook>>\n</$list>\n</div>\n\\end\n\n<h1>\nControls for XLSX Spreadsheet Utilities\n</h1>\n\n<div class=\"tc-import-spec-selector\">\n<h2>\nCurrent Import Specification\n</h2>\n<$list filter=\"[all[shadows+tiddlers]import-spec-role[workbook]limit[1]]\" emptyMessage=\"\"\"\nThere are no import specifications available. Use the controls below to create one\n\"\"\">\nThis is the import specification that will be used for the next import of an `.XLSX` file\n<$select tiddler=\"$:/config/plugins/tiddlywiki/xlsx-utils/default-import-spec\">\n<$list filter=\"[all[shadows+tiddlers]import-spec-role[workbook]sort[caption]]\">\n<option value=<<currentTiddler>>><$text text={{!!caption}}/></option>\n</$list>\n</$select>\n</$list>\n</div>\n\n<div class=\"tc-import-spec-editor-wrapper\">\n<h2>\n Import Specifications\n<$macrocall $name=\"help-button\" state=\"\"/>\n</h2>\n<$macrocall $name=\"help-content\" type=\"editor\" state=\"\"/>\n<div class=\"tc-import-spec-editor\">\n<<list-workbooks>>\n</div>\n</div>\n"
},
"$:/plugins/tiddlywiki/xlsx-utils/deserializer.js": {
"title": "$:/plugins/tiddlywiki/xlsx-utils/deserializer.js",
"text": "/*\\\ntitle: $:/plugins/tiddlywiki/xlsx-utils/deserializer.js\ntype: application/javascript\nmodule-type: tiddlerdeserializer\n\nXLSX file deserializer\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nParse an XLSX file into tiddlers\n*/\nexports[\"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\"] = function(text,fields) {\n\t// Collect output tiddlers in an array\n\tvar results = [],\n\t\tXLSXImporter = require(\"$:/plugins/tiddlywiki/xlsx-utils/importer.js\").XLSXImporter,\n\t\timporter = new XLSXImporter({\n\t\t\ttext: text\n\t\t});\n\t// Return the output tiddlers\n\treturn importer.getResults();\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "tiddlerdeserializer"
},
"$:/plugins/tiddlywiki/xlsx-utils/docs/editor": {
"title": "$:/plugins/tiddlywiki/xlsx-utils/docs/editor",
"text": "!!! Import Specifications\n\nImport specifications govern how spreadsheets are converted into individual tiddlers.\n\nEach \"workbook\" describes how spreadsheets of a particular format should be converted.\n"
},
"$:/plugins/tiddlywiki/xlsx-utils/docs/row": {
"title": "$:/plugins/tiddlywiki/xlsx-utils/docs/row",
"text": "!!! Row Import Specifications\n\nEach row import specification describes how one tiddler should be extracted from each row of the current sheet.\n\nNote that using multiple row import specifications within a sheet enables multiple tiddlers to be created from each row of the sheet.\n\nRows contain a list of field import specifications that describe how each field of the tiddler should be created.\n\n!!! Field Import Specifications\n\nField import specifications describe the value given to a particular field of a tiddler.\n\nThey follow a rich syntax for describing how each field of the tiddler is created. For example:\n\n* Set field `title` to string from column `Organization`\n* Set field `role` to string constant `organization`\n* Append to list field `list` the string from column `Country` prefixed with `Map:`\n\n"
},
"$:/plugins/tiddlywiki/xlsx-utils/docs/sheet": {
"title": "$:/plugins/tiddlywiki/xlsx-utils/docs/sheet",
"text": "!!! Sheet Import Specifications\n\nEach sheet import specification describes how a named sheet within a workbook should be converted into individual tiddlers.\n\nSheets contain a list of row import specifications that describe how individual rows of the sheet should be handled.\n\nEach sheet has the name of the sheet that it handles.\n\nNote that the first row of each sheet is interpreted as the title of each column.\n"
},
"$:/plugins/tiddlywiki/xlsx-utils/docs/workbook": {
"title": "$:/plugins/tiddlywiki/xlsx-utils/docs/workbook",
"text": "!!! Workbook Import Specifications\n\nEach workbook import specification describes how spreadsheets of a particular format should be converted into individual tiddlers.\n\nCreate a new workbook for each type of spreadsheet that you will be working with.\n\nWorkbooks contain a list of sheet import specifications that describe how individual sheets of the workbook should be handled.\n\nEach workbook has a caption that you can use to describe its purpose.\n"
},
"$:/plugins/tiddlywiki/xlsx-utils/xlsx.js": {
"text": "var old_exports = exports,JSZip = require(\"$:/plugins/tiddlywiki/jszip/jszip.js\");exports = {};if($tw.browser){module.exports=undefined;};/* xlsx.js (C) 2013-2015 SheetJS -- http://sheetjs.com */\n/* vim: set ts=2: */\n/*jshint -W041 */\n/*jshint funcscope:true, eqnull:true */\nvar XLSX = {};\n(function make_xlsx(XLSX){\nXLSX.version = '0.8.0';\nvar current_codepage = 1200, current_cptable;\nif(typeof module !== \"undefined\" && typeof require !== 'undefined') {\n\tif(typeof cptable === 'undefined') cptable = require('./dist/cpexcel');\n\tcurrent_cptable = cptable[current_codepage];\n}\nfunction reset_cp() { set_cp(1200); }\nvar set_cp = function(cp) { current_codepage = cp; };\n\nfunction char_codes(data) { var o = []; for(var i = 0, len = data.length; i < len; ++i) o[i] = data.charCodeAt(i); return o; }\nvar debom_xml = function(data) { return data; };\n\nvar _getchar = function _gc1(x) { return String.fromCharCode(x); };\nif(typeof cptable !== 'undefined') {\n\tset_cp = function(cp) { current_codepage = cp; current_cptable = cptable[cp]; };\n\tdebom_xml = function(data) {\n\t\tif(data.charCodeAt(0) === 0xFF && data.charCodeAt(1) === 0xFE) { return cptable.utils.decode(1200, char_codes(data.substr(2))); }\n\t\treturn data;\n\t};\n\t_getchar = function _gc2(x) {\n\t\tif(current_codepage === 1200) return String.fromCharCode(x);\n\t\treturn cptable.utils.decode(current_codepage, [x&255,x>>8])[0];\n\t};\n}\nvar Base64 = (function make_b64(){\n\tvar map = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\";\n\treturn {\n\t\tencode: function(input, utf8) {\n\t\t\tvar o = \"\";\n\t\t\tvar c1, c2, c3, e1, e2, e3, e4;\n\t\t\tfor(var i = 0; i < input.length; ) {\n\t\t\t\tc1 = input.charCodeAt(i++);\n\t\t\t\tc2 = input.charCodeAt(i++);\n\t\t\t\tc3 = input.charCodeAt(i++);\n\t\t\t\te1 = c1 >> 2;\n\t\t\t\te2 = (c1 & 3) << 4 | c2 >> 4;\n\t\t\t\te3 = (c2 & 15) << 2 | c3 >> 6;\n\t\t\t\te4 = c3 & 63;\n\t\t\t\tif (isNaN(c2)) { e3 = e4 = 64; }\n\t\t\t\telse if (isNaN(c3)) { e4 = 64; }\n\t\t\t\to += map.charAt(e1) + map.charAt(e2) + map.charAt(e3) + map.charAt(e4);\n\t\t\t}\n\t\t\treturn o;\n\t\t},\n\t\tdecode: function b64_decode(input, utf8) {\n\t\t\tvar o = \"\";\n\t\t\tvar c1, c2, c3;\n\t\t\tvar e1, e2, e3, e4;\n\t\t\tinput = input.replace(/[^A-Za-z0-9\\+\\/\\=]/g, \"\");\n\t\t\tfor(var i = 0; i < input.length;) {\n\t\t\t\te1 = map.indexOf(input.charAt(i++));\n\t\t\t\te2 = map.indexOf(input.charAt(i++));\n\t\t\t\te3 = map.indexOf(input.charAt(i++));\n\t\t\t\te4 = map.indexOf(input.charAt(i++));\n\t\t\t\tc1 = e1 << 2 | e2 >> 4;\n\t\t\t\tc2 = (e2 & 15) << 4 | e3 >> 2;\n\t\t\t\tc3 = (e3 & 3) << 6 | e4;\n\t\t\t\to += String.fromCharCode(c1);\n\t\t\t\tif (e3 != 64) { o += String.fromCharCode(c2); }\n\t\t\t\tif (e4 != 64) { o += String.fromCharCode(c3); }\n\t\t\t}\n\t\t\treturn o;\n\t\t}\n\t};\n})();\nvar has_buf = (typeof Buffer !== 'undefined');\n\nfunction new_raw_buf(len) {\n\t/* jshint -W056 */\n\treturn new (has_buf ? Buffer : Array)(len);\n\t/* jshint +W056 */\n}\n\nfunction s2a(s) {\n\tif(has_buf) return new Buffer(s, \"binary\");\n\treturn s.split(\"\").map(function(x){ return x.charCodeAt(0) & 0xff; });\n}\n\nvar bconcat = function(bufs) { return [].concat.apply([], bufs); };\n\nvar chr0 = /\\u0000/g, chr1 = /[\\u0001-\\u0006]/;\n/* ssf.js (C) 2013-2014 SheetJS -- http://sheetjs.com */\n/*jshint -W041 */\nvar SSF = {};\nvar make_ssf = function make_ssf(SSF){\nSSF.version = '0.8.1';\nfunction _strrev(x) { var o = \"\", i = x.length-1; while(i>=0) o += x.charAt(i--); return o; }\nfunction fill(c,l) { var o = \"\"; while(o.length < l) o+=c; return o; }\nfunction pad0(v,d){var t=\"\"+v; return t.length>=d?t:fill('0',d-t.length)+t;}\nfunction pad_(v,d){var t=\"\"+v;return t.length>=d?t:fill(' ',d-t.length)+t;}\nfunction rpad_(v,d){var t=\"\"+v; return t.length>=d?t:t+fill(' ',d-t.length);}\nfunction pad0r1(v,d){var t=\"\"+Math.round(v); return t.length>=d?t:fill('0',d-t.length)+t;}\nfunction pad0r2(v,d){var t=\"\"+v; return t.length>=d?t:fill('0',d-t.length)+t;}\nvar p2_32 = Math.pow(2,32);\nfunction pad0r(v,d){if(v>p2_32||v<-p2_32) return pad0r1(v,d); var i = Math.round(v); return pad0r2(i,d); }\nfunction 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; }\n/* Options */\nvar opts_fmt = [\n\t[\"date1904\", 0],\n\t[\"output\", \"\"],\n\t[\"WTF\", false]\n];\nfunction fixopts(o){\n\tfor(var y = 0; y != opts_fmt.length; ++y) if(o[opts_fmt[y][0]]===undefined) o[opts_fmt[y][0]]=opts_fmt[y][1];\n}\nSSF.opts = opts_fmt;\nvar table_fmt = {\n\t0: 'General',\n\t1: '0',\n\t2: '0.00',\n\t3: '#,##0',\n\t4: '#,##0.00',\n\t9: '0%',\n\t10: '0.00%',\n\t11: '0.00E+00',\n\t12: '# ?/?',\n\t13: '# ??/??',\n\t14: 'm/d/yy',\n\t15: 'd-mmm-yy',\n\t16: 'd-mmm',\n\t17: 'mmm-yy',\n\t18: 'h:mm AM/PM',\n\t19: 'h:mm:ss AM/PM',\n\t20: 'h:mm',\n\t21: 'h:mm:ss',\n\t22: 'm/d/yy h:mm',\n\t37: '#,##0 ;(#,##0)',\n\t38: '#,##0 ;[Red](#,##0)',\n\t39: '#,##0.00;(#,##0.00)',\n\t40: '#,##0.00;[Red](#,##0.00)',\n\t45: 'mm:ss',\n\t46: '[h]:mm:ss',\n\t47: 'mmss.0',\n\t48: '##0.0E+0',\n\t49: '@',\n\t56: '\"上午/下午 \"hh\"時\"mm\"分\"ss\"秒 \"',\n\t65535: 'General'\n};\nvar days = [\n\t['Sun', 'Sunday'],\n\t['Mon', 'Monday'],\n\t['Tue', 'Tuesday'],\n\t['Wed', 'Wednesday'],\n\t['Thu', 'Thursday'],\n\t['Fri', 'Friday'],\n\t['Sat', 'Saturday']\n];\nvar months = [\n\t['J', 'Jan', 'January'],\n\t['F', 'Feb', 'February'],\n\t['M', 'Mar', 'March'],\n\t['A', 'Apr', 'April'],\n\t['M', 'May', 'May'],\n\t['J', 'Jun', 'June'],\n\t['J', 'Jul', 'July'],\n\t['A', 'Aug', 'August'],\n\t['S', 'Sep', 'September'],\n\t['O', 'Oct', 'October'],\n\t['N', 'Nov', 'November'],\n\t['D', 'Dec', 'December']\n];\nfunction frac(x, D, mixed) {\n\tvar sgn = x < 0 ? -1 : 1;\n\tvar B = x * sgn;\n\tvar P_2 = 0, P_1 = 1, P = 0;\n\tvar Q_2 = 1, Q_1 = 0, Q = 0;\n\tvar A = Math.floor(B);\n\twhile(Q_1 < D) {\n\t\tA = Math.floor(B);\n\t\tP = A * P_1 + P_2;\n\t\tQ = A * Q_1 + Q_2;\n\t\tif((B - A) < 0.0000000005) break;\n\t\tB = 1 / (B - A);\n\t\tP_2 = P_1; P_1 = P;\n\t\tQ_2 = Q_1; Q_1 = Q;\n\t}\n\tif(Q > D) { Q = Q_1; P = P_1; }\n\tif(Q > D) { Q = Q_2; P = P_2; }\n\tif(!mixed) return [0, sgn * P, Q];\n\tif(Q===0) throw \"Unexpected state: \"+P+\" \"+P_1+\" \"+P_2+\" \"+Q+\" \"+Q_1+\" \"+Q_2;\n\tvar q = Math.floor(sgn * P/Q);\n\treturn [q, sgn*P - q*Q, Q];\n}\nfunction general_fmt_int(v, opts) { return \"\"+v; }\nSSF._general_int = general_fmt_int;\nvar general_fmt_num = (function make_general_fmt_num() {\nvar gnr1 = /\\.(\\d*[1-9])0+$/, gnr2 = /\\.0*$/, gnr4 = /\\.(\\d*[1-9])0+/, gnr5 = /\\.0*[Ee]/, gnr6 = /(E[+-])(\\d)$/;\nfunction gfn2(v) {\n\tvar w = (v<0?12:11);\n\tvar o = gfn5(v.toFixed(12)); if(o.length <= w) return o;\n\to = v.toPrecision(10); if(o.length <= w) return o;\n\treturn v.toExponential(5);\n}\nfunction gfn3(v) {\n\tvar o = v.toFixed(11).replace(gnr1,\".$1\");\n\tif(o.length > (v<0?12:11)) o = v.toPrecision(6);\n\treturn o;\n}\nfunction gfn4(o) {\n\tfor(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\");\n\treturn o;\n}\nfunction gfn5(o) {\n\t//for(var i = 0; i != o.length; ++i) if(o.charCodeAt(i) === 46) return o.replace(gnr2,\"\").replace(gnr1,\".$1\");\n\t//return o;\n\treturn o.indexOf(\".\") > -1 ? o.replace(gnr2,\"\").replace(gnr1,\".$1\") : o;\n}\nreturn function general_fmt_num(v, opts) {\n\tvar V = Math.floor(Math.log(Math.abs(v))*Math.LOG10E), o;\n\tif(V >= -4 && V <= -1) o = v.toPrecision(10+V);\n\telse if(Math.abs(V) <= 9) o = gfn2(v);\n\telse if(V === 10) o = v.toFixed(10).substr(0,12);\n\telse o = gfn3(v);\n\treturn gfn5(gfn4(o));\n};})();\nSSF._general_num = general_fmt_num;\nfunction general_fmt(v, opts) {\n\tswitch(typeof v) {\n\t\tcase 'string': return v;\n\t\tcase 'boolean': return v ? \"TRUE\" : \"FALSE\";\n\t\tcase 'number': return (v|0) === v ? general_fmt_int(v, opts) : general_fmt_num(v, opts);\n\t}\n\tthrow new Error(\"unsupported value in General format: \" + v);\n}\nSSF._general = general_fmt;\nfunction fix_hijri(date, o) { return 0; }\nfunction parse_date_code(v,opts,b2) {\n\tif(v > 2958465 || v < 0) return null;\n\tvar date = (v|0), time = Math.floor(86400 * (v - date)), dow=0;\n\tvar dout=[];\n\tvar out={D:date, T:time, u:86400*(v-date)-time,y:0,m:0,d:0,H:0,M:0,S:0,q:0};\n\tif(Math.abs(out.u) < 1e-6) out.u = 0;\n\tfixopts(opts != null ? opts : (opts=[]));\n\tif(opts.date1904) date += 1462;\n\tif(out.u > 0.999) {\n\t\tout.u = 0;\n\t\tif(++time == 86400) { time = 0; ++date; }\n\t}\n\tif(date === 60) {dout = b2 ? [1317,10,29] : [1900,2,29]; dow=3;}\n\telse if(date === 0) {dout = b2 ? [1317,8,29] : [1900,1,0]; dow=6;}\n\telse {\n\t\tif(date > 60) --date;\n\t\t/* 1 = Jan 1 1900 */\n\t\tvar d = new Date(1900,0,1);\n\t\td.setDate(d.getDate() + date - 1);\n\t\tdout = [d.getFullYear(), d.getMonth()+1,d.getDate()];\n\t\tdow = d.getDay();\n\t\tif(date < 60) dow = (dow + 6) % 7;\n\t\tif(b2) dow = fix_hijri(d, dout);\n\t}\n\tout.y = dout[0]; out.m = dout[1]; out.d = dout[2];\n\tout.S = time % 60; time = Math.floor(time / 60);\n\tout.M = time % 60; time = Math.floor(time / 60);\n\tout.H = time;\n\tout.q = dow;\n\treturn out;\n}\nSSF.parse_date_code = parse_date_code;\n/*jshint -W086 */\nfunction write_date(type, fmt, val, ss0) {\n\tvar o=\"\", ss=0, tt=0, y = val.y, out, outl = 0;\n\tswitch(type) {\n\t\tcase 98: /* 'b' buddhist year */\n\t\t\ty = val.y + 543;\n\t\t\t/* falls through */\n\t\tcase 121: /* 'y' year */\n\t\tswitch(fmt.length) {\n\t\t\tcase 1: case 2: out = y % 100; outl = 2; break;\n\t\t\tdefault: out = y % 10000; outl = 4; break;\n\t\t} break;\n\t\tcase 109: /* 'm' month */\n\t\tswitch(fmt.length) {\n\t\t\tcase 1: case 2: out = val.m; outl = fmt.length; break;\n\t\t\tcase 3: return months[val.m-1][1];\n\t\t\tcase 5: return months[val.m-1][0];\n\t\t\tdefault: return months[val.m-1][2];\n\t\t} break;\n\t\tcase 100: /* 'd' day */\n\t\tswitch(fmt.length) {\n\t\t\tcase 1: case 2: out = val.d; outl = fmt.length; break;\n\t\t\tcase 3: return days[val.q][0];\n\t\t\tdefault: return days[val.q][1];\n\t\t} break;\n\t\tcase 104: /* 'h' 12-hour */\n\t\tswitch(fmt.length) {\n\t\t\tcase 1: case 2: out = 1+(val.H+11)%12; outl = fmt.length; break;\n\t\t\tdefault: throw 'bad hour format: ' + fmt;\n\t\t} break;\n\t\tcase 72: /* 'H' 24-hour */\n\t\tswitch(fmt.length) {\n\t\t\tcase 1: case 2: out = val.H; outl = fmt.length; break;\n\t\t\tdefault: throw 'bad hour format: ' + fmt;\n\t\t} break;\n\t\tcase 77: /* 'M' minutes */\n\t\tswitch(fmt.length) {\n\t\t\tcase 1: case 2: out = val.M; outl = fmt.length; break;\n\t\t\tdefault: throw 'bad minute format: ' + fmt;\n\t\t} break;\n\t\tcase 115: /* 's' seconds */\n\t\tif(val.u === 0) switch(fmt) {\n\t\t\tcase 's': case 'ss': return pad0(val.S, fmt.length);\n\t\t\tcase '.0': case '.00': case '.000':\n\t\t}\n\t\tswitch(fmt) {\n\t\t\tcase 's': case 'ss': case '.0': case '.00': case '.000':\n\t\t\t\tif(ss0 >= 2) tt = ss0 === 3 ? 1000 : 100;\n\t\t\t\telse tt = ss0 === 1 ? 10 : 1;\n\t\t\t\tss = Math.round((tt)*(val.S + val.u));\n\t\t\t\tif(ss >= 60*tt) ss = 0;\n\t\t\t\tif(fmt === 's') return ss === 0 ? \"0\" : \"\"+ss/tt;\n\t\t\t\to = pad0(ss,2 + ss0);\n\t\t\t\tif(fmt === 'ss') return o.substr(0,2);\n\t\t\t\treturn \".\" + o.substr(2,fmt.length-1);\n\t\t\tdefault: throw 'bad second format: ' + fmt;\n\t\t}\n\t\tcase 90: /* 'Z' absolute time */\n\t\tswitch(fmt) {\n\t\t\tcase '[h]': case '[hh]': out = val.D*24+val.H; break;\n\t\t\tcase '[m]': case '[mm]': out = (val.D*24+val.H)*60+val.M; break;\n\t\t\tcase '[s]': case '[ss]': out = ((val.D*24+val.H)*60+val.M)*60+Math.round(val.S+val.u); break;\n\t\t\tdefault: throw 'bad abstime format: ' + fmt;\n\t\t} outl = fmt.length === 3 ? 1 : 2; break;\n\t\tcase 101: /* 'e' era */\n\t\t\tout = y; outl = 1;\n\t}\n\tif(outl > 0) return pad0(out, outl); else return \"\";\n}\n/*jshint +W086 */\nfunction commaify(s) {\n\tif(s.length <= 3) return s;\n\tvar j = (s.length % 3), o = s.substr(0,j);\n\tfor(; j!=s.length; j+=3) o+=(o.length > 0 ? \",\" : \"\") + s.substr(j,3);\n\treturn o;\n}\nvar write_num = (function make_write_num(){\nvar pct1 = /%/g;\nfunction write_num_pct(type, fmt, val){\n\tvar sfmt = fmt.replace(pct1,\"\"), mul = fmt.length - sfmt.length;\n\treturn write_num(type, sfmt, val * Math.pow(10,2*mul)) + fill(\"%\",mul);\n}\nfunction write_num_cm(type, fmt, val){\n\tvar idx = fmt.length - 1;\n\twhile(fmt.charCodeAt(idx-1) === 44) --idx;\n\treturn write_num(type, fmt.substr(0,idx), val / Math.pow(10,3*(fmt.length-idx)));\n}\nfunction write_num_exp(fmt, val){\n\tvar o;\n\tvar idx = fmt.indexOf(\"E\") - fmt.indexOf(\".\") - 1;\n\tif(fmt.match(/^#+0.0E\\+0$/)) {\n\t\tvar period = fmt.indexOf(\".\"); if(period === -1) period=fmt.indexOf('E');\n\t\tvar ee = Math.floor(Math.log(Math.abs(val))*Math.LOG10E)%period;\n\t\tif(ee < 0) ee += period;\n\t\to = (val/Math.pow(10,ee)).toPrecision(idx+1+(period+ee)%period);\n\t\tif(o.indexOf(\"e\") === -1) {\n\t\t\tvar fakee = Math.floor(Math.log(Math.abs(val))*Math.LOG10E);\n\t\t\tif(o.indexOf(\".\") === -1) o = o[0] + \".\" + o.substr(1) + \"E+\" + (fakee - o.length+ee);\n\t\t\telse o += \"E+\" + (fakee - ee);\n\t\t\twhile(o.substr(0,2) === \"0.\") {\n\t\t\t\to = o[0] + o.substr(2,period) + \".\" + o.substr(2+period);\n\t\t\t\to = o.replace(/^0+([1-9])/,\"$1\").replace(/^0+\\./,\"0.\");\n\t\t\t}\n\t\t\to = o.replace(/\\+-/,\"-\");\n\t\t}\n\t\to = o.replace(/^([+-]?)(\\d*)\\.(\\d*)[Ee]/,function($$,$1,$2,$3) { return $1 + $2 + $3.substr(0,(period+ee)%period) + \".\" + $3.substr(ee) + \"E\"; });\n\t} else o = val.toExponential(idx);\n\tif(fmt.match(/E\\+00$/) && o.match(/e[+-]\\d$/)) o = o.substr(0,o.length-1) + \"0\" + o[o.length-1];\n\tif(fmt.match(/E\\-/) && o.match(/e\\+/)) o = o.replace(/e\\+/,\"e\");\n\treturn o.replace(\"e\",\"E\");\n}\nvar frac1 = /# (\\?+)( ?)\\/( ?)(\\d+)/;\nfunction write_num_f1(r, aval, sign) {\n\tvar den = parseInt(r[4]), rr = Math.round(aval * den), base = Math.floor(rr/den);\n\tvar myn = (rr - base*den), myd = den;\n\treturn 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));\n}\nfunction write_num_f2(r, aval, sign) {\n\treturn sign + (aval === 0 ? \"\" : \"\"+aval) + fill(\" \", r[1].length + 2 + r[4].length);\n}\nvar dec1 = /^#*0*\\.(0+)/;\nvar closeparen = /\\).*[0#]/;\nvar phone = /\\(###\\) ###\\\\?-####/;\nfunction hashq(str) {\n\tvar o = \"\", cc;\n\tfor(var i = 0; i != str.length; ++i) switch((cc=str.charCodeAt(i))) {\n\t\tcase 35: break;\n\t\tcase 63: o+= \" \"; break;\n\t\tcase 48: o+= \"0\"; break;\n\t\tdefault: o+= String.fromCharCode(cc);\n\t}\n\treturn o;\n}\nfunction rnd(val, d) { var dd = Math.pow(10,d); return \"\"+(Math.round(val * dd)/dd); }\nfunction dec(val, d) { return Math.round((val-Math.floor(val))*Math.pow(10,d)); }\nfunction flr(val) { if(val < 2147483647 && val > -2147483648) return \"\"+(val >= 0 ? (val|0) : (val-1|0)); return \"\"+Math.floor(val); }\nfunction write_num_flt(type, fmt, val) {\n\tif(type.charCodeAt(0) === 40 && !fmt.match(closeparen)) {\n\t\tvar ffmt = fmt.replace(/\\( */,\"\").replace(/ \\)/,\"\").replace(/\\)/,\"\");\n\t\tif(val >= 0) return write_num_flt('n', ffmt, val);\n\t\treturn '(' + write_num_flt('n', ffmt, -val) + ')';\n\t}\n\tif(fmt.charCodeAt(fmt.length - 1) === 44) return write_num_cm(type, fmt, val);\n\tif(fmt.indexOf('%') !== -1) return write_num_pct(type, fmt, val);\n\tif(fmt.indexOf('E') !== -1) return write_num_exp(fmt, val);\n\tif(fmt.charCodeAt(0) === 36) return \"$\"+write_num_flt(type,fmt.substr(fmt[1]==' '?2:1),val);\n\tvar o, oo;\n\tvar r, ri, ff, aval = Math.abs(val), sign = val < 0 ? \"-\" : \"\";\n\tif(fmt.match(/^00+$/)) return sign + pad0r(aval,fmt.length);\n\tif(fmt.match(/^[#?]+$/)) {\n\t\to = pad0r(val,0); if(o === \"0\") o = \"\";\n\t\treturn o.length > fmt.length ? o : hashq(fmt.substr(0,fmt.length-o.length)) + o;\n\t}\n\tif((r = fmt.match(frac1)) !== null) return write_num_f1(r, aval, sign);\n\tif(fmt.match(/^#+0+$/) !== null) return sign + pad0r(aval,fmt.length - fmt.indexOf(\"0\"));\n\tif((r = fmt.match(dec1)) !== null) {\n\t\to = 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); });\n\t\treturn fmt.indexOf(\"0.\") !== -1 ? o : o.replace(/^0\\./,\".\");\n\t}\n\tfmt = fmt.replace(/^#+([0.])/, \"$1\");\n\tif((r = fmt.match(/^(0*)\\.(#*)$/)) !== null) {\n\t\treturn sign + rnd(aval, r[2].length).replace(/\\.(\\d*[1-9])0*$/,\".$1\").replace(/^(-?\\d*)$/,\"$1.\").replace(/^0\\./,r[1].length?\"0.\":\".\");\n\t}\n\tif((r = fmt.match(/^#,##0(\\.?)$/)) !== null) return sign + commaify(pad0r(aval,0));\n\tif((r = fmt.match(/^#,##0\\.([#0]*0)$/)) !== null) {\n\t\treturn val < 0 ? \"-\" + write_num_flt(type, fmt, -val) : commaify(\"\"+(Math.floor(val))) + \".\" + pad0(dec(val, r[1].length),r[1].length);\n\t}\n\tif((r = fmt.match(/^#,#*,#0/)) !== null) return write_num_flt(type,fmt.replace(/^#,#*,/,\"\"),val);\n\tif((r = fmt.match(/^([0#]+)(\\\\?-([0#]+))+$/)) !== null) {\n\t\to = _strrev(write_num_flt(type, fmt.replace(/[\\\\-]/g,\"\"), val));\n\t\tri = 0;\n\t\treturn _strrev(_strrev(fmt.replace(/\\\\/g,\"\")).replace(/[0#]/g,function(x){return ri<o.length?o[ri++]:x==='0'?'0':\"\";}));\n\t}\n\tif(fmt.match(phone) !== null) {\n\t\to = write_num_flt(type, \"##########\", val);\n\t\treturn \"(\" + o.substr(0,3) + \") \" + o.substr(3, 3) + \"-\" + o.substr(6);\n\t}\n\tvar oa = \"\";\n\tif((r = fmt.match(/^([#0?]+)( ?)\\/( ?)([#0?]+)/)) !== null) {\n\t\tri = Math.min(r[4].length,7);\n\t\tff = frac(aval, Math.pow(10,ri)-1, false);\n\t\to = \"\" + sign;\n\t\toa = write_num(\"n\", r[1], ff[1]);\n\t\tif(oa[oa.length-1] == \" \") oa = oa.substr(0,oa.length-1) + \"0\";\n\t\to += oa + r[2] + \"/\" + r[3];\n\t\toa = rpad_(ff[2],ri);\n\t\tif(oa.length < r[4].length) oa = hashq(r[4].substr(r[4].length-oa.length)) + oa;\n\t\to += oa;\n\t\treturn o;\n\t}\n\tif((r = fmt.match(/^# ([#0?]+)( ?)\\/( ?)([#0?]+)/)) !== null) {\n\t\tri = Math.min(Math.max(r[1].length, r[4].length),7);\n\t\tff = frac(aval, Math.pow(10,ri)-1, true);\n\t\treturn 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));\n\t}\n\tif((r = fmt.match(/^[#0?]+$/)) !== null) {\n\t\to = pad0r(val, 0);\n\t\tif(fmt.length <= o.length) return o;\n\t\treturn hashq(fmt.substr(0,fmt.length-o.length)) + o;\n\t}\n if((r = fmt.match(/^([#0?]+)\\.([#0]+)$/)) !== null) {\n\t\to = \"\" + val.toFixed(Math.min(r[2].length,10)).replace(/([^0])0+$/,\"$1\");\n\t\tri = o.indexOf(\".\");\n\t\tvar lres = fmt.indexOf(\".\") - ri, rres = fmt.length - o.length - lres;\n\t\treturn hashq(fmt.substr(0,lres) + o + fmt.substr(fmt.length-rres));\n\t}\n\tif((r = fmt.match(/^00,000\\.([#0]*0)$/)) !== null) {\n\t\tri = dec(val, r[1].length);\n\t\treturn 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);\n\t}\n\tswitch(fmt) {\n\t\tcase \"#,###\": var x = commaify(pad0r(aval,0)); return x !== \"0\" ? sign + x : \"\";\n\t\tdefault:\n\t}\n\tthrow new Error(\"unsupported format |\" + fmt + \"|\");\n}\nfunction write_num_cm2(type, fmt, val){\n\tvar idx = fmt.length - 1;\n\twhile(fmt.charCodeAt(idx-1) === 44) --idx;\n\treturn write_num(type, fmt.substr(0,idx), val / Math.pow(10,3*(fmt.length-idx)));\n}\nfunction write_num_pct2(type, fmt, val){\n\tvar sfmt = fmt.replace(pct1,\"\"), mul = fmt.length - sfmt.length;\n\treturn write_num(type, sfmt, val * Math.pow(10,2*mul)) + fill(\"%\",mul);\n}\nfunction write_num_exp2(fmt, val){\n\tvar o;\n\tvar idx = fmt.indexOf(\"E\") - fmt.indexOf(\".\") - 1;\n\tif(fmt.match(/^#+0.0E\\+0$/)) {\n\t\tvar period = fmt.indexOf(\".\"); if(period === -1) period=fmt.indexOf('E');\n\t\tvar ee = Math.floor(Math.log(Math.abs(val))*Math.LOG10E)%period;\n\t\tif(ee < 0) ee += period;\n\t\to = (val/Math.pow(10,ee)).toPrecision(idx+1+(period+ee)%period);\n\t\tif(!o.match(/[Ee]/)) {\n\t\t\tvar fakee = Math.floor(Math.log(Math.abs(val))*Math.LOG10E);\n\t\t\tif(o.indexOf(\".\") === -1) o = o[0] + \".\" + o.substr(1) + \"E+\" + (fakee - o.length+ee);\n\t\t\telse o += \"E+\" + (fakee - ee);\n\t\t\to = o.replace(/\\+-/,\"-\");\n\t\t}\n\t\to = o.replace(/^([+-]?)(\\d*)\\.(\\d*)[Ee]/,function($$,$1,$2,$3) { return $1 + $2 + $3.substr(0,(period+ee)%period) + \".\" + $3.substr(ee) + \"E\"; });\n\t} else o = val.toExponential(idx);\n\tif(fmt.match(/E\\+00$/) && o.match(/e[+-]\\d$/)) o = o.substr(0,o.length-1) + \"0\" + o[o.length-1];\n\tif(fmt.match(/E\\-/) && o.match(/e\\+/)) o = o.replace(/e\\+/,\"e\");\n\treturn o.replace(\"e\",\"E\");\n}\nfunction write_num_int(type, fmt, val) {\n\tif(type.charCodeAt(0) === 40 && !fmt.match(closeparen)) {\n\t\tvar ffmt = fmt.replace(/\\( */,\"\").replace(/ \\)/,\"\").replace(/\\)/,\"\");\n\t\tif(val >= 0) return write_num_int('n', ffmt, val);\n\t\treturn '(' + write_num_int('n', ffmt, -val) + ')';\n\t}\n\tif(fmt.charCodeAt(fmt.length - 1) === 44) return write_num_cm2(type, fmt, val);\n\tif(fmt.indexOf('%') !== -1) return write_num_pct2(type, fmt, val);\n\tif(fmt.indexOf('E') !== -1) return write_num_exp2(fmt, val);\n\tif(fmt.charCodeAt(0) === 36) return \"$\"+write_num_int(type,fmt.substr(fmt[1]==' '?2:1),val);\n\tvar o;\n\tvar r, ri, ff, aval = Math.abs(val), sign = val < 0 ? \"-\" : \"\";\n\tif(fmt.match(/^00+$/)) return sign + pad0(aval,fmt.length);\n\tif(fmt.match(/^[#?]+$/)) {\n\t\to = (\"\"+val); if(val === 0) o = \"\";\n\t\treturn o.length > fmt.length ? o : hashq(fmt.substr(0,fmt.length-o.length)) + o;\n\t}\n\tif((r = fmt.match(frac1)) !== null) return write_num_f2(r, aval, sign);\n\tif(fmt.match(/^#+0+$/) !== null) return sign + pad0(aval,fmt.length - fmt.indexOf(\"0\"));\n\tif((r = fmt.match(dec1)) !== null) {\n\t\to = (\"\"+val).replace(/^([^\\.]+)$/,\"$1.\"+r[1]).replace(/\\.$/,\".\"+r[1]).replace(/\\.(\\d*)$/,function($$, $1) { return \".\" + $1 + fill(\"0\", r[1].length-$1.length); });\n\t\treturn fmt.indexOf(\"0.\") !== -1 ? o : o.replace(/^0\\./,\".\");\n\t}\n\tfmt = fmt.replace(/^#+([0.])/, \"$1\");\n\tif((r = fmt.match(/^(0*)\\.(#*)$/)) !== null) {\n\t\treturn sign + (\"\"+aval).replace(/\\.(\\d*[1-9])0*$/,\".$1\").replace(/^(-?\\d*)$/,\"$1.\").replace(/^0\\./,r[1].length?\"0.\":\".\");\n\t}\n\tif((r = fmt.match(/^#,##0(\\.?)$/)) !== null) return sign + commaify((\"\"+aval));\n\tif((r = fmt.match(/^#,##0\\.([#0]*0)$/)) !== null) {\n\t\treturn val < 0 ? \"-\" + write_num_int(type, fmt, -val) : commaify((\"\"+val)) + \".\" + fill('0',r[1].length);\n\t}\n\tif((r = fmt.match(/^#,#*,#0/)) !== null) return write_num_int(type,fmt.replace(/^#,#*,/,\"\"),val);\n\tif((r = fmt.match(/^([0#]+)(\\\\?-([0#]+))+$/)) !== null) {\n\t\to = _strrev(write_num_int(type, fmt.replace(/[\\\\-]/g,\"\"), val));\n\t\tri = 0;\n\t\treturn _strrev(_strrev(fmt.replace(/\\\\/g,\"\")).replace(/[0#]/g,function(x){return ri<o.length?o[ri++]:x==='0'?'0':\"\";}));\n\t}\n\tif(fmt.match(phone) !== null) {\n\t\to = write_num_int(type, \"##########\", val);\n\t\treturn \"(\" + o.substr(0,3) + \") \" + o.substr(3, 3) + \"-\" + o.substr(6);\n\t}\n\tvar oa = \"\";\n\tif((r = fmt.match(/^([#0?]+)( ?)\\/( ?)([#0?]+)/)) !== null) {\n\t\tri = Math.min(r[4].length,7);\n\t\tff = frac(aval, Math.pow(10,ri)-1, false);\n\t\to = \"\" + sign;\n\t\toa = write_num(\"n\", r[1], ff[1]);\n\t\tif(oa[oa.length-1] == \" \") oa = oa.substr(0,oa.length-1) + \"0\";\n\t\to += oa + r[2] + \"/\" + r[3];\n\t\toa = rpad_(ff[2],ri);\n\t\tif(oa.length < r[4].length) oa = hashq(r[4].substr(r[4].length-oa.length)) + oa;\n\t\to += oa;\n\t\treturn o;\n\t}\n\tif((r = fmt.match(/^# ([#0?]+)( ?)\\/( ?)([#0?]+)/)) !== null) {\n\t\tri = Math.min(Math.max(r[1].length, r[4].length),7);\n\t\tff = frac(aval, Math.pow(10,ri)-1, true);\n\t\treturn 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));\n\t}\n\tif((r = fmt.match(/^[#0?]+$/)) !== null) {\n\t\to = \"\" + val;\n\t\tif(fmt.length <= o.length) return o;\n\t\treturn hashq(fmt.substr(0,fmt.length-o.length)) + o;\n\t}\n\tif((r = fmt.match(/^([#0]+)\\.([#0]+)$/)) !== null) {\n\t\to = \"\" + val.toFixed(Math.min(r[2].length,10)).replace(/([^0])0+$/,\"$1\");\n\t\tri = o.indexOf(\".\");\n\t\tvar lres = fmt.indexOf(\".\") - ri, rres = fmt.length - o.length - lres;\n\t\treturn hashq(fmt.substr(0,lres) + o + fmt.substr(fmt.length-rres));\n\t}\n\tif((r = fmt.match(/^00,000\\.([#0]*0)$/)) !== null) {\n\t\treturn 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);\n\t}\n\tswitch(fmt) {\n\t\tcase \"#,###\": var x = commaify(\"\"+aval); return x !== \"0\" ? sign + x : \"\";\n\t\tdefault:\n\t}\n\tthrow new Error(\"unsupported format |\" + fmt + \"|\");\n}\nreturn function write_num(type, fmt, val) {\n\treturn (val|0) === val ? write_num_int(type, fmt, val) : write_num_flt(type, fmt, val);\n};})();\nfunction split_fmt(fmt) {\n\tvar out = [];\n\tvar in_str = false, cc;\n\tfor(var i = 0, j = 0; i < fmt.length; ++i) switch((cc=fmt.charCodeAt(i))) {\n\t\tcase 34: /* '\"' */\n\t\t\tin_str = !in_str; break;\n\t\tcase 95: case 42: case 92: /* '_' '*' '\\\\' */\n\t\t\t++i; break;\n\t\tcase 59: /* ';' */\n\t\t\tout[out.length] = fmt.substr(j,i-j);\n\t\t\tj = i+1;\n\t}\n\tout[out.length] = fmt.substr(j);\n\tif(in_str === true) throw new Error(\"Format |\" + fmt + \"| unterminated string \");\n\treturn out;\n}\nSSF._split = split_fmt;\nvar abstime = /\\[[HhMmSs]*\\]/;\nfunction eval_fmt(fmt, v, opts, flen) {\n\tvar out = [], o = \"\", i = 0, c = \"\", lst='t', q, dt, j, cc;\n\tvar hr='H';\n\t/* Tokenize */\n\twhile(i < fmt.length) {\n\t\tswitch((c = fmt[i])) {\n\t\t\tcase 'G': /* General */\n\t\t\t\tif(!isgeneral(fmt, i)) throw new Error('unrecognized character ' + c + ' in ' +fmt);\n\t\t\t\tout[out.length] = {t:'G', v:'General'}; i+=7; break;\n\t\t\tcase '\"': /* Literal text */\n\t\t\t\tfor(o=\"\";(cc=fmt.charCodeAt(++i)) !== 34 && i < fmt.length;) o += String.fromCharCode(cc);\n\t\t\t\tout[out.length] = {t:'t', v:o}; ++i; break;\n\t\t\tcase '\\\\': var w = fmt[++i], t = (w === \"(\" || w === \")\") ? w : 't';\n\t\t\t\tout[out.length] = {t:t, v:w}; ++i; break;\n\t\t\tcase '_': out[out.length] = {t:'t', v:\" \"}; i+=2; break;\n\t\t\tcase '@': /* Text Placeholder */\n\t\t\t\tout[out.length] = {t:'T', v:v}; ++i; break;\n\t\t\tcase 'B': case 'b':\n\t\t\t\tif(fmt[i+1] === \"1\" || fmt[i+1] === \"2\") {\n if(dt==null) { dt=parse_date_code(v, opts, fmt[i+1] === \"2\"); if(dt==null) return \"\"; }\n\t\t\t\t\tout[out.length] = {t:'X', v:fmt.substr(i,2)}; lst = c; i+=2; break;\n\t\t\t\t}\n\t\t\t\t/* falls through */\n\t\t\tcase 'M': case 'D': case 'Y': case 'H': case 'S': case 'E':\n\t\t\t\tc = c.toLowerCase();\n\t\t\t\t/* falls through */\n\t\t\tcase 'm': case 'd': case 'y': case 'h': case 's': case 'e': case 'g':\n\t\t\t\tif(v < 0) return \"\";\n\t\t\t\tif(dt==null) { dt=parse_date_code(v, opts); if(dt==null) return \"\"; }\n\t\t\t\to = c; while(++i<fmt.length && fmt[i].toLowerCase() === c) o+=c;\n\t\t\t\tif(c === 'm' && lst.toLowerCase() === 'h') c = 'M'; /* m = minute */\n\t\t\t\tif(c === 'h') c = hr;\n\t\t\t\tout[out.length] = {t:c, v:o}; lst = c; break;\n\t\t\tcase 'A':\n\t\t\t\tq={t:c, v:\"A\"};\n\t\t\t\tif(dt==null) dt=parse_date_code(v, opts);\n if(fmt.substr(i, 3) === \"A/P\") { if(dt!=null) q.v = dt.H >= 12 ? \"P\" : \"A\"; q.t = 'T'; hr='h';i+=3;}\n 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'; }\n\t\t\t\telse { q.t = \"t\"; ++i; }\n\t\t\t\tif(dt==null && q.t === 'T') return \"\";\n\t\t\t\tout[out.length] = q; lst = c; break;\n\t\t\tcase '[':\n\t\t\t\to = c;\n\t\t\t\twhile(fmt[i++] !== ']' && i < fmt.length) o += fmt[i];\n\t\t\t\tif(o.substr(-1) !== ']') throw 'unterminated \"[\" block: |' + o + '|';\n\t\t\t\tif(o.match(abstime)) {\n\t\t\t\t\tif(dt==null) { dt=parse_date_code(v, opts); if(dt==null) return \"\"; }\n\t\t\t\t\tout[out.length] = {t:'Z', v:o.toLowerCase()};\n\t\t\t\t} else { o=\"\"; }\n\t\t\t\tbreak;\n\t\t\t/* Numbers */\n\t\t\tcase '.':\n\t\t\t\tif(dt != null) {\n\t\t\t\t\to = c; while((c=fmt[++i]) === \"0\") o += c;\n\t\t\t\t\tout[out.length] = {t:'s', v:o}; break;\n\t\t\t\t}\n\t\t\t\t/* falls through */\n\t\t\tcase '0': case '#':\n\t\t\t\to = c; while(\"0#?.,E+-%\".indexOf(c=fmt[++i]) > -1 || c=='\\\\' && fmt[i+1] == \"-\" && \"0#\".indexOf(fmt[i+2])>-1) o += c;\n\t\t\t\tout[out.length] = {t:'n', v:o}; break;\n\t\t\tcase '?':\n\t\t\t\to = c; while(fmt[++i] === c) o+=c;\n\t\t\t\tq={t:c, v:o}; out[out.length] = q; lst = c; break;\n\t\t\tcase '*': ++i; if(fmt[i] == ' ' || fmt[i] == '*') ++i; break; // **\n\t\t\tcase '(': case ')': out[out.length] = {t:(flen===1?'t':c), v:c}; ++i; break;\n\t\t\tcase '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9':\n\t\t\t\to = c; while(\"0123456789\".indexOf(fmt[++i]) > -1) o+=fmt[i];\n\t\t\t\tout[out.length] = {t:'D', v:o}; break;\n\t\t\tcase ' ': out[out.length] = {t:c, v:c}; ++i; break;\n\t\t\tdefault:\n\t\t\t\tif(\",$-+/():!^&'~{}<>=€acfijklopqrtuvwxz\".indexOf(c) === -1) throw new Error('unrecognized character ' + c + ' in ' + fmt);\n\t\t\t\tout[out.length] = {t:'t', v:c}; ++i; break;\n\t\t}\n\t}\n\tvar bt = 0, ss0 = 0, ssm;\n\tfor(i=out.length-1, lst='t'; i >= 0; --i) {\n\t\tswitch(out[i].t) {\n\t\t\tcase 'h': case 'H': out[i].t = hr; lst='h'; if(bt < 1) bt = 1; break;\n\t\t\tcase 's':\n\t\t\t\tif((ssm=out[i].v.match(/\\.0+$/))) ss0=Math.max(ss0,ssm[0].length-1);\n\t\t\t\tif(bt < 3) bt = 3;\n\t\t\t/* falls through */\n\t\t\tcase 'd': case 'y': case 'M': case 'e': lst=out[i].t; break;\n\t\t\tcase 'm': if(lst === 's') { out[i].t = 'M'; if(bt < 2) bt = 2; } break;\n\t\t\tcase 'X': if(out[i].v === \"B2\");\n\t\t\t\tbreak;\n\t\t\tcase 'Z':\n\t\t\t\tif(bt < 1 && out[i].v.match(/[Hh]/)) bt = 1;\n\t\t\t\tif(bt < 2 && out[i].v.match(/[Mm]/)) bt = 2;\n\t\t\t\tif(bt < 3 && out[i].v.match(/[Ss]/)) bt = 3;\n\t\t}\n\t}\n\tswitch(bt) {\n\t\tcase 0: break;\n\t\tcase 1:\n\t\t\tif(dt.u >= 0.5) { dt.u = 0; ++dt.S; }\n\t\t\tif(dt.S >= 60) { dt.S = 0; ++dt.M; }\n\t\t\tif(dt.M >= 60) { dt.M = 0; ++dt.H; }\n\t\t\tbreak;\n\t\tcase 2:\n\t\t\tif(dt.u >= 0.5) { dt.u = 0; ++dt.S; }\n\t\t\tif(dt.S >= 60) { dt.S = 0; ++dt.M; }\n\t\t\tbreak;\n\t}\n\t/* replace fields */\n\tvar nstr = \"\", jj;\n\tfor(i=0; i < out.length; ++i) {\n\t\tswitch(out[i].t) {\n\t\t\tcase 't': case 'T': case ' ': case 'D': break;\n\t\t\tcase 'X': out[i] = undefined; break;\n\t\t\tcase 'd': case 'm': case 'y': case 'h': case 'H': case 'M': case 's': case 'e': case 'b': case 'Z':\n\t\t\t\tout[i].v = write_date(out[i].t.charCodeAt(0), out[i].v, dt, ss0);\n\t\t\t\tout[i].t = 't'; break;\n\t\t\tcase 'n': case '(': case '?':\n\t\t\t\tjj = i+1;\n\t\t\t\twhile(out[jj] != null && (\n\t\t\t\t\t(c=out[jj].t) === \"?\" || c === \"D\" ||\n\t\t\t\t\t(c === \" \" || c === \"t\") && out[jj+1] != null && (out[jj+1].t === '?' || out[jj+1].t === \"t\" && out[jj+1].v === '/') ||\n\t\t\t\t\tout[i].t === '(' && (c === ' ' || c === 'n' || c === ')') ||\n\t\t\t\t\tc === 't' && (out[jj].v === '/' || '$€'.indexOf(out[jj].v) > -1 || out[jj].v === ' ' && out[jj+1] != null && out[jj+1].t == '?')\n\t\t\t\t)) {\n\t\t\t\t\tout[i].v += out[jj].v;\n\t\t\t\t\tout[jj] = undefined; ++jj;\n\t\t\t\t}\n\t\t\t\tnstr += out[i].v;\n\t\t\t\ti = jj-1; break;\n\t\t\tcase 'G': out[i].t = 't'; out[i].v = general_fmt(v,opts); break;\n\t\t}\n\t}\n\tvar vv = \"\", myv, ostr;\n\tif(nstr.length > 0) {\n\t\tmyv = (v<0&&nstr.charCodeAt(0) === 45 ? -v : v); /* '-' */\n\t\tostr = write_num(nstr.charCodeAt(0) === 40 ? '(' : 'n', nstr, myv); /* '(' */\n\t\tjj=ostr.length-1;\n\t\tvar decpt = out.length;\n\t\tfor(i=0; i < out.length; ++i) if(out[i] != null && out[i].v.indexOf(\".\") > -1) { decpt = i; break; }\n\t\tvar lasti=out.length;\n\t\tif(decpt === out.length && ostr.indexOf(\"E\") === -1) {\n\t\t\tfor(i=out.length-1; i>= 0;--i) {\n\t\t\t\tif(out[i] == null || 'n?('.indexOf(out[i].t) === -1) continue;\n\t\t\t\tif(jj>=out[i].v.length-1) { jj -= out[i].v.length; out[i].v = ostr.substr(jj+1, out[i].v.length); }\n\t\t\t\telse if(jj < 0) out[i].v = \"\";\n\t\t\t\telse { out[i].v = ostr.substr(0, jj+1); jj = -1; }\n\t\t\t\tout[i].t = 't';\n\t\t\t\tlasti = i;\n\t\t\t}\n\t\t\tif(jj>=0 && lasti<out.length) out[lasti].v = ostr.substr(0,jj+1) + out[lasti].v;\n\t\t}\n\t\telse if(decpt !== out.length && ostr.indexOf(\"E\") === -1) {\n\t\t\tjj = ostr.indexOf(\".\")-1;\n\t\t\tfor(i=decpt; i>= 0; --i) {\n\t\t\t\tif(out[i] == null || 'n?('.indexOf(out[i].t) === -1) continue;\n\t\t\t\tj=out[i].v.indexOf(\".\")>-1&&i===decpt?out[i].v.indexOf(\".\")-1:out[i].v.length-1;\n\t\t\t\tvv = out[i].v.substr(j+1);\n\t\t\t\tfor(; j>=0; --j) {\n\t\t\t\t\tif(jj>=0 && (out[i].v[j] === \"0\" || out[i].v[j] === \"#\")) vv = ostr[jj--] + vv;\n\t\t\t\t}\n\t\t\t\tout[i].v = vv;\n\t\t\t\tout[i].t = 't';\n\t\t\t\tlasti = i;\n\t\t\t}\n\t\t\tif(jj>=0 && lasti<out.length) out[lasti].v = ostr.substr(0,jj+1) + out[lasti].v;\n\t\t\tjj = ostr.indexOf(\".\")+1;\n\t\t\tfor(i=decpt; i<out.length; ++i) {\n\t\t\t\tif(out[i] == null || 'n?('.indexOf(out[i].t) === -1 && i !== decpt ) continue;\n\t\t\t\tj=out[i].v.indexOf(\".\")>-1&&i===decpt?out[i].v.indexOf(\".\")+1:0;\n\t\t\t\tvv = out[i].v.substr(0,j);\n\t\t\t\tfor(; j<out[i].v.length; ++j) {\n\t\t\t\t\tif(jj<ostr.length) vv += ostr[jj++];\n\t\t\t\t}\n\t\t\t\tout[i].v = vv;\n\t\t\t\tout[i].t = 't';\n\t\t\t\tlasti = i;\n\t\t\t}\n\t\t}\n\t}\n\tfor(i=0; i<out.length; ++i) if(out[i] != null && 'n(?'.indexOf(out[i].t)>-1) {\n\t\tmyv = (flen >1 && v < 0 && i>0 && out[i-1].v === \"-\" ? -v:v);\n\t\tout[i].v = write_num(out[i].t, out[i].v, myv);\n\t\tout[i].t = 't';\n\t}\n\tvar retval = \"\";\n\tfor(i=0; i !== out.length; ++i) if(out[i] != null) retval += out[i].v;\n\treturn retval;\n}\nSSF._eval = eval_fmt;\nvar cfregex = /\\[[=<>]/;\nvar cfregex2 = /\\[([=<>]*)(-?\\d+\\.?\\d*)\\]/;\nfunction chkcond(v, rr) {\n\tif(rr == null) return false;\n\tvar thresh = parseFloat(rr[2]);\n\tswitch(rr[1]) {\n\t\tcase \"=\": if(v == thresh) return true; break;\n\t\tcase \">\": if(v > thresh) return true; break;\n\t\tcase \"<\": if(v < thresh) return true; break;\n\t\tcase \"<>\": if(v != thresh) return true; break;\n\t\tcase \">=\": if(v >= thresh) return true; break;\n\t\tcase \"<=\": if(v <= thresh) return true; break;\n\t}\n\treturn false;\n}\nfunction choose_fmt(f, v) {\n\tvar fmt = split_fmt(f);\n\tvar l = fmt.length, lat = fmt[l-1].indexOf(\"@\");\n\tif(l<4 && lat>-1) --l;\n\tif(fmt.length > 4) throw \"cannot find right format for |\" + fmt + \"|\";\n\tif(typeof v !== \"number\") return [4, fmt.length === 4 || lat>-1?fmt[fmt.length-1]:\"@\"];\n\tswitch(fmt.length) {\n\t\tcase 1: fmt = lat>-1 ? [\"General\", \"General\", \"General\", fmt[0]] : [fmt[0], fmt[0], fmt[0], \"@\"]; break;\n\t\tcase 2: fmt = lat>-1 ? [fmt[0], fmt[0], fmt[0], fmt[1]] : [fmt[0], fmt[1], fmt[0], \"@\"]; break;\n\t\tcase 3: fmt = lat>-1 ? [fmt[0], fmt[1], fmt[0], fmt[2]] : [fmt[0], fmt[1], fmt[2], \"@\"]; break;\n\t\tcase 4: break;\n\t}\n\tvar ff = v > 0 ? fmt[0] : v < 0 ? fmt[1] : fmt[2];\n\tif(fmt[0].indexOf(\"[\") === -1 && fmt[1].indexOf(\"[\") === -1) return [l, ff];\n\tif(fmt[0].match(cfregex) != null || fmt[1].match(cfregex) != null) {\n\t\tvar m1 = fmt[0].match(cfregex2);\n\t\tvar m2 = fmt[1].match(cfregex2);\n\t\treturn chkcond(v, m1) ? [l, fmt[0]] : chkcond(v, m2) ? [l, fmt[1]] : [l, fmt[m1 != null && m2 != null ? 2 : 1]];\n\t}\n\treturn [l, ff];\n}\nfunction format(fmt,v,o) {\n\tfixopts(o != null ? o : (o=[]));\n\tvar sfmt = \"\";\n\tswitch(typeof fmt) {\n\t\tcase \"string\": sfmt = fmt; break;\n\t\tcase \"number\": sfmt = (o.table != null ? o.table : table_fmt)[fmt]; break;\n\t}\n\tif(isgeneral(sfmt,0)) return general_fmt(v, o);\n\tvar f = choose_fmt(sfmt, v);\n\tif(isgeneral(f[1])) return general_fmt(v, o);\n\tif(v === true) v = \"TRUE\"; else if(v === false) v = \"FALSE\";\n\telse if(v === \"\" || v == null) return \"\";\n\treturn eval_fmt(f[1], v, o, f[0]);\n}\nSSF._table = table_fmt;\nSSF.load = function load_entry(fmt, idx) { table_fmt[idx] = fmt; };\nSSF.format = format;\nSSF.get_table = function get_table() { return table_fmt; };\nSSF.load_table = function load_table(tbl) { for(var i=0; i!=0x0188; ++i) if(tbl[i] !== undefined) SSF.load(tbl[i], i); };\n};\nmake_ssf(SSF);\n/* map from xlml named formats to SSF TODO: localize */\nvar XLMLFormatMap = {\n\t\"General Number\": \"General\",\n\t\"General Date\": SSF._table[22],\n\t\"Long Date\": \"dddd, mmmm dd, yyyy\",\n\t\"Medium Date\": SSF._table[15],\n\t\"Short Date\": SSF._table[14],\n\t\"Long Time\": SSF._table[19],\n\t\"Medium Time\": SSF._table[18],\n\t\"Short Time\": SSF._table[20],\n\t\"Currency\": '\"$\"#,##0.00_);[Red]\\\\(\"$\"#,##0.00\\\\)',\n\t\"Fixed\": SSF._table[2],\n\t\"Standard\": SSF._table[4],\n\t\"Percent\": SSF._table[10],\n\t\"Scientific\": SSF._table[11],\n\t\"Yes/No\": '\"Yes\";\"Yes\";\"No\";@',\n\t\"True/False\": '\"True\";\"True\";\"False\";@',\n\t\"On/Off\": '\"Yes\";\"Yes\";\"No\";@'\n};\n\nvar DO_NOT_EXPORT_CFB = true;\n/* cfb.js (C) 2013-2014 SheetJS -- http://sheetjs.com */\n/* vim: set ts=2: */\n/*jshint eqnull:true */\n\n/* [MS-CFB] v20130118 */\nvar CFB = (function _CFB(){\nvar exports = {};\nexports.version = '0.10.2';\nfunction parse(file) {\nvar mver = 3; // major version\nvar ssz = 512; // sector size\nvar nmfs = 0; // number of mini FAT sectors\nvar ndfs = 0; // number of DIFAT sectors\nvar dir_start = 0; // first directory sector location\nvar minifat_start = 0; // first mini FAT sector location\nvar difat_start = 0; // first mini FAT sector location\n\nvar fat_addrs = []; // locations of FAT sectors\n\n/* [MS-CFB] 2.2 Compound File Header */\nvar blob = file.slice(0,512);\nprep_blob(blob, 0);\n\n/* major version */\nvar mv = check_get_mver(blob);\nmver = mv[0];\nswitch(mver) {\n\tcase 3: ssz = 512; break; case 4: ssz = 4096; break;\n\tdefault: throw \"Major Version: Expected 3 or 4 saw \" + mver;\n}\n\n/* reprocess header */\nif(ssz !== 512) { blob = file.slice(0,ssz); prep_blob(blob, 28 /* blob.l */); }\n/* Save header for final object */\nvar header = file.slice(0,ssz);\n\ncheck_shifts(blob, mver);\n\n// Number of Directory Sectors\nvar nds = blob.read_shift(4, 'i');\nif(mver === 3 && nds !== 0) throw '# Directory Sectors: Expected 0 saw ' + nds;\n\n// Number of FAT Sectors\n//var nfs = blob.read_shift(4, 'i');\nblob.l += 4;\n\n// First Directory Sector Location\ndir_start = blob.read_shift(4, 'i');\n\n// Transaction Signature\nblob.l += 4;\n\n// Mini Stream Cutoff Size\nblob.chk('00100000', 'Mini Stream Cutoff Size: ');\n\n// First Mini FAT Sector Location\nminifat_start = blob.read_shift(4, 'i');\n\n// Number of Mini FAT Sectors\nnmfs = blob.read_shift(4, 'i');\n\n// First DIFAT sector location\ndifat_start = blob.read_shift(4, 'i');\n\n// Number of DIFAT Sectors\nndfs = blob.read_shift(4, 'i');\n\n// Grab FAT Sector Locations\nfor(var q, j = 0; j < 109; ++j) { /* 109 = (512 - blob.l)>>>2; */\n\tq = blob.read_shift(4, 'i');\n\tif(q<0) break;\n\tfat_addrs[j] = q;\n}\n\n/** Break the file up into sectors */\nvar sectors = sectorify(file, ssz);\n\nsleuth_fat(difat_start, ndfs, sectors, ssz, fat_addrs);\n\n/** Chains */\nvar sector_list = make_sector_list(sectors, dir_start, fat_addrs, ssz);\n\nsector_list[dir_start].name = \"!Directory\";\nif(nmfs > 0 && minifat_start !== ENDOFCHAIN) sector_list[minifat_start].name = \"!MiniFAT\";\nsector_list[fat_addrs[0]].name = \"!FAT\";\nsector_list.fat_addrs = fat_addrs;\nsector_list.ssz = ssz;\n\n/* [MS-CFB] 2.6.1 Compound File Directory Entry */\nvar files = {}, Paths = [], FileIndex = [], FullPaths = [], FullPathDir = {};\nread_directory(dir_start, sector_list, sectors, Paths, nmfs, files, FileIndex);\n\nbuild_full_paths(FileIndex, FullPathDir, FullPaths, Paths);\n\nvar root_name = Paths.shift();\nPaths.root = root_name;\n\n/* [MS-CFB] 2.6.4 (Unicode 3.0.1 case conversion) */\nvar find_path = make_find_path(FullPaths, Paths, FileIndex, files, root_name);\n\nreturn {\n\traw: {header: header, sectors: sectors},\n\tFileIndex: FileIndex,\n\tFullPaths: FullPaths,\n\tFullPathDir: FullPathDir,\n\tfind: find_path\n};\n} // parse\n\n/* [MS-CFB] 2.2 Compound File Header -- read up to major version */\nfunction check_get_mver(blob) {\n\t// header signature 8\n\tblob.chk(HEADER_SIGNATURE, 'Header Signature: ');\n\n\t// clsid 16\n\tblob.chk(HEADER_CLSID, 'CLSID: ');\n\n\t// minor version 2\n\tvar mver = blob.read_shift(2, 'u');\n\n\treturn [blob.read_shift(2,'u'), mver];\n}\nfunction check_shifts(blob, mver) {\n\tvar shift = 0x09;\n\n\t// Byte Order\n\tblob.chk('feff', 'Byte Order: ');\n\n\t// Sector Shift\n\tswitch((shift = blob.read_shift(2))) {\n\t\tcase 0x09: if(mver !== 3) throw 'MajorVersion/SectorShift Mismatch'; break;\n\t\tcase 0x0c: if(mver !== 4) throw 'MajorVersion/SectorShift Mismatch'; break;\n\t\tdefault: throw 'Sector Shift: Expected 9 or 12 saw ' + shift;\n\t}\n\n\t// Mini Sector Shift\n\tblob.chk('0600', 'Mini Sector Shift: ');\n\n\t// Reserved\n\tblob.chk('000000000000', 'Reserved: ');\n}\n\n/** Break the file up into sectors */\nfunction sectorify(file, ssz) {\n\tvar nsectors = Math.ceil(file.length/ssz)-1;\n\tvar sectors = new Array(nsectors);\n\tfor(var i=1; i < nsectors; ++i) sectors[i-1] = file.slice(i*ssz,(i+1)*ssz);\n\tsectors[nsectors-1] = file.slice(nsectors*ssz);\n\treturn sectors;\n}\n\n/* [MS-CFB] 2.6.4 Red-Black Tree */\nfunction build_full_paths(FI, FPD, FP, Paths) {\n\tvar i = 0, L = 0, R = 0, C = 0, j = 0, pl = Paths.length;\n\tvar dad = new Array(pl), q = new Array(pl);\n\n\tfor(; i < pl; ++i) { dad[i]=q[i]=i; FP[i]=Paths[i]; }\n\n\tfor(; j < q.length; ++j) {\n\t\ti = q[j];\n\t\tL = FI[i].L; R = FI[i].R; C = FI[i].C;\n\t\tif(dad[i] === i) {\n\t\t\tif(L !== -1 /*NOSTREAM*/ && dad[L] !== L) dad[i] = dad[L];\n\t\t\tif(R !== -1 && dad[R] !== R) dad[i] = dad[R];\n\t\t}\n\t\tif(C !== -1 /*NOSTREAM*/) dad[C] = i;\n\t\tif(L !== -1) { dad[L] = dad[i]; q.push(L); }\n\t\tif(R !== -1) { dad[R] = dad[i]; q.push(R); }\n\t}\n\tfor(i=1; i !== pl; ++i) if(dad[i] === i) {\n\t\tif(R !== -1 /*NOSTREAM*/ && dad[R] !== R) dad[i] = dad[R];\n\t\telse if(L !== -1 && dad[L] !== L) dad[i] = dad[L];\n\t}\n\n\tfor(i=1; i < pl; ++i) {\n\t\tif(FI[i].type === 0 /* unknown */) continue;\n\t\tj = dad[i];\n\t\tif(j === 0) FP[i] = FP[0] + \"/\" + FP[i];\n\t\telse while(j !== 0) {\n\t\t\tFP[i] = FP[j] + \"/\" + FP[i];\n\t\t\tj = dad[j];\n\t\t}\n\t\tdad[i] = 0;\n\t}\n\n\tFP[0] += \"/\";\n\tfor(i=1; i < pl; ++i) {\n\t\tif(FI[i].type !== 2 /* stream */) FP[i] += \"/\";\n\t\tFPD[FP[i]] = FI[i];\n\t}\n}\n\n/* [MS-CFB] 2.6.4 */\nfunction make_find_path(FullPaths, Paths, FileIndex, files, root_name) {\n\tvar UCFullPaths = new Array(FullPaths.length);\n\tvar UCPaths = new Array(Paths.length), i;\n\tfor(i = 0; i < FullPaths.length; ++i) UCFullPaths[i] = FullPaths[i].toUpperCase().replace(chr0,'').replace(chr1,'!');\n\tfor(i = 0; i < Paths.length; ++i) UCPaths[i] = Paths[i].toUpperCase().replace(chr0,'').replace(chr1,'!');\n\treturn function find_path(path) {\n\t\tvar k;\n\t\tif(path.charCodeAt(0) === 47 /* \"/\" */) { k=true; path = root_name + path; }\n\t\telse k = path.indexOf(\"/\") !== -1;\n\t\tvar UCPath = path.toUpperCase().replace(chr0,'').replace(chr1,'!');\n\t\tvar w = k === true ? UCFullPaths.indexOf(UCPath) : UCPaths.indexOf(UCPath);\n\t\tif(w === -1) return null;\n\t\treturn k === true ? FileIndex[w] : files[Paths[w]];\n\t};\n}\n\n/** Chase down the rest of the DIFAT chain to build a comprehensive list\n DIFAT chains by storing the next sector number as the last 32 bytes */\nfunction sleuth_fat(idx, cnt, sectors, ssz, fat_addrs) {\n\tvar q;\n\tif(idx === ENDOFCHAIN) {\n\t\tif(cnt !== 0) throw \"DIFAT chain shorter than expected\";\n\t} else if(idx !== -1 /*FREESECT*/) {\n\t\tvar sector = sectors[idx], m = (ssz>>>2)-1;\n\t\tfor(var i = 0; i < m; ++i) {\n\t\t\tif((q = __readInt32LE(sector,i*4)) === ENDOFCHAIN) break;\n\t\t\tfat_addrs.push(q);\n\t\t}\n\t\tsleuth_fat(__readInt32LE(sector,ssz-4),cnt - 1, sectors, ssz, fat_addrs);\n\t}\n}\n\n/** Follow the linked list of sectors for a given starting point */\nfunction get_sector_list(sectors, start, fat_addrs, ssz, chkd) {\n\tvar sl = sectors.length;\n\tvar buf, buf_chain;\n\tif(!chkd) chkd = new Array(sl);\n\tvar modulus = ssz - 1, j, jj;\n\tbuf = [];\n\tbuf_chain = [];\n\tfor(j=start; j>=0;) {\n\t\tchkd[j] = true;\n\t\tbuf[buf.length] = j;\n\t\tbuf_chain.push(sectors[j]);\n\t\tvar addr = fat_addrs[Math.floor(j*4/ssz)];\n\t\tjj = ((j*4) & modulus);\n\t\tif(ssz < 4 + jj) throw \"FAT boundary crossed: \" + j + \" 4 \"+ssz;\n\t\tj = __readInt32LE(sectors[addr], jj);\n\t}\n\treturn {nodes: buf, data:__toBuffer([buf_chain])};\n}\n\n/** Chase down the sector linked lists */\nfunction make_sector_list(sectors, dir_start, fat_addrs, ssz) {\n\tvar sl = sectors.length, sector_list = new Array(sl);\n\tvar chkd = new Array(sl), buf, buf_chain;\n\tvar modulus = ssz - 1, i, j, k, jj;\n\tfor(i=0; i < sl; ++i) {\n\t\tbuf = [];\n\t\tk = (i + dir_start); if(k >= sl) k-=sl;\n\t\tif(chkd[k] === true) continue;\n\t\tbuf_chain = [];\n\t\tfor(j=k; j>=0;) {\n\t\t\tchkd[j] = true;\n\t\t\tbuf[buf.length] = j;\n\t\t\tbuf_chain.push(sectors[j]);\n\t\t\tvar addr = fat_addrs[Math.floor(j*4/ssz)];\n\t\t\tjj = ((j*4) & modulus);\n\t\t\tif(ssz < 4 + jj) throw \"FAT boundary crossed: \" + j + \" 4 \"+ssz;\n\t\t\tj = __readInt32LE(sectors[addr], jj);\n\t\t}\n\t\tsector_list[k] = {nodes: buf, data:__toBuffer([buf_chain])};\n\t}\n\treturn sector_list;\n}\n\n/* [MS-CFB] 2.6.1 Compound File Directory Entry */\nfunction read_directory(dir_start, sector_list, sectors, Paths, nmfs, files, FileIndex) {\n\tvar blob;\n\tvar minifat_store = 0, pl = (Paths.length?2:0);\n\tvar sector = sector_list[dir_start].data;\n\tvar i = 0, namelen = 0, name, o, ctime, mtime;\n\tfor(; i < sector.length; i+= 128) {\n\t\tblob = sector.slice(i, i+128);\n\t\tprep_blob(blob, 64);\n\t\tnamelen = blob.read_shift(2);\n\t\tif(namelen === 0) continue;\n\t\tname = __utf16le(blob,0,namelen-pl);\n\t\tPaths.push(name);\n\t\to = {\n\t\t\tname: name,\n\t\t\ttype: blob.read_shift(1),\n\t\t\tcolor: blob.read_shift(1),\n\t\t\tL: blob.read_shift(4, 'i'),\n\t\t\tR: blob.read_shift(4, 'i'),\n\t\t\tC: blob.read_shift(4, 'i'),\n\t\t\tclsid: blob.read_shift(16),\n\t\t\tstate: blob.read_shift(4, 'i')\n\t\t};\n\t\tctime = blob.read_shift(2) + blob.read_shift(2) + blob.read_shift(2) + blob.read_shift(2);\n\t\tif(ctime !== 0) {\n\t\t\to.ctime = ctime; o.ct = read_date(blob, blob.l-8);\n\t\t}\n\t\tmtime = blob.read_shift(2) + blob.read_shift(2) + blob.read_shift(2) + blob.read_shift(2);\n\t\tif(mtime !== 0) {\n\t\t\to.mtime = mtime; o.mt = read_date(blob, blob.l-8);\n\t\t}\n\t\to.start = blob.read_shift(4, 'i');\n\t\to.size = blob.read_shift(4, 'i');\n\t\tif(o.type === 5) { /* root */\n\t\t\tminifat_store = o.start;\n\t\t\tif(nmfs > 0 && minifat_store !== ENDOFCHAIN) sector_list[minifat_store].name = \"!StreamData\";\n\t\t\t/*minifat_size = o.size;*/\n\t\t} else if(o.size >= 4096 /* MSCSZ */) {\n\t\t\to.storage = 'fat';\n\t\t\tif(sector_list[o.start] === undefined) sector_list[o.start] = get_sector_list(sectors, o.start, sector_list.fat_addrs, sector_list.ssz);\n\t\t\tsector_list[o.start].name = o.name;\n\t\t\to.content = sector_list[o.start].data.slice(0,o.size);\n\t\t\tprep_blob(o.content, 0);\n\t\t} else {\n\t\t\to.storage = 'minifat';\n\t\t\tif(minifat_store !== ENDOFCHAIN && o.start !== ENDOFCHAIN) {\n\t\t\t\to.content = sector_list[minifat_store].data.slice(o.start*MSSZ,o.start*MSSZ+o.size);\n\t\t\t\tprep_blob(o.content, 0);\n\t\t\t}\n\t\t}\n\t\tfiles[name] = o;\n\t\tFileIndex.push(o);\n\t}\n}\n\nfunction read_date(blob, offset) {\n\treturn new Date(( ( (__readUInt32LE(blob,offset+4)/1e7)*Math.pow(2,32)+__readUInt32LE(blob,offset)/1e7 ) - 11644473600)*1000);\n}\n\nvar fs;\nfunction readFileSync(filename, options) {\n\tif(fs === undefined) fs = require('fs');\n\treturn parse(fs.readFileSync(filename), options);\n}\n\nfunction readSync(blob, options) {\n\tswitch(options !== undefined && options.type !== undefined ? options.type : \"base64\") {\n\t\tcase \"file\": return readFileSync(blob, options);\n\t\tcase \"base64\": return parse(s2a(Base64.decode(blob)), options);\n\t\tcase \"binary\": return parse(s2a(blob), options);\n\t}\n\treturn parse(blob);\n}\n\n/** CFB Constants */\nvar MSSZ = 64; /* Mini Sector Size = 1<<6 */\n//var MSCSZ = 4096; /* Mini Stream Cutoff Size */\n/* 2.1 Compound File Sector Numbers and Types */\nvar ENDOFCHAIN = -2;\n/* 2.2 Compound File Header */\nvar HEADER_SIGNATURE = 'd0cf11e0a1b11ae1';\nvar HEADER_CLSID = '00000000000000000000000000000000';\nvar consts = {\n\t/* 2.1 Compund File Sector Numbers and Types */\n\tMAXREGSECT: -6,\n\tDIFSECT: -4,\n\tFATSECT: -3,\n\tENDOFCHAIN: ENDOFCHAIN,\n\tFREESECT: -1,\n\t/* 2.2 Compound File Header */\n\tHEADER_SIGNATURE: HEADER_SIGNATURE,\n\tHEADER_MINOR_VERSION: '3e00',\n\tMAXREGSID: -6,\n\tNOSTREAM: -1,\n\tHEADER_CLSID: HEADER_CLSID,\n\t/* 2.6.1 Compound File Directory Entry */\n\tEntryTypes: ['unknown','storage','stream','lockbytes','property','root']\n};\n\nexports.read = readSync;\nexports.parse = parse;\nexports.utils = {\n\tReadShift: ReadShift,\n\tCheckField: CheckField,\n\tprep_blob: prep_blob,\n\tbconcat: bconcat,\n\tconsts: consts\n};\n\nreturn exports;\n})();\n\nif(typeof require !== 'undefined' && typeof module !== 'undefined' && typeof DO_NOT_EXPORT_CFB === 'undefined') { module.exports = CFB; }\nfunction isval(x) { return x !== undefined && x !== null; }\n\nfunction keys(o) { return Object.keys(o); }\n\nfunction evert_key(obj, key) {\n\tvar o = [], K = keys(obj);\n\tfor(var i = 0; i !== K.length; ++i) o[obj[K[i]][key]] = K[i];\n\treturn o;\n}\n\nfunction evert(obj) {\n\tvar o = [], K = keys(obj);\n\tfor(var i = 0; i !== K.length; ++i) o[obj[K[i]]] = K[i];\n\treturn o;\n}\n\nfunction evert_num(obj) {\n\tvar o = [], K = keys(obj);\n\tfor(var i = 0; i !== K.length; ++i) o[obj[K[i]]] = parseInt(K[i],10);\n\treturn o;\n}\n\nfunction evert_arr(obj) {\n\tvar o = [], K = keys(obj);\n\tfor(var i = 0; i !== K.length; ++i) {\n\t\tif(o[obj[K[i]]] == null) o[obj[K[i]]] = [];\n\t\to[obj[K[i]]].push(K[i]);\n\t}\n\treturn o;\n}\n\n/* TODO: date1904 logic */\nfunction datenum(v, date1904) {\n\tif(date1904) v+=1462;\n\tvar epoch = Date.parse(v);\n\treturn (epoch + 2209161600000) / (24 * 60 * 60 * 1000);\n}\n\nfunction cc2str(arr) {\n\tvar o = \"\";\n\tfor(var i = 0; i != arr.length; ++i) o += String.fromCharCode(arr[i]);\n\treturn o;\n}\n\nfunction getdata(data) {\n\tif(!data) return null;\n\tif(data.name.substr(-4) === \".bin\") {\n\t\tif(data.data) return char_codes(data.data);\n\t\tif(data.asNodeBuffer && has_buf) return data.asNodeBuffer();\n\t\tif(data._data && data._data.getContent) return Array.prototype.slice.call(data._data.getContent());\n\t} else {\n\t\tif(data.data) return data.name.substr(-4) !== \".bin\" ? debom_xml(data.data) : char_codes(data.data);\n\t\tif(data.asNodeBuffer && has_buf) return debom_xml(data.asNodeBuffer().toString('binary'));\n\t\tif(data.asBinary) return debom_xml(data.asBinary());\n\t\tif(data._data && data._data.getContent) return debom_xml(cc2str(Array.prototype.slice.call(data._data.getContent(),0)));\n\t}\n\treturn null;\n}\n\nfunction safegetzipfile(zip, file) {\n\tvar f = file; if(zip.files[f]) return zip.files[f];\n\tf = file.toLowerCase(); if(zip.files[f]) return zip.files[f];\n\tf = f.replace(/\\//g,'\\\\'); if(zip.files[f]) return zip.files[f];\n\treturn null;\n}\n\nfunction getzipfile(zip, file) {\n\tvar o = safegetzipfile(zip, file);\n\tif(o == null) throw new Error(\"Cannot find file \" + file + \" in zip\");\n\treturn o;\n}\n\nfunction getzipdata(zip, file, safe) {\n\tif(!safe) return getdata(getzipfile(zip, file));\n\tif(!file) return null;\n\ttry { return getzipdata(zip, file); } catch(e) { return null; }\n}\n\nvar _fs, jszip;\nif(typeof JSZip !== 'undefined') jszip = JSZip;\nif (typeof exports !== 'undefined') {\n\tif (typeof module !== 'undefined' && module.exports) {\n\t\tif(has_buf && typeof jszip === 'undefined') jszip = require('js'+'zip');\n\t\tif(typeof jszip === 'undefined') jszip = require('./js'+'zip').JSZip;\n\t\t_fs = require('f'+'s');\n\t}\n}\nvar attregexg=/([\\w:]+)=((?:\")([^\"]*)(?:\")|(?:')([^']*)(?:'))/g;\nvar tagregex=/<[^>]*>/g;\nvar nsregex=/<\\w*:/, nsregex2 = /<(\\/?)\\w+:/;\nfunction parsexmltag(tag, skip_root) {\n\tvar z = [];\n\tvar eq = 0, c = 0;\n\tfor(; eq !== tag.length; ++eq) if((c = tag.charCodeAt(eq)) === 32 || c === 10 || c === 13) break;\n\tif(!skip_root) z[0] = tag.substr(0, eq);\n\tif(eq === tag.length) return z;\n\tvar m = tag.match(attregexg), j=0, w=\"\", v=\"\", i=0, q=\"\", cc=\"\";\n\tif(m) for(i = 0; i != m.length; ++i) {\n\t\tcc = m[i];\n\t\tfor(c=0; c != cc.length; ++c) if(cc.charCodeAt(c) === 61) break;\n\t\tq = cc.substr(0,c); v = cc.substring(c+2, cc.length-1);\n\t\tfor(j=0;j!=q.length;++j) if(q.charCodeAt(j) === 58) break;\n\t\tif(j===q.length) z[q] = v;\n\t\telse z[(j===5 && q.substr(0,5)===\"xmlns\"?\"xmlns\":\"\")+q.substr(j+1)] = v;\n\t}\n\treturn z;\n}\nfunction strip_ns(x) { return x.replace(nsregex2, \"<$1\"); }\n\nvar encodings = {\n\t'"': '\"',\n\t''': \"'\",\n\t'>': '>',\n\t'<': '<',\n\t'&': '&'\n};\nvar rencoding = evert(encodings);\nvar rencstr = \"&<>'\\\"\".split(\"\");\n\n// TODO: CP remap (need to read file version to determine OS)\nvar unescapexml = (function() {\n\tvar encregex = /&[a-z]*;/g, coderegex = /_x([\\da-fA-F]+)_/g;\n\treturn function unescapexml(text){\n\t\tvar s = text + '';\n\t\treturn s.replace(encregex, function($$) { return encodings[$$]; }).replace(coderegex,function(m,c) {return String.fromCharCode(parseInt(c,16));});\n\t};\n})();\n\nvar decregex=/[&<>'\"]/g, charegex = /[\\u0000-\\u0008\\u000b-\\u001f]/g;\nfunction escapexml(text){\n\tvar s = text + '';\n\treturn s.replace(decregex, function(y) { return rencoding[y]; }).replace(charegex,function(s) { return \"_x\" + (\"000\"+s.charCodeAt(0).toString(16)).substr(-4) + \"_\";});\n}\n\n/* TODO: handle codepages */\nvar xlml_fixstr = (function() {\n\tvar entregex = /&#(\\d+);/g;\n\tfunction entrepl($$,$1) { return String.fromCharCode(parseInt($1,10)); }\n\treturn function xlml_fixstr(str) { return str.replace(entregex,entrepl); };\n})();\n\nfunction parsexmlbool(value, tag) {\n\tswitch(value) {\n\t\tcase '1': case 'true': case 'TRUE': return true;\n\t\t/* case '0': case 'false': case 'FALSE':*/\n\t\tdefault: return false;\n\t}\n}\n\nvar utf8read = function utf8reada(orig) {\n\tvar out = \"\", i = 0, c = 0, d = 0, e = 0, f = 0, w = 0;\n\twhile (i < orig.length) {\n\t\tc = orig.charCodeAt(i++);\n\t\tif (c < 128) { out += String.fromCharCode(c); continue; }\n\t\td = orig.charCodeAt(i++);\n\t\tif (c>191 && c<224) { out += String.fromCharCode(((c & 31) << 6) | (d & 63)); continue; }\n\t\te = orig.charCodeAt(i++);\n\t\tif (c < 240) { out += String.fromCharCode(((c & 15) << 12) | ((d & 63) << 6) | (e & 63)); continue; }\n\t\tf = orig.charCodeAt(i++);\n\t\tw = (((c & 7) << 18) | ((d & 63) << 12) | ((e & 63) << 6) | (f & 63))-65536;\n\t\tout += String.fromCharCode(0xD800 + ((w>>>10)&1023));\n\t\tout += String.fromCharCode(0xDC00 + (w&1023));\n\t}\n\treturn out;\n};\n\n\nif(has_buf) {\n\tvar utf8readb = function utf8readb(data) {\n\t\tvar out = new Buffer(2*data.length), w, i, j = 1, k = 0, ww=0, c;\n\t\tfor(i = 0; i < data.length; i+=j) {\n\t\t\tj = 1;\n\t\t\tif((c=data.charCodeAt(i)) < 128) w = c;\n\t\t\telse if(c < 224) { w = (c&31)*64+(data.charCodeAt(i+1)&63); j=2; }\n\t\t\telse if(c < 240) { w=(c&15)*4096+(data.charCodeAt(i+1)&63)*64+(data.charCodeAt(i+2)&63); j=3; }\n\t\t\telse { j = 4;\n\t\t\t\tw = (c & 7)*262144+(data.charCodeAt(i+1)&63)*4096+(data.charCodeAt(i+2)&63)*64+(data.charCodeAt(i+3)&63);\n\t\t\t\tw -= 65536; ww = 0xD800 + ((w>>>10)&1023); w = 0xDC00 + (w&1023);\n\t\t\t}\n\t\t\tif(ww !== 0) { out[k++] = ww&255; out[k++] = ww>>>8; ww = 0; }\n\t\t\tout[k++] = w%256; out[k++] = w>>>8;\n\t\t}\n\t\tout.length = k;\n\t\treturn out.toString('ucs2');\n\t};\n\tvar corpus = \"foo bar baz\\u00e2\\u0098\\u0083\\u00f0\\u009f\\u008d\\u00a3\";\n\tif(utf8read(corpus) == utf8readb(corpus)) utf8read = utf8readb;\n\tvar utf8readc = function utf8readc(data) { return Buffer(data, 'binary').toString('utf8'); };\n\tif(utf8read(corpus) == utf8readc(corpus)) utf8read = utf8readc;\n}\n\n// matches <foo>...</foo> extracts content\nvar matchtag = (function() {\n\tvar mtcache = {};\n\treturn function matchtag(f,g) {\n\t\tvar t = f+\"|\"+g;\n\t\tif(mtcache[t] !== undefined) return mtcache[t];\n\t\treturn (mtcache[t] = new RegExp('<(?:\\\\w+:)?'+f+'(?: xml:space=\"preserve\")?(?:[^>]*)>([^\\u2603]*)</(?:\\\\w+:)?'+f+'>',(g||\"\")));\n\t};\n})();\n\nvar vtregex = (function(){ var vt_cache = {};\n\treturn function vt_regex(bt) {\n\t\tif(vt_cache[bt] !== undefined) return vt_cache[bt];\n\t\treturn (vt_cache[bt] = new RegExp(\"<vt:\" + bt + \">(.*?)</vt:\" + bt + \">\", 'g') );\n};})();\nvar vtvregex = /<\\/?vt:variant>/g, vtmregex = /<vt:([^>]*)>(.*)</;\nfunction parseVector(data) {\n\tvar h = parsexmltag(data);\n\n\tvar matches = data.match(vtregex(h.baseType))||[];\n\tif(matches.length != h.size) throw \"unexpected vector length \" + matches.length + \" != \" + h.size;\n\tvar res = [];\n\tmatches.forEach(function(x) {\n\t\tvar v = x.replace(vtvregex,\"\").match(vtmregex);\n\t\tres.push({v:v[2], t:v[1]});\n\t});\n\treturn res;\n}\n\nvar wtregex = /(^\\s|\\s$|\\n)/;\nfunction writetag(f,g) {return '<' + f + (g.match(wtregex)?' xml:space=\"preserve\"' : \"\") + '>' + g + '</' + f + '>';}\n\nfunction wxt_helper(h) { return keys(h).map(function(k) { return \" \" + k + '=\"' + h[k] + '\"';}).join(\"\"); }\nfunction writextag(f,g,h) { return '<' + f + (isval(h) ? wxt_helper(h) : \"\") + (isval(g) ? (g.match(wtregex)?' xml:space=\"preserve\"' : \"\") + '>' + g + '</' + f : \"/\") + '>';}\n\nfunction write_w3cdtf(d, t) { try { return d.toISOString().replace(/\\.\\d*/,\"\"); } catch(e) { if(t) throw e; } }\n\nfunction write_vt(s) {\n\tswitch(typeof s) {\n\t\tcase 'string': return writextag('vt:lpwstr', s);\n\t\tcase 'number': return writextag((s|0)==s?'vt:i4':'vt:r8', String(s));\n\t\tcase 'boolean': return writextag('vt:bool',s?'true':'false');\n\t}\n\tif(s instanceof Date) return writextag('vt:filetime', write_w3cdtf(s));\n\tthrow new Error(\"Unable to serialize \" + s);\n}\n\nvar XML_HEADER = '<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\\r\\n';\nvar XMLNS = {\n\t'dc': 'http://purl.org/dc/elements/1.1/',\n\t'dcterms': 'http://purl.org/dc/terms/',\n\t'dcmitype': 'http://purl.org/dc/dcmitype/',\n\t'mx': 'http://schemas.microsoft.com/office/mac/excel/2008/main',\n\t'r': 'http://schemas.openxmlformats.org/officeDocument/2006/relationships',\n\t'sjs': 'http://schemas.openxmlformats.org/package/2006/sheetjs/core-properties',\n\t'vt': 'http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes',\n\t'xsi': 'http://www.w3.org/2001/XMLSchema-instance',\n\t'xsd': 'http://www.w3.org/2001/XMLSchema'\n};\n\nXMLNS.main = [\n\t'http://schemas.openxmlformats.org/spreadsheetml/2006/main',\n\t'http://purl.oclc.org/ooxml/spreadsheetml/main',\n\t'http://schemas.microsoft.com/office/excel/2006/main',\n\t'http://schemas.microsoft.com/office/excel/2006/2'\n];\n\nfunction readIEEE754(buf, idx, isLE, nl, ml) {\n\tif(isLE === undefined) isLE = true;\n\tif(!nl) nl = 8;\n\tif(!ml && nl === 8) ml = 52;\n\tvar e, m, el = nl * 8 - ml - 1, eMax = (1 << el) - 1, eBias = eMax >> 1;\n\tvar bits = -7, d = isLE ? -1 : 1, i = isLE ? (nl - 1) : 0, s = buf[idx + i];\n\n\ti += d;\n\te = s & ((1 << (-bits)) - 1); s >>>= (-bits); bits += el;\n\tfor (; bits > 0; e = e * 256 + buf[idx + i], i += d, bits -= 8);\n\tm = e & ((1 << (-bits)) - 1); e >>>= (-bits); bits += ml;\n\tfor (; bits > 0; m = m * 256 + buf[idx + i], i += d, bits -= 8);\n\tif (e === eMax) return m ? NaN : ((s ? -1 : 1) * Infinity);\n\telse if (e === 0) e = 1 - eBias;\n\telse { m = m + Math.pow(2, ml); e = e - eBias; }\n\treturn (s ? -1 : 1) * m * Math.pow(2, e - ml);\n}\n\nvar __toBuffer, ___toBuffer;\n__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; };\nvar __utf16le, ___utf16le;\n__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(\"\"); };\nvar __hexlify, ___hexlify;\n__hexlify = ___hexlify = function hexlify_(b,s,l) { return b.slice(s,(s+l)).map(function(x){return (x<16?\"0\":\"\") + x.toString(16);}).join(\"\"); };\nvar __utf8, ___utf8;\n__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(\"\"); };\nvar __lpstr, ___lpstr;\n__lpstr = ___lpstr = function lpstr_(b,i) { var len = __readUInt32LE(b,i); return len > 0 ? __utf8(b, i+4,i+4+len-1) : \"\";};\nvar __lpwstr, ___lpwstr;\n__lpwstr = ___lpwstr = function lpwstr_(b,i) { var len = 2*__readUInt32LE(b,i); return len > 0 ? __utf8(b, i+4,i+4+len-1) : \"\";};\nvar __double, ___double;\n__double = ___double = function(b, idx) { return readIEEE754(b, idx);};\n\nvar is_buf = function is_buf_a(a) { return Array.isArray(a); };\nif(has_buf) {\n\t__utf16le = function utf16le_b(b,s,e) { if(!Buffer.isBuffer(b)) return ___utf16le(b,s,e); return b.toString('utf16le',s,e); };\n\t__hexlify = function(b,s,l) { return Buffer.isBuffer(b) ? b.toString('hex',s,s+l) : ___hexlify(b,s,l); };\n\t__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) : \"\";};\n\t__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);};\n\t__utf8 = function utf8_b(s,e) { return this.toString('utf8',s,e); };\n\t__toBuffer = function(bufs) { return (bufs[0].length > 0 && Buffer.isBuffer(bufs[0][0])) ? Buffer.concat(bufs[0]) : ___toBuffer(bufs);};\n\tbconcat = function(bufs) { return Buffer.isBuffer(bufs[0]) ? Buffer.concat(bufs) : [].concat.apply([], bufs); };\n\t__double = function double_(b,i) { if(Buffer.isBuffer(b)) return b.readDoubleLE(i); return ___double(b,i); };\n\tis_buf = function is_buf_b(a) { return Buffer.isBuffer(a) || Array.isArray(a); };\n}\n\n/* from js-xls */\nif(typeof cptable !== 'undefined') {\n\t__utf16le = function(b,s,e) { return cptable.utils.decode(1200, b.slice(s,e)); };\n\t__utf8 = function(b,s,e) { return cptable.utils.decode(65001, b.slice(s,e)); };\n\t__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)) : \"\";};\n\t__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)) : \"\";};\n}\n\nvar __readUInt8 = function(b, idx) { return b[idx]; };\nvar __readUInt16LE = function(b, idx) { return b[idx+1]*(1<<8)+b[idx]; };\nvar __readInt16LE = function(b, idx) { var u = b[idx+1]*(1<<8)+b[idx]; return (u < 0x8000) ? u : (0xffff - u + 1) * -1; };\nvar __readUInt32LE = function(b, idx) { return b[idx+3]*(1<<24)+(b[idx+2]<<16)+(b[idx+1]<<8)+b[idx]; };\nvar __readInt32LE = function(b, idx) { return (b[idx+3]<<24)|(b[idx+2]<<16)|(b[idx+1]<<8)|b[idx]; };\n\nvar ___unhexlify = function(s) { return s.match(/../g).map(function(x) { return parseInt(x,16);}); };\nvar __unhexlify = typeof Buffer !== \"undefined\" ? function(s) { return Buffer.isBuffer(s) ? new Buffer(s, 'hex') : ___unhexlify(s); } : ___unhexlify;\n\nfunction ReadShift(size, t) {\n\tvar o=\"\", oI, oR, oo=[], w, vv, i, loc;\n\tswitch(t) {\n\t\tcase 'dbcs':\n\t\t\tloc = this.l;\n\t\t\tif(has_buf && Buffer.isBuffer(this)) o = this.slice(this.l, this.l+2*size).toString(\"utf16le\");\n\t\t\telse for(i = 0; i != size; ++i) { o+=String.fromCharCode(__readUInt16LE(this, loc)); loc+=2; }\n\t\t\tsize *= 2;\n\t\t\tbreak;\n\n\t\tcase 'utf8': o = __utf8(this, this.l, this.l + size); break;\n\t\tcase 'utf16le': size *= 2; o = __utf16le(this, this.l, this.l + size); break;\n\n\t\t/* [MS-OLEDS] 2.1.4 LengthPrefixedAnsiString */\n\t\tcase 'lpstr': o = __lpstr(this, this.l); size = 5 + o.length; break;\n\t\t/* [MS-OLEDS] 2.1.5 LengthPrefixedUnicodeString */\n\t\tcase 'lpwstr': o = __lpwstr(this, this.l); size = 5 + o.length; if(o[o.length-1] == '\\u0000') size += 2; break;\n\n\t\tcase 'cstr': size = 0; o = \"\";\n\t\t\twhile((w=__readUInt8(this, this.l + size++))!==0) oo.push(_getchar(w));\n\t\t\to = oo.join(\"\"); break;\n\t\tcase 'wstr': size = 0; o = \"\";\n\t\t\twhile((w=__readUInt16LE(this,this.l +size))!==0){oo.push(_getchar(w));size+=2;}\n\t\t\tsize+=2; o = oo.join(\"\"); break;\n\n\t\t/* sbcs and dbcs support continue records in the SST way TODO codepages */\n\t\tcase 'dbcs-cont': o = \"\"; loc = this.l;\n\t\t\tfor(i = 0; i != size; ++i) {\n\t\t\t\tif(this.lens && this.lens.indexOf(loc) !== -1) {\n\t\t\t\t\tw = __readUInt8(this, loc);\n\t\t\t\t\tthis.l = loc + 1;\n\t\t\t\t\tvv = ReadShift.call(this, size-i, w ? 'dbcs-cont' : 'sbcs-cont');\n\t\t\t\t\treturn oo.join(\"\") + vv;\n\t\t\t\t}\n\t\t\t\too.push(_getchar(__readUInt16LE(this, loc)));\n\t\t\t\tloc+=2;\n\t\t\t} o = oo.join(\"\"); size *= 2; break;\n\n\t\tcase 'sbcs-cont': o = \"\"; loc = this.l;\n\t\t\tfor(i = 0; i != size; ++i) {\n\t\t\t\tif(this.lens && this.lens.indexOf(loc) !== -1) {\n\t\t\t\t\tw = __readUInt8(this, loc);\n\t\t\t\t\tthis.l = loc + 1;\n\t\t\t\t\tvv = ReadShift.call(this, size-i, w ? 'dbcs-cont' : 'sbcs-cont');\n\t\t\t\t\treturn oo.join(\"\") + vv;\n\t\t\t\t}\n\t\t\t\too.push(_getchar(__readUInt8(this, loc)));\n\t\t\t\tloc+=1;\n\t\t\t} o = oo.join(\"\"); break;\n\n\t\tdefault:\n\tswitch(size) {\n\t\tcase 1: oI = __readUInt8(this, this.l); this.l++; return oI;\n\t\tcase 2: oI = (t === 'i' ? __readInt16LE : __readUInt16LE)(this, this.l); this.l += 2; return oI;\n\t\tcase 4:\n\t\t\tif(t === 'i' || (this[this.l+3] & 0x80)===0) { oI = __readInt32LE(this, this.l); this.l += 4; return oI; }\n\t\t\telse { oR = __readUInt32LE(this, this.l); this.l += 4; return oR; } break;\n\t\tcase 8: if(t === 'f') { oR = __double(this, this.l); this.l += 8; return oR; }\n\t\t/* falls through */\n\t\tcase 16: o = __hexlify(this, this.l, size); break;\n\t}}\n\tthis.l+=size; return o;\n}\n\nfunction WriteShift(t, val, f) {\n\tvar size, i;\n\tif(f === 'dbcs') {\n\t\tfor(i = 0; i != val.length; ++i) this.writeUInt16LE(val.charCodeAt(i), this.l + 2 * i);\n\t\tsize = 2 * val.length;\n\t} else switch(t) {\n\t\tcase 1: size = 1; this[this.l] = val&255; break;\n\t\tcase 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;\n\t\tcase 4: size = 4; this.writeUInt32LE(val, this.l); break;\n\t\tcase 8: size = 8; if(f === 'f') { this.writeDoubleLE(val, this.l); break; }\n\t\t/* falls through */\n\t\tcase 16: break;\n\t\tcase -4: size = 4; this.writeInt32LE(val, this.l); break;\n\t}\n\tthis.l += size; return this;\n}\n\nfunction CheckField(hexstr, fld) {\n\tvar m = __hexlify(this,this.l,hexstr.length>>1);\n\tif(m !== hexstr) throw fld + 'Expected ' + hexstr + ' saw ' + m;\n\tthis.l += hexstr.length>>1;\n}\n\nfunction prep_blob(blob, pos) {\n\tblob.l = pos;\n\tblob.read_shift = ReadShift;\n\tblob.chk = CheckField;\n\tblob.write_shift = WriteShift;\n}\n\nfunction parsenoop(blob, length) { blob.l += length; }\n\nfunction writenoop(blob, length) { blob.l += length; }\n\nfunction new_buf(sz) {\n\tvar o = new_raw_buf(sz);\n\tprep_blob(o, 0);\n\treturn o;\n}\n\n/* [MS-XLSB] 2.1.4 Record */\nfunction recordhopper(data, cb, opts) {\n\tvar tmpbyte, cntbyte, length;\n\tprep_blob(data, data.l || 0);\n\twhile(data.l < data.length) {\n\t\tvar RT = data.read_shift(1);\n\t\tif(RT & 0x80) RT = (RT & 0x7F) + ((data.read_shift(1) & 0x7F)<<7);\n\t\tvar R = XLSBRecordEnum[RT] || XLSBRecordEnum[0xFFFF];\n\t\ttmpbyte = data.read_shift(1);\n\t\tlength = tmpbyte & 0x7F;\n\t\tfor(cntbyte = 1; cntbyte <4 && (tmpbyte & 0x80); ++cntbyte) length += ((tmpbyte = data.read_shift(1)) & 0x7F)<<(7*cntbyte);\n\t\tvar d = R.f(data, length, opts);\n\t\tif(cb(d, R, RT)) return;\n\t}\n}\n\n/* control buffer usage for fixed-length buffers */\nfunction buf_array() {\n\tvar bufs = [], blksz = 2048;\n\tvar newblk = function ba_newblk(sz) {\n\t\tvar o = new_buf(sz);\n\t\tprep_blob(o, 0);\n\t\treturn o;\n\t};\n\n\tvar curbuf = newblk(blksz);\n\n\tvar endbuf = function ba_endbuf() {\n\t\tcurbuf.length = curbuf.l;\n\t\tif(curbuf.length > 0) bufs.push(curbuf);\n\t\tcurbuf = null;\n\t};\n\n\tvar next = function ba_next(sz) {\n\t\tif(sz < curbuf.length - curbuf.l) return curbuf;\n\t\tendbuf();\n\t\treturn (curbuf = newblk(Math.max(sz+1, blksz)));\n\t};\n\n\tvar end = function ba_end() {\n\t\tendbuf();\n\t\treturn __toBuffer([bufs]);\n\t};\n\n\tvar push = function ba_push(buf) { endbuf(); curbuf = buf; next(blksz); };\n\n\treturn { next:next, push:push, end:end, _bufs:bufs };\n}\n\nfunction write_record(ba, type, payload, length) {\n\tvar t = evert_RE[type], l;\n\tif(!length) length = XLSBRecordEnum[t].p || (payload||[]).length || 0;\n\tl = 1 + (t >= 0x80 ? 1 : 0) + 1 + length;\n\tif(length >= 0x80) ++l; if(length >= 0x4000) ++l; if(length >= 0x200000) ++l;\n\tvar o = ba.next(l);\n\tif(t <= 0x7F) o.write_shift(1, t);\n\telse {\n\t\to.write_shift(1, (t & 0x7F) + 0x80);\n\t\to.write_shift(1, (t >> 7));\n\t}\n\tfor(var i = 0; i != 4; ++i) {\n\t\tif(length >= 0x80) { o.write_shift(1, (length & 0x7F)+0x80); length >>= 7; }\n\t\telse { o.write_shift(1, length); break; }\n\t}\n\tif(length > 0 && is_buf(payload)) ba.push(payload);\n}\n/* XLS ranges enforced */\nfunction shift_cell_xls(cell, tgt) {\n\tif(tgt.s) {\n\t\tif(cell.cRel) cell.c += tgt.s.c;\n\t\tif(cell.rRel) cell.r += tgt.s.r;\n\t} else {\n\t\tcell.c += tgt.c;\n\t\tcell.r += tgt.r;\n\t}\n\tcell.cRel = cell.rRel = 0;\n\twhile(cell.c >= 0x100) cell.c -= 0x100;\n\twhile(cell.r >= 0x10000) cell.r -= 0x10000;\n\treturn cell;\n}\n\nfunction shift_range_xls(cell, range) {\n\tcell.s = shift_cell_xls(cell.s, range.s);\n\tcell.e = shift_cell_xls(cell.e, range.s);\n\treturn cell;\n}\n\nvar OFFCRYPTO = {};\nvar make_offcrypto = function(O, _crypto) {\n\tvar crypto;\n\tif(typeof _crypto !== 'undefined') crypto = _crypto;\n\telse if(typeof require !== 'undefined') {\n\t\ttry { crypto = require('cry'+'pto'); }\n\t\tcatch(e) { crypto = null; }\n\t}\n\n\tO.rc4 = function(key, data) {\n\t\tvar S = new Array(256);\n\t\tvar c = 0, i = 0, j = 0, t = 0;\n\t\tfor(i = 0; i != 256; ++i) S[i] = i;\n\t\tfor(i = 0; i != 256; ++i) {\n\t\t\tj = (j + S[i] + (key[i%key.length]).charCodeAt(0))&255;\n\t\t\tt = S[i]; S[i] = S[j]; S[j] = t;\n\t\t}\n\t\ti = j = 0; out = Buffer(data.length);\n\t\tfor(c = 0; c != data.length; ++c) {\n\t\t\ti = (i + 1)&255;\n\t\t\tj = (j + S[i])%256;\n\t\t\tt = S[i]; S[i] = S[j]; S[j] = t;\n\t\t\tout[c] = (data[c] ^ S[(S[i]+S[j])&255]);\n\t\t}\n\t\treturn out;\n\t};\n\n\tif(crypto) {\n\t\tO.md5 = function(hex) { return crypto.createHash('md5').update(hex).digest('hex'); };\n\t} else {\n\t\tO.md5 = function(hex) { throw \"unimplemented\"; };\n\t}\n};\nmake_offcrypto(OFFCRYPTO, typeof crypto !== \"undefined\" ? crypto : undefined);\n\n\n/* [MS-XLSB] 2.5.143 */\nfunction parse_StrRun(data, length) {\n\treturn { ich: data.read_shift(2), ifnt: data.read_shift(2) };\n}\n\n/* [MS-XLSB] 2.1.7.121 */\nfunction parse_RichStr(data, length) {\n\tvar start = data.l;\n\tvar flags = data.read_shift(1);\n\tvar str = parse_XLWideString(data);\n\tvar rgsStrRun = [];\n\tvar z = { t: str, h: str };\n\tif((flags & 1) !== 0) { /* fRichStr */\n\t\t/* TODO: formatted string */\n\t\tvar dwSizeStrRun = data.read_shift(4);\n\t\tfor(var i = 0; i != dwSizeStrRun; ++i) rgsStrRun.push(parse_StrRun(data));\n\t\tz.r = rgsStrRun;\n\t}\n\telse z.r = \"<t>\" + escapexml(str) + \"</t>\";\n\tif((flags & 2) !== 0) { /* fExtStr */\n\t\t/* TODO: phonetic string */\n\t}\n\tdata.l = start + length;\n\treturn z;\n}\nfunction write_RichStr(str, o) {\n\t/* TODO: formatted string */\n\tif(o == null) o = new_buf(5+2*str.t.length);\n\to.write_shift(1,0);\n\twrite_XLWideString(str.t, o);\n\treturn o;\n}\n\n/* [MS-XLSB] 2.5.9 */\nfunction parse_XLSBCell(data) {\n\tvar col = data.read_shift(4);\n\tvar iStyleRef = data.read_shift(2);\n\tiStyleRef += data.read_shift(1) <<16;\n\tvar fPhShow = data.read_shift(1);\n\treturn { c:col, iStyleRef: iStyleRef };\n}\nfunction write_XLSBCell(cell, o) {\n\tif(o == null) o = new_buf(8);\n\to.write_shift(-4, cell.c);\n\to.write_shift(3, cell.iStyleRef === undefined ? cell.iStyleRef : cell.s);\n\to.write_shift(1, 0); /* fPhShow */\n\treturn o;\n}\n\n\n/* [MS-XLSB] 2.5.21 */\nfunction parse_XLSBCodeName (data, length) { return parse_XLWideString(data, length); }\n\n/* [MS-XLSB] 2.5.166 */\nfunction parse_XLNullableWideString(data) {\n\tvar cchCharacters = data.read_shift(4);\n\treturn cchCharacters === 0 || cchCharacters === 0xFFFFFFFF ? \"\" : data.read_shift(cchCharacters, 'dbcs');\n}\nfunction write_XLNullableWideString(data, o) {\n\tif(!o) o = new_buf(127);\n\to.write_shift(4, data.length > 0 ? data.length : 0xFFFFFFFF);\n\tif(data.length > 0) o.write_shift(0, data, 'dbcs');\n\treturn o;\n}\n\n/* [MS-XLSB] 2.5.168 */\nfunction parse_XLWideString(data) {\n\tvar cchCharacters = data.read_shift(4);\n\treturn cchCharacters === 0 ? \"\" : data.read_shift(cchCharacters, 'dbcs');\n}\nfunction write_XLWideString(data, o) {\n\tif(o == null) o = new_buf(4+2*data.length);\n\to.write_shift(4, data.length);\n\tif(data.length > 0) o.write_shift(0, data, 'dbcs');\n\treturn o;\n}\n\n/* [MS-XLSB] 2.5.114 */\nvar parse_RelID = parse_XLNullableWideString;\nvar write_RelID = write_XLNullableWideString;\n\n\n/* [MS-XLSB] 2.5.122 */\n/* [MS-XLS] 2.5.217 */\nfunction parse_RkNumber(data) {\n\tvar b = data.slice(data.l, data.l+4);\n\tvar fX100 = b[0] & 1, fInt = b[0] & 2;\n\tdata.l+=4;\n\tb[0] &= 0xFC; // b[0] &= ~3;\n\tvar RK = fInt === 0 ? __double([0,0,0,0,b[0],b[1],b[2],b[3]],0) : __readInt32LE(b,0)>>2;\n\treturn fX100 ? RK/100 : RK;\n}\n\n/* [MS-XLSB] 2.5.153 */\nfunction parse_UncheckedRfX(data) {\n\tvar cell = {s: {}, e: {}};\n\tcell.s.r = data.read_shift(4);\n\tcell.e.r = data.read_shift(4);\n\tcell.s.c = data.read_shift(4);\n\tcell.e.c = data.read_shift(4);\n\treturn cell;\n}\n\nfunction write_UncheckedRfX(r, o) {\n\tif(!o) o = new_buf(16);\n\to.write_shift(4, r.s.r);\n\to.write_shift(4, r.e.r);\n\to.write_shift(4, r.s.c);\n\to.write_shift(4, r.e.c);\n\treturn o;\n}\n\n/* [MS-XLSB] 2.5.171 */\n/* [MS-XLS] 2.5.342 */\nfunction parse_Xnum(data, length) { return data.read_shift(8, 'f'); }\nfunction write_Xnum(data, o) { return (o || new_buf(8)).write_shift(8, 'f', data); }\n\n/* [MS-XLSB] 2.5.198.2 */\nvar BErr = {\n\t0x00: \"#NULL!\",\n\t0x07: \"#DIV/0!\",\n\t0x0F: \"#VALUE!\",\n\t0x17: \"#REF!\",\n\t0x1D: \"#NAME?\",\n\t0x24: \"#NUM!\",\n\t0x2A: \"#N/A\",\n\t0x2B: \"#GETTING_DATA\",\n\t0xFF: \"#WTF?\"\n};\nvar RBErr = evert_num(BErr);\n\n/* [MS-XLSB] 2.4.321 BrtColor */\nfunction parse_BrtColor(data, length) {\n\tvar out = {};\n\tvar d = data.read_shift(1);\n\tout.fValidRGB = d & 1;\n\tout.xColorType = d >>> 1;\n\tout.index = data.read_shift(1);\n\tout.nTintAndShade = data.read_shift(2, 'i');\n\tout.bRed = data.read_shift(1);\n\tout.bGreen = data.read_shift(1);\n\tout.bBlue = data.read_shift(1);\n\tout.bAlpha = data.read_shift(1);\n}\n\n/* [MS-XLSB] 2.5.52 */\nfunction parse_FontFlags(data, length) {\n\tvar d = data.read_shift(1);\n\tdata.l++;\n\tvar out = {\n\t\tfItalic: d & 0x2,\n\t\tfStrikeout: d & 0x8,\n\t\tfOutline: d & 0x10,\n\t\tfShadow: d & 0x20,\n\t\tfCondense: d & 0x40,\n\t\tfExtend: d & 0x80\n\t};\n\treturn out;\n}\n/* [MS-OLEPS] 2.2 PropertyType */\n{\n\tvar VT_EMPTY = 0x0000;\n\tvar VT_NULL = 0x0001;\n\tvar VT_I2 = 0x0002;\n\tvar VT_I4 = 0x0003;\n\tvar VT_R4 = 0x0004;\n\tvar VT_R8 = 0x0005;\n\tvar VT_CY = 0x0006;\n\tvar VT_DATE = 0x0007;\n\tvar VT_BSTR = 0x0008;\n\tvar VT_ERROR = 0x000A;\n\tvar VT_BOOL = 0x000B;\n\tvar VT_VARIANT = 0x000C;\n\tvar VT_DECIMAL = 0x000E;\n\tvar VT_I1 = 0x0010;\n\tvar VT_UI1 = 0x0011;\n\tvar VT_UI2 = 0x0012;\n\tvar VT_UI4 = 0x0013;\n\tvar VT_I8 = 0x0014;\n\tvar VT_UI8 = 0x0015;\n\tvar VT_INT = 0x0016;\n\tvar VT_UINT = 0x0017;\n\tvar VT_LPSTR = 0x001E;\n\tvar VT_LPWSTR = 0x001F;\n\tvar VT_FILETIME = 0x0040;\n\tvar VT_BLOB = 0x0041;\n\tvar VT_STREAM = 0x0042;\n\tvar VT_STORAGE = 0x0043;\n\tvar VT_STREAMED_Object = 0x0044;\n\tvar VT_STORED_Object = 0x0045;\n\tvar VT_BLOB_Object = 0x0046;\n\tvar VT_CF = 0x0047;\n\tvar VT_CLSID = 0x0048;\n\tvar VT_VERSIONED_STREAM = 0x0049;\n\tvar VT_VECTOR = 0x1000;\n\tvar VT_ARRAY = 0x2000;\n\n\tvar VT_STRING = 0x0050; // 2.3.3.1.11 VtString\n\tvar VT_USTR = 0x0051; // 2.3.3.1.12 VtUnalignedString\n\tvar VT_CUSTOM = [VT_STRING, VT_USTR];\n}\n\n/* [MS-OSHARED] 2.3.3.2.2.1 Document Summary Information PIDDSI */\nvar DocSummaryPIDDSI = {\n\t0x01: { n: 'CodePage', t: VT_I2 },\n\t0x02: { n: 'Category', t: VT_STRING },\n\t0x03: { n: 'PresentationFormat', t: VT_STRING },\n\t0x04: { n: 'ByteCount', t: VT_I4 },\n\t0x05: { n: 'LineCount', t: VT_I4 },\n\t0x06: { n: 'ParagraphCount', t: VT_I4 },\n\t0x07: { n: 'SlideCount', t: VT_I4 },\n\t0x08: { n: 'NoteCount', t: VT_I4 },\n\t0x09: { n: 'HiddenCount', t: VT_I4 },\n\t0x0a: { n: 'MultimediaClipCount', t: VT_I4 },\n\t0x0b: { n: 'Scale', t: VT_BOOL },\n\t0x0c: { n: 'HeadingPair', t: VT_VECTOR | VT_VARIANT },\n\t0x0d: { n: 'DocParts', t: VT_VECTOR | VT_LPSTR },\n\t0x0e: { n: 'Manager', t: VT_STRING },\n\t0x0f: { n: 'Company', t: VT_STRING },\n\t0x10: { n: 'LinksDirty', t: VT_BOOL },\n\t0x11: { n: 'CharacterCount', t: VT_I4 },\n\t0x13: { n: 'SharedDoc', t: VT_BOOL },\n\t0x16: { n: 'HLinksChanged', t: VT_BOOL },\n\t0x17: { n: 'AppVersion', t: VT_I4, p: 'version' },\n\t0x1A: { n: 'ContentType', t: VT_STRING },\n\t0x1B: { n: 'ContentStatus', t: VT_STRING },\n\t0x1C: { n: 'Language', t: VT_STRING },\n\t0x1D: { n: 'Version', t: VT_STRING },\n\t0xFF: {}\n};\n\n/* [MS-OSHARED] 2.3.3.2.1.1 Summary Information Property Set PIDSI */\nvar SummaryPIDSI = {\n\t0x01: { n: 'CodePage', t: VT_I2 },\n\t0x02: { n: 'Title', t: VT_STRING },\n\t0x03: { n: 'Subject', t: VT_STRING },\n\t0x04: { n: 'Author', t: VT_STRING },\n\t0x05: { n: 'Keywords', t: VT_STRING },\n\t0x06: { n: 'Comments', t: VT_STRING },\n\t0x07: { n: 'Template', t: VT_STRING },\n\t0x08: { n: 'LastAuthor', t: VT_STRING },\n\t0x09: { n: 'RevNumber', t: VT_STRING },\n\t0x0A: { n: 'EditTime', t: VT_FILETIME },\n\t0x0B: { n: 'LastPrinted', t: VT_FILETIME },\n\t0x0C: { n: 'CreatedDate', t: VT_FILETIME },\n\t0x0D: { n: 'ModifiedDate', t: VT_FILETIME },\n\t0x0E: { n: 'PageCount', t: VT_I4 },\n\t0x0F: { n: 'WordCount', t: VT_I4 },\n\t0x10: { n: 'CharCount', t: VT_I4 },\n\t0x11: { n: 'Thumbnail', t: VT_CF },\n\t0x12: { n: 'ApplicationName', t: VT_LPSTR },\n\t0x13: { n: 'DocumentSecurity', t: VT_I4 },\n\t0xFF: {}\n};\n\n/* [MS-OLEPS] 2.18 */\nvar SpecialProperties = {\n\t0x80000000: { n: 'Locale', t: VT_UI4 },\n\t0x80000003: { n: 'Behavior', t: VT_UI4 },\n\t0x72627262: {}\n};\n\n(function() {\n\tfor(var y in SpecialProperties) if(SpecialProperties.hasOwnProperty(y))\n\tDocSummaryPIDDSI[y] = SummaryPIDSI[y] = SpecialProperties[y];\n})();\n\n/* [MS-XLS] 2.4.63 Country/Region codes */\nvar CountryEnum = {\n\t0x0001: \"US\", // United States\n\t0x0002: \"CA\", // Canada\n\t0x0003: \"\", // Latin America (except Brazil)\n\t0x0007: \"RU\", // Russia\n\t0x0014: \"EG\", // Egypt\n\t0x001E: \"GR\", // Greece\n\t0x001F: \"NL\", // Netherlands\n\t0x0020: \"BE\", // Belgium\n\t0x0021: \"FR\", // France\n\t0x0022: \"ES\", // Spain\n\t0x0024: \"HU\", // Hungary\n\t0x0027: \"IT\", // Italy\n\t0x0029: \"CH\", // Switzerland\n\t0x002B: \"AT\", // Austria\n\t0x002C: \"GB\", // United Kingdom\n\t0x002D: \"DK\", // Denmark\n\t0x002E: \"SE\", // Sweden\n\t0x002F: \"NO\", // Norway\n\t0x0030: \"PL\", // Poland\n\t0x0031: \"DE\", // Germany\n\t0x0034: \"MX\", // Mexico\n\t0x0037: \"BR\", // Brazil\n\t0x003d: \"AU\", // Australia\n\t0x0040: \"NZ\", // New Zealand\n\t0x0042: \"TH\", // Thailand\n\t0x0051: \"JP\", // Japan\n\t0x0052: \"KR\", // Korea\n\t0x0054: \"VN\", // Viet Nam\n\t0x0056: \"CN\", // China\n\t0x005A: \"TR\", // Turkey\n\t0x0069: \"JS\", // Ramastan\n\t0x00D5: \"DZ\", // Algeria\n\t0x00D8: \"MA\", // Morocco\n\t0x00DA: \"LY\", // Libya\n\t0x015F: \"PT\", // Portugal\n\t0x0162: \"IS\", // Iceland\n\t0x0166: \"FI\", // Finland\n\t0x01A4: \"CZ\", // Czech Republic\n\t0x0376: \"TW\", // Taiwan\n\t0x03C1: \"LB\", // Lebanon\n\t0x03C2: \"JO\", // Jordan\n\t0x03C3: \"SY\", // Syria\n\t0x03C4: \"IQ\", // Iraq\n\t0x03C5: \"KW\", // Kuwait\n\t0x03C6: \"SA\", // Saudi Arabia\n\t0x03CB: \"AE\", // United Arab Emirates\n\t0x03CC: \"IL\", // Israel\n\t0x03CE: \"QA\", // Qatar\n\t0x03D5: \"IR\", // Iran\n\t0xFFFF: \"US\" // United States\n};\n\n/* [MS-XLS] 2.5.127 */\nvar XLSFillPattern = [\n\tnull,\n\t'solid',\n\t'mediumGray',\n\t'darkGray',\n\t'lightGray',\n\t'darkHorizontal',\n\t'darkVertical',\n\t'darkDown',\n\t'darkUp',\n\t'darkGrid',\n\t'darkTrellis',\n\t'lightHorizontal',\n\t'lightVertical',\n\t'lightDown',\n\t'lightUp',\n\t'lightGrid',\n\t'lightTrellis',\n\t'gray125',\n\t'gray0625'\n];\n\nfunction rgbify(arr) { return arr.map(function(x) { return [(x>>16)&255,(x>>8)&255,x&255]; }); }\n\n/* [MS-XLS] 2.5.161 */\nvar XLSIcv = rgbify([\n\t/* Color Constants */\n\t0x000000,\n\t0xFFFFFF,\n\t0xFF0000,\n\t0x00FF00,\n\t0x0000FF,\n\t0xFFFF00,\n\t0xFF00FF,\n\t0x00FFFF,\n\n\t/* Defaults */\n\t0x000000,\n\t0xFFFFFF,\n\t0xFF0000,\n\t0x00FF00,\n\t0x0000FF,\n\t0xFFFF00,\n\t0xFF00FF,\n\t0x00FFFF,\n\n\t0x800000,\n\t0x008000,\n\t0x000080,\n\t0x808000,\n\t0x800080,\n\t0x008080,\n\t0xC0C0C0,\n\t0x808080,\n\t0x9999FF,\n\t0x993366,\n\t0xFFFFCC,\n\t0xCCFFFF,\n\t0x660066,\n\t0xFF8080,\n\t0x0066CC,\n\t0xCCCCFF,\n\n\t0x000080,\n\t0xFF00FF,\n\t0xFFFF00,\n\t0x00FFFF,\n\t0x800080,\n\t0x800000,\n\t0x008080,\n\t0x0000FF,\n\t0x00CCFF,\n\t0xCCFFFF,\n\t0xCCFFCC,\n\t0xFFFF99,\n\t0x99CCFF,\n\t0xFF99CC,\n\t0xCC99FF,\n\t0xFFCC99,\n\n\t0x3366FF,\n\t0x33CCCC,\n\t0x99CC00,\n\t0xFFCC00,\n\t0xFF9900,\n\t0xFF6600,\n\t0x666699,\n\t0x969696,\n\t0x003366,\n\t0x339966,\n\t0x003300,\n\t0x333300,\n\t0x993300,\n\t0x993366,\n\t0x333399,\n\t0x333333,\n\n\t/* Sheet */\n\t0xFFFFFF,\n\t0x000000\n]);\n\n/* Parts enumerated in OPC spec, MS-XLSB and MS-XLSX */\n/* 12.3 Part Summary <SpreadsheetML> */\n/* 14.2 Part Summary <DrawingML> */\n/* [MS-XLSX] 2.1 Part Enumerations */\n/* [MS-XLSB] 2.1.7 Part Enumeration */\nvar ct2type = {\n\t/* Workbook */\n\t\"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml\": \"workbooks\",\n\n\t/* Worksheet */\n\t\"application/vnd.ms-excel.binIndexWs\": \"TODO\", /* Binary Index */\n\n\t/* Chartsheet */\n\t\"application/vnd.ms-excel.chartsheet\": \"TODO\",\n\t\"application/vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml\": \"TODO\",\n\n\t/* Dialogsheet */\n\t\"application/vnd.ms-excel.dialogsheet\": \"TODO\",\n\t\"application/vnd.openxmlformats-officedocument.spreadsheetml.dialogsheet+xml\": \"TODO\",\n\n\t/* Macrosheet */\n\t\"application/vnd.ms-excel.macrosheet\": \"TODO\",\n\t\"application/vnd.ms-excel.macrosheet+xml\": \"TODO\",\n\t\"application/vnd.ms-excel.intlmacrosheet\": \"TODO\",\n\t\"application/vnd.ms-excel.binIndexMs\": \"TODO\", /* Binary Index */\n\n\t/* File Properties */\n\t\"application/vnd.openxmlformats-package.core-properties+xml\": \"coreprops\",\n\t\"application/vnd.openxmlformats-officedocument.custom-properties+xml\": \"custprops\",\n\t\"application/vnd.openxmlformats-officedocument.extended-properties+xml\": \"extprops\",\n\n\t/* Custom Data Properties */\n\t\"application/vnd.openxmlformats-officedocument.customXmlProperties+xml\": \"TODO\",\n\n\t/* Comments */\n\t\"application/vnd.ms-excel.comments\": \"comments\",\n\t\"application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml\": \"comments\",\n\n\t/* PivotTable */\n\t\"application/vnd.ms-excel.pivotTable\": \"TODO\",\n\t\"application/vnd.openxmlformats-officedocument.spreadsheetml.pivotTable+xml\": \"TODO\",\n\n\t/* Calculation Chain */\n\t\"application/vnd.ms-excel.calcChain\": \"calcchains\",\n\t\"application/vnd.openxmlformats-officedocument.spreadsheetml.calcChain+xml\": \"calcchains\",\n\n\t/* Printer Settings */\n\t\"application/vnd.openxmlformats-officedocument.spreadsheetml.printerSettings\": \"TODO\",\n\n\t/* ActiveX */\n\t\"application/vnd.ms-office.activeX\": \"TODO\",\n\t\"application/vnd.ms-office.activeX+xml\": \"TODO\",\n\n\t/* Custom Toolbars */\n\t\"application/vnd.ms-excel.attachedToolbars\": \"TODO\",\n\n\t/* External Data Connections */\n\t\"application/vnd.ms-excel.connections\": \"TODO\",\n\t\"application/vnd.openxmlformats-officedocument.spreadsheetml.connections+xml\": \"TODO\",\n\n\t/* External Links */\n\t\"application/vnd.ms-excel.externalLink\": \"TODO\",\n\t\"application/vnd.openxmlformats-officedocument.spreadsheetml.externalLink+xml\": \"TODO\",\n\n\t/* Metadata */\n\t\"application/vnd.ms-excel.sheetMetadata\": \"TODO\",\n\t\"application/vnd.openxmlformats-officedocument.spreadsheetml.sheetMetadata+xml\": \"TODO\",\n\n\t/* PivotCache */\n\t\"application/vnd.ms-excel.pivotCacheDefinition\": \"TODO\",\n\t\"application/vnd.ms-excel.pivotCacheRecords\": \"TODO\",\n\t\"application/vnd.openxmlformats-officedocument.spreadsheetml.pivotCacheDefinition+xml\": \"TODO\",\n\t\"application/vnd.openxmlformats-officedocument.spreadsheetml.pivotCacheRecords+xml\": \"TODO\",\n\n\t/* Query Table */\n\t\"application/vnd.ms-excel.queryTable\": \"TODO\",\n\t\"application/vnd.openxmlformats-officedocument.spreadsheetml.queryTable+xml\": \"TODO\",\n\n\t/* Shared Workbook */\n\t\"application/vnd.ms-excel.userNames\": \"TODO\",\n\t\"application/vnd.ms-excel.revisionHeaders\": \"TODO\",\n\t\"application/vnd.ms-excel.revisionLog\": \"TODO\",\n\t\"application/vnd.openxmlformats-officedocument.spreadsheetml.revisionHeaders+xml\": \"TODO\",\n\t\"application/vnd.openxmlformats-officedocument.spreadsheetml.revisionLog+xml\": \"TODO\",\n\t\"application/vnd.openxmlformats-officedocument.spreadsheetml.userNames+xml\": \"TODO\",\n\n\t/* Single Cell Table */\n\t\"application/vnd.ms-excel.tableSingleCells\": \"TODO\",\n\t\"application/vnd.openxmlformats-officedocument.spreadsheetml.tableSingleCells+xml\": \"TODO\",\n\n\t/* Slicer */\n\t\"application/vnd.ms-excel.slicer\": \"TODO\",\n\t\"application/vnd.ms-excel.slicerCache\": \"TODO\",\n\t\"application/vnd.ms-excel.slicer+xml\": \"TODO\",\n\t\"application/vnd.ms-excel.slicerCache+xml\": \"TODO\",\n\n\t/* Sort Map */\n\t\"application/vnd.ms-excel.wsSortMap\": \"TODO\",\n\n\t/* Table */\n\t\"application/vnd.ms-excel.table\": \"TODO\",\n\t\"application/vnd.openxmlformats-officedocument.spreadsheetml.table+xml\": \"TODO\",\n\n\t/* Themes */\n\t\"application/vnd.openxmlformats-officedocument.theme+xml\": \"themes\",\n\n\t/* Timeline */\n\t\"application/vnd.ms-excel.Timeline+xml\": \"TODO\", /* verify */\n\t\"application/vnd.ms-excel.TimelineCache+xml\": \"TODO\", /* verify */\n\n\t/* VBA */\n\t\"application/vnd.ms-office.vbaProject\": \"vba\",\n\t\"application/vnd.ms-office.vbaProjectSignature\": \"vba\",\n\n\t/* Volatile Dependencies */\n\t\"application/vnd.ms-office.volatileDependencies\": \"TODO\",\n\t\"application/vnd.openxmlformats-officedocument.spreadsheetml.volatileDependencies+xml\": \"TODO\",\n\n\t/* Control Properties */\n\t\"application/vnd.ms-excel.controlproperties+xml\": \"TODO\",\n\n\t/* Data Model */\n\t\"application/vnd.openxmlformats-officedocument.model+data\": \"TODO\",\n\n\t/* Survey */\n\t\"application/vnd.ms-excel.Survey+xml\": \"TODO\",\n\n\t/* Drawing */\n\t\"application/vnd.openxmlformats-officedocument.drawing+xml\": \"TODO\",\n\t\"application/vnd.openxmlformats-officedocument.drawingml.chart+xml\": \"TODO\",\n\t\"application/vnd.openxmlformats-officedocument.drawingml.chartshapes+xml\": \"TODO\",\n\t\"application/vnd.openxmlformats-officedocument.drawingml.diagramColors+xml\": \"TODO\",\n\t\"application/vnd.openxmlformats-officedocument.drawingml.diagramData+xml\": \"TODO\",\n\t\"application/vnd.openxmlformats-officedocument.drawingml.diagramLayout+xml\": \"TODO\",\n\t\"application/vnd.openxmlformats-officedocument.drawingml.diagramStyle+xml\": \"TODO\",\n\n\t/* VML */\n\t\"application/vnd.openxmlformats-officedocument.vmlDrawing\": \"TODO\",\n\n\t\"application/vnd.openxmlformats-package.relationships+xml\": \"rels\",\n\t\"application/vnd.openxmlformats-officedocument.oleObject\": \"TODO\",\n\n\t\"sheet\": \"js\"\n};\n\nvar CT_LIST = (function(){\n\tvar o = {\n\t\tworkbooks: {\n\t\t\txlsx: \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml\",\n\t\t\txlsm: \"application/vnd.ms-excel.sheet.macroEnabled.main+xml\",\n\t\t\txlsb: \"application/vnd.ms-excel.sheet.binary.macroEnabled.main\",\n\t\t\txltx: \"application/vnd.openxmlformats-officedocument.spreadsheetml.template.main+xml\"\n\t\t},\n\t\tstrs: { /* Shared Strings */\n\t\t\txlsx: \"application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml\",\n\t\t\txlsb: \"application/vnd.ms-excel.sharedStrings\"\n\t\t},\n\t\tsheets: {\n\t\t\txlsx: \"application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml\",\n\t\t\txlsb: \"application/vnd.ms-excel.worksheet\"\n\t\t},\n\t\tstyles: {/* Styles */\n\t\t\txlsx: \"application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml\",\n\t\t\txlsb: \"application/vnd.ms-excel.styles\"\n\t\t}\n\t};\n\tkeys(o).forEach(function(k) { if(!o[k].xlsm) o[k].xlsm = o[k].xlsx; });\n\tkeys(o).forEach(function(k){ keys(o[k]).forEach(function(v) { ct2type[o[k][v]] = k; }); });\n\treturn o;\n})();\n\nvar type2ct = evert_arr(ct2type);\n\nXMLNS.CT = 'http://schemas.openxmlformats.org/package/2006/content-types';\n\nfunction parse_ct(data, opts) {\n\tvar ctext = {};\n\tif(!data || !data.match) return data;\n\tvar ct = { workbooks: [], sheets: [], calcchains: [], themes: [], styles: [],\n\t\tcoreprops: [], extprops: [], custprops: [], strs:[], comments: [], vba: [],\n\t\tTODO:[], rels:[], xmlns: \"\" };\n\t(data.match(tagregex)||[]).forEach(function(x) {\n\t\tvar y = parsexmltag(x);\n\t\tswitch(y[0].replace(nsregex,\"<\")) {\n\t\t\tcase '<?xml': break;\n\t\t\tcase '<Types': ct.xmlns = y['xmlns' + (y[0].match(/<(\\w+):/)||[\"\",\"\"])[1] ]; break;\n\t\t\tcase '<Default': ctext[y.Extension] = y.ContentType; break;\n\t\t\tcase '<Override':\n\t\t\t\tif(ct[ct2type[y.ContentType]] !== undefined) ct[ct2type[y.ContentType]].push(y.PartName);\n\t\t\t\telse if(opts.WTF) console.error(y);\n\t\t\t\tbreak;\n\t\t}\n\t});\n\tif(ct.xmlns !== XMLNS.CT) throw new Error(\"Unknown Namespace: \" + ct.xmlns);\n\tct.calcchain = ct.calcchains.length > 0 ? ct.calcchains[0] : \"\";\n\tct.sst = ct.strs.length > 0 ? ct.strs[0] : \"\";\n\tct.style = ct.styles.length > 0 ? ct.styles[0] : \"\";\n\tct.defaults = ctext;\n\tdelete ct.calcchains;\n\treturn ct;\n}\n\nvar CTYPE_XML_ROOT = writextag('Types', null, {\n\t'xmlns': XMLNS.CT,\n\t'xmlns:xsd': XMLNS.xsd,\n\t'xmlns:xsi': XMLNS.xsi\n});\n\nvar CTYPE_DEFAULTS = [\n\t['xml', 'application/xml'],\n\t['bin', 'application/vnd.ms-excel.sheet.binary.macroEnabled.main'],\n\t['rels', type2ct.rels[0]]\n].map(function(x) {\n\treturn writextag('Default', null, {'Extension':x[0], 'ContentType': x[1]});\n});\n\nfunction write_ct(ct, opts) {\n\tvar o = [], v;\n\to[o.length] = (XML_HEADER);\n\to[o.length] = (CTYPE_XML_ROOT);\n\to = o.concat(CTYPE_DEFAULTS);\n\tvar f1 = function(w) {\n\t\tif(ct[w] && ct[w].length > 0) {\n\t\t\tv = ct[w][0];\n\t\t\to[o.length] = (writextag('Override', null, {\n\t\t\t\t'PartName': (v[0] == '/' ? \"\":\"/\") + v,\n\t\t\t\t'ContentType': CT_LIST[w][opts.bookType || 'xlsx']\n\t\t\t}));\n\t\t}\n\t};\n\tvar f2 = function(w) {\n\t\tct[w].forEach(function(v) {\n\t\t\to[o.length] = (writextag('Override', null, {\n\t\t\t\t'PartName': (v[0] == '/' ? \"\":\"/\") + v,\n\t\t\t\t'ContentType': CT_LIST[w][opts.bookType || 'xlsx']\n\t\t\t}));\n\t\t});\n\t};\n\tvar f3 = function(t) {\n\t\t(ct[t]||[]).forEach(function(v) {\n\t\t\to[o.length] = (writextag('Override', null, {\n\t\t\t\t'PartName': (v[0] == '/' ? \"\":\"/\") + v,\n\t\t\t\t'ContentType': type2ct[t][0]\n\t\t\t}));\n\t\t});\n\t};\n\tf1('workbooks');\n\tf2('sheets');\n\tf3('themes');\n\t['strs', 'styles'].forEach(f1);\n\t['coreprops', 'extprops', 'custprops'].forEach(f3);\n\tif(o.length>2){ o[o.length] = ('</Types>'); o[1]=o[1].replace(\"/>\",\">\"); }\n\treturn o.join(\"\");\n}\n/* 9.3.2 OPC Relationships Markup */\nvar RELS = {\n\tWB: \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument\",\n\tSHEET: \"http://sheetjs.openxmlformats.org/officeDocument/2006/relationships/officeDocument\"\n};\n\nfunction parse_rels(data, currentFilePath) {\n\tif (!data) return data;\n\tif (currentFilePath.charAt(0) !== '/') {\n\t\tcurrentFilePath = '/'+currentFilePath;\n\t}\n\tvar rels = {};\n\tvar hash = {};\n\tvar resolveRelativePathIntoAbsolute = function (to) {\n\t\tvar toksFrom = currentFilePath.split('/');\n\t\ttoksFrom.pop(); // folder path\n\t\tvar toksTo = to.split('/');\n\t\tvar reversed = [];\n\t\twhile (toksTo.length !== 0) {\n\t\t\tvar tokTo = toksTo.shift();\n\t\t\tif (tokTo === '..') {\n\t\t\t\ttoksFrom.pop();\n\t\t\t} else if (tokTo !== '.') {\n\t\t\t\ttoksFrom.push(tokTo);\n\t\t\t}\n\t\t}\n\t\treturn toksFrom.join('/');\n\t};\n\n\tdata.match(tagregex).forEach(function(x) {\n\t\tvar y = parsexmltag(x);\n\t\t/* 9.3.2.2 OPC_Relationships */\n\t\tif (y[0] === '<Relationship') {\n\t\t\tvar rel = {}; rel.Type = y.Type; rel.Target = y.Target; rel.Id = y.Id; rel.TargetMode = y.TargetMode;\n\t\t\tvar canonictarget = y.TargetMode === 'External' ? y.Target : resolveRelativePathIntoAbsolute(y.Target);\n\t\t\trels[canonictarget] = rel;\n\t\t\thash[y.Id] = rel;\n\t\t}\n\t});\n\trels[\"!id\"] = hash;\n\treturn rels;\n}\n\nXMLNS.RELS = 'http://schemas.openxmlformats.org/package/2006/relationships';\n\nvar RELS_ROOT = writextag('Relationships', null, {\n\t//'xmlns:ns0': XMLNS.RELS,\n\t'xmlns': XMLNS.RELS\n});\n\n/* TODO */\nfunction write_rels(rels) {\n\tvar o = [];\n\to[o.length] = (XML_HEADER);\n\to[o.length] = (RELS_ROOT);\n\tkeys(rels['!id']).forEach(function(rid) { var rel = rels['!id'][rid];\n\t\to[o.length] = (writextag('Relationship', null, rel));\n\t});\n\tif(o.length>2){ o[o.length] = ('</Relationships>'); o[1]=o[1].replace(\"/>\",\">\"); }\n\treturn o.join(\"\");\n}\n/* ECMA-376 Part II 11.1 Core Properties Part */\n/* [MS-OSHARED] 2.3.3.2.[1-2].1 (PIDSI/PIDDSI) */\nvar CORE_PROPS = [\n\t[\"cp:category\", \"Category\"],\n\t[\"cp:contentStatus\", \"ContentStatus\"],\n\t[\"cp:keywords\", \"Keywords\"],\n\t[\"cp:lastModifiedBy\", \"LastAuthor\"],\n\t[\"cp:lastPrinted\", \"LastPrinted\"],\n\t[\"cp:revision\", \"RevNumber\"],\n\t[\"cp:version\", \"Version\"],\n\t[\"dc:creator\", \"Author\"],\n\t[\"dc:description\", \"Comments\"],\n\t[\"dc:identifier\", \"Identifier\"],\n\t[\"dc:language\", \"Language\"],\n\t[\"dc:subject\", \"Subject\"],\n\t[\"dc:title\", \"Title\"],\n\t[\"dcterms:created\", \"CreatedDate\", 'date'],\n\t[\"dcterms:modified\", \"ModifiedDate\", 'date']\n];\n\nXMLNS.CORE_PROPS = \"http://schemas.openxmlformats.org/package/2006/metadata/core-properties\";\nRELS.CORE_PROPS = 'http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties';\n\nvar CORE_PROPS_REGEX = (function() {\n\tvar r = new Array(CORE_PROPS.length);\n\tfor(var i = 0; i < CORE_PROPS.length; ++i) {\n\t\tvar f = CORE_PROPS[i];\n\t\tvar g = \"(?:\"+ f[0].substr(0,f[0].indexOf(\":\")) +\":)\"+ f[0].substr(f[0].indexOf(\":\")+1);\n\t\tr[i] = new RegExp(\"<\" + g + \"[^>]*>(.*)<\\/\" + g + \">\");\n\t}\n\treturn r;\n})();\n\nfunction parse_core_props(data) {\n\tvar p = {};\n\n\tfor(var i = 0; i < CORE_PROPS.length; ++i) {\n\t\tvar f = CORE_PROPS[i], cur = data.match(CORE_PROPS_REGEX[i]);\n\t\tif(cur != null && cur.length > 0) p[f[1]] = cur[1];\n\t\tif(f[2] === 'date' && p[f[1]]) p[f[1]] = new Date(p[f[1]]);\n\t}\n\n\treturn p;\n}\n\nvar CORE_PROPS_XML_ROOT = writextag('cp:coreProperties', null, {\n\t//'xmlns': XMLNS.CORE_PROPS,\n\t'xmlns:cp': XMLNS.CORE_PROPS,\n\t'xmlns:dc': XMLNS.dc,\n\t'xmlns:dcterms': XMLNS.dcterms,\n\t'xmlns:dcmitype': XMLNS.dcmitype,\n\t'xmlns:xsi': XMLNS.xsi\n});\n\nfunction cp_doit(f, g, h, o, p) {\n\tif(p[f] != null || g == null || g === \"\") return;\n\tp[f] = g;\n\to[o.length] = (h ? writextag(f,g,h) : writetag(f,g));\n}\n\nfunction write_core_props(cp, opts) {\n\tvar o = [XML_HEADER, CORE_PROPS_XML_ROOT], p = {};\n\tif(!cp) return o.join(\"\");\n\n\n\tif(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);\n\tif(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);\n\n\tfor(var i = 0; i != CORE_PROPS.length; ++i) { var f = CORE_PROPS[i]; cp_doit(f[0], cp[f[1]], null, o, p); }\n\tif(o.length>2){ o[o.length] = ('</cp:coreProperties>'); o[1]=o[1].replace(\"/>\",\">\"); }\n\treturn o.join(\"\");\n}\n/* 15.2.12.3 Extended File Properties Part */\n/* [MS-OSHARED] 2.3.3.2.[1-2].1 (PIDSI/PIDDSI) */\nvar EXT_PROPS = [\n\t[\"Application\", \"Application\", \"string\"],\n\t[\"AppVersion\", \"AppVersion\", \"string\"],\n\t[\"Company\", \"Company\", \"string\"],\n\t[\"DocSecurity\", \"DocSecurity\", \"string\"],\n\t[\"Manager\", \"Manager\", \"string\"],\n\t[\"HyperlinksChanged\", \"HyperlinksChanged\", \"bool\"],\n\t[\"SharedDoc\", \"SharedDoc\", \"bool\"],\n\t[\"LinksUpToDate\", \"LinksUpToDate\", \"bool\"],\n\t[\"ScaleCrop\", \"ScaleCrop\", \"bool\"],\n\t[\"HeadingPairs\", \"HeadingPairs\", \"raw\"],\n\t[\"TitlesOfParts\", \"TitlesOfParts\", \"raw\"]\n];\n\nXMLNS.EXT_PROPS = \"http://schemas.openxmlformats.org/officeDocument/2006/extended-properties\";\nRELS.EXT_PROPS = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties';\n\nfunction parse_ext_props(data, p) {\n\tvar q = {}; if(!p) p = {};\n\n\tEXT_PROPS.forEach(function(f) {\n\t\tswitch(f[2]) {\n\t\t\tcase \"string\": p[f[1]] = (data.match(matchtag(f[0]))||[])[1]; break;\n\t\t\tcase \"bool\": p[f[1]] = (data.match(matchtag(f[0]))||[])[1] === \"true\"; break;\n\t\t\tcase \"raw\":\n\t\t\t\tvar cur = data.match(new RegExp(\"<\" + f[0] + \"[^>]*>(.*)<\\/\" + f[0] + \">\"));\n\t\t\t\tif(cur && cur.length > 0) q[f[1]] = cur[1];\n\t\t\t\tbreak;\n\t\t}\n\t});\n\n\tif(q.HeadingPairs && q.TitlesOfParts) {\n\t\tvar v = parseVector(q.HeadingPairs);\n\t\tvar j = 0, widx = 0;\n\t\tfor(var i = 0; i !== v.length; ++i) {\n\t\t\tswitch(v[i].v) {\n\t\t\t\tcase \"Worksheets\": widx = j; p.Worksheets = +(v[++i].v); break;\n\t\t\t\tcase \"Named Ranges\": ++i; break; // TODO: Handle Named Ranges\n\t\t\t}\n\t\t}\n\t\tvar parts = parseVector(q.TitlesOfParts).map(function(x) { return utf8read(x.v); });\n\t\tp.SheetNames = parts.slice(widx, widx + p.Worksheets);\n\t}\n\treturn p;\n}\n\nvar EXT_PROPS_XML_ROOT = writextag('Properties', null, {\n\t'xmlns': XMLNS.EXT_PROPS,\n\t'xmlns:vt': XMLNS.vt\n});\n\nfunction write_ext_props(cp, opts) {\n\tvar o = [], p = {}, W = writextag;\n\tif(!cp) cp = {};\n\tcp.Application = \"SheetJS\";\n\to[o.length] = (XML_HEADER);\n\to[o.length] = (EXT_PROPS_XML_ROOT);\n\n\tEXT_PROPS.forEach(function(f) {\n\t\tif(cp[f[1]] === undefined) return;\n\t\tvar v;\n\t\tswitch(f[2]) {\n\t\t\tcase 'string': v = cp[f[1]]; break;\n\t\t\tcase 'bool': v = cp[f[1]] ? 'true' : 'false'; break;\n\t\t}\n\t\tif(v !== undefined) o[o.length] = (W(f[0], v));\n\t});\n\n\t/* TODO: HeadingPairs, TitlesOfParts */\n\to[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\"})));\n\to[o.length] = (W('TitlesOfParts', W('vt:vector', cp.SheetNames.map(function(s) { return \"<vt:lpstr>\" + s + \"</vt:lpstr>\"; }).join(\"\"), {size: cp.Worksheets, baseType:\"lpstr\"})));\n\tif(o.length>2){ o[o.length] = ('</Properties>'); o[1]=o[1].replace(\"/>\",\">\"); }\n\treturn o.join(\"\");\n}\n/* 15.2.12.2 Custom File Properties Part */\nXMLNS.CUST_PROPS = \"http://schemas.openxmlformats.org/officeDocument/2006/custom-properties\";\nRELS.CUST_PROPS = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/custom-properties';\n\nvar custregex = /<[^>]+>[^<]*/g;\nfunction parse_cust_props(data, opts) {\n\tvar p = {}, name;\n\tvar m = data.match(custregex);\n\tif(m) for(var i = 0; i != m.length; ++i) {\n\t\tvar x = m[i], y = parsexmltag(x);\n\t\tswitch(y[0]) {\n\t\t\tcase '<?xml': break;\n\t\t\tcase '<Properties':\n\t\t\t\tif(y.xmlns !== XMLNS.CUST_PROPS) throw \"unrecognized xmlns \" + y.xmlns;\n\t\t\t\tif(y.xmlnsvt && y.xmlnsvt !== XMLNS.vt) throw \"unrecognized vt \" + y.xmlnsvt;\n\t\t\t\tbreak;\n\t\t\tcase '<property': name = y.name; break;\n\t\t\tcase '</property>': name = null; break;\n\t\t\tdefault: if (x.indexOf('<vt:') === 0) {\n\t\t\t\tvar toks = x.split('>');\n\t\t\t\tvar type = toks[0].substring(4), text = toks[1];\n\t\t\t\t/* 22.4.2.32 (CT_Variant). Omit the binary types from 22.4 (Variant Types) */\n\t\t\t\tswitch(type) {\n\t\t\t\t\tcase 'lpstr': case 'lpwstr': case 'bstr': case 'lpwstr':\n\t\t\t\t\t\tp[name] = unescapexml(text);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'bool':\n\t\t\t\t\t\tp[name] = parsexmlbool(text, '<vt:bool>');\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'i1': case 'i2': case 'i4': case 'i8': case 'int': case 'uint':\n\t\t\t\t\t\tp[name] = parseInt(text, 10);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'r4': case 'r8': case 'decimal':\n\t\t\t\t\t\tp[name] = parseFloat(text);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'filetime': case 'date':\n\t\t\t\t\t\tp[name] = new Date(text);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'cy': case 'error':\n\t\t\t\t\t\tp[name] = unescapexml(text);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tif(typeof console !== 'undefined') console.warn('Unexpected', x, type, toks);\n\t\t\t\t}\n\t\t\t} else if(x.substr(0,2) === \"</\") {\n\t\t\t} else if(opts.WTF) throw new Error(x);\n\t\t}\n\t}\n\treturn p;\n}\n\nvar CUST_PROPS_XML_ROOT = writextag('Properties', null, {\n\t'xmlns': XMLNS.CUST_PROPS,\n\t'xmlns:vt': XMLNS.vt\n});\n\nfunction write_cust_props(cp, opts) {\n\tvar o = [XML_HEADER, CUST_PROPS_XML_ROOT];\n\tif(!cp) return o.join(\"\");\n\tvar pid = 1;\n\tkeys(cp).forEach(function custprop(k) { ++pid;\n\t\to[o.length] = (writextag('property', write_vt(cp[k]), {\n\t\t\t'fmtid': '{D5CDD505-2E9C-101B-9397-08002B2CF9AE}',\n\t\t\t'pid': pid,\n\t\t\t'name': k\n\t\t}));\n\t});\n\tif(o.length>2){ o[o.length] = '</Properties>'; o[1]=o[1].replace(\"/>\",\">\"); }\n\treturn o.join(\"\");\n}\nfunction xlml_set_prop(Props, tag, val) {\n\t/* TODO: Normalize the properties */\n\tswitch(tag) {\n\t\tcase 'Description': tag = 'Comments'; break;\n\t}\n\tProps[tag] = val;\n}\n\n/* [MS-DTYP] 2.3.3 FILETIME */\n/* [MS-OLEDS] 2.1.3 FILETIME (Packet Version) */\n/* [MS-OLEPS] 2.8 FILETIME (Packet Version) */\nfunction parse_FILETIME(blob) {\n\tvar dwLowDateTime = blob.read_shift(4), dwHighDateTime = blob.read_shift(4);\n\treturn new Date(((dwHighDateTime/1e7*Math.pow(2,32) + dwLowDateTime/1e7) - 11644473600)*1000).toISOString().replace(/\\.000/,\"\");\n}\n\n/* [MS-OSHARED] 2.3.3.1.4 Lpstr */\nfunction parse_lpstr(blob, type, pad) {\n\tvar str = blob.read_shift(0, 'lpstr');\n\tif(pad) blob.l += (4 - ((str.length+1) & 3)) & 3;\n\treturn str;\n}\n\n/* [MS-OSHARED] 2.3.3.1.6 Lpwstr */\nfunction parse_lpwstr(blob, type, pad) {\n\tvar str = blob.read_shift(0, 'lpwstr');\n\tif(pad) blob.l += (4 - ((str.length+1) & 3)) & 3;\n\treturn str;\n}\n\n\n/* [MS-OSHARED] 2.3.3.1.11 VtString */\n/* [MS-OSHARED] 2.3.3.1.12 VtUnalignedString */\nfunction parse_VtStringBase(blob, stringType, pad) {\n\tif(stringType === 0x1F /*VT_LPWSTR*/) return parse_lpwstr(blob);\n\treturn parse_lpstr(blob, stringType, pad);\n}\n\nfunction parse_VtString(blob, t, pad) { return parse_VtStringBase(blob, t, pad === false ? 0: 4); }\nfunction parse_VtUnalignedString(blob, t) { if(!t) throw new Error(\"dafuq?\"); return parse_VtStringBase(blob, t, 0); }\n\n/* [MS-OSHARED] 2.3.3.1.9 VtVecUnalignedLpstrValue */\nfunction parse_VtVecUnalignedLpstrValue(blob) {\n\tvar length = blob.read_shift(4);\n\tvar ret = [];\n\tfor(var i = 0; i != length; ++i) ret[i] = blob.read_shift(0, 'lpstr');\n\treturn ret;\n}\n\n/* [MS-OSHARED] 2.3.3.1.10 VtVecUnalignedLpstr */\nfunction parse_VtVecUnalignedLpstr(blob) {\n\treturn parse_VtVecUnalignedLpstrValue(blob);\n}\n\n/* [MS-OSHARED] 2.3.3.1.13 VtHeadingPair */\nfunction parse_VtHeadingPair(blob) {\n\tvar headingString = parse_TypedPropertyValue(blob, VT_USTR);\n\tvar headerParts = parse_TypedPropertyValue(blob, VT_I4);\n\treturn [headingString, headerParts];\n}\n\n/* [MS-OSHARED] 2.3.3.1.14 VtVecHeadingPairValue */\nfunction parse_VtVecHeadingPairValue(blob) {\n\tvar cElements = blob.read_shift(4);\n\tvar out = [];\n\tfor(var i = 0; i != cElements / 2; ++i) out.push(parse_VtHeadingPair(blob));\n\treturn out;\n}\n\n/* [MS-OSHARED] 2.3.3.1.15 VtVecHeadingPair */\nfunction parse_VtVecHeadingPair(blob) {\n\t// NOTE: When invoked, wType & padding were already consumed\n\treturn parse_VtVecHeadingPairValue(blob);\n}\n\n/* [MS-OLEPS] 2.18.1 Dictionary (uses 2.17, 2.16) */\nfunction parse_dictionary(blob,CodePage) {\n\tvar cnt = blob.read_shift(4);\n\tvar dict = {};\n\tfor(var j = 0; j != cnt; ++j) {\n\t\tvar pid = blob.read_shift(4);\n\t\tvar len = blob.read_shift(4);\n\t\tdict[pid] = blob.read_shift(len, (CodePage === 0x4B0 ?'utf16le':'utf8')).replace(chr0,'').replace(chr1,'!');\n\t}\n\tif(blob.l & 3) blob.l = (blob.l>>2+1)<<2;\n\treturn dict;\n}\n\n/* [MS-OLEPS] 2.9 BLOB */\nfunction parse_BLOB(blob) {\n\tvar size = blob.read_shift(4);\n\tvar bytes = blob.slice(blob.l,blob.l+size);\n\tif(size & 3 > 0) blob.l += (4 - (size & 3)) & 3;\n\treturn bytes;\n}\n\n/* [MS-OLEPS] 2.11 ClipboardData */\nfunction parse_ClipboardData(blob) {\n\t// TODO\n\tvar o = {};\n\to.Size = blob.read_shift(4);\n\t//o.Format = blob.read_shift(4);\n\tblob.l += o.Size;\n\treturn o;\n}\n\n/* [MS-OLEPS] 2.14 Vector and Array Property Types */\nfunction parse_VtVector(blob, cb) {\n\t/* [MS-OLEPS] 2.14.2 VectorHeader */\n/*\tvar Length = blob.read_shift(4);\n\tvar o = [];\n\tfor(var i = 0; i != Length; ++i) {\n\t\to.push(cb(blob));\n\t}\n\treturn o;*/\n}\n\n/* [MS-OLEPS] 2.15 TypedPropertyValue */\nfunction parse_TypedPropertyValue(blob, type, _opts) {\n\tvar t = blob.read_shift(2), ret, opts = _opts||{};\n\tblob.l += 2;\n\tif(type !== VT_VARIANT)\n\tif(t !== type && VT_CUSTOM.indexOf(type)===-1) throw new Error('Expected type ' + type + ' saw ' + t);\n\tswitch(type === VT_VARIANT ? t : type) {\n\t\tcase 0x02 /*VT_I2*/: ret = blob.read_shift(2, 'i'); if(!opts.raw) blob.l += 2; return ret;\n\t\tcase 0x03 /*VT_I4*/: ret = blob.read_shift(4, 'i'); return ret;\n\t\tcase 0x0B /*VT_BOOL*/: return blob.read_shift(4) !== 0x0;\n\t\tcase 0x13 /*VT_UI4*/: ret = blob.read_shift(4); return ret;\n\t\tcase 0x1E /*VT_LPSTR*/: return parse_lpstr(blob, t, 4).replace(chr0,'');\n\t\tcase 0x1F /*VT_LPWSTR*/: return parse_lpwstr(blob);\n\t\tcase 0x40 /*VT_FILETIME*/: return parse_FILETIME(blob);\n\t\tcase 0x41 /*VT_BLOB*/: return parse_BLOB(blob);\n\t\tcase 0x47 /*VT_CF*/: return parse_ClipboardData(blob);\n\t\tcase 0x50 /*VT_STRING*/: return parse_VtString(blob, t, !opts.raw && 4).replace(chr0,'');\n\t\tcase 0x51 /*VT_USTR*/: return parse_VtUnalignedString(blob, t, 4).replace(chr0,'');\n\t\tcase 0x100C /*VT_VECTOR|VT_VARIANT*/: return parse_VtVecHeadingPair(blob);\n\t\tcase 0x101E /*VT_LPSTR*/: return parse_VtVecUnalignedLpstr(blob);\n\t\tdefault: throw new Error(\"TypedPropertyValue unrecognized type \" + type + \" \" + t);\n\t}\n}\n/* [MS-OLEPS] 2.14.2 VectorHeader */\n/*function parse_VTVectorVariant(blob) {\n\tvar Length = blob.read_shift(4);\n\n\tif(Length & 1 !== 0) throw new Error(\"VectorHeader Length=\" + Length + \" must be even\");\n\tvar o = [];\n\tfor(var i = 0; i != Length; ++i) {\n\t\to.push(parse_TypedPropertyValue(blob, VT_VARIANT));\n\t}\n\treturn o;\n}*/\n\n/* [MS-OLEPS] 2.20 PropertySet */\nfunction parse_PropertySet(blob, PIDSI) {\n\tvar start_addr = blob.l;\n\tvar size = blob.read_shift(4);\n\tvar NumProps = blob.read_shift(4);\n\tvar Props = [], i = 0;\n\tvar CodePage = 0;\n\tvar Dictionary = -1, DictObj;\n\tfor(i = 0; i != NumProps; ++i) {\n\t\tvar PropID = blob.read_shift(4);\n\t\tvar Offset = blob.read_shift(4);\n\t\tProps[i] = [PropID, Offset + start_addr];\n\t}\n\tvar PropH = {};\n\tfor(i = 0; i != NumProps; ++i) {\n\t\tif(blob.l !== Props[i][1]) {\n\t\t\tvar fail = true;\n\t\t\tif(i>0 && PIDSI) switch(PIDSI[Props[i-1][0]].t) {\n\t\t\t\tcase 0x02 /*VT_I2*/: if(blob.l +2 === Props[i][1]) { blob.l+=2; fail = false; } break;\n\t\t\t\tcase 0x50 /*VT_STRING*/: if(blob.l <= Props[i][1]) { blob.l=Props[i][1]; fail = false; } break;\n\t\t\t\tcase 0x100C /*VT_VECTOR|VT_VARIANT*/: if(blob.l <= Props[i][1]) { blob.l=Props[i][1]; fail = false; } break;\n\t\t\t}\n\t\t\tif(!PIDSI && blob.l <= Props[i][1]) { fail=false; blob.l = Props[i][1]; }\n\t\t\tif(fail) throw new Error(\"Read Error: Expected address \" + Props[i][1] + ' at ' + blob.l + ' :' + i);\n\t\t}\n\t\tif(PIDSI) {\n\t\t\tvar piddsi = PIDSI[Props[i][0]];\n\t\t\tPropH[piddsi.n] = parse_TypedPropertyValue(blob, piddsi.t, {raw:true});\n\t\t\tif(piddsi.p === 'version') PropH[piddsi.n] = String(PropH[piddsi.n] >> 16) + \".\" + String(PropH[piddsi.n] & 0xFFFF);\n\t\t\tif(piddsi.n == \"CodePage\") switch(PropH[piddsi.n]) {\n\t\t\t\tcase 0: PropH[piddsi.n] = 1252;\n\t\t\t\t\t/* falls through */\n\t\t\t\tcase 10000: // OSX Roman\n\t\t\t\tcase 1252: // Windows Latin\n\n\t\t\t\tcase 874: // SB Windows Thai\n\t\t\t\tcase 1250: // SB Windows Central Europe\n\t\t\t\tcase 1251: // SB Windows Cyrillic\n\t\t\t\tcase 1253: // SB Windows Greek\n\t\t\t\tcase 1254: // SB Windows Turkish\n\t\t\t\tcase 1255: // SB Windows Hebrew\n\t\t\t\tcase 1256: // SB Windows Arabic\n\t\t\t\tcase 1257: // SB Windows Baltic\n\t\t\t\tcase 1258: // SB Windows Vietnam\n\n\t\t\t\tcase 932: // DB Windows Japanese Shift-JIS\n\t\t\t\tcase 936: // DB Windows Simplified Chinese GBK\n\t\t\t\tcase 949: // DB Windows Korean\n\t\t\t\tcase 950: // DB Windows Traditional Chinese Big5\n\n\t\t\t\tcase 1200: // UTF16LE\n\t\t\t\tcase 1201: // UTF16BE\n\t\t\t\tcase 65000: case -536: // UTF-7\n\t\t\t\tcase 65001: case -535: // UTF-8\n\t\t\t\t\tset_cp(CodePage = PropH[piddsi.n]); break;\n\t\t\t\tdefault: throw new Error(\"Unsupported CodePage: \" + PropH[piddsi.n]);\n\t\t\t}\n\t\t} else {\n\t\t\tif(Props[i][0] === 0x1) {\n\t\t\t\tCodePage = PropH.CodePage = parse_TypedPropertyValue(blob, VT_I2);\n\t\t\t\tset_cp(CodePage);\n\t\t\t\tif(Dictionary !== -1) {\n\t\t\t\t\tvar oldpos = blob.l;\n\t\t\t\t\tblob.l = Props[Dictionary][1];\n\t\t\t\t\tDictObj = parse_dictionary(blob,CodePage);\n\t\t\t\t\tblob.l = oldpos;\n\t\t\t\t}\n\t\t\t} else if(Props[i][0] === 0) {\n\t\t\t\tif(CodePage === 0) { Dictionary = i; blob.l = Props[i+1][1]; continue; }\n\t\t\t\tDictObj = parse_dictionary(blob,CodePage);\n\t\t\t} else {\n\t\t\t\tvar name = DictObj[Props[i][0]];\n\t\t\t\tvar val;\n\t\t\t\t/* [MS-OSHARED] 2.3.3.2.3.1.2 + PROPVARIANT */\n\t\t\t\tswitch(blob[blob.l]) {\n\t\t\t\t\tcase 0x41 /*VT_BLOB*/: blob.l += 4; val = parse_BLOB(blob); break;\n\t\t\t\t\tcase 0x1E /*VT_LPSTR*/: blob.l += 4; val = parse_VtString(blob, blob[blob.l-4]); break;\n\t\t\t\t\tcase 0x1F /*VT_LPWSTR*/: blob.l += 4; val = parse_VtString(blob, blob[blob.l-4]); break;\n\t\t\t\t\tcase 0x03 /*VT_I4*/: blob.l += 4; val = blob.read_shift(4, 'i'); break;\n\t\t\t\t\tcase 0x13 /*VT_UI4*/: blob.l += 4; val = blob.read_shift(4); break;\n\t\t\t\t\tcase 0x05 /*VT_R8*/: blob.l += 4; val = blob.read_shift(8, 'f'); break;\n\t\t\t\t\tcase 0x0B /*VT_BOOL*/: blob.l += 4; val = parsebool(blob, 4); break;\n\t\t\t\t\tcase 0x40 /*VT_FILETIME*/: blob.l += 4; val = new Date(parse_FILETIME(blob)); break;\n\t\t\t\t\tdefault: throw new Error(\"unparsed value: \" + blob[blob.l]);\n\t\t\t\t}\n\t\t\t\tPropH[name] = val;\n\t\t\t}\n\t\t}\n\t}\n\tblob.l = start_addr + size; /* step ahead to skip padding */\n\treturn PropH;\n}\n\n/* [MS-OLEPS] 2.21 PropertySetStream */\nfunction parse_PropertySetStream(file, PIDSI) {\n\tvar blob = file.content;\n\tprep_blob(blob, 0);\n\n\tvar NumSets, FMTID0, FMTID1, Offset0, Offset1;\n\tblob.chk('feff', 'Byte Order: ');\n\n\tvar vers = blob.read_shift(2); // TODO: check version\n\tvar SystemIdentifier = blob.read_shift(4);\n\tblob.chk(CFB.utils.consts.HEADER_CLSID, 'CLSID: ');\n\tNumSets = blob.read_shift(4);\n\tif(NumSets !== 1 && NumSets !== 2) throw \"Unrecognized #Sets: \" + NumSets;\n\tFMTID0 = blob.read_shift(16); Offset0 = blob.read_shift(4);\n\n\tif(NumSets === 1 && Offset0 !== blob.l) throw \"Length mismatch\";\n\telse if(NumSets === 2) { FMTID1 = blob.read_shift(16); Offset1 = blob.read_shift(4); }\n\tvar PSet0 = parse_PropertySet(blob, PIDSI);\n\n\tvar rval = { SystemIdentifier: SystemIdentifier };\n\tfor(var y in PSet0) rval[y] = PSet0[y];\n\t//rval.blob = blob;\n\trval.FMTID = FMTID0;\n\t//rval.PSet0 = PSet0;\n\tif(NumSets === 1) return rval;\n\tif(blob.l !== Offset1) throw \"Length mismatch 2: \" + blob.l + \" !== \" + Offset1;\n\tvar PSet1;\n\ttry { PSet1 = parse_PropertySet(blob, null); } catch(e) { }\n\tfor(y in PSet1) rval[y] = PSet1[y];\n\trval.FMTID = [FMTID0, FMTID1]; // TODO: verify FMTID0/1\n\treturn rval;\n}\n\n\nfunction parsenoop2(blob, length) { blob.read_shift(length); return null; }\n\nfunction parslurp(blob, length, cb) {\n\tvar arr = [], target = blob.l + length;\n\twhile(blob.l < target) arr.push(cb(blob, target - blob.l));\n\tif(target !== blob.l) throw new Error(\"Slurp error\");\n\treturn arr;\n}\n\nfunction parslurp2(blob, length, cb) {\n\tvar arr = [], target = blob.l + length, len = blob.read_shift(2);\n\twhile(len-- !== 0) arr.push(cb(blob, target - blob.l));\n\tif(target !== blob.l) throw new Error(\"Slurp error\");\n\treturn arr;\n}\n\nfunction parsebool(blob, length) { return blob.read_shift(length) === 0x1; }\n\nfunction parseuint16(blob) { return blob.read_shift(2, 'u'); }\nfunction parseuint16a(blob, length) { return parslurp(blob,length,parseuint16);}\n\n/* --- 2.5 Structures --- */\n\n/* [MS-XLS] 2.5.14 Boolean */\nvar parse_Boolean = parsebool;\n\n/* [MS-XLS] 2.5.10 Bes (boolean or error) */\nfunction parse_Bes(blob) {\n\tvar v = blob.read_shift(1), t = blob.read_shift(1);\n\treturn t === 0x01 ? v : v === 0x01;\n}\n\n/* [MS-XLS] 2.5.240 ShortXLUnicodeString */\nfunction parse_ShortXLUnicodeString(blob, length, opts) {\n\tvar cch = blob.read_shift(1);\n\tvar width = 1, encoding = 'sbcs-cont';\n\tvar cp = current_codepage;\n\tif(opts && opts.biff >= 8) current_codepage = 1200;\n\tif(opts === undefined || opts.biff !== 5) {\n\t\tvar fHighByte = blob.read_shift(1);\n\t\tif(fHighByte) { width = 2; encoding = 'dbcs-cont'; }\n\t}\n\tvar o = cch ? blob.read_shift(cch, encoding) : \"\";\n\tcurrent_codepage = cp;\n\treturn o;\n}\n\n/* 2.5.293 XLUnicodeRichExtendedString */\nfunction parse_XLUnicodeRichExtendedString(blob) {\n\tvar cp = current_codepage;\n\tcurrent_codepage = 1200;\n\tvar cch = blob.read_shift(2), flags = blob.read_shift(1);\n\tvar fHighByte = flags & 0x1, fExtSt = flags & 0x4, fRichSt = flags & 0x8;\n\tvar width = 1 + (flags & 0x1); // 0x0 -> utf8, 0x1 -> dbcs\n\tvar cRun, cbExtRst;\n\tvar z = {};\n\tif(fRichSt) cRun = blob.read_shift(2);\n\tif(fExtSt) cbExtRst = blob.read_shift(4);\n\tvar encoding = (flags & 0x1) ? 'dbcs-cont' : 'sbcs-cont';\n\tvar msg = cch === 0 ? \"\" : blob.read_shift(cch, encoding);\n\tif(fRichSt) blob.l += 4 * cRun; //TODO: parse this\n\tif(fExtSt) blob.l += cbExtRst; //TODO: parse this\n\tz.t = msg;\n\tif(!fRichSt) { z.raw = \"<t>\" + z.t + \"</t>\"; z.r = z.t; }\n\tcurrent_codepage = cp;\n\treturn z;\n}\n\n/* 2.5.296 XLUnicodeStringNoCch */\nfunction parse_XLUnicodeStringNoCch(blob, cch, opts) {\n\tvar retval;\n\tvar fHighByte = blob.read_shift(1);\n\tif(fHighByte===0) { retval = blob.read_shift(cch, 'sbcs-cont'); }\n\telse { retval = blob.read_shift(cch, 'dbcs-cont'); }\n\treturn retval;\n}\n\n/* 2.5.294 XLUnicodeString */\nfunction parse_XLUnicodeString(blob, length, opts) {\n\tvar cch = blob.read_shift(opts !== undefined && opts.biff > 0 && opts.biff < 8 ? 1 : 2);\n\tif(cch === 0) { blob.l++; return \"\"; }\n\treturn parse_XLUnicodeStringNoCch(blob, cch, opts);\n}\n/* BIFF5 override */\nfunction parse_XLUnicodeString2(blob, length, opts) {\n\tif(opts.biff !== 5 && opts.biff !== 2) return parse_XLUnicodeString(blob, length, opts);\n\tvar cch = blob.read_shift(1);\n\tif(cch === 0) { blob.l++; return \"\"; }\n\treturn blob.read_shift(cch, 'sbcs-cont');\n}\n\n/* [MS-XLS] 2.5.61 ControlInfo */\nvar parse_ControlInfo = parsenoop;\n\n/* [MS-OSHARED] 2.3.7.6 URLMoniker TODO: flags */\nvar parse_URLMoniker = function(blob, length) {\n\tvar len = blob.read_shift(4), start = blob.l;\n\tvar extra = false;\n\tif(len > 24) {\n\t\t/* look ahead */\n\t\tblob.l += len - 24;\n\t\tif(blob.read_shift(16) === \"795881f43b1d7f48af2c825dc4852763\") extra = true;\n\t\tblob.l = start;\n\t}\n\tvar url = blob.read_shift((extra?len-24:len)>>1, 'utf16le').replace(chr0,\"\");\n\tif(extra) blob.l += 24;\n\treturn url;\n};\n\n/* [MS-OSHARED] 2.3.7.8 FileMoniker TODO: all fields */\nvar parse_FileMoniker = function(blob, length) {\n\tvar cAnti = blob.read_shift(2);\n\tvar ansiLength = blob.read_shift(4);\n\tvar ansiPath = blob.read_shift(ansiLength, 'cstr');\n\tvar endServer = blob.read_shift(2);\n\tvar versionNumber = blob.read_shift(2);\n\tvar cbUnicodePathSize = blob.read_shift(4);\n\tif(cbUnicodePathSize === 0) return ansiPath.replace(/\\\\/g,\"/\");\n\tvar cbUnicodePathBytes = blob.read_shift(4);\n\tvar usKeyValue = blob.read_shift(2);\n\tvar unicodePath = blob.read_shift(cbUnicodePathBytes>>1, 'utf16le').replace(chr0,\"\");\n\treturn unicodePath;\n};\n\n/* [MS-OSHARED] 2.3.7.2 HyperlinkMoniker TODO: all the monikers */\nvar parse_HyperlinkMoniker = function(blob, length) {\n\tvar clsid = blob.read_shift(16); length -= 16;\n\tswitch(clsid) {\n\t\tcase \"e0c9ea79f9bace118c8200aa004ba90b\": return parse_URLMoniker(blob, length);\n\t\tcase \"0303000000000000c000000000000046\": return parse_FileMoniker(blob, length);\n\t\tdefault: throw \"unsupported moniker \" + clsid;\n\t}\n};\n\n/* [MS-OSHARED] 2.3.7.9 HyperlinkString */\nvar parse_HyperlinkString = function(blob, length) {\n\tvar len = blob.read_shift(4);\n\tvar o = blob.read_shift(len, 'utf16le').replace(chr0, \"\");\n\treturn o;\n};\n\n/* [MS-OSHARED] 2.3.7.1 Hyperlink Object TODO: unify params with XLSX */\nvar parse_Hyperlink = function(blob, length) {\n\tvar end = blob.l + length;\n\tvar sVer = blob.read_shift(4);\n\tif(sVer !== 2) throw new Error(\"Unrecognized streamVersion: \" + sVer);\n\tvar flags = blob.read_shift(2);\n\tblob.l += 2;\n\tvar displayName, targetFrameName, moniker, oleMoniker, location, guid, fileTime;\n\tif(flags & 0x0010) displayName = parse_HyperlinkString(blob, end - blob.l);\n\tif(flags & 0x0080) targetFrameName = parse_HyperlinkString(blob, end - blob.l);\n\tif((flags & 0x0101) === 0x0101) moniker = parse_HyperlinkString(blob, end - blob.l);\n\tif((flags & 0x0101) === 0x0001) oleMoniker = parse_HyperlinkMoniker(blob, end - blob.l);\n\tif(flags & 0x0008) location = parse_HyperlinkString(blob, end - blob.l);\n\tif(flags & 0x0020) guid = blob.read_shift(16);\n\tif(flags & 0x0040) fileTime = parse_FILETIME(blob, 8);\n\tblob.l = end;\n\tvar target = (targetFrameName||moniker||oleMoniker);\n\tif(location) target+=\"#\"+location;\n\treturn {Target: target};\n};\n\n/* 2.5.178 LongRGBA */\nfunction parse_LongRGBA(blob, length) { var r = blob.read_shift(1), g = blob.read_shift(1), b = blob.read_shift(1), a = blob.read_shift(1); return [r,g,b,a]; }\n\n/* 2.5.177 LongRGB */\nfunction parse_LongRGB(blob, length) { var x = parse_LongRGBA(blob, length); x[3] = 0; return x; }\n\n\n/* --- MS-XLS --- */\n\n/* 2.5.19 */\nfunction parse_XLSCell(blob, length) {\n\tvar rw = blob.read_shift(2); // 0-indexed\n\tvar col = blob.read_shift(2);\n\tvar ixfe = blob.read_shift(2);\n\treturn {r:rw, c:col, ixfe:ixfe};\n}\n\n/* 2.5.134 */\nfunction parse_frtHeader(blob) {\n\tvar rt = blob.read_shift(2);\n\tvar flags = blob.read_shift(2); // TODO: parse these flags\n\tblob.l += 8;\n\treturn {type: rt, flags: flags};\n}\n\n\n\nfunction parse_OptXLUnicodeString(blob, length, opts) { return length === 0 ? \"\" : parse_XLUnicodeString2(blob, length, opts); }\n\n/* 2.5.158 */\nvar HIDEOBJENUM = ['SHOWALL', 'SHOWPLACEHOLDER', 'HIDEALL'];\nvar parse_HideObjEnum = parseuint16;\n\n/* 2.5.344 */\nfunction parse_XTI(blob, length) {\n\tvar iSupBook = blob.read_shift(2), itabFirst = blob.read_shift(2,'i'), itabLast = blob.read_shift(2,'i');\n\treturn [iSupBook, itabFirst, itabLast];\n}\n\n/* 2.5.218 */\nfunction parse_RkRec(blob, length) {\n\tvar ixfe = blob.read_shift(2);\n\tvar RK = parse_RkNumber(blob);\n\t//console.log(\"::\", ixfe, RK,\";;\");\n\treturn [ixfe, RK];\n}\n\n/* 2.5.1 */\nfunction parse_AddinUdf(blob, length) {\n\tblob.l += 4; length -= 4;\n\tvar l = blob.l + length;\n\tvar udfName = parse_ShortXLUnicodeString(blob, length);\n\tvar cb = blob.read_shift(2);\n\tl -= blob.l;\n\tif(cb !== l) throw \"Malformed AddinUdf: padding = \" + l + \" != \" + cb;\n\tblob.l += cb;\n\treturn udfName;\n}\n\n/* 2.5.209 TODO: Check sizes */\nfunction parse_Ref8U(blob, length) {\n\tvar rwFirst = blob.read_shift(2);\n\tvar rwLast = blob.read_shift(2);\n\tvar colFirst = blob.read_shift(2);\n\tvar colLast = blob.read_shift(2);\n\treturn {s:{c:colFirst, r:rwFirst}, e:{c:colLast,r:rwLast}};\n}\n\n/* 2.5.211 */\nfunction parse_RefU(blob, length) {\n\tvar rwFirst = blob.read_shift(2);\n\tvar rwLast = blob.read_shift(2);\n\tvar colFirst = blob.read_shift(1);\n\tvar colLast = blob.read_shift(1);\n\treturn {s:{c:colFirst, r:rwFirst}, e:{c:colLast,r:rwLast}};\n}\n\n/* 2.5.207 */\nvar parse_Ref = parse_RefU;\n\n/* 2.5.143 */\nfunction parse_FtCmo(blob, length) {\n\tblob.l += 4;\n\tvar ot = blob.read_shift(2);\n\tvar id = blob.read_shift(2);\n\tvar flags = blob.read_shift(2);\n\tblob.l+=12;\n\treturn [id, ot, flags];\n}\n\n/* 2.5.149 */\nfunction parse_FtNts(blob, length) {\n\tvar out = {};\n\tblob.l += 4;\n\tblob.l += 16; // GUID TODO\n\tout.fSharedNote = blob.read_shift(2);\n\tblob.l += 4;\n\treturn out;\n}\n\n/* 2.5.142 */\nfunction parse_FtCf(blob, length) {\n\tvar out = {};\n\tblob.l += 4;\n\tblob.cf = blob.read_shift(2);\n\treturn out;\n}\n\n/* 2.5.140 - 2.5.154 and friends */\nvar FtTab = {\n\t0x15: parse_FtCmo,\n\t0x13: parsenoop, /* FtLbsData */\n\t0x12: function(blob, length) { blob.l += 12; }, /* FtCblsData */\n\t0x11: function(blob, length) { blob.l += 8; }, /* FtRboData */\n\t0x10: parsenoop, /* FtEdoData */\n\t0x0F: parsenoop, /* FtGboData */\n\t0x0D: parse_FtNts, /* FtNts */\n\t0x0C: function(blob, length) { blob.l += 24; }, /* FtSbs */\n\t0x0B: function(blob, length) { blob.l += 10; }, /* FtRbo */\n\t0x0A: function(blob, length) { blob.l += 16; }, /* FtCbls */\n\t0x09: parsenoop, /* FtPictFmla */\n\t0x08: function(blob, length) { blob.l += 6; }, /* FtPioGrbit */\n\t0x07: parse_FtCf, /* FtCf */\n\t0x06: function(blob, length) { blob.l += 6; }, /* FtGmo */\n\t0x04: parsenoop, /* FtMacro */\n\t0x00: function(blob, length) { blob.l += 4; } /* FtEnding */\n};\nfunction parse_FtArray(blob, length, ot) {\n\tvar s = blob.l;\n\tvar fts = [];\n\twhile(blob.l < s + length) {\n\t\tvar ft = blob.read_shift(2);\n\t\tblob.l-=2;\n\t\ttry {\n\t\t\tfts.push(FtTab[ft](blob, s + length - blob.l));\n\t\t} catch(e) { blob.l = s + length; return fts; }\n\t}\n\tif(blob.l != s + length) blob.l = s + length; //throw \"bad Object Ft-sequence\";\n\treturn fts;\n}\n\n/* 2.5.129 */\nvar parse_FontIndex = parseuint16;\n\n/* --- 2.4 Records --- */\n\n/* 2.4.21 */\nfunction parse_BOF(blob, length) {\n\tvar o = {};\n\to.BIFFVer = blob.read_shift(2); length -= 2;\n\tswitch(o.BIFFVer) {\n\t\tcase 0x0600: /* BIFF8 */\n\t\tcase 0x0500: /* BIFF5 */\n\t\tcase 0x0002: case 0x0007: /* BIFF2 */\n\t\t\tbreak;\n\t\tdefault: throw \"Unexpected BIFF Ver \" + o.BIFFVer;\n\t}\n\tblob.read_shift(length);\n\treturn o;\n}\n\n\n/* 2.4.146 */\nfunction parse_InterfaceHdr(blob, length) {\n\tif(length === 0) return 0x04b0;\n\tvar q;\n\tif((q=blob.read_shift(2))!==0x04b0) throw 'InterfaceHdr codePage ' + q;\n\treturn 0x04b0;\n}\n\n\n/* 2.4.349 */\nfunction parse_WriteAccess(blob, length, opts) {\n\tif(opts.enc) { blob.l += length; return \"\"; }\n\tvar l = blob.l;\n\t// TODO: make sure XLUnicodeString doesnt overrun\n\tvar UserName = parse_XLUnicodeString(blob, 0, opts);\n\tblob.read_shift(length + l - blob.l);\n\treturn UserName;\n}\n\n/* 2.4.28 */\nfunction parse_BoundSheet8(blob, length, opts) {\n\tvar pos = blob.read_shift(4);\n\tvar hidden = blob.read_shift(1) >> 6;\n\tvar dt = blob.read_shift(1);\n\tswitch(dt) {\n\t\tcase 0: dt = 'Worksheet'; break;\n\t\tcase 1: dt = 'Macrosheet'; break;\n\t\tcase 2: dt = 'Chartsheet'; break;\n\t\tcase 6: dt = 'VBAModule'; break;\n\t}\n\tvar name = parse_ShortXLUnicodeString(blob, 0, opts);\n\tif(name.length === 0) name = \"Sheet1\";\n\treturn { pos:pos, hs:hidden, dt:dt, name:name };\n}\n\n/* 2.4.265 TODO */\nfunction parse_SST(blob, length) {\n\tvar cnt = blob.read_shift(4);\n\tvar ucnt = blob.read_shift(4);\n\tvar strs = [];\n\tfor(var i = 0; i != ucnt; ++i) {\n\t\tstrs.push(parse_XLUnicodeRichExtendedString(blob));\n\t}\n\tstrs.Count = cnt; strs.Unique = ucnt;\n\treturn strs;\n}\n\n/* 2.4.107 */\nfunction parse_ExtSST(blob, length) {\n\tvar extsst = {};\n\textsst.dsst = blob.read_shift(2);\n\tblob.l += length-2;\n\treturn extsst;\n}\n\n\n/* 2.4.221 TODO*/\nfunction parse_Row(blob, length) {\n\tvar rw = blob.read_shift(2), col = blob.read_shift(2), Col = blob.read_shift(2), rht = blob.read_shift(2);\n\tblob.read_shift(4); // reserved(2), unused(2)\n\tvar flags = blob.read_shift(1); // various flags\n\tblob.read_shift(1); // reserved\n\tblob.read_shift(2); //ixfe, other flags\n\treturn {r:rw, c:col, cnt:Col-col};\n}\n\n\n/* 2.4.125 */\nfunction parse_ForceFullCalculation(blob, length) {\n\tvar header = parse_frtHeader(blob);\n\tif(header.type != 0x08A3) throw \"Invalid Future Record \" + header.type;\n\tvar fullcalc = blob.read_shift(4);\n\treturn fullcalc !== 0x0;\n}\n\n\nvar parse_CompressPictures = parsenoop2; /* 2.4.55 Not interesting */\n\n\n\n/* 2.4.215 rt */\nfunction parse_RecalcId(blob, length) {\n\tblob.read_shift(2);\n\treturn blob.read_shift(4);\n}\n\n/* 2.4.87 */\nfunction parse_DefaultRowHeight (blob, length) {\n\tvar f = blob.read_shift(2), miyRw;\n\tmiyRw = blob.read_shift(2); // flags & 0x02 -> hidden, else empty\n\tvar fl = {Unsynced:f&1,DyZero:(f&2)>>1,ExAsc:(f&4)>>2,ExDsc:(f&8)>>3};\n\treturn [fl, miyRw];\n}\n\n/* 2.4.345 TODO */\nfunction parse_Window1(blob, length) {\n\tvar xWn = blob.read_shift(2), yWn = blob.read_shift(2), dxWn = blob.read_shift(2), dyWn = blob.read_shift(2);\n\tvar flags = blob.read_shift(2), iTabCur = blob.read_shift(2), iTabFirst = blob.read_shift(2);\n\tvar ctabSel = blob.read_shift(2), wTabRatio = blob.read_shift(2);\n\treturn { Pos: [xWn, yWn], Dim: [dxWn, dyWn], Flags: flags, CurTab: iTabCur,\n\t\tFirstTab: iTabFirst, Selected: ctabSel, TabRatio: wTabRatio };\n}\n\n/* 2.4.122 TODO */\nfunction parse_Font(blob, length, opts) {\n\tblob.l += 14;\n\tvar name = parse_ShortXLUnicodeString(blob, 0, opts);\n\treturn name;\n}\n\n/* 2.4.149 */\nfunction parse_LabelSst(blob, length) {\n\tvar cell = parse_XLSCell(blob);\n\tcell.isst = blob.read_shift(4);\n\treturn cell;\n}\n\n/* 2.4.148 */\nfunction parse_Label(blob, length, opts) {\n\tvar cell = parse_XLSCell(blob, 6);\n\tvar str = parse_XLUnicodeString(blob, length-6, opts);\n\tcell.val = str;\n\treturn cell;\n}\n\n/* 2.4.126 Number Formats */\nfunction parse_Format(blob, length, opts) {\n\tvar ifmt = blob.read_shift(2);\n\tvar fmtstr = parse_XLUnicodeString2(blob, 0, opts);\n\treturn [ifmt, fmtstr];\n}\n\n/* 2.4.90 */\nfunction parse_Dimensions(blob, length) {\n\tvar w = length === 10 ? 2 : 4;\n\tvar r = blob.read_shift(w), R = blob.read_shift(w),\n\t c = blob.read_shift(2), C = blob.read_shift(2);\n\tblob.l += 2;\n\treturn {s: {r:r, c:c}, e: {r:R, c:C}};\n}\n\n/* 2.4.220 */\nfunction parse_RK(blob, length) {\n\tvar rw = blob.read_shift(2), col = blob.read_shift(2);\n\tvar rkrec = parse_RkRec(blob);\n\treturn {r:rw, c:col, ixfe:rkrec[0], rknum:rkrec[1]};\n}\n\n/* 2.4.175 */\nfunction parse_MulRk(blob, length) {\n\tvar target = blob.l + length - 2;\n\tvar rw = blob.read_shift(2), col = blob.read_shift(2);\n\tvar rkrecs = [];\n\twhile(blob.l < target) rkrecs.push(parse_RkRec(blob));\n\tif(blob.l !== target) throw \"MulRK read error\";\n\tvar lastcol = blob.read_shift(2);\n\tif(rkrecs.length != lastcol - col + 1) throw \"MulRK length mismatch\";\n\treturn {r:rw, c:col, C:lastcol, rkrec:rkrecs};\n}\n\n/* 2.5.20 2.5.249 TODO */\nfunction parse_CellStyleXF(blob, length, style) {\n\tvar o = {};\n\tvar a = blob.read_shift(4), b = blob.read_shift(4);\n\tvar c = blob.read_shift(4), d = blob.read_shift(2);\n\to.patternType = XLSFillPattern[c >> 26];\n\to.icvFore = d & 0x7F;\n\to.icvBack = (d >> 7) & 0x7F;\n\treturn o;\n}\nfunction parse_CellXF(blob, length) {return parse_CellStyleXF(blob,length,0);}\nfunction parse_StyleXF(blob, length) {return parse_CellStyleXF(blob,length,1);}\n\n/* 2.4.353 TODO: actually do this right */\nfunction parse_XF(blob, length) {\n\tvar o = {};\n\to.ifnt = blob.read_shift(2); o.ifmt = blob.read_shift(2); o.flags = blob.read_shift(2);\n\to.fStyle = (o.flags >> 2) & 0x01;\n\tlength -= 6;\n\to.data = parse_CellStyleXF(blob, length, o.fStyle);\n\treturn o;\n}\n\n/* 2.4.134 */\nfunction parse_Guts(blob, length) {\n\tblob.l += 4;\n\tvar out = [blob.read_shift(2), blob.read_shift(2)];\n\tif(out[0] !== 0) out[0]--;\n\tif(out[1] !== 0) out[1]--;\n\tif(out[0] > 7 || out[1] > 7) throw \"Bad Gutters: \" + out;\n\treturn out;\n}\n\n/* 2.4.24 */\nfunction parse_BoolErr(blob, length) {\n\tvar cell = parse_XLSCell(blob, 6);\n\tvar val = parse_Bes(blob, 2);\n\tcell.val = val;\n\tcell.t = (val === true || val === false) ? 'b' : 'e';\n\treturn cell;\n}\n\n/* 2.4.180 Number */\nfunction parse_Number(blob, length) {\n\tvar cell = parse_XLSCell(blob, 6);\n\tvar xnum = parse_Xnum(blob, 8);\n\tcell.val = xnum;\n\treturn cell;\n}\n\nvar parse_XLHeaderFooter = parse_OptXLUnicodeString; // TODO: parse 2.4.136\n\n/* 2.4.271 */\nfunction parse_SupBook(blob, length, opts) {\n\tvar end = blob.l + length;\n\tvar ctab = blob.read_shift(2);\n\tvar cch = blob.read_shift(2);\n\tvar virtPath;\n\tif(cch >=0x01 && cch <=0xff) virtPath = parse_XLUnicodeStringNoCch(blob, cch);\n\tvar rgst = blob.read_shift(end - blob.l);\n\topts.sbcch = cch;\n\treturn [cch, ctab, virtPath, rgst];\n}\n\n/* 2.4.105 TODO */\nfunction parse_ExternName(blob, length, opts) {\n\tvar flags = blob.read_shift(2);\n\tvar body;\n\tvar o = {\n\t\tfBuiltIn: flags & 0x01,\n\t\tfWantAdvise: (flags >>> 1) & 0x01,\n\t\tfWantPict: (flags >>> 2) & 0x01,\n\t\tfOle: (flags >>> 3) & 0x01,\n\t\tfOleLink: (flags >>> 4) & 0x01,\n\t\tcf: (flags >>> 5) & 0x3FF,\n\t\tfIcon: flags >>> 15 & 0x01\n\t};\n\tif(opts.sbcch === 0x3A01) body = parse_AddinUdf(blob, length-2);\n\t//else throw new Error(\"unsupported SupBook cch: \" + opts.sbcch);\n\to.body = body || blob.read_shift(length-2);\n\treturn o;\n}\n\n/* 2.4.150 TODO */\nfunction parse_Lbl(blob, length, opts) {\n\tif(opts.biff < 8) return parse_Label(blob, length, opts);\n\tvar target = blob.l + length;\n\tvar flags = blob.read_shift(2);\n\tvar chKey = blob.read_shift(1);\n\tvar cch = blob.read_shift(1);\n\tvar cce = blob.read_shift(2);\n\tblob.l += 2;\n\tvar itab = blob.read_shift(2);\n\tblob.l += 4;\n\tvar name = parse_XLUnicodeStringNoCch(blob, cch, opts);\n\tvar rgce = parse_NameParsedFormula(blob, target - blob.l, opts, cce);\n\treturn {\n\t\tchKey: chKey,\n\t\tName: name,\n\t\trgce: rgce\n\t};\n}\n\n/* 2.4.106 TODO: verify supbook manipulation */\nfunction parse_ExternSheet(blob, length, opts) {\n\tif(opts.biff < 8) return parse_ShortXLUnicodeString(blob, length, opts);\n\tvar o = parslurp2(blob,length,parse_XTI);\n\tvar oo = [];\n\tif(opts.sbcch === 0x0401) {\n\t\tfor(var i = 0; i != o.length; ++i) oo.push(opts.snames[o[i][1]]);\n\t\treturn oo;\n\t}\n\telse return o;\n}\n\n/* 2.4.260 */\nfunction parse_ShrFmla(blob, length, opts) {\n\tvar ref = parse_RefU(blob, 6);\n\tblob.l++;\n\tvar cUse = blob.read_shift(1);\n\tlength -= 8;\n\treturn [parse_SharedParsedFormula(blob, length, opts), cUse];\n}\n\n/* 2.4.4 TODO */\nfunction parse_Array(blob, length, opts) {\n\tvar ref = parse_Ref(blob, 6);\n\tblob.l += 6; length -= 12; /* TODO: fAlwaysCalc */\n\treturn [ref, parse_ArrayParsedFormula(blob, length, opts, ref)];\n}\n\n/* 2.4.173 */\nfunction parse_MTRSettings(blob, length) {\n\tvar fMTREnabled = blob.read_shift(4) !== 0x00;\n\tvar fUserSetThreadCount = blob.read_shift(4) !== 0x00;\n\tvar cUserThreadCount = blob.read_shift(4);\n\treturn [fMTREnabled, fUserSetThreadCount, cUserThreadCount];\n}\n\n/* 2.5.186 TODO: BIFF5 */\nfunction parse_NoteSh(blob, length, opts) {\n\tif(opts.biff < 8) return;\n\tvar row = blob.read_shift(2), col = blob.read_shift(2);\n\tvar flags = blob.read_shift(2), idObj = blob.read_shift(2);\n\tvar stAuthor = parse_XLUnicodeString2(blob, 0, opts);\n\tif(opts.biff < 8) blob.read_shift(1);\n\treturn [{r:row,c:col}, stAuthor, idObj, flags];\n}\n\n/* 2.4.179 */\nfunction parse_Note(blob, length, opts) {\n\t/* TODO: Support revisions */\n\treturn parse_NoteSh(blob, length, opts);\n}\n\n/* 2.4.168 */\nfunction parse_MergeCells(blob, length) {\n\tvar merges = [];\n\tvar cmcs = blob.read_shift(2);\n\twhile (cmcs--) merges.push(parse_Ref8U(blob,length));\n\treturn merges;\n}\n\n/* 2.4.181 TODO: parse all the things! */\nfunction parse_Obj(blob, length) {\n\tvar cmo = parse_FtCmo(blob, 22); // id, ot, flags\n\tvar fts = parse_FtArray(blob, length-22, cmo[1]);\n\treturn { cmo: cmo, ft:fts };\n}\n\n/* 2.4.329 TODO: parse properly */\nfunction parse_TxO(blob, length, opts) {\n\tvar s = blob.l;\ntry {\n\tblob.l += 4;\n\tvar ot = (opts.lastobj||{cmo:[0,0]}).cmo[1];\n\tvar controlInfo;\n\tif([0,5,7,11,12,14].indexOf(ot) == -1) blob.l += 6;\n\telse controlInfo = parse_ControlInfo(blob, 6, opts);\n\tvar cchText = blob.read_shift(2);\n\tvar cbRuns = blob.read_shift(2);\n\tvar ifntEmpty = parse_FontIndex(blob, 2);\n\tvar len = blob.read_shift(2);\n\tblob.l += len;\n\t//var fmla = parse_ObjFmla(blob, s + length - blob.l);\n\n\tvar texts = \"\";\n\tfor(var i = 1; i < blob.lens.length-1; ++i) {\n\t\tif(blob.l-s != blob.lens[i]) throw \"TxO: bad continue record\";\n\t\tvar hdr = blob[blob.l];\n\t\tvar t = parse_XLUnicodeStringNoCch(blob, blob.lens[i+1]-blob.lens[i]-1);\n\t\ttexts += t;\n\t\tif(texts.length >= (hdr ? cchText : 2*cchText)) break;\n\t}\n\tif(texts.length !== cchText && texts.length !== cchText*2) {\n\t\tthrow \"cchText: \" + cchText + \" != \" + texts.length;\n\t}\n\n\tblob.l = s + length;\n\t/* 2.5.272 TxORuns */\n//\tvar rgTxoRuns = [];\n//\tfor(var j = 0; j != cbRuns/8-1; ++j) blob.l += 8;\n//\tvar cchText2 = blob.read_shift(2);\n//\tif(cchText2 !== cchText) throw \"TxOLastRun mismatch: \" + cchText2 + \" \" + cchText;\n//\tblob.l += 6;\n//\tif(s + length != blob.l) throw \"TxO \" + (s + length) + \", at \" + blob.l;\n\treturn { t: texts };\n} catch(e) { blob.l = s + length; return { t: texts||\"\" }; }\n}\n\n/* 2.4.140 */\nvar parse_HLink = function(blob, length) {\n\tvar ref = parse_Ref8U(blob, 8);\n\tblob.l += 16; /* CLSID */\n\tvar hlink = parse_Hyperlink(blob, length-24);\n\treturn [ref, hlink];\n};\n\n/* 2.4.141 */\nvar parse_HLinkTooltip = function(blob, length) {\n\tvar end = blob.l + length;\n\tblob.read_shift(2);\n\tvar ref = parse_Ref8U(blob, 8);\n\tvar wzTooltip = blob.read_shift((length-10)/2, 'dbcs-cont');\n\twzTooltip = wzTooltip.replace(chr0,\"\");\n\treturn [ref, wzTooltip];\n};\n\n/* 2.4.63 */\nfunction parse_Country(blob, length) {\n\tvar o = [], d;\n\td = blob.read_shift(2); o[0] = CountryEnum[d] || d;\n\td = blob.read_shift(2); o[1] = CountryEnum[d] || d;\n\treturn o;\n}\n\n/* 2.4.50 ClrtClient */\nfunction parse_ClrtClient(blob, length) {\n\tvar ccv = blob.read_shift(2);\n\tvar o = [];\n\twhile(ccv-->0) o.push(parse_LongRGB(blob, 8));\n\treturn o;\n}\n\n/* 2.4.188 */\nfunction parse_Palette(blob, length) {\n\tvar ccv = blob.read_shift(2);\n\tvar o = [];\n\twhile(ccv-->0) o.push(parse_LongRGB(blob, 8));\n\treturn o;\n}\n\n/* 2.4.354 */\nfunction parse_XFCRC(blob, length) {\n\tblob.l += 2;\n\tvar o = {cxfs:0, crc:0};\n\to.cxfs = blob.read_shift(2);\n\to.crc = blob.read_shift(4);\n\treturn o;\n}\n\n\nvar parse_Style = parsenoop;\nvar parse_StyleExt = parsenoop;\n\nvar parse_ColInfo = parsenoop;\n\nvar parse_Window2 = parsenoop;\n\n\nvar parse_Backup = parsebool; /* 2.4.14 */\nvar parse_Blank = parse_XLSCell; /* 2.4.20 Just the cell */\nvar parse_BottomMargin = parse_Xnum; /* 2.4.27 */\nvar parse_BuiltInFnGroupCount = parseuint16; /* 2.4.30 0x0E or 0x10 but excel 2011 generates 0x11? */\nvar parse_CalcCount = parseuint16; /* 2.4.31 #Iterations */\nvar parse_CalcDelta = parse_Xnum; /* 2.4.32 */\nvar parse_CalcIter = parsebool; /* 2.4.33 1=iterative calc */\nvar parse_CalcMode = parseuint16; /* 2.4.34 0=manual, 1=auto (def), 2=table */\nvar parse_CalcPrecision = parsebool; /* 2.4.35 */\nvar parse_CalcRefMode = parsenoop2; /* 2.4.36 */\nvar parse_CalcSaveRecalc = parsebool; /* 2.4.37 */\nvar parse_CodePage = parseuint16; /* 2.4.52 */\nvar parse_Compat12 = parsebool; /* 2.4.54 true = no compatibility check */\nvar parse_Date1904 = parsebool; /* 2.4.77 - 1=1904,0=1900 */\nvar parse_DefColWidth = parseuint16; /* 2.4.89 */\nvar parse_DSF = parsenoop2; /* 2.4.94 -- MUST be ignored */\nvar parse_EntExU2 = parsenoop2; /* 2.4.102 -- Explicitly says to ignore */\nvar parse_EOF = parsenoop2; /* 2.4.103 */\nvar parse_Excel9File = parsenoop2; /* 2.4.104 -- Optional and unused */\nvar parse_FeatHdr = parsenoop2; /* 2.4.112 */\nvar parse_FontX = parseuint16; /* 2.4.123 */\nvar parse_Footer = parse_XLHeaderFooter; /* 2.4.124 */\nvar parse_GridSet = parseuint16; /* 2.4.132, =1 */\nvar parse_HCenter = parsebool; /* 2.4.135 sheet centered horizontal on print */\nvar parse_Header = parse_XLHeaderFooter; /* 2.4.136 */\nvar parse_HideObj = parse_HideObjEnum; /* 2.4.139 */\nvar parse_InterfaceEnd = parsenoop2; /* 2.4.145 -- noop */\nvar parse_LeftMargin = parse_Xnum; /* 2.4.151 */\nvar parse_Mms = parsenoop2; /* 2.4.169 -- Explicitly says to ignore */\nvar parse_ObjProtect = parsebool; /* 2.4.183 -- must be 1 if present */\nvar parse_Password = parseuint16; /* 2.4.191 */\nvar parse_PrintGrid = parsebool; /* 2.4.202 */\nvar parse_PrintRowCol = parsebool; /* 2.4.203 */\nvar parse_PrintSize = parseuint16; /* 2.4.204 0:3 */\nvar parse_Prot4Rev = parsebool; /* 2.4.205 */\nvar parse_Prot4RevPass = parseuint16; /* 2.4.206 */\nvar parse_Protect = parsebool; /* 2.4.207 */\nvar parse_RefreshAll = parsebool; /* 2.4.217 -- must be 0 if not template */\nvar parse_RightMargin = parse_Xnum; /* 2.4.219 */\nvar parse_RRTabId = parseuint16a; /* 2.4.241 */\nvar parse_ScenarioProtect = parsebool; /* 2.4.245 */\nvar parse_Scl = parseuint16a; /* 2.4.247 num, den */\nvar parse_String = parse_XLUnicodeString; /* 2.4.268 */\nvar parse_SxBool = parsebool; /* 2.4.274 */\nvar parse_TopMargin = parse_Xnum; /* 2.4.328 */\nvar parse_UsesELFs = parsebool; /* 2.4.337 -- should be 0 */\nvar parse_VCenter = parsebool; /* 2.4.342 */\nvar parse_WinProtect = parsebool; /* 2.4.347 */\nvar parse_WriteProtect = parsenoop; /* 2.4.350 empty record */\n\n\n/* ---- */\nvar parse_VerticalPageBreaks = parsenoop;\nvar parse_HorizontalPageBreaks = parsenoop;\nvar parse_Selection = parsenoop;\nvar parse_Continue = parsenoop;\nvar parse_Pane = parsenoop;\nvar parse_Pls = parsenoop;\nvar parse_DCon = parsenoop;\nvar parse_DConRef = parsenoop;\nvar parse_DConName = parsenoop;\nvar parse_XCT = parsenoop;\nvar parse_CRN = parsenoop;\nvar parse_FileSharing = parsenoop;\nvar parse_Uncalced = parsenoop;\nvar parse_Template = parsenoop;\nvar parse_Intl = parsenoop;\nvar parse_WsBool = parsenoop;\nvar parse_Sort = parsenoop;\nvar parse_Sync = parsenoop;\nvar parse_LPr = parsenoop;\nvar parse_DxGCol = parsenoop;\nvar parse_FnGroupName = parsenoop;\nvar parse_FilterMode = parsenoop;\nvar parse_AutoFilterInfo = parsenoop;\nvar parse_AutoFilter = parsenoop;\nvar parse_Setup = parsenoop;\nvar parse_ScenMan = parsenoop;\nvar parse_SCENARIO = parsenoop;\nvar parse_SxView = parsenoop;\nvar parse_Sxvd = parsenoop;\nvar parse_SXVI = parsenoop;\nvar parse_SxIvd = parsenoop;\nvar parse_SXLI = parsenoop;\nvar parse_SXPI = parsenoop;\nvar parse_DocRoute = parsenoop;\nvar parse_RecipName = parsenoop;\nvar parse_MulBlank = parsenoop;\nvar parse_SXDI = parsenoop;\nvar parse_SXDB = parsenoop;\nvar parse_SXFDB = parsenoop;\nvar parse_SXDBB = parsenoop;\nvar parse_SXNum = parsenoop;\nvar parse_SxErr = parsenoop;\nvar parse_SXInt = parsenoop;\nvar parse_SXString = parsenoop;\nvar parse_SXDtr = parsenoop;\nvar parse_SxNil = parsenoop;\nvar parse_SXTbl = parsenoop;\nvar parse_SXTBRGIITM = parsenoop;\nvar parse_SxTbpg = parsenoop;\nvar parse_ObProj = parsenoop;\nvar parse_SXStreamID = parsenoop;\nvar parse_DBCell = parsenoop;\nvar parse_SXRng = parsenoop;\nvar parse_SxIsxoper = parsenoop;\nvar parse_BookBool = parsenoop;\nvar parse_DbOrParamQry = parsenoop;\nvar parse_OleObjectSize = parsenoop;\nvar parse_SXVS = parsenoop;\nvar parse_BkHim = parsenoop;\nvar parse_MsoDrawingGroup = parsenoop;\nvar parse_MsoDrawing = parsenoop;\nvar parse_MsoDrawingSelection = parsenoop;\nvar parse_PhoneticInfo = parsenoop;\nvar parse_SxRule = parsenoop;\nvar parse_SXEx = parsenoop;\nvar parse_SxFilt = parsenoop;\nvar parse_SxDXF = parsenoop;\nvar parse_SxItm = parsenoop;\nvar parse_SxName = parsenoop;\nvar parse_SxSelect = parsenoop;\nvar parse_SXPair = parsenoop;\nvar parse_SxFmla = parsenoop;\nvar parse_SxFormat = parsenoop;\nvar parse_SXVDEx = parsenoop;\nvar parse_SXFormula = parsenoop;\nvar parse_SXDBEx = parsenoop;\nvar parse_RRDInsDel = parsenoop;\nvar parse_RRDHead = parsenoop;\nvar parse_RRDChgCell = parsenoop;\nvar parse_RRDRenSheet = parsenoop;\nvar parse_RRSort = parsenoop;\nvar parse_RRDMove = parsenoop;\nvar parse_RRFormat = parsenoop;\nvar parse_RRAutoFmt = parsenoop;\nvar parse_RRInsertSh = parsenoop;\nvar parse_RRDMoveBegin = parsenoop;\nvar parse_RRDMoveEnd = parsenoop;\nvar parse_RRDInsDelBegin = parsenoop;\nvar parse_RRDInsDelEnd = parsenoop;\nvar parse_RRDConflict = parsenoop;\nvar parse_RRDDefName = parsenoop;\nvar parse_RRDRstEtxp = parsenoop;\nvar parse_LRng = parsenoop;\nvar parse_CUsr = parsenoop;\nvar parse_CbUsr = parsenoop;\nvar parse_UsrInfo = parsenoop;\nvar parse_UsrExcl = parsenoop;\nvar parse_FileLock = parsenoop;\nvar parse_RRDInfo = parsenoop;\nvar parse_BCUsrs = parsenoop;\nvar parse_UsrChk = parsenoop;\nvar parse_UserBView = parsenoop;\nvar parse_UserSViewBegin = parsenoop; // overloaded\nvar parse_UserSViewEnd = parsenoop;\nvar parse_RRDUserView = parsenoop;\nvar parse_Qsi = parsenoop;\nvar parse_CondFmt = parsenoop;\nvar parse_CF = parsenoop;\nvar parse_DVal = parsenoop;\nvar parse_DConBin = parsenoop;\nvar parse_Lel = parsenoop;\nvar parse_XLSCodeName = parse_XLUnicodeString;\nvar parse_SXFDBType = parsenoop;\nvar parse_ObNoMacros = parsenoop;\nvar parse_Dv = parsenoop;\nvar parse_Index = parsenoop;\nvar parse_Table = parsenoop;\nvar parse_BigName = parsenoop;\nvar parse_ContinueBigName = parsenoop;\nvar parse_WebPub = parsenoop;\nvar parse_QsiSXTag = parsenoop;\nvar parse_DBQueryExt = parsenoop;\nvar parse_ExtString = parsenoop;\nvar parse_TxtQry = parsenoop;\nvar parse_Qsir = parsenoop;\nvar parse_Qsif = parsenoop;\nvar parse_RRDTQSIF = parsenoop;\nvar parse_OleDbConn = parsenoop;\nvar parse_WOpt = parsenoop;\nvar parse_SXViewEx = parsenoop;\nvar parse_SXTH = parsenoop;\nvar parse_SXPIEx = parsenoop;\nvar parse_SXVDTEx = parsenoop;\nvar parse_SXViewEx9 = parsenoop;\nvar parse_ContinueFrt = parsenoop;\nvar parse_RealTimeData = parsenoop;\nvar parse_ChartFrtInfo = parsenoop;\nvar parse_FrtWrapper = parsenoop;\nvar parse_StartBlock = parsenoop;\nvar parse_EndBlock = parsenoop;\nvar parse_StartObject = parsenoop;\nvar parse_EndObject = parsenoop;\nvar parse_CatLab = parsenoop;\nvar parse_YMult = parsenoop;\nvar parse_SXViewLink = parsenoop;\nvar parse_PivotChartBits = parsenoop;\nvar parse_FrtFontList = parsenoop;\nvar parse_SheetExt = parsenoop;\nvar parse_BookExt = parsenoop;\nvar parse_SXAddl = parsenoop;\nvar parse_CrErr = parsenoop;\nvar parse_HFPicture = parsenoop;\nvar parse_Feat = parsenoop;\nvar parse_DataLabExt = parsenoop;\nvar parse_DataLabExtContents = parsenoop;\nvar parse_CellWatch = parsenoop;\nvar parse_FeatHdr11 = parsenoop;\nvar parse_Feature11 = parsenoop;\nvar parse_DropDownObjIds = parsenoop;\nvar parse_ContinueFrt11 = parsenoop;\nvar parse_DConn = parsenoop;\nvar parse_List12 = parsenoop;\nvar parse_Feature12 = parsenoop;\nvar parse_CondFmt12 = parsenoop;\nvar parse_CF12 = parsenoop;\nvar parse_CFEx = parsenoop;\nvar parse_AutoFilter12 = parsenoop;\nvar parse_ContinueFrt12 = parsenoop;\nvar parse_MDTInfo = parsenoop;\nvar parse_MDXStr = parsenoop;\nvar parse_MDXTuple = parsenoop;\nvar parse_MDXSet = parsenoop;\nvar parse_MDXProp = parsenoop;\nvar parse_MDXKPI = parsenoop;\nvar parse_MDB = parsenoop;\nvar parse_PLV = parsenoop;\nvar parse_DXF = parsenoop;\nvar parse_TableStyles = parsenoop;\nvar parse_TableStyle = parsenoop;\nvar parse_TableStyleElement = parsenoop;\nvar parse_NamePublish = parsenoop;\nvar parse_NameCmt = parsenoop;\nvar parse_SortData = parsenoop;\nvar parse_GUIDTypeLib = parsenoop;\nvar parse_FnGrp12 = parsenoop;\nvar parse_NameFnGrp12 = parsenoop;\nvar parse_HeaderFooter = parsenoop;\nvar parse_CrtLayout12 = parsenoop;\nvar parse_CrtMlFrt = parsenoop;\nvar parse_CrtMlFrtContinue = parsenoop;\nvar parse_ShapePropsStream = parsenoop;\nvar parse_TextPropsStream = parsenoop;\nvar parse_RichTextStream = parsenoop;\nvar parse_CrtLayout12A = parsenoop;\nvar parse_Units = parsenoop;\nvar parse_Chart = parsenoop;\nvar parse_Series = parsenoop;\nvar parse_DataFormat = parsenoop;\nvar parse_LineFormat = parsenoop;\nvar parse_MarkerFormat = parsenoop;\nvar parse_AreaFormat = parsenoop;\nvar parse_PieFormat = parsenoop;\nvar parse_AttachedLabel = parsenoop;\nvar parse_SeriesText = parsenoop;\nvar parse_ChartFormat = parsenoop;\nvar parse_Legend = parsenoop;\nvar parse_SeriesList = parsenoop;\nvar parse_Bar = parsenoop;\nvar parse_Line = parsenoop;\nvar parse_Pie = parsenoop;\nvar parse_Area = parsenoop;\nvar parse_Scatter = parsenoop;\nvar parse_CrtLine = parsenoop;\nvar parse_Axis = parsenoop;\nvar parse_Tick = parsenoop;\nvar parse_ValueRange = parsenoop;\nvar parse_CatSerRange = parsenoop;\nvar parse_AxisLine = parsenoop;\nvar parse_CrtLink = parsenoop;\nvar parse_DefaultText = parsenoop;\nvar parse_Text = parsenoop;\nvar parse_ObjectLink = parsenoop;\nvar parse_Frame = parsenoop;\nvar parse_Begin = parsenoop;\nvar parse_End = parsenoop;\nvar parse_PlotArea = parsenoop;\nvar parse_Chart3d = parsenoop;\nvar parse_PicF = parsenoop;\nvar parse_DropBar = parsenoop;\nvar parse_Radar = parsenoop;\nvar parse_Surf = parsenoop;\nvar parse_RadarArea = parsenoop;\nvar parse_AxisParent = parsenoop;\nvar parse_LegendException = parsenoop;\nvar parse_ShtProps = parsenoop;\nvar parse_SerToCrt = parsenoop;\nvar parse_AxesUsed = parsenoop;\nvar parse_SBaseRef = parsenoop;\nvar parse_SerParent = parsenoop;\nvar parse_SerAuxTrend = parsenoop;\nvar parse_IFmtRecord = parsenoop;\nvar parse_Pos = parsenoop;\nvar parse_AlRuns = parsenoop;\nvar parse_BRAI = parsenoop;\nvar parse_SerAuxErrBar = parsenoop;\nvar parse_SerFmt = parsenoop;\nvar parse_Chart3DBarShape = parsenoop;\nvar parse_Fbi = parsenoop;\nvar parse_BopPop = parsenoop;\nvar parse_AxcExt = parsenoop;\nvar parse_Dat = parsenoop;\nvar parse_PlotGrowth = parsenoop;\nvar parse_SIIndex = parsenoop;\nvar parse_GelFrame = parsenoop;\nvar parse_BopPopCustom = parsenoop;\nvar parse_Fbi2 = parsenoop;\n\n/* --- Specific to versions before BIFF8 --- */\nfunction parse_BIFF5String(blob) {\n\tvar len = blob.read_shift(1);\n\treturn blob.read_shift(len, 'sbcs-cont');\n}\n\n/* BIFF2_??? where ??? is the name from [XLS] */\nfunction parse_BIFF2STR(blob, length, opts) {\n\tvar cell = parse_XLSCell(blob, 6);\n\t++blob.l;\n\tvar str = parse_XLUnicodeString2(blob, length-7, opts);\n\tcell.val = str;\n\treturn cell;\n}\n\nfunction parse_BIFF2NUM(blob, length, opts) {\n\tvar cell = parse_XLSCell(blob, 6);\n\t++blob.l;\n\tvar num = parse_Xnum(blob, 8);\n\tcell.val = num;\n\treturn cell;\n}\n\n/* 18.4.1 charset to codepage mapping */\nvar CS2CP = {\n\t0: 1252, /* ANSI */\n\t1: 65001, /* DEFAULT */\n\t2: 65001, /* SYMBOL */\n\t77: 10000, /* MAC */\n\t128: 932, /* SHIFTJIS */\n\t129: 949, /* HANGUL */\n\t130: 1361, /* JOHAB */\n\t134: 936, /* GB2312 */\n\t136: 950, /* CHINESEBIG5 */\n\t161: 1253, /* GREEK */\n\t162: 1254, /* TURKISH */\n\t163: 1258, /* VIETNAMESE */\n\t177: 1255, /* HEBREW */\n\t178: 1256, /* ARABIC */\n\t186: 1257, /* BALTIC */\n\t204: 1251, /* RUSSIAN */\n\t222: 874, /* THAI */\n\t238: 1250, /* EASTEUROPE */\n\t255: 1252, /* OEM */\n\t69: 6969 /* MISC */\n};\n\n/* Parse a list of <r> tags */\nvar parse_rs = (function parse_rs_factory() {\n\tvar tregex = matchtag(\"t\"), rpregex = matchtag(\"rPr\"), rregex = /<r>/g, rend = /<\\/r>/, nlregex = /\\r\\n/g;\n\t/* 18.4.7 rPr CT_RPrElt */\n\tvar parse_rpr = function parse_rpr(rpr, intro, outro) {\n\t\tvar font = {}, cp = 65001;\n\t\tvar m = rpr.match(tagregex), i = 0;\n\t\tif(m) for(;i!=m.length; ++i) {\n\t\t\tvar y = parsexmltag(m[i]);\n\t\t\tswitch(y[0]) {\n\t\t\t\t/* 18.8.12 condense CT_BooleanProperty */\n\t\t\t\t/* ** not required . */\n\t\t\t\tcase '<condense': break;\n\t\t\t\t/* 18.8.17 extend CT_BooleanProperty */\n\t\t\t\t/* ** not required . */\n\t\t\t\tcase '<extend': break;\n\t\t\t\t/* 18.8.36 shadow CT_BooleanProperty */\n\t\t\t\t/* ** not required . */\n\t\t\t\tcase '<shadow':\n\t\t\t\t\t/* falls through */\n\t\t\t\tcase '<shadow/>': break;\n\n\t\t\t\t/* 18.4.1 charset CT_IntProperty TODO */\n\t\t\t\tcase '<charset':\n\t\t\t\t\tif(y.val == '1') break;\n\t\t\t\t\tcp = CS2CP[parseInt(y.val, 10)];\n\t\t\t\t\tbreak;\n\n\t\t\t\t/* 18.4.2 outline CT_BooleanProperty TODO */\n\t\t\t\tcase '<outline':\n\t\t\t\t\t/* falls through */\n\t\t\t\tcase '<outline/>': break;\n\n\t\t\t\t/* 18.4.5 rFont CT_FontName */\n\t\t\t\tcase '<rFont': font.name = y.val; break;\n\n\t\t\t\t/* 18.4.11 sz CT_FontSize */\n\t\t\t\tcase '<sz': font.sz = y.val; break;\n\n\t\t\t\t/* 18.4.10 strike CT_BooleanProperty */\n\t\t\t\tcase '<strike':\n\t\t\t\t\tif(!y.val) break;\n\t\t\t\t\t/* falls through */\n\t\t\t\tcase '<strike/>': font.strike = 1; break;\n\t\t\t\tcase '</strike>': break;\n\n\t\t\t\t/* 18.4.13 u CT_UnderlineProperty */\n\t\t\t\tcase '<u':\n\t\t\t\t\tif(!y.val) break;\n\t\t\t\t\t/* falls through */\n\t\t\t\tcase '<u/>': font.u = 1; break;\n\t\t\t\tcase '</u>': break;\n\n\t\t\t\t/* 18.8.2 b */\n\t\t\t\tcase '<b':\n\t\t\t\t\tif(!y.val) break;\n\t\t\t\t\t/* falls through */\n\t\t\t\tcase '<b/>': font.b = 1; break;\n\t\t\t\tcase '</b>': break;\n\n\t\t\t\t/* 18.8.26 i */\n\t\t\t\tcase '<i':\n\t\t\t\t\tif(!y.val) break;\n\t\t\t\t\t/* falls through */\n\t\t\t\tcase '<i/>': font.i = 1; break;\n\t\t\t\tcase '</i>': break;\n\n\t\t\t\t/* 18.3.1.15 color CT_Color TODO: tint, theme, auto, indexed */\n\t\t\t\tcase '<color':\n\t\t\t\t\tif(y.rgb) font.color = y.rgb.substr(2,6);\n\t\t\t\t\tbreak;\n\n\t\t\t\t/* 18.8.18 family ST_FontFamily */\n\t\t\t\tcase '<family': font.family = y.val; break;\n\n\t\t\t\t/* 18.4.14 vertAlign CT_VerticalAlignFontProperty TODO */\n\t\t\t\tcase '<vertAlign': break;\n\n\t\t\t\t/* 18.8.35 scheme CT_FontScheme TODO */\n\t\t\t\tcase '<scheme': break;\n\n\t\t\t\tdefault:\n\t\t\t\t\tif(y[0].charCodeAt(1) !== 47) throw 'Unrecognized rich format ' + y[0];\n\t\t\t}\n\t\t}\n\t\t/* TODO: These should be generated styles, not inline */\n\t\tvar style = [];\n\t\tif(font.b) style.push(\"font-weight: bold;\");\n\t\tif(font.i) style.push(\"font-style: italic;\");\n\t\tintro.push('<span style=\"' + style.join(\"\") + '\">');\n\t\toutro.push(\"</span>\");\n\t\treturn cp;\n\t};\n\n\t/* 18.4.4 r CT_RElt */\n\tfunction parse_r(r) {\n\t\tvar terms = [[],\"\",[]];\n\t\t/* 18.4.12 t ST_Xstring */\n\t\tvar t = r.match(tregex), cp = 65001;\n\t\tif(!isval(t)) return \"\";\n\t\tterms[1] = t[1];\n\n\t\tvar rpr = r.match(rpregex);\n\t\tif(isval(rpr)) cp = parse_rpr(rpr[1], terms[0], terms[2]);\n\n\t\treturn terms[0].join(\"\") + terms[1].replace(nlregex,'<br/>') + terms[2].join(\"\");\n\t}\n\treturn function parse_rs(rs) {\n\t\treturn rs.replace(rregex,\"\").split(rend).map(parse_r).join(\"\");\n\t};\n})();\n\n/* 18.4.8 si CT_Rst */\nvar sitregex = /<t[^>]*>([^<]*)<\\/t>/g, sirregex = /<r>/;\nfunction parse_si(x, opts) {\n\tvar html = opts ? opts.cellHTML : true;\n\tvar z = {};\n\tif(!x) return null;\n\tvar y;\n\t/* 18.4.12 t ST_Xstring (Plaintext String) */\n\tif(x.charCodeAt(1) === 116) {\n\t\tz.t = utf8read(unescapexml(x.substr(x.indexOf(\">\")+1).split(/<\\/t>/)[0]));\n\t\tz.r = x;\n\t\tif(html) z.h = z.t;\n\t}\n\t/* 18.4.4 r CT_RElt (Rich Text Run) */\n\telse if((y = x.match(sirregex))) {\n\t\tz.r = x;\n\t\tz.t = utf8read(unescapexml(x.match(sitregex).join(\"\").replace(tagregex,\"\")));\n\t\tif(html) z.h = parse_rs(x);\n\t}\n\t/* 18.4.3 phoneticPr CT_PhoneticPr (TODO: needed for Asian support) */\n\t/* 18.4.6 rPh CT_PhoneticRun (TODO: needed for Asian support) */\n\treturn z;\n}\n\n/* 18.4 Shared String Table */\nvar sstr0 = /<sst([^>]*)>([\\s\\S]*)<\\/sst>/;\nvar sstr1 = /<(?:si|sstItem)>/g;\nvar sstr2 = /<\\/(?:si|sstItem)>/;\nfunction parse_sst_xml(data, opts) {\n\tvar s = [], ss;\n\t/* 18.4.9 sst CT_Sst */\n\tvar sst = data.match(sstr0);\n\tif(isval(sst)) {\n\t\tss = sst[2].replace(sstr1,\"\").split(sstr2);\n\t\tfor(var i = 0; i != ss.length; ++i) {\n\t\t\tvar o = parse_si(ss[i], opts);\n\t\t\tif(o != null) s[s.length] = o;\n\t\t}\n\t\tsst = parsexmltag(sst[1]); s.Count = sst.count; s.Unique = sst.uniqueCount;\n\t}\n\treturn s;\n}\n\nRELS.SST = \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings\";\nvar straywsregex = /^\\s|\\s$|[\\t\\n\\r]/;\nfunction write_sst_xml(sst, opts) {\n\tif(!opts.bookSST) return \"\";\n\tvar o = [XML_HEADER];\n\to[o.length] = (writextag('sst', null, {\n\t\txmlns: XMLNS.main[0],\n\t\tcount: sst.Count,\n\t\tuniqueCount: sst.Unique\n\t}));\n\tfor(var i = 0; i != sst.length; ++i) { if(sst[i] == null) continue;\n\t\tvar s = sst[i];\n\t\tvar sitag = \"<si>\";\n\t\tif(s.r) sitag += s.r;\n\t\telse {\n\t\t\tsitag += \"<t\";\n\t\t\tif(s.t.match(straywsregex)) sitag += ' xml:space=\"preserve\"';\n\t\t\tsitag += \">\" + escapexml(s.t) + \"</t>\";\n\t\t}\n\t\tsitag += \"</si>\";\n\t\to[o.length] = (sitag);\n\t}\n\tif(o.length>2){ o[o.length] = ('</sst>'); o[1]=o[1].replace(\"/>\",\">\"); }\n\treturn o.join(\"\");\n}\n/* [MS-XLSB] 2.4.219 BrtBeginSst */\nfunction parse_BrtBeginSst(data, length) {\n\treturn [data.read_shift(4), data.read_shift(4)];\n}\n\n/* [MS-XLSB] 2.1.7.45 Shared Strings */\nfunction parse_sst_bin(data, opts) {\n\tvar s = [];\n\tvar pass = false;\n\trecordhopper(data, function hopper_sst(val, R, RT) {\n\t\tswitch(R.n) {\n\t\t\tcase 'BrtBeginSst': s.Count = val[0]; s.Unique = val[1]; break;\n\t\t\tcase 'BrtSSTItem': s.push(val); break;\n\t\t\tcase 'BrtEndSst': return true;\n\t\t\t/* TODO: produce a test case with a future record */\n\t\t\tcase 'BrtFRTBegin': pass = true; break;\n\t\t\tcase 'BrtFRTEnd': pass = false; break;\n\t\t\tdefault: if(!pass || opts.WTF) throw new Error(\"Unexpected record \" + RT + \" \" + R.n);\n\t\t}\n\t});\n\treturn s;\n}\n\nfunction write_BrtBeginSst(sst, o) {\n\tif(!o) o = new_buf(8);\n\to.write_shift(4, sst.Count);\n\to.write_shift(4, sst.Unique);\n\treturn o;\n}\n\nvar write_BrtSSTItem = write_RichStr;\n\nfunction write_sst_bin(sst, opts) {\n\tvar ba = buf_array();\n\twrite_record(ba, \"BrtBeginSst\", write_BrtBeginSst(sst));\n\tfor(var i = 0; i < sst.length; ++i) write_record(ba, \"BrtSSTItem\", write_BrtSSTItem(sst[i]));\n\twrite_record(ba, \"BrtEndSst\");\n\treturn ba.end();\n}\nfunction _JS2ANSI(str) { if(typeof cptable !== 'undefined') return cptable.utils.encode(1252, str); return str.split(\"\").map(function(x) { return x.charCodeAt(0); }); }\n\n/* [MS-OFFCRYPTO] 2.1.4 Version */\nfunction parse_Version(blob, length) {\n\tvar o = {};\n\to.Major = blob.read_shift(2);\n\to.Minor = blob.read_shift(2);\n\treturn o;\n}\n/* [MS-OFFCRYPTO] 2.3.2 Encryption Header */\nfunction parse_EncryptionHeader(blob, length) {\n\tvar o = {};\n\to.Flags = blob.read_shift(4);\n\n\t// Check if SizeExtra is 0x00000000\n\tvar tmp = blob.read_shift(4);\n\tif(tmp !== 0) throw 'Unrecognized SizeExtra: ' + tmp;\n\n\to.AlgID = blob.read_shift(4);\n\tswitch(o.AlgID) {\n\t\tcase 0: case 0x6801: case 0x660E: case 0x660F: case 0x6610: break;\n\t\tdefault: throw 'Unrecognized encryption algorithm: ' + o.AlgID;\n\t}\n\tparsenoop(blob, length-12);\n\treturn o;\n}\n\n/* [MS-OFFCRYPTO] 2.3.3 Encryption Verifier */\nfunction parse_EncryptionVerifier(blob, length) {\n\treturn parsenoop(blob, length);\n}\n/* [MS-OFFCRYPTO] 2.3.5.1 RC4 CryptoAPI Encryption Header */\nfunction parse_RC4CryptoHeader(blob, length) {\n\tvar o = {};\n\tvar vers = o.EncryptionVersionInfo = parse_Version(blob, 4); length -= 4;\n\tif(vers.Minor != 2) throw 'unrecognized minor version code: ' + vers.Minor;\n\tif(vers.Major > 4 || vers.Major < 2) throw 'unrecognized major version code: ' + vers.Major;\n\to.Flags = blob.read_shift(4); length -= 4;\n\tvar sz = blob.read_shift(4); length -= 4;\n\to.EncryptionHeader = parse_EncryptionHeader(blob, sz); length -= sz;\n\to.EncryptionVerifier = parse_EncryptionVerifier(blob, length);\n\treturn o;\n}\n/* [MS-OFFCRYPTO] 2.3.6.1 RC4 Encryption Header */\nfunction parse_RC4Header(blob, length) {\n\tvar o = {};\n\tvar vers = o.EncryptionVersionInfo = parse_Version(blob, 4); length -= 4;\n\tif(vers.Major != 1 || vers.Minor != 1) throw 'unrecognized version code ' + vers.Major + ' : ' + vers.Minor;\n\to.Salt = blob.read_shift(16);\n\to.EncryptedVerifier = blob.read_shift(16);\n\to.EncryptedVerifierHash = blob.read_shift(16);\n\treturn o;\n}\n\n/* [MS-OFFCRYPTO] 2.3.7.1 Binary Document Password Verifier Derivation */\nfunction crypto_CreatePasswordVerifier_Method1(Password) {\n\tvar Verifier = 0x0000, PasswordArray;\n\tvar PasswordDecoded = _JS2ANSI(Password);\n\tvar len = PasswordDecoded.length + 1, i, PasswordByte;\n\tvar Intermediate1, Intermediate2, Intermediate3;\n\tPasswordArray = new_raw_buf(len);\n\tPasswordArray[0] = PasswordDecoded.length;\n\tfor(i = 1; i != len; ++i) PasswordArray[i] = PasswordDecoded[i-1];\n\tfor(i = len-1; i >= 0; --i) {\n\t\tPasswordByte = PasswordArray[i];\n\t\tIntermediate1 = ((Verifier & 0x4000) === 0x0000) ? 0 : 1;\n\t\tIntermediate2 = (Verifier << 1) & 0x7FFF;\n\t\tIntermediate3 = Intermediate1 | Intermediate2;\n\t\tVerifier = Intermediate3 ^ PasswordByte;\n\t}\n\treturn Verifier ^ 0xCE4B;\n}\n\n/* [MS-OFFCRYPTO] 2.3.7.2 Binary Document XOR Array Initialization */\nvar crypto_CreateXorArray_Method1 = (function() {\n\tvar PadArray = [0xBB, 0xFF, 0xFF, 0xBA, 0xFF, 0xFF, 0xB9, 0x80, 0x00, 0xBE, 0x0F, 0x00, 0xBF, 0x0F, 0x00];\n\tvar InitialCode = [0xE1F0, 0x1D0F, 0xCC9C, 0x84C0, 0x110C, 0x0E10, 0xF1CE, 0x313E, 0x1872, 0xE139, 0xD40F, 0x84F9, 0x280C, 0xA96A, 0x4EC3];\n\tvar XorMatrix = [0xAEFC, 0x4DD9, 0x9BB2, 0x2745, 0x4E8A, 0x9D14, 0x2A09, 0x7B61, 0xF6C2, 0xFDA5, 0xEB6B, 0xC6F7, 0x9DCF, 0x2BBF, 0x4563, 0x8AC6, 0x05AD, 0x0B5A, 0x16B4, 0x2D68, 0x5AD0, 0x0375, 0x06EA, 0x0DD4, 0x1BA8, 0x3750, 0x6EA0, 0xDD40, 0xD849, 0xA0B3, 0x5147, 0xA28E, 0x553D, 0xAA7A, 0x44D5, 0x6F45, 0xDE8A, 0xAD35, 0x4A4B, 0x9496, 0x390D, 0x721A, 0xEB23, 0xC667, 0x9CEF, 0x29FF, 0x53FE, 0xA7FC, 0x5FD9, 0x47D3, 0x8FA6, 0x0F6D, 0x1EDA, 0x3DB4, 0x7B68, 0xF6D0, 0xB861, 0x60E3, 0xC1C6, 0x93AD, 0x377B, 0x6EF6, 0xDDEC, 0x45A0, 0x8B40, 0x06A1, 0x0D42, 0x1A84, 0x3508, 0x6A10, 0xAA51, 0x4483, 0x8906, 0x022D, 0x045A, 0x08B4, 0x1168, 0x76B4, 0xED68, 0xCAF1, 0x85C3, 0x1BA7, 0x374E, 0x6E9C, 0x3730, 0x6E60, 0xDCC0, 0xA9A1, 0x4363, 0x86C6, 0x1DAD, 0x3331, 0x6662, 0xCCC4, 0x89A9, 0x0373, 0x06E6, 0x0DCC, 0x1021, 0x2042, 0x4084, 0x8108, 0x1231, 0x2462, 0x48C4];\n\tvar Ror = function(Byte) { return ((Byte/2) | (Byte*128)) & 0xFF; };\n\tvar XorRor = function(byte1, byte2) { return Ror(byte1 ^ byte2); };\n\tvar CreateXorKey_Method1 = function(Password) {\n\t\tvar XorKey = InitialCode[Password.length - 1];\n\t\tvar CurrentElement = 0x68;\n\t\tfor(var i = Password.length-1; i >= 0; --i) {\n\t\t\tvar Char = Password[i];\n\t\t\tfor(var j = 0; j != 7; ++j) {\n\t\t\t\tif(Char & 0x40) XorKey ^= XorMatrix[CurrentElement];\n\t\t\t\tChar *= 2; --CurrentElement;\n\t\t\t}\n\t\t}\n\t\treturn XorKey;\n\t};\n\treturn function(password) {\n\t\tvar Password = _JS2ANSI(password);\n\t\tvar XorKey = CreateXorKey_Method1(Password);\n\t\tvar Index = Password.length;\n\t\tvar ObfuscationArray = new_raw_buf(16);\n\t\tfor(var i = 0; i != 16; ++i) ObfuscationArray[i] = 0x00;\n\t\tvar Temp, PasswordLastChar, PadIndex;\n\t\tif((Index & 1) === 1) {\n\t\t\tTemp = XorKey >> 8;\n\t\t\tObfuscationArray[Index] = XorRor(PadArray[0], Temp);\n\t\t\t--Index;\n\t\t\tTemp = XorKey & 0xFF;\n\t\t\tPasswordLastChar = Password[Password.length - 1];\n\t\t\tObfuscationArray[Index] = XorRor(PasswordLastChar, Temp);\n\t\t}\n\t\twhile(Index > 0) {\n\t\t\t--Index;\n\t\t\tTemp = XorKey >> 8;\n\t\t\tObfuscationArray[Index] = XorRor(Password[Index], Temp);\n\t\t\t--Index;\n\t\t\tTemp = XorKey & 0xFF;\n\t\t\tObfuscationArray[Index] = XorRor(Password[Index], Temp);\n\t\t}\n\t\tIndex = 15;\n\t\tPadIndex = 15 - Password.length;\n\t\twhile(PadIndex > 0) {\n\t\t\tTemp = XorKey >> 8;\n\t\t\tObfuscationArray[Index] = XorRor(PadArray[PadIndex], Temp);\n\t\t\t--Index;\n\t\t\t--PadIndex;\n\t\t\tTemp = XorKey & 0xFF;\n\t\t\tObfuscationArray[Index] = XorRor(Password[Index], Temp);\n\t\t\t--Index;\n\t\t\t--PadIndex;\n\t\t}\n\t\treturn ObfuscationArray;\n\t};\n})();\n\n/* [MS-OFFCRYPTO] 2.3.7.3 Binary Document XOR Data Transformation Method 1 */\nvar crypto_DecryptData_Method1 = function(password, Data, XorArrayIndex, XorArray, O) {\n\t/* If XorArray is set, use it; if O is not set, make changes in-place */\n\tif(!O) O = Data;\n\tif(!XorArray) XorArray = crypto_CreateXorArray_Method1(password);\n\tvar Index, Value;\n\tfor(Index = 0; Index != Data.length; ++Index) {\n\t\tValue = Data[Index];\n\t\tValue ^= XorArray[XorArrayIndex];\n\t\tValue = ((Value>>5) | (Value<<3)) & 0xFF;\n\t\tO[Index] = Value;\n\t\t++XorArrayIndex;\n\t}\n\treturn [O, XorArrayIndex, XorArray];\n};\n\nvar crypto_MakeXorDecryptor = function(password) {\n\tvar XorArrayIndex = 0, XorArray = crypto_CreateXorArray_Method1(password);\n\treturn function(Data) {\n\t\tvar O = crypto_DecryptData_Method1(null, Data, XorArrayIndex, XorArray);\n\t\tXorArrayIndex = O[1];\n\t\treturn O[0];\n\t};\n};\n\n/* 2.5.343 */\nfunction parse_XORObfuscation(blob, length, opts, out) {\n\tvar o = { key: parseuint16(blob), verificationBytes: parseuint16(blob) };\n\tif(opts.password) o.verifier = crypto_CreatePasswordVerifier_Method1(opts.password);\n\tout.valid = o.verificationBytes === o.verifier;\n\tif(out.valid) out.insitu_decrypt = crypto_MakeXorDecryptor(opts.password);\n\treturn o;\n}\n\n/* 2.4.117 */\nfunction parse_FilePassHeader(blob, length, oo) {\n\tvar o = oo || {}; o.Info = blob.read_shift(2); blob.l -= 2;\n\tif(o.Info === 1) o.Data = parse_RC4Header(blob, length);\n\telse o.Data = parse_RC4CryptoHeader(blob, length);\n\treturn o;\n}\nfunction parse_FilePass(blob, length, opts) {\n\tvar o = { Type: blob.read_shift(2) }; /* wEncryptionType */\n\tif(o.Type) parse_FilePassHeader(blob, length-2, o);\n\telse parse_XORObfuscation(blob, length-2, opts, o);\n\treturn o;\n}\n\n\nfunction hex2RGB(h) {\n\tvar o = h.substr(h[0]===\"#\"?1:0,6);\n\treturn [parseInt(o.substr(0,2),16),parseInt(o.substr(0,2),16),parseInt(o.substr(0,2),16)];\n}\nfunction rgb2Hex(rgb) {\n\tfor(var i=0,o=1; i!=3; ++i) o = o*256 + (rgb[i]>255?255:rgb[i]<0?0:rgb[i]);\n\treturn o.toString(16).toUpperCase().substr(1);\n}\n\nfunction rgb2HSL(rgb) {\n\tvar R = rgb[0]/255, G = rgb[1]/255, B=rgb[2]/255;\n\tvar M = Math.max(R, G, B), m = Math.min(R, G, B), C = M - m;\n\tif(C === 0) return [0, 0, R];\n\n\tvar H6 = 0, S = 0, L2 = (M + m);\n\tS = C / (L2 > 1 ? 2 - L2 : L2);\n\tswitch(M){\n\t\tcase R: H6 = ((G - B) / C + 6)%6; break;\n\t\tcase G: H6 = ((B - R) / C + 2); break;\n\t\tcase B: H6 = ((R - G) / C + 4); break;\n\t}\n\treturn [H6 / 6, S, L2 / 2];\n}\n\nfunction hsl2RGB(hsl){\n\tvar H = hsl[0], S = hsl[1], L = hsl[2];\n\tvar C = S * 2 * (L < 0.5 ? L : 1 - L), m = L - C/2;\n\tvar rgb = [m,m,m], h6 = 6*H;\n\n\tvar X;\n\tif(S !== 0) switch(h6|0) {\n\t\tcase 0: case 6: X = C * h6; rgb[0] += C; rgb[1] += X; break;\n\t\tcase 1: X = C * (2 - h6); rgb[0] += X; rgb[1] += C; break;\n\t\tcase 2: X = C * (h6 - 2); rgb[1] += C; rgb[2] += X; break;\n\t\tcase 3: X = C * (4 - h6); rgb[1] += X; rgb[2] += C; break;\n\t\tcase 4: X = C * (h6 - 4); rgb[2] += C; rgb[0] += X; break;\n\t\tcase 5: X = C * (6 - h6); rgb[2] += X; rgb[0] += C; break;\n\t}\n\tfor(var i = 0; i != 3; ++i) rgb[i] = Math.round(rgb[i]*255);\n\treturn rgb;\n}\n\n/* 18.8.3 bgColor tint algorithm */\nfunction rgb_tint(hex, tint) {\n\tif(tint === 0) return hex;\n\tvar hsl = rgb2HSL(hex2RGB(hex));\n\tif (tint < 0) hsl[2] = hsl[2] * (1 + tint);\n\telse hsl[2] = 1 - (1 - hsl[2]) * (1 - tint);\n\treturn rgb2Hex(hsl2RGB(hsl));\n}\n\n/* 18.3.1.13 width calculations */\nvar DEF_MDW = 7, MAX_MDW = 15, MIN_MDW = 1, MDW = DEF_MDW;\nfunction width2px(width) { return (( width + ((128/MDW)|0)/256 )* MDW )|0; }\nfunction px2char(px) { return (((px - 5)/MDW * 100 + 0.5)|0)/100; }\nfunction char2width(chr) { return (((chr * MDW + 5)/MDW*256)|0)/256; }\nfunction cycle_width(collw) { return char2width(px2char(width2px(collw))); }\nfunction find_mdw(collw, coll) {\n\tif(cycle_width(collw) != collw) {\n\t\tfor(MDW=DEF_MDW; MDW>MIN_MDW; --MDW) if(cycle_width(collw) === collw) break;\n\t\tif(MDW === MIN_MDW) for(MDW=DEF_MDW+1; MDW<MAX_MDW; ++MDW) if(cycle_width(collw) === collw) break;\n\t\tif(MDW === MAX_MDW) MDW = DEF_MDW;\n\t}\n}\n\n/* [MS-EXSPXML3] 2.4.54 ST_enmPattern */\nvar XLMLPatternTypeMap = {\n\t\"None\": \"none\",\n\t\"Solid\": \"solid\",\n\t\"Gray50\": \"mediumGray\",\n\t\"Gray75\": \"darkGray\",\n\t\"Gray25\": \"lightGray\",\n\t\"HorzStripe\": \"darkHorizontal\",\n\t\"VertStripe\": \"darkVertical\",\n\t\"ReverseDiagStripe\": \"darkDown\",\n\t\"DiagStripe\": \"darkUp\",\n\t\"DiagCross\": \"darkGrid\",\n\t\"ThickDiagCross\": \"darkTrellis\",\n\t\"ThinHorzStripe\": \"lightHorizontal\",\n\t\"ThinVertStripe\": \"lightVertical\",\n\t\"ThinReverseDiagStripe\": \"lightDown\",\n\t\"ThinHorzCross\": \"lightGrid\"\n};\n\nvar styles = {}; // shared styles\n\nvar themes = {}; // shared themes\n\n/* 18.8.21 fills CT_Fills */\nfunction parse_fills(t, opts) {\n\tstyles.Fills = [];\n\tvar fill = {};\n\tt[0].match(tagregex).forEach(function(x) {\n\t\tvar y = parsexmltag(x);\n\t\tswitch(y[0]) {\n\t\t\tcase '<fills': case '<fills>': case '</fills>': break;\n\n\t\t\t/* 18.8.20 fill CT_Fill */\n\t\t\tcase '<fill>': break;\n\t\t\tcase '</fill>': styles.Fills.push(fill); fill = {}; break;\n\n\t\t\t/* 18.8.32 patternFill CT_PatternFill */\n\t\t\tcase '<patternFill':\n\t\t\t\tif(y.patternType) fill.patternType = y.patternType;\n\t\t\t\tbreak;\n\t\t\tcase '<patternFill/>': case '</patternFill>': break;\n\n\t\t\t/* 18.8.3 bgColor CT_Color */\n\t\t\tcase '<bgColor':\n\t\t\t\tif(!fill.bgColor) fill.bgColor = {};\n\t\t\t\tif(y.indexed) fill.bgColor.indexed = parseInt(y.indexed, 10);\n\t\t\t\tif(y.theme) fill.bgColor.theme = parseInt(y.theme, 10);\n\t\t\t\tif(y.tint) fill.bgColor.tint = parseFloat(y.tint);\n\t\t\t\t/* Excel uses ARGB strings */\n\t\t\t\tif(y.rgb) fill.bgColor.rgb = y.rgb.substring(y.rgb.length - 6);\n\t\t\t\tbreak;\n\t\t\tcase '<bgColor/>': case '</bgColor>': break;\n\n\t\t\t/* 18.8.19 fgColor CT_Color */\n\t\t\tcase '<fgColor':\n\t\t\t\tif(!fill.fgColor) fill.fgColor = {};\n\t\t\t\tif(y.theme) fill.fgColor.theme = parseInt(y.theme, 10);\n\t\t\t\tif(y.tint) fill.fgColor.tint = parseFloat(y.tint);\n\t\t\t\t/* Excel uses ARGB strings */\n\t\t\t\tif(y.rgb) fill.fgColor.rgb = y.rgb.substring(y.rgb.length - 6);\n\t\t\t\tbreak;\n\t\t\tcase '<fgColor/>': case '</fgColor>': break;\n\n\t\t\tdefault: if(opts.WTF) throw 'unrecognized ' + y[0] + ' in fills';\n\t\t}\n\t});\n}\n\n/* 18.8.31 numFmts CT_NumFmts */\nfunction parse_numFmts(t, opts) {\n\tstyles.NumberFmt = [];\n\tvar k = keys(SSF._table);\n\tfor(var i=0; i < k.length; ++i) styles.NumberFmt[k[i]] = SSF._table[k[i]];\n\tvar m = t[0].match(tagregex);\n\tfor(i=0; i < m.length; ++i) {\n\t\tvar y = parsexmltag(m[i]);\n\t\tswitch(y[0]) {\n\t\t\tcase '<numFmts': case '</numFmts>': case '<numFmts/>': case '<numFmts>': break;\n\t\t\tcase '<numFmt': {\n\t\t\t\tvar f=unescapexml(utf8read(y.formatCode)), j=parseInt(y.numFmtId,10);\n\t\t\t\tstyles.NumberFmt[j] = f; if(j>0) SSF.load(f,j);\n\t\t\t} break;\n\t\t\tdefault: if(opts.WTF) throw 'unrecognized ' + y[0] + ' in numFmts';\n\t\t}\n\t}\n}\n\nfunction write_numFmts(NF, opts) {\n\tvar o = [\"<numFmts>\"];\n\t[[5,8],[23,26],[41,44],[63,66],[164,392]].forEach(function(r) {\n\t\tfor(var i = r[0]; i <= r[1]; ++i) if(NF[i] !== undefined) o[o.length] = (writextag('numFmt',null,{numFmtId:i,formatCode:escapexml(NF[i])}));\n\t});\n\tif(o.length === 1) return \"\";\n\to[o.length] = (\"</numFmts>\");\n\to[0] = writextag('numFmts', null, { count:o.length-2 }).replace(\"/>\", \">\");\n\treturn o.join(\"\");\n}\n\n/* 18.8.10 cellXfs CT_CellXfs */\nfunction parse_cellXfs(t, opts) {\n\tstyles.CellXf = [];\n\tt[0].match(tagregex).forEach(function(x) {\n\t\tvar y = parsexmltag(x);\n\t\tswitch(y[0]) {\n\t\t\tcase '<cellXfs': case '<cellXfs>': case '<cellXfs/>': case '</cellXfs>': break;\n\n\t\t\t/* 18.8.45 xf CT_Xf */\n\t\t\tcase '<xf': delete y[0];\n\t\t\t\tif(y.numFmtId) y.numFmtId = parseInt(y.numFmtId, 10);\n\t\t\t\tif(y.fillId) y.fillId = parseInt(y.fillId, 10);\n\t\t\t\tstyles.CellXf.push(y); break;\n\t\t\tcase '</xf>': break;\n\n\t\t\t/* 18.8.1 alignment CT_CellAlignment */\n\t\t\tcase '<alignment': case '<alignment/>': break;\n\n\t\t\t/* 18.8.33 protection CT_CellProtection */\n\t\t\tcase '<protection': case '</protection>': case '<protection/>': break;\n\n\t\t\tcase '<extLst': case '</extLst>': break;\n\t\t\tcase '<ext': break;\n\t\t\tdefault: if(opts.WTF) throw 'unrecognized ' + y[0] + ' in cellXfs';\n\t\t}\n\t});\n}\n\nfunction write_cellXfs(cellXfs) {\n\tvar o = [];\n\to[o.length] = (writextag('cellXfs',null));\n\tcellXfs.forEach(function(c) { o[o.length] = (writextag('xf', null, c)); });\n\to[o.length] = (\"</cellXfs>\");\n\tif(o.length === 2) return \"\";\n\to[0] = writextag('cellXfs',null, {count:o.length-2}).replace(\"/>\",\">\");\n\treturn o.join(\"\");\n}\n\n/* 18.8 Styles CT_Stylesheet*/\nvar parse_sty_xml= (function make_pstyx() {\nvar numFmtRegex = /<numFmts([^>]*)>.*<\\/numFmts>/;\nvar cellXfRegex = /<cellXfs([^>]*)>.*<\\/cellXfs>/;\nvar fillsRegex = /<fills([^>]*)>.*<\\/fills>/;\n\nreturn function parse_sty_xml(data, opts) {\n\t/* 18.8.39 styleSheet CT_Stylesheet */\n\tvar t;\n\n\t/* numFmts CT_NumFmts ? */\n\tif((t=data.match(numFmtRegex))) parse_numFmts(t, opts);\n\n\t/* fonts CT_Fonts ? */\n\t/*if((t=data.match(/<fonts([^>]*)>.*<\\/fonts>/))) parse_fonts(t, opts);*/\n\n\t/* fills CT_Fills */\n\tif((t=data.match(fillsRegex))) parse_fills(t, opts);\n\n\t/* borders CT_Borders ? */\n\t/* cellStyleXfs CT_CellStyleXfs ? */\n\n\t/* cellXfs CT_CellXfs ? */\n\tif((t=data.match(cellXfRegex))) parse_cellXfs(t, opts);\n\n\t/* dxfs CT_Dxfs ? */\n\t/* tableStyles CT_TableStyles ? */\n\t/* colors CT_Colors ? */\n\t/* extLst CT_ExtensionList ? */\n\n\treturn styles;\n};\n})();\n\nvar STYLES_XML_ROOT = writextag('styleSheet', null, {\n\t'xmlns': XMLNS.main[0],\n\t'xmlns:vt': XMLNS.vt\n});\n\nRELS.STY = \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles\";\n\nfunction write_sty_xml(wb, opts) {\n\tvar o = [XML_HEADER, STYLES_XML_ROOT], w;\n\tif((w = write_numFmts(wb.SSF)) != null) o[o.length] = w;\n\to[o.length] = ('<fonts count=\"1\"><font><sz val=\"12\"/><color theme=\"1\"/><name val=\"Calibri\"/><family val=\"2\"/><scheme val=\"minor\"/></font></fonts>');\n\to[o.length] = ('<fills count=\"2\"><fill><patternFill patternType=\"none\"/></fill><fill><patternFill patternType=\"gray125\"/></fill></fills>');\n\to[o.length] = ('<borders count=\"1\"><border><left/><right/><top/><bottom/><diagonal/></border></borders>');\n\to[o.length] = ('<cellStyleXfs count=\"1\"><xf numFmtId=\"0\" fontId=\"0\" fillId=\"0\" borderId=\"0\"/></cellStyleXfs>');\n\tif((w = write_cellXfs(opts.cellXfs))) o[o.length] = (w);\n\to[o.length] = ('<cellStyles count=\"1\"><cellStyle name=\"Normal\" xfId=\"0\" builtinId=\"0\"/></cellStyles>');\n\to[o.length] = ('<dxfs count=\"0\"/>');\n\to[o.length] = ('<tableStyles count=\"0\" defaultTableStyle=\"TableStyleMedium9\" defaultPivotStyle=\"PivotStyleMedium4\"/>');\n\n\tif(o.length>2){ o[o.length] = ('</styleSheet>'); o[1]=o[1].replace(\"/>\",\">\"); }\n\treturn o.join(\"\");\n}\n/* [MS-XLSB] 2.4.651 BrtFmt */\nfunction parse_BrtFmt(data, length) {\n\tvar ifmt = data.read_shift(2);\n\tvar stFmtCode = parse_XLWideString(data,length-2);\n\treturn [ifmt, stFmtCode];\n}\n\n/* [MS-XLSB] 2.4.653 BrtFont TODO */\nfunction parse_BrtFont(data, length) {\n\tvar out = {flags:{}};\n\tout.dyHeight = data.read_shift(2);\n\tout.grbit = parse_FontFlags(data, 2);\n\tout.bls = data.read_shift(2);\n\tout.sss = data.read_shift(2);\n\tout.uls = data.read_shift(1);\n\tout.bFamily = data.read_shift(1);\n\tout.bCharSet = data.read_shift(1);\n\tdata.l++;\n\tout.brtColor = parse_BrtColor(data, 8);\n\tout.bFontScheme = data.read_shift(1);\n\tout.name = parse_XLWideString(data, length - 21);\n\n\tout.flags.Bold = out.bls === 0x02BC;\n\tout.flags.Italic = out.grbit.fItalic;\n\tout.flags.Strikeout = out.grbit.fStrikeout;\n\tout.flags.Outline = out.grbit.fOutline;\n\tout.flags.Shadow = out.grbit.fShadow;\n\tout.flags.Condense = out.grbit.fCondense;\n\tout.flags.Extend = out.grbit.fExtend;\n\tout.flags.Sub = out.sss & 0x2;\n\tout.flags.Sup = out.sss & 0x1;\n\treturn out;\n}\n\n/* [MS-XLSB] 2.4.816 BrtXF */\nfunction parse_BrtXF(data, length) {\n\tvar ixfeParent = data.read_shift(2);\n\tvar ifmt = data.read_shift(2);\n\tparsenoop(data, length-4);\n\treturn {ixfe:ixfeParent, ifmt:ifmt };\n}\n\n/* [MS-XLSB] 2.1.7.50 Styles */\nfunction parse_sty_bin(data, opts) {\n\tstyles.NumberFmt = [];\n\tfor(var y in SSF._table) styles.NumberFmt[y] = SSF._table[y];\n\n\tstyles.CellXf = [];\n\tvar state = \"\"; /* TODO: this should be a stack */\n\tvar pass = false;\n\trecordhopper(data, function hopper_sty(val, R, RT) {\n\t\tswitch(R.n) {\n\t\t\tcase 'BrtFmt':\n\t\t\t\tstyles.NumberFmt[val[0]] = val[1]; SSF.load(val[1], val[0]);\n\t\t\t\tbreak;\n\t\t\tcase 'BrtFont': break; /* TODO */\n\t\t\tcase 'BrtKnownFonts': break; /* TODO */\n\t\t\tcase 'BrtFill': break; /* TODO */\n\t\t\tcase 'BrtBorder': break; /* TODO */\n\t\t\tcase 'BrtXF':\n\t\t\t\tif(state === \"CELLXFS\") {\n\t\t\t\t\tstyles.CellXf.push(val);\n\t\t\t\t}\n\t\t\t\tbreak; /* TODO */\n\t\t\tcase 'BrtStyle': break; /* TODO */\n\t\t\tcase 'BrtDXF': break; /* TODO */\n\t\t\tcase 'BrtMRUColor': break; /* TODO */\n\t\t\tcase 'BrtIndexedColor': break; /* TODO */\n\t\t\tcase 'BrtBeginStyleSheet': break;\n\t\t\tcase 'BrtEndStyleSheet': break;\n\t\t\tcase 'BrtBeginTableStyle': break;\n\t\t\tcase 'BrtTableStyleElement': break;\n\t\t\tcase 'BrtEndTableStyle': break;\n\t\t\tcase 'BrtBeginFmts': state = \"FMTS\"; break;\n\t\t\tcase 'BrtEndFmts': state = \"\"; break;\n\t\t\tcase 'BrtBeginFonts': state = \"FONTS\"; break;\n\t\t\tcase 'BrtEndFonts': state = \"\"; break;\n\t\t\tcase 'BrtACBegin': state = \"ACFONTS\"; break;\n\t\t\tcase 'BrtACEnd': state = \"\"; break;\n\t\t\tcase 'BrtBeginFills': state = \"FILLS\"; break;\n\t\t\tcase 'BrtEndFills': state = \"\"; break;\n\t\t\tcase 'BrtBeginBorders': state = \"BORDERS\"; break;\n\t\t\tcase 'BrtEndBorders': state = \"\"; break;\n\t\t\tcase 'BrtBeginCellStyleXFs': state = \"CELLSTYLEXFS\"; break;\n\t\t\tcase 'BrtEndCellStyleXFs': state = \"\"; break;\n\t\t\tcase 'BrtBeginCellXFs': state = \"CELLXFS\"; break;\n\t\t\tcase 'BrtEndCellXFs': state = \"\"; break;\n\t\t\tcase 'BrtBeginStyles': state = \"STYLES\"; break;\n\t\t\tcase 'BrtEndStyles': state = \"\"; break;\n\t\t\tcase 'BrtBeginDXFs': state = \"DXFS\"; break;\n\t\t\tcase 'BrtEndDXFs': state = \"\"; break;\n\t\t\tcase 'BrtBeginTableStyles': state = \"TABLESTYLES\"; break;\n\t\t\tcase 'BrtEndTableStyles': state = \"\"; break;\n\t\t\tcase 'BrtBeginColorPalette': state = \"COLORPALETTE\"; break;\n\t\t\tcase 'BrtEndColorPalette': state = \"\"; break;\n\t\t\tcase 'BrtBeginIndexedColors': state = \"INDEXEDCOLORS\"; break;\n\t\t\tcase 'BrtEndIndexedColors': state = \"\"; break;\n\t\t\tcase 'BrtBeginMRUColors': state = \"MRUCOLORS\"; break;\n\t\t\tcase 'BrtEndMRUColors': state = \"\"; break;\n\t\t\tcase 'BrtFRTBegin': pass = true; break;\n\t\t\tcase 'BrtFRTEnd': pass = false; break;\n\t\t\tcase 'BrtBeginStyleSheetExt14': break;\n\t\t\tcase 'BrtBeginSlicerStyles': break;\n\t\t\tcase 'BrtEndSlicerStyles': break;\n\t\t\tcase 'BrtBeginTimelineStylesheetExt15': break;\n\t\t\tcase 'BrtEndTimelineStylesheetExt15': break;\n\t\t\tcase 'BrtBeginTimelineStyles': break;\n\t\t\tcase 'BrtEndTimelineStyles': break;\n\t\t\tcase 'BrtEndStyleSheetExt14': break;\n\t\t\tdefault: if(!pass || opts.WTF) throw new Error(\"Unexpected record \" + RT + \" \" + R.n);\n\t\t}\n\t});\n\treturn styles;\n}\n\n/* [MS-XLSB] 2.1.7.50 Styles */\nfunction write_sty_bin(data, opts) {\n\tvar ba = buf_array();\n\twrite_record(ba, \"BrtBeginStyleSheet\");\n\t/* [FMTS] */\n\t/* [FONTS] */\n\t/* [FILLS] */\n\t/* [BORDERS] */\n\t/* CELLSTYLEXFS */\n\t/* CELLXFS*/\n\t/* STYLES */\n\t/* DXFS */\n\t/* TABLESTYLES */\n\t/* [COLORPALETTE] */\n\t/* FRTSTYLESHEET*/\n\twrite_record(ba, \"BrtEndStyleSheet\");\n\treturn ba.end();\n}\nRELS.THEME = \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme\";\n\n/* 20.1.6.2 clrScheme CT_ColorScheme */\nfunction parse_clrScheme(t, opts) {\n\tthemes.themeElements.clrScheme = [];\n\tvar color = {};\n\tt[0].match(tagregex).forEach(function(x) {\n\t\tvar y = parsexmltag(x);\n\t\tswitch(y[0]) {\n\t\t\tcase '<a:clrScheme': case '</a:clrScheme>': break;\n\n\t\t\t/* 20.1.2.3.32 srgbClr CT_SRgbColor */\n\t\t\tcase '<a:srgbClr': color.rgb = y.val; break;\n\n\t\t\t/* 20.1.2.3.33 sysClr CT_SystemColor */\n\t\t\tcase '<a:sysClr': color.rgb = y.lastClr; break;\n\n\t\t\t/* 20.1.4.1.9 dk1 (Dark 1) */\n\t\t\tcase '<a:dk1>':\n\t\t\tcase '</a:dk1>':\n\t\t\t/* 20.1.4.1.10 dk2 (Dark 2) */\n\t\t\tcase '<a:dk2>':\n\t\t\tcase '</a:dk2>':\n\t\t\t/* 20.1.4.1.22 lt1 (Light 1) */\n\t\t\tcase '<a:lt1>':\n\t\t\tcase '</a:lt1>':\n\t\t\t/* 20.1.4.1.23 lt2 (Light 2) */\n\t\t\tcase '<a:lt2>':\n\t\t\tcase '</a:lt2>':\n\t\t\t/* 20.1.4.1.1 accent1 (Accent 1) */\n\t\t\tcase '<a:accent1>':\n\t\t\tcase '</a:accent1>':\n\t\t\t/* 20.1.4.1.2 accent2 (Accent 2) */\n\t\t\tcase '<a:accent2>':\n\t\t\tcase '</a:accent2>':\n\t\t\t/* 20.1.4.1.3 accent3 (Accent 3) */\n\t\t\tcase '<a:accent3>':\n\t\t\tcase '</a:accent3>':\n\t\t\t/* 20.1.4.1.4 accent4 (Accent 4) */\n\t\t\tcase '<a:accent4>':\n\t\t\tcase '</a:accent4>':\n\t\t\t/* 20.1.4.1.5 accent5 (Accent 5) */\n\t\t\tcase '<a:accent5>':\n\t\t\tcase '</a:accent5>':\n\t\t\t/* 20.1.4.1.6 accent6 (Accent 6) */\n\t\t\tcase '<a:accent6>':\n\t\t\tcase '</a:accent6>':\n\t\t\t/* 20.1.4.1.19 hlink (Hyperlink) */\n\t\t\tcase '<a:hlink>':\n\t\t\tcase '</a:hlink>':\n\t\t\t/* 20.1.4.1.15 folHlink (Followed Hyperlink) */\n\t\t\tcase '<a:folHlink>':\n\t\t\tcase '</a:folHlink>':\n\t\t\t\tif (y[0][1] === '/') {\n\t\t\t\t\tthemes.themeElements.clrScheme.push(color);\n\t\t\t\t\tcolor = {};\n\t\t\t\t} else {\n\t\t\t\t\tcolor.name = y[0].substring(3, y[0].length - 1);\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tdefault: if(opts.WTF) throw 'unrecognized ' + y[0] + ' in clrScheme';\n\t\t}\n\t});\n}\n\n/* 20.1.4.1.18 fontScheme CT_FontScheme */\nfunction parse_fontScheme(t, opts) { }\n\n/* 20.1.4.1.15 fmtScheme CT_StyleMatrix */\nfunction parse_fmtScheme(t, opts) { }\n\nvar clrsregex = /<a:clrScheme([^>]*)>[^\\u2603]*<\\/a:clrScheme>/;\nvar fntsregex = /<a:fontScheme([^>]*)>[^\\u2603]*<\\/a:fontScheme>/;\nvar fmtsregex = /<a:fmtScheme([^>]*)>[^\\u2603]*<\\/a:fmtScheme>/;\n\n/* 20.1.6.10 themeElements CT_BaseStyles */\nfunction parse_themeElements(data, opts) {\n\tthemes.themeElements = {};\n\n\tvar t;\n\n\t[\n\t\t/* clrScheme CT_ColorScheme */\n\t\t['clrScheme', clrsregex, parse_clrScheme],\n\t\t/* fontScheme CT_FontScheme */\n\t\t['fontScheme', fntsregex, parse_fontScheme],\n\t\t/* fmtScheme CT_StyleMatrix */\n\t\t['fmtScheme', fmtsregex, parse_fmtScheme]\n\t].forEach(function(m) {\n\t\tif(!(t=data.match(m[1]))) throw m[0] + ' not found in themeElements';\n\t\tm[2](t, opts);\n\t});\n}\n\nvar themeltregex = /<a:themeElements([^>]*)>[^\\u2603]*<\\/a:themeElements>/;\n\n/* 14.2.7 Theme Part */\nfunction parse_theme_xml(data, opts) {\n\t/* 20.1.6.9 theme CT_OfficeStyleSheet */\n\tif(!data || data.length === 0) return themes;\n\n\tvar t;\n\n\t/* themeElements CT_BaseStyles */\n\tif(!(t=data.match(themeltregex))) throw 'themeElements not found in theme';\n\tparse_themeElements(t[0], opts);\n\n\treturn themes;\n}\n\nfunction 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>'; }\n/* [MS-XLS] 2.4.326 TODO: payload is a zip file */\nfunction parse_Theme(blob, length) {\n\tvar dwThemeVersion = blob.read_shift(4);\n\tif(dwThemeVersion === 124226) return;\n\tblob.l += length-4;\n}\n\n/* 2.5.49 */\nfunction parse_ColorTheme(blob, length) { return blob.read_shift(4); }\n\n/* 2.5.155 */\nfunction parse_FullColorExt(blob, length) {\n\tvar o = {};\n\to.xclrType = blob.read_shift(2);\n\to.nTintShade = blob.read_shift(2);\n\tswitch(o.xclrType) {\n\t\tcase 0: blob.l += 4; break;\n\t\tcase 1: o.xclrValue = parse_IcvXF(blob, 4); break;\n\t\tcase 2: o.xclrValue = parse_LongRGBA(blob, 4); break;\n\t\tcase 3: o.xclrValue = parse_ColorTheme(blob, 4); break;\n\t\tcase 4: blob.l += 4; break;\n\t}\n\tblob.l += 8;\n\treturn o;\n}\n\n/* 2.5.164 TODO: read 7 bits*/\nfunction parse_IcvXF(blob, length) {\n\treturn parsenoop(blob, length);\n}\n\n/* 2.5.280 */\nfunction parse_XFExtGradient(blob, length) {\n\treturn parsenoop(blob, length);\n}\n\n/* 2.5.108 */\nfunction parse_ExtProp(blob, length) {\n\tvar extType = blob.read_shift(2);\n\tvar cb = blob.read_shift(2);\n\tvar o = [extType];\n\tswitch(extType) {\n\t\tcase 0x04: case 0x05: case 0x07: case 0x08:\n\t\tcase 0x09: case 0x0A: case 0x0B: case 0x0D:\n\t\t\to[1] = parse_FullColorExt(blob, cb); break;\n\t\tcase 0x06: o[1] = parse_XFExtGradient(blob, cb); break;\n\t\tcase 0x0E: case 0x0F: o[1] = blob.read_shift(cb === 5 ? 1 : 2); break;\n\t\tdefault: throw new Error(\"Unrecognized ExtProp type: \" + extType + \" \" + cb);\n\t}\n\treturn o;\n}\n\n/* 2.4.355 */\nfunction parse_XFExt(blob, length) {\n\tvar end = blob.l + length;\n\tblob.l += 2;\n\tvar ixfe = blob.read_shift(2);\n\tblob.l += 2;\n\tvar cexts = blob.read_shift(2);\n\tvar ext = [];\n\twhile(cexts-- > 0) ext.push(parse_ExtProp(blob, end-blob.l));\n\treturn {ixfe:ixfe, ext:ext};\n}\n\n/* xf is an XF, see parse_XFExt for xfext */\nfunction update_xfext(xf, xfext) {\n\txfext.forEach(function(xfe) {\n\t\tswitch(xfe[0]) { /* 2.5.108 extPropData */\n\t\t\tcase 0x04: break; /* foreground color */\n\t\t\tcase 0x05: break; /* background color */\n\t\t\tcase 0x07: case 0x08: case 0x09: case 0x0a: break;\n\t\t\tcase 0x0d: break; /* text color */\n\t\t\tcase 0x0e: break; /* font scheme */\n\t\t\tdefault: throw \"bafuq\" + xfe[0].toString(16);\n\t\t}\n\t});\n}\n\n/* 18.6 Calculation Chain */\nfunction parse_cc_xml(data, opts) {\n\tvar d = [];\n\tvar l = 0, i = 1;\n\t(data.match(tagregex)||[]).forEach(function(x) {\n\t\tvar y = parsexmltag(x);\n\t\tswitch(y[0]) {\n\t\t\tcase '<?xml': break;\n\t\t\t/* 18.6.2 calcChain CT_CalcChain 1 */\n\t\t\tcase '<calcChain': case '<calcChain>': case '</calcChain>': break;\n\t\t\t/* 18.6.1 c CT_CalcCell 1 */\n\t\t\tcase '<c': delete y[0]; if(y.i) i = y.i; else y.i = i; d.push(y); break;\n\t\t}\n\t});\n\treturn d;\n}\n\nfunction write_cc_xml(data, opts) { }\n/* [MS-XLSB] 2.6.4.1 */\nfunction parse_BrtCalcChainItem$(data, length) {\n\tvar out = {};\n\tout.i = data.read_shift(4);\n\tvar cell = {};\n\tcell.r = data.read_shift(4);\n\tcell.c = data.read_shift(4);\n\tout.r = encode_cell(cell);\n\tvar flags = data.read_shift(1);\n\tif(flags & 0x2) out.l = '1';\n\tif(flags & 0x8) out.a = '1';\n\treturn out;\n}\n\n/* 18.6 Calculation Chain */\nfunction parse_cc_bin(data, opts) {\n\tvar out = [];\n\tvar pass = false;\n\trecordhopper(data, function hopper_cc(val, R, RT) {\n\t\tswitch(R.n) {\n\t\t\tcase 'BrtCalcChainItem$': out.push(val); break;\n\t\t\tcase 'BrtBeginCalcChain$': break;\n\t\t\tcase 'BrtEndCalcChain$': break;\n\t\t\tdefault: if(!pass || opts.WTF) throw new Error(\"Unexpected record \" + RT + \" \" + R.n);\n\t\t}\n\t});\n\treturn out;\n}\n\nfunction write_cc_bin(data, opts) { }\n\nfunction parse_comments(zip, dirComments, sheets, sheetRels, opts) {\n\tfor(var i = 0; i != dirComments.length; ++i) {\n\t\tvar canonicalpath=dirComments[i];\n\t\tvar comments=parse_cmnt(getzipdata(zip, canonicalpath.replace(/^\\//,''), true), canonicalpath, opts);\n\t\tif(!comments || !comments.length) continue;\n\t\t// find the sheets targeted by these comments\n\t\tvar sheetNames = keys(sheets);\n\t\tfor(var j = 0; j != sheetNames.length; ++j) {\n\t\t\tvar sheetName = sheetNames[j];\n\t\t\tvar rels = sheetRels[sheetName];\n\t\t\tif(rels) {\n\t\t\t\tvar rel = rels[canonicalpath];\n\t\t\t\tif(rel) insertCommentsIntoSheet(sheetName, sheets[sheetName], comments);\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction insertCommentsIntoSheet(sheetName, sheet, comments) {\n\tcomments.forEach(function(comment) {\n\t\tvar cell = sheet[comment.ref];\n\t\tif (!cell) {\n\t\t\tcell = {};\n\t\t\tsheet[comment.ref] = cell;\n\t\t\tvar range = safe_decode_range(sheet[\"!ref\"]||\"BDWGO1000001:A1\");\n\t\t\tvar thisCell = decode_cell(comment.ref);\n\t\t\tif(range.s.r > thisCell.r) range.s.r = thisCell.r;\n\t\t\tif(range.e.r < thisCell.r) range.e.r = thisCell.r;\n\t\t\tif(range.s.c > thisCell.c) range.s.c = thisCell.c;\n\t\t\tif(range.e.c < thisCell.c) range.e.c = thisCell.c;\n\t\t\tvar encoded = encode_range(range);\n\t\t\tif (encoded !== sheet[\"!ref\"]) sheet[\"!ref\"] = encoded;\n\t\t}\n\n\t\tif (!cell.c) cell.c = [];\n\t\tvar o = {a: comment.author, t: comment.t, r: comment.r};\n\t\tif(comment.h) o.h = comment.h;\n\t\tcell.c.push(o);\n\t});\n}\n\n/* 18.7.3 CT_Comment */\nfunction parse_comments_xml(data, opts) {\n\tif(data.match(/<(?:\\w+:)?comments *\\/>/)) return [];\n\tvar authors = [];\n\tvar commentList = [];\n\tdata.match(/<(?:\\w+:)?authors>([^\\u2603]*)<\\/(?:\\w+:)?authors>/)[1].split(/<\\/\\w*:?author>/).forEach(function(x) {\n\t\tif(x === \"\" || x.trim() === \"\") return;\n\t\tauthors.push(x.match(/<(?:\\w+:)?author[^>]*>(.*)/)[1]);\n\t});\n\t(data.match(/<(?:\\w+:)?commentList>([^\\u2603]*)<\\/(?:\\w+:)?commentList>/)||[\"\",\"\"])[1].split(/<\\/\\w*:?comment>/).forEach(function(x, index) {\n\t\tif(x === \"\" || x.trim() === \"\") return;\n\t\tvar y = parsexmltag(x.match(/<(?:\\w+:)?comment[^>]*>/)[0]);\n\t\tvar comment = { author: y.authorId && authors[y.authorId] ? authors[y.authorId] : undefined, ref: y.ref, guid: y.guid };\n\t\tvar cell = decode_cell(y.ref);\n\t\tif(opts.sheetRows && opts.sheetRows <= cell.r) return;\n\t\tvar textMatch = x.match(/<text>([^\\u2603]*)<\\/text>/);\n\t\tif (!textMatch || !textMatch[1]) return; // a comment may contain an empty text tag.\n\t\tvar rt = parse_si(textMatch[1]);\n\t\tcomment.r = rt.r;\n\t\tcomment.t = rt.t;\n\t\tif(opts.cellHTML) comment.h = rt.h;\n\t\tcommentList.push(comment);\n\t});\n\treturn commentList;\n}\n\nfunction write_comments_xml(data, opts) { }\n/* [MS-XLSB] 2.4.28 BrtBeginComment */\nfunction parse_BrtBeginComment(data, length) {\n\tvar out = {};\n\tout.iauthor = data.read_shift(4);\n\tvar rfx = parse_UncheckedRfX(data, 16);\n\tout.rfx = rfx.s;\n\tout.ref = encode_cell(rfx.s);\n\tdata.l += 16; /*var guid = parse_GUID(data); */\n\treturn out;\n}\n\n/* [MS-XLSB] 2.4.324 BrtCommentAuthor */\nvar parse_BrtCommentAuthor = parse_XLWideString;\n\n/* [MS-XLSB] 2.4.325 BrtCommentText */\nvar parse_BrtCommentText = parse_RichStr;\n\n/* [MS-XLSB] 2.1.7.8 Comments */\nfunction parse_comments_bin(data, opts) {\n\tvar out = [];\n\tvar authors = [];\n\tvar c = {};\n\tvar pass = false;\n\trecordhopper(data, function hopper_cmnt(val, R, RT) {\n\t\tswitch(R.n) {\n\t\t\tcase 'BrtCommentAuthor': authors.push(val); break;\n\t\t\tcase 'BrtBeginComment': c = val; break;\n\t\t\tcase 'BrtCommentText': c.t = val.t; c.h = val.h; c.r = val.r; break;\n\t\t\tcase 'BrtEndComment':\n\t\t\t\tc.author = authors[c.iauthor];\n\t\t\t\tdelete c.iauthor;\n\t\t\t\tif(opts.sheetRows && opts.sheetRows <= c.rfx.r) break;\n\t\t\t\tdelete c.rfx; out.push(c); break;\n\t\t\tcase 'BrtBeginComments': break;\n\t\t\tcase 'BrtEndComments': break;\n\t\t\tcase 'BrtBeginCommentAuthors': break;\n\t\t\tcase 'BrtEndCommentAuthors': break;\n\t\t\tcase 'BrtBeginCommentList': break;\n\t\t\tcase 'BrtEndCommentList': break;\n\t\t\tdefault: if(!pass || opts.WTF) throw new Error(\"Unexpected record \" + RT + \" \" + R.n);\n\t\t}\n\t});\n\treturn out;\n}\n\nfunction write_comments_bin(data, opts) { }\n/* TODO: it will be useful to parse the function str */\nvar rc_to_a1 = (function(){\n\tvar rcregex = /(^|[^A-Za-z])R(\\[?)(-?\\d+|)\\]?C(\\[?)(-?\\d+|)\\]?/g;\n\tvar rcbase;\n\tfunction rcfunc($$,$1,$2,$3,$4,$5) {\n\t\tvar R = $3.length>0?parseInt($3,10)|0:0, C = $5.length>0?parseInt($5,10)|0:0;\n\t\tif(C<0 && $4.length === 0) C=0;\n\t\tif($4.length > 0) C += rcbase.c;\n\t\tif($2.length > 0) R += rcbase.r;\n\t\treturn $1 + encode_col(C) + encode_row(R);\n\t}\n\treturn function rc_to_a1(fstr, base) {\n\t\trcbase = base;\n\t\treturn fstr.replace(rcregex, rcfunc);\n\t};\n})();\n\n/* --- formula references point to MS-XLS --- */\n/* Small helpers */\nfunction parseread(l) { return function(blob, length) { blob.l+=l; return; }; }\nfunction parseread1(blob, length) { blob.l+=1; return; }\n\n/* Rgce Helpers */\n\n/* 2.5.51 */\nfunction parse_ColRelU(blob, length) {\n\tvar c = blob.read_shift(2);\n\treturn [c & 0x3FFF, (c >> 14) & 1, (c >> 15) & 1];\n}\n\n/* 2.5.198.105 */\nfunction parse_RgceArea(blob, length) {\n\tvar r=blob.read_shift(2), R=blob.read_shift(2);\n\tvar c=parse_ColRelU(blob, 2);\n\tvar C=parse_ColRelU(blob, 2);\n\treturn { s:{r:r, c:c[0], cRel:c[1], rRel:c[2]}, e:{r:R, c:C[0], cRel:C[1], rRel:C[2]} };\n}\n\n/* 2.5.198.105 TODO */\nfunction parse_RgceAreaRel(blob, length) {\n\tvar r=blob.read_shift(2), R=blob.read_shift(2);\n\tvar c=parse_ColRelU(blob, 2);\n\tvar C=parse_ColRelU(blob, 2);\n\treturn { s:{r:r, c:c[0], cRel:c[1], rRel:c[2]}, e:{r:R, c:C[0], cRel:C[1], rRel:C[2]} };\n}\n\n/* 2.5.198.109 */\nfunction parse_RgceLoc(blob, length) {\n\tvar r = blob.read_shift(2);\n\tvar c = parse_ColRelU(blob, 2);\n\treturn {r:r, c:c[0], cRel:c[1], rRel:c[2]};\n}\n\n/* 2.5.198.111 */\nfunction parse_RgceLocRel(blob, length) {\n\tvar r = blob.read_shift(2);\n\tvar cl = blob.read_shift(2);\n\tvar cRel = (cl & 0x8000) >> 15, rRel = (cl & 0x4000) >> 14;\n\tcl &= 0x3FFF;\n\tif(cRel !== 0) while(cl >= 0x100) cl -= 0x100;\n\treturn {r:r,c:cl,cRel:cRel,rRel:rRel};\n}\n\n/* Ptg Tokens */\n\n/* 2.5.198.27 */\nfunction parse_PtgArea(blob, length) {\n\tvar type = (blob[blob.l++] & 0x60) >> 5;\n\tvar area = parse_RgceArea(blob, 8);\n\treturn [type, area];\n}\n\n/* 2.5.198.28 */\nfunction parse_PtgArea3d(blob, length) {\n\tvar type = (blob[blob.l++] & 0x60) >> 5;\n\tvar ixti = blob.read_shift(2);\n\tvar area = parse_RgceArea(blob, 8);\n\treturn [type, ixti, area];\n}\n\n/* 2.5.198.29 */\nfunction parse_PtgAreaErr(blob, length) {\n\tvar type = (blob[blob.l++] & 0x60) >> 5;\n\tblob.l += 8;\n\treturn [type];\n}\n/* 2.5.198.30 */\nfunction parse_PtgAreaErr3d(blob, length) {\n\tvar type = (blob[blob.l++] & 0x60) >> 5;\n\tvar ixti = blob.read_shift(2);\n\tblob.l += 8;\n\treturn [type, ixti];\n}\n\n/* 2.5.198.31 */\nfunction parse_PtgAreaN(blob, length) {\n\tvar type = (blob[blob.l++] & 0x60) >> 5;\n\tvar area = parse_RgceAreaRel(blob, 8);\n\treturn [type, area];\n}\n\n/* 2.5.198.32 -- ignore this and look in PtgExtraArray for shape + values */\nfunction parse_PtgArray(blob, length) {\n\tvar type = (blob[blob.l++] & 0x60) >> 5;\n\tblob.l += 7;\n\treturn [type];\n}\n\n/* 2.5.198.33 */\nfunction parse_PtgAttrBaxcel(blob, length) {\n\tvar bitSemi = blob[blob.l+1] & 0x01; /* 1 = volatile */\n\tvar bitBaxcel = 1;\n\tblob.l += 4;\n\treturn [bitSemi, bitBaxcel];\n}\n\n/* 2.5.198.34 */\nfunction parse_PtgAttrChoose(blob, length) {\n\tblob.l +=2;\n\tvar offset = blob.read_shift(2);\n\tvar o = [];\n\t/* offset is 1 less than the number of elements */\n\tfor(var i = 0; i <= offset; ++i) o.push(blob.read_shift(2));\n\treturn o;\n}\n\n/* 2.5.198.35 */\nfunction parse_PtgAttrGoto(blob, length) {\n\tvar bitGoto = (blob[blob.l+1] & 0xFF) ? 1 : 0;\n\tblob.l += 2;\n\treturn [bitGoto, blob.read_shift(2)];\n}\n\n/* 2.5.198.36 */\nfunction parse_PtgAttrIf(blob, length) {\n\tvar bitIf = (blob[blob.l+1] & 0xFF) ? 1 : 0;\n\tblob.l += 2;\n\treturn [bitIf, blob.read_shift(2)];\n}\n\n/* 2.5.198.37 */\nfunction parse_PtgAttrSemi(blob, length) {\n\tvar bitSemi = (blob[blob.l+1] & 0xFF) ? 1 : 0;\n\tblob.l += 4;\n\treturn [bitSemi];\n}\n\n/* 2.5.198.40 (used by PtgAttrSpace and PtgAttrSpaceSemi) */\nfunction parse_PtgAttrSpaceType(blob, length) {\n\tvar type = blob.read_shift(1), cch = blob.read_shift(1);\n\treturn [type, cch];\n}\n\n/* 2.5.198.38 */\nfunction parse_PtgAttrSpace(blob, length) {\n\tblob.read_shift(2);\n\treturn parse_PtgAttrSpaceType(blob, 2);\n}\n\n/* 2.5.198.39 */\nfunction parse_PtgAttrSpaceSemi(blob, length) {\n\tblob.read_shift(2);\n\treturn parse_PtgAttrSpaceType(blob, 2);\n}\n\n/* 2.5.198.84 TODO */\nfunction parse_PtgRef(blob, length) {\n\tvar ptg = blob[blob.l] & 0x1F;\n\tvar type = (blob[blob.l] & 0x60)>>5;\n\tblob.l += 1;\n\tvar loc = parse_RgceLoc(blob,4);\n\treturn [type, loc];\n}\n\n/* 2.5.198.88 TODO */\nfunction parse_PtgRefN(blob, length) {\n\tvar ptg = blob[blob.l] & 0x1F;\n\tvar type = (blob[blob.l] & 0x60)>>5;\n\tblob.l += 1;\n\tvar loc = parse_RgceLocRel(blob,4);\n\treturn [type, loc];\n}\n\n/* 2.5.198.85 TODO */\nfunction parse_PtgRef3d(blob, length) {\n\tvar ptg = blob[blob.l] & 0x1F;\n\tvar type = (blob[blob.l] & 0x60)>>5;\n\tblob.l += 1;\n\tvar ixti = blob.read_shift(2); // XtiIndex\n\tvar loc = parse_RgceLoc(blob,4);\n\treturn [type, ixti, loc];\n}\n\n\n/* 2.5.198.62 TODO */\nfunction parse_PtgFunc(blob, length) {\n\tvar ptg = blob[blob.l] & 0x1F;\n\tvar type = (blob[blob.l] & 0x60)>>5;\n\tblob.l += 1;\n\tvar iftab = blob.read_shift(2);\n\treturn [FtabArgc[iftab], Ftab[iftab]];\n}\n/* 2.5.198.63 TODO */\nfunction parse_PtgFuncVar(blob, length) {\n\tblob.l++;\n\tvar cparams = blob.read_shift(1), tab = parsetab(blob);\n\treturn [cparams, (tab[0] === 0 ? Ftab : Cetab)[tab[1]]];\n}\n\nfunction parsetab(blob, length) {\n\treturn [blob[blob.l+1]>>7, blob.read_shift(2) & 0x7FFF];\n}\n\n/* 2.5.198.41 */\nvar parse_PtgAttrSum = parseread(4);\n/* 2.5.198.43 */\nvar parse_PtgConcat = parseread1;\n\n/* 2.5.198.58 */\nfunction parse_PtgExp(blob, length) {\n\tblob.l++;\n\tvar row = blob.read_shift(2);\n\tvar col = blob.read_shift(2);\n\treturn [row, col];\n}\n\n/* 2.5.198.57 */\nfunction parse_PtgErr(blob, length) { blob.l++; return BErr[blob.read_shift(1)]; }\n\n/* 2.5.198.66 TODO */\nfunction parse_PtgInt(blob, length) { blob.l++; return blob.read_shift(2); }\n\n/* 2.5.198.42 */\nfunction parse_PtgBool(blob, length) { blob.l++; return blob.read_shift(1)!==0;}\n\n/* 2.5.198.79 */\nfunction parse_PtgNum(blob, length) { blob.l++; return parse_Xnum(blob, 8); }\n\n/* 2.5.198.89 */\nfunction parse_PtgStr(blob, length) { blob.l++; return parse_ShortXLUnicodeString(blob); }\n\n/* 2.5.192.112 + 2.5.192.11{3,4,5,6,7} */\nfunction parse_SerAr(blob) {\n\tvar val = [];\n\tswitch((val[0] = blob.read_shift(1))) {\n\t\t/* 2.5.192.113 */\n\t\tcase 0x04: /* SerBool -- boolean */\n\t\t\tval[1] = parsebool(blob, 1) ? 'TRUE' : 'FALSE';\n\t\t\tblob.l += 7; break;\n\t\t/* 2.5.192.114 */\n\t\tcase 0x10: /* SerErr -- error */\n\t\t\tval[1] = BErr[blob[blob.l]];\n\t\t\tblob.l += 8; break;\n\t\t/* 2.5.192.115 */\n\t\tcase 0x00: /* SerNil -- honestly, I'm not sure how to reproduce this */\n\t\t\tblob.l += 8; break;\n\t\t/* 2.5.192.116 */\n\t\tcase 0x01: /* SerNum -- Xnum */\n\t\t\tval[1] = parse_Xnum(blob, 8); break;\n\t\t/* 2.5.192.117 */\n\t\tcase 0x02: /* SerStr -- XLUnicodeString (<256 chars) */\n\t\t\tval[1] = parse_XLUnicodeString(blob); break;\n\t\t// default: throw \"Bad SerAr: \" + val[0]; /* Unreachable */\n\t}\n\treturn val;\n}\n\n/* 2.5.198.61 */\nfunction parse_PtgExtraMem(blob, cce) {\n\tvar count = blob.read_shift(2);\n\tvar out = [];\n\tfor(var i = 0; i != count; ++i) out.push(parse_Ref8U(blob, 8));\n\treturn out;\n}\n\n/* 2.5.198.59 */\nfunction parse_PtgExtraArray(blob) {\n\tvar cols = 1 + blob.read_shift(1); //DColByteU\n\tvar rows = 1 + blob.read_shift(2); //DRw\n\tfor(var i = 0, o=[]; i != rows && (o[i] = []); ++i)\n\t\tfor(var j = 0; j != cols; ++j) o[i][j] = parse_SerAr(blob);\n\treturn o;\n}\n\n/* 2.5.198.76 */\nfunction parse_PtgName(blob, length) {\n\tvar type = (blob.read_shift(1) >>> 5) & 0x03;\n\tvar nameindex = blob.read_shift(4);\n\treturn [type, 0, nameindex];\n}\n\n/* 2.5.198.77 */\nfunction parse_PtgNameX(blob, length) {\n\tvar type = (blob.read_shift(1) >>> 5) & 0x03;\n\tvar ixti = blob.read_shift(2); // XtiIndex\n\tvar nameindex = blob.read_shift(4);\n\treturn [type, ixti, nameindex];\n}\n\n/* 2.5.198.70 */\nfunction parse_PtgMemArea(blob, length) {\n\tvar type = (blob.read_shift(1) >>> 5) & 0x03;\n\tblob.l += 4;\n\tvar cce = blob.read_shift(2);\n\treturn [type, cce];\n}\n\n/* 2.5.198.72 */\nfunction parse_PtgMemFunc(blob, length) {\n\tvar type = (blob.read_shift(1) >>> 5) & 0x03;\n\tvar cce = blob.read_shift(2);\n\treturn [type, cce];\n}\n\n\n/* 2.5.198.86 */\nfunction parse_PtgRefErr(blob, length) {\n\tvar type = (blob.read_shift(1) >>> 5) & 0x03;\n\tblob.l += 4;\n\treturn [type];\n}\n\n/* 2.5.198.26 */\nvar parse_PtgAdd = parseread1;\n/* 2.5.198.45 */\nvar parse_PtgDiv = parseread1;\n/* 2.5.198.56 */\nvar parse_PtgEq = parseread1;\n/* 2.5.198.64 */\nvar parse_PtgGe = parseread1;\n/* 2.5.198.65 */\nvar parse_PtgGt = parseread1;\n/* 2.5.198.67 */\nvar parse_PtgIsect = parseread1;\n/* 2.5.198.68 */\nvar parse_PtgLe = parseread1;\n/* 2.5.198.69 */\nvar parse_PtgLt = parseread1;\n/* 2.5.198.74 */\nvar parse_PtgMissArg = parseread1;\n/* 2.5.198.75 */\nvar parse_PtgMul = parseread1;\n/* 2.5.198.78 */\nvar parse_PtgNe = parseread1;\n/* 2.5.198.80 */\nvar parse_PtgParen = parseread1;\n/* 2.5.198.81 */\nvar parse_PtgPercent = parseread1;\n/* 2.5.198.82 */\nvar parse_PtgPower = parseread1;\n/* 2.5.198.83 */\nvar parse_PtgRange = parseread1;\n/* 2.5.198.90 */\nvar parse_PtgSub = parseread1;\n/* 2.5.198.93 */\nvar parse_PtgUminus = parseread1;\n/* 2.5.198.94 */\nvar parse_PtgUnion = parseread1;\n/* 2.5.198.95 */\nvar parse_PtgUplus = parseread1;\n\n/* 2.5.198.71 */\nvar parse_PtgMemErr = parsenoop;\n/* 2.5.198.73 */\nvar parse_PtgMemNoMem = parsenoop;\n/* 2.5.198.87 */\nvar parse_PtgRefErr3d = parsenoop;\n/* 2.5.198.92 */\nvar parse_PtgTbl = parsenoop;\n\n/* 2.5.198.25 */\nvar PtgTypes = {\n\t0x01: { n:'PtgExp', f:parse_PtgExp },\n\t0x02: { n:'PtgTbl', f:parse_PtgTbl },\n\t0x03: { n:'PtgAdd', f:parse_PtgAdd },\n\t0x04: { n:'PtgSub', f:parse_PtgSub },\n\t0x05: { n:'PtgMul', f:parse_PtgMul },\n\t0x06: { n:'PtgDiv', f:parse_PtgDiv },\n\t0x07: { n:'PtgPower', f:parse_PtgPower },\n\t0x08: { n:'PtgConcat', f:parse_PtgConcat },\n\t0x09: { n:'PtgLt', f:parse_PtgLt },\n\t0x0A: { n:'PtgLe', f:parse_PtgLe },\n\t0x0B: { n:'PtgEq', f:parse_PtgEq },\n\t0x0C: { n:'PtgGe', f:parse_PtgGe },\n\t0x0D: { n:'PtgGt', f:parse_PtgGt },\n\t0x0E: { n:'PtgNe', f:parse_PtgNe },\n\t0x0F: { n:'PtgIsect', f:parse_PtgIsect },\n\t0x10: { n:'PtgUnion', f:parse_PtgUnion },\n\t0x11: { n:'PtgRange', f:parse_PtgRange },\n\t0x12: { n:'PtgUplus', f:parse_PtgUplus },\n\t0x13: { n:'PtgUminus', f:parse_PtgUminus },\n\t0x14: { n:'PtgPercent', f:parse_PtgPercent },\n\t0x15: { n:'PtgParen', f:parse_PtgParen },\n\t0x16: { n:'PtgMissArg', f:parse_PtgMissArg },\n\t0x17: { n:'PtgStr', f:parse_PtgStr },\n\t0x1C: { n:'PtgErr', f:parse_PtgErr },\n\t0x1D: { n:'PtgBool', f:parse_PtgBool },\n\t0x1E: { n:'PtgInt', f:parse_PtgInt },\n\t0x1F: { n:'PtgNum', f:parse_PtgNum },\n\t0x20: { n:'PtgArray', f:parse_PtgArray },\n\t0x21: { n:'PtgFunc', f:parse_PtgFunc },\n\t0x22: { n:'PtgFuncVar', f:parse_PtgFuncVar },\n\t0x23: { n:'PtgName', f:parse_PtgName },\n\t0x24: { n:'PtgRef', f:parse_PtgRef },\n\t0x25: { n:'PtgArea', f:parse_PtgArea },\n\t0x26: { n:'PtgMemArea', f:parse_PtgMemArea },\n\t0x27: { n:'PtgMemErr', f:parse_PtgMemErr },\n\t0x28: { n:'PtgMemNoMem', f:parse_PtgMemNoMem },\n\t0x29: { n:'PtgMemFunc', f:parse_PtgMemFunc },\n\t0x2A: { n:'PtgRefErr', f:parse_PtgRefErr },\n\t0x2B: { n:'PtgAreaErr', f:parse_PtgAreaErr },\n\t0x2C: { n:'PtgRefN', f:parse_PtgRefN },\n\t0x2D: { n:'PtgAreaN', f:parse_PtgAreaN },\n\t0x39: { n:'PtgNameX', f:parse_PtgNameX },\n\t0x3A: { n:'PtgRef3d', f:parse_PtgRef3d },\n\t0x3B: { n:'PtgArea3d', f:parse_PtgArea3d },\n\t0x3C: { n:'PtgRefErr3d', f:parse_PtgRefErr3d },\n\t0x3D: { n:'PtgAreaErr3d', f:parse_PtgAreaErr3d },\n\t0xFF: {}\n};\n/* These are duplicated in the PtgTypes table */\nvar PtgDupes = {\n\t0x40: 0x20, 0x60: 0x20,\n\t0x41: 0x21, 0x61: 0x21,\n\t0x42: 0x22, 0x62: 0x22,\n\t0x43: 0x23, 0x63: 0x23,\n\t0x44: 0x24, 0x64: 0x24,\n\t0x45: 0x25, 0x65: 0x25,\n\t0x46: 0x26, 0x66: 0x26,\n\t0x47: 0x27, 0x67: 0x27,\n\t0x48: 0x28, 0x68: 0x28,\n\t0x49: 0x29, 0x69: 0x29,\n\t0x4A: 0x2A, 0x6A: 0x2A,\n\t0x4B: 0x2B, 0x6B: 0x2B,\n\t0x4C: 0x2C, 0x6C: 0x2C,\n\t0x4D: 0x2D, 0x6D: 0x2D,\n\t0x59: 0x39, 0x79: 0x39,\n\t0x5A: 0x3A, 0x7A: 0x3A,\n\t0x5B: 0x3B, 0x7B: 0x3B,\n\t0x5C: 0x3C, 0x7C: 0x3C,\n\t0x5D: 0x3D, 0x7D: 0x3D\n};\n(function(){for(var y in PtgDupes) PtgTypes[y] = PtgTypes[PtgDupes[y]];})();\n\nvar Ptg18 = {};\nvar Ptg19 = {\n\t0x01: { n:'PtgAttrSemi', f:parse_PtgAttrSemi },\n\t0x02: { n:'PtgAttrIf', f:parse_PtgAttrIf },\n\t0x04: { n:'PtgAttrChoose', f:parse_PtgAttrChoose },\n\t0x08: { n:'PtgAttrGoto', f:parse_PtgAttrGoto },\n\t0x10: { n:'PtgAttrSum', f:parse_PtgAttrSum },\n\t0x20: { n:'PtgAttrBaxcel', f:parse_PtgAttrBaxcel },\n\t0x40: { n:'PtgAttrSpace', f:parse_PtgAttrSpace },\n\t0x41: { n:'PtgAttrSpaceSemi', f:parse_PtgAttrSpaceSemi },\n\t0xFF: {}\n};\n\n/* 2.4.127 TODO */\nfunction parse_Formula(blob, length, opts) {\n\tvar cell = parse_XLSCell(blob, 6);\n\tvar val = parse_FormulaValue(blob,8);\n\tvar flags = blob.read_shift(1);\n\tblob.read_shift(1);\n\tvar chn = blob.read_shift(4);\n\tvar cbf = \"\";\n\tif(opts.biff === 5) blob.l += length-20;\n\telse cbf = parse_XLSCellParsedFormula(blob, length-20, opts);\n\treturn {cell:cell, val:val[0], formula:cbf, shared: (flags >> 3) & 1, tt:val[1]};\n}\n\n/* 2.5.133 TODO: how to emit empty strings? */\nfunction parse_FormulaValue(blob) {\n\tvar b;\n\tif(__readUInt16LE(blob,blob.l + 6) !== 0xFFFF) return [parse_Xnum(blob),'n'];\n\tswitch(blob[blob.l]) {\n\t\tcase 0x00: blob.l += 8; return [\"String\", 's'];\n\t\tcase 0x01: b = blob[blob.l+2] === 0x1; blob.l += 8; return [b,'b'];\n\t\tcase 0x02: b = blob[blob.l+2]; blob.l += 8; return [b,'e'];\n\t\tcase 0x03: blob.l += 8; return [\"\",'s'];\n\t}\n}\n\n/* 2.5.198.103 */\nfunction parse_RgbExtra(blob, length, rgce, opts) {\n\tif(opts.biff < 8) return parsenoop(blob, length);\n\tvar target = blob.l + length;\n\tvar o = [];\n\tfor(var i = 0; i !== rgce.length; ++i) {\n\t\tswitch(rgce[i][0]) {\n\t\t\tcase 'PtgArray': /* PtgArray -> PtgExtraArray */\n\t\t\t\trgce[i][1] = parse_PtgExtraArray(blob);\n\t\t\t\to.push(rgce[i][1]);\n\t\t\t\tbreak;\n\t\t\tcase 'PtgMemArea': /* PtgMemArea -> PtgExtraMem */\n\t\t\t\trgce[i][2] = parse_PtgExtraMem(blob, rgce[i][1]);\n\t\t\t\to.push(rgce[i][2]);\n\t\t\t\tbreak;\n\t\t\tdefault: break;\n\t\t}\n\t}\n\tlength = target - blob.l;\n\tif(length !== 0) o.push(parsenoop(blob, length));\n\treturn o;\n}\n\n/* 2.5.198.21 */\nfunction parse_NameParsedFormula(blob, length, opts, cce) {\n\tvar target = blob.l + length;\n\tvar rgce = parse_Rgce(blob, cce);\n\tvar rgcb;\n\tif(target !== blob.l) rgcb = parse_RgbExtra(blob, target - blob.l, rgce, opts);\n\treturn [rgce, rgcb];\n}\n\n/* 2.5.198.3 TODO */\nfunction parse_XLSCellParsedFormula(blob, length, opts) {\n\tvar target = blob.l + length;\n\tvar rgcb, cce = blob.read_shift(2); // length of rgce\n\tif(cce == 0xFFFF) return [[],parsenoop(blob, length-2)];\n\tvar rgce = parse_Rgce(blob, cce);\n\tif(length !== cce + 2) rgcb = parse_RgbExtra(blob, length - cce - 2, rgce, opts);\n\treturn [rgce, rgcb];\n}\n\n/* 2.5.198.118 TODO */\nfunction parse_SharedParsedFormula(blob, length, opts) {\n\tvar target = blob.l + length;\n\tvar rgcb, cce = blob.read_shift(2); // length of rgce\n\tvar rgce = parse_Rgce(blob, cce);\n\tif(cce == 0xFFFF) return [[],parsenoop(blob, length-2)];\n\tif(length !== cce + 2) rgcb = parse_RgbExtra(blob, target - cce - 2, rgce, opts);\n\treturn [rgce, rgcb];\n}\n\n/* 2.5.198.1 TODO */\nfunction parse_ArrayParsedFormula(blob, length, opts, ref) {\n\tvar target = blob.l + length;\n\tvar rgcb, cce = blob.read_shift(2); // length of rgce\n\tif(cce == 0xFFFF) return [[],parsenoop(blob, length-2)];\n\tvar rgce = parse_Rgce(blob, cce);\n\tif(length !== cce + 2) rgcb = parse_RgbExtra(blob, target - cce - 2, rgce, opts);\n\treturn [rgce, rgcb];\n}\n\n/* 2.5.198.104 */\nfunction parse_Rgce(blob, length) {\n\tvar target = blob.l + length;\n\tvar R, id, ptgs = [];\n\twhile(target != blob.l) {\n\t\tlength = target - blob.l;\n\t\tid = blob[blob.l];\n\t\tR = PtgTypes[id];\n\t\t//console.log(\"ptg\", id, R)\n\t\tif(id === 0x18 || id === 0x19) {\n\t\t\tid = blob[blob.l + 1];\n\t\t\tR = (id === 0x18 ? Ptg18 : Ptg19)[id];\n\t\t}\n\t\tif(!R || !R.f) { ptgs.push(parsenoop(blob, length)); }\n\t\telse { ptgs.push([R.n, R.f(blob, length)]); }\n\t}\n\treturn ptgs;\n}\n\nfunction mapper(x) { return x.map(function f2(y) { return y[1];}).join(\",\");}\n\n/* 2.2.2 + Magic TODO */\nfunction stringify_formula(formula, range, cell, supbooks, opts) {\n\tif(opts !== undefined && opts.biff === 5) return \"BIFF5??\";\n\tvar _range = range !== undefined ? range : {s:{c:0, r:0}};\n\tvar stack = [], e1, e2, type, c, ixti, nameidx, r;\n\tif(!formula[0] || !formula[0][0]) return \"\";\n\t//console.log(\"--\",cell,formula[0])\n\tfor(var ff = 0, fflen = formula[0].length; ff < fflen; ++ff) {\n\t\tvar f = formula[0][ff];\n\t\t//console.log(\"++\",f, stack)\n\t\tswitch(f[0]) {\n\t\t/* 2.2.2.1 Unary Operator Tokens */\n\t\t\t/* 2.5.198.93 */\n\t\t\tcase 'PtgUminus': stack.push(\"-\" + stack.pop()); break;\n\t\t\t/* 2.5.198.95 */\n\t\t\tcase 'PtgUplus': stack.push(\"+\" + stack.pop()); break;\n\t\t\t/* 2.5.198.81 */\n\t\t\tcase 'PtgPercent': stack.push(stack.pop() + \"%\"); break;\n\n\t\t/* 2.2.2.1 Binary Value Operator Token */\n\t\t\t/* 2.5.198.26 */\n\t\t\tcase 'PtgAdd':\n\t\t\t\te1 = stack.pop(); e2 = stack.pop();\n\t\t\t\tstack.push(e2+\"+\"+e1);\n\t\t\t\tbreak;\n\t\t\t/* 2.5.198.90 */\n\t\t\tcase 'PtgSub':\n\t\t\t\te1 = stack.pop(); e2 = stack.pop();\n\t\t\t\tstack.push(e2+\"-\"+e1);\n\t\t\t\tbreak;\n\t\t\t/* 2.5.198.75 */\n\t\t\tcase 'PtgMul':\n\t\t\t\te1 = stack.pop(); e2 = stack.pop();\n\t\t\t\tstack.push(e2+\"*\"+e1);\n\t\t\t\tbreak;\n\t\t\t/* 2.5.198.45 */\n\t\t\tcase 'PtgDiv':\n\t\t\t\te1 = stack.pop(); e2 = stack.pop();\n\t\t\t\tstack.push(e2+\"/\"+e1);\n\t\t\t\tbreak;\n\t\t\t/* 2.5.198.82 */\n\t\t\tcase 'PtgPower':\n\t\t\t\te1 = stack.pop(); e2 = stack.pop();\n\t\t\t\tstack.push(e2+\"^\"+e1);\n\t\t\t\tbreak;\n\t\t\t/* 2.5.198.43 */\n\t\t\tcase 'PtgConcat':\n\t\t\t\te1 = stack.pop(); e2 = stack.pop();\n\t\t\t\tstack.push(e2+\"&\"+e1);\n\t\t\t\tbreak;\n\t\t\t/* 2.5.198.69 */\n\t\t\tcase 'PtgLt':\n\t\t\t\te1 = stack.pop(); e2 = stack.pop();\n\t\t\t\tstack.push(e2+\"<\"+e1);\n\t\t\t\tbreak;\n\t\t\t/* 2.5.198.68 */\n\t\t\tcase 'PtgLe':\n\t\t\t\te1 = stack.pop(); e2 = stack.pop();\n\t\t\t\tstack.push(e2+\"<=\"+e1);\n\t\t\t\tbreak;\n\t\t\t/* 2.5.198.56 */\n\t\t\tcase 'PtgEq':\n\t\t\t\te1 = stack.pop(); e2 = stack.pop();\n\t\t\t\tstack.push(e2+\"=\"+e1);\n\t\t\t\tbreak;\n\t\t\t/* 2.5.198.64 */\n\t\t\tcase 'PtgGe':\n\t\t\t\te1 = stack.pop(); e2 = stack.pop();\n\t\t\t\tstack.push(e2+\">=\"+e1);\n\t\t\t\tbreak;\n\t\t\t/* 2.5.198.65 */\n\t\t\tcase 'PtgGt':\n\t\t\t\te1 = stack.pop(); e2 = stack.pop();\n\t\t\t\tstack.push(e2+\">\"+e1);\n\t\t\t\tbreak;\n\t\t\t/* 2.5.198.78 */\n\t\t\tcase 'PtgNe':\n\t\t\t\te1 = stack.pop(); e2 = stack.pop();\n\t\t\t\tstack.push(e2+\"<>\"+e1);\n\t\t\t\tbreak;\n\n\t\t/* 2.2.2.1 Binary Reference Operator Token */\n\t\t\t/* 2.5.198.67 */\n\t\t\tcase 'PtgIsect':\n\t\t\t\te1 = stack.pop(); e2 = stack.pop();\n\t\t\t\tstack.push(e2+\" \"+e1);\n\t\t\t\tbreak;\n\t\t\tcase 'PtgUnion':\n\t\t\t\te1 = stack.pop(); e2 = stack.pop();\n\t\t\t\tstack.push(e2+\",\"+e1);\n\t\t\t\tbreak;\n\t\t\tcase 'PtgRange': break;\n\n\t\t/* 2.2.2.3 Control Tokens \"can be ignored\" */\n\t\t\t/* 2.5.198.34 */\n\t\t\tcase 'PtgAttrChoose': break;\n\t\t\t/* 2.5.198.35 */\n\t\t\tcase 'PtgAttrGoto': break;\n\t\t\t/* 2.5.198.36 */\n\t\t\tcase 'PtgAttrIf': break;\n\n\n\t\t\t/* 2.5.198.84 */\n\t\t\tcase 'PtgRef':\n\t\t\t\ttype = f[1][0]; c = shift_cell_xls(decode_cell(encode_cell(f[1][1])), _range);\n\t\t\t\tstack.push(encode_cell(c));\n\t\t\t\tbreak;\n\t\t\t/* 2.5.198.88 */\n\t\t\tcase 'PtgRefN':\n\t\t\t\ttype = f[1][0]; c = shift_cell_xls(decode_cell(encode_cell(f[1][1])), cell);\n\t\t\t\tstack.push(encode_cell(c));\n\t\t\t\tbreak;\n\t\t\tcase 'PtgRef3d': // TODO: lots of stuff\n\t\t\t\ttype = f[1][0]; ixti = f[1][1]; c = shift_cell_xls(f[1][2], _range);\n\t\t\t\tstack.push(supbooks[1][ixti+1]+\"!\"+encode_cell(c));\n\t\t\t\tbreak;\n\n\t\t/* Function Call */\n\t\t\t/* 2.5.198.62 */\n\t\t\tcase 'PtgFunc':\n\t\t\t/* 2.5.198.63 */\n\t\t\tcase 'PtgFuncVar':\n\t\t\t\t/* f[1] = [argc, func] */\n\t\t\t\tvar argc = f[1][0], func = f[1][1];\n\t\t\t\tif(!argc) argc = 0;\n\t\t\t\tvar args = stack.slice(-argc);\n\t\t\t\tstack.length -= argc;\n\t\t\t\tif(func === 'User') func = args.shift();\n\t\t\t\tstack.push(func + \"(\" + args.join(\",\") + \")\");\n\t\t\t\tbreak;\n\n\t\t\t/* 2.5.198.42 */\n\t\t\tcase 'PtgBool': stack.push(f[1] ? \"TRUE\" : \"FALSE\"); break;\n\t\t\t/* 2.5.198.66 */\n\t\t\tcase 'PtgInt': stack.push(f[1]); break;\n\t\t\t/* 2.5.198.79 TODO: precision? */\n\t\t\tcase 'PtgNum': stack.push(String(f[1])); break;\n\t\t\t/* 2.5.198.89 */\n\t\t\tcase 'PtgStr': stack.push('\"' + f[1] + '\"'); break;\n\t\t\t/* 2.5.198.57 */\n\t\t\tcase 'PtgErr': stack.push(f[1]); break;\n\t\t\t/* 2.5.198.27 TODO: fixed points */\n\t\t\tcase 'PtgArea':\n\t\t\t\ttype = f[1][0]; r = shift_range_xls(f[1][1], _range);\n\t\t\t\tstack.push(encode_range(r));\n\t\t\t\tbreak;\n\t\t\t/* 2.5.198.28 */\n\t\t\tcase 'PtgArea3d': // TODO: lots of stuff\n\t\t\t\ttype = f[1][0]; ixti = f[1][1]; r = f[1][2];\n\t\t\t\tstack.push(supbooks[1][ixti+1]+\"!\"+encode_range(r));\n\t\t\t\tbreak;\n\t\t\t/* 2.5.198.41 */\n\t\t\tcase 'PtgAttrSum':\n\t\t\t\tstack.push(\"SUM(\" + stack.pop() + \")\");\n\t\t\t\tbreak;\n\n\t\t/* Expression Prefixes */\n\t\t\t/* 2.5.198.37 */\n\t\t\tcase 'PtgAttrSemi': break;\n\n\t\t\t/* 2.5.97.60 TODO: do something different for revisions */\n\t\t\tcase 'PtgName':\n\t\t\t\t/* f[1] = type, 0, nameindex */\n\t\t\t\tnameidx = f[1][2];\n\t\t\t\tvar lbl = supbooks[0][nameidx];\n\t\t\t\tvar name = lbl.Name;\n\t\t\t\tif(name in XLSXFutureFunctions) name = XLSXFutureFunctions[name];\n\t\t\t\tstack.push(name);\n\t\t\t\tbreak;\n\n\t\t\t/* 2.5.97.61 TODO: do something different for revisions */\n\t\t\tcase 'PtgNameX':\n\t\t\t\t/* f[1] = type, ixti, nameindex */\n\t\t\t\tvar bookidx = f[1][1]; nameidx = f[1][2]; var externbook;\n\t\t\t\t/* TODO: Properly handle missing values */\n\t\t\t\tif(supbooks[bookidx+1]) externbook = supbooks[bookidx+1][nameidx];\n\t\t\t\telse if(supbooks[bookidx-1]) externbook = supbooks[bookidx-1][nameidx];\n\t\t\t\tif(!externbook) externbook = {body: \"??NAMEX??\"};\n\t\t\t\tstack.push(externbook.body);\n\t\t\t\tbreak;\n\n\t\t/* 2.2.2.4 Display Tokens */\n\t\t\t/* 2.5.198.80 */\n\t\t\tcase 'PtgParen': stack.push('(' + stack.pop() + ')'); break;\n\n\t\t\t/* 2.5.198.86 */\n\t\t\tcase 'PtgRefErr': stack.push('#REF!'); break;\n\n\t\t/* */\n\t\t\t/* 2.5.198.58 TODO */\n\t\t\tcase 'PtgExp':\n\t\t\t\tc = {c:f[1][1],r:f[1][0]};\n\t\t\t\tvar q = {c: cell.c, r:cell.r};\n\t\t\t\tif(supbooks.sharedf[encode_cell(c)]) {\n\t\t\t\t\tvar parsedf = (supbooks.sharedf[encode_cell(c)]);\n\t\t\t\t\tstack.push(stringify_formula(parsedf, _range, q, supbooks, opts));\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tvar fnd = false;\n\t\t\t\t\tfor(e1=0;e1!=supbooks.arrayf.length; ++e1) {\n\t\t\t\t\t\t/* TODO: should be something like range_has */\n\t\t\t\t\t\te2 = supbooks.arrayf[e1];\n\t\t\t\t\t\tif(c.c < e2[0].s.c || c.c > e2[0].e.c) continue;\n\t\t\t\t\t\tif(c.r < e2[0].s.r || c.r > e2[0].e.r) continue;\n\t\t\t\t\t\tstack.push(stringify_formula(e2[1], _range, q, supbooks, opts));\n\t\t\t\t\t}\n\t\t\t\t\tif(!fnd) stack.push(f[1]);\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\t/* 2.5.198.32 TODO */\n\t\t\tcase 'PtgArray':\n\t\t\t\tstack.push(\"{\" + f[1].map(mapper).join(\";\") + \"}\");\n\t\t\t\tbreak;\n\n\t\t/* 2.2.2.5 Mem Tokens */\n\t\t\t/* 2.5.198.70 TODO: confirm this is a non-display */\n\t\t\tcase 'PtgMemArea':\n\t\t\t\t//stack.push(\"(\" + f[2].map(encode_range).join(\",\") + \")\");\n\t\t\t\tbreak;\n\n\t\t\t/* 2.5.198.38 TODO */\n\t\t\tcase 'PtgAttrSpace': break;\n\n\t\t\t/* 2.5.198.92 TODO */\n\t\t\tcase 'PtgTbl': break;\n\n\t\t\t/* 2.5.198.71 */\n\t\t\tcase 'PtgMemErr': break;\n\n\t\t\t/* 2.5.198.74 */\n\t\t\tcase 'PtgMissArg':\n\t\t\t\tstack.push(\"\");\n\t\t\t\tbreak;\n\n\t\t\t/* 2.5.198.29 TODO */\n\t\t\tcase 'PtgAreaErr': break;\n\n\t\t\t/* 2.5.198.31 TODO */\n\t\t\tcase 'PtgAreaN': stack.push(\"\"); break;\n\n\t\t\t/* 2.5.198.87 TODO */\n\t\t\tcase 'PtgRefErr3d': break;\n\n\t\t\t/* 2.5.198.72 TODO */\n\t\t\tcase 'PtgMemFunc': break;\n\n\t\t\tdefault: throw 'Unrecognized Formula Token: ' + f;\n\t\t}\n\t\t//console.log(\"::\",f, stack)\n\t}\n\t//console.log(\"--\",stack);\n\treturn stack[0];\n}\n\n/* [MS-XLSB] 2.5.97.4 CellParsedFormula TODO: use similar logic to js-xls */\nfunction parse_XLSBCellParsedFormula(data, length) {\n\tvar cce = data.read_shift(4);\n\treturn parsenoop(data, length-4);\n}\n/* [MS-XLS] 2.5.198.44 */\nvar PtgDataType = {\n\t0x1: \"REFERENCE\", // reference to range\n\t0x2: \"VALUE\", // single value\n\t0x3: \"ARRAY\" // array of values\n};\n\n/* [MS-XLS] 2.5.198.4 */\nvar Cetab = {\n\t0x0000: 'BEEP',\n\t0x0001: 'OPEN',\n\t0x0002: 'OPEN.LINKS',\n\t0x0003: 'CLOSE.ALL',\n\t0x0004: 'SAVE',\n\t0x0005: 'SAVE.AS',\n\t0x0006: 'FILE.DELETE',\n\t0x0007: 'PAGE.SETUP',\n\t0x0008: 'PRINT',\n\t0x0009: 'PRINTER.SETUP',\n\t0x000A: 'QUIT',\n\t0x000B: 'NEW.WINDOW',\n\t0x000C: 'ARRANGE.ALL',\n\t0x000D: 'WINDOW.SIZE',\n\t0x000E: 'WINDOW.MOVE',\n\t0x000F: 'FULL',\n\t0x0010: 'CLOSE',\n\t0x0011: 'RUN',\n\t0x0016: 'SET.PRINT.AREA',\n\t0x0017: 'SET.PRINT.TITLES',\n\t0x0018: 'SET.PAGE.BREAK',\n\t0x0019: 'REMOVE.PAGE.BREAK',\n\t0x001A: 'FONT',\n\t0x001B: 'DISPLAY',\n\t0x001C: 'PROTECT.DOCUMENT',\n\t0x001D: 'PRECISION',\n\t0x001E: 'A1.R1C1',\n\t0x001F: 'CALCULATE.NOW',\n\t0x0020: 'CALCULATION',\n\t0x0022: 'DATA.FIND',\n\t0x0023: 'EXTRACT',\n\t0x0024: 'DATA.DELETE',\n\t0x0025: 'SET.DATABASE',\n\t0x0026: 'SET.CRITERIA',\n\t0x0027: 'SORT',\n\t0x0028: 'DATA.SERIES',\n\t0x0029: 'TABLE',\n\t0x002A: 'FORMAT.NUMBER',\n\t0x002B: 'ALIGNMENT',\n\t0x002C: 'STYLE',\n\t0x002D: 'BORDER',\n\t0x002E: 'CELL.PROTECTION',\n\t0x002F: 'COLUMN.WIDTH',\n\t0x0030: 'UNDO',\n\t0x0031: 'CUT',\n\t0x0032: 'COPY',\n\t0x0033: 'PASTE',\n\t0x0034: 'CLEAR',\n\t0x0035: 'PASTE.SPECIAL',\n\t0x0036: 'EDIT.DELETE',\n\t0x0037: 'INSERT',\n\t0x0038: 'FILL.RIGHT',\n\t0x0039: 'FILL.DOWN',\n\t0x003D: 'DEFINE.NAME',\n\t0x003E: 'CREATE.NAMES',\n\t0x003F: 'FORMULA.GOTO',\n\t0x0040: 'FORMULA.FIND',\n\t0x0041: 'SELECT.LAST.CELL',\n\t0x0042: 'SHOW.ACTIVE.CELL',\n\t0x0043: 'GALLERY.AREA',\n\t0x0044: 'GALLERY.BAR',\n\t0x0045: 'GALLERY.COLUMN',\n\t0x0046: 'GALLERY.LINE',\n\t0x0047: 'GALLERY.PIE',\n\t0x0048: 'GALLERY.SCATTER',\n\t0x0049: 'COMBINATION',\n\t0x004A: 'PREFERRED',\n\t0x004B: 'ADD.OVERLAY',\n\t0x004C: 'GRIDLINES',\n\t0x004D: 'SET.PREFERRED',\n\t0x004E: 'AXES',\n\t0x004F: 'LEGEND',\n\t0x0050: 'ATTACH.TEXT',\n\t0x0051: 'ADD.ARROW',\n\t0x0052: 'SELECT.CHART',\n\t0x0053: 'SELECT.PLOT.AREA',\n\t0x0054: 'PATTERNS',\n\t0x0055: 'MAIN.CHART',\n\t0x0056: 'OVERLAY',\n\t0x0057: 'SCALE',\n\t0x0058: 'FORMAT.LEGEND',\n\t0x0059: 'FORMAT.TEXT',\n\t0x005A: 'EDIT.REPEAT',\n\t0x005B: 'PARSE',\n\t0x005C: 'JUSTIFY',\n\t0x005D: 'HIDE',\n\t0x005E: 'UNHIDE',\n\t0x005F: 'WORKSPACE',\n\t0x0060: 'FORMULA',\n\t0x0061: 'FORMULA.FILL',\n\t0x0062: 'FORMULA.ARRAY',\n\t0x0063: 'DATA.FIND.NEXT',\n\t0x0064: 'DATA.FIND.PREV',\n\t0x0065: 'FORMULA.FIND.NEXT',\n\t0x0066: 'FORMULA.FIND.PREV',\n\t0x0067: 'ACTIVATE',\n\t0x0068: 'ACTIVATE.NEXT',\n\t0x0069: 'ACTIVATE.PREV',\n\t0x006A: 'UNLOCKED.NEXT',\n\t0x006B: 'UNLOCKED.PREV',\n\t0x006C: 'COPY.PICTURE',\n\t0x006D: 'SELECT',\n\t0x006E: 'DELETE.NAME',\n\t0x006F: 'DELETE.FORMAT',\n\t0x0070: 'VLINE',\n\t0x0071: 'HLINE',\n\t0x0072: 'VPAGE',\n\t0x0073: 'HPAGE',\n\t0x0074: 'VSCROLL',\n\t0x0075: 'HSCROLL',\n\t0x0076: 'ALERT',\n\t0x0077: 'NEW',\n\t0x0078: 'CANCEL.COPY',\n\t0x0079: 'SHOW.CLIPBOARD',\n\t0x007A: 'MESSAGE',\n\t0x007C: 'PASTE.LINK',\n\t0x007D: 'APP.ACTIVATE',\n\t0x007E: 'DELETE.ARROW',\n\t0x007F: 'ROW.HEIGHT',\n\t0x0080: 'FORMAT.MOVE',\n\t0x0081: 'FORMAT.SIZE',\n\t0x0082: 'FORMULA.REPLACE',\n\t0x0083: 'SEND.KEYS',\n\t0x0084: 'SELECT.SPECIAL',\n\t0x0085: 'APPLY.NAMES',\n\t0x0086: 'REPLACE.FONT',\n\t0x0087: 'FREEZE.PANES',\n\t0x0088: 'SHOW.INFO',\n\t0x0089: 'SPLIT',\n\t0x008A: 'ON.WINDOW',\n\t0x008B: 'ON.DATA',\n\t0x008C: 'DISABLE.INPUT',\n\t0x008E: 'OUTLINE',\n\t0x008F: 'LIST.NAMES',\n\t0x0090: 'FILE.CLOSE',\n\t0x0091: 'SAVE.WORKBOOK',\n\t0x0092: 'DATA.FORM',\n\t0x0093: 'COPY.CHART',\n\t0x0094: 'ON.TIME',\n\t0x0095: 'WAIT',\n\t0x0096: 'FORMAT.FONT',\n\t0x0097: 'FILL.UP',\n\t0x0098: 'FILL.LEFT',\n\t0x0099: 'DELETE.OVERLAY',\n\t0x009B: 'SHORT.MENUS',\n\t0x009F: 'SET.UPDATE.STATUS',\n\t0x00A1: 'COLOR.PALETTE',\n\t0x00A2: 'DELETE.STYLE',\n\t0x00A3: 'WINDOW.RESTORE',\n\t0x00A4: 'WINDOW.MAXIMIZE',\n\t0x00A6: 'CHANGE.LINK',\n\t0x00A7: 'CALCULATE.DOCUMENT',\n\t0x00A8: 'ON.KEY',\n\t0x00A9: 'APP.RESTORE',\n\t0x00AA: 'APP.MOVE',\n\t0x00AB: 'APP.SIZE',\n\t0x00AC: 'APP.MINIMIZE',\n\t0x00AD: 'APP.MAXIMIZE',\n\t0x00AE: 'BRING.TO.FRONT',\n\t0x00AF: 'SEND.TO.BACK',\n\t0x00B9: 'MAIN.CHART.TYPE',\n\t0x00BA: 'OVERLAY.CHART.TYPE',\n\t0x00BB: 'SELECT.END',\n\t0x00BC: 'OPEN.MAIL',\n\t0x00BD: 'SEND.MAIL',\n\t0x00BE: 'STANDARD.FONT',\n\t0x00BF: 'CONSOLIDATE',\n\t0x00C0: 'SORT.SPECIAL',\n\t0x00C1: 'GALLERY.3D.AREA',\n\t0x00C2: 'GALLERY.3D.COLUMN',\n\t0x00C3: 'GALLERY.3D.LINE',\n\t0x00C4: 'GALLERY.3D.PIE',\n\t0x00C5: 'VIEW.3D',\n\t0x00C6: 'GOAL.SEEK',\n\t0x00C7: 'WORKGROUP',\n\t0x00C8: 'FILL.GROUP',\n\t0x00C9: 'UPDATE.LINK',\n\t0x00CA: 'PROMOTE',\n\t0x00CB: 'DEMOTE',\n\t0x00CC: 'SHOW.DETAIL',\n\t0x00CE: 'UNGROUP',\n\t0x00CF: 'OBJECT.PROPERTIES',\n\t0x00D0: 'SAVE.NEW.OBJECT',\n\t0x00D1: 'SHARE',\n\t0x00D2: 'SHARE.NAME',\n\t0x00D3: 'DUPLICATE',\n\t0x00D4: 'APPLY.STYLE',\n\t0x00D5: 'ASSIGN.TO.OBJECT',\n\t0x00D6: 'OBJECT.PROTECTION',\n\t0x00D7: 'HIDE.OBJECT',\n\t0x00D8: 'SET.EXTRACT',\n\t0x00D9: 'CREATE.PUBLISHER',\n\t0x00DA: 'SUBSCRIBE.TO',\n\t0x00DB: 'ATTRIBUTES',\n\t0x00DC: 'SHOW.TOOLBAR',\n\t0x00DE: 'PRINT.PREVIEW',\n\t0x00DF: 'EDIT.COLOR',\n\t0x00E0: 'SHOW.LEVELS',\n\t0x00E1: 'FORMAT.MAIN',\n\t0x00E2: 'FORMAT.OVERLAY',\n\t0x00E3: 'ON.RECALC',\n\t0x00E4: 'EDIT.SERIES',\n\t0x00E5: 'DEFINE.STYLE',\n\t0x00F0: 'LINE.PRINT',\n\t0x00F3: 'ENTER.DATA',\n\t0x00F9: 'GALLERY.RADAR',\n\t0x00FA: 'MERGE.STYLES',\n\t0x00FB: 'EDITION.OPTIONS',\n\t0x00FC: 'PASTE.PICTURE',\n\t0x00FD: 'PASTE.PICTURE.LINK',\n\t0x00FE: 'SPELLING',\n\t0x0100: 'ZOOM',\n\t0x0103: 'INSERT.OBJECT',\n\t0x0104: 'WINDOW.MINIMIZE',\n\t0x0109: 'SOUND.NOTE',\n\t0x010A: 'SOUND.PLAY',\n\t0x010B: 'FORMAT.SHAPE',\n\t0x010C: 'EXTEND.POLYGON',\n\t0x010D: 'FORMAT.AUTO',\n\t0x0110: 'GALLERY.3D.BAR',\n\t0x0111: 'GALLERY.3D.SURFACE',\n\t0x0112: 'FILL.AUTO',\n\t0x0114: 'CUSTOMIZE.TOOLBAR',\n\t0x0115: 'ADD.TOOL',\n\t0x0116: 'EDIT.OBJECT',\n\t0x0117: 'ON.DOUBLECLICK',\n\t0x0118: 'ON.ENTRY',\n\t0x0119: 'WORKBOOK.ADD',\n\t0x011A: 'WORKBOOK.MOVE',\n\t0x011B: 'WORKBOOK.COPY',\n\t0x011C: 'WORKBOOK.OPTIONS',\n\t0x011D: 'SAVE.WORKSPACE',\n\t0x0120: 'CHART.WIZARD',\n\t0x0121: 'DELETE.TOOL',\n\t0x0122: 'MOVE.TOOL',\n\t0x0123: 'WORKBOOK.SELECT',\n\t0x0124: 'WORKBOOK.ACTIVATE',\n\t0x0125: 'ASSIGN.TO.TOOL',\n\t0x0127: 'COPY.TOOL',\n\t0x0128: 'RESET.TOOL',\n\t0x0129: 'CONSTRAIN.NUMERIC',\n\t0x012A: 'PASTE.TOOL',\n\t0x012E: 'WORKBOOK.NEW',\n\t0x0131: 'SCENARIO.CELLS',\n\t0x0132: 'SCENARIO.DELETE',\n\t0x0133: 'SCENARIO.ADD',\n\t0x0134: 'SCENARIO.EDIT',\n\t0x0135: 'SCENARIO.SHOW',\n\t0x0136: 'SCENARIO.SHOW.NEXT',\n\t0x0137: 'SCENARIO.SUMMARY',\n\t0x0138: 'PIVOT.TABLE.WIZARD',\n\t0x0139: 'PIVOT.FIELD.PROPERTIES',\n\t0x013A: 'PIVOT.FIELD',\n\t0x013B: 'PIVOT.ITEM',\n\t0x013C: 'PIVOT.ADD.FIELDS',\n\t0x013E: 'OPTIONS.CALCULATION',\n\t0x013F: 'OPTIONS.EDIT',\n\t0x0140: 'OPTIONS.VIEW',\n\t0x0141: 'ADDIN.MANAGER',\n\t0x0142: 'MENU.EDITOR',\n\t0x0143: 'ATTACH.TOOLBARS',\n\t0x0144: 'VBAActivate',\n\t0x0145: 'OPTIONS.CHART',\n\t0x0148: 'VBA.INSERT.FILE',\n\t0x014A: 'VBA.PROCEDURE.DEFINITION',\n\t0x0150: 'ROUTING.SLIP',\n\t0x0152: 'ROUTE.DOCUMENT',\n\t0x0153: 'MAIL.LOGON',\n\t0x0156: 'INSERT.PICTURE',\n\t0x0157: 'EDIT.TOOL',\n\t0x0158: 'GALLERY.DOUGHNUT',\n\t0x015E: 'CHART.TREND',\n\t0x0160: 'PIVOT.ITEM.PROPERTIES',\n\t0x0162: 'WORKBOOK.INSERT',\n\t0x0163: 'OPTIONS.TRANSITION',\n\t0x0164: 'OPTIONS.GENERAL',\n\t0x0172: 'FILTER.ADVANCED',\n\t0x0175: 'MAIL.ADD.MAILER',\n\t0x0176: 'MAIL.DELETE.MAILER',\n\t0x0177: 'MAIL.REPLY',\n\t0x0178: 'MAIL.REPLY.ALL',\n\t0x0179: 'MAIL.FORWARD',\n\t0x017A: 'MAIL.NEXT.LETTER',\n\t0x017B: 'DATA.LABEL',\n\t0x017C: 'INSERT.TITLE',\n\t0x017D: 'FONT.PROPERTIES',\n\t0x017E: 'MACRO.OPTIONS',\n\t0x017F: 'WORKBOOK.HIDE',\n\t0x0180: 'WORKBOOK.UNHIDE',\n\t0x0181: 'WORKBOOK.DELETE',\n\t0x0182: 'WORKBOOK.NAME',\n\t0x0184: 'GALLERY.CUSTOM',\n\t0x0186: 'ADD.CHART.AUTOFORMAT',\n\t0x0187: 'DELETE.CHART.AUTOFORMAT',\n\t0x0188: 'CHART.ADD.DATA',\n\t0x0189: 'AUTO.OUTLINE',\n\t0x018A: 'TAB.ORDER',\n\t0x018B: 'SHOW.DIALOG',\n\t0x018C: 'SELECT.ALL',\n\t0x018D: 'UNGROUP.SHEETS',\n\t0x018E: 'SUBTOTAL.CREATE',\n\t0x018F: 'SUBTOTAL.REMOVE',\n\t0x0190: 'RENAME.OBJECT',\n\t0x019C: 'WORKBOOK.SCROLL',\n\t0x019D: 'WORKBOOK.NEXT',\n\t0x019E: 'WORKBOOK.PREV',\n\t0x019F: 'WORKBOOK.TAB.SPLIT',\n\t0x01A0: 'FULL.SCREEN',\n\t0x01A1: 'WORKBOOK.PROTECT',\n\t0x01A4: 'SCROLLBAR.PROPERTIES',\n\t0x01A5: 'PIVOT.SHOW.PAGES',\n\t0x01A6: 'TEXT.TO.COLUMNS',\n\t0x01A7: 'FORMAT.CHARTTYPE',\n\t0x01A8: 'LINK.FORMAT',\n\t0x01A9: 'TRACER.DISPLAY',\n\t0x01AE: 'TRACER.NAVIGATE',\n\t0x01AF: 'TRACER.CLEAR',\n\t0x01B0: 'TRACER.ERROR',\n\t0x01B1: 'PIVOT.FIELD.GROUP',\n\t0x01B2: 'PIVOT.FIELD.UNGROUP',\n\t0x01B3: 'CHECKBOX.PROPERTIES',\n\t0x01B4: 'LABEL.PROPERTIES',\n\t0x01B5: 'LISTBOX.PROPERTIES',\n\t0x01B6: 'EDITBOX.PROPERTIES',\n\t0x01B7: 'PIVOT.REFRESH',\n\t0x01B8: 'LINK.COMBO',\n\t0x01B9: 'OPEN.TEXT',\n\t0x01BA: 'HIDE.DIALOG',\n\t0x01BB: 'SET.DIALOG.FOCUS',\n\t0x01BC: 'ENABLE.OBJECT',\n\t0x01BD: 'PUSHBUTTON.PROPERTIES',\n\t0x01BE: 'SET.DIALOG.DEFAULT',\n\t0x01BF: 'FILTER',\n\t0x01C0: 'FILTER.SHOW.ALL',\n\t0x01C1: 'CLEAR.OUTLINE',\n\t0x01C2: 'FUNCTION.WIZARD',\n\t0x01C3: 'ADD.LIST.ITEM',\n\t0x01C4: 'SET.LIST.ITEM',\n\t0x01C5: 'REMOVE.LIST.ITEM',\n\t0x01C6: 'SELECT.LIST.ITEM',\n\t0x01C7: 'SET.CONTROL.VALUE',\n\t0x01C8: 'SAVE.COPY.AS',\n\t0x01CA: 'OPTIONS.LISTS.ADD',\n\t0x01CB: 'OPTIONS.LISTS.DELETE',\n\t0x01CC: 'SERIES.AXES',\n\t0x01CD: 'SERIES.X',\n\t0x01CE: 'SERIES.Y',\n\t0x01CF: 'ERRORBAR.X',\n\t0x01D0: 'ERRORBAR.Y',\n\t0x01D1: 'FORMAT.CHART',\n\t0x01D2: 'SERIES.ORDER',\n\t0x01D3: 'MAIL.LOGOFF',\n\t0x01D4: 'CLEAR.ROUTING.SLIP',\n\t0x01D5: 'APP.ACTIVATE.MICROSOFT',\n\t0x01D6: 'MAIL.EDIT.MAILER',\n\t0x01D7: 'ON.SHEET',\n\t0x01D8: 'STANDARD.WIDTH',\n\t0x01D9: 'SCENARIO.MERGE',\n\t0x01DA: 'SUMMARY.INFO',\n\t0x01DB: 'FIND.FILE',\n\t0x01DC: 'ACTIVE.CELL.FONT',\n\t0x01DD: 'ENABLE.TIPWIZARD',\n\t0x01DE: 'VBA.MAKE.ADDIN',\n\t0x01E0: 'INSERTDATATABLE',\n\t0x01E1: 'WORKGROUP.OPTIONS',\n\t0x01E2: 'MAIL.SEND.MAILER',\n\t0x01E5: 'AUTOCORRECT',\n\t0x01E9: 'POST.DOCUMENT',\n\t0x01EB: 'PICKLIST',\n\t0x01ED: 'VIEW.SHOW',\n\t0x01EE: 'VIEW.DEFINE',\n\t0x01EF: 'VIEW.DELETE',\n\t0x01FD: 'SHEET.BACKGROUND',\n\t0x01FE: 'INSERT.MAP.OBJECT',\n\t0x01FF: 'OPTIONS.MENONO',\n\t0x0205: 'MSOCHECKS',\n\t0x0206: 'NORMAL',\n\t0x0207: 'LAYOUT',\n\t0x0208: 'RM.PRINT.AREA',\n\t0x0209: 'CLEAR.PRINT.AREA',\n\t0x020A: 'ADD.PRINT.AREA',\n\t0x020B: 'MOVE.BRK',\n\t0x0221: 'HIDECURR.NOTE',\n\t0x0222: 'HIDEALL.NOTES',\n\t0x0223: 'DELETE.NOTE',\n\t0x0224: 'TRAVERSE.NOTES',\n\t0x0225: 'ACTIVATE.NOTES',\n\t0x026C: 'PROTECT.REVISIONS',\n\t0x026D: 'UNPROTECT.REVISIONS',\n\t0x0287: 'OPTIONS.ME',\n\t0x028D: 'WEB.PUBLISH',\n\t0x029B: 'NEWWEBQUERY',\n\t0x02A1: 'PIVOT.TABLE.CHART',\n\t0x02F1: 'OPTIONS.SAVE',\n\t0x02F3: 'OPTIONS.SPELL',\n\t0x0328: 'HIDEALL.INKANNOTS'\n};\n\n/* [MS-XLS] 2.5.198.17 */\nvar Ftab = {\n\t0x0000: 'COUNT',\n\t0x0001: 'IF',\n\t0x0002: 'ISNA',\n\t0x0003: 'ISERROR',\n\t0x0004: 'SUM',\n\t0x0005: 'AVERAGE',\n\t0x0006: 'MIN',\n\t0x0007: 'MAX',\n\t0x0008: 'ROW',\n\t0x0009: 'COLUMN',\n\t0x000A: 'NA',\n\t0x000B: 'NPV',\n\t0x000C: 'STDEV',\n\t0x000D: 'DOLLAR',\n\t0x000E: 'FIXED',\n\t0x000F: 'SIN',\n\t0x0010: 'COS',\n\t0x0011: 'TAN',\n\t0x0012: 'ATAN',\n\t0x0013: 'PI',\n\t0x0014: 'SQRT',\n\t0x0015: 'EXP',\n\t0x0016: 'LN',\n\t0x0017: 'LOG10',\n\t0x0018: 'ABS',\n\t0x0019: 'INT',\n\t0x001A: 'SIGN',\n\t0x001B: 'ROUND',\n\t0x001C: 'LOOKUP',\n\t0x001D: 'INDEX',\n\t0x001E: 'REPT',\n\t0x001F: 'MID',\n\t0x0020: 'LEN',\n\t0x0021: 'VALUE',\n\t0x0022: 'TRUE',\n\t0x0023: 'FALSE',\n\t0x0024: 'AND',\n\t0x0025: 'OR',\n\t0x0026: 'NOT',\n\t0x0027: 'MOD',\n\t0x0028: 'DCOUNT',\n\t0x0029: 'DSUM',\n\t0x002A: 'DAVERAGE',\n\t0x002B: 'DMIN',\n\t0x002C: 'DMAX',\n\t0x002D: 'DSTDEV',\n\t0x002E: 'VAR',\n\t0x002F: 'DVAR',\n\t0x0030: 'TEXT',\n\t0x0031: 'LINEST',\n\t0x0032: 'TREND',\n\t0x0033: 'LOGEST',\n\t0x0034: 'GROWTH',\n\t0x0035: 'GOTO',\n\t0x0036: 'HALT',\n\t0x0037: 'RETURN',\n\t0x0038: 'PV',\n\t0x0039: 'FV',\n\t0x003A: 'NPER',\n\t0x003B: 'PMT',\n\t0x003C: 'RATE',\n\t0x003D: 'MIRR',\n\t0x003E: 'IRR',\n\t0x003F: 'RAND',\n\t0x0040: 'MATCH',\n\t0x0041: 'DATE',\n\t0x0042: 'TIME',\n\t0x0043: 'DAY',\n\t0x0044: 'MONTH',\n\t0x0045: 'YEAR',\n\t0x0046: 'WEEKDAY',\n\t0x0047: 'HOUR',\n\t0x0048: 'MINUTE',\n\t0x0049: 'SECOND',\n\t0x004A: 'NOW',\n\t0x004B: 'AREAS',\n\t0x004C: 'ROWS',\n\t0x004D: 'COLUMNS',\n\t0x004E: 'OFFSET',\n\t0x004F: 'ABSREF',\n\t0x0050: 'RELREF',\n\t0x0051: 'ARGUMENT',\n\t0x0052: 'SEARCH',\n\t0x0053: 'TRANSPOSE',\n\t0x0054: 'ERROR',\n\t0x0055: 'STEP',\n\t0x0056: 'TYPE',\n\t0x0057: 'ECHO',\n\t0x0058: 'SET.NAME',\n\t0x0059: 'CALLER',\n\t0x005A: 'DEREF',\n\t0x005B: 'WINDOWS',\n\t0x005C: 'SERIES',\n\t0x005D: 'DOCUMENTS',\n\t0x005E: 'ACTIVE.CELL',\n\t0x005F: 'SELECTION',\n\t0x0060: 'RESULT',\n\t0x0061: 'ATAN2',\n\t0x0062: 'ASIN',\n\t0x0063: 'ACOS',\n\t0x0064: 'CHOOSE',\n\t0x0065: 'HLOOKUP',\n\t0x0066: 'VLOOKUP',\n\t0x0067: 'LINKS',\n\t0x0068: 'INPUT',\n\t0x0069: 'ISREF',\n\t0x006A: 'GET.FORMULA',\n\t0x006B: 'GET.NAME',\n\t0x006C: 'SET.VALUE',\n\t0x006D: 'LOG',\n\t0x006E: 'EXEC',\n\t0x006F: 'CHAR',\n\t0x0070: 'LOWER',\n\t0x0071: 'UPPER',\n\t0x0072: 'PROPER',\n\t0x0073: 'LEFT',\n\t0x0074: 'RIGHT',\n\t0x0075: 'EXACT',\n\t0x0076: 'TRIM',\n\t0x0077: 'REPLACE',\n\t0x0078: 'SUBSTITUTE',\n\t0x0079: 'CODE',\n\t0x007A: 'NAMES',\n\t0x007B: 'DIRECTORY',\n\t0x007C: 'FIND',\n\t0x007D: 'CELL',\n\t0x007E: 'ISERR',\n\t0x007F: 'ISTEXT',\n\t0x0080: 'ISNUMBER',\n\t0x0081: 'ISBLANK',\n\t0x0082: 'T',\n\t0x0083: 'N',\n\t0x0084: 'FOPEN',\n\t0x0085: 'FCLOSE',\n\t0x0086: 'FSIZE',\n\t0x0087: 'FREADLN',\n\t0x0088: 'FREAD',\n\t0x0089: 'FWRITELN',\n\t0x008A: 'FWRITE',\n\t0x008B: 'FPOS',\n\t0x008C: 'DATEVALUE',\n\t0x008D: 'TIMEVALUE',\n\t0x008E: 'SLN',\n\t0x008F: 'SYD',\n\t0x0090: 'DDB',\n\t0x0091: 'GET.DEF',\n\t0x0092: 'REFTEXT',\n\t0x0093: 'TEXTREF',\n\t0x0094: 'INDIRECT',\n\t0x0095: 'REGISTER',\n\t0x0096: 'CALL',\n\t0x0097: 'ADD.BAR',\n\t0x0098: 'ADD.MENU',\n\t0x0099: 'ADD.COMMAND',\n\t0x009A: 'ENABLE.COMMAND',\n\t0x009B: 'CHECK.COMMAND',\n\t0x009C: 'RENAME.COMMAND',\n\t0x009D: 'SHOW.BAR',\n\t0x009E: 'DELETE.MENU',\n\t0x009F: 'DELETE.COMMAND',\n\t0x00A0: 'GET.CHART.ITEM',\n\t0x00A1: 'DIALOG.BOX',\n\t0x00A2: 'CLEAN',\n\t0x00A3: 'MDETERM',\n\t0x00A4: 'MINVERSE',\n\t0x00A5: 'MMULT',\n\t0x00A6: 'FILES',\n\t0x00A7: 'IPMT',\n\t0x00A8: 'PPMT',\n\t0x00A9: 'COUNTA',\n\t0x00AA: 'CANCEL.KEY',\n\t0x00AB: 'FOR',\n\t0x00AC: 'WHILE',\n\t0x00AD: 'BREAK',\n\t0x00AE: 'NEXT',\n\t0x00AF: 'INITIATE',\n\t0x00B0: 'REQUEST',\n\t0x00B1: 'POKE',\n\t0x00B2: 'EXECUTE',\n\t0x00B3: 'TERMINATE',\n\t0x00B4: 'RESTART',\n\t0x00B5: 'HELP',\n\t0x00B6: 'GET.BAR',\n\t0x00B7: 'PRODUCT',\n\t0x00B8: 'FACT',\n\t0x00B9: 'GET.CELL',\n\t0x00BA: 'GET.WORKSPACE',\n\t0x00BB: 'GET.WINDOW',\n\t0x00BC: 'GET.DOCUMENT',\n\t0x00BD: 'DPRODUCT',\n\t0x00BE: 'ISNONTEXT',\n\t0x00BF: 'GET.NOTE',\n\t0x00C0: 'NOTE',\n\t0x00C1: 'STDEVP',\n\t0x00C2: 'VARP',\n\t0x00C3: 'DSTDEVP',\n\t0x00C4: 'DVARP',\n\t0x00C5: 'TRUNC',\n\t0x00C6: 'ISLOGICAL',\n\t0x00C7: 'DCOUNTA',\n\t0x00C8: 'DELETE.BAR',\n\t0x00C9: 'UNREGISTER',\n\t0x00CC: 'USDOLLAR',\n\t0x00CD: 'FINDB',\n\t0x00CE: 'SEARCHB',\n\t0x00CF: 'REPLACEB',\n\t0x00D0: 'LEFTB',\n\t0x00D1: 'RIGHTB',\n\t0x00D2: 'MIDB',\n\t0x00D3: 'LENB',\n\t0x00D4: 'ROUNDUP',\n\t0x00D5: 'ROUNDDOWN',\n\t0x00D6: 'ASC',\n\t0x00D7: 'DBCS',\n\t0x00D8: 'RANK',\n\t0x00DB: 'ADDRESS',\n\t0x00DC: 'DAYS360',\n\t0x00DD: 'TODAY',\n\t0x00DE: 'VDB',\n\t0x00DF: 'ELSE',\n\t0x00E0: 'ELSE.IF',\n\t0x00E1: 'END.IF',\n\t0x00E2: 'FOR.CELL',\n\t0x00E3: 'MEDIAN',\n\t0x00E4: 'SUMPRODUCT',\n\t0x00E5: 'SINH',\n\t0x00E6: 'COSH',\n\t0x00E7: 'TANH',\n\t0x00E8: 'ASINH',\n\t0x00E9: 'ACOSH',\n\t0x00EA: 'ATANH',\n\t0x00EB: 'DGET',\n\t0x00EC: 'CREATE.OBJECT',\n\t0x00ED: 'VOLATILE',\n\t0x00EE: 'LAST.ERROR',\n\t0x00EF: 'CUSTOM.UNDO',\n\t0x00F0: 'CUSTOM.REPEAT',\n\t0x00F1: 'FORMULA.CONVERT',\n\t0x00F2: 'GET.LINK.INFO',\n\t0x00F3: 'TEXT.BOX',\n\t0x00F4: 'INFO',\n\t0x00F5: 'GROUP',\n\t0x00F6: 'GET.OBJECT',\n\t0x00F7: 'DB',\n\t0x00F8: 'PAUSE',\n\t0x00FB: 'RESUME',\n\t0x00FC: 'FREQUENCY',\n\t0x00FD: 'ADD.TOOLBAR',\n\t0x00FE: 'DELETE.TOOLBAR',\n\t0x00FF: 'User',\n\t0x0100: 'RESET.TOOLBAR',\n\t0x0101: 'EVALUATE',\n\t0x0102: 'GET.TOOLBAR',\n\t0x0103: 'GET.TOOL',\n\t0x0104: 'SPELLING.CHECK',\n\t0x0105: 'ERROR.TYPE',\n\t0x0106: 'APP.TITLE',\n\t0x0107: 'WINDOW.TITLE',\n\t0x0108: 'SAVE.TOOLBAR',\n\t0x0109: 'ENABLE.TOOL',\n\t0x010A: 'PRESS.TOOL',\n\t0x010B: 'REGISTER.ID',\n\t0x010C: 'GET.WORKBOOK',\n\t0x010D: 'AVEDEV',\n\t0x010E: 'BETADIST',\n\t0x010F: 'GAMMALN',\n\t0x0110: 'BETAINV',\n\t0x0111: 'BINOMDIST',\n\t0x0112: 'CHIDIST',\n\t0x0113: 'CHIINV',\n\t0x0114: 'COMBIN',\n\t0x0115: 'CONFIDENCE',\n\t0x0116: 'CRITBINOM',\n\t0x0117: 'EVEN',\n\t0x0118: 'EXPONDIST',\n\t0x0119: 'FDIST',\n\t0x011A: 'FINV',\n\t0x011B: 'FISHER',\n\t0x011C: 'FISHERINV',\n\t0x011D: 'FLOOR',\n\t0x011E: 'GAMMADIST',\n\t0x011F: 'GAMMAINV',\n\t0x0120: 'CEILING',\n\t0x0121: 'HYPGEOMDIST',\n\t0x0122: 'LOGNORMDIST',\n\t0x0123: 'LOGINV',\n\t0x0124: 'NEGBINOMDIST',\n\t0x0125: 'NORMDIST',\n\t0x0126: 'NORMSDIST',\n\t0x0127: 'NORMINV',\n\t0x0128: 'NORMSINV',\n\t0x0129: 'STANDARDIZE',\n\t0x012A: 'ODD',\n\t0x012B: 'PERMUT',\n\t0x012C: 'POISSON',\n\t0x012D: 'TDIST',\n\t0x012E: 'WEIBULL',\n\t0x012F: 'SUMXMY2',\n\t0x0130: 'SUMX2MY2',\n\t0x0131: 'SUMX2PY2',\n\t0x0132: 'CHITEST',\n\t0x0133: 'CORREL',\n\t0x0134: 'COVAR',\n\t0x0135: 'FORECAST',\n\t0x0136: 'FTEST',\n\t0x0137: 'INTERCEPT',\n\t0x0138: 'PEARSON',\n\t0x0139: 'RSQ',\n\t0x013A: 'STEYX',\n\t0x013B: 'SLOPE',\n\t0x013C: 'TTEST',\n\t0x013D: 'PROB',\n\t0x013E: 'DEVSQ',\n\t0x013F: 'GEOMEAN',\n\t0x0140: 'HARMEAN',\n\t0x0141: 'SUMSQ',\n\t0x0142: 'KURT',\n\t0x0143: 'SKEW',\n\t0x0144: 'ZTEST',\n\t0x0145: 'LARGE',\n\t0x0146: 'SMALL',\n\t0x0147: 'QUARTILE',\n\t0x0148: 'PERCENTILE',\n\t0x0149: 'PERCENTRANK',\n\t0x014A: 'MODE',\n\t0x014B: 'TRIMMEAN',\n\t0x014C: 'TINV',\n\t0x014E: 'MOVIE.COMMAND',\n\t0x014F: 'GET.MOVIE',\n\t0x0150: 'CONCATENATE',\n\t0x0151: 'POWER',\n\t0x0152: 'PIVOT.ADD.DATA',\n\t0x0153: 'GET.PIVOT.TABLE',\n\t0x0154: 'GET.PIVOT.FIELD',\n\t0x0155: 'GET.PIVOT.ITEM',\n\t0x0156: 'RADIANS',\n\t0x0157: 'DEGREES',\n\t0x0158: 'SUBTOTAL',\n\t0x0159: 'SUMIF',\n\t0x015A: 'COUNTIF',\n\t0x015B: 'COUNTBLANK',\n\t0x015C: 'SCENARIO.GET',\n\t0x015D: 'OPTIONS.LISTS.GET',\n\t0x015E: 'ISPMT',\n\t0x015F: 'DATEDIF',\n\t0x0160: 'DATESTRING',\n\t0x0161: 'NUMBERSTRING',\n\t0x0162: 'ROMAN',\n\t0x0163: 'OPEN.DIALOG',\n\t0x0164: 'SAVE.DIALOG',\n\t0x0165: 'VIEW.GET',\n\t0x0166: 'GETPIVOTDATA',\n\t0x0167: 'HYPERLINK',\n\t0x0168: 'PHONETIC',\n\t0x0169: 'AVERAGEA',\n\t0x016A: 'MAXA',\n\t0x016B: 'MINA',\n\t0x016C: 'STDEVPA',\n\t0x016D: 'VARPA',\n\t0x016E: 'STDEVA',\n\t0x016F: 'VARA',\n\t0x0170: 'BAHTTEXT',\n\t0x0171: 'THAIDAYOFWEEK',\n\t0x0172: 'THAIDIGIT',\n\t0x0173: 'THAIMONTHOFYEAR',\n\t0x0174: 'THAINUMSOUND',\n\t0x0175: 'THAINUMSTRING',\n\t0x0176: 'THAISTRINGLENGTH',\n\t0x0177: 'ISTHAIDIGIT',\n\t0x0178: 'ROUNDBAHTDOWN',\n\t0x0179: 'ROUNDBAHTUP',\n\t0x017A: 'THAIYEAR',\n\t0x017B: 'RTD'\n};\nvar FtabArgc = {\n\t0x0002: 1, /* ISNA */\n\t0x0003: 1, /* ISERROR */\n\t0x000F: 1, /* SIN */\n\t0x0010: 1, /* COS */\n\t0x0011: 1, /* TAN */\n\t0x0012: 1, /* ATAN */\n\t0x0014: 1, /* SQRT */\n\t0x0015: 1, /* EXP */\n\t0x0016: 1, /* LN */\n\t0x0017: 1, /* LOG10 */\n\t0x0018: 1, /* ABS */\n\t0x0019: 1, /* INT */\n\t0x001A: 1, /* SIGN */\n\t0x001B: 2, /* ROUND */\n\t0x001E: 2, /* REPT */\n\t0x001F: 3, /* MID */\n\t0x0020: 1, /* LEN */\n\t0x0021: 1, /* VALUE */\n\t0x0026: 1, /* NOT */\n\t0x0027: 2, /* MOD */\n\t0x0028: 3, /* DCOUNT */\n\t0x0029: 3, /* DSUM */\n\t0x002A: 3, /* DAVERAGE */\n\t0x002B: 3, /* DMIN */\n\t0x002C: 3, /* DMAX */\n\t0x002D: 3, /* DSTDEV */\n\t0x002F: 3, /* DVAR */\n\t0x0030: 2, /* TEXT */\n\t0x0035: 1, /* GOTO */\n\t0x003D: 3, /* MIRR */\n\t0x0041: 3, /* DATE */\n\t0x0042: 3, /* TIME */\n\t0x0043: 1, /* DAY */\n\t0x0044: 1, /* MONTH */\n\t0x0045: 1, /* YEAR */\n\t0x0047: 1, /* HOUR */\n\t0x0048: 1, /* MINUTE */\n\t0x0049: 1, /* SECOND */\n\t0x004B: 1, /* AREAS */\n\t0x004C: 1, /* ROWS */\n\t0x004D: 1, /* COLUMNS */\n\t0x004F: 2, /* ABSREF */\n\t0x0050: 2, /* RELREF */\n\t0x0053: 1, /* TRANSPOSE */\n\t0x0056: 1, /* TYPE */\n\t0x005A: 1, /* DEREF */\n\t0x0061: 2, /* ATAN2 */\n\t0x0062: 1, /* ASIN */\n\t0x0063: 1, /* ACOS */\n\t0x0069: 1, /* ISREF */\n\t0x006F: 1, /* CHAR */\n\t0x0070: 1, /* LOWER */\n\t0x0071: 1, /* UPPER */\n\t0x0072: 1, /* PROPER */\n\t0x0075: 2, /* EXACT */\n\t0x0076: 1, /* TRIM */\n\t0x0077: 4, /* REPLACE */\n\t0x0079: 1, /* CODE */\n\t0x007E: 1, /* ISERR */\n\t0x007F: 1, /* ISTEXT */\n\t0x0080: 1, /* ISNUMBER */\n\t0x0081: 1, /* ISBLANK */\n\t0x0082: 1, /* T */\n\t0x0083: 1, /* N */\n\t0x0085: 1, /* FCLOSE */\n\t0x0086: 1, /* FSIZE */\n\t0x0087: 1, /* FREADLN */\n\t0x0088: 2, /* FREAD */\n\t0x0089: 2, /* FWRITELN */\n\t0x008A: 2, /* FWRITE */\n\t0x008C: 1, /* DATEVALUE */\n\t0x008D: 1, /* TIMEVALUE */\n\t0x008E: 3, /* SLN */\n\t0x008F: 4, /* SYD */\n\t0x00A2: 1, /* CLEAN */\n\t0x00A3: 1, /* MDETERM */\n\t0x00A4: 1, /* MINVERSE */\n\t0x00A5: 2, /* MMULT */\n\t0x00AC: 1, /* WHILE */\n\t0x00AF: 2, /* INITIATE */\n\t0x00B0: 2, /* REQUEST */\n\t0x00B1: 3, /* POKE */\n\t0x00B2: 2, /* EXECUTE */\n\t0x00B3: 1, /* TERMINATE */\n\t0x00B8: 1, /* FACT */\n\t0x00BD: 3, /* DPRODUCT */\n\t0x00BE: 1, /* ISNONTEXT */\n\t0x00C3: 3, /* DSTDEVP */\n\t0x00C4: 3, /* DVARP */\n\t0x00C6: 1, /* ISLOGICAL */\n\t0x00C7: 3, /* DCOUNTA */\n\t0x00C9: 1, /* UNREGISTER */\n\t0x00CF: 4, /* REPLACEB */\n\t0x00D2: 3, /* MIDB */\n\t0x00D3: 1, /* LENB */\n\t0x00D4: 2, /* ROUNDUP */\n\t0x00D5: 2, /* ROUNDDOWN */\n\t0x00D6: 1, /* ASC */\n\t0x00D7: 1, /* DBCS */\n\t0x00E5: 1, /* SINH */\n\t0x00E6: 1, /* COSH */\n\t0x00E7: 1, /* TANH */\n\t0x00E8: 1, /* ASINH */\n\t0x00E9: 1, /* ACOSH */\n\t0x00EA: 1, /* ATANH */\n\t0x00EB: 3, /* DGET */\n\t0x00F4: 1, /* INFO */\n\t0x00FC: 2, /* FREQUENCY */\n\t0x0101: 1, /* EVALUATE */\n\t0x0105: 1, /* ERROR.TYPE */\n\t0x010F: 1, /* GAMMALN */\n\t0x0111: 4, /* BINOMDIST */\n\t0x0112: 2, /* CHIDIST */\n\t0x0113: 2, /* CHIINV */\n\t0x0114: 2, /* COMBIN */\n\t0x0115: 3, /* CONFIDENCE */\n\t0x0116: 3, /* CRITBINOM */\n\t0x0117: 1, /* EVEN */\n\t0x0118: 3, /* EXPONDIST */\n\t0x0119: 3, /* FDIST */\n\t0x011A: 3, /* FINV */\n\t0x011B: 1, /* FISHER */\n\t0x011C: 1, /* FISHERINV */\n\t0x011D: 2, /* FLOOR */\n\t0x011E: 4, /* GAMMADIST */\n\t0x011F: 3, /* GAMMAINV */\n\t0x0120: 2, /* CEILING */\n\t0x0121: 4, /* HYPGEOMDIST */\n\t0x0122: 3, /* LOGNORMDIST */\n\t0x0123: 3, /* LOGINV */\n\t0x0124: 3, /* NEGBINOMDIST */\n\t0x0125: 4, /* NORMDIST */\n\t0x0126: 1, /* NORMSDIST */\n\t0x0127: 3, /* NORMINV */\n\t0x0128: 1, /* NORMSINV */\n\t0x0129: 3, /* STANDARDIZE */\n\t0x012A: 1, /* ODD */\n\t0x012B: 2, /* PERMUT */\n\t0x012C: 3, /* POISSON */\n\t0x012D: 3, /* TDIST */\n\t0x012E: 4, /* WEIBULL */\n\t0x012F: 2, /* SUMXMY2 */\n\t0x0130: 2, /* SUMX2MY2 */\n\t0x0131: 2, /* SUMX2PY2 */\n\t0x0132: 2, /* CHITEST */\n\t0x0133: 2, /* CORREL */\n\t0x0134: 2, /* COVAR */\n\t0x0135: 3, /* FORECAST */\n\t0x0136: 2, /* FTEST */\n\t0x0137: 2, /* INTERCEPT */\n\t0x0138: 2, /* PEARSON */\n\t0x0139: 2, /* RSQ */\n\t0x013A: 2, /* STEYX */\n\t0x013B: 2, /* SLOPE */\n\t0x013C: 4, /* TTEST */\n\t0x0145: 2, /* LARGE */\n\t0x0146: 2, /* SMALL */\n\t0x0147: 2, /* QUARTILE */\n\t0x0148: 2, /* PERCENTILE */\n\t0x014B: 2, /* TRIMMEAN */\n\t0x014C: 2, /* TINV */\n\t0x0151: 2, /* POWER */\n\t0x0156: 1, /* RADIANS */\n\t0x0157: 1, /* DEGREES */\n\t0x015A: 2, /* COUNTIF */\n\t0x015B: 1, /* COUNTBLANK */\n\t0x015E: 4, /* ISPMT */\n\t0x015F: 3, /* DATEDIF */\n\t0x0160: 1, /* DATESTRING */\n\t0x0161: 2, /* NUMBERSTRING */\n\t0x0168: 1, /* PHONETIC */\n\t0x0170: 1, /* BAHTTEXT */\n\t0x0171: 1, /* THAIDAYOFWEEK */\n\t0x0172: 1, /* THAIDIGIT */\n\t0x0173: 1, /* THAIMONTHOFYEAR */\n\t0x0174: 1, /* THAINUMSOUND */\n\t0x0175: 1, /* THAINUMSTRING */\n\t0x0176: 1, /* THAISTRINGLENGTH */\n\t0x0177: 1, /* ISTHAIDIGIT */\n\t0x0178: 1, /* ROUNDBAHTDOWN */\n\t0x0179: 1, /* ROUNDBAHTUP */\n\t0x017A: 1, /* THAIYEAR */\n\t0xFFFF: 0\n};\n/* [MS-XLSX] 2.2.3 Functions */\nvar XLSXFutureFunctions = {\n\t\"_xlfn.ACOT\": \"ACOT\",\n\t\"_xlfn.ACOTH\": \"ACOTH\",\n\t\"_xlfn.AGGREGATE\": \"AGGREGATE\",\n\t\"_xlfn.ARABIC\": \"ARABIC\",\n\t\"_xlfn.AVERAGEIF\": \"AVERAGEIF\",\n\t\"_xlfn.AVERAGEIFS\": \"AVERAGEIFS\",\n\t\"_xlfn.BASE\": \"BASE\",\n\t\"_xlfn.BETA.DIST\": \"BETA.DIST\",\n\t\"_xlfn.BETA.INV\": \"BETA.INV\",\n\t\"_xlfn.BINOM.DIST\": \"BINOM.DIST\",\n\t\"_xlfn.BINOM.DIST.RANGE\": \"BINOM.DIST.RANGE\",\n\t\"_xlfn.BINOM.INV\": \"BINOM.INV\",\n\t\"_xlfn.BITAND\": \"BITAND\",\n\t\"_xlfn.BITLSHIFT\": \"BITLSHIFT\",\n\t\"_xlfn.BITOR\": \"BITOR\",\n\t\"_xlfn.BITRSHIFT\": \"BITRSHIFT\",\n\t\"_xlfn.BITXOR\": \"BITXOR\",\n\t\"_xlfn.CEILING.MATH\": \"CEILING.MATH\",\n\t\"_xlfn.CEILING.PRECISE\": \"CEILING.PRECISE\",\n\t\"_xlfn.CHISQ.DIST\": \"CHISQ.DIST\",\n\t\"_xlfn.CHISQ.DIST.RT\": \"CHISQ.DIST.RT\",\n\t\"_xlfn.CHISQ.INV\": \"CHISQ.INV\",\n\t\"_xlfn.CHISQ.INV.RT\": \"CHISQ.INV.RT\",\n\t\"_xlfn.CHISQ.TEST\": \"CHISQ.TEST\",\n\t\"_xlfn.COMBINA\": \"COMBINA\",\n\t\"_xlfn.CONFIDENCE.NORM\": \"CONFIDENCE.NORM\",\n\t\"_xlfn.CONFIDENCE.T\": \"CONFIDENCE.T\",\n\t\"_xlfn.COT\": \"COT\",\n\t\"_xlfn.COTH\": \"COTH\",\n\t\"_xlfn.COUNTIFS\": \"COUNTIFS\",\n\t\"_xlfn.COVARIANCE.P\": \"COVARIANCE.P\",\n\t\"_xlfn.COVARIANCE.S\": \"COVARIANCE.S\",\n\t\"_xlfn.CSC\": \"CSC\",\n\t\"_xlfn.CSCH\": \"CSCH\",\n\t\"_xlfn.DAYS\": \"DAYS\",\n\t\"_xlfn.DECIMAL\": \"DECIMAL\",\n\t\"_xlfn.ECMA.CEILING\": \"ECMA.CEILING\",\n\t\"_xlfn.ERF.PRECISE\": \"ERF.PRECISE\",\n\t\"_xlfn.ERFC.PRECISE\": \"ERFC.PRECISE\",\n\t\"_xlfn.EXPON.DIST\": \"EXPON.DIST\",\n\t\"_xlfn.F.DIST\": \"F.DIST\",\n\t\"_xlfn.F.DIST.RT\": \"F.DIST.RT\",\n\t\"_xlfn.F.INV\": \"F.INV\",\n\t\"_xlfn.F.INV.RT\": \"F.INV.RT\",\n\t\"_xlfn.F.TEST\": \"F.TEST\",\n\t\"_xlfn.FILTERXML\": \"FILTERXML\",\n\t\"_xlfn.FLOOR.MATH\": \"FLOOR.MATH\",\n\t\"_xlfn.FLOOR.PRECISE\": \"FLOOR.PRECISE\",\n\t\"_xlfn.FORMULATEXT\": \"FORMULATEXT\",\n\t\"_xlfn.GAMMA\": \"GAMMA\",\n\t\"_xlfn.GAMMA.DIST\": \"GAMMA.DIST\",\n\t\"_xlfn.GAMMA.INV\": \"GAMMA.INV\",\n\t\"_xlfn.GAMMALN.PRECISE\": \"GAMMALN.PRECISE\",\n\t\"_xlfn.GAUSS\": \"GAUSS\",\n\t\"_xlfn.HYPGEOM.DIST\": \"HYPGEOM.DIST\",\n\t\"_xlfn.IFNA\": \"IFNA\",\n\t\"_xlfn.IFERROR\": \"IFERROR\",\n\t\"_xlfn.IMCOSH\": \"IMCOSH\",\n\t\"_xlfn.IMCOT\": \"IMCOT\",\n\t\"_xlfn.IMCSC\": \"IMCSC\",\n\t\"_xlfn.IMCSCH\": \"IMCSCH\",\n\t\"_xlfn.IMSEC\": \"IMSEC\",\n\t\"_xlfn.IMSECH\": \"IMSECH\",\n\t\"_xlfn.IMSINH\": \"IMSINH\",\n\t\"_xlfn.IMTAN\": \"IMTAN\",\n\t\"_xlfn.ISFORMULA\": \"ISFORMULA\",\n\t\"_xlfn.ISO.CEILING\": \"ISO.CEILING\",\n\t\"_xlfn.ISOWEEKNUM\": \"ISOWEEKNUM\",\n\t\"_xlfn.LOGNORM.DIST\": \"LOGNORM.DIST\",\n\t\"_xlfn.LOGNORM.INV\": \"LOGNORM.INV\",\n\t\"_xlfn.MODE.MULT\": \"MODE.MULT\",\n\t\"_xlfn.MODE.SNGL\": \"MODE.SNGL\",\n\t\"_xlfn.MUNIT\": \"MUNIT\",\n\t\"_xlfn.NEGBINOM.DIST\": \"NEGBINOM.DIST\",\n\t\"_xlfn.NETWORKDAYS.INTL\": \"NETWORKDAYS.INTL\",\n\t\"_xlfn.NIGBINOM\": \"NIGBINOM\",\n\t\"_xlfn.NORM.DIST\": \"NORM.DIST\",\n\t\"_xlfn.NORM.INV\": \"NORM.INV\",\n\t\"_xlfn.NORM.S.DIST\": \"NORM.S.DIST\",\n\t\"_xlfn.NORM.S.INV\": \"NORM.S.INV\",\n\t\"_xlfn.NUMBERVALUE\": \"NUMBERVALUE\",\n\t\"_xlfn.PDURATION\": \"PDURATION\",\n\t\"_xlfn.PERCENTILE.EXC\": \"PERCENTILE.EXC\",\n\t\"_xlfn.PERCENTILE.INC\": \"PERCENTILE.INC\",\n\t\"_xlfn.PERCENTRANK.EXC\": \"PERCENTRANK.EXC\",\n\t\"_xlfn.PERCENTRANK.INC\": \"PERCENTRANK.INC\",\n\t\"_xlfn.PERMUTATIONA\": \"PERMUTATIONA\",\n\t\"_xlfn.PHI\": \"PHI\",\n\t\"_xlfn.POISSON.DIST\": \"POISSON.DIST\",\n\t\"_xlfn.QUARTILE.EXC\": \"QUARTILE.EXC\",\n\t\"_xlfn.QUARTILE.INC\": \"QUARTILE.INC\",\n\t\"_xlfn.QUERYSTRING\": \"QUERYSTRING\",\n\t\"_xlfn.RANK.AVG\": \"RANK.AVG\",\n\t\"_xlfn.RANK.EQ\": \"RANK.EQ\",\n\t\"_xlfn.RRI\": \"RRI\",\n\t\"_xlfn.SEC\": \"SEC\",\n\t\"_xlfn.SECH\": \"SECH\",\n\t\"_xlfn.SHEET\": \"SHEET\",\n\t\"_xlfn.SHEETS\": \"SHEETS\",\n\t\"_xlfn.SKEW.P\": \"SKEW.P\",\n\t\"_xlfn.STDEV.P\": \"STDEV.P\",\n\t\"_xlfn.STDEV.S\": \"STDEV.S\",\n\t\"_xlfn.SUMIFS\": \"SUMIFS\",\n\t\"_xlfn.T.DIST\": \"T.DIST\",\n\t\"_xlfn.T.DIST.2T\": \"T.DIST.2T\",\n\t\"_xlfn.T.DIST.RT\": \"T.DIST.RT\",\n\t\"_xlfn.T.INV\": \"T.INV\",\n\t\"_xlfn.T.INV.2T\": \"T.INV.2T\",\n\t\"_xlfn.T.TEST\": \"T.TEST\",\n\t\"_xlfn.UNICHAR\": \"UNICHAR\",\n\t\"_xlfn.UNICODE\": \"UNICODE\",\n\t\"_xlfn.VAR.P\": \"VAR.P\",\n\t\"_xlfn.VAR.S\": \"VAR.S\",\n\t\"_xlfn.WEBSERVICE\": \"WEBSERVICE\",\n\t\"_xlfn.WEIBULL.DIST\": \"WEIBULL.DIST\",\n\t\"_xlfn.WORKDAY.INTL\": \"WORKDAY.INTL\",\n\t\"_xlfn.XOR\": \"XOR\",\n\t\"_xlfn.Z.TEST\": \"Z.TEST\"\n};\n\nvar strs = {}; // shared strings\nvar _ssfopts = {}; // spreadsheet formatting options\n\nRELS.WS = \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet\";\n\nfunction get_sst_id(sst, str) {\n\tfor(var i = 0, len = sst.length; i < len; ++i) if(sst[i].t === str) { sst.Count ++; return i; }\n\tsst[len] = {t:str}; sst.Count ++; sst.Unique ++; return len;\n}\n\nfunction get_cell_style(styles, cell, opts) {\n\tvar z = opts.revssf[cell.z != null ? cell.z : \"General\"];\n\tfor(var i = 0, len = styles.length; i != len; ++i) if(styles[i].numFmtId === z) return i;\n\tstyles[len] = {\n\t\tnumFmtId:z,\n\t\tfontId:0,\n\t\tfillId:0,\n\t\tborderId:0,\n\t\txfId:0,\n\t\tapplyNumberFormat:1\n\t};\n\treturn len;\n}\n\nfunction safe_format(p, fmtid, fillid, opts) {\n\ttry {\n\t\tif(p.t === 'e') p.w = p.w || BErr[p.v];\n\t\telse if(fmtid === 0) {\n\t\t\tif(p.t === 'n') {\n\t\t\t\tif((p.v|0) === p.v) p.w = SSF._general_int(p.v,_ssfopts);\n\t\t\t\telse p.w = SSF._general_num(p.v,_ssfopts);\n\t\t\t}\n\t\t\telse if(p.t === 'd') {\n\t\t\t\tvar dd = datenum(p.v);\n\t\t\t\tif((dd|0) === dd) p.w = SSF._general_int(dd,_ssfopts);\n\t\t\t\telse p.w = SSF._general_num(dd,_ssfopts);\n\t\t\t}\n\t\t\telse if(p.v === undefined) return \"\";\n\t\t\telse p.w = SSF._general(p.v,_ssfopts);\n\t\t}\n\t\telse if(p.t === 'd') p.w = SSF.format(fmtid,datenum(p.v),_ssfopts);\n\t\telse p.w = SSF.format(fmtid,p.v,_ssfopts);\n\t\tif(opts.cellNF) p.z = SSF._table[fmtid];\n\t} catch(e) { if(opts.WTF) throw e; }\n\tif(fillid) try {\n\t\tp.s = styles.Fills[fillid];\n\t\tif (p.s.fgColor && p.s.fgColor.theme) {\n\t\t\tp.s.fgColor.rgb = rgb_tint(themes.themeElements.clrScheme[p.s.fgColor.theme].rgb, p.s.fgColor.tint || 0);\n\t\t\tif(opts.WTF) p.s.fgColor.raw_rgb = themes.themeElements.clrScheme[p.s.fgColor.theme].rgb;\n\t\t}\n\t\tif (p.s.bgColor && p.s.bgColor.theme) {\n\t\t\tp.s.bgColor.rgb = rgb_tint(themes.themeElements.clrScheme[p.s.bgColor.theme].rgb, p.s.bgColor.tint || 0);\n\t\t\tif(opts.WTF) p.s.bgColor.raw_rgb = themes.themeElements.clrScheme[p.s.bgColor.theme].rgb;\n\t\t}\n\t} catch(e) { if(opts.WTF) throw e; }\n}\nfunction parse_ws_xml_dim(ws, s) {\n\tvar d = safe_decode_range(s);\n\tif(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);\n}\nvar mergecregex = /<mergeCell ref=\"[A-Z0-9:]+\"\\s*\\/>/g;\nvar sheetdataregex = /<(?:\\w+:)?sheetData>([^\\u2603]*)<\\/(?:\\w+:)?sheetData>/;\nvar hlinkregex = /<hyperlink[^>]*\\/>/g;\nvar dimregex = /\"(\\w*:\\w*)\"/;\nvar colregex = /<col[^>]*\\/>/g;\n/* 18.3 Worksheets */\nfunction parse_ws_xml(data, opts, rels) {\n\tif(!data) return data;\n\t/* 18.3.1.99 worksheet CT_Worksheet */\n\tvar s = {};\n\n\t/* 18.3.1.35 dimension CT_SheetDimension ? */\n\tvar ridx = data.indexOf(\"<dimension\");\n\tif(ridx > 0) {\n\t\tvar ref = data.substr(ridx,50).match(dimregex);\n\t\tif(ref != null) parse_ws_xml_dim(s, ref[1]);\n\t}\n\n\t/* 18.3.1.55 mergeCells CT_MergeCells */\n\tvar mergecells = [];\n\tif(data.indexOf(\"</mergeCells>\")!==-1) {\n\t\tvar merges = data.match(mergecregex);\n\t\tfor(ridx = 0; ridx != merges.length; ++ridx)\n\t\t\tmergecells[ridx] = safe_decode_range(merges[ridx].substr(merges[ridx].indexOf(\"\\\"\")+1));\n\t}\n\n\t/* 18.3.1.17 cols CT_Cols */\n\tvar columns = [];\n\tif(opts.cellStyles && data.indexOf(\"</cols>\")!==-1) {\n\t\t/* 18.3.1.13 col CT_Col */\n\t\tvar cols = data.match(colregex);\n\t\tparse_ws_xml_cols(columns, cols);\n\t}\n\n\tvar refguess = {s: {r:1000000, c:1000000}, e: {r:0, c:0} };\n\n\t/* 18.3.1.80 sheetData CT_SheetData ? */\n\tvar mtch=data.match(sheetdataregex);\n\tif(mtch) parse_ws_xml_data(mtch[1], s, opts, refguess);\n\n\t/* 18.3.1.48 hyperlinks CT_Hyperlinks */\n\tif(data.indexOf(\"</hyperlinks>\")!==-1) parse_ws_xml_hlinks(s, data.match(hlinkregex), rels);\n\n\tif(!s[\"!ref\"] && refguess.e.c >= refguess.s.c && refguess.e.r >= refguess.s.r) s[\"!ref\"] = encode_range(refguess);\n\tif(opts.sheetRows > 0 && s[\"!ref\"]) {\n\t\tvar tmpref = safe_decode_range(s[\"!ref\"]);\n\t\tif(opts.sheetRows < +tmpref.e.r) {\n\t\t\ttmpref.e.r = opts.sheetRows - 1;\n\t\t\tif(tmpref.e.r > refguess.e.r) tmpref.e.r = refguess.e.r;\n\t\t\tif(tmpref.e.r < tmpref.s.r) tmpref.s.r = tmpref.e.r;\n\t\t\tif(tmpref.e.c > refguess.e.c) tmpref.e.c = refguess.e.c;\n\t\t\tif(tmpref.e.c < tmpref.s.c) tmpref.s.c = tmpref.e.c;\n\t\t\ts[\"!fullref\"] = s[\"!ref\"];\n\t\t\ts[\"!ref\"] = encode_range(tmpref);\n\t\t}\n\t}\n\tif(mergecells.length > 0) s[\"!merges\"] = mergecells;\n\tif(columns.length > 0) s[\"!cols\"] = columns;\n\treturn s;\n}\n\nfunction write_ws_xml_merges(merges) {\n\tif(merges.length == 0) return \"\";\n\tvar o = '<mergeCells count=\"' + merges.length + '\">';\n\tfor(var i = 0; i != merges.length; ++i) o += '<mergeCell ref=\"' + encode_range(merges[i]) + '\"/>';\n\treturn o + '</mergeCells>';\n}\n\nfunction parse_ws_xml_hlinks(s, data, rels) {\n\tfor(var i = 0; i != data.length; ++i) {\n\t\tvar val = parsexmltag(data[i], true);\n\t\tif(!val.ref) return;\n\t\tvar rel = rels ? rels['!id'][val.id] : null;\n\t\tif(rel) {\n\t\t\tval.Target = rel.Target;\n\t\t\tif(val.location) val.Target += \"#\"+val.location;\n\t\t\tval.Rel = rel;\n\t\t} else {\n\t\t\tval.Target = val.location;\n\t\t\trel = {Target: val.location, TargetMode: 'Internal'};\n\t\t\tval.Rel = rel;\n\t\t}\n\t\tvar rng = safe_decode_range(val.ref);\n\t\tfor(var R=rng.s.r;R<=rng.e.r;++R) for(var C=rng.s.c;C<=rng.e.c;++C) {\n\t\t\tvar addr = encode_cell({c:C,r:R});\n\t\t\tif(!s[addr]) s[addr] = {t:\"stub\",v:undefined};\n\t\t\ts[addr].l = val;\n\t\t}\n\t}\n}\n\nfunction parse_ws_xml_cols(columns, cols) {\n\tvar seencol = false;\n\tfor(var coli = 0; coli != cols.length; ++coli) {\n\t\tvar coll = parsexmltag(cols[coli], true);\n\t\tvar colm=parseInt(coll.min, 10)-1, colM=parseInt(coll.max,10)-1;\n\t\tdelete coll.min; delete coll.max;\n\t\tif(!seencol && coll.width) { seencol = true; find_mdw(+coll.width, coll); }\n\t\tif(coll.width) {\n\t\t\tcoll.wpx = width2px(+coll.width);\n\t\t\tcoll.wch = px2char(coll.wpx);\n\t\t\tcoll.MDW = MDW;\n\t\t}\n\t\twhile(colm <= colM) columns[colm++] = coll;\n\t}\n}\n\nfunction write_ws_xml_cols(ws, cols) {\n\tvar o = [\"<cols>\"], col, width;\n\tfor(var i = 0; i != cols.length; ++i) {\n\t\tif(!(col = cols[i])) continue;\n\t\tvar p = {min:i+1,max:i+1};\n\t\t/* wch (chars), wpx (pixels) */\n\t\twidth = -1;\n\t\tif(col.wpx) width = px2char(col.wpx);\n\t\telse if(col.wch) width = col.wch;\n\t\tif(width > -1) { p.width = char2width(width); p.customWidth= 1; }\n\t\to[o.length] = (writextag('col', null, p));\n\t}\n\to[o.length] = \"</cols>\";\n\treturn o.join(\"\");\n}\n\nfunction write_ws_xml_cell(cell, ref, ws, opts, idx, wb) {\n\tif(cell.v === undefined) return \"\";\n\tvar vv = \"\";\n\tvar oldt = cell.t, oldv = cell.v;\n\tswitch(cell.t) {\n\t\tcase 'b': vv = cell.v ? \"1\" : \"0\"; break;\n\t\tcase 'n': vv = ''+cell.v; break;\n\t\tcase 'e': vv = BErr[cell.v]; break;\n\t\tcase 'd':\n\t\t\tif(opts.cellDates) vv = new Date(cell.v).toISOString();\n\t\t\telse {\n\t\t\t\tcell.t = 'n';\n\t\t\t\tvv = ''+(cell.v = datenum(cell.v));\n\t\t\t\tif(typeof cell.z === 'undefined') cell.z = SSF._table[14];\n\t\t\t}\n\t\t\tbreak;\n\t\tdefault: vv = cell.v; break;\n\t}\n\tvar v = writetag('v', escapexml(vv)), o = {r:ref};\n\t/* TODO: cell style */\n\tvar os = get_cell_style(opts.cellXfs, cell, opts);\n\tif(os !== 0) o.s = os;\n\tswitch(cell.t) {\n\t\tcase 'n': break;\n\t\tcase 'd': o.t = \"d\"; break;\n\t\tcase 'b': o.t = \"b\"; break;\n\t\tcase 'e': o.t = \"e\"; break;\n\t\tdefault:\n\t\t\tif(opts.bookSST) {\n\t\t\t\tv = writetag('v', ''+get_sst_id(opts.Strings, cell.v));\n\t\t\t\to.t = \"s\"; break;\n\t\t\t}\n\t\t\to.t = \"str\"; break;\n\t}\n\tif(cell.t != oldt) { cell.t = oldt; cell.v = oldv; }\n\treturn writextag('c', v, o);\n}\n\nvar parse_ws_xml_data = (function parse_ws_xml_data_factory() {\n\tvar cellregex = /<(?:\\w+:)?c[ >]/, rowregex = /<\\/(?:\\w+:)?row>/;\n\tvar rregex = /r=[\"']([^\"']*)[\"']/, isregex = /<is>([\\S\\s]*?)<\\/is>/;\n\tvar match_v = matchtag(\"v\"), match_f = matchtag(\"f\");\n\nreturn function parse_ws_xml_data(sdata, s, opts, guess) {\n\tvar ri = 0, x = \"\", cells = [], cref = [], idx = 0, i=0, cc=0, d=\"\", p;\n\tvar tag, tagr = 0, tagc = 0;\n\tvar sstr;\n\tvar fmtid = 0, fillid = 0, do_format = Array.isArray(styles.CellXf), cf;\n\tfor(var marr = sdata.split(rowregex), mt = 0, marrlen = marr.length; mt != marrlen; ++mt) {\n\t\tx = marr[mt].trim();\n\t\tvar xlen = x.length;\n\t\tif(xlen === 0) continue;\n\n\t\t/* 18.3.1.73 row CT_Row */\n\t\tfor(ri = 0; ri < xlen; ++ri) if(x.charCodeAt(ri) === 62) break; ++ri;\n\t\ttag = parsexmltag(x.substr(0,ri), true);\n\t\t/* SpreadSheetGear uses implicit r/c */\n\t\ttagr = typeof tag.r !== 'undefined' ? parseInt(tag.r, 10) : tagr+1; tagc = -1;\n\t\tif(opts.sheetRows && opts.sheetRows < tagr) continue;\n\t\tif(guess.s.r > tagr - 1) guess.s.r = tagr - 1;\n\t\tif(guess.e.r < tagr - 1) guess.e.r = tagr - 1;\n\n\t\t/* 18.3.1.4 c CT_Cell */\n\t\tcells = x.substr(ri).split(cellregex);\n\t\tfor(ri = typeof tag.r === 'undefined' ? 0 : 1; ri != cells.length; ++ri) {\n\t\t\tx = cells[ri].trim();\n\t\t\tif(x.length === 0) continue;\n\t\t\tcref = x.match(rregex); idx = ri; i=0; cc=0;\n\t\t\tx = \"<c \" + (x.substr(0,1)==\"<\"?\">\":\"\") + x;\n\t\t\tif(cref !== null && cref.length === 2) {\n\t\t\t\tidx = 0; d=cref[1];\n\t\t\t\tfor(i=0; i != d.length; ++i) {\n\t\t\t\t\tif((cc=d.charCodeAt(i)-64) < 1 || cc > 26) break;\n\t\t\t\t\tidx = 26*idx + cc;\n\t\t\t\t}\n\t\t\t\t--idx;\n\t\t\t\ttagc = idx;\n\t\t\t} else ++tagc;\n\t\t\tfor(i = 0; i != x.length; ++i) if(x.charCodeAt(i) === 62) break; ++i;\n\t\t\ttag = parsexmltag(x.substr(0,i), true);\n\t\t\tif(!tag.r) tag.r = utils.encode_cell({r:tagr-1, c:tagc});\n\t\t\td = x.substr(i);\n\t\t\tp = {t:\"\"};\n\n\t\t\tif((cref=d.match(match_v))!== null && cref[1] !== '') p.v=unescapexml(cref[1]);\n\t\t\tif(opts.cellFormula && (cref=d.match(match_f))!== null) p.f=unescapexml(cref[1]);\n\n\t\t\t/* SCHEMA IS ACTUALLY INCORRECT HERE. IF A CELL HAS NO T, EMIT \"\" */\n\t\t\tif(tag.t === undefined && p.v === undefined) {\n\t\t\t\tif(!opts.sheetStubs) continue;\n\t\t\t\tp.t = \"stub\";\n\t\t\t}\n\t\t\telse p.t = tag.t || \"n\";\n\t\t\tif(guess.s.c > idx) guess.s.c = idx;\n\t\t\tif(guess.e.c < idx) guess.e.c = idx;\n\t\t\t/* 18.18.11 t ST_CellType */\n\t\t\tswitch(p.t) {\n\t\t\t\tcase 'n': p.v = parseFloat(p.v); break;\n\t\t\t\tcase 's':\n\t\t\t\t\tsstr = strs[parseInt(p.v, 10)];\n\t\t\t\t\tp.v = sstr.t;\n\t\t\t\t\tp.r = sstr.r;\n\t\t\t\t\tif(opts.cellHTML) p.h = sstr.h;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'str':\n\t\t\t\t\tp.t = \"s\";\n\t\t\t\t\tp.v = (p.v!=null) ? utf8read(p.v) : '';\n\t\t\t\t\tif(opts.cellHTML) p.h = p.v;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'inlineStr':\n\t\t\t\t\tcref = d.match(isregex);\n\t\t\t\t\tp.t = 's';\n\t\t\t\t\tif(cref !== null) { sstr = parse_si(cref[1]); p.v = sstr.t; } else p.v = \"\";\n\t\t\t\t\tbreak; // inline string\n\t\t\t\tcase 'b': p.v = parsexmlbool(p.v); break;\n\t\t\t\tcase 'd':\n\t\t\t\t\tif(!opts.cellDates) { p.v = datenum(p.v); p.t = 'n'; }\n\t\t\t\t\tbreak;\n\t\t\t\t/* error string in .v, number in .v */\n\t\t\t\tcase 'e': p.w = p.v; p.v = RBErr[p.v]; break;\n\t\t\t}\n\t\t\t/* formatting */\n\t\t\tfmtid = fillid = 0;\n\t\t\tif(do_format && tag.s !== undefined) {\n\t\t\t\tcf = styles.CellXf[tag.s];\n\t\t\t\tif(cf != null) {\n\t\t\t\t\tif(cf.numFmtId != null) fmtid = cf.numFmtId;\n\t\t\t\t\tif(opts.cellStyles && cf.fillId != null) fillid = cf.fillId;\n\t\t\t\t}\n\t\t\t}\n\t\t\tsafe_format(p, fmtid, fillid, opts);\n\t\t\ts[tag.r] = p;\n\t\t}\n\t}\n}; })();\n\nfunction write_ws_xml_data(ws, opts, idx, wb) {\n\tvar o = [], r = [], range = safe_decode_range(ws['!ref']), cell, ref, rr = \"\", cols = [], R, C;\n\tfor(C = range.s.c; C <= range.e.c; ++C) cols[C] = encode_col(C);\n\tfor(R = range.s.r; R <= range.e.r; ++R) {\n\t\tr = [];\n\t\trr = encode_row(R);\n\t\tfor(C = range.s.c; C <= range.e.c; ++C) {\n\t\t\tref = cols[C] + rr;\n\t\t\tif(ws[ref] === undefined) continue;\n\t\t\tif((cell = write_ws_xml_cell(ws[ref], ref, ws, opts, idx, wb)) != null) r.push(cell);\n\t\t}\n\t\tif(r.length > 0) o[o.length] = (writextag('row', r.join(\"\"), {r:rr}));\n\t}\n\treturn o.join(\"\");\n}\n\nvar WS_XML_ROOT = writextag('worksheet', null, {\n\t'xmlns': XMLNS.main[0],\n\t'xmlns:r': XMLNS.r\n});\n\nfunction write_ws_xml(idx, opts, wb) {\n\tvar o = [XML_HEADER, WS_XML_ROOT];\n\tvar s = wb.SheetNames[idx], sidx = 0, rdata = \"\";\n\tvar ws = wb.Sheets[s];\n\tif(ws === undefined) ws = {};\n\tvar ref = ws['!ref']; if(ref === undefined) ref = 'A1';\n\to[o.length] = (writextag('dimension', null, {'ref': ref}));\n\n\tif(ws['!cols'] !== undefined && ws['!cols'].length > 0) o[o.length] = (write_ws_xml_cols(ws, ws['!cols']));\n\to[sidx = o.length] = '<sheetData/>';\n\tif(ws['!ref'] !== undefined) {\n\t\trdata = write_ws_xml_data(ws, opts, idx, wb);\n\t\tif(rdata.length > 0) o[o.length] = (rdata);\n\t}\n\tif(o.length>sidx+1) { o[o.length] = ('</sheetData>'); o[sidx]=o[sidx].replace(\"/>\",\">\"); }\n\n\tif(ws['!merges'] !== undefined && ws['!merges'].length > 0) o[o.length] = (write_ws_xml_merges(ws['!merges']));\n\n\tif(o.length>2) { o[o.length] = ('</worksheet>'); o[1]=o[1].replace(\"/>\",\">\"); }\n\treturn o.join(\"\");\n}\n\n/* [MS-XLSB] 2.4.718 BrtRowHdr */\nfunction parse_BrtRowHdr(data, length) {\n\tvar z = [];\n\tz.r = data.read_shift(4);\n\tdata.l += length-4;\n\treturn z;\n}\n\n/* [MS-XLSB] 2.4.812 BrtWsDim */\nvar parse_BrtWsDim = parse_UncheckedRfX;\nvar write_BrtWsDim = write_UncheckedRfX;\n\n/* [MS-XLSB] 2.4.815 BrtWsProp */\nfunction parse_BrtWsProp(data, length) {\n\tvar z = {};\n\t/* TODO: pull flags */\n\tdata.l += 19;\n\tz.name = parse_XLSBCodeName(data, length - 19);\n\treturn z;\n}\n\n/* [MS-XLSB] 2.4.303 BrtCellBlank */\nfunction parse_BrtCellBlank(data, length) {\n\tvar cell = parse_XLSBCell(data);\n\treturn [cell];\n}\nfunction write_BrtCellBlank(cell, val, o) {\n\tif(o == null) o = new_buf(8);\n\treturn write_XLSBCell(val, o);\n}\n\n\n/* [MS-XLSB] 2.4.304 BrtCellBool */\nfunction parse_BrtCellBool(data, length) {\n\tvar cell = parse_XLSBCell(data);\n\tvar fBool = data.read_shift(1);\n\treturn [cell, fBool, 'b'];\n}\n\n/* [MS-XLSB] 2.4.305 BrtCellError */\nfunction parse_BrtCellError(data, length) {\n\tvar cell = parse_XLSBCell(data);\n\tvar fBool = data.read_shift(1);\n\treturn [cell, fBool, 'e'];\n}\n\n/* [MS-XLSB] 2.4.308 BrtCellIsst */\nfunction parse_BrtCellIsst(data, length) {\n\tvar cell = parse_XLSBCell(data);\n\tvar isst = data.read_shift(4);\n\treturn [cell, isst, 's'];\n}\n\n/* [MS-XLSB] 2.4.310 BrtCellReal */\nfunction parse_BrtCellReal(data, length) {\n\tvar cell = parse_XLSBCell(data);\n\tvar value = parse_Xnum(data);\n\treturn [cell, value, 'n'];\n}\n\n/* [MS-XLSB] 2.4.311 BrtCellRk */\nfunction parse_BrtCellRk(data, length) {\n\tvar cell = parse_XLSBCell(data);\n\tvar value = parse_RkNumber(data);\n\treturn [cell, value, 'n'];\n}\n\n/* [MS-XLSB] 2.4.314 BrtCellSt */\nfunction parse_BrtCellSt(data, length) {\n\tvar cell = parse_XLSBCell(data);\n\tvar value = parse_XLWideString(data);\n\treturn [cell, value, 'str'];\n}\n\n/* [MS-XLSB] 2.4.647 BrtFmlaBool */\nfunction parse_BrtFmlaBool(data, length, opts) {\n\tvar cell = parse_XLSBCell(data);\n\tvar value = data.read_shift(1);\n\tvar o = [cell, value, 'b'];\n\tif(opts.cellFormula) {\n\t\tvar formula = parse_XLSBCellParsedFormula(data, length-9);\n\t\to[3] = \"\"; /* TODO */\n\t}\n\telse data.l += length-9;\n\treturn o;\n}\n\n/* [MS-XLSB] 2.4.648 BrtFmlaError */\nfunction parse_BrtFmlaError(data, length, opts) {\n\tvar cell = parse_XLSBCell(data);\n\tvar value = data.read_shift(1);\n\tvar o = [cell, value, 'e'];\n\tif(opts.cellFormula) {\n\t\tvar formula = parse_XLSBCellParsedFormula(data, length-9);\n\t\to[3] = \"\"; /* TODO */\n\t}\n\telse data.l += length-9;\n\treturn o;\n}\n\n/* [MS-XLSB] 2.4.649 BrtFmlaNum */\nfunction parse_BrtFmlaNum(data, length, opts) {\n\tvar cell = parse_XLSBCell(data);\n\tvar value = parse_Xnum(data);\n\tvar o = [cell, value, 'n'];\n\tif(opts.cellFormula) {\n\t\tvar formula = parse_XLSBCellParsedFormula(data, length - 16);\n\t\to[3] = \"\"; /* TODO */\n\t}\n\telse data.l += length-16;\n\treturn o;\n}\n\n/* [MS-XLSB] 2.4.650 BrtFmlaString */\nfunction parse_BrtFmlaString(data, length, opts) {\n\tvar start = data.l;\n\tvar cell = parse_XLSBCell(data);\n\tvar value = parse_XLWideString(data);\n\tvar o = [cell, value, 'str'];\n\tif(opts.cellFormula) {\n\t\tvar formula = parse_XLSBCellParsedFormula(data, start + length - data.l);\n\t}\n\telse data.l = start + length;\n\treturn o;\n}\n\n/* [MS-XLSB] 2.4.676 BrtMergeCell */\nvar parse_BrtMergeCell = parse_UncheckedRfX;\n\n/* [MS-XLSB] 2.4.656 BrtHLink */\nfunction parse_BrtHLink(data, length, opts) {\n\tvar end = data.l + length;\n\tvar rfx = parse_UncheckedRfX(data, 16);\n\tvar relId = parse_XLNullableWideString(data);\n\tvar loc = parse_XLWideString(data);\n\tvar tooltip = parse_XLWideString(data);\n\tvar display = parse_XLWideString(data);\n\tdata.l = end;\n\treturn {rfx:rfx, relId:relId, loc:loc, tooltip:tooltip, display:display};\n}\n\n/* [MS-XLSB] 2.1.7.61 Worksheet */\nfunction parse_ws_bin(data, opts, rels) {\n\tif(!data) return data;\n\tif(!rels) rels = {'!id':{}};\n\tvar s = {};\n\n\tvar ref;\n\tvar refguess = {s: {r:1000000, c:1000000}, e: {r:0, c:0} };\n\n\tvar pass = false, end = false;\n\tvar row, p, cf, R, C, addr, sstr, rr;\n\tvar mergecells = [];\n\trecordhopper(data, function ws_parse(val, R) {\n\t\tif(end) return;\n\t\tswitch(R.n) {\n\t\t\tcase 'BrtWsDim': ref = val; break;\n\t\t\tcase 'BrtRowHdr':\n\t\t\t\trow = val;\n\t\t\t\tif(opts.sheetRows && opts.sheetRows <= row.r) end=true;\n\t\t\t\trr = encode_row(row.r);\n\t\t\t\tbreak;\n\n\t\t\tcase 'BrtFmlaBool':\n\t\t\tcase 'BrtFmlaError':\n\t\t\tcase 'BrtFmlaNum':\n\t\t\tcase 'BrtFmlaString':\n\t\t\tcase 'BrtCellBool':\n\t\t\tcase 'BrtCellError':\n\t\t\tcase 'BrtCellIsst':\n\t\t\tcase 'BrtCellReal':\n\t\t\tcase 'BrtCellRk':\n\t\t\tcase 'BrtCellSt':\n\t\t\t\tp = {t:val[2]};\n\t\t\t\tswitch(val[2]) {\n\t\t\t\t\tcase 'n': p.v = val[1]; break;\n\t\t\t\t\tcase 's': sstr = strs[val[1]]; p.v = sstr.t; p.r = sstr.r; break;\n\t\t\t\t\tcase 'b': p.v = val[1] ? true : false; break;\n\t\t\t\t\tcase 'e': p.v = val[1]; p.w = BErr[p.v]; break;\n\t\t\t\t\tcase 'str': p.t = 's'; p.v = utf8read(val[1]); break;\n\t\t\t\t}\n\t\t\t\tif(opts.cellFormula && val.length > 3) p.f = val[3];\n\t\t\t\tif((cf = styles.CellXf[val[0].iStyleRef])) safe_format(p,cf.ifmt,null,opts);\n\t\t\t\ts[encode_col(C=val[0].c) + rr] = p;\n\t\t\t\tif(refguess.s.r > row.r) refguess.s.r = row.r;\n\t\t\t\tif(refguess.s.c > C) refguess.s.c = C;\n\t\t\t\tif(refguess.e.r < row.r) refguess.e.r = row.r;\n\t\t\t\tif(refguess.e.c < C) refguess.e.c = C;\n\t\t\t\tbreak;\n\n\t\t\tcase 'BrtCellBlank': if(!opts.sheetStubs) break;\n\t\t\t\tp = {t:'s',v:undefined};\n\t\t\t\ts[encode_col(C=val[0].c) + rr] = p;\n\t\t\t\tif(refguess.s.r > row.r) refguess.s.r = row.r;\n\t\t\t\tif(refguess.s.c > C) refguess.s.c = C;\n\t\t\t\tif(refguess.e.r < row.r) refguess.e.r = row.r;\n\t\t\t\tif(refguess.e.c < C) refguess.e.c = C;\n\t\t\t\tbreak;\n\n\t\t\t/* Merge Cells */\n\t\t\tcase 'BrtBeginMergeCells': break;\n\t\t\tcase 'BrtEndMergeCells': break;\n\t\t\tcase 'BrtMergeCell': mergecells.push(val); break;\n\n\t\t\tcase 'BrtHLink':\n\t\t\t\tvar rel = rels['!id'][val.relId];\n\t\t\t\tif(rel) {\n\t\t\t\t\tval.Target = rel.Target;\n\t\t\t\t\tif(val.loc) val.Target += \"#\"+val.loc;\n\t\t\t\t\tval.Rel = rel;\n\t\t\t\t}\n\t\t\t\tfor(R=val.rfx.s.r;R<=val.rfx.e.r;++R) for(C=val.rfx.s.c;C<=val.rfx.e.c;++C) {\n\t\t\t\t\taddr = encode_cell({c:C,r:R});\n\t\t\t\t\tif(!s[addr]) s[addr] = {t:'s',v:undefined};\n\t\t\t\t\ts[addr].l = val;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 'BrtArrFmla': break; // TODO\n\t\t\tcase 'BrtShrFmla': break; // TODO\n\t\t\tcase 'BrtBeginSheet': break;\n\t\t\tcase 'BrtWsProp': break; // TODO\n\t\t\tcase 'BrtSheetCalcProp': break; // TODO\n\t\t\tcase 'BrtBeginWsViews': break; // TODO\n\t\t\tcase 'BrtBeginWsView': break; // TODO\n\t\t\tcase 'BrtPane': break; // TODO\n\t\t\tcase 'BrtSel': break; // TODO\n\t\t\tcase 'BrtEndWsView': break; // TODO\n\t\t\tcase 'BrtEndWsViews': break; // TODO\n\t\t\tcase 'BrtACBegin': break; // TODO\n\t\t\tcase 'BrtRwDescent': break; // TODO\n\t\t\tcase 'BrtACEnd': break; // TODO\n\t\t\tcase 'BrtWsFmtInfoEx14': break; // TODO\n\t\t\tcase 'BrtWsFmtInfo': break; // TODO\n\t\t\tcase 'BrtBeginColInfos': break; // TODO\n\t\t\tcase 'BrtColInfo': break; // TODO\n\t\t\tcase 'BrtEndColInfos': break; // TODO\n\t\t\tcase 'BrtBeginSheetData': break; // TODO\n\t\t\tcase 'BrtEndSheetData': break; // TODO\n\t\t\tcase 'BrtSheetProtection': break; // TODO\n\t\t\tcase 'BrtPrintOptions': break; // TODO\n\t\t\tcase 'BrtMargins': break; // TODO\n\t\t\tcase 'BrtPageSetup': break; // TODO\n\t\t\tcase 'BrtFRTBegin': pass = true; break;\n\t\t\tcase 'BrtFRTEnd': pass = false; break;\n\t\t\tcase 'BrtEndSheet': break; // TODO\n\t\t\tcase 'BrtDrawing': break; // TODO\n\t\t\tcase 'BrtLegacyDrawing': break; // TODO\n\t\t\tcase 'BrtLegacyDrawingHF': break; // TODO\n\t\t\tcase 'BrtPhoneticInfo': break; // TODO\n\t\t\tcase 'BrtBeginHeaderFooter': break; // TODO\n\t\t\tcase 'BrtEndHeaderFooter': break; // TODO\n\t\t\tcase 'BrtBrk': break; // TODO\n\t\t\tcase 'BrtBeginRwBrk': break; // TODO\n\t\t\tcase 'BrtEndRwBrk': break; // TODO\n\t\t\tcase 'BrtBeginColBrk': break; // TODO\n\t\t\tcase 'BrtEndColBrk': break; // TODO\n\t\t\tcase 'BrtBeginUserShViews': break; // TODO\n\t\t\tcase 'BrtBeginUserShView': break; // TODO\n\t\t\tcase 'BrtEndUserShView': break; // TODO\n\t\t\tcase 'BrtEndUserShViews': break; // TODO\n\t\t\tcase 'BrtBkHim': break; // TODO\n\t\t\tcase 'BrtBeginOleObjects': break; // TODO\n\t\t\tcase 'BrtOleObject': break; // TODO\n\t\t\tcase 'BrtEndOleObjects': break; // TODO\n\t\t\tcase 'BrtBeginListParts': break; // TODO\n\t\t\tcase 'BrtListPart': break; // TODO\n\t\t\tcase 'BrtEndListParts': break; // TODO\n\t\t\tcase 'BrtBeginSortState': break; // TODO\n\t\t\tcase 'BrtBeginSortCond': break; // TODO\n\t\t\tcase 'BrtEndSortCond': break; // TODO\n\t\t\tcase 'BrtEndSortState': break; // TODO\n\t\t\tcase 'BrtBeginConditionalFormatting': break; // TODO\n\t\t\tcase 'BrtEndConditionalFormatting': break; // TODO\n\t\t\tcase 'BrtBeginCFRule': break; // TODO\n\t\t\tcase 'BrtEndCFRule': break; // TODO\n\t\t\tcase 'BrtBeginDVals': break; // TODO\n\t\t\tcase 'BrtDVal': break; // TODO\n\t\t\tcase 'BrtEndDVals': break; // TODO\n\t\t\tcase 'BrtRangeProtection': break; // TODO\n\t\t\tcase 'BrtBeginDCon': break; // TODO\n\t\t\tcase 'BrtEndDCon': break; // TODO\n\t\t\tcase 'BrtBeginDRefs': break;\n\t\t\tcase 'BrtDRef': break;\n\t\t\tcase 'BrtEndDRefs': break;\n\n\t\t\t/* ActiveX */\n\t\t\tcase 'BrtBeginActiveXControls': break;\n\t\t\tcase 'BrtActiveX': break;\n\t\t\tcase 'BrtEndActiveXControls': break;\n\n\t\t\t/* AutoFilter */\n\t\t\tcase 'BrtBeginAFilter': break;\n\t\t\tcase 'BrtEndAFilter': break;\n\t\t\tcase 'BrtBeginFilterColumn': break;\n\t\t\tcase 'BrtBeginFilters': break;\n\t\t\tcase 'BrtFilter': break;\n\t\t\tcase 'BrtEndFilters': break;\n\t\t\tcase 'BrtEndFilterColumn': break;\n\t\t\tcase 'BrtDynamicFilter': break;\n\t\t\tcase 'BrtTop10Filter': break;\n\t\t\tcase 'BrtBeginCustomFilters': break;\n\t\t\tcase 'BrtCustomFilter': break;\n\t\t\tcase 'BrtEndCustomFilters': break;\n\n\t\t\t/* Smart Tags */\n\t\t\tcase 'BrtBeginSmartTags': break;\n\t\t\tcase 'BrtBeginCellSmartTags': break;\n\t\t\tcase 'BrtBeginCellSmartTag': break;\n\t\t\tcase 'BrtCellSmartTagProperty': break;\n\t\t\tcase 'BrtEndCellSmartTag': break;\n\t\t\tcase 'BrtEndCellSmartTags': break;\n\t\t\tcase 'BrtEndSmartTags': break;\n\n\t\t\t/* Cell Watch */\n\t\t\tcase 'BrtBeginCellWatches': break;\n\t\t\tcase 'BrtCellWatch': break;\n\t\t\tcase 'BrtEndCellWatches': break;\n\n\t\t\t/* Table */\n\t\t\tcase 'BrtTable': break;\n\n\t\t\t/* Ignore Cell Errors */\n\t\t\tcase 'BrtBeginCellIgnoreECs': break;\n\t\t\tcase 'BrtCellIgnoreEC': break;\n\t\t\tcase 'BrtEndCellIgnoreECs': break;\n\n\t\t\tdefault: if(!pass || opts.WTF) throw new Error(\"Unexpected record \" + R.n);\n\t\t}\n\t}, opts);\n\tif(!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);\n\tif(opts.sheetRows && s[\"!ref\"]) {\n\t\tvar tmpref = safe_decode_range(s[\"!ref\"]);\n\t\tif(opts.sheetRows < +tmpref.e.r) {\n\t\t\ttmpref.e.r = opts.sheetRows - 1;\n\t\t\tif(tmpref.e.r > refguess.e.r) tmpref.e.r = refguess.e.r;\n\t\t\tif(tmpref.e.r < tmpref.s.r) tmpref.s.r = tmpref.e.r;\n\t\t\tif(tmpref.e.c > refguess.e.c) tmpref.e.c = refguess.e.c;\n\t\t\tif(tmpref.e.c < tmpref.s.c) tmpref.s.c = tmpref.e.c;\n\t\t\ts[\"!fullref\"] = s[\"!ref\"];\n\t\t\ts[\"!ref\"] = encode_range(tmpref);\n\t\t}\n\t}\n\tif(mergecells.length > 0) s[\"!merges\"] = mergecells;\n\treturn s;\n}\n\n/* TODO: something useful -- this is a stub */\nfunction write_ws_bin_cell(ba, cell, R, C, opts) {\n\tif(cell.v === undefined) return \"\";\n\tvar vv = \"\";\n\tswitch(cell.t) {\n\t\tcase 'b': vv = cell.v ? \"1\" : \"0\"; break;\n\t\tcase 'n': case 'e': vv = ''+cell.v; break;\n\t\tdefault: vv = cell.v; break;\n\t}\n\tvar o = {r:R, c:C};\n\t/* TODO: cell style */\n\to.s = get_cell_style(opts.cellXfs, cell, opts);\n\tswitch(cell.t) {\n\t\tcase 's': case 'str':\n\t\t\tif(opts.bookSST) {\n\t\t\t\tvv = get_sst_id(opts.Strings, cell.v);\n\t\t\t\to.t = \"s\"; break;\n\t\t\t}\n\t\t\to.t = \"str\"; break;\n\t\tcase 'n': break;\n\t\tcase 'b': o.t = \"b\"; break;\n\t\tcase 'e': o.t = \"e\"; break;\n\t}\n\twrite_record(ba, \"BrtCellBlank\", write_BrtCellBlank(cell, o));\n}\n\nfunction write_CELLTABLE(ba, ws, idx, opts, wb) {\n\tvar range = safe_decode_range(ws['!ref'] || \"A1\"), ref, rr = \"\", cols = [];\n\twrite_record(ba, 'BrtBeginSheetData');\n\tfor(var R = range.s.r; R <= range.e.r; ++R) {\n\t\trr = encode_row(R);\n\t\t/* [ACCELLTABLE] */\n\t\t/* BrtRowHdr */\n\t\tfor(var C = range.s.c; C <= range.e.c; ++C) {\n\t\t\t/* *16384CELL */\n\t\t\tif(R === range.s.r) cols[C] = encode_col(C);\n\t\t\tref = cols[C] + rr;\n\t\t\tif(!ws[ref]) continue;\n\t\t\t/* write cell */\n\t\t\twrite_ws_bin_cell(ba, ws[ref], R, C, opts);\n\t\t}\n\t}\n\twrite_record(ba, 'BrtEndSheetData');\n}\n\nfunction write_ws_bin(idx, opts, wb) {\n\tvar ba = buf_array();\n\tvar s = wb.SheetNames[idx], ws = wb.Sheets[s] || {};\n\tvar r = safe_decode_range(ws['!ref'] || \"A1\");\n\twrite_record(ba, \"BrtBeginSheet\");\n\t/* [BrtWsProp] */\n\twrite_record(ba, \"BrtWsDim\", write_BrtWsDim(r));\n\t/* [WSVIEWS2] */\n\t/* [WSFMTINFO] */\n\t/* *COLINFOS */\n\twrite_CELLTABLE(ba, ws, idx, opts, wb);\n\t/* [BrtSheetCalcProp] */\n\t/* [[BrtSheetProtectionIso] BrtSheetProtection] */\n\t/* *([BrtRangeProtectionIso] BrtRangeProtection) */\n\t/* [SCENMAN] */\n\t/* [AUTOFILTER] */\n\t/* [SORTSTATE] */\n\t/* [DCON] */\n\t/* [USERSHVIEWS] */\n\t/* [MERGECELLS] */\n\t/* [BrtPhoneticInfo] */\n\t/* *CONDITIONALFORMATTING */\n\t/* [DVALS] */\n\t/* *BrtHLink */\n\t/* [BrtPrintOptions] */\n\t/* [BrtMargins] */\n\t/* [BrtPageSetup] */\n\t/* [HEADERFOOTER] */\n\t/* [RWBRK] */\n\t/* [COLBRK] */\n\t/* *BrtBigName */\n\t/* [CELLWATCHES] */\n\t/* [IGNOREECS] */\n\t/* [SMARTTAGS] */\n\t/* [BrtDrawing] */\n\t/* [BrtLegacyDrawing] */\n\t/* [BrtLegacyDrawingHF] */\n\t/* [BrtBkHim] */\n\t/* [OLEOBJECTS] */\n\t/* [ACTIVEXCONTROLS] */\n\t/* [WEBPUBITEMS] */\n\t/* [LISTPARTS] */\n\t/* FRTWORKSHEET */\n\twrite_record(ba, \"BrtEndSheet\");\n\treturn ba.end();\n}\n/* 18.2.28 (CT_WorkbookProtection) Defaults */\nvar WBPropsDef = [\n\t['allowRefreshQuery', '0'],\n\t['autoCompressPictures', '1'],\n\t['backupFile', '0'],\n\t['checkCompatibility', '0'],\n\t['codeName', ''],\n\t['date1904', '0'],\n\t['dateCompatibility', '1'],\n\t//['defaultThemeVersion', '0'],\n\t['filterPrivacy', '0'],\n\t['hidePivotFieldList', '0'],\n\t['promptedSolutions', '0'],\n\t['publishItems', '0'],\n\t['refreshAllConnections', false],\n\t['saveExternalLinkValues', '1'],\n\t['showBorderUnselectedTables', '1'],\n\t['showInkAnnotation', '1'],\n\t['showObjects', 'all'],\n\t['showPivotChartFilter', '0']\n\t//['updateLinks', 'userSet']\n];\n\n/* 18.2.30 (CT_BookView) Defaults */\nvar WBViewDef = [\n\t['activeTab', '0'],\n\t['autoFilterDateGrouping', '1'],\n\t['firstSheet', '0'],\n\t['minimized', '0'],\n\t['showHorizontalScroll', '1'],\n\t['showSheetTabs', '1'],\n\t['showVerticalScroll', '1'],\n\t['tabRatio', '600'],\n\t['visibility', 'visible']\n\t//window{Height,Width}, {x,y}Window\n];\n\n/* 18.2.19 (CT_Sheet) Defaults */\nvar SheetDef = [\n\t['state', 'visible']\n];\n\n/* 18.2.2 (CT_CalcPr) Defaults */\nvar CalcPrDef = [\n\t['calcCompleted', 'true'],\n\t['calcMode', 'auto'],\n\t['calcOnSave', 'true'],\n\t['concurrentCalc', 'true'],\n\t['fullCalcOnLoad', 'false'],\n\t['fullPrecision', 'true'],\n\t['iterate', 'false'],\n\t['iterateCount', '100'],\n\t['iterateDelta', '0.001'],\n\t['refMode', 'A1']\n];\n\n/* 18.2.3 (CT_CustomWorkbookView) Defaults */\nvar CustomWBViewDef = [\n\t['autoUpdate', 'false'],\n\t['changesSavedWin', 'false'],\n\t['includeHiddenRowCol', 'true'],\n\t['includePrintSettings', 'true'],\n\t['maximized', 'false'],\n\t['minimized', 'false'],\n\t['onlySync', 'false'],\n\t['personalView', 'false'],\n\t['showComments', 'commIndicator'],\n\t['showFormulaBar', 'true'],\n\t['showHorizontalScroll', 'true'],\n\t['showObjects', 'all'],\n\t['showSheetTabs', 'true'],\n\t['showStatusbar', 'true'],\n\t['showVerticalScroll', 'true'],\n\t['tabRatio', '600'],\n\t['xWindow', '0'],\n\t['yWindow', '0']\n];\n\nfunction push_defaults_array(target, defaults) {\n\tfor(var j = 0; j != target.length; ++j) { var w = target[j];\n\t\tfor(var i=0; i != defaults.length; ++i) { var z = defaults[i];\n\t\t\tif(w[z[0]] == null) w[z[0]] = z[1];\n\t\t}\n\t}\n}\nfunction push_defaults(target, defaults) {\n\tfor(var i = 0; i != defaults.length; ++i) { var z = defaults[i];\n\t\tif(target[z[0]] == null) target[z[0]] = z[1];\n\t}\n}\n\nfunction parse_wb_defaults(wb) {\n\tpush_defaults(wb.WBProps, WBPropsDef);\n\tpush_defaults(wb.CalcPr, CalcPrDef);\n\n\tpush_defaults_array(wb.WBView, WBViewDef);\n\tpush_defaults_array(wb.Sheets, SheetDef);\n\n\t_ssfopts.date1904 = parsexmlbool(wb.WBProps.date1904, 'date1904');\n}\n/* 18.2 Workbook */\nvar wbnsregex = /<\\w+:workbook/;\nfunction parse_wb_xml(data, opts) {\n\tvar wb = { AppVersion:{}, WBProps:{}, WBView:[], Sheets:[], CalcPr:{}, xmlns: \"\" };\n\tvar pass = false, xmlns = \"xmlns\";\n\tdata.match(tagregex).forEach(function xml_wb(x) {\n\t\tvar y = parsexmltag(x);\n\t\tswitch(strip_ns(y[0])) {\n\t\t\tcase '<?xml': break;\n\n\t\t\t/* 18.2.27 workbook CT_Workbook 1 */\n\t\t\tcase '<workbook':\n\t\t\t\tif(x.match(wbnsregex)) xmlns = \"xmlns\" + x.match(/<(\\w+):/)[1];\n\t\t\t\twb.xmlns = y[xmlns];\n\t\t\t\tbreak;\n\t\t\tcase '</workbook>': break;\n\n\t\t\t/* 18.2.13 fileVersion CT_FileVersion ? */\n\t\t\tcase '<fileVersion': delete y[0]; wb.AppVersion = y; break;\n\t\t\tcase '<fileVersion/>': break;\n\n\t\t\t/* 18.2.12 fileSharing CT_FileSharing ? */\n\t\t\tcase '<fileSharing': case '<fileSharing/>': break;\n\n\t\t\t/* 18.2.28 workbookPr CT_WorkbookPr ? */\n\t\t\tcase '<workbookPr': delete y[0]; wb.WBProps = y; break;\n\t\t\tcase '<workbookPr/>': delete y[0]; wb.WBProps = y; break;\n\n\t\t\t/* 18.2.29 workbookProtection CT_WorkbookProtection ? */\n\t\t\tcase '<workbookProtection': break;\n\t\t\tcase '<workbookProtection/>': break;\n\n\t\t\t/* 18.2.1 bookViews CT_BookViews ? */\n\t\t\tcase '<bookViews>': case '</bookViews>': break;\n\t\t\t/* 18.2.30 workbookView CT_BookView + */\n\t\t\tcase '<workbookView': delete y[0]; wb.WBView.push(y); break;\n\n\t\t\t/* 18.2.20 sheets CT_Sheets 1 */\n\t\t\tcase '<sheets>': case '</sheets>': break; // aggregate sheet\n\t\t\t/* 18.2.19 sheet CT_Sheet + */\n\t\t\tcase '<sheet': delete y[0]; y.name = utf8read(y.name); wb.Sheets.push(y); break;\n\n\t\t\t/* 18.2.15 functionGroups CT_FunctionGroups ? */\n\t\t\tcase '<functionGroups': case '<functionGroups/>': break;\n\t\t\t/* 18.2.14 functionGroup CT_FunctionGroup + */\n\t\t\tcase '<functionGroup': break;\n\n\t\t\t/* 18.2.9 externalReferences CT_ExternalReferences ? */\n\t\t\tcase '<externalReferences': case '</externalReferences>': case '<externalReferences>': break;\n\t\t\t/* 18.2.8 externalReference CT_ExternalReference + */\n\t\t\tcase '<externalReference': break;\n\n\t\t\t/* 18.2.6 definedNames CT_DefinedNames ? */\n\t\t\tcase '<definedNames/>': break;\n\t\t\tcase '<definedNames>': case '<definedNames': pass=true; break;\n\t\t\tcase '</definedNames>': pass=false; break;\n\t\t\t/* 18.2.5 definedName CT_DefinedName + */\n\t\t\tcase '<definedName': case '<definedName/>': case '</definedName>': break;\n\n\t\t\t/* 18.2.2 calcPr CT_CalcPr ? */\n\t\t\tcase '<calcPr': delete y[0]; wb.CalcPr = y; break;\n\t\t\tcase '<calcPr/>': delete y[0]; wb.CalcPr = y; break;\n\n\t\t\t/* 18.2.16 oleSize CT_OleSize ? (ref required) */\n\t\t\tcase '<oleSize': break;\n\n\t\t\t/* 18.2.4 customWorkbookViews CT_CustomWorkbookViews ? */\n\t\t\tcase '<customWorkbookViews>': case '</customWorkbookViews>': case '<customWorkbookViews': break;\n\t\t\t/* 18.2.3 customWorkbookView CT_CustomWorkbookView + */\n\t\t\tcase '<customWorkbookView': case '</customWorkbookView>': break;\n\n\t\t\t/* 18.2.18 pivotCaches CT_PivotCaches ? */\n\t\t\tcase '<pivotCaches>': case '</pivotCaches>': case '<pivotCaches': break;\n\t\t\t/* 18.2.17 pivotCache CT_PivotCache ? */\n\t\t\tcase '<pivotCache': break;\n\n\t\t\t/* 18.2.21 smartTagPr CT_SmartTagPr ? */\n\t\t\tcase '<smartTagPr': case '<smartTagPr/>': break;\n\n\t\t\t/* 18.2.23 smartTagTypes CT_SmartTagTypes ? */\n\t\t\tcase '<smartTagTypes': case '<smartTagTypes>': case '</smartTagTypes>': break;\n\t\t\t/* 18.2.22 smartTagType CT_SmartTagType ? */\n\t\t\tcase '<smartTagType': break;\n\n\t\t\t/* 18.2.24 webPublishing CT_WebPublishing ? */\n\t\t\tcase '<webPublishing': case '<webPublishing/>': break;\n\n\t\t\t/* 18.2.11 fileRecoveryPr CT_FileRecoveryPr ? */\n\t\t\tcase '<fileRecoveryPr': case '<fileRecoveryPr/>': break;\n\n\t\t\t/* 18.2.26 webPublishObjects CT_WebPublishObjects ? */\n\t\t\tcase '<webPublishObjects>': case '<webPublishObjects': case '</webPublishObjects>': break;\n\t\t\t/* 18.2.25 webPublishObject CT_WebPublishObject ? */\n\t\t\tcase '<webPublishObject': break;\n\n\t\t\t/* 18.2.10 extLst CT_ExtensionList ? */\n\t\t\tcase '<extLst>': case '</extLst>': case '<extLst/>': break;\n\t\t\t/* 18.2.7 ext CT_Extension + */\n\t\t\tcase '<ext': pass=true; break; //TODO: check with versions of excel\n\t\t\tcase '</ext>': pass=false; break;\n\n\t\t\t/* Others */\n\t\t\tcase '<ArchID': break;\n\t\t\tcase '<AlternateContent': pass=true; break;\n\t\t\tcase '</AlternateContent>': pass=false; break;\n\n\t\t\tdefault: if(!pass && opts.WTF) throw 'unrecognized ' + y[0] + ' in workbook';\n\t\t}\n\t});\n\tif(XMLNS.main.indexOf(wb.xmlns) === -1) throw new Error(\"Unknown Namespace: \" + wb.xmlns);\n\n\tparse_wb_defaults(wb);\n\n\treturn wb;\n}\n\nvar WB_XML_ROOT = writextag('workbook', null, {\n\t'xmlns': XMLNS.main[0],\n\t//'xmlns:mx': XMLNS.mx,\n\t//'xmlns:s': XMLNS.main[0],\n\t'xmlns:r': XMLNS.r\n});\n\nfunction safe1904(wb) {\n\t/* TODO: store date1904 somewhere else */\n\ttry { return parsexmlbool(wb.Workbook.WBProps.date1904) ? \"true\" : \"false\"; } catch(e) { return \"false\"; }\n}\n\nfunction write_wb_xml(wb, opts) {\n\tvar o = [XML_HEADER];\n\to[o.length] = WB_XML_ROOT;\n\to[o.length] = (writextag('workbookPr', null, {date1904:safe1904(wb)}));\n\to[o.length] = \"<sheets>\";\n\tfor(var i = 0; i != wb.SheetNames.length; ++i)\n\t\to[o.length] = (writextag('sheet',null,{name:wb.SheetNames[i].substr(0,31), sheetId:\"\"+(i+1), \"r:id\":\"rId\"+(i+1)}));\n\to[o.length] = \"</sheets>\";\n\tif(o.length>2){ o[o.length] = '</workbook>'; o[1]=o[1].replace(\"/>\",\">\"); }\n\treturn o.join(\"\");\n}\n/* [MS-XLSB] 2.4.301 BrtBundleSh */\nfunction parse_BrtBundleSh(data, length) {\n\tvar z = {};\n\tz.hsState = data.read_shift(4); //ST_SheetState\n\tz.iTabID = data.read_shift(4);\n\tz.strRelID = parse_RelID(data,length-8);\n\tz.name = parse_XLWideString(data);\n\treturn z;\n}\nfunction write_BrtBundleSh(data, o) {\n\tif(!o) o = new_buf(127);\n\to.write_shift(4, data.hsState);\n\to.write_shift(4, data.iTabID);\n\twrite_RelID(data.strRelID, o);\n\twrite_XLWideString(data.name.substr(0,31), o);\n\treturn o;\n}\n\n/* [MS-XLSB] 2.4.807 BrtWbProp */\nfunction parse_BrtWbProp(data, length) {\n\tdata.read_shift(4);\n\tvar dwThemeVersion = data.read_shift(4);\n\tvar strName = (length > 8) ? parse_XLWideString(data) : \"\";\n\treturn [dwThemeVersion, strName];\n}\nfunction write_BrtWbProp(data, o) {\n\tif(!o) o = new_buf(8);\n\to.write_shift(4, 0);\n\to.write_shift(4, 0);\n\treturn o;\n}\n\nfunction parse_BrtFRTArchID$(data, length) {\n\tvar o = {};\n\tdata.read_shift(4);\n\to.ArchID = data.read_shift(4);\n\tdata.l += length - 8;\n\treturn o;\n}\n\n/* [MS-XLSB] 2.1.7.60 Workbook */\nfunction parse_wb_bin(data, opts) {\n\tvar wb = { AppVersion:{}, WBProps:{}, WBView:[], Sheets:[], CalcPr:{}, xmlns: \"\" };\n\tvar pass = false, z;\n\n\trecordhopper(data, function hopper_wb(val, R) {\n\t\tswitch(R.n) {\n\t\t\tcase 'BrtBundleSh': wb.Sheets.push(val); break;\n\n\t\t\tcase 'BrtBeginBook': break;\n\t\t\tcase 'BrtFileVersion': break;\n\t\t\tcase 'BrtWbProp': break;\n\t\t\tcase 'BrtACBegin': break;\n\t\t\tcase 'BrtAbsPath15': break;\n\t\t\tcase 'BrtACEnd': break;\n\t\t\tcase 'BrtWbFactoid': break;\n\t\t\t/*case 'BrtBookProtectionIso': break;*/\n\t\t\tcase 'BrtBookProtection': break;\n\t\t\tcase 'BrtBeginBookViews': break;\n\t\t\tcase 'BrtBookView': break;\n\t\t\tcase 'BrtEndBookViews': break;\n\t\t\tcase 'BrtBeginBundleShs': break;\n\t\t\tcase 'BrtEndBundleShs': break;\n\t\t\tcase 'BrtBeginFnGroup': break;\n\t\t\tcase 'BrtEndFnGroup': break;\n\t\t\tcase 'BrtBeginExternals': break;\n\t\t\tcase 'BrtSupSelf': break;\n\t\t\tcase 'BrtSupBookSrc': break;\n\t\t\tcase 'BrtExternSheet': break;\n\t\t\tcase 'BrtEndExternals': break;\n\t\t\tcase 'BrtName': break;\n\t\t\tcase 'BrtCalcProp': break;\n\t\t\tcase 'BrtUserBookView': break;\n\t\t\tcase 'BrtBeginPivotCacheIDs': break;\n\t\t\tcase 'BrtBeginPivotCacheID': break;\n\t\t\tcase 'BrtEndPivotCacheID': break;\n\t\t\tcase 'BrtEndPivotCacheIDs': break;\n\t\t\tcase 'BrtWebOpt': break;\n\t\t\tcase 'BrtFileRecover': break;\n\t\t\tcase 'BrtFileSharing': break;\n\t\t\t/*case 'BrtBeginWebPubItems': break;\n\t\t\tcase 'BrtBeginWebPubItem': break;\n\t\t\tcase 'BrtEndWebPubItem': break;\n\t\t\tcase 'BrtEndWebPubItems': break;*/\n\n\t\t\t/* Smart Tags */\n\t\t\tcase 'BrtBeginSmartTagTypes': break;\n\t\t\tcase 'BrtSmartTagType': break;\n\t\t\tcase 'BrtEndSmartTagTypes': break;\n\n\t\t\tcase 'BrtFRTBegin': pass = true; break;\n\t\t\tcase 'BrtFRTArchID$': break;\n\t\t\tcase 'BrtWorkBookPr15': break;\n\t\t\tcase 'BrtFRTEnd': pass = false; break;\n\t\t\tcase 'BrtEndBook': break;\n\t\t\tdefault: if(!pass || opts.WTF) throw new Error(\"Unexpected record \" + R.n);\n\t\t}\n\t});\n\n\tparse_wb_defaults(wb);\n\n\treturn wb;\n}\n\n/* [MS-XLSB] 2.1.7.60 Workbook */\nfunction write_BUNDLESHS(ba, wb, opts) {\n\twrite_record(ba, \"BrtBeginBundleShs\");\n\tfor(var idx = 0; idx != wb.SheetNames.length; ++idx) {\n\t\tvar d = { hsState: 0, iTabID: idx+1, strRelID: 'rId' + (idx+1), name: wb.SheetNames[idx] };\n\t\twrite_record(ba, \"BrtBundleSh\", write_BrtBundleSh(d));\n\t}\n\twrite_record(ba, \"BrtEndBundleShs\");\n}\n\n/* [MS-XLSB] 2.4.643 BrtFileVersion */\nfunction write_BrtFileVersion(data, o) {\n\tif(!o) o = new_buf(127);\n\tfor(var i = 0; i != 4; ++i) o.write_shift(4, 0);\n\twrite_XLWideString(\"SheetJS\", o);\n\twrite_XLWideString(XLSX.version, o);\n\twrite_XLWideString(XLSX.version, o);\n\twrite_XLWideString(\"7262\", o);\n\to.length = o.l;\n\treturn o;\n}\n\n/* [MS-XLSB] 2.1.7.60 Workbook */\nfunction write_BOOKVIEWS(ba, wb, opts) {\n\twrite_record(ba, \"BrtBeginBookViews\");\n\t/* 1*(BrtBookView *FRT) */\n\twrite_record(ba, \"BrtEndBookViews\");\n}\n\n/* [MS-XLSB] 2.4.302 BrtCalcProp */\nfunction write_BrtCalcProp(data, o) {\n\tif(!o) o = new_buf(26);\n\to.write_shift(4,0); /* force recalc */\n\to.write_shift(4,1);\n\to.write_shift(4,0);\n\twrite_Xnum(0, o);\n\to.write_shift(-4, 1023);\n\to.write_shift(1, 0x33);\n\to.write_shift(1, 0x00);\n\treturn o;\n}\n\nfunction write_BrtFileRecover(data, o) {\n\tif(!o) o = new_buf(1);\n\to.write_shift(1,0);\n\treturn o;\n}\n\n/* [MS-XLSB] 2.1.7.60 Workbook */\nfunction write_wb_bin(wb, opts) {\n\tvar ba = buf_array();\n\twrite_record(ba, \"BrtBeginBook\");\n\twrite_record(ba, \"BrtFileVersion\", write_BrtFileVersion());\n\t/* [[BrtFileSharingIso] BrtFileSharing] */\n\twrite_record(ba, \"BrtWbProp\", write_BrtWbProp());\n\t/* [ACABSPATH] */\n\t/* [[BrtBookProtectionIso] BrtBookProtection] */\n\twrite_BOOKVIEWS(ba, wb, opts);\n\twrite_BUNDLESHS(ba, wb, opts);\n\t/* [FNGROUP] */\n\t/* [EXTERNALS] */\n\t/* *BrtName */\n\twrite_record(ba, \"BrtCalcProp\", write_BrtCalcProp());\n\t/* [BrtOleSize] */\n\t/* *(BrtUserBookView *FRT) */\n\t/* [PIVOTCACHEIDS] */\n\t/* [BrtWbFactoid] */\n\t/* [SMARTTAGTYPES] */\n\t/* [BrtWebOpt] */\n\twrite_record(ba, \"BrtFileRecover\", write_BrtFileRecover());\n\t/* [WEBPUBITEMS] */\n\t/* [CRERRS] */\n\t/* FRTWORKBOOK */\n\twrite_record(ba, \"BrtEndBook\");\n\n\treturn ba.end();\n}\nfunction parse_wb(data, name, opts) {\n\treturn (name.substr(-4)===\".bin\" ? parse_wb_bin : parse_wb_xml)(data, opts);\n}\n\nfunction parse_ws(data, name, opts, rels) {\n\treturn (name.substr(-4)===\".bin\" ? parse_ws_bin : parse_ws_xml)(data, opts, rels);\n}\n\nfunction parse_sty(data, name, opts) {\n\treturn (name.substr(-4)===\".bin\" ? parse_sty_bin : parse_sty_xml)(data, opts);\n}\n\nfunction parse_theme(data, name, opts) {\n\treturn parse_theme_xml(data, opts);\n}\n\nfunction parse_sst(data, name, opts) {\n\treturn (name.substr(-4)===\".bin\" ? parse_sst_bin : parse_sst_xml)(data, opts);\n}\n\nfunction parse_cmnt(data, name, opts) {\n\treturn (name.substr(-4)===\".bin\" ? parse_comments_bin : parse_comments_xml)(data, opts);\n}\n\nfunction parse_cc(data, name, opts) {\n\treturn (name.substr(-4)===\".bin\" ? parse_cc_bin : parse_cc_xml)(data, opts);\n}\n\nfunction write_wb(wb, name, opts) {\n\treturn (name.substr(-4)===\".bin\" ? write_wb_bin : write_wb_xml)(wb, opts);\n}\n\nfunction write_ws(data, name, opts, wb) {\n\treturn (name.substr(-4)===\".bin\" ? write_ws_bin : write_ws_xml)(data, opts, wb);\n}\n\nfunction write_sty(data, name, opts) {\n\treturn (name.substr(-4)===\".bin\" ? write_sty_bin : write_sty_xml)(data, opts);\n}\n\nfunction write_sst(data, name, opts) {\n\treturn (name.substr(-4)===\".bin\" ? write_sst_bin : write_sst_xml)(data, opts);\n}\n/*\nfunction write_cmnt(data, name, opts) {\n\treturn (name.substr(-4)===\".bin\" ? write_comments_bin : write_comments_xml)(data, opts);\n}\n\nfunction write_cc(data, name, opts) {\n\treturn (name.substr(-4)===\".bin\" ? write_cc_bin : write_cc_xml)(data, opts);\n}\n*/\nvar attregexg2=/([\\w:]+)=((?:\")([^\"]*)(?:\")|(?:')([^']*)(?:'))/g;\nvar attregex2=/([\\w:]+)=((?:\")(?:[^\"]*)(?:\")|(?:')(?:[^']*)(?:'))/;\nvar _chr = function(c) { return String.fromCharCode(c); };\nfunction xlml_parsexmltag(tag, skip_root) {\n\tvar words = tag.split(/\\s+/);\n\tvar z = []; if(!skip_root) z[0] = words[0];\n\tif(words.length === 1) return z;\n\tvar m = tag.match(attregexg2), y, j, w, i;\n\tif(m) for(i = 0; i != m.length; ++i) {\n\t\ty = m[i].match(attregex2);\n\t\tif((j=y[1].indexOf(\":\")) === -1) z[y[1]] = y[2].substr(1,y[2].length-2);\n\t\telse {\n\t\t\tif(y[1].substr(0,6) === \"xmlns:\") w = \"xmlns\"+y[1].substr(6);\n\t\t\telse w = y[1].substr(j+1);\n\t\t\tz[w] = y[2].substr(1,y[2].length-2);\n\t\t}\n\t}\n\treturn z;\n}\nfunction xlml_parsexmltagobj(tag) {\n\tvar words = tag.split(/\\s+/);\n\tvar z = {};\n\tif(words.length === 1) return z;\n\tvar m = tag.match(attregexg2), y, j, w, i;\n\tif(m) for(i = 0; i != m.length; ++i) {\n\t\ty = m[i].match(attregex2);\n\t\tif((j=y[1].indexOf(\":\")) === -1) z[y[1]] = y[2].substr(1,y[2].length-2);\n\t\telse {\n\t\t\tif(y[1].substr(0,6) === \"xmlns:\") w = \"xmlns\"+y[1].substr(6);\n\t\t\telse w = y[1].substr(j+1);\n\t\t\tz[w] = y[2].substr(1,y[2].length-2);\n\t\t}\n\t}\n\treturn z;\n}\n\n// ----\n\nfunction xlml_format(format, value) {\n\tvar fmt = XLMLFormatMap[format] || unescapexml(format);\n\tif(fmt === \"General\") return SSF._general(value);\n\treturn SSF.format(fmt, value);\n}\n\nfunction xlml_set_custprop(Custprops, Rn, cp, val) {\n\tswitch((cp[0].match(/dt:dt=\"([\\w.]+)\"/)||[\"\",\"\"])[1]) {\n\t\tcase \"boolean\": val = parsexmlbool(val); break;\n\t\tcase \"i2\": case \"int\": val = parseInt(val, 10); break;\n\t\tcase \"r4\": case \"float\": val = parseFloat(val); break;\n\t\tcase \"date\": case \"dateTime.tz\": val = new Date(val); break;\n\t\tcase \"i8\": case \"string\": case \"fixed\": case \"uuid\": case \"bin.base64\": break;\n\t\tdefault: throw \"bad custprop:\" + cp[0];\n\t}\n\tCustprops[unescapexml(Rn[3])] = val;\n}\n\nfunction safe_format_xlml(cell, nf, o) {\n\ttry {\n\t\tif(cell.t === 'e') { cell.w = cell.w || BErr[cell.v]; }\n\t\telse if(nf === \"General\") {\n\t\t\tif(cell.t === 'n') {\n\t\t\t\tif((cell.v|0) === cell.v) cell.w = SSF._general_int(cell.v);\n\t\t\t\telse cell.w = SSF._general_num(cell.v);\n\t\t\t}\n\t\t\telse cell.w = SSF._general(cell.v);\n\t\t}\n\t\telse cell.w = xlml_format(nf||\"General\", cell.v);\n\t\tif(o.cellNF) cell.z = XLMLFormatMap[nf]||nf||\"General\";\n\t} catch(e) { if(o.WTF) throw e; }\n}\n\nfunction process_style_xlml(styles, stag, opts) {\n\tif(opts.cellStyles) {\n\t\tif(stag.Interior) {\n\t\t\tvar I = stag.Interior;\n\t\t\tif(I.Pattern) I.patternType = XLMLPatternTypeMap[I.Pattern] || I.Pattern;\n\t\t}\n\t}\n\tstyles[stag.ID] = stag;\n}\n\n/* TODO: there must exist some form of OSP-blessed spec */\nfunction parse_xlml_data(xml, ss, data, cell, base, styles, csty, row, o) {\n\tvar nf = \"General\", sid = cell.StyleID, S = {}; o = o || {};\n\tvar interiors = [];\n\tif(sid === undefined && row) sid = row.StyleID;\n\tif(sid === undefined && csty) sid = csty.StyleID;\n\twhile(styles[sid] !== undefined) {\n\t\tif(styles[sid].nf) nf = styles[sid].nf;\n\t\tif(styles[sid].Interior) interiors.push(styles[sid].Interior);\n\t\tif(!styles[sid].Parent) break;\n\t\tsid = styles[sid].Parent;\n\t}\n\tswitch(data.Type) {\n\t\tcase 'Boolean':\n\t\t\tcell.t = 'b';\n\t\t\tcell.v = parsexmlbool(xml);\n\t\t\tbreak;\n\t\tcase 'String':\n\t\t\tcell.t = 's'; cell.r = xlml_fixstr(unescapexml(xml));\n\t\t\tcell.v = xml.indexOf(\"<\") > -1 ? ss : cell.r;\n\t\t\tbreak;\n\t\tcase 'DateTime':\n\t\t\tcell.v = (Date.parse(xml) - new Date(Date.UTC(1899, 11, 30))) / (24 * 60 * 60 * 1000);\n\t\t\tif(cell.v !== cell.v) cell.v = unescapexml(xml);\n\t\t\telse if(cell.v >= 1 && cell.v<60) cell.v = cell.v -1;\n\t\t\tif(!nf || nf == \"General\") nf = \"yyyy-mm-dd\";\n\t\t\t/* falls through */\n\t\tcase 'Number':\n\t\t\tif(cell.v === undefined) cell.v=+xml;\n\t\t\tif(!cell.t) cell.t = 'n';\n\t\t\tbreak;\n\t\tcase 'Error': cell.t = 'e'; cell.v = RBErr[xml]; cell.w = xml; break;\n\t\tdefault: cell.t = 's'; cell.v = xlml_fixstr(ss); break;\n\t}\n\tsafe_format_xlml(cell, nf, o);\n\tif(o.cellFormula != null && cell.Formula) {\n\t\tcell.f = rc_to_a1(unescapexml(cell.Formula), base);\n\t\tcell.Formula = undefined;\n\t}\n\tif(o.cellStyles) {\n\t\tinteriors.forEach(function(x) {\n\t\t\tif(!S.patternType && x.patternType) S.patternType = x.patternType;\n\t\t});\n\t\tcell.s = S;\n\t}\n\tcell.ixfe = cell.StyleID !== undefined ? cell.StyleID : 'Default';\n}\n\nfunction xlml_clean_comment(comment) {\n\tcomment.t = comment.v;\n\tcomment.v = comment.w = comment.ixfe = undefined;\n}\n\nfunction xlml_normalize(d) {\n\tif(has_buf && Buffer.isBuffer(d)) return d.toString('utf8');\n\tif(typeof d === 'string') return d;\n\tthrow \"badf\";\n}\n\n/* TODO: Everything */\nvar xlmlregex = /<(\\/?)([a-z0-9]*:|)(\\w+)[^>]*>/mg;\nfunction parse_xlml_xml(d, opts) {\n\tvar str = xlml_normalize(d);\n\tvar Rn;\n\tvar state = [], tmp;\n\tvar sheets = {}, sheetnames = [], cursheet = {}, sheetname = \"\";\n\tvar table = {}, cell = {}, row = {}, dtag, didx;\n\tvar c = 0, r = 0;\n\tvar refguess = {s: {r:1000000, c:1000000}, e: {r:0, c:0} };\n\tvar styles = {}, stag = {};\n\tvar ss = \"\", fidx = 0;\n\tvar mergecells = [];\n\tvar Props = {}, Custprops = {}, pidx = 0, cp = {};\n\tvar comments = [], comment = {};\n\tvar cstys = [], csty;\n\txlmlregex.lastIndex = 0;\n\twhile((Rn = xlmlregex.exec(str))) switch(Rn[3]) {\n\t\tcase 'Data':\n\t\t\tif(state[state.length-1][1]) break;\n\t\t\tif(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], row, opts);\n\t\t\telse { ss = \"\"; dtag = xlml_parsexmltag(Rn[0]); didx = Rn.index + Rn[0].length; }\n\t\t\tbreak;\n\t\tcase 'Cell':\n\t\t\tif(Rn[1]==='/'){\n\t\t\t\tif(comments.length > 0) cell.c = comments;\n\t\t\t\tif((!opts.sheetRows || opts.sheetRows > r) && cell.v !== undefined) cursheet[encode_col(c) + encode_row(r)] = cell;\n\t\t\t\tif(cell.HRef) {\n\t\t\t\t\tcell.l = {Target:cell.HRef, tooltip:cell.HRefScreenTip};\n\t\t\t\t\tcell.HRef = cell.HRefScreenTip = undefined;\n\t\t\t\t}\n\t\t\t\tif(cell.MergeAcross || cell.MergeDown) {\n\t\t\t\t\tvar cc = c + (parseInt(cell.MergeAcross,10)|0);\n\t\t\t\t\tvar rr = r + (parseInt(cell.MergeDown,10)|0);\n\t\t\t\t\tmergecells.push({s:{c:c,r:r},e:{c:cc,r:rr}});\n\t\t\t\t}\n\t\t\t\t++c;\n\t\t\t\tif(cell.MergeAcross) c += +cell.MergeAcross;\n\t\t\t} else {\n\t\t\t\tcell = xlml_parsexmltagobj(Rn[0]);\n\t\t\t\tif(cell.Index) c = +cell.Index - 1;\n\t\t\t\tif(c < refguess.s.c) refguess.s.c = c;\n\t\t\t\tif(c > refguess.e.c) refguess.e.c = c;\n\t\t\t\tif(Rn[0].substr(-2) === \"/>\") ++c;\n\t\t\t\tcomments = [];\n\t\t\t}\n\t\t\tbreak;\n\t\tcase 'Row':\n\t\t\tif(Rn[1]==='/' || Rn[0].substr(-2) === \"/>\") {\n\t\t\t\tif(r < refguess.s.r) refguess.s.r = r;\n\t\t\t\tif(r > refguess.e.r) refguess.e.r = r;\n\t\t\t\tif(Rn[0].substr(-2) === \"/>\") {\n\t\t\t\t\trow = xlml_parsexmltag(Rn[0]);\n\t\t\t\t\tif(row.Index) r = +row.Index - 1;\n\t\t\t\t}\n\t\t\t\tc = 0; ++r;\n\t\t\t} else {\n\t\t\t\trow = xlml_parsexmltag(Rn[0]);\n\t\t\t\tif(row.Index) r = +row.Index - 1;\n\t\t\t}\n\t\t\tbreak;\n\t\tcase 'Worksheet': /* TODO: read range from FullRows/FullColumns */\n\t\t\tif(Rn[1]==='/'){\n\t\t\t\tif((tmp=state.pop())[0]!==Rn[3]) throw \"Bad state: \"+tmp;\n\t\t\t\tsheetnames.push(sheetname);\n\t\t\t\tif(refguess.s.r <= refguess.e.r && refguess.s.c <= refguess.e.c) cursheet[\"!ref\"] = encode_range(refguess);\n\t\t\t\tif(mergecells.length) cursheet[\"!merges\"] = mergecells;\n\t\t\t\tsheets[sheetname] = cursheet;\n\t\t\t} else {\n\t\t\t\trefguess = {s: {r:1000000, c:1000000}, e: {r:0, c:0} };\n\t\t\t\tr = c = 0;\n\t\t\t\tstate.push([Rn[3], false]);\n\t\t\t\ttmp = xlml_parsexmltag(Rn[0]);\n\t\t\t\tsheetname = tmp.Name;\n\t\t\t\tcursheet = {};\n\t\t\t\tmergecells = [];\n\t\t\t}\n\t\t\tbreak;\n\t\tcase 'Table':\n\t\t\tif(Rn[1]==='/'){if((tmp=state.pop())[0]!==Rn[3]) throw \"Bad state: \"+tmp;}\n\t\t\telse if(Rn[0].slice(-2) == \"/>\") break;\n\t\t\telse {\n\t\t\t\ttable = xlml_parsexmltag(Rn[0]);\n\t\t\t\tstate.push([Rn[3], false]);\n\t\t\t\tcstys = [];\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase 'Style':\n\t\t\tif(Rn[1]==='/') process_style_xlml(styles, stag, opts);\n\t\t\telse stag = xlml_parsexmltag(Rn[0]);\n\t\t\tbreak;\n\n\t\tcase 'NumberFormat':\n\t\t\tstag.nf = xlml_parsexmltag(Rn[0]).Format || \"General\";\n\t\t\tbreak;\n\n\t\tcase 'Column':\n\t\t\tif(state[state.length-1][0] !== 'Table') break;\n\t\t\tcsty = xlml_parsexmltag(Rn[0]);\n\t\t\tcstys[(csty.Index-1||cstys.length)] = csty;\n\t\t\tfor(var i = 0; i < +csty.Span; ++i) cstys[cstys.length] = csty;\n\t\t\tbreak;\n\n\t\tcase 'NamedRange': break;\n\t\tcase 'NamedCell': break;\n\t\tcase 'B': break;\n\t\tcase 'I': break;\n\t\tcase 'U': break;\n\t\tcase 'S': break;\n\t\tcase 'Sub': break;\n\t\tcase 'Sup': break;\n\t\tcase 'Span': break;\n\t\tcase 'Border': break;\n\t\tcase 'Alignment': break;\n\t\tcase 'Borders': break;\n\t\tcase 'Font':\n\t\t\tif(Rn[0].substr(-2) === \"/>\") break;\n\t\t\telse if(Rn[1]===\"/\") ss += str.slice(fidx, Rn.index);\n\t\t\telse fidx = Rn.index + Rn[0].length;\n\t\t\tbreak;\n\t\tcase 'Interior':\n\t\t\tif(!opts.cellStyles) break;\n\t\t\tstag.Interior = xlml_parsexmltag(Rn[0]);\n\t\t\tbreak;\n\t\tcase 'Protection': break;\n\n\t\tcase 'Author':\n\t\tcase 'Title':\n\t\tcase 'Description':\n\t\tcase 'Created':\n\t\tcase 'Keywords':\n\t\tcase 'Subject':\n\t\tcase 'Category':\n\t\tcase 'Company':\n\t\tcase 'LastAuthor':\n\t\tcase 'LastSaved':\n\t\tcase 'LastPrinted':\n\t\tcase 'Version':\n\t\tcase 'Revision':\n\t\tcase 'TotalTime':\n\t\tcase 'HyperlinkBase':\n\t\tcase 'Manager':\n\t\t\tif(Rn[0].substr(-2) === \"/>\") break;\n\t\t\telse if(Rn[1]===\"/\") xlml_set_prop(Props, Rn[3], str.slice(pidx, Rn.index));\n\t\t\telse pidx = Rn.index + Rn[0].length;\n\t\t\tbreak;\n\t\tcase 'Paragraphs': break;\n\n\t\tcase 'Styles':\n\t\tcase 'Workbook':\n\t\t\tif(Rn[1]==='/'){if((tmp=state.pop())[0]!==Rn[3]) throw \"Bad state: \"+tmp;}\n\t\t\telse state.push([Rn[3], false]);\n\t\t\tbreak;\n\n\t\tcase 'Comment':\n\t\t\tif(Rn[1]==='/'){\n\t\t\t\tif((tmp=state.pop())[0]!==Rn[3]) throw \"Bad state: \"+tmp;\n\t\t\t\txlml_clean_comment(comment);\n\t\t\t\tcomments.push(comment);\n\t\t\t} else {\n\t\t\t\tstate.push([Rn[3], false]);\n\t\t\t\ttmp = xlml_parsexmltag(Rn[0]);\n\t\t\t\tcomment = {a:tmp.Author};\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase 'Name': break;\n\n\t\tcase 'ComponentOptions':\n\t\tcase 'DocumentProperties':\n\t\tcase 'CustomDocumentProperties':\n\t\tcase 'OfficeDocumentSettings':\n\t\tcase 'PivotTable':\n\t\tcase 'PivotCache':\n\t\tcase 'Names':\n\t\tcase 'MapInfo':\n\t\tcase 'PageBreaks':\n\t\tcase 'QueryTable':\n\t\tcase 'DataValidation':\n\t\tcase 'AutoFilter':\n\t\tcase 'Sorting':\n\t\tcase 'Schema':\n\t\tcase 'data':\n\t\tcase 'ConditionalFormatting':\n\t\tcase 'SmartTagType':\n\t\tcase 'SmartTags':\n\t\tcase 'ExcelWorkbook':\n\t\tcase 'WorkbookOptions':\n\t\tcase 'WorksheetOptions':\n\t\t\tif(Rn[1]==='/'){if((tmp=state.pop())[0]!==Rn[3]) throw \"Bad state: \"+tmp;}\n\t\t\telse if(Rn[0].charAt(Rn[0].length-2) !== '/') state.push([Rn[3], true]);\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tvar seen = true;\n\t\t\tswitch(state[state.length-1][0]) {\n\t\t\t\t/* OfficeDocumentSettings */\n\t\t\t\tcase 'OfficeDocumentSettings': switch(Rn[3]) {\n\t\t\t\t\tcase 'AllowPNG': break;\n\t\t\t\t\tcase 'RemovePersonalInformation': break;\n\t\t\t\t\tcase 'DownloadComponents': break;\n\t\t\t\t\tcase 'LocationOfComponents': break;\n\t\t\t\t\tcase 'Colors': break;\n\t\t\t\t\tcase 'Color': break;\n\t\t\t\t\tcase 'Index': break;\n\t\t\t\t\tcase 'RGB': break;\n\t\t\t\t\tcase 'PixelsPerInch': break;\n\t\t\t\t\tcase 'TargetScreenSize': break;\n\t\t\t\t\tcase 'ReadOnlyRecommended': break;\n\t\t\t\t\tdefault: seen = false;\n\t\t\t\t} break;\n\n\t\t\t\t/* ComponentOptions */\n\t\t\t\tcase 'ComponentOptions': switch(Rn[3]) {\n\t\t\t\t\tcase 'Toolbar': break;\n\t\t\t\t\tcase 'HideOfficeLogo': break;\n\t\t\t\t\tcase 'SpreadsheetAutoFit': break;\n\t\t\t\t\tcase 'Label': break;\n\t\t\t\t\tcase 'Caption': break;\n\t\t\t\t\tcase 'MaxHeight': break;\n\t\t\t\t\tcase 'MaxWidth': break;\n\t\t\t\t\tcase 'NextSheetNumber': break;\n\t\t\t\t\tdefault: seen = false;\n\t\t\t\t} break;\n\n\t\t\t\t/* ExcelWorkbook */\n\t\t\t\tcase 'ExcelWorkbook': switch(Rn[3]) {\n\t\t\t\t\tcase 'WindowHeight': break;\n\t\t\t\t\tcase 'WindowWidth': break;\n\t\t\t\t\tcase 'WindowTopX': break;\n\t\t\t\t\tcase 'WindowTopY': break;\n\t\t\t\t\tcase 'TabRatio': break;\n\t\t\t\t\tcase 'ProtectStructure': break;\n\t\t\t\t\tcase 'ProtectWindows': break;\n\t\t\t\t\tcase 'ActiveSheet': break;\n\t\t\t\t\tcase 'DisplayInkNotes': break;\n\t\t\t\t\tcase 'FirstVisibleSheet': break;\n\t\t\t\t\tcase 'SupBook': break;\n\t\t\t\t\tcase 'SheetName': break;\n\t\t\t\t\tcase 'SheetIndex': break;\n\t\t\t\t\tcase 'SheetIndexFirst': break;\n\t\t\t\t\tcase 'SheetIndexLast': break;\n\t\t\t\t\tcase 'Dll': break;\n\t\t\t\t\tcase 'AcceptLabelsInFormulas': break;\n\t\t\t\t\tcase 'DoNotSaveLinkValues': break;\n\t\t\t\t\tcase 'Date1904': break;\n\t\t\t\t\tcase 'Iteration': break;\n\t\t\t\t\tcase 'MaxIterations': break;\n\t\t\t\t\tcase 'MaxChange': break;\n\t\t\t\t\tcase 'Path': break;\n\t\t\t\t\tcase 'Xct': break;\n\t\t\t\t\tcase 'Count': break;\n\t\t\t\t\tcase 'SelectedSheets': break;\n\t\t\t\t\tcase 'Calculation': break;\n\t\t\t\t\tcase 'Uncalced': break;\n\t\t\t\t\tcase 'StartupPrompt': break;\n\t\t\t\t\tcase 'Crn': break;\n\t\t\t\t\tcase 'ExternName': break;\n\t\t\t\t\tcase 'Formula': break;\n\t\t\t\t\tcase 'ColFirst': break;\n\t\t\t\t\tcase 'ColLast': break;\n\t\t\t\t\tcase 'WantAdvise': break;\n\t\t\t\t\tcase 'Boolean': break;\n\t\t\t\t\tcase 'Error': break;\n\t\t\t\t\tcase 'Text': break;\n\t\t\t\t\tcase 'OLE': break;\n\t\t\t\t\tcase 'NoAutoRecover': break;\n\t\t\t\t\tcase 'PublishObjects': break;\n\t\t\t\t\tcase 'DoNotCalculateBeforeSave': break;\n\t\t\t\t\tcase 'Number': break;\n\t\t\t\t\tcase 'RefModeR1C1': break;\n\t\t\t\t\tcase 'EmbedSaveSmartTags': break;\n\t\t\t\t\tdefault: seen = false;\n\t\t\t\t} break;\n\n\t\t\t\t/* WorkbookOptions */\n\t\t\t\tcase 'WorkbookOptions': switch(Rn[3]) {\n\t\t\t\t\tcase 'OWCVersion': break;\n\t\t\t\t\tcase 'Height': break;\n\t\t\t\t\tcase 'Width': break;\n\t\t\t\t\tdefault: seen = false;\n\t\t\t\t} break;\n\n\t\t\t\t/* WorksheetOptions */\n\t\t\t\tcase 'WorksheetOptions': switch(Rn[3]) {\n\t\t\t\t\tcase 'Unsynced': break;\n\t\t\t\t\tcase 'Visible': break;\n\t\t\t\t\tcase 'Print': break;\n\t\t\t\t\tcase 'Panes': break;\n\t\t\t\t\tcase 'Scale': break;\n\t\t\t\t\tcase 'Pane': break;\n\t\t\t\t\tcase 'Number': break;\n\t\t\t\t\tcase 'Layout': break;\n\t\t\t\t\tcase 'Header': break;\n\t\t\t\t\tcase 'Footer': break;\n\t\t\t\t\tcase 'PageSetup': break;\n\t\t\t\t\tcase 'PageMargins': break;\n\t\t\t\t\tcase 'Selected': break;\n\t\t\t\t\tcase 'ProtectObjects': break;\n\t\t\t\t\tcase 'EnableSelection': break;\n\t\t\t\t\tcase 'ProtectScenarios': break;\n\t\t\t\t\tcase 'ValidPrinterInfo': break;\n\t\t\t\t\tcase 'HorizontalResolution': break;\n\t\t\t\t\tcase 'VerticalResolution': break;\n\t\t\t\t\tcase 'NumberofCopies': break;\n\t\t\t\t\tcase 'ActiveRow': break;\n\t\t\t\t\tcase 'ActiveCol': break;\n\t\t\t\t\tcase 'ActivePane': break;\n\t\t\t\t\tcase 'TopRowVisible': break;\n\t\t\t\t\tcase 'TopRowBottomPane': break;\n\t\t\t\t\tcase 'LeftColumnVisible': break;\n\t\t\t\t\tcase 'LeftColumnRightPane': break;\n\t\t\t\t\tcase 'FitToPage': break;\n\t\t\t\t\tcase 'RangeSelection': break;\n\t\t\t\t\tcase 'PaperSizeIndex': break;\n\t\t\t\t\tcase 'PageLayoutZoom': break;\n\t\t\t\t\tcase 'PageBreakZoom': break;\n\t\t\t\t\tcase 'FilterOn': break;\n\t\t\t\t\tcase 'DoNotDisplayGridlines': break;\n\t\t\t\t\tcase 'SplitHorizontal': break;\n\t\t\t\t\tcase 'SplitVertical': break;\n\t\t\t\t\tcase 'FreezePanes': break;\n\t\t\t\t\tcase 'FrozenNoSplit': break;\n\t\t\t\t\tcase 'FitWidth': break;\n\t\t\t\t\tcase 'FitHeight': break;\n\t\t\t\t\tcase 'CommentsLayout': break;\n\t\t\t\t\tcase 'Zoom': break;\n\t\t\t\t\tcase 'LeftToRight': break;\n\t\t\t\t\tcase 'Gridlines': break;\n\t\t\t\t\tcase 'AllowSort': break;\n\t\t\t\t\tcase 'AllowFilter': break;\n\t\t\t\t\tcase 'AllowInsertRows': break;\n\t\t\t\t\tcase 'AllowDeleteRows': break;\n\t\t\t\t\tcase 'AllowInsertCols': break;\n\t\t\t\t\tcase 'AllowDeleteCols': break;\n\t\t\t\t\tcase 'AllowInsertHyperlinks': break;\n\t\t\t\t\tcase 'AllowFormatCells': break;\n\t\t\t\t\tcase 'AllowSizeCols': break;\n\t\t\t\t\tcase 'AllowSizeRows': break;\n\t\t\t\t\tcase 'NoSummaryRowsBelowDetail': break;\n\t\t\t\t\tcase 'TabColorIndex': break;\n\t\t\t\t\tcase 'DoNotDisplayHeadings': break;\n\t\t\t\t\tcase 'ShowPageLayoutZoom': break;\n\t\t\t\t\tcase 'NoSummaryColumnsRightDetail': break;\n\t\t\t\t\tcase 'BlackAndWhite': break;\n\t\t\t\t\tcase 'DoNotDisplayZeros': break;\n\t\t\t\t\tcase 'DisplayPageBreak': break;\n\t\t\t\t\tcase 'RowColHeadings': break;\n\t\t\t\t\tcase 'DoNotDisplayOutline': break;\n\t\t\t\t\tcase 'NoOrientation': break;\n\t\t\t\t\tcase 'AllowUsePivotTables': break;\n\t\t\t\t\tcase 'ZeroHeight': break;\n\t\t\t\t\tcase 'ViewableRange': break;\n\t\t\t\t\tcase 'Selection': break;\n\t\t\t\t\tcase 'ProtectContents': break;\n\t\t\t\t\tdefault: seen = false;\n\t\t\t\t} break;\n\n\t\t\t\t/* PivotTable */\n\t\t\t\tcase 'PivotTable': case 'PivotCache': switch(Rn[3]) {\n\t\t\t\t\tcase 'ImmediateItemsOnDrop': break;\n\t\t\t\t\tcase 'ShowPageMultipleItemLabel': break;\n\t\t\t\t\tcase 'CompactRowIndent': break;\n\t\t\t\t\tcase 'Location': break;\n\t\t\t\t\tcase 'PivotField': break;\n\t\t\t\t\tcase 'Orientation': break;\n\t\t\t\t\tcase 'LayoutForm': break;\n\t\t\t\t\tcase 'LayoutSubtotalLocation': break;\n\t\t\t\t\tcase 'LayoutCompactRow': break;\n\t\t\t\t\tcase 'Position': break;\n\t\t\t\t\tcase 'PivotItem': break;\n\t\t\t\t\tcase 'DataType': break;\n\t\t\t\t\tcase 'DataField': break;\n\t\t\t\t\tcase 'SourceName': break;\n\t\t\t\t\tcase 'ParentField': break;\n\t\t\t\t\tcase 'PTLineItems': break;\n\t\t\t\t\tcase 'PTLineItem': break;\n\t\t\t\t\tcase 'CountOfSameItems': break;\n\t\t\t\t\tcase 'Item': break;\n\t\t\t\t\tcase 'ItemType': break;\n\t\t\t\t\tcase 'PTSource': break;\n\t\t\t\t\tcase 'CacheIndex': break;\n\t\t\t\t\tcase 'ConsolidationReference': break;\n\t\t\t\t\tcase 'FileName': break;\n\t\t\t\t\tcase 'Reference': break;\n\t\t\t\t\tcase 'NoColumnGrand': break;\n\t\t\t\t\tcase 'NoRowGrand': break;\n\t\t\t\t\tcase 'BlankLineAfterItems': break;\n\t\t\t\t\tcase 'Hidden': break;\n\t\t\t\t\tcase 'Subtotal': break;\n\t\t\t\t\tcase 'BaseField': break;\n\t\t\t\t\tcase 'MapChildItems': break;\n\t\t\t\t\tcase 'Function': break;\n\t\t\t\t\tcase 'RefreshOnFileOpen': break;\n\t\t\t\t\tcase 'PrintSetTitles': break;\n\t\t\t\t\tcase 'MergeLabels': break;\n\t\t\t\t\tcase 'DefaultVersion': break;\n\t\t\t\t\tcase 'RefreshName': break;\n\t\t\t\t\tcase 'RefreshDate': break;\n\t\t\t\t\tcase 'RefreshDateCopy': break;\n\t\t\t\t\tcase 'VersionLastRefresh': break;\n\t\t\t\t\tcase 'VersionLastUpdate': break;\n\t\t\t\t\tcase 'VersionUpdateableMin': break;\n\t\t\t\t\tcase 'VersionRefreshableMin': break;\n\t\t\t\t\tcase 'Calculation': break;\n\t\t\t\t\tdefault: seen = false;\n\t\t\t\t} break;\n\n\t\t\t\t/* PageBreaks */\n\t\t\t\tcase 'PageBreaks': switch(Rn[3]) {\n\t\t\t\t\tcase 'ColBreaks': break;\n\t\t\t\t\tcase 'ColBreak': break;\n\t\t\t\t\tcase 'RowBreaks': break;\n\t\t\t\t\tcase 'RowBreak': break;\n\t\t\t\t\tcase 'ColStart': break;\n\t\t\t\t\tcase 'ColEnd': break;\n\t\t\t\t\tcase 'RowEnd': break;\n\t\t\t\t\tdefault: seen = false;\n\t\t\t\t} break;\n\n\t\t\t\t/* AutoFilter */\n\t\t\t\tcase 'AutoFilter': switch(Rn[3]) {\n\t\t\t\t\tcase 'AutoFilterColumn': break;\n\t\t\t\t\tcase 'AutoFilterCondition': break;\n\t\t\t\t\tcase 'AutoFilterAnd': break;\n\t\t\t\t\tcase 'AutoFilterOr': break;\n\t\t\t\t\tdefault: seen = false;\n\t\t\t\t} break;\n\n\t\t\t\t/* QueryTable */\n\t\t\t\tcase 'QueryTable': switch(Rn[3]) {\n\t\t\t\t\tcase 'Id': break;\n\t\t\t\t\tcase 'AutoFormatFont': break;\n\t\t\t\t\tcase 'AutoFormatPattern': break;\n\t\t\t\t\tcase 'QuerySource': break;\n\t\t\t\t\tcase 'QueryType': break;\n\t\t\t\t\tcase 'EnableRedirections': break;\n\t\t\t\t\tcase 'RefreshedInXl9': break;\n\t\t\t\t\tcase 'URLString': break;\n\t\t\t\t\tcase 'HTMLTables': break;\n\t\t\t\t\tcase 'Connection': break;\n\t\t\t\t\tcase 'CommandText': break;\n\t\t\t\t\tcase 'RefreshInfo': break;\n\t\t\t\t\tcase 'NoTitles': break;\n\t\t\t\t\tcase 'NextId': break;\n\t\t\t\t\tcase 'ColumnInfo': break;\n\t\t\t\t\tcase 'OverwriteCells': break;\n\t\t\t\t\tcase 'DoNotPromptForFile': break;\n\t\t\t\t\tcase 'TextWizardSettings': break;\n\t\t\t\t\tcase 'Source': break;\n\t\t\t\t\tcase 'Number': break;\n\t\t\t\t\tcase 'Decimal': break;\n\t\t\t\t\tcase 'ThousandSeparator': break;\n\t\t\t\t\tcase 'TrailingMinusNumbers': break;\n\t\t\t\t\tcase 'FormatSettings': break;\n\t\t\t\t\tcase 'FieldType': break;\n\t\t\t\t\tcase 'Delimiters': break;\n\t\t\t\t\tcase 'Tab': break;\n\t\t\t\t\tcase 'Comma': break;\n\t\t\t\t\tcase 'AutoFormatName': break;\n\t\t\t\t\tcase 'VersionLastEdit': break;\n\t\t\t\t\tcase 'VersionLastRefresh': break;\n\t\t\t\t\tdefault: seen = false;\n\t\t\t\t} break;\n\n\t\t\t\t/* Sorting */\n\t\t\t\tcase 'Sorting':\n\t\t\t\t/* ConditionalFormatting */\n\t\t\t\tcase 'ConditionalFormatting':\n\t\t\t\t/* DataValidation */\n\t\t\t\tcase 'DataValidation': switch(Rn[3]) {\n\t\t\t\t\tcase 'Range': break;\n\t\t\t\t\tcase 'Type': break;\n\t\t\t\t\tcase 'Min': break;\n\t\t\t\t\tcase 'Max': break;\n\t\t\t\t\tcase 'Sort': break;\n\t\t\t\t\tcase 'Descending': break;\n\t\t\t\t\tcase 'Order': break;\n\t\t\t\t\tcase 'CaseSensitive': break;\n\t\t\t\t\tcase 'Value': break;\n\t\t\t\t\tcase 'ErrorStyle': break;\n\t\t\t\t\tcase 'ErrorMessage': break;\n\t\t\t\t\tcase 'ErrorTitle': break;\n\t\t\t\t\tcase 'CellRangeList': break;\n\t\t\t\t\tcase 'InputMessage': break;\n\t\t\t\t\tcase 'InputTitle': break;\n\t\t\t\t\tcase 'ComboHide': break;\n\t\t\t\t\tcase 'InputHide': break;\n\t\t\t\t\tcase 'Condition': break;\n\t\t\t\t\tcase 'Qualifier': break;\n\t\t\t\t\tcase 'UseBlank': break;\n\t\t\t\t\tcase 'Value1': break;\n\t\t\t\t\tcase 'Value2': break;\n\t\t\t\t\tcase 'Format': break;\n\t\t\t\t\tdefault: seen = false;\n\t\t\t\t} break;\n\n\t\t\t\t/* MapInfo (schema) */\n\t\t\t\tcase 'MapInfo': case 'Schema': case 'data': switch(Rn[3]) {\n\t\t\t\t\tcase 'Map': break;\n\t\t\t\t\tcase 'Entry': break;\n\t\t\t\t\tcase 'Range': break;\n\t\t\t\t\tcase 'XPath': break;\n\t\t\t\t\tcase 'Field': break;\n\t\t\t\t\tcase 'XSDType': break;\n\t\t\t\t\tcase 'FilterOn': break;\n\t\t\t\t\tcase 'Aggregate': break;\n\t\t\t\t\tcase 'ElementType': break;\n\t\t\t\t\tcase 'AttributeType': break;\n\t\t\t\t/* These are from xsd (XML Schema Definition) */\n\t\t\t\t\tcase 'schema':\n\t\t\t\t\tcase 'element':\n\t\t\t\t\tcase 'complexType':\n\t\t\t\t\tcase 'datatype':\n\t\t\t\t\tcase 'all':\n\t\t\t\t\tcase 'attribute':\n\t\t\t\t\tcase 'extends': break;\n\n\t\t\t\t\tcase 'row': break;\n\t\t\t\t\tdefault: seen = false;\n\t\t\t\t} break;\n\n\t\t\t\t/* SmartTags (can be anything) */\n\t\t\t\tcase 'SmartTags': break;\n\n\t\t\t\tdefault: seen = false; break;\n\t\t\t}\n\t\t\tif(seen) break;\n\t\t\t/* CustomDocumentProperties */\n\t\t\tif(!state[state.length-1][1]) throw 'Unrecognized tag: ' + Rn[3] + \"|\" + state.join(\"|\");\n\t\t\tif(state[state.length-1][0]==='CustomDocumentProperties') {\n\t\t\t\tif(Rn[0].substr(-2) === \"/>\") break;\n\t\t\t\telse if(Rn[1]===\"/\") xlml_set_custprop(Custprops, Rn, cp, str.slice(pidx, Rn.index));\n\t\t\t\telse { cp = Rn; pidx = Rn.index + Rn[0].length; }\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif(opts.WTF) throw 'Unrecognized tag: ' + Rn[3] + \"|\" + state.join(\"|\");\n\t}\n\tvar out = {};\n\tif(!opts.bookSheets && !opts.bookProps) out.Sheets = sheets;\n\tout.SheetNames = sheetnames;\n\tout.SSF = SSF.get_table();\n\tout.Props = Props;\n\tout.Custprops = Custprops;\n\treturn out;\n}\n\nfunction parse_xlml(data, opts) {\n\tfix_read_opts(opts=opts||{});\n\tswitch(opts.type||\"base64\") {\n\t\tcase \"base64\": return parse_xlml_xml(Base64.decode(data), opts);\n\t\tcase \"binary\": case \"buffer\": case \"file\": return parse_xlml_xml(data, opts);\n\t\tcase \"array\": return parse_xlml_xml(data.map(_chr).join(\"\"), opts);\n\t}\n}\n\nfunction write_xlml(wb, opts) { }\n\n/* [MS-OLEDS] 2.3.8 CompObjStream */\nfunction parse_compobj(obj) {\n\tvar v = {};\n\tvar o = obj.content;\n\n\t/* [MS-OLEDS] 2.3.7 CompObjHeader -- All fields MUST be ignored */\n\tvar l = 28, m;\n\tm = __lpstr(o, l);\n\tl += 4 + __readUInt32LE(o,l);\n\tv.UserType = m;\n\n\t/* [MS-OLEDS] 2.3.1 ClipboardFormatOrAnsiString */\n\tm = __readUInt32LE(o,l); l+= 4;\n\tswitch(m) {\n\t\tcase 0x00000000: break;\n\t\tcase 0xffffffff: case 0xfffffffe: l+=4; break;\n\t\tdefault:\n\t\t\tif(m > 0x190) throw new Error(\"Unsupported Clipboard: \" + m.toString(16));\n\t\t\tl += m;\n\t}\n\n\tm = __lpstr(o, l); l += m.length === 0 ? 0 : 5 + m.length; v.Reserved1 = m;\n\n\tif((m = __readUInt32LE(o,l)) !== 0x71b2e9f4) return v;\n\tthrow \"Unsupported Unicode Extension\";\n}\n\n/* 2.4.58 Continue logic */\nfunction slurp(R, blob, length, opts) {\n\tvar l = length;\n\tvar bufs = [];\n\tvar d = blob.slice(blob.l,blob.l+l);\n\tif(opts && opts.enc && opts.enc.insitu_decrypt) switch(R.n) {\n\tcase 'BOF': case 'FilePass': case 'FileLock': case 'InterfaceHdr': case 'RRDInfo': case 'RRDHead': case 'UsrExcl': break;\n\tdefault:\n\t\tif(d.length === 0) break;\n\t\topts.enc.insitu_decrypt(d);\n\t}\n\tbufs.push(d);\n\tblob.l += l;\n\tvar next = (XLSRecordEnum[__readUInt16LE(blob,blob.l)]);\n\twhile(next != null && next.n === 'Continue') {\n\t\tl = __readUInt16LE(blob,blob.l+2);\n\t\tbufs.push(blob.slice(blob.l+4,blob.l+4+l));\n\t\tblob.l += 4+l;\n\t\tnext = (XLSRecordEnum[__readUInt16LE(blob, blob.l)]);\n\t}\n\tvar b = bconcat(bufs);\n\tprep_blob(b, 0);\n\tvar ll = 0; b.lens = [];\n\tfor(var j = 0; j < bufs.length; ++j) { b.lens.push(ll); ll += bufs[j].length; }\n\treturn R.f(b, b.length, opts);\n}\n\nfunction safe_format_xf(p, opts, date1904) {\n\tif(!p.XF) return;\n\ttry {\n\t\tvar fmtid = p.XF.ifmt||0;\n\t\tif(p.t === 'e') { p.w = p.w || BErr[p.v]; }\n\t\telse if(fmtid === 0) {\n\t\t\tif(p.t === 'n') {\n\t\t\t\tif((p.v|0) === p.v) p.w = SSF._general_int(p.v);\n\t\t\t\telse p.w = SSF._general_num(p.v);\n\t\t\t}\n\t\t\telse p.w = SSF._general(p.v);\n\t\t}\n\t\telse p.w = SSF.format(fmtid,p.v, {date1904:date1904||false});\n\t\tif(opts.cellNF) p.z = SSF._table[fmtid];\n\t} catch(e) { if(opts.WTF) throw e; }\n}\n\nfunction make_cell(val, ixfe, t) {\n\treturn {v:val, ixfe:ixfe, t:t};\n}\n\n// 2.3.2\nfunction parse_workbook(blob, options) {\n\tvar wb = {opts:{}};\n\tvar Sheets = {};\n\tvar out = {};\n\tvar Directory = {};\n\tvar found_sheet = false;\n\tvar range = {};\n\tvar last_formula = null;\n\tvar sst = [];\n\tvar cur_sheet = \"\";\n\tvar Preamble = {};\n\tvar lastcell, last_cell, cc, cmnt, rng, rngC, rngR;\n\tvar shared_formulae = {};\n\tvar array_formulae = []; /* TODO: something more clever */\n\tvar temp_val;\n\tvar country;\n\tvar cell_valid = true;\n\tvar XFs = []; /* XF records */\n\tvar palette = [];\n\tvar get_rgb = function getrgb(icv) {\n\t\tif(icv < 8) return XLSIcv[icv];\n\t\tif(icv < 64) return palette[icv-8] || XLSIcv[icv];\n\t\treturn XLSIcv[icv];\n\t};\n\tvar process_cell_style = function pcs(cell, line) {\n\t\tvar xfd = line.XF.data;\n\t\tif(!xfd || !xfd.patternType) return;\n\t\tline.s = {};\n\t\tline.s.patternType = xfd.patternType;\n\t\tvar t;\n\t\tif((t = rgb2Hex(get_rgb(xfd.icvFore)))) { line.s.fgColor = {rgb:t}; }\n\t\tif((t = rgb2Hex(get_rgb(xfd.icvBack)))) { line.s.bgColor = {rgb:t}; }\n\t};\n\tvar addcell = function addcell(cell, line, options) {\n\t\tif(!cell_valid) return;\n\t\tif(options.cellStyles && line.XF && line.XF.data) process_cell_style(cell, line);\n\t\tlastcell = cell;\n\t\tlast_cell = encode_cell(cell);\n\t\tif(range.s) {\n\t\t\tif(cell.r < range.s.r) range.s.r = cell.r;\n\t\t\tif(cell.c < range.s.c) range.s.c = cell.c;\n\t\t}\n\t\tif(range.e) {\n\t\t\tif(cell.r + 1 > range.e.r) range.e.r = cell.r + 1;\n\t\t\tif(cell.c + 1 > range.e.c) range.e.c = cell.c + 1;\n\t\t}\n\t\tif(options.sheetRows && lastcell.r >= options.sheetRows) cell_valid = false;\n\t\telse out[last_cell] = line;\n\t};\n\tvar opts = {\n\t\tenc: false, // encrypted\n\t\tsbcch: 0, // cch in the preceding SupBook\n\t\tsnames: [], // sheetnames\n\t\tsharedf: shared_formulae, // shared formulae by address\n\t\tarrayf: array_formulae, // array formulae array\n\t\trrtabid: [], // RRTabId\n\t\tlastuser: \"\", // Last User from WriteAccess\n\t\tbiff: 8, // BIFF version\n\t\tcodepage: 0, // CP from CodePage record\n\t\twinlocked: 0, // fLockWn from WinProtect\n\t\twtf: false\n\t};\n\tif(options.password) opts.password = options.password;\n\tvar mergecells = [];\n\tvar objects = [];\n\tvar supbooks = [[]]; // 1-indexed, will hold extern names\n\tvar sbc = 0, sbci = 0, sbcli = 0;\n\tsupbooks.SheetNames = opts.snames;\n\tsupbooks.sharedf = opts.sharedf;\n\tsupbooks.arrayf = opts.arrayf;\n\tvar last_Rn = '';\n\tvar file_depth = 0; /* TODO: make a real stack */\n\n\t/* explicit override for some broken writers */\n\topts.codepage = 1200;\n\tset_cp(1200);\n\n\twhile(blob.l < blob.length - 1) {\n\t\tvar s = blob.l;\n\t\tvar RecordType = blob.read_shift(2);\n\t\tif(RecordType === 0 && last_Rn === 'EOF') break;\n\t\tvar length = (blob.l === blob.length ? 0 : blob.read_shift(2)), y;\n\t\tvar R = XLSRecordEnum[RecordType];\n\t\tif(R && R.f) {\n\t\t\tif(options.bookSheets) {\n\t\t\t\tif(last_Rn === 'BoundSheet8' && R.n !== 'BoundSheet8') break;\n\t\t\t}\n\t\t\tlast_Rn = R.n;\n\t\t\tif(R.r === 2 || R.r == 12) {\n\t\t\t\tvar rt = blob.read_shift(2); length -= 2;\n\t\t\t\tif(!opts.enc && rt !== RecordType) throw \"rt mismatch\";\n\t\t\t\tif(R.r == 12){ blob.l += 10; length -= 10; } // skip FRT\n\t\t\t}\n\t\t\t//console.error(R,blob.l,length,blob.length);\n\t\t\tvar val;\n\t\t\tif(R.n === 'EOF') val = R.f(blob, length, opts);\n\t\t\telse val = slurp(R, blob, length, opts);\n\t\t\tvar Rn = R.n;\n\t\t\t/* BIFF5 overrides */\n\t\t\tif(opts.biff === 5 || opts.biff === 2) switch(Rn) {\n\t\t\t\tcase 'Lbl': Rn = 'Label'; break;\n\t\t\t}\n\t\t\t/* nested switch statements to workaround V8 128 limit */\n\t\t\tswitch(Rn) {\n\t\t\t\t/* Workbook Options */\n\t\t\t\tcase 'Date1904': wb.opts.Date1904 = val; break;\n\t\t\t\tcase 'WriteProtect': wb.opts.WriteProtect = true; break;\n\t\t\t\tcase 'FilePass':\n\t\t\t\t\tif(!opts.enc) blob.l = 0;\n\t\t\t\t\topts.enc = val;\n\t\t\t\t\tif(opts.WTF) console.error(val);\n\t\t\t\t\tif(!options.password) throw new Error(\"File is password-protected\");\n\t\t\t\t\tif(val.Type !== 0) throw new Error(\"Encryption scheme unsupported\");\n\t\t\t\t\tif(!val.valid) throw new Error(\"Password is incorrect\");\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'WriteAccess': opts.lastuser = val; break;\n\t\t\t\tcase 'FileSharing': break; //TODO\n\t\t\t\tcase 'CodePage':\n\t\t\t\t\t/* overrides based on test cases */\n\t\t\t\t\tif(val === 0x5212) val = 1200;\n\t\t\t\t\telse if(val === 0x8001) val = 1252;\n\t\t\t\t\topts.codepage = val;\n\t\t\t\t\tset_cp(val);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'RRTabId': opts.rrtabid = val; break;\n\t\t\t\tcase 'WinProtect': opts.winlocked = val; break;\n\t\t\t\tcase 'Template': break; // TODO\n\t\t\t\tcase 'RefreshAll': wb.opts.RefreshAll = val; break;\n\t\t\t\tcase 'BookBool': break; // TODO\n\t\t\t\tcase 'UsesELFs': /* if(val) console.error(\"Unsupported ELFs\"); */ break;\n\t\t\t\tcase 'MTRSettings': {\n\t\t\t\t\tif(val[0] && val[1]) throw \"Unsupported threads: \" + val;\n\t\t\t\t} break; // TODO: actually support threads\n\t\t\t\tcase 'CalcCount': wb.opts.CalcCount = val; break;\n\t\t\t\tcase 'CalcDelta': wb.opts.CalcDelta = val; break;\n\t\t\t\tcase 'CalcIter': wb.opts.CalcIter = val; break;\n\t\t\t\tcase 'CalcMode': wb.opts.CalcMode = val; break;\n\t\t\t\tcase 'CalcPrecision': wb.opts.CalcPrecision = val; break;\n\t\t\t\tcase 'CalcSaveRecalc': wb.opts.CalcSaveRecalc = val; break;\n\t\t\t\tcase 'CalcRefMode': opts.CalcRefMode = val; break; // TODO: implement R1C1\n\t\t\t\tcase 'Uncalced': break;\n\t\t\t\tcase 'ForceFullCalculation': wb.opts.FullCalc = val; break;\n\t\t\t\tcase 'WsBool': break; // TODO\n\t\t\t\tcase 'XF': XFs.push(val); break;\n\t\t\t\tcase 'ExtSST': break; // TODO\n\t\t\t\tcase 'BookExt': break; // TODO\n\t\t\t\tcase 'RichTextStream': break;\n\t\t\t\tcase 'BkHim': break;\n\n\t\t\t\tcase 'SupBook': supbooks[++sbc] = [val]; sbci = 0; break;\n\t\t\t\tcase 'ExternName': supbooks[sbc][++sbci] = val; break;\n\t\t\t\tcase 'Index': break; // TODO\n\t\t\t\tcase 'Lbl': supbooks[0][++sbcli] = val; break;\n\t\t\t\tcase 'ExternSheet': supbooks[sbc] = supbooks[sbc].concat(val); sbci += val.length; break;\n\n\t\t\t\tcase 'Protect': out[\"!protect\"] = val; break; /* for sheet or book */\n\t\t\t\tcase 'Password': if(val !== 0 && opts.WTF) console.error(\"Password verifier: \" + val); break;\n\t\t\t\tcase 'Prot4Rev': case 'Prot4RevPass': break; /*TODO: Revision Control*/\n\n\t\t\t\tcase 'BoundSheet8': {\n\t\t\t\t\tDirectory[val.pos] = val;\n\t\t\t\t\topts.snames.push(val.name);\n\t\t\t\t} break;\n\t\t\t\tcase 'EOF': {\n\t\t\t\t\tif(--file_depth) break;\n\t\t\t\t\tif(range.e) {\n\t\t\t\t\t\tout[\"!range\"] = range;\n\t\t\t\t\t\tif(range.e.r > 0 && range.e.c > 0) {\n\t\t\t\t\t\t\trange.e.r--; range.e.c--;\n\t\t\t\t\t\t\tout[\"!ref\"] = encode_range(range);\n\t\t\t\t\t\t\trange.e.r++; range.e.c++;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif(mergecells.length > 0) out[\"!merges\"] = mergecells;\n\t\t\t\t\t\tif(objects.length > 0) out[\"!objects\"] = objects;\n\t\t\t\t\t}\n\t\t\t\t\tif(cur_sheet === \"\") Preamble = out; else Sheets[cur_sheet] = out;\n\t\t\t\t\tout = {};\n\t\t\t\t} break;\n\t\t\t\tcase 'BOF': {\n\t\t\t\t\tif(opts.biff !== 8);\n\t\t\t\t\telse if(val.BIFFVer === 0x0500) opts.biff = 5;\n\t\t\t\t\telse if(val.BIFFVer === 0x0002) opts.biff = 2;\n\t\t\t\t\telse if(val.BIFFVer === 0x0007) opts.biff = 2;\n\t\t\t\t\tif(file_depth++) break;\n\t\t\t\t\tcell_valid = true;\n\t\t\t\t\tout = {};\n\t\t\t\t\tif(opts.biff === 2) {\n\t\t\t\t\t\tif(cur_sheet === \"\") cur_sheet = \"Sheet1\";\n\t\t\t\t\t\trange = {s:{r:0,c:0},e:{r:0,c:0}};\n\t\t\t\t\t}\n\t\t\t\t\telse cur_sheet = (Directory[s] || {name:\"\"}).name;\n\t\t\t\t\tmergecells = [];\n\t\t\t\t\tobjects = [];\n\t\t\t\t} break;\n\t\t\t\tcase 'Number': case 'BIFF2NUM': {\n\t\t\t\t\ttemp_val = {ixfe: val.ixfe, XF: XFs[val.ixfe], v:val.val, t:'n'};\n\t\t\t\t\tif(temp_val.XF) safe_format_xf(temp_val, options, wb.opts.Date1904);\n\t\t\t\t\taddcell({c:val.c, r:val.r}, temp_val, options);\n\t\t\t\t} break;\n\t\t\t\tcase 'BoolErr': {\n\t\t\t\t\ttemp_val = {ixfe: val.ixfe, XF: XFs[val.ixfe], v:val.val, t:val.t};\n\t\t\t\t\tif(temp_val.XF) safe_format_xf(temp_val, options, wb.opts.Date1904);\n\t\t\t\t\taddcell({c:val.c, r:val.r}, temp_val, options);\n\t\t\t\t} break;\n\t\t\t\tcase 'RK': {\n\t\t\t\t\ttemp_val = {ixfe: val.ixfe, XF: XFs[val.ixfe], v:val.rknum, t:'n'};\n\t\t\t\t\tif(temp_val.XF) safe_format_xf(temp_val, options, wb.opts.Date1904);\n\t\t\t\t\taddcell({c:val.c, r:val.r}, temp_val, options);\n\t\t\t\t} break;\n\t\t\t\tcase 'MulRk': {\n\t\t\t\t\tfor(var j = val.c; j <= val.C; ++j) {\n\t\t\t\t\t\tvar ixfe = val.rkrec[j-val.c][0];\n\t\t\t\t\t\ttemp_val= {ixfe:ixfe, XF:XFs[ixfe], v:val.rkrec[j-val.c][1], t:'n'};\n\t\t\t\t\t\tif(temp_val.XF) safe_format_xf(temp_val, options, wb.opts.Date1904);\n\t\t\t\t\t\taddcell({c:j, r:val.r}, temp_val, options);\n\t\t\t\t\t}\n\t\t\t\t} break;\n\t\t\t\tcase 'Formula': {\n\t\t\t\t\tswitch(val.val) {\n\t\t\t\t\t\tcase 'String': last_formula = val; break;\n\t\t\t\t\t\tcase 'Array Formula': throw \"Array Formula unsupported\";\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\ttemp_val = {v:val.val, ixfe:val.cell.ixfe, t:val.tt};\n\t\t\t\t\t\t\ttemp_val.XF = XFs[temp_val.ixfe];\n\t\t\t\t\t\t\tif(options.cellFormula) temp_val.f = \"=\"+stringify_formula(val.formula,range,val.cell,supbooks, opts);\n\t\t\t\t\t\t\tif(temp_val.XF) safe_format_xf(temp_val, options, wb.opts.Date1904);\n\t\t\t\t\t\t\taddcell(val.cell, temp_val, options);\n\t\t\t\t\t\t\tlast_formula = val;\n\t\t\t\t\t}\n\t\t\t\t} break;\n\t\t\t\tcase 'String': {\n\t\t\t\t\tif(last_formula) {\n\t\t\t\t\t\tlast_formula.val = val;\n\t\t\t\t\t\ttemp_val = {v:last_formula.val, ixfe:last_formula.cell.ixfe, t:'s'};\n\t\t\t\t\t\ttemp_val.XF = XFs[temp_val.ixfe];\n\t\t\t\t\t\tif(options.cellFormula) temp_val.f = \"=\"+stringify_formula(last_formula.formula, range, last_formula.cell, supbooks, opts);\n\t\t\t\t\t\tif(temp_val.XF) safe_format_xf(temp_val, options, wb.opts.Date1904);\n\t\t\t\t\t\taddcell(last_formula.cell, temp_val, options);\n\t\t\t\t\t\tlast_formula = null;\n\t\t\t\t\t}\n\t\t\t\t} break;\n\t\t\t\tcase 'Array': {\n\t\t\t\t\tarray_formulae.push(val);\n\t\t\t\t} break;\n\t\t\t\tcase 'ShrFmla': {\n\t\t\t\t\tif(!cell_valid) break;\n\t\t\t\t\t//if(options.cellFormula) out[last_cell].f = stringify_formula(val[0], range, lastcell, supbooks, opts);\n\t\t\t\t\t/* TODO: capture range */\n\t\t\t\t\tshared_formulae[encode_cell(last_formula.cell)]= val[0];\n\t\t\t\t} break;\n\t\t\t\tcase 'LabelSst':\n\t\t\t\t\t//temp_val={v:sst[val.isst].t, ixfe:val.ixfe, t:'s'};\n\t\t\t\t\ttemp_val=make_cell(sst[val.isst].t, val.ixfe, 's');\n\t\t\t\t\ttemp_val.XF = XFs[temp_val.ixfe];\n\t\t\t\t\tif(temp_val.XF) safe_format_xf(temp_val, options, wb.opts.Date1904);\n\t\t\t\t\taddcell({c:val.c, r:val.r}, temp_val, options);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'Label': case 'BIFF2STR':\n\t\t\t\t\t/* Some writers erroneously write Label */\n\t\t\t\t\ttemp_val=make_cell(val.val, val.ixfe, 's');\n\t\t\t\t\ttemp_val.XF = XFs[temp_val.ixfe];\n\t\t\t\t\tif(temp_val.XF) safe_format_xf(temp_val, options, wb.opts.Date1904);\n\t\t\t\t\taddcell({c:val.c, r:val.r}, temp_val, options);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'Dimensions': {\n\t\t\t\t\tif(file_depth === 1) range = val; /* TODO: stack */\n\t\t\t\t} break;\n\t\t\t\tcase 'SST': {\n\t\t\t\t\tsst = val;\n\t\t\t\t} break;\n\t\t\t\tcase 'Format': { /* val = [id, fmt] */\n\t\t\t\t\tSSF.load(val[1], val[0]);\n\t\t\t\t} break;\n\n\t\t\t\tcase 'MergeCells': mergecells = mergecells.concat(val); break;\n\n\t\t\t\tcase 'Obj': objects[val.cmo[0]] = opts.lastobj = val; break;\n\t\t\t\tcase 'TxO': opts.lastobj.TxO = val; break;\n\n\t\t\t\tcase 'HLink': {\n\t\t\t\t\tfor(rngR = val[0].s.r; rngR <= val[0].e.r; ++rngR)\n\t\t\t\t\t\tfor(rngC = val[0].s.c; rngC <= val[0].e.c; ++rngC)\n\t\t\t\t\t\t\tif(out[encode_cell({c:rngC,r:rngR})])\n\t\t\t\t\t\t\t\tout[encode_cell({c:rngC,r:rngR})].l = val[1];\n\t\t\t\t} break;\n\t\t\t\tcase 'HLinkTooltip': {\n\t\t\t\t\tfor(rngR = val[0].s.r; rngR <= val[0].e.r; ++rngR)\n\t\t\t\t\t\tfor(rngC = val[0].s.c; rngC <= val[0].e.c; ++rngC)\n\t\t\t\t\t\t\tif(out[encode_cell({c:rngC,r:rngR})])\n\t\t\t\t\t\t\t\tout[encode_cell({c:rngC,r:rngR})].l.tooltip = val[1];\n\t\t\t\t} break;\n\n\t\t\t\t/* Comments */\n\t\t\t\tcase 'Note': {\n\t\t\t\t\tif(opts.biff <= 5 && opts.biff >= 2) break; /* TODO: BIFF5 */\n\t\t\t\t\tcc = out[encode_cell(val[0])];\n\t\t\t\t\tvar noteobj = objects[val[2]];\n\t\t\t\t\tif(!cc) break;\n\t\t\t\t\tif(!cc.c) cc.c = [];\n\t\t\t\t\tcmnt = {a:val[1],t:noteobj.TxO.t};\n\t\t\t\t\tcc.c.push(cmnt);\n\t\t\t\t} break;\n\n\t\t\t\tdefault: switch(R.n) { /* nested */\n\t\t\t\tcase 'ClrtClient': break;\n\t\t\t\tcase 'XFExt': update_xfext(XFs[val.ixfe], val.ext); break;\n\n\t\t\t\tcase 'NameCmt': break;\n\t\t\t\tcase 'Header': break; // TODO\n\t\t\t\tcase 'Footer': break; // TODO\n\t\t\t\tcase 'HCenter': break; // TODO\n\t\t\t\tcase 'VCenter': break; // TODO\n\t\t\t\tcase 'Pls': break; // TODO\n\t\t\t\tcase 'Setup': break; // TODO\n\t\t\t\tcase 'DefColWidth': break; // TODO\n\t\t\t\tcase 'GCW': break;\n\t\t\t\tcase 'LHRecord': break;\n\t\t\t\tcase 'ColInfo': break; // TODO\n\t\t\t\tcase 'Row': break; // TODO\n\t\t\t\tcase 'DBCell': break; // TODO\n\t\t\t\tcase 'MulBlank': break; // TODO\n\t\t\t\tcase 'EntExU2': break; // TODO\n\t\t\t\tcase 'SxView': break; // TODO\n\t\t\t\tcase 'Sxvd': break; // TODO\n\t\t\t\tcase 'SXVI': break; // TODO\n\t\t\t\tcase 'SXVDEx': break; // TODO\n\t\t\t\tcase 'SxIvd': break; // TODO\n\t\t\t\tcase 'SXDI': break; // TODO\n\t\t\t\tcase 'SXLI': break; // TODO\n\t\t\t\tcase 'SXEx': break; // TODO\n\t\t\t\tcase 'QsiSXTag': break; // TODO\n\t\t\t\tcase 'Selection': break;\n\t\t\t\tcase 'Feat': break;\n\t\t\t\tcase 'FeatHdr': case 'FeatHdr11': break;\n\t\t\t\tcase 'Feature11': case 'Feature12': case 'List12': break;\n\t\t\t\tcase 'Blank': break;\n\t\t\t\tcase 'Country': country = val; break;\n\t\t\t\tcase 'RecalcId': break;\n\t\t\t\tcase 'DefaultRowHeight': case 'DxGCol': break; // TODO: htmlify\n\t\t\t\tcase 'Fbi': case 'Fbi2': case 'GelFrame': break;\n\t\t\t\tcase 'Font': break; // TODO\n\t\t\t\tcase 'XFCRC': break; // TODO\n\t\t\t\tcase 'Style': break; // TODO\n\t\t\t\tcase 'StyleExt': break; // TODO\n\t\t\t\tcase 'Palette': palette = val; break; // TODO\n\t\t\t\tcase 'Theme': break; // TODO\n\t\t\t\t/* Protection */\n\t\t\t\tcase 'ScenarioProtect': break;\n\t\t\t\tcase 'ObjProtect': break;\n\n\t\t\t\t/* Conditional Formatting */\n\t\t\t\tcase 'CondFmt12': break;\n\n\t\t\t\t/* Table */\n\t\t\t\tcase 'Table': break; // TODO\n\t\t\t\tcase 'TableStyles': break; // TODO\n\t\t\t\tcase 'TableStyle': break; // TODO\n\t\t\t\tcase 'TableStyleElement': break; // TODO\n\n\t\t\t\t/* PivotTable */\n\t\t\t\tcase 'SXStreamID': break; // TODO\n\t\t\t\tcase 'SXVS': break; // TODO\n\t\t\t\tcase 'DConRef': break; // TODO\n\t\t\t\tcase 'SXAddl': break; // TODO\n\t\t\t\tcase 'DConBin': break; // TODO\n\t\t\t\tcase 'DConName': break; // TODO\n\t\t\t\tcase 'SXPI': break; // TODO\n\t\t\t\tcase 'SxFormat': break; // TODO\n\t\t\t\tcase 'SxSelect': break; // TODO\n\t\t\t\tcase 'SxRule': break; // TODO\n\t\t\t\tcase 'SxFilt': break; // TODO\n\t\t\t\tcase 'SxItm': break; // TODO\n\t\t\t\tcase 'SxDXF': break; // TODO\n\n\t\t\t\t/* Scenario Manager */\n\t\t\t\tcase 'ScenMan': break;\n\n\t\t\t\t/* Data Consolidation */\n\t\t\t\tcase 'DCon': break;\n\n\t\t\t\t/* Watched Cell */\n\t\t\t\tcase 'CellWatch': break;\n\n\t\t\t\t/* Print Settings */\n\t\t\t\tcase 'PrintRowCol': break;\n\t\t\t\tcase 'PrintGrid': break;\n\t\t\t\tcase 'PrintSize': break;\n\n\t\t\t\tcase 'XCT': break;\n\t\t\t\tcase 'CRN': break;\n\n\t\t\t\tcase 'Scl': {\n\t\t\t\t\t//console.log(\"Zoom Level:\", val[0]/val[1],val);\n\t\t\t\t} break;\n\t\t\t\tcase 'SheetExt': {\n\n\t\t\t\t} break;\n\t\t\t\tcase 'SheetExtOptional': {\n\n\t\t\t\t} break;\n\n\t\t\t\t/* VBA */\n\t\t\t\tcase 'ObNoMacros': {\n\n\t\t\t\t} break;\n\t\t\t\tcase 'ObProj': {\n\n\t\t\t\t} break;\n\t\t\t\tcase 'CodeName': {\n\n\t\t\t\t} break;\n\t\t\t\tcase 'GUIDTypeLib': {\n\n\t\t\t\t} break;\n\n\t\t\t\tcase 'WOpt': break; // TODO: WTF?\n\t\t\t\tcase 'PhoneticInfo': break;\n\n\t\t\t\tcase 'OleObjectSize': break;\n\n\t\t\t\t/* Differential Formatting */\n\t\t\t\tcase 'DXF': case 'DXFN': case 'DXFN12': case 'DXFN12List': case 'DXFN12NoCB': break;\n\n\t\t\t\t/* Data Validation */\n\t\t\t\tcase 'Dv': case 'DVal': break;\n\n\t\t\t\t/* Data Series */\n\t\t\t\tcase 'BRAI': case 'Series': case 'SeriesText': break;\n\n\t\t\t\t/* Data Connection */\n\t\t\t\tcase 'DConn': break;\n\t\t\t\tcase 'DbOrParamQry': break;\n\t\t\t\tcase 'DBQueryExt': break;\n\n\t\t\t\t/* Formatting */\n\t\t\t\tcase 'IFmtRecord': break;\n\t\t\t\tcase 'CondFmt': case 'CF': case 'CF12': case 'CFEx': break;\n\n\t\t\t\t/* Explicitly Ignored */\n\t\t\t\tcase 'Excel9File': break;\n\t\t\t\tcase 'Units': break;\n\t\t\t\tcase 'InterfaceHdr': case 'Mms': case 'InterfaceEnd': case 'DSF': case 'BuiltInFnGroupCount':\n\t\t\t\t/* View Stuff */\n\t\t\t\tcase 'Window1': case 'Window2': case 'HideObj': case 'GridSet': case 'Guts':\n\t\t\t\tcase 'UserBView': case 'UserSViewBegin': case 'UserSViewEnd':\n\t\t\t\tcase 'Pane': break;\n\t\t\t\tdefault: switch(R.n) { /* nested */\n\t\t\t\t/* Chart */\n\t\t\t\tcase 'Dat':\n\t\t\t\tcase 'Begin': case 'End':\n\t\t\t\tcase 'StartBlock': case 'EndBlock':\n\t\t\t\tcase 'Frame': case 'Area':\n\t\t\t\tcase 'Axis': case 'AxisLine': case 'Tick': break;\n\t\t\t\tcase 'AxesUsed':\n\t\t\t\tcase 'CrtLayout12': case 'CrtLayout12A': case 'CrtLink': case 'CrtLine': case 'CrtMlFrt': case 'CrtMlFrtContinue': break;\n\t\t\t\tcase 'LineFormat': case 'AreaFormat':\n\t\t\t\tcase 'Chart': case 'Chart3d': case 'Chart3DBarShape': case 'ChartFormat': case 'ChartFrtInfo': break;\n\t\t\t\tcase 'PlotArea': case 'PlotGrowth': break;\n\t\t\t\tcase 'SeriesList': case 'SerParent': case 'SerAuxTrend': break;\n\t\t\t\tcase 'DataFormat': case 'SerToCrt': case 'FontX': break;\n\t\t\t\tcase 'CatSerRange': case 'AxcExt': case 'SerFmt': break;\n\t\t\t\tcase 'ShtProps': break;\n\t\t\t\tcase 'DefaultText': case 'Text': case 'CatLab': break;\n\t\t\t\tcase 'DataLabExtContents': break;\n\t\t\t\tcase 'Legend': case 'LegendException': break;\n\t\t\t\tcase 'Pie': case 'Scatter': break;\n\t\t\t\tcase 'PieFormat': case 'MarkerFormat': break;\n\t\t\t\tcase 'StartObject': case 'EndObject': break;\n\t\t\t\tcase 'AlRuns': case 'ObjectLink': break;\n\t\t\t\tcase 'SIIndex': break;\n\t\t\t\tcase 'AttachedLabel': case 'YMult': break;\n\n\t\t\t\t/* Chart Group */\n\t\t\t\tcase 'Line': case 'Bar': break;\n\t\t\t\tcase 'Surf': break;\n\n\t\t\t\t/* Axis Group */\n\t\t\t\tcase 'AxisParent': break;\n\t\t\t\tcase 'Pos': break;\n\t\t\t\tcase 'ValueRange': break;\n\n\t\t\t\t/* Pivot Chart */\n\t\t\t\tcase 'SXViewEx9': break; // TODO\n\t\t\t\tcase 'SXViewLink': break;\n\t\t\t\tcase 'PivotChartBits': break;\n\t\t\t\tcase 'SBaseRef': break;\n\t\t\t\tcase 'TextPropsStream': break;\n\n\t\t\t\t/* Chart Misc */\n\t\t\t\tcase 'LnExt': break;\n\t\t\t\tcase 'MkrExt': break;\n\t\t\t\tcase 'CrtCoopt': break;\n\n\t\t\t\t/* Query Table */\n\t\t\t\tcase 'Qsi': case 'Qsif': case 'Qsir': case 'QsiSXTag': break;\n\t\t\t\tcase 'TxtQry': break;\n\n\t\t\t\t/* Filter */\n\t\t\t\tcase 'FilterMode': break;\n\t\t\t\tcase 'AutoFilter': case 'AutoFilterInfo': break;\n\t\t\t\tcase 'AutoFilter12': break;\n\t\t\t\tcase 'DropDownObjIds': break;\n\t\t\t\tcase 'Sort': break;\n\t\t\t\tcase 'SortData': break;\n\n\t\t\t\t/* Drawing */\n\t\t\t\tcase 'ShapePropsStream': break;\n\t\t\t\tcase 'MsoDrawing': case 'MsoDrawingGroup': case 'MsoDrawingSelection': break;\n\t\t\t\tcase 'ImData': break;\n\t\t\t\t/* Pub Stuff */\n\t\t\t\tcase 'WebPub': case 'AutoWebPub':\n\n\t\t\t\t/* Print Stuff */\n\t\t\t\tcase 'RightMargin': case 'LeftMargin': case 'TopMargin': case 'BottomMargin':\n\t\t\t\tcase 'HeaderFooter': case 'HFPicture': case 'PLV':\n\t\t\t\tcase 'HorizontalPageBreaks': case 'VerticalPageBreaks':\n\t\t\t\t/* Behavioral */\n\t\t\t\tcase 'Backup': case 'CompressPictures': case 'Compat12': break;\n\n\t\t\t\t/* Should not Happen */\n\t\t\t\tcase 'Continue': case 'ContinueFrt12': break;\n\n\t\t\t\t/* Future Records */\n\t\t\t\tcase 'FrtFontList': case 'FrtWrapper': break;\n\n\t\t\t\t/* BIFF5 records */\n\t\t\t\tcase 'ExternCount': break;\n\t\t\t\tcase 'RString': break;\n\t\t\t\tcase 'TabIdConf': case 'Radar': case 'RadarArea': case 'DropBar': case 'Intl': case 'CoordList': case 'SerAuxErrBar': break;\n\n\t\t\t\tdefault: switch(R.n) { /* nested */\n\t\t\t\t/* Miscellaneous */\n\t\t\t\tcase 'SCENARIO': case 'DConBin': case 'PicF': case 'DataLabExt':\n\t\t\t\tcase 'Lel': case 'BopPop': case 'BopPopCustom': case 'RealTimeData':\n\t\t\t\tcase 'Name': break;\n\t\t\t\tdefault: if(options.WTF) throw 'Unrecognized Record ' + R.n;\n\t\t\t}}}}\n\t\t} else blob.l += length;\n\t}\n\tvar sheetnamesraw = opts.biff === 2 ? ['Sheet1'] : Object.keys(Directory).sort(function(a,b) { return Number(a) - Number(b); }).map(function(x){return Directory[x].name;});\n\tvar sheetnames = sheetnamesraw.slice();\n\twb.Directory=sheetnamesraw;\n\twb.SheetNames=sheetnamesraw;\n\tif(!options.bookSheets) wb.Sheets=Sheets;\n\twb.Preamble=Preamble;\n\twb.Strings = sst;\n\twb.SSF = SSF.get_table();\n\tif(opts.enc) wb.Encryption = opts.enc;\n\twb.Metadata = {};\n\tif(country !== undefined) wb.Metadata.Country = country;\n\treturn wb;\n}\n\nfunction parse_xlscfb(cfb, options) {\nif(!options) options = {};\nfix_read_opts(options);\nreset_cp();\nvar CompObj, Summary, Workbook;\nif(cfb.find) {\n\tCompObj = cfb.find('!CompObj');\n\tSummary = cfb.find('!SummaryInformation');\n\tWorkbook = cfb.find('/Workbook');\n} else {\n\tprep_blob(cfb, 0);\n\tWorkbook = {content: cfb};\n}\n\nif(!Workbook) Workbook = cfb.find('/Book');\nvar CompObjP, SummaryP, WorkbookP;\n\nif(CompObj) CompObjP = parse_compobj(CompObj);\nif(options.bookProps && !options.bookSheets) WorkbookP = {};\nelse {\n\tif(Workbook) WorkbookP = parse_workbook(Workbook.content, options, !!Workbook.find);\n\telse throw new Error(\"Cannot find Workbook stream\");\n}\n\nif(cfb.find) parse_props(cfb);\n\nvar props = {};\nfor(var y in cfb.Summary) props[y] = cfb.Summary[y];\nfor(y in cfb.DocSummary) props[y] = cfb.DocSummary[y];\nWorkbookP.Props = WorkbookP.Custprops = props; /* TODO: split up properties */\nif(options.bookFiles) WorkbookP.cfb = cfb;\nWorkbookP.CompObjP = CompObjP;\nreturn WorkbookP;\n}\n\n/* TODO: WTF */\nfunction parse_props(cfb) {\n\t/* [MS-OSHARED] 2.3.3.2.2 Document Summary Information Property Set */\n\tvar DSI = cfb.find('!DocumentSummaryInformation');\n\tif(DSI) try { cfb.DocSummary = parse_PropertySetStream(DSI, DocSummaryPIDDSI); } catch(e) {}\n\n\t/* [MS-OSHARED] 2.3.3.2.1 Summary Information Property Set*/\n\tvar SI = cfb.find('!SummaryInformation');\n\tif(SI) try { cfb.Summary = parse_PropertySetStream(SI, SummaryPIDSI); } catch(e) {}\n}\n\n/* [MS-XLSB] 2.3 Record Enumeration */\nvar XLSBRecordEnum = {\n\t0x0000: { n:\"BrtRowHdr\", f:parse_BrtRowHdr },\n\t0x0001: { n:\"BrtCellBlank\", f:parse_BrtCellBlank },\n\t0x0002: { n:\"BrtCellRk\", f:parse_BrtCellRk },\n\t0x0003: { n:\"BrtCellError\", f:parse_BrtCellError },\n\t0x0004: { n:\"BrtCellBool\", f:parse_BrtCellBool },\n\t0x0005: { n:\"BrtCellReal\", f:parse_BrtCellReal },\n\t0x0006: { n:\"BrtCellSt\", f:parse_BrtCellSt },\n\t0x0007: { n:\"BrtCellIsst\", f:parse_BrtCellIsst },\n\t0x0008: { n:\"BrtFmlaString\", f:parse_BrtFmlaString },\n\t0x0009: { n:\"BrtFmlaNum\", f:parse_BrtFmlaNum },\n\t0x000A: { n:\"BrtFmlaBool\", f:parse_BrtFmlaBool },\n\t0x000B: { n:\"BrtFmlaError\", f:parse_BrtFmlaError },\n\t0x0010: { n:\"BrtFRTArchID$\", f:parse_BrtFRTArchID$ },\n\t0x0013: { n:\"BrtSSTItem\", f:parse_RichStr },\n\t0x0014: { n:\"BrtPCDIMissing\", f:parsenoop },\n\t0x0015: { n:\"BrtPCDINumber\", f:parsenoop },\n\t0x0016: { n:\"BrtPCDIBoolean\", f:parsenoop },\n\t0x0017: { n:\"BrtPCDIError\", f:parsenoop },\n\t0x0018: { n:\"BrtPCDIString\", f:parsenoop },\n\t0x0019: { n:\"BrtPCDIDatetime\", f:parsenoop },\n\t0x001A: { n:\"BrtPCDIIndex\", f:parsenoop },\n\t0x001B: { n:\"BrtPCDIAMissing\", f:parsenoop },\n\t0x001C: { n:\"BrtPCDIANumber\", f:parsenoop },\n\t0x001D: { n:\"BrtPCDIABoolean\", f:parsenoop },\n\t0x001E: { n:\"BrtPCDIAError\", f:parsenoop },\n\t0x001F: { n:\"BrtPCDIAString\", f:parsenoop },\n\t0x0020: { n:\"BrtPCDIADatetime\", f:parsenoop },\n\t0x0021: { n:\"BrtPCRRecord\", f:parsenoop },\n\t0x0022: { n:\"BrtPCRRecordDt\", f:parsenoop },\n\t0x0023: { n:\"BrtFRTBegin\", f:parsenoop },\n\t0x0024: { n:\"BrtFRTEnd\", f:parsenoop },\n\t0x0025: { n:\"BrtACBegin\", f:parsenoop },\n\t0x0026: { n:\"BrtACEnd\", f:parsenoop },\n\t0x0027: { n:\"BrtName\", f:parsenoop },\n\t0x0028: { n:\"BrtIndexRowBlock\", f:parsenoop },\n\t0x002A: { n:\"BrtIndexBlock\", f:parsenoop },\n\t0x002B: { n:\"BrtFont\", f:parse_BrtFont },\n\t0x002C: { n:\"BrtFmt\", f:parse_BrtFmt },\n\t0x002D: { n:\"BrtFill\", f:parsenoop },\n\t0x002E: { n:\"BrtBorder\", f:parsenoop },\n\t0x002F: { n:\"BrtXF\", f:parse_BrtXF },\n\t0x0030: { n:\"BrtStyle\", f:parsenoop },\n\t0x0031: { n:\"BrtCellMeta\", f:parsenoop },\n\t0x0032: { n:\"BrtValueMeta\", f:parsenoop },\n\t0x0033: { n:\"BrtMdb\", f:parsenoop },\n\t0x0034: { n:\"BrtBeginFmd\", f:parsenoop },\n\t0x0035: { n:\"BrtEndFmd\", f:parsenoop },\n\t0x0036: { n:\"BrtBeginMdx\", f:parsenoop },\n\t0x0037: { n:\"BrtEndMdx\", f:parsenoop },\n\t0x0038: { n:\"BrtBeginMdxTuple\", f:parsenoop },\n\t0x0039: { n:\"BrtEndMdxTuple\", f:parsenoop },\n\t0x003A: { n:\"BrtMdxMbrIstr\", f:parsenoop },\n\t0x003B: { n:\"BrtStr\", f:parsenoop },\n\t0x003C: { n:\"BrtColInfo\", f:parsenoop },\n\t0x003E: { n:\"BrtCellRString\", f:parsenoop },\n\t0x003F: { n:\"BrtCalcChainItem$\", f:parse_BrtCalcChainItem$ },\n\t0x0040: { n:\"BrtDVal\", f:parsenoop },\n\t0x0041: { n:\"BrtSxvcellNum\", f:parsenoop },\n\t0x0042: { n:\"BrtSxvcellStr\", f:parsenoop },\n\t0x0043: { n:\"BrtSxvcellBool\", f:parsenoop },\n\t0x0044: { n:\"BrtSxvcellErr\", f:parsenoop },\n\t0x0045: { n:\"BrtSxvcellDate\", f:parsenoop },\n\t0x0046: { n:\"BrtSxvcellNil\", f:parsenoop },\n\t0x0080: { n:\"BrtFileVersion\", f:parsenoop },\n\t0x0081: { n:\"BrtBeginSheet\", f:parsenoop },\n\t0x0082: { n:\"BrtEndSheet\", f:parsenoop },\n\t0x0083: { n:\"BrtBeginBook\", f:parsenoop, p:0 },\n\t0x0084: { n:\"BrtEndBook\", f:parsenoop },\n\t0x0085: { n:\"BrtBeginWsViews\", f:parsenoop },\n\t0x0086: { n:\"BrtEndWsViews\", f:parsenoop },\n\t0x0087: { n:\"BrtBeginBookViews\", f:parsenoop },\n\t0x0088: { n:\"BrtEndBookViews\", f:parsenoop },\n\t0x0089: { n:\"BrtBeginWsView\", f:parsenoop },\n\t0x008A: { n:\"BrtEndWsView\", f:parsenoop },\n\t0x008B: { n:\"BrtBeginCsViews\", f:parsenoop },\n\t0x008C: { n:\"BrtEndCsViews\", f:parsenoop },\n\t0x008D: { n:\"BrtBeginCsView\", f:parsenoop },\n\t0x008E: { n:\"BrtEndCsView\", f:parsenoop },\n\t0x008F: { n:\"BrtBeginBundleShs\", f:parsenoop },\n\t0x0090: { n:\"BrtEndBundleShs\", f:parsenoop },\n\t0x0091: { n:\"BrtBeginSheetData\", f:parsenoop },\n\t0x0092: { n:\"BrtEndSheetData\", f:parsenoop },\n\t0x0093: { n:\"BrtWsProp\", f:parse_BrtWsProp },\n\t0x0094: { n:\"BrtWsDim\", f:parse_BrtWsDim, p:16 },\n\t0x0097: { n:\"BrtPane\", f:parsenoop },\n\t0x0098: { n:\"BrtSel\", f:parsenoop },\n\t0x0099: { n:\"BrtWbProp\", f:parse_BrtWbProp },\n\t0x009A: { n:\"BrtWbFactoid\", f:parsenoop },\n\t0x009B: { n:\"BrtFileRecover\", f:parsenoop },\n\t0x009C: { n:\"BrtBundleSh\", f:parse_BrtBundleSh },\n\t0x009D: { n:\"BrtCalcProp\", f:parsenoop },\n\t0x009E: { n:\"BrtBookView\", f:parsenoop },\n\t0x009F: { n:\"BrtBeginSst\", f:parse_BrtBeginSst },\n\t0x00A0: { n:\"BrtEndSst\", f:parsenoop },\n\t0x00A1: { n:\"BrtBeginAFilter\", f:parsenoop },\n\t0x00A2: { n:\"BrtEndAFilter\", f:parsenoop },\n\t0x00A3: { n:\"BrtBeginFilterColumn\", f:parsenoop },\n\t0x00A4: { n:\"BrtEndFilterColumn\", f:parsenoop },\n\t0x00A5: { n:\"BrtBeginFilters\", f:parsenoop },\n\t0x00A6: { n:\"BrtEndFilters\", f:parsenoop },\n\t0x00A7: { n:\"BrtFilter\", f:parsenoop },\n\t0x00A8: { n:\"BrtColorFilter\", f:parsenoop },\n\t0x00A9: { n:\"BrtIconFilter\", f:parsenoop },\n\t0x00AA: { n:\"BrtTop10Filter\", f:parsenoop },\n\t0x00AB: { n:\"BrtDynamicFilter\", f:parsenoop },\n\t0x00AC: { n:\"BrtBeginCustomFilters\", f:parsenoop },\n\t0x00AD: { n:\"BrtEndCustomFilters\", f:parsenoop },\n\t0x00AE: { n:\"BrtCustomFilter\", f:parsenoop },\n\t0x00AF: { n:\"BrtAFilterDateGroupItem\", f:parsenoop },\n\t0x00B0: { n:\"BrtMergeCell\", f:parse_BrtMergeCell },\n\t0x00B1: { n:\"BrtBeginMergeCells\", f:parsenoop },\n\t0x00B2: { n:\"BrtEndMergeCells\", f:parsenoop },\n\t0x00B3: { n:\"BrtBeginPivotCacheDef\", f:parsenoop },\n\t0x00B4: { n:\"BrtEndPivotCacheDef\", f:parsenoop },\n\t0x00B5: { n:\"BrtBeginPCDFields\", f:parsenoop },\n\t0x00B6: { n:\"BrtEndPCDFields\", f:parsenoop },\n\t0x00B7: { n:\"BrtBeginPCDField\", f:parsenoop },\n\t0x00B8: { n:\"BrtEndPCDField\", f:parsenoop },\n\t0x00B9: { n:\"BrtBeginPCDSource\", f:parsenoop },\n\t0x00BA: { n:\"BrtEndPCDSource\", f:parsenoop },\n\t0x00BB: { n:\"BrtBeginPCDSRange\", f:parsenoop },\n\t0x00BC: { n:\"BrtEndPCDSRange\", f:parsenoop },\n\t0x00BD: { n:\"BrtBeginPCDFAtbl\", f:parsenoop },\n\t0x00BE: { n:\"BrtEndPCDFAtbl\", f:parsenoop },\n\t0x00BF: { n:\"BrtBeginPCDIRun\", f:parsenoop },\n\t0x00C0: { n:\"BrtEndPCDIRun\", f:parsenoop },\n\t0x00C1: { n:\"BrtBeginPivotCacheRecords\", f:parsenoop },\n\t0x00C2: { n:\"BrtEndPivotCacheRecords\", f:parsenoop },\n\t0x00C3: { n:\"BrtBeginPCDHierarchies\", f:parsenoop },\n\t0x00C4: { n:\"BrtEndPCDHierarchies\", f:parsenoop },\n\t0x00C5: { n:\"BrtBeginPCDHierarchy\", f:parsenoop },\n\t0x00C6: { n:\"BrtEndPCDHierarchy\", f:parsenoop },\n\t0x00C7: { n:\"BrtBeginPCDHFieldsUsage\", f:parsenoop },\n\t0x00C8: { n:\"BrtEndPCDHFieldsUsage\", f:parsenoop },\n\t0x00C9: { n:\"BrtBeginExtConnection\", f:parsenoop },\n\t0x00CA: { n:\"BrtEndExtConnection\", f:parsenoop },\n\t0x00CB: { n:\"BrtBeginECDbProps\", f:parsenoop },\n\t0x00CC: { n:\"BrtEndECDbProps\", f:parsenoop },\n\t0x00CD: { n:\"BrtBeginECOlapProps\", f:parsenoop },\n\t0x00CE: { n:\"BrtEndECOlapProps\", f:parsenoop },\n\t0x00CF: { n:\"BrtBeginPCDSConsol\", f:parsenoop },\n\t0x00D0: { n:\"BrtEndPCDSConsol\", f:parsenoop },\n\t0x00D1: { n:\"BrtBeginPCDSCPages\", f:parsenoop },\n\t0x00D2: { n:\"BrtEndPCDSCPages\", f:parsenoop },\n\t0x00D3: { n:\"BrtBeginPCDSCPage\", f:parsenoop },\n\t0x00D4: { n:\"BrtEndPCDSCPage\", f:parsenoop },\n\t0x00D5: { n:\"BrtBeginPCDSCPItem\", f:parsenoop },\n\t0x00D6: { n:\"BrtEndPCDSCPItem\", f:parsenoop },\n\t0x00D7: { n:\"BrtBeginPCDSCSets\", f:parsenoop },\n\t0x00D8: { n:\"BrtEndPCDSCSets\", f:parsenoop },\n\t0x00D9: { n:\"BrtBeginPCDSCSet\", f:parsenoop },\n\t0x00DA: { n:\"BrtEndPCDSCSet\", f:parsenoop },\n\t0x00DB: { n:\"BrtBeginPCDFGroup\", f:parsenoop },\n\t0x00DC: { n:\"BrtEndPCDFGroup\", f:parsenoop },\n\t0x00DD: { n:\"BrtBeginPCDFGItems\", f:parsenoop },\n\t0x00DE: { n:\"BrtEndPCDFGItems\", f:parsenoop },\n\t0x00DF: { n:\"BrtBeginPCDFGRange\", f:parsenoop },\n\t0x00E0: { n:\"BrtEndPCDFGRange\", f:parsenoop },\n\t0x00E1: { n:\"BrtBeginPCDFGDiscrete\", f:parsenoop },\n\t0x00E2: { n:\"BrtEndPCDFGDiscrete\", f:parsenoop },\n\t0x00E3: { n:\"BrtBeginPCDSDTupleCache\", f:parsenoop },\n\t0x00E4: { n:\"BrtEndPCDSDTupleCache\", f:parsenoop },\n\t0x00E5: { n:\"BrtBeginPCDSDTCEntries\", f:parsenoop },\n\t0x00E6: { n:\"BrtEndPCDSDTCEntries\", f:parsenoop },\n\t0x00E7: { n:\"BrtBeginPCDSDTCEMembers\", f:parsenoop },\n\t0x00E8: { n:\"BrtEndPCDSDTCEMembers\", f:parsenoop },\n\t0x00E9: { n:\"BrtBeginPCDSDTCEMember\", f:parsenoop },\n\t0x00EA: { n:\"BrtEndPCDSDTCEMember\", f:parsenoop },\n\t0x00EB: { n:\"BrtBeginPCDSDTCQueries\", f:parsenoop },\n\t0x00EC: { n:\"BrtEndPCDSDTCQueries\", f:parsenoop },\n\t0x00ED: { n:\"BrtBeginPCDSDTCQuery\", f:parsenoop },\n\t0x00EE: { n:\"BrtEndPCDSDTCQuery\", f:parsenoop },\n\t0x00EF: { n:\"BrtBeginPCDSDTCSets\", f:parsenoop },\n\t0x00F0: { n:\"BrtEndPCDSDTCSets\", f:parsenoop },\n\t0x00F1: { n:\"BrtBeginPCDSDTCSet\", f:parsenoop },\n\t0x00F2: { n:\"BrtEndPCDSDTCSet\", f:parsenoop },\n\t0x00F3: { n:\"BrtBeginPCDCalcItems\", f:parsenoop },\n\t0x00F4: { n:\"BrtEndPCDCalcItems\", f:parsenoop },\n\t0x00F5: { n:\"BrtBeginPCDCalcItem\", f:parsenoop },\n\t0x00F6: { n:\"BrtEndPCDCalcItem\", f:parsenoop },\n\t0x00F7: { n:\"BrtBeginPRule\", f:parsenoop },\n\t0x00F8: { n:\"BrtEndPRule\", f:parsenoop },\n\t0x00F9: { n:\"BrtBeginPRFilters\", f:parsenoop },\n\t0x00FA: { n:\"BrtEndPRFilters\", f:parsenoop },\n\t0x00FB: { n:\"BrtBeginPRFilter\", f:parsenoop },\n\t0x00FC: { n:\"BrtEndPRFilter\", f:parsenoop },\n\t0x00FD: { n:\"BrtBeginPNames\", f:parsenoop },\n\t0x00FE: { n:\"BrtEndPNames\", f:parsenoop },\n\t0x00FF: { n:\"BrtBeginPName\", f:parsenoop },\n\t0x0100: { n:\"BrtEndPName\", f:parsenoop },\n\t0x0101: { n:\"BrtBeginPNPairs\", f:parsenoop },\n\t0x0102: { n:\"BrtEndPNPairs\", f:parsenoop },\n\t0x0103: { n:\"BrtBeginPNPair\", f:parsenoop },\n\t0x0104: { n:\"BrtEndPNPair\", f:parsenoop },\n\t0x0105: { n:\"BrtBeginECWebProps\", f:parsenoop },\n\t0x0106: { n:\"BrtEndECWebProps\", f:parsenoop },\n\t0x0107: { n:\"BrtBeginEcWpTables\", f:parsenoop },\n\t0x0108: { n:\"BrtEndECWPTables\", f:parsenoop },\n\t0x0109: { n:\"BrtBeginECParams\", f:parsenoop },\n\t0x010A: { n:\"BrtEndECParams\", f:parsenoop },\n\t0x010B: { n:\"BrtBeginECParam\", f:parsenoop },\n\t0x010C: { n:\"BrtEndECParam\", f:parsenoop },\n\t0x010D: { n:\"BrtBeginPCDKPIs\", f:parsenoop },\n\t0x010E: { n:\"BrtEndPCDKPIs\", f:parsenoop },\n\t0x010F: { n:\"BrtBeginPCDKPI\", f:parsenoop },\n\t0x0110: { n:\"BrtEndPCDKPI\", f:parsenoop },\n\t0x0111: { n:\"BrtBeginDims\", f:parsenoop },\n\t0x0112: { n:\"BrtEndDims\", f:parsenoop },\n\t0x0113: { n:\"BrtBeginDim\", f:parsenoop },\n\t0x0114: { n:\"BrtEndDim\", f:parsenoop },\n\t0x0115: { n:\"BrtIndexPartEnd\", f:parsenoop },\n\t0x0116: { n:\"BrtBeginStyleSheet\", f:parsenoop },\n\t0x0117: { n:\"BrtEndStyleSheet\", f:parsenoop },\n\t0x0118: { n:\"BrtBeginSXView\", f:parsenoop },\n\t0x0119: { n:\"BrtEndSXVI\", f:parsenoop },\n\t0x011A: { n:\"BrtBeginSXVI\", f:parsenoop },\n\t0x011B: { n:\"BrtBeginSXVIs\", f:parsenoop },\n\t0x011C: { n:\"BrtEndSXVIs\", f:parsenoop },\n\t0x011D: { n:\"BrtBeginSXVD\", f:parsenoop },\n\t0x011E: { n:\"BrtEndSXVD\", f:parsenoop },\n\t0x011F: { n:\"BrtBeginSXVDs\", f:parsenoop },\n\t0x0120: { n:\"BrtEndSXVDs\", f:parsenoop },\n\t0x0121: { n:\"BrtBeginSXPI\", f:parsenoop },\n\t0x0122: { n:\"BrtEndSXPI\", f:parsenoop },\n\t0x0123: { n:\"BrtBeginSXPIs\", f:parsenoop },\n\t0x0124: { n:\"BrtEndSXPIs\", f:parsenoop },\n\t0x0125: { n:\"BrtBeginSXDI\", f:parsenoop },\n\t0x0126: { n:\"BrtEndSXDI\", f:parsenoop },\n\t0x0127: { n:\"BrtBeginSXDIs\", f:parsenoop },\n\t0x0128: { n:\"BrtEndSXDIs\", f:parsenoop },\n\t0x0129: { n:\"BrtBeginSXLI\", f:parsenoop },\n\t0x012A: { n:\"BrtEndSXLI\", f:parsenoop },\n\t0x012B: { n:\"BrtBeginSXLIRws\", f:parsenoop },\n\t0x012C: { n:\"BrtEndSXLIRws\", f:parsenoop },\n\t0x012D: { n:\"BrtBeginSXLICols\", f:parsenoop },\n\t0x012E: { n:\"BrtEndSXLICols\", f:parsenoop },\n\t0x012F: { n:\"BrtBeginSXFormat\", f:parsenoop },\n\t0x0130: { n:\"BrtEndSXFormat\", f:parsenoop },\n\t0x0131: { n:\"BrtBeginSXFormats\", f:parsenoop },\n\t0x0132: { n:\"BrtEndSxFormats\", f:parsenoop },\n\t0x0133: { n:\"BrtBeginSxSelect\", f:parsenoop },\n\t0x0134: { n:\"BrtEndSxSelect\", f:parsenoop },\n\t0x0135: { n:\"BrtBeginISXVDRws\", f:parsenoop },\n\t0x0136: { n:\"BrtEndISXVDRws\", f:parsenoop },\n\t0x0137: { n:\"BrtBeginISXVDCols\", f:parsenoop },\n\t0x0138: { n:\"BrtEndISXVDCols\", f:parsenoop },\n\t0x0139: { n:\"BrtEndSXLocation\", f:parsenoop },\n\t0x013A: { n:\"BrtBeginSXLocation\", f:parsenoop },\n\t0x013B: { n:\"BrtEndSXView\", f:parsenoop },\n\t0x013C: { n:\"BrtBeginSXTHs\", f:parsenoop },\n\t0x013D: { n:\"BrtEndSXTHs\", f:parsenoop },\n\t0x013E: { n:\"BrtBeginSXTH\", f:parsenoop },\n\t0x013F: { n:\"BrtEndSXTH\", f:parsenoop },\n\t0x0140: { n:\"BrtBeginISXTHRws\", f:parsenoop },\n\t0x0141: { n:\"BrtEndISXTHRws\", f:parsenoop },\n\t0x0142: { n:\"BrtBeginISXTHCols\", f:parsenoop },\n\t0x0143: { n:\"BrtEndISXTHCols\", f:parsenoop },\n\t0x0144: { n:\"BrtBeginSXTDMPS\", f:parsenoop },\n\t0x0145: { n:\"BrtEndSXTDMPs\", f:parsenoop },\n\t0x0146: { n:\"BrtBeginSXTDMP\", f:parsenoop },\n\t0x0147: { n:\"BrtEndSXTDMP\", f:parsenoop },\n\t0x0148: { n:\"BrtBeginSXTHItems\", f:parsenoop },\n\t0x0149: { n:\"BrtEndSXTHItems\", f:parsenoop },\n\t0x014A: { n:\"BrtBeginSXTHItem\", f:parsenoop },\n\t0x014B: { n:\"BrtEndSXTHItem\", f:parsenoop },\n\t0x014C: { n:\"BrtBeginMetadata\", f:parsenoop },\n\t0x014D: { n:\"BrtEndMetadata\", f:parsenoop },\n\t0x014E: { n:\"BrtBeginEsmdtinfo\", f:parsenoop },\n\t0x014F: { n:\"BrtMdtinfo\", f:parsenoop },\n\t0x0150: { n:\"BrtEndEsmdtinfo\", f:parsenoop },\n\t0x0151: { n:\"BrtBeginEsmdb\", f:parsenoop },\n\t0x0152: { n:\"BrtEndEsmdb\", f:parsenoop },\n\t0x0153: { n:\"BrtBeginEsfmd\", f:parsenoop },\n\t0x0154: { n:\"BrtEndEsfmd\", f:parsenoop },\n\t0x0155: { n:\"BrtBeginSingleCells\", f:parsenoop },\n\t0x0156: { n:\"BrtEndSingleCells\", f:parsenoop },\n\t0x0157: { n:\"BrtBeginList\", f:parsenoop },\n\t0x0158: { n:\"BrtEndList\", f:parsenoop },\n\t0x0159: { n:\"BrtBeginListCols\", f:parsenoop },\n\t0x015A: { n:\"BrtEndListCols\", f:parsenoop },\n\t0x015B: { n:\"BrtBeginListCol\", f:parsenoop },\n\t0x015C: { n:\"BrtEndListCol\", f:parsenoop },\n\t0x015D: { n:\"BrtBeginListXmlCPr\", f:parsenoop },\n\t0x015E: { n:\"BrtEndListXmlCPr\", f:parsenoop },\n\t0x015F: { n:\"BrtListCCFmla\", f:parsenoop },\n\t0x0160: { n:\"BrtListTrFmla\", f:parsenoop },\n\t0x0161: { n:\"BrtBeginExternals\", f:parsenoop },\n\t0x0162: { n:\"BrtEndExternals\", f:parsenoop },\n\t0x0163: { n:\"BrtSupBookSrc\", f:parsenoop },\n\t0x0165: { n:\"BrtSupSelf\", f:parsenoop },\n\t0x0166: { n:\"BrtSupSame\", f:parsenoop },\n\t0x0167: { n:\"BrtSupTabs\", f:parsenoop },\n\t0x0168: { n:\"BrtBeginSupBook\", f:parsenoop },\n\t0x0169: { n:\"BrtPlaceholderName\", f:parsenoop },\n\t0x016A: { n:\"BrtExternSheet\", f:parsenoop },\n\t0x016B: { n:\"BrtExternTableStart\", f:parsenoop },\n\t0x016C: { n:\"BrtExternTableEnd\", f:parsenoop },\n\t0x016E: { n:\"BrtExternRowHdr\", f:parsenoop },\n\t0x016F: { n:\"BrtExternCellBlank\", f:parsenoop },\n\t0x0170: { n:\"BrtExternCellReal\", f:parsenoop },\n\t0x0171: { n:\"BrtExternCellBool\", f:parsenoop },\n\t0x0172: { n:\"BrtExternCellError\", f:parsenoop },\n\t0x0173: { n:\"BrtExternCellString\", f:parsenoop },\n\t0x0174: { n:\"BrtBeginEsmdx\", f:parsenoop },\n\t0x0175: { n:\"BrtEndEsmdx\", f:parsenoop },\n\t0x0176: { n:\"BrtBeginMdxSet\", f:parsenoop },\n\t0x0177: { n:\"BrtEndMdxSet\", f:parsenoop },\n\t0x0178: { n:\"BrtBeginMdxMbrProp\", f:parsenoop },\n\t0x0179: { n:\"BrtEndMdxMbrProp\", f:parsenoop },\n\t0x017A: { n:\"BrtBeginMdxKPI\", f:parsenoop },\n\t0x017B: { n:\"BrtEndMdxKPI\", f:parsenoop },\n\t0x017C: { n:\"BrtBeginEsstr\", f:parsenoop },\n\t0x017D: { n:\"BrtEndEsstr\", f:parsenoop },\n\t0x017E: { n:\"BrtBeginPRFItem\", f:parsenoop },\n\t0x017F: { n:\"BrtEndPRFItem\", f:parsenoop },\n\t0x0180: { n:\"BrtBeginPivotCacheIDs\", f:parsenoop },\n\t0x0181: { n:\"BrtEndPivotCacheIDs\", f:parsenoop },\n\t0x0182: { n:\"BrtBeginPivotCacheID\", f:parsenoop },\n\t0x0183: { n:\"BrtEndPivotCacheID\", f:parsenoop },\n\t0x0184: { n:\"BrtBeginISXVIs\", f:parsenoop },\n\t0x0185: { n:\"BrtEndISXVIs\", f:parsenoop },\n\t0x0186: { n:\"BrtBeginColInfos\", f:parsenoop },\n\t0x0187: { n:\"BrtEndColInfos\", f:parsenoop },\n\t0x0188: { n:\"BrtBeginRwBrk\", f:parsenoop },\n\t0x0189: { n:\"BrtEndRwBrk\", f:parsenoop },\n\t0x018A: { n:\"BrtBeginColBrk\", f:parsenoop },\n\t0x018B: { n:\"BrtEndColBrk\", f:parsenoop },\n\t0x018C: { n:\"BrtBrk\", f:parsenoop },\n\t0x018D: { n:\"BrtUserBookView\", f:parsenoop },\n\t0x018E: { n:\"BrtInfo\", f:parsenoop },\n\t0x018F: { n:\"BrtCUsr\", f:parsenoop },\n\t0x0190: { n:\"BrtUsr\", f:parsenoop },\n\t0x0191: { n:\"BrtBeginUsers\", f:parsenoop },\n\t0x0193: { n:\"BrtEOF\", f:parsenoop },\n\t0x0194: { n:\"BrtUCR\", f:parsenoop },\n\t0x0195: { n:\"BrtRRInsDel\", f:parsenoop },\n\t0x0196: { n:\"BrtRREndInsDel\", f:parsenoop },\n\t0x0197: { n:\"BrtRRMove\", f:parsenoop },\n\t0x0198: { n:\"BrtRREndMove\", f:parsenoop },\n\t0x0199: { n:\"BrtRRChgCell\", f:parsenoop },\n\t0x019A: { n:\"BrtRREndChgCell\", f:parsenoop },\n\t0x019B: { n:\"BrtRRHeader\", f:parsenoop },\n\t0x019C: { n:\"BrtRRUserView\", f:parsenoop },\n\t0x019D: { n:\"BrtRRRenSheet\", f:parsenoop },\n\t0x019E: { n:\"BrtRRInsertSh\", f:parsenoop },\n\t0x019F: { n:\"BrtRRDefName\", f:parsenoop },\n\t0x01A0: { n:\"BrtRRNote\", f:parsenoop },\n\t0x01A1: { n:\"BrtRRConflict\", f:parsenoop },\n\t0x01A2: { n:\"BrtRRTQSIF\", f:parsenoop },\n\t0x01A3: { n:\"BrtRRFormat\", f:parsenoop },\n\t0x01A4: { n:\"BrtRREndFormat\", f:parsenoop },\n\t0x01A5: { n:\"BrtRRAutoFmt\", f:parsenoop },\n\t0x01A6: { n:\"BrtBeginUserShViews\", f:parsenoop },\n\t0x01A7: { n:\"BrtBeginUserShView\", f:parsenoop },\n\t0x01A8: { n:\"BrtEndUserShView\", f:parsenoop },\n\t0x01A9: { n:\"BrtEndUserShViews\", f:parsenoop },\n\t0x01AA: { n:\"BrtArrFmla\", f:parsenoop },\n\t0x01AB: { n:\"BrtShrFmla\", f:parsenoop },\n\t0x01AC: { n:\"BrtTable\", f:parsenoop },\n\t0x01AD: { n:\"BrtBeginExtConnections\", f:parsenoop },\n\t0x01AE: { n:\"BrtEndExtConnections\", f:parsenoop },\n\t0x01AF: { n:\"BrtBeginPCDCalcMems\", f:parsenoop },\n\t0x01B0: { n:\"BrtEndPCDCalcMems\", f:parsenoop },\n\t0x01B1: { n:\"BrtBeginPCDCalcMem\", f:parsenoop },\n\t0x01B2: { n:\"BrtEndPCDCalcMem\", f:parsenoop },\n\t0x01B3: { n:\"BrtBeginPCDHGLevels\", f:parsenoop },\n\t0x01B4: { n:\"BrtEndPCDHGLevels\", f:parsenoop },\n\t0x01B5: { n:\"BrtBeginPCDHGLevel\", f:parsenoop },\n\t0x01B6: { n:\"BrtEndPCDHGLevel\", f:parsenoop },\n\t0x01B7: { n:\"BrtBeginPCDHGLGroups\", f:parsenoop },\n\t0x01B8: { n:\"BrtEndPCDHGLGroups\", f:parsenoop },\n\t0x01B9: { n:\"BrtBeginPCDHGLGroup\", f:parsenoop },\n\t0x01BA: { n:\"BrtEndPCDHGLGroup\", f:parsenoop },\n\t0x01BB: { n:\"BrtBeginPCDHGLGMembers\", f:parsenoop },\n\t0x01BC: { n:\"BrtEndPCDHGLGMembers\", f:parsenoop },\n\t0x01BD: { n:\"BrtBeginPCDHGLGMember\", f:parsenoop },\n\t0x01BE: { n:\"BrtEndPCDHGLGMember\", f:parsenoop },\n\t0x01BF: { n:\"BrtBeginQSI\", f:parsenoop },\n\t0x01C0: { n:\"BrtEndQSI\", f:parsenoop },\n\t0x01C1: { n:\"BrtBeginQSIR\", f:parsenoop },\n\t0x01C2: { n:\"BrtEndQSIR\", f:parsenoop },\n\t0x01C3: { n:\"BrtBeginDeletedNames\", f:parsenoop },\n\t0x01C4: { n:\"BrtEndDeletedNames\", f:parsenoop },\n\t0x01C5: { n:\"BrtBeginDeletedName\", f:parsenoop },\n\t0x01C6: { n:\"BrtEndDeletedName\", f:parsenoop },\n\t0x01C7: { n:\"BrtBeginQSIFs\", f:parsenoop },\n\t0x01C8: { n:\"BrtEndQSIFs\", f:parsenoop },\n\t0x01C9: { n:\"BrtBeginQSIF\", f:parsenoop },\n\t0x01CA: { n:\"BrtEndQSIF\", f:parsenoop },\n\t0x01CB: { n:\"BrtBeginAutoSortScope\", f:parsenoop },\n\t0x01CC: { n:\"BrtEndAutoSortScope\", f:parsenoop },\n\t0x01CD: { n:\"BrtBeginConditionalFormatting\", f:parsenoop },\n\t0x01CE: { n:\"BrtEndConditionalFormatting\", f:parsenoop },\n\t0x01CF: { n:\"BrtBeginCFRule\", f:parsenoop },\n\t0x01D0: { n:\"BrtEndCFRule\", f:parsenoop },\n\t0x01D1: { n:\"BrtBeginIconSet\", f:parsenoop },\n\t0x01D2: { n:\"BrtEndIconSet\", f:parsenoop },\n\t0x01D3: { n:\"BrtBeginDatabar\", f:parsenoop },\n\t0x01D4: { n:\"BrtEndDatabar\", f:parsenoop },\n\t0x01D5: { n:\"BrtBeginColorScale\", f:parsenoop },\n\t0x01D6: { n:\"BrtEndColorScale\", f:parsenoop },\n\t0x01D7: { n:\"BrtCFVO\", f:parsenoop },\n\t0x01D8: { n:\"BrtExternValueMeta\", f:parsenoop },\n\t0x01D9: { n:\"BrtBeginColorPalette\", f:parsenoop },\n\t0x01DA: { n:\"BrtEndColorPalette\", f:parsenoop },\n\t0x01DB: { n:\"BrtIndexedColor\", f:parsenoop },\n\t0x01DC: { n:\"BrtMargins\", f:parsenoop },\n\t0x01DD: { n:\"BrtPrintOptions\", f:parsenoop },\n\t0x01DE: { n:\"BrtPageSetup\", f:parsenoop },\n\t0x01DF: { n:\"BrtBeginHeaderFooter\", f:parsenoop },\n\t0x01E0: { n:\"BrtEndHeaderFooter\", f:parsenoop },\n\t0x01E1: { n:\"BrtBeginSXCrtFormat\", f:parsenoop },\n\t0x01E2: { n:\"BrtEndSXCrtFormat\", f:parsenoop },\n\t0x01E3: { n:\"BrtBeginSXCrtFormats\", f:parsenoop },\n\t0x01E4: { n:\"BrtEndSXCrtFormats\", f:parsenoop },\n\t0x01E5: { n:\"BrtWsFmtInfo\", f:parsenoop },\n\t0x01E6: { n:\"BrtBeginMgs\", f:parsenoop },\n\t0x01E7: { n:\"BrtEndMGs\", f:parsenoop },\n\t0x01E8: { n:\"BrtBeginMGMaps\", f:parsenoop },\n\t0x01E9: { n:\"BrtEndMGMaps\", f:parsenoop },\n\t0x01EA: { n:\"BrtBeginMG\", f:parsenoop },\n\t0x01EB: { n:\"BrtEndMG\", f:parsenoop },\n\t0x01EC: { n:\"BrtBeginMap\", f:parsenoop },\n\t0x01ED: { n:\"BrtEndMap\", f:parsenoop },\n\t0x01EE: { n:\"BrtHLink\", f:parse_BrtHLink },\n\t0x01EF: { n:\"BrtBeginDCon\", f:parsenoop },\n\t0x01F0: { n:\"BrtEndDCon\", f:parsenoop },\n\t0x01F1: { n:\"BrtBeginDRefs\", f:parsenoop },\n\t0x01F2: { n:\"BrtEndDRefs\", f:parsenoop },\n\t0x01F3: { n:\"BrtDRef\", f:parsenoop },\n\t0x01F4: { n:\"BrtBeginScenMan\", f:parsenoop },\n\t0x01F5: { n:\"BrtEndScenMan\", f:parsenoop },\n\t0x01F6: { n:\"BrtBeginSct\", f:parsenoop },\n\t0x01F7: { n:\"BrtEndSct\", f:parsenoop },\n\t0x01F8: { n:\"BrtSlc\", f:parsenoop },\n\t0x01F9: { n:\"BrtBeginDXFs\", f:parsenoop },\n\t0x01FA: { n:\"BrtEndDXFs\", f:parsenoop },\n\t0x01FB: { n:\"BrtDXF\", f:parsenoop },\n\t0x01FC: { n:\"BrtBeginTableStyles\", f:parsenoop },\n\t0x01FD: { n:\"BrtEndTableStyles\", f:parsenoop },\n\t0x01FE: { n:\"BrtBeginTableStyle\", f:parsenoop },\n\t0x01FF: { n:\"BrtEndTableStyle\", f:parsenoop },\n\t0x0200: { n:\"BrtTableStyleElement\", f:parsenoop },\n\t0x0201: { n:\"BrtTableStyleClient\", f:parsenoop },\n\t0x0202: { n:\"BrtBeginVolDeps\", f:parsenoop },\n\t0x0203: { n:\"BrtEndVolDeps\", f:parsenoop },\n\t0x0204: { n:\"BrtBeginVolType\", f:parsenoop },\n\t0x0205: { n:\"BrtEndVolType\", f:parsenoop },\n\t0x0206: { n:\"BrtBeginVolMain\", f:parsenoop },\n\t0x0207: { n:\"BrtEndVolMain\", f:parsenoop },\n\t0x0208: { n:\"BrtBeginVolTopic\", f:parsenoop },\n\t0x0209: { n:\"BrtEndVolTopic\", f:parsenoop },\n\t0x020A: { n:\"BrtVolSubtopic\", f:parsenoop },\n\t0x020B: { n:\"BrtVolRef\", f:parsenoop },\n\t0x020C: { n:\"BrtVolNum\", f:parsenoop },\n\t0x020D: { n:\"BrtVolErr\", f:parsenoop },\n\t0x020E: { n:\"BrtVolStr\", f:parsenoop },\n\t0x020F: { n:\"BrtVolBool\", f:parsenoop },\n\t0x0210: { n:\"BrtBeginCalcChain$\", f:parsenoop },\n\t0x0211: { n:\"BrtEndCalcChain$\", f:parsenoop },\n\t0x0212: { n:\"BrtBeginSortState\", f:parsenoop },\n\t0x0213: { n:\"BrtEndSortState\", f:parsenoop },\n\t0x0214: { n:\"BrtBeginSortCond\", f:parsenoop },\n\t0x0215: { n:\"BrtEndSortCond\", f:parsenoop },\n\t0x0216: { n:\"BrtBookProtection\", f:parsenoop },\n\t0x0217: { n:\"BrtSheetProtection\", f:parsenoop },\n\t0x0218: { n:\"BrtRangeProtection\", f:parsenoop },\n\t0x0219: { n:\"BrtPhoneticInfo\", f:parsenoop },\n\t0x021A: { n:\"BrtBeginECTxtWiz\", f:parsenoop },\n\t0x021B: { n:\"BrtEndECTxtWiz\", f:parsenoop },\n\t0x021C: { n:\"BrtBeginECTWFldInfoLst\", f:parsenoop },\n\t0x021D: { n:\"BrtEndECTWFldInfoLst\", f:parsenoop },\n\t0x021E: { n:\"BrtBeginECTwFldInfo\", f:parsenoop },\n\t0x0224: { n:\"BrtFileSharing\", f:parsenoop },\n\t0x0225: { n:\"BrtOleSize\", f:parsenoop },\n\t0x0226: { n:\"BrtDrawing\", f:parsenoop },\n\t0x0227: { n:\"BrtLegacyDrawing\", f:parsenoop },\n\t0x0228: { n:\"BrtLegacyDrawingHF\", f:parsenoop },\n\t0x0229: { n:\"BrtWebOpt\", f:parsenoop },\n\t0x022A: { n:\"BrtBeginWebPubItems\", f:parsenoop },\n\t0x022B: { n:\"BrtEndWebPubItems\", f:parsenoop },\n\t0x022C: { n:\"BrtBeginWebPubItem\", f:parsenoop },\n\t0x022D: { n:\"BrtEndWebPubItem\", f:parsenoop },\n\t0x022E: { n:\"BrtBeginSXCondFmt\", f:parsenoop },\n\t0x022F: { n:\"BrtEndSXCondFmt\", f:parsenoop },\n\t0x0230: { n:\"BrtBeginSXCondFmts\", f:parsenoop },\n\t0x0231: { n:\"BrtEndSXCondFmts\", f:parsenoop },\n\t0x0232: { n:\"BrtBkHim\", f:parsenoop },\n\t0x0234: { n:\"BrtColor\", f:parsenoop },\n\t0x0235: { n:\"BrtBeginIndexedColors\", f:parsenoop },\n\t0x0236: { n:\"BrtEndIndexedColors\", f:parsenoop },\n\t0x0239: { n:\"BrtBeginMRUColors\", f:parsenoop },\n\t0x023A: { n:\"BrtEndMRUColors\", f:parsenoop },\n\t0x023C: { n:\"BrtMRUColor\", f:parsenoop },\n\t0x023D: { n:\"BrtBeginDVals\", f:parsenoop },\n\t0x023E: { n:\"BrtEndDVals\", f:parsenoop },\n\t0x0241: { n:\"BrtSupNameStart\", f:parsenoop },\n\t0x0242: { n:\"BrtSupNameValueStart\", f:parsenoop },\n\t0x0243: { n:\"BrtSupNameValueEnd\", f:parsenoop },\n\t0x0244: { n:\"BrtSupNameNum\", f:parsenoop },\n\t0x0245: { n:\"BrtSupNameErr\", f:parsenoop },\n\t0x0246: { n:\"BrtSupNameSt\", f:parsenoop },\n\t0x0247: { n:\"BrtSupNameNil\", f:parsenoop },\n\t0x0248: { n:\"BrtSupNameBool\", f:parsenoop },\n\t0x0249: { n:\"BrtSupNameFmla\", f:parsenoop },\n\t0x024A: { n:\"BrtSupNameBits\", f:parsenoop },\n\t0x024B: { n:\"BrtSupNameEnd\", f:parsenoop },\n\t0x024C: { n:\"BrtEndSupBook\", f:parsenoop },\n\t0x024D: { n:\"BrtCellSmartTagProperty\", f:parsenoop },\n\t0x024E: { n:\"BrtBeginCellSmartTag\", f:parsenoop },\n\t0x024F: { n:\"BrtEndCellSmartTag\", f:parsenoop },\n\t0x0250: { n:\"BrtBeginCellSmartTags\", f:parsenoop },\n\t0x0251: { n:\"BrtEndCellSmartTags\", f:parsenoop },\n\t0x0252: { n:\"BrtBeginSmartTags\", f:parsenoop },\n\t0x0253: { n:\"BrtEndSmartTags\", f:parsenoop },\n\t0x0254: { n:\"BrtSmartTagType\", f:parsenoop },\n\t0x0255: { n:\"BrtBeginSmartTagTypes\", f:parsenoop },\n\t0x0256: { n:\"BrtEndSmartTagTypes\", f:parsenoop },\n\t0x0257: { n:\"BrtBeginSXFilters\", f:parsenoop },\n\t0x0258: { n:\"BrtEndSXFilters\", f:parsenoop },\n\t0x0259: { n:\"BrtBeginSXFILTER\", f:parsenoop },\n\t0x025A: { n:\"BrtEndSXFilter\", f:parsenoop },\n\t0x025B: { n:\"BrtBeginFills\", f:parsenoop },\n\t0x025C: { n:\"BrtEndFills\", f:parsenoop },\n\t0x025D: { n:\"BrtBeginCellWatches\", f:parsenoop },\n\t0x025E: { n:\"BrtEndCellWatches\", f:parsenoop },\n\t0x025F: { n:\"BrtCellWatch\", f:parsenoop },\n\t0x0260: { n:\"BrtBeginCRErrs\", f:parsenoop },\n\t0x0261: { n:\"BrtEndCRErrs\", f:parsenoop },\n\t0x0262: { n:\"BrtCrashRecErr\", f:parsenoop },\n\t0x0263: { n:\"BrtBeginFonts\", f:parsenoop },\n\t0x0264: { n:\"BrtEndFonts\", f:parsenoop },\n\t0x0265: { n:\"BrtBeginBorders\", f:parsenoop },\n\t0x0266: { n:\"BrtEndBorders\", f:parsenoop },\n\t0x0267: { n:\"BrtBeginFmts\", f:parsenoop },\n\t0x0268: { n:\"BrtEndFmts\", f:parsenoop },\n\t0x0269: { n:\"BrtBeginCellXFs\", f:parsenoop },\n\t0x026A: { n:\"BrtEndCellXFs\", f:parsenoop },\n\t0x026B: { n:\"BrtBeginStyles\", f:parsenoop },\n\t0x026C: { n:\"BrtEndStyles\", f:parsenoop },\n\t0x0271: { n:\"BrtBigName\", f:parsenoop },\n\t0x0272: { n:\"BrtBeginCellStyleXFs\", f:parsenoop },\n\t0x0273: { n:\"BrtEndCellStyleXFs\", f:parsenoop },\n\t0x0274: { n:\"BrtBeginComments\", f:parsenoop },\n\t0x0275: { n:\"BrtEndComments\", f:parsenoop },\n\t0x0276: { n:\"BrtBeginCommentAuthors\", f:parsenoop },\n\t0x0277: { n:\"BrtEndCommentAuthors\", f:parsenoop },\n\t0x0278: { n:\"BrtCommentAuthor\", f:parse_BrtCommentAuthor },\n\t0x0279: { n:\"BrtBeginCommentList\", f:parsenoop },\n\t0x027A: { n:\"BrtEndCommentList\", f:parsenoop },\n\t0x027B: { n:\"BrtBeginComment\", f:parse_BrtBeginComment},\n\t0x027C: { n:\"BrtEndComment\", f:parsenoop },\n\t0x027D: { n:\"BrtCommentText\", f:parse_BrtCommentText },\n\t0x027E: { n:\"BrtBeginOleObjects\", f:parsenoop },\n\t0x027F: { n:\"BrtOleObject\", f:parsenoop },\n\t0x0280: { n:\"BrtEndOleObjects\", f:parsenoop },\n\t0x0281: { n:\"BrtBeginSxrules\", f:parsenoop },\n\t0x0282: { n:\"BrtEndSxRules\", f:parsenoop },\n\t0x0283: { n:\"BrtBeginActiveXControls\", f:parsenoop },\n\t0x0284: { n:\"BrtActiveX\", f:parsenoop },\n\t0x0285: { n:\"BrtEndActiveXControls\", f:parsenoop },\n\t0x0286: { n:\"BrtBeginPCDSDTCEMembersSortBy\", f:parsenoop },\n\t0x0288: { n:\"BrtBeginCellIgnoreECs\", f:parsenoop },\n\t0x0289: { n:\"BrtCellIgnoreEC\", f:parsenoop },\n\t0x028A: { n:\"BrtEndCellIgnoreECs\", f:parsenoop },\n\t0x028B: { n:\"BrtCsProp\", f:parsenoop },\n\t0x028C: { n:\"BrtCsPageSetup\", f:parsenoop },\n\t0x028D: { n:\"BrtBeginUserCsViews\", f:parsenoop },\n\t0x028E: { n:\"BrtEndUserCsViews\", f:parsenoop },\n\t0x028F: { n:\"BrtBeginUserCsView\", f:parsenoop },\n\t0x0290: { n:\"BrtEndUserCsView\", f:parsenoop },\n\t0x0291: { n:\"BrtBeginPcdSFCIEntries\", f:parsenoop },\n\t0x0292: { n:\"BrtEndPCDSFCIEntries\", f:parsenoop },\n\t0x0293: { n:\"BrtPCDSFCIEntry\", f:parsenoop },\n\t0x0294: { n:\"BrtBeginListParts\", f:parsenoop },\n\t0x0295: { n:\"BrtListPart\", f:parsenoop },\n\t0x0296: { n:\"BrtEndListParts\", f:parsenoop },\n\t0x0297: { n:\"BrtSheetCalcProp\", f:parsenoop },\n\t0x0298: { n:\"BrtBeginFnGroup\", f:parsenoop },\n\t0x0299: { n:\"BrtFnGroup\", f:parsenoop },\n\t0x029A: { n:\"BrtEndFnGroup\", f:parsenoop },\n\t0x029B: { n:\"BrtSupAddin\", f:parsenoop },\n\t0x029C: { n:\"BrtSXTDMPOrder\", f:parsenoop },\n\t0x029D: { n:\"BrtCsProtection\", f:parsenoop },\n\t0x029F: { n:\"BrtBeginWsSortMap\", f:parsenoop },\n\t0x02A0: { n:\"BrtEndWsSortMap\", f:parsenoop },\n\t0x02A1: { n:\"BrtBeginRRSort\", f:parsenoop },\n\t0x02A2: { n:\"BrtEndRRSort\", f:parsenoop },\n\t0x02A3: { n:\"BrtRRSortItem\", f:parsenoop },\n\t0x02A4: { n:\"BrtFileSharingIso\", f:parsenoop },\n\t0x02A5: { n:\"BrtBookProtectionIso\", f:parsenoop },\n\t0x02A6: { n:\"BrtSheetProtectionIso\", f:parsenoop },\n\t0x02A7: { n:\"BrtCsProtectionIso\", f:parsenoop },\n\t0x02A8: { n:\"BrtRangeProtectionIso\", f:parsenoop },\n\t0x0400: { n:\"BrtRwDescent\", f:parsenoop },\n\t0x0401: { n:\"BrtKnownFonts\", f:parsenoop },\n\t0x0402: { n:\"BrtBeginSXTupleSet\", f:parsenoop },\n\t0x0403: { n:\"BrtEndSXTupleSet\", f:parsenoop },\n\t0x0404: { n:\"BrtBeginSXTupleSetHeader\", f:parsenoop },\n\t0x0405: { n:\"BrtEndSXTupleSetHeader\", f:parsenoop },\n\t0x0406: { n:\"BrtSXTupleSetHeaderItem\", f:parsenoop },\n\t0x0407: { n:\"BrtBeginSXTupleSetData\", f:parsenoop },\n\t0x0408: { n:\"BrtEndSXTupleSetData\", f:parsenoop },\n\t0x0409: { n:\"BrtBeginSXTupleSetRow\", f:parsenoop },\n\t0x040A: { n:\"BrtEndSXTupleSetRow\", f:parsenoop },\n\t0x040B: { n:\"BrtSXTupleSetRowItem\", f:parsenoop },\n\t0x040C: { n:\"BrtNameExt\", f:parsenoop },\n\t0x040D: { n:\"BrtPCDH14\", f:parsenoop },\n\t0x040E: { n:\"BrtBeginPCDCalcMem14\", f:parsenoop },\n\t0x040F: { n:\"BrtEndPCDCalcMem14\", f:parsenoop },\n\t0x0410: { n:\"BrtSXTH14\", f:parsenoop },\n\t0x0411: { n:\"BrtBeginSparklineGroup\", f:parsenoop },\n\t0x0412: { n:\"BrtEndSparklineGroup\", f:parsenoop },\n\t0x0413: { n:\"BrtSparkline\", f:parsenoop },\n\t0x0414: { n:\"BrtSXDI14\", f:parsenoop },\n\t0x0415: { n:\"BrtWsFmtInfoEx14\", f:parsenoop },\n\t0x0416: { n:\"BrtBeginConditionalFormatting14\", f:parsenoop },\n\t0x0417: { n:\"BrtEndConditionalFormatting14\", f:parsenoop },\n\t0x0418: { n:\"BrtBeginCFRule14\", f:parsenoop },\n\t0x0419: { n:\"BrtEndCFRule14\", f:parsenoop },\n\t0x041A: { n:\"BrtCFVO14\", f:parsenoop },\n\t0x041B: { n:\"BrtBeginDatabar14\", f:parsenoop },\n\t0x041C: { n:\"BrtBeginIconSet14\", f:parsenoop },\n\t0x041D: { n:\"BrtDVal14\", f:parsenoop },\n\t0x041E: { n:\"BrtBeginDVals14\", f:parsenoop },\n\t0x041F: { n:\"BrtColor14\", f:parsenoop },\n\t0x0420: { n:\"BrtBeginSparklines\", f:parsenoop },\n\t0x0421: { n:\"BrtEndSparklines\", f:parsenoop },\n\t0x0422: { n:\"BrtBeginSparklineGroups\", f:parsenoop },\n\t0x0423: { n:\"BrtEndSparklineGroups\", f:parsenoop },\n\t0x0425: { n:\"BrtSXVD14\", f:parsenoop },\n\t0x0426: { n:\"BrtBeginSxview14\", f:parsenoop },\n\t0x0427: { n:\"BrtEndSxview14\", f:parsenoop },\n\t0x042A: { n:\"BrtBeginPCD14\", f:parsenoop },\n\t0x042B: { n:\"BrtEndPCD14\", f:parsenoop },\n\t0x042C: { n:\"BrtBeginExtConn14\", f:parsenoop },\n\t0x042D: { n:\"BrtEndExtConn14\", f:parsenoop },\n\t0x042E: { n:\"BrtBeginSlicerCacheIDs\", f:parsenoop },\n\t0x042F: { n:\"BrtEndSlicerCacheIDs\", f:parsenoop },\n\t0x0430: { n:\"BrtBeginSlicerCacheID\", f:parsenoop },\n\t0x0431: { n:\"BrtEndSlicerCacheID\", f:parsenoop },\n\t0x0433: { n:\"BrtBeginSlicerCache\", f:parsenoop },\n\t0x0434: { n:\"BrtEndSlicerCache\", f:parsenoop },\n\t0x0435: { n:\"BrtBeginSlicerCacheDef\", f:parsenoop },\n\t0x0436: { n:\"BrtEndSlicerCacheDef\", f:parsenoop },\n\t0x0437: { n:\"BrtBeginSlicersEx\", f:parsenoop },\n\t0x0438: { n:\"BrtEndSlicersEx\", f:parsenoop },\n\t0x0439: { n:\"BrtBeginSlicerEx\", f:parsenoop },\n\t0x043A: { n:\"BrtEndSlicerEx\", f:parsenoop },\n\t0x043B: { n:\"BrtBeginSlicer\", f:parsenoop },\n\t0x043C: { n:\"BrtEndSlicer\", f:parsenoop },\n\t0x043D: { n:\"BrtSlicerCachePivotTables\", f:parsenoop },\n\t0x043E: { n:\"BrtBeginSlicerCacheOlapImpl\", f:parsenoop },\n\t0x043F: { n:\"BrtEndSlicerCacheOlapImpl\", f:parsenoop },\n\t0x0440: { n:\"BrtBeginSlicerCacheLevelsData\", f:parsenoop },\n\t0x0441: { n:\"BrtEndSlicerCacheLevelsData\", f:parsenoop },\n\t0x0442: { n:\"BrtBeginSlicerCacheLevelData\", f:parsenoop },\n\t0x0443: { n:\"BrtEndSlicerCacheLevelData\", f:parsenoop },\n\t0x0444: { n:\"BrtBeginSlicerCacheSiRanges\", f:parsenoop },\n\t0x0445: { n:\"BrtEndSlicerCacheSiRanges\", f:parsenoop },\n\t0x0446: { n:\"BrtBeginSlicerCacheSiRange\", f:parsenoop },\n\t0x0447: { n:\"BrtEndSlicerCacheSiRange\", f:parsenoop },\n\t0x0448: { n:\"BrtSlicerCacheOlapItem\", f:parsenoop },\n\t0x0449: { n:\"BrtBeginSlicerCacheSelections\", f:parsenoop },\n\t0x044A: { n:\"BrtSlicerCacheSelection\", f:parsenoop },\n\t0x044B: { n:\"BrtEndSlicerCacheSelections\", f:parsenoop },\n\t0x044C: { n:\"BrtBeginSlicerCacheNative\", f:parsenoop },\n\t0x044D: { n:\"BrtEndSlicerCacheNative\", f:parsenoop },\n\t0x044E: { n:\"BrtSlicerCacheNativeItem\", f:parsenoop },\n\t0x044F: { n:\"BrtRangeProtection14\", f:parsenoop },\n\t0x0450: { n:\"BrtRangeProtectionIso14\", f:parsenoop },\n\t0x0451: { n:\"BrtCellIgnoreEC14\", f:parsenoop },\n\t0x0457: { n:\"BrtList14\", f:parsenoop },\n\t0x0458: { n:\"BrtCFIcon\", f:parsenoop },\n\t0x0459: { n:\"BrtBeginSlicerCachesPivotCacheIDs\", f:parsenoop },\n\t0x045A: { n:\"BrtEndSlicerCachesPivotCacheIDs\", f:parsenoop },\n\t0x045B: { n:\"BrtBeginSlicers\", f:parsenoop },\n\t0x045C: { n:\"BrtEndSlicers\", f:parsenoop },\n\t0x045D: { n:\"BrtWbProp14\", f:parsenoop },\n\t0x045E: { n:\"BrtBeginSXEdit\", f:parsenoop },\n\t0x045F: { n:\"BrtEndSXEdit\", f:parsenoop },\n\t0x0460: { n:\"BrtBeginSXEdits\", f:parsenoop },\n\t0x0461: { n:\"BrtEndSXEdits\", f:parsenoop },\n\t0x0462: { n:\"BrtBeginSXChange\", f:parsenoop },\n\t0x0463: { n:\"BrtEndSXChange\", f:parsenoop },\n\t0x0464: { n:\"BrtBeginSXChanges\", f:parsenoop },\n\t0x0465: { n:\"BrtEndSXChanges\", f:parsenoop },\n\t0x0466: { n:\"BrtSXTupleItems\", f:parsenoop },\n\t0x0468: { n:\"BrtBeginSlicerStyle\", f:parsenoop },\n\t0x0469: { n:\"BrtEndSlicerStyle\", f:parsenoop },\n\t0x046A: { n:\"BrtSlicerStyleElement\", f:parsenoop },\n\t0x046B: { n:\"BrtBeginStyleSheetExt14\", f:parsenoop },\n\t0x046C: { n:\"BrtEndStyleSheetExt14\", f:parsenoop },\n\t0x046D: { n:\"BrtBeginSlicerCachesPivotCacheID\", f:parsenoop },\n\t0x046E: { n:\"BrtEndSlicerCachesPivotCacheID\", f:parsenoop },\n\t0x046F: { n:\"BrtBeginConditionalFormattings\", f:parsenoop },\n\t0x0470: { n:\"BrtEndConditionalFormattings\", f:parsenoop },\n\t0x0471: { n:\"BrtBeginPCDCalcMemExt\", f:parsenoop },\n\t0x0472: { n:\"BrtEndPCDCalcMemExt\", f:parsenoop },\n\t0x0473: { n:\"BrtBeginPCDCalcMemsExt\", f:parsenoop },\n\t0x0474: { n:\"BrtEndPCDCalcMemsExt\", f:parsenoop },\n\t0x0475: { n:\"BrtPCDField14\", f:parsenoop },\n\t0x0476: { n:\"BrtBeginSlicerStyles\", f:parsenoop },\n\t0x0477: { n:\"BrtEndSlicerStyles\", f:parsenoop },\n\t0x0478: { n:\"BrtBeginSlicerStyleElements\", f:parsenoop },\n\t0x0479: { n:\"BrtEndSlicerStyleElements\", f:parsenoop },\n\t0x047A: { n:\"BrtCFRuleExt\", f:parsenoop },\n\t0x047B: { n:\"BrtBeginSXCondFmt14\", f:parsenoop },\n\t0x047C: { n:\"BrtEndSXCondFmt14\", f:parsenoop },\n\t0x047D: { n:\"BrtBeginSXCondFmts14\", f:parsenoop },\n\t0x047E: { n:\"BrtEndSXCondFmts14\", f:parsenoop },\n\t0x0480: { n:\"BrtBeginSortCond14\", f:parsenoop },\n\t0x0481: { n:\"BrtEndSortCond14\", f:parsenoop },\n\t0x0482: { n:\"BrtEndDVals14\", f:parsenoop },\n\t0x0483: { n:\"BrtEndIconSet14\", f:parsenoop },\n\t0x0484: { n:\"BrtEndDatabar14\", f:parsenoop },\n\t0x0485: { n:\"BrtBeginColorScale14\", f:parsenoop },\n\t0x0486: { n:\"BrtEndColorScale14\", f:parsenoop },\n\t0x0487: { n:\"BrtBeginSxrules14\", f:parsenoop },\n\t0x0488: { n:\"BrtEndSxrules14\", f:parsenoop },\n\t0x0489: { n:\"BrtBeginPRule14\", f:parsenoop },\n\t0x048A: { n:\"BrtEndPRule14\", f:parsenoop },\n\t0x048B: { n:\"BrtBeginPRFilters14\", f:parsenoop },\n\t0x048C: { n:\"BrtEndPRFilters14\", f:parsenoop },\n\t0x048D: { n:\"BrtBeginPRFilter14\", f:parsenoop },\n\t0x048E: { n:\"BrtEndPRFilter14\", f:parsenoop },\n\t0x048F: { n:\"BrtBeginPRFItem14\", f:parsenoop },\n\t0x0490: { n:\"BrtEndPRFItem14\", f:parsenoop },\n\t0x0491: { n:\"BrtBeginCellIgnoreECs14\", f:parsenoop },\n\t0x0492: { n:\"BrtEndCellIgnoreECs14\", f:parsenoop },\n\t0x0493: { n:\"BrtDxf14\", f:parsenoop },\n\t0x0494: { n:\"BrtBeginDxF14s\", f:parsenoop },\n\t0x0495: { n:\"BrtEndDxf14s\", f:parsenoop },\n\t0x0499: { n:\"BrtFilter14\", f:parsenoop },\n\t0x049A: { n:\"BrtBeginCustomFilters14\", f:parsenoop },\n\t0x049C: { n:\"BrtCustomFilter14\", f:parsenoop },\n\t0x049D: { n:\"BrtIconFilter14\", f:parsenoop },\n\t0x049E: { n:\"BrtPivotCacheConnectionName\", f:parsenoop },\n\t0x0800: { n:\"BrtBeginDecoupledPivotCacheIDs\", f:parsenoop },\n\t0x0801: { n:\"BrtEndDecoupledPivotCacheIDs\", f:parsenoop },\n\t0x0802: { n:\"BrtDecoupledPivotCacheID\", f:parsenoop },\n\t0x0803: { n:\"BrtBeginPivotTableRefs\", f:parsenoop },\n\t0x0804: { n:\"BrtEndPivotTableRefs\", f:parsenoop },\n\t0x0805: { n:\"BrtPivotTableRef\", f:parsenoop },\n\t0x0806: { n:\"BrtSlicerCacheBookPivotTables\", f:parsenoop },\n\t0x0807: { n:\"BrtBeginSxvcells\", f:parsenoop },\n\t0x0808: { n:\"BrtEndSxvcells\", f:parsenoop },\n\t0x0809: { n:\"BrtBeginSxRow\", f:parsenoop },\n\t0x080A: { n:\"BrtEndSxRow\", f:parsenoop },\n\t0x080C: { n:\"BrtPcdCalcMem15\", f:parsenoop },\n\t0x0813: { n:\"BrtQsi15\", f:parsenoop },\n\t0x0814: { n:\"BrtBeginWebExtensions\", f:parsenoop },\n\t0x0815: { n:\"BrtEndWebExtensions\", f:parsenoop },\n\t0x0816: { n:\"BrtWebExtension\", f:parsenoop },\n\t0x0817: { n:\"BrtAbsPath15\", f:parsenoop },\n\t0x0818: { n:\"BrtBeginPivotTableUISettings\", f:parsenoop },\n\t0x0819: { n:\"BrtEndPivotTableUISettings\", f:parsenoop },\n\t0x081B: { n:\"BrtTableSlicerCacheIDs\", f:parsenoop },\n\t0x081C: { n:\"BrtTableSlicerCacheID\", f:parsenoop },\n\t0x081D: { n:\"BrtBeginTableSlicerCache\", f:parsenoop },\n\t0x081E: { n:\"BrtEndTableSlicerCache\", f:parsenoop },\n\t0x081F: { n:\"BrtSxFilter15\", f:parsenoop },\n\t0x0820: { n:\"BrtBeginTimelineCachePivotCacheIDs\", f:parsenoop },\n\t0x0821: { n:\"BrtEndTimelineCachePivotCacheIDs\", f:parsenoop },\n\t0x0822: { n:\"BrtTimelineCachePivotCacheID\", f:parsenoop },\n\t0x0823: { n:\"BrtBeginTimelineCacheIDs\", f:parsenoop },\n\t0x0824: { n:\"BrtEndTimelineCacheIDs\", f:parsenoop },\n\t0x0825: { n:\"BrtBeginTimelineCacheID\", f:parsenoop },\n\t0x0826: { n:\"BrtEndTimelineCacheID\", f:parsenoop },\n\t0x0827: { n:\"BrtBeginTimelinesEx\", f:parsenoop },\n\t0x0828: { n:\"BrtEndTimelinesEx\", f:parsenoop },\n\t0x0829: { n:\"BrtBeginTimelineEx\", f:parsenoop },\n\t0x082A: { n:\"BrtEndTimelineEx\", f:parsenoop },\n\t0x082B: { n:\"BrtWorkBookPr15\", f:parsenoop },\n\t0x082C: { n:\"BrtPCDH15\", f:parsenoop },\n\t0x082D: { n:\"BrtBeginTimelineStyle\", f:parsenoop },\n\t0x082E: { n:\"BrtEndTimelineStyle\", f:parsenoop },\n\t0x082F: { n:\"BrtTimelineStyleElement\", f:parsenoop },\n\t0x0830: { n:\"BrtBeginTimelineStylesheetExt15\", f:parsenoop },\n\t0x0831: { n:\"BrtEndTimelineStylesheetExt15\", f:parsenoop },\n\t0x0832: { n:\"BrtBeginTimelineStyles\", f:parsenoop },\n\t0x0833: { n:\"BrtEndTimelineStyles\", f:parsenoop },\n\t0x0834: { n:\"BrtBeginTimelineStyleElements\", f:parsenoop },\n\t0x0835: { n:\"BrtEndTimelineStyleElements\", f:parsenoop },\n\t0x0836: { n:\"BrtDxf15\", f:parsenoop },\n\t0x0837: { n:\"BrtBeginDxfs15\", f:parsenoop },\n\t0x0838: { n:\"brtEndDxfs15\", f:parsenoop },\n\t0x0839: { n:\"BrtSlicerCacheHideItemsWithNoData\", f:parsenoop },\n\t0x083A: { n:\"BrtBeginItemUniqueNames\", f:parsenoop },\n\t0x083B: { n:\"BrtEndItemUniqueNames\", f:parsenoop },\n\t0x083C: { n:\"BrtItemUniqueName\", f:parsenoop },\n\t0x083D: { n:\"BrtBeginExtConn15\", f:parsenoop },\n\t0x083E: { n:\"BrtEndExtConn15\", f:parsenoop },\n\t0x083F: { n:\"BrtBeginOledbPr15\", f:parsenoop },\n\t0x0840: { n:\"BrtEndOledbPr15\", f:parsenoop },\n\t0x0841: { n:\"BrtBeginDataFeedPr15\", f:parsenoop },\n\t0x0842: { n:\"BrtEndDataFeedPr15\", f:parsenoop },\n\t0x0843: { n:\"BrtTextPr15\", f:parsenoop },\n\t0x0844: { n:\"BrtRangePr15\", f:parsenoop },\n\t0x0845: { n:\"BrtDbCommand15\", f:parsenoop },\n\t0x0846: { n:\"BrtBeginDbTables15\", f:parsenoop },\n\t0x0847: { n:\"BrtEndDbTables15\", f:parsenoop },\n\t0x0848: { n:\"BrtDbTable15\", f:parsenoop },\n\t0x0849: { n:\"BrtBeginDataModel\", f:parsenoop },\n\t0x084A: { n:\"BrtEndDataModel\", f:parsenoop },\n\t0x084B: { n:\"BrtBeginModelTables\", f:parsenoop },\n\t0x084C: { n:\"BrtEndModelTables\", f:parsenoop },\n\t0x084D: { n:\"BrtModelTable\", f:parsenoop },\n\t0x084E: { n:\"BrtBeginModelRelationships\", f:parsenoop },\n\t0x084F: { n:\"BrtEndModelRelationships\", f:parsenoop },\n\t0x0850: { n:\"BrtModelRelationship\", f:parsenoop },\n\t0x0851: { n:\"BrtBeginECTxtWiz15\", f:parsenoop },\n\t0x0852: { n:\"BrtEndECTxtWiz15\", f:parsenoop },\n\t0x0853: { n:\"BrtBeginECTWFldInfoLst15\", f:parsenoop },\n\t0x0854: { n:\"BrtEndECTWFldInfoLst15\", f:parsenoop },\n\t0x0855: { n:\"BrtBeginECTWFldInfo15\", f:parsenoop },\n\t0x0856: { n:\"BrtFieldListActiveItem\", f:parsenoop },\n\t0x0857: { n:\"BrtPivotCacheIdVersion\", f:parsenoop },\n\t0x0858: { n:\"BrtSXDI15\", f:parsenoop },\n\t0xFFFF: { n:\"\", f:parsenoop }\n};\n\nvar evert_RE = evert_key(XLSBRecordEnum, 'n');\n\n/* [MS-XLS] 2.3 Record Enumeration */\nvar XLSRecordEnum = {\n\t0x0003: { n:\"BIFF2NUM\", f:parse_BIFF2NUM },\n\t0x0004: { n:\"BIFF2STR\", f:parse_BIFF2STR },\n\t0x0006: { n:\"Formula\", f:parse_Formula },\n\t0x0009: { n:'BOF', f:parse_BOF },\n\t0x000a: { n:'EOF', f:parse_EOF },\n\t0x000c: { n:\"CalcCount\", f:parse_CalcCount },\n\t0x000d: { n:\"CalcMode\", f:parse_CalcMode },\n\t0x000e: { n:\"CalcPrecision\", f:parse_CalcPrecision },\n\t0x000f: { n:\"CalcRefMode\", f:parse_CalcRefMode },\n\t0x0010: { n:\"CalcDelta\", f:parse_CalcDelta },\n\t0x0011: { n:\"CalcIter\", f:parse_CalcIter },\n\t0x0012: { n:\"Protect\", f:parse_Protect },\n\t0x0013: { n:\"Password\", f:parse_Password },\n\t0x0014: { n:\"Header\", f:parse_Header },\n\t0x0015: { n:\"Footer\", f:parse_Footer },\n\t0x0017: { n:\"ExternSheet\", f:parse_ExternSheet },\n\t0x0018: { n:\"Lbl\", f:parse_Lbl },\n\t0x0019: { n:\"WinProtect\", f:parse_WinProtect },\n\t0x001a: { n:\"VerticalPageBreaks\", f:parse_VerticalPageBreaks },\n\t0x001b: { n:\"HorizontalPageBreaks\", f:parse_HorizontalPageBreaks },\n\t0x001c: { n:\"Note\", f:parse_Note },\n\t0x001d: { n:\"Selection\", f:parse_Selection },\n\t0x0022: { n:\"Date1904\", f:parse_Date1904 },\n\t0x0023: { n:\"ExternName\", f:parse_ExternName },\n\t0x0026: { n:\"LeftMargin\", f:parse_LeftMargin },\n\t0x0027: { n:\"RightMargin\", f:parse_RightMargin },\n\t0x0028: { n:\"TopMargin\", f:parse_TopMargin },\n\t0x0029: { n:\"BottomMargin\", f:parse_BottomMargin },\n\t0x002a: { n:\"PrintRowCol\", f:parse_PrintRowCol },\n\t0x002b: { n:\"PrintGrid\", f:parse_PrintGrid },\n\t0x002f: { n:\"FilePass\", f:parse_FilePass },\n\t0x0031: { n:\"Font\", f:parse_Font },\n\t0x0033: { n:\"PrintSize\", f:parse_PrintSize },\n\t0x003c: { n:\"Continue\", f:parse_Continue },\n\t0x003d: { n:\"Window1\", f:parse_Window1 },\n\t0x0040: { n:\"Backup\", f:parse_Backup },\n\t0x0041: { n:\"Pane\", f:parse_Pane },\n\t0x0042: { n:'CodePage', f:parse_CodePage },\n\t0x004d: { n:\"Pls\", f:parse_Pls },\n\t0x0050: { n:\"DCon\", f:parse_DCon },\n\t0x0051: { n:\"DConRef\", f:parse_DConRef },\n\t0x0052: { n:\"DConName\", f:parse_DConName },\n\t0x0055: { n:\"DefColWidth\", f:parse_DefColWidth },\n\t0x0059: { n:\"XCT\", f:parse_XCT },\n\t0x005a: { n:\"CRN\", f:parse_CRN },\n\t0x005b: { n:\"FileSharing\", f:parse_FileSharing },\n\t0x005c: { n:'WriteAccess', f:parse_WriteAccess },\n\t0x005d: { n:\"Obj\", f:parse_Obj },\n\t0x005e: { n:\"Uncalced\", f:parse_Uncalced },\n\t0x005f: { n:\"CalcSaveRecalc\", f:parse_CalcSaveRecalc },\n\t0x0060: { n:\"Template\", f:parse_Template },\n\t0x0061: { n:\"Intl\", f:parse_Intl },\n\t0x0063: { n:\"ObjProtect\", f:parse_ObjProtect },\n\t0x007d: { n:\"ColInfo\", f:parse_ColInfo },\n\t0x0080: { n:\"Guts\", f:parse_Guts },\n\t0x0081: { n:\"WsBool\", f:parse_WsBool },\n\t0x0082: { n:\"GridSet\", f:parse_GridSet },\n\t0x0083: { n:\"HCenter\", f:parse_HCenter },\n\t0x0084: { n:\"VCenter\", f:parse_VCenter },\n\t0x0085: { n:'BoundSheet8', f:parse_BoundSheet8 },\n\t0x0086: { n:\"WriteProtect\", f:parse_WriteProtect },\n\t0x008c: { n:\"Country\", f:parse_Country },\n\t0x008d: { n:\"HideObj\", f:parse_HideObj },\n\t0x0090: { n:\"Sort\", f:parse_Sort },\n\t0x0092: { n:\"Palette\", f:parse_Palette },\n\t0x0097: { n:\"Sync\", f:parse_Sync },\n\t0x0098: { n:\"LPr\", f:parse_LPr },\n\t0x0099: { n:\"DxGCol\", f:parse_DxGCol },\n\t0x009a: { n:\"FnGroupName\", f:parse_FnGroupName },\n\t0x009b: { n:\"FilterMode\", f:parse_FilterMode },\n\t0x009c: { n:\"BuiltInFnGroupCount\", f:parse_BuiltInFnGroupCount },\n\t0x009d: { n:\"AutoFilterInfo\", f:parse_AutoFilterInfo },\n\t0x009e: { n:\"AutoFilter\", f:parse_AutoFilter },\n\t0x00a0: { n:\"Scl\", f:parse_Scl },\n\t0x00a1: { n:\"Setup\", f:parse_Setup },\n\t0x00ae: { n:\"ScenMan\", f:parse_ScenMan },\n\t0x00af: { n:\"SCENARIO\", f:parse_SCENARIO },\n\t0x00b0: { n:\"SxView\", f:parse_SxView },\n\t0x00b1: { n:\"Sxvd\", f:parse_Sxvd },\n\t0x00b2: { n:\"SXVI\", f:parse_SXVI },\n\t0x00b4: { n:\"SxIvd\", f:parse_SxIvd },\n\t0x00b5: { n:\"SXLI\", f:parse_SXLI },\n\t0x00b6: { n:\"SXPI\", f:parse_SXPI },\n\t0x00b8: { n:\"DocRoute\", f:parse_DocRoute },\n\t0x00b9: { n:\"RecipName\", f:parse_RecipName },\n\t0x00bd: { n:\"MulRk\", f:parse_MulRk },\n\t0x00be: { n:\"MulBlank\", f:parse_MulBlank },\n\t0x00c1: { n:'Mms', f:parse_Mms },\n\t0x00c5: { n:\"SXDI\", f:parse_SXDI },\n\t0x00c6: { n:\"SXDB\", f:parse_SXDB },\n\t0x00c7: { n:\"SXFDB\", f:parse_SXFDB },\n\t0x00c8: { n:\"SXDBB\", f:parse_SXDBB },\n\t0x00c9: { n:\"SXNum\", f:parse_SXNum },\n\t0x00ca: { n:\"SxBool\", f:parse_SxBool },\n\t0x00cb: { n:\"SxErr\", f:parse_SxErr },\n\t0x00cc: { n:\"SXInt\", f:parse_SXInt },\n\t0x00cd: { n:\"SXString\", f:parse_SXString },\n\t0x00ce: { n:\"SXDtr\", f:parse_SXDtr },\n\t0x00cf: { n:\"SxNil\", f:parse_SxNil },\n\t0x00d0: { n:\"SXTbl\", f:parse_SXTbl },\n\t0x00d1: { n:\"SXTBRGIITM\", f:parse_SXTBRGIITM },\n\t0x00d2: { n:\"SxTbpg\", f:parse_SxTbpg },\n\t0x00d3: { n:\"ObProj\", f:parse_ObProj },\n\t0x00d5: { n:\"SXStreamID\", f:parse_SXStreamID },\n\t0x00d7: { n:\"DBCell\", f:parse_DBCell },\n\t0x00d8: { n:\"SXRng\", f:parse_SXRng },\n\t0x00d9: { n:\"SxIsxoper\", f:parse_SxIsxoper },\n\t0x00da: { n:\"BookBool\", f:parse_BookBool },\n\t0x00dc: { n:\"DbOrParamQry\", f:parse_DbOrParamQry },\n\t0x00dd: { n:\"ScenarioProtect\", f:parse_ScenarioProtect },\n\t0x00de: { n:\"OleObjectSize\", f:parse_OleObjectSize },\n\t0x00e0: { n:\"XF\", f:parse_XF },\n\t0x00e1: { n:'InterfaceHdr', f:parse_InterfaceHdr },\n\t0x00e2: { n:'InterfaceEnd', f:parse_InterfaceEnd },\n\t0x00e3: { n:\"SXVS\", f:parse_SXVS },\n\t0x00e5: { n:\"MergeCells\", f:parse_MergeCells },\n\t0x00e9: { n:\"BkHim\", f:parse_BkHim },\n\t0x00eb: { n:\"MsoDrawingGroup\", f:parse_MsoDrawingGroup },\n\t0x00ec: { n:\"MsoDrawing\", f:parse_MsoDrawing },\n\t0x00ed: { n:\"MsoDrawingSelection\", f:parse_MsoDrawingSelection },\n\t0x00ef: { n:\"PhoneticInfo\", f:parse_PhoneticInfo },\n\t0x00f0: { n:\"SxRule\", f:parse_SxRule },\n\t0x00f1: { n:\"SXEx\", f:parse_SXEx },\n\t0x00f2: { n:\"SxFilt\", f:parse_SxFilt },\n\t0x00f4: { n:\"SxDXF\", f:parse_SxDXF },\n\t0x00f5: { n:\"SxItm\", f:parse_SxItm },\n\t0x00f6: { n:\"SxName\", f:parse_SxName },\n\t0x00f7: { n:\"SxSelect\", f:parse_SxSelect },\n\t0x00f8: { n:\"SXPair\", f:parse_SXPair },\n\t0x00f9: { n:\"SxFmla\", f:parse_SxFmla },\n\t0x00fb: { n:\"SxFormat\", f:parse_SxFormat },\n\t0x00fc: { n:\"SST\", f:parse_SST },\n\t0x00fd: { n:\"LabelSst\", f:parse_LabelSst },\n\t0x00ff: { n:\"ExtSST\", f:parse_ExtSST },\n\t0x0100: { n:\"SXVDEx\", f:parse_SXVDEx },\n\t0x0103: { n:\"SXFormula\", f:parse_SXFormula },\n\t0x0122: { n:\"SXDBEx\", f:parse_SXDBEx },\n\t0x0137: { n:\"RRDInsDel\", f:parse_RRDInsDel },\n\t0x0138: { n:\"RRDHead\", f:parse_RRDHead },\n\t0x013b: { n:\"RRDChgCell\", f:parse_RRDChgCell },\n\t0x013d: { n:\"RRTabId\", f:parse_RRTabId },\n\t0x013e: { n:\"RRDRenSheet\", f:parse_RRDRenSheet },\n\t0x013f: { n:\"RRSort\", f:parse_RRSort },\n\t0x0140: { n:\"RRDMove\", f:parse_RRDMove },\n\t0x014a: { n:\"RRFormat\", f:parse_RRFormat },\n\t0x014b: { n:\"RRAutoFmt\", f:parse_RRAutoFmt },\n\t0x014d: { n:\"RRInsertSh\", f:parse_RRInsertSh },\n\t0x014e: { n:\"RRDMoveBegin\", f:parse_RRDMoveBegin },\n\t0x014f: { n:\"RRDMoveEnd\", f:parse_RRDMoveEnd },\n\t0x0150: { n:\"RRDInsDelBegin\", f:parse_RRDInsDelBegin },\n\t0x0151: { n:\"RRDInsDelEnd\", f:parse_RRDInsDelEnd },\n\t0x0152: { n:\"RRDConflict\", f:parse_RRDConflict },\n\t0x0153: { n:\"RRDDefName\", f:parse_RRDDefName },\n\t0x0154: { n:\"RRDRstEtxp\", f:parse_RRDRstEtxp },\n\t0x015f: { n:\"LRng\", f:parse_LRng },\n\t0x0160: { n:\"UsesELFs\", f:parse_UsesELFs },\n\t0x0161: { n:\"DSF\", f:parse_DSF },\n\t0x0191: { n:\"CUsr\", f:parse_CUsr },\n\t0x0192: { n:\"CbUsr\", f:parse_CbUsr },\n\t0x0193: { n:\"UsrInfo\", f:parse_UsrInfo },\n\t0x0194: { n:\"UsrExcl\", f:parse_UsrExcl },\n\t0x0195: { n:\"FileLock\", f:parse_FileLock },\n\t0x0196: { n:\"RRDInfo\", f:parse_RRDInfo },\n\t0x0197: { n:\"BCUsrs\", f:parse_BCUsrs },\n\t0x0198: { n:\"UsrChk\", f:parse_UsrChk },\n\t0x01a9: { n:\"UserBView\", f:parse_UserBView },\n\t0x01aa: { n:\"UserSViewBegin\", f:parse_UserSViewBegin },\n\t0x01ab: { n:\"UserSViewEnd\", f:parse_UserSViewEnd },\n\t0x01ac: { n:\"RRDUserView\", f:parse_RRDUserView },\n\t0x01ad: { n:\"Qsi\", f:parse_Qsi },\n\t0x01ae: { n:\"SupBook\", f:parse_SupBook },\n\t0x01af: { n:\"Prot4Rev\", f:parse_Prot4Rev },\n\t0x01b0: { n:\"CondFmt\", f:parse_CondFmt },\n\t0x01b1: { n:\"CF\", f:parse_CF },\n\t0x01b2: { n:\"DVal\", f:parse_DVal },\n\t0x01b5: { n:\"DConBin\", f:parse_DConBin },\n\t0x01b6: { n:\"TxO\", f:parse_TxO },\n\t0x01b7: { n:\"RefreshAll\", f:parse_RefreshAll },\n\t0x01b8: { n:\"HLink\", f:parse_HLink },\n\t0x01b9: { n:\"Lel\", f:parse_Lel },\n\t0x01ba: { n:\"CodeName\", f:parse_XLSCodeName },\n\t0x01bb: { n:\"SXFDBType\", f:parse_SXFDBType },\n\t0x01bc: { n:\"Prot4RevPass\", f:parse_Prot4RevPass },\n\t0x01bd: { n:\"ObNoMacros\", f:parse_ObNoMacros },\n\t0x01be: { n:\"Dv\", f:parse_Dv },\n\t0x01c0: { n:\"Excel9File\", f:parse_Excel9File },\n\t0x01c1: { n:\"RecalcId\", f:parse_RecalcId, r:2},\n\t0x01c2: { n:\"EntExU2\", f:parse_EntExU2 },\n\t0x0200: { n:\"Dimensions\", f:parse_Dimensions },\n\t0x0201: { n:\"Blank\", f:parse_Blank },\n\t0x0203: { n:\"Number\", f:parse_Number },\n\t0x0204: { n:\"Label\", f:parse_Label },\n\t0x0205: { n:\"BoolErr\", f:parse_BoolErr },\n\t0x0207: { n:\"String\", f:parse_String },\n\t0x0208: { n:'Row', f:parse_Row },\n\t0x020b: { n:\"Index\", f:parse_Index },\n\t0x0221: { n:\"Array\", f:parse_Array },\n\t0x0225: { n:\"DefaultRowHeight\", f:parse_DefaultRowHeight },\n\t0x0236: { n:\"Table\", f:parse_Table },\n\t0x023e: { n:\"Window2\", f:parse_Window2 },\n\t0x027e: { n:\"RK\", f:parse_RK },\n\t0x0293: { n:\"Style\", f:parse_Style },\n\t0x0418: { n:\"BigName\", f:parse_BigName },\n\t0x041e: { n:\"Format\", f:parse_Format },\n\t0x043c: { n:\"ContinueBigName\", f:parse_ContinueBigName },\n\t0x04bc: { n:\"ShrFmla\", f:parse_ShrFmla },\n\t0x0800: { n:\"HLinkTooltip\", f:parse_HLinkTooltip },\n\t0x0801: { n:\"WebPub\", f:parse_WebPub },\n\t0x0802: { n:\"QsiSXTag\", f:parse_QsiSXTag },\n\t0x0803: { n:\"DBQueryExt\", f:parse_DBQueryExt },\n\t0x0804: { n:\"ExtString\", f:parse_ExtString },\n\t0x0805: { n:\"TxtQry\", f:parse_TxtQry },\n\t0x0806: { n:\"Qsir\", f:parse_Qsir },\n\t0x0807: { n:\"Qsif\", f:parse_Qsif },\n\t0x0808: { n:\"RRDTQSIF\", f:parse_RRDTQSIF },\n\t0x0809: { n:'BOF', f:parse_BOF },\n\t0x080a: { n:\"OleDbConn\", f:parse_OleDbConn },\n\t0x080b: { n:\"WOpt\", f:parse_WOpt },\n\t0x080c: { n:\"SXViewEx\", f:parse_SXViewEx },\n\t0x080d: { n:\"SXTH\", f:parse_SXTH },\n\t0x080e: { n:\"SXPIEx\", f:parse_SXPIEx },\n\t0x080f: { n:\"SXVDTEx\", f:parse_SXVDTEx },\n\t0x0810: { n:\"SXViewEx9\", f:parse_SXViewEx9 },\n\t0x0812: { n:\"ContinueFrt\", f:parse_ContinueFrt },\n\t0x0813: { n:\"RealTimeData\", f:parse_RealTimeData },\n\t0x0850: { n:\"ChartFrtInfo\", f:parse_ChartFrtInfo },\n\t0x0851: { n:\"FrtWrapper\", f:parse_FrtWrapper },\n\t0x0852: { n:\"StartBlock\", f:parse_StartBlock },\n\t0x0853: { n:\"EndBlock\", f:parse_EndBlock },\n\t0x0854: { n:\"StartObject\", f:parse_StartObject },\n\t0x0855: { n:\"EndObject\", f:parse_EndObject },\n\t0x0856: { n:\"CatLab\", f:parse_CatLab },\n\t0x0857: { n:\"YMult\", f:parse_YMult },\n\t0x0858: { n:\"SXViewLink\", f:parse_SXViewLink },\n\t0x0859: { n:\"PivotChartBits\", f:parse_PivotChartBits },\n\t0x085a: { n:\"FrtFontList\", f:parse_FrtFontList },\n\t0x0862: { n:\"SheetExt\", f:parse_SheetExt },\n\t0x0863: { n:\"BookExt\", f:parse_BookExt, r:12},\n\t0x0864: { n:\"SXAddl\", f:parse_SXAddl },\n\t0x0865: { n:\"CrErr\", f:parse_CrErr },\n\t0x0866: { n:\"HFPicture\", f:parse_HFPicture },\n\t0x0867: { n:'FeatHdr', f:parse_FeatHdr },\n\t0x0868: { n:\"Feat\", f:parse_Feat },\n\t0x086a: { n:\"DataLabExt\", f:parse_DataLabExt },\n\t0x086b: { n:\"DataLabExtContents\", f:parse_DataLabExtContents },\n\t0x086c: { n:\"CellWatch\", f:parse_CellWatch },\n\t0x0871: { n:\"FeatHdr11\", f:parse_FeatHdr11 },\n\t0x0872: { n:\"Feature11\", f:parse_Feature11 },\n\t0x0874: { n:\"DropDownObjIds\", f:parse_DropDownObjIds },\n\t0x0875: { n:\"ContinueFrt11\", f:parse_ContinueFrt11 },\n\t0x0876: { n:\"DConn\", f:parse_DConn },\n\t0x0877: { n:\"List12\", f:parse_List12 },\n\t0x0878: { n:\"Feature12\", f:parse_Feature12 },\n\t0x0879: { n:\"CondFmt12\", f:parse_CondFmt12 },\n\t0x087a: { n:\"CF12\", f:parse_CF12 },\n\t0x087b: { n:\"CFEx\", f:parse_CFEx },\n\t0x087c: { n:\"XFCRC\", f:parse_XFCRC, r:12 },\n\t0x087d: { n:\"XFExt\", f:parse_XFExt, r:12 },\n\t0x087e: { n:\"AutoFilter12\", f:parse_AutoFilter12 },\n\t0x087f: { n:\"ContinueFrt12\", f:parse_ContinueFrt12 },\n\t0x0884: { n:\"MDTInfo\", f:parse_MDTInfo },\n\t0x0885: { n:\"MDXStr\", f:parse_MDXStr },\n\t0x0886: { n:\"MDXTuple\", f:parse_MDXTuple },\n\t0x0887: { n:\"MDXSet\", f:parse_MDXSet },\n\t0x0888: { n:\"MDXProp\", f:parse_MDXProp },\n\t0x0889: { n:\"MDXKPI\", f:parse_MDXKPI },\n\t0x088a: { n:\"MDB\", f:parse_MDB },\n\t0x088b: { n:\"PLV\", f:parse_PLV },\n\t0x088c: { n:\"Compat12\", f:parse_Compat12, r:12 },\n\t0x088d: { n:\"DXF\", f:parse_DXF },\n\t0x088e: { n:\"TableStyles\", f:parse_TableStyles, r:12 },\n\t0x088f: { n:\"TableStyle\", f:parse_TableStyle },\n\t0x0890: { n:\"TableStyleElement\", f:parse_TableStyleElement },\n\t0x0892: { n:\"StyleExt\", f:parse_StyleExt },\n\t0x0893: { n:\"NamePublish\", f:parse_NamePublish },\n\t0x0894: { n:\"NameCmt\", f:parse_NameCmt },\n\t0x0895: { n:\"SortData\", f:parse_SortData },\n\t0x0896: { n:\"Theme\", f:parse_Theme, r:12 },\n\t0x0897: { n:\"GUIDTypeLib\", f:parse_GUIDTypeLib },\n\t0x0898: { n:\"FnGrp12\", f:parse_FnGrp12 },\n\t0x0899: { n:\"NameFnGrp12\", f:parse_NameFnGrp12 },\n\t0x089a: { n:\"MTRSettings\", f:parse_MTRSettings, r:12 },\n\t0x089b: { n:\"CompressPictures\", f:parse_CompressPictures },\n\t0x089c: { n:\"HeaderFooter\", f:parse_HeaderFooter },\n\t0x089d: { n:\"CrtLayout12\", f:parse_CrtLayout12 },\n\t0x089e: { n:\"CrtMlFrt\", f:parse_CrtMlFrt },\n\t0x089f: { n:\"CrtMlFrtContinue\", f:parse_CrtMlFrtContinue },\n\t0x08a3: { n:\"ForceFullCalculation\", f:parse_ForceFullCalculation },\n\t0x08a4: { n:\"ShapePropsStream\", f:parse_ShapePropsStream },\n\t0x08a5: { n:\"TextPropsStream\", f:parse_TextPropsStream },\n\t0x08a6: { n:\"RichTextStream\", f:parse_RichTextStream },\n\t0x08a7: { n:\"CrtLayout12A\", f:parse_CrtLayout12A },\n\t0x1001: { n:\"Units\", f:parse_Units },\n\t0x1002: { n:\"Chart\", f:parse_Chart },\n\t0x1003: { n:\"Series\", f:parse_Series },\n\t0x1006: { n:\"DataFormat\", f:parse_DataFormat },\n\t0x1007: { n:\"LineFormat\", f:parse_LineFormat },\n\t0x1009: { n:\"MarkerFormat\", f:parse_MarkerFormat },\n\t0x100a: { n:\"AreaFormat\", f:parse_AreaFormat },\n\t0x100b: { n:\"PieFormat\", f:parse_PieFormat },\n\t0x100c: { n:\"AttachedLabel\", f:parse_AttachedLabel },\n\t0x100d: { n:\"SeriesText\", f:parse_SeriesText },\n\t0x1014: { n:\"ChartFormat\", f:parse_ChartFormat },\n\t0x1015: { n:\"Legend\", f:parse_Legend },\n\t0x1016: { n:\"SeriesList\", f:parse_SeriesList },\n\t0x1017: { n:\"Bar\", f:parse_Bar },\n\t0x1018: { n:\"Line\", f:parse_Line },\n\t0x1019: { n:\"Pie\", f:parse_Pie },\n\t0x101a: { n:\"Area\", f:parse_Area },\n\t0x101b: { n:\"Scatter\", f:parse_Scatter },\n\t0x101c: { n:\"CrtLine\", f:parse_CrtLine },\n\t0x101d: { n:\"Axis\", f:parse_Axis },\n\t0x101e: { n:\"Tick\", f:parse_Tick },\n\t0x101f: { n:\"ValueRange\", f:parse_ValueRange },\n\t0x1020: { n:\"CatSerRange\", f:parse_CatSerRange },\n\t0x1021: { n:\"AxisLine\", f:parse_AxisLine },\n\t0x1022: { n:\"CrtLink\", f:parse_CrtLink },\n\t0x1024: { n:\"DefaultText\", f:parse_DefaultText },\n\t0x1025: { n:\"Text\", f:parse_Text },\n\t0x1026: { n:\"FontX\", f:parse_FontX },\n\t0x1027: { n:\"ObjectLink\", f:parse_ObjectLink },\n\t0x1032: { n:\"Frame\", f:parse_Frame },\n\t0x1033: { n:\"Begin\", f:parse_Begin },\n\t0x1034: { n:\"End\", f:parse_End },\n\t0x1035: { n:\"PlotArea\", f:parse_PlotArea },\n\t0x103a: { n:\"Chart3d\", f:parse_Chart3d },\n\t0x103c: { n:\"PicF\", f:parse_PicF },\n\t0x103d: { n:\"DropBar\", f:parse_DropBar },\n\t0x103e: { n:\"Radar\", f:parse_Radar },\n\t0x103f: { n:\"Surf\", f:parse_Surf },\n\t0x1040: { n:\"RadarArea\", f:parse_RadarArea },\n\t0x1041: { n:\"AxisParent\", f:parse_AxisParent },\n\t0x1043: { n:\"LegendException\", f:parse_LegendException },\n\t0x1044: { n:\"ShtProps\", f:parse_ShtProps },\n\t0x1045: { n:\"SerToCrt\", f:parse_SerToCrt },\n\t0x1046: { n:\"AxesUsed\", f:parse_AxesUsed },\n\t0x1048: { n:\"SBaseRef\", f:parse_SBaseRef },\n\t0x104a: { n:\"SerParent\", f:parse_SerParent },\n\t0x104b: { n:\"SerAuxTrend\", f:parse_SerAuxTrend },\n\t0x104e: { n:\"IFmtRecord\", f:parse_IFmtRecord },\n\t0x104f: { n:\"Pos\", f:parse_Pos },\n\t0x1050: { n:\"AlRuns\", f:parse_AlRuns },\n\t0x1051: { n:\"BRAI\", f:parse_BRAI },\n\t0x105b: { n:\"SerAuxErrBar\", f:parse_SerAuxErrBar },\n\t0x105c: { n:\"ClrtClient\", f:parse_ClrtClient },\n\t0x105d: { n:\"SerFmt\", f:parse_SerFmt },\n\t0x105f: { n:\"Chart3DBarShape\", f:parse_Chart3DBarShape },\n\t0x1060: { n:\"Fbi\", f:parse_Fbi },\n\t0x1061: { n:\"BopPop\", f:parse_BopPop },\n\t0x1062: { n:\"AxcExt\", f:parse_AxcExt },\n\t0x1063: { n:\"Dat\", f:parse_Dat },\n\t0x1064: { n:\"PlotGrowth\", f:parse_PlotGrowth },\n\t0x1065: { n:\"SIIndex\", f:parse_SIIndex },\n\t0x1066: { n:\"GelFrame\", f:parse_GelFrame },\n\t0x1067: { n:\"BopPopCustom\", f:parse_BopPopCustom },\n\t0x1068: { n:\"Fbi2\", f:parse_Fbi2 },\n\n\t/* These are specified in an older version of the spec */\n\t0x0016: { n:\"ExternCount\", f:parsenoop },\n\t0x007e: { n:\"RK\", f:parsenoop }, /* Not necessarily same as 0x027e */\n\t0x007f: { n:\"ImData\", f:parsenoop },\n\t0x0087: { n:\"Addin\", f:parsenoop },\n\t0x0088: { n:\"Edg\", f:parsenoop },\n\t0x0089: { n:\"Pub\", f:parsenoop },\n\t0x0091: { n:\"Sub\", f:parsenoop },\n\t0x0094: { n:\"LHRecord\", f:parsenoop },\n\t0x0095: { n:\"LHNGraph\", f:parsenoop },\n\t0x0096: { n:\"Sound\", f:parsenoop },\n\t0x00a9: { n:\"CoordList\", f:parsenoop },\n\t0x00ab: { n:\"GCW\", f:parsenoop },\n\t0x00bc: { n:\"ShrFmla\", f:parsenoop }, /* Not necessarily same as 0x04bc */\n\t0x00c2: { n:\"AddMenu\", f:parsenoop },\n\t0x00c3: { n:\"DelMenu\", f:parsenoop },\n\t0x00d6: { n:\"RString\", f:parsenoop },\n\t0x00df: { n:\"UDDesc\", f:parsenoop },\n\t0x00ea: { n:\"TabIdConf\", f:parsenoop },\n\t0x0162: { n:\"XL5Modify\", f:parsenoop },\n\t0x01a5: { n:\"FileSharing2\", f:parsenoop },\n\t0x0218: { n:\"Name\", f:parsenoop },\n\t0x0223: { n:\"ExternName\", f:parse_ExternName },\n\t0x0231: { n:\"Font\", f:parsenoop },\n\t0x0406: { n:\"Formula\", f:parse_Formula },\n\t0x086d: { n:\"FeatInfo\", f:parsenoop },\n\t0x0873: { n:\"FeatInfo11\", f:parsenoop },\n\t0x0881: { n:\"SXAddl12\", f:parsenoop },\n\t0x08c0: { n:\"AutoWebPub\", f:parsenoop },\n\t0x08c1: { n:\"ListObj\", f:parsenoop },\n\t0x08c2: { n:\"ListField\", f:parsenoop },\n\t0x08c3: { n:\"ListDV\", f:parsenoop },\n\t0x08c4: { n:\"ListCondFmt\", f:parsenoop },\n\t0x08c5: { n:\"ListCF\", f:parsenoop },\n\t0x08c6: { n:\"FMQry\", f:parsenoop },\n\t0x08c7: { n:\"FMSQry\", f:parsenoop },\n\t0x08c8: { n:\"PLV\", f:parsenoop }, /* supposedly PLV for Excel 11 */\n\t0x08c9: { n:\"LnExt\", f:parsenoop },\n\t0x08ca: { n:\"MkrExt\", f:parsenoop },\n\t0x08cb: { n:\"CrtCoopt\", f:parsenoop },\n\n\t0x0000: {}\n};\n\n\n/* Helper function to call out to ODS parser */\nfunction parse_ods(zip, opts) {\n\tif(typeof module !== \"undefined\" && typeof require !== 'undefined' && typeof ODS === 'undefined') ODS = require('./od' + 's');\n\tif(typeof ODS === 'undefined' || !ODS.parse_ods) throw new Error(\"Unsupported ODS\");\n\treturn ODS.parse_ods(zip, opts);\n}\nfunction fix_opts_func(defaults) {\n\treturn function fix_opts(opts) {\n\t\tfor(var i = 0; i != defaults.length; ++i) {\n\t\t\tvar d = defaults[i];\n\t\t\tif(opts[d[0]] === undefined) opts[d[0]] = d[1];\n\t\t\tif(d[2] === 'n') opts[d[0]] = Number(opts[d[0]]);\n\t\t}\n\t};\n}\n\nvar fix_read_opts = fix_opts_func([\n\t['cellNF', false], /* emit cell number format string as .z */\n\t['cellHTML', true], /* emit html string as .h */\n\t['cellFormula', true], /* emit formulae as .f */\n\t['cellStyles', false], /* emits style/theme as .s */\n\t['cellDates', false], /* emit date cells with type `d` */\n\n\t['sheetStubs', false], /* emit empty cells */\n\t['sheetRows', 0, 'n'], /* read n rows (0 = read all rows) */\n\n\t['bookDeps', false], /* parse calculation chains */\n\t['bookSheets', false], /* only try to get sheet names (no Sheets) */\n\t['bookProps', false], /* only try to get properties (no Sheets) */\n\t['bookFiles', false], /* include raw file structure (keys, files, cfb) */\n\t['bookVBA', false], /* include vba raw data (vbaraw) */\n\n\t['password',''], /* password */\n\t['WTF', false] /* WTF mode (throws errors) */\n]);\n\n\nvar fix_write_opts = fix_opts_func([\n\t['cellDates', false], /* write date cells with type `d` */\n\n\t['bookSST', false], /* Generate Shared String Table */\n\n\t['bookType', 'xlsx'], /* Type of workbook (xlsx/m/b) */\n\n\t['WTF', false] /* WTF mode (throws errors) */\n]);\nfunction safe_parse_wbrels(wbrels, sheets) {\n\tif(!wbrels) return 0;\n\ttry {\n\t\twbrels = sheets.map(function pwbr(w) { return [w.name, wbrels['!id'][w.id].Target]; });\n\t} catch(e) { return null; }\n\treturn !wbrels || wbrels.length === 0 ? null : wbrels;\n}\n\nfunction safe_parse_ws(zip, path, relsPath, sheet, sheetRels, sheets, opts) {\n\ttry {\n\t\tsheetRels[sheet]=parse_rels(getzipdata(zip, relsPath, true), path);\n\t\tsheets[sheet]=parse_ws(getzipdata(zip, path),path,opts,sheetRels[sheet]);\n\t} catch(e) { if(opts.WTF) throw e; }\n}\n\nvar nodirs = function nodirs(x){return x.substr(-1) != '/';};\nfunction parse_zip(zip, opts) {\n\tmake_ssf(SSF);\n\topts = opts || {};\n\tfix_read_opts(opts);\n\treset_cp();\n\n\t/* OpenDocument Part 3 Section 2.2.1 OpenDocument Package */\n\tif(safegetzipfile(zip, 'META-INF/manifest.xml')) return parse_ods(zip, opts);\n\n\tvar entries = keys(zip.files).filter(nodirs).sort();\n\tvar dir = parse_ct(getzipdata(zip, '[Content_Types].xml'), opts);\n\tvar xlsb = false;\n\tvar sheets, binname;\n\tif(dir.workbooks.length === 0) {\n\t\tbinname = \"xl/workbook.xml\";\n\t\tif(getzipdata(zip,binname, true)) dir.workbooks.push(binname);\n\t}\n\tif(dir.workbooks.length === 0) {\n\t\tbinname = \"xl/workbook.bin\";\n\t\tif(!getzipfile(zip,binname,true)) throw new Error(\"Could not find workbook\");\n\t\tdir.workbooks.push(binname);\n\t\txlsb = true;\n\t}\n\tif(dir.workbooks[0].substr(-3) == \"bin\") xlsb = true;\n\tif(xlsb) set_cp(1200);\n\n\tif(!opts.bookSheets && !opts.bookProps) {\n\t\tstrs = [];\n\t\tif(dir.sst) strs=parse_sst(getzipdata(zip, dir.sst.replace(/^\\//,'')), dir.sst, opts);\n\n\t\tstyles = {};\n\t\tif(dir.style) styles = parse_sty(getzipdata(zip, dir.style.replace(/^\\//,'')),dir.style, opts);\n\n\t\tthemes = {};\n\t\tif(opts.cellStyles && dir.themes.length) themes = parse_theme(getzipdata(zip, dir.themes[0].replace(/^\\//,''), true),dir.themes[0], opts);\n\t}\n\n\tvar wb = parse_wb(getzipdata(zip, dir.workbooks[0].replace(/^\\//,'')), dir.workbooks[0], opts);\n\n\tvar props = {}, propdata = \"\";\n\n\tif(dir.coreprops.length !== 0) {\n\t\tpropdata = getzipdata(zip, dir.coreprops[0].replace(/^\\//,''), true);\n\t\tif(propdata) props = parse_core_props(propdata);\n\t\tif(dir.extprops.length !== 0) {\n\t\t\tpropdata = getzipdata(zip, dir.extprops[0].replace(/^\\//,''), true);\n\t\t\tif(propdata) parse_ext_props(propdata, props);\n\t\t}\n\t}\n\n\tvar custprops = {};\n\tif(!opts.bookSheets || opts.bookProps) {\n\t\tif (dir.custprops.length !== 0) {\n\t\t\tpropdata = getzipdata(zip, dir.custprops[0].replace(/^\\//,''), true);\n\t\t\tif(propdata) custprops = parse_cust_props(propdata, opts);\n\t\t}\n\t}\n\n\tvar out = {};\n\tif(opts.bookSheets || opts.bookProps) {\n\t\tif(props.Worksheets && props.SheetNames.length > 0) sheets=props.SheetNames;\n\t\telse if(wb.Sheets) sheets = wb.Sheets.map(function pluck(x){ return x.name; });\n\t\tif(opts.bookProps) { out.Props = props; out.Custprops = custprops; }\n\t\tif(typeof sheets !== 'undefined') out.SheetNames = sheets;\n\t\tif(opts.bookSheets ? out.SheetNames : opts.bookProps) return out;\n\t}\n\tsheets = {};\n\n\tvar deps = {};\n\tif(opts.bookDeps && dir.calcchain) deps=parse_cc(getzipdata(zip, dir.calcchain.replace(/^\\//,'')),dir.calcchain,opts);\n\n\tvar i=0;\n\tvar sheetRels = {};\n\tvar path, relsPath;\n\tif(!props.Worksheets) {\n\t\tvar wbsheets = wb.Sheets;\n\t\tprops.Worksheets = wbsheets.length;\n\t\tprops.SheetNames = [];\n\t\tfor(var j = 0; j != wbsheets.length; ++j) {\n\t\t\tprops.SheetNames[j] = wbsheets[j].name;\n\t\t}\n\t}\n\n\tvar wbext = xlsb ? \"bin\" : \"xml\";\n\tvar wbrelsfile = 'xl/_rels/workbook.' + wbext + '.rels';\n\tvar wbrels = parse_rels(getzipdata(zip, wbrelsfile, true), wbrelsfile);\n\tif(wbrels) wbrels = safe_parse_wbrels(wbrels, wb.Sheets);\n\t/* Numbers iOS hack */\n\tvar nmode = (getzipdata(zip,\"xl/worksheets/sheet.xml\",true))?1:0;\n\tfor(i = 0; i != props.Worksheets; ++i) {\n\t\tif(wbrels) path = 'xl/' + (wbrels[i][1]).replace(/[\\/]?xl\\//, \"\");\n\t\telse {\n\t\t\tpath = 'xl/worksheets/sheet'+(i+1-nmode)+\".\" + wbext;\n\t\t\tpath = path.replace(/sheet0\\./,\"sheet.\");\n\t\t}\n\t\trelsPath = path.replace(/^(.*)(\\/)([^\\/]*)$/, \"$1/_rels/$3.rels\");\n\t\tsafe_parse_ws(zip, path, relsPath, props.SheetNames[i], sheetRels, sheets, opts);\n\t}\n\n\tif(dir.comments) parse_comments(zip, dir.comments, sheets, sheetRels, opts);\n\n\tout = {\n\t\tDirectory: dir,\n\t\tWorkbook: wb,\n\t\tProps: props,\n\t\tCustprops: custprops,\n\t\tDeps: deps,\n\t\tSheets: sheets,\n\t\tSheetNames: props.SheetNames,\n\t\tStrings: strs,\n\t\tStyles: styles,\n\t\tThemes: themes,\n\t\tSSF: SSF.get_table()\n\t};\n\tif(opts.bookFiles) {\n\t\tout.keys = entries;\n\t\tout.files = zip.files;\n\t}\n\tif(opts.bookVBA) {\n\t\tif(dir.vba.length > 0) out.vbaraw = getzipdata(zip,dir.vba[0],true);\n\t\telse if(dir.defaults.bin === 'application/vnd.ms-office.vbaProject') out.vbaraw = getzipdata(zip,'xl/vbaProject.bin',true);\n\t}\n\treturn out;\n}\nfunction add_rels(rels, rId, f, type, relobj) {\n\tif(!relobj) relobj = {};\n\tif(!rels['!id']) rels['!id'] = {};\n\trelobj.Id = 'rId' + rId;\n\trelobj.Type = type;\n\trelobj.Target = f;\n\tif(rels['!id'][relobj.Id]) throw new Error(\"Cannot rewrite rId \" + rId);\n\trels['!id'][relobj.Id] = relobj;\n\trels[('/' + relobj.Target).replace(\"//\",\"/\")] = relobj;\n}\n\nfunction write_zip(wb, opts) {\n\tif(wb && !wb.SSF) {\n\t\twb.SSF = SSF.get_table();\n\t}\n\tif(wb && wb.SSF) {\n\t\tmake_ssf(SSF); SSF.load_table(wb.SSF);\n\t\topts.revssf = evert_num(wb.SSF); opts.revssf[wb.SSF[65535]] = 0;\n\t}\n\topts.rels = {}; opts.wbrels = {};\n\topts.Strings = []; opts.Strings.Count = 0; opts.Strings.Unique = 0;\n\tvar wbext = opts.bookType == \"xlsb\" ? \"bin\" : \"xml\";\n\tvar ct = { workbooks: [], sheets: [], calcchains: [], themes: [], styles: [],\n\t\tcoreprops: [], extprops: [], custprops: [], strs:[], comments: [], vba: [],\n\t\tTODO:[], rels:[], xmlns: \"\" };\n\tfix_write_opts(opts = opts || {});\n\tvar zip = new jszip();\n\tvar f = \"\", rId = 0;\n\n\topts.cellXfs = [];\n\tget_cell_style(opts.cellXfs, {}, {revssf:{\"General\":0}});\n\n\tf = \"docProps/core.xml\";\n\tzip.file(f, write_core_props(wb.Props, opts));\n\tct.coreprops.push(f);\n\tadd_rels(opts.rels, 2, f, RELS.CORE_PROPS);\n\n\tf = \"docProps/app.xml\";\n\tif(!wb.Props) wb.Props = {};\n\twb.Props.SheetNames = wb.SheetNames;\n\twb.Props.Worksheets = wb.SheetNames.length;\n\tzip.file(f, write_ext_props(wb.Props, opts));\n\tct.extprops.push(f);\n\tadd_rels(opts.rels, 3, f, RELS.EXT_PROPS);\n\n\tif(wb.Custprops !== wb.Props && keys(wb.Custprops||{}).length > 0) {\n\t\tf = \"docProps/custom.xml\";\n\t\tzip.file(f, write_cust_props(wb.Custprops, opts));\n\t\tct.custprops.push(f);\n\t\tadd_rels(opts.rels, 4, f, RELS.CUST_PROPS);\n\t}\n\n\tf = \"xl/workbook.\" + wbext;\n\tzip.file(f, write_wb(wb, f, opts));\n\tct.workbooks.push(f);\n\tadd_rels(opts.rels, 1, f, RELS.WB);\n\n\tfor(rId=1;rId <= wb.SheetNames.length; ++rId) {\n\t\tf = \"xl/worksheets/sheet\" + rId + \".\" + wbext;\n\t\tzip.file(f, write_ws(rId-1, f, opts, wb));\n\t\tct.sheets.push(f);\n\t\tadd_rels(opts.wbrels, rId, \"worksheets/sheet\" + rId + \".\" + wbext, RELS.WS);\n\t}\n\n\tif(opts.Strings != null && opts.Strings.length > 0) {\n\t\tf = \"xl/sharedStrings.\" + wbext;\n\t\tzip.file(f, write_sst(opts.Strings, f, opts));\n\t\tct.strs.push(f);\n\t\tadd_rels(opts.wbrels, ++rId, \"sharedStrings.\" + wbext, RELS.SST);\n\t}\n\n\t/* TODO: something more intelligent with themes */\n\n\tf = \"xl/theme/theme1.xml\";\n\tzip.file(f, write_theme());\n\tct.themes.push(f);\n\tadd_rels(opts.wbrels, ++rId, \"theme/theme1.xml\", RELS.THEME);\n\n\t/* TODO: something more intelligent with styles */\n\n\tf = \"xl/styles.\" + wbext;\n\tzip.file(f, write_sty(wb, f, opts));\n\tct.styles.push(f);\n\tadd_rels(opts.wbrels, ++rId, \"styles.\" + wbext, RELS.STY);\n\n\tzip.file(\"[Content_Types].xml\", write_ct(ct, opts));\n\tzip.file('_rels/.rels', write_rels(opts.rels));\n\tzip.file('xl/_rels/workbook.' + wbext + '.rels', write_rels(opts.wbrels));\n\treturn zip;\n}\nfunction firstbyte(f,o) {\n\tswitch((o||{}).type || \"base64\") {\n\t\tcase 'buffer': return f[0];\n\t\tcase 'base64': return Base64.decode(f.substr(0,12)).charCodeAt(0);\n\t\tcase 'binary': return f.charCodeAt(0);\n\t\tcase 'array': return f[0];\n\t\tdefault: throw new Error(\"Unrecognized type \" + o.type);\n\t}\n}\n\nfunction read_zip(data, opts) {\n\tvar zip, d = data;\n\tvar o = opts||{};\n\tif(!o.type) o.type = (has_buf && Buffer.isBuffer(data)) ? \"buffer\" : \"base64\";\n\tswitch(o.type) {\n\t\tcase \"base64\": zip = new jszip(d, { base64:true }); break;\n\t\tcase \"binary\": case \"array\": zip = new jszip(d, { base64:false }); break;\n\t\tcase \"buffer\": zip = new jszip(d); break;\n\t\tcase \"file\": zip=new jszip(d=_fs.readFileSync(data)); break;\n\t\tdefault: throw new Error(\"Unrecognized type \" + o.type);\n\t}\n\treturn parse_zip(zip, o);\n}\n\nfunction readSync(data, opts) {\n\tvar zip, d = data, isfile = false, n;\n\tvar o = opts||{};\n\tif(!o.type) o.type = (has_buf && Buffer.isBuffer(data)) ? \"buffer\" : \"base64\";\n\tif(o.type == \"file\") { isfile = true; o.type = \"buffer\"; d = _fs.readFileSync(data); }\n\tswitch((n = firstbyte(d, o))) {\n\t\tcase 0xD0:\n\t\t\tif(isfile) o.type = \"file\";\n\t\t\treturn parse_xlscfb(CFB.read(data, o), o);\n\t\tcase 0x09: return parse_xlscfb(s2a(o.type === 'base64' ? Base64.decode(data) : data), o);\n\t\tcase 0x3C: return parse_xlml(d, o);\n\t\tcase 0x50:\n\t\t\tif(isfile) o.type = \"file\";\n\t\t\treturn read_zip(data, opts);\n\t\tdefault: throw new Error(\"Unsupported file \" + n);\n\t}\n}\n\nfunction readFileSync(data, opts) {\n\tvar o = opts||{}; o.type = 'file';\n\treturn readSync(data, o);\n}\nfunction write_zip_type(wb, opts) {\n\tvar o = opts||{};\n\tvar z = write_zip(wb, o);\n\tswitch(o.type) {\n\t\tcase \"base64\": return z.generate({type:\"base64\"});\n\t\tcase \"binary\": return z.generate({type:\"string\"});\n\t\tcase \"buffer\": return z.generate({type:\"nodebuffer\"});\n\t\tcase \"file\": return _fs.writeFileSync(o.file, z.generate({type:\"nodebuffer\"}));\n\t\tdefault: throw new Error(\"Unrecognized type \" + o.type);\n\t}\n}\n\nfunction writeSync(wb, opts) {\n\tvar o = opts||{};\n\tswitch(o.bookType) {\n\t\tcase 'xml': return write_xlml(wb, o);\n\t\tdefault: return write_zip_type(wb, o);\n\t}\n}\n\nfunction writeFileSync(wb, filename, opts) {\n\tvar o = opts||{}; o.type = 'file';\n\to.file = filename;\n\tswitch(o.file.substr(-5).toLowerCase()) {\n\t\tcase '.xlsx': o.bookType = 'xlsx'; break;\n\t\tcase '.xlsm': o.bookType = 'xlsm'; break;\n\t\tcase '.xlsb': o.bookType = 'xlsb'; break;\n\tdefault: switch(o.file.substr(-4).toLowerCase()) {\n\t\tcase '.xls': o.bookType = 'xls'; break;\n\t\tcase '.xml': o.bookType = 'xml'; break;\n\t}}\n\treturn writeSync(wb, o);\n}\n\nfunction decode_row(rowstr) { return parseInt(unfix_row(rowstr),10) - 1; }\nfunction encode_row(row) { return \"\" + (row + 1); }\nfunction fix_row(cstr) { return cstr.replace(/([A-Z]|^)(\\d+)$/,\"$1$$$2\"); }\nfunction unfix_row(cstr) { return cstr.replace(/\\$(\\d+)$/,\"$1\"); }\n\nfunction 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; }\nfunction encode_col(col) { var s=\"\"; for(++col; col; col=Math.floor((col-1)/26)) s = String.fromCharCode(((col-1)%26) + 65) + s; return s; }\nfunction fix_col(cstr) { return cstr.replace(/^([A-Z])/,\"$$$1\"); }\nfunction unfix_col(cstr) { return cstr.replace(/^\\$([A-Z])/,\"$1\"); }\n\nfunction split_cell(cstr) { return cstr.replace(/(\\$?[A-Z]*)(\\$?\\d*)/,\"$1,$2\").split(\",\"); }\nfunction decode_cell(cstr) { var splt = split_cell(cstr); return { c:decode_col(splt[0]), r:decode_row(splt[1]) }; }\nfunction encode_cell(cell) { return encode_col(cell.c) + encode_row(cell.r); }\nfunction fix_cell(cstr) { return fix_col(fix_row(cstr)); }\nfunction unfix_cell(cstr) { return unfix_col(unfix_row(cstr)); }\nfunction decode_range(range) { var x =range.split(\":\").map(decode_cell); return {s:x[0],e:x[x.length-1]}; }\nfunction encode_range(cs,ce) {\n\tif(ce === undefined || typeof ce === 'number') return encode_range(cs.s, cs.e);\n\tif(typeof cs !== 'string') cs = encode_cell(cs); if(typeof ce !== 'string') ce = encode_cell(ce);\n\treturn cs == ce ? cs : cs + \":\" + ce;\n}\n\nfunction safe_decode_range(range) {\n\tvar o = {s:{c:0,r:0},e:{c:0,r:0}};\n\tvar idx = 0, i = 0, cc = 0;\n\tvar len = range.length;\n\tfor(idx = 0; i < len; ++i) {\n\t\tif((cc=range.charCodeAt(i)-64) < 1 || cc > 26) break;\n\t\tidx = 26*idx + cc;\n\t}\n\to.s.c = --idx;\n\n\tfor(idx = 0; i < len; ++i) {\n\t\tif((cc=range.charCodeAt(i)-48) < 0 || cc > 9) break;\n\t\tidx = 10*idx + cc;\n\t}\n\to.s.r = --idx;\n\n\tif(i === len || range.charCodeAt(++i) === 58) { o.e.c=o.s.c; o.e.r=o.s.r; return o; }\n\n\tfor(idx = 0; i != len; ++i) {\n\t\tif((cc=range.charCodeAt(i)-64) < 1 || cc > 26) break;\n\t\tidx = 26*idx + cc;\n\t}\n\to.e.c = --idx;\n\n\tfor(idx = 0; i != len; ++i) {\n\t\tif((cc=range.charCodeAt(i)-48) < 0 || cc > 9) break;\n\t\tidx = 10*idx + cc;\n\t}\n\to.e.r = --idx;\n\treturn o;\n}\n\nfunction safe_format_cell(cell, v) {\n\tif(cell.z !== undefined) try { return (cell.w = SSF.format(cell.z, v)); } catch(e) { }\n\tif(!cell.XF) return v;\n\ttry { return (cell.w = SSF.format(cell.XF.ifmt||0, v)); } catch(e) { return ''+v; }\n}\n\nfunction format_cell(cell, v) {\n\tif(cell == null || cell.t == null) return \"\";\n\tif(cell.w !== undefined) return cell.w;\n\tif(v === undefined) return safe_format_cell(cell, cell.v);\n\treturn safe_format_cell(cell, v);\n}\n\nfunction sheet_to_json(sheet, opts){\n\tvar val, row, range, header = 0, offset = 1, r, hdr = [], isempty, R, C, v;\n\tvar o = opts != null ? opts : {};\n\tvar raw = o.raw;\n\tif(sheet == null || sheet[\"!ref\"] == null) return [];\n\trange = o.range !== undefined ? o.range : sheet[\"!ref\"];\n\tif(o.header === 1) header = 1;\n\telse if(o.header === \"A\") header = 2;\n\telse if(Array.isArray(o.header)) header = 3;\n\tswitch(typeof range) {\n\t\tcase 'string': r = safe_decode_range(range); break;\n\t\tcase 'number': r = safe_decode_range(sheet[\"!ref\"]); r.s.r = range; break;\n\t\tdefault: r = range;\n\t}\n\tif(header > 0) offset = 0;\n\tvar rr = encode_row(r.s.r);\n\tvar cols = new Array(r.e.c-r.s.c+1);\n\tvar out = new Array(r.e.r-r.s.r-offset+1);\n\tvar outi = 0;\n\tfor(C = r.s.c; C <= r.e.c; ++C) {\n\t\tcols[C] = encode_col(C);\n\t\tval = sheet[cols[C] + rr];\n\t\tswitch(header) {\n\t\t\tcase 1: hdr[C] = C; break;\n\t\t\tcase 2: hdr[C] = cols[C]; break;\n\t\t\tcase 3: hdr[C] = o.header[C - r.s.c]; break;\n\t\t\tdefault:\n\t\t\t\tif(val === undefined) continue;\n\t\t\t\thdr[C] = format_cell(val);\n\t\t}\n\t}\n\n\tfor (R = r.s.r + offset; R <= r.e.r; ++R) {\n\t\trr = encode_row(R);\n\t\tisempty = true;\n\t\tif(header === 1) row = [];\n\t\telse {\n\t\t\trow = {};\n\t\t\tif(Object.defineProperty) Object.defineProperty(row, '__rowNum__', {value:R, enumerable:false});\n\t\t\telse row.__rowNum__ = R;\n\t\t}\n\t\tfor (C = r.s.c; C <= r.e.c; ++C) {\n\t\t\tval = sheet[cols[C] + rr];\n\t\t\tif(val === undefined || val.t === undefined) continue;\n\t\t\tv = val.v;\n\t\t\tswitch(val.t){\n\t\t\t\tcase 'e': continue;\n\t\t\t\tcase 's': break;\n\t\t\t\tcase 'b': case 'n': break;\n\t\t\t\tdefault: throw 'unrecognized type ' + val.t;\n\t\t\t}\n\t\t\tif(v !== undefined) {\n\t\t\t\trow[hdr[C]] = raw ? v : format_cell(val,v);\n\t\t\t\tisempty = false;\n\t\t\t}\n\t\t}\n\t\tif(isempty === false || header === 1) out[outi++] = row;\n\t}\n\tout.length = outi;\n\treturn out;\n}\n\nfunction sheet_to_row_object_array(sheet, opts) { return sheet_to_json(sheet, opts != null ? opts : {}); }\n\nfunction sheet_to_csv(sheet, opts) {\n\tvar out = \"\", txt = \"\", qreg = /\"/g;\n\tvar o = opts == null ? {} : opts;\n\tif(sheet == null || sheet[\"!ref\"] == null) return \"\";\n\tvar r = safe_decode_range(sheet[\"!ref\"]);\n\tvar FS = o.FS !== undefined ? o.FS : \",\", fs = FS.charCodeAt(0);\n\tvar RS = o.RS !== undefined ? o.RS : \"\\n\", rs = RS.charCodeAt(0);\n\tvar row = \"\", rr = \"\", cols = [];\n\tvar i = 0, cc = 0, val;\n\tvar R = 0, C = 0;\n\tfor(C = r.s.c; C <= r.e.c; ++C) cols[C] = encode_col(C);\n\tfor(R = r.s.r; R <= r.e.r; ++R) {\n\t\trow = \"\";\n\t\trr = encode_row(R);\n\t\tfor(C = r.s.c; C <= r.e.c; ++C) {\n\t\t\tval = sheet[cols[C] + rr];\n\t\t\ttxt = val !== undefined ? ''+format_cell(val) : \"\";\n\t\t\tfor(i = 0, cc = 0; i !== txt.length; ++i) if((cc = txt.charCodeAt(i)) === fs || cc === rs || cc === 34) {\n\t\t\t\ttxt = \"\\\"\" + txt.replace(qreg, '\"\"') + \"\\\"\"; break; }\n\t\t\trow += (C === r.s.c ? \"\" : FS) + txt;\n\t\t}\n\t\tout += row + RS;\n\t}\n\treturn out;\n}\nvar make_csv = sheet_to_csv;\n\nfunction sheet_to_formulae(sheet) {\n\tvar cmds, y = \"\", x, val=\"\";\n\tif(sheet == null || sheet[\"!ref\"] == null) return \"\";\n\tvar r = safe_decode_range(sheet['!ref']), rr = \"\", cols = [], C;\n\tcmds = new Array((r.e.r-r.s.r+1)*(r.e.c-r.s.c+1));\n\tvar i = 0;\n\tfor(C = r.s.c; C <= r.e.c; ++C) cols[C] = encode_col(C);\n\tfor(var R = r.s.r; R <= r.e.r; ++R) {\n\t\trr = encode_row(R);\n\t\tfor(C = r.s.c; C <= r.e.c; ++C) {\n\t\t\ty = cols[C] + rr;\n\t\t\tx = sheet[y];\n\t\t\tval = \"\";\n\t\t\tif(x === undefined) continue;\n\t\t\tif(x.f != null) val = x.f;\n\t\t\telse if(x.w !== undefined) val = \"'\" + x.w;\n\t\t\telse if(x.v === undefined) continue;\n\t\t\telse val = \"\"+x.v;\n\t\t\tcmds[i++] = y + \"=\" + val;\n\t\t}\n\t}\n\tcmds.length = i;\n\treturn cmds;\n}\n\nvar utils = {\n\tencode_col: encode_col,\n\tencode_row: encode_row,\n\tencode_cell: encode_cell,\n\tencode_range: encode_range,\n\tdecode_col: decode_col,\n\tdecode_row: decode_row,\n\tsplit_cell: split_cell,\n\tdecode_cell: decode_cell,\n\tdecode_range: decode_range,\n\tformat_cell: format_cell,\n\tget_formulae: sheet_to_formulae,\n\tmake_csv: sheet_to_csv,\n\tmake_json: sheet_to_json,\n\tmake_formulae: sheet_to_formulae,\n\tsheet_to_csv: sheet_to_csv,\n\tsheet_to_json: sheet_to_json,\n\tsheet_to_formulae: sheet_to_formulae,\n\tsheet_to_row_object_array: sheet_to_row_object_array\n};\nXLSX.parse_xlscfb = parse_xlscfb;\nXLSX.parse_zip = parse_zip;\nXLSX.read = readSync; //xlsread\nXLSX.readFile = readFileSync; //readFile\nXLSX.readFileSync = readFileSync;\nXLSX.write = writeSync;\nXLSX.writeFile = writeFileSync;\nXLSX.writeFileSync = writeFileSync;\nXLSX.utils = utils;\nXLSX.CFB = CFB;\nXLSX.SSF = SSF;\n})(typeof exports !== 'undefined' ? exports : XLSX);\nvar XLS = XLSX;\n$tw.utils.extend(old_exports,exports);exports = old_exports;module.exports=exports;",
"type": "application/javascript",
"title": "$:/plugins/tiddlywiki/xlsx-utils/xlsx.js",
"module-type": "library"
},
"$:/plugins/tiddlywiki/xlsx-utils/dist/cpexcel.js": {
"text": "if($tw.browser){Buffer = undefined;};/* cpexcel.js (C) 2013-2014 SheetJS -- http://sheetjs.com */\n/*jshint -W100 */\nvar cptable = {version:\"1.3.7\"};\ncptable[874] = (function(){ var d = \"\\u0000\\u0001\\u0002\\u0003\\u0004\\u0005\\u0006\\u0007\\b\\t\\n\\u000b\\f\\r\\u000e\\u000f\\u0010\\u0011\\u0012\\u0013\\u0014\\u0015\\u0016\\u0017\\u0018\\u0019\\u001a\\u001b\\u001c\\u001d\\u001e\\u001f !\\\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~€����…�����������‘’“”•–—�������� กขฃคฅฆงจฉชซฌญฎฏฐฑฒณดตถทธนบปผฝพฟภมยรฤลฦวศษสหฬอฮฯะัาำิีึืฺุู����฿เแโใไๅๆ็่้๊๋์ํ๎๏๐๑๒๓๔๕๖๗๘๙๚๛����\", D = [], e = {}; for(var i=0;i!=d.length;++i) { if(d.charCodeAt(i) !== 0xFFFD) e[d[i]] = i; D[i] = d.charAt(i); } return {\"enc\": e, \"dec\": D }; })();\ncptable[932] = (function(){ var d = [], e = {}, D = [], j;\nD[0] = \"\\u0000\\u0001\\u0002\\u0003\\u0004\\u0005\\u0006\\u0007\\b\\t\\n\\u000b\\f\\r\\u000e\\u000f\\u0010\\u0011\\u0012\\u0013\\u0014\\u0015\\u0016\\u0017\\u0018\\u0019\\u001a\\u001b\\u001c\\u001d\\u001e\\u001f !\\\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~���������������������������������。「」、・ヲァィゥェォャュョッーアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワン゙゚��������������������������������\".split(\"\");\nfor(j = 0; j != D[0].length; ++j) if(D[0][j].charCodeAt(0) !== 0xFFFD) { e[D[0][j]] = 0 + j; d[0 + j] = D[0][j];}\nD[129] = \"���������������������������������������������������������������� 、。,.・:;?!゛゜´`¨^ ̄_ヽヾゝゞ〃仝々〆〇ー―‐/\~∥|…‥‘’“”()〔〕[]{}〈〉《》「」『』【】+-±×�÷=≠<>≦≧∞∴♂♀°′″℃¥$¢£%#&*@§☆★○●◎◇◆□■△▲▽▼※〒→←↑↓〓�����������∈∋⊆⊇⊂⊃∪∩��������∧∨¬⇒⇔∀∃�����������∠⊥⌒∂∇≡≒≪≫√∽∝∵∫∬�������ʼn♯♭♪†‡¶����◯���\".split(\"\");\nfor(j = 0; j != D[129].length; ++j) if(D[129][j].charCodeAt(0) !== 0xFFFD) { e[D[129][j]] = 33024 + j; d[33024 + j] = D[129][j];}\nD[130] = \"�������������������������������������������������������������������������������0123456789�������ABCDEFGHIJKLMNOPQRSTUVWXYZ�������abcdefghijklmnopqrstuvwxyz����ぁあぃいぅうぇえぉおかがきぎくぐけげこごさざしじすずせぜそぞただちぢっつづてでとどなにぬねのはばぱひびぴふぶぷへべぺほぼぽまみむめもゃやゅゆょよらりるれろゎわゐゑをん��������������\".split(\"\");\nfor(j = 0; j != D[130].length; ++j) if(D[130][j].charCodeAt(0) !== 0xFFFD) { e[D[130][j]] = 33280 + j; d[33280 + j] = D[130][j];}\nD[131] = \"����������������������������������������������������������������ァアィイゥウェエォオカガキギクグケゲコゴサザシジスズセゼソゾタダチヂッツヅテデトドナニヌネノハバパヒビピフブプヘベペホボポマミ�ムメモャヤュユョヨラリルレロヮワヰヱヲンヴヵヶ��������ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩ��������αβγδεζηθικλμνξοπρστυφχψω�����������������������������������������\".split(\"\");\nfor(j = 0; j != D[131].length; ++j) if(D[131][j].charCodeAt(0) !== 0xFFFD) { e[D[131][j]] = 33536 + j; d[33536 + j] = D[131][j];}\nD[132] = \"����������������������������������������������������������������АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ���������������абвгдеёжзийклмн�опрстуфхцчшщъыьэюя�������������─│┌┐┘└├┬┤┴┼━┃┏┓┛┗┣┳┫┻╋┠┯┨┷┿┝┰┥┸╂�����������������������������������������������������������������\".split(\"\");\nfor(j = 0; j != D[132].length; ++j) if(D[132][j].charCodeAt(0) !== 0xFFFD) { e[D[132][j]] = 33792 + j; d[33792 + j] = D[132][j];}\nD[135] = \"����������������������������������������������������������������①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯⑰⑱⑲⑳ⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩ�㍉㌔㌢㍍㌘㌧㌃㌶㍑㍗㌍㌦㌣㌫㍊㌻㎜㎝㎞㎎㎏㏄㎡��������㍻�〝〟№㏍℡㊤㊥㊦㊧㊨㈱㈲㈹㍾㍽㍼≒≡∫∮∑√⊥∠∟⊿∵∩∪���������������������������������������������������������������������������������������������������\".split(\"\");\nfor(j = 0; j != D[135].length; ++j) if(D[135][j].charCodeAt(0) !== 0xFFFD) { e[D[135][j]] = 34560 + j; d[34560 + j] = D[135][j];}\nD[136] = \"���������������������������������������������������������������������������������������������������������������������������������������������������������������亜唖娃阿哀愛挨姶逢葵茜穐悪握渥旭葦芦鯵梓圧斡扱宛姐虻飴絢綾鮎或粟袷安庵按暗案闇鞍杏以伊位依偉囲夷委威尉惟意慰易椅為畏異移維緯胃萎衣謂違遺医井亥域育郁磯一壱溢逸稲茨芋鰯允印咽員因姻引飲淫胤蔭���\".split(\"\");\nfor(j = 0; j != D[136].length; ++j) if(D[136][j].charCodeAt(0) !== 0xFFFD) { e[D[136][j]] = 34816 + j; d[34816 + j] = D[136][j];}\nD[137] = \"����������������������������������������������������������������院陰隠韻吋右宇烏羽迂雨卯鵜窺丑碓臼渦嘘唄欝蔚鰻姥厩浦瓜閏噂云運雲荏餌叡営嬰影映曳栄永泳洩瑛盈穎頴英衛詠鋭液疫益駅悦謁越閲榎厭円�園堰奄宴延怨掩援沿演炎焔煙燕猿縁艶苑薗遠鉛鴛塩於汚甥凹央奥往応押旺横欧殴王翁襖鴬鴎黄岡沖荻億屋憶臆桶牡乙俺卸恩温穏音下化仮何伽価佳加可嘉夏嫁家寡科暇果架歌河火珂禍禾稼箇花苛茄荷華菓蝦課嘩貨迦過霞蚊俄峨我牙画臥芽蛾賀雅餓駕介会解回塊壊廻快怪悔恢懐戒拐改���\".split(\"\");\nfor(j = 0; j != D[137].length; ++j) if(D[137][j].charCodeAt(0) !== 0xFFFD) { e[D[137][j]] = 35072 + j; d[35072 + j] = D[137][j];}\nD[138] = \"����������������������������������������������������������������魁晦械海灰界皆絵芥蟹開階貝凱劾外咳害崖慨概涯碍蓋街該鎧骸浬馨蛙垣柿蛎鈎劃嚇各廓拡撹格核殻獲確穫覚角赫較郭閣隔革学岳楽額顎掛笠樫�橿梶鰍潟割喝恰括活渇滑葛褐轄且鰹叶椛樺鞄株兜竃蒲釜鎌噛鴨栢茅萱粥刈苅瓦乾侃冠寒刊勘勧巻喚堪姦完官寛干幹患感慣憾換敢柑桓棺款歓汗漢澗潅環甘監看竿管簡緩缶翰肝艦莞観諌貫還鑑間閑関陥韓館舘丸含岸巌玩癌眼岩翫贋雁頑顔願企伎危喜器基奇嬉寄岐希幾忌揮机旗既期棋棄���\".split(\"\");\nfor(j = 0; j != D[138].length; ++j) if(D[138][j].charCodeAt(0) !== 0xFFFD) { e[D[138][j]] = 35328 + j; d[35328 + j] = D[138][j];}\nD[139] = \"����������������������������������������������������������������機帰毅気汽畿祈季稀紀徽規記貴起軌輝飢騎鬼亀偽儀妓宜戯技擬欺犠疑祇義蟻誼議掬菊鞠吉吃喫桔橘詰砧杵黍却客脚虐逆丘久仇休及吸宮弓急救�朽求汲泣灸球究窮笈級糾給旧牛去居巨拒拠挙渠虚許距鋸漁禦魚亨享京供侠僑兇競共凶協匡卿叫喬境峡強彊怯恐恭挟教橋況狂狭矯胸脅興蕎郷鏡響饗驚仰凝尭暁業局曲極玉桐粁僅勤均巾錦斤欣欽琴禁禽筋緊芹菌衿襟謹近金吟銀九倶句区狗玖矩苦躯駆駈駒具愚虞喰空偶寓遇隅串櫛釧屑屈���\".split(\"\");\nfor(j = 0; j != D[139].length; ++j) if(D[139][j].charCodeAt(0) !== 0xFFFD) { e[D[139][j]] = 35584 + j; d[35584 + j] = D[139][j];}\nD[140] = \"����������������������������������������������������������������掘窟沓靴轡窪熊隈粂栗繰桑鍬勲君薫訓群軍郡卦袈祁係傾刑兄啓圭珪型契形径恵慶慧憩掲携敬景桂渓畦稽系経継繋罫茎荊蛍計詣警軽頚鶏芸迎鯨�劇戟撃激隙桁傑欠決潔穴結血訣月件倹倦健兼券剣喧圏堅嫌建憲懸拳捲検権牽犬献研硯絹県肩見謙賢軒遣鍵険顕験鹸元原厳幻弦減源玄現絃舷言諺限乎個古呼固姑孤己庫弧戸故枯湖狐糊袴股胡菰虎誇跨鈷雇顧鼓五互伍午呉吾娯後御悟梧檎瑚碁語誤護醐乞鯉交佼侯候倖光公功効勾厚口向���\".split(\"\");\nfor(j = 0; j != D[140].length; ++j) if(D[140][j].charCodeAt(0) !== 0xFFFD) { e[D[140][j]] = 35840 + j; d[35840 + j] = D[140][j];}\nD[141] = \"����������������������������������������������������������������后喉坑垢好孔孝宏工巧巷幸広庚康弘恒慌抗拘控攻昂晃更杭校梗構江洪浩港溝甲皇硬稿糠紅紘絞綱耕考肯肱腔膏航荒行衡講貢購郊酵鉱砿鋼閤降�項香高鴻剛劫号合壕拷濠豪轟麹克刻告国穀酷鵠黒獄漉腰甑忽惚骨狛込此頃今困坤墾婚恨懇昏昆根梱混痕紺艮魂些佐叉唆嵯左差査沙瑳砂詐鎖裟坐座挫債催再最哉塞妻宰彩才採栽歳済災采犀砕砦祭斎細菜裁載際剤在材罪財冴坂阪堺榊肴咲崎埼碕鷺作削咋搾昨朔柵窄策索錯桜鮭笹匙冊刷���\".split(\"\");\nfor(j = 0; j != D[141].length; ++j) if(D[141][j].charCodeAt(0) !== 0xFFFD) { e[D[141][j]] = 36096 + j; d[36096 + j] = D[141][j];}\nD[142] = \"����������������������������������������������������������������察拶撮擦札殺薩雑皐鯖捌錆鮫皿晒三傘参山惨撒散桟燦珊産算纂蚕讃賛酸餐斬暫残仕仔伺使刺司史嗣四士始姉姿子屍市師志思指支孜斯施旨枝止�死氏獅祉私糸紙紫肢脂至視詞詩試誌諮資賜雌飼歯事似侍児字寺慈持時次滋治爾璽痔磁示而耳自蒔辞汐鹿式識鴫竺軸宍雫七叱執失嫉室悉湿漆疾質実蔀篠偲柴芝屡蕊縞舎写射捨赦斜煮社紗者謝車遮蛇邪借勺尺杓灼爵酌釈錫若寂弱惹主取守手朱殊狩珠種腫趣酒首儒受呪寿授樹綬需囚収周���\".split(\"\");\nfor(j = 0; j != D[142].length; ++j) if(D[142][j].charCodeAt(0) !== 0xFFFD) { e[D[142][j]] = 36352 + j; d[36352 + j] = D[142][j];}\nD[143] = \"����������������������������������������������������������������宗就州修愁拾洲秀秋終繍習臭舟蒐衆襲讐蹴輯週酋酬集醜什住充十従戎柔汁渋獣縦重銃叔夙宿淑祝縮粛塾熟出術述俊峻春瞬竣舜駿准循旬楯殉淳�準潤盾純巡遵醇順処初所暑曙渚庶緒署書薯藷諸助叙女序徐恕鋤除傷償勝匠升召哨商唱嘗奨妾娼宵将小少尚庄床廠彰承抄招掌捷昇昌昭晶松梢樟樵沼消渉湘焼焦照症省硝礁祥称章笑粧紹肖菖蒋蕉衝裳訟証詔詳象賞醤鉦鍾鐘障鞘上丈丞乗冗剰城場壌嬢常情擾条杖浄状畳穣蒸譲醸錠嘱埴飾���\".split(\"\");\nfor(j = 0; j != D[143].length; ++j) if(D[143][j].charCodeAt(0) !== 0xFFFD) { e[D[143][j]] = 36608 + j; d[36608 + j] = D[143][j];}\nD[144] = \"����������������������������������������������������������������拭植殖燭織職色触食蝕辱尻伸信侵唇娠寝審心慎振新晋森榛浸深申疹真神秦紳臣芯薪親診身辛進針震人仁刃塵壬尋甚尽腎訊迅陣靭笥諏須酢図厨�逗吹垂帥推水炊睡粋翠衰遂酔錐錘随瑞髄崇嵩数枢趨雛据杉椙菅頗雀裾澄摺寸世瀬畝是凄制勢姓征性成政整星晴棲栖正清牲生盛精聖声製西誠誓請逝醒青静斉税脆隻席惜戚斥昔析石積籍績脊責赤跡蹟碩切拙接摂折設窃節説雪絶舌蝉仙先千占宣専尖川戦扇撰栓栴泉浅洗染潜煎煽旋穿箭線���\".split(\"\");\nfor(j = 0; j != D[144].length; ++j) if(D[144][j].charCodeAt(0) !== 0xFFFD) { e[D[144][j]] = 36864 + j; d[36864 + j] = D[144][j];}\nD[145] = \"����������������������������������������������������������������繊羨腺舛船薦詮賎践選遷銭銑閃鮮前善漸然全禅繕膳糎噌塑岨措曾曽楚狙疏疎礎祖租粗素組蘇訴阻遡鼠僧創双叢倉喪壮奏爽宋層匝惣想捜掃挿掻�操早曹巣槍槽漕燥争痩相窓糟総綜聡草荘葬蒼藻装走送遭鎗霜騒像増憎臓蔵贈造促側則即息捉束測足速俗属賊族続卒袖其揃存孫尊損村遜他多太汰詑唾堕妥惰打柁舵楕陀駄騨体堆対耐岱帯待怠態戴替泰滞胎腿苔袋貸退逮隊黛鯛代台大第醍題鷹滝瀧卓啄宅托択拓沢濯琢託鐸濁諾茸凧蛸只���\".split(\"\");\nfor(j = 0; j != D[145].length; ++j) if(D[145][j].charCodeAt(0) !== 0xFFFD) { e[D[145][j]] = 37120 + j; d[37120 + j] = D[145][j];}\nD[146] = \"����������������������������������������������������������������叩但達辰奪脱巽竪辿棚谷狸鱈樽誰丹単嘆坦担探旦歎淡湛炭短端箪綻耽胆蛋誕鍛団壇弾断暖檀段男談値知地弛恥智池痴稚置致蜘遅馳築畜竹筑蓄�逐秩窒茶嫡着中仲宙忠抽昼柱注虫衷註酎鋳駐樗瀦猪苧著貯丁兆凋喋寵帖帳庁弔張彫徴懲挑暢朝潮牒町眺聴脹腸蝶調諜超跳銚長頂鳥勅捗直朕沈珍賃鎮陳津墜椎槌追鎚痛通塚栂掴槻佃漬柘辻蔦綴鍔椿潰坪壷嬬紬爪吊釣鶴亭低停偵剃貞呈堤定帝底庭廷弟悌抵挺提梯汀碇禎程締艇訂諦蹄逓���\".split(\"\");\nfor(j = 0; j != D[146].length; ++j) if(D[146][j].charCodeAt(0) !== 0xFFFD) { e[D[146][j]] = 37376 + j; d[37376 + j] = D[146][j];}\nD[147] = \"����������������������������������������������������������������邸鄭釘鼎泥摘擢敵滴的笛適鏑溺哲徹撤轍迭鉄典填天展店添纏甜貼転顛点伝殿澱田電兎吐堵塗妬屠徒斗杜渡登菟賭途都鍍砥砺努度土奴怒倒党冬�凍刀唐塔塘套宕島嶋悼投搭東桃梼棟盗淘湯涛灯燈当痘祷等答筒糖統到董蕩藤討謄豆踏逃透鐙陶頭騰闘働動同堂導憧撞洞瞳童胴萄道銅峠鴇匿得徳涜特督禿篤毒独読栃橡凸突椴届鳶苫寅酉瀞噸屯惇敦沌豚遁頓呑曇鈍奈那内乍凪薙謎灘捺鍋楢馴縄畷南楠軟難汝二尼弐迩匂賑肉虹廿日乳入���\".split(\"\");\nfor(j = 0; j != D[147].length; ++j) if(D[147][j].charCodeAt(0) !== 0xFFFD) { e[D[147][j]] = 37632 + j; d[37632 + j] = D[147][j];}\nD[148] = \"����������������������������������������������������������������如尿韮任妊忍認濡禰祢寧葱猫熱年念捻撚燃粘乃廼之埜嚢悩濃納能脳膿農覗蚤巴把播覇杷波派琶破婆罵芭馬俳廃拝排敗杯盃牌背肺輩配倍培媒梅�楳煤狽買売賠陪這蝿秤矧萩伯剥博拍柏泊白箔粕舶薄迫曝漠爆縛莫駁麦函箱硲箸肇筈櫨幡肌畑畠八鉢溌発醗髪伐罰抜筏閥鳩噺塙蛤隼伴判半反叛帆搬斑板氾汎版犯班畔繁般藩販範釆煩頒飯挽晩番盤磐蕃蛮匪卑否妃庇彼悲扉批披斐比泌疲皮碑秘緋罷肥被誹費避非飛樋簸備尾微枇毘琵眉美���\".split(\"\");\nfor(j = 0; j != D[148].length; ++j) if(D[148][j].charCodeAt(0) !== 0xFFFD) { e[D[148][j]] = 37888 + j; d[37888 + j] = D[148][j];}\nD[149] = \"����������������������������������������������������������������鼻柊稗匹疋髭彦膝菱肘弼必畢筆逼桧姫媛紐百謬俵彪標氷漂瓢票表評豹廟描病秒苗錨鋲蒜蛭鰭品彬斌浜瀕貧賓頻敏瓶不付埠夫婦富冨布府怖扶敷�斧普浮父符腐膚芙譜負賦赴阜附侮撫武舞葡蕪部封楓風葺蕗伏副復幅服福腹複覆淵弗払沸仏物鮒分吻噴墳憤扮焚奮粉糞紛雰文聞丙併兵塀幣平弊柄並蔽閉陛米頁僻壁癖碧別瞥蔑箆偏変片篇編辺返遍便勉娩弁鞭保舗鋪圃捕歩甫補輔穂募墓慕戊暮母簿菩倣俸包呆報奉宝峰峯崩庖抱捧放方朋���\".split(\"\");\nfor(j = 0; j != D[149].length; ++j) if(D[149][j].charCodeAt(0) !== 0xFFFD) { e[D[149][j]] = 38144 + j; d[38144 + j] = D[149][j];}\nD[150] = \"����������������������������������������������������������������法泡烹砲縫胞芳萌蓬蜂褒訪豊邦鋒飽鳳鵬乏亡傍剖坊妨帽忘忙房暴望某棒冒紡肪膨謀貌貿鉾防吠頬北僕卜墨撲朴牧睦穆釦勃没殆堀幌奔本翻凡盆�摩磨魔麻埋妹昧枚毎哩槙幕膜枕鮪柾鱒桝亦俣又抹末沫迄侭繭麿万慢満漫蔓味未魅巳箕岬密蜜湊蓑稔脈妙粍民眠務夢無牟矛霧鵡椋婿娘冥名命明盟迷銘鳴姪牝滅免棉綿緬面麺摸模茂妄孟毛猛盲網耗蒙儲木黙目杢勿餅尤戻籾貰問悶紋門匁也冶夜爺耶野弥矢厄役約薬訳躍靖柳薮鑓愉愈油癒���\".split(\"\");\nfor(j = 0; j != D[150].length; ++j) if(D[150][j].charCodeAt(0) !== 0xFFFD) { e[D[150][j]] = 38400 + j; d[38400 + j] = D[150][j];}\nD[151] = \"����������������������������������������������������������������諭輸唯佑優勇友宥幽悠憂揖有柚湧涌猶猷由祐裕誘遊邑郵雄融夕予余与誉輿預傭幼妖容庸揚揺擁曜楊様洋溶熔用窯羊耀葉蓉要謡踊遥陽養慾抑欲�沃浴翌翼淀羅螺裸来莱頼雷洛絡落酪乱卵嵐欄濫藍蘭覧利吏履李梨理璃痢裏裡里離陸律率立葎掠略劉流溜琉留硫粒隆竜龍侶慮旅虜了亮僚両凌寮料梁涼猟療瞭稜糧良諒遼量陵領力緑倫厘林淋燐琳臨輪隣鱗麟瑠塁涙累類令伶例冷励嶺怜玲礼苓鈴隷零霊麗齢暦歴列劣烈裂廉恋憐漣煉簾練聯���\".split(\"\");\nfor(j = 0; j != D[151].length; ++j) if(D[151][j].charCodeAt(0) !== 0xFFFD) { e[D[151][j]] = 38656 + j; d[38656 + j] = D[151][j];}\nD[152] = \"����������������������������������������������������������������蓮連錬呂魯櫓炉賂路露労婁廊弄朗楼榔浪漏牢狼篭老聾蝋郎六麓禄肋録論倭和話歪賄脇惑枠鷲亙亘鰐詫藁蕨椀湾碗腕��������������������������������������������弌丐丕个丱丶丼丿乂乖乘亂亅豫亊舒弍于亞亟亠亢亰亳亶从仍仄仆仂仗仞仭仟价伉佚估佛佝佗佇佶侈侏侘佻佩佰侑佯來侖儘俔俟俎俘俛俑俚俐俤俥倚倨倔倪倥倅伜俶倡倩倬俾俯們倆偃假會偕偐偈做偖偬偸傀傚傅傴傲���\".split(\"\");\nfor(j = 0; j != D[152].length; ++j) if(D[152][j].charCodeAt(0) !== 0xFFFD) { e[D[152][j]] = 38912 + j; d[38912 + j] = D[152][j];}\nD[153] = \"����������������������������������������������������������������僉僊傳僂僖僞僥僭僣僮價僵儉儁儂儖儕儔儚儡儺儷儼儻儿兀兒兌兔兢竸兩兪兮冀冂囘册冉冏冑冓冕冖冤冦冢冩冪冫决冱冲冰况冽凅凉凛几處凩凭�凰凵凾刄刋刔刎刧刪刮刳刹剏剄剋剌剞剔剪剴剩剳剿剽劍劔劒剱劈劑辨辧劬劭劼劵勁勍勗勞勣勦飭勠勳勵勸勹匆匈甸匍匐匏匕匚匣匯匱匳匸區卆卅丗卉卍凖卞卩卮夘卻卷厂厖厠厦厥厮厰厶參簒雙叟曼燮叮叨叭叺吁吽呀听吭吼吮吶吩吝呎咏呵咎呟呱呷呰咒呻咀呶咄咐咆哇咢咸咥咬哄哈咨���\".split(\"\");\nfor(j = 0; j != D[153].length; ++j) if(D[153][j].charCodeAt(0) !== 0xFFFD) { e[D[153][j]] = 39168 + j; d[39168 + j] = D[153][j];}\nD[154] = \"����������������������������������������������������������������咫哂咤咾咼哘哥哦唏唔哽哮哭哺哢唹啀啣啌售啜啅啖啗唸唳啝喙喀咯喊喟啻啾喘喞單啼喃喩喇喨嗚嗅嗟嗄嗜嗤嗔嘔嗷嘖嗾嗽嘛嗹噎噐營嘴嘶嘲嘸�噫噤嘯噬噪嚆嚀嚊嚠嚔嚏嚥嚮嚶嚴囂嚼囁囃囀囈囎囑囓囗囮囹圀囿圄圉圈國圍圓團圖嗇圜圦圷圸坎圻址坏坩埀垈坡坿垉垓垠垳垤垪垰埃埆埔埒埓堊埖埣堋堙堝塲堡塢塋塰毀塒堽塹墅墹墟墫墺壞墻墸墮壅壓壑壗壙壘壥壜壤壟壯壺壹壻壼壽夂夊夐夛梦夥夬夭夲夸夾竒奕奐奎奚奘奢奠奧奬奩���\".split(\"\");\nfor(j = 0; j != D[154].length; ++j) if(D[154][j].charCodeAt(0) !== 0xFFFD) { e[D[154][j]] = 39424 + j; d[39424 + j] = D[154][j];}\nD[155] = \"����������������������������������������������������������������奸妁妝佞侫妣妲姆姨姜妍姙姚娥娟娑娜娉娚婀婬婉娵娶婢婪媚媼媾嫋嫂媽嫣嫗嫦嫩嫖嫺嫻嬌嬋嬖嬲嫐嬪嬶嬾孃孅孀孑孕孚孛孥孩孰孳孵學斈孺宀�它宦宸寃寇寉寔寐寤實寢寞寥寫寰寶寳尅將專對尓尠尢尨尸尹屁屆屎屓屐屏孱屬屮乢屶屹岌岑岔妛岫岻岶岼岷峅岾峇峙峩峽峺峭嶌峪崋崕崗嵜崟崛崑崔崢崚崙崘嵌嵒嵎嵋嵬嵳嵶嶇嶄嶂嶢嶝嶬嶮嶽嶐嶷嶼巉巍巓巒巖巛巫已巵帋帚帙帑帛帶帷幄幃幀幎幗幔幟幢幤幇幵并幺麼广庠廁廂廈廐廏���\".split(\"\");\nfor(j = 0; j != D[155].length; ++j) if(D[155][j].charCodeAt(0) !== 0xFFFD) { e[D[155][j]] = 39680 + j; d[39680 + j] = D[155][j];}\nD[156] = \"����������������������������������������������������������������廖廣廝廚廛廢廡廨廩廬廱廳廰廴廸廾弃弉彝彜弋弑弖弩弭弸彁彈彌彎弯彑彖彗彙彡彭彳彷徃徂彿徊很徑徇從徙徘徠徨徭徼忖忻忤忸忱忝悳忿怡恠�怙怐怩怎怱怛怕怫怦怏怺恚恁恪恷恟恊恆恍恣恃恤恂恬恫恙悁悍惧悃悚悄悛悖悗悒悧悋惡悸惠惓悴忰悽惆悵惘慍愕愆惶惷愀惴惺愃愡惻惱愍愎慇愾愨愧慊愿愼愬愴愽慂慄慳慷慘慙慚慫慴慯慥慱慟慝慓慵憙憖憇憬憔憚憊憑憫憮懌懊應懷懈懃懆憺懋罹懍懦懣懶懺懴懿懽懼懾戀戈戉戍戌戔戛���\".split(\"\");\nfor(j = 0; j != D[156].length; ++j) if(D[156][j].charCodeAt(0) !== 0xFFFD) { e[D[156][j]] = 39936 + j; d[39936 + j] = D[156][j];}\nD[157] = \"����������������������������������������������������������������戞戡截戮戰戲戳扁扎扞扣扛扠扨扼抂抉找抒抓抖拔抃抔拗拑抻拏拿拆擔拈拜拌拊拂拇抛拉挌拮拱挧挂挈拯拵捐挾捍搜捏掖掎掀掫捶掣掏掉掟掵捫�捩掾揩揀揆揣揉插揶揄搖搴搆搓搦搶攝搗搨搏摧摯摶摎攪撕撓撥撩撈撼據擒擅擇撻擘擂擱擧舉擠擡抬擣擯攬擶擴擲擺攀擽攘攜攅攤攣攫攴攵攷收攸畋效敖敕敍敘敞敝敲數斂斃變斛斟斫斷旃旆旁旄旌旒旛旙无旡旱杲昊昃旻杳昵昶昴昜晏晄晉晁晞晝晤晧晨晟晢晰暃暈暎暉暄暘暝曁暹曉暾暼���\".split(\"\");\nfor(j = 0; j != D[157].length; ++j) if(D[157][j].charCodeAt(0) !== 0xFFFD) { e[D[157][j]] = 40192 + j; d[40192 + j] = D[157][j];}\nD[158] = \"����������������������������������������������������������������曄暸曖曚曠昿曦曩曰曵曷朏朖朞朦朧霸朮朿朶杁朸朷杆杞杠杙杣杤枉杰枩杼杪枌枋枦枡枅枷柯枴柬枳柩枸柤柞柝柢柮枹柎柆柧檜栞框栩桀桍栲桎�梳栫桙档桷桿梟梏梭梔條梛梃檮梹桴梵梠梺椏梍桾椁棊椈棘椢椦棡椌棍棔棧棕椶椒椄棗棣椥棹棠棯椨椪椚椣椡棆楹楷楜楸楫楔楾楮椹楴椽楙椰楡楞楝榁楪榲榮槐榿槁槓榾槎寨槊槝榻槃榧樮榑榠榜榕榴槞槨樂樛槿權槹槲槧樅榱樞槭樔槫樊樒櫁樣樓橄樌橲樶橸橇橢橙橦橈樸樢檐檍檠檄檢檣���\".split(\"\");\nfor(j = 0; j != D[158].length; ++j) if(D[158][j].charCodeAt(0) !== 0xFFFD) { e[D[158][j]] = 40448 + j; d[40448 + j] = D[158][j];}\nD[159] = \"����������������������������������������������������������������檗蘗檻櫃櫂檸檳檬櫞櫑櫟檪櫚櫪櫻欅蘖櫺欒欖鬱欟欸欷盜欹飮歇歃歉歐歙歔歛歟歡歸歹歿殀殄殃殍殘殕殞殤殪殫殯殲殱殳殷殼毆毋毓毟毬毫毳毯�麾氈氓气氛氤氣汞汕汢汪沂沍沚沁沛汾汨汳沒沐泄泱泓沽泗泅泝沮沱沾沺泛泯泙泪洟衍洶洫洽洸洙洵洳洒洌浣涓浤浚浹浙涎涕濤涅淹渕渊涵淇淦涸淆淬淞淌淨淒淅淺淙淤淕淪淮渭湮渮渙湲湟渾渣湫渫湶湍渟湃渺湎渤滿渝游溂溪溘滉溷滓溽溯滄溲滔滕溏溥滂溟潁漑灌滬滸滾漿滲漱滯漲滌���\".split(\"\");\nfor(j = 0; j != D[159].length; ++j) if(D[159][j].charCodeAt(0) !== 0xFFFD) { e[D[159][j]] = 40704 + j; d[40704 + j] = D[159][j];}\nD[224] = \"����������������������������������������������������������������漾漓滷澆潺潸澁澀潯潛濳潭澂潼潘澎澑濂潦澳澣澡澤澹濆澪濟濕濬濔濘濱濮濛瀉瀋濺瀑瀁瀏濾瀛瀚潴瀝瀘瀟瀰瀾瀲灑灣炙炒炯烱炬炸炳炮烟烋烝�烙焉烽焜焙煥煕熈煦煢煌煖煬熏燻熄熕熨熬燗熹熾燒燉燔燎燠燬燧燵燼燹燿爍爐爛爨爭爬爰爲爻爼爿牀牆牋牘牴牾犂犁犇犒犖犢犧犹犲狃狆狄狎狒狢狠狡狹狷倏猗猊猜猖猝猴猯猩猥猾獎獏默獗獪獨獰獸獵獻獺珈玳珎玻珀珥珮珞璢琅瑯琥珸琲琺瑕琿瑟瑙瑁瑜瑩瑰瑣瑪瑶瑾璋璞璧瓊瓏瓔珱���\".split(\"\");\nfor(j = 0; j != D[224].length; ++j) if(D[224][j].charCodeAt(0) !== 0xFFFD) { e[D[224][j]] = 57344 + j; d[57344 + j] = D[224][j];}\nD[225] = \"����������������������������������������������������������������瓠瓣瓧瓩瓮瓲瓰瓱瓸瓷甄甃甅甌甎甍甕甓甞甦甬甼畄畍畊畉畛畆畚畩畤畧畫畭畸當疆疇畴疊疉疂疔疚疝疥疣痂疳痃疵疽疸疼疱痍痊痒痙痣痞痾痿�痼瘁痰痺痲痳瘋瘍瘉瘟瘧瘠瘡瘢瘤瘴瘰瘻癇癈癆癜癘癡癢癨癩癪癧癬癰癲癶癸發皀皃皈皋皎皖皓皙皚皰皴皸皹皺盂盍盖盒盞盡盥盧盪蘯盻眈眇眄眩眤眞眥眦眛眷眸睇睚睨睫睛睥睿睾睹瞎瞋瞑瞠瞞瞰瞶瞹瞿瞼瞽瞻矇矍矗矚矜矣矮矼砌砒礦砠礪硅碎硴碆硼碚碌碣碵碪碯磑磆磋磔碾碼磅磊磬���\".split(\"\");\nfor(j = 0; j != D[225].length; ++j) if(D[225][j].charCodeAt(0) !== 0xFFFD) { e[D[225][j]] = 57600 + j; d[57600 + j] = D[225][j];}\nD[226] = \"����������������������������������������������������������������磧磚磽磴礇礒礑礙礬礫祀祠祗祟祚祕祓祺祿禊禝禧齋禪禮禳禹禺秉秕秧秬秡秣稈稍稘稙稠稟禀稱稻稾稷穃穗穉穡穢穩龝穰穹穽窈窗窕窘窖窩竈窰�窶竅竄窿邃竇竊竍竏竕竓站竚竝竡竢竦竭竰笂笏笊笆笳笘笙笞笵笨笶筐筺笄筍笋筌筅筵筥筴筧筰筱筬筮箝箘箟箍箜箚箋箒箏筝箙篋篁篌篏箴篆篝篩簑簔篦篥籠簀簇簓篳篷簗簍篶簣簧簪簟簷簫簽籌籃籔籏籀籐籘籟籤籖籥籬籵粃粐粤粭粢粫粡粨粳粲粱粮粹粽糀糅糂糘糒糜糢鬻糯糲糴糶糺紆���\".split(\"\");\nfor(j = 0; j != D[226].length; ++j) if(D[226][j].charCodeAt(0) !== 0xFFFD) { e[D[226][j]] = 57856 + j; d[57856 + j] = D[226][j];}\nD[227] = \"����������������������������������������������������������������紂紜紕紊絅絋紮紲紿紵絆絳絖絎絲絨絮絏絣經綉絛綏絽綛綺綮綣綵緇綽綫總綢綯緜綸綟綰緘緝緤緞緻緲緡縅縊縣縡縒縱縟縉縋縢繆繦縻縵縹繃縷�縲縺繧繝繖繞繙繚繹繪繩繼繻纃緕繽辮繿纈纉續纒纐纓纔纖纎纛纜缸缺罅罌罍罎罐网罕罔罘罟罠罨罩罧罸羂羆羃羈羇羌羔羞羝羚羣羯羲羹羮羶羸譱翅翆翊翕翔翡翦翩翳翹飜耆耄耋耒耘耙耜耡耨耿耻聊聆聒聘聚聟聢聨聳聲聰聶聹聽聿肄肆肅肛肓肚肭冐肬胛胥胙胝胄胚胖脉胯胱脛脩脣脯腋���\".split(\"\");\nfor(j = 0; j != D[227].length; ++j) if(D[227][j].charCodeAt(0) !== 0xFFFD) { e[D[227][j]] = 58112 + j; d[58112 + j] = D[227][j];}\nD[228] = \"����������������������������������������������������������������隋腆脾腓腑胼腱腮腥腦腴膃膈膊膀膂膠膕膤膣腟膓膩膰膵膾膸膽臀臂膺臉臍臑臙臘臈臚臟臠臧臺臻臾舁舂舅與舊舍舐舖舩舫舸舳艀艙艘艝艚艟艤�艢艨艪艫舮艱艷艸艾芍芒芫芟芻芬苡苣苟苒苴苳苺莓范苻苹苞茆苜茉苙茵茴茖茲茱荀茹荐荅茯茫茗茘莅莚莪莟莢莖茣莎莇莊荼莵荳荵莠莉莨菴萓菫菎菽萃菘萋菁菷萇菠菲萍萢萠莽萸蔆菻葭萪萼蕚蒄葷葫蒭葮蒂葩葆萬葯葹萵蓊葢蒹蒿蒟蓙蓍蒻蓚蓐蓁蓆蓖蒡蔡蓿蓴蔗蔘蔬蔟蔕蔔蓼蕀蕣蕘蕈���\".split(\"\");\nfor(j = 0; j != D[228].length; ++j) if(D[228][j].charCodeAt(0) !== 0xFFFD) { e[D[228][j]] = 58368 + j; d[58368 + j] = D[228][j];}\nD[229] = \"����������������������������������������������������������������蕁蘂蕋蕕薀薤薈薑薊薨蕭薔薛藪薇薜蕷蕾薐藉薺藏薹藐藕藝藥藜藹蘊蘓蘋藾藺蘆蘢蘚蘰蘿虍乕虔號虧虱蚓蚣蚩蚪蚋蚌蚶蚯蛄蛆蚰蛉蠣蚫蛔蛞蛩蛬�蛟蛛蛯蜒蜆蜈蜀蜃蛻蜑蜉蜍蛹蜊蜴蜿蜷蜻蜥蜩蜚蝠蝟蝸蝌蝎蝴蝗蝨蝮蝙蝓蝣蝪蠅螢螟螂螯蟋螽蟀蟐雖螫蟄螳蟇蟆螻蟯蟲蟠蠏蠍蟾蟶蟷蠎蟒蠑蠖蠕蠢蠡蠱蠶蠹蠧蠻衄衂衒衙衞衢衫袁衾袞衵衽袵衲袂袗袒袮袙袢袍袤袰袿袱裃裄裔裘裙裝裹褂裼裴裨裲褄褌褊褓襃褞褥褪褫襁襄褻褶褸襌褝襠襞���\".split(\"\");\nfor(j = 0; j != D[229].length; ++j) if(D[229][j].charCodeAt(0) !== 0xFFFD) { e[D[229][j]] = 58624 + j; d[58624 + j] = D[229][j];}\nD[230] = \"����������������������������������������������������������������襦襤襭襪襯襴襷襾覃覈覊覓覘覡覩覦覬覯覲覺覽覿觀觚觜觝觧觴觸訃訖訐訌訛訝訥訶詁詛詒詆詈詼詭詬詢誅誂誄誨誡誑誥誦誚誣諄諍諂諚諫諳諧�諤諱謔諠諢諷諞諛謌謇謚諡謖謐謗謠謳鞫謦謫謾謨譁譌譏譎證譖譛譚譫譟譬譯譴譽讀讌讎讒讓讖讙讚谺豁谿豈豌豎豐豕豢豬豸豺貂貉貅貊貍貎貔豼貘戝貭貪貽貲貳貮貶賈賁賤賣賚賽賺賻贄贅贊贇贏贍贐齎贓賍贔贖赧赭赱赳趁趙跂趾趺跏跚跖跌跛跋跪跫跟跣跼踈踉跿踝踞踐踟蹂踵踰踴蹊���\".split(\"\");\nfor(j = 0; j != D[230].length; ++j) if(D[230][j].charCodeAt(0) !== 0xFFFD) { e[D[230][j]] = 58880 + j; d[58880 + j] = D[230][j];}\nD[231] = \"����������������������������������������������������������������蹇蹉蹌蹐蹈蹙蹤蹠踪蹣蹕蹶蹲蹼躁躇躅躄躋躊躓躑躔躙躪躡躬躰軆躱躾軅軈軋軛軣軼軻軫軾輊輅輕輒輙輓輜輟輛輌輦輳輻輹轅轂輾轌轉轆轎轗轜�轢轣轤辜辟辣辭辯辷迚迥迢迪迯邇迴逅迹迺逑逕逡逍逞逖逋逧逶逵逹迸遏遐遑遒逎遉逾遖遘遞遨遯遶隨遲邂遽邁邀邊邉邏邨邯邱邵郢郤扈郛鄂鄒鄙鄲鄰酊酖酘酣酥酩酳酲醋醉醂醢醫醯醪醵醴醺釀釁釉釋釐釖釟釡釛釼釵釶鈞釿鈔鈬鈕鈑鉞鉗鉅鉉鉤鉈銕鈿鉋鉐銜銖銓銛鉚鋏銹銷鋩錏鋺鍄錮���\".split(\"\");\nfor(j = 0; j != D[231].length; ++j) if(D[231][j].charCodeAt(0) !== 0xFFFD) { e[D[231][j]] = 59136 + j; d[59136 + j] = D[231][j];}\nD[232] = \"����������������������������������������������������������������錙錢錚錣錺錵錻鍜鍠鍼鍮鍖鎰鎬鎭鎔鎹鏖鏗鏨鏥鏘鏃鏝鏐鏈鏤鐚鐔鐓鐃鐇鐐鐶鐫鐵鐡鐺鑁鑒鑄鑛鑠鑢鑞鑪鈩鑰鑵鑷鑽鑚鑼鑾钁鑿閂閇閊閔閖閘閙�閠閨閧閭閼閻閹閾闊濶闃闍闌闕闔闖關闡闥闢阡阨阮阯陂陌陏陋陷陜陞陝陟陦陲陬隍隘隕隗險隧隱隲隰隴隶隸隹雎雋雉雍襍雜霍雕雹霄霆霈霓霎霑霏霖霙霤霪霰霹霽霾靄靆靈靂靉靜靠靤靦靨勒靫靱靹鞅靼鞁靺鞆鞋鞏鞐鞜鞨鞦鞣鞳鞴韃韆韈韋韜韭齏韲竟韶韵頏頌頸頤頡頷頽顆顏顋顫顯顰���\".split(\"\");\nfor(j = 0; j != D[232].length; ++j) if(D[232][j].charCodeAt(0) !== 0xFFFD) { e[D[232][j]] = 59392 + j; d[59392 + j] = D[232][j];}\nD[233] = \"����������������������������������������������������������������顱顴顳颪颯颱颶飄飃飆飩飫餃餉餒餔餘餡餝餞餤餠餬餮餽餾饂饉饅饐饋饑饒饌饕馗馘馥馭馮馼駟駛駝駘駑駭駮駱駲駻駸騁騏騅駢騙騫騷驅驂驀驃�騾驕驍驛驗驟驢驥驤驩驫驪骭骰骼髀髏髑髓體髞髟髢髣髦髯髫髮髴髱髷髻鬆鬘鬚鬟鬢鬣鬥鬧鬨鬩鬪鬮鬯鬲魄魃魏魍魎魑魘魴鮓鮃鮑鮖鮗鮟鮠鮨鮴鯀鯊鮹鯆鯏鯑鯒鯣鯢鯤鯔鯡鰺鯲鯱鯰鰕鰔鰉鰓鰌鰆鰈鰒鰊鰄鰮鰛鰥鰤鰡鰰鱇鰲鱆鰾鱚鱠鱧鱶鱸鳧鳬鳰鴉鴈鳫鴃鴆鴪鴦鶯鴣鴟鵄鴕鴒鵁鴿鴾鵆鵈���\".split(\"\");\nfor(j = 0; j != D[233].length; ++j) if(D[233][j].charCodeAt(0) !== 0xFFFD) { e[D[233][j]] = 59648 + j; d[59648 + j] = D[233][j];}\nD[234] = \"����������������������������������������������������������������鵝鵞鵤鵑鵐鵙鵲鶉鶇鶫鵯鵺鶚鶤鶩鶲鷄鷁鶻鶸鶺鷆鷏鷂鷙鷓鷸鷦鷭鷯鷽鸚鸛鸞鹵鹹鹽麁麈麋麌麒麕麑麝麥麩麸麪麭靡黌黎黏黐黔黜點黝黠黥黨黯�黴黶黷黹黻黼黽鼇鼈皷鼕鼡鼬鼾齊齒齔齣齟齠齡齦齧齬齪齷齲齶龕龜龠堯槇遙瑤凜熙�������������������������������������������������������������������������������������������\".split(\"\");\nfor(j = 0; j != D[234].length; ++j) if(D[234][j].charCodeAt(0) !== 0xFFFD) { e[D[234][j]] = 59904 + j; d[59904 + j] = D[234][j];}\nD[237] = \"����������������������������������������������������������������纊褜鍈銈蓜俉炻昱棈鋹曻彅丨仡仼伀伃伹佖侒侊侚侔俍偀倢俿倞偆偰偂傔僴僘兊兤冝冾凬刕劜劦勀勛匀匇匤卲厓厲叝﨎咜咊咩哿喆坙坥垬埈埇﨏�塚增墲夋奓奛奝奣妤妺孖寀甯寘寬尞岦岺峵崧嵓﨑嵂嵭嶸嶹巐弡弴彧德忞恝悅悊惞惕愠惲愑愷愰憘戓抦揵摠撝擎敎昀昕昻昉昮昞昤晥晗晙晴晳暙暠暲暿曺朎朗杦枻桒柀栁桄棏﨓楨﨔榘槢樰橫橆橳橾櫢櫤毖氿汜沆汯泚洄涇浯涖涬淏淸淲淼渹湜渧渼溿澈澵濵瀅瀇瀨炅炫焏焄煜煆煇凞燁燾犱���\".split(\"\");\nfor(j = 0; j != D[237].length; ++j) if(D[237][j].charCodeAt(0) !== 0xFFFD) { e[D[237][j]] = 60672 + j; d[60672 + j] = D[237][j];}\nD[238] = \"����������������������������������������������������������������犾猤猪獷玽珉珖珣珒琇珵琦琪琩琮瑢璉璟甁畯皂皜皞皛皦益睆劯砡硎硤硺礰礼神祥禔福禛竑竧靖竫箞精絈絜綷綠緖繒罇羡羽茁荢荿菇菶葈蒴蕓蕙�蕫﨟薰蘒﨡蠇裵訒訷詹誧誾諟諸諶譓譿賰賴贒赶﨣軏﨤逸遧郞都鄕鄧釚釗釞釭釮釤釥鈆鈐鈊鈺鉀鈼鉎鉙鉑鈹鉧銧鉷鉸鋧鋗鋙鋐﨧鋕鋠鋓錥錡鋻﨨錞鋿錝錂鍰鍗鎤鏆鏞鏸鐱鑅鑈閒隆﨩隝隯霳霻靃靍靏靑靕顗顥飯飼餧館馞驎髙髜魵魲鮏鮱鮻鰀鵰鵫鶴鸙黑��ⅰⅱⅲⅳⅴⅵⅶⅷⅸⅹ¬¦'"���\".split(\"\");\nfor(j = 0; j != D[238].length; ++j) if(D[238][j].charCodeAt(0) !== 0xFFFD) { e[D[238][j]] = 60928 + j; d[60928 + j] = D[238][j];}\nD[250] = \"����������������������������������������������������������������ⅰⅱⅲⅳⅴⅵⅶⅷⅸⅹⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩ¬¦'"㈱№℡∵纊褜鍈銈蓜俉炻昱棈鋹曻彅丨仡仼伀伃伹佖侒侊侚侔俍偀倢俿倞偆偰偂傔僴僘兊�兤冝冾凬刕劜劦勀勛匀匇匤卲厓厲叝﨎咜咊咩哿喆坙坥垬埈埇﨏塚增墲夋奓奛奝奣妤妺孖寀甯寘寬尞岦岺峵崧嵓﨑嵂嵭嶸嶹巐弡弴彧德忞恝悅悊惞惕愠惲愑愷愰憘戓抦揵摠撝擎敎昀昕昻昉昮昞昤晥晗晙晴晳暙暠暲暿曺朎朗杦枻桒柀栁桄棏﨓楨﨔榘槢樰橫橆橳橾櫢櫤毖氿汜沆汯泚洄涇浯���\".split(\"\");\nfor(j = 0; j != D[250].length; ++j) if(D[250][j].charCodeAt(0) !== 0xFFFD) { e[D[250][j]] = 64000 + j; d[64000 + j] = D[250][j];}\nD[251] = \"����������������������������������������������������������������涖涬淏淸淲淼渹湜渧渼溿澈澵濵瀅瀇瀨炅炫焏焄煜煆煇凞燁燾犱犾猤猪獷玽珉珖珣珒琇珵琦琪琩琮瑢璉璟甁畯皂皜皞皛皦益睆劯砡硎硤硺礰礼神�祥禔福禛竑竧靖竫箞精絈絜綷綠緖繒罇羡羽茁荢荿菇菶葈蒴蕓蕙蕫﨟薰蘒﨡蠇裵訒訷詹誧誾諟諸諶譓譿賰賴贒赶﨣軏﨤逸遧郞都鄕鄧釚釗釞釭釮釤釥鈆鈐鈊鈺鉀鈼鉎鉙鉑鈹鉧銧鉷鉸鋧鋗鋙鋐﨧鋕鋠鋓錥錡鋻﨨錞鋿錝錂鍰鍗鎤鏆鏞鏸鐱鑅鑈閒隆﨩隝隯霳霻靃靍靏靑靕顗顥飯飼餧館馞驎髙���\".split(\"\");\nfor(j = 0; j != D[251].length; ++j) if(D[251][j].charCodeAt(0) !== 0xFFFD) { e[D[251][j]] = 64256 + j; d[64256 + j] = D[251][j];}\nD[252] = \"����������������������������������������������������������������髜魵魲鮏鮱鮻鰀鵰鵫鶴鸙黑������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������\".split(\"\");\nfor(j = 0; j != D[252].length; ++j) if(D[252][j].charCodeAt(0) !== 0xFFFD) { e[D[252][j]] = 64512 + j; d[64512 + j] = D[252][j];}\nreturn {\"enc\": e, \"dec\": d }; })();\ncptable[936] = (function(){ var d = [], e = {}, D = [], j;\nD[0] = \"\\u0000\\u0001\\u0002\\u0003\\u0004\\u0005\\u0006\\u0007\\b\\t\\n\\u000b\\f\\r\\u000e\\u000f\\u0010\\u0011\\u0012\\u0013\\u0014\\u0015\\u0016\\u0017\\u0018\\u0019\\u001a\\u001b\\u001c\\u001d\\u001e\\u001f !\\\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~€�������������������������������������������������������������������������������������������������������������������������������\".split(\"\");\nfor(j = 0; j != D[0].length; ++j) if(D[0][j].charCodeAt(0) !== 0xFFFD) { e[D[0][j]] = 0 + j; d[0 + j] = D[0][j];}\nD[129] = \"����������������������������������������������������������������丂丄丅丆丏丒丗丟丠両丣並丩丮丯丱丳丵丷丼乀乁乂乄乆乊乑乕乗乚乛乢乣乤乥乧乨乪乫乬乭乮乯乲乴乵乶乷乸乹乺乻乼乽乿亀亁亂亃亄亅亇亊�亐亖亗亙亜亝亞亣亪亯亰亱亴亶亷亸亹亼亽亾仈仌仏仐仒仚仛仜仠仢仦仧仩仭仮仯仱仴仸仹仺仼仾伀伂伃伄伅伆伇伈伋伌伒伓伔伕伖伜伝伡伣伨伩伬伭伮伱伳伵伷伹伻伾伿佀佁佂佄佅佇佈佉佊佋佌佒佔佖佡佢佦佨佪佫佭佮佱佲併佷佸佹佺佽侀侁侂侅來侇侊侌侎侐侒侓侕侖侘侙侚侜侞侟価侢�\".split(\"\");\nfor(j = 0; j != D[129].length; ++j) if(D[129][j].charCodeAt(0) !== 0xFFFD) { e[D[129][j]] = 33024 + j; d[33024 + j] = D[129][j];}\nD[130] = \"����������������������������������������������������������������侤侫侭侰侱侲侳侴侶侷侸侹侺侻侼侽侾俀俁係俆俇俈俉俋俌俍俒俓俔俕俖俙俛俠俢俤俥俧俫俬俰俲俴俵俶俷俹俻俼俽俿倀倁倂倃倄倅倆倇倈倉倊�個倎倐們倓倕倖倗倛倝倞倠倢倣値倧倫倯倰倱倲倳倴倵倶倷倸倹倻倽倿偀偁偂偄偅偆偉偊偋偍偐偑偒偓偔偖偗偘偙偛偝偞偟偠偡偢偣偤偦偧偨偩偪偫偭偮偯偰偱偲偳側偵偸偹偺偼偽傁傂傃傄傆傇傉傊傋傌傎傏傐傑傒傓傔傕傖傗傘備傚傛傜傝傞傟傠傡傢傤傦傪傫傭傮傯傰傱傳傴債傶傷傸傹傼�\".split(\"\");\nfor(j = 0; j != D[130].length; ++j) if(D[130][j].charCodeAt(0) !== 0xFFFD) { e[D[130][j]] = 33280 + j; d[33280 + j] = D[130][j];}\nD[131] = \"����������������������������������������������������������������傽傾傿僀僁僂僃僄僅僆僇僈僉僊僋僌働僎僐僑僒僓僔僕僗僘僙僛僜僝僞僟僠僡僢僣僤僥僨僩僪僫僯僰僱僲僴僶僷僸價僺僼僽僾僿儀儁儂儃億儅儈�儉儊儌儍儎儏儐儑儓儔儕儖儗儘儙儚儛儜儝儞償儠儢儣儤儥儦儧儨儩優儫儬儭儮儯儰儱儲儳儴儵儶儷儸儹儺儻儼儽儾兂兇兊兌兎兏児兒兓兗兘兙兛兝兞兟兠兡兣兤兦內兩兪兯兲兺兾兿冃冄円冇冊冋冎冏冐冑冓冔冘冚冝冞冟冡冣冦冧冨冩冪冭冮冴冸冹冺冾冿凁凂凃凅凈凊凍凎凐凒凓凔凕凖凗�\".split(\"\");\nfor(j = 0; j != D[131].length; ++j) if(D[131][j].charCodeAt(0) !== 0xFFFD) { e[D[131][j]] = 33536 + j; d[33536 + j] = D[131][j];}\nD[132] = \"����������������������������������������������������������������凘凙凚凜凞凟凢凣凥処凧凨凩凪凬凮凱凲凴凷凾刄刅刉刋刌刏刐刓刔刕刜刞刟刡刢刣別刦刧刪刬刯刱刲刴刵刼刾剄剅剆則剈剉剋剎剏剒剓剕剗剘�剙剚剛剝剟剠剢剣剤剦剨剫剬剭剮剰剱剳剴創剶剷剸剹剺剻剼剾劀劃劄劅劆劇劉劊劋劌劍劎劏劑劒劔劕劖劗劘劙劚劜劤劥劦劧劮劯劰労劵劶劷劸効劺劻劼劽勀勁勂勄勅勆勈勊勌勍勎勏勑勓勔動勗務勚勛勜勝勞勠勡勢勣勥勦勧勨勩勪勫勬勭勮勯勱勲勳勴勵勶勷勸勻勼勽匁匂匃匄匇匉匊匋匌匎�\".split(\"\");\nfor(j = 0; j != D[132].length; ++j) if(D[132][j].charCodeAt(0) !== 0xFFFD) { e[D[132][j]] = 33792 + j; d[33792 + j] = D[132][j];}\nD[133] = \"����������������������������������������������������������������匑匒匓匔匘匛匜匞匟匢匤匥匧匨匩匫匬匭匯匰匱匲匳匴匵匶匷匸匼匽區卂卄卆卋卌卍卐協単卙卛卝卥卨卪卬卭卲卶卹卻卼卽卾厀厁厃厇厈厊厎厏�厐厑厒厓厔厖厗厙厛厜厞厠厡厤厧厪厫厬厭厯厰厱厲厳厴厵厷厸厹厺厼厽厾叀參叄叅叆叇収叏叐叒叓叕叚叜叝叞叡叢叧叴叺叾叿吀吂吅吇吋吔吘吙吚吜吢吤吥吪吰吳吶吷吺吽吿呁呂呄呅呇呉呌呍呎呏呑呚呝呞呟呠呡呣呥呧呩呪呫呬呭呮呯呰呴呹呺呾呿咁咃咅咇咈咉咊咍咑咓咗咘咜咞咟咠咡�\".split(\"\");\nfor(j = 0; j != D[133].length; ++j) if(D[133][j].charCodeAt(0) !== 0xFFFD) { e[D[133][j]] = 34048 + j; d[34048 + j] = D[133][j];}\nD[134] = \"����������������������������������������������������������������咢咥咮咰咲咵咶咷咹咺咼咾哃哅哊哋哖哘哛哠員哢哣哤哫哬哯哰哱哴哵哶哷哸哹哻哾唀唂唃唄唅唈唊唋唌唍唎唒唓唕唖唗唘唙唚唜唝唞唟唡唥唦�唨唩唫唭唲唴唵唶唸唹唺唻唽啀啂啅啇啈啋啌啍啎問啑啒啓啔啗啘啙啚啛啝啞啟啠啢啣啨啩啫啯啰啱啲啳啴啹啺啽啿喅喆喌喍喎喐喒喓喕喖喗喚喛喞喠喡喢喣喤喥喦喨喩喪喫喬喭單喯喰喲喴営喸喺喼喿嗀嗁嗂嗃嗆嗇嗈嗊嗋嗎嗏嗐嗕嗗嗘嗙嗚嗛嗞嗠嗢嗧嗩嗭嗮嗰嗱嗴嗶嗸嗹嗺嗻嗼嗿嘂嘃嘄嘅�\".split(\"\");\nfor(j = 0; j != D[134].length; ++j) if(D[134][j].charCodeAt(0) !== 0xFFFD) { e[D[134][j]] = 34304 + j; d[34304 + j] = D[134][j];}\nD[135] = \"����������������������������������������������������������������嘆嘇嘊嘋嘍嘐嘑嘒嘓嘔嘕嘖嘗嘙嘚嘜嘝嘠嘡嘢嘥嘦嘨嘩嘪嘫嘮嘯嘰嘳嘵嘷嘸嘺嘼嘽嘾噀噁噂噃噄噅噆噇噈噉噊噋噏噐噑噒噓噕噖噚噛噝噞噟噠噡�噣噥噦噧噭噮噯噰噲噳噴噵噷噸噹噺噽噾噿嚀嚁嚂嚃嚄嚇嚈嚉嚊嚋嚌嚍嚐嚑嚒嚔嚕嚖嚗嚘嚙嚚嚛嚜嚝嚞嚟嚠嚡嚢嚤嚥嚦嚧嚨嚩嚪嚫嚬嚭嚮嚰嚱嚲嚳嚴嚵嚶嚸嚹嚺嚻嚽嚾嚿囀囁囂囃囄囅囆囇囈囉囋囌囍囎囏囐囑囒囓囕囖囘囙囜団囥囦囧囨囩囪囬囮囯囲図囶囷囸囻囼圀圁圂圅圇國圌圍圎圏圐圑�\".split(\"\");\nfor(j = 0; j != D[135].length; ++j) if(D[135][j].charCodeAt(0) !== 0xFFFD) { e[D[135][j]] = 34560 + j; d[34560 + j] = D[135][j];}\nD[136] = \"����������������������������������������������������������������園圓圔圕圖圗團圙圚圛圝圞圠圡圢圤圥圦圧圫圱圲圴圵圶圷圸圼圽圿坁坃坄坅坆坈坉坋坒坓坔坕坖坘坙坢坣坥坧坬坮坰坱坲坴坵坸坹坺坽坾坿垀�垁垇垈垉垊垍垎垏垐垑垔垕垖垗垘垙垚垜垝垞垟垥垨垪垬垯垰垱垳垵垶垷垹垺垻垼垽垾垿埀埁埄埅埆埇埈埉埊埌埍埐埑埓埖埗埛埜埞埡埢埣埥埦埧埨埩埪埫埬埮埰埱埲埳埵埶執埻埼埾埿堁堃堄堅堈堉堊堌堎堏堐堒堓堔堖堗堘堚堛堜堝堟堢堣堥堦堧堨堩堫堬堭堮堯報堲堳場堶堷堸堹堺堻堼堽�\".split(\"\");\nfor(j = 0; j != D[136].length; ++j) if(D[136][j].charCodeAt(0) !== 0xFFFD) { e[D[136][j]] = 34816 + j; d[34816 + j] = D[136][j];}\nD[137] = \"����������������������������������������������������������������堾堿塀塁塂塃塅塆塇塈塉塊塋塎塏塐塒塓塕塖塗塙塚塛塜塝塟塠塡塢塣塤塦塧塨塩塪塭塮塯塰塱塲塳塴塵塶塷塸塹塺塻塼塽塿墂墄墆墇墈墊墋墌�墍墎墏墐墑墔墕墖増墘墛墜墝墠墡墢墣墤墥墦墧墪墫墬墭墮墯墰墱墲墳墴墵墶墷墸墹墺墻墽墾墿壀壂壃壄壆壇壈壉壊壋壌壍壎壏壐壒壓壔壖壗壘壙壚壛壜壝壞壟壠壡壢壣壥壦壧壨壩壪壭壯壱売壴壵壷壸壺壻壼壽壾壿夀夁夃夅夆夈変夊夋夌夎夐夑夒夓夗夘夛夝夞夠夡夢夣夦夨夬夰夲夳夵夶夻�\".split(\"\");\nfor(j = 0; j != D[137].length; ++j) if(D[137][j].charCodeAt(0) !== 0xFFFD) { e[D[137][j]] = 35072 + j; d[35072 + j] = D[137][j];}\nD[138] = \"����������������������������������������������������������������夽夾夿奀奃奅奆奊奌奍奐奒奓奙奛奜奝奞奟奡奣奤奦奧奨奩奪奫奬奭奮奯奰奱奲奵奷奺奻奼奾奿妀妅妉妋妌妎妏妐妑妔妕妘妚妛妜妝妟妠妡妢妦�妧妬妭妰妱妳妴妵妶妷妸妺妼妽妿姀姁姂姃姄姅姇姈姉姌姍姎姏姕姖姙姛姞姟姠姡姢姤姦姧姩姪姫姭姮姯姰姱姲姳姴姵姶姷姸姺姼姽姾娀娂娊娋娍娎娏娐娒娔娕娖娗娙娚娛娝娞娡娢娤娦娧娨娪娫娬娭娮娯娰娳娵娷娸娹娺娻娽娾娿婁婂婃婄婅婇婈婋婌婍婎婏婐婑婒婓婔婖婗婘婙婛婜婝婞婟婠�\".split(\"\");\nfor(j = 0; j != D[138].length; ++j) if(D[138][j].charCodeAt(0) !== 0xFFFD) { e[D[138][j]] = 35328 + j; d[35328 + j] = D[138][j];}\nD[139] = \"����������������������������������������������������������������婡婣婤婥婦婨婩婫婬婭婮婯婰婱婲婳婸婹婻婼婽婾媀媁媂媃媄媅媆媇媈媉媊媋媌媍媎媏媐媑媓媔媕媖媗媘媙媜媝媞媟媠媡媢媣媤媥媦媧媨媩媫媬�媭媮媯媰媱媴媶媷媹媺媻媼媽媿嫀嫃嫄嫅嫆嫇嫈嫊嫋嫍嫎嫏嫐嫑嫓嫕嫗嫙嫚嫛嫝嫞嫟嫢嫤嫥嫧嫨嫪嫬嫭嫮嫯嫰嫲嫳嫴嫵嫶嫷嫸嫹嫺嫻嫼嫽嫾嫿嬀嬁嬂嬃嬄嬅嬆嬇嬈嬊嬋嬌嬍嬎嬏嬐嬑嬒嬓嬔嬕嬘嬙嬚嬛嬜嬝嬞嬟嬠嬡嬢嬣嬤嬥嬦嬧嬨嬩嬪嬫嬬嬭嬮嬯嬰嬱嬳嬵嬶嬸嬹嬺嬻嬼嬽嬾嬿孁孂孃孄孅孆孇�\".split(\"\");\nfor(j = 0; j != D[139].length; ++j) if(D[139][j].charCodeAt(0) !== 0xFFFD) { e[D[139][j]] = 35584 + j; d[35584 + j] = D[139][j];}\nD[140] = \"����������������������������������������������������������������孈孉孊孋孌孍孎孏孒孖孞孠孡孧孨孫孭孮孯孲孴孶孷學孹孻孼孾孿宂宆宊宍宎宐宑宒宔宖実宧宨宩宬宭宮宯宱宲宷宺宻宼寀寁寃寈寉寊寋寍寎寏�寑寔寕寖寗寘寙寚寛寜寠寢寣實寧審寪寫寬寭寯寱寲寳寴寵寶寷寽対尀専尃尅將專尋尌對導尐尒尓尗尙尛尞尟尠尡尣尦尨尩尪尫尭尮尯尰尲尳尵尶尷屃屄屆屇屌屍屒屓屔屖屗屘屚屛屜屝屟屢層屧屨屩屪屫屬屭屰屲屳屴屵屶屷屸屻屼屽屾岀岃岄岅岆岇岉岊岋岎岏岒岓岕岝岞岟岠岡岤岥岦岧岨�\".split(\"\");\nfor(j = 0; j != D[140].length; ++j) if(D[140][j].charCodeAt(0) !== 0xFFFD) { e[D[140][j]] = 35840 + j; d[35840 + j] = D[140][j];}\nD[141] = \"����������������������������������������������������������������岪岮岯岰岲岴岶岹岺岻岼岾峀峂峃峅峆峇峈峉峊峌峍峎峏峐峑峓峔峕峖峗峘峚峛峜峝峞峟峠峢峣峧峩峫峬峮峯峱峲峳峴峵島峷峸峹峺峼峽峾峿崀�崁崄崅崈崉崊崋崌崍崏崐崑崒崓崕崗崘崙崚崜崝崟崠崡崢崣崥崨崪崫崬崯崰崱崲崳崵崶崷崸崹崺崻崼崿嵀嵁嵂嵃嵄嵅嵆嵈嵉嵍嵎嵏嵐嵑嵒嵓嵔嵕嵖嵗嵙嵚嵜嵞嵟嵠嵡嵢嵣嵤嵥嵦嵧嵨嵪嵭嵮嵰嵱嵲嵳嵵嵶嵷嵸嵹嵺嵻嵼嵽嵾嵿嶀嶁嶃嶄嶅嶆嶇嶈嶉嶊嶋嶌嶍嶎嶏嶐嶑嶒嶓嶔嶕嶖嶗嶘嶚嶛嶜嶞嶟嶠�\".split(\"\");\nfor(j = 0; j != D[141].length; ++j) if(D[141][j].charCodeAt(0) !== 0xFFFD) { e[D[141][j]] = 36096 + j; d[36096 + j] = D[141][j];}\nD[142] = \"����������������������������������������������������������������嶡嶢嶣嶤嶥嶦嶧嶨嶩嶪嶫嶬嶭嶮嶯嶰嶱嶲嶳嶴嶵嶶嶸嶹嶺嶻嶼嶽嶾嶿巀巁巂巃巄巆巇巈巉巊巋巌巎巏巐巑巒巓巔巕巖巗巘巙巚巜巟巠巣巤巪巬巭�巰巵巶巸巹巺巻巼巿帀帄帇帉帊帋帍帎帒帓帗帞帟帠帡帢帣帤帥帨帩帪師帬帯帰帲帳帴帵帶帹帺帾帿幀幁幃幆幇幈幉幊幋幍幎幏幐幑幒幓幖幗幘幙幚幜幝幟幠幣幤幥幦幧幨幩幪幫幬幭幮幯幰幱幵幷幹幾庁庂広庅庈庉庌庍庎庒庘庛庝庡庢庣庤庨庩庪庫庬庮庯庰庱庲庴庺庻庼庽庿廀廁廂廃廄廅�\".split(\"\");\nfor(j = 0; j != D[142].length; ++j) if(D[142][j].charCodeAt(0) !== 0xFFFD) { e[D[142][j]] = 36352 + j; d[36352 + j] = D[142][j];}\nD[143] = \"����������������������������������������������������������������廆廇廈廋廌廍廎廏廐廔廕廗廘廙廚廜廝廞廟廠廡廢廣廤廥廦廧廩廫廬廭廮廯廰廱廲廳廵廸廹廻廼廽弅弆弇弉弌弍弎弐弒弔弖弙弚弜弝弞弡弢弣弤�弨弫弬弮弰弲弳弴張弶強弸弻弽弾弿彁彂彃彄彅彆彇彈彉彊彋彌彍彎彏彑彔彙彚彛彜彞彟彠彣彥彧彨彫彮彯彲彴彵彶彸彺彽彾彿徃徆徍徎徏徑従徔徖徚徛徝從徟徠徢徣徤徥徦徧復徫徬徯徰徱徲徳徴徶徸徹徺徻徾徿忀忁忂忇忈忊忋忎忓忔忕忚忛応忞忟忢忣忥忦忨忩忬忯忰忲忳忴忶忷忹忺忼怇�\".split(\"\");\nfor(j = 0; j != D[143].length; ++j) if(D[143][j].charCodeAt(0) !== 0xFFFD) { e[D[143][j]] = 36608 + j; d[36608 + j] = D[143][j];}\nD[144] = \"����������������������������������������������������������������怈怉怋怌怐怑怓怗怘怚怞怟怢怣怤怬怭怮怰怱怲怳怴怶怷怸怹怺怽怾恀恄恅恆恇恈恉恊恌恎恏恑恓恔恖恗恘恛恜恞恟恠恡恥恦恮恱恲恴恵恷恾悀�悁悂悅悆悇悈悊悋悎悏悐悑悓悕悗悘悙悜悞悡悢悤悥悧悩悪悮悰悳悵悶悷悹悺悽悾悿惀惁惂惃惄惇惈惉惌惍惎惏惐惒惓惔惖惗惙惛惞惡惢惣惤惥惪惱惲惵惷惸惻惼惽惾惿愂愃愄愅愇愊愋愌愐愑愒愓愔愖愗愘愙愛愜愝愞愡愢愥愨愩愪愬愭愮愯愰愱愲愳愴愵愶愷愸愹愺愻愼愽愾慀慁慂慃慄慅慆�\".split(\"\");\nfor(j = 0; j != D[144].length; ++j) if(D[144][j].charCodeAt(0) !== 0xFFFD) { e[D[144][j]] = 36864 + j; d[36864 + j] = D[144][j];}\nD[145] = \"����������������������������������������������������������������慇慉態慍慏慐慒慓慔慖慗慘慙慚慛慜慞慟慠慡慣慤慥慦慩慪慫慬慭慮慯慱慲慳慴慶慸慹慺慻慼慽慾慿憀憁憂憃憄憅憆憇憈憉憊憌憍憏憐憑憒憓憕�憖憗憘憙憚憛憜憞憟憠憡憢憣憤憥憦憪憫憭憮憯憰憱憲憳憴憵憶憸憹憺憻憼憽憿懀懁懃懄懅懆懇應懌懍懎懏懐懓懕懖懗懘懙懚懛懜懝懞懟懠懡懢懣懤懥懧懨懩懪懫懬懭懮懯懰懱懲懳懴懶懷懸懹懺懻懼懽懾戀戁戂戃戄戅戇戉戓戔戙戜戝戞戠戣戦戧戨戩戫戭戯戰戱戲戵戶戸戹戺戻戼扂扄扅扆扊�\".split(\"\");\nfor(j = 0; j != D[145].length; ++j) if(D[145][j].charCodeAt(0) !== 0xFFFD) { e[D[145][j]] = 37120 + j; d[37120 + j] = D[145][j];}\nD[146] = \"����������������������������������������������������������������扏扐払扖扗扙扚扜扝扞扟扠扡扢扤扥扨扱扲扴扵扷扸扺扻扽抁抂抃抅抆抇抈抋抌抍抎抏抐抔抙抜抝択抣抦抧抩抪抭抮抯抰抲抳抴抶抷抸抺抾拀拁�拃拋拏拑拕拝拞拠拡拤拪拫拰拲拵拸拹拺拻挀挃挄挅挆挊挋挌挍挏挐挒挓挔挕挗挘挙挜挦挧挩挬挭挮挰挱挳挴挵挶挷挸挻挼挾挿捀捁捄捇捈捊捑捒捓捔捖捗捘捙捚捛捜捝捠捤捥捦捨捪捫捬捯捰捲捳捴捵捸捹捼捽捾捿掁掃掄掅掆掋掍掑掓掔掕掗掙掚掛掜掝掞掟採掤掦掫掯掱掲掵掶掹掻掽掿揀�\".split(\"\");\nfor(j = 0; j != D[146].length; ++j) if(D[146][j].charCodeAt(0) !== 0xFFFD) { e[D[146][j]] = 37376 + j; d[37376 + j] = D[146][j];}\nD[147] = \"����������������������������������������������������������������揁揂揃揅揇揈揊揋揌揑揓揔揕揗揘揙揚換揜揝揟揢揤揥揦揧揨揫揬揮揯揰揱揳揵揷揹揺揻揼揾搃搄搆搇搈搉搊損搎搑搒搕搖搗搘搙搚搝搟搢搣搤�搥搧搨搩搫搮搯搰搱搲搳搵搶搷搸搹搻搼搾摀摂摃摉摋摌摍摎摏摐摑摓摕摖摗摙摚摛摜摝摟摠摡摢摣摤摥摦摨摪摫摬摮摯摰摱摲摳摴摵摶摷摻摼摽摾摿撀撁撃撆撈撉撊撋撌撍撎撏撐撓撔撗撘撚撛撜撝撟撠撡撢撣撥撦撧撨撪撫撯撱撲撳撴撶撹撻撽撾撿擁擃擄擆擇擈擉擊擋擌擏擑擓擔擕擖擙據�\".split(\"\");\nfor(j = 0; j != D[147].length; ++j) if(D[147][j].charCodeAt(0) !== 0xFFFD) { e[D[147][j]] = 37632 + j; d[37632 + j] = D[147][j];}\nD[148] = \"����������������������������������������������������������������擛擜擝擟擠擡擣擥擧擨擩擪擫擬擭擮擯擰擱擲擳擴擵擶擷擸擹擺擻擼擽擾擿攁攂攃攄攅攆攇攈攊攋攌攍攎攏攐攑攓攔攕攖攗攙攚攛攜攝攞攟攠攡�攢攣攤攦攧攨攩攪攬攭攰攱攲攳攷攺攼攽敀敁敂敃敄敆敇敊敋敍敎敐敒敓敔敗敘敚敜敟敠敡敤敥敧敨敩敪敭敮敯敱敳敵敶數敹敺敻敼敽敾敿斀斁斂斃斄斅斆斈斉斊斍斎斏斒斔斕斖斘斚斝斞斠斢斣斦斨斪斬斮斱斲斳斴斵斶斷斸斺斻斾斿旀旂旇旈旉旊旍旐旑旓旔旕旘旙旚旛旜旝旞旟旡旣旤旪旫�\".split(\"\");\nfor(j = 0; j != D[148].length; ++j) if(D[148][j].charCodeAt(0) !== 0xFFFD) { e[D[148][j]] = 37888 + j; d[37888 + j] = D[148][j];}\nD[149] = \"����������������������������������������������������������������旲旳旴旵旸旹旻旼旽旾旿昁昄昅昇昈昉昋昍昐昑昒昖昗昘昚昛昜昞昡昢昣昤昦昩昪昫昬昮昰昲昳昷昸昹昺昻昽昿晀時晄晅晆晇晈晉晊晍晎晐晑晘�晙晛晜晝晞晠晢晣晥晧晩晪晫晬晭晱晲晳晵晸晹晻晼晽晿暀暁暃暅暆暈暉暊暋暍暎暏暐暒暓暔暕暘暙暚暛暜暞暟暠暡暢暣暤暥暦暩暪暫暬暭暯暰暱暲暳暵暶暷暸暺暻暼暽暿曀曁曂曃曄曅曆曇曈曉曊曋曌曍曎曏曐曑曒曓曔曕曖曗曘曚曞曟曠曡曢曣曤曥曧曨曪曫曬曭曮曯曱曵曶書曺曻曽朁朂會�\".split(\"\");\nfor(j = 0; j != D[149].length; ++j) if(D[149][j].charCodeAt(0) !== 0xFFFD) { e[D[149][j]] = 38144 + j; d[38144 + j] = D[149][j];}\nD[150] = \"����������������������������������������������������������������朄朅朆朇朌朎朏朑朒朓朖朘朙朚朜朞朠朡朢朣朤朥朧朩朮朰朲朳朶朷朸朹朻朼朾朿杁杄杅杇杊杋杍杒杔杕杗杘杙杚杛杝杢杣杤杦杧杫杬杮東杴杶�杸杹杺杻杽枀枂枃枅枆枈枊枌枍枎枏枑枒枓枔枖枙枛枟枠枡枤枦枩枬枮枱枲枴枹枺枻枼枽枾枿柀柂柅柆柇柈柉柊柋柌柍柎柕柖柗柛柟柡柣柤柦柧柨柪柫柭柮柲柵柶柷柸柹柺査柼柾栁栂栃栄栆栍栐栒栔栕栘栙栚栛栜栞栟栠栢栣栤栥栦栧栨栫栬栭栮栯栰栱栴栵栶栺栻栿桇桋桍桏桒桖桗桘桙桚桛�\".split(\"\");\nfor(j = 0; j != D[150].length; ++j) if(D[150][j].charCodeAt(0) !== 0xFFFD) { e[D[150][j]] = 38400 + j; d[38400 + j] = D[150][j];}\nD[151] = \"����������������������������������������������������������������桜桝桞桟桪桬桭桮桯桰桱桲桳桵桸桹桺桻桼桽桾桿梀梂梄梇梈梉梊梋梌梍梎梐梑梒梔梕梖梘梙梚梛梜條梞梟梠梡梣梤梥梩梪梫梬梮梱梲梴梶梷梸�梹梺梻梼梽梾梿棁棃棄棅棆棇棈棊棌棎棏棐棑棓棔棖棗棙棛棜棝棞棟棡棢棤棥棦棧棨棩棪棫棬棭棯棲棳棴棶棷棸棻棽棾棿椀椂椃椄椆椇椈椉椊椌椏椑椓椔椕椖椗椘椙椚椛検椝椞椡椢椣椥椦椧椨椩椪椫椬椮椯椱椲椳椵椶椷椸椺椻椼椾楀楁楃楄楅楆楇楈楉楊楋楌楍楎楏楐楑楒楓楕楖楘楙楛楜楟�\".split(\"\");\nfor(j = 0; j != D[151].length; ++j) if(D[151][j].charCodeAt(0) !== 0xFFFD) { e[D[151][j]] = 38656 + j; d[38656 + j] = D[151][j];}\nD[152] = \"����������������������������������������������������������������楡楢楤楥楧楨楩楪楬業楯楰楲楳楴極楶楺楻楽楾楿榁榃榅榊榋榌榎榏榐榑榒榓榖榗榙榚榝榞榟榠榡榢榣榤榥榦榩榪榬榮榯榰榲榳榵榶榸榹榺榼榽�榾榿槀槂槃槄槅槆槇槈槉構槍槏槑槒槓槕槖槗様槙槚槜槝槞槡槢槣槤槥槦槧槨槩槪槫槬槮槯槰槱槳槴槵槶槷槸槹槺槻槼槾樀樁樂樃樄樅樆樇樈樉樋樌樍樎樏樐樑樒樓樔樕樖標樚樛樜樝樞樠樢樣樤樥樦樧権樫樬樭樮樰樲樳樴樶樷樸樹樺樻樼樿橀橁橂橃橅橆橈橉橊橋橌橍橎橏橑橒橓橔橕橖橗橚�\".split(\"\");\nfor(j = 0; j != D[152].length; ++j) if(D[152][j].charCodeAt(0) !== 0xFFFD) { e[D[152][j]] = 38912 + j; d[38912 + j] = D[152][j];}\nD[153] = \"����������������������������������������������������������������橜橝橞機橠橢橣橤橦橧橨橩橪橫橬橭橮橯橰橲橳橴橵橶橷橸橺橻橽橾橿檁檂檃檅檆檇檈檉檊檋檌檍檏檒檓檔檕檖檘檙檚檛檜檝檞檟檡檢檣檤檥檦�檧檨檪檭檮檯檰檱檲檳檴檵檶檷檸檹檺檻檼檽檾檿櫀櫁櫂櫃櫄櫅櫆櫇櫈櫉櫊櫋櫌櫍櫎櫏櫐櫑櫒櫓櫔櫕櫖櫗櫘櫙櫚櫛櫜櫝櫞櫟櫠櫡櫢櫣櫤櫥櫦櫧櫨櫩櫪櫫櫬櫭櫮櫯櫰櫱櫲櫳櫴櫵櫶櫷櫸櫹櫺櫻櫼櫽櫾櫿欀欁欂欃欄欅欆欇欈欉權欋欌欍欎欏欐欑欒欓欔欕欖欗欘欙欚欛欜欝欞欟欥欦欨欩欪欫欬欭欮�\".split(\"\");\nfor(j = 0; j != D[153].length; ++j) if(D[153][j].charCodeAt(0) !== 0xFFFD) { e[D[153][j]] = 39168 + j; d[39168 + j] = D[153][j];}\nD[154] = \"����������������������������������������������������������������欯欰欱欳欴欵欶欸欻欼欽欿歀歁歂歄歅歈歊歋歍歎歏歐歑歒歓歔歕歖歗歘歚歛歜歝歞歟歠歡歨歩歫歬歭歮歯歰歱歲歳歴歵歶歷歸歺歽歾歿殀殅殈�殌殎殏殐殑殔殕殗殘殙殜殝殞殟殠殢殣殤殥殦殧殨殩殫殬殭殮殯殰殱殲殶殸殹殺殻殼殽殾毀毃毄毆毇毈毉毊毌毎毐毑毘毚毜毝毞毟毠毢毣毤毥毦毧毨毩毬毭毮毰毱毲毴毶毷毸毺毻毼毾毿氀氁氂氃氄氈氉氊氋氌氎氒気氜氝氞氠氣氥氫氬氭氱氳氶氷氹氺氻氼氾氿汃汄汅汈汋汌汍汎汏汑汒汓汖汘�\".split(\"\");\nfor(j = 0; j != D[154].length; ++j) if(D[154][j].charCodeAt(0) !== 0xFFFD) { e[D[154][j]] = 39424 + j; d[39424 + j] = D[154][j];}\nD[155] = \"����������������������������������������������������������������汙汚汢汣汥汦汧汫汬汭汮汯汱汳汵汷汸決汻汼汿沀沄沇沊沋沍沎沑沒沕沖沗沘沚沜沝沞沠沢沨沬沯沰沴沵沶沷沺泀況泂泃泆泇泈泋泍泎泏泑泒泘�泙泚泜泝泟泤泦泧泩泬泭泲泴泹泿洀洂洃洅洆洈洉洊洍洏洐洑洓洔洕洖洘洜洝洟洠洡洢洣洤洦洨洩洬洭洯洰洴洶洷洸洺洿浀浂浄浉浌浐浕浖浗浘浛浝浟浡浢浤浥浧浨浫浬浭浰浱浲浳浵浶浹浺浻浽浾浿涀涁涃涄涆涇涊涋涍涏涐涒涖涗涘涙涚涜涢涥涬涭涰涱涳涴涶涷涹涺涻涼涽涾淁淂淃淈淉淊�\".split(\"\");\nfor(j = 0; j != D[155].length; ++j) if(D[155][j].charCodeAt(0) !== 0xFFFD) { e[D[155][j]] = 39680 + j; d[39680 + j] = D[155][j];}\nD[156] = \"����������������������������������������������������������������淍淎淏淐淒淓淔淕淗淚淛淜淟淢淣淥淧淨淩淪淭淯淰淲淴淵淶淸淺淽淾淿渀渁渂渃渄渆渇済渉渋渏渒渓渕渘渙減渜渞渟渢渦渧渨渪測渮渰渱渳渵�渶渷渹渻渼渽渾渿湀湁湂湅湆湇湈湉湊湋湌湏湐湑湒湕湗湙湚湜湝湞湠湡湢湣湤湥湦湧湨湩湪湬湭湯湰湱湲湳湴湵湶湷湸湹湺湻湼湽満溁溂溄溇溈溊溋溌溍溎溑溒溓溔溕準溗溙溚溛溝溞溠溡溣溤溦溨溩溫溬溭溮溰溳溵溸溹溼溾溿滀滃滄滅滆滈滉滊滌滍滎滐滒滖滘滙滛滜滝滣滧滪滫滬滭滮滯�\".split(\"\");\nfor(j = 0; j != D[156].length; ++j) if(D[156][j].charCodeAt(0) !== 0xFFFD) { e[D[156][j]] = 39936 + j; d[39936 + j] = D[156][j];}\nD[157] = \"����������������������������������������������������������������滰滱滲滳滵滶滷滸滺滻滼滽滾滿漀漁漃漄漅漇漈漊漋漌漍漎漐漑漒漖漗漘漙漚漛漜漝漞漟漡漢漣漥漦漧漨漬漮漰漲漴漵漷漸漹漺漻漼漽漿潀潁潂�潃潄潅潈潉潊潌潎潏潐潑潒潓潔潕潖潗潙潚潛潝潟潠潡潣潤潥潧潨潩潪潫潬潯潰潱潳潵潶潷潹潻潽潾潿澀澁澂澃澅澆澇澊澋澏澐澑澒澓澔澕澖澗澘澙澚澛澝澞澟澠澢澣澤澥澦澨澩澪澫澬澭澮澯澰澱澲澴澵澷澸澺澻澼澽澾澿濁濃濄濅濆濇濈濊濋濌濍濎濏濐濓濔濕濖濗濘濙濚濛濜濝濟濢濣濤濥�\".split(\"\");\nfor(j = 0; j != D[157].length; ++j) if(D[157][j].charCodeAt(0) !== 0xFFFD) { e[D[157][j]] = 40192 + j; d[40192 + j] = D[157][j];}\nD[158] = \"����������������������������������������������������������������濦濧濨濩濪濫濬濭濰濱濲濳濴濵濶濷濸濹濺濻濼濽濾濿瀀瀁瀂瀃瀄瀅瀆瀇瀈瀉瀊瀋瀌瀍瀎瀏瀐瀒瀓瀔瀕瀖瀗瀘瀙瀜瀝瀞瀟瀠瀡瀢瀤瀥瀦瀧瀨瀩瀪�瀫瀬瀭瀮瀯瀰瀱瀲瀳瀴瀶瀷瀸瀺瀻瀼瀽瀾瀿灀灁灂灃灄灅灆灇灈灉灊灋灍灎灐灑灒灓灔灕灖灗灘灙灚灛灜灝灟灠灡灢灣灤灥灦灧灨灩灪灮灱灲灳灴灷灹灺灻災炁炂炃炄炆炇炈炋炌炍炏炐炑炓炗炘炚炛炞炟炠炡炢炣炤炥炦炧炨炩炪炰炲炴炵炶為炾炿烄烅烆烇烉烋烌烍烎烏烐烑烒烓烔烕烖烗烚�\".split(\"\");\nfor(j = 0; j != D[158].length; ++j) if(D[158][j].charCodeAt(0) !== 0xFFFD) { e[D[158][j]] = 40448 + j; d[40448 + j] = D[158][j];}\nD[159] = \"����������������������������������������������������������������烜烝烞烠烡烢烣烥烪烮烰烱烲烳烴烵烶烸烺烻烼烾烿焀焁焂焃焄焅焆焇焈焋焌焍焎焏焑焒焔焗焛焜焝焞焟焠無焢焣焤焥焧焨焩焪焫焬焭焮焲焳焴�焵焷焸焹焺焻焼焽焾焿煀煁煂煃煄煆煇煈煉煋煍煏煐煑煒煓煔煕煖煗煘煙煚煛煝煟煠煡煢煣煥煩煪煫煬煭煯煰煱煴煵煶煷煹煻煼煾煿熀熁熂熃熅熆熇熈熉熋熌熍熎熐熑熒熓熕熖熗熚熛熜熝熞熡熢熣熤熥熦熧熩熪熫熭熮熯熰熱熲熴熶熷熸熺熻熼熽熾熿燀燁燂燄燅燆燇燈燉燊燋燌燍燏燐燑燒燓�\".split(\"\");\nfor(j = 0; j != D[159].length; ++j) if(D[159][j].charCodeAt(0) !== 0xFFFD) { e[D[159][j]] = 40704 + j; d[40704 + j] = D[159][j];}\nD[160] = \"����������������������������������������������������������������燖燗燘燙燚燛燜燝燞營燡燢燣燤燦燨燩燪燫燬燭燯燰燱燲燳燴燵燶燷燸燺燻燼燽燾燿爀爁爂爃爄爅爇爈爉爊爋爌爍爎爏爐爑爒爓爔爕爖爗爘爙爚�爛爜爞爟爠爡爢爣爤爥爦爧爩爫爭爮爯爲爳爴爺爼爾牀牁牂牃牄牅牆牉牊牋牎牏牐牑牓牔牕牗牘牚牜牞牠牣牤牥牨牪牫牬牭牰牱牳牴牶牷牸牻牼牽犂犃犅犆犇犈犉犌犎犐犑犓犔犕犖犗犘犙犚犛犜犝犞犠犡犢犣犤犥犦犧犨犩犪犫犮犱犲犳犵犺犻犼犽犾犿狀狅狆狇狉狊狋狌狏狑狓狔狕狖狘狚狛�\".split(\"\");\nfor(j = 0; j != D[160].length; ++j) if(D[160][j].charCodeAt(0) !== 0xFFFD) { e[D[160][j]] = 40960 + j; d[40960 + j] = D[160][j];}\nD[161] = \"����������������������������������������������������������������������������������������������������������������������������������������������������������������� 、。·ˉˇ¨〃々—~‖…‘’“”〔〕〈〉《》「」『』〖〗【】±×÷∶∧∨∑∏∪∩∈∷√⊥∥∠⌒⊙∫∮≡≌≈∽∝≠≮≯≤≥∞∵∴♂♀°′″℃$¤¢£‰§№☆★○●◎◇◆□■△▲※→←↑↓〓�\".split(\"\");\nfor(j = 0; j != D[161].length; ++j) if(D[161][j].charCodeAt(0) !== 0xFFFD) { e[D[161][j]] = 41216 + j; d[41216 + j] = D[161][j];}\nD[162] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������ⅰⅱⅲⅳⅴⅵⅶⅷⅸⅹ������⒈⒉⒊⒋⒌⒍⒎⒏⒐⒑⒒⒓⒔⒕⒖⒗⒘⒙⒚⒛⑴⑵⑶⑷⑸⑹⑺⑻⑼⑽⑾⑿⒀⒁⒂⒃⒄⒅⒆⒇①②③④⑤⑥⑦⑧⑨⑩��㈠㈡㈢㈣㈤㈥㈦㈧㈨㈩��ⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩⅪⅫ���\".split(\"\");\nfor(j = 0; j != D[162].length; ++j) if(D[162][j].charCodeAt(0) !== 0xFFFD) { e[D[162][j]] = 41472 + j; d[41472 + j] = D[162][j];}\nD[163] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������!"#¥%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|} ̄�\".split(\"\");\nfor(j = 0; j != D[163].length; ++j) if(D[163][j].charCodeAt(0) !== 0xFFFD) { e[D[163][j]] = 41728 + j; d[41728 + j] = D[163][j];}\nD[164] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������ぁあぃいぅうぇえぉおかがきぎくぐけげこごさざしじすずせぜそぞただちぢっつづてでとどなにぬねのはばぱひびぴふぶぷへべぺほぼぽまみむめもゃやゅゆょよらりるれろゎわゐゑをん������������\".split(\"\");\nfor(j = 0; j != D[164].length; ++j) if(D[164][j].charCodeAt(0) !== 0xFFFD) { e[D[164][j]] = 41984 + j; d[41984 + j] = D[164][j];}\nD[165] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������ァアィイゥウェエォオカガキギクグケゲコゴサザシジスズセゼソゾタダチヂッツヅテデトドナニヌネノハバパヒビピフブプヘベペホボポマミムメモャヤュユョヨラリルレロヮワヰヱヲンヴヵヶ���������\".split(\"\");\nfor(j = 0; j != D[165].length; ++j) if(D[165][j].charCodeAt(0) !== 0xFFFD) { e[D[165][j]] = 42240 + j; d[42240 + j] = D[165][j];}\nD[166] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩ��������αβγδεζηθικλμνξοπρστυφχψω�������︵︶︹︺︿﹀︽︾﹁﹂﹃﹄��︻︼︷︸︱�︳︴����������\".split(\"\");\nfor(j = 0; j != D[166].length; ++j) if(D[166][j].charCodeAt(0) !== 0xFFFD) { e[D[166][j]] = 42496 + j; d[42496 + j] = D[166][j];}\nD[167] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ���������������абвгдеёжзийклмнопрстуфхцчшщъыьэюя��������������\".split(\"\");\nfor(j = 0; j != D[167].length; ++j) if(D[167][j].charCodeAt(0) !== 0xFFFD) { e[D[167][j]] = 42752 + j; d[42752 + j] = D[167][j];}\nD[168] = \"����������������������������������������������������������������ˊˋ˙–―‥‵℅℉↖↗↘↙∕∟∣≒≦≧⊿═║╒╓╔╕╖╗╘╙╚╛╜╝╞╟╠╡╢╣╤╥╦╧╨╩╪╫╬╭╮╯╰╱╲╳▁▂▃▄▅▆▇�█▉▊▋▌▍▎▏▓▔▕▼▽◢◣◤◥☉⊕〒〝〞�����������āáǎàēéěèīíǐìōóǒòūúǔùǖǘǚǜüêɑ�ńň�ɡ����ㄅㄆㄇㄈㄉㄊㄋㄌㄍㄎㄏㄐㄑㄒㄓㄔㄕㄖㄗㄘㄙㄚㄛㄜㄝㄞㄟㄠㄡㄢㄣㄤㄥㄦㄧㄨㄩ����������������������\".split(\"\");\nfor(j = 0; j != D[168].length; ++j) if(D[168][j].charCodeAt(0) !== 0xFFFD) { e[D[168][j]] = 43008 + j; d[43008 + j] = D[168][j];}\nD[169] = \"����������������������������������������������������������������〡〢〣〤〥〦〧〨〩㊣㎎㎏㎜㎝㎞㎡㏄㏎㏑㏒㏕︰¬¦�℡㈱�‐���ー゛゜ヽヾ〆ゝゞ﹉﹊﹋﹌﹍﹎﹏﹐﹑﹒﹔﹕﹖﹗﹙﹚﹛﹜﹝﹞﹟﹠﹡�﹢﹣﹤﹥﹦﹨﹩﹪﹫�������������〇�������������─━│┃┄┅┆┇┈┉┊┋┌┍┎┏┐┑┒┓└┕┖┗┘┙┚┛├┝┞┟┠┡┢┣┤┥┦┧┨┩┪┫┬┭┮┯┰┱┲┳┴┵┶┷┸┹┺┻┼┽┾┿╀╁╂╃╄╅╆╇╈╉╊╋����������������\".split(\"\");\nfor(j = 0; j != D[169].length; ++j) if(D[169][j].charCodeAt(0) !== 0xFFFD) { e[D[169][j]] = 43264 + j; d[43264 + j] = D[169][j];}\nD[170] = \"����������������������������������������������������������������狜狝狟狢狣狤狥狦狧狪狫狵狶狹狽狾狿猀猂猄猅猆猇猈猉猋猌猍猏猐猑猒猔猘猙猚猟猠猣猤猦猧猨猭猯猰猲猳猵猶猺猻猼猽獀獁獂獃獄獅獆獇獈�獉獊獋獌獎獏獑獓獔獕獖獘獙獚獛獜獝獞獟獡獢獣獤獥獦獧獨獩獪獫獮獰獱�����������������������������������������������������������������������������������������������\".split(\"\");\nfor(j = 0; j != D[170].length; ++j) if(D[170][j].charCodeAt(0) !== 0xFFFD) { e[D[170][j]] = 43520 + j; d[43520 + j] = D[170][j];}\nD[171] = \"����������������������������������������������������������������獲獳獴獵獶獷獸獹獺獻獼獽獿玀玁玂玃玅玆玈玊玌玍玏玐玒玓玔玕玗玘玙玚玜玝玞玠玡玣玤玥玦玧玨玪玬玭玱玴玵玶玸玹玼玽玾玿珁珃珄珅珆珇�珋珌珎珒珓珔珕珖珗珘珚珛珜珝珟珡珢珣珤珦珨珪珫珬珮珯珰珱珳珴珵珶珷�����������������������������������������������������������������������������������������������\".split(\"\");\nfor(j = 0; j != D[171].length; ++j) if(D[171][j].charCodeAt(0) !== 0xFFFD) { e[D[171][j]] = 43776 + j; d[43776 + j] = D[171][j];}\nD[172] = \"����������������������������������������������������������������珸珹珺珻珼珽現珿琀琁琂琄琇琈琋琌琍琎琑琒琓琔琕琖琗琘琙琜琝琞琟琠琡琣琤琧琩琫琭琯琱琲琷琸琹琺琻琽琾琿瑀瑂瑃瑄瑅瑆瑇瑈瑉瑊瑋瑌瑍�瑎瑏瑐瑑瑒瑓瑔瑖瑘瑝瑠瑡瑢瑣瑤瑥瑦瑧瑨瑩瑪瑫瑬瑮瑯瑱瑲瑳瑴瑵瑸瑹瑺�����������������������������������������������������������������������������������������������\".split(\"\");\nfor(j = 0; j != D[172].length; ++j) if(D[172][j].charCodeAt(0) !== 0xFFFD) { e[D[172][j]] = 44032 + j; d[44032 + j] = D[172][j];}\nD[173] = \"����������������������������������������������������������������瑻瑼瑽瑿璂璄璅璆璈璉璊璌璍璏璑璒璓璔璕璖璗璘璙璚璛璝璟璠璡璢璣璤璥璦璪璫璬璭璮璯環璱璲璳璴璵璶璷璸璹璻璼璽璾璿瓀瓁瓂瓃瓄瓅瓆瓇�瓈瓉瓊瓋瓌瓍瓎瓏瓐瓑瓓瓔瓕瓖瓗瓘瓙瓚瓛瓝瓟瓡瓥瓧瓨瓩瓪瓫瓬瓭瓰瓱瓲�����������������������������������������������������������������������������������������������\".split(\"\");\nfor(j = 0; j != D[173].length; ++j) if(D[173][j].charCodeAt(0) !== 0xFFFD) { e[D[173][j]] = 44288 + j; d[44288 + j] = D[173][j];}\nD[174] = \"����������������������������������������������������������������瓳瓵瓸瓹瓺瓻瓼瓽瓾甀甁甂甃甅甆甇甈甉甊甋甌甎甐甒甔甕甖甗甛甝甞甠甡產産甤甦甧甪甮甴甶甹甼甽甿畁畂畃畄畆畇畉畊畍畐畑畒畓畕畖畗畘�畝畞畟畠畡畢畣畤畧畨畩畫畬畭畮畯異畱畳畵當畷畺畻畼畽畾疀疁疂疄疅疇�����������������������������������������������������������������������������������������������\".split(\"\");\nfor(j = 0; j != D[174].length; ++j) if(D[174][j].charCodeAt(0) !== 0xFFFD) { e[D[174][j]] = 44544 + j; d[44544 + j] = D[174][j];}\nD[175] = \"����������������������������������������������������������������疈疉疊疌疍疎疐疓疕疘疛疜疞疢疦疧疨疩疪疭疶疷疺疻疿痀痁痆痋痌痎痏痐痑痓痗痙痚痜痝痟痠痡痥痩痬痭痮痯痲痳痵痶痷痸痺痻痽痾瘂瘄瘆瘇�瘈瘉瘋瘍瘎瘏瘑瘒瘓瘔瘖瘚瘜瘝瘞瘡瘣瘧瘨瘬瘮瘯瘱瘲瘶瘷瘹瘺瘻瘽癁療癄�����������������������������������������������������������������������������������������������\".split(\"\");\nfor(j = 0; j != D[175].length; ++j) if(D[175][j].charCodeAt(0) !== 0xFFFD) { e[D[175][j]] = 44800 + j; d[44800 + j] = D[175][j];}\nD[176] = \"����������������������������������������������������������������癅癆癇癈癉癊癋癎癏癐癑癒癓癕癗癘癙癚癛癝癟癠癡癢癤癥癦癧癨癩癪癬癭癮癰癱癲癳癴癵癶癷癹発發癿皀皁皃皅皉皊皌皍皏皐皒皔皕皗皘皚皛�皜皝皞皟皠皡皢皣皥皦皧皨皩皪皫皬皭皯皰皳皵皶皷皸皹皺皻皼皽皾盀盁盃啊阿埃挨哎唉哀皑癌蔼矮艾碍爱隘鞍氨安俺按暗岸胺案肮昂盎凹敖熬翱袄傲奥懊澳芭捌扒叭吧笆八疤巴拔跋靶把耙坝霸罢爸白柏百摆佰败拜稗斑班搬扳般颁板版扮拌伴瓣半办绊邦帮梆榜膀绑棒磅蚌镑傍谤苞胞包褒剥�\".split(\"\");\nfor(j = 0; j != D[176].length; ++j) if(D[176][j].charCodeAt(0) !== 0xFFFD) { e[D[176][j]] = 45056 + j; d[45056 + j] = D[176][j];}\nD[177] = \"����������������������������������������������������������������盄盇盉盋盌盓盕盙盚盜盝盞盠盡盢監盤盦盧盨盩盪盫盬盭盰盳盵盶盷盺盻盽盿眀眂眃眅眆眊県眎眏眐眑眒眓眔眕眖眗眘眛眜眝眞眡眣眤眥眧眪眫�眬眮眰眱眲眳眴眹眻眽眾眿睂睄睅睆睈睉睊睋睌睍睎睏睒睓睔睕睖睗睘睙睜薄雹保堡饱宝抱报暴豹鲍爆杯碑悲卑北辈背贝钡倍狈备惫焙被奔苯本笨崩绷甭泵蹦迸逼鼻比鄙笔彼碧蓖蔽毕毙毖币庇痹闭敝弊必辟壁臂避陛鞭边编贬扁便变卞辨辩辫遍标彪膘表鳖憋别瘪彬斌濒滨宾摈兵冰柄丙秉饼炳�\".split(\"\");\nfor(j = 0; j != D[177].length; ++j) if(D[177][j].charCodeAt(0) !== 0xFFFD) { e[D[177][j]] = 45312 + j; d[45312 + j] = D[177][j];}\nD[178] = \"����������������������������������������������������������������睝睞睟睠睤睧睩睪睭睮睯睰睱睲睳睴睵睶睷睸睺睻睼瞁瞂瞃瞆瞇瞈瞉瞊瞋瞏瞐瞓瞔瞕瞖瞗瞘瞙瞚瞛瞜瞝瞞瞡瞣瞤瞦瞨瞫瞭瞮瞯瞱瞲瞴瞶瞷瞸瞹瞺�瞼瞾矀矁矂矃矄矅矆矇矈矉矊矋矌矎矏矐矑矒矓矔矕矖矘矙矚矝矞矟矠矡矤病并玻菠播拨钵波博勃搏铂箔伯帛舶脖膊渤泊驳捕卜哺补埠不布步簿部怖擦猜裁材才财睬踩采彩菜蔡餐参蚕残惭惨灿苍舱仓沧藏操糙槽曹草厕策侧册测层蹭插叉茬茶查碴搽察岔差诧拆柴豺搀掺蝉馋谗缠铲产阐颤昌猖�\".split(\"\");\nfor(j = 0; j != D[178].length; ++j) if(D[178][j].charCodeAt(0) !== 0xFFFD) { e[D[178][j]] = 45568 + j; d[45568 + j] = D[178][j];}\nD[179] = \"����������������������������������������������������������������矦矨矪矯矰矱矲矴矵矷矹矺矻矼砃砄砅砆砇砈砊砋砎砏砐砓砕砙砛砞砠砡砢砤砨砪砫砮砯砱砲砳砵砶砽砿硁硂硃硄硆硈硉硊硋硍硏硑硓硔硘硙硚�硛硜硞硟硠硡硢硣硤硥硦硧硨硩硯硰硱硲硳硴硵硶硸硹硺硻硽硾硿碀碁碂碃场尝常长偿肠厂敞畅唱倡超抄钞朝嘲潮巢吵炒车扯撤掣彻澈郴臣辰尘晨忱沉陈趁衬撑称城橙成呈乘程惩澄诚承逞骋秤吃痴持匙池迟弛驰耻齿侈尺赤翅斥炽充冲虫崇宠抽酬畴踌稠愁筹仇绸瞅丑臭初出橱厨躇锄雏滁除楚�\".split(\"\");\nfor(j = 0; j != D[179].length; ++j) if(D[179][j].charCodeAt(0) !== 0xFFFD) { e[D[179][j]] = 45824 + j; d[45824 + j] = D[179][j];}\nD[180] = \"����������������������������������������������������������������碄碅碆碈碊碋碏碐碒碔碕碖碙碝碞碠碢碤碦碨碩碪碫碬碭碮碯碵碶碷碸確碻碼碽碿磀磂磃磄磆磇磈磌磍磎磏磑磒磓磖磗磘磚磛磜磝磞磟磠磡磢磣�磤磥磦磧磩磪磫磭磮磯磰磱磳磵磶磸磹磻磼磽磾磿礀礂礃礄礆礇礈礉礊礋礌础储矗搐触处揣川穿椽传船喘串疮窗幢床闯创吹炊捶锤垂春椿醇唇淳纯蠢戳绰疵茨磁雌辞慈瓷词此刺赐次聪葱囱匆从丛凑粗醋簇促蹿篡窜摧崔催脆瘁粹淬翠村存寸磋撮搓措挫错搭达答瘩打大呆歹傣戴带殆代贷袋待逮�\".split(\"\");\nfor(j = 0; j != D[180].length; ++j) if(D[180][j].charCodeAt(0) !== 0xFFFD) { e[D[180][j]] = 46080 + j; d[46080 + j] = D[180][j];}\nD[181] = \"����������������������������������������������������������������礍礎礏礐礑礒礔礕礖礗礘礙礚礛礜礝礟礠礡礢礣礥礦礧礨礩礪礫礬礭礮礯礰礱礲礳礵礶礷礸礹礽礿祂祃祄祅祇祊祋祌祍祎祏祐祑祒祔祕祘祙祡祣�祤祦祩祪祫祬祮祰祱祲祳祴祵祶祹祻祼祽祾祿禂禃禆禇禈禉禋禌禍禎禐禑禒怠耽担丹单郸掸胆旦氮但惮淡诞弹蛋当挡党荡档刀捣蹈倒岛祷导到稻悼道盗德得的蹬灯登等瞪凳邓堤低滴迪敌笛狄涤翟嫡抵底地蒂第帝弟递缔颠掂滇碘点典靛垫电佃甸店惦奠淀殿碉叼雕凋刁掉吊钓调跌爹碟蝶迭谍叠�\".split(\"\");\nfor(j = 0; j != D[181].length; ++j) if(D[181][j].charCodeAt(0) !== 0xFFFD) { e[D[181][j]] = 46336 + j; d[46336 + j] = D[181][j];}\nD[182] = \"����������������������������������������������������������������禓禔禕禖禗禘禙禛禜禝禞禟禠禡禢禣禤禥禦禨禩禪禫禬禭禮禯禰禱禲禴禵禶禷禸禼禿秂秄秅秇秈秊秌秎秏秐秓秔秖秗秙秚秛秜秝秞秠秡秢秥秨秪�秬秮秱秲秳秴秵秶秷秹秺秼秾秿稁稄稅稇稈稉稊稌稏稐稑稒稓稕稖稘稙稛稜丁盯叮钉顶鼎锭定订丢东冬董懂动栋侗恫冻洞兜抖斗陡豆逗痘都督毒犊独读堵睹赌杜镀肚度渡妒端短锻段断缎堆兑队对墩吨蹲敦顿囤钝盾遁掇哆多夺垛躲朵跺舵剁惰堕蛾峨鹅俄额讹娥恶厄扼遏鄂饿恩而儿耳尔饵洱二�\".split(\"\");\nfor(j = 0; j != D[182].length; ++j) if(D[182][j].charCodeAt(0) !== 0xFFFD) { e[D[182][j]] = 46592 + j; d[46592 + j] = D[182][j];}\nD[183] = \"����������������������������������������������������������������稝稟稡稢稤稥稦稧稨稩稪稫稬稭種稯稰稱稲稴稵稶稸稺稾穀穁穂穃穄穅穇穈穉穊穋穌積穎穏穐穒穓穔穕穖穘穙穚穛穜穝穞穟穠穡穢穣穤穥穦穧穨�穩穪穫穬穭穮穯穱穲穳穵穻穼穽穾窂窅窇窉窊窋窌窎窏窐窓窔窙窚窛窞窡窢贰发罚筏伐乏阀法珐藩帆番翻樊矾钒繁凡烦反返范贩犯饭泛坊芳方肪房防妨仿访纺放菲非啡飞肥匪诽吠肺废沸费芬酚吩氛分纷坟焚汾粉奋份忿愤粪丰封枫蜂峰锋风疯烽逢冯缝讽奉凤佛否夫敷肤孵扶拂辐幅氟符伏俘服�\".split(\"\");\nfor(j = 0; j != D[183].length; ++j) if(D[183][j].charCodeAt(0) !== 0xFFFD) { e[D[183][j]] = 46848 + j; d[46848 + j] = D[183][j];}\nD[184] = \"����������������������������������������������������������������窣窤窧窩窪窫窮窯窰窱窲窴窵窶窷窸窹窺窻窼窽窾竀竁竂竃竄竅竆竇竈竉竊竌竍竎竏竐竑竒竓竔竕竗竘竚竛竜竝竡竢竤竧竨竩竪竫竬竮竰竱竲竳�竴竵競竷竸竻竼竾笀笁笂笅笇笉笌笍笎笐笒笓笖笗笘笚笜笝笟笡笢笣笧笩笭浮涪福袱弗甫抚辅俯釜斧脯腑府腐赴副覆赋复傅付阜父腹负富讣附妇缚咐噶嘎该改概钙盖溉干甘杆柑竿肝赶感秆敢赣冈刚钢缸肛纲岗港杠篙皋高膏羔糕搞镐稿告哥歌搁戈鸽胳疙割革葛格蛤阁隔铬个各给根跟耕更庚羹�\".split(\"\");\nfor(j = 0; j != D[184].length; ++j) if(D[184][j].charCodeAt(0) !== 0xFFFD) { e[D[184][j]] = 47104 + j; d[47104 + j] = D[184][j];}\nD[185] = \"����������������������������������������������������������������笯笰笲笴笵笶笷笹笻笽笿筀筁筂筃筄筆筈筊筍筎筓筕筗筙筜筞筟筡筣筤筥筦筧筨筩筪筫筬筭筯筰筳筴筶筸筺筼筽筿箁箂箃箄箆箇箈箉箊箋箌箎箏�箑箒箓箖箘箙箚箛箞箟箠箣箤箥箮箯箰箲箳箵箶箷箹箺箻箼箽箾箿節篂篃範埂耿梗工攻功恭龚供躬公宫弓巩汞拱贡共钩勾沟苟狗垢构购够辜菇咕箍估沽孤姑鼓古蛊骨谷股故顾固雇刮瓜剐寡挂褂乖拐怪棺关官冠观管馆罐惯灌贯光广逛瑰规圭硅归龟闺轨鬼诡癸桂柜跪贵刽辊滚棍锅郭国果裹过哈�\".split(\"\");\nfor(j = 0; j != D[185].length; ++j) if(D[185][j].charCodeAt(0) !== 0xFFFD) { e[D[185][j]] = 47360 + j; d[47360 + j] = D[185][j];}\nD[186] = \"����������������������������������������������������������������篅篈築篊篋篍篎篏篐篒篔篕篖篗篘篛篜篞篟篠篢篣篤篧篨篩篫篬篭篯篰篲篳篴篵篶篸篹篺篻篽篿簀簁簂簃簄簅簆簈簉簊簍簎簐簑簒簓簔簕簗簘簙�簚簛簜簝簞簠簡簢簣簤簥簨簩簫簬簭簮簯簰簱簲簳簴簵簶簷簹簺簻簼簽簾籂骸孩海氦亥害骇酣憨邯韩含涵寒函喊罕翰撼捍旱憾悍焊汗汉夯杭航壕嚎豪毫郝好耗号浩呵喝荷菏核禾和何合盒貉阂河涸赫褐鹤贺嘿黑痕很狠恨哼亨横衡恒轰哄烘虹鸿洪宏弘红喉侯猴吼厚候后呼乎忽瑚壶葫胡蝴狐糊湖�\".split(\"\");\nfor(j = 0; j != D[186].length; ++j) if(D[186][j].charCodeAt(0) !== 0xFFFD) { e[D[186][j]] = 47616 + j; d[47616 + j] = D[186][j];}\nD[187] = \"����������������������������������������������������������������籃籄籅籆籇籈籉籊籋籌籎籏籐籑籒籓籔籕籖籗籘籙籚籛籜籝籞籟籠籡籢籣籤籥籦籧籨籩籪籫籬籭籮籯籰籱籲籵籶籷籸籹籺籾籿粀粁粂粃粄粅粆粇�粈粊粋粌粍粎粏粐粓粔粖粙粚粛粠粡粣粦粧粨粩粫粬粭粯粰粴粵粶粷粸粺粻弧虎唬护互沪户花哗华猾滑画划化话槐徊怀淮坏欢环桓还缓换患唤痪豢焕涣宦幻荒慌黄磺蝗簧皇凰惶煌晃幌恍谎灰挥辉徽恢蛔回毁悔慧卉惠晦贿秽会烩汇讳诲绘荤昏婚魂浑混豁活伙火获或惑霍货祸击圾基机畸稽积箕�\".split(\"\");\nfor(j = 0; j != D[187].length; ++j) if(D[187][j].charCodeAt(0) !== 0xFFFD) { e[D[187][j]] = 47872 + j; d[47872 + j] = D[187][j];}\nD[188] = \"����������������������������������������������������������������粿糀糂糃糄糆糉糋糎糏糐糑糒糓糔糘糚糛糝糞糡糢糣糤糥糦糧糩糪糫糬糭糮糰糱糲糳糴糵糶糷糹糺糼糽糾糿紀紁紂紃約紅紆紇紈紉紋紌納紎紏紐�紑紒紓純紕紖紗紘紙級紛紜紝紞紟紡紣紤紥紦紨紩紪紬紭紮細紱紲紳紴紵紶肌饥迹激讥鸡姬绩缉吉极棘辑籍集及急疾汲即嫉级挤几脊己蓟技冀季伎祭剂悸济寄寂计记既忌际妓继纪嘉枷夹佳家加荚颊贾甲钾假稼价架驾嫁歼监坚尖笺间煎兼肩艰奸缄茧检柬碱硷拣捡简俭剪减荐槛鉴践贱见键箭件�\".split(\"\");\nfor(j = 0; j != D[188].length; ++j) if(D[188][j].charCodeAt(0) !== 0xFFFD) { e[D[188][j]] = 48128 + j; d[48128 + j] = D[188][j];}\nD[189] = \"����������������������������������������������������������������紷紸紹紺紻紼紽紾紿絀絁終絃組絅絆絇絈絉絊絋経絍絎絏結絑絒絓絔絕絖絗絘絙絚絛絜絝絞絟絠絡絢絣絤絥給絧絨絩絪絫絬絭絯絰統絲絳絴絵絶�絸絹絺絻絼絽絾絿綀綁綂綃綄綅綆綇綈綉綊綋綌綍綎綏綐綑綒經綔綕綖綗綘健舰剑饯渐溅涧建僵姜将浆江疆蒋桨奖讲匠酱降蕉椒礁焦胶交郊浇骄娇嚼搅铰矫侥脚狡角饺缴绞剿教酵轿较叫窖揭接皆秸街阶截劫节桔杰捷睫竭洁结解姐戒藉芥界借介疥诫届巾筋斤金今津襟紧锦仅谨进靳晋禁近烬浸�\".split(\"\");\nfor(j = 0; j != D[189].length; ++j) if(D[189][j].charCodeAt(0) !== 0xFFFD) { e[D[189][j]] = 48384 + j; d[48384 + j] = D[189][j];}\nD[190] = \"����������������������������������������������������������������継続綛綜綝綞綟綠綡綢綣綤綥綧綨綩綪綫綬維綯綰綱網綳綴綵綶綷綸綹綺綻綼綽綾綿緀緁緂緃緄緅緆緇緈緉緊緋緌緍緎総緐緑緒緓緔緕緖緗緘緙�線緛緜緝緞緟締緡緢緣緤緥緦緧編緩緪緫緬緭緮緯緰緱緲緳練緵緶緷緸緹緺尽劲荆兢茎睛晶鲸京惊精粳经井警景颈静境敬镜径痉靖竟竞净炯窘揪究纠玖韭久灸九酒厩救旧臼舅咎就疚鞠拘狙疽居驹菊局咀矩举沮聚拒据巨具距踞锯俱句惧炬剧捐鹃娟倦眷卷绢撅攫抉掘倔爵觉决诀绝均菌钧军君峻�\".split(\"\");\nfor(j = 0; j != D[190].length; ++j) if(D[190][j].charCodeAt(0) !== 0xFFFD) { e[D[190][j]] = 48640 + j; d[48640 + j] = D[190][j];}\nD[191] = \"����������������������������������������������������������������緻緼緽緾緿縀縁縂縃縄縅縆縇縈縉縊縋縌縍縎縏縐縑縒縓縔縕縖縗縘縙縚縛縜縝縞縟縠縡縢縣縤縥縦縧縨縩縪縫縬縭縮縯縰縱縲縳縴縵縶縷縸縹�縺縼總績縿繀繂繃繄繅繆繈繉繊繋繌繍繎繏繐繑繒繓織繕繖繗繘繙繚繛繜繝俊竣浚郡骏喀咖卡咯开揩楷凯慨刊堪勘坎砍看康慷糠扛抗亢炕考拷烤靠坷苛柯棵磕颗科壳咳可渴克刻客课肯啃垦恳坑吭空恐孔控抠口扣寇枯哭窟苦酷库裤夸垮挎跨胯块筷侩快宽款匡筐狂框矿眶旷况亏盔岿窥葵奎魁傀�\".split(\"\");\nfor(j = 0; j != D[191].length; ++j) if(D[191][j].charCodeAt(0) !== 0xFFFD) { e[D[191][j]] = 48896 + j; d[48896 + j] = D[191][j];}\nD[192] = \"����������������������������������������������������������������繞繟繠繡繢繣繤繥繦繧繨繩繪繫繬繭繮繯繰繱繲繳繴繵繶繷繸繹繺繻繼繽繾繿纀纁纃纄纅纆纇纈纉纊纋續纍纎纏纐纑纒纓纔纕纖纗纘纙纚纜纝纞�纮纴纻纼绖绤绬绹缊缐缞缷缹缻缼缽缾缿罀罁罃罆罇罈罉罊罋罌罍罎罏罒罓馈愧溃坤昆捆困括扩廓阔垃拉喇蜡腊辣啦莱来赖蓝婪栏拦篮阑兰澜谰揽览懒缆烂滥琅榔狼廊郎朗浪捞劳牢老佬姥酪烙涝勒乐雷镭蕾磊累儡垒擂肋类泪棱楞冷厘梨犁黎篱狸离漓理李里鲤礼莉荔吏栗丽厉励砾历利傈例俐�\".split(\"\");\nfor(j = 0; j != D[192].length; ++j) if(D[192][j].charCodeAt(0) !== 0xFFFD) { e[D[192][j]] = 49152 + j; d[49152 + j] = D[192][j];}\nD[193] = \"����������������������������������������������������������������罖罙罛罜罝罞罠罣罤罥罦罧罫罬罭罯罰罳罵罶罷罸罺罻罼罽罿羀羂羃羄羅羆羇羈羉羋羍羏羐羑羒羓羕羖羗羘羙羛羜羠羢羣羥羦羨義羪羫羬羭羮羱�羳羴羵羶羷羺羻羾翀翂翃翄翆翇翈翉翋翍翏翐翑習翓翖翗翙翚翛翜翝翞翢翣痢立粒沥隶力璃哩俩联莲连镰廉怜涟帘敛脸链恋炼练粮凉梁粱良两辆量晾亮谅撩聊僚疗燎寥辽潦了撂镣廖料列裂烈劣猎琳林磷霖临邻鳞淋凛赁吝拎玲菱零龄铃伶羚凌灵陵岭领另令溜琉榴硫馏留刘瘤流柳六龙聋咙笼窿�\".split(\"\");\nfor(j = 0; j != D[193].length; ++j) if(D[193][j].charCodeAt(0) !== 0xFFFD) { e[D[193][j]] = 49408 + j; d[49408 + j] = D[193][j];}\nD[194] = \"����������������������������������������������������������������翤翧翨翪翫翬翭翯翲翴翵翶翷翸翹翺翽翾翿耂耇耈耉耊耎耏耑耓耚耛耝耞耟耡耣耤耫耬耭耮耯耰耲耴耹耺耼耾聀聁聄聅聇聈聉聎聏聐聑聓聕聖聗�聙聛聜聝聞聟聠聡聢聣聤聥聦聧聨聫聬聭聮聯聰聲聳聴聵聶職聸聹聺聻聼聽隆垄拢陇楼娄搂篓漏陋芦卢颅庐炉掳卤虏鲁麓碌露路赂鹿潞禄录陆戮驴吕铝侣旅履屡缕虑氯律率滤绿峦挛孪滦卵乱掠略抡轮伦仑沦纶论萝螺罗逻锣箩骡裸落洛骆络妈麻玛码蚂马骂嘛吗埋买麦卖迈脉瞒馒蛮满蔓曼慢漫�\".split(\"\");\nfor(j = 0; j != D[194].length; ++j) if(D[194][j].charCodeAt(0) !== 0xFFFD) { e[D[194][j]] = 49664 + j; d[49664 + j] = D[194][j];}\nD[195] = \"����������������������������������������������������������������聾肁肂肅肈肊肍肎肏肐肑肒肔肕肗肙肞肣肦肧肨肬肰肳肵肶肸肹肻胅胇胈胉胊胋胏胐胑胒胓胔胕胘胟胠胢胣胦胮胵胷胹胻胾胿脀脁脃脄脅脇脈脋�脌脕脗脙脛脜脝脟脠脡脢脣脤脥脦脧脨脩脪脫脭脮脰脳脴脵脷脹脺脻脼脽脿谩芒茫盲氓忙莽猫茅锚毛矛铆卯茂冒帽貌贸么玫枚梅酶霉煤没眉媒镁每美昧寐妹媚门闷们萌蒙檬盟锰猛梦孟眯醚靡糜迷谜弥米秘觅泌蜜密幂棉眠绵冕免勉娩缅面苗描瞄藐秒渺庙妙蔑灭民抿皿敏悯闽明螟鸣铭名命谬摸�\".split(\"\");\nfor(j = 0; j != D[195].length; ++j) if(D[195][j].charCodeAt(0) !== 0xFFFD) { e[D[195][j]] = 49920 + j; d[49920 + j] = D[195][j];}\nD[196] = \"����������������������������������������������������������������腀腁腂腃腄腅腇腉腍腎腏腒腖腗腘腛腜腝腞腟腡腢腣腤腦腨腪腫腬腯腲腳腵腶腷腸膁膃膄膅膆膇膉膋膌膍膎膐膒膓膔膕膖膗膙膚膞膟膠膡膢膤膥�膧膩膫膬膭膮膯膰膱膲膴膵膶膷膸膹膼膽膾膿臄臅臇臈臉臋臍臎臏臐臑臒臓摹蘑模膜磨摩魔抹末莫墨默沫漠寞陌谋牟某拇牡亩姆母墓暮幕募慕木目睦牧穆拿哪呐钠那娜纳氖乃奶耐奈南男难囊挠脑恼闹淖呢馁内嫩能妮霓倪泥尼拟你匿腻逆溺蔫拈年碾撵捻念娘酿鸟尿捏聂孽啮镊镍涅您柠狞凝宁�\".split(\"\");\nfor(j = 0; j != D[196].length; ++j) if(D[196][j].charCodeAt(0) !== 0xFFFD) { e[D[196][j]] = 50176 + j; d[50176 + j] = D[196][j];}\nD[197] = \"����������������������������������������������������������������臔臕臖臗臘臙臚臛臜臝臞臟臠臡臢臤臥臦臨臩臫臮臯臰臱臲臵臶臷臸臹臺臽臿舃與興舉舊舋舎舏舑舓舕舖舗舘舙舚舝舠舤舥舦舧舩舮舲舺舼舽舿�艀艁艂艃艅艆艈艊艌艍艎艐艑艒艓艔艕艖艗艙艛艜艝艞艠艡艢艣艤艥艦艧艩拧泞牛扭钮纽脓浓农弄奴努怒女暖虐疟挪懦糯诺哦欧鸥殴藕呕偶沤啪趴爬帕怕琶拍排牌徘湃派攀潘盘磐盼畔判叛乓庞旁耪胖抛咆刨炮袍跑泡呸胚培裴赔陪配佩沛喷盆砰抨烹澎彭蓬棚硼篷膨朋鹏捧碰坯砒霹批披劈琵毗�\".split(\"\");\nfor(j = 0; j != D[197].length; ++j) if(D[197][j].charCodeAt(0) !== 0xFFFD) { e[D[197][j]] = 50432 + j; d[50432 + j] = D[197][j];}\nD[198] = \"����������������������������������������������������������������艪艫艬艭艱艵艶艷艸艻艼芀芁芃芅芆芇芉芌芐芓芔芕芖芚芛芞芠芢芣芧芲芵芶芺芻芼芿苀苂苃苅苆苉苐苖苙苚苝苢苧苨苩苪苬苭苮苰苲苳苵苶苸�苺苼苽苾苿茀茊茋茍茐茒茓茖茘茙茝茞茟茠茡茢茣茤茥茦茩茪茮茰茲茷茻茽啤脾疲皮匹痞僻屁譬篇偏片骗飘漂瓢票撇瞥拼频贫品聘乒坪苹萍平凭瓶评屏坡泼颇婆破魄迫粕剖扑铺仆莆葡菩蒲埔朴圃普浦谱曝瀑期欺栖戚妻七凄漆柒沏其棋奇歧畦崎脐齐旗祈祁骑起岂乞企启契砌器气迄弃汽泣讫掐�\".split(\"\");\nfor(j = 0; j != D[198].length; ++j) if(D[198][j].charCodeAt(0) !== 0xFFFD) { e[D[198][j]] = 50688 + j; d[50688 + j] = D[198][j];}\nD[199] = \"����������������������������������������������������������������茾茿荁荂荄荅荈荊荋荌荍荎荓荕荖荗荘荙荝荢荰荱荲荳荴荵荶荹荺荾荿莀莁莂莃莄莇莈莊莋莌莍莏莐莑莔莕莖莗莙莚莝莟莡莢莣莤莥莦莧莬莭莮�莯莵莻莾莿菂菃菄菆菈菉菋菍菎菐菑菒菓菕菗菙菚菛菞菢菣菤菦菧菨菫菬菭恰洽牵扦钎铅千迁签仟谦乾黔钱钳前潜遣浅谴堑嵌欠歉枪呛腔羌墙蔷强抢橇锹敲悄桥瞧乔侨巧鞘撬翘峭俏窍切茄且怯窃钦侵亲秦琴勤芹擒禽寝沁青轻氢倾卿清擎晴氰情顷请庆琼穷秋丘邱球求囚酋泅趋区蛆曲躯屈驱渠�\".split(\"\");\nfor(j = 0; j != D[199].length; ++j) if(D[199][j].charCodeAt(0) !== 0xFFFD) { e[D[199][j]] = 50944 + j; d[50944 + j] = D[199][j];}\nD[200] = \"����������������������������������������������������������������菮華菳菴菵菶菷菺菻菼菾菿萀萂萅萇萈萉萊萐萒萓萔萕萖萗萙萚萛萞萟萠萡萢萣萩萪萫萬萭萮萯萰萲萳萴萵萶萷萹萺萻萾萿葀葁葂葃葄葅葇葈葉�葊葋葌葍葎葏葐葒葓葔葕葖葘葝葞葟葠葢葤葥葦葧葨葪葮葯葰葲葴葷葹葻葼取娶龋趣去圈颧权醛泉全痊拳犬券劝缺炔瘸却鹊榷确雀裙群然燃冉染瓤壤攘嚷让饶扰绕惹热壬仁人忍韧任认刃妊纫扔仍日戎茸蓉荣融熔溶容绒冗揉柔肉茹蠕儒孺如辱乳汝入褥软阮蕊瑞锐闰润若弱撒洒萨腮鳃塞赛三叁�\".split(\"\");\nfor(j = 0; j != D[200].length; ++j) if(D[200][j].charCodeAt(0) !== 0xFFFD) { e[D[200][j]] = 51200 + j; d[51200 + j] = D[200][j];}\nD[201] = \"����������������������������������������������������������������葽葾葿蒀蒁蒃蒄蒅蒆蒊蒍蒏蒐蒑蒒蒓蒔蒕蒖蒘蒚蒛蒝蒞蒟蒠蒢蒣蒤蒥蒦蒧蒨蒩蒪蒫蒬蒭蒮蒰蒱蒳蒵蒶蒷蒻蒼蒾蓀蓂蓃蓅蓆蓇蓈蓋蓌蓎蓏蓒蓔蓕蓗�蓘蓙蓚蓛蓜蓞蓡蓢蓤蓧蓨蓩蓪蓫蓭蓮蓯蓱蓲蓳蓴蓵蓶蓷蓸蓹蓺蓻蓽蓾蔀蔁蔂伞散桑嗓丧搔骚扫嫂瑟色涩森僧莎砂杀刹沙纱傻啥煞筛晒珊苫杉山删煽衫闪陕擅赡膳善汕扇缮墒伤商赏晌上尚裳梢捎稍烧芍勺韶少哨邵绍奢赊蛇舌舍赦摄射慑涉社设砷申呻伸身深娠绅神沈审婶甚肾慎渗声生甥牲升绳�\".split(\"\");\nfor(j = 0; j != D[201].length; ++j) if(D[201][j].charCodeAt(0) !== 0xFFFD) { e[D[201][j]] = 51456 + j; d[51456 + j] = D[201][j];}\nD[202] = \"����������������������������������������������������������������蔃蔄蔅蔆蔇蔈蔉蔊蔋蔍蔎蔏蔐蔒蔔蔕蔖蔘蔙蔛蔜蔝蔞蔠蔢蔣蔤蔥蔦蔧蔨蔩蔪蔭蔮蔯蔰蔱蔲蔳蔴蔵蔶蔾蔿蕀蕁蕂蕄蕅蕆蕇蕋蕌蕍蕎蕏蕐蕑蕒蕓蕔蕕�蕗蕘蕚蕛蕜蕝蕟蕠蕡蕢蕣蕥蕦蕧蕩蕪蕫蕬蕭蕮蕯蕰蕱蕳蕵蕶蕷蕸蕼蕽蕿薀薁省盛剩胜圣师失狮施湿诗尸虱十石拾时什食蚀实识史矢使屎驶始式示士世柿事拭誓逝势是嗜噬适仕侍释饰氏市恃室视试收手首守寿授售受瘦兽蔬枢梳殊抒输叔舒淑疏书赎孰熟薯暑曙署蜀黍鼠属术述树束戍竖墅庶数漱�\".split(\"\");\nfor(j = 0; j != D[202].length; ++j) if(D[202][j].charCodeAt(0) !== 0xFFFD) { e[D[202][j]] = 51712 + j; d[51712 + j] = D[202][j];}\nD[203] = \"����������������������������������������������������������������薂薃薆薈薉薊薋薌薍薎薐薑薒薓薔薕薖薗薘薙薚薝薞薟薠薡薢薣薥薦薧薩薫薬薭薱薲薳薴薵薶薸薺薻薼薽薾薿藀藂藃藄藅藆藇藈藊藋藌藍藎藑藒�藔藖藗藘藙藚藛藝藞藟藠藡藢藣藥藦藧藨藪藫藬藭藮藯藰藱藲藳藴藵藶藷藸恕刷耍摔衰甩帅栓拴霜双爽谁水睡税吮瞬顺舜说硕朔烁斯撕嘶思私司丝死肆寺嗣四伺似饲巳松耸怂颂送宋讼诵搜艘擞嗽苏酥俗素速粟僳塑溯宿诉肃酸蒜算虽隋随绥髓碎岁穗遂隧祟孙损笋蓑梭唆缩琐索锁所塌他它她塔�\".split(\"\");\nfor(j = 0; j != D[203].length; ++j) if(D[203][j].charCodeAt(0) !== 0xFFFD) { e[D[203][j]] = 51968 + j; d[51968 + j] = D[203][j];}\nD[204] = \"����������������������������������������������������������������藹藺藼藽藾蘀蘁蘂蘃蘄蘆蘇蘈蘉蘊蘋蘌蘍蘎蘏蘐蘒蘓蘔蘕蘗蘘蘙蘚蘛蘜蘝蘞蘟蘠蘡蘢蘣蘤蘥蘦蘨蘪蘫蘬蘭蘮蘯蘰蘱蘲蘳蘴蘵蘶蘷蘹蘺蘻蘽蘾蘿虀�虁虂虃虄虅虆虇虈虉虊虋虌虒虓處虖虗虘虙虛虜虝號虠虡虣虤虥虦虧虨虩虪獭挞蹋踏胎苔抬台泰酞太态汰坍摊贪瘫滩坛檀痰潭谭谈坦毯袒碳探叹炭汤塘搪堂棠膛唐糖倘躺淌趟烫掏涛滔绦萄桃逃淘陶讨套特藤腾疼誊梯剔踢锑提题蹄啼体替嚏惕涕剃屉天添填田甜恬舔腆挑条迢眺跳贴铁帖厅听烃�\".split(\"\");\nfor(j = 0; j != D[204].length; ++j) if(D[204][j].charCodeAt(0) !== 0xFFFD) { e[D[204][j]] = 52224 + j; d[52224 + j] = D[204][j];}\nD[205] = \"����������������������������������������������������������������虭虯虰虲虳虴虵虶虷虸蚃蚄蚅蚆蚇蚈蚉蚎蚏蚐蚑蚒蚔蚖蚗蚘蚙蚚蚛蚞蚟蚠蚡蚢蚥蚦蚫蚭蚮蚲蚳蚷蚸蚹蚻蚼蚽蚾蚿蛁蛂蛃蛅蛈蛌蛍蛒蛓蛕蛖蛗蛚蛜�蛝蛠蛡蛢蛣蛥蛦蛧蛨蛪蛫蛬蛯蛵蛶蛷蛺蛻蛼蛽蛿蜁蜄蜅蜆蜋蜌蜎蜏蜐蜑蜔蜖汀廷停亭庭挺艇通桐酮瞳同铜彤童桶捅筒统痛偷投头透凸秃突图徒途涂屠土吐兔湍团推颓腿蜕褪退吞屯臀拖托脱鸵陀驮驼椭妥拓唾挖哇蛙洼娃瓦袜歪外豌弯湾玩顽丸烷完碗挽晚皖惋宛婉万腕汪王亡枉网往旺望忘妄威�\".split(\"\");\nfor(j = 0; j != D[205].length; ++j) if(D[205][j].charCodeAt(0) !== 0xFFFD) { e[D[205][j]] = 52480 + j; d[52480 + j] = D[205][j];}\nD[206] = \"����������������������������������������������������������������蜙蜛蜝蜟蜠蜤蜦蜧蜨蜪蜫蜬蜭蜯蜰蜲蜳蜵蜶蜸蜹蜺蜼蜽蝀蝁蝂蝃蝄蝅蝆蝊蝋蝍蝏蝐蝑蝒蝔蝕蝖蝘蝚蝛蝜蝝蝞蝟蝡蝢蝦蝧蝨蝩蝪蝫蝬蝭蝯蝱蝲蝳蝵�蝷蝸蝹蝺蝿螀螁螄螆螇螉螊螌螎螏螐螑螒螔螕螖螘螙螚螛螜螝螞螠螡螢螣螤巍微危韦违桅围唯惟为潍维苇萎委伟伪尾纬未蔚味畏胃喂魏位渭谓尉慰卫瘟温蚊文闻纹吻稳紊问嗡翁瓮挝蜗涡窝我斡卧握沃巫呜钨乌污诬屋无芜梧吾吴毋武五捂午舞伍侮坞戊雾晤物勿务悟误昔熙析西硒矽晰嘻吸锡牺�\".split(\"\");\nfor(j = 0; j != D[206].length; ++j) if(D[206][j].charCodeAt(0) !== 0xFFFD) { e[D[206][j]] = 52736 + j; d[52736 + j] = D[206][j];}\nD[207] = \"����������������������������������������������������������������螥螦螧螩螪螮螰螱螲螴螶螷螸螹螻螼螾螿蟁蟂蟃蟄蟅蟇蟈蟉蟌蟍蟎蟏蟐蟔蟕蟖蟗蟘蟙蟚蟜蟝蟞蟟蟡蟢蟣蟤蟦蟧蟨蟩蟫蟬蟭蟯蟰蟱蟲蟳蟴蟵蟶蟷蟸�蟺蟻蟼蟽蟿蠀蠁蠂蠄蠅蠆蠇蠈蠉蠋蠌蠍蠎蠏蠐蠑蠒蠔蠗蠘蠙蠚蠜蠝蠞蠟蠠蠣稀息希悉膝夕惜熄烯溪汐犀檄袭席习媳喜铣洗系隙戏细瞎虾匣霞辖暇峡侠狭下厦夏吓掀锨先仙鲜纤咸贤衔舷闲涎弦嫌显险现献县腺馅羡宪陷限线相厢镶香箱襄湘乡翔祥详想响享项巷橡像向象萧硝霄削哮嚣销消宵淆晓�\".split(\"\");\nfor(j = 0; j != D[207].length; ++j) if(D[207][j].charCodeAt(0) !== 0xFFFD) { e[D[207][j]] = 52992 + j; d[52992 + j] = D[207][j];}\nD[208] = \"����������������������������������������������������������������蠤蠥蠦蠧蠨蠩蠪蠫蠬蠭蠮蠯蠰蠱蠳蠴蠵蠶蠷蠸蠺蠻蠽蠾蠿衁衂衃衆衇衈衉衊衋衎衏衐衑衒術衕衖衘衚衛衜衝衞衟衠衦衧衪衭衯衱衳衴衵衶衸衹衺�衻衼袀袃袆袇袉袊袌袎袏袐袑袓袔袕袗袘袙袚袛袝袞袟袠袡袣袥袦袧袨袩袪小孝校肖啸笑效楔些歇蝎鞋协挟携邪斜胁谐写械卸蟹懈泄泻谢屑薪芯锌欣辛新忻心信衅星腥猩惺兴刑型形邢行醒幸杏性姓兄凶胸匈汹雄熊休修羞朽嗅锈秀袖绣墟戌需虚嘘须徐许蓄酗叙旭序畜恤絮婿绪续轩喧宣悬旋玄�\".split(\"\");\nfor(j = 0; j != D[208].length; ++j) if(D[208][j].charCodeAt(0) !== 0xFFFD) { e[D[208][j]] = 53248 + j; d[53248 + j] = D[208][j];}\nD[209] = \"����������������������������������������������������������������袬袮袯袰袲袳袴袵袶袸袹袺袻袽袾袿裀裃裄裇裈裊裋裌裍裏裐裑裓裖裗裚裛補裝裞裠裡裦裧裩裪裫裬裭裮裯裲裵裶裷裺裻製裿褀褁褃褄褅褆複褈�褉褋褌褍褎褏褑褔褕褖褗褘褜褝褞褟褠褢褣褤褦褧褨褩褬褭褮褯褱褲褳褵褷选癣眩绚靴薛学穴雪血勋熏循旬询寻驯巡殉汛训讯逊迅压押鸦鸭呀丫芽牙蚜崖衙涯雅哑亚讶焉咽阉烟淹盐严研蜒岩延言颜阎炎沿奄掩眼衍演艳堰燕厌砚雁唁彦焰宴谚验殃央鸯秧杨扬佯疡羊洋阳氧仰痒养样漾邀腰妖瑶�\".split(\"\");\nfor(j = 0; j != D[209].length; ++j) if(D[209][j].charCodeAt(0) !== 0xFFFD) { e[D[209][j]] = 53504 + j; d[53504 + j] = D[209][j];}\nD[210] = \"����������������������������������������������������������������褸褹褺褻褼褽褾褿襀襂襃襅襆襇襈襉襊襋襌襍襎襏襐襑襒襓襔襕襖襗襘襙襚襛襜襝襠襡襢襣襤襥襧襨襩襪襫襬襭襮襯襰襱襲襳襴襵襶襷襸襹襺襼�襽襾覀覂覄覅覇覈覉覊見覌覍覎規覐覑覒覓覔覕視覗覘覙覚覛覜覝覞覟覠覡摇尧遥窑谣姚咬舀药要耀椰噎耶爷野冶也页掖业叶曳腋夜液一壹医揖铱依伊衣颐夷遗移仪胰疑沂宜姨彝椅蚁倚已乙矣以艺抑易邑屹亿役臆逸肄疫亦裔意毅忆义益溢诣议谊译异翼翌绎茵荫因殷音阴姻吟银淫寅饮尹引隐�\".split(\"\");\nfor(j = 0; j != D[210].length; ++j) if(D[210][j].charCodeAt(0) !== 0xFFFD) { e[D[210][j]] = 53760 + j; d[53760 + j] = D[210][j];}\nD[211] = \"����������������������������������������������������������������覢覣覤覥覦覧覨覩親覫覬覭覮覯覰覱覲観覴覵覶覷覸覹覺覻覼覽覾覿觀觃觍觓觔觕觗觘觙觛觝觟觠觡觢觤觧觨觩觪觬觭觮觰觱觲觴觵觶觷觸觹觺�觻觼觽觾觿訁訂訃訄訅訆計訉訊訋訌訍討訏訐訑訒訓訔訕訖託記訙訚訛訜訝印英樱婴鹰应缨莹萤营荧蝇迎赢盈影颖硬映哟拥佣臃痈庸雍踊蛹咏泳涌永恿勇用幽优悠忧尤由邮铀犹油游酉有友右佑釉诱又幼迂淤于盂榆虞愚舆余俞逾鱼愉渝渔隅予娱雨与屿禹宇语羽玉域芋郁吁遇喻峪御愈欲狱育誉�\".split(\"\");\nfor(j = 0; j != D[211].length; ++j) if(D[211][j].charCodeAt(0) !== 0xFFFD) { e[D[211][j]] = 54016 + j; d[54016 + j] = D[211][j];}\nD[212] = \"����������������������������������������������������������������訞訟訠訡訢訣訤訥訦訧訨訩訪訫訬設訮訯訰許訲訳訴訵訶訷訸訹診註証訽訿詀詁詂詃詄詅詆詇詉詊詋詌詍詎詏詐詑詒詓詔評詖詗詘詙詚詛詜詝詞�詟詠詡詢詣詤詥試詧詨詩詪詫詬詭詮詯詰話該詳詴詵詶詷詸詺詻詼詽詾詿誀浴寓裕预豫驭鸳渊冤元垣袁原援辕园员圆猿源缘远苑愿怨院曰约越跃钥岳粤月悦阅耘云郧匀陨允运蕴酝晕韵孕匝砸杂栽哉灾宰载再在咱攒暂赞赃脏葬遭糟凿藻枣早澡蚤躁噪造皂灶燥责择则泽贼怎增憎曾赠扎喳渣札轧�\".split(\"\");\nfor(j = 0; j != D[212].length; ++j) if(D[212][j].charCodeAt(0) !== 0xFFFD) { e[D[212][j]] = 54272 + j; d[54272 + j] = D[212][j];}\nD[213] = \"����������������������������������������������������������������誁誂誃誄誅誆誇誈誋誌認誎誏誐誑誒誔誕誖誗誘誙誚誛誜誝語誟誠誡誢誣誤誥誦誧誨誩說誫説読誮誯誰誱課誳誴誵誶誷誸誹誺誻誼誽誾調諀諁諂�諃諄諅諆談諈諉諊請諌諍諎諏諐諑諒諓諔諕論諗諘諙諚諛諜諝諞諟諠諡諢諣铡闸眨栅榨咋乍炸诈摘斋宅窄债寨瞻毡詹粘沾盏斩辗崭展蘸栈占战站湛绽樟章彰漳张掌涨杖丈帐账仗胀瘴障招昭找沼赵照罩兆肇召遮折哲蛰辙者锗蔗这浙珍斟真甄砧臻贞针侦枕疹诊震振镇阵蒸挣睁征狰争怔整拯正政�\".split(\"\");\nfor(j = 0; j != D[213].length; ++j) if(D[213][j].charCodeAt(0) !== 0xFFFD) { e[D[213][j]] = 54528 + j; d[54528 + j] = D[213][j];}\nD[214] = \"����������������������������������������������������������������諤諥諦諧諨諩諪諫諬諭諮諯諰諱諲諳諴諵諶諷諸諹諺諻諼諽諾諿謀謁謂謃謄謅謆謈謉謊謋謌謍謎謏謐謑謒謓謔謕謖謗謘謙謚講謜謝謞謟謠謡謢謣�謤謥謧謨謩謪謫謬謭謮謯謰謱謲謳謴謵謶謷謸謹謺謻謼謽謾謿譀譁譂譃譄譅帧症郑证芝枝支吱蜘知肢脂汁之织职直植殖执值侄址指止趾只旨纸志挚掷至致置帜峙制智秩稚质炙痔滞治窒中盅忠钟衷终种肿重仲众舟周州洲诌粥轴肘帚咒皱宙昼骤珠株蛛朱猪诸诛逐竹烛煮拄瞩嘱主著柱助蛀贮铸筑�\".split(\"\");\nfor(j = 0; j != D[214].length; ++j) if(D[214][j].charCodeAt(0) !== 0xFFFD) { e[D[214][j]] = 54784 + j; d[54784 + j] = D[214][j];}\nD[215] = \"����������������������������������������������������������������譆譇譈證譊譋譌譍譎譏譐譑譒譓譔譕譖譗識譙譚譛譜譝譞譟譠譡譢譣譤譥譧譨譩譪譫譭譮譯議譱譲譳譴譵譶護譸譹譺譻譼譽譾譿讀讁讂讃讄讅讆�讇讈讉變讋讌讍讎讏讐讑讒讓讔讕讖讗讘讙讚讛讜讝讞讟讬讱讻诇诐诪谉谞住注祝驻抓爪拽专砖转撰赚篆桩庄装妆撞壮状椎锥追赘坠缀谆准捉拙卓桌琢茁酌啄着灼浊兹咨资姿滋淄孜紫仔籽滓子自渍字鬃棕踪宗综总纵邹走奏揍租足卒族祖诅阻组钻纂嘴醉最罪尊遵昨左佐柞做作坐座������\".split(\"\");\nfor(j = 0; j != D[215].length; ++j) if(D[215][j].charCodeAt(0) !== 0xFFFD) { e[D[215][j]] = 55040 + j; d[55040 + j] = D[215][j];}\nD[216] = \"����������������������������������������������������������������谸谹谺谻谼谽谾谿豀豂豃豄豅豈豊豋豍豎豏豐豑豒豓豔豖豗豘豙豛豜豝豞豟豠豣豤豥豦豧豨豩豬豭豮豯豰豱豲豴豵豶豷豻豼豽豾豿貀貁貃貄貆貇�貈貋貍貎貏貐貑貒貓貕貖貗貙貚貛貜貝貞貟負財貢貣貤貥貦貧貨販貪貫責貭亍丌兀丐廿卅丕亘丞鬲孬噩丨禺丿匕乇夭爻卮氐囟胤馗毓睾鼗丶亟鼐乜乩亓芈孛啬嘏仄厍厝厣厥厮靥赝匚叵匦匮匾赜卦卣刂刈刎刭刳刿剀剌剞剡剜蒯剽劂劁劐劓冂罔亻仃仉仂仨仡仫仞伛仳伢佤仵伥伧伉伫佞佧攸佚佝�\".split(\"\");\nfor(j = 0; j != D[216].length; ++j) if(D[216][j].charCodeAt(0) !== 0xFFFD) { e[D[216][j]] = 55296 + j; d[55296 + j] = D[216][j];}\nD[217] = \"����������������������������������������������������������������貮貯貰貱貲貳貴貵貶買貸貹貺費貼貽貾貿賀賁賂賃賄賅賆資賈賉賊賋賌賍賎賏賐賑賒賓賔賕賖賗賘賙賚賛賜賝賞賟賠賡賢賣賤賥賦賧賨賩質賫賬�賭賮賯賰賱賲賳賴賵賶賷賸賹賺賻購賽賾賿贀贁贂贃贄贅贆贇贈贉贊贋贌贍佟佗伲伽佶佴侑侉侃侏佾佻侪佼侬侔俦俨俪俅俚俣俜俑俟俸倩偌俳倬倏倮倭俾倜倌倥倨偾偃偕偈偎偬偻傥傧傩傺僖儆僭僬僦僮儇儋仝氽佘佥俎龠汆籴兮巽黉馘冁夔勹匍訇匐凫夙兕亠兖亳衮袤亵脔裒禀嬴蠃羸冫冱冽冼�\".split(\"\");\nfor(j = 0; j != D[217].length; ++j) if(D[217][j].charCodeAt(0) !== 0xFFFD) { e[D[217][j]] = 55552 + j; d[55552 + j] = D[217][j];}\nD[218] = \"����������������������������������������������������������������贎贏贐贑贒贓贔贕贖贗贘贙贚贛贜贠赑赒赗赟赥赨赩赪赬赮赯赱赲赸赹赺赻赼赽赾赿趀趂趃趆趇趈趉趌趍趎趏趐趒趓趕趖趗趘趙趚趛趜趝趞趠趡�趢趤趥趦趧趨趩趪趫趬趭趮趯趰趲趶趷趹趻趽跀跁跂跅跇跈跉跊跍跐跒跓跔凇冖冢冥讠讦讧讪讴讵讷诂诃诋诏诎诒诓诔诖诘诙诜诟诠诤诨诩诮诰诳诶诹诼诿谀谂谄谇谌谏谑谒谔谕谖谙谛谘谝谟谠谡谥谧谪谫谮谯谲谳谵谶卩卺阝阢阡阱阪阽阼陂陉陔陟陧陬陲陴隈隍隗隰邗邛邝邙邬邡邴邳邶邺�\".split(\"\");\nfor(j = 0; j != D[218].length; ++j) if(D[218][j].charCodeAt(0) !== 0xFFFD) { e[D[218][j]] = 55808 + j; d[55808 + j] = D[218][j];}\nD[219] = \"����������������������������������������������������������������跕跘跙跜跠跡跢跥跦跧跩跭跮跰跱跲跴跶跼跾跿踀踁踂踃踄踆踇踈踋踍踎踐踑踒踓踕踖踗踘踙踚踛踜踠踡踤踥踦踧踨踫踭踰踲踳踴踶踷踸踻踼踾�踿蹃蹅蹆蹌蹍蹎蹏蹐蹓蹔蹕蹖蹗蹘蹚蹛蹜蹝蹞蹟蹠蹡蹢蹣蹤蹥蹧蹨蹪蹫蹮蹱邸邰郏郅邾郐郄郇郓郦郢郜郗郛郫郯郾鄄鄢鄞鄣鄱鄯鄹酃酆刍奂劢劬劭劾哿勐勖勰叟燮矍廴凵凼鬯厶弁畚巯坌垩垡塾墼壅壑圩圬圪圳圹圮圯坜圻坂坩垅坫垆坼坻坨坭坶坳垭垤垌垲埏垧垴垓垠埕埘埚埙埒垸埴埯埸埤埝�\".split(\"\");\nfor(j = 0; j != D[219].length; ++j) if(D[219][j].charCodeAt(0) !== 0xFFFD) { e[D[219][j]] = 56064 + j; d[56064 + j] = D[219][j];}\nD[220] = \"����������������������������������������������������������������蹳蹵蹷蹸蹹蹺蹻蹽蹾躀躂躃躄躆躈躉躊躋躌躍躎躑躒躓躕躖躗躘躙躚躛躝躟躠躡躢躣躤躥躦躧躨躩躪躭躮躰躱躳躴躵躶躷躸躹躻躼躽躾躿軀軁軂�軃軄軅軆軇軈軉車軋軌軍軏軐軑軒軓軔軕軖軗軘軙軚軛軜軝軞軟軠軡転軣軤堋堍埽埭堀堞堙塄堠塥塬墁墉墚墀馨鼙懿艹艽艿芏芊芨芄芎芑芗芙芫芸芾芰苈苊苣芘芷芮苋苌苁芩芴芡芪芟苄苎芤苡茉苷苤茏茇苜苴苒苘茌苻苓茑茚茆茔茕苠苕茜荑荛荜茈莒茼茴茱莛荞茯荏荇荃荟荀茗荠茭茺茳荦荥�\".split(\"\");\nfor(j = 0; j != D[220].length; ++j) if(D[220][j].charCodeAt(0) !== 0xFFFD) { e[D[220][j]] = 56320 + j; d[56320 + j] = D[220][j];}\nD[221] = \"����������������������������������������������������������������軥軦軧軨軩軪軫軬軭軮軯軰軱軲軳軴軵軶軷軸軹軺軻軼軽軾軿輀輁輂較輄輅輆輇輈載輊輋輌輍輎輏輐輑輒輓輔輕輖輗輘輙輚輛輜輝輞輟輠輡輢輣�輤輥輦輧輨輩輪輫輬輭輮輯輰輱輲輳輴輵輶輷輸輹輺輻輼輽輾輿轀轁轂轃轄荨茛荩荬荪荭荮莰荸莳莴莠莪莓莜莅荼莶莩荽莸荻莘莞莨莺莼菁萁菥菘堇萘萋菝菽菖萜萸萑萆菔菟萏萃菸菹菪菅菀萦菰菡葜葑葚葙葳蒇蒈葺蒉葸萼葆葩葶蒌蒎萱葭蓁蓍蓐蓦蒽蓓蓊蒿蒺蓠蒡蒹蒴蒗蓥蓣蔌甍蔸蓰蔹蔟蔺�\".split(\"\");\nfor(j = 0; j != D[221].length; ++j) if(D[221][j].charCodeAt(0) !== 0xFFFD) { e[D[221][j]] = 56576 + j; d[56576 + j] = D[221][j];}\nD[222] = \"����������������������������������������������������������������轅轆轇轈轉轊轋轌轍轎轏轐轑轒轓轔轕轖轗轘轙轚轛轜轝轞轟轠轡轢轣轤轥轪辀辌辒辝辠辡辢辤辥辦辧辪辬辭辮辯農辳辴辵辷辸辺辻込辿迀迃迆�迉迊迋迌迍迏迒迖迗迚迠迡迣迧迬迯迱迲迴迵迶迺迻迼迾迿逇逈逌逎逓逕逘蕖蔻蓿蓼蕙蕈蕨蕤蕞蕺瞢蕃蕲蕻薤薨薇薏蕹薮薜薅薹薷薰藓藁藜藿蘧蘅蘩蘖蘼廾弈夼奁耷奕奚奘匏尢尥尬尴扌扪抟抻拊拚拗拮挢拶挹捋捃掭揶捱捺掎掴捭掬掊捩掮掼揲揸揠揿揄揞揎摒揆掾摅摁搋搛搠搌搦搡摞撄摭撖�\".split(\"\");\nfor(j = 0; j != D[222].length; ++j) if(D[222][j].charCodeAt(0) !== 0xFFFD) { e[D[222][j]] = 56832 + j; d[56832 + j] = D[222][j];}\nD[223] = \"����������������������������������������������������������������這逜連逤逥逧逨逩逪逫逬逰週進逳逴逷逹逺逽逿遀遃遅遆遈遉遊運遌過達違遖遙遚遜遝遞遟遠遡遤遦遧適遪遫遬遯遰遱遲遳遶遷選遹遺遻遼遾邁�還邅邆邇邉邊邌邍邎邏邐邒邔邖邘邚邜邞邟邠邤邥邧邨邩邫邭邲邷邼邽邿郀摺撷撸撙撺擀擐擗擤擢攉攥攮弋忒甙弑卟叱叽叩叨叻吒吖吆呋呒呓呔呖呃吡呗呙吣吲咂咔呷呱呤咚咛咄呶呦咝哐咭哂咴哒咧咦哓哔呲咣哕咻咿哌哙哚哜咩咪咤哝哏哞唛哧唠哽唔哳唢唣唏唑唧唪啧喏喵啉啭啁啕唿啐唼�\".split(\"\");\nfor(j = 0; j != D[223].length; ++j) if(D[223][j].charCodeAt(0) !== 0xFFFD) { e[D[223][j]] = 57088 + j; d[57088 + j] = D[223][j];}\nD[224] = \"����������������������������������������������������������������郂郃郆郈郉郋郌郍郒郔郕郖郘郙郚郞郟郠郣郤郥郩郪郬郮郰郱郲郳郵郶郷郹郺郻郼郿鄀鄁鄃鄅鄆鄇鄈鄉鄊鄋鄌鄍鄎鄏鄐鄑鄒鄓鄔鄕鄖鄗鄘鄚鄛鄜�鄝鄟鄠鄡鄤鄥鄦鄧鄨鄩鄪鄫鄬鄭鄮鄰鄲鄳鄴鄵鄶鄷鄸鄺鄻鄼鄽鄾鄿酀酁酂酄唷啖啵啶啷唳唰啜喋嗒喃喱喹喈喁喟啾嗖喑啻嗟喽喾喔喙嗪嗷嗉嘟嗑嗫嗬嗔嗦嗝嗄嗯嗥嗲嗳嗌嗍嗨嗵嗤辔嘞嘈嘌嘁嘤嘣嗾嘀嘧嘭噘嘹噗嘬噍噢噙噜噌噔嚆噤噱噫噻噼嚅嚓嚯囔囗囝囡囵囫囹囿圄圊圉圜帏帙帔帑帱帻帼�\".split(\"\");\nfor(j = 0; j != D[224].length; ++j) if(D[224][j].charCodeAt(0) !== 0xFFFD) { e[D[224][j]] = 57344 + j; d[57344 + j] = D[224][j];}\nD[225] = \"����������������������������������������������������������������酅酇酈酑酓酔酕酖酘酙酛酜酟酠酦酧酨酫酭酳酺酻酼醀醁醂醃醄醆醈醊醎醏醓醔醕醖醗醘醙醜醝醞醟醠醡醤醥醦醧醨醩醫醬醰醱醲醳醶醷醸醹醻�醼醽醾醿釀釁釂釃釄釅釆釈釋釐釒釓釔釕釖釗釘釙釚釛針釞釟釠釡釢釣釤釥帷幄幔幛幞幡岌屺岍岐岖岈岘岙岑岚岜岵岢岽岬岫岱岣峁岷峄峒峤峋峥崂崃崧崦崮崤崞崆崛嵘崾崴崽嵬嵛嵯嵝嵫嵋嵊嵩嵴嶂嶙嶝豳嶷巅彳彷徂徇徉後徕徙徜徨徭徵徼衢彡犭犰犴犷犸狃狁狎狍狒狨狯狩狲狴狷猁狳猃狺�\".split(\"\");\nfor(j = 0; j != D[225].length; ++j) if(D[225][j].charCodeAt(0) !== 0xFFFD) { e[D[225][j]] = 57600 + j; d[57600 + j] = D[225][j];}\nD[226] = \"����������������������������������������������������������������釦釧釨釩釪釫釬釭釮釯釰釱釲釳釴釵釶釷釸釹釺釻釼釽釾釿鈀鈁鈂鈃鈄鈅鈆鈇鈈鈉鈊鈋鈌鈍鈎鈏鈐鈑鈒鈓鈔鈕鈖鈗鈘鈙鈚鈛鈜鈝鈞鈟鈠鈡鈢鈣鈤�鈥鈦鈧鈨鈩鈪鈫鈬鈭鈮鈯鈰鈱鈲鈳鈴鈵鈶鈷鈸鈹鈺鈻鈼鈽鈾鈿鉀鉁鉂鉃鉄鉅狻猗猓猡猊猞猝猕猢猹猥猬猸猱獐獍獗獠獬獯獾舛夥飧夤夂饣饧饨饩饪饫饬饴饷饽馀馄馇馊馍馐馑馓馔馕庀庑庋庖庥庠庹庵庾庳赓廒廑廛廨廪膺忄忉忖忏怃忮怄忡忤忾怅怆忪忭忸怙怵怦怛怏怍怩怫怊怿怡恸恹恻恺恂�\".split(\"\");\nfor(j = 0; j != D[226].length; ++j) if(D[226][j].charCodeAt(0) !== 0xFFFD) { e[D[226][j]] = 57856 + j; d[57856 + j] = D[226][j];}\nD[227] = \"����������������������������������������������������������������鉆鉇鉈鉉鉊鉋鉌鉍鉎鉏鉐鉑鉒鉓鉔鉕鉖鉗鉘鉙鉚鉛鉜鉝鉞鉟鉠鉡鉢鉣鉤鉥鉦鉧鉨鉩鉪鉫鉬鉭鉮鉯鉰鉱鉲鉳鉵鉶鉷鉸鉹鉺鉻鉼鉽鉾鉿銀銁銂銃銄銅�銆銇銈銉銊銋銌銍銏銐銑銒銓銔銕銖銗銘銙銚銛銜銝銞銟銠銡銢銣銤銥銦銧恪恽悖悚悭悝悃悒悌悛惬悻悱惝惘惆惚悴愠愦愕愣惴愀愎愫慊慵憬憔憧憷懔懵忝隳闩闫闱闳闵闶闼闾阃阄阆阈阊阋阌阍阏阒阕阖阗阙阚丬爿戕氵汔汜汊沣沅沐沔沌汨汩汴汶沆沩泐泔沭泷泸泱泗沲泠泖泺泫泮沱泓泯泾�\".split(\"\");\nfor(j = 0; j != D[227].length; ++j) if(D[227][j].charCodeAt(0) !== 0xFFFD) { e[D[227][j]] = 58112 + j; d[58112 + j] = D[227][j];}\nD[228] = \"����������������������������������������������������������������銨銩銪銫銬銭銯銰銱銲銳銴銵銶銷銸銹銺銻銼銽銾銿鋀鋁鋂鋃鋄鋅鋆鋇鋉鋊鋋鋌鋍鋎鋏鋐鋑鋒鋓鋔鋕鋖鋗鋘鋙鋚鋛鋜鋝鋞鋟鋠鋡鋢鋣鋤鋥鋦鋧鋨�鋩鋪鋫鋬鋭鋮鋯鋰鋱鋲鋳鋴鋵鋶鋷鋸鋹鋺鋻鋼鋽鋾鋿錀錁錂錃錄錅錆錇錈錉洹洧洌浃浈洇洄洙洎洫浍洮洵洚浏浒浔洳涑浯涞涠浞涓涔浜浠浼浣渚淇淅淞渎涿淠渑淦淝淙渖涫渌涮渫湮湎湫溲湟溆湓湔渲渥湄滟溱溘滠漭滢溥溧溽溻溷滗溴滏溏滂溟潢潆潇漤漕滹漯漶潋潴漪漉漩澉澍澌潸潲潼潺濑�\".split(\"\");\nfor(j = 0; j != D[228].length; ++j) if(D[228][j].charCodeAt(0) !== 0xFFFD) { e[D[228][j]] = 58368 + j; d[58368 + j] = D[228][j];}\nD[229] = \"����������������������������������������������������������������錊錋錌錍錎錏錐錑錒錓錔錕錖錗錘錙錚錛錜錝錞錟錠錡錢錣錤錥錦錧錨錩錪錫錬錭錮錯錰錱録錳錴錵錶錷錸錹錺錻錼錽錿鍀鍁鍂鍃鍄鍅鍆鍇鍈鍉�鍊鍋鍌鍍鍎鍏鍐鍑鍒鍓鍔鍕鍖鍗鍘鍙鍚鍛鍜鍝鍞鍟鍠鍡鍢鍣鍤鍥鍦鍧鍨鍩鍫濉澧澹澶濂濡濮濞濠濯瀚瀣瀛瀹瀵灏灞宀宄宕宓宥宸甯骞搴寤寮褰寰蹇謇辶迓迕迥迮迤迩迦迳迨逅逄逋逦逑逍逖逡逵逶逭逯遄遑遒遐遨遘遢遛暹遴遽邂邈邃邋彐彗彖彘尻咫屐屙孱屣屦羼弪弩弭艴弼鬻屮妁妃妍妩妪妣�\".split(\"\");\nfor(j = 0; j != D[229].length; ++j) if(D[229][j].charCodeAt(0) !== 0xFFFD) { e[D[229][j]] = 58624 + j; d[58624 + j] = D[229][j];}\nD[230] = \"����������������������������������������������������������������鍬鍭鍮鍯鍰鍱鍲鍳鍴鍵鍶鍷鍸鍹鍺鍻鍼鍽鍾鍿鎀鎁鎂鎃鎄鎅鎆鎇鎈鎉鎊鎋鎌鎍鎎鎐鎑鎒鎓鎔鎕鎖鎗鎘鎙鎚鎛鎜鎝鎞鎟鎠鎡鎢鎣鎤鎥鎦鎧鎨鎩鎪鎫�鎬鎭鎮鎯鎰鎱鎲鎳鎴鎵鎶鎷鎸鎹鎺鎻鎼鎽鎾鎿鏀鏁鏂鏃鏄鏅鏆鏇鏈鏉鏋鏌鏍妗姊妫妞妤姒妲妯姗妾娅娆姝娈姣姘姹娌娉娲娴娑娣娓婀婧婊婕娼婢婵胬媪媛婷婺媾嫫媲嫒嫔媸嫠嫣嫱嫖嫦嫘嫜嬉嬗嬖嬲嬷孀尕尜孚孥孳孑孓孢驵驷驸驺驿驽骀骁骅骈骊骐骒骓骖骘骛骜骝骟骠骢骣骥骧纟纡纣纥纨纩�\".split(\"\");\nfor(j = 0; j != D[230].length; ++j) if(D[230][j].charCodeAt(0) !== 0xFFFD) { e[D[230][j]] = 58880 + j; d[58880 + j] = D[230][j];}\nD[231] = \"����������������������������������������������������������������鏎鏏鏐鏑鏒鏓鏔鏕鏗鏘鏙鏚鏛鏜鏝鏞鏟鏠鏡鏢鏣鏤鏥鏦鏧鏨鏩鏪鏫鏬鏭鏮鏯鏰鏱鏲鏳鏴鏵鏶鏷鏸鏹鏺鏻鏼鏽鏾鏿鐀鐁鐂鐃鐄鐅鐆鐇鐈鐉鐊鐋鐌鐍�鐎鐏鐐鐑鐒鐓鐔鐕鐖鐗鐘鐙鐚鐛鐜鐝鐞鐟鐠鐡鐢鐣鐤鐥鐦鐧鐨鐩鐪鐫鐬鐭鐮纭纰纾绀绁绂绉绋绌绐绔绗绛绠绡绨绫绮绯绱绲缍绶绺绻绾缁缂缃缇缈缋缌缏缑缒缗缙缜缛缟缡缢缣缤缥缦缧缪缫缬缭缯缰缱缲缳缵幺畿巛甾邕玎玑玮玢玟珏珂珑玷玳珀珉珈珥珙顼琊珩珧珞玺珲琏琪瑛琦琥琨琰琮琬�\".split(\"\");\nfor(j = 0; j != D[231].length; ++j) if(D[231][j].charCodeAt(0) !== 0xFFFD) { e[D[231][j]] = 59136 + j; d[59136 + j] = D[231][j];}\nD[232] = \"����������������������������������������������������������������鐯鐰鐱鐲鐳鐴鐵鐶鐷鐸鐹鐺鐻鐼鐽鐿鑀鑁鑂鑃鑄鑅鑆鑇鑈鑉鑊鑋鑌鑍鑎鑏鑐鑑鑒鑓鑔鑕鑖鑗鑘鑙鑚鑛鑜鑝鑞鑟鑠鑡鑢鑣鑤鑥鑦鑧鑨鑩鑪鑬鑭鑮鑯�鑰鑱鑲鑳鑴鑵鑶鑷鑸鑹鑺鑻鑼鑽鑾鑿钀钁钂钃钄钑钖钘铇铏铓铔铚铦铻锜锠琛琚瑁瑜瑗瑕瑙瑷瑭瑾璜璎璀璁璇璋璞璨璩璐璧瓒璺韪韫韬杌杓杞杈杩枥枇杪杳枘枧杵枨枞枭枋杷杼柰栉柘栊柩枰栌柙枵柚枳柝栀柃枸柢栎柁柽栲栳桠桡桎桢桄桤梃栝桕桦桁桧桀栾桊桉栩梵梏桴桷梓桫棂楮棼椟椠棹�\".split(\"\");\nfor(j = 0; j != D[232].length; ++j) if(D[232][j].charCodeAt(0) !== 0xFFFD) { e[D[232][j]] = 59392 + j; d[59392 + j] = D[232][j];}\nD[233] = \"����������������������������������������������������������������锧锳锽镃镈镋镕镚镠镮镴镵長镸镹镺镻镼镽镾門閁閂閃閄閅閆閇閈閉閊開閌閍閎閏閐閑閒間閔閕閖閗閘閙閚閛閜閝閞閟閠閡関閣閤閥閦閧閨閩閪�閫閬閭閮閯閰閱閲閳閴閵閶閷閸閹閺閻閼閽閾閿闀闁闂闃闄闅闆闇闈闉闊闋椤棰椋椁楗棣椐楱椹楠楂楝榄楫榀榘楸椴槌榇榈槎榉楦楣楹榛榧榻榫榭槔榱槁槊槟榕槠榍槿樯槭樗樘橥槲橄樾檠橐橛樵檎橹樽樨橘橼檑檐檩檗檫猷獒殁殂殇殄殒殓殍殚殛殡殪轫轭轱轲轳轵轶轸轷轹轺轼轾辁辂辄辇辋�\".split(\"\");\nfor(j = 0; j != D[233].length; ++j) if(D[233][j].charCodeAt(0) !== 0xFFFD) { e[D[233][j]] = 59648 + j; d[59648 + j] = D[233][j];}\nD[234] = \"����������������������������������������������������������������闌闍闎闏闐闑闒闓闔闕闖闗闘闙闚闛關闝闞闟闠闡闢闣闤闥闦闧闬闿阇阓阘阛阞阠阣阤阥阦阧阨阩阫阬阭阯阰阷阸阹阺阾陁陃陊陎陏陑陒陓陖陗�陘陙陚陜陝陞陠陣陥陦陫陭陮陯陰陱陳陸陹険陻陼陽陾陿隀隁隂隃隄隇隉隊辍辎辏辘辚軎戋戗戛戟戢戡戥戤戬臧瓯瓴瓿甏甑甓攴旮旯旰昊昙杲昃昕昀炅曷昝昴昱昶昵耆晟晔晁晏晖晡晗晷暄暌暧暝暾曛曜曦曩贲贳贶贻贽赀赅赆赈赉赇赍赕赙觇觊觋觌觎觏觐觑牮犟牝牦牯牾牿犄犋犍犏犒挈挲掰�\".split(\"\");\nfor(j = 0; j != D[234].length; ++j) if(D[234][j].charCodeAt(0) !== 0xFFFD) { e[D[234][j]] = 59904 + j; d[59904 + j] = D[234][j];}\nD[235] = \"����������������������������������������������������������������隌階隑隒隓隕隖隚際隝隞隟隠隡隢隣隤隥隦隨隩險隫隬隭隮隯隱隲隴隵隷隸隺隻隿雂雃雈雊雋雐雑雓雔雖雗雘雙雚雛雜雝雞雟雡離難雤雥雦雧雫�雬雭雮雰雱雲雴雵雸雺電雼雽雿霂霃霅霊霋霌霐霑霒霔霕霗霘霙霚霛霝霟霠搿擘耄毪毳毽毵毹氅氇氆氍氕氘氙氚氡氩氤氪氲攵敕敫牍牒牖爰虢刖肟肜肓肼朊肽肱肫肭肴肷胧胨胩胪胛胂胄胙胍胗朐胝胫胱胴胭脍脎胲胼朕脒豚脶脞脬脘脲腈腌腓腴腙腚腱腠腩腼腽腭腧塍媵膈膂膑滕膣膪臌朦臊膻�\".split(\"\");\nfor(j = 0; j != D[235].length; ++j) if(D[235][j].charCodeAt(0) !== 0xFFFD) { e[D[235][j]] = 60160 + j; d[60160 + j] = D[235][j];}\nD[236] = \"����������������������������������������������������������������霡霢霣霤霥霦霧霨霩霫霬霮霯霱霳霴霵霶霷霺霻霼霽霿靀靁靂靃靄靅靆靇靈靉靊靋靌靍靎靏靐靑靔靕靗靘靚靜靝靟靣靤靦靧靨靪靫靬靭靮靯靰靱�靲靵靷靸靹靺靻靽靾靿鞀鞁鞂鞃鞄鞆鞇鞈鞉鞊鞌鞎鞏鞐鞓鞕鞖鞗鞙鞚鞛鞜鞝臁膦欤欷欹歃歆歙飑飒飓飕飙飚殳彀毂觳斐齑斓於旆旄旃旌旎旒旖炀炜炖炝炻烀炷炫炱烨烊焐焓焖焯焱煳煜煨煅煲煊煸煺熘熳熵熨熠燠燔燧燹爝爨灬焘煦熹戾戽扃扈扉礻祀祆祉祛祜祓祚祢祗祠祯祧祺禅禊禚禧禳忑忐�\".split(\"\");\nfor(j = 0; j != D[236].length; ++j) if(D[236][j].charCodeAt(0) !== 0xFFFD) { e[D[236][j]] = 60416 + j; d[60416 + j] = D[236][j];}\nD[237] = \"����������������������������������������������������������������鞞鞟鞡鞢鞤鞥鞦鞧鞨鞩鞪鞬鞮鞰鞱鞳鞵鞶鞷鞸鞹鞺鞻鞼鞽鞾鞿韀韁韂韃韄韅韆韇韈韉韊韋韌韍韎韏韐韑韒韓韔韕韖韗韘韙韚韛韜韝韞韟韠韡韢韣�韤韥韨韮韯韰韱韲韴韷韸韹韺韻韼韽韾響頀頁頂頃頄項順頇須頉頊頋頌頍頎怼恝恚恧恁恙恣悫愆愍慝憩憝懋懑戆肀聿沓泶淼矶矸砀砉砗砘砑斫砭砜砝砹砺砻砟砼砥砬砣砩硎硭硖硗砦硐硇硌硪碛碓碚碇碜碡碣碲碹碥磔磙磉磬磲礅磴礓礤礞礴龛黹黻黼盱眄眍盹眇眈眚眢眙眭眦眵眸睐睑睇睃睚睨�\".split(\"\");\nfor(j = 0; j != D[237].length; ++j) if(D[237][j].charCodeAt(0) !== 0xFFFD) { e[D[237][j]] = 60672 + j; d[60672 + j] = D[237][j];}\nD[238] = \"����������������������������������������������������������������頏預頑頒頓頔頕頖頗領頙頚頛頜頝頞頟頠頡頢頣頤頥頦頧頨頩頪頫頬頭頮頯頰頱頲頳頴頵頶頷頸頹頺頻頼頽頾頿顀顁顂顃顄顅顆顇顈顉顊顋題額�顎顏顐顑顒顓顔顕顖顗願顙顚顛顜顝類顟顠顡顢顣顤顥顦顧顨顩顪顫顬顭顮睢睥睿瞍睽瞀瞌瞑瞟瞠瞰瞵瞽町畀畎畋畈畛畲畹疃罘罡罟詈罨罴罱罹羁罾盍盥蠲钅钆钇钋钊钌钍钏钐钔钗钕钚钛钜钣钤钫钪钭钬钯钰钲钴钶钷钸钹钺钼钽钿铄铈铉铊铋铌铍铎铐铑铒铕铖铗铙铘铛铞铟铠铢铤铥铧铨铪�\".split(\"\");\nfor(j = 0; j != D[238].length; ++j) if(D[238][j].charCodeAt(0) !== 0xFFFD) { e[D[238][j]] = 60928 + j; d[60928 + j] = D[238][j];}\nD[239] = \"����������������������������������������������������������������顯顰顱顲顳顴颋颎颒颕颙颣風颩颪颫颬颭颮颯颰颱颲颳颴颵颶颷颸颹颺颻颼颽颾颿飀飁飂飃飄飅飆飇飈飉飊飋飌飍飏飐飔飖飗飛飜飝飠飡飢飣飤�飥飦飩飪飫飬飭飮飯飰飱飲飳飴飵飶飷飸飹飺飻飼飽飾飿餀餁餂餃餄餅餆餇铩铫铮铯铳铴铵铷铹铼铽铿锃锂锆锇锉锊锍锎锏锒锓锔锕锖锘锛锝锞锟锢锪锫锩锬锱锲锴锶锷锸锼锾锿镂锵镄镅镆镉镌镎镏镒镓镔镖镗镘镙镛镞镟镝镡镢镤镥镦镧镨镩镪镫镬镯镱镲镳锺矧矬雉秕秭秣秫稆嵇稃稂稞稔�\".split(\"\");\nfor(j = 0; j != D[239].length; ++j) if(D[239][j].charCodeAt(0) !== 0xFFFD) { e[D[239][j]] = 61184 + j; d[61184 + j] = D[239][j];}\nD[240] = \"����������������������������������������������������������������餈餉養餋餌餎餏餑餒餓餔餕餖餗餘餙餚餛餜餝餞餟餠餡餢餣餤餥餦餧館餩餪餫餬餭餯餰餱餲餳餴餵餶餷餸餹餺餻餼餽餾餿饀饁饂饃饄饅饆饇饈饉�饊饋饌饍饎饏饐饑饒饓饖饗饘饙饚饛饜饝饞饟饠饡饢饤饦饳饸饹饻饾馂馃馉稹稷穑黏馥穰皈皎皓皙皤瓞瓠甬鸠鸢鸨鸩鸪鸫鸬鸲鸱鸶鸸鸷鸹鸺鸾鹁鹂鹄鹆鹇鹈鹉鹋鹌鹎鹑鹕鹗鹚鹛鹜鹞鹣鹦鹧鹨鹩鹪鹫鹬鹱鹭鹳疒疔疖疠疝疬疣疳疴疸痄疱疰痃痂痖痍痣痨痦痤痫痧瘃痱痼痿瘐瘀瘅瘌瘗瘊瘥瘘瘕瘙�\".split(\"\");\nfor(j = 0; j != D[240].length; ++j) if(D[240][j].charCodeAt(0) !== 0xFFFD) { e[D[240][j]] = 61440 + j; d[61440 + j] = D[240][j];}\nD[241] = \"����������������������������������������������������������������馌馎馚馛馜馝馞馟馠馡馢馣馤馦馧馩馪馫馬馭馮馯馰馱馲馳馴馵馶馷馸馹馺馻馼馽馾馿駀駁駂駃駄駅駆駇駈駉駊駋駌駍駎駏駐駑駒駓駔駕駖駗駘�駙駚駛駜駝駞駟駠駡駢駣駤駥駦駧駨駩駪駫駬駭駮駯駰駱駲駳駴駵駶駷駸駹瘛瘼瘢瘠癀瘭瘰瘿瘵癃瘾瘳癍癞癔癜癖癫癯翊竦穸穹窀窆窈窕窦窠窬窨窭窳衤衩衲衽衿袂袢裆袷袼裉裢裎裣裥裱褚裼裨裾裰褡褙褓褛褊褴褫褶襁襦襻疋胥皲皴矜耒耔耖耜耠耢耥耦耧耩耨耱耋耵聃聆聍聒聩聱覃顸颀颃�\".split(\"\");\nfor(j = 0; j != D[241].length; ++j) if(D[241][j].charCodeAt(0) !== 0xFFFD) { e[D[241][j]] = 61696 + j; d[61696 + j] = D[241][j];}\nD[242] = \"����������������������������������������������������������������駺駻駼駽駾駿騀騁騂騃騄騅騆騇騈騉騊騋騌騍騎騏騐騑騒験騔騕騖騗騘騙騚騛騜騝騞騟騠騡騢騣騤騥騦騧騨騩騪騫騬騭騮騯騰騱騲騳騴騵騶騷騸�騹騺騻騼騽騾騿驀驁驂驃驄驅驆驇驈驉驊驋驌驍驎驏驐驑驒驓驔驕驖驗驘驙颉颌颍颏颔颚颛颞颟颡颢颥颦虍虔虬虮虿虺虼虻蚨蚍蚋蚬蚝蚧蚣蚪蚓蚩蚶蛄蚵蛎蚰蚺蚱蚯蛉蛏蚴蛩蛱蛲蛭蛳蛐蜓蛞蛴蛟蛘蛑蜃蜇蛸蜈蜊蜍蜉蜣蜻蜞蜥蜮蜚蜾蝈蜴蜱蜩蜷蜿螂蜢蝽蝾蝻蝠蝰蝌蝮螋蝓蝣蝼蝤蝙蝥螓螯螨蟒�\".split(\"\");\nfor(j = 0; j != D[242].length; ++j) if(D[242][j].charCodeAt(0) !== 0xFFFD) { e[D[242][j]] = 61952 + j; d[61952 + j] = D[242][j];}\nD[243] = \"����������������������������������������������������������������驚驛驜驝驞驟驠驡驢驣驤驥驦驧驨驩驪驫驲骃骉骍骎骔骕骙骦骩骪骫骬骭骮骯骲骳骴骵骹骻骽骾骿髃髄髆髇髈髉髊髍髎髏髐髒體髕髖髗髙髚髛髜�髝髞髠髢髣髤髥髧髨髩髪髬髮髰髱髲髳髴髵髶髷髸髺髼髽髾髿鬀鬁鬂鬄鬅鬆蟆螈螅螭螗螃螫蟥螬螵螳蟋蟓螽蟑蟀蟊蟛蟪蟠蟮蠖蠓蟾蠊蠛蠡蠹蠼缶罂罄罅舐竺竽笈笃笄笕笊笫笏筇笸笪笙笮笱笠笥笤笳笾笞筘筚筅筵筌筝筠筮筻筢筲筱箐箦箧箸箬箝箨箅箪箜箢箫箴篑篁篌篝篚篥篦篪簌篾篼簏簖簋�\".split(\"\");\nfor(j = 0; j != D[243].length; ++j) if(D[243][j].charCodeAt(0) !== 0xFFFD) { e[D[243][j]] = 62208 + j; d[62208 + j] = D[243][j];}\nD[244] = \"����������������������������������������������������������������鬇鬉鬊鬋鬌鬍鬎鬐鬑鬒鬔鬕鬖鬗鬘鬙鬚鬛鬜鬝鬞鬠鬡鬢鬤鬥鬦鬧鬨鬩鬪鬫鬬鬭鬮鬰鬱鬳鬴鬵鬶鬷鬸鬹鬺鬽鬾鬿魀魆魊魋魌魎魐魒魓魕魖魗魘魙魚�魛魜魝魞魟魠魡魢魣魤魥魦魧魨魩魪魫魬魭魮魯魰魱魲魳魴魵魶魷魸魹魺魻簟簪簦簸籁籀臾舁舂舄臬衄舡舢舣舭舯舨舫舸舻舳舴舾艄艉艋艏艚艟艨衾袅袈裘裟襞羝羟羧羯羰羲籼敉粑粝粜粞粢粲粼粽糁糇糌糍糈糅糗糨艮暨羿翎翕翥翡翦翩翮翳糸絷綦綮繇纛麸麴赳趄趔趑趱赧赭豇豉酊酐酎酏酤�\".split(\"\");\nfor(j = 0; j != D[244].length; ++j) if(D[244][j].charCodeAt(0) !== 0xFFFD) { e[D[244][j]] = 62464 + j; d[62464 + j] = D[244][j];}\nD[245] = \"����������������������������������������������������������������魼魽魾魿鮀鮁鮂鮃鮄鮅鮆鮇鮈鮉鮊鮋鮌鮍鮎鮏鮐鮑鮒鮓鮔鮕鮖鮗鮘鮙鮚鮛鮜鮝鮞鮟鮠鮡鮢鮣鮤鮥鮦鮧鮨鮩鮪鮫鮬鮭鮮鮯鮰鮱鮲鮳鮴鮵鮶鮷鮸鮹鮺�鮻鮼鮽鮾鮿鯀鯁鯂鯃鯄鯅鯆鯇鯈鯉鯊鯋鯌鯍鯎鯏鯐鯑鯒鯓鯔鯕鯖鯗鯘鯙鯚鯛酢酡酰酩酯酽酾酲酴酹醌醅醐醍醑醢醣醪醭醮醯醵醴醺豕鹾趸跫踅蹙蹩趵趿趼趺跄跖跗跚跞跎跏跛跆跬跷跸跣跹跻跤踉跽踔踝踟踬踮踣踯踺蹀踹踵踽踱蹉蹁蹂蹑蹒蹊蹰蹶蹼蹯蹴躅躏躔躐躜躞豸貂貊貅貘貔斛觖觞觚觜�\".split(\"\");\nfor(j = 0; j != D[245].length; ++j) if(D[245][j].charCodeAt(0) !== 0xFFFD) { e[D[245][j]] = 62720 + j; d[62720 + j] = D[245][j];}\nD[246] = \"����������������������������������������������������������������鯜鯝鯞鯟鯠鯡鯢鯣鯤鯥鯦鯧鯨鯩鯪鯫鯬鯭鯮鯯鯰鯱鯲鯳鯴鯵鯶鯷鯸鯹鯺鯻鯼鯽鯾鯿鰀鰁鰂鰃鰄鰅鰆鰇鰈鰉鰊鰋鰌鰍鰎鰏鰐鰑鰒鰓鰔鰕鰖鰗鰘鰙鰚�鰛鰜鰝鰞鰟鰠鰡鰢鰣鰤鰥鰦鰧鰨鰩鰪鰫鰬鰭鰮鰯鰰鰱鰲鰳鰴鰵鰶鰷鰸鰹鰺鰻觥觫觯訾謦靓雩雳雯霆霁霈霏霎霪霭霰霾龀龃龅龆龇龈龉龊龌黾鼋鼍隹隼隽雎雒瞿雠銎銮鋈錾鍪鏊鎏鐾鑫鱿鲂鲅鲆鲇鲈稣鲋鲎鲐鲑鲒鲔鲕鲚鲛鲞鲟鲠鲡鲢鲣鲥鲦鲧鲨鲩鲫鲭鲮鲰鲱鲲鲳鲴鲵鲶鲷鲺鲻鲼鲽鳄鳅鳆鳇鳊鳋�\".split(\"\");\nfor(j = 0; j != D[246].length; ++j) if(D[246][j].charCodeAt(0) !== 0xFFFD) { e[D[246][j]] = 62976 + j; d[62976 + j] = D[246][j];}\nD[247] = \"����������������������������������������������������������������鰼鰽鰾鰿鱀鱁鱂鱃鱄鱅鱆鱇鱈鱉鱊鱋鱌鱍鱎鱏鱐鱑鱒鱓鱔鱕鱖鱗鱘鱙鱚鱛鱜鱝鱞鱟鱠鱡鱢鱣鱤鱥鱦鱧鱨鱩鱪鱫鱬鱭鱮鱯鱰鱱鱲鱳鱴鱵鱶鱷鱸鱹鱺�鱻鱽鱾鲀鲃鲄鲉鲊鲌鲏鲓鲖鲗鲘鲙鲝鲪鲬鲯鲹鲾鲿鳀鳁鳂鳈鳉鳑鳒鳚鳛鳠鳡鳌鳍鳎鳏鳐鳓鳔鳕鳗鳘鳙鳜鳝鳟鳢靼鞅鞑鞒鞔鞯鞫鞣鞲鞴骱骰骷鹘骶骺骼髁髀髅髂髋髌髑魅魃魇魉魈魍魑飨餍餮饕饔髟髡髦髯髫髻髭髹鬈鬏鬓鬟鬣麽麾縻麂麇麈麋麒鏖麝麟黛黜黝黠黟黢黩黧黥黪黯鼢鼬鼯鼹鼷鼽鼾齄�\".split(\"\");\nfor(j = 0; j != D[247].length; ++j) if(D[247][j].charCodeAt(0) !== 0xFFFD) { e[D[247][j]] = 63232 + j; d[63232 + j] = D[247][j];}\nD[248] = \"����������������������������������������������������������������鳣鳤鳥鳦鳧鳨鳩鳪鳫鳬鳭鳮鳯鳰鳱鳲鳳鳴鳵鳶鳷鳸鳹鳺鳻鳼鳽鳾鳿鴀鴁鴂鴃鴄鴅鴆鴇鴈鴉鴊鴋鴌鴍鴎鴏鴐鴑鴒鴓鴔鴕鴖鴗鴘鴙鴚鴛鴜鴝鴞鴟鴠鴡�鴢鴣鴤鴥鴦鴧鴨鴩鴪鴫鴬鴭鴮鴯鴰鴱鴲鴳鴴鴵鴶鴷鴸鴹鴺鴻鴼鴽鴾鴿鵀鵁鵂�����������������������������������������������������������������������������������������������\".split(\"\");\nfor(j = 0; j != D[248].length; ++j) if(D[248][j].charCodeAt(0) !== 0xFFFD) { e[D[248][j]] = 63488 + j; d[63488 + j] = D[248][j];}\nD[249] = \"����������������������������������������������������������������鵃鵄鵅鵆鵇鵈鵉鵊鵋鵌鵍鵎鵏鵐鵑鵒鵓鵔鵕鵖鵗鵘鵙鵚鵛鵜鵝鵞鵟鵠鵡鵢鵣鵤鵥鵦鵧鵨鵩鵪鵫鵬鵭鵮鵯鵰鵱鵲鵳鵴鵵鵶鵷鵸鵹鵺鵻鵼鵽鵾鵿鶀鶁�鶂鶃鶄鶅鶆鶇鶈鶉鶊鶋鶌鶍鶎鶏鶐鶑鶒鶓鶔鶕鶖鶗鶘鶙鶚鶛鶜鶝鶞鶟鶠鶡鶢�����������������������������������������������������������������������������������������������\".split(\"\");\nfor(j = 0; j != D[249].length; ++j) if(D[249][j].charCodeAt(0) !== 0xFFFD) { e[D[249][j]] = 63744 + j; d[63744 + j] = D[249][j];}\nD[250] = \"����������������������������������������������������������������鶣鶤鶥鶦鶧鶨鶩鶪鶫鶬鶭鶮鶯鶰鶱鶲鶳鶴鶵鶶鶷鶸鶹鶺鶻鶼鶽鶾鶿鷀鷁鷂鷃鷄鷅鷆鷇鷈鷉鷊鷋鷌鷍鷎鷏鷐鷑鷒鷓鷔鷕鷖鷗鷘鷙鷚鷛鷜鷝鷞鷟鷠鷡�鷢鷣鷤鷥鷦鷧鷨鷩鷪鷫鷬鷭鷮鷯鷰鷱鷲鷳鷴鷵鷶鷷鷸鷹鷺鷻鷼鷽鷾鷿鸀鸁鸂�����������������������������������������������������������������������������������������������\".split(\"\");\nfor(j = 0; j != D[250].length; ++j) if(D[250][j].charCodeAt(0) !== 0xFFFD) { e[D[250][j]] = 64000 + j; d[64000 + j] = D[250][j];}\nD[251] = \"����������������������������������������������������������������鸃鸄鸅鸆鸇鸈鸉鸊鸋鸌鸍鸎鸏鸐鸑鸒鸓鸔鸕鸖鸗鸘鸙鸚鸛鸜鸝鸞鸤鸧鸮鸰鸴鸻鸼鹀鹍鹐鹒鹓鹔鹖鹙鹝鹟鹠鹡鹢鹥鹮鹯鹲鹴鹵鹶鹷鹸鹹鹺鹻鹼鹽麀�麁麃麄麅麆麉麊麌麍麎麏麐麑麔麕麖麗麘麙麚麛麜麞麠麡麢麣麤麥麧麨麩麪�����������������������������������������������������������������������������������������������\".split(\"\");\nfor(j = 0; j != D[251].length; ++j) if(D[251][j].charCodeAt(0) !== 0xFFFD) { e[D[251][j]] = 64256 + j; d[64256 + j] = D[251][j];}\nD[252] = \"����������������������������������������������������������������麫麬麭麮麯麰麱麲麳麵麶麷麹麺麼麿黀黁黂黃黅黆黇黈黊黋黌黐黒黓黕黖黗黙黚點黡黣黤黦黨黫黬黭黮黰黱黲黳黴黵黶黷黸黺黽黿鼀鼁鼂鼃鼄鼅�鼆鼇鼈鼉鼊鼌鼏鼑鼒鼔鼕鼖鼘鼚鼛鼜鼝鼞鼟鼡鼣鼤鼥鼦鼧鼨鼩鼪鼫鼭鼮鼰鼱�����������������������������������������������������������������������������������������������\".split(\"\");\nfor(j = 0; j != D[252].length; ++j) if(D[252][j].charCodeAt(0) !== 0xFFFD) { e[D[252][j]] = 64512 + j; d[64512 + j] = D[252][j];}\nD[253] = \"����������������������������������������������������������������鼲鼳鼴鼵鼶鼸鼺鼼鼿齀齁齂齃齅齆齇齈齉齊齋齌齍齎齏齒齓齔齕齖齗齘齙齚齛齜齝齞齟齠齡齢齣齤齥齦齧齨齩齪齫齬齭齮齯齰齱齲齳齴齵齶齷齸�齹齺齻齼齽齾龁龂龍龎龏龐龑龒龓龔龕龖龗龘龜龝龞龡龢龣龤龥郎凉秊裏隣�����������������������������������������������������������������������������������������������\".split(\"\");\nfor(j = 0; j != D[253].length; ++j) if(D[253][j].charCodeAt(0) !== 0xFFFD) { e[D[253][j]] = 64768 + j; d[64768 + j] = D[253][j];}\nD[254] = \"����������������������������������������������������������������兀嗀﨎﨏﨑﨓﨔礼﨟蘒﨡﨣﨤﨧﨨﨩��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������\".split(\"\");\nfor(j = 0; j != D[254].length; ++j) if(D[254][j].charCodeAt(0) !== 0xFFFD) { e[D[254][j]] = 65024 + j; d[65024 + j] = D[254][j];}\nreturn {\"enc\": e, \"dec\": d }; })();\ncptable[949] = (function(){ var d = [], e = {}, D = [], j;\nD[0] = \"\\u0000\\u0001\\u0002\\u0003\\u0004\\u0005\\u0006\\u0007\\b\\t\\n\\u000b\\f\\r\\u000e\\u000f\\u0010\\u0011\\u0012\\u0013\\u0014\\u0015\\u0016\\u0017\\u0018\\u0019\\u001a\\u001b\\u001c\\u001d\\u001e\\u001f !\\\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~��������������������������������������������������������������������������������������������������������������������������������\".split(\"\");\nfor(j = 0; j != D[0].length; ++j) if(D[0][j].charCodeAt(0) !== 0xFFFD) { e[D[0][j]] = 0 + j; d[0 + j] = D[0][j];}\nD[129] = \"�����������������������������������������������������������������갂갃갅갆갋갌갍갎갏갘갞갟갡갢갣갥갦갧갨갩갪갫갮갲갳갴������갵갶갷갺갻갽갾갿걁걂걃걄걅걆걇걈걉걊걌걎걏걐걑걒걓걕������걖걗걙걚걛걝걞걟걠걡걢걣걤걥걦걧걨걩걪걫걬걭걮걯걲걳걵걶걹걻걼걽걾걿겂겇겈겍겎겏겑겒겓겕겖겗겘겙겚겛겞겢겣겤겥겦겧겫겭겮겱겲겳겴겵겶겷겺겾겿곀곂곃곅곆곇곉곊곋곍곎곏곐곑곒곓곔곖곘곙곚곛곜곝곞곟곢곣곥곦곩곫곭곮곲곴곷곸곹곺곻곾곿괁괂괃괅괇괈괉괊괋괎괐괒괓�\".split(\"\");\nfor(j = 0; j != D[129].length; ++j) if(D[129][j].charCodeAt(0) !== 0xFFFD) { e[D[129][j]] = 33024 + j; d[33024 + j] = D[129][j];}\nD[130] = \"�����������������������������������������������������������������괔괕괖괗괙괚괛괝괞괟괡괢괣괤괥괦괧괨괪괫괮괯괰괱괲괳������괶괷괹괺괻괽괾괿굀굁굂굃굆굈굊굋굌굍굎굏굑굒굓굕굖굗������굙굚굛굜굝굞굟굠굢굤굥굦굧굨굩굪굫굮굯굱굲굷굸굹굺굾궀궃궄궅궆궇궊궋궍궎궏궑궒궓궔궕궖궗궘궙궚궛궞궟궠궡궢궣궥궦궧궨궩궪궫궬궭궮궯궰궱궲궳궴궵궶궸궹궺궻궼궽궾궿귂귃귅귆귇귉귊귋귌귍귎귏귒귔귕귖귗귘귙귚귛귝귞귟귡귢귣귥귦귧귨귩귪귫귬귭귮귯귰귱귲귳귴귵귶귷�\".split(\"\");\nfor(j = 0; j != D[130].length; ++j) if(D[130][j].charCodeAt(0) !== 0xFFFD) { e[D[130][j]] = 33280 + j; d[33280 + j] = D[130][j];}\nD[131] = \"�����������������������������������������������������������������귺귻귽귾긂긃긄긅긆긇긊긌긎긏긐긑긒긓긕긖긗긘긙긚긛긜������긝긞긟긠긡긢긣긤긥긦긧긨긩긪긫긬긭긮긯긲긳긵긶긹긻긼������긽긾긿깂깄깇깈깉깋깏깑깒깓깕깗깘깙깚깛깞깢깣깤깦깧깪깫깭깮깯깱깲깳깴깵깶깷깺깾깿꺀꺁꺂꺃꺆꺇꺈꺉꺊꺋꺍꺎꺏꺐꺑꺒꺓꺔꺕꺖꺗꺘꺙꺚꺛꺜꺝꺞꺟꺠꺡꺢꺣꺤꺥꺦꺧꺨꺩꺪꺫꺬꺭꺮꺯꺰꺱꺲꺳꺴꺵꺶꺷꺸꺹꺺꺻꺿껁껂껃껅껆껇껈껉껊껋껎껒껓껔껕껖껗껚껛껝껞껟껠껡껢껣껤껥�\".split(\"\");\nfor(j = 0; j != D[131].length; ++j) if(D[131][j].charCodeAt(0) !== 0xFFFD) { e[D[131][j]] = 33536 + j; d[33536 + j] = D[131][j];}\nD[132] = \"�����������������������������������������������������������������껦껧껩껪껬껮껯껰껱껲껳껵껶껷껹껺껻껽껾껿꼀꼁꼂꼃꼄꼅������꼆꼉꼊꼋꼌꼎꼏꼑꼒꼓꼔꼕꼖꼗꼘꼙꼚꼛꼜꼝꼞꼟꼠꼡꼢꼣������꼤꼥꼦꼧꼨꼩꼪꼫꼮꼯꼱꼳꼵꼶꼷꼸꼹꼺꼻꼾꽀꽄꽅꽆꽇꽊꽋꽌꽍꽎꽏꽑꽒꽓꽔꽕꽖꽗꽘꽙꽚꽛꽞꽟꽠꽡꽢꽣꽦꽧꽨꽩꽪꽫꽬꽭꽮꽯꽰꽱꽲꽳꽴꽵꽶꽷꽸꽺꽻꽼꽽꽾꽿꾁꾂꾃꾅꾆꾇꾉꾊꾋꾌꾍꾎꾏꾒꾓꾔꾖꾗꾘꾙꾚꾛꾝꾞꾟꾠꾡꾢꾣꾤꾥꾦꾧꾨꾩꾪꾫꾬꾭꾮꾯꾰꾱꾲꾳꾴꾵꾶꾷꾺꾻꾽꾾�\".split(\"\");\nfor(j = 0; j != D[132].length; ++j) if(D[132][j].charCodeAt(0) !== 0xFFFD) { e[D[132][j]] = 33792 + j; d[33792 + j] = D[132][j];}\nD[133] = \"�����������������������������������������������������������������꾿꿁꿂꿃꿄꿅꿆꿊꿌꿏꿐꿑꿒꿓꿕꿖꿗꿘꿙꿚꿛꿝꿞꿟꿠꿡������꿢꿣꿤꿥꿦꿧꿪꿫꿬꿭꿮꿯꿲꿳꿵꿶꿷꿹꿺꿻꿼꿽꿾꿿뀂뀃������뀅뀆뀇뀈뀉뀊뀋뀍뀎뀏뀑뀒뀓뀕뀖뀗뀘뀙뀚뀛뀞뀟뀠뀡뀢뀣뀤뀥뀦뀧뀩뀪뀫뀬뀭뀮뀯뀰뀱뀲뀳뀴뀵뀶뀷뀸뀹뀺뀻뀼뀽뀾뀿끀끁끂끃끆끇끉끋끍끏끐끑끒끖끘끚끛끜끞끟끠끡끢끣끤끥끦끧끨끩끪끫끬끭끮끯끰끱끲끳끴끵끶끷끸끹끺끻끾끿낁낂낃낅낆낇낈낉낊낋낎낐낒낓낔낕낖낗낛낝낞낣낤�\".split(\"\");\nfor(j = 0; j != D[133].length; ++j) if(D[133][j].charCodeAt(0) !== 0xFFFD) { e[D[133][j]] = 34048 + j; d[34048 + j] = D[133][j];}\nD[134] = \"�����������������������������������������������������������������낥낦낧낪낰낲낶낷낹낺낻낽낾낿냀냁냂냃냆냊냋냌냍냎냏냒������냓냕냖냗냙냚냛냜냝냞냟냡냢냣냤냦냧냨냩냪냫냬냭냮냯냰������냱냲냳냴냵냶냷냸냹냺냻냼냽냾냿넀넁넂넃넄넅넆넇넊넍넎넏넑넔넕넖넗넚넞넟넠넡넢넦넧넩넪넫넭넮넯넰넱넲넳넶넺넻넼넽넾넿녂녃녅녆녇녉녊녋녌녍녎녏녒녓녖녗녙녚녛녝녞녟녡녢녣녤녥녦녧녨녩녪녫녬녭녮녯녰녱녲녳녴녵녶녷녺녻녽녾녿놁놃놄놅놆놇놊놌놎놏놐놑놕놖놗놙놚놛놝�\".split(\"\");\nfor(j = 0; j != D[134].length; ++j) if(D[134][j].charCodeAt(0) !== 0xFFFD) { e[D[134][j]] = 34304 + j; d[34304 + j] = D[134][j];}\nD[135] = \"�����������������������������������������������������������������놞놟놠놡놢놣놤놥놦놧놩놪놫놬놭놮놯놰놱놲놳놴놵놶놷놸������놹놺놻놼놽놾놿뇀뇁뇂뇃뇄뇅뇆뇇뇈뇉뇊뇋뇍뇎뇏뇑뇒뇓뇕������뇖뇗뇘뇙뇚뇛뇞뇠뇡뇢뇣뇤뇥뇦뇧뇪뇫뇭뇮뇯뇱뇲뇳뇴뇵뇶뇷뇸뇺뇼뇾뇿눀눁눂눃눆눇눉눊눍눎눏눐눑눒눓눖눘눚눛눜눝눞눟눡눢눣눤눥눦눧눨눩눪눫눬눭눮눯눰눱눲눳눵눶눷눸눹눺눻눽눾눿뉀뉁뉂뉃뉄뉅뉆뉇뉈뉉뉊뉋뉌뉍뉎뉏뉐뉑뉒뉓뉔뉕뉖뉗뉙뉚뉛뉝뉞뉟뉡뉢뉣뉤뉥뉦뉧뉪뉫뉬뉭뉮�\".split(\"\");\nfor(j = 0; j != D[135].length; ++j) if(D[135][j].charCodeAt(0) !== 0xFFFD) { e[D[135][j]] = 34560 + j; d[34560 + j] = D[135][j];}\nD[136] = \"�����������������������������������������������������������������뉯뉰뉱뉲뉳뉶뉷뉸뉹뉺뉻뉽뉾뉿늀늁늂늃늆늇늈늊늋늌늍늎������늏늒늓늕늖늗늛늜늝늞늟늢늤늧늨늩늫늭늮늯늱늲늳늵늶늷������늸늹늺늻늼늽늾늿닀닁닂닃닄닅닆닇닊닋닍닎닏닑닓닔닕닖닗닚닜닞닟닠닡닣닧닩닪닰닱닲닶닼닽닾댂댃댅댆댇댉댊댋댌댍댎댏댒댖댗댘댙댚댛댝댞댟댠댡댢댣댤댥댦댧댨댩댪댫댬댭댮댯댰댱댲댳댴댵댶댷댸댹댺댻댼댽댾댿덀덁덂덃덄덅덆덇덈덉덊덋덌덍덎덏덐덑덒덓덗덙덚덝덠덡덢덣�\".split(\"\");\nfor(j = 0; j != D[136].length; ++j) if(D[136][j].charCodeAt(0) !== 0xFFFD) { e[D[136][j]] = 34816 + j; d[34816 + j] = D[136][j];}\nD[137] = \"�����������������������������������������������������������������덦덨덪덬덭덯덲덳덵덶덷덹덺덻덼덽덾덿뎂뎆뎇뎈뎉뎊뎋뎍������뎎뎏뎑뎒뎓뎕뎖뎗뎘뎙뎚뎛뎜뎝뎞뎟뎢뎣뎤뎥뎦뎧뎩뎪뎫뎭������뎮뎯뎰뎱뎲뎳뎴뎵뎶뎷뎸뎹뎺뎻뎼뎽뎾뎿돀돁돂돃돆돇돉돊돍돏돑돒돓돖돘돚돜돞돟돡돢돣돥돦돧돩돪돫돬돭돮돯돰돱돲돳돴돵돶돷돸돹돺돻돽돾돿됀됁됂됃됄됅됆됇됈됉됊됋됌됍됎됏됑됒됓됔됕됖됗됙됚됛됝됞됟됡됢됣됤됥됦됧됪됬됭됮됯됰됱됲됳됵됶됷됸됹됺됻됼됽됾됿둀둁둂둃둄�\".split(\"\");\nfor(j = 0; j != D[137].length; ++j) if(D[137][j].charCodeAt(0) !== 0xFFFD) { e[D[137][j]] = 35072 + j; d[35072 + j] = D[137][j];}\nD[138] = \"�����������������������������������������������������������������둅둆둇둈둉둊둋둌둍둎둏둒둓둕둖둗둙둚둛둜둝둞둟둢둤둦������둧둨둩둪둫둭둮둯둰둱둲둳둴둵둶둷둸둹둺둻둼둽둾둿뒁뒂������뒃뒄뒅뒆뒇뒉뒊뒋뒌뒍뒎뒏뒐뒑뒒뒓뒔뒕뒖뒗뒘뒙뒚뒛뒜뒞뒟뒠뒡뒢뒣뒥뒦뒧뒩뒪뒫뒭뒮뒯뒰뒱뒲뒳뒴뒶뒸뒺뒻뒼뒽뒾뒿듁듂듃듅듆듇듉듊듋듌듍듎듏듑듒듓듔듖듗듘듙듚듛듞듟듡듢듥듧듨듩듪듫듮듰듲듳듴듵듶듷듹듺듻듼듽듾듿딀딁딂딃딄딅딆딇딈딉딊딋딌딍딎딏딐딑딒딓딖딗딙딚딝�\".split(\"\");\nfor(j = 0; j != D[138].length; ++j) if(D[138][j].charCodeAt(0) !== 0xFFFD) { e[D[138][j]] = 35328 + j; d[35328 + j] = D[138][j];}\nD[139] = \"�����������������������������������������������������������������딞딟딠딡딢딣딦딫딬딭딮딯딲딳딵딶딷딹딺딻딼딽딾딿땂땆������땇땈땉땊땎땏땑땒땓땕땖땗땘땙땚땛땞땢땣땤땥땦땧땨땩땪������땫땬땭땮땯땰땱땲땳땴땵땶땷땸땹땺땻땼땽땾땿떀떁떂떃떄떅떆떇떈떉떊떋떌떍떎떏떐떑떒떓떔떕떖떗떘떙떚떛떜떝떞떟떢떣떥떦떧떩떬떭떮떯떲떶떷떸떹떺떾떿뗁뗂뗃뗅뗆뗇뗈뗉뗊뗋뗎뗒뗓뗔뗕뗖뗗뗙뗚뗛뗜뗝뗞뗟뗠뗡뗢뗣뗤뗥뗦뗧뗨뗩뗪뗫뗭뗮뗯뗰뗱뗲뗳뗴뗵뗶뗷뗸뗹뗺뗻뗼뗽뗾뗿�\".split(\"\");\nfor(j = 0; j != D[139].length; ++j) if(D[139][j].charCodeAt(0) !== 0xFFFD) { e[D[139][j]] = 35584 + j; d[35584 + j] = D[139][j];}\nD[140] = \"�����������������������������������������������������������������똀똁똂똃똄똅똆똇똈똉똊똋똌똍똎똏똒똓똕똖똗똙똚똛똜똝������똞똟똠똡똢똣똤똦똧똨똩똪똫똭똮똯똰똱똲똳똵똶똷똸똹똺������똻똼똽똾똿뙀뙁뙂뙃뙄뙅뙆뙇뙉뙊뙋뙌뙍뙎뙏뙐뙑뙒뙓뙔뙕뙖뙗뙘뙙뙚뙛뙜뙝뙞뙟뙠뙡뙢뙣뙥뙦뙧뙩뙪뙫뙬뙭뙮뙯뙰뙱뙲뙳뙴뙵뙶뙷뙸뙹뙺뙻뙼뙽뙾뙿뚀뚁뚂뚃뚄뚅뚆뚇뚈뚉뚊뚋뚌뚍뚎뚏뚐뚑뚒뚓뚔뚕뚖뚗뚘뚙뚚뚛뚞뚟뚡뚢뚣뚥뚦뚧뚨뚩뚪뚭뚮뚯뚰뚲뚳뚴뚵뚶뚷뚸뚹뚺뚻뚼뚽뚾뚿뛀뛁뛂�\".split(\"\");\nfor(j = 0; j != D[140].length; ++j) if(D[140][j].charCodeAt(0) !== 0xFFFD) { e[D[140][j]] = 35840 + j; d[35840 + j] = D[140][j];}\nD[141] = \"�����������������������������������������������������������������뛃뛄뛅뛆뛇뛈뛉뛊뛋뛌뛍뛎뛏뛐뛑뛒뛓뛕뛖뛗뛘뛙뛚뛛뛜뛝������뛞뛟뛠뛡뛢뛣뛤뛥뛦뛧뛨뛩뛪뛫뛬뛭뛮뛯뛱뛲뛳뛵뛶뛷뛹뛺������뛻뛼뛽뛾뛿뜂뜃뜄뜆뜇뜈뜉뜊뜋뜌뜍뜎뜏뜐뜑뜒뜓뜔뜕뜖뜗뜘뜙뜚뜛뜜뜝뜞뜟뜠뜡뜢뜣뜤뜥뜦뜧뜪뜫뜭뜮뜱뜲뜳뜴뜵뜶뜷뜺뜼뜽뜾뜿띀띁띂띃띅띆띇띉띊띋띍띎띏띐띑띒띓띖띗띘띙띚띛띜띝띞띟띡띢띣띥띦띧띩띪띫띬띭띮띯띲띴띶띷띸띹띺띻띾띿랁랂랃랅랆랇랈랉랊랋랎랓랔랕랚랛랝랞�\".split(\"\");\nfor(j = 0; j != D[141].length; ++j) if(D[141][j].charCodeAt(0) !== 0xFFFD) { e[D[141][j]] = 36096 + j; d[36096 + j] = D[141][j];}\nD[142] = \"�����������������������������������������������������������������랟랡랢랣랤랥랦랧랪랮랯랰랱랲랳랶랷랹랺랻랼랽랾랿럀럁������럂럃럄럅럆럈럊럋럌럍럎럏럐럑럒럓럔럕럖럗럘럙럚럛럜럝������럞럟럠럡럢럣럤럥럦럧럨럩럪럫럮럯럱럲럳럵럶럷럸럹럺럻럾렂렃렄렅렆렊렋렍렎렏렑렒렓렔렕렖렗렚렜렞렟렠렡렢렣렦렧렩렪렫렭렮렯렰렱렲렳렶렺렻렼렽렾렿롁롂롃롅롆롇롈롉롊롋롌롍롎롏롐롒롔롕롖롗롘롙롚롛롞롟롡롢롣롥롦롧롨롩롪롫롮롰롲롳롴롵롶롷롹롺롻롽롾롿뢀뢁뢂뢃뢄�\".split(\"\");\nfor(j = 0; j != D[142].length; ++j) if(D[142][j].charCodeAt(0) !== 0xFFFD) { e[D[142][j]] = 36352 + j; d[36352 + j] = D[142][j];}\nD[143] = \"�����������������������������������������������������������������뢅뢆뢇뢈뢉뢊뢋뢌뢎뢏뢐뢑뢒뢓뢔뢕뢖뢗뢘뢙뢚뢛뢜뢝뢞뢟������뢠뢡뢢뢣뢤뢥뢦뢧뢩뢪뢫뢬뢭뢮뢯뢱뢲뢳뢵뢶뢷뢹뢺뢻뢼뢽������뢾뢿룂룄룆룇룈룉룊룋룍룎룏룑룒룓룕룖룗룘룙룚룛룜룞룠룢룣룤룥룦룧룪룫룭룮룯룱룲룳룴룵룶룷룺룼룾룿뤀뤁뤂뤃뤅뤆뤇뤈뤉뤊뤋뤌뤍뤎뤏뤐뤑뤒뤓뤔뤕뤖뤗뤙뤚뤛뤜뤝뤞뤟뤡뤢뤣뤤뤥뤦뤧뤨뤩뤪뤫뤬뤭뤮뤯뤰뤱뤲뤳뤴뤵뤶뤷뤸뤹뤺뤻뤾뤿륁륂륃륅륆륇륈륉륊륋륍륎륐륒륓륔륕륖륗�\".split(\"\");\nfor(j = 0; j != D[143].length; ++j) if(D[143][j].charCodeAt(0) !== 0xFFFD) { e[D[143][j]] = 36608 + j; d[36608 + j] = D[143][j];}\nD[144] = \"�����������������������������������������������������������������륚륛륝륞륟륡륢륣륤륥륦륧륪륬륮륯륰륱륲륳륶륷륹륺륻륽������륾륿릀릁릂릃릆릈릋릌릏릐릑릒릓릔릕릖릗릘릙릚릛릜릝릞������릟릠릡릢릣릤릥릦릧릨릩릪릫릮릯릱릲릳릵릶릷릸릹릺릻릾맀맂맃맄맅맆맇맊맋맍맓맔맕맖맗맚맜맟맠맢맦맧맩맪맫맭맮맯맰맱맲맳맶맻맼맽맾맿먂먃먄먅먆먇먉먊먋먌먍먎먏먐먑먒먓먔먖먗먘먙먚먛먜먝먞먟먠먡먢먣먤먥먦먧먨먩먪먫먬먭먮먯먰먱먲먳먴먵먶먷먺먻먽먾먿멁멃멄멅멆�\".split(\"\");\nfor(j = 0; j != D[144].length; ++j) if(D[144][j].charCodeAt(0) !== 0xFFFD) { e[D[144][j]] = 36864 + j; d[36864 + j] = D[144][j];}\nD[145] = \"�����������������������������������������������������������������멇멊멌멏멐멑멒멖멗멙멚멛멝멞멟멠멡멢멣멦멪멫멬멭멮멯������멲멳멵멶멷멹멺멻멼멽멾멿몀몁몂몆몈몉몊몋몍몎몏몐몑몒������몓몔몕몖몗몘몙몚몛몜몝몞몟몠몡몢몣몤몥몦몧몪몭몮몯몱몳몴몵몶몷몺몼몾몿뫀뫁뫂뫃뫅뫆뫇뫉뫊뫋뫌뫍뫎뫏뫐뫑뫒뫓뫔뫕뫖뫗뫚뫛뫜뫝뫞뫟뫠뫡뫢뫣뫤뫥뫦뫧뫨뫩뫪뫫뫬뫭뫮뫯뫰뫱뫲뫳뫴뫵뫶뫷뫸뫹뫺뫻뫽뫾뫿묁묂묃묅묆묇묈묉묊묋묌묎묐묒묓묔묕묖묗묙묚묛묝묞묟묡묢묣묤묥묦묧�\".split(\"\");\nfor(j = 0; j != D[145].length; ++j) if(D[145][j].charCodeAt(0) !== 0xFFFD) { e[D[145][j]] = 37120 + j; d[37120 + j] = D[145][j];}\nD[146] = \"�����������������������������������������������������������������묨묪묬묭묮묯묰묱묲묳묷묹묺묿뭀뭁뭂뭃뭆뭈뭊뭋뭌뭎뭑뭒������뭓뭕뭖뭗뭙뭚뭛뭜뭝뭞뭟뭠뭢뭤뭥뭦뭧뭨뭩뭪뭫뭭뭮뭯뭰뭱������뭲뭳뭴뭵뭶뭷뭸뭹뭺뭻뭼뭽뭾뭿뮀뮁뮂뮃뮄뮅뮆뮇뮉뮊뮋뮍뮎뮏뮑뮒뮓뮔뮕뮖뮗뮘뮙뮚뮛뮜뮝뮞뮟뮠뮡뮢뮣뮥뮦뮧뮩뮪뮫뮭뮮뮯뮰뮱뮲뮳뮵뮶뮸뮹뮺뮻뮼뮽뮾뮿믁믂믃믅믆믇믉믊믋믌믍믎믏믑믒믔믕믖믗믘믙믚믛믜믝믞믟믠믡믢믣믤믥믦믧믨믩믪믫믬믭믮믯믰믱믲믳믴믵믶믷믺믻믽믾밁�\".split(\"\");\nfor(j = 0; j != D[146].length; ++j) if(D[146][j].charCodeAt(0) !== 0xFFFD) { e[D[146][j]] = 37376 + j; d[37376 + j] = D[146][j];}\nD[147] = \"�����������������������������������������������������������������밃밄밅밆밇밊밎밐밒밓밙밚밠밡밢밣밦밨밪밫밬밮밯밲밳밵������밶밷밹밺밻밼밽밾밿뱂뱆뱇뱈뱊뱋뱎뱏뱑뱒뱓뱔뱕뱖뱗뱘뱙������뱚뱛뱜뱞뱟뱠뱡뱢뱣뱤뱥뱦뱧뱨뱩뱪뱫뱬뱭뱮뱯뱰뱱뱲뱳뱴뱵뱶뱷뱸뱹뱺뱻뱼뱽뱾뱿벀벁벂벃벆벇벉벊벍벏벐벑벒벓벖벘벛벜벝벞벟벢벣벥벦벩벪벫벬벭벮벯벲벶벷벸벹벺벻벾벿볁볂볃볅볆볇볈볉볊볋볌볎볒볓볔볖볗볙볚볛볝볞볟볠볡볢볣볤볥볦볧볨볩볪볫볬볭볮볯볰볱볲볳볷볹볺볻볽�\".split(\"\");\nfor(j = 0; j != D[147].length; ++j) if(D[147][j].charCodeAt(0) !== 0xFFFD) { e[D[147][j]] = 37632 + j; d[37632 + j] = D[147][j];}\nD[148] = \"�����������������������������������������������������������������볾볿봀봁봂봃봆봈봊봋봌봍봎봏봑봒봓봕봖봗봘봙봚봛봜봝������봞봟봠봡봢봣봥봦봧봨봩봪봫봭봮봯봰봱봲봳봴봵봶봷봸봹������봺봻봼봽봾봿뵁뵂뵃뵄뵅뵆뵇뵊뵋뵍뵎뵏뵑뵒뵓뵔뵕뵖뵗뵚뵛뵜뵝뵞뵟뵠뵡뵢뵣뵥뵦뵧뵩뵪뵫뵬뵭뵮뵯뵰뵱뵲뵳뵴뵵뵶뵷뵸뵹뵺뵻뵼뵽뵾뵿붂붃붅붆붋붌붍붎붏붒붔붖붗붘붛붝붞붟붠붡붢붣붥붦붧붨붩붪붫붬붭붮붯붱붲붳붴붵붶붷붹붺붻붼붽붾붿뷀뷁뷂뷃뷄뷅뷆뷇뷈뷉뷊뷋뷌뷍뷎뷏뷐뷑�\".split(\"\");\nfor(j = 0; j != D[148].length; ++j) if(D[148][j].charCodeAt(0) !== 0xFFFD) { e[D[148][j]] = 37888 + j; d[37888 + j] = D[148][j];}\nD[149] = \"�����������������������������������������������������������������뷒뷓뷖뷗뷙뷚뷛뷝뷞뷟뷠뷡뷢뷣뷤뷥뷦뷧뷨뷪뷫뷬뷭뷮뷯뷱������뷲뷳뷵뷶뷷뷹뷺뷻뷼뷽뷾뷿븁븂븄븆븇븈븉븊븋븎븏븑븒븓������븕븖븗븘븙븚븛븞븠븡븢븣븤븥븦븧븨븩븪븫븬븭븮븯븰븱븲븳븴븵븶븷븸븹븺븻븼븽븾븿빀빁빂빃빆빇빉빊빋빍빏빐빑빒빓빖빘빜빝빞빟빢빣빥빦빧빩빫빬빭빮빯빲빶빷빸빹빺빾빿뺁뺂뺃뺅뺆뺇뺈뺉뺊뺋뺎뺒뺓뺔뺕뺖뺗뺚뺛뺜뺝뺞뺟뺠뺡뺢뺣뺤뺥뺦뺧뺩뺪뺫뺬뺭뺮뺯뺰뺱뺲뺳뺴뺵뺶뺷�\".split(\"\");\nfor(j = 0; j != D[149].length; ++j) if(D[149][j].charCodeAt(0) !== 0xFFFD) { e[D[149][j]] = 38144 + j; d[38144 + j] = D[149][j];}\nD[150] = \"�����������������������������������������������������������������뺸뺹뺺뺻뺼뺽뺾뺿뻀뻁뻂뻃뻄뻅뻆뻇뻈뻉뻊뻋뻌뻍뻎뻏뻒뻓������뻕뻖뻙뻚뻛뻜뻝뻞뻟뻡뻢뻦뻧뻨뻩뻪뻫뻭뻮뻯뻰뻱뻲뻳뻴뻵������뻶뻷뻸뻹뻺뻻뻼뻽뻾뻿뼀뼂뼃뼄뼅뼆뼇뼊뼋뼌뼍뼎뼏뼐뼑뼒뼓뼔뼕뼖뼗뼚뼞뼟뼠뼡뼢뼣뼤뼥뼦뼧뼨뼩뼪뼫뼬뼭뼮뼯뼰뼱뼲뼳뼴뼵뼶뼷뼸뼹뼺뼻뼼뼽뼾뼿뽂뽃뽅뽆뽇뽉뽊뽋뽌뽍뽎뽏뽒뽓뽔뽖뽗뽘뽙뽚뽛뽜뽝뽞뽟뽠뽡뽢뽣뽤뽥뽦뽧뽨뽩뽪뽫뽬뽭뽮뽯뽰뽱뽲뽳뽴뽵뽶뽷뽸뽹뽺뽻뽼뽽뽾뽿뾀뾁뾂�\".split(\"\");\nfor(j = 0; j != D[150].length; ++j) if(D[150][j].charCodeAt(0) !== 0xFFFD) { e[D[150][j]] = 38400 + j; d[38400 + j] = D[150][j];}\nD[151] = \"�����������������������������������������������������������������뾃뾄뾅뾆뾇뾈뾉뾊뾋뾌뾍뾎뾏뾐뾑뾒뾓뾕뾖뾗뾘뾙뾚뾛뾜뾝������뾞뾟뾠뾡뾢뾣뾤뾥뾦뾧뾨뾩뾪뾫뾬뾭뾮뾯뾱뾲뾳뾴뾵뾶뾷뾸������뾹뾺뾻뾼뾽뾾뾿뿀뿁뿂뿃뿄뿆뿇뿈뿉뿊뿋뿎뿏뿑뿒뿓뿕뿖뿗뿘뿙뿚뿛뿝뿞뿠뿢뿣뿤뿥뿦뿧뿨뿩뿪뿫뿬뿭뿮뿯뿰뿱뿲뿳뿴뿵뿶뿷뿸뿹뿺뿻뿼뿽뿾뿿쀀쀁쀂쀃쀄쀅쀆쀇쀈쀉쀊쀋쀌쀍쀎쀏쀐쀑쀒쀓쀔쀕쀖쀗쀘쀙쀚쀛쀜쀝쀞쀟쀠쀡쀢쀣쀤쀥쀦쀧쀨쀩쀪쀫쀬쀭쀮쀯쀰쀱쀲쀳쀴쀵쀶쀷쀸쀹쀺쀻쀽쀾쀿�\".split(\"\");\nfor(j = 0; j != D[151].length; ++j) if(D[151][j].charCodeAt(0) !== 0xFFFD) { e[D[151][j]] = 38656 + j; d[38656 + j] = D[151][j];}\nD[152] = \"�����������������������������������������������������������������쁀쁁쁂쁃쁄쁅쁆쁇쁈쁉쁊쁋쁌쁍쁎쁏쁐쁒쁓쁔쁕쁖쁗쁙쁚쁛������쁝쁞쁟쁡쁢쁣쁤쁥쁦쁧쁪쁫쁬쁭쁮쁯쁰쁱쁲쁳쁴쁵쁶쁷쁸쁹������쁺쁻쁼쁽쁾쁿삀삁삂삃삄삅삆삇삈삉삊삋삌삍삎삏삒삓삕삖삗삙삚삛삜삝삞삟삢삤삦삧삨삩삪삫삮삱삲삷삸삹삺삻삾샂샃샄샆샇샊샋샍샎샏샑샒샓샔샕샖샗샚샞샟샠샡샢샣샦샧샩샪샫샭샮샯샰샱샲샳샶샸샺샻샼샽샾샿섁섂섃섅섆섇섉섊섋섌섍섎섏섑섒섓섔섖섗섘섙섚섛섡섢섥섨섩섪섫섮�\".split(\"\");\nfor(j = 0; j != D[152].length; ++j) if(D[152][j].charCodeAt(0) !== 0xFFFD) { e[D[152][j]] = 38912 + j; d[38912 + j] = D[152][j];}\nD[153] = \"�����������������������������������������������������������������섲섳섴섵섷섺섻섽섾섿셁셂셃셄셅셆셇셊셎셏셐셑셒셓셖셗������셙셚셛셝셞셟셠셡셢셣셦셪셫셬셭셮셯셱셲셳셵셶셷셹셺셻������셼셽셾셿솀솁솂솃솄솆솇솈솉솊솋솏솑솒솓솕솗솘솙솚솛솞솠솢솣솤솦솧솪솫솭솮솯솱솲솳솴솵솶솷솸솹솺솻솼솾솿쇀쇁쇂쇃쇅쇆쇇쇉쇊쇋쇍쇎쇏쇐쇑쇒쇓쇕쇖쇙쇚쇛쇜쇝쇞쇟쇡쇢쇣쇥쇦쇧쇩쇪쇫쇬쇭쇮쇯쇲쇴쇵쇶쇷쇸쇹쇺쇻쇾쇿숁숂숃숅숆숇숈숉숊숋숎숐숒숓숔숕숖숗숚숛숝숞숡숢숣�\".split(\"\");\nfor(j = 0; j != D[153].length; ++j) if(D[153][j].charCodeAt(0) !== 0xFFFD) { e[D[153][j]] = 39168 + j; d[39168 + j] = D[153][j];}\nD[154] = \"�����������������������������������������������������������������숤숥숦숧숪숬숮숰숳숵숶숷숸숹숺숻숼숽숾숿쉀쉁쉂쉃쉄쉅������쉆쉇쉉쉊쉋쉌쉍쉎쉏쉒쉓쉕쉖쉗쉙쉚쉛쉜쉝쉞쉟쉡쉢쉣쉤쉦������쉧쉨쉩쉪쉫쉮쉯쉱쉲쉳쉵쉶쉷쉸쉹쉺쉻쉾슀슂슃슄슅슆슇슊슋슌슍슎슏슑슒슓슔슕슖슗슙슚슜슞슟슠슡슢슣슦슧슩슪슫슮슯슰슱슲슳슶슸슺슻슼슽슾슿싀싁싂싃싄싅싆싇싈싉싊싋싌싍싎싏싐싑싒싓싔싕싖싗싘싙싚싛싞싟싡싢싥싦싧싨싩싪싮싰싲싳싴싵싷싺싽싾싿쌁쌂쌃쌄쌅쌆쌇쌊쌋쌎쌏�\".split(\"\");\nfor(j = 0; j != D[154].length; ++j) if(D[154][j].charCodeAt(0) !== 0xFFFD) { e[D[154][j]] = 39424 + j; d[39424 + j] = D[154][j];}\nD[155] = \"�����������������������������������������������������������������쌐쌑쌒쌖쌗쌙쌚쌛쌝쌞쌟쌠쌡쌢쌣쌦쌧쌪쌫쌬쌭쌮쌯쌰쌱쌲������쌳쌴쌵쌶쌷쌸쌹쌺쌻쌼쌽쌾쌿썀썁썂썃썄썆썇썈썉썊썋썌썍������썎썏썐썑썒썓썔썕썖썗썘썙썚썛썜썝썞썟썠썡썢썣썤썥썦썧썪썫썭썮썯썱썳썴썵썶썷썺썻썾썿쎀쎁쎂쎃쎅쎆쎇쎉쎊쎋쎍쎎쎏쎐쎑쎒쎓쎔쎕쎖쎗쎘쎙쎚쎛쎜쎝쎞쎟쎠쎡쎢쎣쎤쎥쎦쎧쎨쎩쎪쎫쎬쎭쎮쎯쎰쎱쎲쎳쎴쎵쎶쎷쎸쎹쎺쎻쎼쎽쎾쎿쏁쏂쏃쏄쏅쏆쏇쏈쏉쏊쏋쏌쏍쏎쏏쏐쏑쏒쏓쏔쏕쏖쏗쏚�\".split(\"\");\nfor(j = 0; j != D[155].length; ++j) if(D[155][j].charCodeAt(0) !== 0xFFFD) { e[D[155][j]] = 39680 + j; d[39680 + j] = D[155][j];}\nD[156] = \"�����������������������������������������������������������������쏛쏝쏞쏡쏣쏤쏥쏦쏧쏪쏫쏬쏮쏯쏰쏱쏲쏳쏶쏷쏹쏺쏻쏼쏽쏾������쏿쐀쐁쐂쐃쐄쐅쐆쐇쐉쐊쐋쐌쐍쐎쐏쐑쐒쐓쐔쐕쐖쐗쐘쐙쐚������쐛쐜쐝쐞쐟쐠쐡쐢쐣쐥쐦쐧쐨쐩쐪쐫쐭쐮쐯쐱쐲쐳쐵쐶쐷쐸쐹쐺쐻쐾쐿쑀쑁쑂쑃쑄쑅쑆쑇쑉쑊쑋쑌쑍쑎쑏쑐쑑쑒쑓쑔쑕쑖쑗쑘쑙쑚쑛쑜쑝쑞쑟쑠쑡쑢쑣쑦쑧쑩쑪쑫쑭쑮쑯쑰쑱쑲쑳쑶쑷쑸쑺쑻쑼쑽쑾쑿쒁쒂쒃쒄쒅쒆쒇쒈쒉쒊쒋쒌쒍쒎쒏쒐쒑쒒쒓쒕쒖쒗쒘쒙쒚쒛쒝쒞쒟쒠쒡쒢쒣쒤쒥쒦쒧쒨쒩�\".split(\"\");\nfor(j = 0; j != D[156].length; ++j) if(D[156][j].charCodeAt(0) !== 0xFFFD) { e[D[156][j]] = 39936 + j; d[39936 + j] = D[156][j];}\nD[157] = \"�����������������������������������������������������������������쒪쒫쒬쒭쒮쒯쒰쒱쒲쒳쒴쒵쒶쒷쒹쒺쒻쒽쒾쒿쓀쓁쓂쓃쓄쓅������쓆쓇쓈쓉쓊쓋쓌쓍쓎쓏쓐쓑쓒쓓쓔쓕쓖쓗쓘쓙쓚쓛쓜쓝쓞쓟������쓠쓡쓢쓣쓤쓥쓦쓧쓨쓪쓫쓬쓭쓮쓯쓲쓳쓵쓶쓷쓹쓻쓼쓽쓾씂씃씄씅씆씇씈씉씊씋씍씎씏씑씒씓씕씖씗씘씙씚씛씝씞씟씠씡씢씣씤씥씦씧씪씫씭씮씯씱씲씳씴씵씶씷씺씼씾씿앀앁앂앃앆앇앋앏앐앑앒앖앚앛앜앟앢앣앥앦앧앩앪앫앬앭앮앯앲앶앷앸앹앺앻앾앿얁얂얃얅얆얈얉얊얋얎얐얒얓얔�\".split(\"\");\nfor(j = 0; j != D[157].length; ++j) if(D[157][j].charCodeAt(0) !== 0xFFFD) { e[D[157][j]] = 40192 + j; d[40192 + j] = D[157][j];}\nD[158] = \"�����������������������������������������������������������������얖얙얚얛얝얞얟얡얢얣얤얥얦얧얨얪얫얬얭얮얯얰얱얲얳얶������얷얺얿엀엁엂엃엋엍엏엒엓엕엖엗엙엚엛엜엝엞엟엢엤엦엧������엨엩엪엫엯엱엲엳엵엸엹엺엻옂옃옄옉옊옋옍옎옏옑옒옓옔옕옖옗옚옝옞옟옠옡옢옣옦옧옩옪옫옯옱옲옶옸옺옼옽옾옿왂왃왅왆왇왉왊왋왌왍왎왏왒왖왗왘왙왚왛왞왟왡왢왣왤왥왦왧왨왩왪왫왭왮왰왲왳왴왵왶왷왺왻왽왾왿욁욂욃욄욅욆욇욊욌욎욏욐욑욒욓욖욗욙욚욛욝욞욟욠욡욢욣욦�\".split(\"\");\nfor(j = 0; j != D[158].length; ++j) if(D[158][j].charCodeAt(0) !== 0xFFFD) { e[D[158][j]] = 40448 + j; d[40448 + j] = D[158][j];}\nD[159] = \"�����������������������������������������������������������������욨욪욫욬욭욮욯욲욳욵욶욷욻욼욽욾욿웂웄웆웇웈웉웊웋웎������웏웑웒웓웕웖웗웘웙웚웛웞웟웢웣웤웥웦웧웪웫웭웮웯웱웲������웳웴웵웶웷웺웻웼웾웿윀윁윂윃윆윇윉윊윋윍윎윏윐윑윒윓윖윘윚윛윜윝윞윟윢윣윥윦윧윩윪윫윬윭윮윯윲윴윶윸윹윺윻윾윿읁읂읃읅읆읇읈읉읋읎읐읙읚읛읝읞읟읡읢읣읤읥읦읧읩읪읬읭읮읯읰읱읲읳읶읷읹읺읻읿잀잁잂잆잋잌잍잏잒잓잕잙잛잜잝잞잟잢잧잨잩잪잫잮잯잱잲잳잵잶잷�\".split(\"\");\nfor(j = 0; j != D[159].length; ++j) if(D[159][j].charCodeAt(0) !== 0xFFFD) { e[D[159][j]] = 40704 + j; d[40704 + j] = D[159][j];}\nD[160] = \"�����������������������������������������������������������������잸잹잺잻잾쟂쟃쟄쟅쟆쟇쟊쟋쟍쟏쟑쟒쟓쟔쟕쟖쟗쟙쟚쟛쟜������쟞쟟쟠쟡쟢쟣쟥쟦쟧쟩쟪쟫쟭쟮쟯쟰쟱쟲쟳쟴쟵쟶쟷쟸쟹쟺������쟻쟼쟽쟾쟿젂젃젅젆젇젉젋젌젍젎젏젒젔젗젘젙젚젛젞젟젡젢젣젥젦젧젨젩젪젫젮젰젲젳젴젵젶젷젹젺젻젽젾젿졁졂졃졄졅졆졇졊졋졎졏졐졑졒졓졕졖졗졘졙졚졛졜졝졞졟졠졡졢졣졤졥졦졧졨졩졪졫졬졭졮졯졲졳졵졶졷졹졻졼졽졾졿좂좄좈좉좊좎좏좐좑좒좓좕좖좗좘좙좚좛좜좞좠좢좣좤�\".split(\"\");\nfor(j = 0; j != D[160].length; ++j) if(D[160][j].charCodeAt(0) !== 0xFFFD) { e[D[160][j]] = 40960 + j; d[40960 + j] = D[160][j];}\nD[161] = \"�����������������������������������������������������������������좥좦좧좩좪좫좬좭좮좯좰좱좲좳좴좵좶좷좸좹좺좻좾좿죀죁������죂죃죅죆죇죉죊죋죍죎죏죐죑죒죓죖죘죚죛죜죝죞죟죢죣죥������죦죧죨죩죪죫죬죭죮죯죰죱죲죳죴죶죷죸죹죺죻죾죿줁줂줃줇줈줉줊줋줎 、。·‥…¨〃―∥\∼‘’“”〔〕〈〉《》「」『』【】±×÷≠≤≥∞∴°′″℃Å¢£¥♂♀∠⊥⌒∂∇≡≒§※☆★○●◎◇◆□■△▲▽▼→←↑↓↔〓≪≫√∽∝∵∫∬∈∋⊆⊇⊂⊃∪∩∧∨¬�\".split(\"\");\nfor(j = 0; j != D[161].length; ++j) if(D[161][j].charCodeAt(0) !== 0xFFFD) { e[D[161][j]] = 41216 + j; d[41216 + j] = D[161][j];}\nD[162] = \"�����������������������������������������������������������������줐줒줓줔줕줖줗줙줚줛줜줝줞줟줠줡줢줣줤줥줦줧줨줩줪줫������줭줮줯줰줱줲줳줵줶줷줸줹줺줻줼줽줾줿쥀쥁쥂쥃쥄쥅쥆쥇������쥈쥉쥊쥋쥌쥍쥎쥏쥒쥓쥕쥖쥗쥙쥚쥛쥜쥝쥞쥟쥢쥤쥥쥦쥧쥨쥩쥪쥫쥭쥮쥯⇒⇔∀∃´~ˇ˘˝˚˙¸˛¡¿ː∮∑∏¤℉‰◁◀▷▶♤♠♡♥♧♣⊙◈▣◐◑▒▤▥▨▧▦▩♨☏☎☜☞¶†‡↕↗↙↖↘♭♩♪♬㉿㈜№㏇™㏂㏘℡€®������������������������\".split(\"\");\nfor(j = 0; j != D[162].length; ++j) if(D[162][j].charCodeAt(0) !== 0xFFFD) { e[D[162][j]] = 41472 + j; d[41472 + j] = D[162][j];}\nD[163] = \"�����������������������������������������������������������������쥱쥲쥳쥵쥶쥷쥸쥹쥺쥻쥽쥾쥿즀즁즂즃즄즅즆즇즊즋즍즎즏������즑즒즓즔즕즖즗즚즜즞즟즠즡즢즣즤즥즦즧즨즩즪즫즬즭즮������즯즰즱즲즳즴즵즶즷즸즹즺즻즼즽즾즿짂짃짅짆짉짋짌짍짎짏짒짔짗짘짛!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[₩]^_`abcdefghijklmnopqrstuvwxyz{|} ̄�\".split(\"\");\nfor(j = 0; j != D[163].length; ++j) if(D[163][j].charCodeAt(0) !== 0xFFFD) { e[D[163][j]] = 41728 + j; d[41728 + j] = D[163][j];}\nD[164] = \"�����������������������������������������������������������������짞짟짡짣짥짦짨짩짪짫짮짲짳짴짵짶짷짺짻짽짾짿쨁쨂쨃쨄������쨅쨆쨇쨊쨎쨏쨐쨑쨒쨓쨕쨖쨗쨙쨚쨛쨜쨝쨞쨟쨠쨡쨢쨣쨤쨥������쨦쨧쨨쨪쨫쨬쨭쨮쨯쨰쨱쨲쨳쨴쨵쨶쨷쨸쨹쨺쨻쨼쨽쨾쨿쩀쩁쩂쩃쩄쩅쩆ㄱㄲㄳㄴㄵㄶㄷㄸㄹㄺㄻㄼㄽㄾㄿㅀㅁㅂㅃㅄㅅㅆㅇㅈㅉㅊㅋㅌㅍㅎㅏㅐㅑㅒㅓㅔㅕㅖㅗㅘㅙㅚㅛㅜㅝㅞㅟㅠㅡㅢㅣㅤㅥㅦㅧㅨㅩㅪㅫㅬㅭㅮㅯㅰㅱㅲㅳㅴㅵㅶㅷㅸㅹㅺㅻㅼㅽㅾㅿㆀㆁㆂㆃㆄㆅㆆㆇㆈㆉㆊㆋㆌㆍㆎ�\".split(\"\");\nfor(j = 0; j != D[164].length; ++j) if(D[164][j].charCodeAt(0) !== 0xFFFD) { e[D[164][j]] = 41984 + j; d[41984 + j] = D[164][j];}\nD[165] = \"�����������������������������������������������������������������쩇쩈쩉쩊쩋쩎쩏쩑쩒쩓쩕쩖쩗쩘쩙쩚쩛쩞쩢쩣쩤쩥쩦쩧쩩쩪������쩫쩬쩭쩮쩯쩰쩱쩲쩳쩴쩵쩶쩷쩸쩹쩺쩻쩼쩾쩿쪀쪁쪂쪃쪅쪆������쪇쪈쪉쪊쪋쪌쪍쪎쪏쪐쪑쪒쪓쪔쪕쪖쪗쪙쪚쪛쪜쪝쪞쪟쪠쪡쪢쪣쪤쪥쪦쪧ⅰⅱⅲⅳⅴⅵⅶⅷⅸⅹ�����ⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩ�������ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩ��������αβγδεζηθικλμνξ