>>=C,v-=C,n.lens[n.have++]=T;else{if(16===T){for(P=C+2;v>>=C,v-=C,0===n.have){t.msg="invalid bit length repeat",n.mode=30;break}B=n.lens[n.have-1],x=3+(3&g),g>>>=2,v-=2}else if(17===T){for(P=C+3;v
>>=C)),g>>>=3,v-=3}else{for(P=C+7;v
>>=C)),g>>>=7,v-=7}if(n.have+x>n.nlen+n.ndist){t.msg="invalid bit length repeat",n.mode=30;break}for(;x--;)n.lens[n.have++]=B}}if(30===n.mode)break;if(0===n.lens[256]){t.msg="invalid code -- missing end-of-block",n.mode=30;break}if(n.lenbits=9,O={bits:n.lenbits},z=s(1,n.lens,0,n.nlen,n.lencode,0,n.work,O),n.lenbits=O.bits,z){t.msg="invalid literal/lengths set",n.mode=30;break}if(n.distbits=6,n.distcode=n.distdyn,O={bits:n.distbits},z=s(2,n.lens,n.nlen,n.ndist,n.distcode,0,n.work,O),n.distbits=O.bits,z){t.msg="invalid distances set",n.mode=30;break}if(n.mode=20,6===e)break t;case 20:n.mode=21;case 21:if(6<=f&&258<=m){t.next_out=h,t.avail_out=m,t.next_in=u,t.avail_in=f,n.hold=g,n.bits=v,o(t,w),h=t.next_out,d=t.output,m=t.avail_out,u=t.next_in,p=t.input,f=t.avail_in,g=n.hold,v=n.bits,12===n.mode&&(n.back=-1);break}for(n.back=0;A=(N=n.lencode[g&(1<>>16&255,T=65535&N,!((C=N>>>24)<=v);){if(0===f)break t;f--,g+=p[u++]<>S)])>>>16&255,T=65535&N,!(S+(C=N>>>24)<=v);){if(0===f)break t;f--,g+=p[u++]<>>=S,v-=S,n.back+=S}if(g>>>=C,v-=C,n.back+=C,n.length=T,0===A){n.mode=26;break}if(32&A){n.back=-1,n.mode=12;break}if(64&A){t.msg="invalid literal/length code",n.mode=30;break}n.extra=15&A,n.mode=22;case 22:if(n.extra){for(P=n.extra;v>>=n.extra,v-=n.extra,n.back+=n.extra}n.was=n.length,n.mode=23;case 23:for(;A=(N=n.distcode[g&(1<>>16&255,T=65535&N,!((C=N>>>24)<=v);){if(0===f)break t;f--,g+=p[u++]<>S)])>>>16&255,T=65535&N,!(S+(C=N>>>24)<=v);){if(0===f)break t;f--,g+=p[u++]<>>=S,v-=S,n.back+=S}if(g>>>=C,v-=C,n.back+=C,64&A){t.msg="invalid distance code",n.mode=30;break}n.offset=T,n.extra=15&A,n.mode=24;case 24:if(n.extra){for(P=n.extra;v>>=n.extra,v-=n.extra,n.back+=n.extra}if(n.offset>n.dmax){t.msg="invalid distance too far back",n.mode=30;break}n.mode=25;case 25:if(0===m)break t;if(x=w-m,n.offset>x){if((x=n.offset-x)>n.whave&&n.sane){t.msg="invalid distance too far back",n.mode=30;break}k=x>n.wnext?(x-=n.wnext,n.wsize-x):n.wnext-x,x>n.length&&(x=n.length),E=n.window}else E=d,k=h-n.offset,x=n.length;for(my?(_=j[U+d[E]],O[P+d[E]]):(_=96,0),h=1<>I)+(f-=h)]=b<<24|_<<16|w|0,0!==f;);for(h=1<>=1;if(0!==h?(z&=h-1,z+=h):z=0,E++,0==--N[k]){if(k===A)break;k=e[n+d[E]]}if(T>>7)]}function C(t,e){t.pending_buf[t.pending++]=255&e,t.pending_buf[t.pending++]=e>>>8&255}function A(t,e,n){t.bi_valid>16-n?(t.bi_buf|=e<>16-t.bi_valid,t.bi_valid+=n-16):(t.bi_buf|=e<>>=1,n<<=1,0<--e;);return n>>>1}function I(t,e,n){var i,r,a=new Array(16),o=0;for(i=1;i<=l;i++)a[i]=o=o+n[i-1]<<1;for(r=0;r<=e;r++){var s=t[2*r+1];0!==s&&(t[2*r]=S(a[s]++,s))}}function R(t){var e;for(e=0;e>1;1<=n;n--)O(t,a,n);for(r=c;n=t.heap[1],t.heap[1]=t.heap[t.heap_len--],O(t,a,1),i=t.heap[1],t.heap[--t.heap_max]=n,t.heap[--t.heap_max]=i,a[2*r]=a[2*n]+a[2*i],t.depth[r]=(t.depth[n]>=t.depth[i]?t.depth[n]:t.depth[i])+1,a[2*n+1]=a[2*i+1]=r,t.heap[1]=r++,O(t,a,1),2<=t.heap_len;);t.heap[--t.heap_max]=t.heap[1],function(t,e){var n,i,r,a,o,s,c=e.dyn_tree,p=e.max_code,d=e.stat_desc.static_tree,u=e.stat_desc.has_stree,h=e.stat_desc.extra_bits,f=e.stat_desc.extra_base,m=e.stat_desc.max_length,g=0;for(a=0;a<=l;a++)t.bl_count[a]=0;for(c[2*t.heap[t.heap_max]+1]=0,n=t.heap_max+1;n<573;n++)m<(a=c[2*c[2*(i=t.heap[n])+1]+1]+1)&&(a=m,g++),c[2*i+1]=a,p>=7;i>>=1)if(1&n&&0!==t.dyn_ltree[2*e])return 0;if(0!==t.dyn_ltree[18]||0!==t.dyn_ltree[20]||0!==t.dyn_ltree[26])return 1;for(e=32;e>>3,(o=t.static_len+3+7>>>3)<=r&&(r=o)):r=o=n+5,n+4<=r&&-1!==e?L(t,e,n,i):4===t.strategy||o===r?(A(t,2+(i?1:0),3),P(t,h,f)):(A(t,4+(i?1:0),3),function(t,e,n,i){var r;for(A(t,e-257,5),A(t,n-1,5),A(t,i-4,4),r=0;r>>8&255,t.pending_buf[t.d_buf+2*t.last_lit+1]=255&e,t.pending_buf[t.l_buf+t.last_lit]=255&n,t.last_lit++,0===e?t.dyn_ltree[2*n]++:(t.matches++,e--,t.dyn_ltree[2*(g[n]+a+1)]++,t.dyn_dtree[2*E(e)]++),t.last_lit===t.lit_bufsize-1},n._tr_align=function(t){A(t,2,3),T(t,256,h),function(t){16===t.bi_valid?(C(t,t.bi_buf),t.bi_buf=0,t.bi_valid=0):8<=t.bi_valid&&(t.pending_buf[t.pending++]=255&t.bi_buf,t.bi_buf>>=8,t.bi_valid-=8)}(t)}},{"../utils/common":41}],53:[function(t,e,n){e.exports=function(){this.input=null,this.next_in=0,this.avail_in=0,this.total_in=0,this.output=null,this.next_out=0,this.avail_out=0,this.total_out=0,this.msg="",this.state=null,this.data_type=2,this.adler=0}},{}],54:[function(t,e,i){(function(t){!function(t,e){if(!t.setImmediate){var n,i,r,a,o=1,s={},l=!1,c=t.document,p=Object.getPrototypeOf&&Object.getPrototypeOf(t);p=p&&p.setTimeout?p:t,n="[object process]"==={}.toString.call(t.process)?function(t){process.nextTick((function(){u(t)}))}:function(){if(t.postMessage&&!t.importScripts){var e=!0,n=t.onmessage;return t.onmessage=function(){e=!1},t.postMessage("","*"),t.onmessage=n,e}}()?(a="setImmediate$"+Math.random()+"$",t.addEventListener?t.addEventListener("message",h,!1):t.attachEvent("onmessage",h),function(e){t.postMessage(a+e,"*")}):t.MessageChannel?((r=new MessageChannel).port1.onmessage=function(t){u(t.data)},function(t){r.port2.postMessage(t)}):c&&"onreadystatechange"in c.createElement("script")?(i=c.documentElement,function(t){var e=c.createElement("script");e.onreadystatechange=function(){u(t),e.onreadystatechange=null,i.removeChild(e),e=null},i.appendChild(e)}):function(t){setTimeout(u,0,t)},p.setImmediate=function(t){"function"!=typeof t&&(t=new Function(""+t));for(var e=new Array(arguments.length-1),i=0;i{function e(){this._types=Object.create(null),this._extensions=Object.create(null);for(let t=0;t{let i=n(146);t.exports=new i(n(415),n(14))},14:t=>{t.exports={"application/prs.cww":["cww"],"application/vnd.1000minds.decision-model+xml":["1km"],"application/vnd.3gpp.pic-bw-large":["plb"],"application/vnd.3gpp.pic-bw-small":["psb"],"application/vnd.3gpp.pic-bw-var":["pvb"],"application/vnd.3gpp2.tcap":["tcap"],"application/vnd.3m.post-it-notes":["pwn"],"application/vnd.accpac.simply.aso":["aso"],"application/vnd.accpac.simply.imp":["imp"],"application/vnd.acucobol":["acu"],"application/vnd.acucorp":["atc","acutc"],"application/vnd.adobe.air-application-installer-package+zip":["air"],"application/vnd.adobe.formscentral.fcdt":["fcdt"],"application/vnd.adobe.fxp":["fxp","fxpl"],"application/vnd.adobe.xdp+xml":["xdp"],"application/vnd.adobe.xfdf":["xfdf"],"application/vnd.ahead.space":["ahead"],"application/vnd.airzip.filesecure.azf":["azf"],"application/vnd.airzip.filesecure.azs":["azs"],"application/vnd.amazon.ebook":["azw"],"application/vnd.americandynamics.acc":["acc"],"application/vnd.amiga.ami":["ami"],"application/vnd.android.package-archive":["apk"],"application/vnd.anser-web-certificate-issue-initiation":["cii"],"application/vnd.anser-web-funds-transfer-initiation":["fti"],"application/vnd.antix.game-component":["atx"],"application/vnd.apple.installer+xml":["mpkg"],"application/vnd.apple.keynote":["key"],"application/vnd.apple.mpegurl":["m3u8"],"application/vnd.apple.numbers":["numbers"],"application/vnd.apple.pages":["pages"],"application/vnd.apple.pkpass":["pkpass"],"application/vnd.aristanetworks.swi":["swi"],"application/vnd.astraea-software.iota":["iota"],"application/vnd.audiograph":["aep"],"application/vnd.balsamiq.bmml+xml":["bmml"],"application/vnd.blueice.multipass":["mpm"],"application/vnd.bmi":["bmi"],"application/vnd.businessobjects":["rep"],"application/vnd.chemdraw+xml":["cdxml"],"application/vnd.chipnuts.karaoke-mmd":["mmd"],"application/vnd.cinderella":["cdy"],"application/vnd.citationstyles.style+xml":["csl"],"application/vnd.claymore":["cla"],"application/vnd.cloanto.rp9":["rp9"],"application/vnd.clonk.c4group":["c4g","c4d","c4f","c4p","c4u"],"application/vnd.cluetrust.cartomobile-config":["c11amc"],"application/vnd.cluetrust.cartomobile-config-pkg":["c11amz"],"application/vnd.commonspace":["csp"],"application/vnd.contact.cmsg":["cdbcmsg"],"application/vnd.cosmocaller":["cmc"],"application/vnd.crick.clicker":["clkx"],"application/vnd.crick.clicker.keyboard":["clkk"],"application/vnd.crick.clicker.palette":["clkp"],"application/vnd.crick.clicker.template":["clkt"],"application/vnd.crick.clicker.wordbank":["clkw"],"application/vnd.criticaltools.wbs+xml":["wbs"],"application/vnd.ctc-posml":["pml"],"application/vnd.cups-ppd":["ppd"],"application/vnd.curl.car":["car"],"application/vnd.curl.pcurl":["pcurl"],"application/vnd.dart":["dart"],"application/vnd.data-vision.rdz":["rdz"],"application/vnd.dbf":["dbf"],"application/vnd.dece.data":["uvf","uvvf","uvd","uvvd"],"application/vnd.dece.ttml+xml":["uvt","uvvt"],"application/vnd.dece.unspecified":["uvx","uvvx"],"application/vnd.dece.zip":["uvz","uvvz"],"application/vnd.denovo.fcselayout-link":["fe_launch"],"application/vnd.dna":["dna"],"application/vnd.dolby.mlp":["mlp"],"application/vnd.dpgraph":["dpg"],"application/vnd.dreamfactory":["dfac"],"application/vnd.ds-keypoint":["kpxx"],"application/vnd.dvb.ait":["ait"],"application/vnd.dvb.service":["svc"],"application/vnd.dynageo":["geo"],"application/vnd.ecowin.chart":["mag"],"application/vnd.enliven":["nml"],"application/vnd.epson.esf":["esf"],"application/vnd.epson.msf":["msf"],"application/vnd.epson.quickanime":["qam"],"application/vnd.epson.salt":["slt"],"application/vnd.epson.ssf":["ssf"],"application/vnd.eszigno3+xml":["es3","et3"],"application/vnd.ezpix-album":["ez2"],"application/vnd.ezpix-package":["ez3"],"application/vnd.fdf":["fdf"],"application/vnd.fdsn.mseed":["mseed"],"application/vnd.fdsn.seed":["seed","dataless"],"application/vnd.flographit":["gph"],"application/vnd.fluxtime.clip":["ftc"],"application/vnd.framemaker":["fm","frame","maker","book"],"application/vnd.frogans.fnc":["fnc"],"application/vnd.frogans.ltf":["ltf"],"application/vnd.fsc.weblaunch":["fsc"],"application/vnd.fujitsu.oasys":["oas"],"application/vnd.fujitsu.oasys2":["oa2"],"application/vnd.fujitsu.oasys3":["oa3"],"application/vnd.fujitsu.oasysgp":["fg5"],"application/vnd.fujitsu.oasysprs":["bh2"],"application/vnd.fujixerox.ddd":["ddd"],"application/vnd.fujixerox.docuworks":["xdw"],"application/vnd.fujixerox.docuworks.binder":["xbd"],"application/vnd.fuzzysheet":["fzs"],"application/vnd.genomatix.tuxedo":["txd"],"application/vnd.geogebra.file":["ggb"],"application/vnd.geogebra.tool":["ggt"],"application/vnd.geometry-explorer":["gex","gre"],"application/vnd.geonext":["gxt"],"application/vnd.geoplan":["g2w"],"application/vnd.geospace":["g3w"],"application/vnd.gmx":["gmx"],"application/vnd.google-apps.document":["gdoc"],"application/vnd.google-apps.presentation":["gslides"],"application/vnd.google-apps.spreadsheet":["gsheet"],"application/vnd.google-earth.kml+xml":["kml"],"application/vnd.google-earth.kmz":["kmz"],"application/vnd.grafeq":["gqf","gqs"],"application/vnd.groove-account":["gac"],"application/vnd.groove-help":["ghf"],"application/vnd.groove-identity-message":["gim"],"application/vnd.groove-injector":["grv"],"application/vnd.groove-tool-message":["gtm"],"application/vnd.groove-tool-template":["tpl"],"application/vnd.groove-vcard":["vcg"],"application/vnd.hal+xml":["hal"],"application/vnd.handheld-entertainment+xml":["zmm"],"application/vnd.hbci":["hbci"],"application/vnd.hhe.lesson-player":["les"],"application/vnd.hp-hpgl":["hpgl"],"application/vnd.hp-hpid":["hpid"],"application/vnd.hp-hps":["hps"],"application/vnd.hp-jlyt":["jlt"],"application/vnd.hp-pcl":["pcl"],"application/vnd.hp-pclxl":["pclxl"],"application/vnd.hydrostatix.sof-data":["sfd-hdstx"],"application/vnd.ibm.minipay":["mpy"],"application/vnd.ibm.modcap":["afp","listafp","list3820"],"application/vnd.ibm.rights-management":["irm"],"application/vnd.ibm.secure-container":["sc"],"application/vnd.iccprofile":["icc","icm"],"application/vnd.igloader":["igl"],"application/vnd.immervision-ivp":["ivp"],"application/vnd.immervision-ivu":["ivu"],"application/vnd.insors.igm":["igm"],"application/vnd.intercon.formnet":["xpw","xpx"],"application/vnd.intergeo":["i2g"],"application/vnd.intu.qbo":["qbo"],"application/vnd.intu.qfx":["qfx"],"application/vnd.ipunplugged.rcprofile":["rcprofile"],"application/vnd.irepository.package+xml":["irp"],"application/vnd.is-xpr":["xpr"],"application/vnd.isac.fcs":["fcs"],"application/vnd.jam":["jam"],"application/vnd.jcp.javame.midlet-rms":["rms"],"application/vnd.jisp":["jisp"],"application/vnd.joost.joda-archive":["joda"],"application/vnd.kahootz":["ktz","ktr"],"application/vnd.kde.karbon":["karbon"],"application/vnd.kde.kchart":["chrt"],"application/vnd.kde.kformula":["kfo"],"application/vnd.kde.kivio":["flw"],"application/vnd.kde.kontour":["kon"],"application/vnd.kde.kpresenter":["kpr","kpt"],"application/vnd.kde.kspread":["ksp"],"application/vnd.kde.kword":["kwd","kwt"],"application/vnd.kenameaapp":["htke"],"application/vnd.kidspiration":["kia"],"application/vnd.kinar":["kne","knp"],"application/vnd.koan":["skp","skd","skt","skm"],"application/vnd.kodak-descriptor":["sse"],"application/vnd.las.las+xml":["lasxml"],"application/vnd.llamagraphics.life-balance.desktop":["lbd"],"application/vnd.llamagraphics.life-balance.exchange+xml":["lbe"],"application/vnd.lotus-1-2-3":["123"],"application/vnd.lotus-approach":["apr"],"application/vnd.lotus-freelance":["pre"],"application/vnd.lotus-notes":["nsf"],"application/vnd.lotus-organizer":["org"],"application/vnd.lotus-screencam":["scm"],"application/vnd.lotus-wordpro":["lwp"],"application/vnd.macports.portpkg":["portpkg"],"application/vnd.mapbox-vector-tile":["mvt"],"application/vnd.mcd":["mcd"],"application/vnd.medcalcdata":["mc1"],"application/vnd.mediastation.cdkey":["cdkey"],"application/vnd.mfer":["mwf"],"application/vnd.mfmp":["mfm"],"application/vnd.micrografx.flo":["flo"],"application/vnd.micrografx.igx":["igx"],"application/vnd.mif":["mif"],"application/vnd.mobius.daf":["daf"],"application/vnd.mobius.dis":["dis"],"application/vnd.mobius.mbk":["mbk"],"application/vnd.mobius.mqy":["mqy"],"application/vnd.mobius.msl":["msl"],"application/vnd.mobius.plc":["plc"],"application/vnd.mobius.txf":["txf"],"application/vnd.mophun.application":["mpn"],"application/vnd.mophun.certificate":["mpc"],"application/vnd.mozilla.xul+xml":["xul"],"application/vnd.ms-artgalry":["cil"],"application/vnd.ms-cab-compressed":["cab"],"application/vnd.ms-excel":["xls","xlm","xla","xlc","xlt","xlw"],"application/vnd.ms-excel.addin.macroenabled.12":["xlam"],"application/vnd.ms-excel.sheet.binary.macroenabled.12":["xlsb"],"application/vnd.ms-excel.sheet.macroenabled.12":["xlsm"],"application/vnd.ms-excel.template.macroenabled.12":["xltm"],"application/vnd.ms-fontobject":["eot"],"application/vnd.ms-htmlhelp":["chm"],"application/vnd.ms-ims":["ims"],"application/vnd.ms-lrm":["lrm"],"application/vnd.ms-officetheme":["thmx"],"application/vnd.ms-outlook":["msg"],"application/vnd.ms-pki.seccat":["cat"],"application/vnd.ms-pki.stl":["*stl"],"application/vnd.ms-powerpoint":["ppt","pps","pot"],"application/vnd.ms-powerpoint.addin.macroenabled.12":["ppam"],"application/vnd.ms-powerpoint.presentation.macroenabled.12":["pptm"],"application/vnd.ms-powerpoint.slide.macroenabled.12":["sldm"],"application/vnd.ms-powerpoint.slideshow.macroenabled.12":["ppsm"],"application/vnd.ms-powerpoint.template.macroenabled.12":["potm"],"application/vnd.ms-project":["mpp","mpt"],"application/vnd.ms-word.document.macroenabled.12":["docm"],"application/vnd.ms-word.template.macroenabled.12":["dotm"],"application/vnd.ms-works":["wps","wks","wcm","wdb"],"application/vnd.ms-wpl":["wpl"],"application/vnd.ms-xpsdocument":["xps"],"application/vnd.mseq":["mseq"],"application/vnd.musician":["mus"],"application/vnd.muvee.style":["msty"],"application/vnd.mynfc":["taglet"],"application/vnd.neurolanguage.nlu":["nlu"],"application/vnd.nitf":["ntf","nitf"],"application/vnd.noblenet-directory":["nnd"],"application/vnd.noblenet-sealer":["nns"],"application/vnd.noblenet-web":["nnw"],"application/vnd.nokia.n-gage.ac+xml":["*ac"],"application/vnd.nokia.n-gage.data":["ngdat"],"application/vnd.nokia.n-gage.symbian.install":["n-gage"],"application/vnd.nokia.radio-preset":["rpst"],"application/vnd.nokia.radio-presets":["rpss"],"application/vnd.novadigm.edm":["edm"],"application/vnd.novadigm.edx":["edx"],"application/vnd.novadigm.ext":["ext"],"application/vnd.oasis.opendocument.chart":["odc"],"application/vnd.oasis.opendocument.chart-template":["otc"],"application/vnd.oasis.opendocument.database":["odb"],"application/vnd.oasis.opendocument.formula":["odf"],"application/vnd.oasis.opendocument.formula-template":["odft"],"application/vnd.oasis.opendocument.graphics":["odg"],"application/vnd.oasis.opendocument.graphics-template":["otg"],"application/vnd.oasis.opendocument.image":["odi"],"application/vnd.oasis.opendocument.image-template":["oti"],"application/vnd.oasis.opendocument.presentation":["odp"],"application/vnd.oasis.opendocument.presentation-template":["otp"],"application/vnd.oasis.opendocument.spreadsheet":["ods"],"application/vnd.oasis.opendocument.spreadsheet-template":["ots"],"application/vnd.oasis.opendocument.text":["odt"],"application/vnd.oasis.opendocument.text-master":["odm"],"application/vnd.oasis.opendocument.text-template":["ott"],"application/vnd.oasis.opendocument.text-web":["oth"],"application/vnd.olpc-sugar":["xo"],"application/vnd.oma.dd2+xml":["dd2"],"application/vnd.openblox.game+xml":["obgx"],"application/vnd.openofficeorg.extension":["oxt"],"application/vnd.openstreetmap.data+xml":["osm"],"application/vnd.openxmlformats-officedocument.presentationml.presentation":["pptx"],"application/vnd.openxmlformats-officedocument.presentationml.slide":["sldx"],"application/vnd.openxmlformats-officedocument.presentationml.slideshow":["ppsx"],"application/vnd.openxmlformats-officedocument.presentationml.template":["potx"],"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet":["xlsx"],"application/vnd.openxmlformats-officedocument.spreadsheetml.template":["xltx"],"application/vnd.openxmlformats-officedocument.wordprocessingml.document":["docx"],"application/vnd.openxmlformats-officedocument.wordprocessingml.template":["dotx"],"application/vnd.osgeo.mapguide.package":["mgp"],"application/vnd.osgi.dp":["dp"],"application/vnd.osgi.subsystem":["esa"],"application/vnd.palm":["pdb","pqa","oprc"],"application/vnd.pawaafile":["paw"],"application/vnd.pg.format":["str"],"application/vnd.pg.osasli":["ei6"],"application/vnd.picsel":["efif"],"application/vnd.pmi.widget":["wg"],"application/vnd.pocketlearn":["plf"],"application/vnd.powerbuilder6":["pbd"],"application/vnd.previewsystems.box":["box"],"application/vnd.proteus.magazine":["mgz"],"application/vnd.publishare-delta-tree":["qps"],"application/vnd.pvi.ptid1":["ptid"],"application/vnd.quark.quarkxpress":["qxd","qxt","qwd","qwt","qxl","qxb"],"application/vnd.rar":["rar"],"application/vnd.realvnc.bed":["bed"],"application/vnd.recordare.musicxml":["mxl"],"application/vnd.recordare.musicxml+xml":["musicxml"],"application/vnd.rig.cryptonote":["cryptonote"],"application/vnd.rim.cod":["cod"],"application/vnd.rn-realmedia":["rm"],"application/vnd.rn-realmedia-vbr":["rmvb"],"application/vnd.route66.link66+xml":["link66"],"application/vnd.sailingtracker.track":["st"],"application/vnd.seemail":["see"],"application/vnd.sema":["sema"],"application/vnd.semd":["semd"],"application/vnd.semf":["semf"],"application/vnd.shana.informed.formdata":["ifm"],"application/vnd.shana.informed.formtemplate":["itp"],"application/vnd.shana.informed.interchange":["iif"],"application/vnd.shana.informed.package":["ipk"],"application/vnd.simtech-mindmapper":["twd","twds"],"application/vnd.smaf":["mmf"],"application/vnd.smart.teacher":["teacher"],"application/vnd.software602.filler.form+xml":["fo"],"application/vnd.solent.sdkm+xml":["sdkm","sdkd"],"application/vnd.spotfire.dxp":["dxp"],"application/vnd.spotfire.sfs":["sfs"],"application/vnd.stardivision.calc":["sdc"],"application/vnd.stardivision.draw":["sda"],"application/vnd.stardivision.impress":["sdd"],"application/vnd.stardivision.math":["smf"],"application/vnd.stardivision.writer":["sdw","vor"],"application/vnd.stardivision.writer-global":["sgl"],"application/vnd.stepmania.package":["smzip"],"application/vnd.stepmania.stepchart":["sm"],"application/vnd.sun.wadl+xml":["wadl"],"application/vnd.sun.xml.calc":["sxc"],"application/vnd.sun.xml.calc.template":["stc"],"application/vnd.sun.xml.draw":["sxd"],"application/vnd.sun.xml.draw.template":["std"],"application/vnd.sun.xml.impress":["sxi"],"application/vnd.sun.xml.impress.template":["sti"],"application/vnd.sun.xml.math":["sxm"],"application/vnd.sun.xml.writer":["sxw"],"application/vnd.sun.xml.writer.global":["sxg"],"application/vnd.sun.xml.writer.template":["stw"],"application/vnd.sus-calendar":["sus","susp"],"application/vnd.svd":["svd"],"application/vnd.symbian.install":["sis","sisx"],"application/vnd.syncml+xml":["xsm"],"application/vnd.syncml.dm+wbxml":["bdm"],"application/vnd.syncml.dm+xml":["xdm"],"application/vnd.syncml.dmddf+xml":["ddf"],"application/vnd.tao.intent-module-archive":["tao"],"application/vnd.tcpdump.pcap":["pcap","cap","dmp"],"application/vnd.tmobile-livetv":["tmo"],"application/vnd.trid.tpt":["tpt"],"application/vnd.triscape.mxs":["mxs"],"application/vnd.trueapp":["tra"],"application/vnd.ufdl":["ufd","ufdl"],"application/vnd.uiq.theme":["utz"],"application/vnd.umajin":["umj"],"application/vnd.unity":["unityweb"],"application/vnd.uoml+xml":["uoml"],"application/vnd.vcx":["vcx"],"application/vnd.visio":["vsd","vst","vss","vsw"],"application/vnd.visionary":["vis"],"application/vnd.vsf":["vsf"],"application/vnd.wap.wbxml":["wbxml"],"application/vnd.wap.wmlc":["wmlc"],"application/vnd.wap.wmlscriptc":["wmlsc"],"application/vnd.webturbo":["wtb"],"application/vnd.wolfram.player":["nbp"],"application/vnd.wordperfect":["wpd"],"application/vnd.wqd":["wqd"],"application/vnd.wt.stf":["stf"],"application/vnd.xara":["xar"],"application/vnd.xfdl":["xfdl"],"application/vnd.yamaha.hv-dic":["hvd"],"application/vnd.yamaha.hv-script":["hvs"],"application/vnd.yamaha.hv-voice":["hvp"],"application/vnd.yamaha.openscoreformat":["osf"],"application/vnd.yamaha.openscoreformat.osfpvg+xml":["osfpvg"],"application/vnd.yamaha.smaf-audio":["saf"],"application/vnd.yamaha.smaf-phrase":["spf"],"application/vnd.yellowriver-custom-menu":["cmp"],"application/vnd.zul":["zir","zirz"],"application/vnd.zzazz.deck+xml":["zaz"],"application/x-7z-compressed":["7z"],"application/x-abiword":["abw"],"application/x-ace-compressed":["ace"],"application/x-apple-diskimage":["*dmg"],"application/x-arj":["arj"],"application/x-authorware-bin":["aab","x32","u32","vox"],"application/x-authorware-map":["aam"],"application/x-authorware-seg":["aas"],"application/x-bcpio":["bcpio"],"application/x-bdoc":["*bdoc"],"application/x-bittorrent":["torrent"],"application/x-blorb":["blb","blorb"],"application/x-bzip":["bz"],"application/x-bzip2":["bz2","boz"],"application/x-cbr":["cbr","cba","cbt","cbz","cb7"],"application/x-cdlink":["vcd"],"application/x-cfs-compressed":["cfs"],"application/x-chat":["chat"],"application/x-chess-pgn":["pgn"],"application/x-chrome-extension":["crx"],"application/x-cocoa":["cco"],"application/x-conference":["nsc"],"application/x-cpio":["cpio"],"application/x-csh":["csh"],"application/x-debian-package":["*deb","udeb"],"application/x-dgc-compressed":["dgc"],"application/x-director":["dir","dcr","dxr","cst","cct","cxt","w3d","fgd","swa"],"application/x-doom":["wad"],"application/x-dtbncx+xml":["ncx"],"application/x-dtbook+xml":["dtb"],"application/x-dtbresource+xml":["res"],"application/x-dvi":["dvi"],"application/x-envoy":["evy"],"application/x-eva":["eva"],"application/x-font-bdf":["bdf"],"application/x-font-ghostscript":["gsf"],"application/x-font-linux-psf":["psf"],"application/x-font-pcf":["pcf"],"application/x-font-snf":["snf"],"application/x-font-type1":["pfa","pfb","pfm","afm"],"application/x-freearc":["arc"],"application/x-futuresplash":["spl"],"application/x-gca-compressed":["gca"],"application/x-glulx":["ulx"],"application/x-gnumeric":["gnumeric"],"application/x-gramps-xml":["gramps"],"application/x-gtar":["gtar"],"application/x-hdf":["hdf"],"application/x-httpd-php":["php"],"application/x-install-instructions":["install"],"application/x-iso9660-image":["*iso"],"application/x-iwork-keynote-sffkey":["*key"],"application/x-iwork-numbers-sffnumbers":["*numbers"],"application/x-iwork-pages-sffpages":["*pages"],"application/x-java-archive-diff":["jardiff"],"application/x-java-jnlp-file":["jnlp"],"application/x-keepass2":["kdbx"],"application/x-latex":["latex"],"application/x-lua-bytecode":["luac"],"application/x-lzh-compressed":["lzh","lha"],"application/x-makeself":["run"],"application/x-mie":["mie"],"application/x-mobipocket-ebook":["prc","mobi"],"application/x-ms-application":["application"],"application/x-ms-shortcut":["lnk"],"application/x-ms-wmd":["wmd"],"application/x-ms-wmz":["wmz"],"application/x-ms-xbap":["xbap"],"application/x-msaccess":["mdb"],"application/x-msbinder":["obd"],"application/x-mscardfile":["crd"],"application/x-msclip":["clp"],"application/x-msdos-program":["*exe"],"application/x-msdownload":["*exe","*dll","com","bat","*msi"],"application/x-msmediaview":["mvb","m13","m14"],"application/x-msmetafile":["*wmf","*wmz","*emf","emz"],"application/x-msmoney":["mny"],"application/x-mspublisher":["pub"],"application/x-msschedule":["scd"],"application/x-msterminal":["trm"],"application/x-mswrite":["wri"],"application/x-netcdf":["nc","cdf"],"application/x-ns-proxy-autoconfig":["pac"],"application/x-nzb":["nzb"],"application/x-perl":["pl","pm"],"application/x-pilot":["*prc","*pdb"],"application/x-pkcs12":["p12","pfx"],"application/x-pkcs7-certificates":["p7b","spc"],"application/x-pkcs7-certreqresp":["p7r"],"application/x-rar-compressed":["*rar"],"application/x-redhat-package-manager":["rpm"],"application/x-research-info-systems":["ris"],"application/x-sea":["sea"],"application/x-sh":["sh"],"application/x-shar":["shar"],"application/x-shockwave-flash":["swf"],"application/x-silverlight-app":["xap"],"application/x-sql":["sql"],"application/x-stuffit":["sit"],"application/x-stuffitx":["sitx"],"application/x-subrip":["srt"],"application/x-sv4cpio":["sv4cpio"],"application/x-sv4crc":["sv4crc"],"application/x-t3vm-image":["t3"],"application/x-tads":["gam"],"application/x-tar":["tar"],"application/x-tcl":["tcl","tk"],"application/x-tex":["tex"],"application/x-tex-tfm":["tfm"],"application/x-texinfo":["texinfo","texi"],"application/x-tgif":["*obj"],"application/x-ustar":["ustar"],"application/x-virtualbox-hdd":["hdd"],"application/x-virtualbox-ova":["ova"],"application/x-virtualbox-ovf":["ovf"],"application/x-virtualbox-vbox":["vbox"],"application/x-virtualbox-vbox-extpack":["vbox-extpack"],"application/x-virtualbox-vdi":["vdi"],"application/x-virtualbox-vhd":["vhd"],"application/x-virtualbox-vmdk":["vmdk"],"application/x-wais-source":["src"],"application/x-web-app-manifest+json":["webapp"],"application/x-x509-ca-cert":["der","crt","pem"],"application/x-xfig":["fig"],"application/x-xliff+xml":["*xlf"],"application/x-xpinstall":["xpi"],"application/x-xz":["xz"],"application/x-zmachine":["z1","z2","z3","z4","z5","z6","z7","z8"],"audio/vnd.dece.audio":["uva","uvva"],"audio/vnd.digital-winds":["eol"],"audio/vnd.dra":["dra"],"audio/vnd.dts":["dts"],"audio/vnd.dts.hd":["dtshd"],"audio/vnd.lucent.voice":["lvp"],"audio/vnd.ms-playready.media.pya":["pya"],"audio/vnd.nuera.ecelp4800":["ecelp4800"],"audio/vnd.nuera.ecelp7470":["ecelp7470"],"audio/vnd.nuera.ecelp9600":["ecelp9600"],"audio/vnd.rip":["rip"],"audio/x-aac":["aac"],"audio/x-aiff":["aif","aiff","aifc"],"audio/x-caf":["caf"],"audio/x-flac":["flac"],"audio/x-m4a":["*m4a"],"audio/x-matroska":["mka"],"audio/x-mpegurl":["m3u"],"audio/x-ms-wax":["wax"],"audio/x-ms-wma":["wma"],"audio/x-pn-realaudio":["ram","ra"],"audio/x-pn-realaudio-plugin":["rmp"],"audio/x-realaudio":["*ra"],"audio/x-wav":["*wav"],"chemical/x-cdx":["cdx"],"chemical/x-cif":["cif"],"chemical/x-cmdf":["cmdf"],"chemical/x-cml":["cml"],"chemical/x-csml":["csml"],"chemical/x-xyz":["xyz"],"image/prs.btif":["btif"],"image/prs.pti":["pti"],"image/vnd.adobe.photoshop":["psd"],"image/vnd.airzip.accelerator.azv":["azv"],"image/vnd.dece.graphic":["uvi","uvvi","uvg","uvvg"],"image/vnd.djvu":["djvu","djv"],"image/vnd.dvb.subtitle":["*sub"],"image/vnd.dwg":["dwg"],"image/vnd.dxf":["dxf"],"image/vnd.fastbidsheet":["fbs"],"image/vnd.fpx":["fpx"],"image/vnd.fst":["fst"],"image/vnd.fujixerox.edmics-mmr":["mmr"],"image/vnd.fujixerox.edmics-rlc":["rlc"],"image/vnd.microsoft.icon":["ico"],"image/vnd.ms-dds":["dds"],"image/vnd.ms-modi":["mdi"],"image/vnd.ms-photo":["wdp"],"image/vnd.net-fpx":["npx"],"image/vnd.pco.b16":["b16"],"image/vnd.tencent.tap":["tap"],"image/vnd.valve.source.texture":["vtf"],"image/vnd.wap.wbmp":["wbmp"],"image/vnd.xiff":["xif"],"image/vnd.zbrush.pcx":["pcx"],"image/x-3ds":["3ds"],"image/x-cmu-raster":["ras"],"image/x-cmx":["cmx"],"image/x-freehand":["fh","fhc","fh4","fh5","fh7"],"image/x-icon":["*ico"],"image/x-jng":["jng"],"image/x-mrsid-image":["sid"],"image/x-ms-bmp":["*bmp"],"image/x-pcx":["*pcx"],"image/x-pict":["pic","pct"],"image/x-portable-anymap":["pnm"],"image/x-portable-bitmap":["pbm"],"image/x-portable-graymap":["pgm"],"image/x-portable-pixmap":["ppm"],"image/x-rgb":["rgb"],"image/x-tga":["tga"],"image/x-xbitmap":["xbm"],"image/x-xpixmap":["xpm"],"image/x-xwindowdump":["xwd"],"message/vnd.wfa.wsc":["wsc"],"model/vnd.collada+xml":["dae"],"model/vnd.dwf":["dwf"],"model/vnd.gdl":["gdl"],"model/vnd.gtw":["gtw"],"model/vnd.mts":["mts"],"model/vnd.opengex":["ogex"],"model/vnd.parasolid.transmit.binary":["x_b"],"model/vnd.parasolid.transmit.text":["x_t"],"model/vnd.sap.vds":["vds"],"model/vnd.usdz+zip":["usdz"],"model/vnd.valve.source.compiled-map":["bsp"],"model/vnd.vtu":["vtu"],"text/prs.lines.tag":["dsc"],"text/vnd.curl":["curl"],"text/vnd.curl.dcurl":["dcurl"],"text/vnd.curl.mcurl":["mcurl"],"text/vnd.curl.scurl":["scurl"],"text/vnd.dvb.subtitle":["sub"],"text/vnd.fly":["fly"],"text/vnd.fmi.flexstor":["flx"],"text/vnd.graphviz":["gv"],"text/vnd.in3d.3dml":["3dml"],"text/vnd.in3d.spot":["spot"],"text/vnd.sun.j2me.app-descriptor":["jad"],"text/vnd.wap.wml":["wml"],"text/vnd.wap.wmlscript":["wmls"],"text/x-asm":["s","asm"],"text/x-c":["c","cc","cxx","cpp","h","hh","dic"],"text/x-component":["htc"],"text/x-fortran":["f","for","f77","f90"],"text/x-handlebars-template":["hbs"],"text/x-java-source":["java"],"text/x-lua":["lua"],"text/x-markdown":["mkd"],"text/x-nfo":["nfo"],"text/x-opml":["opml"],"text/x-org":["*org"],"text/x-pascal":["p","pas"],"text/x-processing":["pde"],"text/x-sass":["sass"],"text/x-scss":["scss"],"text/x-setext":["etx"],"text/x-sfv":["sfv"],"text/x-suse-ymp":["ymp"],"text/x-uuencode":["uu"],"text/x-vcalendar":["vcs"],"text/x-vcard":["vcf"],"video/vnd.dece.hd":["uvh","uvvh"],"video/vnd.dece.mobile":["uvm","uvvm"],"video/vnd.dece.pd":["uvp","uvvp"],"video/vnd.dece.sd":["uvs","uvvs"],"video/vnd.dece.video":["uvv","uvvv"],"video/vnd.dvb.file":["dvb"],"video/vnd.fvt":["fvt"],"video/vnd.mpegurl":["mxu","m4u"],"video/vnd.ms-playready.media.pyv":["pyv"],"video/vnd.uvvu.mp4":["uvu","uvvu"],"video/vnd.vivo":["viv"],"video/x-f4v":["f4v"],"video/x-fli":["fli"],"video/x-flv":["flv"],"video/x-m4v":["m4v"],"video/x-matroska":["mkv","mk3d","mks"],"video/x-mng":["mng"],"video/x-ms-asf":["asf","asx"],"video/x-ms-vob":["vob"],"video/x-ms-wm":["wm"],"video/x-ms-wmv":["wmv"],"video/x-ms-wmx":["wmx"],"video/x-ms-wvx":["wvx"],"video/x-msvideo":["avi"],"video/x-sgi-movie":["movie"],"video/x-smv":["smv"],"x-conference/x-cooltalk":["ice"]}},415:t=>{t.exports={"application/andrew-inset":["ez"],"application/applixware":["aw"],"application/atom+xml":["atom"],"application/atomcat+xml":["atomcat"],"application/atomdeleted+xml":["atomdeleted"],"application/atomsvc+xml":["atomsvc"],"application/atsc-dwd+xml":["dwd"],"application/atsc-held+xml":["held"],"application/atsc-rsat+xml":["rsat"],"application/bdoc":["bdoc"],"application/calendar+xml":["xcs"],"application/ccxml+xml":["ccxml"],"application/cdfx+xml":["cdfx"],"application/cdmi-capability":["cdmia"],"application/cdmi-container":["cdmic"],"application/cdmi-domain":["cdmid"],"application/cdmi-object":["cdmio"],"application/cdmi-queue":["cdmiq"],"application/cu-seeme":["cu"],"application/dash+xml":["mpd"],"application/davmount+xml":["davmount"],"application/docbook+xml":["dbk"],"application/dssc+der":["dssc"],"application/dssc+xml":["xdssc"],"application/ecmascript":["es","ecma"],"application/emma+xml":["emma"],"application/emotionml+xml":["emotionml"],"application/epub+zip":["epub"],"application/exi":["exi"],"application/express":["exp"],"application/fdt+xml":["fdt"],"application/font-tdpfr":["pfr"],"application/geo+json":["geojson"],"application/gml+xml":["gml"],"application/gpx+xml":["gpx"],"application/gxf":["gxf"],"application/gzip":["gz"],"application/hjson":["hjson"],"application/hyperstudio":["stk"],"application/inkml+xml":["ink","inkml"],"application/ipfix":["ipfix"],"application/its+xml":["its"],"application/java-archive":["jar","war","ear"],"application/java-serialized-object":["ser"],"application/java-vm":["class"],"application/javascript":["js","mjs"],"application/json":["json","map"],"application/json5":["json5"],"application/jsonml+json":["jsonml"],"application/ld+json":["jsonld"],"application/lgr+xml":["lgr"],"application/lost+xml":["lostxml"],"application/mac-binhex40":["hqx"],"application/mac-compactpro":["cpt"],"application/mads+xml":["mads"],"application/manifest+json":["webmanifest"],"application/marc":["mrc"],"application/marcxml+xml":["mrcx"],"application/mathematica":["ma","nb","mb"],"application/mathml+xml":["mathml"],"application/mbox":["mbox"],"application/mediaservercontrol+xml":["mscml"],"application/metalink+xml":["metalink"],"application/metalink4+xml":["meta4"],"application/mets+xml":["mets"],"application/mmt-aei+xml":["maei"],"application/mmt-usd+xml":["musd"],"application/mods+xml":["mods"],"application/mp21":["m21","mp21"],"application/mp4":["mp4s","m4p"],"application/msword":["doc","dot"],"application/mxf":["mxf"],"application/n-quads":["nq"],"application/n-triples":["nt"],"application/node":["cjs"],"application/octet-stream":["bin","dms","lrf","mar","so","dist","distz","pkg","bpk","dump","elc","deploy","exe","dll","deb","dmg","iso","img","msi","msp","msm","buffer"],"application/oda":["oda"],"application/oebps-package+xml":["opf"],"application/ogg":["ogx"],"application/omdoc+xml":["omdoc"],"application/onenote":["onetoc","onetoc2","onetmp","onepkg"],"application/oxps":["oxps"],"application/p2p-overlay+xml":["relo"],"application/patch-ops-error+xml":["xer"],"application/pdf":["pdf"],"application/pgp-encrypted":["pgp"],"application/pgp-signature":["asc","sig"],"application/pics-rules":["prf"],"application/pkcs10":["p10"],"application/pkcs7-mime":["p7m","p7c"],"application/pkcs7-signature":["p7s"],"application/pkcs8":["p8"],"application/pkix-attr-cert":["ac"],"application/pkix-cert":["cer"],"application/pkix-crl":["crl"],"application/pkix-pkipath":["pkipath"],"application/pkixcmp":["pki"],"application/pls+xml":["pls"],"application/postscript":["ai","eps","ps"],"application/provenance+xml":["provx"],"application/pskc+xml":["pskcxml"],"application/raml+yaml":["raml"],"application/rdf+xml":["rdf","owl"],"application/reginfo+xml":["rif"],"application/relax-ng-compact-syntax":["rnc"],"application/resource-lists+xml":["rl"],"application/resource-lists-diff+xml":["rld"],"application/rls-services+xml":["rs"],"application/route-apd+xml":["rapd"],"application/route-s-tsid+xml":["sls"],"application/route-usd+xml":["rusd"],"application/rpki-ghostbusters":["gbr"],"application/rpki-manifest":["mft"],"application/rpki-roa":["roa"],"application/rsd+xml":["rsd"],"application/rss+xml":["rss"],"application/rtf":["rtf"],"application/sbml+xml":["sbml"],"application/scvp-cv-request":["scq"],"application/scvp-cv-response":["scs"],"application/scvp-vp-request":["spq"],"application/scvp-vp-response":["spp"],"application/sdp":["sdp"],"application/senml+xml":["senmlx"],"application/sensml+xml":["sensmlx"],"application/set-payment-initiation":["setpay"],"application/set-registration-initiation":["setreg"],"application/shf+xml":["shf"],"application/sieve":["siv","sieve"],"application/smil+xml":["smi","smil"],"application/sparql-query":["rq"],"application/sparql-results+xml":["srx"],"application/srgs":["gram"],"application/srgs+xml":["grxml"],"application/sru+xml":["sru"],"application/ssdl+xml":["ssdl"],"application/ssml+xml":["ssml"],"application/swid+xml":["swidtag"],"application/tei+xml":["tei","teicorpus"],"application/thraud+xml":["tfi"],"application/timestamped-data":["tsd"],"application/toml":["toml"],"application/trig":["trig"],"application/ttml+xml":["ttml"],"application/ubjson":["ubj"],"application/urc-ressheet+xml":["rsheet"],"application/urc-targetdesc+xml":["td"],"application/voicexml+xml":["vxml"],"application/wasm":["wasm"],"application/widget":["wgt"],"application/winhlp":["hlp"],"application/wsdl+xml":["wsdl"],"application/wspolicy+xml":["wspolicy"],"application/xaml+xml":["xaml"],"application/xcap-att+xml":["xav"],"application/xcap-caps+xml":["xca"],"application/xcap-diff+xml":["xdf"],"application/xcap-el+xml":["xel"],"application/xcap-ns+xml":["xns"],"application/xenc+xml":["xenc"],"application/xhtml+xml":["xhtml","xht"],"application/xliff+xml":["xlf"],"application/xml":["xml","xsl","xsd","rng"],"application/xml-dtd":["dtd"],"application/xop+xml":["xop"],"application/xproc+xml":["xpl"],"application/xslt+xml":["*xsl","xslt"],"application/xspf+xml":["xspf"],"application/xv+xml":["mxml","xhvml","xvml","xvm"],"application/yang":["yang"],"application/yin+xml":["yin"],"application/zip":["zip"],"audio/3gpp":["*3gpp"],"audio/adpcm":["adp"],"audio/amr":["amr"],"audio/basic":["au","snd"],"audio/midi":["mid","midi","kar","rmi"],"audio/mobile-xmf":["mxmf"],"audio/mp3":["*mp3"],"audio/mp4":["m4a","mp4a"],"audio/mpeg":["mpga","mp2","mp2a","mp3","m2a","m3a"],"audio/ogg":["oga","ogg","spx","opus"],"audio/s3m":["s3m"],"audio/silk":["sil"],"audio/wav":["wav"],"audio/wave":["*wav"],"audio/webm":["weba"],"audio/xm":["xm"],"font/collection":["ttc"],"font/otf":["otf"],"font/ttf":["ttf"],"font/woff":["woff"],"font/woff2":["woff2"],"image/aces":["exr"],"image/apng":["apng"],"image/avif":["avif"],"image/bmp":["bmp"],"image/cgm":["cgm"],"image/dicom-rle":["drle"],"image/emf":["emf"],"image/fits":["fits"],"image/g3fax":["g3"],"image/gif":["gif"],"image/heic":["heic"],"image/heic-sequence":["heics"],"image/heif":["heif"],"image/heif-sequence":["heifs"],"image/hej2k":["hej2"],"image/hsj2":["hsj2"],"image/ief":["ief"],"image/jls":["jls"],"image/jp2":["jp2","jpg2"],"image/jpeg":["jpeg","jpg","jpe"],"image/jph":["jph"],"image/jphc":["jhc"],"image/jpm":["jpm"],"image/jpx":["jpx","jpf"],"image/jxr":["jxr"],"image/jxra":["jxra"],"image/jxrs":["jxrs"],"image/jxs":["jxs"],"image/jxsc":["jxsc"],"image/jxsi":["jxsi"],"image/jxss":["jxss"],"image/ktx":["ktx"],"image/ktx2":["ktx2"],"image/png":["png"],"image/sgi":["sgi"],"image/svg+xml":["svg","svgz"],"image/t38":["t38"],"image/tiff":["tif","tiff"],"image/tiff-fx":["tfx"],"image/webp":["webp"],"image/wmf":["wmf"],"message/disposition-notification":["disposition-notification"],"message/global":["u8msg"],"message/global-delivery-status":["u8dsn"],"message/global-disposition-notification":["u8mdn"],"message/global-headers":["u8hdr"],"message/rfc822":["eml","mime"],"model/3mf":["3mf"],"model/gltf+json":["gltf"],"model/gltf-binary":["glb"],"model/iges":["igs","iges"],"model/mesh":["msh","mesh","silo"],"model/mtl":["mtl"],"model/obj":["obj"],"model/step+xml":["stpx"],"model/step+zip":["stpz"],"model/step-xml+zip":["stpxz"],"model/stl":["stl"],"model/vrml":["wrl","vrml"],"model/x3d+binary":["*x3db","x3dbz"],"model/x3d+fastinfoset":["x3db"],"model/x3d+vrml":["*x3dv","x3dvz"],"model/x3d+xml":["x3d","x3dz"],"model/x3d-vrml":["x3dv"],"text/cache-manifest":["appcache","manifest"],"text/calendar":["ics","ifb"],"text/coffeescript":["coffee","litcoffee"],"text/css":["css"],"text/csv":["csv"],"text/html":["html","htm","shtml"],"text/jade":["jade"],"text/jsx":["jsx"],"text/less":["less"],"text/markdown":["markdown","md"],"text/mathml":["mml"],"text/mdx":["mdx"],"text/n3":["n3"],"text/plain":["txt","text","conf","def","list","log","in","ini"],"text/richtext":["rtx"],"text/rtf":["*rtf"],"text/sgml":["sgml","sgm"],"text/shex":["shex"],"text/slim":["slim","slm"],"text/spdx":["spdx"],"text/stylus":["stylus","styl"],"text/tab-separated-values":["tsv"],"text/troff":["t","tr","roff","man","me","ms"],"text/turtle":["ttl"],"text/uri-list":["uri","uris","urls"],"text/vcard":["vcard"],"text/vtt":["vtt"],"text/xml":["*xml"],"text/yaml":["yaml","yml"],"video/3gpp":["3gp","3gpp"],"video/3gpp2":["3g2"],"video/h261":["h261"],"video/h263":["h263"],"video/h264":["h264"],"video/iso.segment":["m4s"],"video/jpeg":["jpgv"],"video/jpm":["*jpm","jpgm"],"video/mj2":["mj2","mjp2"],"video/mp2t":["ts"],"video/mp4":["mp4","mp4v","mpg4"],"video/mpeg":["mpeg","mpg","mpe","m1v","m2v"],"video/ogg":["ogv"],"video/quicktime":["qt","mov"],"video/webm":["webm"]}},592:(t,e,n)=>{const i=n(138),r=n(115),a=n(907),o=n(776);function s(t,e,n,a,o){const s=[].slice.call(arguments,1),l=s.length,c="function"==typeof s[l-1];if(!c&&!i())throw new Error("Callback required as last argument");if(!c){if(l<1)throw new Error("Too few arguments provided");return 1===l?(n=e,e=a=void 0):2!==l||e.getContext||(a=n,n=e,e=void 0),new Promise((function(i,o){try{const o=r.create(n,a);i(t(o,e,a))}catch(t){o(t)}}))}if(l<2)throw new Error("Too few arguments provided");2===l?(o=n,n=e,e=a=void 0):3===l&&(e.getContext&&void 0===o?(o=a,a=void 0):(o=a,a=n,n=e,e=void 0));try{const i=r.create(n,a);o(null,t(i,e,a))}catch(t){o(t)}}e.create=r.create,e.toCanvas=s.bind(null,a.render),e.toDataURL=s.bind(null,a.renderToDataURL),e.toString=s.bind(null,(function(t,e,n){return o.render(t,n)}))},138:t=>{t.exports=function(){return"function"==typeof Promise&&Promise.prototype&&Promise.prototype.then}},845:(t,e,n)=>{const i=n(242).getSymbolSize;e.getRowColCoords=function(t){if(1===t)return[];const e=Math.floor(t/7)+2,n=i(t),r=145===n?26:2*Math.ceil((n-13)/(2*e-2)),a=[n-7];for(let t=1;t{const i=n(910),r=["0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"," ","$","%","*","+","-",".","/",":"];function a(t){this.mode=i.ALPHANUMERIC,this.data=t}a.getBitsLength=function(t){return 11*Math.floor(t/2)+t%2*6},a.prototype.getLength=function(){return this.data.length},a.prototype.getBitsLength=function(){return a.getBitsLength(this.data.length)},a.prototype.write=function(t){let e;for(e=0;e+2<=this.data.length;e+=2){let n=45*r.indexOf(this.data[e]);n+=r.indexOf(this.data[e+1]),t.put(n,11)}this.data.length%2&&t.put(r.indexOf(this.data[e]),6)},t.exports=a},245:t=>{function e(){this.buffer=[],this.length=0}e.prototype={get:function(t){const e=Math.floor(t/8);return 1==(this.buffer[e]>>>7-t%8&1)},put:function(t,e){for(let n=0;n>>e-n-1&1))},getLengthInBits:function(){return this.length},putBit:function(t){const e=Math.floor(this.length/8);this.buffer.length<=e&&this.buffer.push(0),t&&(this.buffer[e]|=128>>>this.length%8),this.length++}},t.exports=e},280:t=>{function e(t){if(!t||t<1)throw new Error("BitMatrix size must be defined and greater than 0");this.size=t,this.data=new Uint8Array(t*t),this.reservedBit=new Uint8Array(t*t)}e.prototype.set=function(t,e,n,i){const r=t*this.size+e;this.data[r]=n,i&&(this.reservedBit[r]=!0)},e.prototype.get=function(t,e){return this.data[t*this.size+e]},e.prototype.xor=function(t,e,n){this.data[t*this.size+e]^=n},e.prototype.isReserved=function(t,e){return this.reservedBit[t*this.size+e]},t.exports=e},424:(t,e,n)=>{const i=n(378),r=n(910);function a(t){this.mode=r.BYTE,"string"==typeof t&&(t=i(t)),this.data=new Uint8Array(t)}a.getBitsLength=function(t){return 8*t},a.prototype.getLength=function(){return this.data.length},a.prototype.getBitsLength=function(){return a.getBitsLength(this.data.length)},a.prototype.write=function(t){for(let e=0,n=this.data.length;e{const i=n(908),r=[1,1,1,1,1,1,1,1,1,1,2,2,1,2,2,4,1,2,4,4,2,4,4,4,2,4,6,5,2,4,6,6,2,5,8,8,4,5,8,8,4,5,8,11,4,8,10,11,4,9,12,16,4,9,16,16,6,10,12,18,6,10,17,16,6,11,16,19,6,13,18,21,7,14,21,25,8,16,20,25,8,17,23,25,9,17,23,34,9,18,25,30,10,20,27,32,12,21,29,35,12,23,34,37,12,25,34,40,13,26,35,42,14,28,38,45,15,29,40,48,16,31,43,51,17,33,45,54,18,35,48,57,19,37,51,60,19,38,53,63,20,40,56,66,21,43,59,70,22,45,62,74,24,47,65,77,25,49,68,81],a=[7,10,13,17,10,16,22,28,15,26,36,44,20,36,52,64,26,48,72,88,36,64,96,112,40,72,108,130,48,88,132,156,60,110,160,192,72,130,192,224,80,150,224,264,96,176,260,308,104,198,288,352,120,216,320,384,132,240,360,432,144,280,408,480,168,308,448,532,180,338,504,588,196,364,546,650,224,416,600,700,224,442,644,750,252,476,690,816,270,504,750,900,300,560,810,960,312,588,870,1050,336,644,952,1110,360,700,1020,1200,390,728,1050,1260,420,784,1140,1350,450,812,1200,1440,480,868,1290,1530,510,924,1350,1620,540,980,1440,1710,570,1036,1530,1800,570,1064,1590,1890,600,1120,1680,1980,630,1204,1770,2100,660,1260,1860,2220,720,1316,1950,2310,750,1372,2040,2430];e.getBlocksCount=function(t,e){switch(e){case i.L:return r[4*(t-1)+0];case i.M:return r[4*(t-1)+1];case i.Q:return r[4*(t-1)+2];case i.H:return r[4*(t-1)+3];default:return}},e.getTotalCodewordsCount=function(t,e){switch(e){case i.L:return a[4*(t-1)+0];case i.M:return a[4*(t-1)+1];case i.Q:return a[4*(t-1)+2];case i.H:return a[4*(t-1)+3];default:return}}},908:(t,e)=>{e.L={bit:1},e.M={bit:0},e.Q={bit:3},e.H={bit:2},e.isValid=function(t){return t&&void 0!==t.bit&&t.bit>=0&&t.bit<4},e.from=function(t,n){if(e.isValid(t))return t;try{return function(t){if("string"!=typeof t)throw new Error("Param is not a string");switch(t.toLowerCase()){case"l":case"low":return e.L;case"m":case"medium":return e.M;case"q":case"quartile":return e.Q;case"h":case"high":return e.H;default:throw new Error("Unknown EC Level: "+t)}}(t)}catch(t){return n}}},526:(t,e,n)=>{const i=n(242).getSymbolSize;e.getPositions=function(t){const e=i(t);return[[0,0],[e-7,0],[0,e-7]]}},642:(t,e,n)=>{const i=n(242),r=i.getBCHDigit(1335);e.getEncodedBits=function(t,e){const n=t.bit<<3|e;let a=n<<10;for(;i.getBCHDigit(a)-r>=0;)a^=1335<{const n=new Uint8Array(512),i=new Uint8Array(256);!function(){let t=1;for(let e=0;e<255;e++)n[e]=t,i[t]=e,t<<=1,256&t&&(t^=285);for(let t=255;t<512;t++)n[t]=n[t-255]}(),e.log=function(t){if(t<1)throw new Error("log("+t+")");return i[t]},e.exp=function(t){return n[t]},e.mul=function(t,e){return 0===t||0===e?0:n[i[t]+i[e]]}},442:(t,e,n)=>{const i=n(910),r=n(242);function a(t){this.mode=i.KANJI,this.data=t}a.getBitsLength=function(t){return 13*t},a.prototype.getLength=function(){return this.data.length},a.prototype.getBitsLength=function(){return a.getBitsLength(this.data.length)},a.prototype.write=function(t){let e;for(e=0;e=33088&&n<=40956)n-=33088;else{if(!(n>=57408&&n<=60351))throw new Error("Invalid SJIS character: "+this.data[e]+"\nMake sure your charset is UTF-8");n-=49472}n=192*(n>>>8&255)+(255&n),t.put(n,13)}},t.exports=a},126:(t,e)=>{e.Patterns={PATTERN000:0,PATTERN001:1,PATTERN010:2,PATTERN011:3,PATTERN100:4,PATTERN101:5,PATTERN110:6,PATTERN111:7};function n(t,n,i){switch(t){case e.Patterns.PATTERN000:return(n+i)%2==0;case e.Patterns.PATTERN001:return n%2==0;case e.Patterns.PATTERN010:return i%3==0;case e.Patterns.PATTERN011:return(n+i)%3==0;case e.Patterns.PATTERN100:return(Math.floor(n/2)+Math.floor(i/3))%2==0;case e.Patterns.PATTERN101:return n*i%2+n*i%3==0;case e.Patterns.PATTERN110:return(n*i%2+n*i%3)%2==0;case e.Patterns.PATTERN111:return(n*i%3+(n+i)%2)%2==0;default:throw new Error("bad maskPattern:"+t)}}e.isValid=function(t){return null!=t&&""!==t&&!isNaN(t)&&t>=0&&t<=7},e.from=function(t){return e.isValid(t)?parseInt(t,10):void 0},e.getPenaltyN1=function(t){const e=t.size;let n=0,i=0,r=0,a=null,o=null;for(let s=0;s=5&&(n+=i-5+3),a=e,i=1),e=t.get(l,s),e===o?r++:(r>=5&&(n+=r-5+3),o=e,r=1)}i>=5&&(n+=i-5+3),r>=5&&(n+=r-5+3)}return n},e.getPenaltyN2=function(t){const e=t.size;let n=0;for(let i=0;i=10&&(1488===i||93===i)&&n++,r=r<<1&2047|t.get(o,a),o>=10&&(1488===r||93===r)&&n++}return 40*n},e.getPenaltyN4=function(t){let e=0;const n=t.data.length;for(let i=0;i{const i=n(114),r=n(7);e.NUMERIC={id:"Numeric",bit:1,ccBits:[10,12,14]},e.ALPHANUMERIC={id:"Alphanumeric",bit:2,ccBits:[9,11,13]},e.BYTE={id:"Byte",bit:4,ccBits:[8,16,16]},e.KANJI={id:"Kanji",bit:8,ccBits:[8,10,12]},e.MIXED={bit:-1},e.getCharCountIndicator=function(t,e){if(!t.ccBits)throw new Error("Invalid mode: "+t);if(!i.isValid(e))throw new Error("Invalid version: "+e);return e>=1&&e<10?t.ccBits[0]:e<27?t.ccBits[1]:t.ccBits[2]},e.getBestModeForData=function(t){return r.testNumeric(t)?e.NUMERIC:r.testAlphanumeric(t)?e.ALPHANUMERIC:r.testKanji(t)?e.KANJI:e.BYTE},e.toString=function(t){if(t&&t.id)return t.id;throw new Error("Invalid mode")},e.isValid=function(t){return t&&t.bit&&t.ccBits},e.from=function(t,n){if(e.isValid(t))return t;try{return function(t){if("string"!=typeof t)throw new Error("Param is not a string");switch(t.toLowerCase()){case"numeric":return e.NUMERIC;case"alphanumeric":return e.ALPHANUMERIC;case"kanji":return e.KANJI;case"byte":return e.BYTE;default:throw new Error("Unknown mode: "+t)}}(t)}catch(t){return n}}},85:(t,e,n)=>{const i=n(910);function r(t){this.mode=i.NUMERIC,this.data=t.toString()}r.getBitsLength=function(t){return 10*Math.floor(t/3)+(t%3?t%3*3+1:0)},r.prototype.getLength=function(){return this.data.length},r.prototype.getBitsLength=function(){return r.getBitsLength(this.data.length)},r.prototype.write=function(t){let e,n,i;for(e=0;e+3<=this.data.length;e+=3)n=this.data.substr(e,3),i=parseInt(n,10),t.put(i,10);const r=this.data.length-e;r>0&&(n=this.data.substr(e),i=parseInt(n,10),t.put(i,3*r+1))},t.exports=r},143:(t,e,n)=>{const i=n(729);e.mul=function(t,e){const n=new Uint8Array(t.length+e.length-1);for(let r=0;r=0;){const t=n[0];for(let r=0;r{const i=n(242),r=n(908),a=n(245),o=n(280),s=n(845),l=n(526),c=n(126),p=n(393),d=n(882),u=n(103),h=n(642),f=n(910),m=n(130);function g(t,e,n){const i=t.size,r=h.getEncodedBits(e,n);let a,o;for(a=0;a<15;a++)o=1==(r>>a&1),a<6?t.set(a,8,o,!0):a<8?t.set(a+1,8,o,!0):t.set(i-15+a,8,o,!0),a<8?t.set(8,i-a-1,o,!0):a<9?t.set(8,15-a-1+1,o,!0):t.set(8,15-a-1,o,!0);t.set(i-8,8,1,!0)}function v(t,e,n,r){let h;if(Array.isArray(t))h=m.fromArray(t);else{if("string"!=typeof t)throw new Error("Invalid data");{let i=e;if(!i){const e=m.rawSplit(t);i=u.getBestVersionForData(e,n)}h=m.fromString(t,i||40)}}const v=u.getBestVersionForData(h,n);if(!v)throw new Error("The amount of data is too big to be stored in a QR Code");if(e){if(e=0&&e<=6&&(0===i||6===i)||i>=0&&i<=6&&(0===e||6===e)||e>=2&&e<=4&&i>=2&&i<=4?t.set(r+e,a+i,!0,!0):t.set(r+e,a+i,!1,!0))}}(_,e),function(t){const e=t.size;for(let n=8;n=7&&function(t,e){const n=t.size,i=u.getEncodedBits(e);let r,a,o;for(let e=0;e<18;e++)r=Math.floor(e/3),a=e%3+n-8-3,o=1==(i>>e&1),t.set(r,a,o,!0),t.set(a,r,o,!0)}(_,e),function(t,e){const n=t.size;let i=-1,r=n-1,a=7,o=0;for(let s=n-1;s>0;s-=2)for(6===s&&s--;;){for(let n=0;n<2;n++)if(!t.isReserved(r,s-n)){let i=!1;o>>a&1)),t.set(r,s-n,i),a--,-1===a&&(o++,a=7)}if(r+=i,r<0||n<=r){r-=i,i=-i;break}}}(_,y),isNaN(r)&&(r=c.getBestMask(_,g.bind(null,_,n))),c.applyMask(r,_),g(_,n,r),{modules:_,version:e,errorCorrectionLevel:n,maskPattern:r,segments:h}}e.create=function(t,e){if(void 0===t||""===t)throw new Error("No input text");let n,a,o=r.M;return void 0!==e&&(o=r.from(e.errorCorrectionLevel,r.M),n=u.from(e.version),a=c.from(e.maskPattern),e.toSJISFunc&&i.setToSJISFunction(e.toSJISFunc)),v(t,n,o,a)}},882:(t,e,n)=>{const i=n(143);function r(t){this.genPoly=void 0,this.degree=t,this.degree&&this.initialize(this.degree)}r.prototype.initialize=function(t){this.degree=t,this.genPoly=i.generateECPolynomial(this.degree)},r.prototype.encode=function(t){if(!this.genPoly)throw new Error("Encoder not initialized");const e=new Uint8Array(t.length+this.degree);e.set(t);const n=i.mod(e,this.genPoly),r=this.degree-n.length;if(r>0){const t=new Uint8Array(this.degree);return t.set(n,r),t}return n},t.exports=r},7:(t,e)=>{const n="[0-9]+";let i="(?:[u3000-u303F]|[u3040-u309F]|[u30A0-u30FF]|[uFF00-uFFEF]|[u4E00-u9FAF]|[u2605-u2606]|[u2190-u2195]|u203B|[u2010u2015u2018u2019u2025u2026u201Cu201Du2225u2260]|[u0391-u0451]|[u00A7u00A8u00B1u00B4u00D7u00F7])+";i=i.replace(/u/g,"\\u");const r="(?:(?![A-Z0-9 $%*+\\-./:]|"+i+")(?:.|[\r\n]))+";e.KANJI=new RegExp(i,"g"),e.BYTE_KANJI=new RegExp("[^A-Z0-9 $%*+\\-./:]+","g"),e.BYTE=new RegExp(r,"g"),e.NUMERIC=new RegExp(n,"g"),e.ALPHANUMERIC=new RegExp("[A-Z $%*+\\-./:]+","g");const a=new RegExp("^"+i+"$"),o=new RegExp("^"+n+"$"),s=new RegExp("^[A-Z0-9 $%*+\\-./:]+$");e.testKanji=function(t){return a.test(t)},e.testNumeric=function(t){return o.test(t)},e.testAlphanumeric=function(t){return s.test(t)}},130:(t,e,n)=>{const i=n(910),r=n(85),a=n(260),o=n(424),s=n(442),l=n(7),c=n(242),p=n(987);function d(t){return unescape(encodeURIComponent(t)).length}function u(t,e,n){const i=[];let r;for(;null!==(r=t.exec(n));)i.push({data:r[0],index:r.index,mode:e,length:r[0].length});return i}function h(t){const e=u(l.NUMERIC,i.NUMERIC,t),n=u(l.ALPHANUMERIC,i.ALPHANUMERIC,t);let r,a;return c.isKanjiModeEnabled()?(r=u(l.BYTE,i.BYTE,t),a=u(l.KANJI,i.KANJI,t)):(r=u(l.BYTE_KANJI,i.BYTE,t),a=[]),e.concat(n,r,a).sort((function(t,e){return t.index-e.index})).map((function(t){return{data:t.data,mode:t.mode,length:t.length}}))}function f(t,e){switch(e){case i.NUMERIC:return r.getBitsLength(t);case i.ALPHANUMERIC:return a.getBitsLength(t);case i.KANJI:return s.getBitsLength(t);case i.BYTE:return o.getBitsLength(t)}}function m(t,e){let n;const l=i.getBestModeForData(t);if(n=i.from(e,l),n!==i.BYTE&&n.bit=0?t[t.length-1]:null;return n&&n.mode===e.mode?(t[t.length-1].data+=e.data,t):(t.push(e),t)}),[]))},e.rawSplit=function(t){return e.fromArray(h(t,c.isKanjiModeEnabled()))}},242:(t,e)=>{let n;const i=[0,26,44,70,100,134,172,196,242,292,346,404,466,532,581,655,733,815,901,991,1085,1156,1258,1364,1474,1588,1706,1828,1921,2051,2185,2323,2465,2611,2761,2876,3034,3196,3362,3532,3706];e.getSymbolSize=function(t){if(!t)throw new Error('"version" cannot be null or undefined');if(t<1||t>40)throw new Error('"version" should be in range from 1 to 40');return 4*t+17},e.getSymbolTotalCodewords=function(t){return i[t]},e.getBCHDigit=function(t){let e=0;for(;0!==t;)e++,t>>>=1;return e},e.setToSJISFunction=function(t){if("function"!=typeof t)throw new Error('"toSJISFunc" is not a valid function.');n=t},e.isKanjiModeEnabled=function(){return void 0!==n},e.toSJIS=function(t){return n(t)}},114:(t,e)=>{e.isValid=function(t){return!isNaN(t)&&t>=1&&t<=40}},103:(t,e,n)=>{const i=n(242),r=n(393),a=n(908),o=n(910),s=n(114),l=i.getBCHDigit(7973);function c(t,e){return o.getCharCountIndicator(t,e)+4}function p(t,e){let n=0;return t.forEach((function(t){const i=c(t.mode,e);n+=i+t.getBitsLength()})),n}e.from=function(t,e){return s.isValid(t)?parseInt(t,10):e},e.getCapacity=function(t,e,n){if(!s.isValid(t))throw new Error("Invalid QR Code version");void 0===n&&(n=o.BYTE);const a=8*(i.getSymbolTotalCodewords(t)-r.getTotalCodewordsCount(t,e));if(n===o.MIXED)return a;const l=a-c(n,t);switch(n){case o.NUMERIC:return Math.floor(l/10*3);case o.ALPHANUMERIC:return Math.floor(l/11*2);case o.KANJI:return Math.floor(l/13);case o.BYTE:default:return Math.floor(l/8)}},e.getBestVersionForData=function(t,n){let i;const r=a.from(n,a.M);if(Array.isArray(t)){if(t.length>1)return function(t,n){for(let i=1;i<=40;i++)if(p(t,i)<=e.getCapacity(i,n,o.MIXED))return i}(t,r);if(0===t.length)return 1;i=t[0]}else i=t;return function(t,n,i){for(let r=1;r<=40;r++)if(n<=e.getCapacity(r,i,t))return r}(i.mode,i.getLength(),r)},e.getEncodedBits=function(t){if(!s.isValid(t)||t<7)throw new Error("Invalid QR Code version");let e=t<<12;for(;i.getBCHDigit(e)-l>=0;)e^=7973<{const i=n(653);e.render=function(t,e,n){let r=n,a=e;void 0!==r||e&&e.getContext||(r=e,e=void 0),e||(a=function(){try{return document.createElement("canvas")}catch(t){throw new Error("You need to specify a canvas element")}}()),r=i.getOptions(r);const o=i.getImageWidth(t.modules.size,r),s=a.getContext("2d"),l=s.createImageData(o,o);return i.qrToImageData(l.data,t,r),function(t,e,n){t.clearRect(0,0,e.width,e.height),e.style||(e.style={}),e.height=n,e.width=n,e.style.height=n+"px",e.style.width=n+"px"}(s,a,o),s.putImageData(l,0,0),a},e.renderToDataURL=function(t,n,i){let r=i;void 0!==r||n&&n.getContext||(r=n,n=void 0),r||(r={});const a=e.render(t,n,r),o=r.type||"image/png",s=r.rendererOpts||{};return a.toDataURL(o,s.quality)}},776:(t,e,n)=>{const i=n(653);function r(t,e){const n=t.a/255,i=e+'="'+t.hex+'"';return n<1?i+" "+e+'-opacity="'+n.toFixed(2).slice(1)+'"':i}function a(t,e,n){let i=t+e;return void 0!==n&&(i+=" "+n),i}e.render=function(t,e,n){const o=i.getOptions(e),s=t.modules.size,l=t.modules.data,c=s+2*o.margin,p=o.color.light.a?"':"",d="0&&c>0&&t[l-1]||(i+=o?a("M",c+n,.5+p+n):a("m",r,0),r=0,o=!1),c+1',u='viewBox="0 0 '+c+" "+c+'"',h='\n";return"function"==typeof n&&n(null,h),h}},653:(t,e)=>{function n(t){if("number"==typeof t&&(t=t.toString()),"string"!=typeof t)throw new Error("Color should be defined as hex string");let e=t.slice().replace("#","").split("");if(e.length<3||5===e.length||e.length>8)throw new Error("Invalid hex color: "+t);3!==e.length&&4!==e.length||(e=Array.prototype.concat.apply([],e.map((function(t){return[t,t]})))),6===e.length&&e.push("F","F");const n=parseInt(e.join(""),16);return{r:n>>24&255,g:n>>16&255,b:n>>8&255,a:255&n,hex:"#"+e.slice(0,6).join("")}}e.getOptions=function(t){t||(t={}),t.color||(t.color={});const e=void 0===t.margin||null===t.margin||t.margin<0?4:t.margin,i=t.width&&t.width>=21?t.width:void 0,r=t.scale||4;return{width:i,scale:i?4:r,margin:e,color:{dark:n(t.color.dark||"#000000ff"),light:n(t.color.light||"#ffffffff")},type:t.type,rendererOpts:t.rendererOpts||{}}},e.getScale=function(t,e){return e.width&&e.width>=t+2*e.margin?e.width/(t+2*e.margin):e.scale},e.getImageWidth=function(t,n){const i=e.getScale(t,n);return Math.floor((t+2*n.margin)*i)},e.qrToImageData=function(t,n,i){const r=n.modules.size,a=n.modules.data,o=e.getScale(r,i),s=Math.floor((r+2*i.margin)*o),l=i.margin*o,c=[i.color.light,i.color.dark];for(let e=0;e=l&&n>=l&&eObject.getPrototypeOf(t):t=>t.__proto__,r.t=function(n,i){if(1&i&&(n=this(n)),8&i)return n;if("object"==typeof n&&n){if(4&i&&n.__esModule)return n;if(16&i&&"function"==typeof n.then)return n}var a=Object.create(null);r.r(a);var o={};t=t||[null,e({}),e([]),e(e)];for(var s=2&i&&n;"object"==typeof s&&!~t.indexOf(s);s=e(s))Object.getOwnPropertyNames(s).forEach((t=>o[t]=()=>n[t]));return o.default=()=>n,r.d(a,o),a},r.d=(t,e)=>{for(var n in e)r.o(e,n)&&!r.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:e[n]})},r.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(t){if("object"==typeof window)return window}}(),r.o=(t,e)=>Object.prototype.hasOwnProperty.call(t,e),r.r=t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})};var a={};(()=>{r.d(a,{w$:()=>xt,s_:()=>_t,tH:()=>At,rD:()=>t,r4:()=>e,Ai:()=>Et,Xw:()=>St,_Z:()=>n});var t={};r.r(t),r.d(t,{deleteDB:()=>v,openDB:()=>g,unwrap:()=>m,wrap:()=>f});var e={};r.r(e),r.d(e,{clear:()=>O,createStore:()=>k,del:()=>B,delMany:()=>z,entries:()=>j,get:()=>A,getMany:()=>I,keys:()=>N,promisifyRequest:()=>x,set:()=>T,setMany:()=>S,update:()=>R,values:()=>D});var n={};let i,o;r.r(n),r.d(n,{joinRoom:()=>yt,selfId:()=>G});const s=new WeakMap,l=new WeakMap,c=new WeakMap,p=new WeakMap,d=new WeakMap;let u={get(t,e,n){if(t instanceof IDBTransaction){if("done"===e)return l.get(t);if("objectStoreNames"===e)return t.objectStoreNames||c.get(t);if("store"===e)return n.objectStoreNames[1]?void 0:n.objectStore(n.objectStoreNames[0])}return f(t[e])},set:(t,e,n)=>(t[e]=n,!0),has:(t,e)=>t instanceof IDBTransaction&&("done"===e||"store"===e)||e in t};function h(t){return"function"==typeof t?(e=t)!==IDBDatabase.prototype.transaction||"objectStoreNames"in IDBTransaction.prototype?(o||(o=[IDBCursor.prototype.advance,IDBCursor.prototype.continue,IDBCursor.prototype.continuePrimaryKey])).includes(e)?function(...t){return e.apply(m(this),t),f(s.get(this))}:function(...t){return f(e.apply(m(this),t))}:function(t,...n){const i=e.call(m(this),t,...n);return c.set(i,t.sort?t.sort():[t]),f(i)}:(t instanceof IDBTransaction&&function(t){if(l.has(t))return;const e=new Promise(((e,n)=>{const i=()=>{t.removeEventListener("complete",r),t.removeEventListener("error",a),t.removeEventListener("abort",a)},r=()=>{e(),i()},a=()=>{n(t.error||new DOMException("AbortError","AbortError")),i()};t.addEventListener("complete",r),t.addEventListener("error",a),t.addEventListener("abort",a)}));l.set(t,e)}(t),n=t,(i||(i=[IDBDatabase,IDBObjectStore,IDBIndex,IDBCursor,IDBTransaction])).some((t=>n instanceof t))?new Proxy(t,u):t);var e,n}function f(t){if(t instanceof IDBRequest)return function(t){const e=new Promise(((e,n)=>{const i=()=>{t.removeEventListener("success",r),t.removeEventListener("error",a)},r=()=>{e(f(t.result)),i()},a=()=>{n(t.error),i()};t.addEventListener("success",r),t.addEventListener("error",a)}));return e.then((e=>{e instanceof IDBCursor&&s.set(e,t)})).catch((()=>{})),d.set(e,t),e}(t);if(p.has(t))return p.get(t);const e=h(t);return e!==t&&(p.set(t,e),d.set(e,t)),e}const m=t=>d.get(t);function g(t,e,{blocked:n,upgrade:i,blocking:r,terminated:a}={}){const o=indexedDB.open(t,e),s=f(o);return i&&o.addEventListener("upgradeneeded",(t=>{i(f(o.result),t.oldVersion,t.newVersion,f(o.transaction),t)})),n&&o.addEventListener("blocked",(t=>n(t.oldVersion,t.newVersion,t))),s.then((t=>{a&&t.addEventListener("close",(()=>a())),r&&t.addEventListener("versionchange",(t=>r(t.oldVersion,t.newVersion,t)))})).catch((()=>{})),s}function v(t,{blocked:e}={}){const n=indexedDB.deleteDatabase(t);return e&&n.addEventListener("blocked",(t=>e(t.oldVersion,t))),f(n).then((()=>{}))}const y=["get","getKey","getAll","getAllKeys","count"],b=["put","add","delete","clear"],_=new Map;function w(t,e){if(!(t instanceof IDBDatabase)||e in t||"string"!=typeof e)return;if(_.get(e))return _.get(e);const n=e.replace(/FromIndex$/,""),i=e!==n,r=b.includes(n);if(!(n in(i?IDBIndex:IDBObjectStore).prototype)||!r&&!y.includes(n))return;const a=async function(t,...e){const a=this.transaction(t,r?"readwrite":"readonly");let o=a.store;return i&&(o=o.index(e.shift())),(await Promise.all([o[n](...e),r&&a.done]))[0]};return _.set(e,a),a}function x(t){return new Promise(((e,n)=>{t.oncomplete=t.onsuccess=()=>e(t.result),t.onabort=t.onerror=()=>n(t.error)}))}function k(t,e){const n=indexedDB.open(t);n.onupgradeneeded=()=>n.result.createObjectStore(e);const i=x(n);return(t,n)=>i.then((i=>n(i.transaction(e,t).objectStore(e))))}let E;function C(){return E||(E=k("keyval-store","keyval")),E}function A(t,e=C()){return e("readonly",(e=>x(e.get(t))))}function T(t,e,n=C()){return n("readwrite",(n=>(n.put(e,t),x(n.transaction))))}function S(t,e=C()){return e("readwrite",(e=>(t.forEach((t=>e.put(t[1],t[0]))),x(e.transaction))))}function I(t,e=C()){return e("readonly",(e=>Promise.all(t.map((t=>x(e.get(t)))))))}function R(t,e,n=C()){return n("readwrite",(n=>new Promise(((i,r)=>{n.get(t).onsuccess=function(){try{n.put(e(this.result),t),i(x(n.transaction))}catch(t){r(t)}}}))))}function B(t,e=C()){return e("readwrite",(e=>(e.delete(t),x(e.transaction))))}function z(t,e=C()){return e("readwrite",(e=>(t.forEach((t=>e.delete(t))),x(e.transaction))))}function O(t=C()){return t("readwrite",(t=>(t.clear(),x(t.transaction))))}function P(t,e){return t.openCursor().onsuccess=function(){this.result&&(e(this.result),this.result.continue())},x(t.transaction)}function N(t=C()){return t("readonly",(t=>{if(t.getAllKeys)return x(t.getAllKeys());const e=[];return P(t,(t=>e.push(t.key))).then((()=>e))}))}function D(t=C()){return t("readonly",(t=>{if(t.getAll)return x(t.getAll());const e=[];return P(t,(t=>e.push(t.value))).then((()=>e))}))}function j(t=C()){return t("readonly",(e=>{if(e.getAll&&e.getAllKeys)return Promise.all([x(e.getAllKeys()),x(e.getAll())]).then((([t,e])=>t.map(((t,n)=>[t,e[n]]))));const n=[];return t("readonly",(t=>P(t,(t=>n.push([t.key,t.value]))).then((()=>n))))}))}var U;function L(t){const e=new Uint8Array(t);for(let n=0;nw(t,e)||U.get(t,e,n),has:(t,e)=>!!w(t,e)||U.has(t,e)};class q{constructor(t={}){if(this._map=new Map,this._id=L(4).toString("hex").slice(0,7),this._doDebug=t.debug,this._debug("new peer %o",t),this.channelName=t.initiator?t.channelName||L(20).toString("hex"):null,this.initiator=t.initiator||!1,this.channelConfig=t.channelConfig||q.channelConfig,this.channelNegotiated=this.channelConfig.negotiated,this.config=Object.assign({},q.config,t.config),this.offerOptions=t.offerOptions||{},this.answerOptions=t.answerOptions||{},this.sdpTransform=t.sdpTransform||(t=>t),this.streams=t.streams||(t.stream?[t.stream]:[]),this.trickle=void 0===t.trickle||t.trickle,this.allowHalfTrickle=void 0!==t.allowHalfTrickle&&t.allowHalfTrickle,this.iceCompleteTimeout=t.iceCompleteTimeout||5e3,this.destroyed=!1,this.destroying=!1,this._connected=!1,this.remoteAddress=void 0,this.remoteFamily=void 0,this.remotePort=void 0,this.localAddress=void 0,this.localFamily=void 0,this.localPort=void 0,this._wrtc=t.wrtc&&"object"==typeof t.wrtc?t.wrtc:M(),!this._wrtc)throw"undefined"==typeof window?F(new Error("No WebRTC support: Specify `opts.wrtc` option in this environment"),"ERR_WEBRTC_SUPPORT"):F(new Error("No WebRTC support: Not a supported browser"),"ERR_WEBRTC_SUPPORT");this._pcReady=!1,this._channelReady=!1,this._iceComplete=!1,this._iceCompleteTimer=null,this._channel=null,this._pendingCandidates=[],this._isNegotiating=!1,this._firstNegotiation=!0,this._batchedNegotiation=!1,this._queuedNegotiation=!1,this._sendersAwaitingStable=[],this._senderMap=new Map,this._closingInterval=null,this._remoteTracks=[],this._remoteStreams=[],this._chunk=null,this._cb=null,this._interval=null;try{this._pc=new this._wrtc.RTCPeerConnection(this.config)}catch(t){return void this.destroy(F(t,"ERR_PC_CONSTRUCTOR"))}this._isReactNativeWebrtc="number"==typeof this._pc._peerConnectionId,this._pc.oniceconnectionstatechange=()=>{this._onIceStateChange()},this._pc.onicegatheringstatechange=()=>{this._onIceStateChange()},this._pc.onconnectionstatechange=()=>{this._onConnectionStateChange()},this._pc.onsignalingstatechange=()=>{this._onSignalingStateChange()},this._pc.onicecandidate=t=>{this._onIceCandidate(t)},"object"==typeof this._pc.peerIdentity&&this._pc.peerIdentity.catch((t=>{this.destroy(F(t,"ERR_PC_PEER_IDENTITY"))})),this.initiator||this.channelNegotiated?this._setupData({channel:this._pc.createDataChannel(this.channelName,this.channelConfig)}):this._pc.ondatachannel=t=>{this._setupData(t)},this.streams&&this.streams.forEach((t=>{this.addStream(t)})),this._pc.ontrack=t=>{this._onTrack(t)},this._debug("initial negotiation"),this._needsNegotiation()}get bufferSize(){return this._channel&&this._channel.bufferedAmount||0}get connected(){return this._connected&&"open"===this._channel.readyState}address(){return{port:this.localPort,family:this.localFamily,address:this.localAddress}}signal(t){if(!this.destroying){if(this.destroyed)throw F(new Error("cannot signal after peer is destroyed"),"ERR_DESTROYED");if("string"==typeof t)try{t=JSON.parse(t)}catch(e){t={}}this._debug("signal()"),t.renegotiate&&this.initiator&&(this._debug("got request to renegotiate"),this._needsNegotiation()),t.transceiverRequest&&this.initiator&&(this._debug("got request for transceiver"),this.addTransceiver(t.transceiverRequest.kind,t.transceiverRequest.init)),t.candidate&&(this._pc.remoteDescription&&this._pc.remoteDescription.type?this._addIceCandidate(t.candidate):this._pendingCandidates.push(t.candidate)),t.sdp&&this._pc.setRemoteDescription(new this._wrtc.RTCSessionDescription(t)).then((()=>{this.destroyed||(this._pendingCandidates.forEach((t=>{this._addIceCandidate(t)})),this._pendingCandidates=[],"offer"===this._pc.remoteDescription.type&&this._createAnswer())})).catch((t=>{this.destroy(F(t,"ERR_SET_REMOTE_DESCRIPTION"))})),t.sdp||t.candidate||t.renegotiate||t.transceiverRequest||this.destroy(F(new Error("signal() called with invalid signal data"),"ERR_SIGNALING"))}}_addIceCandidate(t){const e=new this._wrtc.RTCIceCandidate(t);this._pc.addIceCandidate(e).catch((t=>{!e.address||e.address.endsWith(".local")?("Ignoring unsupported ICE candidate.",console.warn("Ignoring unsupported ICE candidate.")):this.destroy(F(t,"ERR_ADD_ICE_CANDIDATE"))}))}send(t){if(!this.destroying){if(this.destroyed)throw F(new Error("cannot send after peer is destroyed"),"ERR_DESTROYED");this._channel.send(t)}}addTransceiver(t,e){if(!this.destroying){if(this.destroyed)throw F(new Error("cannot addTransceiver after peer is destroyed"),"ERR_DESTROYED");if(this._debug("addTransceiver()"),this.initiator)try{this._pc.addTransceiver(t,e),this._needsNegotiation()}catch(t){this.destroy(F(t,"ERR_ADD_TRANSCEIVER"))}else this.emit("signal",{type:"transceiverRequest",transceiverRequest:{kind:t,init:e}})}}addStream(t){if(!this.destroying){if(this.destroyed)throw F(new Error("cannot addStream after peer is destroyed"),"ERR_DESTROYED");this._debug("addStream()"),t.getTracks().forEach((e=>{this.addTrack(e,t)}))}}addTrack(t,e){if(this.destroying)return;if(this.destroyed)throw F(new Error("cannot addTrack after peer is destroyed"),"ERR_DESTROYED");this._debug("addTrack()");const n=this._senderMap.get(t)||new Map;let i=n.get(e);if(i)throw i.removed?F(new Error("Track has been removed. You should enable/disable tracks that you want to re-add."),"ERR_SENDER_REMOVED"):F(new Error("Track has already been added to that stream."),"ERR_SENDER_ALREADY_ADDED");i=this._pc.addTrack(t,e),n.set(e,i),this._senderMap.set(t,n),this._needsNegotiation()}replaceTrack(t,e,n){if(this.destroying)return;if(this.destroyed)throw F(new Error("cannot replaceTrack after peer is destroyed"),"ERR_DESTROYED");this._debug("replaceTrack()");const i=this._senderMap.get(t),r=i?i.get(n):null;if(!r)throw F(new Error("Cannot replace track that was never added."),"ERR_TRACK_NOT_ADDED");e&&this._senderMap.set(e,i),null!=r.replaceTrack?r.replaceTrack(e):this.destroy(F(new Error("replaceTrack is not supported in this browser"),"ERR_UNSUPPORTED_REPLACETRACK"))}removeTrack(t,e){if(this.destroying)return;if(this.destroyed)throw F(new Error("cannot removeTrack after peer is destroyed"),"ERR_DESTROYED");this._debug("removeSender()");const n=this._senderMap.get(t),i=n?n.get(e):null;if(!i)throw F(new Error("Cannot remove track that was never added."),"ERR_TRACK_NOT_ADDED");try{i.removed=!0,this._pc.removeTrack(i)}catch(t){"NS_ERROR_UNEXPECTED"===t.name?this._sendersAwaitingStable.push(i):this.destroy(F(t,"ERR_REMOVE_TRACK"))}this._needsNegotiation()}removeStream(t){if(!this.destroying){if(this.destroyed)throw F(new Error("cannot removeStream after peer is destroyed"),"ERR_DESTROYED");this._debug("removeSenders()"),t.getTracks().forEach((e=>{this.removeTrack(e,t)}))}}_needsNegotiation(){this._debug("_needsNegotiation"),this._batchedNegotiation||(this._batchedNegotiation=!0,queueMicrotask((()=>{this._batchedNegotiation=!1,this.initiator||!this._firstNegotiation?(this._debug("starting batched negotiation"),this.negotiate()):this._debug("non-initiator initial negotiation request discarded"),this._firstNegotiation=!1})))}negotiate(){if(!this.destroying){if(this.destroyed)throw F(new Error("cannot negotiate after peer is destroyed"),"ERR_DESTROYED");this.initiator?this._isNegotiating?(this._queuedNegotiation=!0,this._debug("already negotiating, queueing")):(this._debug("start negotiation"),setTimeout((()=>{this._createOffer()}),0)):this._isNegotiating?(this._queuedNegotiation=!0,this._debug("already negotiating, queueing")):(this._debug("requesting negotiation from initiator"),this.emit("signal",{type:"renegotiate",renegotiate:!0})),this._isNegotiating=!0}}destroy(t){this.destroyed||this.destroying||(this.destroying=!0,this._debug("destroying (error: %s)",t&&(t.message||t)),queueMicrotask((()=>{if(this.destroyed=!0,this.destroying=!1,this._debug("destroy (error: %s)",t&&(t.message||t)),this._connected=!1,this._pcReady=!1,this._channelReady=!1,this._remoteTracks=null,this._remoteStreams=null,this._senderMap=null,clearInterval(this._closingInterval),this._closingInterval=null,clearInterval(this._interval),this._interval=null,this._chunk=null,this._cb=null,this._channel){try{this._channel.close()}catch(t){}this._channel.onmessage=null,this._channel.onopen=null,this._channel.onclose=null,this._channel.onerror=null}if(this._pc){try{this._pc.close()}catch(t){}this._pc.oniceconnectionstatechange=null,this._pc.onicegatheringstatechange=null,this._pc.onsignalingstatechange=null,this._pc.onicecandidate=null,this._pc.ontrack=null,this._pc.ondatachannel=null}this._pc=null,this._channel=null,t&&this.emit("error",t),this.emit("close")})))}_setupData(t){if(!t.channel)return this.destroy(F(new Error("Data channel event is missing `channel` property"),"ERR_DATA_CHANNEL"));this._channel=t.channel,this._channel.binaryType="arraybuffer","number"==typeof this._channel.bufferedAmountLowThreshold&&(this._channel.bufferedAmountLowThreshold=65536),this.channelName=this._channel.label,this._channel.onmessage=t=>{this._onChannelMessage(t)},this._channel.onbufferedamountlow=()=>{this._onChannelBufferedAmountLow()},this._channel.onopen=()=>{this._onChannelOpen()},this._channel.onclose=()=>{this._onChannelClose()},this._channel.onerror=t=>{this.destroy(F(t,"ERR_DATA_CHANNEL"))};let e=!1;this._closingInterval=setInterval((()=>{this._channel&&"closing"===this._channel.readyState?(e&&this._onChannelClose(),e=!0):e=!1}),5e3)}_startIceCompleteTimeout(){this.destroyed||this._iceCompleteTimer||(this._debug("started iceComplete timeout"),this._iceCompleteTimer=setTimeout((()=>{this._iceComplete||(this._iceComplete=!0,this._debug("iceComplete timeout completed"),this.emit("iceTimeout"),this.emit("_iceComplete"))}),this.iceCompleteTimeout))}_createOffer(){this.destroyed||this._pc.createOffer(this.offerOptions).then((t=>{if(this.destroyed)return;this.trickle||this.allowHalfTrickle||(t.sdp=W(t.sdp)),t.sdp=this.sdpTransform(t.sdp);const e=()=>{if(this.destroyed)return;const e=this._pc.localDescription||t;this._debug("signal"),this.emit("signal",{type:e.type,sdp:e.sdp})};this._pc.setLocalDescription(t).then((()=>{this._debug("createOffer success"),this.destroyed||(this.trickle||this._iceComplete?e():this.once("_iceComplete",e))})).catch((t=>{this.destroy(F(t,"ERR_SET_LOCAL_DESCRIPTION"))}))})).catch((t=>{this.destroy(F(t,"ERR_CREATE_OFFER"))}))}_requestMissingTransceivers(){this._pc.getTransceivers&&this._pc.getTransceivers().forEach((t=>{t.mid||!t.sender.track||t.requested||(t.requested=!0,this.addTransceiver(t.sender.track.kind))}))}_createAnswer(){this.destroyed||this._pc.createAnswer(this.answerOptions).then((t=>{if(this.destroyed)return;this.trickle||this.allowHalfTrickle||(t.sdp=W(t.sdp)),t.sdp=this.sdpTransform(t.sdp);const e=()=>{if(this.destroyed)return;const e=this._pc.localDescription||t;this._debug("signal"),this.emit("signal",{type:e.type,sdp:e.sdp}),this.initiator||this._requestMissingTransceivers()};this._pc.setLocalDescription(t).then((()=>{this.destroyed||(this.trickle||this._iceComplete?e():this.once("_iceComplete",e))})).catch((t=>{this.destroy(F(t,"ERR_SET_LOCAL_DESCRIPTION"))}))})).catch((t=>{this.destroy(F(t,"ERR_CREATE_ANSWER"))}))}_onConnectionStateChange(){this.destroyed||"failed"===this._pc.connectionState&&this.destroy(F(new Error("Connection failed."),"ERR_CONNECTION_FAILURE"))}_onIceStateChange(){if(this.destroyed)return;const t=this._pc.iceConnectionState,e=this._pc.iceGatheringState;this._debug("iceStateChange (connection: %s) (gathering: %s)",t,e),this.emit("iceStateChange",t,e),"connected"!==t&&"completed"!==t||(this._pcReady=!0,this._maybeReady()),"failed"===t&&this.destroy(F(new Error("Ice connection failed."),"ERR_ICE_CONNECTION_FAILURE")),"closed"===t&&this.destroy(F(new Error("Ice connection closed."),"ERR_ICE_CONNECTION_CLOSED"))}getStats(t){const e=t=>("[object Array]"===Object.prototype.toString.call(t.values)&&t.values.forEach((e=>{Object.assign(t,e)})),t);0===this._pc.getStats.length||this._isReactNativeWebrtc?this._pc.getStats().then((n=>{const i=[];n.forEach((t=>{i.push(e(t))})),t(null,i)}),(e=>t(e))):this._pc.getStats.length>0?this._pc.getStats((n=>{if(this.destroyed)return;const i=[];n.result().forEach((t=>{const n={};t.names().forEach((e=>{n[e]=t.stat(e)})),n.id=t.id,n.type=t.type,n.timestamp=t.timestamp,i.push(e(n))})),t(null,i)}),(e=>t(e))):t(null,[])}_maybeReady(){if(this._debug("maybeReady pc %s channel %s",this._pcReady,this._channelReady),this._connected||this._connecting||!this._pcReady||!this._channelReady)return;this._connecting=!0;const t=()=>{this.destroyed||this.getStats(((e,n)=>{if(this.destroyed)return;e&&(n=[]);const i={},r={},a={};let o=!1;n.forEach((t=>{"remotecandidate"!==t.type&&"remote-candidate"!==t.type||(i[t.id]=t),"localcandidate"!==t.type&&"local-candidate"!==t.type||(r[t.id]=t),"candidatepair"!==t.type&&"candidate-pair"!==t.type||(a[t.id]=t)}));const s=t=>{o=!0;let e=r[t.localCandidateId];e&&(e.ip||e.address)?(this.localAddress=e.ip||e.address,this.localPort=Number(e.port)):e&&e.ipAddress?(this.localAddress=e.ipAddress,this.localPort=Number(e.portNumber)):"string"==typeof t.googLocalAddress&&(e=t.googLocalAddress.split(":"),this.localAddress=e[0],this.localPort=Number(e[1])),this.localAddress&&(this.localFamily=this.localAddress.includes(":")?"IPv6":"IPv4");let n=i[t.remoteCandidateId];n&&(n.ip||n.address)?(this.remoteAddress=n.ip||n.address,this.remotePort=Number(n.port)):n&&n.ipAddress?(this.remoteAddress=n.ipAddress,this.remotePort=Number(n.portNumber)):"string"==typeof t.googRemoteAddress&&(n=t.googRemoteAddress.split(":"),this.remoteAddress=n[0],this.remotePort=Number(n[1])),this.remoteAddress&&(this.remoteFamily=this.remoteAddress.includes(":")?"IPv6":"IPv4"),this._debug("connect local: %s:%s remote: %s:%s",this.localAddress,this.localPort,this.remoteAddress,this.remotePort)};if(n.forEach((t=>{"transport"===t.type&&t.selectedCandidatePairId&&s(a[t.selectedCandidatePairId]),("googCandidatePair"===t.type&&"true"===t.googActiveConnection||("candidatepair"===t.type||"candidate-pair"===t.type)&&t.selected)&&s(t)})),o||Object.keys(a).length&&!Object.keys(r).length){if(this._connecting=!1,this._connected=!0,this._chunk){try{this.send(this._chunk)}catch(e){return this.destroy(F(e,"ERR_DATA_CHANNEL"))}this._chunk=null,this._debug('sent chunk from "write before connect"');const t=this._cb;this._cb=null,t(null)}"number"!=typeof this._channel.bufferedAmountLowThreshold&&(this._interval=setInterval((()=>this._onInterval()),150),this._interval.unref&&this._interval.unref()),this._debug("connect"),this.emit("connect")}else setTimeout(t,100)}))};t()}_onInterval(){!this._cb||!this._channel||this._channel.bufferedAmount>65536||this._onChannelBufferedAmountLow()}_onSignalingStateChange(){this.destroyed||("stable"===this._pc.signalingState&&(this._isNegotiating=!1,this._debug("flushing sender queue",this._sendersAwaitingStable),this._sendersAwaitingStable.forEach((t=>{this._pc.removeTrack(t),this._queuedNegotiation=!0})),this._sendersAwaitingStable=[],this._queuedNegotiation?(this._debug("flushing negotiation queue"),this._queuedNegotiation=!1,this._needsNegotiation()):(this._debug("negotiated"),this.emit("negotiated"))),this._debug("signalingStateChange %s",this._pc.signalingState),this.emit("signalingStateChange",this._pc.signalingState))}_onIceCandidate(t){this.destroyed||(t.candidate&&this.trickle?this.emit("signal",{type:"candidate",candidate:{candidate:t.candidate.candidate,sdpMLineIndex:t.candidate.sdpMLineIndex,sdpMid:t.candidate.sdpMid}}):t.candidate||this._iceComplete||(this._iceComplete=!0,this.emit("_iceComplete")),t.candidate&&this._startIceCompleteTimeout())}_onChannelMessage(t){if(this.destroyed)return;let e=t.data;e instanceof ArrayBuffer&&(e=new Uint8Array(e)),this.emit("data",e)}_onChannelBufferedAmountLow(){if(this.destroyed||!this._cb)return;this._debug("ending backpressure: bufferedAmount %d",this._channel.bufferedAmount);const t=this._cb;this._cb=null,t(null)}_onChannelOpen(){this._connected||this.destroyed||(this._debug("on channel open"),this._channelReady=!0,this._maybeReady())}_onChannelClose(){this.destroyed||(this._debug("on channel close"),this.destroy())}_onTrack(t){this.destroyed||t.streams.forEach((e=>{this._debug("on track"),this.emit("track",t.track,e),this._remoteTracks.push({track:t.track,stream:e}),this._remoteStreams.some((t=>t.id===e.id))||(this._remoteStreams.push(e),queueMicrotask((()=>{this._debug("on stream"),this.emit("stream",e)})))}))}_debug(...t){this._doDebug&&(t[0]="["+this._id+"] "+t[0],console.log(...t))}on(t,e){const n=this._map;n.has(t)||n.set(t,new Set),n.get(t).add(e)}off(t,e){const n=this._map,i=n.get(t);i&&(i.delete(e),0===i.size&&n.delete(t))}once(t,e){const n=(...i)=>{this.off(t,n),e(...i)};this.on(t,n)}emit(t,...e){const n=this._map;if(n.has(t))for(const i of n.get(t))try{i(...e)}catch(t){console.error(t)}}}q.WEBRTC_SUPPORT=!!M(),q.config={iceServers:[{urls:["stun:stun.l.google.com:19302","stun:global.stun.twilio.com:3478"]}],sdpSemantics:"unified-plan"},q.channelConfig={};const Z=q,H="0123456789AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz",Y=(t,e,n)=>{const i=new Z({initiator:t,trickle:e,config:n}),r=t=>i.__earlyDataBuffer.push(t);return i.on(rt.data,r),i.__earlyDataBuffer=[],i.__drainEarlyData=t=>{i.off(rt.data,r),i.__earlyDataBuffer.forEach(t),delete i.__earlyDataBuffer,delete i.__drainEarlyData},i},$=t=>new Array(t).fill().map((()=>H[Math.floor(Math.random()*H.length)])).join(""),K="Trystero",G=$(20),{keys:J,values:V,entries:X,fromEntries:Q}=Object,tt=()=>{},et=t=>new Error(`${K}: ${t}`),nt=t=>(new TextEncoder).encode(t),it=t=>(new TextDecoder).decode(t),rt=Q(["close","connect","data","error","signal","stream","track"].map((t=>[t,t]))),at=Object.getPrototypeOf(Uint8Array),ot=16369,st=255,lt="bufferedamountlow",ct=(t,e)=>{const n={},i={},r={},a={},o={},s={},l=(t,e)=>(t?Array.isArray(t)?t:[t]:J(n)).flatMap((t=>{const i=n[t];return i?e(t,i):(console.warn(`${K}: no peer with id ${t} found`),[])})),c=t=>{if(!t)throw et("action type argument is required");const e=nt(t);if(e.byteLength>12)throw et(`action type string "${t}" (${e.byteLength}b) exceeds byte limit (12). Hint: choose a shorter name.`);const r=new Uint8Array(12);r.set(e);const a=it(r);if(i[a])throw et(`action '${t}' already registered`);let o=0;return i[a]={onComplete:tt,onProgress:tt},[async(t,e,i,a)=>{if(i&&"object"!=typeof i)throw et("action meta argument must be an object");if(void 0===t)throw et("action data cannot be undefined");const s="string"!=typeof t,c=t instanceof Blob,p=c||t instanceof ArrayBuffer||t instanceof at;if(i&&!p)throw et("action meta argument can only be used with binary data");const d=p?new Uint8Array(c?await t.arrayBuffer():t):nt(s?JSON.stringify(t):t),u=i?nt(JSON.stringify(i)):null,h=Math.ceil(d.byteLength/ot)+(i?1:0),f=new Array(h).fill().map(((t,e)=>{const n=e===h-1,a=i&&0===e,l=new Uint8Array(15+(a?u.byteLength:n?d.byteLength-ot*(h-(i?2:1)):ot));return l.set(r),l.set([o],12),l.set([n|a<<1|p<<2|s<<3],13),l.set([Math.round((e+1)/h*st)],14),l.set(i?a?u:d.subarray((e-1)*ot,e*ot):d.subarray(e*ot,(e+1)*ot),15),l}));return o=o+1&st,Promise.all(l(e,(async(t,e)=>{const r=e._channel;let o=0;for(;or.bufferedAmountLowThreshold&&await new Promise((t=>{const e=()=>{r.removeEventListener(lt,e),t()};r.addEventListener(lt,e)})),!n[t])break;e.send(s),o++,a&&a(s[14]/st,t,i)}})))},t=>i[a]={...i[a],onComplete:t},t=>i[a]={...i[a],onProgress:t}]},p=(t,e)=>{const n=new Uint8Array(e),a=it(n.subarray(0,12)),[o]=n.subarray(12,13),[s]=n.subarray(13,14),[l]=n.subarray(14,15),c=n.subarray(15),p=!!(1&s),d=!!(2&s),u=!!(4&s),h=!!(8&s);if(!i[a])throw et(`received message with unregistered type (${a})`);r[t]||(r[t]={}),r[t][a]||(r[t][a]={});let f=r[t][a][o];if(f||(f=r[t][a][o]={chunks:[]}),d?f.meta=JSON.parse(it(c)):f.chunks.push(c),i[a].onProgress(l/st,t,f.meta),!p)return;const m=(t=>{const e=new Uint8Array(t.reduce(((t,e)=>t+e.byteLength),0));return t.reduce(((t,n)=>(e.set(n,t),t+n.byteLength)),0),e})(f.chunks);if(u)i[a].onComplete(m,t,f.meta);else{const e=it(m);i[a].onComplete(h?JSON.parse(e):e,t)}delete r[t][a][o]},[d,u]=c("__91n6__"),[h,f]=c("__90n6__"),[m,g]=c("__516n4L__"),[v,y]=c("__57r34m__"),[b,_]=c("__7r4ck__");let w=tt,x=tt,k=tt,E=tt;return t(((t,e)=>{if(n[e])return;const i=p.bind(null,e);n[e]=t,t.on(rt.signal,(t=>m(t,e))),t.on(rt.close,(()=>(t=>{n[t]&&(delete n[t],delete r[t],delete a[t],x(t))})(e))),t.on(rt.data,i),t.on(rt.stream,(t=>{k(t,e,o[e]),delete o[e]})),t.on(rt.track,((t,n)=>{E(t,n,e,s[e]),delete s[e]})),t.on(rt.error,(t=>{"ERR_DATA_CHANNEL"!==t.code&&console.error(t)})),w(e),t.__drainEarlyData(i)})),u(((t,e)=>h(null,e))),f(((t,e)=>{a[e]&&(a[e](),delete a[e])})),g(((t,e)=>{n[e]&&n[e].signal(t)})),y(((t,e)=>o[e]=t)),_(((t,e)=>s[e]=t)),{makeAction:c,ping:async t=>{if(!t)throw et("ping() must be called with target peer ID");const e=Date.now();return d(null,t),await new Promise((e=>a[t]=e)),Date.now()-e},leave:()=>{X(n).forEach((([t,e])=>{e.destroy(),delete n[t]})),e()},getPeers:()=>J(n),addStream:(t,e,n)=>l(e,(async(e,i)=>{n&&await v(n,e),i.addStream(t)})),removeStream:(t,e)=>l(e,((e,n)=>n.removeStream(t))),addTrack:(t,e,n,i)=>l(n,(async(n,r)=>{i&&await b(i,n),r.addTrack(t,e)})),removeTrack:(t,e,n)=>l(n,((n,i)=>i.removeTrack(t,e))),replaceTrack:(t,e,n,i,r)=>l(i,(async(i,a)=>{r&&await b(r,i),a.replaceTrack(t,e,n)})),onPeerJoin:t=>w=t,onPeerLeave:t=>x=t,onPeerStream:t=>k=t,onPeerTrack:t=>E=t}},pt="AES-CBC",dt=async(t,e)=>{const n=crypto.getRandomValues(new Uint8Array(16));return JSON.stringify({c:(i=await crypto.subtle.encrypt({name:pt,iv:n},await t,nt(e)),window.btoa(String.fromCharCode.apply(null,new Uint8Array(i)))),iv:[...n]});var i},ut=async(t,e)=>{const{c:n,iv:i}=JSON.parse(e);return it(await crypto.subtle.decrypt({name:pt,iv:new Uint8Array(i)},await t,(t=>{const e=window.atob(t);return new Uint8Array(e.length).map(((t,n)=>e.charCodeAt(n))).buffer})(n)))},ht={},ft={},mt={},gt="announce",vt=["wss://tracker.openwebtorrent.com","wss://tracker.btorrent.xyz","wss://tracker.files.fm:7073/announce","wss://qot.abiir.top:443/announce","wss://spacetradersapi-chatbox.herokuapp.com:443/announce"],yt=((t,e)=>(n,i)=>{if(t[i])throw et(`already joined room ${i}`);if(!n)throw et("requires a config map as the first argument");if(!n.appId&&!n.firebaseApp)throw et("config map is missing appId field");if(!i)throw et("namespace argument required");return e(n,i)})(ht,((t,e)=>{const n={},i=t.password&&(async(t,e)=>crypto.subtle.importKey("raw",await crypto.subtle.digest({name:"SHA-256"},nt(`${t}:${e}`)),{name:pt},!1,["encrypt","decrypt"]))(t.password,e),r=(t.trackerUrls||vt).slice(0,t.trackerUrls?t.trackerUrls.length:t.trackerRedundancy||2);if(!r.length)throw et("trackerUrls is empty");const a=crypto.subtle.digest("SHA-1",nt(`${K}:${t.appId}:${e}`)).then((t=>Array.from(new Uint8Array(t)).map((t=>t.toString(36))).join("").slice(0,20))),o=async(e,r)=>{const o=await a;let s;try{s=JSON.parse(r.data)}catch(r){return void console.error(`${K}: received malformed SDP JSON`)}if(s.info_hash!==o||s.peer_id&&s.peer_id===G)return;const l=s["failure reason"];if(l)console.warn(`${K}: torrent tracker failure (${l})`);else{if(s.interval&&s.interval>f&&s.interval<=120&&(clearInterval(m),f=s.interval,m=setInterval(c,1e3*f)),s.offer&&s.offer_id){if(n[s.peer_id]||v[s.offer_id])return;v[s.offer_id]=!0;const r=Y(!1,!1,t.rtcConfig);return r.once(rt.signal,(async t=>e.send(JSON.stringify({answer:i?{...t,sdp:await dt(i,t.sdp)}:t,action:gt,info_hash:o,peer_id:G,to_peer_id:s.peer_id,offer_id:s.offer_id})))),r.on(rt.connect,(()=>d(r,s.peer_id))),r.on(rt.close,(()=>u(s.peer_id))),void r.signal(i?{...s.offer,sdp:await ut(i,s.offer.sdp)}:s.offer)}if(s.answer){if(n[s.peer_id]||v[s.offer_id])return;const t=h[s.offer_id];if(t){const{peer:e}=t;if(e.destroyed)return;v[s.offer_id]=!0,e.on(rt.connect,(()=>d(e,s.peer_id,s.offer_id))),e.on(rt.close,(()=>u(s.peer_id))),e.signal(i?{...s.answer,sdp:await ut(i,s.answer.sdp)}:s.answer)}}}},s=async(t,e)=>t.send(JSON.stringify({action:gt,info_hash:e,numwant:10,peer_id:G,offers:await Promise.all(X(h).map((async([t,{offerP:e}])=>{const n=await e;return{offer_id:t,offer:i?{...n,sdp:await dt(i,n.sdp)}:n}})))})),l=(t,e,n)=>(n||!ft[t]?(mt[t]={...mt[t],[e]:o},ft[t]=new Promise((e=>{const n=new WebSocket(t);n.onopen=e.bind(null,n),n.onmessage=e=>V(mt[t]).forEach((t=>t(n,e)))}))):mt[t][e]=o,ft[t]),c=async()=>{const e=await a;h&&p(),h=Q(new Array(10).fill().map((()=>{const e=Y(!0,!1,t.rtcConfig);return[$(20),{peer:e,offerP:new Promise((t=>e.once(rt.signal,t)))}]}))),r.forEach((async t=>{const n=await l(t,e);n.readyState===WebSocket.OPEN?s(n,e):n.readyState!==WebSocket.CONNECTING&&s(await l(t,e,!0),e)}))},p=()=>{X(h).forEach((([t,{peer:e}])=>{v[t]||n[t]||e.destroy()})),v={}},d=(t,e,i)=>{g(t,e),n[e]=!0,i&&(n[i]=!0)},u=t=>delete n[t];let h,f=33,m=setInterval(c,1e3*f),g=tt,v={};return ht[e]=!0,c(),ct((t=>g=t),(async()=>{const t=await a;r.forEach((e=>delete mt[e][t])),delete ht[e],clearInterval(m),p()}))}));var bt=r(592),_t=r.t(bt,2),wt=r(180),xt=r.t(wt,2),kt=r(733),Et=r.t(kt,2),Ct=r(772),At=r.t(Ct,2),Tt=r(893),St=r.t(Tt,2)})();var o=a.w$,s=a.s_,l=a.tH,c=a.rD,p=a.r4,d=a.Ai,u=a.Xw,h=a._Z;export{o as ID3,s as QRCode,l as base64url,c as idb,p as idbKeyval,d as jszip,u as mime,h as trystero};
\ No newline at end of file
diff --git a/www/lib/hash.js b/www/lib/hash.js
new file mode 100644
index 0000000..9edf656
--- /dev/null
+++ b/www/lib/hash.js
@@ -0,0 +1,5 @@
+export default async function hash(n,name){
+ n = n || false
+ name = name || 'SHA-256'
+ return await window.crypto.subtle.digest({name},n)
+ }
diff --git a/www/lib/hex2bin.js b/www/lib/hex2bin.js
new file mode 100644
index 0000000..673ad92
--- /dev/null
+++ b/www/lib/hex2bin.js
@@ -0,0 +1,53 @@
+//
+// 2022.08.09
+//
+
+// ------------------------------
+export default function bin2hex(n){
+ n = n || ''
+
+ // \\
+ // ! \\ lossy on bad data
+ /////
+
+ const l = n.length
+ const c = l>>1
+ const a = new Uint8Array(c)
+ for(let i=0;i 0.5) {
+ _this.noSleepVideo.currentTime = Math.random();
+ }
+ });
+ }
+ });
+ }
+ }
+
+ _createClass(NoSleep, [{
+ key: "_addSourceToVideo",
+ value: function _addSourceToVideo(element, type, dataURI) {
+ var source = document.createElement("source");
+ source.src = dataURI;
+ source.type = "video/" + type;
+ element.appendChild(source);
+ }
+ }, {
+ key: "enable",
+ value: function enable() {
+ var _this2 = this;
+
+ if (nativeWakeLock()) {
+ return navigator.wakeLock.request("screen").then(function (wakeLock) {
+ _this2._wakeLock = wakeLock;
+ _this2.enabled = true;
+ console.log("Wake Lock active.");
+ _this2._wakeLock.addEventListener("release", function () {
+ // ToDo: Potentially emit an event for the page to observe since
+ // Wake Lock releases happen when page visibility changes.
+ // (https://web.dev/wakelock/#wake-lock-lifecycle)
+ console.log("Wake Lock released.");
+ });
+ }).catch(function (err) {
+ _this2.enabled = false;
+ console.error(err.name + ", " + err.message);
+ throw err;
+ });
+ } else if (oldIOS()) {
+ this.disable();
+ console.warn("\n NoSleep enabled for older iOS devices. This can interrupt\n active or long-running network requests from completing successfully.\n See https://github.com/richtr/NoSleep.js/issues/15 for more details.\n ");
+ this.noSleepTimer = window.setInterval(function () {
+ if (!document.hidden) {
+ window.location.href = window.location.href.split("#")[0];
+ window.setTimeout(window.stop, 0);
+ }
+ }, 15000);
+ this.enabled = true;
+ return Promise.resolve();
+ } else {
+ var playPromise = this.noSleepVideo.play();
+ return playPromise.then(function (res) {
+ _this2.enabled = true;
+ return res;
+ }).catch(function (err) {
+ _this2.enabled = false;
+ throw err;
+ });
+ }
+ }
+ }, {
+ key: "disable",
+ value: function disable() {
+ if (nativeWakeLock()) {
+ if (this._wakeLock) {
+ this._wakeLock.release();
+ }
+ this._wakeLock = null;
+ } else if (oldIOS()) {
+ if (this.noSleepTimer) {
+ console.warn("\n NoSleep now disabled for older iOS devices.\n ");
+ window.clearInterval(this.noSleepTimer);
+ this.noSleepTimer = null;
+ }
+ } else {
+ this.noSleepVideo.pause();
+ }
+ this.enabled = false;
+ }
+ }, {
+ key: "isEnabled",
+ get: function get() {
+ return this.enabled;
+ }
+ }]);
+
+ return NoSleep;
+}();
+
+module.exports = NoSleep;
+
+/***/ }),
+/* 1 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+module.exports = {
+ webm: "data:video/webm;base64,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",
+ mp4: "data:video/mp4;base64,AAAAHGZ0eXBNNFYgAAACAGlzb21pc28yYXZjMQAAAAhmcmVlAAAGF21kYXTeBAAAbGliZmFhYyAxLjI4AABCAJMgBDIARwAAArEGBf//rdxF6b3m2Ui3lizYINkj7u94MjY0IC0gY29yZSAxNDIgcjIgOTU2YzhkOCAtIEguMjY0L01QRUctNCBBVkMgY29kZWMgLSBDb3B5bGVmdCAyMDAzLTIwMTQgLSBodHRwOi8vd3d3LnZpZGVvbGFuLm9yZy94MjY0Lmh0bWwgLSBvcHRpb25zOiBjYWJhYz0wIHJlZj0zIGRlYmxvY2s9MTowOjAgYW5hbHlzZT0weDE6MHgxMTEgbWU9aGV4IHN1Ym1lPTcgcHN5PTEgcHN5X3JkPTEuMDA6MC4wMCBtaXhlZF9yZWY9MSBtZV9yYW5nZT0xNiBjaHJvbWFfbWU9MSB0cmVsbGlzPTEgOHg4ZGN0PTAgY3FtPTAgZGVhZHpvbmU9MjEsMTEgZmFzdF9wc2tpcD0xIGNocm9tYV9xcF9vZmZzZXQ9LTIgdGhyZWFkcz02IGxvb2thaGVhZF90aHJlYWRzPTEgc2xpY2VkX3RocmVhZHM9MCBucj0wIGRlY2ltYXRlPTEgaW50ZXJsYWNlZD0wIGJsdXJheV9jb21wYXQ9MCBjb25zdHJhaW5lZF9pbnRyYT0wIGJmcmFtZXM9MCB3ZWlnaHRwPTAga2V5aW50PTI1MCBrZXlpbnRfbWluPTI1IHNjZW5lY3V0PTQwIGludHJhX3JlZnJlc2g9MCByY19sb29rYWhlYWQ9NDAgcmM9Y3JmIG1idHJlZT0xIGNyZj0yMy4wIHFjb21wPTAuNjAgcXBtaW49MCBxcG1heD02OSBxcHN0ZXA9NCB2YnZfbWF4cmF0ZT03NjggdmJ2X2J1ZnNpemU9MzAwMCBjcmZfbWF4PTAuMCBuYWxfaHJkPW5vbmUgZmlsbGVyPTAgaXBfcmF0aW89MS40MCBhcT0xOjEuMDAAgAAAAFZliIQL8mKAAKvMnJycnJycnJycnXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXiEASZACGQAjgCEASZACGQAjgAAAAAdBmjgX4GSAIQBJkAIZACOAAAAAB0GaVAX4GSAhAEmQAhkAI4AhAEmQAhkAI4AAAAAGQZpgL8DJIQBJkAIZACOAIQBJkAIZACOAAAAABkGagC/AySEASZACGQAjgAAAAAZBmqAvwMkhAEmQAhkAI4AhAEmQAhkAI4AAAAAGQZrAL8DJIQBJkAIZACOAAAAABkGa4C/AySEASZACGQAjgCEASZACGQAjgAAAAAZBmwAvwMkhAEmQAhkAI4AAAAAGQZsgL8DJIQBJkAIZACOAIQBJkAIZACOAAAAABkGbQC/AySEASZACGQAjgCEASZACGQAjgAAAAAZBm2AvwMkhAEmQAhkAI4AAAAAGQZuAL8DJIQBJkAIZACOAIQBJkAIZACOAAAAABkGboC/AySEASZACGQAjgAAAAAZBm8AvwMkhAEmQAhkAI4AhAEmQAhkAI4AAAAAGQZvgL8DJIQBJkAIZACOAAAAABkGaAC/AySEASZACGQAjgCEASZACGQAjgAAAAAZBmiAvwMkhAEmQAhkAI4AhAEmQAhkAI4AAAAAGQZpAL8DJIQBJkAIZACOAAAAABkGaYC/AySEASZACGQAjgCEASZACGQAjgAAAAAZBmoAvwMkhAEmQAhkAI4AAAAAGQZqgL8DJIQBJkAIZACOAIQBJkAIZACOAAAAABkGawC/AySEASZACGQAjgAAAAAZBmuAvwMkhAEmQAhkAI4AhAEmQAhkAI4AAAAAGQZsAL8DJIQBJkAIZACOAAAAABkGbIC/AySEASZACGQAjgCEASZACGQAjgAAAAAZBm0AvwMkhAEmQAhkAI4AhAEmQAhkAI4AAAAAGQZtgL8DJIQBJkAIZACOAAAAABkGbgCvAySEASZACGQAjgCEASZACGQAjgAAAAAZBm6AnwMkhAEmQAhkAI4AhAEmQAhkAI4AhAEmQAhkAI4AhAEmQAhkAI4AAAAhubW9vdgAAAGxtdmhkAAAAAAAAAAAAAAAAAAAD6AAABDcAAQAAAQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAzB0cmFrAAAAXHRraGQAAAADAAAAAAAAAAAAAAABAAAAAAAAA+kAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAABAAAAAALAAAACQAAAAAAAkZWR0cwAAABxlbHN0AAAAAAAAAAEAAAPpAAAAAAABAAAAAAKobWRpYQAAACBtZGhkAAAAAAAAAAAAAAAAAAB1MAAAdU5VxAAAAAAALWhkbHIAAAAAAAAAAHZpZGUAAAAAAAAAAAAAAABWaWRlb0hhbmRsZXIAAAACU21pbmYAAAAUdm1oZAAAAAEAAAAAAAAAAAAAACRkaW5mAAAAHGRyZWYAAAAAAAAAAQAAAAx1cmwgAAAAAQAAAhNzdGJsAAAAr3N0c2QAAAAAAAAAAQAAAJ9hdmMxAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAALAAkABIAAAASAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGP//AAAALWF2Y0MBQsAN/+EAFWdCwA3ZAsTsBEAAAPpAADqYA8UKkgEABWjLg8sgAAAAHHV1aWRraEDyXyRPxbo5pRvPAyPzAAAAAAAAABhzdHRzAAAAAAAAAAEAAAAeAAAD6QAAABRzdHNzAAAAAAAAAAEAAAABAAAAHHN0c2MAAAAAAAAAAQAAAAEAAAABAAAAAQAAAIxzdHN6AAAAAAAAAAAAAAAeAAADDwAAAAsAAAALAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAAiHN0Y28AAAAAAAAAHgAAAEYAAANnAAADewAAA5gAAAO0AAADxwAAA+MAAAP2AAAEEgAABCUAAARBAAAEXQAABHAAAASMAAAEnwAABLsAAATOAAAE6gAABQYAAAUZAAAFNQAABUgAAAVkAAAFdwAABZMAAAWmAAAFwgAABd4AAAXxAAAGDQAABGh0cmFrAAAAXHRraGQAAAADAAAAAAAAAAAAAAACAAAAAAAABDcAAAAAAAAAAAAAAAEBAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAkZWR0cwAAABxlbHN0AAAAAAAAAAEAAAQkAAADcAABAAAAAAPgbWRpYQAAACBtZGhkAAAAAAAAAAAAAAAAAAC7gAAAykBVxAAAAAAALWhkbHIAAAAAAAAAAHNvdW4AAAAAAAAAAAAAAABTb3VuZEhhbmRsZXIAAAADi21pbmYAAAAQc21oZAAAAAAAAAAAAAAAJGRpbmYAAAAcZHJlZgAAAAAAAAABAAAADHVybCAAAAABAAADT3N0YmwAAABnc3RzZAAAAAAAAAABAAAAV21wNGEAAAAAAAAAAQAAAAAAAAAAAAIAEAAAAAC7gAAAAAAAM2VzZHMAAAAAA4CAgCIAAgAEgICAFEAVBbjYAAu4AAAADcoFgICAAhGQBoCAgAECAAAAIHN0dHMAAAAAAAAAAgAAADIAAAQAAAAAAQAAAkAAAAFUc3RzYwAAAAAAAAAbAAAAAQAAAAEAAAABAAAAAgAAAAIAAAABAAAAAwAAAAEAAAABAAAABAAAAAIAAAABAAAABgAAAAEAAAABAAAABwAAAAIAAAABAAAACAAAAAEAAAABAAAACQAAAAIAAAABAAAACgAAAAEAAAABAAAACwAAAAIAAAABAAAADQAAAAEAAAABAAAADgAAAAIAAAABAAAADwAAAAEAAAABAAAAEAAAAAIAAAABAAAAEQAAAAEAAAABAAAAEgAAAAIAAAABAAAAFAAAAAEAAAABAAAAFQAAAAIAAAABAAAAFgAAAAEAAAABAAAAFwAAAAIAAAABAAAAGAAAAAEAAAABAAAAGQAAAAIAAAABAAAAGgAAAAEAAAABAAAAGwAAAAIAAAABAAAAHQAAAAEAAAABAAAAHgAAAAIAAAABAAAAHwAAAAQAAAABAAAA4HN0c3oAAAAAAAAAAAAAADMAAAAaAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAACMc3RjbwAAAAAAAAAfAAAALAAAA1UAAANyAAADhgAAA6IAAAO+AAAD0QAAA+0AAAQAAAAEHAAABC8AAARLAAAEZwAABHoAAASWAAAEqQAABMUAAATYAAAE9AAABRAAAAUjAAAFPwAABVIAAAVuAAAFgQAABZ0AAAWwAAAFzAAABegAAAX7AAAGFwAAAGJ1ZHRhAAAAWm1ldGEAAAAAAAAAIWhkbHIAAAAAAAAAAG1kaXJhcHBsAAAAAAAAAAAAAAAALWlsc3QAAAAlqXRvbwAAAB1kYXRhAAAAAQAAAABMYXZmNTUuMzMuMTAw"
+};
+
+/***/ })
+/******/ ]);
+});
\ No newline at end of file
diff --git a/www/lib/random-string.js b/www/lib/random-string.js
new file mode 100644
index 0000000..e56ece7
--- /dev/null
+++ b/www/lib/random-string.js
@@ -0,0 +1,38 @@
+function randomString(n,s){
+ //
+ // review..
+ try{
+ n = n || 16
+ let b = new Uint8Array(n+1) // +1 for extra random value for initial start position
+ crypto.getRandomValues(b)
+
+ s = s || 'ABCDEFGHIJKLMNOPQRSTUWXYZabcdefghijklmnopqrstuvwxyz01234567890' //-_'
+
+ let aa = []
+ let ii = 0
+ let len = s.length
+ // note: this might be biased? or might be bad to add seq random numbers?
+ for(let i = 0;i< b.length;i++){ // first value (index 0) to start in a random location.
+ let v = b[i]
+ ii += v
+ if(i > 0){
+ let iii = ii%len
+ let vv = s[iii]
+ if(!vv)
+ conole.log('out of range?',iii)
+ aa.push(vv)
+ }
+ }//for
+
+ let r = aa.join('')
+
+ return r
+ }
+ catch(e){
+ //
+ console.log('crypto not supported?')
+ return Math.random().toString(36).substring(7) // till crypto bug fix?
+ }
+ }
+
+export default randomString
diff --git a/www/main.js b/www/main.js
new file mode 100644
index 0000000..00eec19
--- /dev/null
+++ b/www/main.js
@@ -0,0 +1,1341 @@
+//
+// 2023.06.18
+// support
+// - chrome
+// - edge
+// - ff
+// - safari
+// ...
+// mobile / pc (linux/iOS/macOS/windows/android)
+// ...
+// cross device/platform
+//
+//
+// next:
+// - db
+// - save user name (kv)
+// - use username in messaging.
+//
+// .............................
+//
+//
+// next: select cam
+// 'c' to toggle. upg: ui (in user icon) .. see your stats and pick settings there.
+//
+// upg: remember specific mute mike setting (even if switch video input.)
+// .......
+//
+// https://github.com/diafygi/webcrypto-examples/#ecdsa
+//
+// next: add db, c, input box, etc
+//
+// upg: better linky type things
+//
+// next: video display mangagement. choose based on environemnt. (see (with demo) what css can do automatically)
+// - goal to keep full bleed.
+//
+// next: handle switch between audio/video mode.
+// - tap video to toggle video off
+//
+// upg: copy/paste media
+//
+//
+// upg: prn -- better input/output selection (when click user icon)
+//
+// upg: chat (with hyper and media links)
+//
+// upg: upload
+// - media, video, pics special treated?
+//
+// upg: display media (screenshare) prn
+//
+//
+// upg: HTMLCanvasElement.captureStream().
+// - make a shared whiteboard thing (allow pple to 'draw' on the whiteboard they see) prn.
+//
+// next: toggle mute audio
+// - spacebar 'm'
+// - click mic button
+//
+// upg: automatically activate mic if allowed (check permissions/try?) or? prn.
+//
+// upg: support voice call?
+// - toggle off video if pic audio?
+// - toggle again to switch? or?
+// - or put line under mode <-- this. underline mic or cam .. upg sliding animation on toggle.
+//
+// hide speaker by default once audio works (only have mute page option if user sets that as option in ui)
+//
+// hack reload the page every 5 seconds if no peers? (and no streams yet)
+// > upg: review source to see why this might be.
+//
+// toggle cam switches off cam. (remove underline)
+//
+// toggle mic mutes audio out. (video or audio mode) .. have to turn off video mode to swich to audio only mode.
+//
+// click on cam when on mic mode .. turns off mic and turns on cam
+// (upg: can/should we have different tracks, a video track and an audio track, yes that would be eaier/better if in sync?) .. but use the same ui.
+//
+// upg: tap to toggle peer view.
+// - time on call, video or audio on. and/or
+//
+// upg: opt: integrate with nostr (share addr?)
+// > with ai readable text messages?
+//
+// upg: add version number in uio.
+//
+// upg: display change on peers.
+//
+// upg: allow u=bob to suggest a username (but the user has to accept it)
+
+import randStr from './lib/random-string.js'
+//import NoSleep from './lib/nosleep.js' // try inlcuding in main or minifted version?
+
+import {trystero,idb} from './lib/bundle.js'
+
+const {openDB} = idb
+
+const {joinRoom} = trystero
+
+console.log(openDB)
+
+let VER = '[5]'
+console.log('VERSION 2023.06.20 #1945 '+VER)
+
+const url = new URL(location.href)
+const {searchParams} = url
+let searchU = searchParams.get('u')
+
+document.querySelector('.version').textContent = VER
+
+let roomTag = location.hash
+if(!roomTag){
+ roomTag = (await randStr(6)).toLowerCase()
+ location.hash = roomTag
+ roomTag = location.hash
+ }
+
+console.log('roomTag',{roomTag})
+
+//
+// upg: api interface.
+//
+let tableName = n=>n
+
+const db = await openDB('main',1,{upgrade:(...args)=>{
+ const [db,oldVersion,newVersion,transaction,e] = args
+ console.log('upgrade',{oldVersion,newVersion})
+
+ let t = tableName
+
+ let s
+ s = db.createObjectStore(t('kv'),{keyPath:'key',unique:true}) // {key:'bob',value:'12345'}
+
+ // s.createIndex('unitId','unitId')
+ }})
+
+const kv = {
+ t:tableName,
+ get : async function(k){
+ const {t} = this
+ const r = await db.get(t('kv'),k)
+ return r?.value
+ },
+
+ set : async function(k,v){
+ const {t} = this
+ let m = {key:k,value:v}
+ const r = await db.put(t('kv'),m)
+ return r
+ }
+ }//kv
+
+if(searchU){
+ await kv.set('username',searchU)
+ }
+let username = await kv.get('username')
+
+console.log('username',username)
+
+
+const ce = (...args)=>{
+ const [type,value] = args
+ let d = cc(...args)
+ if(value) // upg: if str
+ d.textContent = value
+
+ return d
+ }//func
+
+const dB = document.body
+let q = n=>dB.querySelector(n)
+let cc = n=>document.createElement(n||'div')
+let ca = (a,b)=>a.appendChild(b)
+const dM = q('main')
+const dL = q('.log')
+const dD = q('main.display')
+const dPc = q('.peer-count')
+const dPre = q('.preview')
+const dI = q('footer .input input')
+const dTl = q('.display .text-log')
+
+// upg: support #spaces
+//
+// upg: lib compliler
+//
+// upg: notificaton option (offline and online)
+//
+// upg: bring in libraries (for working with data etc.)
+
+const {subtle} = window.crypto
+
+const genSignKey = async n=>{
+
+ let k = await subtle.generateKey({
+ name: "ECDSA",
+ namedCurve: "P-384"
+ },
+ true, //whether the key is extractable (i.e. can be used in exportKey)
+ ["sign", "verify"] //can be any combination of "sign" and "verify"
+ )
+
+ const jPk = await subtle.exportKey('jwk',k.publicKey)
+ const jSk = await subtle.exportKey('jwk',k.privateKey)
+
+ return {key:k,jPk,jSk}
+ }//
+
+let sigKey = await genSignKey()
+console.log({sigKey})
+
+// ----------------------------------
+onhashchange = (e) => {
+ const {oldURL,newURL} = e
+ // upg: join nrew room and update display (and/or?) // nice if keep old room open till all clear sending (using room class abstraction)
+ setTimeout(n=>location.reload(),150) //upg: ask to reload or?
+ }
+
+
+const room = joinRoom({appId:'--linky-rendezvous'},'alpha-'+roomTag)
+
+
+// ----------------------
+//
+const [send,recv] = room.makeAction('message')
+
+//upg: use sync ping/query.
+recv((d,p)=>{
+ console.log('recived data from peer',p,d)
+ const {kind} = d|| {}
+ if(kind == 'message'){
+ d.from = 'them'
+ logMessage(d)
+ }
+ })
+
+
+let peers = {}
+
+room.onPeerJoin(p=>{
+ console.log('peer join',p)
+ // upg: update() // to set has-peer in body (with peer-join) only if 5 seconds peer.
+ //dB.classList.add('peer-join')// upg: timer to turn off peer join after 5 seconds.
+ //
+ // upg: do peer
+
+ // upg: put peer in a wait list if we've not got the stream yet...
+ if(stream){
+ console.log('adding existing stream to for new peer',p)
+ const {s,m} = stream
+ room.addStream(s,p,m)
+ }
+
+ let ping = async n=>{
+ let r = await room.ping(p)
+ console.log('ping update',p,r+'ms')
+ peers[p]._ping = setTimeout(ping,5000)
+ }
+
+
+ peers[p] = {
+ pid:p,
+ udate:Date.now()/1000,
+ ping
+ }
+
+ ping()
+
+ //upg: animate peer icon (flash)
+ update()
+ })
+
+const removeMedia = n=>{
+ //upg: stop media first? prn.
+ dD.removeChild(n)
+ }
+
+
+room.onPeerLeave(p=>{
+ console.log('peer leave',p,peerMedia)
+ dB.classList.remove('peer-join') //and/or? use has-peers set from update()
+
+
+ let l = []
+ peerMedia.forEach(v=>{ // or? (use index based lookup?) though there can be multiple.
+ console.log('review',v)
+ const {dom,meta,container} = v
+ if(p == v.p){
+ removeMedia(container)
+ }
+ else
+ l.push(v)
+ })
+
+ peerMedia = l // restore
+
+ clearTimeout(peers[p]._ping) // NOTE CONNECTED --- upg: call peer.done()
+ delete peers[p]
+
+ update()
+ })
+
+
+//let _toAdd = []
+let peerMedia = []
+room.onPeerStream((s,p,m)=>{ // upg on peer track?
+ // s = stream
+ // p = peer
+ // m = metadata
+
+ // and/or detect media?
+ //
+ let {kind} = m||{}
+
+ console.log('peer stream: add stream',{kind},{s,p,m})
+
+ ;{
+ // https://developer.mozilla.org/en-US/docs/Web/API/OfflineAudioContext
+ // https://developer.mozilla.org/en-US/docs/Web/API/Web_Audio_API/Using_Web_Audio_API
+ // https://web.dev/webaudio-intro/
+ // https://developer.mozilla.org/en-US/docs/Web/API/GainNode/GainNode
+ // https://developer.mozilla.org/en-US/docs/Web/API/AnalyserNode/AnalyserNode
+ // https://developer.mozilla.org/en-US/docs/Web/API/AudioContext/createMediaElementSource
+ // https://developer.mozilla.org/en-US/docs/Web/API/AudioContext/createMediaStreamSource
+ // https://developer.mozilla.org/en-US/docs/Web/API/AnalyserNode/getFloatTimeDomainData
+
+
+
+
+ //
+ // upg: send what we're getting back to them?
+ // upg: process each input stream and display value
+ //
+ // > mainly for speaker detection for main view.
+ // - toggle views?
+ // - default full edge speaker view video with overlays.
+ // - second is full edge titled video.
+ // - and?
+ //
+ // (note will rairly be more than 3?)
+ //
+ //
+ // - might have screensharing too (it takes priorty) with pip speaker.
+ //
+ // what do we need to see? localy, what helps? prn.
+ // - just that we've got the stream and/or?
+ //
+ //
+ // >> WE PROB WANT TO DO THIS REMOTE SIDE AND SEND THE RESULT TO PEER
+ // - this will help early jump speaker selection.'
+ //
+ try{
+ // also send telmetry from the user (then we'll have details)
+ // - send on/off events.
+ // upg: make this a monitoring lib class with events
+ const ac = new AudioContext()
+ // const sampleRate = 44100
+ //const ac = new OfflineAudioContext(//new AudioContext() // see.
+ // {
+ // numberOfChannesl:2,
+ // length: sampleRate*40,
+ // sampleRate
+ // })
+ //console.log({ac})
+ //const options = {
+ // mediaStream: s
+ // }
+ const source = ac.createMediaStreamSource(s)
+ //console.log('remote SOURCE',source)
+
+ const gain = new GainNode(ac,{gain:0})
+ const meter = new AnalyserNode(ac) //upg: lower grained monitory.
+
+ const data = new Float32Array(meter.frequencyBinCount)
+ const byteData = new Uint8Array(meter.frequencyBinCount)
+
+ source.connect(meter).connect(gain).connect(ac.destination)
+
+ // https://developer.mozilla.org/en-US/docs/Web/API/AnalyserNode/getByteFrequencyData
+
+ // upg: monitor the common (long time) high average for baseline to detect speech.
+ // - upg: use time domain to detect?
+ // - upg: libraries to detect speech
+ // upg: detect actual speech client side (using local detection) .. and send that also data telem to peers. .. eg and/or -- https://github.com/solyarisoftware/webad
+ setInterval(n=>{
+ return
+ //upg: put in groups and count groups and/or algo or?
+ meter.getFloatFrequencyData(data)
+ meter.getByteFrequencyData(byteData) //-0 ~ -165 etc. -0 is loud. -165 is soft.
+ //console.log(data)
+ //let x = byteData.join(', ')
+ //dB.querySelector('.debug').textContent = x
+ let a = 0
+ let {length} = data
+ let g = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
+ for(let i=0;i{
+ console.log('stream remove track',e)
+ //upg: smarter
+ let lt = s.getTracks()
+ if(lt.length == 0){
+ console.log('remove media display',{s,p,m,dc})
+ try{
+ dD.removeChild(dc)
+ }
+ catch(e){
+ console.log(e)
+ }
+ }
+ })
+
+
+ s.addEventListener('addtrack',e=>{
+ console.log('stream add track',e)
+ })
+
+
+ //upg: how to detect if video?
+ // -- upg: ignore if unknown kind
+
+ const d = document.createElement(kind)
+ d.srcObject = s
+ d.muted = !interacted // so video can play still.
+ d.autoplay = true
+
+
+
+
+ const onPlaying = e=>{
+ // try to unmute (video can play without audio)
+ console.log('onplaying peer stream')
+ d.removeEventListener('playing',onPlaying)
+ startWakeLock()
+
+ //setTimeout(n=>{
+ // console.log('trying umute.')
+ // d.muted = false //try to unmute .. this might pause things?
+ // },3500)
+ }//func
+
+ d.addEventListener('playing',onPlaying)
+
+
+ //setTimeout(n=>{
+ //try to play: upg: keep trying or? //upg: check global wantsMute if create that.
+ // if(interacted) // upg: or just try to unmute anyway? .. donno how long need to wait since autoplay
+ // d.muted = false
+ // },150)
+
+
+ let dc = d
+
+ // https://developer.mozilla.org/en-US/docs/Web/HTML/Element/video
+ //
+ if(kind == 'video'){
+ //d.playsinline = true
+ d.setAttribute('playsinline','') // or = true ok?
+ dc = makeVideo(d)
+ }
+
+ dD.appendChild(dc)
+
+ peerMedia.push({p,dom:d,container:dc,meta:m}) //type:'audio'
+ //d.play()
+
+ update()
+ })
+
+//const flushInteractions(){}
+
+// upg: a generic class to do this.
+// upg: fix this?
+let hasPeersState = {
+ value: false,
+ limit:1,
+ ago:0,
+ try:function(...args){
+ const [v,cb,x] = args
+ const now = performance.now()/1000
+ console.log('this try',v,{x},this)
+ if(this.value !=v){
+ const delta = (now-this.ago)
+ console.log({delta},this.ago)
+ if(delta >= this.limit){ // = roughly
+ console.log('ok to change',this.value)
+ cb(this.value)
+ this.ago = now
+ }//if
+ else{
+ let next = ((this.ago+this.limit)-now)*1000 // +?
+ console.log(next)
+ clearTimeout(this._timeout)
+ this._timeout = setTimeout(n=>this.try(...args,'retry'),next)
+ }
+ }//if
+ }//fn
+ }//obj
+
+let _update = 0
+const update = n=>{
+ _update++
+
+ let now = performance.now()/1000
+
+ const l = room.getPeers()
+ console.log(l)
+ dPc.textContent = l.length+1 // +1 to count self.
+
+ let peerCount = l.length
+
+ let audioLive = false
+ let videoLive = false
+
+ if(stream){
+ const {s} = stream
+ const tl = s.getTracks()
+ console.log('update',{tl})
+ tl.forEach(v=>{
+ let {kind,enabled} = v
+ if(enabled && kind =='audio')
+ audioLive = true
+
+ if(enabled && kind =='video')
+ videoLive = true
+ })
+ }
+
+ dB.classList[audioLive?'add':'remove']('audio-is-live')
+ dB.classList[videoLive?'add':'remove']('video-is-live')
+
+ //upg: time trigger this (so only changes once per second)
+ let hasPeers = (peerCount>0)
+ hasPeersState.try(hasPeers,n=>{
+ console.log('has peers',n)
+ dB.classList[hasPeers?'add':'remove']('has-peers')
+ })
+
+
+ let hasPeerVideo = false // hack; upg: and/or ../ upg where delete peer video?
+ ;(peerMedia||[]).forEach(v=>{
+ const {meta} = v
+ const {kind} = meta
+ console.log('checking peer media',v,{meta,kind})
+ if(kind == 'video')
+ hasPeerVideo = true
+ })
+
+
+ dB.classList[hasPeerVideo?'add':'remove']('has-peer-video') // and/or:
+
+
+ // and or this shouldn't be in update or why not here? (so long as don't quick move)
+ let state = {
+ audioLive,videoLive,peerCount,interacted,hasPeerVideo
+ }
+ //upg: send available media etc?
+ //upg: toggle button to call about
+ //
+ //upg: comfort level based sharing with who etc.
+ // - close friends share (cached?) about mee.
+
+ send({kind:'update',layer:_update,state})
+ }
+
+//paint = intial create once
+
+const makeVideo = n=>{
+
+ const d = document.createElement('div')
+ d.classList.add('video-wrapper')
+ d.appendChild(n)
+ return d
+ }
+
+
+let stream = false
+const addStream = async (s,m)=>{
+ //
+ // add stream to peers (and remember for other peers)
+ //
+ console.log('add stream',s)
+ //upg: switch to video audio if pick that, or seperate streams?
+
+ stream = {s,m}// and/or?
+ room.addStream(s,null,m) // and/or?
+ console.log('stream added for peers',s,m)
+ }//func
+
+// -----------------------------
+const toggleAudio = n=>{
+ if(stream){
+ let {s} = stream
+ console.log('is video, toggle audio')
+ const tl = s.getAudioTracks()
+ console.log("audo tracks",tl)
+ let vl = []
+
+ tl.forEach(v=>{
+ v.enabled = !v.enabled
+ vl.push(v.enabled)
+ })
+
+ console.log('new state',vl)
+
+ update()
+ }//if
+ }//func
+
+let _toggleMic = false
+const toggleMic = async n=>{
+ if(!_toggleMic){
+ console.log('toggle mic')
+
+ if(!stream){
+ //upg: switch to video audio if pick that, or seperate streams?
+
+ const {mediaDevices:m} = navigator
+
+
+ const l = await m.enumerateDevices()
+ console.log({l})
+
+ const s = await m.getUserMedia({video:false,audio:true})
+
+ addStream(s,{kind:'audio'})
+
+ dB.classList.add('mic-on')
+ }
+ else {
+ console.log('has stream',stream)
+ const {s,m} = stream
+ const {kind} = m
+ const isVideo = (kind == 'video')
+ const isAudio = (kind == 'audio')
+
+ if(isAudio){
+ console.log('stop audio',s)
+
+ //upg: use the same stream but add/remove tracks? or?
+ //room.removeStream(s)
+ const cl = s.getTracks()
+ console.log({cl})
+ cl.forEach(v=>{
+ console.log({v})
+ room.removeTrack(v,s)
+ stream.m.kind = 'empty'
+ })
+
+ stream = false
+ }
+ else {
+ toggleAudio()
+ }
+ }//else
+
+ update()
+ _toggleMic = false
+ }//if
+ }//func
+
+const switchCam = async n=>{
+
+ // upg: debounce
+ //
+ // upg: review
+ //
+ // upg: alpha sort deviceId (or does it always report in the same order every query?)
+
+ if(stream){
+ console.log('switchCam')
+
+ const {s} = stream
+
+ const a = await aboutStream(s)
+ console.log({a})
+
+ let f = a.find(v=>v.kind=='video')
+ console.log({f})
+ // upg: what if more than one video? does that happen when we're screen sharing?
+
+ if(f){
+ const {mediaDevices:m} = navigator
+ const l = await m.enumerateDevices()
+ console.log({l})
+
+ //
+ // https://developer.mozilla.org/en-US/docs/Web/API/MediaDeviceInfo
+
+ let ff = l.find(v=>v.deviceId == f.deviceId)
+ console.log({ff})
+
+ let i = l.indexOf(ff)
+ console.log({i})
+
+ let next = false
+
+ l.forEach((v,ii)=>{
+ const {deviceId,kind,label,groupId} = v
+ //groupId = same physical device
+ //kind = "videoinput", "audioinput" or "audiooutput"
+ //label = "External USB Webcam c201"
+
+ if(kind == 'videoinput' && ii > i){
+ console.log('found!',label,deviceId)
+ next = {deviceId,device:v}
+ }
+ })
+
+ if(!next){
+ const fff = l.find(v=>v.kind=='videoinput')
+ console.log({fff,f})
+ if(fff && fff.deviceId != f.deviceId){
+ next = fff
+ }
+ }//if
+
+ console.log('switch to',next)
+ }//if
+ }//if
+ else
+ console.log('no stream',stream)
+ }//func
+
+
+const aboutStream = s=>{
+
+ let a = []
+
+ if(s){
+ const {mediaDevices:m} = navigator
+
+ //
+ // https://developer.mozilla.org/en-US/docs/Web/API/MediaStreamTrack
+ const tl = s.getTracks()
+ console.log({tl})
+
+ // upg: send device code etc to peers?
+
+ //
+ // https://developer.mozilla.org/en-US/docs/Web/API/MediaTrackSettings
+ tl.forEach((n,i)=>{
+ const {contentHint,kind,label,muted,readyState} = n
+ const s = n.getSettings()
+ const c = n.getConstraints()
+ const { deviceId,groupId, ///all
+
+ //some
+ aspectRatio,
+ cursor,
+ displaySurface,
+ frameRate,
+ height,
+ resizeMode,
+ width
+ } = s
+ console.log({s,c})
+ console.log(i+1,{deviceId,kind,label,contentHint})
+
+ const aa = {
+ contentHint,kind,label,muted,readyState,deviceId,groupId,
+
+ aspectRatio,cursor,displaySurface,frameRate,height,width,resizeMode,
+
+ track:n
+ }
+
+ a.push(aa)
+ })
+ }//if
+
+ return a
+ }//func
+
+let _toggleCam = false
+const toggleCam = async n=>{
+ if(!_toggleCam){
+
+ let dd // display to append
+
+ if(stream){
+ console.log('has stream',stream)
+ const {s,m} = stream
+ const {kind} = m
+ const isVideo = (kind == 'video')
+ const isAudio = (kind == 'audio')
+
+ if(isVideo){
+ console.log('stop video',s)
+
+ //upg: use the same stream but add/remove tracks? or?
+ //room.removeStream(s)
+ const cl = s.getTracks()
+ console.log({cl})
+ cl.forEach(v=>{
+ console.log({v})
+ room.removeTrack(v,s)
+ stream.m.kind = 'empty'
+ })
+
+ //// -- remove preview
+ dPre.innerHTML = '' // or?
+
+ stream = false
+ }
+ }
+ else {
+
+
+ //upg: show ui progress (cam might take a bit.)
+ // - pulse animation while is-enabling-cam.
+
+ _toggleCam = true
+ console.log('toggle cam')
+ //upg: switch to video audio if pick that, or seperate streams?
+
+ const {mediaDevices:m} = navigator
+
+ const l = await m.enumerateDevices()
+ console.log({l})
+ //upg : remember
+
+ const audio = true // upg: and/or?
+ const video = true
+ const media = {video,audio}
+ const s = await m.getUserMedia(media) // does it work if we send mic/cam sperately? in sync?
+
+ //
+ // https://developer.mozilla.org/en-US/docs/Web/API/MediaStreamTrack
+ const tl = s.getTracks()
+ console.log({tl})
+
+ // upg: send device code etc to peers?
+
+ //
+ // https://developer.mozilla.org/en-US/docs/Web/API/MediaTrackSettings
+ tl.forEach((n,i)=>{
+ const {contentHint,kind,label,muted,readyState} = n
+ const s = n.getSettings()
+ const c = n.getConstraints()
+ const {deviceId,groupId} = s
+ console.log({s,c})
+ console.log(i+1,{deviceId,kind,label,contentHint})
+ })
+
+ //
+ // https://developer.mozilla.org/en-US/docs/Web/API/MediaStream
+ console.log('got media device stream',s)
+
+
+
+ addStream(s,{kind:'video',media})
+
+ // preview
+ const d = document.createElement('video')
+ //d.playsinline = true
+ d.setAttribute('playsinline','') // or = true ok?
+ dd = makeVideo(d)
+ d.muted = true // or?
+ d.autoplay = true
+ d.srcObject = s
+ //d.play()
+
+ dPre.innerHTML = ''
+ dPre.appendChild(dd)
+
+ dB.classList.add('cam-on')
+ }//else
+
+ update()
+ _toggleCam = false
+ }//if
+ }//func
+
+const addDisplay = async n=>{
+ console.log('add display')
+ const {mediaDevices:m} = navigator
+
+ // https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices/getDisplayMedia
+
+ const audio = false // upg: and/or?
+ const video = true
+ const media = {video,audio}
+ const s = await m.getDisplayMedia(media) // does it work if we send mic/cam sperately? in sync?
+
+ const a = await aboutStream(s)
+ console.log('display media',s,{a})
+
+ addStream(s,{kind:'video',media,displayMedia:true}) //or
+
+ // upg: how to display that you're sharing screen? (tile previews?)
+ }
+
+
+dB.querySelector('.mic.button').onclick = e=>{
+ toggleMic()
+ }
+
+
+dB.querySelector('.cam.button').onclick = e=>{
+ toggleCam()
+ }
+
+
+dB.querySelector('.peers.button').onclick = e=>{
+ //hack
+ switchCam()
+ }
+
+
+//
+// https://developer.mozilla.org/en-US/docs/Web/API/Screen_Wake_Lock_API
+//
+// https://github.com/richtr/NoSleep.js
+//
+// upg: turn wakelock on when there's a stream, (incomming or out going?) at least for outgoing video prn
+//
+let wakeLock = null
+const startWakeLock = async n=>{
+ //
+ // upg
+ // noSleep = new NoSleep()
+ // noSleep.enable() // on user interaction (so can play video)
+ // https://github.com/richtr/NoSleep.js
+ //
+ if('wakeLock' in navigator){
+ try{
+ wakeLock = await navigator.wakeLock.request('screen')
+ console.log('requested wakelock',wakeLock)
+ // upg: await awakeLock.release() -- when not sending stream
+ dB.classList.add('wakelock-active')
+ }
+ catch(e){
+ console.log(e,e,name,e.message)
+ }
+ }
+ else {
+ console.log('Wakelock not supported.')
+ // upg: move this indicator settings section (don't need to know in some envs?)
+ dB.classList.add('wakelock-not-supported')
+ }
+ }
+
+document.addEventListener('release',e=>{
+ console.log('wake lock released')
+ dB.classList.remove('wakelock-active')
+ })
+
+document.addEventListener('visibilitychange',async e=>{
+ const {visibilityState:v} = document // hidden, visible
+ console.log('new visibility',v,e)
+ // >> upg: send visibility state (per user's affiliation comfortabliiity)
+ if(v === 'visible'){
+ await startWakeLock()
+ }//if
+ })
+
+dB.querySelector('.reload-button').addEventListener('click',e=>{
+ location.reload()
+ })
+
+let interacted = false
+const interactionEvent = e=>{
+ if(!interacted){
+ interacted = true
+ console.log('interacted!')
+ dB.removeEventListener('click',interactionEvent)
+ dB.classList.add('has-interacted') // upg: more complated than that for intential muting (set a default is_muted = true state. upg: remember it?
+
+ peerMedia.forEach(v=>{
+ console.log('need play?',v)
+ const {p,dom,meta} = v
+ console.log({p,dom,meta})
+ dom.muted = false
+ dom.play() // and/or? // if audio?
+ })
+
+ startWakeLock()
+ }//if
+ }//funt
+
+dB.addEventListener('click',interactionEvent)
+
+const goAudio = n=>{
+ //mute/unmute or start audio stream
+ if(stream)
+ toggleAudio()
+ else
+ toggleMic()
+ }
+
+
+// upg: use db and sync method for catchup.
+
+const logMessage = n=>{
+ let {value:v,from,name} = n || {}
+
+ username = username || ''
+
+ console.log('log messge',{n})
+ const d = ce()
+
+ const fromMe =(from=='me')
+
+ d.classList.add('item',fromMe?'from-me':'from-them')
+
+ let dA = ce() // upg: ce('text content' or something to appendChild)
+ dA.textContent = name
+ dA.classList.add('meta')
+ d.appendChild(dA)
+
+ //let dB = ce('div',(fromMe?">> ":'')+v)
+
+ let dB = ce('div',v) //{c:'abc'} ?? -c jfiwoefij -ce -fji jf) .. command line style and/or luange style interopated cc() or?
+ dB.classList = 'content'
+ ca(d,dB) // append dB to d
+
+
+
+ dTl.appendChild(d)
+
+ while(dTl.childElementCount > 10)
+ dTl.removeChild(dTl.firstChild)
+
+ }//func
+
+
+dI.onfocus = e=>{
+ console.log('FOCUS!')
+ }
+dI.onblur = e=>{
+ console.log('BLUR!')
+ }
+//upg: use a tick and/or watch return from focus and a check focucs function?
+
+dI.onkeydown = e=>{
+ const {key} = e
+
+ if(key == 'Enter'){
+ console.log({key})
+ const v = (dI.value).trim()
+
+ if(v){
+ // 'me' means use peer (peer's assocated cid)
+ const m = {
+ kind:'message',from:'me',value:v,name:username
+ }
+
+ dI.value = ''
+
+ logMessage(m)
+ send(m)
+ e.preventDefault()
+ }//if
+ }
+ }//func
+
+//
+// Hey bob, this is my secret message to you.
+//
+// I'm using your public key nicknamed 'xyz'.
+//
+// Here's the message, it's in base64url format.
+//
+// Reply back when you get this, thanks!
+//
+//
+// note: i'm using protocol cirta 2023.06.15.
+//
+// ---------------------------
+// FJIfIOJoifejwoifjieowsdsafijFJEIFjDFSK
+// DSFJKEFOIFJOEjfwieoioejwfoiewifoewiofj
+// etc...
+//
+//
+//
+//
+//
+
+
+
+const focusInput = n=>{
+ dI.focus()
+ }
+
+// ------------------
+document.addEventListener('keydown',e=>{
+ // only if not focused on typing input.
+ const {activeElement:aE} = document
+
+ const inputFocus = dI == aE
+ //console.log({inputFocus})
+
+ if(inputFocus) return // keys go to input box.
+
+ const {key} = e
+ if(key == 'c'){
+ switchCam()
+ }
+ else
+ if(key == 'd'){
+ addDisplay()
+ }
+ else
+ if(key == ' '){
+ goAudio()
+ }
+ else
+ if(key == 'Escape'){
+ focusInput()
+ }
+ else {
+ // or?
+ focusInput()
+ }
+ //if
+
+ interactionEvent()
+ })//func
+
+// next generate ecdh https://github.com/diafygi/webcrypto-examples/#ecdh
+// - this one per room? or?
+
+//ugp: get key if not generated.. make each room have it's own pub sig key? or allow the same id between #rooms? (prn start with shared?)
+//
+//
+// >> [new message]
+// > encrypt [generate a new public/disposable key]
+// > sign
+// > make message to send {M}
+// > (add delvery header (mainly the room id))
+// > push to log
+// - for later query.
+//
+// .. remember the rooms
+//
+//
+
+//
+// uid: x|y is domain.
+//
+
+//
+// upg: db setup
+//
+// > messages {
+// id,
+// from:uid,
+// to:uid,
+// room,
+// message,
+// (message network sent,)
+// udate
+// }
+// :room-id
+// :room-udate
+// :room-from-udate
+// prn
+//
+// > system-log {
+// id,
+// from:uid
+// to:uid
+// udate,
+// kind:'key-share',
+// value:{} // and or.. make log include everything with search filterws... to start, yes prob that.
+// }
+//
+// > rooms {
+// id,
+// name,
+// (keys), //etc
+// udate
+// }
+// :name
+// //list of rooms
+// use this and sync manager, to pull new messages (espl if visit room)
+//
+//
+// upg: > search { ((re)buildable)
+// word,
+// ref:'room-id',
+// from,
+// to,
+// udate
+// }
+// :word
+// :from-word
+// :to-word
+// etc
+//
+// > inbox .. so can process even if not done and restart
+// > outbox ..
+//
+// > [use a nostr type req query]
+// > make fid = 000000000000000001 < prefix padding so can do..
+// : since :room-000000000000003
+//
+//
+//
+// upg: could lock _message data with hashkey unlock when sign in. [most ppl this is not an issue.. pro mode feature?
+//
+
+
+
+let _n = 0
+
+setInterval(n=>{
+ _n++
+
+ const {scrollHeight,clientHeight,scrollTop} = dM
+
+ let size = (scrollHeight-(clientHeight+scrollTop))
+ let isMaxScroll = size < 7
+
+ let doAutoScroll = isMaxScroll
+
+ const d = document.createElement('div')
+ d.classList.add('info')
+ d.textContent = 'uuu'
+ dL.appendChild(d)
+
+ const dd = document.createElement('div')
+ dd.classList.add('content')
+ dd.innerText = 'hello! ('+_n+')'
+ dL.appendChild(dd)
+
+ document.title = _n
+
+ //upg: wait for content to load if remote loaded content before scroll (need a event queue if then)
+
+
+ //upg detect if a snap to focus and jump to scroll positon
+ if(doAutoScroll){
+ dM.scrollTo({top:scrollHeight,left:0,behavior:'instant'})
+ }
+
+ },1000)
+
+/*
+let _doPing = false
+const doPing = async n=>{
+ if(!_doPing){
+ _doPing = true
+
+ _sincePing = performance.now()/1000
+
+ const l = room.getPeers()
+ console.log('ping',l)
+ let ll = l.map(async v=>{
+ let p = await room.ping(v)
+ return {peerId:v,ping:p}
+ }
+ )
+ let lr = await Promise.all(ll)
+ console.log('ping result',{lr}) // upg: how to use?
+ _doPing = false
+ }//if
+ }//func
+ */
+
+let _sincePeers = 0 // upg: reset this if no peers again.
+//let _sincePing = false
+
+
+let _tickCount = 0
+const tick = n=>{
+ _tickCount++
+
+ //console.log('check tick',_tickCount)
+ const now = performance.now()/1000
+
+ let pc = room.getPeers() //upg: on peer change run update to set dB.has-peers
+ let hasPeers = (pc.length > 0)
+ if(!hasPeers){
+
+ if(now-_sincePeers > 11){
+ dB.classList.add('long-time-no-peers')
+ //upg: offer link
+ //location.reload()
+ }
+
+ }//if
+ else {
+ dB.classList.remove('long-time-no-peers')
+ _sincePeers = performance.now()/1000
+ //console.log('done with tick',{hasPeers})
+ }
+
+// if(_sincePing === false || now-_sincePing > 10){
+// console.log('do ping test')
+// doPing()
+// }
+
+
+ setTimeout(tick,500)
+ }//func
+
+tick()
+
+console.log('ready.')
+
+const me = async n=> {
+ const f = await fetch('https://mee.pages.dev')
+ const j = await f.json()
+ console.log({j})
+ }
+// upg: optin to provide this (upg: as part of a resource package?)
+// https://developer.mozilla.org/en-US/docs/Web/API/Navigator/userAgent
+// https://developer.mozilla.org/en-US/docs/Web/HTTP/Client_hints
+// https://developer.mozilla.org/en-US/docs/Web/API/User-Agent_Client_Hints_API
+//
+// upg: ask user for name / icon.
+//
+// me()
+
+
diff --git a/www/rendezvous-icon.png b/www/rendezvous-icon.png
new file mode 100644
index 0000000..2fa138a
Binary files /dev/null and b/www/rendezvous-icon.png differ
diff --git a/www/rendvz b/www/rendvz
new file mode 100644
index 0000000..4444c6b
--- /dev/null
+++ b/www/rendvz
@@ -0,0 +1 @@
+2023-June