p;){if(0===b)return n.bitb=w,n.bitk=p,e.avail_in=b,e.total_in+=g-e.next_in_index,e.next_in_index=g,n.write=x,n.inflate_flush(e,t);t=0,b--,w|=(255&e.read_byte(g++))<>>1){case 0:w>>>=3,p-=3,d=7&p,w>>>=d,p-=d,r=1;break;case 1:k=[],v=[],R=[[]],E=[[]],j.inflate_trees_fixed(k,v,R,E),f.init(k[0],v[0],R[0],0,E[0],0),w>>>=3,p-=3,r=6;break;case 2:w>>>=3,p-=3,r=3;break;case 3:return w>>>=3,p-=3,r=9,e.msg="invalid block type",t=H,n.bitb=w,n.bitk=p,e.avail_in=b,e.total_in+=g-e.next_in_index,e.next_in_index=g,n.write=x,n.inflate_flush(e,t)}break;case 1:for(;32>p;){if(0===b)return n.bitb=w,n.bitk=p,e.avail_in=b,e.total_in+=g-e.next_in_index,e.next_in_index=g,n.write=x,n.inflate_flush(e,t);t=0,b--,w|=(255&e.read_byte(g++))<
>>16&65535)!=(65535&w))return r=9,e.msg="invalid stored block lengths",t=H,n.bitb=w,n.bitk=p,e.avail_in=b,e.total_in+=g-e.next_in_index,e.next_in_index=g,n.write=x,n.inflate_flush(e,t);a=65535&w,w=p=0,r=0!==a?2:0!==u?7:0;break;case 2:if(0===b)return n.bitb=w,n.bitk=p,e.avail_in=b,e.total_in+=g-e.next_in_index,e.next_in_index=g,n.write=x,n.inflate_flush(e,t);if(0===y&&(x==n.end&&0!==n.read&&(x=0,y=xb&&(d=b),d>y&&(d=y),n.win.set(e.read_buf(g,d),x),g+=d,b-=d,x+=d,y-=d,0!=(a-=d))break;r=0!==u?7:0;break;case 3:for(;14>p;){if(0===b)return n.bitb=w,n.bitk=p,e.avail_in=b,e.total_in+=g-e.next_in_index,e.next_in_index=g,n.write=x,n.inflate_flush(e,t);t=0,b--,w|=(255&e.read_byte(g++))<29||(d>>5&31)>29)return r=9,e.msg="too many length or distance symbols",t=H,n.bitb=w,n.bitk=p,e.avail_in=b,e.total_in+=g-e.next_in_index,e.next_in_index=g,n.write=x,n.inflate_flush(e,t);if(d=258+(31&d)+(d>>5&31),!i||i.lengthm;m++)i[m]=0;w>>>=14,p-=14,o=0,r=4;case 4:for(;4+(s>>>10)>o;){for(;3>p;){if(0===b)return n.bitb=w,n.bitk=p,e.avail_in=b,e.total_in+=g-e.next_in_index,e.next_in_index=g,n.write=x,n.inflate_flush(e,t);t=0,b--,w|=(255&e.read_byte(g++))<>>=3,p-=3}for(;19>o;)i[J[o++]]=0;if(l[0]=7,d=_.inflate_trees_bits(i,l,c,h,e),0!=d)return(t=d)==H&&(i=null,r=9),n.bitb=w,n.bitk=p,e.avail_in=b,e.total_in+=g-e.next_in_index,e.next_in_index=g,n.write=x,n.inflate_flush(e,t);o=0,r=5;case 5:for(;d=s,258+(31&d)+(d>>5&31)>o;){let a,f;for(d=l[0];d>p;){if(0===b)return n.bitb=w,n.bitk=p,e.avail_in=b,e.total_in+=g-e.next_in_index,e.next_in_index=g,n.write=x,n.inflate_flush(e,t);t=0,b--,w|=(255&e.read_byte(g++))<
f)w>>>=d,p-=d,i[o++]=f;else{for(m=18==f?7:f-14,a=18==f?11:3;d+m>p;){if(0===b)return n.bitb=w,n.bitk=p,e.avail_in=b,e.total_in+=g-e.next_in_index,e.next_in_index=g,n.write=x,n.inflate_flush(e,t);t=0,b--,w|=(255&e.read_byte(g++))<
>>=d,p-=d,a+=w&P[m],w>>>=m,p-=m,m=o,d=s,m+a>258+(31&d)+(d>>5&31)||16==f&&1>m)return i=null,r=9,e.msg="invalid bit length repeat",t=H,n.bitb=w,n.bitk=p,e.avail_in=b,e.total_in+=g-e.next_in_index,e.next_in_index=g,n.write=x,n.inflate_flush(e,t);f=16==f?i[m-1]:0;do{i[m++]=f}while(0!=--a);o=m}}if(c[0]=-1,D=[],A=[],F=[],S=[],D[0]=9,A[0]=6,d=s,d=_.inflate_trees_dynamic(257+(31&d),1+(d>>5&31),i,D,A,F,S,h,e),0!=d)return d==H&&(i=null,r=9),t=d,n.bitb=w,n.bitk=p,e.avail_in=b,e.total_in+=g-e.next_in_index,e.next_in_index=g,n.write=x,n.inflate_flush(e,t);f.init(D[0],A[0],h,F[0],h,S[0]),r=6;case 6:if(n.bitb=w,n.bitk=p,e.avail_in=b,e.total_in+=g-e.next_in_index,e.next_in_index=g,n.write=x,1!=(t=f.proc(n,e,t)))return n.inflate_flush(e,t);if(t=0,f.free(e),g=e.next_in_index,b=e.avail_in,w=n.bitb,p=n.bitk,x=n.write,y=x{n.reset(e,null),n.win=null,h=null},n.set_dictionary=(e,t,i)=>{n.win.set(e.subarray(t,t+i),0),n.read=n.write=i},n.sync_point=()=>1==r?1:0}const $=13,ee=[0,0,255,255];function te(){const e=this;function t(e){return e&&e.istate?(e.total_in=e.total_out=0,e.msg=null,e.istate.mode=7,e.istate.blocks.reset(e,null),0):N}e.mode=0,e.method=0,e.was=[0],e.need=0,e.marker=0,e.wbits=0,e.inflateEnd=t=>(e.blocks&&e.blocks.free(t),e.blocks=null,0),e.inflateInit=(n,i)=>(n.msg=null,e.blocks=null,8>i||i>15?(e.inflateEnd(n),N):(e.wbits=i,n.istate.blocks=new Q(n,1<{let n,i;if(!e||!e.istate||!e.next_in)return N;const r=e.istate;for(t=4==t?O:0,n=O;;)switch(r.mode){case 0:if(0===e.avail_in)return n;if(n=t,e.avail_in--,e.total_in++,8!=(15&(r.method=e.read_byte(e.next_in_index++)))){r.mode=$,e.msg="unknown compression method",r.marker=5;break}if(8+(r.method>>4)>r.wbits){r.mode=$,e.msg="invalid win size",r.marker=5;break}r.mode=1;case 1:if(0===e.avail_in)return n;if(n=t,e.avail_in--,e.total_in++,i=255&e.read_byte(e.next_in_index++),((r.method<<8)+i)%31!=0){r.mode=$,e.msg="incorrect header check",r.marker=5;break}if(0==(32&i)){r.mode=7;break}r.mode=2;case 2:if(0===e.avail_in)return n;n=t,e.avail_in--,e.total_in++,r.need=(255&e.read_byte(e.next_in_index++))<<24&4278190080,r.mode=3;case 3:if(0===e.avail_in)return n;n=t,e.avail_in--,e.total_in++,r.need+=(255&e.read_byte(e.next_in_index++))<<16&16711680,r.mode=4;case 4:if(0===e.avail_in)return n;n=t,e.avail_in--,e.total_in++,r.need+=(255&e.read_byte(e.next_in_index++))<<8&65280,r.mode=5;case 5:return 0===e.avail_in?n:(n=t,e.avail_in--,e.total_in++,r.need+=255&e.read_byte(e.next_in_index++),r.mode=6,2);case 6:return r.mode=$,e.msg="need dictionary",r.marker=0,N;case 7:if(n=r.blocks.proc(e,n),n==H){r.mode=$,r.marker=0;break}if(0==n&&(n=t),1!=n)return n;n=t,r.blocks.reset(e,r.was),r.mode=12;case 12:return e.avail_in=0,1;case $:return H;default:return N}},e.inflateSetDictionary=(e,t,n)=>{let i=0,r=n;if(!e||!e.istate||6!=e.istate.mode)return N;const a=e.istate;return r<1<{let n,i,r,a,s;if(!e||!e.istate)return N;const o=e.istate;if(o.mode!=$&&(o.mode=$,o.marker=0),0===(n=e.avail_in))return O;for(i=e.next_in_index,r=o.marker;0!==n&&4>r;)e.read_byte(i)==ee[r]?r++:r=0!==e.read_byte(i)?0:4-r,i++,n--;return e.total_in+=i-e.next_in_index,e.next_in_index=i,e.avail_in=n,o.marker=r,4!=r?H:(a=e.total_in,s=e.total_out,t(e),e.total_in=a,e.total_out=s,o.mode=7,0)},e.inflateSyncPoint=e=>e&&e.istate&&e.istate.blocks?e.istate.blocks.sync_point():N}function ne(){}ne.prototype={inflateInit:function(e){const t=this;return t.istate=new te,e||(e=15),t.istate.inflateInit(t,e)},inflate:function(e){const t=this;return t.istate?t.istate.inflate(t,e):N},inflateEnd:function(){const e=this;if(!e.istate)return N;const t=e.istate.inflateEnd(e);return e.istate=null,t},inflateSync:function(){const e=this;return e.istate?e.istate.inflateSync(e):N},inflateSetDictionary:function(e,t){const n=this;return n.istate?n.istate.inflateSetDictionary(n,e,t):N},read_byte:function(e){return this.next_in[e]},read_buf:function(e,t){return this.next_in.subarray(e,e+t)}};const ie={chunkSize:524288,maxWorkers:"undefined"!=typeof navigator&&navigator.hardwareConcurrency||2,terminateWorkerTimeout:5e3,useWebWorkers:!0,workerScripts:void 0},re=n.assign({},ie);function ae(){return re}function se(e){if(void 0!==e.baseURL&&(re.baseURL=e.baseURL),void 0!==e.chunkSize&&(re.chunkSize=e.chunkSize),void 0!==e.maxWorkers&&(re.maxWorkers=e.maxWorkers),void 0!==e.terminateWorkerTimeout&&(re.terminateWorkerTimeout=e.terminateWorkerTimeout),void 0!==e.useWebWorkers&&(re.useWebWorkers=e.useWebWorkers),void 0!==e.Deflate&&(re.Deflate=e.Deflate),void 0!==e.Inflate&&(re.Inflate=e.Inflate),void 0!==e.workerScripts){if(e.workerScripts.deflate){if(!t.isArray(e.workerScripts.deflate))throw new c("workerScripts.deflate must be an array");re.workerScripts||(re.workerScripts={}),re.workerScripts.deflate=e.workerScripts.deflate}if(e.workerScripts.inflate){if(!t.isArray(e.workerScripts.inflate))throw new c("workerScripts.inflate must be an array");re.workerScripts||(re.workerScripts={}),re.workerScripts.inflate=e.workerScripts.inflate}}}const oe=[];for(let e=0;256>e;e++){let t=e;for(let e=0;8>e;e++)1&t?t=t>>>1^3988292384:t>>>=1;oe[e]=t}class le{constructor(e){this.crc=e||-1}append(e){let t=0|this.crc;for(let n=0,i=0|e.length;i>n;n++)t=t>>>8^oe[255&(t^e[n])];this.crc=t}get(){return~this.crc}}function ce(e){if(void 0===p){const t=new d((e=unescape(encodeURIComponent(e))).length);for(let n=0;n0&&t&&(e[n-1]=de.partial(t,e[n-1]&2147483648>>t-1,1)),e},partial:(e,t,n)=>32===e?t:(n?0|t:t<<32-e)+1099511627776*e,getPartial:e=>a.round(e/1099511627776)||32,_shiftRight(e,t,n,i){for(void 0===i&&(i=[]);t>=32;t-=32)i.push(n),n=0;if(0===t)return i.concat(e);for(let r=0;r>>t),n=e[r]<<32-t;const r=e.length?e[e.length-1]:0,a=de.getPartial(r);return i.push(de.partial(t+a&31,t+a>32?n:i.pop(),1)),i}},fe={bytes:{fromBits(e){const t=de.bitLength(e)/8,n=new d(t);let i;for(let r=0;t>r;r++)0==(3&r)&&(i=e[r/4]),n[r]=i>>>24,i<<=8;return n},toBits(e){const t=[];let n,i=0;for(n=0;n9007199254740991)throw new c("Cannot hash more than 2^53 - 1 bits");const a=new u(n);let s=0;for(let e=t.blockSize+i-(t.blockSize+i&t.blockSize-1);r>=e;e+=t.blockSize)t._block(a.subarray(16*s,16*(s+1))),s+=1;return n.splice(0,16*s),t},finalize:function(){const e=this;let t=e._buffer;const n=e._h;t=de.concat(t,[de.partial(1,1)]);for(let e=t.length+2;15&e;e++)t.push(0);for(t.push(a.floor(e._length/4294967296)),t.push(0|e._length);t.length;)e._block(t.splice(0,16));return e.reset(),n},_init:[1732584193,4023233417,2562383102,271733878,3285377520],_key:[1518500249,1859775393,2400959708,3395469782],_f:(e,t,n,i)=>e>19?e>39?e>59?e>79?void 0:t^n^i:t&n|t&i|n&i:t^n^i:t&n|~t&i,_S:(e,t)=>t<>>32-e,_block:function(e){const n=this,i=n._h,r=t(80);for(let t=0;16>t;t++)r[t]=e[t];let s=i[0],o=i[1],l=i[2],c=i[3],d=i[4];for(let e=0;79>=e;e++){16>e||(r[e]=n._S(1,r[e-3]^r[e-8]^r[e-14]^r[e-16]));const t=n._S(5,s)+n._f(e,o,l,c)+d+r[e]+n._key[a.floor(e/20)]|0;d=c,c=l,l=n._S(30,o),o=s,s=t}i[0]=i[0]+s|0,i[1]=i[1]+o|0,i[2]=i[2]+l|0,i[3]=i[3]+c|0,i[4]=i[4]+d|0}};const he={getRandomValues(e){const t=new u(e.buffer),n=e=>{let t=987654321;const n=4294967295;return()=>(t=36969*(65535&t)+(t>>16)&n,(((t<<16)+(e=18e3*(65535&e)+(e>>16)&n)&n)/4294967296+.5)*(a.random()>.5?1:-1))};for(let i,r=0;rnew _e.hmacSha1(fe.bytes.toBits(e)),pbkdf2(e,t,n,i){if(n=n||1e4,0>i||0>n)throw new c("invalid params to pbkdf2");const r=1+(i>>5)<<2;let a,s,o,l,d;const f=new ArrayBuffer(r);let u=new h(f),_=0;const w=de;for(t=fe.bytes.toBits(t),d=1;(r||1)>_;d++){for(a=s=e.encrypt(w.concat(t,[d])),o=1;n>o;o++)for(s=e.encrypt(s),l=0;l_&&or&&(e=n.hash(e));for(let t=0;r>t;t++)i[0][t]=909522486^e[t],i[1][t]=1549556828^e[t];t._baseHash[0].update(i[0]),t._baseHash[1].update(i[1]),t._resultHash=new n(t._baseHash[0])}reset(){const e=this;e._resultHash=new e._hash(e._baseHash[0]),e._updated=!1}update(e){this._updated=!0,this._resultHash.update(e)}digest(){const e=this,t=e._resultHash.finalize(),n=new e._hash(e._baseHash[1]).update(t).finalize();return e.reset(),n}encrypt(e){if(this._updated)throw new c("encrypt on already updated hmac called!");return this.update(e),this.digest(e)}}},we="Invalid pasword",pe=16,ge={name:"PBKDF2"},be=n.assign({hash:{name:"HMAC"}},ge),xe=n.assign({iterations:1e3,hash:{name:"SHA-1"}},ge),ye=["deriveBits"],me=[8,12,16],ke=[16,24,32],ve=10,Re=[0,0,0,0],Ee=void 0!==y,De=Ee&&void 0!==y.subtle,Ae=fe.bytes,Fe=class{constructor(e){const t=this;t._tables=[[[],[],[],[],[]],[[],[],[],[],[]]],t._tables[0][0][0]||t._precompute();const n=t._tables[0][4],i=t._tables[1],r=e.length;let a,s,o,l=1;if(4!==r&&6!==r&&8!==r)throw new c("invalid aes key size");for(t._key=[s=e.slice(0),o=[]],a=r;4*r+28>a;a++){let e=s[a-1];(a%r==0||8===r&&a%r==4)&&(e=n[e>>>24]<<24^n[e>>16&255]<<16^n[e>>8&255]<<8^n[255&e],a%r==0&&(e=e<<8^e>>>24^l<<24,l=l<<1^283*(l>>7))),s[a]=s[a-r]^e}for(let e=0;a;e++,a--){const t=s[3&e?a:a-4];o[e]=4>=a||4>e?t:i[0][n[t>>>24]]^i[1][n[t>>16&255]]^i[2][n[t>>8&255]]^i[3][n[255&t]]}}encrypt(e){return this._crypt(e,0)}decrypt(e){return this._crypt(e,1)}_precompute(){const e=this._tables[0],t=this._tables[1],n=e[4],i=t[4],r=[],a=[];let s,o,l,c;for(let e=0;256>e;e++)a[(r[e]=e<<1^283*(e>>7))^e]=e;for(let d=s=0;!n[d];d^=o||1,s=a[s]||1){let a=s^s<<1^s<<2^s<<3^s<<4;a=a>>8^255&a^99,n[d]=a,i[a]=d,c=r[l=r[o=r[d]]];let f=16843009*c^65537*l^257*o^16843008*d,u=257*r[a]^16843008*a;for(let n=0;4>n;n++)e[n][d]=u=u<<24^u>>>8,t[n][a]=f=f<<24^f>>>8}for(let n=0;5>n;n++)e[n]=e[n].slice(0),t[n]=t[n].slice(0)}_crypt(e,t){if(4!==e.length)throw new c("invalid aes block size");const n=this._key[t],i=n.length/4-2,r=[0,0,0,0],a=this._tables[t],s=a[0],o=a[1],l=a[2],d=a[3],f=a[4];let u,h,_,w=e[0]^n[0],p=e[t?3:1]^n[1],g=e[2]^n[2],b=e[t?1:3]^n[3],x=4;for(let e=0;i>e;e++)u=s[w>>>24]^o[p>>16&255]^l[g>>8&255]^d[255&b]^n[x],h=s[p>>>24]^o[g>>16&255]^l[b>>8&255]^d[255&w]^n[x+1],_=s[g>>>24]^o[b>>16&255]^l[w>>8&255]^d[255&p]^n[x+2],b=s[b>>>24]^o[w>>16&255]^l[p>>8&255]^d[255&g]^n[x+3],x+=4,w=u,p=h,g=_;for(let e=0;4>e;e++)r[t?3&-e:e]=f[w>>>24]<<24^f[p>>16&255]<<16^f[g>>8&255]<<8^f[255&b]^n[x++],u=w,w=p,p=g,g=b,b=u;return r}},Se=class{constructor(e,t){this._prf=e,this._initIv=t,this._iv=t}reset(){this._iv=this._initIv}update(e){return this.calculate(this._prf,e,this._iv)}incWord(e){if(255==(e>>24&255)){let t=e>>16&255,n=e>>8&255,i=255&e;255===t?(t=0,255===n?(n=0,255===i?i=0:++i):++n):++t,e=0,e+=t<<16,e+=n<<8,e+=i}else e+=1<<24;return e}incCounter(e){0===(e[0]=this.incWord(e[0]))&&(e[1]=this.incWord(e[1]))}calculate(e,t,n){let i;if(!(i=t.length))return[];const r=de.bitLength(t);for(let r=0;i>r;r+=4){this.incCounter(n);const i=e.encrypt(n);t[r]^=i[0],t[r+1]^=i[1],t[r+2]^=i[2],t[r+3]^=i[3]}return de.clamp(t,r)}},ze=_e.hmacSha1;class Te{constructor(e,t,i){n.assign(this,{password:e,signed:t,strength:i-1,pendingInput:new d(0)})}async append(e){const n=this;if(n.password){const i=Be(e,0,me[n.strength]+2);await(async(e,t,n)=>{await We(e,n,Be(t,0,me[e.strength]));const i=Be(t,me[e.strength]),r=e.keys.passwordVerification;if(r[0]!=i[0]||r[1]!=i[1])throw new c(we)})(n,i,n.password),n.password=null,n.aesCtrGladman=new Se(new Fe(n.keys.key),t.from(Re)),n.hmac=new ze(n.keys.authentication),e=Be(e,me[n.strength]+2)}return Ce(n,e,new d(e.length-ve-(e.length-ve)%pe),0,ve,!0)}flush(){const e=this,t=e.pendingInput,n=Be(t,0,t.length-ve),i=Be(t,t.length-ve);let r=new d(0);if(n.length){const t=Ae.toBits(n);e.hmac.update(t);const i=e.aesCtrGladman.update(t);r=Ae.fromBits(i)}let a=!0;if(e.signed){const t=Be(Ae.fromBits(e.hmac.digest()),0,ve);for(let e=0;ve>e;e++)t[e]!=i[e]&&(a=!1)}return{valid:a,data:r}}}class Ue{constructor(e,t){n.assign(this,{password:e,strength:t-1,pendingInput:new d(0)})}async append(e){const n=this;let i=new d(0);n.password&&(i=await(async(e,t)=>{const n=(i=new d(me[e.strength]),Ee&&"function"==typeof y.getRandomValues?y.getRandomValues(i):he.getRandomValues(i));var i;return await We(e,t,n),Ie(n,e.keys.passwordVerification)})(n,n.password),n.password=null,n.aesCtrGladman=new Se(new Fe(n.keys.key),t.from(Re)),n.hmac=new ze(n.keys.authentication));const r=new d(i.length+e.length-e.length%pe);return r.set(i,0),Ce(n,e,r,i.length,0)}flush(){const e=this;let t=new d(0);if(e.pendingInput.length){const n=e.aesCtrGladman.update(Ae.toBits(e.pendingInput));e.hmac.update(n),t=Ae.fromBits(n)}const n=Be(Ae.fromBits(e.hmac.digest()),0,ve);return{data:Ie(t,n),signature:n}}}function Ce(e,t,n,i,r,a){const s=t.length-r;let o;for(e.pendingInput.length&&(t=Ie(e.pendingInput,t),n=((e,t)=>{if(t&&t>e.length){const n=e;(e=new d(t)).set(n,0)}return e})(n,s-s%pe)),o=0;s-pe>=o;o+=pe){const r=Ae.toBits(Be(t,o,o+pe));a&&e.hmac.update(r);const s=e.aesCtrGladman.update(r);a||e.hmac.update(s),n.set(Ae.fromBits(s),o+i)}return e.pendingInput=Be(t,o),n}async function We(e,t,i){const r=ce(t),a=await(async(e,t,n,i,r)=>Ee&&De&&"function"==typeof y.subtle.importKey?y.subtle.importKey("raw",t,n,!1,r):_e.importKey(t))(0,r,be,0,ye),s=await(async(e,t,n)=>Ee&&De&&"function"==typeof y.subtle.deriveBits?await y.subtle.deriveBits(e,t,n):_e.pbkdf2(t,e.salt,xe.iterations,n))(n.assign({salt:i},xe),a,8*(2*ke[e.strength]+2)),o=new d(s);e.keys={key:Ae.toBits(Be(o,0,ke[e.strength])),authentication:Ae.toBits(Be(o,ke[e.strength],2*ke[e.strength])),passwordVerification:Be(o,2*ke[e.strength])}}function Ie(e,t){let n=e;return e.length+t.length&&(n=new d(e.length+t.length),n.set(e,0),n.set(t,e.length)),n}function Be(e,t,n){return e.subarray(t,n)}class Le{constructor(e,t){n.assign(this,{password:e,passwordVerification:t}),Oe(this,e)}append(e){const t=this;if(t.password){const n=Ne(t,e.subarray(0,12));if(t.password=null,n[11]!=t.passwordVerification)throw new c(we);e=e.subarray(12)}return Ne(t,e)}flush(){return{valid:!0,data:new d(0)}}}class Me{constructor(e,t){n.assign(this,{password:e,passwordVerification:t}),Oe(this,e)}append(e){const t=this;let n,i;if(t.password){t.password=null;const r=y.getRandomValues(new d(12));r[11]=t.passwordVerification,n=new d(e.length+r.length),n.set(He(t,r),0),i=12}else n=new d(e.length),i=0;return n.set(He(t,e),i),n}flush(){return{data:new d(0)}}}function Ne(e,t){const n=new d(t.length);for(let i=0;i>>24]),e.keys[2]=~e.crcKey2.get()}function Ve(e){const t=2|e.keys[2];return qe(a.imul(t,1^t)>>>8)}function qe(e){return 255&e}function Ze(e){return 4294967295&e}const Ke="deflate",Ge="inflate",Ye="Invalid signature";class je{constructor(e,{signature:t,password:i,signed:r,compressed:a,zipCrypto:s,passwordVerification:o,encryptionStrength:l},{chunkSize:c}){const d=!!i;n.assign(this,{signature:t,encrypted:d,signed:r,compressed:a,inflate:a&&new e({chunkSize:c}),crc32:r&&new le,zipCrypto:s,decrypt:d&&s?new Le(i,o):new Te(i,r,l)})}async append(e){const t=this;return t.encrypted&&e.length&&(e=await t.decrypt.append(e)),t.compressed&&e.length&&(e=await t.inflate.append(e)),(!t.encrypted||t.zipCrypto)&&t.signed&&e.length&&t.crc32.append(e),e}async flush(){const e=this;let t,n=new d(0);if(e.encrypted){const t=e.decrypt.flush();if(!t.valid)throw new c(Ye);n=t.data}if((!e.encrypted||e.zipCrypto)&&e.signed){const n=new h(new d(4).buffer);if(t=e.crc32.get(),n.setUint32(0,t),e.signature!=n.getUint32(0,!1))throw new c(Ye)}return e.compressed&&(n=await e.inflate.append(n)||new d(0),await e.inflate.flush()),{data:n,signature:t}}}class Xe{constructor(e,{encrypted:t,signed:i,compressed:r,level:a,zipCrypto:s,password:o,passwordVerification:l,encryptionStrength:c},{chunkSize:d}){n.assign(this,{encrypted:t,signed:i,compressed:r,deflate:r&&new e({level:a||5,chunkSize:d}),crc32:i&&new le,zipCrypto:s,encrypt:t&&s?new Me(o,l):new Ue(o,c)})}async append(e){const t=this;let n=e;return t.compressed&&e.length&&(n=await t.deflate.append(e)),t.encrypted&&n.length&&(n=await t.encrypt.append(n)),(!t.encrypted||t.zipCrypto)&&t.signed&&e.length&&t.crc32.append(e),n}async flush(){const e=this;let t,n=new d(0);if(e.compressed&&(n=await e.deflate.flush()||new d(0)),e.encrypted){n=await e.encrypt.append(n);const i=e.encrypt.flush();t=i.signature;const r=new d(n.length+i.data.length);r.set(n,0),r.set(i.data,n.length),n=r}return e.encrypted&&!e.zipCrypto||!e.signed||(t=e.crc32.get()),{data:n,signature:t}}}const Je="init",Qe="append",$e="flush";let et=!0;var tt=(e,t,i,r,a,s,o)=>(n.assign(e,{busy:!0,codecConstructor:t,options:n.assign({},i),scripts:o,terminate(){e.worker&&!e.busy&&(e.worker.terminate(),e.interface=null)},onTaskFinished(){e.busy=!1,a(e)}}),s?((e,t)=>{let n;const i={type:"module"};if(!e.interface){if(et)try{e.worker=r({},t.baseURL)}catch(n){et=!1,e.worker=r(i,t.baseURL)}else e.worker=r(i,t.baseURL);e.worker.addEventListener("message",(t=>{const i=t.data;if(n){const t=i.error,r=i.type;if(t){const i=new c(t.message);i.stack=t.stack,n.reject(i),n=null,e.onTaskFinished()}else if(r==Je||r==$e||r==Qe){const t=i.data;r==$e?(n.resolve({data:new d(t),signature:i.signature}),n=null,e.onTaskFinished()):n.resolve(t&&new d(t))}}}),!1),e.interface={append:e=>a({type:Qe,data:e}),flush:()=>a({type:$e}),abort(){e.onTaskFinished()}}}return e.interface;function r(t,n){let i,r;i=e.scripts[0],"function"==typeof i&&(i=i());try{r=new l(i,n)}catch(e){r=i}return new Worker(r,t)}async function a(i){if(!n){const n=e.options,i=e.scripts.slice(1);await s({scripts:i,type:Je,options:n,config:{chunkSize:t.chunkSize}})}return s(i)}function s(t){const i=e.worker,r=new w(((e,t)=>n={resolve:e,reject:t}));try{if(t.data)try{t.data=t.data.buffer,i.postMessage(t,[t.data])}catch(e){i.postMessage(t)}else i.postMessage(t)}catch(t){n.reject(t),n=null,e.onTaskFinished()}return r}})(e,r):((e,t)=>{const n=((e,t,n)=>t.codecType.startsWith(Ke)?new Xe(e,t,n):t.codecType.startsWith(Ge)?new je(e,t,n):void 0)(e.codecConstructor,e.options,t);return{async append(t){try{return await n.append(t)}catch(t){throw e.onTaskFinished(),t}},async flush(){try{return await n.flush()}finally{e.onTaskFinished()}},abort(){e.onTaskFinished()}}})(e,r));let nt=[],it=[];function rt(e,t,n){const i=!(!t.compressed&&!t.signed&&!t.encrypted)&&(t.useWebWorkers||void 0===t.useWebWorkers&&n.useWebWorkers),r=i&&n.workerScripts?n.workerScripts[t.codecType]:[];if(nt.length!e.busy));return s?(at(s),tt(s,e,t,n,a,i,r)):new w((n=>it.push({resolve:n,codecConstructor:e,options:t,webWorker:i,scripts:r})))}function a(e){if(it.length){const[{resolve:t,codecConstructor:i,options:r,webWorker:s,scripts:o}]=it.splice(0,1);t(tt(e,i,r,n,a,s,o))}else e.worker?(at(e),Number.isFinite(n.terminateWorkerTimeout)&&n.terminateWorkerTimeout>=0&&(e.terminateTimeout=setTimeout((()=>{nt=nt.filter((t=>t!=e)),e.terminate()}),n.terminateWorkerTimeout))):nt=nt.filter((t=>t!=e))}}function at(e){e.terminateTimeout&&(clearTimeout(e.terminateTimeout),e.terminateTimeout=null)}const st="Abort error";async function ot(e,t,n,i,r,s,o){const l=a.max(s.chunkSize,64);return async function s(c=0,d=0){const f=o.signal;if(r>c){lt(f,e);const u=await t.readUint8Array(c+i,a.min(l,r-c)),h=u.length;lt(f,e);const _=await e.append(u);if(lt(f,e),d+=await ct(n,_),o.onprogress)try{o.onprogress(c+h,r)}catch(e){}return s(c+l,d)}{const t=await e.flush();return d+=await ct(n,t.data),{signature:t.signature,length:d}}}()}function lt(e,t){if(e&&e.aborted)throw t.abort(),new c(st)}async function ct(e,t){return t.length&&await e.writeUint8Array(t),t.length}const dt="HTTP error ",ft="HTTP Range not supported",ut="text/plain",ht="GET";class _t{constructor(){this.size=0}init(){this.initialized=!0}}class wt extends _t{}class pt extends _t{writeUint8Array(e){this.size+=e.length}}class gt extends wt{constructor(e){super(),this.blob=e,this.size=e.size}async readUint8Array(e,t){if(this.blob.arrayBuffer)return new d(await this.blob.slice(e,e+t).arrayBuffer());{const n=new b;return new w(((i,r)=>{n.onload=e=>i(new d(e.target.result)),n.onerror=()=>r(n.error),n.readAsArrayBuffer(this.blob.slice(e,e+t))}))}}}class bt extends pt{constructor(e){super(),this.contentType=e,this.arrayBuffers=[]}async writeUint8Array(e){super.writeUint8Array(e),this.arrayBuffers.push(e.buffer)}getData(){return this.blob||(this.blob=new _(this.arrayBuffers,{type:this.contentType})),this.blob}}class xt extends wt{constructor(e,t){super(),this.url=e,this.preventHeadRequest=t.preventHeadRequest,this.useRangeHeader=t.useRangeHeader,this.forceRangeRequests=t.forceRangeRequests,this.options=n.assign({},t),delete this.options.preventHeadRequest,delete this.options.useRangeHeader,delete this.options.forceRangeRequests,delete this.options.useXHR}async init(){super.init(),await mt(this,St,Et)}async readUint8Array(e,t){return kt(this,e,t,St,Et)}}class yt extends wt{constructor(e,t){super(),this.url=e,this.preventHeadRequest=t.preventHeadRequest,this.useRangeHeader=t.useRangeHeader,this.forceRangeRequests=t.forceRangeRequests,this.options=t}async init(){super.init(),await mt(this,zt,Dt)}async readUint8Array(e,t){return kt(this,e,t,zt,Dt)}}async function mt(e,t,n){if((e=>{if(void 0!==x){const t=x.createElement("a");return t.href=e,"http:"==t.protocol||"https:"==t.protocol}return/^https?:\/\//i.test(e)})(e.url)&&(e.useRangeHeader||e.forceRangeRequests)){const i=await t(ht,e,vt(e));if(!e.forceRangeRequests&&"bytes"!=i.headers.get("Accept-Ranges"))throw new c(ft);{let r;const a=i.headers.get("Content-Range");if(a){const e=a.trim().split(/\s*\/\s*/);if(e.length){const t=e[1];t&&"*"!=t&&(r=Number(t))}}void 0===r?await Ft(e,t,n):e.size=r}}else await Ft(e,t,n)}async function kt(e,t,n,i,r){if(e.useRangeHeader||e.forceRangeRequests){const r=await i(ht,e,vt(e,t,n));if(206!=r.status)throw new c(ft);return new d(await r.arrayBuffer())}return e.data||await r(e,e.options),new d(e.data.subarray(t,t+n))}function vt(e,t=0,i=1){return n.assign({},Rt(e),{Range:"bytes="+t+"-"+(t+i-1)})}function Rt(e){let t=e.options.headers;if(t)return Symbol.iterator in t?n.fromEntries(t):t}async function Et(e){await At(e,St)}async function Dt(e){await At(e,zt)}async function At(e,t){const n=await t(ht,e,Rt(e));e.data=new d(await n.arrayBuffer()),e.size||(e.size=e.data.length)}async function Ft(e,t,n){if(e.preventHeadRequest)await n(e,e.options);else{const i=(await t("HEAD",e,Rt(e))).headers.get("Content-Length");i?e.size=Number(i):await n(e,e.options)}}async function St(e,{options:t,url:i},r){const a=await fetch(i,n.assign({},t,{method:e,headers:r}));if(400>a.status)return a;throw new c(dt+(a.statusText||a.status))}function zt(e,{url:t},i){return new w(((r,a)=>{const s=new XMLHttpRequest;if(s.addEventListener("load",(()=>{if(400>s.status){const e=[];s.getAllResponseHeaders().trim().split(/[\r\n]+/).forEach((t=>{const n=t.trim().split(/\s*:\s*/);n[0]=n[0].trim().replace(/^[a-z]|-[a-z]/g,(e=>e.toUpperCase())),e.push(n)})),r({status:s.status,arrayBuffer:()=>s.response,headers:new o(e)})}else a(new c(dt+(s.statusText||s.status)))}),!1),s.addEventListener("error",(e=>a(e.detail.error)),!1),s.open(e,t),i)for(const e of n.entries(i))s.setRequestHeader(e[0],e[1]);s.responseType="arraybuffer",s.send()}))}class Tt extends wt{constructor(e,t={}){super(),this.url=e,t.useXHR?this.reader=new yt(e,t):this.reader=new xt(e,t)}set size(e){}get size(){return this.reader.size}async init(){super.init(),await this.reader.init()}async readUint8Array(e,t){return this.reader.readUint8Array(e,t)}}const Ut=4294967295,Ct=65535,Wt=67324752,It=33639248,Bt=101075792,Lt=117853008,Mt=21589,Nt=2048,Ht="/",Ot=new s(2107,11,31),Pt=new s(1980,0,1),Vt="\0☺☻♥♦♣♠•◘○◙♂♀♪♫☼►◄↕‼¶§▬↨↑↓→←∟↔▲▼ !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~⌂ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜ¢£¥₧ƒáíóúñѪº¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ ".split("");async function qt(e,t){if(t&&"cp437"==t.trim().toLowerCase())return(e=>{let t="";for(let n=0;n{t.onload=e=>n(e.target.result),t.onerror=()=>i(t.error),t.readAsText(new _([e]))}))}return new g(t).decode(e)}const Zt=["filename","rawFilename","directory","encrypted","compressedSize","uncompressedSize","lastModDate","rawLastModDate","comment","rawComment","signature","extraField","rawExtraField","bitFlag","extraFieldZip64","extraFieldUnicodePath","extraFieldUnicodeComment","extraFieldAES","filenameUTF8","commentUTF8","offset","zip64","compressionMethod","extraFieldNTFS","lastAccessDate","creationDate","extraFieldExtendedTimestamp","version","versionMadeBy","msDosCompatible","internalFileAttribute","externalFileAttribute"];class Kt{constructor(e){Zt.forEach((t=>this[t]=e[t]))}}const Gt="File format is not recognized",Yt="End of central directory not found",jt="End of Zip64 central directory not found",Xt="End of Zip64 central directory locator not found",Jt="Central directory header not found",Qt="Local file header not found",$t="Zip64 extra field not found",en="File contains encrypted entry",tn="Encryption method not supported",nn="Compression method not supported",rn="utf-8",an="cp437",sn=["uncompressedSize","compressedSize","offset"];class on{constructor(e,t,i){n.assign(this,{reader:e,config:t,options:i})}async getData(e,t,n={}){const i=this,{reader:r,offset:a,extraFieldAES:s,compressionMethod:o,config:l,bitFlag:d,signature:f,rawLastModDate:u,compressedSize:h}=i,_=i.localDirectory={};r.initialized||await r.init();let w=await xn(r,a,30);const p=bn(w);let g=fn(i,n,"password");if(g=g&&g.length&&g,s&&99!=s.originalCompressionMethod)throw new c(nn);if(0!=o&&8!=o)throw new c(nn);if(pn(p,0)!=Wt)throw new c(Qt);ln(_,p,4),w=await xn(r,a,30+_.filenameLength+_.extraFieldLength),_.rawExtraField=w.subarray(30+_.filenameLength),await cn(i,_,p,4),t.lastAccessDate=_.lastAccessDate,t.creationDate=_.creationDate;const b=i.encrypted&&_.encrypted,x=b&&!s;if(b){if(!x&&void 0===s.strength)throw new c(tn);if(!g)throw new c(en)}const y=await rt(l.Inflate,{codecType:Ge,password:g,zipCrypto:x,encryptionStrength:s&&s.strength,signed:fn(i,n,"checkSignature"),passwordVerification:x&&(d.dataDescriptor?u>>>8&255:f>>>24&255),signature:f,compressed:0!=o,encrypted:b,useWebWorkers:fn(i,n,"useWebWorkers")},l);e.initialized||await e.init();const m=fn(i,n,"signal"),k=a+30+_.filenameLength+_.extraFieldLength;return await ot(y,r,e,k,h,l,{onprogress:n.onprogress,signal:m}),e.getData()}}function ln(e,t,i){const r=e.rawBitFlag=wn(t,i+2),a=1==(1&r),s=pn(t,i+6);n.assign(e,{encrypted:a,version:wn(t,i),bitFlag:{level:(6&r)>>1,dataDescriptor:8==(8&r),languageEncodingFlag:(r&Nt)==Nt},rawLastModDate:s,lastModDate:un(s),filenameLength:wn(t,i+22),extraFieldLength:wn(t,i+24)})}async function cn(e,t,i,r){const l=t.rawExtraField,f=t.extraField=new o,u=bn(new d(l));let h=0;try{for(;h{t.zip64=!0;const n=bn(e.data);e.values=[];for(let t=0;tt[e]==Ut));for(let t=0;t{if(t[n]==Ut){if(void 0===e[n])throw new c($t);t[n]=e[n]}}))})(w,t),t.extraFieldZip64=w);const p=f.get(28789);p&&(await dn(p,"filename","rawFilename",t,e),t.extraFieldUnicodePath=p);const g=f.get(25461);g&&(await dn(g,"comment","rawComment",t,e),t.extraFieldUnicodeComment=g);const b=f.get(39169);b?(((e,t,n)=>{const i=bn(e.data);e.vendorVersion=_n(i,0),e.vendorId=_n(i,2);const r=_n(i,4);e.strength=r,e.originalCompressionMethod=n,t.compressionMethod=e.compressionMethod=wn(i,5)})(b,t,_),t.extraFieldAES=b):t.compressionMethod=_;const x=f.get(10);x&&(((e,t)=>{const i=bn(e.data);let r,a=4;try{for(;a{const n=bn(e.data),i=_n(n,0),r=[],a=[];1==(1&i)&&(r.push("lastModDate"),a.push("rawLastModDate")),2==(2&i)&&(r.push("lastAccessDate"),a.push("rawLastAccessDate")),4==(4&i)&&(r.push("creationDate"),a.push("rawCreationDate"));let o=1;r.forEach(((i,r)=>{if(e.data.length>=o+4){const l=pn(n,o);t[i]=e[i]=new s(1e3*l);const c=a[r];e[c]=l}o+=4}))})(y,t),t.extraFieldExtendedTimestamp=y)}async function dn(e,t,n,i,r){const a=bn(e.data);e.version=_n(a,0),e.signature=pn(a,1);const s=new le;s.append(r[n]);const o=bn(new d(4));o.setUint32(0,s.get(),!0),e[t]=await qt(e.data.subarray(5)),e.valid=!r.bitFlag.languageEncodingFlag&&e.signature==pn(o,0),e.valid&&(i[t]=e[t],i[t+"UTF8"]=!0)}function fn(e,t,n){return void 0===t[n]?e.options[n]:t[n]}function un(e){const t=(4294901760&e)>>16,n=65535&e;try{return new s(1980+((65024&t)>>9),((480&t)>>5)-1,31&t,(63488&n)>>11,(2016&n)>>5,2*(31&n),0)}catch(e){}}function hn(e){return new s(Number(e/r(1e4)-r(116444736e5)))}function _n(e,t){return e.getUint8(t)}function wn(e,t){return e.getUint16(t,!0)}function pn(e,t){return e.getUint32(t,!0)}function gn(e,t){return Number(e.getBigUint64(t,!0))}function bn(e){return new h(e.buffer)}function xn(e,t,n){return e.readUint8Array(t,n)}const yn="File already exists",mn="Zip file comment exceeds 64KB",kn="File entry comment exceeds 64KB",vn="File entry name exceeds 64KB",Rn="Version exceeds 65535",En="The strength must equal 1, 2, or 3",Dn="Extra field type exceeds 65535",An="Extra field data exceeds 64KB",Fn="Zip64 is not supported",Sn=new d([7,0,2,0,65,69,3,0,0]);let zn=0;function Tn(e,t,n){if(e.arrayBuffer)return t||n?e.slice(t,n).arrayBuffer():e.arrayBuffer();{const i=new b;return new w(((r,a)=>{i.onload=e=>r(e.target.result),i.onerror=()=>a(i.error),i.readAsArrayBuffer(t||n?e.slice(t,n):e)}))}}function Un(e){if(e)return(r(e.getTime())+r(116444736e5))*r(1e4)}function Cn(e,t,n){return void 0===t[n]?e.options[n]:t[n]}function Wn(e,t,n){e.setUint8(t,n)}function In(e,t,n){e.setUint16(t,n,!0)}function Bn(e,t,n){e.setUint32(t,n,!0)}function Ln(e,t,n){e.setBigUint64(t,n,!0)}function Mn(e,t,n){e.set(t,n)}function Nn(e){return new h(e.buffer)}se({Deflate:function(e){const t=new M,n=(i=e&&e.chunkSize?e.chunkSize:65536)+5*(a.floor(i/16383)+1);var i;const r=new d(n);let s=e?e.level:-1;void 0===s&&(s=-1),t.deflateInit(s),t.next_out=r,this.append=(e,i)=>{let a,s,o=0,l=0,f=0;const u=[];if(e.length){t.next_in_index=0,t.next_in=e,t.avail_in=e.length;do{if(t.next_out_index=0,t.avail_out=n,a=t.deflate(0),0!=a)throw new c("deflating: "+t.msg);t.next_out_index&&(t.next_out_index==n?u.push(new d(r)):u.push(r.slice(0,t.next_out_index))),f+=t.next_out_index,i&&t.next_in_index>0&&t.next_in_index!=o&&(i(t.next_in_index),o=t.next_in_index)}while(t.avail_in>0||0===t.avail_out);return u.length>1?(s=new d(f),u.forEach((e=>{s.set(e,l),l+=e.length}))):s=u[0]||new d(0),s}},this.flush=()=>{let e,i,a=0,s=0;const o=[];do{if(t.next_out_index=0,t.avail_out=n,e=t.deflate(4),1!=e&&0!=e)throw new c("deflating: "+t.msg);n-t.avail_out>0&&o.push(r.slice(0,t.next_out_index)),s+=t.next_out_index}while(t.avail_in>0||0===t.avail_out);return t.deflateEnd(),i=new d(s),o.forEach((e=>{i.set(e,a),a+=e.length})),i}},Inflate:function(e){const t=new ne,n=e&&e.chunkSize?a.floor(2*e.chunkSize):131072,i=new d(n);let r=!1;t.inflateInit(),t.next_out=i,this.append=(e,a)=>{const s=[];let o,l,f=0,u=0,h=0;if(0!==e.length){t.next_in_index=0,t.next_in=e,t.avail_in=e.length;do{if(t.next_out_index=0,t.avail_out=n,0!==t.avail_in||r||(t.next_in_index=0,r=!0),o=t.inflate(0),r&&o===O){if(0!==t.avail_in)throw new c("inflating: bad input")}else if(0!==o&&1!==o)throw new c("inflating: "+t.msg);if((r||1===o)&&t.avail_in===e.length)throw new c("inflating: bad input");t.next_out_index&&(t.next_out_index===n?s.push(new d(i)):s.push(i.slice(0,t.next_out_index))),h+=t.next_out_index,a&&t.next_in_index>0&&t.next_in_index!=f&&(a(t.next_in_index),f=t.next_in_index)}while(t.avail_in>0||0===t.avail_out);return s.length>1?(l=new d(h),s.forEach((e=>{l.set(e,u),u+=e.length}))):l=s[0]||new d(0),l}},this.flush=()=>{t.inflateEnd()}}}),e.BlobReader=gt,e.BlobWriter=bt,e.Data64URIReader=class extends wt{constructor(e){super(),this.dataURI=e;let t=e.length;for(;"="==e.charAt(t-1);)t--;this.dataStart=e.indexOf(",")+1,this.size=a.floor(.75*(t-this.dataStart))}async readUint8Array(e,t){const n=new d(t),i=4*a.floor(e/3),r=atob(this.dataURI.substring(i+this.dataStart,4*a.ceil((e+t)/3)+this.dataStart)),s=e-3*a.floor(i/4);for(let e=s;s+t>e;e++)n[e-s]=r.charCodeAt(e);return n}},e.Data64URIWriter=class extends pt{constructor(e){super(),this.data="data:"+(e||"")+";base64,",this.pending=[]}async writeUint8Array(e){super.writeUint8Array(e);let t=0,n=this.pending;const r=this.pending.length;for(this.pending="",t=0;t<3*a.floor((r+e.length)/3)-r;t++)n+=i.fromCharCode(e[t]);for(;t2?this.data+=m(n):this.pending=n}getData(){return this.data+m(this.pending)}},e.ERR_ABORT=st,e.ERR_BAD_FORMAT=Gt,e.ERR_CENTRAL_DIRECTORY_NOT_FOUND=Jt,e.ERR_DUPLICATED_NAME=yn,e.ERR_ENCRYPTED=en,e.ERR_EOCDR_LOCATOR_ZIP64_NOT_FOUND=Xt,e.ERR_EOCDR_NOT_FOUND=Yt,e.ERR_EOCDR_ZIP64_NOT_FOUND=jt,e.ERR_EXTRAFIELD_ZIP64_NOT_FOUND=$t,e.ERR_HTTP_RANGE=ft,e.ERR_INVALID_COMMENT=mn,e.ERR_INVALID_ENCRYPTION_STRENGTH=En,e.ERR_INVALID_ENTRY_COMMENT=kn,e.ERR_INVALID_ENTRY_NAME=vn,e.ERR_INVALID_EXTRAFIELD_DATA=An,e.ERR_INVALID_EXTRAFIELD_TYPE=Dn,e.ERR_INVALID_PASSWORD=we,e.ERR_INVALID_SIGNATURE=Ye,e.ERR_INVALID_VERSION=Rn,e.ERR_LOCAL_FILE_HEADER_NOT_FOUND=Qt,e.ERR_UNSUPPORTED_COMPRESSION=nn,e.ERR_UNSUPPORTED_ENCRYPTION=tn,e.ERR_UNSUPPORTED_FORMAT=Fn,e.HttpRangeReader=class extends Tt{constructor(e,t={}){t.useRangeHeader=!0,super(e,t)}},e.HttpReader=Tt,e.Reader=wt,e.TextReader=class extends wt{constructor(e){super(),this.blobReader=new gt(new _([e],{type:ut}))}async init(){super.init(),this.blobReader.init(),this.size=this.blobReader.size}async readUint8Array(e,t){return this.blobReader.readUint8Array(e,t)}},e.TextWriter=class extends pt{constructor(e){super(),this.encoding=e,this.blob=new _([],{type:ut})}async writeUint8Array(e){super.writeUint8Array(e),this.blob=new _([this.blob,e.buffer],{type:ut})}getData(){if(this.blob.text)return this.blob.text();{const e=new b;return new w(((t,n)=>{e.onload=e=>t(e.target.result),e.onerror=()=>n(e.error),e.readAsText(this.blob,this.encoding)}))}}},e.Uint8ArrayReader=class extends wt{constructor(e){super(),this.array=e,this.size=e.length}async readUint8Array(e,t){return this.array.slice(e,e+t)}},e.Uint8ArrayWriter=class extends pt{constructor(){super(),this.array=new d(0)}async writeUint8Array(e){super.writeUint8Array(e);const t=this.array;this.array=new d(t.length+e.length),this.array.set(t),this.array.set(e,t.length)}getData(){return this.array}},e.WritableStreamWriter=class extends pt{constructor(e){super(),this.writableStream=e,this.writer=e.getWriter()}async writeUint8Array(e){return await this.writer.ready,this.writer.write(e)}async getData(){return await this.writer.ready,await this.writer.close(),this.writableStream}},e.Writer=pt,e.ZipReader=class{constructor(e,t={}){n.assign(this,{reader:e,options:t,config:ae()})}async getEntries(e={}){const t=this,i=t.reader;if(i.initialized||await i.init(),22>i.size)throw new c(Gt);const r=await(async(e,t,n)=>{const i=new d(4);return bn(i).setUint32(0,101010256,!0),await r(22)||await r(a.min(1048582,n));async function r(t){const r=n-t,a=await xn(e,r,t);for(let e=a.length-22;e>=0;e--)if(a[e]==i[0]&&a[e+1]==i[1]&&a[e+2]==i[2]&&a[e+3]==i[3])return{offset:r+e,buffer:a.slice(e,e+22).buffer}}})(i,0,i.size);if(!r)throw new c(Yt);const s=bn(r);let o=pn(s,12),l=pn(s,16),f=wn(s,8),u=0;if(l==Ut||o==Ut||f==Ct){const e=bn(await xn(i,r.offset-20,20));if(pn(e,0)!=Lt)throw new c(jt);l=gn(e,8);let t=await xn(i,l,56),n=bn(t);const a=r.offset-20-56;if(pn(n,0)!=Bt&&l!=a){const e=l;l=a,u=l-e,t=await xn(i,l,56),n=bn(t)}if(pn(n,0)!=Bt)throw new c(Xt);f=gn(n,32),o=gn(n,40),l-=o}if(0>l||l>=i.size)throw new c(Gt);let h=0,_=await xn(i,l,o),p=bn(_);if(o){const e=r.offset-o;if(pn(p,h)!=It&&l!=e){const t=l;l=e,u=l-t,_=await xn(i,l,o),p=bn(_)}}if(0>l||l>=i.size)throw new c(Gt);const g=[];for(let r=0;f>r;r++){const a=new on(i,t.config,t.options);if(pn(p,h)!=It)throw new c(Jt);ln(a,p,h+6);const s=!!a.bitFlag.languageEncodingFlag,o=h+46,l=o+a.filenameLength,d=l+a.extraFieldLength,b=wn(p,h+4),x=0==(0&b);n.assign(a,{versionMadeBy:b,msDosCompatible:x,compressedSize:0,uncompressedSize:0,commentLength:wn(p,h+32),directory:x&&16==(16&_n(p,h+38)),offset:pn(p,h+42)+u,internalFileAttribute:pn(p,h+34),externalFileAttribute:pn(p,h+38),rawFilename:_.subarray(o,l),filenameUTF8:s,commentUTF8:s,rawExtraField:_.subarray(l,d)});const y=d+a.commentLength;a.rawComment=_.subarray(d,y);const m=fn(t,e,"filenameEncoding"),k=fn(t,e,"commentEncoding"),[v,R]=await w.all([qt(a.rawFilename,a.filenameUTF8?rn:m||an),qt(a.rawComment,a.commentUTF8?rn:k||an)]);a.filename=v,a.comment=R,!a.directory&&a.filename.endsWith(Ht)&&(a.directory=!0),await cn(a,a,p,h+6);const E=new Kt(a);if(E.getData=(e,t)=>a.getData(e,E,t),g.push(E),h=y,e.onprogress)try{e.onprogress(r+1,f,new Kt(a))}catch(e){}}return g}async close(){}},e.ZipWriter=class{constructor(e,t={}){n.assign(this,{writer:e,options:t,config:ae(),files:new o,offset:e.size,pendingCompressedSize:0,pendingEntries:[]})}async add(e="",i,o={}){const l=this;if(zn>=l.config.maxWorkers)return new w(((t,n)=>l.pendingEntries.push({name:e,reader:i,options:o,resolve:t,reject:n})));zn++;try{return await(async(e,i,o,l)=>{if(i=i.trim(),l.directory&&!i.endsWith(Ht)?i+=Ht:l.directory=i.endsWith(Ht),e.files.has(i))throw new c(yn);const _=ce(i);if(_.length>Ct)throw new c(vn);const p=l.comment||"",g=ce(p);if(g.length>Ct)throw new c(kn);const b=e.options.version||l.version||0;if(b>Ct)throw new c(Rn);const x=e.options.versionMadeBy||l.versionMadeBy||20;if(x>Ct)throw new c(Rn);const y=Cn(e,l,"lastModDate")||new s,m=Cn(e,l,"lastAccessDate"),k=Cn(e,l,"creationDate"),v=Cn(e,l,"password"),R=Cn(e,l,"encryptionStrength")||3,E=Cn(e,l,"zipCrypto");if(void 0!==v&&void 0!==R&&(1>R||R>3))throw new c(En);let D=new d(0);const A=l.extraField;if(A){let e=0,t=0;A.forEach((t=>e+=4+t.length)),D=new d(e),A.forEach(((e,n)=>{if(n>Ct)throw new c(Dn);if(e.length>Ct)throw new c(An);Mn(D,new f([n]),t),Mn(D,new f([e.length]),t+2),Mn(D,e,t+4),t+=4+e.length}))}let F=Cn(e,l,"extendedTimestamp");void 0===F&&(F=!0);let S=0,z=Cn(e,l,"keepOrder");void 0===z&&(z=!0);let T=0,U=Cn(e,l,"msDosCompatible");void 0===U&&(U=!0);const C=Cn(e,l,"internalFileAttribute")||0,W=Cn(e,l,"externalFileAttribute")||0;o&&(o.initialized||await o.init(),T=o.size,S=(e=>e+5*(a.floor(e/16383)+1))(T));let I=l.zip64||e.options.zip64||!1;if(e.offset+e.pendingCompressedSize>=Ut||T>=Ut||S>=Ut){if(!1===l.zip64||!1===e.options.zip64||!z)throw new c(Fn);I=!0}e.pendingCompressedSize+=S,await w.resolve();const B=Cn(e,l,"level"),L=Cn(e,l,"useWebWorkers"),M=Cn(e,l,"bufferedWrite");let N=Cn(e,l,"dataDescriptor"),H=Cn(e,l,"dataDescriptorSignature");const O=Cn(e,l,"signal");void 0===N&&(N=!0),N&&void 0===H&&(H=!0);const P=await(async(e,i,s,o)=>{const l=e.files,f=e.writer,_=t.from(l.values()).pop();let p,g,b,x={};l.set(i,x);try{let y,m,k;if(o.keepOrder&&(y=_&&_.lock),x.lock=k=new w((e=>b=e)),o.bufferedWrite||e.lockWrite||!o.dataDescriptor?(m=new bt,m.init(),p=!0):(e.lockWrite=new w((e=>g=e)),f.initialized||await f.init(),m=f),x=await(async(e,t,i,s)=>{const{rawFilename:o,lastAccessDate:l,creationDate:c,password:f,level:h,zip64:_,zipCrypto:w,dataDescriptor:p,dataDescriptorSignature:g,directory:b,version:x,versionMadeBy:y,rawComment:m,rawExtraField:k,useWebWorkers:v,onprogress:R,signal:E,encryptionStrength:D,extendedTimestamp:A,msDosCompatible:F,internalFileAttribute:S,externalFileAttribute:z}=s,T=!(!f||!f.length),U=0!==h&&!b;let C,W,I;if(T&&!w){C=new d(Sn.length+2);const e=Nn(C);In(e,0,39169),Mn(C,Sn,2),Wn(e,8,D)}else C=new d(0);if(A){I=new d(9+(l?4:0)+(c?4:0));const e=Nn(I);In(e,0,Mt),In(e,2,I.length-4),Wn(e,4,1+(l?2:0)+(c?4:0)),Bn(e,5,a.floor(s.lastModDate.getTime()/1e3)),l&&Bn(e,9,a.floor(l.getTime()/1e3)),c&&Bn(e,13,a.floor(c.getTime()/1e3));try{W=new d(36);const e=Nn(W),t=Un(s.lastModDate);In(e,0,10),In(e,2,32),In(e,8,1),In(e,10,24),Ln(e,12,t),Ln(e,20,Un(l)||t),Ln(e,28,Un(c)||t)}catch(e){W=new d(0)}}else W=I=new d(0);const B={version:x||20,versionMadeBy:y,zip64:_,directory:!!b,filenameUTF8:!0,rawFilename:o,commentUTF8:!0,rawComment:m,rawExtraFieldZip64:new d(_?28:0),rawExtraFieldExtendedTimestamp:I,rawExtraFieldNTFS:W,rawExtraFieldAES:C,rawExtraField:k,extendedTimestamp:A,msDosCompatible:F,internalFileAttribute:S,externalFileAttribute:z};let L=B.uncompressedSize=0,M=Nt;p&&(M|=8);let N=0;U&&(N=8),_&&(B.version=B.version>45?B.version:45),T&&(M|=1,w||(B.version=B.version>51?B.version:51,N=99,U&&(B.rawExtraFieldAES[9]=8))),B.compressionMethod=N;const H=B.headerArray=new d(26),O=Nn(H);In(O,0,B.version),In(O,2,M),In(O,4,N);const P=new u(1),V=Nn(P);let q;q=s.lastModDateOt?Ot:s.lastModDate,In(V,0,(q.getHours()<<6|q.getMinutes())<<5|q.getSeconds()/2),In(V,2,(q.getFullYear()-1980<<4|q.getMonth()+1)<<5|q.getDate());const Z=P[0];Bn(O,6,Z),In(O,22,o.length);const K=C.length+I.length+W.length+B.rawExtraField.length;In(O,24,K);const G=new d(30+o.length+K);let Y;Bn(Nn(G),0,Wt),Mn(G,H,4),Mn(G,o,30),Mn(G,C,30+o.length),Mn(G,I,30+o.length+C.length),Mn(G,W,30+o.length+C.length+I.length),Mn(G,B.rawExtraField,30+o.length+C.length+I.length+W.length);let j=0;if(e){L=B.uncompressedSize=e.size;const n=await rt(i.Deflate,{codecType:Ke,level:h,password:f,encryptionStrength:D,zipCrypto:T&&w,passwordVerification:T&&w&&Z>>8&255,signed:!0,compressed:U,encrypted:T,useWebWorkers:v},i);await t.writeUint8Array(G),B.dataWritten=!0,Y=await ot(n,e,t,0,L,i,{onprogress:R,signal:E}),j=Y.length}else await t.writeUint8Array(G),B.dataWritten=!0;let X,J=new d(0),Q=0;if(p&&(J=new d(_?g?24:20:g?16:12),X=Nn(J),g&&(Q=4,Bn(X,0,134695760))),e){const e=Y.signature;if(T&&!w||void 0===e||(Bn(O,10,e),B.signature=e,p&&Bn(X,Q,e)),_){const e=Nn(B.rawExtraFieldZip64);In(e,0,1),In(e,2,24),Bn(O,14,Ut),Ln(e,12,r(j)),Bn(O,18,Ut),Ln(e,4,r(L)),p&&(Ln(X,Q+4,r(j)),Ln(X,Q+12,r(L)))}else Bn(O,14,j),Bn(O,18,L),p&&(Bn(X,Q+4,j),Bn(X,Q+8,L))}p&&await t.writeUint8Array(J);const $=G.length+j+J.length;return n.assign(B,{compressedSize:j,lastModDate:q,rawLastModDate:Z,creationDate:c,lastAccessDate:l,encrypted:T,length:$}),B})(s,m,e.config,o),x.lock=k,l.set(i,x),x.filename=i,p){let n=0;const i=m.getData();let r;await w.all([e.lockWrite,y]);do{r=t.from(l.values()).find((e=>e.writingBufferedData)),r&&await r.lock}while(r&&r.lock);if(x.writingBufferedData=!0,!o.dataDescriptor){const e=26,t=await Tn(i,0,e),r=new h(t);x.encrypted&&!o.zipCrypto||Bn(r,14,x.signature),x.zip64?(Bn(r,18,Ut),Bn(r,22,Ut)):(Bn(r,18,x.compressedSize),Bn(r,22,x.uncompressedSize)),await f.writeUint8Array(new d(t)),n=e}await(async(e,t,n=0)=>{const i=536870912;await async function r(){if(n=Ut)throw new c(Fn);return e.offset+=x.length,x}catch(t){throw(p&&x.writingBufferedData||!p&&x.dataWritten)&&(t.corruptedEntry=e.hasCorruptedEntries=!0,x.uncompressedSize&&(e.offset+=x.uncompressedSize)),l.delete(i),t}finally{b(),g&&g()}})(e,i,o,n.assign({},l,{rawFilename:_,rawComment:g,version:b,versionMadeBy:x,lastModDate:y,lastAccessDate:m,creationDate:k,rawExtraField:D,zip64:I,password:v,level:B,useWebWorkers:L,encryptionStrength:R,extendedTimestamp:F,zipCrypto:E,bufferedWrite:M,keepOrder:z,dataDescriptor:N,dataDescriptorSignature:H,signal:O,msDosCompatible:U,internalFileAttribute:C,externalFileAttribute:W}));return S&&(e.pendingCompressedSize-=S),n.assign(P,{name:i,comment:p,extraField:A}),new Kt(P)})(l,e,i,o)}finally{zn--;const e=l.pendingEntries.shift();e&&l.add(e.name,e.reader,e.options).then(e.resolve).catch(e.reject)}}async close(e=new d(0),n={}){return await(async(e,n,i)=>{const s=e.writer,o=e.files;let l=0,f=0,u=e.offset,h=o.size;for(const[,e]of o)f+=46+e.rawFilename.length+e.rawComment.length+e.rawExtraFieldZip64.length+e.rawExtraFieldAES.length+e.rawExtraFieldExtendedTimestamp.length+e.rawExtraFieldNTFS.length+e.rawExtraField.length;let _=i.zip64||e.options.zip64||!1;if(u>=Ut||f>=Ut||h>=Ct){if(!1===i.zip64||!1===e.options.zip64)throw new c(Fn);_=!0}const w=new d(f+(_?98:22)),p=Nn(w);if(n&&n.length){if(n.length>Ct)throw new c(mn);In(p,l+20,n.length)}for(const[e,n]of t.from(o.values()).entries()){const{rawFilename:t,rawExtraFieldZip64:r,rawExtraFieldAES:s,rawExtraField:c,rawComment:f,versionMadeBy:u,headerArray:h,directory:_,zip64:g,msDosCompatible:b,internalFileAttribute:x,externalFileAttribute:y}=n;let m,k;if(n.extendedTimestamp){k=n.rawExtraFieldNTFS,m=new d(9);const e=Nn(m);In(e,0,Mt),In(e,2,m.length-4),Wn(e,4,1),Bn(e,5,a.floor(n.lastModDate.getTime()/1e3))}else k=m=new d(0);const v=r.length+s.length+m.length+k.length+c.length;if(Bn(p,l,It),In(p,l+4,u),Mn(w,h,l+6),In(p,l+30,v),In(p,l+32,f.length),Bn(p,l+34,x),y?Bn(p,l+38,y):_&&b&&Wn(p,l+38,16),Bn(p,l+42,g?Ut:n.offset),Mn(w,t,l+46),Mn(w,r,l+46+t.length),Mn(w,s,l+46+t.length+r.length),Mn(w,m,l+46+t.length+r.length+s.length),Mn(w,k,l+46+t.length+r.length+s.length+m.length),Mn(w,c,l+46+t.length+r.length+s.length+m.length+k.length),Mn(w,f,l+46+t.length+v),l+=46+t.length+v+f.length,i.onprogress)try{i.onprogress(e+1,o.size,new Kt(n))}catch(e){}}_&&(Bn(p,l,Bt),Ln(p,l+4,r(44)),In(p,l+12,45),In(p,l+14,45),Ln(p,l+24,r(h)),Ln(p,l+32,r(h)),Ln(p,l+40,r(f)),Ln(p,l+48,r(u)),Bn(p,l+56,Lt),Ln(p,l+64,r(u)+r(f)),Bn(p,l+72,1),h=Ct,u=Ut,f=Ut,l+=76),Bn(p,l,101010256),In(p,l+8,h),In(p,l+10,h),Bn(p,l+12,f),Bn(p,l+16,u),await s.writeUint8Array(w),n&&n.length&&await s.writeUint8Array(n)})(this,e,n),this.writer.getData()}},e.configure=se,e.getMimeType=()=>"application/octet-stream",e.terminateWorkers=()=>{nt.forEach((e=>{at(e),e.terminate()}))},n.defineProperty(e,"__esModule",{value:!0})}));
diff --git a/view.js b/view.js
new file mode 100644
index 0000000..b6e6fdd
--- /dev/null
+++ b/view.js
@@ -0,0 +1,267 @@
+import * as CFI from './epubcfi.js'
+import { TOCProgress, SectionProgress } from './progress.js'
+
+const textWalker = function* (doc, func) {
+ const filter = NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_TEXT
+ | NodeFilter.SHOW_CDATA_SECTION
+ const { FILTER_ACCEPT, FILTER_REJECT, FILTER_SKIP } = NodeFilter
+ const acceptNode = node => {
+ const name = node.localName?.toLowerCase()
+ if (name === 'script' || name === 'style') return FILTER_REJECT
+ if (node.nodeType === 1) return FILTER_SKIP
+ return FILTER_ACCEPT
+ }
+ const walker = doc.createTreeWalker(doc.body, filter, { acceptNode })
+ const nodes = []
+ for (let node = walker.nextNode(); node; node = walker.nextNode())
+ nodes.push(node)
+ const strs = nodes.map(node => node.nodeValue)
+ const makeRange = (startIndex, startOffset, endIndex, endOffset) => {
+ const range = doc.createRange()
+ range.setStart(nodes[startIndex], startOffset)
+ range.setEnd(nodes[endIndex], endOffset)
+ return range
+ }
+ for (const match of func(strs, makeRange)) yield match
+}
+
+const frameRect = (frame, rect) => {
+ const left = rect.left + frame.left
+ const right = rect.right + frame.left
+ const top = rect.top + frame.top
+ const bottom = rect.bottom + frame.top
+ return { left, right, top, bottom }
+}
+
+const pointIsInView = ({ x, y }) =>
+ x > 0 && y > 0 && x < window.innerWidth && y < window.innerHeight
+
+export const getPosition = target => {
+ // TODO: vertical text
+ const frameElement = (target.getRootNode?.() ?? target?.endContainer?.getRootNode?.())
+ ?.defaultView?.frameElement
+ const frame = frameElement?.getBoundingClientRect() ?? { top: 0, left: 0 }
+ const rects = Array.from(target.getClientRects())
+ const first = frameRect(frame, rects[0])
+ const last = frameRect(frame, rects.at(-1))
+ const start = {
+ point: { x: (first.left + first.right) / 2, y: first.top },
+ dir: 'up',
+ }
+ const end = {
+ point: { x: (last.left + last.right) / 2, y: last.bottom },
+ dir: 'down',
+ }
+ const startInView = pointIsInView(start.point)
+ const endInView = pointIsInView(end.point)
+ if (!startInView && !endInView) return { point: { x: 0, y: 0 } }
+ if (!startInView) return end
+ if (!endInView) return start
+ return start.point.y > window.innerHeight - end.point.y ? start : end
+}
+
+// https://www.w3.org/TR/epub-ssv-11/
+const SSV = Object.fromEntries(Array.from(Object.entries({
+ isRef: ['annoref', 'biblioref', 'glossref', 'noteref'],
+ isLink: ['backlink'],
+ isNote: ['annotation', 'note', 'footnote', 'endnote', 'rearnote'],
+}), ([k, v]) => [k, el =>
+ el.getAttributeNS('http://www.idpf.org/2007/ops', 'type')
+ ?.split(/s/)?.some(t => v.includes(t))]))
+
+export class View {
+ #sectionProgress
+ #tocProgress
+ #pageProgress
+ language = 'en'
+ textDirection = ''
+ isCJK = false
+ isFixedLayout = false
+ #css
+ constructor(book, emit) {
+ this.book = book
+ this.emit = emit
+
+ if (book.metadata?.language) try {
+ const language = book.metadata.language
+ book.metadata.language = Intl.getCanonicalLocales(language)[0]
+ const tag = typeof language === 'string' ? language : language[0]
+ const locale = new Intl.Locale(tag)
+ this.isCJK = ['zh', 'ja', 'kr'].includes(locale.language)
+ this.textDirection = locale.textInfo.direction
+ } catch(e) {
+ console.warn(e)
+ }
+
+ if (book.splitTOCHref && book.getTOCFragment) {
+ const ids = book.sections.map(s => s.id)
+ this.#sectionProgress = new SectionProgress(book.sections, 150, 1600)
+ const splitHref = book.splitTOCHref.bind(book)
+ const getFragment = book.getTOCFragment.bind(book)
+ this.#tocProgress = new TOCProgress({
+ toc: book.toc ?? [], ids, splitHref, getFragment })
+ this.#pageProgress = new TOCProgress({
+ toc: book.pageList ?? [], ids, splitHref, getFragment })
+ }
+ }
+ async display() {
+ const opts = {
+ book: this.book,
+ onLoad: this.#onLoad.bind(this),
+ onRelocated: this.#onRelocated.bind(this),
+ }
+ this.isFixedLayout = this.book.rendition?.layout === 'pre-paginated'
+ if (this.isFixedLayout) {
+ const { FixedLayout } = await import('./fixed-layout.js')
+ this.renderer = new FixedLayout(opts)
+ } else {
+ const { Paginator } = await import('./paginator.js')
+ this.renderer = new Paginator(opts)
+ }
+ return this.renderer.element
+ }
+ #onRelocated(range, index, fraction) {
+ if (!this.#sectionProgress) return
+ const progress = this.#sectionProgress.getProgress(index, fraction)
+ const tocItem = this.#tocProgress.getProgress(index, range)
+ const pageItem = this.#pageProgress.getProgress(index, range)
+ const cfi = this.getCFI(index, range)
+ this.emit?.({ type: 'relocated', ...progress, tocItem, pageItem, cfi })
+ }
+ #onLoad(doc, index) {
+ const { book } = this
+
+ // set language and dir if not already set
+ doc.documentElement.lang ||= this.language
+ doc.documentElement.dir ||= this.isCJK ? '' : this.textDirection
+
+ this.renderer.setStyle(this.#css)
+
+ // set `document` background to `doc` background
+ // this is needed cause the iframe does not fill the whole viewport
+ const bodyStyle = doc.defaultView.getComputedStyle(doc.body)
+ document.body.style.background =
+ bodyStyle.backgroundColor === 'rgba(0, 0, 0, 0)'
+ && bodyStyle.backgroundImage === 'none'
+ ? doc.defaultView.getComputedStyle(doc.documentElement).background
+ : bodyStyle.background
+
+ // set handlers for links
+ const section = book.sections[index]
+ for (const a of doc.querySelectorAll('a[href]'))
+ a.addEventListener('click', e => {
+ e.preventDefault()
+ const href = a.getAttribute('href')
+ const uri = section?.resolveHref?.(href) ?? href
+ if (book?.isExternal?.(uri))
+ this.emit?.({ type: 'external-link', uri })
+ else if (SSV.isRef(a)) {
+ const { index, anchor } = book.resolveHref(uri)
+ const pos = getPosition(a)
+ Promise.resolve(book.sections[index].createDocument())
+ .then(doc => [anchor(doc), doc.contentType])
+ .then(([el, type]) =>
+ [el?.innerHTML, type, SSV.isNote(el)])
+ .then(([content, contentType, isNote]) => content
+ ? this.emit?.({
+ type: 'reference',
+ href: isNote ? null : uri,
+ content, contentType, pos,
+ }) : null)
+ .catch(e => console.error(e))
+ return
+ } else this.goTo(uri)
+ })
+ }
+ getCFI(index, range) {
+ if (!range) return ''
+ const baseCFI = this.book.sections[index].cfi ?? CFI.fake.fromIndex(index)
+ return CFI.joinIndir(baseCFI, CFI.fromRange(range))
+ }
+ resolveCFI(cfi) {
+ if (this.book.resolveCFI)
+ return this.book.resolveCFI(cfi)
+ else {
+ const parts = CFI.parse(cfi)
+ const index = CFI.fake.toIndex((parts.parent ?? parts).shift())
+ const anchor = doc => CFI.toRange(doc, parts)
+ return { index, anchor }
+ }
+ }
+ resolveNavigation(target) {
+ try {
+ if (typeof target === 'number') return { index: target }
+ if (CFI.isCFI.test(target)) return this.resolveCFI(target)
+ return this.book.resolveHref(target)
+ } catch (e) {
+ console.error(e)
+ console.error(`Could not resolve target ${target}`)
+ }
+ }
+ async goTo(target) {
+ const resolved = this.resolveNavigation(target)
+ try {
+ await this.renderer.goTo(resolved)
+ return resolved
+ } catch(e) {
+ console.error(e)
+ console.error(`Could not go to ${target}`)
+ }
+ }
+ async goToFraction(frac) {
+ const [index, anchor] = this.#sectionProgress.getSection(frac)
+ return this.renderer.goTo({ index, anchor })
+ }
+ async select(target) {
+ try {
+ const obj = await this.resolveNavigation(target)
+ await this.renderer.goTo({ ...obj, select: true })
+ } catch(e) {
+ console.error(e)
+ console.error(`Could not go to ${target}`)
+ }
+ }
+ goLeft() {
+ return this.book.dir === 'rtl' ? this.renderer.next() : this.renderer.prev()
+ }
+ goRight() {
+ return this.book.dir === 'rtl' ? this.renderer.prev() : this.renderer.next()
+ }
+ setAppearance({ layout, css }) {
+ if (this.isFixedLayout) return
+ Object.assign(this.renderer.layout, layout)
+ this.#css = css
+ this.renderer.setStyle(css)
+ this.renderer.render()
+ }
+ async * #searchSection(matcher, query, index) {
+ const doc = await this.book.sections[index].createDocument()
+ for (const { range, excerpt } of matcher(doc, query))
+ yield { cfi: this.getCFI(index, range), excerpt }
+ }
+ async * #searchBook(matcher, query) {
+ const { sections } = this.book
+ for (const [index, { createDocument }] of sections.entries()) {
+ if (!createDocument) continue
+ const doc = await createDocument()
+ const subitems = Array.from(matcher(doc, query), ({ range, excerpt }) =>
+ ({ cfi: this.getCFI(index, range), excerpt }))
+ const progress = (index + 1) / sections.length
+ yield { progress }
+ if (subitems.length) yield { index, subitems }
+ }
+ }
+ async * search(opts) {
+ const { searchMatcher } = await import('./search.js')
+ const { query, index } = opts
+ const matcher = searchMatcher(textWalker,
+ { defaultLocale: this.language, ...opts })
+ const iter = index != null
+ ? this.#searchSection(matcher, query, index)
+ : this.#searchBook(matcher, query)
+ for await (const result of iter) yield 'subitems' in result ? {
+ label: this.#tocProgress.getProgress(result.index)?.label ?? '',
+ subitems: result.subitems,
+ } : result
+ }
+}