{"version":3,"file":"browser-image-compression.mjs","sources":["../node_modules/uzip/UZIP.js","../lib/UPNG.js","../lib/utils.js","../lib/web-worker.js","../lib/image-compression.js"],"sourcesContent":["\r\n\r\nvar UZIP = {};\r\nif(typeof module == \"object\") module.exports = UZIP;\r\n\r\n\r\nUZIP[\"parse\"] = function(buf, onlyNames)\t// ArrayBuffer\r\n{\r\n\tvar rUs = UZIP.bin.readUshort, rUi = UZIP.bin.readUint, o = 0, out = {};\r\n\tvar data = new Uint8Array(buf);\r\n\tvar eocd = data.length-4;\r\n\t\r\n\twhile(rUi(data, eocd)!=0x06054b50) eocd--;\r\n\t\r\n\tvar o = eocd;\r\n\to+=4;\t// sign  = 0x06054b50\r\n\to+=4;  // disks = 0;\r\n\tvar cnu = rUs(data, o);  o+=2;\r\n\tvar cnt = rUs(data, o);  o+=2;\r\n\t\t\t\r\n\tvar csize = rUi(data, o);  o+=4;\r\n\tvar coffs = rUi(data, o);  o+=4;\r\n\t\r\n\to = coffs;\r\n\tfor(var i=0; i<cnu; i++)\r\n\t{\r\n\t\tvar sign = rUi(data, o);  o+=4;\r\n\t\to += 4;  // versions;\r\n\t\to += 4;  // flag + compr\r\n\t\to += 4;  // time\r\n\t\t\r\n\t\tvar crc32 = rUi(data, o);  o+=4;\r\n\t\tvar csize = rUi(data, o);  o+=4;\r\n\t\tvar usize = rUi(data, o);  o+=4;\r\n\t\t\r\n\t\tvar nl = rUs(data, o), el = rUs(data, o+2), cl = rUs(data, o+4);  o += 6;  // name, extra, comment\r\n\t\to += 8;  // disk, attribs\r\n\t\t\r\n\t\tvar roff = rUi(data, o);  o+=4;\r\n\t\to += nl + el + cl;\r\n\t\t\r\n\t\tUZIP._readLocal(data, roff, out, csize, usize, onlyNames);\r\n\t}\r\n\t//console.log(out);\r\n\treturn out;\r\n}\r\n\r\nUZIP._readLocal = function(data, o, out, csize, usize, onlyNames)\r\n{\r\n\tvar rUs = UZIP.bin.readUshort, rUi = UZIP.bin.readUint;\r\n\tvar sign  = rUi(data, o);  o+=4;\r\n\tvar ver   = rUs(data, o);  o+=2;\r\n\tvar gpflg = rUs(data, o);  o+=2;\r\n\t//if((gpflg&8)!=0) throw \"unknown sizes\";\r\n\tvar cmpr  = rUs(data, o);  o+=2;\r\n\t\r\n\tvar time  = rUi(data, o);  o+=4;\r\n\t\r\n\tvar crc32 = rUi(data, o);  o+=4;\r\n\t//var csize = rUi(data, o);  o+=4;\r\n\t//var usize = rUi(data, o);  o+=4;\r\n\to+=8;\r\n\t\t\r\n\tvar nlen  = rUs(data, o);  o+=2;\r\n\tvar elen  = rUs(data, o);  o+=2;\r\n\t\t\r\n\tvar name =  UZIP.bin.readUTF8(data, o, nlen);  o+=nlen;  //console.log(name);\r\n\to += elen;\r\n\t\t\t\r\n\t//console.log(sign.toString(16), ver, gpflg, cmpr, crc32.toString(16), \"csize, usize\", csize, usize, nlen, elen, name, o);\r\n\tif(onlyNames) {  out[name]={size:usize, csize:csize};  return;  }   \r\n\tvar file = new Uint8Array(data.buffer, o);\r\n\tif(false) {}\r\n\telse if(cmpr==0) out[name] = new Uint8Array(file.buffer.slice(o, o+csize));\r\n\telse if(cmpr==8) {\r\n\t\tvar buf = new Uint8Array(usize);  UZIP.inflateRaw(file, buf);\r\n\t\t/*var nbuf = pako[\"inflateRaw\"](file);\r\n\t\tif(usize>8514000) {\r\n\t\t\t//console.log(PUtils.readASCII(buf , 8514500, 500));\r\n\t\t\t//console.log(PUtils.readASCII(nbuf, 8514500, 500));\r\n\t\t}\r\n\t\tfor(var i=0; i<buf.length; i++) if(buf[i]!=nbuf[i]) {  console.log(buf.length, nbuf.length, usize, i);  throw \"e\";  }\r\n\t\t*/\r\n\t\tout[name] = buf;\r\n\t}\r\n\telse throw \"unknown compression method: \"+cmpr;\r\n}\r\n\r\nUZIP.inflateRaw = function(file, buf) {  return UZIP.F.inflate(file, buf);  }\r\nUZIP.inflate    = function(file, buf) { \r\n\tvar CMF = file[0], FLG = file[1];\r\n\tvar CM = (CMF&15), CINFO = (CMF>>>4);\r\n\t//console.log(CM, CINFO,CMF,FLG);\r\n\treturn UZIP.inflateRaw(new Uint8Array(file.buffer, file.byteOffset+2, file.length-6), buf);  \r\n}\r\nUZIP.deflate    = function(data, opts/*, buf, off*/) {\r\n\tif(opts==null) opts={level:6};\r\n\tvar off=0, buf=new Uint8Array(50+Math.floor(data.length*1.1));\r\n\tbuf[off]=120;  buf[off+1]=156;  off+=2;\r\n\toff = UZIP.F.deflateRaw(data, buf, off, opts.level);\r\n\tvar crc = UZIP.adler(data, 0, data.length);\r\n\tbuf[off+0]=((crc>>>24)&255); \r\n\tbuf[off+1]=((crc>>>16)&255); \r\n\tbuf[off+2]=((crc>>> 8)&255); \r\n\tbuf[off+3]=((crc>>> 0)&255); \t\r\n\treturn new Uint8Array(buf.buffer, 0, off+4);\r\n}\r\nUZIP.deflateRaw = function(data, opts) {\r\n\tif(opts==null) opts={level:6};\r\n\tvar buf=new Uint8Array(50+Math.floor(data.length*1.1));\r\n\tvar off = UZIP.F.deflateRaw(data, buf, off, opts.level);\r\n\treturn new Uint8Array(buf.buffer, 0, off);\r\n}\r\n\r\n\r\nUZIP.encode = function(obj, noCmpr) {\r\n\tif(noCmpr==null) noCmpr=false;\r\n\tvar tot = 0, wUi = UZIP.bin.writeUint, wUs = UZIP.bin.writeUshort;\r\n\tvar zpd = {};\r\n\tfor(var p in obj) {  var cpr = !UZIP._noNeed(p) && !noCmpr, buf = obj[p], crc = UZIP.crc.crc(buf,0,buf.length); \r\n\t\tzpd[p] = {  cpr:cpr, usize:buf.length, crc:crc, file: (cpr ? UZIP.deflateRaw(buf) : buf)  };  }\r\n\t\r\n\tfor(var p in zpd) tot += zpd[p].file.length + 30 + 46 + 2*UZIP.bin.sizeUTF8(p);\r\n\ttot +=  22;\r\n\t\r\n\tvar data = new Uint8Array(tot), o = 0;\r\n\tvar fof = []\r\n\t\r\n\tfor(var p in zpd) {\r\n\t\tvar file = zpd[p];  fof.push(o);\r\n\t\to = UZIP._writeHeader(data, o, p, file, 0);\r\n\t}\r\n\tvar i=0, ioff = o;\r\n\tfor(var p in zpd) {\r\n\t\tvar file = zpd[p];  fof.push(o);\r\n\t\to = UZIP._writeHeader(data, o, p, file, 1, fof[i++]);\t\t\r\n\t}\r\n\tvar csize = o-ioff;\r\n\t\r\n\twUi(data, o, 0x06054b50);  o+=4;\r\n\to += 4;  // disks\r\n\twUs(data, o, i);  o += 2;\r\n\twUs(data, o, i);  o += 2;\t// number of c d records\r\n\twUi(data, o, csize);  o += 4;\r\n\twUi(data, o, ioff );  o += 4;\r\n\to += 2;\r\n\treturn data.buffer;\r\n}\r\n// no need to compress .PNG, .ZIP, .JPEG ....\r\nUZIP._noNeed = function(fn) {  var ext = fn.split(\".\").pop().toLowerCase();  return \"png,jpg,jpeg,zip\".indexOf(ext)!=-1;  }\r\n\r\nUZIP._writeHeader = function(data, o, p, obj, t, roff)\r\n{\r\n\tvar wUi = UZIP.bin.writeUint, wUs = UZIP.bin.writeUshort;\r\n\tvar file = obj.file;\r\n\t\r\n\twUi(data, o, t==0 ? 0x04034b50 : 0x02014b50);  o+=4; // sign\r\n\tif(t==1) o+=2;  // ver made by\r\n\twUs(data, o, 20);  o+=2;\t// ver\r\n\twUs(data, o,  0);  o+=2;    // gflip\r\n\twUs(data, o,  obj.cpr?8:0);  o+=2;\t// cmpr\r\n\t\t\r\n\twUi(data, o,  0);  o+=4;\t// time\t\t\r\n\twUi(data, o, obj.crc);  o+=4;\t// crc32\r\n\twUi(data, o, file.length);  o+=4;\t// csize\r\n\twUi(data, o, obj.usize);  o+=4;\t// usize\r\n\t\t\r\n\twUs(data, o, UZIP.bin.sizeUTF8(p));  o+=2;\t// nlen\r\n\twUs(data, o, 0);  o+=2;\t// elen\r\n\t\r\n\tif(t==1) {\r\n\t\to += 2;  // comment length\r\n\t\to += 2;  // disk number\r\n\t\to += 6;  // attributes\r\n\t\twUi(data, o, roff);  o+=4;\t// usize\r\n\t}\r\n\tvar nlen = UZIP.bin.writeUTF8(data, o, p);  o+= nlen;\t\r\n\tif(t==0) {  data.set(file, o);  o += file.length;  }\r\n\treturn o;\r\n}\r\n\r\n\r\n\r\n\r\n\r\nUZIP.crc = {\r\n\ttable : ( function() {\r\n\t   var tab = new Uint32Array(256);\r\n\t   for (var n=0; n<256; n++) {\r\n\t\t\tvar c = n;\r\n\t\t\tfor (var k=0; k<8; k++) {\r\n\t\t\t\tif (c & 1)  c = 0xedb88320 ^ (c >>> 1);\r\n\t\t\t\telse        c = c >>> 1;\r\n\t\t\t}\r\n\t\t\ttab[n] = c;  }    \r\n\t\treturn tab;  })(),\r\n\tupdate : function(c, buf, off, len) {\r\n\t\tfor (var i=0; i<len; i++)  c = UZIP.crc.table[(c ^ buf[off+i]) & 0xff] ^ (c >>> 8);\r\n\t\treturn c;\r\n\t},\r\n\tcrc : function(b,o,l)  {  return UZIP.crc.update(0xffffffff,b,o,l) ^ 0xffffffff;  }\r\n}\r\nUZIP.adler = function(data,o,len) {\r\n\tvar a = 1, b = 0;\r\n\tvar off = o, end=o+len;\r\n\twhile(off<end) {\r\n\t\tvar eend = Math.min(off+5552, end);\r\n\t\twhile(off<eend) {\r\n\t\t\ta += data[off++];\r\n\t\t\tb += a;\r\n\t\t}\r\n\t\ta=a%65521;\r\n\t\tb=b%65521;\r\n\t}\r\n    return (b << 16) | a;\r\n}\r\n\r\nUZIP.bin = {\r\n\treadUshort : function(buff,p)  {  return (buff[p]) | (buff[p+1]<<8);  },\r\n\twriteUshort: function(buff,p,n){  buff[p] = (n)&255;  buff[p+1] = (n>>8)&255;  },\r\n\treadUint   : function(buff,p)  {  return (buff[p+3]*(256*256*256)) + ((buff[p+2]<<16) | (buff[p+1]<< 8) | buff[p]);  },\r\n\twriteUint  : function(buff,p,n){  buff[p]=n&255;  buff[p+1]=(n>>8)&255;  buff[p+2]=(n>>16)&255;  buff[p+3]=(n>>24)&255;  },\r\n\treadASCII  : function(buff,p,l){  var s = \"\";  for(var i=0; i<l; i++) s += String.fromCharCode(buff[p+i]);  return s;    },\r\n\twriteASCII : function(data,p,s){  for(var i=0; i<s.length; i++) data[p+i] = s.charCodeAt(i);  },\r\n\tpad : function(n) { return n.length < 2 ? \"0\" + n : n; },\r\n\treadUTF8 : function(buff, p, l) {\r\n\t\tvar s = \"\", ns;\r\n\t\tfor(var i=0; i<l; i++) s += \"%\" + UZIP.bin.pad(buff[p+i].toString(16));\r\n\t\ttry {  ns = decodeURIComponent(s); }\r\n\t\tcatch(e) {  return UZIP.bin.readASCII(buff, p, l);  }\r\n\t\treturn  ns;\r\n\t},\r\n\twriteUTF8 : function(buff, p, str) {\r\n\t\tvar strl = str.length, i=0;\r\n\t\tfor(var ci=0; ci<strl; ci++)\r\n\t\t{\r\n\t\t\tvar code = str.charCodeAt(ci);\r\n\t\t\tif     ((code&(0xffffffff-(1<< 7)+1))==0) {  buff[p+i] = (     code     );  i++;  }\r\n\t\t\telse if((code&(0xffffffff-(1<<11)+1))==0) {  buff[p+i] = (192|(code>> 6));  buff[p+i+1] = (128|((code>> 0)&63));  i+=2;  }\r\n\t\t\telse if((code&(0xffffffff-(1<<16)+1))==0) {  buff[p+i] = (224|(code>>12));  buff[p+i+1] = (128|((code>> 6)&63));  buff[p+i+2] = (128|((code>>0)&63));  i+=3;  }\r\n\t\t\telse if((code&(0xffffffff-(1<<21)+1))==0) {  buff[p+i] = (240|(code>>18));  buff[p+i+1] = (128|((code>>12)&63));  buff[p+i+2] = (128|((code>>6)&63));  buff[p+i+3] = (128|((code>>0)&63)); i+=4;  }\r\n\t\t\telse throw \"e\";\r\n\t\t}\r\n\t\treturn i;\r\n\t},\r\n\tsizeUTF8 : function(str) {\r\n\t\tvar strl = str.length, i=0;\r\n\t\tfor(var ci=0; ci<strl; ci++)\r\n\t\t{\r\n\t\t\tvar code = str.charCodeAt(ci);\r\n\t\t\tif     ((code&(0xffffffff-(1<< 7)+1))==0) {  i++ ;  }\r\n\t\t\telse if((code&(0xffffffff-(1<<11)+1))==0) {  i+=2;  }\r\n\t\t\telse if((code&(0xffffffff-(1<<16)+1))==0) {  i+=3;  }\r\n\t\t\telse if((code&(0xffffffff-(1<<21)+1))==0) {  i+=4;  }\r\n\t\t\telse throw \"e\";\r\n\t\t}\r\n\t\treturn i;\r\n\t}\r\n}\r\n\r\n\r\n\r\n\r\n\r\nUZIP.F = {};\r\n\r\nUZIP.F.deflateRaw = function(data, out, opos, lvl) {\t\r\n\tvar opts = [\r\n\t/*\r\n\t\t ush good_length; /* reduce lazy search above this match length \r\n\t\t ush max_lazy;    /* do not perform lazy search above this match length \r\n         ush nice_length; /* quit search above this match length \r\n\t*/\r\n\t/*      good lazy nice chain */\r\n\t/* 0 */ [ 0,   0,   0,    0,0],  /* store only */\r\n\t/* 1 */ [ 4,   4,   8,    4,0], /* max speed, no lazy matches */\r\n\t/* 2 */ [ 4,   5,  16,    8,0],\r\n\t/* 3 */ [ 4,   6,  16,   16,0],\r\n\r\n\t/* 4 */ [ 4,  10,  16,   32,0],  /* lazy matches */\r\n\t/* 5 */ [ 8,  16,  32,   32,0],\r\n\t/* 6 */ [ 8,  16, 128,  128,0],\r\n\t/* 7 */ [ 8,  32, 128,  256,0],\r\n\t/* 8 */ [32, 128, 258, 1024,1],\r\n\t/* 9 */ [32, 258, 258, 4096,1]]; /* max compression */\r\n\t\r\n\tvar opt = opts[lvl];\r\n\t\r\n\t\r\n\tvar U = UZIP.F.U, goodIndex = UZIP.F._goodIndex, hash = UZIP.F._hash, putsE = UZIP.F._putsE;\r\n\tvar i = 0, pos = opos<<3, cvrd = 0, dlen = data.length;\r\n\t\r\n\tif(lvl==0) {\r\n\t\twhile(i<dlen) {   var len = Math.min(0xffff, dlen-i);\r\n\t\t\tputsE(out, pos, (i+len==dlen ? 1 : 0));  pos = UZIP.F._copyExact(data, i, len, out, pos+8);  i += len;  }\r\n\t\treturn pos>>>3;\r\n\t}\r\n\r\n\tvar lits = U.lits, strt=U.strt, prev=U.prev, li=0, lc=0, bs=0, ebits=0, c=0, nc=0;  // last_item, literal_count, block_start\r\n\tif(dlen>2) {  nc=UZIP.F._hash(data,0);  strt[nc]=0;  }\r\n\tvar nmch=0,nmci=0;\r\n\t\r\n\tfor(i=0; i<dlen; i++)  {\r\n\t\tc = nc;\r\n\t\t//*\r\n\t\tif(i+1<dlen-2) {\r\n\t\t\tnc = UZIP.F._hash(data, i+1);\r\n\t\t\tvar ii = ((i+1)&0x7fff);\r\n\t\t\tprev[ii]=strt[nc];\r\n\t\t\tstrt[nc]=ii;\r\n\t\t} //*/\r\n\t\tif(cvrd<=i) {\r\n\t\t\tif((li>14000 || lc>26697) && (dlen-i)>100) {\r\n\t\t\t\tif(cvrd<i) {  lits[li]=i-cvrd;  li+=2;  cvrd=i;  }\r\n\t\t\t\tpos = UZIP.F._writeBlock(((i==dlen-1) || (cvrd==dlen))?1:0, lits, li, ebits, data,bs,i-bs, out, pos);  li=lc=ebits=0;  bs=i;\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tvar mch = 0;\r\n\t\t\t//if(nmci==i) mch= nmch;  else \r\n\t\t\tif(i<dlen-2) mch = UZIP.F._bestMatch(data, i, prev, c, Math.min(opt[2],dlen-i), opt[3]);\r\n\t\t\t/*\r\n\t\t\tif(mch!=0 && opt[4]==1 && (mch>>>16)<opt[1] && i+1<dlen-2) {\r\n\t\t\t\tnmch = UZIP.F._bestMatch(data, i+1, prev, nc, opt[2], opt[3]);  nmci=i+1;\r\n\t\t\t\t//var mch2 = UZIP.F._bestMatch(data, i+2, prev, nnc);  //nmci=i+1;\r\n\t\t\t\tif((nmch>>>16)>(mch>>>16)) mch=0;\r\n\t\t\t}//*/\r\n\t\t\tvar len = mch>>>16, dst = mch&0xffff;  //if(i-dst<0) throw \"e\";\r\n\t\t\tif(mch!=0) { \r\n\t\t\t\tvar len = mch>>>16, dst = mch&0xffff;  //if(i-dst<0) throw \"e\";\r\n\t\t\t\tvar lgi = goodIndex(len, U.of0);  U.lhst[257+lgi]++; \r\n\t\t\t\tvar dgi = goodIndex(dst, U.df0);  U.dhst[    dgi]++;  ebits += U.exb[lgi] + U.dxb[dgi]; \r\n\t\t\t\tlits[li] = (len<<23)|(i-cvrd);  lits[li+1] = (dst<<16)|(lgi<<8)|dgi;  li+=2;\r\n\t\t\t\tcvrd = i + len;  \r\n\t\t\t}\r\n\t\t\telse {\tU.lhst[data[i]]++;  }\r\n\t\t\tlc++;\r\n\t\t}\r\n\t}\r\n\tif(bs!=i || data.length==0) {\r\n\t\tif(cvrd<i) {  lits[li]=i-cvrd;  li+=2;  cvrd=i;  }\r\n\t\tpos = UZIP.F._writeBlock(1, lits, li, ebits, data,bs,i-bs, out, pos);  li=0;  lc=0;  li=lc=ebits=0;  bs=i;\r\n\t}\r\n\twhile((pos&7)!=0) pos++;\r\n\treturn pos>>>3;\r\n}\r\nUZIP.F._bestMatch = function(data, i, prev, c, nice, chain) {\r\n\tvar ci = (i&0x7fff), pi=prev[ci];  \r\n\t//console.log(\"----\", i);\r\n\tvar dif = ((ci-pi + (1<<15)) & 0x7fff);  if(pi==ci || c!=UZIP.F._hash(data,i-dif)) return 0;\r\n\tvar tl=0, td=0;  // top length, top distance\r\n\tvar dlim = Math.min(0x7fff, i);\r\n\twhile(dif<=dlim && --chain!=0 && pi!=ci /*&& c==UZIP.F._hash(data,i-dif)*/) {\r\n\t\tif(tl==0 || (data[i+tl]==data[i+tl-dif])) {\r\n\t\t\tvar cl = UZIP.F._howLong(data, i, dif);\r\n\t\t\tif(cl>tl) {  \r\n\t\t\t\ttl=cl;  td=dif;  if(tl>=nice) break;    //* \r\n\t\t\t\tif(dif+2<cl) cl = dif+2;\r\n\t\t\t\tvar maxd = 0; // pi does not point to the start of the word\r\n\t\t\t\tfor(var j=0; j<cl-2; j++) {\r\n\t\t\t\t\tvar ei =  (i-dif+j+ (1<<15)) & 0x7fff;\r\n\t\t\t\t\tvar li = prev[ei];\r\n\t\t\t\t\tvar curd = (ei-li + (1<<15)) & 0x7fff;\r\n\t\t\t\t\tif(curd>maxd) {  maxd=curd;  pi = ei; }\r\n\t\t\t\t}  //*/\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\tci=pi;  pi = prev[ci];\r\n\t\tdif += ((ci-pi + (1<<15)) & 0x7fff);\r\n\t}\r\n\treturn (tl<<16)|td;\r\n}\r\nUZIP.F._howLong = function(data, i, dif) {\r\n\tif(data[i]!=data[i-dif] || data[i+1]!=data[i+1-dif] || data[i+2]!=data[i+2-dif]) return 0;\r\n\tvar oi=i, l = Math.min(data.length, i+258);  i+=3;\r\n\t//while(i+4<l && data[i]==data[i-dif] && data[i+1]==data[i+1-dif] && data[i+2]==data[i+2-dif] && data[i+3]==data[i+3-dif]) i+=4;\r\n\twhile(i<l && data[i]==data[i-dif]) i++;\r\n\treturn i-oi;\r\n}\r\nUZIP.F._hash = function(data, i) {\r\n\treturn (((data[i]<<8) | data[i+1])+(data[i+2]<<4))&0xffff;\r\n\t//var hash_shift = 0, hash_mask = 255;\r\n\t//var h = data[i+1] % 251;\r\n\t//h = (((h << 8) + data[i+2]) % 251);\r\n\t//h = (((h << 8) + data[i+2]) % 251);\r\n\t//h = ((h<<hash_shift) ^ (c) ) & hash_mask;\r\n\t//return h | (data[i]<<8);\r\n\t//return (data[i] | (data[i+1]<<8));\r\n}\r\n//UZIP.___toth = 0;\r\nUZIP.saved = 0;\r\nUZIP.F._writeBlock = function(BFINAL, lits, li, ebits, data,o0,l0, out, pos) {\r\n\tvar U = UZIP.F.U, putsF = UZIP.F._putsF, putsE = UZIP.F._putsE;\r\n\t\r\n\t//*\r\n\tvar T, ML, MD, MH, numl, numd, numh, lset, dset;  U.lhst[256]++;\r\n\tT = UZIP.F.getTrees(); ML=T[0]; MD=T[1]; MH=T[2]; numl=T[3]; numd=T[4]; numh=T[5]; lset=T[6]; dset=T[7];\r\n\t\r\n\tvar cstSize = (((pos+3)&7)==0 ? 0 : 8-((pos+3)&7)) + 32 + (l0<<3);\r\n\tvar fxdSize = ebits + UZIP.F.contSize(U.fltree, U.lhst) + UZIP.F.contSize(U.fdtree, U.dhst);\r\n\tvar dynSize = ebits + UZIP.F.contSize(U.ltree , U.lhst) + UZIP.F.contSize(U.dtree , U.dhst);\r\n\tdynSize    += 14 + 3*numh + UZIP.F.contSize(U.itree, U.ihst) + (U.ihst[16]*2 + U.ihst[17]*3 + U.ihst[18]*7);\r\n\t\r\n\tfor(var j=0; j<286; j++) U.lhst[j]=0;   for(var j=0; j<30; j++) U.dhst[j]=0;   for(var j=0; j<19; j++) U.ihst[j]=0;\r\n\t//*/\r\n\tvar BTYPE = (cstSize<fxdSize && cstSize<dynSize) ? 0 : ( fxdSize<dynSize ? 1 : 2 );\r\n\tputsF(out, pos, BFINAL);  putsF(out, pos+1, BTYPE);  pos+=3;\r\n\t\r\n\tvar opos = pos;\r\n\tif(BTYPE==0) {\r\n\t\twhile((pos&7)!=0) pos++;\r\n\t\tpos = UZIP.F._copyExact(data, o0, l0, out, pos);\r\n\t}\r\n\telse {\r\n\t\tvar ltree, dtree;\r\n\t\tif(BTYPE==1) {  ltree=U.fltree;  dtree=U.fdtree;  }\r\n\t\tif(BTYPE==2) {\t\r\n\t\t\tUZIP.F.makeCodes(U.ltree, ML);  UZIP.F.revCodes(U.ltree, ML);\r\n\t\t\tUZIP.F.makeCodes(U.dtree, MD);  UZIP.F.revCodes(U.dtree, MD);\r\n\t\t\tUZIP.F.makeCodes(U.itree, MH);  UZIP.F.revCodes(U.itree, MH);\r\n\t\t\t\r\n\t\t\tltree = U.ltree;  dtree = U.dtree;\r\n\t\t\t\r\n\t\t\tputsE(out, pos,numl-257);  pos+=5;  // 286\r\n\t\t\tputsE(out, pos,numd-  1);  pos+=5;  // 30\r\n\t\t\tputsE(out, pos,numh-  4);  pos+=4;  // 19\r\n\t\t\t\r\n\t\t\tfor(var i=0; i<numh; i++) putsE(out, pos+i*3, U.itree[(U.ordr[i]<<1)+1]);   pos+=3* numh;\r\n\t\t\tpos = UZIP.F._codeTiny(lset, U.itree, out, pos);\r\n\t\t\tpos = UZIP.F._codeTiny(dset, U.itree, out, pos);\r\n\t\t}\r\n\t\t\r\n\t\tvar off=o0;\r\n\t\tfor(var si=0; si<li; si+=2) {\r\n\t\t\tvar qb=lits[si], len=(qb>>>23), end = off+(qb&((1<<23)-1));\r\n\t\t\twhile(off<end) pos = UZIP.F._writeLit(data[off++], ltree, out, pos);\r\n\t\t\t\r\n\t\t\tif(len!=0) {\r\n\t\t\t\tvar qc = lits[si+1], dst=(qc>>16), lgi=(qc>>8)&255, dgi=(qc&255);\r\n\t\t\t\tpos = UZIP.F._writeLit(257+lgi, ltree, out, pos);\r\n\t\t\t\tputsE(out, pos, len-U.of0[lgi]);  pos+=U.exb[lgi];\r\n\t\t\t\t\r\n\t\t\t\tpos = UZIP.F._writeLit(dgi, dtree, out, pos);\r\n\t\t\t\tputsF(out, pos, dst-U.df0[dgi]);  pos+=U.dxb[dgi];  off+=len;\r\n\t\t\t}\r\n\t\t}\r\n\t\tpos = UZIP.F._writeLit(256, ltree, out, pos);\r\n\t}\r\n\t//console.log(pos-opos, fxdSize, dynSize, cstSize);\r\n\treturn pos;\r\n}\r\nUZIP.F._copyExact = function(data,off,len,out,pos) {\r\n\tvar p8 = (pos>>>3);\r\n\tout[p8]=(len);  out[p8+1]=(len>>>8);  out[p8+2]=255-out[p8];  out[p8+3]=255-out[p8+1];  p8+=4;\r\n\tout.set(new Uint8Array(data.buffer, off, len), p8);\r\n\t//for(var i=0; i<len; i++) out[p8+i]=data[off+i];\r\n\treturn pos + ((len+4)<<3);\r\n}\r\n/*\r\n\tInteresting facts:\r\n\t- decompressed block can have bytes, which do not occur in a Huffman tree (copied from the previous block by reference)\r\n*/\r\n\r\nUZIP.F.getTrees = function() {\r\n\tvar U = UZIP.F.U;\r\n\tvar ML = UZIP.F._hufTree(U.lhst, U.ltree, 15);\r\n\tvar MD = UZIP.F._hufTree(U.dhst, U.dtree, 15);\r\n\tvar lset = [], numl = UZIP.F._lenCodes(U.ltree, lset);\r\n\tvar dset = [], numd = UZIP.F._lenCodes(U.dtree, dset);\r\n\tfor(var i=0; i<lset.length; i+=2) U.ihst[lset[i]]++;\r\n\tfor(var i=0; i<dset.length; i+=2) U.ihst[dset[i]]++;\r\n\tvar MH = UZIP.F._hufTree(U.ihst, U.itree,  7);\r\n\tvar numh = 19;  while(numh>4 && U.itree[(U.ordr[numh-1]<<1)+1]==0) numh--;\r\n\treturn [ML, MD, MH, numl, numd, numh, lset, dset];\r\n}\r\nUZIP.F.getSecond= function(a) {  var b=[];  for(var i=0; i<a.length; i+=2) b.push  (a[i+1]);  return b;  }\r\nUZIP.F.nonZero  = function(a) {  var b= \"\";  for(var i=0; i<a.length; i+=2) if(a[i+1]!=0)b+=(i>>1)+\",\";  return b;  }\r\nUZIP.F.contSize = function(tree, hst) {  var s=0;  for(var i=0; i<hst.length; i++) s+= hst[i]*tree[(i<<1)+1];  return s;  }\r\nUZIP.F._codeTiny = function(set, tree, out, pos) {\r\n\tfor(var i=0; i<set.length; i+=2) {\r\n\t\tvar l = set[i], rst = set[i+1];  //console.log(l, pos, tree[(l<<1)+1]);\r\n\t\tpos = UZIP.F._writeLit(l, tree, out, pos);\r\n\t\tvar rsl = l==16 ? 2 : (l==17 ? 3 : 7);\r\n\t\tif(l>15) {  UZIP.F._putsE(out, pos, rst, rsl);  pos+=rsl;  }\r\n\t}\r\n\treturn pos;\r\n}\r\nUZIP.F._lenCodes = function(tree, set) {\r\n\tvar len=tree.length;  while(len!=2 && tree[len-1]==0) len-=2;  // when no distances, keep one code with length 0\r\n\tfor(var i=0; i<len; i+=2) {\r\n\t\tvar l = tree[i+1], nxt = (i+3<len ? tree[i+3]:-1),  nnxt = (i+5<len ? tree[i+5]:-1),  prv = (i==0 ? -1 : tree[i-1]);\r\n\t\tif(l==0 && nxt==l && nnxt==l) {\r\n\t\t\tvar lz = i+5;\r\n\t\t\twhile(lz+2<len && tree[lz+2]==l) lz+=2;\r\n\t\t\tvar zc = Math.min((lz+1-i)>>>1, 138);\r\n\t\t\tif(zc<11) set.push(17, zc-3);\r\n\t\t\telse set.push(18, zc-11);\r\n\t\t\ti += zc*2-2;\r\n\t\t}\r\n\t\telse if(l==prv && nxt==l && nnxt==l) {\r\n\t\t\tvar lz = i+5;\r\n\t\t\twhile(lz+2<len && tree[lz+2]==l) lz+=2;\r\n\t\t\tvar zc = Math.min((lz+1-i)>>>1, 6);\r\n\t\t\tset.push(16, zc-3);\r\n\t\t\ti += zc*2-2;\r\n\t\t}\r\n\t\telse set.push(l, 0);\r\n\t}\r\n\treturn len>>>1;\r\n}\r\nUZIP.F._hufTree   = function(hst, tree, MAXL) {\r\n\tvar list=[], hl = hst.length, tl=tree.length, i=0;\r\n\tfor(i=0; i<tl; i+=2) {  tree[i]=0;  tree[i+1]=0;  }\t\r\n\tfor(i=0; i<hl; i++) if(hst[i]!=0) list.push({lit:i, f:hst[i]});\r\n\tvar end = list.length, l2=list.slice(0);\r\n\tif(end==0) return 0;  // empty histogram (usually for dist)\r\n\tif(end==1) {  var lit=list[0].lit, l2=lit==0?1:0;  tree[(lit<<1)+1]=1;  tree[(l2<<1)+1]=1;  return 1;  }\r\n\tlist.sort(function(a,b){return a.f-b.f;});\r\n\tvar a=list[0], b=list[1], i0=0, i1=1, i2=2;  list[0]={lit:-1,f:a.f+b.f,l:a,r:b,d:0};\r\n\twhile(i1!=end-1) {\r\n\t\tif(i0!=i1 && (i2==end || list[i0].f<list[i2].f)) {  a=list[i0++];  }  else {  a=list[i2++];  }\r\n\t\tif(i0!=i1 && (i2==end || list[i0].f<list[i2].f)) {  b=list[i0++];  }  else {  b=list[i2++];  }\r\n\t\tlist[i1++]={lit:-1,f:a.f+b.f, l:a,r:b};\r\n\t}\r\n\tvar maxl = UZIP.F.setDepth(list[i1-1], 0);\r\n\tif(maxl>MAXL) {  UZIP.F.restrictDepth(l2, MAXL, maxl);  maxl = MAXL;  }\r\n\tfor(i=0; i<end; i++) tree[(l2[i].lit<<1)+1]=l2[i].d;\r\n\treturn maxl;\r\n}\r\n\r\nUZIP.F.setDepth  = function(t, d) {\r\n\tif(t.lit!=-1) {  t.d=d;  return d;  }\r\n\treturn Math.max( UZIP.F.setDepth(t.l, d+1),  UZIP.F.setDepth(t.r, d+1) );\r\n}\r\n\r\nUZIP.F.restrictDepth = function(dps, MD, maxl) {\r\n\tvar i=0, bCost=1<<(maxl-MD), dbt=0;\r\n\tdps.sort(function(a,b){return b.d==a.d ? a.f-b.f : b.d-a.d;});\r\n\t\r\n\tfor(i=0; i<dps.length; i++) if(dps[i].d>MD) {  var od=dps[i].d;  dps[i].d=MD;  dbt+=bCost-(1<<(maxl-od));  }  else break;\r\n\tdbt = dbt>>>(maxl-MD);\r\n\twhile(dbt>0) {  var od=dps[i].d;  if(od<MD) {  dps[i].d++;  dbt-=(1<<(MD-od-1));  }  else  i++;  }\r\n\tfor(; i>=0; i--) if(dps[i].d==MD && dbt<0) {  dps[i].d--;  dbt++;  }  if(dbt!=0) console.log(\"debt left\");\r\n}\r\n\r\nUZIP.F._goodIndex = function(v, arr) {\r\n\tvar i=0;  if(arr[i|16]<=v) i|=16;  if(arr[i|8]<=v) i|=8;  if(arr[i|4]<=v) i|=4;  if(arr[i|2]<=v) i|=2;  if(arr[i|1]<=v) i|=1;  return i;\r\n}\r\nUZIP.F._writeLit = function(ch, ltree, out, pos) {\r\n\tUZIP.F._putsF(out, pos, ltree[ch<<1]);\r\n\treturn pos+ltree[(ch<<1)+1];\r\n}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\nUZIP.F.inflate = function(data, buf) {\r\n\tvar u8=Uint8Array;\r\n\tif(data[0]==3 && data[1]==0) return (buf ? buf : new u8(0));\r\n\tvar F=UZIP.F, bitsF = F._bitsF, bitsE = F._bitsE, decodeTiny = F._decodeTiny, makeCodes = F.makeCodes, codes2map=F.codes2map, get17 = F._get17;\r\n\tvar U = F.U;\r\n\t\r\n\tvar noBuf = (buf==null);\r\n\tif(noBuf) buf = new u8((data.length>>>2)<<3);\r\n\t\r\n\tvar BFINAL=0, BTYPE=0, HLIT=0, HDIST=0, HCLEN=0, ML=0, MD=0; \t\r\n\tvar off = 0, pos = 0;\r\n\tvar lmap, dmap;\r\n\t\r\n\twhile(BFINAL==0) {\t\t\r\n\t\tBFINAL = bitsF(data, pos  , 1);\r\n\t\tBTYPE  = bitsF(data, pos+1, 2);  pos+=3;\r\n\t\t//console.log(BFINAL, BTYPE);\r\n\t\t\r\n\t\tif(BTYPE==0) {\r\n\t\t\tif((pos&7)!=0) pos+=8-(pos&7);\r\n\t\t\tvar p8 = (pos>>>3)+4, len = data[p8-4]|(data[p8-3]<<8);  //console.log(len);//bitsF(data, pos, 16), \r\n\t\t\tif(noBuf) buf=UZIP.F._check(buf, off+len);\r\n\t\t\tbuf.set(new u8(data.buffer, data.byteOffset+p8, len), off);\r\n\t\t\t//for(var i=0; i<len; i++) buf[off+i] = data[p8+i];\r\n\t\t\t//for(var i=0; i<len; i++) if(buf[off+i] != data[p8+i]) throw \"e\";\r\n\t\t\tpos = ((p8+len)<<3);  off+=len;  continue;\r\n\t\t}\r\n\t\tif(noBuf) buf=UZIP.F._check(buf, off+(1<<17));  // really not enough in many cases (but PNG and ZIP provide buffer in advance)\r\n\t\tif(BTYPE==1) {  lmap = U.flmap;  dmap = U.fdmap;  ML = (1<<9)-1;  MD = (1<<5)-1;   }\r\n\t\tif(BTYPE==2) {\r\n\t\t\tHLIT  = bitsE(data, pos   , 5)+257;  \r\n\t\t\tHDIST = bitsE(data, pos+ 5, 5)+  1;  \r\n\t\t\tHCLEN = bitsE(data, pos+10, 4)+  4;  pos+=14;\r\n\t\t\t\r\n\t\t\tvar ppos = pos;\r\n\t\t\tfor(var i=0; i<38; i+=2) {  U.itree[i]=0;  U.itree[i+1]=0;  }\r\n\t\t\tvar tl = 1;\r\n\t\t\tfor(var i=0; i<HCLEN; i++) {  var l=bitsE(data, pos+i*3, 3);  U.itree[(U.ordr[i]<<1)+1] = l;  if(l>tl)tl=l;  }     pos+=3*HCLEN;  //console.log(itree);\r\n\t\t\tmakeCodes(U.itree, tl);\r\n\t\t\tcodes2map(U.itree, tl, U.imap);\r\n\t\t\t\r\n\t\t\tlmap = U.lmap;  dmap = U.dmap;\r\n\t\t\t\r\n\t\t\tpos = decodeTiny(U.imap, (1<<tl)-1, HLIT+HDIST, data, pos, U.ttree);\r\n\t\t\tvar mx0 = F._copyOut(U.ttree,    0, HLIT , U.ltree);  ML = (1<<mx0)-1;\r\n\t\t\tvar mx1 = F._copyOut(U.ttree, HLIT, HDIST, U.dtree);  MD = (1<<mx1)-1;\r\n\t\t\t\r\n\t\t\t//var ml = decodeTiny(U.imap, (1<<tl)-1, HLIT , data, pos, U.ltree); ML = (1<<(ml>>>24))-1;  pos+=(ml&0xffffff);\r\n\t\t\tmakeCodes(U.ltree, mx0);\r\n\t\t\tcodes2map(U.ltree, mx0, lmap);\r\n\t\t\t\r\n\t\t\t//var md = decodeTiny(U.imap, (1<<tl)-1, HDIST, data, pos, U.dtree); MD = (1<<(md>>>24))-1;  pos+=(md&0xffffff);\r\n\t\t\tmakeCodes(U.dtree, mx1);\r\n\t\t\tcodes2map(U.dtree, mx1, dmap);\r\n\t\t}\r\n\t\t//var ooff=off, opos=pos;\r\n\t\twhile(true) {\r\n\t\t\tvar code = lmap[get17(data, pos) & ML];  pos += code&15;\r\n\t\t\tvar lit = code>>>4;  //U.lhst[lit]++;  \r\n\t\t\tif((lit>>>8)==0) {  buf[off++] = lit;  }\r\n\t\t\telse if(lit==256) {  break;  }\r\n\t\t\telse {\r\n\t\t\t\tvar end = off+lit-254;\r\n\t\t\t\tif(lit>264) { var ebs = U.ldef[lit-257];  end = off + (ebs>>>3) + bitsE(data, pos, ebs&7);  pos += ebs&7;  }\r\n\t\t\t\t//UZIP.F.dst[end-off]++;\r\n\t\t\t\t\r\n\t\t\t\tvar dcode = dmap[get17(data, pos) & MD];  pos += dcode&15;\r\n\t\t\t\tvar dlit = dcode>>>4;\r\n\t\t\t\tvar dbs = U.ddef[dlit], dst = (dbs>>>4) + bitsF(data, pos, dbs&15);  pos += dbs&15;\r\n\t\t\t\t\r\n\t\t\t\t//var o0 = off-dst, stp = Math.min(end-off, dst);\r\n\t\t\t\t//if(stp>20) while(off<end) {  buf.copyWithin(off, o0, o0+stp);  off+=stp;  }  else\r\n\t\t\t\t//if(end-dst<=off) buf.copyWithin(off, off-dst, end-dst);  else\r\n\t\t\t\t//if(dst==1) buf.fill(buf[off-1], off, end);  else\r\n\t\t\t\tif(noBuf) buf=UZIP.F._check(buf, off+(1<<17));\r\n\t\t\t\twhile(off<end) {  buf[off]=buf[off++-dst];    buf[off]=buf[off++-dst];  buf[off]=buf[off++-dst];  buf[off]=buf[off++-dst];  }   \r\n\t\t\t\toff=end;\r\n\t\t\t\t//while(off!=end) {  buf[off]=buf[off++-dst];  }\r\n\t\t\t}\r\n\t\t}\r\n\t\t//console.log(off-ooff, (pos-opos)>>>3);\r\n\t}\r\n\t//console.log(UZIP.F.dst);\r\n\t//console.log(tlen, dlen, off-tlen+tcnt);\r\n\treturn buf.length==off ? buf : buf.slice(0,off);\r\n}\r\nUZIP.F._check=function(buf, len) {\r\n\tvar bl=buf.length;  if(len<=bl) return buf;\r\n\tvar nbuf = new Uint8Array(Math.max(bl<<1,len));  nbuf.set(buf,0);\r\n\t//for(var i=0; i<bl; i+=4) {  nbuf[i]=buf[i];  nbuf[i+1]=buf[i+1];  nbuf[i+2]=buf[i+2];  nbuf[i+3]=buf[i+3];  }\r\n\treturn nbuf;\r\n}\r\n\r\nUZIP.F._decodeTiny = function(lmap, LL, len, data, pos, tree) {\r\n\tvar bitsE = UZIP.F._bitsE, get17 = UZIP.F._get17;\r\n\tvar i = 0;\r\n\twhile(i<len) {\r\n\t\tvar code = lmap[get17(data, pos)&LL];  pos+=code&15;\r\n\t\tvar lit = code>>>4; \r\n\t\tif(lit<=15) {  tree[i]=lit;  i++;  }\r\n\t\telse {\r\n\t\t\tvar ll = 0, n = 0;\r\n\t\t\tif(lit==16) {\r\n\t\t\t\tn = (3  + bitsE(data, pos, 2));  pos += 2;  ll = tree[i-1];\r\n\t\t\t}\r\n\t\t\telse if(lit==17) {\r\n\t\t\t\tn = (3  + bitsE(data, pos, 3));  pos += 3;\r\n\t\t\t}\r\n\t\t\telse if(lit==18) {\r\n\t\t\t\tn = (11 + bitsE(data, pos, 7));  pos += 7;\r\n\t\t\t}\r\n\t\t\tvar ni = i+n;\r\n\t\t\twhile(i<ni) {  tree[i]=ll;  i++; }\r\n\t\t}\r\n\t}\r\n\treturn pos;\r\n}\r\nUZIP.F._copyOut = function(src, off, len, tree) {\r\n\tvar mx=0, i=0, tl=tree.length>>>1;\r\n\twhile(i<len) {  var v=src[i+off];  tree[(i<<1)]=0;  tree[(i<<1)+1]=v;  if(v>mx)mx=v;  i++;  }\r\n\twhile(i<tl ) {  tree[(i<<1)]=0;  tree[(i<<1)+1]=0;  i++;  }\r\n\treturn mx;\r\n}\r\n\r\nUZIP.F.makeCodes = function(tree, MAX_BITS) {  // code, length\r\n\tvar U = UZIP.F.U;\r\n\tvar max_code = tree.length;\r\n\tvar code, bits, n, i, len;\r\n\t\r\n\tvar bl_count = U.bl_count;  for(var i=0; i<=MAX_BITS; i++) bl_count[i]=0;\r\n\tfor(i=1; i<max_code; i+=2) bl_count[tree[i]]++;\r\n\t\r\n\tvar next_code = U.next_code;\t// smallest code for each length\r\n\t\r\n\tcode = 0;\r\n\tbl_count[0] = 0;\r\n\tfor (bits = 1; bits <= MAX_BITS; bits++) {\r\n\t\tcode = (code + bl_count[bits-1]) << 1;\r\n\t\tnext_code[bits] = code;\r\n\t}\r\n\t\r\n\tfor (n = 0; n < max_code; n+=2) {\r\n\t\tlen = tree[n+1];\r\n\t\tif (len != 0) {\r\n\t\t\ttree[n] = next_code[len];\r\n\t\t\tnext_code[len]++;\r\n\t\t}\r\n\t}\r\n}\r\nUZIP.F.codes2map = function(tree, MAX_BITS, map) {\r\n\tvar max_code = tree.length;\r\n\tvar U=UZIP.F.U, r15 = U.rev15;\r\n\tfor(var i=0; i<max_code; i+=2) if(tree[i+1]!=0)  {\r\n\t\tvar lit = i>>1;\r\n\t\tvar cl = tree[i+1], val = (lit<<4)|cl; // :  (0x8000 | (U.of0[lit-257]<<7) | (U.exb[lit-257]<<4) | cl);\r\n\t\tvar rest = (MAX_BITS-cl), i0 = tree[i]<<rest, i1 = i0 + (1<<rest);\r\n\t\t//tree[i]=r15[i0]>>>(15-MAX_BITS);\r\n\t\twhile(i0!=i1) {\r\n\t\t\tvar p0 = r15[i0]>>>(15-MAX_BITS);\r\n\t\t\tmap[p0]=val;  i0++;\r\n\t\t}\r\n\t}\r\n}\r\nUZIP.F.revCodes = function(tree, MAX_BITS) {\r\n\tvar r15 = UZIP.F.U.rev15, imb = 15-MAX_BITS;\r\n\tfor(var i=0; i<tree.length; i+=2) {  var i0 = (tree[i]<<(MAX_BITS-tree[i+1]));  tree[i] = r15[i0]>>>imb;  }\r\n}\r\n\r\n// used only in deflate\r\nUZIP.F._putsE= function(dt, pos, val   ) {  val = val<<(pos&7);  var o=(pos>>>3);  dt[o]|=val;  dt[o+1]|=(val>>>8);                        }\r\nUZIP.F._putsF= function(dt, pos, val   ) {  val = val<<(pos&7);  var o=(pos>>>3);  dt[o]|=val;  dt[o+1]|=(val>>>8);  dt[o+2]|=(val>>>16);  }\r\n\r\nUZIP.F._bitsE= function(dt, pos, length) {  return ((dt[pos>>>3] | (dt[(pos>>>3)+1]<<8)                        )>>>(pos&7))&((1<<length)-1);  }\r\nUZIP.F._bitsF= function(dt, pos, length) {  return ((dt[pos>>>3] | (dt[(pos>>>3)+1]<<8) | (dt[(pos>>>3)+2]<<16))>>>(pos&7))&((1<<length)-1);  }\r\n/*\r\nUZIP.F._get9 = function(dt, pos) {\r\n\treturn ((dt[pos>>>3] | (dt[(pos>>>3)+1]<<8))>>>(pos&7))&511;\r\n} */\r\nUZIP.F._get17= function(dt, pos) {\t// return at least 17 meaningful bytes\r\n\treturn (dt[pos>>>3] | (dt[(pos>>>3)+1]<<8) | (dt[(pos>>>3)+2]<<16) )>>>(pos&7);\r\n}\r\nUZIP.F._get25= function(dt, pos) {\t// return at least 17 meaningful bytes\r\n\treturn (dt[pos>>>3] | (dt[(pos>>>3)+1]<<8) | (dt[(pos>>>3)+2]<<16) | (dt[(pos>>>3)+3]<<24) )>>>(pos&7);\r\n}\r\nUZIP.F.U = function(){\r\n\tvar u16=Uint16Array, u32=Uint32Array;\r\n\treturn {\r\n\t\tnext_code : new u16(16),\r\n\t\tbl_count  : new u16(16),\r\n\t\tordr : [ 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 ],\r\n\t\tof0  : [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,999,999,999],\r\n\t\texb  : [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,  0,  0,  0],\r\n\t\tldef : new u16(32),\r\n\t\tdf0  : [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, 65535, 65535],\r\n\t\tdxb  : [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,     0,     0],\r\n\t\tddef : new u32(32),\r\n\t\tflmap: new u16(  512),  fltree: [],\r\n\t\tfdmap: new u16(   32),  fdtree: [],\r\n\t\tlmap : new u16(32768),  ltree : [],  ttree:[],\r\n\t\tdmap : new u16(32768),  dtree : [],\r\n\t\timap : new u16(  512),  itree : [],\r\n\t\t//rev9 : new u16(  512)\r\n\t\trev15: new u16(1<<15),\r\n\t\tlhst : new u32(286), dhst : new u32( 30), ihst : new u32(19),\r\n\t\tlits : new u32(15000),\r\n\t\tstrt : new u16(1<<16),\r\n\t\tprev : new u16(1<<15)\r\n\t};  \r\n} ();\r\n\r\n(function(){\t\r\n\tvar U = UZIP.F.U;\r\n\tvar len = 1<<15;\r\n\tfor(var i=0; i<len; i++) {\r\n\t\tvar x = i;\r\n\t\tx = (((x & 0xaaaaaaaa) >>> 1) | ((x & 0x55555555) << 1));\r\n\t\tx = (((x & 0xcccccccc) >>> 2) | ((x & 0x33333333) << 2));\r\n\t\tx = (((x & 0xf0f0f0f0) >>> 4) | ((x & 0x0f0f0f0f) << 4));\r\n\t\tx = (((x & 0xff00ff00) >>> 8) | ((x & 0x00ff00ff) << 8));\r\n\t\tU.rev15[i] = (((x >>> 16) | (x << 16)))>>>17;\r\n\t}\r\n\t\r\n\tfunction pushV(tgt, n, sv) {  while(n--!=0) tgt.push(0,sv);  }\r\n\t\r\n\tfor(var i=0; i<32; i++) {  U.ldef[i]=(U.of0[i]<<3)|U.exb[i];  U.ddef[i]=(U.df0[i]<<4)|U.dxb[i];  }\r\n\t\r\n\tpushV(U.fltree, 144, 8);  pushV(U.fltree, 255-143, 9);  pushV(U.fltree, 279-255, 7);  pushV(U.fltree,287-279,8);\r\n\t/*\r\n\tvar i = 0;\r\n\tfor(; i<=143; i++) U.fltree.push(0,8);\r\n\tfor(; i<=255; i++) U.fltree.push(0,9);\r\n\tfor(; i<=279; i++) U.fltree.push(0,7);\r\n\tfor(; i<=287; i++) U.fltree.push(0,8);\r\n\t*/\r\n\tUZIP.F.makeCodes(U.fltree, 9);\r\n\tUZIP.F.codes2map(U.fltree, 9, U.flmap);\r\n\tUZIP.F.revCodes (U.fltree, 9)\r\n\t\r\n\tpushV(U.fdtree,32,5);\r\n\t//for(i=0;i<32; i++) U.fdtree.push(0,5);\r\n\tUZIP.F.makeCodes(U.fdtree, 5);\r\n\tUZIP.F.codes2map(U.fdtree, 5, U.fdmap);\r\n\tUZIP.F.revCodes (U.fdtree, 5)\r\n\t\r\n\tpushV(U.itree,19,0);  pushV(U.ltree,286,0);  pushV(U.dtree,30,0);  pushV(U.ttree,320,0);\r\n\t/*\r\n\tfor(var i=0; i< 19; i++) U.itree.push(0,0);\r\n\tfor(var i=0; i<286; i++) U.ltree.push(0,0);\r\n\tfor(var i=0; i< 30; i++) U.dtree.push(0,0);\r\n\tfor(var i=0; i<320; i++) U.ttree.push(0,0);\r\n\t*/\r\n})()\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n","// https://github.com/photopea/UPNG.js/blob/c976240e62b0497167f8aafabd7889625f8b2016/UPNG.js\n\n// import * as pako from 'pako'\nimport * as UZIP from 'uzip'\n\nvar UPNG = {};\n\n\nUPNG.toRGBA8 = function(out)\n{\n  var w = out.width, h = out.height;\n  if(out.tabs.acTL==null) return [UPNG.toRGBA8.decodeImage(out.data, w, h, out).buffer];\n\n  var frms = [];\n  if(out.frames[0].data==null) out.frames[0].data = out.data;\n\n  var len = w*h*4, img = new Uint8Array(len), empty = new Uint8Array(len), prev=new Uint8Array(len);\n  for(var i=0; i<out.frames.length; i++)\n  {\n    var frm = out.frames[i];\n    var fx=frm.rect.x, fy=frm.rect.y, fw = frm.rect.width, fh = frm.rect.height;\n    var fdata = UPNG.toRGBA8.decodeImage(frm.data, fw,fh, out);\n\n    if(i!=0) for(var j=0; j<len; j++) prev[j]=img[j];\n\n    if     (frm.blend==0) UPNG._copyTile(fdata, fw, fh, img, w, h, fx, fy, 0);\n    else if(frm.blend==1) UPNG._copyTile(fdata, fw, fh, img, w, h, fx, fy, 1);\n\n    frms.push(img.buffer.slice(0));\n\n    if     (frm.dispose==0) {}\n    else if(frm.dispose==1) UPNG._copyTile(empty, fw, fh, img, w, h, fx, fy, 0);\n    else if(frm.dispose==2) for(var j=0; j<len; j++) img[j]=prev[j];\n  }\n  return frms;\n}\nUPNG.toRGBA8.decodeImage = function(data, w, h, out)\n{\n  var area = w*h, bpp = UPNG.decode._getBPP(out);\n  var bpl = Math.ceil(w*bpp/8);\t// bytes per line\n\n  var bf = new Uint8Array(area*4), bf32 = new Uint32Array(bf.buffer);\n  var ctype = out.ctype, depth = out.depth;\n  var rs = UPNG._bin.readUshort;\n\n  //console.log(ctype, depth);\n  var time = Date.now();\n\n  if     (ctype==6) { // RGB + alpha\n    var qarea = area<<2;\n    if(depth== 8) for(var i=0; i<qarea;i+=4) {  bf[i] = data[i];  bf[i+1] = data[i+1];  bf[i+2] = data[i+2];  bf[i+3] = data[i+3]; }\n    if(depth==16) for(var i=0; i<qarea;i++ ) {  bf[i] = data[i<<1];  }\n  }\n  else if(ctype==2) {\t// RGB\n    var ts=out.tabs[\"tRNS\"];\n    if(ts==null) {\n      if(depth== 8) for(var i=0; i<area; i++) {  var ti=i*3;  bf32[i] = (255<<24)|(data[ti+2]<<16)|(data[ti+1]<<8)|data[ti];  }\n      if(depth==16) for(var i=0; i<area; i++) {  var ti=i*6;  bf32[i] = (255<<24)|(data[ti+4]<<16)|(data[ti+2]<<8)|data[ti];  }\n    }\n    else {  var tr=ts[0], tg=ts[1], tb=ts[2];\n      if(depth== 8) for(var i=0; i<area; i++) {  var qi=i<<2, ti=i*3;  bf32[i] = (255<<24)|(data[ti+2]<<16)|(data[ti+1]<<8)|data[ti];\n        if(data[ti]   ==tr && data[ti+1]   ==tg && data[ti+2]   ==tb) bf[qi+3] = 0;  }\n      if(depth==16) for(var i=0; i<area; i++) {  var qi=i<<2, ti=i*6;  bf32[i] = (255<<24)|(data[ti+4]<<16)|(data[ti+2]<<8)|data[ti];\n        if(rs(data,ti)==tr && rs(data,ti+2)==tg && rs(data,ti+4)==tb) bf[qi+3] = 0;  }\n    }\n  }\n  else if(ctype==3) {\t// palette\n    var p=out.tabs[\"PLTE\"], ap=out.tabs[\"tRNS\"], tl=ap?ap.length:0;\n    //console.log(p, ap);\n    if(depth==1) for(var y=0; y<h; y++) {  var s0 = y*bpl, t0 = y*w;\n      for(var i=0; i<w; i++) { var qi=(t0+i)<<2, j=((data[s0+(i>>3)]>>(7-((i&7)<<0)))& 1), cj=3*j;  bf[qi]=p[cj];  bf[qi+1]=p[cj+1];  bf[qi+2]=p[cj+2];  bf[qi+3]=(j<tl)?ap[j]:255;  }\n    }\n    if(depth==2) for(var y=0; y<h; y++) {  var s0 = y*bpl, t0 = y*w;\n      for(var i=0; i<w; i++) { var qi=(t0+i)<<2, j=((data[s0+(i>>2)]>>(6-((i&3)<<1)))& 3), cj=3*j;  bf[qi]=p[cj];  bf[qi+1]=p[cj+1];  bf[qi+2]=p[cj+2];  bf[qi+3]=(j<tl)?ap[j]:255;  }\n    }\n    if(depth==4) for(var y=0; y<h; y++) {  var s0 = y*bpl, t0 = y*w;\n      for(var i=0; i<w; i++) { var qi=(t0+i)<<2, j=((data[s0+(i>>1)]>>(4-((i&1)<<2)))&15), cj=3*j;  bf[qi]=p[cj];  bf[qi+1]=p[cj+1];  bf[qi+2]=p[cj+2];  bf[qi+3]=(j<tl)?ap[j]:255;  }\n    }\n    if(depth==8) for(var i=0; i<area; i++ ) {  var qi=i<<2, j=data[i]                      , cj=3*j;  bf[qi]=p[cj];  bf[qi+1]=p[cj+1];  bf[qi+2]=p[cj+2];  bf[qi+3]=(j<tl)?ap[j]:255;  }\n  }\n  else if(ctype==4) {\t// gray + alpha\n    if(depth== 8)  for(var i=0; i<area; i++) {  var qi=i<<2, di=i<<1, gr=data[di];  bf[qi]=gr;  bf[qi+1]=gr;  bf[qi+2]=gr;  bf[qi+3]=data[di+1];  }\n    if(depth==16)  for(var i=0; i<area; i++) {  var qi=i<<2, di=i<<2, gr=data[di];  bf[qi]=gr;  bf[qi+1]=gr;  bf[qi+2]=gr;  bf[qi+3]=data[di+2];  }\n  }\n  else if(ctype==0) {\t// gray\n    var tr = out.tabs[\"tRNS\"] ? out.tabs[\"tRNS\"] : -1;\n    for(var y=0; y<h; y++) {\n      var off = y*bpl, to = y*w;\n      if     (depth== 1) for(var x=0; x<w; x++) {  var gr=255*((data[off+(x>>>3)]>>>(7 -((x&7)   )))& 1), al=(gr==tr*255)?0:255;  bf32[to+x]=(al<<24)|(gr<<16)|(gr<<8)|gr;  }\n      else if(depth== 2) for(var x=0; x<w; x++) {  var gr= 85*((data[off+(x>>>2)]>>>(6 -((x&3)<<1)))& 3), al=(gr==tr* 85)?0:255;  bf32[to+x]=(al<<24)|(gr<<16)|(gr<<8)|gr;  }\n      else if(depth== 4) for(var x=0; x<w; x++) {  var gr= 17*((data[off+(x>>>1)]>>>(4 -((x&1)<<2)))&15), al=(gr==tr* 17)?0:255;  bf32[to+x]=(al<<24)|(gr<<16)|(gr<<8)|gr;  }\n      else if(depth== 8) for(var x=0; x<w; x++) {  var gr=data[off+     x], al=(gr                 ==tr)?0:255;  bf32[to+x]=(al<<24)|(gr<<16)|(gr<<8)|gr;  }\n      else if(depth==16) for(var x=0; x<w; x++) {  var gr=data[off+(x<<1)], al=(rs(data,off+(x<<i))==tr)?0:255;  bf32[to+x]=(al<<24)|(gr<<16)|(gr<<8)|gr;  }\n    }\n  }\n  //console.log(Date.now()-time);\n  return bf;\n}\n\n\n\nUPNG.decode = function(buff)\n{\n  var data = new Uint8Array(buff), offset = 8, bin = UPNG._bin, rUs = bin.readUshort, rUi = bin.readUint;\n  var out = {tabs:{}, frames:[]};\n  var dd = new Uint8Array(data.length), doff = 0;\t // put all IDAT data into it\n  var fd, foff = 0;\t// frames\n\n  var mgck = [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a];\n  for(var i=0; i<8; i++) if(data[i]!=mgck[i]) throw \"The input is not a PNG file!\";\n\n  while(offset<data.length)\n  {\n    var len  = bin.readUint(data, offset);  offset += 4;\n    var type = bin.readASCII(data, offset, 4);  offset += 4;\n    //console.log(type,len);\n\n    if     (type==\"IHDR\")  {  UPNG.decode._IHDR(data, offset, out);  }\n    else if(type==\"CgBI\")  {  out.tabs[type] = data.slice(offset,offset+4);  }\n    else if(type==\"IDAT\") {\n      for(var i=0; i<len; i++) dd[doff+i] = data[offset+i];\n      doff += len;\n    }\n    else if(type==\"acTL\")  {\n      out.tabs[type] = {  num_frames:rUi(data, offset), num_plays:rUi(data, offset+4)  };\n      fd = new Uint8Array(data.length);\n    }\n    else if(type==\"fcTL\")  {\n      if(foff!=0) {  var fr = out.frames[out.frames.length-1];\n        fr.data = UPNG.decode._decompress(out, fd.slice(0,foff), fr.rect.width, fr.rect.height);  foff=0;\n      }\n      var rct = {x:rUi(data, offset+12),y:rUi(data, offset+16),width:rUi(data, offset+4),height:rUi(data, offset+8)};\n      var del = rUs(data, offset+22);  del = rUs(data, offset+20) / (del==0?100:del);\n      var frm = {rect:rct, delay:Math.round(del*1000), dispose:data[offset+24], blend:data[offset+25]};\n      //console.log(frm);\n      out.frames.push(frm);\n    }\n    else if(type==\"fdAT\") {\n      for(var i=0; i<len-4; i++) fd[foff+i] = data[offset+i+4];\n      foff += len-4;\n    }\n    else if(type==\"pHYs\") {\n      out.tabs[type] = [bin.readUint(data, offset), bin.readUint(data, offset+4), data[offset+8]];\n    }\n    else if(type==\"cHRM\") {\n      out.tabs[type] = [];\n      for(var i=0; i<8; i++) out.tabs[type].push(bin.readUint(data, offset+i*4));\n    }\n    else if(type==\"tEXt\" || type==\"zTXt\") {\n      if(out.tabs[type]==null) out.tabs[type] = {};\n      var nz = bin.nextZero(data, offset);\n      var keyw = bin.readASCII(data, offset, nz-offset);\n      var text, tl=offset+len-nz-1;\n      if(type==\"tEXt\") text = bin.readASCII(data, nz+1, tl);\n      else {\n        var bfr = UPNG.decode._inflate(data.slice(nz+2,nz+2+tl));\n        text = bin.readUTF8(bfr,0,bfr.length);\n      }\n      out.tabs[type][keyw] = text;\n    }\n    else if(type==\"iTXt\") {\n      if(out.tabs[type]==null) out.tabs[type] = {};\n      var nz = 0, off = offset;\n      nz = bin.nextZero(data, off);\n      var keyw = bin.readASCII(data, off, nz-off);  off = nz + 1;\n      var cflag = data[off], cmeth = data[off+1];  off+=2;\n      nz = bin.nextZero(data, off);\n      var ltag = bin.readASCII(data, off, nz-off);  off = nz + 1;\n      nz = bin.nextZero(data, off);\n      var tkeyw = bin.readUTF8(data, off, nz-off);  off = nz + 1;\n      var text, tl=len-(off-offset);\n      if(cflag==0) text  = bin.readUTF8(data, off, tl);\n      else {\n        var bfr = UPNG.decode._inflate(data.slice(off,off+tl));\n        text = bin.readUTF8(bfr,0,bfr.length);\n      }\n      out.tabs[type][keyw] = text;\n    }\n    else if(type==\"PLTE\") {\n      out.tabs[type] = bin.readBytes(data, offset, len);\n    }\n    else if(type==\"hIST\") {\n      var pl = out.tabs[\"PLTE\"].length/3;\n      out.tabs[type] = [];  for(var i=0; i<pl; i++) out.tabs[type].push(rUs(data, offset+i*2));\n    }\n    else if(type==\"tRNS\") {\n      if     (out.ctype==3) out.tabs[type] = bin.readBytes(data, offset, len);\n      else if(out.ctype==0) out.tabs[type] = rUs(data, offset);\n      else if(out.ctype==2) out.tabs[type] = [ rUs(data,offset),rUs(data,offset+2),rUs(data,offset+4) ];\n      //else console.log(\"tRNS for unsupported color type\",out.ctype, len);\n    }\n    else if(type==\"gAMA\") out.tabs[type] = bin.readUint(data, offset)/100000;\n    else if(type==\"sRGB\") out.tabs[type] = data[offset];\n    else if(type==\"bKGD\")\n    {\n      if     (out.ctype==0 || out.ctype==4) out.tabs[type] = [rUs(data, offset)];\n      else if(out.ctype==2 || out.ctype==6) out.tabs[type] = [rUs(data, offset), rUs(data, offset+2), rUs(data, offset+4)];\n      else if(out.ctype==3) out.tabs[type] = data[offset];\n    }\n    else if(type==\"IEND\") {\n      break;\n    }\n    //else {  log(\"unknown chunk type\", type, len);  }\n    offset += len;\n    var crc = bin.readUint(data, offset);  offset += 4;\n  }\n  if(foff!=0) {  var fr = out.frames[out.frames.length-1];\n    fr.data = UPNG.decode._decompress(out, fd.slice(0,foff), fr.rect.width, fr.rect.height);  foff=0;\n  }\n  out.data = UPNG.decode._decompress(out, dd, out.width, out.height);\n\n  delete out.compress;  delete out.interlace;  delete out.filter;\n  return out;\n}\n\nUPNG.decode._decompress = function(out, dd, w, h) {\n  var time = Date.now();\n  var bpp = UPNG.decode._getBPP(out), bpl = Math.ceil(w*bpp/8), buff = new Uint8Array((bpl+1+out.interlace)*h);\n  if(out.tabs[\"CgBI\"]) dd = UPNG.inflateRaw(dd,buff);\n  else                 dd = UPNG.decode._inflate(dd,buff);\n  //console.log(dd.length, buff.length);\n  //console.log(Date.now()-time);\n\n  var time=Date.now();\n  if     (out.interlace==0) dd = UPNG.decode._filterZero(dd, out, 0, w, h);\n  else if(out.interlace==1) dd = UPNG.decode._readInterlace(dd, out);\n  //console.log(Date.now()-time);\n  return dd;\n}\n\nUPNG.decode._inflate = function(data, buff) {  var out=UPNG[\"inflateRaw\"](new Uint8Array(data.buffer, 2,data.length-6),buff);  return out;  }\nUPNG.inflateRaw=function(){var H={};H.H={};H.H.N=function(N,W){var R=Uint8Array,i=0,m=0,J=0,h=0,Q=0,X=0,u=0,w=0,d=0,v,C;\n  if(N[0]==3&&N[1]==0)return W?W:new R(0);var V=H.H,n=V.b,A=V.e,l=V.R,M=V.n,I=V.A,e=V.Z,b=V.m,Z=W==null;\n  if(Z)W=new R(N.length>>>2<<5);while(i==0){i=n(N,d,1);m=n(N,d+1,2);d+=3;if(m==0){if((d&7)!=0)d+=8-(d&7);\n    var D=(d>>>3)+4,q=N[D-4]|N[D-3]<<8;if(Z)W=H.H.W(W,w+q);W.set(new R(N.buffer,N.byteOffset+D,q),w);d=D+q<<3;\n    w+=q;continue}if(Z)W=H.H.W(W,w+(1<<17));if(m==1){v=b.J;C=b.h;X=(1<<9)-1;u=(1<<5)-1}if(m==2){J=A(N,d,5)+257;\n    h=A(N,d+5,5)+1;Q=A(N,d+10,4)+4;d+=14;var E=d,j=1;for(var c=0;c<38;c+=2){b.Q[c]=0;b.Q[c+1]=0}for(var c=0;\n                                                                                                    c<Q;c++){var K=A(N,d+c*3,3);b.Q[(b.X[c]<<1)+1]=K;if(K>j)j=K}d+=3*Q;M(b.Q,j);I(b.Q,j,b.u);v=b.w;C=b.d;\n    d=l(b.u,(1<<j)-1,J+h,N,d,b.v);var r=V.V(b.v,0,J,b.C);X=(1<<r)-1;var S=V.V(b.v,J,h,b.D);u=(1<<S)-1;M(b.C,r);\n    I(b.C,r,v);M(b.D,S);I(b.D,S,C)}while(!0){var T=v[e(N,d)&X];d+=T&15;var p=T>>>4;if(p>>>8==0){W[w++]=p}else if(p==256){break}else{var z=w+p-254;\n    if(p>264){var _=b.q[p-257];z=w+(_>>>3)+A(N,d,_&7);d+=_&7}var $=C[e(N,d)&u];d+=$&15;var s=$>>>4,Y=b.c[s],a=(Y>>>4)+n(N,d,Y&15);\n    d+=Y&15;while(w<z){W[w]=W[w++-a];W[w]=W[w++-a];W[w]=W[w++-a];W[w]=W[w++-a]}w=z}}}return W.length==w?W:W.slice(0,w)};\n  H.H.W=function(N,W){var R=N.length;if(W<=R)return N;var V=new Uint8Array(R<<1);V.set(N,0);return V};\n  H.H.R=function(N,W,R,V,n,A){var l=H.H.e,M=H.H.Z,I=0;while(I<R){var e=N[M(V,n)&W];n+=e&15;var b=e>>>4;\n    if(b<=15){A[I]=b;I++}else{var Z=0,m=0;if(b==16){m=3+l(V,n,2);n+=2;Z=A[I-1]}else if(b==17){m=3+l(V,n,3);\n      n+=3}else if(b==18){m=11+l(V,n,7);n+=7}var J=I+m;while(I<J){A[I]=Z;I++}}}return n};H.H.V=function(N,W,R,V){var n=0,A=0,l=V.length>>>1;\n    while(A<R){var M=N[A+W];V[A<<1]=0;V[(A<<1)+1]=M;if(M>n)n=M;A++}while(A<l){V[A<<1]=0;V[(A<<1)+1]=0;A++}return n};\n  H.H.n=function(N,W){var R=H.H.m,V=N.length,n,A,l,M,I,e=R.j;for(var M=0;M<=W;M++)e[M]=0;for(M=1;M<V;M+=2)e[N[M]]++;\n    var b=R.K;n=0;e[0]=0;for(A=1;A<=W;A++){n=n+e[A-1]<<1;b[A]=n}for(l=0;l<V;l+=2){I=N[l+1];if(I!=0){N[l]=b[I];\n      b[I]++}}};H.H.A=function(N,W,R){var V=N.length,n=H.H.m,A=n.r;for(var l=0;l<V;l+=2)if(N[l+1]!=0){var M=l>>1,I=N[l+1],e=M<<4|I,b=W-I,Z=N[l]<<b,m=Z+(1<<b);\n    while(Z!=m){var J=A[Z]>>>15-W;R[J]=e;Z++}}};H.H.l=function(N,W){var R=H.H.m.r,V=15-W;for(var n=0;n<N.length;\n                                                                                             n+=2){var A=N[n]<<W-N[n+1];N[n]=R[A]>>>V}};H.H.M=function(N,W,R){R=R<<(W&7);var V=W>>>3;N[V]|=R;N[V+1]|=R>>>8};\n  H.H.I=function(N,W,R){R=R<<(W&7);var V=W>>>3;N[V]|=R;N[V+1]|=R>>>8;N[V+2]|=R>>>16};H.H.e=function(N,W,R){return(N[W>>>3]|N[(W>>>3)+1]<<8)>>>(W&7)&(1<<R)-1};\n  H.H.b=function(N,W,R){return(N[W>>>3]|N[(W>>>3)+1]<<8|N[(W>>>3)+2]<<16)>>>(W&7)&(1<<R)-1};H.H.Z=function(N,W){return(N[W>>>3]|N[(W>>>3)+1]<<8|N[(W>>>3)+2]<<16)>>>(W&7)};\n  H.H.i=function(N,W){return(N[W>>>3]|N[(W>>>3)+1]<<8|N[(W>>>3)+2]<<16|N[(W>>>3)+3]<<24)>>>(W&7)};H.H.m=function(){var N=Uint16Array,W=Uint32Array;\n    return{K:new N(16),j:new N(16),X:[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],S:[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,999,999,999],T:[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0,0],q:new N(32),p:[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,65535,65535],z:[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,0,0],c:new W(32),J:new N(512),_:[],h:new N(32),$:[],w:new N(32768),C:[],v:[],d:new N(32768),D:[],u:new N(512),Q:[],r:new N(1<<15),s:new W(286),Y:new W(30),a:new W(19),t:new W(15e3),k:new N(1<<16),g:new N(1<<15)}}();\n  (function(){var N=H.H.m,W=1<<15;for(var R=0;R<W;R++){var V=R;V=(V&2863311530)>>>1|(V&1431655765)<<1;\n    V=(V&3435973836)>>>2|(V&858993459)<<2;V=(V&4042322160)>>>4|(V&252645135)<<4;V=(V&4278255360)>>>8|(V&16711935)<<8;\n    N.r[R]=(V>>>16|V<<16)>>>17}function n(A,l,M){while(l--!=0)A.push(0,M)}for(var R=0;R<32;R++){N.q[R]=N.S[R]<<3|N.T[R];\n    N.c[R]=N.p[R]<<4|N.z[R]}n(N._,144,8);n(N._,255-143,9);n(N._,279-255,7);n(N._,287-279,8);H.H.n(N._,9);\n    H.H.A(N._,9,N.J);H.H.l(N._,9);n(N.$,32,5);H.H.n(N.$,5);H.H.A(N.$,5,N.h);H.H.l(N.$,5);n(N.Q,19,0);n(N.C,286,0);\n    n(N.D,30,0);n(N.v,320,0)}());return H.H.N}()\n\n\nUPNG.decode._readInterlace = function(data, out)\n{\n  var w = out.width, h = out.height;\n  var bpp = UPNG.decode._getBPP(out), cbpp = bpp>>3, bpl = Math.ceil(w*bpp/8);\n  var img = new Uint8Array( h * bpl );\n  var di = 0;\n\n  var starting_row  = [ 0, 0, 4, 0, 2, 0, 1 ];\n  var starting_col  = [ 0, 4, 0, 2, 0, 1, 0 ];\n  var row_increment = [ 8, 8, 8, 4, 4, 2, 2 ];\n  var col_increment = [ 8, 8, 4, 4, 2, 2, 1 ];\n\n  var pass=0;\n  while(pass<7)\n  {\n    var ri = row_increment[pass], ci = col_increment[pass];\n    var sw = 0, sh = 0;\n    var cr = starting_row[pass];  while(cr<h) {  cr+=ri;  sh++;  }\n    var cc = starting_col[pass];  while(cc<w) {  cc+=ci;  sw++;  }\n    var bpll = Math.ceil(sw*bpp/8);\n    UPNG.decode._filterZero(data, out, di, sw, sh);\n\n    var y=0, row = starting_row[pass];\n    while(row<h)\n    {\n      var col = starting_col[pass];\n      var cdi = (di+y*bpll)<<3;\n\n      while(col<w)\n      {\n        if(bpp==1) {\n          var val = data[cdi>>3];  val = (val>>(7-(cdi&7)))&1;\n          img[row*bpl + (col>>3)] |= (val << (7-((col&7)<<0)));\n        }\n        if(bpp==2) {\n          var val = data[cdi>>3];  val = (val>>(6-(cdi&7)))&3;\n          img[row*bpl + (col>>2)] |= (val << (6-((col&3)<<1)));\n        }\n        if(bpp==4) {\n          var val = data[cdi>>3];  val = (val>>(4-(cdi&7)))&15;\n          img[row*bpl + (col>>1)] |= (val << (4-((col&1)<<2)));\n        }\n        if(bpp>=8) {\n          var ii = row*bpl+col*cbpp;\n          for(var j=0; j<cbpp; j++) img[ii+j] = data[(cdi>>3)+j];\n        }\n        cdi+=bpp;  col+=ci;\n      }\n      y++;  row += ri;\n    }\n    if(sw*sh!=0) di += sh * (1 + bpll);\n    pass = pass + 1;\n  }\n  return img;\n}\n\nUPNG.decode._getBPP = function(out) {\n  var noc = [1,null,3,1,2,null,4][out.ctype];\n  return noc * out.depth;\n}\n\nUPNG.decode._filterZero = function(data, out, off, w, h)\n{\n  var bpp = UPNG.decode._getBPP(out), bpl = Math.ceil(w*bpp/8), paeth = UPNG.decode._paeth;\n  bpp = Math.ceil(bpp/8);\n\n  var i=0, di=1, type=data[off], x=0;\n\n  if(type>1) data[off]=[0,0,1][type-2];\n  if(type==3) for(x=bpp; x<bpl; x++) data[x+1] = (data[x+1] + (data[x+1-bpp]>>>1) )&255;\n\n  for(var y=0; y<h; y++)  {\n    i = off+y*bpl; di = i+y+1;\n    type = data[di-1]; x=0;\n\n    if     (type==0)   for(; x<bpl; x++) data[i+x] = data[di+x];\n    else if(type==1) { for(; x<bpp; x++) data[i+x] = data[di+x];\n      for(; x<bpl; x++) data[i+x] = (data[di+x] + data[i+x-bpp]);  }\n    else if(type==2) { for(; x<bpl; x++) data[i+x] = (data[di+x] + data[i+x-bpl]);  }\n    else if(type==3) { for(; x<bpp; x++) data[i+x] = (data[di+x] + ( data[i+x-bpl]>>>1));\n      for(; x<bpl; x++) data[i+x] = (data[di+x] + ((data[i+x-bpl]+data[i+x-bpp])>>>1) );  }\n    else             { for(; x<bpp; x++) data[i+x] = (data[di+x] + paeth(0, data[i+x-bpl], 0));\n      for(; x<bpl; x++) data[i+x] = (data[di+x] + paeth(data[i+x-bpp], data[i+x-bpl], data[i+x-bpp-bpl]) );  }\n  }\n  return data;\n}\n\nUPNG.decode._paeth = function(a,b,c)\n{\n  var p = a+b-c, pa = (p-a), pb = (p-b), pc = (p-c);\n  if (pa*pa <= pb*pb && pa*pa <= pc*pc)  return a;\n  else if (pb*pb <= pc*pc)  return b;\n  return c;\n}\n\nUPNG.decode._IHDR = function(data, offset, out)\n{\n  var bin = UPNG._bin;\n  out.width  = bin.readUint(data, offset);  offset += 4;\n  out.height = bin.readUint(data, offset);  offset += 4;\n  out.depth     = data[offset];  offset++;\n  out.ctype     = data[offset];  offset++;\n  out.compress  = data[offset];  offset++;\n  out.filter    = data[offset];  offset++;\n  out.interlace = data[offset];  offset++;\n}\n\nUPNG._bin = {\n  nextZero   : function(data,p)  {  while(data[p]!=0) p++;  return p;  },\n  readUshort : function(buff,p)  {  return (buff[p]<< 8) | buff[p+1];  },\n  writeUshort: function(buff,p,n){  buff[p] = (n>>8)&255;  buff[p+1] = n&255;  },\n  readUint   : function(buff,p)  {  return (buff[p]*(256*256*256)) + ((buff[p+1]<<16) | (buff[p+2]<< 8) | buff[p+3]);  },\n  writeUint  : function(buff,p,n){  buff[p]=(n>>24)&255;  buff[p+1]=(n>>16)&255;  buff[p+2]=(n>>8)&255;  buff[p+3]=n&255;  },\n  readASCII  : function(buff,p,l){  var s = \"\";  for(var i=0; i<l; i++) s += String.fromCharCode(buff[p+i]);  return s;    },\n  writeASCII : function(data,p,s){  for(var i=0; i<s.length; i++) data[p+i] = s.charCodeAt(i);  },\n  readBytes  : function(buff,p,l){  var arr = [];   for(var i=0; i<l; i++) arr.push(buff[p+i]);   return arr;  },\n  pad : function(n) { return n.length < 2 ? \"0\" + n : n; },\n  readUTF8 : function(buff, p, l) {\n    var s = \"\", ns;\n    for(var i=0; i<l; i++) s += \"%\" + UPNG._bin.pad(buff[p+i].toString(16));\n    try {  ns = decodeURIComponent(s); }\n    catch(e) {  return UPNG._bin.readASCII(buff, p, l);  }\n    return  ns;\n  }\n}\nUPNG._copyTile = function(sb, sw, sh, tb, tw, th, xoff, yoff, mode)\n{\n  var w = Math.min(sw,tw), h = Math.min(sh,th);\n  var si=0, ti=0;\n  for(var y=0; y<h; y++)\n    for(var x=0; x<w; x++)\n    {\n      if(xoff>=0 && yoff>=0) {  si = (y*sw+x)<<2;  ti = (( yoff+y)*tw+xoff+x)<<2;  }\n      else                   {  si = ((-yoff+y)*sw-xoff+x)<<2;  ti = (y*tw+x)<<2;  }\n\n      if     (mode==0) {  tb[ti] = sb[si];  tb[ti+1] = sb[si+1];  tb[ti+2] = sb[si+2];  tb[ti+3] = sb[si+3];  }\n      else if(mode==1) {\n        var fa = sb[si+3]*(1/255), fr=sb[si]*fa, fg=sb[si+1]*fa, fb=sb[si+2]*fa;\n        var ba = tb[ti+3]*(1/255), br=tb[ti]*ba, bg=tb[ti+1]*ba, bb=tb[ti+2]*ba;\n\n        var ifa=1-fa, oa = fa+ba*ifa, ioa = (oa==0?0:1/oa);\n        tb[ti+3] = 255*oa;\n        tb[ti+0] = (fr+br*ifa)*ioa;\n        tb[ti+1] = (fg+bg*ifa)*ioa;\n        tb[ti+2] = (fb+bb*ifa)*ioa;\n      }\n      else if(mode==2){\t// copy only differences, otherwise zero\n        var fa = sb[si+3], fr=sb[si], fg=sb[si+1], fb=sb[si+2];\n        var ba = tb[ti+3], br=tb[ti], bg=tb[ti+1], bb=tb[ti+2];\n        if(fa==ba && fr==br && fg==bg && fb==bb) {  tb[ti]=0;  tb[ti+1]=0;  tb[ti+2]=0;  tb[ti+3]=0;  }\n        else {  tb[ti]=fr;  tb[ti+1]=fg;  tb[ti+2]=fb;  tb[ti+3]=fa;  }\n      }\n      else if(mode==3){\t// check if can be blended\n        var fa = sb[si+3], fr=sb[si], fg=sb[si+1], fb=sb[si+2];\n        var ba = tb[ti+3], br=tb[ti], bg=tb[ti+1], bb=tb[ti+2];\n        if(fa==ba && fr==br && fg==bg && fb==bb) continue;\n        //if(fa!=255 && ba!=0) return false;\n        if(fa<220 && ba>20) return false;\n      }\n    }\n  return true;\n}\n\n\n\n\nUPNG.encode = function(bufs, w, h, ps, dels, tabs, forbidPlte)\n{\n  if(ps==null) ps=0;\n  if(forbidPlte==null) forbidPlte = false;\n\n  var nimg = UPNG.encode.compress(bufs, w, h, ps, [false, false, false, 0, forbidPlte]);\n  UPNG.encode.compressPNG(nimg, -1);\n\n  return UPNG.encode._main(nimg, w, h, dels, tabs);\n}\n\nUPNG.encodeLL = function(bufs, w, h, cc, ac, depth, dels, tabs) {\n  var nimg = {  ctype: 0 + (cc==1 ? 0 : 2) + (ac==0 ? 0 : 4),      depth: depth,  frames: []  };\n\n  var time = Date.now();\n  var bipp = (cc+ac)*depth, bipl = bipp * w;\n  for(var i=0; i<bufs.length; i++)\n    nimg.frames.push({  rect:{x:0,y:0,width:w,height:h},  img:new Uint8Array(bufs[i]), blend:0, dispose:1, bpp:Math.ceil(bipp/8), bpl:Math.ceil(bipl/8)  });\n\n  UPNG.encode.compressPNG(nimg, 0, true);\n\n  var out = UPNG.encode._main(nimg, w, h, dels, tabs);\n  return out;\n}\n\nUPNG.encode._main = function(nimg, w, h, dels, tabs) {\n  if(tabs==null) tabs={};\n  var crc = UPNG.crc.crc, wUi = UPNG._bin.writeUint, wUs = UPNG._bin.writeUshort, wAs = UPNG._bin.writeASCII;\n  var offset = 8, anim = nimg.frames.length>1, pltAlpha = false;\n\n  var leng = 8 + (16+5+4) /*+ (9+4)*/ + (anim ? 20 : 0);\n  if(tabs[\"sRGB\"]!=null) leng += 8+1+4;\n  if(tabs[\"pHYs\"]!=null) leng += 8+9+4;\n  if(nimg.ctype==3) {\n    var dl = nimg.plte.length;\n    for(var i=0; i<dl; i++) if((nimg.plte[i]>>>24)!=255) pltAlpha = true;\n    leng += (8 + dl*3 + 4) + (pltAlpha ? (8 + dl*1 + 4) : 0);\n  }\n  for(var j=0; j<nimg.frames.length; j++)\n  {\n    var fr = nimg.frames[j];\n    if(anim) leng += 38;\n    leng += fr.cimg.length + 12;\n    if(j!=0) leng+=4;\n  }\n  leng += 12;\n\n  var data = new Uint8Array(leng);\n  var wr=[0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a];\n  for(var i=0; i<8; i++) data[i]=wr[i];\n\n  wUi(data,offset, 13);     offset+=4;\n  wAs(data,offset,\"IHDR\");  offset+=4;\n  wUi(data,offset,w);  offset+=4;\n  wUi(data,offset,h);  offset+=4;\n  data[offset] = nimg.depth;  offset++;  // depth\n  data[offset] = nimg.ctype;  offset++;  // ctype\n  data[offset] = 0;  offset++;  // compress\n  data[offset] = 0;  offset++;  // filter\n  data[offset] = 0;  offset++;  // interlace\n  wUi(data,offset,crc(data,offset-17,17));  offset+=4; // crc\n\n  // 13 bytes to say, that it is sRGB\n  if(tabs[\"sRGB\"]!=null) {\n    wUi(data,offset, 1);      offset+=4;\n    wAs(data,offset,\"sRGB\");  offset+=4;\n    data[offset] = tabs[\"sRGB\"];  offset++;\n    wUi(data,offset,crc(data,offset-5,5));  offset+=4; // crc\n  }\n  if(tabs[\"pHYs\"]!=null) {\n    wUi(data,offset, 9);      offset+=4;\n    wAs(data,offset,\"pHYs\");  offset+=4;\n    wUi(data,offset, tabs[\"pHYs\"][0]);      offset+=4;\n    wUi(data,offset, tabs[\"pHYs\"][1]);      offset+=4;\n    data[offset]=tabs[\"pHYs\"][2];\t\t\toffset++;\n    wUi(data,offset,crc(data,offset-13,13));  offset+=4; // crc\n  }\n\n  if(anim) {\n    wUi(data,offset, 8);      offset+=4;\n    wAs(data,offset,\"acTL\");  offset+=4;\n    wUi(data,offset, nimg.frames.length);     offset+=4;\n    wUi(data,offset, tabs[\"loop\"]!=null?tabs[\"loop\"]:0);      offset+=4;\n    wUi(data,offset,crc(data,offset-12,12));  offset+=4; // crc\n  }\n\n  if(nimg.ctype==3) {\n    var dl = nimg.plte.length;\n    wUi(data,offset, dl*3);  offset+=4;\n    wAs(data,offset,\"PLTE\");  offset+=4;\n    for(var i=0; i<dl; i++){\n      var ti=i*3, c=nimg.plte[i], r=(c)&255, g=(c>>>8)&255, b=(c>>>16)&255;\n      data[offset+ti+0]=r;  data[offset+ti+1]=g;  data[offset+ti+2]=b;\n    }\n    offset+=dl*3;\n    wUi(data,offset,crc(data,offset-dl*3-4,dl*3+4));  offset+=4; // crc\n\n    if(pltAlpha) {\n      wUi(data,offset, dl);  offset+=4;\n      wAs(data,offset,\"tRNS\");  offset+=4;\n      for(var i=0; i<dl; i++)  data[offset+i]=(nimg.plte[i]>>>24)&255;\n      offset+=dl;\n      wUi(data,offset,crc(data,offset-dl-4,dl+4));  offset+=4; // crc\n    }\n  }\n\n  var fi = 0;\n  for(var j=0; j<nimg.frames.length; j++)\n  {\n    var fr = nimg.frames[j];\n    if(anim) {\n      wUi(data, offset, 26);     offset+=4;\n      wAs(data, offset,\"fcTL\");  offset+=4;\n      wUi(data, offset, fi++);   offset+=4;\n      wUi(data, offset, fr.rect.width );   offset+=4;\n      wUi(data, offset, fr.rect.height);   offset+=4;\n      wUi(data, offset, fr.rect.x);   offset+=4;\n      wUi(data, offset, fr.rect.y);   offset+=4;\n      wUs(data, offset, dels[j]);   offset+=2;\n      wUs(data, offset,  1000);   offset+=2;\n      data[offset] = fr.dispose;  offset++;\t// dispose\n      data[offset] = fr.blend  ;  offset++;\t// blend\n      wUi(data,offset,crc(data,offset-30,30));  offset+=4; // crc\n    }\n\n    var imgd = fr.cimg, dl = imgd.length;\n    wUi(data,offset, dl+(j==0?0:4));     offset+=4;\n    var ioff = offset;\n    wAs(data,offset,(j==0)?\"IDAT\":\"fdAT\");  offset+=4;\n    if(j!=0) {  wUi(data, offset, fi++);  offset+=4;  }\n    data.set(imgd,offset);\n    offset += dl;\n    wUi(data,offset,crc(data,ioff,offset-ioff));  offset+=4; // crc\n  }\n\n  wUi(data,offset, 0);     offset+=4;\n  wAs(data,offset,\"IEND\");  offset+=4;\n  wUi(data,offset,crc(data,offset-4,4));  offset+=4; // crc\n\n  return data.buffer;\n}\n\nUPNG.encode.compressPNG = function(out, filter, levelZero) {\n  for(var i=0; i<out.frames.length; i++) {\n    var frm = out.frames[i], nw=frm.rect.width, nh=frm.rect.height;\n    var fdata = new Uint8Array(nh*frm.bpl+nh);\n    frm.cimg = UPNG.encode._filterZero(frm.img,nh,frm.bpp,frm.bpl,fdata, filter, levelZero);\n  }\n}\n\n\n\nUPNG.encode.compress = function(bufs, w, h, ps, prms) // prms:  onlyBlend, minBits, forbidPlte\n{\n  //var time = Date.now();\n  var onlyBlend = prms[0], evenCrd = prms[1], forbidPrev = prms[2], minBits = prms[3], forbidPlte = prms[4];\n\n  var ctype = 6, depth = 8, alphaAnd=255\n\n  for(var j=0; j<bufs.length; j++)  {  // when not quantized, other frames can contain colors, that are not in an initial frame\n    var img = new Uint8Array(bufs[j]), ilen = img.length;\n    for(var i=0; i<ilen; i+=4) alphaAnd &= img[i+3];\n  }\n  var gotAlpha = (alphaAnd!=255);\n\n  //console.log(\"alpha check\", Date.now()-time);  time = Date.now();\n\n  //var brute = gotAlpha && forGIF;\t\t// brute : frames can only be copied, not \"blended\"\n  var frms = UPNG.encode.framize(bufs, w, h, onlyBlend, evenCrd, forbidPrev);\n  //console.log(\"framize\", Date.now()-time);  time = Date.now();\n\n  var cmap={}, plte=[], inds=[];\n\n  if(ps!=0) {\n    var nbufs = [];  for(var i=0; i<frms.length; i++) nbufs.push(frms[i].img.buffer);\n\n    var abuf = UPNG.encode.concatRGBA(nbufs), qres = UPNG.quantize(abuf, ps);  //console.log(qres);\n    var cof = 0, bb = new Uint8Array(qres.abuf);\n    for(var i=0; i<frms.length; i++) {  var ti=frms[i].img, bln=ti.length;  inds.push(new Uint8Array(qres.inds.buffer, cof>>2, bln>>2));\n      for(var j=0; j<bln; j+=4) {  ti[j]=bb[cof+j];  ti[j+1]=bb[cof+j+1];  ti[j+2]=bb[cof+j+2];  ti[j+3]=bb[cof+j+3];  }    cof+=bln;  }\n\n    for(var i=0; i<qres.plte.length; i++) plte.push(qres.plte[i].est.rgba);\n    //console.log(\"quantize\", Date.now()-time);  time = Date.now();\n  }\n  else {\n    // what if ps==0, but there are <=256 colors?  we still need to detect, if the palette could be used\n    for(var j=0; j<frms.length; j++)  {  // when not quantized, other frames can contain colors, that are not in an initial frame\n      var frm = frms[j], img32 = new Uint32Array(frm.img.buffer), nw=frm.rect.width, ilen = img32.length;\n      var ind = new Uint8Array(ilen);  inds.push(ind);\n      for(var i=0; i<ilen; i++) {\n        var c = img32[i];\n        if     (i!=0 && c==img32[i- 1]) ind[i]=ind[i-1];\n        else if(i>nw && c==img32[i-nw]) ind[i]=ind[i-nw];\n        else {\n          var cmc = cmap[c];\n          if(cmc==null) {  cmap[c]=cmc=plte.length;  plte.push(c);  if(plte.length>=300) break;  }\n          ind[i]=cmc;\n        }\n      }\n    }\n    //console.log(\"make palette\", Date.now()-time);  time = Date.now();\n  }\n\n  var cc=plte.length; //console.log(\"colors:\",cc);\n  if(cc<=256 && forbidPlte==false) {\n    if(cc<= 2) depth=1;  else if(cc<= 4) depth=2;  else if(cc<=16) depth=4;  else depth=8;\n    depth =  Math.max(depth, minBits);\n  }\n\n  for(var j=0; j<frms.length; j++)\n  {\n    var frm = frms[j], nx=frm.rect.x, ny=frm.rect.y, nw=frm.rect.width, nh=frm.rect.height;\n    var cimg = frm.img, cimg32 = new Uint32Array(cimg.buffer);\n    var bpl = 4*nw, bpp=4;\n    if(cc<=256 && forbidPlte==false) {\n      bpl = Math.ceil(depth*nw/8);\n      var nimg = new Uint8Array(bpl*nh);\n      var inj = inds[j];\n      for(var y=0; y<nh; y++) {  var i=y*bpl, ii=y*nw;\n        if     (depth==8) for(var x=0; x<nw; x++) nimg[i+(x)   ]   =  (inj[ii+x]             );\n        else if(depth==4) for(var x=0; x<nw; x++) nimg[i+(x>>1)]  |=  (inj[ii+x]<<(4-(x&1)*4));\n        else if(depth==2) for(var x=0; x<nw; x++) nimg[i+(x>>2)]  |=  (inj[ii+x]<<(6-(x&3)*2));\n        else if(depth==1) for(var x=0; x<nw; x++) nimg[i+(x>>3)]  |=  (inj[ii+x]<<(7-(x&7)*1));\n      }\n      cimg=nimg;  ctype=3;  bpp=1;\n    }\n    else if(gotAlpha==false && frms.length==1) {\t// some next \"reduced\" frames may contain alpha for blending\n      var nimg = new Uint8Array(nw*nh*3), area=nw*nh;\n      for(var i=0; i<area; i++) { var ti=i*3, qi=i*4;  nimg[ti]=cimg[qi];  nimg[ti+1]=cimg[qi+1];  nimg[ti+2]=cimg[qi+2];  }\n      cimg=nimg;  ctype=2;  bpp=3;  bpl=3*nw;\n    }\n    frm.img=cimg;  frm.bpl=bpl;  frm.bpp=bpp;\n  }\n  //console.log(\"colors => palette indices\", Date.now()-time);  time = Date.now();\n\n  return {ctype:ctype, depth:depth, plte:plte, frames:frms  };\n}\nUPNG.encode.framize = function(bufs,w,h,alwaysBlend,evenCrd,forbidPrev) {\n  /*  DISPOSE\n      - 0 : no change\n    - 1 : clear to transparent\n    - 2 : retstore to content before rendering (previous frame disposed)\n    BLEND\n    - 0 : replace\n    - 1 : blend\n  */\n  var frms = [];\n  for(var j=0; j<bufs.length; j++) {\n    var cimg = new Uint8Array(bufs[j]), cimg32 = new Uint32Array(cimg.buffer);\n    var nimg;\n\n    var nx=0, ny=0, nw=w, nh=h, blend=alwaysBlend?1:0;\n    if(j!=0) {\n      var tlim = (forbidPrev || alwaysBlend || j==1 || frms[j-2].dispose!=0)?1:2, tstp = 0, tarea = 1e9;\n      for(var it=0; it<tlim; it++)\n      {\n        var pimg = new Uint8Array(bufs[j-1-it]), p32 = new Uint32Array(bufs[j-1-it]);\n        var mix=w,miy=h,max=-1,may=-1;\n        for(var y=0; y<h; y++) for(var x=0; x<w; x++) {\n          var i = y*w+x;\n          if(cimg32[i]!=p32[i]) {\n            if(x<mix) mix=x;  if(x>max) max=x;\n            if(y<miy) miy=y;  if(y>may) may=y;\n          }\n        }\n        if(max==-1) mix=miy=max=may=0;\n        if(evenCrd) {  if((mix&1)==1)mix--;  if((miy&1)==1)miy--;  }\n        var sarea = (max-mix+1)*(may-miy+1);\n        if(sarea<tarea) {\n          tarea = sarea;  tstp = it;\n          nx = mix; ny = miy; nw = max-mix+1; nh = may-miy+1;\n        }\n      }\n\n      // alwaysBlend: pokud zjistím, že blendit nelze, nastavím předchozímu snímku dispose=1. Zajistím, aby obsahoval můj obdélník.\n      var pimg = new Uint8Array(bufs[j-1-tstp]);\n      if(tstp==1) frms[j-1].dispose = 2;\n\n      nimg = new Uint8Array(nw*nh*4);\n      UPNG._copyTile(pimg,w,h, nimg,nw,nh, -nx,-ny, 0);\n\n      blend =  UPNG._copyTile(cimg,w,h, nimg,nw,nh, -nx,-ny, 3) ? 1 : 0;\n      if(blend==1) UPNG.encode._prepareDiff(cimg,w,h,nimg,{x:nx,y:ny,width:nw,height:nh});\n      else         UPNG._copyTile(cimg,w,h, nimg,nw,nh, -nx,-ny, 0);\n      //UPNG._copyTile(cimg,w,h, nimg,nw,nh, -nx,-ny, blend==1?2:0);\n    }\n    else nimg = cimg.slice(0);\t// img may be rewritten further ... don't rewrite input\n\n    frms.push({rect:{x:nx,y:ny,width:nw,height:nh}, img:nimg, blend:blend, dispose:0});\n  }\n\n\n  if(alwaysBlend) for(var j=0; j<frms.length; j++) {\n    var frm = frms[j];  if(frm.blend==1) continue;\n    var r0 = frm.rect, r1 = frms[j-1].rect\n    var miX = Math.min(r0.x, r1.x), miY = Math.min(r0.y, r1.y);\n    var maX = Math.max(r0.x+r0.width, r1.x+r1.width), maY = Math.max(r0.y+r0.height, r1.y+r1.height);\n    var r = {x:miX, y:miY, width:maX-miX, height:maY-miY};\n\n    frms[j-1].dispose = 1;\n    if(j-1!=0)\n      UPNG.encode._updateFrame(bufs, w,h,frms, j-1,r, evenCrd);\n    UPNG.encode._updateFrame(bufs, w,h,frms, j  ,r, evenCrd);\n  }\n  var area = 0;\n  if(bufs.length!=1) for(var i=0; i<frms.length; i++) {\n    var frm = frms[i];\n    area += frm.rect.width*frm.rect.height;\n    //if(i==0 || frm.blend!=1) continue;\n    //var ob = new Uint8Array(\n    //console.log(frm.blend, frm.dispose, frm.rect);\n  }\n  //if(area!=0) console.log(area);\n  return frms;\n}\nUPNG.encode._updateFrame = function(bufs, w,h, frms, i, r, evenCrd) {\n  var U8 = Uint8Array, U32 = Uint32Array;\n  var pimg = new U8(bufs[i-1]), pimg32 = new U32(bufs[i-1]), nimg = i+1<bufs.length ? new U8(bufs[i+1]):null;\n  var cimg = new U8(bufs[i]), cimg32 = new U32(cimg.buffer);\n\n  var mix=w,miy=h,max=-1,may=-1;\n  for(var y=0; y<r.height; y++) for(var x=0; x<r.width; x++) {\n    var cx = r.x+x, cy = r.y+y;\n    var j = cy*w+cx, cc = cimg32[j];\n    // no need to draw transparency, or to dispose it. Or, if writing the same color and the next one does not need transparency.\n    if(cc==0 || (frms[i-1].dispose==0 && pimg32[j]==cc && (nimg==null || nimg[j*4+3]!=0))/**/) {}\n    else {\n      if(cx<mix) mix=cx;  if(cx>max) max=cx;\n      if(cy<miy) miy=cy;  if(cy>may) may=cy;\n    }\n  }\n  if(max==-1) mix=miy=max=may=0;\n  if(evenCrd) {  if((mix&1)==1)mix--;  if((miy&1)==1)miy--;  }\n  r = {x:mix, y:miy, width:max-mix+1, height:may-miy+1};\n\n  var fr = frms[i];  fr.rect = r;  fr.blend = 1;  fr.img = new Uint8Array(r.width*r.height*4);\n  if(frms[i-1].dispose==0) {\n    UPNG._copyTile(pimg,w,h, fr.img,r.width,r.height, -r.x,-r.y, 0);\n    UPNG.encode._prepareDiff(cimg,w,h,fr.img,r);\n    //UPNG._copyTile(cimg,w,h, fr.img,r.width,r.height, -r.x,-r.y, 2);\n  }\n  else\n    UPNG._copyTile(cimg,w,h, fr.img,r.width,r.height, -r.x,-r.y, 0);\n}\nUPNG.encode._prepareDiff = function(cimg, w,h, nimg, rec) {\n  UPNG._copyTile(cimg,w,h, nimg,rec.width,rec.height, -rec.x,-rec.y, 2);\n  /*\n  var n32 = new Uint32Array(nimg.buffer);\n  var og = new Uint8Array(rec.width*rec.height*4), o32 = new Uint32Array(og.buffer);\n  UPNG._copyTile(cimg,w,h, og,rec.width,rec.height, -rec.x,-rec.y, 0);\n  for(var i=4; i<nimg.length; i+=4) {\n    if(nimg[i-1]!=0 && nimg[i+3]==0 && o32[i>>>2]==o32[(i>>>2)-1]) {\n      n32[i>>>2]=o32[i>>>2];\n      //var j = i, c=p32[(i>>>2)-1];\n      //while(p32[j>>>2]==c) {  n32[j>>>2]=c;  j+=4;  }\n    }\n  }\n  for(var i=nimg.length-8; i>0; i-=4) {\n    if(nimg[i+7]!=0 && nimg[i+3]==0 && o32[i>>>2]==o32[(i>>>2)+1]) {\n      n32[i>>>2]=o32[i>>>2];\n      //var j = i, c=p32[(i>>>2)-1];\n      //while(p32[j>>>2]==c) {  n32[j>>>2]=c;  j+=4;  }\n    }\n  }*/\n}\n\nUPNG.encode._filterZero = function(img,h,bpp,bpl,data, filter, levelZero)\n{\n  var fls = [], ftry=[0,1,2,3,4];\n  if     (filter!=-1)             ftry=[filter];\n  else if(h*bpl>500000 || bpp==1) ftry=[0];\n  var opts;  if(levelZero) opts={level:0};\n\n\n  // var CMPR = (data.length>10e6 && typeof UZIP !== 'undefined') ? UZIP : pako;\n  var CMPR = UZIP;\n\n  var time = Date.now();\n  for(var i=0; i<ftry.length; i++) {\n    for(var y=0; y<h; y++) UPNG.encode._filterLine(data, img, y, bpl, bpp, ftry[i]);\n    //var nimg = new Uint8Array(data.length);\n    //var sz = UZIP.F.deflate(data, nimg);  fls.push(nimg.slice(0,sz));\n    //var dfl = pako[\"deflate\"](data), dl=dfl.length-4;\n    //var crc = (dfl[dl+3]<<24)|(dfl[dl+2]<<16)|(dfl[dl+1]<<8)|(dfl[dl+0]<<0);\n    //console.log(crc, UZIP.adler(data,2,data.length-6));\n    fls.push(CMPR[\"deflate\"](data,opts));\n  }\n\n  var ti, tsize=1e9;\n  for(var i=0; i<fls.length; i++) if(fls[i].length<tsize) {  ti=i;  tsize=fls[i].length;  }\n  return fls[ti];\n}\nUPNG.encode._filterLine = function(data, img, y, bpl, bpp, type)\n{\n  var i = y*bpl, di = i+y, paeth = UPNG.decode._paeth\n  data[di]=type;  di++;\n\n  if(type==0) {\n    if(bpl<500) for(var x=0; x<bpl; x++) data[di+x] = img[i+x];\n    else data.set(new Uint8Array(img.buffer,i,bpl),di);\n  }\n  else if(type==1) {\n    for(var x=  0; x<bpp; x++) data[di+x] =  img[i+x];\n    for(var x=bpp; x<bpl; x++) data[di+x] = (img[i+x]-img[i+x-bpp]+256)&255;\n  }\n  else if(y==0) {\n    for(var x=  0; x<bpp; x++) data[di+x] = img[i+x];\n\n    if(type==2) for(var x=bpp; x<bpl; x++) data[di+x] = img[i+x];\n    if(type==3) for(var x=bpp; x<bpl; x++) data[di+x] = (img[i+x] - (img[i+x-bpp]>>1) +256)&255;\n    if(type==4) for(var x=bpp; x<bpl; x++) data[di+x] = (img[i+x] - paeth(img[i+x-bpp], 0, 0) +256)&255;\n  }\n  else {\n    if(type==2) { for(var x=  0; x<bpl; x++) data[di+x] = (img[i+x]+256 - img[i+x-bpl])&255;  }\n    if(type==3) { for(var x=  0; x<bpp; x++) data[di+x] = (img[i+x]+256 - (img[i+x-bpl]>>1))&255;\n      for(var x=bpp; x<bpl; x++) data[di+x] = (img[i+x]+256 - ((img[i+x-bpl]+img[i+x-bpp])>>1))&255;  }\n    if(type==4) { for(var x=  0; x<bpp; x++) data[di+x] = (img[i+x]+256 - paeth(0, img[i+x-bpl], 0))&255;\n      for(var x=bpp; x<bpl; x++) data[di+x] = (img[i+x]+256 - paeth(img[i+x-bpp], img[i+x-bpl], img[i+x-bpp-bpl]))&255;  }\n  }\n}\n\nUPNG.crc = {\n  table : ( function() {\n    var tab = new Uint32Array(256);\n    for (var n=0; n<256; n++) {\n      var c = n;\n      for (var k=0; k<8; k++) {\n        if (c & 1)  c = 0xedb88320 ^ (c >>> 1);\n        else        c = c >>> 1;\n      }\n      tab[n] = c;  }\n    return tab;  })(),\n  update : function(c, buf, off, len) {\n    for (var i=0; i<len; i++)  c = UPNG.crc.table[(c ^ buf[off+i]) & 0xff] ^ (c >>> 8);\n    return c;\n  },\n  crc : function(b,o,l)  {  return UPNG.crc.update(0xffffffff,b,o,l) ^ 0xffffffff;  }\n}\n\n\nUPNG.quantize = function(abuf, ps)\n{\n  var oimg = new Uint8Array(abuf), nimg = oimg.slice(0), nimg32 = new Uint32Array(nimg.buffer);\n\n  var KD = UPNG.quantize.getKDtree(nimg, ps);\n  var root = KD[0], leafs = KD[1];\n\n  var planeDst = UPNG.quantize.planeDst;\n  var sb = oimg, tb = nimg32, len=sb.length;\n\n  var inds = new Uint8Array(oimg.length>>2), nd;\n  if(oimg.length<20e6)  // precise, but slow :(\n    for(var i=0; i<len; i+=4) {\n      var r=sb[i]*(1/255), g=sb[i+1]*(1/255), b=sb[i+2]*(1/255), a=sb[i+3]*(1/255);\n\n      nd = UPNG.quantize.getNearest(root, r, g, b, a);\n      inds[i>>2] = nd.ind;  tb[i>>2] = nd.est.rgba;\n    }\n  else\n    for(var i=0; i<len; i+=4) {\n      var r=sb[i]*(1/255), g=sb[i+1]*(1/255), b=sb[i+2]*(1/255), a=sb[i+3]*(1/255);\n\n      nd = root;  while(nd.left) nd = (planeDst(nd.est,r,g,b,a)<=0) ? nd.left : nd.right;\n      inds[i>>2] = nd.ind;  tb[i>>2] = nd.est.rgba;\n    }\n  return {  abuf:nimg.buffer, inds:inds, plte:leafs  };\n}\n\nUPNG.quantize.getKDtree = function(nimg, ps, err) {\n  if(err==null) err = 0.0001;\n  var nimg32 = new Uint32Array(nimg.buffer);\n\n  var root = {i0:0, i1:nimg.length, bst:null, est:null, tdst:0, left:null, right:null };  // basic statistic, extra statistic\n  root.bst = UPNG.quantize.stats(  nimg,root.i0, root.i1  );  root.est = UPNG.quantize.estats( root.bst );\n  var leafs = [root];\n\n  while(leafs.length<ps)\n  {\n    var maxL = 0, mi=0;\n    for(var i=0; i<leafs.length; i++) if(leafs[i].est.L > maxL) {  maxL=leafs[i].est.L;  mi=i;  }\n    if(maxL<err) break;\n    var node = leafs[mi];\n\n    var s0 = UPNG.quantize.splitPixels(nimg,nimg32, node.i0, node.i1, node.est.e, node.est.eMq255);\n    var s0wrong = (node.i0>=s0 || node.i1<=s0);\n    //console.log(maxL, leafs.length, mi);\n    if(s0wrong) {  node.est.L=0;  continue;  }\n\n\n    var ln = {i0:node.i0, i1:s0, bst:null, est:null, tdst:0, left:null, right:null };  ln.bst = UPNG.quantize.stats( nimg, ln.i0, ln.i1 );\n    ln.est = UPNG.quantize.estats( ln.bst );\n    var rn = {i0:s0, i1:node.i1, bst:null, est:null, tdst:0, left:null, right:null };  rn.bst = {R:[], m:[], N:node.bst.N-ln.bst.N};\n    for(var i=0; i<16; i++) rn.bst.R[i] = node.bst.R[i]-ln.bst.R[i];\n    for(var i=0; i< 4; i++) rn.bst.m[i] = node.bst.m[i]-ln.bst.m[i];\n    rn.est = UPNG.quantize.estats( rn.bst );\n\n    node.left = ln;  node.right = rn;\n    leafs[mi]=ln;  leafs.push(rn);\n  }\n  leafs.sort(function(a,b) {  return b.bst.N-a.bst.N;  });\n  for(var i=0; i<leafs.length; i++) leafs[i].ind=i;\n  return [root, leafs];\n}\n\nUPNG.quantize.getNearest = function(nd, r,g,b,a)\n{\n  if(nd.left==null) {  nd.tdst = UPNG.quantize.dist(nd.est.q,r,g,b,a);  return nd;  }\n  var planeDst = UPNG.quantize.planeDst(nd.est,r,g,b,a);\n\n  var node0 = nd.left, node1 = nd.right;\n  if(planeDst>0) {  node0=nd.right;  node1=nd.left;  }\n\n  var ln = UPNG.quantize.getNearest(node0, r,g,b,a);\n  if(ln.tdst<=planeDst*planeDst) return ln;\n  var rn = UPNG.quantize.getNearest(node1, r,g,b,a);\n  return rn.tdst<ln.tdst ? rn : ln;\n}\nUPNG.quantize.planeDst = function(est, r,g,b,a) {  var e = est.e;  return e[0]*r + e[1]*g + e[2]*b + e[3]*a - est.eMq;  }\nUPNG.quantize.dist     = function(q,   r,g,b,a) {  var d0=r-q[0], d1=g-q[1], d2=b-q[2], d3=a-q[3];  return d0*d0+d1*d1+d2*d2+d3*d3;  }\n\nUPNG.quantize.splitPixels = function(nimg, nimg32, i0, i1, e, eMq)\n{\n  var vecDot = UPNG.quantize.vecDot;\n  i1-=4;\n  var shfs = 0;\n  while(i0<i1)\n  {\n    while(vecDot(nimg, i0, e)<=eMq) i0+=4;\n    while(vecDot(nimg, i1, e)> eMq) i1-=4;\n    if(i0>=i1) break;\n\n    var t = nimg32[i0>>2];  nimg32[i0>>2] = nimg32[i1>>2];  nimg32[i1>>2]=t;\n\n    i0+=4;  i1-=4;\n  }\n  while(vecDot(nimg, i0, e)>eMq) i0-=4;\n  return i0+4;\n}\nUPNG.quantize.vecDot = function(nimg, i, e)\n{\n  return nimg[i]*e[0] + nimg[i+1]*e[1] + nimg[i+2]*e[2] + nimg[i+3]*e[3];\n}\nUPNG.quantize.stats = function(nimg, i0, i1){\n  var R = [0,0,0,0,  0,0,0,0,  0,0,0,0,  0,0,0,0];\n  var m = [0,0,0,0];\n  var N = (i1-i0)>>2;\n  for(var i=i0; i<i1; i+=4)\n  {\n    var r = nimg[i]*(1/255), g = nimg[i+1]*(1/255), b = nimg[i+2]*(1/255), a = nimg[i+3]*(1/255);\n    //var r = nimg[i], g = nimg[i+1], b = nimg[i+2], a = nimg[i+3];\n    m[0]+=r;  m[1]+=g;  m[2]+=b;  m[3]+=a;\n\n    R[ 0] += r*r;  R[ 1] += r*g;  R[ 2] += r*b;  R[ 3] += r*a;\n    R[ 5] += g*g;  R[ 6] += g*b;  R[ 7] += g*a;\n    R[10] += b*b;  R[11] += b*a;\n    R[15] += a*a;\n  }\n  R[4]=R[1];  R[8]=R[2];  R[9]=R[6];  R[12]=R[3];  R[13]=R[7];  R[14]=R[11];\n\n  return {R:R, m:m, N:N};\n}\nUPNG.quantize.estats = function(stats){\n  var R = stats.R, m = stats.m, N = stats.N;\n\n  // when all samples are equal, but N is large (millions), the Rj can be non-zero ( 0.0003.... - precission error)\n  var m0 = m[0], m1 = m[1], m2 = m[2], m3 = m[3], iN = (N==0 ? 0 : 1/N);\n  var Rj = [\n    R[ 0] - m0*m0*iN,  R[ 1] - m0*m1*iN,  R[ 2] - m0*m2*iN,  R[ 3] - m0*m3*iN,\n    R[ 4] - m1*m0*iN,  R[ 5] - m1*m1*iN,  R[ 6] - m1*m2*iN,  R[ 7] - m1*m3*iN,\n    R[ 8] - m2*m0*iN,  R[ 9] - m2*m1*iN,  R[10] - m2*m2*iN,  R[11] - m2*m3*iN,\n    R[12] - m3*m0*iN,  R[13] - m3*m1*iN,  R[14] - m3*m2*iN,  R[15] - m3*m3*iN\n  ];\n\n  var A = Rj, M = UPNG.M4;\n  var b = [Math.random(),Math.random(),Math.random(),Math.random()], mi = 0, tmi = 0;\n\n  if(N!=0)\n    for(var i=0; i<16; i++) {\n      b = M.multVec(A, b);  tmi = Math.sqrt(M.dot(b,b));  b = M.sml(1/tmi,  b);\n      if(i!=0 && Math.abs(tmi-mi)<1e-9) break;  mi = tmi;\n    }\n  //b = [0,0,1,0];  mi=N;\n  var q = [m0*iN, m1*iN, m2*iN, m3*iN];\n  var eMq255 = M.dot(M.sml(255,q),b);\n\n  return {  Cov:Rj, q:q, e:b, L:mi,  eMq255:eMq255, eMq : M.dot(b,q),\n    rgba: (((Math.round(255*q[3])<<24) | (Math.round(255*q[2])<<16) |  (Math.round(255*q[1])<<8) | (Math.round(255*q[0])<<0))>>>0)  };\n}\nUPNG.M4 = {\n  multVec : function(m,v) {\n    return [\n      m[ 0]*v[0] + m[ 1]*v[1] + m[ 2]*v[2] + m[ 3]*v[3],\n      m[ 4]*v[0] + m[ 5]*v[1] + m[ 6]*v[2] + m[ 7]*v[3],\n      m[ 8]*v[0] + m[ 9]*v[1] + m[10]*v[2] + m[11]*v[3],\n      m[12]*v[0] + m[13]*v[1] + m[14]*v[2] + m[15]*v[3]\n    ];\n  },\n  dot : function(x,y) {  return  x[0]*y[0]+x[1]*y[1]+x[2]*y[2]+x[3]*y[3];  },\n  sml : function(a,y) {  return [a*y[0],a*y[1],a*y[2],a*y[3]];  }\n}\n\nUPNG.encode.concatRGBA = function(bufs) {\n  var tlen = 0;\n  for(var i=0; i<bufs.length; i++) tlen += bufs[i].byteLength;\n  var nimg = new Uint8Array(tlen), noff=0;\n  for(var i=0; i<bufs.length; i++) {\n    var img = new Uint8Array(bufs[i]), il = img.length;\n    for(var j=0; j<il; j+=4) {\n      var r=img[j], g=img[j+1], b=img[j+2], a = img[j+3];\n      if(a==0) r=g=b=0;\n      nimg[noff+j]=r;  nimg[noff+j+1]=g;  nimg[noff+j+2]=b;  nimg[noff+j+3]=a;  }\n    noff += il;\n  }\n  return nimg.buffer;\n}\n\nexport default UPNG\n","import UPNG from './UPNG'\n\nconst isBrowser = typeof window !== 'undefined' // change browser environment to support SSR\n\n// add support for cordova-plugin-file\nconst moduleMapper = isBrowser && window.cordova && window.cordova.require && window.cordova.require('cordova/modulemapper')\nexport const CustomFile = isBrowser && ((moduleMapper && moduleMapper.getOriginalSymbol(window, 'File')) || File)\nexport const CustomFileReader = isBrowser && ((moduleMapper && moduleMapper.getOriginalSymbol(window, 'FileReader')) || FileReader)\n\n// Check if browser supports automatic image orientation\n// see https://github.com/blueimp/JavaScript-Load-Image/blob/1e4df707821a0afcc11ea0720ee403b8759f3881/js/load-image-orientation.js#L37-L53\nexport async function isAutoOrientationInBrowser() {\n  if (isAutoOrientationInBrowser.result !== undefined)\n    return isAutoOrientationInBrowser.result\n\n  // black 2x1 JPEG, with the following meta information set:\n  // EXIF Orientation: 6 (Rotated 90° CCW)\n  const testImageURL =\n    'data:image/jpeg;base64,/9j/4QAiRXhpZgAATU0AKgAAAAgAAQESAAMAAAABAAYAAAA' +\n    'AAAD/2wCEAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBA' +\n    'QEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE' +\n    'BAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAf/AABEIAAEAAgMBEQACEQEDEQH/x' +\n    'ABKAAEAAAAAAAAAAAAAAAAAAAALEAEAAAAAAAAAAAAAAAAAAAAAAQEAAAAAAAAAAAAAAAA' +\n    'AAAAAEQEAAAAAAAAAAAAAAAAAAAAA/9oADAMBAAIRAxEAPwA/8H//2Q=='\n  const testImageFile = await getFilefromDataUrl(testImageURL, 'test.jpg', Date.now())\n\n  const testImageCanvas = (await drawFileInCanvas(testImageFile))[1]\n  const testImageFile2 = await canvasToFile(testImageCanvas, testImageFile.type, testImageFile.name, testImageFile.lastModified)\n  cleanupCanvasMemory(testImageCanvas)\n  const img = (await drawFileInCanvas(testImageFile2))[0]\n  // console.log('img', img.width, img.height)\n\n  isAutoOrientationInBrowser.result = img.width === 1 && img.height === 2\n  return isAutoOrientationInBrowser.result\n}\n\n/**\n * getDataUrlFromFile\n *\n * @param {File | Blob} file\n * @returns {Promise<string>}\n */\nexport function getDataUrlFromFile (file) {\n  return new Promise((resolve, reject) => {\n    const reader = new CustomFileReader()\n    reader.onload = () => resolve(reader.result)\n    reader.onerror = (e) => reject(e)\n    reader.readAsDataURL(file)\n  })\n}\n\n/**\n * getFilefromDataUrl\n *\n * @param {string} dataUrl\n * @param {string} filename\n * @param {number} [lastModified=Date.now()]\n * @returns {Promise<File | Blob>}\n */\nexport function getFilefromDataUrl (dataUrl, filename, lastModified = Date.now()) {\n  return new Promise((resolve) => {\n    const arr = dataUrl.split(',')\n    const mime = arr[0].match(/:(.*?);/)[1]\n    const bstr = globalThis.atob(arr[1])\n    let n = bstr.length\n    const u8arr = new Uint8Array(n)\n    while (n--) {\n      u8arr[n] = bstr.charCodeAt(n)\n    }\n    const file = new Blob([u8arr], { type: mime })\n    file.name = filename\n    file.lastModified = lastModified\n    resolve(file)\n\n    // Safari has issue with File constructor not being able to POST in FormData\n    // https://github.com/Donaldcwl/browser-image-compression/issues/8\n    // https://bugs.webkit.org/show_bug.cgi?id=165081\n    // let file\n    // try {\n    //   file = new File([u8arr], filename, { type: mime }) // Edge do not support File constructor\n    // } catch (e) {\n    //   file = new Blob([u8arr], { type: mime })\n    //   file.name = filename\n    //   file.lastModified = lastModified\n    // }\n    // resolve(file)\n  })\n}\n\n/**\n * loadImage\n *\n * @param {string} src\n * @returns {Promise<HTMLImageElement>}\n */\nexport function loadImage (src) {\n  return new Promise((resolve, reject) => {\n    const img = new Image()\n    img.onload = () => resolve(img)\n    img.onerror = (e) => reject(e)\n    img.src = src\n  })\n}\n\n/**\n * drawImageInCanvas\n *\n * @param {HTMLImageElement} img\n * @returns {HTMLCanvasElement | OffscreenCanvas}\n */\nexport function drawImageInCanvas (img) {\n  const [canvas, ctx] = getNewCanvasAndCtx(img.width, img.height)\n  ctx.drawImage(img, 0, 0, canvas.width, canvas.height)\n  return canvas\n}\n\n/**\n * drawFileInCanvas\n *\n * @param {File | Blob} file\n * @returns {Promise<[ImageBitmap | HTMLImageElement, HTMLCanvasElement | OffscreenCanvas]>}\n */\nexport async function drawFileInCanvas (file) {\n  let img\n  try {\n    img = await createImageBitmap(file)\n  } catch (e) {\n    const dataUrl = await getDataUrlFromFile(file)\n    img = await loadImage(dataUrl)\n  }\n  const canvas = drawImageInCanvas(img)\n  return [img, canvas]\n}\n\n/**\n * canvasToFile\n *\n * @param {HTMLCanvasElement | OffscreenCanvas} canvas\n * @param {string} fileType\n * @param {string} fileName\n * @param {number} fileLastModified\n * @param {number} [quality]\n * @returns {Promise<File | Blob>}\n */\nexport async function canvasToFile (canvas, fileType, fileName, fileLastModified, quality = 1) {\n  let file\n  if (fileType === 'image/png') {\n    const ctx = canvas.getContext('2d')\n    const data = ctx.getImageData(0, 0, canvas.width, canvas.height).data\n    const png = UPNG.encode([data], canvas.width, canvas.height, 256 * quality)\n    file = new Blob([png], { type: fileType })\n    file.name = fileName\n    file.lastModified = fileLastModified\n  } else if (typeof OffscreenCanvas === 'function' && canvas instanceof OffscreenCanvas) { // checked on Win Chrome 83, MacOS Chrome 83\n    file = await canvas.convertToBlob({ type: fileType, quality })\n    file.name = fileName\n    file.lastModified = fileLastModified\n  // some browser do not support quality parameter, see: https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob\n  // } else if (typeof canvas.toBlob === 'function') {\n  //   file = await new Promise(resolve => canvas.toBlob(resolve, fileType, quality))\n  } else { // checked on Win Edge 44, Win IE 11, Win Firefox 76, MacOS Firefox 77, MacOS Safari 13.1\n    const dataUrl = canvas.toDataURL(fileType, quality)\n    file = await getFilefromDataUrl(dataUrl, fileName, fileLastModified)\n  }\n  return file\n}\n\n/**\n * getExifOrientation\n * get image exif orientation info\n * source: https://stackoverflow.com/a/32490603/10395024\n *\n * @param {File | Blob} file\n * @returns {Promise<number>} - orientation id, see https://i.stack.imgur.com/VGsAj.gif\n */\nexport function getExifOrientation (file) {\n  return new Promise((resolve, reject) => {\n    const reader = new CustomFileReader()\n    reader.onload = (e) => {\n      const view = new DataView(e.target.result)\n      if (view.getUint16(0, false) != 0xFFD8) {\n        return resolve(-2)\n      }\n      const length = view.byteLength\n      let offset = 2\n      while (offset < length) {\n        if (view.getUint16(offset + 2, false) <= 8) return resolve(-1)\n        const marker = view.getUint16(offset, false)\n        offset += 2\n        if (marker == 0xFFE1) {\n          if (view.getUint32(offset += 2, false) != 0x45786966) {\n            return resolve(-1)\n          }\n\n          var little = view.getUint16(offset += 6, false) == 0x4949\n          offset += view.getUint32(offset + 4, little)\n          var tags = view.getUint16(offset, little)\n          offset += 2\n          for (var i = 0; i < tags; i++) {\n            if (view.getUint16(offset + (i * 12), little) == 0x0112) {\n              return resolve(view.getUint16(offset + (i * 12) + 8, little))\n            }\n          }\n        } else if ((marker & 0xFF00) != 0xFF00) {\n          break\n        } else {\n          offset += view.getUint16(offset, false)\n        }\n      }\n      return resolve(-1)\n    }\n    reader.onerror = (e) => reject(e)\n    reader.readAsArrayBuffer(file)\n  })\n}\n\n/**\n *\n * @param {HTMLCanvasElement | OffscreenCanvas} canvas\n * @param options\n * @returns {HTMLCanvasElement | OffscreenCanvas}\n */\nexport function handleMaxWidthOrHeight (canvas, options) {\n  const width = canvas.width\n  const height = canvas.height\n  const maxWidthOrHeight = options.maxWidthOrHeight\n\n  const needToHandle = isFinite(maxWidthOrHeight) && (width > maxWidthOrHeight || height > maxWidthOrHeight)\n\n  let newCanvas = canvas\n  let ctx\n\n  if (needToHandle) {\n    [newCanvas, ctx] = getNewCanvasAndCtx(width, height)\n    if (width > height) {\n      newCanvas.width = maxWidthOrHeight\n      newCanvas.height = (height / width) * maxWidthOrHeight\n    } else {\n      newCanvas.width = (width / height) * maxWidthOrHeight\n      newCanvas.height = maxWidthOrHeight\n    }\n    ctx.drawImage(canvas, 0, 0, newCanvas.width, newCanvas.height)\n\n    cleanupCanvasMemory(canvas)\n  }\n\n  return newCanvas\n}\n\n/**\n * followExifOrientation\n * source: https://stackoverflow.com/a/40867559/10395024\n *\n * @param {HTMLCanvasElement | OffscreenCanvas} canvas\n * @param {number} exifOrientation\n * @returns {HTMLCanvasElement | OffscreenCanvas} canvas\n */\nexport function followExifOrientation (canvas, exifOrientation) {\n  const width = canvas.width\n  const height = canvas.height\n\n  const [newCanvas, ctx] = getNewCanvasAndCtx(width, height)\n\n  // set proper canvas dimensions before transform & export\n  if (4 < exifOrientation && exifOrientation < 9) {\n    newCanvas.width = height\n    newCanvas.height = width\n  } else {\n    newCanvas.width = width\n    newCanvas.height = height\n  }\n\n  // transform context before drawing image\n  switch (exifOrientation) {\n    case 2:\n      ctx.transform(-1, 0, 0, 1, width, 0)\n      break\n    case 3:\n      ctx.transform(-1, 0, 0, -1, width, height)\n      break\n    case 4:\n      ctx.transform(1, 0, 0, -1, 0, height)\n      break\n    case 5:\n      ctx.transform(0, 1, 1, 0, 0, 0)\n      break\n    case 6:\n      ctx.transform(0, 1, -1, 0, height, 0)\n      break\n    case 7:\n      ctx.transform(0, -1, -1, 0, height, width)\n      break\n    case 8:\n      ctx.transform(0, -1, 1, 0, 0, width)\n      break\n    default:\n      break\n  }\n\n  ctx.drawImage(canvas, 0, 0, width, height)\n\n  cleanupCanvasMemory(canvas)\n\n  return newCanvas\n}\n\n/**\n * get new Canvas and it's context\n * @param width\n * @param height\n * @returns {[HTMLCanvasElement | OffscreenCanvas, CanvasRenderingContext2D]}\n */\nexport function getNewCanvasAndCtx (width, height) {\n  let canvas\n  let ctx\n  try {\n    canvas = new OffscreenCanvas(width, height)\n    ctx = canvas.getContext('2d')\n    if (ctx === null) {\n      throw new Error('getContext of OffscreenCanvas returns null')\n    }\n  } catch (e) {\n    canvas = document.createElement('canvas')\n    ctx = canvas.getContext('2d')\n  }\n  canvas.width = width\n  canvas.height = height\n  // ctx.fillStyle = '#fff'\n  // ctx.fillRect(0, 0, width, height)\n  return [canvas, ctx]\n}\n\n/**\n * clear Canvas memory\n * @param canvas\n * @returns null\n */\nexport function cleanupCanvasMemory (canvas) {\n  // garbage clean canvas for safari\n  // ref: https://bugs.webkit.org/show_bug.cgi?id=195325\n  canvas.width = 0\n  canvas.height = 0\n}\n\nif (isBrowser) {\n// Polyfill for Number.isInteger\n  Number.isInteger = Number.isInteger || function (value) {\n    return typeof value === 'number' &&\n      isFinite(value) &&\n      Math.floor(value) === value\n  }\n}\n","import lib from './index'\nimport compress from './image-compression'\nimport { cleanupCanvasMemory, getNewCanvasAndCtx } from './utils'\nimport UPNG from './UPNG'\nimport * as UZIP from 'uzip'\n\nlet imageCompressionLibUrl\nlet worker\n\nfunction createWorker (script) {\n  if (typeof script === 'function') {\n    script = `(${f})()`\n  }\n  return new Worker(URL.createObjectURL(new Blob([script])))\n}\n\nfunction createSourceObject (str) {\n  // console.log('createSourceObject', str)\n  return URL.createObjectURL(new Blob([str], { type: 'application/javascript' }))\n}\n\nfunction stringify(o) {\n  return JSON.stringify(o, (key, value) => {\n    return (typeof value === 'function' ) ? `BIC_FN:::(() => ${value.toString()})()` : value;\n  })\n}\n\nfunction parse(o) {\n  if (typeof o === 'string') return o\n  const result = {}\n  Object.entries(o).forEach(([key, value]) => {\n    if (typeof value === 'string' && value.startsWith('BIC_FN:::')) {\n      try {\n        result[key] = eval(value.replace(/^BIC_FN:::/, ''))\n      } catch (e) {\n        console.log(key, e)\n        throw e\n      }\n    } else {\n      result[key] = parse(value)\n    }\n  })\n  return result\n}\n\nfunction generateLib () {\n  // prepare the lib to be used inside WebWorker\n  return createSourceObject(`\n    // reconstruct library\n    function imageCompression (){return (${lib}).apply(null, arguments)}\n\n    imageCompression.getDataUrlFromFile = ${lib.getDataUrlFromFile}\n    imageCompression.getFilefromDataUrl = ${lib.getFilefromDataUrl}\n    imageCompression.loadImage = ${lib.loadImage}\n    imageCompression.drawImageInCanvas = ${lib.drawImageInCanvas}\n    imageCompression.drawFileInCanvas = ${lib.drawFileInCanvas}\n    imageCompression.canvasToFile = ${lib.canvasToFile}\n    imageCompression.getExifOrientation = ${lib.getExifOrientation}\n    imageCompression.handleMaxWidthOrHeight = ${lib.handleMaxWidthOrHeight}\n    imageCompression.followExifOrientation = ${lib.followExifOrientation}\n    imageCompression.cleanupCanvasMemory = ${lib.cleanupCanvasMemory}\n    imageCompression.isAutoOrientationInBrowser = ${lib.isAutoOrientationInBrowser}\n\n    // functions / objects\n    getDataUrlFromFile = imageCompression.getDataUrlFromFile\n    getFilefromDataUrl = imageCompression.getFilefromDataUrl\n    loadImage = imageCompression.loadImage\n    drawImageInCanvas = imageCompression.drawImageInCanvas\n    drawFileInCanvas = imageCompression.drawFileInCanvas\n    canvasToFile = imageCompression.canvasToFile\n    getExifOrientation = imageCompression.getExifOrientation\n    handleMaxWidthOrHeight = imageCompression.handleMaxWidthOrHeight\n    followExifOrientation = imageCompression.followExifOrientation\n    cleanupCanvasMemory = imageCompression.cleanupCanvasMemory\n    isAutoOrientationInBrowser = imageCompression.isAutoOrientationInBrowser\n    \n    getNewCanvasAndCtx = ${getNewCanvasAndCtx}\n    CustomFileReader = FileReader\n    CustomFile = File\n    function _slicedToArray(arr, n) { return arr }\n    function _typeof(a) { return typeof a }\n    function compress (){return (${compress}).apply(null, arguments)}\n\n    // Libraries\n    const parse = ${parse}\n    const UPNG = {}\n    UPNG.toRGBA8 = ${UPNG.toRGBA8}\n    UPNG.toRGBA8.decodeImage = ${UPNG.toRGBA8.decodeImage}\n    UPNG.decode = ${UPNG.decode}\n    UPNG.decode._decompress = ${UPNG.decode._decompress}\n    UPNG.decode._inflate = ${UPNG.decode._inflate}\n    UPNG.decode._readInterlace = ${UPNG.decode._readInterlace}\n    UPNG.decode._getBPP = ${UPNG.decode._getBPP} \n    UPNG.decode._filterZero = ${UPNG.decode._filterZero}\n    UPNG.decode._paeth = ${UPNG.decode._paeth}\n    UPNG.decode._IHDR = ${UPNG.decode._IHDR}\n    UPNG._bin = parse(${stringify(UPNG._bin)})\n    UPNG._copyTile = ${UPNG._copyTile}\n    UPNG.encode = ${UPNG.encode}\n    UPNG.encodeLL = ${UPNG.encodeLL} \n    UPNG.encode._main = ${UPNG.encode._main}\n    UPNG.encode.compressPNG = ${UPNG.encode.compressPNG} \n    UPNG.encode.compress = ${UPNG.encode.compress}\n    UPNG.encode.framize = ${UPNG.encode.framize} \n    UPNG.encode._updateFrame = ${UPNG.encode._updateFrame} \n    UPNG.encode._prepareDiff = ${UPNG.encode._prepareDiff} \n    UPNG.encode._filterZero = ${UPNG.encode._filterZero} \n    UPNG.encode._filterLine = ${UPNG.encode._filterLine}\n    UPNG.encode.concatRGBA = ${UPNG.encode.concatRGBA}\n    UPNG.crc = parse(${stringify(UPNG.crc)})\n    UPNG.crc.table = ( function() {\n    var tab = new Uint32Array(256);\n    for (var n=0; n<256; n++) {\n      var c = n;\n      for (var k=0; k<8; k++) {\n        if (c & 1)  c = 0xedb88320 ^ (c >>> 1);\n        else        c = c >>> 1;\n      }\n      tab[n] = c;  }\n    return tab;  })()\n    UPNG.quantize = ${UPNG.quantize} \n    UPNG.quantize.getKDtree = ${UPNG.quantize.getKDtree} \n    UPNG.quantize.getNearest = ${UPNG.quantize.getNearest} \n    UPNG.quantize.planeDst = ${UPNG.quantize.planeDst} \n    UPNG.quantize.dist = ${UPNG.quantize.dist}     \n    UPNG.quantize.splitPixels = ${UPNG.quantize.splitPixels} \n    UPNG.quantize.vecDot = ${UPNG.quantize.vecDot} \n    UPNG.quantize.stats = ${UPNG.quantize.stats} \n    UPNG.quantize.estats = ${UPNG.quantize.estats}\n    UPNG.M4 = parse(${stringify(UPNG.M4)})\n    UPNG.encode.concatRGBA = ${UPNG.encode.concatRGBA}\n    UPNG.inflateRaw=function(){\n    var H={};H.H={};H.H.N=function(N,W){var R=Uint8Array,i=0,m=0,J=0,h=0,Q=0,X=0,u=0,w=0,d=0,v,C;\n      if(N[0]==3&&N[1]==0)return W?W:new R(0);var V=H.H,n=V.b,A=V.e,l=V.R,M=V.n,I=V.A,e=V.Z,b=V.m,Z=W==null;\n      if(Z)W=new R(N.length>>>2<<5);while(i==0){i=n(N,d,1);m=n(N,d+1,2);d+=3;if(m==0){if((d&7)!=0)d+=8-(d&7);\n        var D=(d>>>3)+4,q=N[D-4]|N[D-3]<<8;if(Z)W=H.H.W(W,w+q);W.set(new R(N.buffer,N.byteOffset+D,q),w);d=D+q<<3;\n        w+=q;continue}if(Z)W=H.H.W(W,w+(1<<17));if(m==1){v=b.J;C=b.h;X=(1<<9)-1;u=(1<<5)-1}if(m==2){J=A(N,d,5)+257;\n        h=A(N,d+5,5)+1;Q=A(N,d+10,4)+4;d+=14;var E=d,j=1;for(var c=0;c<38;c+=2){b.Q[c]=0;b.Q[c+1]=0}for(var c=0;\n                                                                                                        c<Q;c++){var K=A(N,d+c*3,3);b.Q[(b.X[c]<<1)+1]=K;if(K>j)j=K}d+=3*Q;M(b.Q,j);I(b.Q,j,b.u);v=b.w;C=b.d;\n        d=l(b.u,(1<<j)-1,J+h,N,d,b.v);var r=V.V(b.v,0,J,b.C);X=(1<<r)-1;var S=V.V(b.v,J,h,b.D);u=(1<<S)-1;M(b.C,r);\n        I(b.C,r,v);M(b.D,S);I(b.D,S,C)}while(!0){var T=v[e(N,d)&X];d+=T&15;var p=T>>>4;if(p>>>8==0){W[w++]=p}else if(p==256){break}else{var z=w+p-254;\n        if(p>264){var _=b.q[p-257];z=w+(_>>>3)+A(N,d,_&7);d+=_&7}var $=C[e(N,d)&u];d+=$&15;var s=$>>>4,Y=b.c[s],a=(Y>>>4)+n(N,d,Y&15);\n        d+=Y&15;while(w<z){W[w]=W[w++-a];W[w]=W[w++-a];W[w]=W[w++-a];W[w]=W[w++-a]}w=z}}}return W.length==w?W:W.slice(0,w)};\n      H.H.W=function(N,W){var R=N.length;if(W<=R)return N;var V=new Uint8Array(R<<1);V.set(N,0);return V};\n      H.H.R=function(N,W,R,V,n,A){var l=H.H.e,M=H.H.Z,I=0;while(I<R){var e=N[M(V,n)&W];n+=e&15;var b=e>>>4;\n        if(b<=15){A[I]=b;I++}else{var Z=0,m=0;if(b==16){m=3+l(V,n,2);n+=2;Z=A[I-1]}else if(b==17){m=3+l(V,n,3);\n          n+=3}else if(b==18){m=11+l(V,n,7);n+=7}var J=I+m;while(I<J){A[I]=Z;I++}}}return n};H.H.V=function(N,W,R,V){var n=0,A=0,l=V.length>>>1;\n        while(A<R){var M=N[A+W];V[A<<1]=0;V[(A<<1)+1]=M;if(M>n)n=M;A++}while(A<l){V[A<<1]=0;V[(A<<1)+1]=0;A++}return n};\n      H.H.n=function(N,W){var R=H.H.m,V=N.length,n,A,l,M,I,e=R.j;for(var M=0;M<=W;M++)e[M]=0;for(M=1;M<V;M+=2)e[N[M]]++;\n        var b=R.K;n=0;e[0]=0;for(A=1;A<=W;A++){n=n+e[A-1]<<1;b[A]=n}for(l=0;l<V;l+=2){I=N[l+1];if(I!=0){N[l]=b[I];\n          b[I]++}}};H.H.A=function(N,W,R){var V=N.length,n=H.H.m,A=n.r;for(var l=0;l<V;l+=2)if(N[l+1]!=0){var M=l>>1,I=N[l+1],e=M<<4|I,b=W-I,Z=N[l]<<b,m=Z+(1<<b);\n        while(Z!=m){var J=A[Z]>>>15-W;R[J]=e;Z++}}};H.H.l=function(N,W){var R=H.H.m.r,V=15-W;for(var n=0;n<N.length;\n                                                                                                 n+=2){var A=N[n]<<W-N[n+1];N[n]=R[A]>>>V}};H.H.M=function(N,W,R){R=R<<(W&7);var V=W>>>3;N[V]|=R;N[V+1]|=R>>>8};\n      H.H.I=function(N,W,R){R=R<<(W&7);var V=W>>>3;N[V]|=R;N[V+1]|=R>>>8;N[V+2]|=R>>>16};H.H.e=function(N,W,R){return(N[W>>>3]|N[(W>>>3)+1]<<8)>>>(W&7)&(1<<R)-1};\n      H.H.b=function(N,W,R){return(N[W>>>3]|N[(W>>>3)+1]<<8|N[(W>>>3)+2]<<16)>>>(W&7)&(1<<R)-1};H.H.Z=function(N,W){return(N[W>>>3]|N[(W>>>3)+1]<<8|N[(W>>>3)+2]<<16)>>>(W&7)};\n      H.H.i=function(N,W){return(N[W>>>3]|N[(W>>>3)+1]<<8|N[(W>>>3)+2]<<16|N[(W>>>3)+3]<<24)>>>(W&7)};H.H.m=function(){var N=Uint16Array,W=Uint32Array;\n        return{K:new N(16),j:new N(16),X:[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],S:[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,999,999,999],T:[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0,0],q:new N(32),p:[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,65535,65535],z:[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,0,0],c:new W(32),J:new N(512),_:[],h:new N(32),$:[],w:new N(32768),C:[],v:[],d:new N(32768),D:[],u:new N(512),Q:[],r:new N(1<<15),s:new W(286),Y:new W(30),a:new W(19),t:new W(15e3),k:new N(1<<16),g:new N(1<<15)}}();\n      (function(){var N=H.H.m,W=1<<15;for(var R=0;R<W;R++){var V=R;V=(V&2863311530)>>>1|(V&1431655765)<<1;\n        V=(V&3435973836)>>>2|(V&858993459)<<2;V=(V&4042322160)>>>4|(V&252645135)<<4;V=(V&4278255360)>>>8|(V&16711935)<<8;\n        N.r[R]=(V>>>16|V<<16)>>>17}function n(A,l,M){while(l--!=0)A.push(0,M)}for(var R=0;R<32;R++){N.q[R]=N.S[R]<<3|N.T[R];\n        N.c[R]=N.p[R]<<4|N.z[R]}n(N._,144,8);n(N._,255-143,9);n(N._,279-255,7);n(N._,287-279,8);H.H.n(N._,9);\n        H.H.A(N._,9,N.J);H.H.l(N._,9);n(N.$,32,5);H.H.n(N.$,5);H.H.A(N.$,5,N.h);H.H.l(N.$,5);n(N.Q,19,0);n(N.C,286,0);\n        n(N.D,30,0);n(N.v,320,0)}());return H.H.N}()\n    \n    const UZIP = {}\n    UZIP[\"parse\"] = ${UZIP[\"parse\"]}\n    UZIP._readLocal = ${UZIP._readLocal}\n    UZIP.inflateRaw = ${UZIP.inflateRaw}\n    UZIP.inflate = ${UZIP.inflate}\n    UZIP.deflate = ${UZIP.deflate}\n    UZIP.deflateRaw = ${UZIP.deflateRaw}\n    UZIP.encode = ${UZIP.encode}\n    UZIP._noNeed = ${UZIP._noNeed}\n    UZIP._writeHeader = ${UZIP._writeHeader}\n    UZIP.crc = parse(${stringify(UZIP.crc)})\n    UZIP.crc.table = ( function() {\n      var tab = new Uint32Array(256);\n      for (var n=0; n<256; n++) {\n        var c = n;\n        for (var k=0; k<8; k++) {\n          if (c & 1)  c = 0xedb88320 ^ (c >>> 1);\n          else        c = c >>> 1;\n        }\n        tab[n] = c;  }\n      return tab;  })()\n    \n    UZIP.adler = ${UZIP.adler}\n    UZIP.bin = parse(${stringify(UZIP.bin)})\n    UZIP.F = {}\n    UZIP.F.deflateRaw = ${UZIP.F.deflateRaw}\n    UZIP.F._bestMatch = ${UZIP.F._bestMatch}\n    UZIP.F._howLong = ${UZIP.F._howLong}\n    UZIP.F._hash = ${UZIP.F._hash}\n    UZIP.saved = ${UZIP.saved}\n    UZIP.F._writeBlock = ${UZIP.F._writeBlock}\n    UZIP.F._copyExact = ${UZIP.F._copyExact}\n    UZIP.F.getTrees = ${UZIP.F.getTrees}\n    UZIP.F.getSecond = ${UZIP.F.getSecond}\n    UZIP.F.nonZero = ${UZIP.F.nonZero}\n    UZIP.F.contSize = ${UZIP.F.contSize}\n    UZIP.F._codeTiny = ${UZIP.F._codeTiny} \n    UZIP.F._lenCodes = ${UZIP.F._lenCodes} \n    UZIP.F._hufTree = ${UZIP.F._hufTree} \n    UZIP.F.setDepth = ${UZIP.F.setDepth} \n    UZIP.F.restrictDepth = ${UZIP.F.restrictDepth}\n    UZIP.F._goodIndex = ${UZIP.F._goodIndex} \n    UZIP.F._writeLit = ${UZIP.F._writeLit} \n    UZIP.F.inflate = ${UZIP.F.inflate} \n    UZIP.F._check = ${UZIP.F._check} \n    UZIP.F._decodeTiny = ${UZIP.F._decodeTiny} \n    UZIP.F._copyOut = ${UZIP.F._copyOut} \n    UZIP.F.makeCodes = ${UZIP.F.makeCodes} \n    UZIP.F.codes2map = ${UZIP.F.codes2map} \n    UZIP.F.revCodes = ${UZIP.F.revCodes} \n\n    // used only in deflate\n    UZIP.F._putsE = ${UZIP.F._putsE}\n    UZIP.F._putsF = ${UZIP.F._putsF}\n  \n    UZIP.F._bitsE = ${UZIP.F._bitsE}\n    UZIP.F._bitsF = ${UZIP.F._bitsF}\n\n    UZIP.F._get17 = ${UZIP.F._get17}\n    UZIP.F._get25 = ${UZIP.F._get25}\n    UZIP.F.U = function(){\n      var u16=Uint16Array, u32=Uint32Array;\n      return {\n        next_code : new u16(16),\n        bl_count  : new u16(16),\n        ordr : [ 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 ],\n        of0  : [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,999,999,999],\n        exb  : [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,  0,  0,  0],\n        ldef : new u16(32),\n        df0  : [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, 65535, 65535],\n        dxb  : [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,     0,     0],\n        ddef : new u32(32),\n        flmap: new u16(  512),  fltree: [],\n        fdmap: new u16(   32),  fdtree: [],\n        lmap : new u16(32768),  ltree : [],  ttree:[],\n        dmap : new u16(32768),  dtree : [],\n        imap : new u16(  512),  itree : [],\n        //rev9 : new u16(  512)\n        rev15: new u16(1<<15),\n        lhst : new u32(286), dhst : new u32( 30), ihst : new u32(19),\n        lits : new u32(15000),\n        strt : new u16(1<<16),\n        prev : new u16(1<<15)\n      };\n    } ();\n\n    (function(){\n      var U = UZIP.F.U;\n      var len = 1<<15;\n      for(var i=0; i<len; i++) {\n        var x = i;\n        x = (((x & 0xaaaaaaaa) >>> 1) | ((x & 0x55555555) << 1));\n        x = (((x & 0xcccccccc) >>> 2) | ((x & 0x33333333) << 2));\n        x = (((x & 0xf0f0f0f0) >>> 4) | ((x & 0x0f0f0f0f) << 4));\n        x = (((x & 0xff00ff00) >>> 8) | ((x & 0x00ff00ff) << 8));\n        U.rev15[i] = (((x >>> 16) | (x << 16)))>>>17;\n      }\n  \n      function pushV(tgt, n, sv) {  while(n--!=0) tgt.push(0,sv);  }\n  \n      for(var i=0; i<32; i++) {  U.ldef[i]=(U.of0[i]<<3)|U.exb[i];  U.ddef[i]=(U.df0[i]<<4)|U.dxb[i];  }\n  \n      pushV(U.fltree, 144, 8);  pushV(U.fltree, 255-143, 9);  pushV(U.fltree, 279-255, 7);  pushV(U.fltree,287-279,8);\n      /*\n        var i = 0;\n        for(; i<=143; i++) U.fltree.push(0,8);\n        for(; i<=255; i++) U.fltree.push(0,9);\n        for(; i<=279; i++) U.fltree.push(0,7);\n        for(; i<=287; i++) U.fltree.push(0,8);\n        */\n      UZIP.F.makeCodes(U.fltree, 9);\n      UZIP.F.codes2map(U.fltree, 9, U.flmap);\n      UZIP.F.revCodes (U.fltree, 9)\n  \n      pushV(U.fdtree,32,5);\n      //for(i=0;i<32; i++) U.fdtree.push(0,5);\n      UZIP.F.makeCodes(U.fdtree, 5);\n      UZIP.F.codes2map(U.fdtree, 5, U.fdmap);\n      UZIP.F.revCodes (U.fdtree, 5)\n  \n      pushV(U.itree,19,0);  pushV(U.ltree,286,0);  pushV(U.dtree,30,0);  pushV(U.ttree,320,0);\n      /*\n        for(var i=0; i< 19; i++) U.itree.push(0,0);\n        for(var i=0; i<286; i++) U.ltree.push(0,0);\n        for(var i=0; i< 30; i++) U.dtree.push(0,0);\n        for(var i=0; i<320; i++) U.ttree.push(0,0);\n        */\n    })()\n    `)\n}\n\nfunction generateWorkerScriptForMultipleFiles() {\n  // code to be run in the WebWorker\n  return createWorker(`\n    let scriptImported = false\n    self.addEventListener('message', async (e) => {\n      const { data = [], imageCompressionLibUrl } = e.data\n      try {\n        if (!scriptImported) {\n          self.importScripts(imageCompressionLibUrl)\n          scriptImported = true\n        }\n        let compressedFiles = await Promise.allSettled(data.map(({id, file, options}) => {\n          options.onProgress = (progress) => self.postMessage({ progress, id })\n          return imageCompression(file, options);\n        }))\n        compressedFiles = compressedFiles.map(data => data.value)\n        self.postMessage({ compressedFiles })\n      } catch (e) {\n        self.postMessage({ error: e.message + '\\\\n' + e.stack })\n      }\n    })\n  `)\n}\n\nexport function compressFilesOnWebWorker(data) {\n  return new Promise(async (resolve, reject) => {\n\n    if (!imageCompressionLibUrl) {\n      imageCompressionLibUrl = generateLib()\n    }\n\n    if (!worker) {\n      worker = generateWorkerScriptForMultipleFiles()\n    }\n\n    function handler(e) {\n      if (e.data.progress !== undefined) {\n        const task = data.filter(({id}) => id === e.data.id)\n        return task.onProgress(e.data.progress)\n      }\n      worker.removeEventListener('message', handler)\n      if (e.data.error) {\n        reject(new Error(e.data.error))\n      }\n      resolve(e.data.compressedFiles)\n    }\n\n    worker.addEventListener('message', handler)\n    worker.addEventListener('error', reject)\n\n    worker.postMessage({\n      data,\n      imageCompressionLibUrl,\n    })\n  })\n}\n","import {\n  canvasToFile,\n  cleanupCanvasMemory,\n  drawFileInCanvas,\n  followExifOrientation,\n  getExifOrientation,\n  getNewCanvasAndCtx,\n  handleMaxWidthOrHeight,\n  isAutoOrientationInBrowser\n} from './utils'\n\n/**\n * Compress an image file.\n *\n * @param {File} file\n * @param {Object} options\n * @param {number} [options.maxSizeMB=Number.POSITIVE_INFINITY]\n * @param {number} [options.maxWidthOrHeight=undefined]\n * @param {boolean} [options.useWebWorker=false]\n * @param {number} [options.maxIteration=10]\n * @param {number} [options.exifOrientation] - default to be the exif orientation from the image file\n * @param {Function} [options.onProgress] - a function takes one progress argument (progress from 0 to 100)\n * @param {string} [options.fileType] - default to be the original mime type from the image file\n * @param {number} [options.initialQuality=1.0]\n * @param {number} previousProgress - for internal try catch rerunning start from previous progress\n * @returns {Promise<File | Blob>}\n */\nexport default async function compress (file, options, previousProgress = 0) {\n  let progress = previousProgress\n\n  function incProgress (inc = 5) {\n    progress += inc\n    options.onProgress(Math.min(progress, 100))\n  }\n\n  function setProgress (p) {\n    progress = Math.min(Math.max(p, progress), 100)\n    options.onProgress(progress)\n  }\n\n  let remainingTrials = options.maxIteration || 10\n\n  const maxSizeByte = options.maxSizeMB * 1024 * 1024\n\n  incProgress()\n\n  // drawFileInCanvas\n  let [img, origCanvas] = await drawFileInCanvas(file)\n\n  incProgress()\n\n  // handleMaxWidthOrHeight\n  const maxWidthOrHeightFixedCanvas = handleMaxWidthOrHeight(origCanvas, options)\n\n  incProgress()\n\n  // exifOrientation\n  const exifOrientation = options.exifOrientation || await getExifOrientation(file)\n  incProgress()\n  const orientationFixedCanvas = (await isAutoOrientationInBrowser()) ? maxWidthOrHeightFixedCanvas : followExifOrientation(maxWidthOrHeightFixedCanvas, exifOrientation)\n  incProgress()\n\n  let quality = options.initialQuality || 1.0\n\n  const outputFileType = options.fileType || file.type\n\n  let tempFile = await canvasToFile(orientationFixedCanvas, outputFileType, file.name, file.lastModified, quality)\n  incProgress()\n\n  const origExceedMaxSize = tempFile.size > maxSizeByte\n  const sizeBecomeLarger = tempFile.size > file.size\n  // console.log('original file size', file.size)\n  // console.log('current file size', tempFile.size)\n\n  // check if we need to compress or resize\n  if (!origExceedMaxSize && !sizeBecomeLarger) {\n    // no need to compress\n    setProgress(100)\n    return tempFile\n  }\n\n  const sourceSize = file.size\n  const renderedSize = tempFile.size\n  let currentSize = renderedSize\n  let compressedFile\n  let newCanvas, ctx\n  let canvas = orientationFixedCanvas\n  while (remainingTrials-- && (currentSize > maxSizeByte || currentSize > sourceSize)) {\n    const newWidth = origExceedMaxSize ? canvas.width * 0.95 : canvas.width\n    const newHeight = origExceedMaxSize ? canvas.height * 0.95 : canvas.height;\n    // console.log('current width', newWidth);\n    // console.log('current height', newHeight);\n    [newCanvas, ctx] = getNewCanvasAndCtx(newWidth, newHeight)\n\n    ctx.drawImage(canvas, 0, 0, newWidth, newHeight)\n\n    quality *= 0.95\n    compressedFile = await canvasToFile(newCanvas, outputFileType, file.name, file.lastModified, quality)\n\n    cleanupCanvasMemory(canvas)\n\n    canvas = newCanvas\n\n    currentSize = compressedFile.size\n    // console.log('currentSize', currentSize)\n    setProgress(Math.min(99, Math.floor((renderedSize - currentSize) / (renderedSize - maxSizeByte) * 100)))\n  }\n\n  cleanupCanvasMemory(canvas)\n  cleanupCanvasMemory(newCanvas)\n  cleanupCanvasMemory(maxWidthOrHeightFixedCanvas)\n  cleanupCanvasMemory(orientationFixedCanvas)\n  cleanupCanvasMemory(origCanvas)\n\n  setProgress(100)\n  return compressedFile\n}\n"],"names":["UZIP","Uint8Array","eocd","rUi","cnu","csize","o","data","i","out","readUshort","cmpr","nlen","elen","file","inflate","inflateRaw","opts","buf","F","deflateRaw","crc","off","encode","noCmpr","wUi","obj","p","cpr","tot","ioff","t","usize","tab","k","c","table","b","end","eend","a","buff","l","s","strl","str","charCodeAt","code","ci","lvl","U","len","dlen","strt","prev","lc","_hash","cvrd","Math","min","lgi","lits","li","dst","dgi","pos","pi","dif","dlim","_howLong","td","j","ei","curd","length","MD","putsF","_putsF","BTYPE","_copyExact","o0","ltree","fltree","putsE","itree","qc","si","_writeLit","p8","_hufTree","ihst","dset","numh","ML","MH","numl","tree","set","nxt","nnxt","lz","MAXL","hst","tl","hl","list","push","l2","lit","i2","f","i0","d","restrictDepth","maxl","dps","dbt","_goodIndex","ch","u8","_bitsF","bitsE","noBuf","HLIT","_check","ordr","dmap","mx0","dtree","dlit","dcode","dbs","nbuf","lmap","_bitsE","n","mx","max_code","bl_count","MAX_BITS","next_code","rest","i1","r15","val","_putsE","dt","u16","x","tgt","sv","fdmap","pushV","h","w","img","frames","frm","rect","fw","fdata","blend","UPNG","_copyTile","frms","dispose","decode","_getBPP","ceil","ctype","qarea","area","ti","tr","ts","tb","y","s0","bpl","t0","qi","gr","to","type","dd","fr","_decompress","delay","fd","bin","readUint","tabs","offset","nz","slice","bfr","text","readUTF8","rUs","interlace","N","H","W","X","Q","v","M","S","I","_","A","q","D","R","V","Z","m","J","K","ri","pass","sh","sw","bpp","starting_row","starting_col","cdi","col","row","ii","depth","pa","pb","pc","_bin","ns","decodeURIComponent","sb","tw","oa","br","ioa","fg","bg","fa","nimg","bufs","dl","leng","cimg","plte","anim","width","wUs","_filterZero","prms","evenCrd","ilen","inds","nbufs","abuf","concatRGBA","cof","qres","img32","nw","cmc","alwaysBlend","it","mix","max","miy","may","sarea","tarea","nx","nh","ny","_prepareDiff","r","miX","miY","height","_updateFrame","cimg32","cy","ftry","fls","di","g","nd","planeDst","est","rgba","bst","root","ps","maxL","leafs","err","node","L","ln","quantize","estats","rn","left","mi","node1","getNearest","vecDot","e","m1","m2","m0","iN","M4","random","m3","Cov","sml","il","isBrowser","imageCompressionLibUrl","Date","now","result","reader","onerror","getFilefromDataUrl","resolve","dataUrl","split","arr","match","bstr","name","getImageData","fileName","tags","view","getUint16","little","canvas","maxWidthOrHeight","ctx","drawImage","newCanvas","getContext","drawFileInCanvas","script","parse","value","replace","createSourceObject"],"mappings":"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"}