=1.5&&d<=Math.PI/2&&((m=p+1)>this.nbase&&(m-=this.nbase+1),(b=g-1)<0&&(b+=this.nbase+1),this.bases[m].setX(this.bases[p].getX()+.5*s),this.bases[m].setY(this.bases[p].getY()+.5*a),this.bases[b].setX(this.bases[g].getX()-.5*s),this.bases[b].setY(this.bases[g].getY()-.5*a),p=m,g=b);do{v=!1,this.construct_circle_segment(p,g),(m=p+1)>this.nbase&&(m-=this.nbase+1),s=this.bases[m].getX()-this.bases[p].getX(),a=this.bases[m].getY()-this.bases[p].getY(),(u=Math.atan2(a,s))<0&&(u+=2*Math.PI),(h=u-n)<0&&(h+=2*Math.PI),h>Math.PI&&(v=!0),(b=g-1)<0&&(b+=this.nbase+1),s=this.bases[b].getX()-this.bases[g].getX(),a=this.bases[b].getY()-this.bases[g].getY(),(l=Math.atan2(a,s))<0&&(l+=2*Math.PI),(h=r-l)<0&&(h+=2*Math.PI),h>Math.PI&&(v=!0),v&&(c=this.minf2(i,n+.5),this.bases[m].setX(this.bases[p].getX()+Math.cos(c)),this.bases[m].setY(this.bases[p].getY()+Math.sin(c)),p=m,c=this.maxf2(i,o-.5),this.bases[b].setX(this.bases[g].getX()+Math.cos(c)),this.bases[b].setY(this.bases[g].getY()+Math.sin(c)),g=b,y-=2)}while(v&&y>1)}},w.prototype.construct_circle_segment=function(t,e){var n,r,o,i,s,a,u,l,c,f,d,h,p,g,y;if(n=this.bases[e].getX()-this.bases[t].getX(),r=this.bases[e].getY()-this.bases[t].getY(),o=Math.sqrt(n*n+r*r),(p=e-t)<0&&(p+=this.nbase+1),o>=p)for(n/=o,r/=o,g=1;gthis.nbase&&(y-=this.nbase+1),this.bases[y].setX(this.bases[t].getX()+n*g/p),this.bases[y].setY(this.bases[t].getY()+r*g/p);else for(this.find_center_for_arc(p-1,o),n/=o,r/=o,i=this.bases[t].getX()+n*o/2,s=this.bases[t].getY()+r*o/2,a=r,u=-n,l=i+this._h*a,c=s+this._h*u,f=this.bases[t].getX()-l,d=this.bases[t].getY()-c,o=Math.sqrt(f*f+d*d),h=Math.atan2(d,f),g=1;g
this.nbase&&(y-=this.nbase+1),this.bases[y].setX(l+o*Math.cos(h+g*this.angleinc)),this.bases[y].setY(c+o*Math.sin(h+g*this.angleinc))},w.prototype.find_center_for_arc=function(t,e){var n,r,o,i,s,a,u,l;o=-(r=(t+1)/Math.PI)-e/(t+1.000001-e),e<1&&(o=0),l=0;do{n=(r+o)/2,s=1-.5/((i=Math.sqrt(n*n+e*e/4))*i),Math.abs(s)>1&&console.log("Unexpected large magnitude discriminant = "+s+" "+i),(u=(a=Math.acos(s))*(t+1)+2*Math.acos(n/i)-2*Math.PI)>0?o=n:r=n}while(Math.abs(u)>1e-4&&++l=this.MAXITER&&(noIterationFailureYet&&(console.log("Iteration failed in find_center_for_arc"),noIterationFailureYet=!1),n=0,a=0),this._h=n,this.angleinc=a},w.prototype.generate_region=function(t){var e,n,r,o,i,s;for(s=t.getRegion(),e=0,t.getStart()==s.getStart1()?(n=s.getStart1(),r=s.getEnd1()):(n=s.getStart2(),r=s.getEnd2()),(this.bases[t.getStart()].getX()>this.ANUM-100||this.bases[t.getEnd()].getX()>this.ANUM-100)&&console.log("Bad region passed to generate_region. Coordinates not defined."),o=n+1;o<=r;o++)e++,this.bases[o].setX(this.bases[t.getStart()].getX()+this.HELIX_FACTOR*e*t.getXrad()),this.bases[o].setY(this.bases[t.getStart()].getY()+this.HELIX_FACTOR*e*t.getYrad()),i=this.bases[o].getMate(),this.bases[i].setX(this.bases[t.getEnd()].getX()+this.HELIX_FACTOR*e*t.getXrad()),this.bases[i].setY(this.bases[t.getEnd()].getY()+this.HELIX_FACTOR*e*t.getYrad())},w.prototype.minf2=function(t,e){return te?t:e},w.prototype.connected_connection=function(t,e){return!!t.isExtruded()||t.getEnd()+1==e.getStart()}})(),i})()));
//# sourceMappingURL=fornac.js.map
\ No newline at end of file
diff --git a/dist/fornac.js.LICENSE.txt b/dist/fornac.js.LICENSE.txt
new file mode 100644
index 0000000..df537c5
--- /dev/null
+++ b/dist/fornac.js.LICENSE.txt
@@ -0,0 +1,8 @@
+/*!
+ * The buffer module from node.js, for the browser.
+ *
+ * @author Feross Aboukhadijeh
+ * @license MIT
+ */
+
+/*! ieee754. BSD-3-Clause License. Feross Aboukhadijeh */
diff --git a/dist/fornac.js.map b/dist/fornac.js.map
index f2bd86d..37ffdbf 100644
--- a/dist/fornac.js.map
+++ b/dist/fornac.js.map
@@ -1 +1 @@
-{"version":3,"file":"fornac.js","mappings":";CAAA,SAA2CA,EAAMC,GAC1B,iBAAZC,SAA0C,iBAAXC,OACxCA,OAAOD,QAAUD,EAAQG,QAAQ,OACR,mBAAXC,QAAyBA,OAAOC,IAC9CD,OAAO,CAAC,MAAOJ,GACW,iBAAZC,QACdA,QAAgB,OAAID,EAAQG,QAAQ,OAEpCJ,EAAa,OAAIC,EAAQD,EAAS,IARpC,CASGO,MAAM,SAASC,GAClB,oGCPO,SAASC,IACfC,KAAKC,KAAO,IAAIC,EAAAA,EAChBF,KAAKG,OAAS,IAAIC,EAAAA,EAElBJ,KAAKK,MAAQ,KACVL,KAAKM,IAAM,KACdN,KAAKO,KAAO,KACTP,KAAKQ,KAAO,KACZR,KAAKS,MAAQ,KAGhBT,KAAKU,SAAW,KAEhBV,KAAKW,OAAS,KAEdX,KAAKY,SAAU,EAGhBb,EAAWc,UAAUC,OAAS,WAC7B,OAAOd,KAAKY,SAGbb,EAAWc,UAAUE,QAAU,SAASD,GACvCd,KAAKY,QAAUE,GAGhBf,EAAWc,UAAUG,QAAU,WAC9B,OAAOhB,KAAKC,MAGbF,EAAWc,UAAUI,QAAU,SAAShB,GACvCD,KAAKC,KAAOA,GAGbF,EAAWc,UAAUK,UAAY,WAChC,OAAOlB,KAAKG,QAGbJ,EAAWc,UAAUM,UAAY,SAAShB,GACzCH,KAAKG,OAASA,GAGfJ,EAAWc,UAAUO,SAAW,WAC/B,OAAOpB,KAAKK,OAGbN,EAAWc,UAAUQ,SAAW,SAAShB,GACxCL,KAAKK,MAAQA,GAGdN,EAAWc,UAAUS,OAAS,WAC7B,OAAOtB,KAAKM,KAGbP,EAAWc,UAAUU,OAAS,SAASjB,GACtCN,KAAKM,IAAMA,GAGZP,EAAWc,UAAUW,QAAU,WAC9B,OAAOxB,KAAKO,MAGbR,EAAWc,UAAUY,QAAU,SAASlB,GACvCP,KAAKO,KAAOA,GAGbR,EAAWc,UAAUa,QAAU,WAC9B,OAAO1B,KAAKQ,MAGbT,EAAWc,UAAUc,QAAU,SAASnB,GACvCR,KAAKQ,KAAOA,GAGbT,EAAWc,UAAUe,SAAW,WAC/B,OAAO5B,KAAKS,OAGbV,EAAWc,UAAUgB,SAAW,SAASpB,GACxCT,KAAKS,MAAQA,GAGdV,EAAWc,UAAUiB,WAAa,WACjC,OAAO9B,KAAKU,UAGbX,EAAWc,UAAUkB,YAAc,SAASrB,GAC3CV,KAAKU,SAAWA,GAGjBX,EAAWc,UAAUmB,SAAW,WAC/B,OAAOhC,KAAKW,QAGbZ,EAAWc,UAAUoB,UAAY,SAAStB,GACzCX,KAAKW,OAASA,6DChGR,SAAST,IACfF,KAAKkC,YAAc,KACnBlC,KAAKmC,YAAc,GACnBnC,KAAKoC,aAAe,GACpBpC,KAAKqC,OAAS,KACdrC,KAAKsC,MAAQ,KACbtC,KAAKuC,KAAO,KACZvC,KAAKwC,EAAI,KACNxC,KAAKyC,EAAI,KACTzC,KAAK0C,OAAS,KAGlBxC,EAAKW,UAAU8B,eAAiB,WAC/B,OAAO3C,KAAKkC,aAGbhC,EAAKW,UAAU+B,eAAiB,SAASV,GACxClC,KAAKkC,YAAcA,GAGpBhC,EAAKW,UAAUgC,cAAgB,SAASC,EAAGC,GACjC,MAALA,EACH/C,KAAKoC,aAAaU,GAAKC,GAGlB/C,KAAKoC,aAAaU,KACtB9C,KAAKoC,aAAaU,GAAK,IAAI/C,EAAAA,YAE5BC,KAAKoC,aAAaU,GAAG/B,SAAQ,KAI/Bb,EAAKW,UAAUmC,cAAgB,SAASF,GACvC,IAAI/C,EAAaL,EAAQ,KACpBM,KAAKoC,aAAaU,KAChB9C,KAAKoC,aAAaU,GAAK,IAAI/C,GAElC,IAAIgD,EAAI/C,KAAKoC,aAAaU,GAC1B,OAAIC,EAAEjC,SACE,KAGAiC,GAIT7C,EAAKW,UAAUoC,cAAgB,SAASH,EAAGC,GAC1C/C,KAAKoC,aAAac,KAAKH,IAGxB7C,EAAKW,UAAUsC,UAAY,WAC1B,OAAOnD,KAAKqC,QAGbnC,EAAKW,UAAUuC,UAAY,SAASf,GACnCrC,KAAKqC,OAASA,GAGfnC,EAAKW,UAAUwC,SAAW,WACzB,OAAOrD,KAAKsC,OAGbpC,EAAKW,UAAUyC,SAAW,SAAShB,GAClCtC,KAAKsC,MAAQA,GAGdpC,EAAKW,UAAU0C,OAAS,WACvB,OAAOvD,KAAKuC,MAGbrC,EAAKW,UAAU2C,QAAU,SAASjB,GACjCvC,KAAKuC,KAAOA,GAGbrC,EAAKW,UAAU4C,KAAO,WACrB,OAAOzD,KAAKwC,GAGbtC,EAAKW,UAAU6C,KAAO,SAASlB,GAC9BxC,KAAKwC,EAAIA,GAGVtC,EAAKW,UAAU8C,KAAO,WACrB,OAAO3D,KAAKyC,GAGbvC,EAAKW,UAAU+C,KAAO,SAASnB,GAC9BzC,KAAKyC,EAAIA,GAGVvC,EAAKW,UAAUgD,UAAY,WAC1B,OAAO7D,KAAK0C,QAGbxC,EAAKW,UAAUiD,UAAY,SAASpB,GACnC1C,KAAK0C,OAASA,8BCjGR,SAAStC,IACfJ,KAAK+D,QAAU,KACZ/D,KAAKgE,MAAQ,KACbhE,KAAKiE,QAAU,KACfjE,KAAKkE,MAAQ,sBAGjB9D,EAAOS,UAAUsD,UAAY,WAC5B,OAAOnE,KAAK+D,SAGb3D,EAAOS,UAAUuD,UAAY,SAASC,GACrCrE,KAAK+D,QAAUM,GAGhBjE,EAAOS,UAAUyD,QAAU,WAC1B,OAAOtE,KAAKgE,OAGb5D,EAAOS,UAAU0D,QAAU,SAASC,GACnCxE,KAAKgE,MAAQQ,GAGdpE,EAAOS,UAAU4D,UAAY,WAC5B,OAAOzE,KAAKiE,SAGb7D,EAAOS,UAAU6D,UAAY,SAASC,GACrC3E,KAAKiE,QAAUU,GAGhBvE,EAAOS,UAAU+D,QAAU,WAC1B,OAAO5E,KAAKkE,OAGb9D,EAAOS,UAAUgE,QAAU,SAASC,GACnC9E,KAAKkE,MAAQY,6BClCdtF,EAAQuF,WAuCR,SAAqBC,GACnB,IAAIC,EAAOC,EAAQF,GACfG,EAAWF,EAAK,GAChBG,EAAkBH,EAAK,GAC3B,OAAuC,GAA9BE,EAAWC,GAAuB,EAAKA,GA1ClD5F,EAAQ6F,YAiDR,SAAsBL,GACpB,IAAIM,EAcAxC,EAbAmC,EAAOC,EAAQF,GACfG,EAAWF,EAAK,GAChBG,EAAkBH,EAAK,GAEvBM,EAAM,IAAIC,EAVhB,SAAsBR,EAAKG,EAAUC,GACnC,OAAuC,GAA9BD,EAAWC,GAAuB,EAAKA,EAS9BK,CAAYT,EAAKG,EAAUC,IAEzCM,EAAU,EAGVC,EAAMP,EAAkB,EACxBD,EAAW,EACXA,EAGJ,IAAKrC,EAAI,EAAGA,EAAI6C,EAAK7C,GAAK,EACxBwC,EACGM,EAAUZ,EAAIa,WAAW/C,KAAO,GAChC8C,EAAUZ,EAAIa,WAAW/C,EAAI,KAAO,GACpC8C,EAAUZ,EAAIa,WAAW/C,EAAI,KAAO,EACrC8C,EAAUZ,EAAIa,WAAW/C,EAAI,IAC/ByC,EAAIG,KAAcJ,GAAO,GAAM,IAC/BC,EAAIG,KAAcJ,GAAO,EAAK,IAC9BC,EAAIG,KAAmB,IAANJ,EAmBnB,OAhBwB,IAApBF,IACFE,EACGM,EAAUZ,EAAIa,WAAW/C,KAAO,EAChC8C,EAAUZ,EAAIa,WAAW/C,EAAI,KAAO,EACvCyC,EAAIG,KAAmB,IAANJ,GAGK,IAApBF,IACFE,EACGM,EAAUZ,EAAIa,WAAW/C,KAAO,GAChC8C,EAAUZ,EAAIa,WAAW/C,EAAI,KAAO,EACpC8C,EAAUZ,EAAIa,WAAW/C,EAAI,KAAO,EACvCyC,EAAIG,KAAcJ,GAAO,EAAK,IAC9BC,EAAIG,KAAmB,IAANJ,GAGZC,GA3FT/F,EAAQsG,cAkHR,SAAwBC,GAQtB,IAPA,IAAIT,EACAK,EAAMI,EAAMC,OACZC,EAAaN,EAAM,EACnBO,EAAQ,GACRC,EAAiB,MAGZrD,EAAI,EAAGsD,EAAOT,EAAMM,EAAYnD,EAAIsD,EAAMtD,GAAKqD,EACtDD,EAAMhD,KAAKmD,EAAYN,EAAOjD,EAAIA,EAAIqD,EAAkBC,EAAOA,EAAQtD,EAAIqD,IAqB7E,OAjBmB,IAAfF,GACFX,EAAMS,EAAMJ,EAAM,GAClBO,EAAMhD,KACJoD,EAAOhB,GAAO,GACdgB,EAAQhB,GAAO,EAAK,IACpB,OAEsB,IAAfW,IACTX,GAAOS,EAAMJ,EAAM,IAAM,GAAKI,EAAMJ,EAAM,GAC1CO,EAAMhD,KACJoD,EAAOhB,GAAO,IACdgB,EAAQhB,GAAO,EAAK,IACpBgB,EAAQhB,GAAO,EAAK,IACpB,MAIGY,EAAMK,KAAK,KAzIpB,IALA,IAAID,EAAS,GACTV,EAAY,GACZJ,EAA4B,oBAAfgB,WAA6BA,WAAaC,MAEvDC,EAAO,mEACF5D,EAAI,EAAG6C,EAAMe,EAAKV,OAAQlD,EAAI6C,IAAO7C,EAC5CwD,EAAOxD,GAAK4D,EAAK5D,GACjB8C,EAAUc,EAAKb,WAAW/C,IAAMA,EAQlC,SAASoC,EAASF,GAChB,IAAIW,EAAMX,EAAIgB,OAEd,GAAIL,EAAM,EAAI,EACZ,MAAM,IAAIgB,MAAM,kDAKlB,IAAIxB,EAAWH,EAAI4B,QAAQ,KAO3B,OANkB,IAAdzB,IAAiBA,EAAWQ,GAMzB,CAACR,EAJcA,IAAaQ,EAC/B,EACA,EAAKR,EAAW,GAsEtB,SAASkB,EAAaN,EAAO1F,EAAOC,GAGlC,IAFA,IAAIgF,EARoBuB,EASpBC,EAAS,GACJhE,EAAIzC,EAAOyC,EAAIxC,EAAKwC,GAAK,EAChCwC,GACIS,EAAMjD,IAAM,GAAM,WAClBiD,EAAMjD,EAAI,IAAM,EAAK,QACP,IAAfiD,EAAMjD,EAAI,IACbgE,EAAO5D,KAdFoD,GADiBO,EAeMvB,IAdT,GAAK,IACxBgB,EAAOO,GAAO,GAAK,IACnBP,EAAOO,GAAO,EAAI,IAClBP,EAAa,GAANO,IAaT,OAAOC,EAAOP,KAAK,IAjGrBX,EAAU,IAAIC,WAAW,IAAM,GAC/BD,EAAU,IAAIC,WAAW,IAAM,+BCT/B,MAAMkB,EAAS,EAAQ,KACjBC,EAAU,EAAQ,KAClBC,EACe,mBAAXC,QAAkD,mBAAlBA,OAAY,IAChDA,OAAY,IAAE,8BACd,KAEN1H,EAAQ2H,OAASA,EACjB3H,EAAQ4H,WAyTR,SAAqBpB,GAInB,OAHKA,GAAUA,IACbA,EAAS,GAEJmB,EAAOE,OAAOrB,IA5TvBxG,EAAQ8H,kBAAoB,GAE5B,MAAMC,EAAe,WAwDrB,SAASC,EAAcxB,GACrB,GAAIA,EAASuB,EACX,MAAM,IAAIE,WAAW,cAAgBzB,EAAS,kCAGhD,MAAM0B,EAAM,IAAIlB,WAAWR,GAE3B,OADA2B,OAAOC,eAAeF,EAAKP,EAAOtG,WAC3B6G,EAaT,SAASP,EAAQU,EAAKC,EAAkB9B,GAEtC,GAAmB,iBAAR6B,EAAkB,CAC3B,GAAgC,iBAArBC,EACT,MAAM,IAAIC,UACR,sEAGJ,OAAOC,EAAYH,GAErB,OAAOI,EAAKJ,EAAKC,EAAkB9B,GAKrC,SAASiC,EAAMC,EAAOJ,EAAkB9B,GACtC,GAAqB,iBAAVkC,EACT,OAqHJ,SAAqBC,EAAQC,GAK3B,GAJwB,iBAAbA,GAAsC,KAAbA,IAClCA,EAAW,SAGRjB,EAAOkB,WAAWD,GACrB,MAAM,IAAIL,UAAU,qBAAuBK,GAG7C,MAAMpC,EAAwC,EAA/BjB,EAAWoD,EAAQC,GAClC,IAAIV,EAAMF,EAAaxB,GAEvB,MAAMsC,EAASZ,EAAIa,MAAMJ,EAAQC,GASjC,OAPIE,IAAWtC,IAIb0B,EAAMA,EAAIc,MAAM,EAAGF,IAGdZ,EA1IEe,CAAWP,EAAOJ,GAG3B,GAAIY,YAAYC,OAAOT,GACrB,OAkJJ,SAAwBU,GACtB,GAAIC,EAAWD,EAAWpC,YAAa,CACrC,MAAMsC,EAAO,IAAItC,WAAWoC,GAC5B,OAAOG,EAAgBD,EAAKE,OAAQF,EAAKG,WAAYH,EAAK/D,YAE5D,OAAOmE,EAAcN,GAvJZO,CAAcjB,GAGvB,GAAa,MAATA,EACF,MAAM,IAAIH,UACR,yHACiDG,GAIrD,GAAIW,EAAWX,EAAOQ,cACjBR,GAASW,EAAWX,EAAMc,OAAQN,aACrC,OAAOK,EAAgBb,EAAOJ,EAAkB9B,GAGlD,GAAiC,oBAAtBoD,oBACNP,EAAWX,EAAOkB,oBAClBlB,GAASW,EAAWX,EAAMc,OAAQI,oBACrC,OAAOL,EAAgBb,EAAOJ,EAAkB9B,GAGlD,GAAqB,iBAAVkC,EACT,MAAM,IAAIH,UACR,yEAIJ,MAAMsB,EAAUnB,EAAMmB,SAAWnB,EAAMmB,UACvC,GAAe,MAAXA,GAAmBA,IAAYnB,EACjC,OAAOf,EAAOc,KAAKoB,EAASvB,EAAkB9B,GAGhD,MAAMsD,EAkJR,SAAqBC,GACnB,GAAIpC,EAAOqC,SAASD,GAAM,CACxB,MAAM5D,EAA4B,EAAtB8D,EAAQF,EAAIvD,QAClB0B,EAAMF,EAAa7B,GAEzB,OAAmB,IAAf+B,EAAI1B,QAIRuD,EAAIT,KAAKpB,EAAK,EAAG,EAAG/B,GAHX+B,EAOX,YAAmBgC,IAAfH,EAAIvD,OACoB,iBAAfuD,EAAIvD,QAAuB2D,EAAYJ,EAAIvD,QAC7CwB,EAAa,GAEf0B,EAAcK,GAGN,WAAbA,EAAIK,MAAqBnD,MAAMoD,QAAQN,EAAIO,MACtCZ,EAAcK,EAAIO,WAD3B,EAtKUC,CAAW7B,GACrB,GAAIoB,EAAG,OAAOA,EAEd,GAAsB,oBAAXpC,QAAgD,MAAtBA,OAAO8C,aACH,mBAA9B9B,EAAMhB,OAAO8C,aACtB,OAAO7C,EAAOc,KAAKC,EAAMhB,OAAO8C,aAAa,UAAWlC,EAAkB9B,GAG5E,MAAM,IAAI+B,UACR,yHACiDG,GAqBrD,SAAS+B,EAAYC,GACnB,GAAoB,iBAATA,EACT,MAAM,IAAInC,UAAU,0CACf,GAAImC,EAAO,EAChB,MAAM,IAAIzC,WAAW,cAAgByC,EAAO,kCA4BhD,SAASlC,EAAakC,GAEpB,OADAD,EAAWC,GACJ1C,EAAa0C,EAAO,EAAI,EAAoB,EAAhBT,EAAQS,IAwC7C,SAAShB,EAAeiB,GACtB,MAAMnE,EAASmE,EAAMnE,OAAS,EAAI,EAA4B,EAAxByD,EAAQU,EAAMnE,QAC9C0B,EAAMF,EAAaxB,GACzB,IAAK,IAAIlD,EAAI,EAAGA,EAAIkD,EAAQlD,GAAK,EAC/B4E,EAAI5E,GAAgB,IAAXqH,EAAMrH,GAEjB,OAAO4E,EAWT,SAASqB,EAAiBoB,EAAOlB,EAAYjD,GAC3C,GAAIiD,EAAa,GAAKkB,EAAMpF,WAAakE,EACvC,MAAM,IAAIxB,WAAW,wCAGvB,GAAI0C,EAAMpF,WAAakE,GAAcjD,GAAU,GAC7C,MAAM,IAAIyB,WAAW,wCAGvB,IAAIC,EAYJ,OAVEA,OADiBgC,IAAfT,QAAuCS,IAAX1D,EACxB,IAAIQ,WAAW2D,QACDT,IAAX1D,EACH,IAAIQ,WAAW2D,EAAOlB,GAEtB,IAAIzC,WAAW2D,EAAOlB,EAAYjD,GAI1C2B,OAAOC,eAAeF,EAAKP,EAAOtG,WAE3B6G,EA4BT,SAAS+B,EAASzD,GAGhB,GAAIA,GAAUuB,EACZ,MAAM,IAAIE,WAAW,0DACaF,EAAa6C,SAAS,IAAM,UAEhE,OAAgB,EAATpE,EAuGT,SAASjB,EAAYoD,EAAQC,GAC3B,GAAIjB,EAAOqC,SAASrB,GAClB,OAAOA,EAAOnC,OAEhB,GAAI0C,YAAYC,OAAOR,IAAWU,EAAWV,EAAQO,aACnD,OAAOP,EAAOpD,WAEhB,GAAsB,iBAAXoD,EACT,MAAM,IAAIJ,UACR,kGAC0BI,GAI9B,MAAMxC,EAAMwC,EAAOnC,OACbqE,EAAaC,UAAUtE,OAAS,IAAsB,IAAjBsE,UAAU,GACrD,IAAKD,GAAqB,IAAR1E,EAAW,OAAO,EAGpC,IAAI4E,GAAc,EAClB,OACE,OAAQnC,GACN,IAAK,QACL,IAAK,SACL,IAAK,SACH,OAAOzC,EACT,IAAK,OACL,IAAK,QACH,OAAO6E,EAAYrC,GAAQnC,OAC7B,IAAK,OACL,IAAK,QACL,IAAK,UACL,IAAK,WACH,OAAa,EAANL,EACT,IAAK,MACH,OAAOA,IAAQ,EACjB,IAAK,SACH,OAAO8E,EAActC,GAAQnC,OAC/B,QACE,GAAIuE,EACF,OAAOF,GAAa,EAAIG,EAAYrC,GAAQnC,OAE9CoC,GAAY,GAAKA,GAAUsC,cAC3BH,GAAc,GAMtB,SAASI,EAAcvC,EAAU/H,EAAOC,GACtC,IAAIiK,GAAc,EAclB,SALcb,IAAVrJ,GAAuBA,EAAQ,KACjCA,EAAQ,GAINA,EAAQL,KAAKgG,OACf,MAAO,GAOT,SAJY0D,IAARpJ,GAAqBA,EAAMN,KAAKgG,UAClC1F,EAAMN,KAAKgG,QAGT1F,GAAO,EACT,MAAO,GAOT,IAHAA,KAAS,KACTD,KAAW,GAGT,MAAO,GAKT,IAFK+H,IAAUA,EAAW,UAGxB,OAAQA,GACN,IAAK,MACH,OAAOwC,EAAS5K,KAAMK,EAAOC,GAE/B,IAAK,OACL,IAAK,QACH,OAAOuK,EAAU7K,KAAMK,EAAOC,GAEhC,IAAK,QACH,OAAOwK,EAAW9K,KAAMK,EAAOC,GAEjC,IAAK,SACL,IAAK,SACH,OAAOyK,EAAY/K,KAAMK,EAAOC,GAElC,IAAK,SACH,OAAO0K,EAAYhL,KAAMK,EAAOC,GAElC,IAAK,OACL,IAAK,QACL,IAAK,UACL,IAAK,WACH,OAAO2K,EAAajL,KAAMK,EAAOC,GAEnC,QACE,GAAIiK,EAAa,MAAM,IAAIxC,UAAU,qBAAuBK,GAC5DA,GAAYA,EAAW,IAAIsC,cAC3BH,GAAc,GAatB,SAASW,EAAM5B,EAAG6B,EAAGC,GACnB,MAAMtI,EAAIwG,EAAE6B,GACZ7B,EAAE6B,GAAK7B,EAAE8B,GACT9B,EAAE8B,GAAKtI,EA4IT,SAASuI,EAAsBrC,EAAQsC,EAAKrC,EAAYb,EAAUmD,GAEhE,GAAsB,IAAlBvC,EAAOhD,OAAc,OAAQ,EAmBjC,GAhB0B,iBAAfiD,GACTb,EAAWa,EACXA,EAAa,GACJA,EAAa,WACtBA,EAAa,WACJA,GAAc,aACvBA,GAAc,YAGZU,EADJV,GAAcA,KAGZA,EAAasC,EAAM,EAAKvC,EAAOhD,OAAS,GAItCiD,EAAa,IAAGA,EAAaD,EAAOhD,OAASiD,GAC7CA,GAAcD,EAAOhD,OAAQ,CAC/B,GAAIuF,EAAK,OAAQ,EACZtC,EAAaD,EAAOhD,OAAS,OAC7B,GAAIiD,EAAa,EAAG,CACzB,IAAIsC,EACC,OAAQ,EADJtC,EAAa,EAUxB,GALmB,iBAARqC,IACTA,EAAMnE,EAAOc,KAAKqD,EAAKlD,IAIrBjB,EAAOqC,SAAS8B,GAElB,OAAmB,IAAfA,EAAItF,QACE,EAEHwF,EAAaxC,EAAQsC,EAAKrC,EAAYb,EAAUmD,GAClD,GAAmB,iBAARD,EAEhB,OADAA,GAAY,IACgC,mBAAjC9E,WAAW3F,UAAU+F,QAC1B2E,EACK/E,WAAW3F,UAAU+F,QAAQ6E,KAAKzC,EAAQsC,EAAKrC,GAE/CzC,WAAW3F,UAAU6K,YAAYD,KAAKzC,EAAQsC,EAAKrC,GAGvDuC,EAAaxC,EAAQ,CAACsC,GAAMrC,EAAYb,EAAUmD,GAG3D,MAAM,IAAIxD,UAAU,wCAGtB,SAASyD,EAAcjG,EAAK+F,EAAKrC,EAAYb,EAAUmD,GACrD,IA0BIzI,EA1BA6I,EAAY,EACZC,EAAYrG,EAAIS,OAChB6F,EAAYP,EAAItF,OAEpB,QAAiB0D,IAAbtB,IAEe,UADjBA,EAAW0D,OAAO1D,GAAUsC,gBACY,UAAbtC,GACV,YAAbA,GAAuC,aAAbA,GAAyB,CACrD,GAAI7C,EAAIS,OAAS,GAAKsF,EAAItF,OAAS,EACjC,OAAQ,EAEV2F,EAAY,EACZC,GAAa,EACbC,GAAa,EACb5C,GAAc,EAIlB,SAAS8C,EAAMrE,EAAK5E,GAClB,OAAkB,IAAd6I,EACKjE,EAAI5E,GAEJ4E,EAAIsE,aAAalJ,EAAI6I,GAKhC,GAAIJ,EAAK,CACP,IAAIU,GAAc,EAClB,IAAKnJ,EAAImG,EAAYnG,EAAI8I,EAAW9I,IAClC,GAAIiJ,EAAKxG,EAAKzC,KAAOiJ,EAAKT,GAAqB,IAAhBW,EAAoB,EAAInJ,EAAImJ,IAEzD,IADoB,IAAhBA,IAAmBA,EAAanJ,GAChCA,EAAImJ,EAAa,IAAMJ,EAAW,OAAOI,EAAaN,OAEtC,IAAhBM,IAAmBnJ,GAAKA,EAAImJ,GAChCA,GAAc,OAKlB,IADIhD,EAAa4C,EAAYD,IAAW3C,EAAa2C,EAAYC,GAC5D/I,EAAImG,EAAYnG,GAAK,EAAGA,IAAK,CAChC,IAAIoJ,GAAQ,EACZ,IAAK,IAAIC,EAAI,EAAGA,EAAIN,EAAWM,IAC7B,GAAIJ,EAAKxG,EAAKzC,EAAIqJ,KAAOJ,EAAKT,EAAKa,GAAI,CACrCD,GAAQ,EACR,MAGJ,GAAIA,EAAO,OAAOpJ,EAItB,OAAQ,EAeV,SAASsJ,EAAU1E,EAAKS,EAAQkE,EAAQrG,GACtCqG,EAASC,OAAOD,IAAW,EAC3B,MAAME,EAAY7E,EAAI1B,OAASqG,EAC1BrG,GAGHA,EAASsG,OAAOtG,IACHuG,IACXvG,EAASuG,GAJXvG,EAASuG,EAQX,MAAMC,EAASrE,EAAOnC,OAKtB,IAAIlD,EACJ,IAJIkD,EAASwG,EAAS,IACpBxG,EAASwG,EAAS,GAGf1J,EAAI,EAAGA,EAAIkD,IAAUlD,EAAG,CAC3B,MAAM2J,EAASC,SAASvE,EAAOwE,OAAW,EAAJ7J,EAAO,GAAI,IACjD,GAAI6G,EAAY8C,GAAS,OAAO3J,EAChC4E,EAAI2E,EAASvJ,GAAK2J,EAEpB,OAAO3J,EAGT,SAAS8J,EAAWlF,EAAKS,EAAQkE,EAAQrG,GACvC,OAAO6G,EAAWrC,EAAYrC,EAAQT,EAAI1B,OAASqG,GAAS3E,EAAK2E,EAAQrG,GAG3E,SAAS8G,EAAYpF,EAAKS,EAAQkE,EAAQrG,GACxC,OAAO6G,EAypCT,SAAuBE,GACrB,MAAMC,EAAY,GAClB,IAAK,IAAIlK,EAAI,EAAGA,EAAIiK,EAAI/G,SAAUlD,EAEhCkK,EAAU9J,KAAyB,IAApB6J,EAAIlH,WAAW/C,IAEhC,OAAOkK,EA/pCWC,CAAa9E,GAAST,EAAK2E,EAAQrG,GAGvD,SAASkH,EAAaxF,EAAKS,EAAQkE,EAAQrG,GACzC,OAAO6G,EAAWpC,EAActC,GAAST,EAAK2E,EAAQrG,GAGxD,SAASmH,EAAWzF,EAAKS,EAAQkE,EAAQrG,GACvC,OAAO6G,EA0pCT,SAAyBE,EAAKK,GAC5B,IAAIrK,EAAGsK,EAAIC,EACX,MAAMN,EAAY,GAClB,IAAK,IAAIlK,EAAI,EAAGA,EAAIiK,EAAI/G,WACjBoH,GAAS,GAAK,KADatK,EAGhCC,EAAIgK,EAAIlH,WAAW/C,GACnBuK,EAAKtK,GAAK,EACVuK,EAAKvK,EAAI,IACTiK,EAAU9J,KAAKoK,GACfN,EAAU9J,KAAKmK,GAGjB,OAAOL,EAvqCWO,CAAepF,EAAQT,EAAI1B,OAASqG,GAAS3E,EAAK2E,EAAQrG,GA+E9E,SAASgF,EAAatD,EAAKrH,EAAOC,GAChC,OAAc,IAAVD,GAAeC,IAAQoH,EAAI1B,OACtBe,EAAOjB,cAAc4B,GAErBX,EAAOjB,cAAc4B,EAAIc,MAAMnI,EAAOC,IAIjD,SAASuK,EAAWnD,EAAKrH,EAAOC,GAC9BA,EAAMkN,KAAKC,IAAI/F,EAAI1B,OAAQ1F,GAC3B,MAAMoN,EAAM,GAEZ,IAAI5K,EAAIzC,EACR,KAAOyC,EAAIxC,GAAK,CACd,MAAMqN,EAAYjG,EAAI5E,GACtB,IAAI8K,EAAY,KACZC,EAAoBF,EAAY,IAChC,EACCA,EAAY,IACT,EACCA,EAAY,IACT,EACA,EAEZ,GAAI7K,EAAI+K,GAAoBvN,EAAK,CAC/B,IAAIwN,EAAYC,EAAWC,EAAYC,EAEvC,OAAQJ,GACN,KAAK,EACCF,EAAY,MACdC,EAAYD,GAEd,MACF,KAAK,EACHG,EAAapG,EAAI5E,EAAI,GACO,MAAV,IAAbgL,KACHG,GAA6B,GAAZN,IAAqB,EAAoB,GAAbG,EACzCG,EAAgB,MAClBL,EAAYK,IAGhB,MACF,KAAK,EACHH,EAAapG,EAAI5E,EAAI,GACrBiL,EAAYrG,EAAI5E,EAAI,GACQ,MAAV,IAAbgL,IAAsD,MAAV,IAAZC,KACnCE,GAA6B,GAAZN,IAAoB,IAAoB,GAAbG,IAAsB,EAAmB,GAAZC,EACrEE,EAAgB,OAAUA,EAAgB,OAAUA,EAAgB,SACtEL,EAAYK,IAGhB,MACF,KAAK,EACHH,EAAapG,EAAI5E,EAAI,GACrBiL,EAAYrG,EAAI5E,EAAI,GACpBkL,EAAatG,EAAI5E,EAAI,GACO,MAAV,IAAbgL,IAAsD,MAAV,IAAZC,IAAsD,MAAV,IAAbC,KAClEC,GAA6B,GAAZN,IAAoB,IAAqB,GAAbG,IAAsB,IAAmB,GAAZC,IAAqB,EAAoB,GAAbC,EAClGC,EAAgB,OAAUA,EAAgB,UAC5CL,EAAYK,KAMJ,OAAdL,GAGFA,EAAY,MACZC,EAAmB,GACVD,EAAY,QAErBA,GAAa,MACbF,EAAIxK,KAAK0K,IAAc,GAAK,KAAQ,OACpCA,EAAY,MAAqB,KAAZA,GAGvBF,EAAIxK,KAAK0K,GACT9K,GAAK+K,EAGP,OAQF,SAAgCK,GAC9B,MAAMvI,EAAMuI,EAAWlI,OACvB,GAAIL,GAAOwI,EACT,OAAOrC,OAAOsC,aAAaC,MAAMvC,OAAQoC,GAI3C,IAAIR,EAAM,GACN5K,EAAI,EACR,KAAOA,EAAI6C,GACT+H,GAAO5B,OAAOsC,aAAaC,MACzBvC,OACAoC,EAAW1F,MAAM1F,EAAGA,GAAKqL,IAG7B,OAAOT,EAvBAY,CAAsBZ,GA1+B/BlO,EAAQ+O,WAAahH,EAgBrBJ,EAAOqH,oBAUP,WAEE,IACE,MAAMjJ,EAAM,IAAIiB,WAAW,GACrBiI,EAAQ,CAAEC,IAAK,WAAc,OAAO,KAG1C,OAFA/G,OAAOC,eAAe6G,EAAOjI,WAAW3F,WACxC8G,OAAOC,eAAerC,EAAKkJ,GACN,KAAdlJ,EAAImJ,MACX,MAAOC,GACP,OAAO,GAnBkBC,GAExBzH,EAAOqH,qBAA0C,oBAAZK,SACb,mBAAlBA,QAAQC,OACjBD,QAAQC,MACN,iJAkBJnH,OAAOoH,eAAe5H,EAAOtG,UAAW,SAAU,CAChDmO,YAAY,EACZC,IAAK,WACH,GAAK9H,EAAOqC,SAASxJ,MACrB,OAAOA,KAAKgJ,UAIhBrB,OAAOoH,eAAe5H,EAAOtG,UAAW,SAAU,CAChDmO,YAAY,EACZC,IAAK,WACH,GAAK9H,EAAOqC,SAASxJ,MACrB,OAAOA,KAAKiJ,cAqChB9B,EAAO+H,SAAW,KA8DlB/H,EAAOc,KAAO,SAAUC,EAAOJ,EAAkB9B,GAC/C,OAAOiC,EAAKC,EAAOJ,EAAkB9B,IAKvC2B,OAAOC,eAAeT,EAAOtG,UAAW2F,WAAW3F,WACnD8G,OAAOC,eAAeT,EAAQX,YA8B9BW,EAAOE,MAAQ,SAAU6C,EAAMiF,EAAM/G,GACnC,OArBF,SAAgB8B,EAAMiF,EAAM/G,GAE1B,OADA6B,EAAWC,GACPA,GAAQ,EACH1C,EAAa0C,QAETR,IAATyF,EAIyB,iBAAb/G,EACVZ,EAAa0C,GAAMiF,KAAKA,EAAM/G,GAC9BZ,EAAa0C,GAAMiF,KAAKA,GAEvB3H,EAAa0C,GAQb7C,CAAM6C,EAAMiF,EAAM/G,IAW3BjB,EAAOa,YAAc,SAAUkC,GAC7B,OAAOlC,EAAYkC,IAKrB/C,EAAOiI,gBAAkB,SAAUlF,GACjC,OAAOlC,EAAYkC,IA8GrB/C,EAAOqC,SAAW,SAAmBF,GACnC,OAAY,MAALA,IAA6B,IAAhBA,EAAE+F,WACpB/F,IAAMnC,EAAOtG,WAGjBsG,EAAOmI,QAAU,SAAkBC,EAAGjG,GAGpC,GAFIT,EAAW0G,EAAG/I,cAAa+I,EAAIpI,EAAOc,KAAKsH,EAAGA,EAAElD,OAAQkD,EAAExK,aAC1D8D,EAAWS,EAAG9C,cAAa8C,EAAInC,EAAOc,KAAKqB,EAAGA,EAAE+C,OAAQ/C,EAAEvE,cACzDoC,EAAOqC,SAAS+F,KAAOpI,EAAOqC,SAASF,GAC1C,MAAM,IAAIvB,UACR,yEAIJ,GAAIwH,IAAMjG,EAAG,OAAO,EAEpB,IAAI9G,EAAI+M,EAAEvJ,OACNvD,EAAI6G,EAAEtD,OAEV,IAAK,IAAIlD,EAAI,EAAG6C,EAAM6H,KAAKC,IAAIjL,EAAGC,GAAIK,EAAI6C,IAAO7C,EAC/C,GAAIyM,EAAEzM,KAAOwG,EAAExG,GAAI,CACjBN,EAAI+M,EAAEzM,GACNL,EAAI6G,EAAExG,GACN,MAIJ,OAAIN,EAAIC,GAAW,EACfA,EAAID,EAAU,EACX,GAGT2E,EAAOkB,WAAa,SAAqBD,GACvC,OAAQ0D,OAAO1D,GAAUsC,eACvB,IAAK,MACL,IAAK,OACL,IAAK,QACL,IAAK,QACL,IAAK,SACL,IAAK,SACL,IAAK,SACL,IAAK,OACL,IAAK,QACL,IAAK,UACL,IAAK,WACH,OAAO,EACT,QACE,OAAO,IAIbvD,EAAOqI,OAAS,SAAiBC,EAAMzJ,GACrC,IAAKS,MAAMoD,QAAQ4F,GACjB,MAAM,IAAI1H,UAAU,+CAGtB,GAAoB,IAAhB0H,EAAKzJ,OACP,OAAOmB,EAAOE,MAAM,GAGtB,IAAIvE,EACJ,QAAe4G,IAAX1D,EAEF,IADAA,EAAS,EACJlD,EAAI,EAAGA,EAAI2M,EAAKzJ,SAAUlD,EAC7BkD,GAAUyJ,EAAK3M,GAAGkD,OAItB,MAAMgD,EAAS7B,EAAOa,YAAYhC,GAClC,IAAI0J,EAAM,EACV,IAAK5M,EAAI,EAAGA,EAAI2M,EAAKzJ,SAAUlD,EAAG,CAChC,IAAI4E,EAAM+H,EAAK3M,GACf,GAAI+F,EAAWnB,EAAKlB,YACdkJ,EAAMhI,EAAI1B,OAASgD,EAAOhD,QACvBmB,EAAOqC,SAAS9B,KAAMA,EAAMP,EAAOc,KAAKP,IAC7CA,EAAIoB,KAAKE,EAAQ0G,IAEjBlJ,WAAW3F,UAAU8O,IAAIlE,KACvBzC,EACAtB,EACAgI,OAGC,KAAKvI,EAAOqC,SAAS9B,GAC1B,MAAM,IAAIK,UAAU,+CAEpBL,EAAIoB,KAAKE,EAAQ0G,GAEnBA,GAAOhI,EAAI1B,OAEb,OAAOgD,GAkDT7B,EAAOpC,WAAaA,EA8EpBoC,EAAOtG,UAAUwO,WAAY,EAQ7BlI,EAAOtG,UAAU+O,OAAS,WACxB,MAAMjK,EAAM3F,KAAKgG,OACjB,GAAIL,EAAM,GAAM,EACd,MAAM,IAAI8B,WAAW,6CAEvB,IAAK,IAAI3E,EAAI,EAAGA,EAAI6C,EAAK7C,GAAK,EAC5BoI,EAAKlL,KAAM8C,EAAGA,EAAI,GAEpB,OAAO9C,MAGTmH,EAAOtG,UAAUgP,OAAS,WACxB,MAAMlK,EAAM3F,KAAKgG,OACjB,GAAIL,EAAM,GAAM,EACd,MAAM,IAAI8B,WAAW,6CAEvB,IAAK,IAAI3E,EAAI,EAAGA,EAAI6C,EAAK7C,GAAK,EAC5BoI,EAAKlL,KAAM8C,EAAGA,EAAI,GAClBoI,EAAKlL,KAAM8C,EAAI,EAAGA,EAAI,GAExB,OAAO9C,MAGTmH,EAAOtG,UAAUiP,OAAS,WACxB,MAAMnK,EAAM3F,KAAKgG,OACjB,GAAIL,EAAM,GAAM,EACd,MAAM,IAAI8B,WAAW,6CAEvB,IAAK,IAAI3E,EAAI,EAAGA,EAAI6C,EAAK7C,GAAK,EAC5BoI,EAAKlL,KAAM8C,EAAGA,EAAI,GAClBoI,EAAKlL,KAAM8C,EAAI,EAAGA,EAAI,GACtBoI,EAAKlL,KAAM8C,EAAI,EAAGA,EAAI,GACtBoI,EAAKlL,KAAM8C,EAAI,EAAGA,EAAI,GAExB,OAAO9C,MAGTmH,EAAOtG,UAAUuJ,SAAW,WAC1B,MAAMpE,EAAShG,KAAKgG,OACpB,OAAe,IAAXA,EAAqB,GACA,IAArBsE,UAAUtE,OAAqB6E,EAAU7K,KAAM,EAAGgG,GAC/C2E,EAAa0D,MAAMrO,KAAMsK,YAGlCnD,EAAOtG,UAAUkP,eAAiB5I,EAAOtG,UAAUuJ,SAEnDjD,EAAOtG,UAAUmP,OAAS,SAAiB1G,GACzC,IAAKnC,EAAOqC,SAASF,GAAI,MAAM,IAAIvB,UAAU,6BAC7C,OAAI/H,OAASsJ,GACsB,IAA5BnC,EAAOmI,QAAQtP,KAAMsJ,IAG9BnC,EAAOtG,UAAUoP,QAAU,WACzB,IAAIlD,EAAM,GACV,MAAMmD,EAAM1Q,EAAQ8H,kBAGpB,OAFAyF,EAAM/M,KAAKoK,SAAS,MAAO,EAAG8F,GAAKC,QAAQ,UAAW,OAAOC,OACzDpQ,KAAKgG,OAASkK,IAAKnD,GAAO,SACvB,WAAaA,EAAM,KAExB9F,IACFE,EAAOtG,UAAUoG,GAAuBE,EAAOtG,UAAUoP,SAG3D9I,EAAOtG,UAAUyO,QAAU,SAAkBe,EAAQhQ,EAAOC,EAAKgQ,EAAWC,GAI1E,GAHI1H,EAAWwH,EAAQ7J,cACrB6J,EAASlJ,EAAOc,KAAKoI,EAAQA,EAAOhE,OAAQgE,EAAOtL,cAEhDoC,EAAOqC,SAAS6G,GACnB,MAAM,IAAItI,UACR,wFAC2BsI,GAiB/B,QAbc3G,IAAVrJ,IACFA,EAAQ,QAEEqJ,IAARpJ,IACFA,EAAM+P,EAASA,EAAOrK,OAAS,QAEf0D,IAAd4G,IACFA,EAAY,QAEE5G,IAAZ6G,IACFA,EAAUvQ,KAAKgG,QAGb3F,EAAQ,GAAKC,EAAM+P,EAAOrK,QAAUsK,EAAY,GAAKC,EAAUvQ,KAAKgG,OACtE,MAAM,IAAIyB,WAAW,sBAGvB,GAAI6I,GAAaC,GAAWlQ,GAASC,EACnC,OAAO,EAET,GAAIgQ,GAAaC,EACf,OAAQ,EAEV,GAAIlQ,GAASC,EACX,OAAO,EAQT,GAAIN,OAASqQ,EAAQ,OAAO,EAE5B,IAAI7N,GAJJ+N,KAAa,IADbD,KAAe,GAMX7N,GAPJnC,KAAS,IADTD,KAAW,GASX,MAAMsF,EAAM6H,KAAKC,IAAIjL,EAAGC,GAElB+N,EAAWxQ,KAAKwI,MAAM8H,EAAWC,GACjCE,EAAaJ,EAAO7H,MAAMnI,EAAOC,GAEvC,IAAK,IAAIwC,EAAI,EAAGA,EAAI6C,IAAO7C,EACzB,GAAI0N,EAAS1N,KAAO2N,EAAW3N,GAAI,CACjCN,EAAIgO,EAAS1N,GACbL,EAAIgO,EAAW3N,GACf,MAIJ,OAAIN,EAAIC,GAAW,EACfA,EAAID,EAAU,EACX,GA4HT2E,EAAOtG,UAAU6P,SAAW,SAAmBpF,EAAKrC,EAAYb,GAC9D,OAAoD,IAA7CpI,KAAK4G,QAAQ0E,EAAKrC,EAAYb,IAGvCjB,EAAOtG,UAAU+F,QAAU,SAAkB0E,EAAKrC,EAAYb,GAC5D,OAAOiD,EAAqBrL,KAAMsL,EAAKrC,EAAYb,GAAU,IAG/DjB,EAAOtG,UAAU6K,YAAc,SAAsBJ,EAAKrC,EAAYb,GACpE,OAAOiD,EAAqBrL,KAAMsL,EAAKrC,EAAYb,GAAU,IA6C/DjB,EAAOtG,UAAU0H,MAAQ,SAAgBJ,EAAQkE,EAAQrG,EAAQoC,GAE/D,QAAesB,IAAX2C,EACFjE,EAAW,OACXpC,EAAShG,KAAKgG,OACdqG,EAAS,OAEJ,QAAe3C,IAAX1D,GAA0C,iBAAXqG,EACxCjE,EAAWiE,EACXrG,EAAShG,KAAKgG,OACdqG,EAAS,MAEJ,KAAIsE,SAAStE,GAUlB,MAAM,IAAI1F,MACR,2EAVF0F,KAAoB,EAChBsE,SAAS3K,IACXA,KAAoB,OACH0D,IAAbtB,IAAwBA,EAAW,UAEvCA,EAAWpC,EACXA,OAAS0D,GAQb,MAAM6C,EAAYvM,KAAKgG,OAASqG,EAGhC,SAFe3C,IAAX1D,GAAwBA,EAASuG,KAAWvG,EAASuG,GAEpDpE,EAAOnC,OAAS,IAAMA,EAAS,GAAKqG,EAAS,IAAOA,EAASrM,KAAKgG,OACrE,MAAM,IAAIyB,WAAW,0CAGlBW,IAAUA,EAAW,QAE1B,IAAImC,GAAc,EAClB,OACE,OAAQnC,GACN,IAAK,MACH,OAAOgE,EAASpM,KAAMmI,EAAQkE,EAAQrG,GAExC,IAAK,OACL,IAAK,QACH,OAAO4G,EAAU5M,KAAMmI,EAAQkE,EAAQrG,GAEzC,IAAK,QACL,IAAK,SACL,IAAK,SACH,OAAO8G,EAAW9M,KAAMmI,EAAQkE,EAAQrG,GAE1C,IAAK,SAEH,OAAOkH,EAAYlN,KAAMmI,EAAQkE,EAAQrG,GAE3C,IAAK,OACL,IAAK,QACL,IAAK,UACL,IAAK,WACH,OAAOmH,EAAUnN,KAAMmI,EAAQkE,EAAQrG,GAEzC,QACE,GAAIuE,EAAa,MAAM,IAAIxC,UAAU,qBAAuBK,GAC5DA,GAAY,GAAKA,GAAUsC,cAC3BH,GAAc,IAKtBpD,EAAOtG,UAAU+P,OAAS,WACxB,MAAO,CACLhH,KAAM,SACNE,KAAMrD,MAAM5F,UAAU2H,MAAMiD,KAAKzL,KAAK6Q,MAAQ7Q,KAAM,KA2FxD,MAAMmO,EAAuB,KAoB7B,SAASrD,EAAYpD,EAAKrH,EAAOC,GAC/B,IAAIwQ,EAAM,GACVxQ,EAAMkN,KAAKC,IAAI/F,EAAI1B,OAAQ1F,GAE3B,IAAK,IAAIwC,EAAIzC,EAAOyC,EAAIxC,IAAOwC,EAC7BgO,GAAOhF,OAAOsC,aAAsB,IAAT1G,EAAI5E,IAEjC,OAAOgO,EAGT,SAAS/F,EAAarD,EAAKrH,EAAOC,GAChC,IAAIwQ,EAAM,GACVxQ,EAAMkN,KAAKC,IAAI/F,EAAI1B,OAAQ1F,GAE3B,IAAK,IAAIwC,EAAIzC,EAAOyC,EAAIxC,IAAOwC,EAC7BgO,GAAOhF,OAAOsC,aAAa1G,EAAI5E,IAEjC,OAAOgO,EAGT,SAASlG,EAAUlD,EAAKrH,EAAOC,GAC7B,MAAMqF,EAAM+B,EAAI1B,SAEX3F,GAASA,EAAQ,KAAGA,EAAQ,KAC5BC,GAAOA,EAAM,GAAKA,EAAMqF,KAAKrF,EAAMqF,GAExC,IAAIoL,EAAM,GACV,IAAK,IAAIjO,EAAIzC,EAAOyC,EAAIxC,IAAOwC,EAC7BiO,GAAOC,EAAoBtJ,EAAI5E,IAEjC,OAAOiO,EAGT,SAAS9F,EAAcvD,EAAKrH,EAAOC,GACjC,MAAM2Q,EAAQvJ,EAAIc,MAAMnI,EAAOC,GAC/B,IAAIoN,EAAM,GAEV,IAAK,IAAI5K,EAAI,EAAGA,EAAImO,EAAMjL,OAAS,EAAGlD,GAAK,EACzC4K,GAAO5B,OAAOsC,aAAa6C,EAAMnO,GAAqB,IAAfmO,EAAMnO,EAAI,IAEnD,OAAO4K,EAkCT,SAASwD,EAAa7E,EAAQ8E,EAAKnL,GACjC,GAAKqG,EAAS,GAAO,GAAKA,EAAS,EAAG,MAAM,IAAI5E,WAAW,sBAC3D,GAAI4E,EAAS8E,EAAMnL,EAAQ,MAAM,IAAIyB,WAAW,yCA0QlD,SAAS2J,EAAU1J,EAAKQ,EAAOmE,EAAQ8E,EAAKjB,EAAKzC,GAC/C,IAAKtG,EAAOqC,SAAS9B,GAAM,MAAM,IAAIK,UAAU,+CAC/C,GAAIG,EAAQgI,GAAOhI,EAAQuF,EAAK,MAAM,IAAIhG,WAAW,qCACrD,GAAI4E,EAAS8E,EAAMzJ,EAAI1B,OAAQ,MAAM,IAAIyB,WAAW,sBAgGtD,SAAS4J,EAAgB3J,EAAKQ,EAAOmE,EAAQoB,EAAKyC,GAChDoB,EAAWpJ,EAAOuF,EAAKyC,EAAKxI,EAAK2E,EAAQ,GAEzC,IAAIiB,EAAKhB,OAAOpE,EAAQqJ,OAAO,aAC/B7J,EAAI2E,KAAYiB,EAChBA,IAAW,EACX5F,EAAI2E,KAAYiB,EAChBA,IAAW,EACX5F,EAAI2E,KAAYiB,EAChBA,IAAW,EACX5F,EAAI2E,KAAYiB,EAChB,IAAID,EAAKf,OAAOpE,GAASqJ,OAAO,IAAMA,OAAO,aAQ7C,OAPA7J,EAAI2E,KAAYgB,EAChBA,IAAW,EACX3F,EAAI2E,KAAYgB,EAChBA,IAAW,EACX3F,EAAI2E,KAAYgB,EAChBA,IAAW,EACX3F,EAAI2E,KAAYgB,EACThB,EAGT,SAASmF,EAAgB9J,EAAKQ,EAAOmE,EAAQoB,EAAKyC,GAChDoB,EAAWpJ,EAAOuF,EAAKyC,EAAKxI,EAAK2E,EAAQ,GAEzC,IAAIiB,EAAKhB,OAAOpE,EAAQqJ,OAAO,aAC/B7J,EAAI2E,EAAS,GAAKiB,EAClBA,IAAW,EACX5F,EAAI2E,EAAS,GAAKiB,EAClBA,IAAW,EACX5F,EAAI2E,EAAS,GAAKiB,EAClBA,IAAW,EACX5F,EAAI2E,EAAS,GAAKiB,EAClB,IAAID,EAAKf,OAAOpE,GAASqJ,OAAO,IAAMA,OAAO,aAQ7C,OAPA7J,EAAI2E,EAAS,GAAKgB,EAClBA,IAAW,EACX3F,EAAI2E,EAAS,GAAKgB,EAClBA,IAAW,EACX3F,EAAI2E,EAAS,GAAKgB,EAClBA,IAAW,EACX3F,EAAI2E,GAAUgB,EACPhB,EAAS,EAmHlB,SAASoF,EAAc/J,EAAKQ,EAAOmE,EAAQ8E,EAAKjB,EAAKzC,GACnD,GAAIpB,EAAS8E,EAAMzJ,EAAI1B,OAAQ,MAAM,IAAIyB,WAAW,sBACpD,GAAI4E,EAAS,EAAG,MAAM,IAAI5E,WAAW,sBAGvC,SAASiK,EAAYhK,EAAKQ,EAAOmE,EAAQsF,EAAcC,GAOrD,OANA1J,GAASA,EACTmE,KAAoB,EACfuF,GACHH,EAAa/J,EAAKQ,EAAOmE,EAAQ,GAEnCrF,EAAQuB,MAAMb,EAAKQ,EAAOmE,EAAQsF,EAAc,GAAI,GAC7CtF,EAAS,EAWlB,SAASwF,EAAanK,EAAKQ,EAAOmE,EAAQsF,EAAcC,GAOtD,OANA1J,GAASA,EACTmE,KAAoB,EACfuF,GACHH,EAAa/J,EAAKQ,EAAOmE,EAAQ,GAEnCrF,EAAQuB,MAAMb,EAAKQ,EAAOmE,EAAQsF,EAAc,GAAI,GAC7CtF,EAAS,EAxkBlBlF,EAAOtG,UAAU2H,MAAQ,SAAgBnI,EAAOC,GAC9C,MAAMqF,EAAM3F,KAAKgG,QACjB3F,IAAUA,GAGE,GACVA,GAASsF,GACG,IAAGtF,EAAQ,GACdA,EAAQsF,IACjBtF,EAAQsF,IANVrF,OAAcoJ,IAARpJ,EAAoBqF,IAAQrF,GASxB,GACRA,GAAOqF,GACG,IAAGrF,EAAM,GACVA,EAAMqF,IACfrF,EAAMqF,GAGJrF,EAAMD,IAAOC,EAAMD,GAEvB,MAAMyR,EAAS9R,KAAK+R,SAAS1R,EAAOC,GAIpC,OAFAqH,OAAOC,eAAekK,EAAQ3K,EAAOtG,WAE9BiR,GAWT3K,EAAOtG,UAAUmR,WACjB7K,EAAOtG,UAAUoR,WAAa,SAAqB5F,EAAQtH,EAAY6M,GACrEvF,KAAoB,EACpBtH,KAA4B,EACvB6M,GAAUV,EAAY7E,EAAQtH,EAAY/E,KAAKgG,QAEpD,IAAIsF,EAAMtL,KAAKqM,GACX6F,EAAM,EACNpP,EAAI,EACR,OAASA,EAAIiC,IAAemN,GAAO,MACjC5G,GAAOtL,KAAKqM,EAASvJ,GAAKoP,EAG5B,OAAO5G,GAGTnE,EAAOtG,UAAUsR,WACjBhL,EAAOtG,UAAUuR,WAAa,SAAqB/F,EAAQtH,EAAY6M,GACrEvF,KAAoB,EACpBtH,KAA4B,EACvB6M,GACHV,EAAY7E,EAAQtH,EAAY/E,KAAKgG,QAGvC,IAAIsF,EAAMtL,KAAKqM,IAAWtH,GACtBmN,EAAM,EACV,KAAOnN,EAAa,IAAMmN,GAAO,MAC/B5G,GAAOtL,KAAKqM,IAAWtH,GAAcmN,EAGvC,OAAO5G,GAGTnE,EAAOtG,UAAUwR,UACjBlL,EAAOtG,UAAUyR,UAAY,SAAoBjG,EAAQuF,GAGvD,OAFAvF,KAAoB,EACfuF,GAAUV,EAAY7E,EAAQ,EAAGrM,KAAKgG,QACpChG,KAAKqM,IAGdlF,EAAOtG,UAAU0R,aACjBpL,EAAOtG,UAAU2R,aAAe,SAAuBnG,EAAQuF,GAG7D,OAFAvF,KAAoB,EACfuF,GAAUV,EAAY7E,EAAQ,EAAGrM,KAAKgG,QACpChG,KAAKqM,GAAWrM,KAAKqM,EAAS,IAAM,GAG7ClF,EAAOtG,UAAU4R,aACjBtL,EAAOtG,UAAUmL,aAAe,SAAuBK,EAAQuF,GAG7D,OAFAvF,KAAoB,EACfuF,GAAUV,EAAY7E,EAAQ,EAAGrM,KAAKgG,QACnChG,KAAKqM,IAAW,EAAKrM,KAAKqM,EAAS,IAG7ClF,EAAOtG,UAAU6R,aACjBvL,EAAOtG,UAAU8R,aAAe,SAAuBtG,EAAQuF,GAI7D,OAHAvF,KAAoB,EACfuF,GAAUV,EAAY7E,EAAQ,EAAGrM,KAAKgG,SAElChG,KAAKqM,GACTrM,KAAKqM,EAAS,IAAM,EACpBrM,KAAKqM,EAAS,IAAM,IACD,SAAnBrM,KAAKqM,EAAS,IAGrBlF,EAAOtG,UAAU+R,aACjBzL,EAAOtG,UAAUgS,aAAe,SAAuBxG,EAAQuF,GAI7D,OAHAvF,KAAoB,EACfuF,GAAUV,EAAY7E,EAAQ,EAAGrM,KAAKgG,QAEpB,SAAfhG,KAAKqM,IACTrM,KAAKqM,EAAS,IAAM,GACrBrM,KAAKqM,EAAS,IAAM,EACrBrM,KAAKqM,EAAS,KAGlBlF,EAAOtG,UAAUiS,gBAAkBC,GAAmB,SAA0B1G,GAE9E2G,EADA3G,KAAoB,EACG,UACvB,MAAM4G,EAAQjT,KAAKqM,GACb6G,EAAOlT,KAAKqM,EAAS,QACb3C,IAAVuJ,QAAgCvJ,IAATwJ,GACzBC,EAAY9G,EAAQrM,KAAKgG,OAAS,GAGpC,MAAMsH,EAAK2F,EACQ,IAAjBjT,OAAOqM,GACU,MAAjBrM,OAAOqM,GACPrM,OAAOqM,GAAU,GAAK,GAElBgB,EAAKrN,OAAOqM,GACC,IAAjBrM,OAAOqM,GACU,MAAjBrM,OAAOqM,GACP6G,EAAO,GAAK,GAEd,OAAO3B,OAAOjE,IAAOiE,OAAOlE,IAAOkE,OAAO,QAG5CpK,EAAOtG,UAAUuS,gBAAkBL,GAAmB,SAA0B1G,GAE9E2G,EADA3G,KAAoB,EACG,UACvB,MAAM4G,EAAQjT,KAAKqM,GACb6G,EAAOlT,KAAKqM,EAAS,QACb3C,IAAVuJ,QAAgCvJ,IAATwJ,GACzBC,EAAY9G,EAAQrM,KAAKgG,OAAS,GAGpC,MAAMqH,EAAK4F,EAAQ,GAAK,GACL,MAAjBjT,OAAOqM,GACU,IAAjBrM,OAAOqM,GACPrM,OAAOqM,GAEHiB,EAAKtN,OAAOqM,GAAU,GAAK,GACd,MAAjBrM,OAAOqM,GACU,IAAjBrM,OAAOqM,GACP6G,EAEF,OAAQ3B,OAAOlE,IAAOkE,OAAO,KAAOA,OAAOjE,MAG7CnG,EAAOtG,UAAUwS,UAAY,SAAoBhH,EAAQtH,EAAY6M,GACnEvF,KAAoB,EACpBtH,KAA4B,EACvB6M,GAAUV,EAAY7E,EAAQtH,EAAY/E,KAAKgG,QAEpD,IAAIsF,EAAMtL,KAAKqM,GACX6F,EAAM,EACNpP,EAAI,EACR,OAASA,EAAIiC,IAAemN,GAAO,MACjC5G,GAAOtL,KAAKqM,EAASvJ,GAAKoP,EAM5B,OAJAA,GAAO,IAEH5G,GAAO4G,IAAK5G,GAAOkC,KAAK8F,IAAI,EAAG,EAAIvO,IAEhCuG,GAGTnE,EAAOtG,UAAU0S,UAAY,SAAoBlH,EAAQtH,EAAY6M,GACnEvF,KAAoB,EACpBtH,KAA4B,EACvB6M,GAAUV,EAAY7E,EAAQtH,EAAY/E,KAAKgG,QAEpD,IAAIlD,EAAIiC,EACJmN,EAAM,EACN5G,EAAMtL,KAAKqM,IAAWvJ,GAC1B,KAAOA,EAAI,IAAMoP,GAAO,MACtB5G,GAAOtL,KAAKqM,IAAWvJ,GAAKoP,EAM9B,OAJAA,GAAO,IAEH5G,GAAO4G,IAAK5G,GAAOkC,KAAK8F,IAAI,EAAG,EAAIvO,IAEhCuG,GAGTnE,EAAOtG,UAAU2S,SAAW,SAAmBnH,EAAQuF,GAGrD,OAFAvF,KAAoB,EACfuF,GAAUV,EAAY7E,EAAQ,EAAGrM,KAAKgG,QACtB,IAAfhG,KAAKqM,IAC0B,GAA5B,IAAOrM,KAAKqM,GAAU,GADKrM,KAAKqM,IAI3ClF,EAAOtG,UAAU4S,YAAc,SAAsBpH,EAAQuF,GAC3DvF,KAAoB,EACfuF,GAAUV,EAAY7E,EAAQ,EAAGrM,KAAKgG,QAC3C,MAAMsF,EAAMtL,KAAKqM,GAAWrM,KAAKqM,EAAS,IAAM,EAChD,OAAc,MAANf,EAAsB,WAANA,EAAmBA,GAG7CnE,EAAOtG,UAAU6S,YAAc,SAAsBrH,EAAQuF,GAC3DvF,KAAoB,EACfuF,GAAUV,EAAY7E,EAAQ,EAAGrM,KAAKgG,QAC3C,MAAMsF,EAAMtL,KAAKqM,EAAS,GAAMrM,KAAKqM,IAAW,EAChD,OAAc,MAANf,EAAsB,WAANA,EAAmBA,GAG7CnE,EAAOtG,UAAU8S,YAAc,SAAsBtH,EAAQuF,GAI3D,OAHAvF,KAAoB,EACfuF,GAAUV,EAAY7E,EAAQ,EAAGrM,KAAKgG,QAEnChG,KAAKqM,GACVrM,KAAKqM,EAAS,IAAM,EACpBrM,KAAKqM,EAAS,IAAM,GACpBrM,KAAKqM,EAAS,IAAM,IAGzBlF,EAAOtG,UAAU+S,YAAc,SAAsBvH,EAAQuF,GAI3D,OAHAvF,KAAoB,EACfuF,GAAUV,EAAY7E,EAAQ,EAAGrM,KAAKgG,QAEnChG,KAAKqM,IAAW,GACrBrM,KAAKqM,EAAS,IAAM,GACpBrM,KAAKqM,EAAS,IAAM,EACpBrM,KAAKqM,EAAS,IAGnBlF,EAAOtG,UAAUgT,eAAiBd,GAAmB,SAAyB1G,GAE5E2G,EADA3G,KAAoB,EACG,UACvB,MAAM4G,EAAQjT,KAAKqM,GACb6G,EAAOlT,KAAKqM,EAAS,QACb3C,IAAVuJ,QAAgCvJ,IAATwJ,GACzBC,EAAY9G,EAAQrM,KAAKgG,OAAS,GAGpC,MAAMsF,EAAMtL,KAAKqM,EAAS,GACL,IAAnBrM,KAAKqM,EAAS,GACK,MAAnBrM,KAAKqM,EAAS,IACb6G,GAAQ,IAEX,OAAQ3B,OAAOjG,IAAQiG,OAAO,KAC5BA,OAAO0B,EACU,IAAjBjT,OAAOqM,GACU,MAAjBrM,OAAOqM,GACPrM,OAAOqM,GAAU,GAAK,OAG1BlF,EAAOtG,UAAUiT,eAAiBf,GAAmB,SAAyB1G,GAE5E2G,EADA3G,KAAoB,EACG,UACvB,MAAM4G,EAAQjT,KAAKqM,GACb6G,EAAOlT,KAAKqM,EAAS,QACb3C,IAAVuJ,QAAgCvJ,IAATwJ,GACzBC,EAAY9G,EAAQrM,KAAKgG,OAAS,GAGpC,MAAMsF,GAAO2H,GAAS,IACH,MAAjBjT,OAAOqM,GACU,IAAjBrM,OAAOqM,GACPrM,OAAOqM,GAET,OAAQkF,OAAOjG,IAAQiG,OAAO,KAC5BA,OAAOvR,OAAOqM,GAAU,GAAK,GACZ,MAAjBrM,OAAOqM,GACU,IAAjBrM,OAAOqM,GACP6G,MAGJ/L,EAAOtG,UAAUkT,YAAc,SAAsB1H,EAAQuF,GAG3D,OAFAvF,KAAoB,EACfuF,GAAUV,EAAY7E,EAAQ,EAAGrM,KAAKgG,QACpCgB,EAAQ+E,KAAK/L,KAAMqM,GAAQ,EAAM,GAAI,IAG9ClF,EAAOtG,UAAUmT,YAAc,SAAsB3H,EAAQuF,GAG3D,OAFAvF,KAAoB,EACfuF,GAAUV,EAAY7E,EAAQ,EAAGrM,KAAKgG,QACpCgB,EAAQ+E,KAAK/L,KAAMqM,GAAQ,EAAO,GAAI,IAG/ClF,EAAOtG,UAAUoT,aAAe,SAAuB5H,EAAQuF,GAG7D,OAFAvF,KAAoB,EACfuF,GAAUV,EAAY7E,EAAQ,EAAGrM,KAAKgG,QACpCgB,EAAQ+E,KAAK/L,KAAMqM,GAAQ,EAAM,GAAI,IAG9ClF,EAAOtG,UAAUqT,aAAe,SAAuB7H,EAAQuF,GAG7D,OAFAvF,KAAoB,EACfuF,GAAUV,EAAY7E,EAAQ,EAAGrM,KAAKgG,QACpCgB,EAAQ+E,KAAK/L,KAAMqM,GAAQ,EAAO,GAAI,IAS/ClF,EAAOtG,UAAUsT,YACjBhN,EAAOtG,UAAUuT,YAAc,SAAsBlM,EAAOmE,EAAQtH,EAAY6M,GAC9E1J,GAASA,EACTmE,KAAoB,EACpBtH,KAA4B,EACvB6M,GAEHR,EAASpR,KAAMkI,EAAOmE,EAAQtH,EADbyI,KAAK8F,IAAI,EAAG,EAAIvO,GAAc,EACK,GAGtD,IAAImN,EAAM,EACNpP,EAAI,EAER,IADA9C,KAAKqM,GAAkB,IAARnE,IACNpF,EAAIiC,IAAemN,GAAO,MACjClS,KAAKqM,EAASvJ,GAAMoF,EAAQgK,EAAO,IAGrC,OAAO7F,EAAStH,GAGlBoC,EAAOtG,UAAUwT,YACjBlN,EAAOtG,UAAUyT,YAAc,SAAsBpM,EAAOmE,EAAQtH,EAAY6M,GAC9E1J,GAASA,EACTmE,KAAoB,EACpBtH,KAA4B,EACvB6M,GAEHR,EAASpR,KAAMkI,EAAOmE,EAAQtH,EADbyI,KAAK8F,IAAI,EAAG,EAAIvO,GAAc,EACK,GAGtD,IAAIjC,EAAIiC,EAAa,EACjBmN,EAAM,EAEV,IADAlS,KAAKqM,EAASvJ,GAAa,IAARoF,IACVpF,GAAK,IAAMoP,GAAO,MACzBlS,KAAKqM,EAASvJ,GAAMoF,EAAQgK,EAAO,IAGrC,OAAO7F,EAAStH,GAGlBoC,EAAOtG,UAAU0T,WACjBpN,EAAOtG,UAAU2T,WAAa,SAAqBtM,EAAOmE,EAAQuF,GAKhE,OAJA1J,GAASA,EACTmE,KAAoB,EACfuF,GAAUR,EAASpR,KAAMkI,EAAOmE,EAAQ,EAAG,IAAM,GACtDrM,KAAKqM,GAAmB,IAARnE,EACTmE,EAAS,GAGlBlF,EAAOtG,UAAU4T,cACjBtN,EAAOtG,UAAU6T,cAAgB,SAAwBxM,EAAOmE,EAAQuF,GAMtE,OALA1J,GAASA,EACTmE,KAAoB,EACfuF,GAAUR,EAASpR,KAAMkI,EAAOmE,EAAQ,EAAG,MAAQ,GACxDrM,KAAKqM,GAAmB,IAARnE,EAChBlI,KAAKqM,EAAS,GAAMnE,IAAU,EACvBmE,EAAS,GAGlBlF,EAAOtG,UAAU8T,cACjBxN,EAAOtG,UAAU+T,cAAgB,SAAwB1M,EAAOmE,EAAQuF,GAMtE,OALA1J,GAASA,EACTmE,KAAoB,EACfuF,GAAUR,EAASpR,KAAMkI,EAAOmE,EAAQ,EAAG,MAAQ,GACxDrM,KAAKqM,GAAWnE,IAAU,EAC1BlI,KAAKqM,EAAS,GAAc,IAARnE,EACbmE,EAAS,GAGlBlF,EAAOtG,UAAUgU,cACjB1N,EAAOtG,UAAUiU,cAAgB,SAAwB5M,EAAOmE,EAAQuF,GAQtE,OAPA1J,GAASA,EACTmE,KAAoB,EACfuF,GAAUR,EAASpR,KAAMkI,EAAOmE,EAAQ,EAAG,WAAY,GAC5DrM,KAAKqM,EAAS,GAAMnE,IAAU,GAC9BlI,KAAKqM,EAAS,GAAMnE,IAAU,GAC9BlI,KAAKqM,EAAS,GAAMnE,IAAU,EAC9BlI,KAAKqM,GAAmB,IAARnE,EACTmE,EAAS,GAGlBlF,EAAOtG,UAAUkU,cACjB5N,EAAOtG,UAAUmU,cAAgB,SAAwB9M,EAAOmE,EAAQuF,GAQtE,OAPA1J,GAASA,EACTmE,KAAoB,EACfuF,GAAUR,EAASpR,KAAMkI,EAAOmE,EAAQ,EAAG,WAAY,GAC5DrM,KAAKqM,GAAWnE,IAAU,GAC1BlI,KAAKqM,EAAS,GAAMnE,IAAU,GAC9BlI,KAAKqM,EAAS,GAAMnE,IAAU,EAC9BlI,KAAKqM,EAAS,GAAc,IAARnE,EACbmE,EAAS,GA+ClBlF,EAAOtG,UAAUoU,iBAAmBlC,GAAmB,SAA2B7K,EAAOmE,EAAS,GAChG,OAAOgF,EAAerR,KAAMkI,EAAOmE,EAAQkF,OAAO,GAAIA,OAAO,0BAG/DpK,EAAOtG,UAAUqU,iBAAmBnC,GAAmB,SAA2B7K,EAAOmE,EAAS,GAChG,OAAOmF,EAAexR,KAAMkI,EAAOmE,EAAQkF,OAAO,GAAIA,OAAO,0BAG/DpK,EAAOtG,UAAUsU,WAAa,SAAqBjN,EAAOmE,EAAQtH,EAAY6M,GAG5E,GAFA1J,GAASA,EACTmE,KAAoB,GACfuF,EAAU,CACb,MAAMwD,EAAQ5H,KAAK8F,IAAI,EAAI,EAAIvO,EAAc,GAE7CqM,EAASpR,KAAMkI,EAAOmE,EAAQtH,EAAYqQ,EAAQ,GAAIA,GAGxD,IAAItS,EAAI,EACJoP,EAAM,EACNmD,EAAM,EAEV,IADArV,KAAKqM,GAAkB,IAARnE,IACNpF,EAAIiC,IAAemN,GAAO,MAC7BhK,EAAQ,GAAa,IAARmN,GAAsC,IAAzBrV,KAAKqM,EAASvJ,EAAI,KAC9CuS,EAAM,GAERrV,KAAKqM,EAASvJ,IAAOoF,EAAQgK,GAAQ,GAAKmD,EAAM,IAGlD,OAAOhJ,EAAStH,GAGlBoC,EAAOtG,UAAUyU,WAAa,SAAqBpN,EAAOmE,EAAQtH,EAAY6M,GAG5E,GAFA1J,GAASA,EACTmE,KAAoB,GACfuF,EAAU,CACb,MAAMwD,EAAQ5H,KAAK8F,IAAI,EAAI,EAAIvO,EAAc,GAE7CqM,EAASpR,KAAMkI,EAAOmE,EAAQtH,EAAYqQ,EAAQ,GAAIA,GAGxD,IAAItS,EAAIiC,EAAa,EACjBmN,EAAM,EACNmD,EAAM,EAEV,IADArV,KAAKqM,EAASvJ,GAAa,IAARoF,IACVpF,GAAK,IAAMoP,GAAO,MACrBhK,EAAQ,GAAa,IAARmN,GAAsC,IAAzBrV,KAAKqM,EAASvJ,EAAI,KAC9CuS,EAAM,GAERrV,KAAKqM,EAASvJ,IAAOoF,EAAQgK,GAAQ,GAAKmD,EAAM,IAGlD,OAAOhJ,EAAStH,GAGlBoC,EAAOtG,UAAU0U,UAAY,SAAoBrN,EAAOmE,EAAQuF,GAM9D,OALA1J,GAASA,EACTmE,KAAoB,EACfuF,GAAUR,EAASpR,KAAMkI,EAAOmE,EAAQ,EAAG,KAAO,KACnDnE,EAAQ,IAAGA,EAAQ,IAAOA,EAAQ,GACtClI,KAAKqM,GAAmB,IAARnE,EACTmE,EAAS,GAGlBlF,EAAOtG,UAAU2U,aAAe,SAAuBtN,EAAOmE,EAAQuF,GAMpE,OALA1J,GAASA,EACTmE,KAAoB,EACfuF,GAAUR,EAASpR,KAAMkI,EAAOmE,EAAQ,EAAG,OAAS,OACzDrM,KAAKqM,GAAmB,IAARnE,EAChBlI,KAAKqM,EAAS,GAAMnE,IAAU,EACvBmE,EAAS,GAGlBlF,EAAOtG,UAAU4U,aAAe,SAAuBvN,EAAOmE,EAAQuF,GAMpE,OALA1J,GAASA,EACTmE,KAAoB,EACfuF,GAAUR,EAASpR,KAAMkI,EAAOmE,EAAQ,EAAG,OAAS,OACzDrM,KAAKqM,GAAWnE,IAAU,EAC1BlI,KAAKqM,EAAS,GAAc,IAARnE,EACbmE,EAAS,GAGlBlF,EAAOtG,UAAU6U,aAAe,SAAuBxN,EAAOmE,EAAQuF,GAQpE,OAPA1J,GAASA,EACTmE,KAAoB,EACfuF,GAAUR,EAASpR,KAAMkI,EAAOmE,EAAQ,EAAG,YAAa,YAC7DrM,KAAKqM,GAAmB,IAARnE,EAChBlI,KAAKqM,EAAS,GAAMnE,IAAU,EAC9BlI,KAAKqM,EAAS,GAAMnE,IAAU,GAC9BlI,KAAKqM,EAAS,GAAMnE,IAAU,GACvBmE,EAAS,GAGlBlF,EAAOtG,UAAU8U,aAAe,SAAuBzN,EAAOmE,EAAQuF,GASpE,OARA1J,GAASA,EACTmE,KAAoB,EACfuF,GAAUR,EAASpR,KAAMkI,EAAOmE,EAAQ,EAAG,YAAa,YACzDnE,EAAQ,IAAGA,EAAQ,WAAaA,EAAQ,GAC5ClI,KAAKqM,GAAWnE,IAAU,GAC1BlI,KAAKqM,EAAS,GAAMnE,IAAU,GAC9BlI,KAAKqM,EAAS,GAAMnE,IAAU,EAC9BlI,KAAKqM,EAAS,GAAc,IAARnE,EACbmE,EAAS,GAGlBlF,EAAOtG,UAAU+U,gBAAkB7C,GAAmB,SAA0B7K,EAAOmE,EAAS,GAC9F,OAAOgF,EAAerR,KAAMkI,EAAOmE,GAASkF,OAAO,sBAAuBA,OAAO,0BAGnFpK,EAAOtG,UAAUgV,gBAAkB9C,GAAmB,SAA0B7K,EAAOmE,EAAS,GAC9F,OAAOmF,EAAexR,KAAMkI,EAAOmE,GAASkF,OAAO,sBAAuBA,OAAO,0BAkBnFpK,EAAOtG,UAAUiV,aAAe,SAAuB5N,EAAOmE,EAAQuF,GACpE,OAAOF,EAAW1R,KAAMkI,EAAOmE,GAAQ,EAAMuF,IAG/CzK,EAAOtG,UAAUkV,aAAe,SAAuB7N,EAAOmE,EAAQuF,GACpE,OAAOF,EAAW1R,KAAMkI,EAAOmE,GAAQ,EAAOuF,IAahDzK,EAAOtG,UAAUmV,cAAgB,SAAwB9N,EAAOmE,EAAQuF,GACtE,OAAOC,EAAY7R,KAAMkI,EAAOmE,GAAQ,EAAMuF,IAGhDzK,EAAOtG,UAAUoV,cAAgB,SAAwB/N,EAAOmE,EAAQuF,GACtE,OAAOC,EAAY7R,KAAMkI,EAAOmE,GAAQ,EAAOuF,IAIjDzK,EAAOtG,UAAUiI,KAAO,SAAeuH,EAAQ6F,EAAa7V,EAAOC,GACjE,IAAK6G,EAAOqC,SAAS6G,GAAS,MAAM,IAAItI,UAAU,+BAQlD,GAPK1H,IAAOA,EAAQ,GACfC,GAAe,IAARA,IAAWA,EAAMN,KAAKgG,QAC9BkQ,GAAe7F,EAAOrK,SAAQkQ,EAAc7F,EAAOrK,QAClDkQ,IAAaA,EAAc,GAC5B5V,EAAM,GAAKA,EAAMD,IAAOC,EAAMD,GAG9BC,IAAQD,EAAO,OAAO,EAC1B,GAAsB,IAAlBgQ,EAAOrK,QAAgC,IAAhBhG,KAAKgG,OAAc,OAAO,EAGrD,GAAIkQ,EAAc,EAChB,MAAM,IAAIzO,WAAW,6BAEvB,GAAIpH,EAAQ,GAAKA,GAASL,KAAKgG,OAAQ,MAAM,IAAIyB,WAAW,sBAC5D,GAAInH,EAAM,EAAG,MAAM,IAAImH,WAAW,2BAG9BnH,EAAMN,KAAKgG,SAAQ1F,EAAMN,KAAKgG,QAC9BqK,EAAOrK,OAASkQ,EAAc5V,EAAMD,IACtCC,EAAM+P,EAAOrK,OAASkQ,EAAc7V,GAGtC,MAAMsF,EAAMrF,EAAMD,EAalB,OAXIL,OAASqQ,GAAqD,mBAApC7J,WAAW3F,UAAUsV,WAEjDnW,KAAKmW,WAAWD,EAAa7V,EAAOC,GAEpCkG,WAAW3F,UAAU8O,IAAIlE,KACvB4E,EACArQ,KAAK+R,SAAS1R,EAAOC,GACrB4V,GAIGvQ,GAOTwB,EAAOtG,UAAUsO,KAAO,SAAe7D,EAAKjL,EAAOC,EAAK8H,GAEtD,GAAmB,iBAARkD,EAAkB,CAS3B,GARqB,iBAAVjL,GACT+H,EAAW/H,EACXA,EAAQ,EACRC,EAAMN,KAAKgG,QACa,iBAAR1F,IAChB8H,EAAW9H,EACXA,EAAMN,KAAKgG,aAEI0D,IAAbtB,GAA8C,iBAAbA,EACnC,MAAM,IAAIL,UAAU,6BAEtB,GAAwB,iBAAbK,IAA0BjB,EAAOkB,WAAWD,GACrD,MAAM,IAAIL,UAAU,qBAAuBK,GAE7C,GAAmB,IAAfkD,EAAItF,OAAc,CACpB,MAAMU,EAAO4E,EAAIzF,WAAW,IACV,SAAbuC,GAAuB1B,EAAO,KAClB,WAAb0B,KAEFkD,EAAM5E,QAGc,iBAAR4E,EAChBA,GAAY,IACY,kBAARA,IAChBA,EAAMgB,OAAOhB,IAIf,GAAIjL,EAAQ,GAAKL,KAAKgG,OAAS3F,GAASL,KAAKgG,OAAS1F,EACpD,MAAM,IAAImH,WAAW,sBAGvB,GAAInH,GAAOD,EACT,OAAOL,KAQT,IAAI8C,EACJ,GANAzC,KAAkB,EAClBC,OAAcoJ,IAARpJ,EAAoBN,KAAKgG,OAAS1F,IAAQ,EAE3CgL,IAAKA,EAAM,GAGG,iBAARA,EACT,IAAKxI,EAAIzC,EAAOyC,EAAIxC,IAAOwC,EACzB9C,KAAK8C,GAAKwI,MAEP,CACL,MAAM2F,EAAQ9J,EAAOqC,SAAS8B,GAC1BA,EACAnE,EAAOc,KAAKqD,EAAKlD,GACfzC,EAAMsL,EAAMjL,OAClB,GAAY,IAARL,EACF,MAAM,IAAIoC,UAAU,cAAgBuD,EAClC,qCAEJ,IAAKxI,EAAI,EAAGA,EAAIxC,EAAMD,IAASyC,EAC7B9C,KAAK8C,EAAIzC,GAAS4Q,EAAMnO,EAAI6C,GAIhC,OAAO3F,MAOT,MAAMoW,EAAS,GACf,SAASC,EAAGC,EAAKC,EAAYC,GAC3BJ,EAAOE,GAAO,cAAwBE,EACpCC,cACEC,QAEA/O,OAAOoH,eAAe/O,KAAM,UAAW,CACrCkI,MAAOqO,EAAWlI,MAAMrO,KAAMsK,WAC9BqM,UAAU,EACVC,cAAc,IAIhB5W,KAAK6W,KAAO,GAAG7W,KAAK6W,SAASP,KAG7BtW,KAAK8W,aAEE9W,KAAK6W,KAGVnQ,WACF,OAAO4P,EAGL5P,SAAMwB,GACRP,OAAOoH,eAAe/O,KAAM,OAAQ,CAClC4W,cAAc,EACd5H,YAAY,EACZ9G,MAAAA,EACAyO,UAAU,IAIdvM,WACE,MAAO,GAAGpK,KAAK6W,SAASP,OAAStW,KAAK+W,YAkC5C,SAASC,EAAuB1L,GAC9B,IAAIoC,EAAM,GACN5K,EAAIwI,EAAItF,OACZ,MAAM3F,EAAmB,MAAXiL,EAAI,GAAa,EAAI,EACnC,KAAOxI,GAAKzC,EAAQ,EAAGyC,GAAK,EAC1B4K,EAAM,IAAIpC,EAAI9C,MAAM1F,EAAI,EAAGA,KAAK4K,IAElC,MAAO,GAAGpC,EAAI9C,MAAM,EAAG1F,KAAK4K,IAa9B,SAAS4D,EAAYpJ,EAAOuF,EAAKyC,EAAKxI,EAAK2E,EAAQtH,GACjD,GAAImD,EAAQgI,GAAOhI,EAAQuF,EAAK,CAC9B,MAAMtC,EAAmB,iBAARsC,EAAmB,IAAM,GAC1C,IAAIwJ,EAWJ,MARIA,EAFAlS,EAAa,EACH,IAAR0I,GAAaA,IAAQ8D,OAAO,GACtB,OAAOpG,YAAYA,QAA2B,GAAlBpG,EAAa,KAASoG,IAElD,SAASA,QAA2B,GAAlBpG,EAAa,GAAS,IAAIoG,iBACtB,GAAlBpG,EAAa,GAAS,IAAIoG,IAGhC,MAAMsC,IAAMtC,YAAY+E,IAAM/E,IAElC,IAAIiL,EAAOc,iBAAiB,QAASD,EAAO/O,IArBtD,SAAsBR,EAAK2E,EAAQtH,GACjCiO,EAAe3G,EAAQ,eACH3C,IAAhBhC,EAAI2E,SAAsD3C,IAA7BhC,EAAI2E,EAAStH,IAC5CoO,EAAY9G,EAAQ3E,EAAI1B,QAAUjB,EAAa,IAoBjDoS,CAAYzP,EAAK2E,EAAQtH,GAG3B,SAASiO,EAAgB9K,EAAO2O,GAC9B,GAAqB,iBAAV3O,EACT,MAAM,IAAIkO,EAAOgB,qBAAqBP,EAAM,SAAU3O,GAI1D,SAASiL,EAAajL,EAAOlC,EAAQ4D,GACnC,GAAI4D,KAAK6J,MAAMnP,KAAWA,EAExB,MADA8K,EAAe9K,EAAO0B,GAChB,IAAIwM,EAAOc,iBAAiBtN,GAAQ,SAAU,aAAc1B,GAGpE,GAAIlC,EAAS,EACX,MAAM,IAAIoQ,EAAOkB,yBAGnB,MAAM,IAAIlB,EAAOc,iBAAiBtN,GAAQ,SACR,MAAMA,EAAO,EAAI,YAAY5D,IAC7BkC,GAtFpCmO,EAAE,4BACA,SAAUQ,GACR,OAAIA,EACK,GAAGA,gCAGL,mDACNpP,YACL4O,EAAE,wBACA,SAAUQ,EAAMvO,GACd,MAAO,QAAQuO,4DAA+DvO,MAC7EP,WACLsO,EAAE,oBACA,SAAUtJ,EAAKkK,EAAOM,GACpB,IAAIC,EAAM,iBAAiBzK,sBACvB0K,EAAWF,EAWf,OAVIjL,OAAOoL,UAAUH,IAAU/J,KAAKmK,IAAIJ,GAAS,GAAK,GACpDE,EAAWT,EAAsBlL,OAAOyL,IACd,iBAAVA,IAChBE,EAAW3L,OAAOyL,IACdA,EAAQhG,OAAO,IAAMA,OAAO,KAAOgG,IAAUhG,OAAO,IAAMA,OAAO,QACnEkG,EAAWT,EAAsBS,IAEnCA,GAAY,KAEdD,GAAO,eAAeP,eAAmBQ,IAClCD,IACN/P,YAiEL,MAAMmQ,EAAoB,oBAgB1B,SAASpN,EAAarC,EAAQiF,GAE5B,IAAIQ,EADJR,EAAQA,GAASyK,EAAAA,EAEjB,MAAM7R,EAASmC,EAAOnC,OACtB,IAAI8R,EAAgB,KACpB,MAAM7G,EAAQ,GAEd,IAAK,IAAInO,EAAI,EAAGA,EAAIkD,IAAUlD,EAAG,CAI/B,GAHA8K,EAAYzF,EAAOtC,WAAW/C,GAG1B8K,EAAY,OAAUA,EAAY,MAAQ,CAE5C,IAAKkK,EAAe,CAElB,GAAIlK,EAAY,MAAQ,EAEjBR,GAAS,IAAM,GAAG6D,EAAM/N,KAAK,IAAM,IAAM,KAC9C,SACK,GAAIJ,EAAI,IAAMkD,EAAQ,EAEtBoH,GAAS,IAAM,GAAG6D,EAAM/N,KAAK,IAAM,IAAM,KAC9C,SAIF4U,EAAgBlK,EAEhB,SAIF,GAAIA,EAAY,MAAQ,EACjBR,GAAS,IAAM,GAAG6D,EAAM/N,KAAK,IAAM,IAAM,KAC9C4U,EAAgBlK,EAChB,SAIFA,EAAkE,OAArDkK,EAAgB,OAAU,GAAKlK,EAAY,YAC/CkK,IAEJ1K,GAAS,IAAM,GAAG6D,EAAM/N,KAAK,IAAM,IAAM,KAMhD,GAHA4U,EAAgB,KAGZlK,EAAY,IAAM,CACpB,IAAKR,GAAS,GAAK,EAAG,MACtB6D,EAAM/N,KAAK0K,QACN,GAAIA,EAAY,KAAO,CAC5B,IAAKR,GAAS,GAAK,EAAG,MACtB6D,EAAM/N,KACJ0K,GAAa,EAAM,IACP,GAAZA,EAAmB,UAEhB,GAAIA,EAAY,MAAS,CAC9B,IAAKR,GAAS,GAAK,EAAG,MACtB6D,EAAM/N,KACJ0K,GAAa,GAAM,IACnBA,GAAa,EAAM,GAAO,IACd,GAAZA,EAAmB,SAEhB,MAAIA,EAAY,SASrB,MAAM,IAAIjH,MAAM,sBARhB,IAAKyG,GAAS,GAAK,EAAG,MACtB6D,EAAM/N,KACJ0K,GAAa,GAAO,IACpBA,GAAa,GAAM,GAAO,IAC1BA,GAAa,EAAM,GAAO,IACd,GAAZA,EAAmB,MAOzB,OAAOqD,EA4BT,SAASxG,EAAesC,GACtB,OAAOhG,EAAO1B,YAxHhB,SAAsB0H,GAMpB,IAFAA,GAFAA,EAAMA,EAAIgL,MAAM,KAAK,IAEX3H,OAAOD,QAAQyH,EAAmB,KAEpC5R,OAAS,EAAG,MAAO,GAE3B,KAAO+G,EAAI/G,OAAS,GAAM,GACxB+G,GAAY,IAEd,OAAOA,EA6GmBiL,CAAYjL,IAGxC,SAASF,EAAYoL,EAAKC,EAAK7L,EAAQrG,GACrC,IAAIlD,EACJ,IAAKA,EAAI,EAAGA,EAAIkD,KACTlD,EAAIuJ,GAAU6L,EAAIlS,QAAYlD,GAAKmV,EAAIjS,UADpBlD,EAExBoV,EAAIpV,EAAIuJ,GAAU4L,EAAInV,GAExB,OAAOA,EAMT,SAAS+F,EAAYU,EAAKK,GACxB,OAAOL,aAAeK,GACZ,MAAPL,GAAkC,MAAnBA,EAAIkN,aAA+C,MAAxBlN,EAAIkN,YAAYI,MACzDtN,EAAIkN,YAAYI,OAASjN,EAAKiN,KAEpC,SAASlN,EAAaJ,GAEpB,OAAOA,GAAQA,EAKjB,MAAMyH,EAAsB,WAC1B,MAAMmH,EAAW,mBACXC,EAAQ,IAAI3R,MAAM,KACxB,IAAK,IAAI3D,EAAI,EAAGA,EAAI,KAAMA,EAAG,CAC3B,MAAMuV,EAAU,GAAJvV,EACZ,IAAK,IAAIqJ,EAAI,EAAGA,EAAI,KAAMA,EACxBiM,EAAMC,EAAMlM,GAAKgM,EAASrV,GAAKqV,EAAShM,GAG5C,OAAOiM,EATmB,GAa5B,SAASrF,EAAoBuF,GAC3B,MAAyB,oBAAX/G,OAAyBgH,EAAyBD,EAGlE,SAASC,IACP,MAAM,IAAI5R,MAAM,kCCvjElBlH,EAAOD,QAAU,YCAjBC,EAAOD,QAAU,CAAC,gBAAkB,MAAM,mBAAqB,IAAI,oBAAsB,MAAM,KAAO,cAAc,eAAiB,wBAAwB,KAAO,cAAc,aAAe,sBAAsB,UAAY,mBAAmB,KAAO,cAAc,UAAY,mBAAmB,YAAc,qBAAqB,SAAW,kBAAkB,iBAAmB,wCCA7XA,EAAQuM,KAAO,SAAU/C,EAAQqD,EAAQmM,EAAMC,EAAMC,GACnD,IAAI/J,EAAGvD,EACHuN,EAAiB,EAATD,EAAcD,EAAO,EAC7BG,GAAQ,GAAKD,GAAQ,EACrBE,EAAQD,GAAQ,EAChBE,GAAS,EACThW,EAAI0V,EAAQE,EAAS,EAAK,EAC1BK,EAAIP,GAAQ,EAAI,EAChBQ,EAAIhQ,EAAOqD,EAASvJ,GAOxB,IALAA,GAAKiW,EAELpK,EAAIqK,GAAM,IAAOF,GAAU,EAC3BE,KAAQF,EACRA,GAASH,EACFG,EAAQ,EAAGnK,EAAS,IAAJA,EAAW3F,EAAOqD,EAASvJ,GAAIA,GAAKiW,EAAGD,GAAS,GAKvE,IAHA1N,EAAIuD,GAAM,IAAOmK,GAAU,EAC3BnK,KAAQmK,EACRA,GAASL,EACFK,EAAQ,EAAG1N,EAAS,IAAJA,EAAWpC,EAAOqD,EAASvJ,GAAIA,GAAKiW,EAAGD,GAAS,GAEvE,GAAU,IAANnK,EACFA,EAAI,EAAIkK,MACH,IAAIlK,IAAMiK,EACf,OAAOxN,EAAI6N,IAAsBpB,EAAAA,GAAdmB,GAAK,EAAI,GAE5B5N,GAAQoC,KAAK8F,IAAI,EAAGmF,GACpB9J,GAAQkK,EAEV,OAAQG,GAAK,EAAI,GAAK5N,EAAIoC,KAAK8F,IAAI,EAAG3E,EAAI8J,IAG5CjZ,EAAQ+I,MAAQ,SAAUS,EAAQd,EAAOmE,EAAQmM,EAAMC,EAAMC,GAC3D,IAAI/J,EAAGvD,EAAGrI,EACN4V,EAAiB,EAATD,EAAcD,EAAO,EAC7BG,GAAQ,GAAKD,GAAQ,EACrBE,EAAQD,GAAQ,EAChBM,EAAe,KAATT,EAAcjL,KAAK8F,IAAI,GAAI,IAAM9F,KAAK8F,IAAI,GAAI,IAAM,EAC1DxQ,EAAI0V,EAAO,EAAKE,EAAS,EACzBK,EAAIP,EAAO,GAAK,EAChBQ,EAAI9Q,EAAQ,GAAgB,IAAVA,GAAe,EAAIA,EAAQ,EAAK,EAAI,EAmC1D,IAjCAA,EAAQsF,KAAKmK,IAAIzP,GAEbiR,MAAMjR,IAAUA,IAAU2P,EAAAA,GAC5BzM,EAAI+N,MAAMjR,GAAS,EAAI,EACvByG,EAAIiK,IAEJjK,EAAInB,KAAK6J,MAAM7J,KAAK4L,IAAIlR,GAASsF,KAAK6L,KAClCnR,GAASnF,EAAIyK,KAAK8F,IAAI,GAAI3E,IAAM,IAClCA,IACA5L,GAAK,IAGLmF,GADEyG,EAAIkK,GAAS,EACNK,EAAKnW,EAELmW,EAAK1L,KAAK8F,IAAI,EAAG,EAAIuF,IAEpB9V,GAAK,IACf4L,IACA5L,GAAK,GAGH4L,EAAIkK,GAASD,GACfxN,EAAI,EACJuD,EAAIiK,GACKjK,EAAIkK,GAAS,GACtBzN,GAAMlD,EAAQnF,EAAK,GAAKyK,KAAK8F,IAAI,EAAGmF,GACpC9J,GAAQkK,IAERzN,EAAIlD,EAAQsF,KAAK8F,IAAI,EAAGuF,EAAQ,GAAKrL,KAAK8F,IAAI,EAAGmF,GACjD9J,EAAI,IAID8J,GAAQ,EAAGzP,EAAOqD,EAASvJ,GAAS,IAAJsI,EAAUtI,GAAKiW,EAAG3N,GAAK,IAAKqN,GAAQ,GAI3E,IAFA9J,EAAKA,GAAK8J,EAAQrN,EAClBuN,GAAQF,EACDE,EAAO,EAAG3P,EAAOqD,EAASvJ,GAAS,IAAJ6L,EAAU7L,GAAKiW,EAAGpK,GAAK,IAAKgK,GAAQ,GAE1E3P,EAAOqD,EAASvJ,EAAIiW,IAAU,IAAJC,kBC7D5BvZ,EAAOD,QAAU,EAAjB,wCCAI8Z,EAAO,EAAQ,KAMnB9Z,EAAQ+Z,OAAS,SAASC,GACxB,IAAIvI,EAAUqI,EAAKG,MAAMD,GAMzB,OALcrS,EAAOc,KAAKgJ,GAAO7G,SAAS,UAE7B+F,QAAQ,MAAO,KACfA,QAAQ,MAAO,KACfuJ,UAAU,EAAG,KAO5Bla,EAAQma,OAAS,SAASC,GACxB,IAAI7S,EAAS6S,EACIzJ,QAAQ,KAAM,KACdA,QAAQ,KAAM,KACb,KAClB,OAAOmJ,EAAKO,UAAU1S,EAAOc,KAAKlB,EAAQ,YAM5CvH,EAAQsa,GAAK,WAOX,OANcR,EAAKQ,GAAG,KAAM3S,EAAOE,MAAM,KACrB+C,SAAS,UAEhB+F,QAAQ,MAAO,KACfA,QAAQ,MAAO,KACfuJ,UAAU,EAAG,KAe5Bla,EAAQua,KAAO,WACb,IAAI9I,EAAUqI,EAAKQ,GAAG,KAAM3S,EAAOE,MAAM,KAOzC,OANA4J,EAAM,GAAgB,IAAXA,EAAM,GACHA,EAAM7G,SAAS,UAEhB+F,QAAQ,MAAO,KACfA,QAAQ,MAAO,KACfuJ,UAAU,EAAG,iCC7E5B,IAAIM,yHACJ,IAAIC,EAAQ,IAAIzT,WAAW,IACZ,SAAS0T,IAEtB,IAAKF,KAGHA,EAAoC,oBAAXG,QAA0BA,OAAOH,iBAAmBG,OAAOH,gBAAgBI,KAAKD,SAA+B,oBAAbE,UAAgE,mBAA7BA,SAASL,iBAAkCK,SAASL,gBAAgBI,KAAKC,WAGrO,MAAM,IAAI1T,MAAM,4GAIpB,OAAOqT,EAAgBC,GCjBzB,8HCMA,EAJA,SAAkBX,GAChB,MAAuB,iBAATA,GAAqB,OAAWA,ICKhD,IAFA,IAAIgB,EAAY,GAEPxX,EAAI,EAAGA,EAAI,MAAOA,EACzBwX,EAAUpX,MAAMJ,EAAI,KAAOsH,SAAS,IAAIuC,OAAO,IAoBjD,QAjBA,SAAmBpH,GACjB,IAAI8G,EAAS/B,UAAUtE,OAAS,QAAsB0D,IAAjBY,UAAU,GAAmBA,UAAU,GAAK,EAG7EgP,GAAQgB,EAAU/U,EAAI8G,EAAS,IAAMiO,EAAU/U,EAAI8G,EAAS,IAAMiO,EAAU/U,EAAI8G,EAAS,IAAMiO,EAAU/U,EAAI8G,EAAS,IAAM,IAAMiO,EAAU/U,EAAI8G,EAAS,IAAMiO,EAAU/U,EAAI8G,EAAS,IAAM,IAAMiO,EAAU/U,EAAI8G,EAAS,IAAMiO,EAAU/U,EAAI8G,EAAS,IAAM,IAAMiO,EAAU/U,EAAI8G,EAAS,IAAMiO,EAAU/U,EAAI8G,EAAS,IAAM,IAAMiO,EAAU/U,EAAI8G,EAAS,KAAOiO,EAAU/U,EAAI8G,EAAS,KAAOiO,EAAU/U,EAAI8G,EAAS,KAAOiO,EAAU/U,EAAI8G,EAAS,KAAOiO,EAAU/U,EAAI8G,EAAS,KAAOiO,EAAU/U,EAAI8G,EAAS,MAAM3B,cAMzf,IAAK,EAAS4O,GACZ,MAAMvR,UAAU,+BAGlB,OAAOuR,GCpBT,IAAIiB,EAEAC,EAGAC,EAAa,EACbC,EAAa,EAkFjB,QAhFA,SAAYC,EAASjT,EAAK2E,GACxB,IAAIvJ,EAAI4E,GAAO2E,GAAU,EACrB/C,EAAI5B,GAAO,IAAIjB,MAAM,IAErBmU,GADJD,EAAUA,GAAW,IACFC,MAAQL,EACvBM,OAAgCnR,IAArBiR,EAAQE,SAAyBF,EAAQE,SAAWL,EAInE,GAAY,MAARI,GAA4B,MAAZC,EAAkB,CACpC,IAAIC,EAAYH,EAAQI,SAAWJ,EAAQT,KAAOA,KAEtC,MAARU,IAEFA,EAAOL,EAAU,CAAgB,EAAfO,EAAU,GAAWA,EAAU,GAAIA,EAAU,GAAIA,EAAU,GAAIA,EAAU,GAAIA,EAAU,KAG3F,MAAZD,IAEFA,EAAWL,EAAiD,OAApCM,EAAU,IAAM,EAAIA,EAAU,KAQ1D,IAAIE,OAA0BtR,IAAlBiR,EAAQK,MAAsBL,EAAQK,MAAQC,KAAKC,MAG3DC,OAA0BzR,IAAlBiR,EAAQQ,MAAsBR,EAAQQ,MAAQT,EAAa,EAEnEU,EAAKJ,EAAQP,GAAcU,EAAQT,GAAc,IAarD,GAXIU,EAAK,QAA0B1R,IAArBiR,EAAQE,WACpBA,EAAWA,EAAW,EAAI,QAKvBO,EAAK,GAAKJ,EAAQP,SAAiC/Q,IAAlBiR,EAAQQ,QAC5CA,EAAQ,GAINA,GAAS,IACX,MAAM,IAAIxU,MAAM,mDAGlB8T,EAAaO,EACbN,EAAaS,EACbX,EAAYK,EAIZ,IAAIQ,GAA4B,KAAb,WAFnBL,GAAS,cAE+BG,GAAS,WACjD7R,EAAExG,KAAOuY,IAAO,GAAK,IACrB/R,EAAExG,KAAOuY,IAAO,GAAK,IACrB/R,EAAExG,KAAOuY,IAAO,EAAI,IACpB/R,EAAExG,KAAY,IAALuY,EAET,IAAIC,EAAMN,EAAQ,WAAc,IAAQ,UACxC1R,EAAExG,KAAOwY,IAAQ,EAAI,IACrBhS,EAAExG,KAAa,IAANwY,EAEThS,EAAExG,KAAOwY,IAAQ,GAAK,GAAM,GAE5BhS,EAAExG,KAAOwY,IAAQ,GAAK,IAEtBhS,EAAExG,KAAO+X,IAAa,EAAI,IAE1BvR,EAAExG,KAAkB,IAAX+X,EAET,IAAK,IAAI1P,EAAI,EAAGA,EAAI,IAAKA,EACvB7B,EAAExG,EAAIqI,GAAKyP,EAAKzP,GAGlB,OAAOzD,GAAO,EAAU4B,ICzD1B,EAhCA,SAAegQ,GACb,IAAK,EAASA,GACZ,MAAMvR,UAAU,gBAGlB,IAAIwT,EACAhW,EAAM,IAAIiB,WAAW,IAuBzB,OArBAjB,EAAI,IAAMgW,EAAI7O,SAAS4M,EAAK9Q,MAAM,EAAG,GAAI,OAAS,GAClDjD,EAAI,GAAKgW,IAAM,GAAK,IACpBhW,EAAI,GAAKgW,IAAM,EAAI,IACnBhW,EAAI,GAAS,IAAJgW,EAEThW,EAAI,IAAMgW,EAAI7O,SAAS4M,EAAK9Q,MAAM,EAAG,IAAK,OAAS,EACnDjD,EAAI,GAAS,IAAJgW,EAEThW,EAAI,IAAMgW,EAAI7O,SAAS4M,EAAK9Q,MAAM,GAAI,IAAK,OAAS,EACpDjD,EAAI,GAAS,IAAJgW,EAEThW,EAAI,IAAMgW,EAAI7O,SAAS4M,EAAK9Q,MAAM,GAAI,IAAK,OAAS,EACpDjD,EAAI,GAAS,IAAJgW,EAGThW,EAAI,KAAOgW,EAAI7O,SAAS4M,EAAK9Q,MAAM,GAAI,IAAK,KAAO,cAAgB,IACnEjD,EAAI,IAAMgW,EAAI,WAAc,IAC5BhW,EAAI,IAAMgW,IAAM,GAAK,IACrBhW,EAAI,IAAMgW,IAAM,GAAK,IACrBhW,EAAI,IAAMgW,IAAM,EAAI,IACpBhW,EAAI,IAAU,IAAJgW,EACHhW,GCdM,SAAS,EAACsR,EAAM2E,EAASC,GACtC,SAASC,EAAaxT,EAAOyT,EAAWjU,EAAK2E,GAS3C,GARqB,iBAAVnE,IACTA,EAjBN,SAAuB6E,GACrBA,EAAM6O,SAASC,mBAAmB9O,IAIlC,IAFA,IAAIkE,EAAQ,GAEHnO,EAAI,EAAGA,EAAIiK,EAAI/G,SAAUlD,EAChCmO,EAAM/N,KAAK6J,EAAIlH,WAAW/C,IAG5B,OAAOmO,EAQK6K,CAAc5T,IAGC,iBAAdyT,IACTA,EAAY,EAAMA,IAGK,KAArBA,EAAU3V,OACZ,MAAM+B,UAAU,oEAMlB,IAAIkJ,EAAQ,IAAIzK,WAAW,GAAK0B,EAAMlC,QAOtC,GANAiL,EAAMtB,IAAIgM,GACV1K,EAAMtB,IAAIzH,EAAOyT,EAAU3V,SAC3BiL,EAAQwK,EAASxK,IACX,GAAgB,GAAXA,EAAM,GAAYuK,EAC7BvK,EAAM,GAAgB,GAAXA,EAAM,GAAY,IAEzBvJ,EAAK,CACP2E,EAASA,GAAU,EAEnB,IAAK,IAAIvJ,EAAI,EAAGA,EAAI,KAAMA,EACxB4E,EAAI2E,EAASvJ,GAAKmO,EAAMnO,GAG1B,OAAO4E,EAGT,OAAO,EAAUuJ,GAInB,IACEyK,EAAa7E,KAAOA,EACpB,MAAOkF,IAKT,OAFAL,EAAaM,IA7CE,uCA8CfN,EAAaO,IA7CE,uCA8CRP,ECNT,SAASQ,EAAgBC,GACvB,OAAwC,IAAhCA,EAAe,KAAO,GAAK,GAAU,EAuH/C,SAASC,EAAQ5Z,EAAGC,GAClB,IAAI4Z,GAAW,MAAJ7Z,IAAmB,MAAJC,GAE1B,OADWD,GAAK,KAAOC,GAAK,KAAO4Z,GAAO,KAC5B,GAAW,MAANA,EAerB,SAASC,EAAOC,EAAGhN,EAAGjG,EAAG9G,EAAGwW,EAAGwD,GAC7B,OAAOJ,GATcvV,EASQuV,EAAQA,EAAQ7M,EAAGgN,GAAIH,EAAQ5Z,EAAGga,OATrCC,EAS0CzD,GARhDnS,IAAQ,GAAK4V,EAQuCnT,GAT1E,IAAuBzC,EAAK4V,EAY5B,SAASC,EAAMnN,EAAGjG,EAAGvG,EAAGgW,EAAGvW,EAAGwW,EAAGwD,GAC/B,OAAOF,EAAOhT,EAAIvG,GAAKuG,EAAIyP,EAAGxJ,EAAGjG,EAAG9G,EAAGwW,EAAGwD,GAG5C,SAASG,EAAMpN,EAAGjG,EAAGvG,EAAGgW,EAAGvW,EAAGwW,EAAGwD,GAC/B,OAAOF,EAAOhT,EAAIyP,EAAIhW,GAAKgW,EAAGxJ,EAAGjG,EAAG9G,EAAGwW,EAAGwD,GAG5C,SAASI,EAAMrN,EAAGjG,EAAGvG,EAAGgW,EAAGvW,EAAGwW,EAAGwD,GAC/B,OAAOF,EAAOhT,EAAIvG,EAAIgW,EAAGxJ,EAAGjG,EAAG9G,EAAGwW,EAAGwD,GAGvC,SAASK,EAAMtN,EAAGjG,EAAGvG,EAAGgW,EAAGvW,EAAGwW,EAAGwD,GAC/B,OAAOF,EAAOvZ,GAAKuG,GAAKyP,GAAIxJ,EAAGjG,EAAG9G,EAAGwW,EAAGwD,GAG1C,MCnNA,EADSM,EAAI,KAAM,IDkBnB,SAAa7L,GACX,GAAqB,iBAAVA,EAAoB,CAC7B,IAAIuG,EAAMoE,SAASC,mBAAmB5K,IAEtCA,EAAQ,IAAIzK,WAAWgR,EAAIxR,QAE3B,IAAK,IAAIlD,EAAI,EAAGA,EAAI0U,EAAIxR,SAAUlD,EAChCmO,EAAMnO,GAAK0U,EAAI3R,WAAW/C,GAI9B,OAOF,SAA8ByU,GAK5B,IAJA,IAAIzQ,EAAS,GACTiW,EAA0B,GAAfxF,EAAMvR,OACjBgX,EAAS,mBAEJla,EAAI,EAAGA,EAAIia,EAAUja,GAAK,EAAG,CACpC,IAAIN,EAAI+U,EAAMzU,GAAK,KAAOA,EAAI,GAAK,IAC/Bma,EAAMvQ,SAASsQ,EAAOE,OAAO1a,IAAM,EAAI,IAAQwa,EAAOE,OAAW,GAAJ1a,GAAW,IAC5EsE,EAAO5D,KAAK+Z,GAGd,OAAOnW,EAlBAqW,CAiCT,SAAoB3a,EAAGmD,GAErBnD,EAAEmD,GAAO,IAAM,KAAQA,EAAM,GAC7BnD,EAAE0Z,EAAgBvW,GAAO,GAAKA,EAM9B,IALA,IAAI4J,EAAI,WACJjG,GAAK,UACLvG,GAAK,WACLgW,EAAI,UAECjW,EAAI,EAAGA,EAAIN,EAAEwD,OAAQlD,GAAK,GAAI,CACrC,IAAIsa,EAAO7N,EACP8N,EAAO/T,EACPgU,EAAOva,EACPwa,EAAOxE,EACXxJ,EAAImN,EAAMnN,EAAGjG,EAAGvG,EAAGgW,EAAGvW,EAAEM,GAAI,GAAI,WAChCiW,EAAI2D,EAAM3D,EAAGxJ,EAAGjG,EAAGvG,EAAGP,EAAEM,EAAI,GAAI,IAAK,WACrCC,EAAI2Z,EAAM3Z,EAAGgW,EAAGxJ,EAAGjG,EAAG9G,EAAEM,EAAI,GAAI,GAAI,WACpCwG,EAAIoT,EAAMpT,EAAGvG,EAAGgW,EAAGxJ,EAAG/M,EAAEM,EAAI,GAAI,IAAK,YACrCyM,EAAImN,EAAMnN,EAAGjG,EAAGvG,EAAGgW,EAAGvW,EAAEM,EAAI,GAAI,GAAI,WACpCiW,EAAI2D,EAAM3D,EAAGxJ,EAAGjG,EAAGvG,EAAGP,EAAEM,EAAI,GAAI,GAAI,YACpCC,EAAI2Z,EAAM3Z,EAAGgW,EAAGxJ,EAAGjG,EAAG9G,EAAEM,EAAI,GAAI,IAAK,YACrCwG,EAAIoT,EAAMpT,EAAGvG,EAAGgW,EAAGxJ,EAAG/M,EAAEM,EAAI,GAAI,IAAK,UACrCyM,EAAImN,EAAMnN,EAAGjG,EAAGvG,EAAGgW,EAAGvW,EAAEM,EAAI,GAAI,EAAG,YACnCiW,EAAI2D,EAAM3D,EAAGxJ,EAAGjG,EAAGvG,EAAGP,EAAEM,EAAI,GAAI,IAAK,YACrCC,EAAI2Z,EAAM3Z,EAAGgW,EAAGxJ,EAAGjG,EAAG9G,EAAEM,EAAI,IAAK,IAAK,OACtCwG,EAAIoT,EAAMpT,EAAGvG,EAAGgW,EAAGxJ,EAAG/M,EAAEM,EAAI,IAAK,IAAK,YACtCyM,EAAImN,EAAMnN,EAAGjG,EAAGvG,EAAGgW,EAAGvW,EAAEM,EAAI,IAAK,EAAG,YACpCiW,EAAI2D,EAAM3D,EAAGxJ,EAAGjG,EAAGvG,EAAGP,EAAEM,EAAI,IAAK,IAAK,UACtCC,EAAI2Z,EAAM3Z,EAAGgW,EAAGxJ,EAAGjG,EAAG9G,EAAEM,EAAI,IAAK,IAAK,YAEtCyM,EAAIoN,EAAMpN,EADVjG,EAAIoT,EAAMpT,EAAGvG,EAAGgW,EAAGxJ,EAAG/M,EAAEM,EAAI,IAAK,GAAI,YACrBC,EAAGgW,EAAGvW,EAAEM,EAAI,GAAI,GAAI,WACpCiW,EAAI4D,EAAM5D,EAAGxJ,EAAGjG,EAAGvG,EAAGP,EAAEM,EAAI,GAAI,GAAI,YACpCC,EAAI4Z,EAAM5Z,EAAGgW,EAAGxJ,EAAGjG,EAAG9G,EAAEM,EAAI,IAAK,GAAI,WACrCwG,EAAIqT,EAAMrT,EAAGvG,EAAGgW,EAAGxJ,EAAG/M,EAAEM,GAAI,IAAK,WACjCyM,EAAIoN,EAAMpN,EAAGjG,EAAGvG,EAAGgW,EAAGvW,EAAEM,EAAI,GAAI,GAAI,WACpCiW,EAAI4D,EAAM5D,EAAGxJ,EAAGjG,EAAGvG,EAAGP,EAAEM,EAAI,IAAK,EAAG,UACpCC,EAAI4Z,EAAM5Z,EAAGgW,EAAGxJ,EAAGjG,EAAG9G,EAAEM,EAAI,IAAK,IAAK,WACtCwG,EAAIqT,EAAMrT,EAAGvG,EAAGgW,EAAGxJ,EAAG/M,EAAEM,EAAI,GAAI,IAAK,WACrCyM,EAAIoN,EAAMpN,EAAGjG,EAAGvG,EAAGgW,EAAGvW,EAAEM,EAAI,GAAI,EAAG,WACnCiW,EAAI4D,EAAM5D,EAAGxJ,EAAGjG,EAAGvG,EAAGP,EAAEM,EAAI,IAAK,GAAI,YACrCC,EAAI4Z,EAAM5Z,EAAGgW,EAAGxJ,EAAGjG,EAAG9G,EAAEM,EAAI,GAAI,IAAK,WACrCwG,EAAIqT,EAAMrT,EAAGvG,EAAGgW,EAAGxJ,EAAG/M,EAAEM,EAAI,GAAI,GAAI,YACpCyM,EAAIoN,EAAMpN,EAAGjG,EAAGvG,EAAGgW,EAAGvW,EAAEM,EAAI,IAAK,GAAI,YACrCiW,EAAI4D,EAAM5D,EAAGxJ,EAAGjG,EAAGvG,EAAGP,EAAEM,EAAI,GAAI,GAAI,UACpCC,EAAI4Z,EAAM5Z,EAAGgW,EAAGxJ,EAAGjG,EAAG9G,EAAEM,EAAI,GAAI,GAAI,YAEpCyM,EAAIqN,EAAMrN,EADVjG,EAAIqT,EAAMrT,EAAGvG,EAAGgW,EAAGxJ,EAAG/M,EAAEM,EAAI,IAAK,IAAK,YACtBC,EAAGgW,EAAGvW,EAAEM,EAAI,GAAI,GAAI,QACpCiW,EAAI6D,EAAM7D,EAAGxJ,EAAGjG,EAAGvG,EAAGP,EAAEM,EAAI,GAAI,IAAK,YACrCC,EAAI6Z,EAAM7Z,EAAGgW,EAAGxJ,EAAGjG,EAAG9G,EAAEM,EAAI,IAAK,GAAI,YACrCwG,EAAIsT,EAAMtT,EAAGvG,EAAGgW,EAAGxJ,EAAG/M,EAAEM,EAAI,IAAK,IAAK,UACtCyM,EAAIqN,EAAMrN,EAAGjG,EAAGvG,EAAGgW,EAAGvW,EAAEM,EAAI,GAAI,GAAI,YACpCiW,EAAI6D,EAAM7D,EAAGxJ,EAAGjG,EAAGvG,EAAGP,EAAEM,EAAI,GAAI,GAAI,YACpCC,EAAI6Z,EAAM7Z,EAAGgW,EAAGxJ,EAAGjG,EAAG9G,EAAEM,EAAI,GAAI,IAAK,WACrCwG,EAAIsT,EAAMtT,EAAGvG,EAAGgW,EAAGxJ,EAAG/M,EAAEM,EAAI,IAAK,IAAK,YACtCyM,EAAIqN,EAAMrN,EAAGjG,EAAGvG,EAAGgW,EAAGvW,EAAEM,EAAI,IAAK,EAAG,WACpCiW,EAAI6D,EAAM7D,EAAGxJ,EAAGjG,EAAGvG,EAAGP,EAAEM,GAAI,IAAK,WACjCC,EAAI6Z,EAAM7Z,EAAGgW,EAAGxJ,EAAGjG,EAAG9G,EAAEM,EAAI,GAAI,IAAK,WACrCwG,EAAIsT,EAAMtT,EAAGvG,EAAGgW,EAAGxJ,EAAG/M,EAAEM,EAAI,GAAI,GAAI,UACpCyM,EAAIqN,EAAMrN,EAAGjG,EAAGvG,EAAGgW,EAAGvW,EAAEM,EAAI,GAAI,GAAI,WACpCiW,EAAI6D,EAAM7D,EAAGxJ,EAAGjG,EAAGvG,EAAGP,EAAEM,EAAI,IAAK,IAAK,WACtCC,EAAI6Z,EAAM7Z,EAAGgW,EAAGxJ,EAAGjG,EAAG9G,EAAEM,EAAI,IAAK,GAAI,WAErCyM,EAAIsN,EAAMtN,EADVjG,EAAIsT,EAAMtT,EAAGvG,EAAGgW,EAAGxJ,EAAG/M,EAAEM,EAAI,GAAI,IAAK,WACrBC,EAAGgW,EAAGvW,EAAEM,GAAI,GAAI,WAChCiW,EAAI8D,EAAM9D,EAAGxJ,EAAGjG,EAAGvG,EAAGP,EAAEM,EAAI,GAAI,GAAI,YACpCC,EAAI8Z,EAAM9Z,EAAGgW,EAAGxJ,EAAGjG,EAAG9G,EAAEM,EAAI,IAAK,IAAK,YACtCwG,EAAIuT,EAAMvT,EAAGvG,EAAGgW,EAAGxJ,EAAG/M,EAAEM,EAAI,GAAI,IAAK,UACrCyM,EAAIsN,EAAMtN,EAAGjG,EAAGvG,EAAGgW,EAAGvW,EAAEM,EAAI,IAAK,EAAG,YACpCiW,EAAI8D,EAAM9D,EAAGxJ,EAAGjG,EAAGvG,EAAGP,EAAEM,EAAI,GAAI,IAAK,YACrCC,EAAI8Z,EAAM9Z,EAAGgW,EAAGxJ,EAAGjG,EAAG9G,EAAEM,EAAI,IAAK,IAAK,SACtCwG,EAAIuT,EAAMvT,EAAGvG,EAAGgW,EAAGxJ,EAAG/M,EAAEM,EAAI,GAAI,IAAK,YACrCyM,EAAIsN,EAAMtN,EAAGjG,EAAGvG,EAAGgW,EAAGvW,EAAEM,EAAI,GAAI,EAAG,YACnCiW,EAAI8D,EAAM9D,EAAGxJ,EAAGjG,EAAGvG,EAAGP,EAAEM,EAAI,IAAK,IAAK,UACtCC,EAAI8Z,EAAM9Z,EAAGgW,EAAGxJ,EAAGjG,EAAG9G,EAAEM,EAAI,GAAI,IAAK,YACrCwG,EAAIuT,EAAMvT,EAAGvG,EAAGgW,EAAGxJ,EAAG/M,EAAEM,EAAI,IAAK,GAAI,YACrCyM,EAAIsN,EAAMtN,EAAGjG,EAAGvG,EAAGgW,EAAGvW,EAAEM,EAAI,GAAI,GAAI,WACpCiW,EAAI8D,EAAM9D,EAAGxJ,EAAGjG,EAAGvG,EAAGP,EAAEM,EAAI,IAAK,IAAK,YACtCC,EAAI8Z,EAAM9Z,EAAGgW,EAAGxJ,EAAGjG,EAAG9G,EAAEM,EAAI,GAAI,GAAI,WACpCwG,EAAIuT,EAAMvT,EAAGvG,EAAGgW,EAAGxJ,EAAG/M,EAAEM,EAAI,GAAI,IAAK,WACrCyM,EAAI6M,EAAQ7M,EAAG6N,GACf9T,EAAI8S,EAAQ9S,EAAG+T,GACfta,EAAIqZ,EAAQrZ,EAAGua,GACfvE,EAAIqD,EAAQrD,EAAGwE,GAGjB,MAAO,CAAChO,EAAGjG,EAAGvG,EAAGgW,GArHWyE,CA6H9B,SAAsBjG,GACpB,GAAqB,IAAjBA,EAAMvR,OACR,MAAO,GAMT,IAHA,IAAIyX,EAAyB,EAAflG,EAAMvR,OAChBc,EAAS,IAAI4W,YAAYxB,EAAgBuB,IAEpC3a,EAAI,EAAGA,EAAI2a,EAAS3a,GAAK,EAChCgE,EAAOhE,GAAK,KAAsB,IAAfyU,EAAMzU,EAAI,KAAcA,EAAI,GAGjD,OAAOgE,EAzIgC6W,CAAa1M,GAAuB,EAAfA,EAAMjL,YERpE,EApBA,SAAY2U,EAASjT,EAAK2E,GAExB,IAAIuR,GADJjD,EAAUA,GAAW,IACFI,SAAWJ,EAAQT,KAAOA,KAK7C,GAHA0D,EAAK,GAAe,GAAVA,EAAK,GAAY,GAC3BA,EAAK,GAAe,GAAVA,EAAK,GAAY,IAEvBlW,EAAK,CACP2E,EAASA,GAAU,EAEnB,IAAK,IAAIvJ,EAAI,EAAGA,EAAI,KAAMA,EACxB4E,EAAI2E,EAASvJ,GAAK8a,EAAK9a,GAGzB,OAAO4E,EAGT,OAAO,EAAUkW,IClBnB,SAASC,EAAE7E,EAAGxW,EAAGC,EAAGqb,GAClB,OAAQ9E,GACN,KAAK,EACH,OAAOxW,EAAIC,GAAKD,EAAIsb,EAEtB,KAAK,EAML,KAAK,EACH,OAAOtb,EAAIC,EAAIqb,EAJjB,KAAK,EACH,OAAOtb,EAAIC,EAAID,EAAIsb,EAAIrb,EAAIqb,GAOjC,SAASC,EAAKvb,EAAG2I,GACf,OAAO3I,GAAK2I,EAAI3I,IAAM,GAAK2I,EA4E7B,MC5FA,EADS2R,EAAI,KAAM,IDoBnB,SAAc7L,GACZ,IAAI+M,EAAI,CAAC,WAAY,WAAY,WAAY,YACzCC,EAAI,CAAC,WAAY,WAAY,WAAY,UAAY,YAEzD,GAAqB,iBAAVhN,EAAoB,CAC7B,IAAIuG,EAAMoE,SAASC,mBAAmB5K,IAEtCA,EAAQ,GAER,IAAK,IAAInO,EAAI,EAAGA,EAAI0U,EAAIxR,SAAUlD,EAChCmO,EAAM/N,KAAKsU,EAAI3R,WAAW/C,SAElB2D,MAAMoD,QAAQoH,KAExBA,EAAQxK,MAAM5F,UAAU2H,MAAMiD,KAAKwF,IAGrCA,EAAM/N,KAAK,KAKX,IAJA,IAAIgb,EAAIjN,EAAMjL,OAAS,EAAI,EACvBmY,EAAI3Q,KAAK4Q,KAAKF,EAAI,IAClBG,EAAI,IAAI5X,MAAM0X,GAETG,EAAK,EAAGA,EAAKH,IAAKG,EAAI,CAG7B,IAFA,IAAI/Y,EAAM,IAAImY,YAAY,IAEjBvR,EAAI,EAAGA,EAAI,KAAMA,EACxB5G,EAAI4G,GAAK8E,EAAW,GAALqN,EAAc,EAAJnS,IAAU,GAAK8E,EAAW,GAALqN,EAAc,EAAJnS,EAAQ,IAAM,GAAK8E,EAAW,GAALqN,EAAc,EAAJnS,EAAQ,IAAM,EAAI8E,EAAW,GAALqN,EAAc,EAAJnS,EAAQ,GAGvIkS,EAAEC,GAAM/Y,EAGV8Y,EAAEF,EAAI,GAAG,IAA2B,GAApBlN,EAAMjL,OAAS,GAASwH,KAAK8F,IAAI,EAAG,IACpD+K,EAAEF,EAAI,GAAG,IAAM3Q,KAAK6J,MAAMgH,EAAEF,EAAI,GAAG,KACnCE,EAAEF,EAAI,GAAG,IAA2B,GAApBlN,EAAMjL,OAAS,GAAS,WAExC,IAAK,IAAIuY,EAAM,EAAGA,EAAMJ,IAAKI,EAAK,CAGhC,IAFA,IAAIC,EAAI,IAAId,YAAY,IAEflB,EAAI,EAAGA,EAAI,KAAMA,EACxBgC,EAAEhC,GAAK6B,EAAEE,GAAK/B,GAGhB,IAAK,IAAIiC,EAAK,GAAIA,EAAK,KAAMA,EAC3BD,EAAEC,GAAMV,EAAKS,EAAEC,EAAK,GAAKD,EAAEC,EAAK,GAAKD,EAAEC,EAAK,IAAMD,EAAEC,EAAK,IAAK,GAShE,IANA,IAAIlP,EAAI0O,EAAE,GACN3U,EAAI2U,EAAE,GACNlb,EAAIkb,EAAE,GACNlF,EAAIkF,EAAE,GACNtP,EAAIsP,EAAE,GAEDS,EAAM,EAAGA,EAAM,KAAMA,EAAK,CACjC,IAAI1F,EAAIxL,KAAK6J,MAAMqH,EAAM,IACrBC,EAAIZ,EAAKxO,EAAG,GAAKsO,EAAE7E,EAAG1P,EAAGvG,EAAGgW,GAAKpK,EAAIqP,EAAEhF,GAAKwF,EAAEE,KAAS,EAC3D/P,EAAIoK,EACJA,EAAIhW,EACJA,EAAIgb,EAAKzU,EAAG,MAAQ,EACpBA,EAAIiG,EACJA,EAAIoP,EAGNV,EAAE,GAAKA,EAAE,GAAK1O,IAAM,EACpB0O,EAAE,GAAKA,EAAE,GAAK3U,IAAM,EACpB2U,EAAE,GAAKA,EAAE,GAAKlb,IAAM,EACpBkb,EAAE,GAAKA,EAAE,GAAKlF,IAAM,EACpBkF,EAAE,GAAKA,EAAE,GAAKtP,IAAM,EAGtB,MAAO,CAACsP,EAAE,IAAM,GAAK,IAAMA,EAAE,IAAM,GAAK,IAAMA,EAAE,IAAM,EAAI,IAAa,IAAPA,EAAE,GAAWA,EAAE,IAAM,GAAK,IAAMA,EAAE,IAAM,GAAK,IAAMA,EAAE,IAAM,EAAI,IAAa,IAAPA,EAAE,GAAWA,EAAE,IAAM,GAAK,IAAMA,EAAE,IAAM,GAAK,IAAMA,EAAE,IAAM,EAAI,IAAa,IAAPA,EAAE,GAAWA,EAAE,IAAM,GAAK,IAAMA,EAAE,IAAM,GAAK,IAAMA,EAAE,IAAM,EAAI,IAAa,IAAPA,EAAE,GAAWA,EAAE,IAAM,GAAK,IAAMA,EAAE,IAAM,GAAK,IAAMA,EAAE,IAAM,EAAI,IAAa,IAAPA,EAAE,OE5FxV,yCCUA,EARA,SAAiB3E,GACf,IAAK,EAASA,GACZ,MAAMvR,UAAU,gBAGlB,OAAO2E,SAAS4M,EAAK3M,OAAO,GAAI,GAAI,2BCPtClN,EAAOD,QAAUM,ICCb8e,EAA2B,GAG/B,SAASC,EAAoBC,GAE5B,IAAIC,EAAeH,EAAyBE,GAC5C,QAAqBpV,IAAjBqV,EACH,OAAOA,EAAavf,QAGrB,IAAIC,EAASmf,EAAyBE,GAAY,CAGjDtf,QAAS,IAOV,OAHAwf,EAAoBF,GAAUrf,EAAQA,EAAOD,QAASqf,GAG/Cpf,EAAOD,QCpBfqf,EAAoB1T,EAAK1L,IACxB,IAAIwf,EAASxf,GAAUA,EAAOyf,WAC7B,IAAOzf,EAAiB,QACxB,IAAM,EAEP,OADAof,EAAoB9F,EAAEkG,EAAQ,CAAE1P,EAAG0P,IAC5BA,GCLRJ,EAAoB9F,EAAI,CAACvZ,EAAS2f,KACjC,IAAI,IAAIC,KAAOD,EACXN,EAAoBQ,EAAEF,EAAYC,KAASP,EAAoBQ,EAAE7f,EAAS4f,IAC5EzX,OAAOoH,eAAevP,EAAS4f,EAAK,CAAEpQ,YAAY,EAAMC,IAAKkQ,EAAWC,MCJ3EP,EAAoBS,EAAI,WACvB,GAA0B,iBAAfC,WAAyB,OAAOA,WAC3C,IACC,OAAOvf,MAAQ,IAAIwf,SAAS,cAAb,GACd,MAAO7Q,GACR,GAAsB,iBAAX8Q,OAAqB,OAAOA,QALjB,GCAxBZ,EAAoBQ,EAAI,CAAC9V,EAAKmW,IAAU/X,OAAO9G,UAAU8e,eAAelU,KAAKlC,EAAKmW,GCClFb,EAAoBe,EAAKpgB,IACH,oBAAX0H,QAA0BA,OAAO2Y,aAC1ClY,OAAOoH,eAAevP,EAAS0H,OAAO2Y,YAAa,CAAE3X,MAAO,WAE7DP,OAAOoH,eAAevP,EAAS,aAAc,CAAE0I,OAAO,WCLvD,IAAI4X,EACAjB,EAAoBS,EAAES,gBAAeD,EAAYjB,EAAoBS,EAAEU,SAAW,IACtF,IAAIC,EAAWpB,EAAoBS,EAAEW,SACrC,IAAKH,GAAaG,IACbA,EAASC,gBACZJ,EAAYG,EAASC,cAAcjI,MAC/B6H,GAAW,CACf,IAAIK,EAAUF,EAASG,qBAAqB,UACzCD,EAAQna,SAAQ8Z,EAAYK,EAAQA,EAAQna,OAAS,GAAGiS,KAK7D,IAAK6H,EAAW,MAAM,IAAInZ,MAAM,yDAChCmZ,EAAYA,EAAU3P,QAAQ,OAAQ,IAAIA,QAAQ,QAAS,IAAIA,QAAQ,YAAa,KACpF0O,EAAoBwB,EAAIP,yMCfxB,QAAe,IAA0B,uCCMlC,SAASQ,EAAYC,EAAMC,GAC9B,IASIC,EACAC,EAVAC,GAAoB,EAEpBC,EAAMC,EAAAA,OACNC,EAAc,KACdC,EAAc,QAEdC,EAAa,KACbC,EAAc,KAqDlB,MAhDoB,mBAATT,EACPC,EAAeD,GAGfC,GADAD,EAAOA,GAAQ,IACKU,OACpBR,EAAgBF,EAAKW,SAGrB,gBAAiBX,IACjBM,EAAcN,EAAI,aAElB,QAASA,IAETQ,EAAaR,EAAK9Q,KAGlB,gBAAiB8Q,IACjBO,EAAcP,EAAKO,aAGnB,gBAAiBP,IACjBS,EAAcT,EAAKS,aAIvBG,IAAAA,UAAa,oBAAsBR,GAAK9W,KAAK,CAAC,IACzCuX,QACAC,OAAO,OACPC,QAAQ,mBAAmB,GAC3BA,QAAQ,mBAAqBX,GAAK,GAGvCQ,IAAAA,OAAU,QAAQI,GAAG,yBAA2BZ,GAAK,WAC7CD,EACAA,GAAoB,GAGzB9R,QAAQuK,IAAI,oBAEXgI,IAAAA,OAAU,oBAAsBR,GAAKa,MAAM,UAAW,QACvDV,EAAc,QAETL,GACAA,QAKD,SAAS5W,EAAM4X,GAC2B,IADpBC,EACoB,wDACzCC,EAAM5hB,KAEN6hB,EAAW,KACXC,EAAc9hB,KAGd6hB,EADe,MAAff,EACWM,IAAAA,MAASphB,MAETohB,IAAAA,MAASN,GAIxB,IAAIiB,EAAmB,KAEvBpB,EAAoBgB,EAEpBP,IAAAA,UAAa,oBAAsBR,GAAKoB,KAAK,IAC7C,IAAIvS,EAAO2R,IAAAA,UAAa,oBAAsBR,GACzCY,GAAG,eAAe,SAASzI,GACxBlK,QAAQuK,IAAI,sBACZgI,IAAAA,OAAU,oBAAsBR,GAAKa,MAAM,UAAW,QACtDV,EAAc,QAEdK,IAAAA,MAAAA,iBACAA,IAAAA,MAAAA,qBAEHE,OAAO,MAoIZ,GAlIA7R,EAAKwS,UAAU,MAAMnY,KAAqB,mBAATyW,EAAsBA,EAAKzW,GAAQyW,GAAMc,QACrEC,OAAO,MACPY,KAAK,SAAS,SAASnJ,GACpBlK,QAAQuK,IAAI,KAAML,GAClB,IAAIjI,EAAM,GAaV,OAZIiI,EAAEoJ,UACFrR,GAAO,eAEPiI,EAAEqJ,WACFtR,GAAO,gBAENiI,EAAEsJ,SACHvR,GAAO,cAEP,aAAciI,IACdjI,GAAO,8BAEJA,KAEVkR,MAAK,SAASjJ,GACX,OAAIA,EAAEoJ,QACK,QAENpJ,EAAEuJ,OACHzT,QAAQC,MAAM,+DAES,iBAAZiK,EAAEuJ,MAAsBvJ,EAAEuJ,MAAQvJ,EAAEuJ,MAAMxY,OAE5D0X,GAAG,SAAS,SAASzI,EAAGjW,GACjBiW,EAAEqJ,UACDrJ,EAAEsJ,SACPtJ,EAAEsJ,OAAOT,EAAK9X,EAAM4X,EAAOG,GAC3BhT,QAAQuK,IAAI,eAGZgI,IAAAA,UAAa,oBAAoBK,MAAM,UAAW,QAClDV,EAAc,QAEVL,GACAA,QAGPc,GAAG,cAAc,SAASzI,EAAGjW,GAI1B,GAHAse,IAAAA,OAAUphB,MACLuhB,QAAQ,4BAA4B,GAEjB,MAApBQ,EAA0B,CAQ1B,GAJAX,IAAAA,OAAU,oBAAsBR,GAC3BqB,UAAU,MACVV,QAAQ,4BAA4B,QAEhB,IAAdxI,EAAEwJ,SAOT,OANA1T,QAAQuK,IAAI,qBAEZgI,IAAAA,OAAU,oBAAsBW,GAC/BN,MAAM,UAAW,aAElBM,EAAmB,MAIvB,GAAIhJ,EAAEyJ,UAAYT,EAEd,OAIAlT,QAAQuK,IAAI,mCAGZgI,IAAAA,OAAU,oBAAsBW,GAC/BN,MAAM,UAAW,QAElBM,EAAmB,KAM3B,QAAyB,IAAdhJ,EAAEwJ,SAAyB,CAClC,IAAIE,EAAeziB,KAAK0iB,wBAEpBC,EAAsB,KAEtBA,EAAsBrC,EAAYvH,EAAEwJ,SADrB,QAAfxB,EAC8C,CAAC,YAAee,EACxD,IAAO,CAAEW,EAAaG,KAAOnD,OAAOoD,YAC9BJ,EAAaK,IAAM,EAAIrD,OAAOsD,aAC1C,YAAe,QAGD,CACI,IAAO,CAAEN,EAAaG,KAAOH,EAAaO,MAAQvD,OAAOoD,YACnDJ,EAAaK,IAAM,EAAIrD,OAAOsD,aACvC,YAAejB,EAClB,YAAe,CAACW,EAAaG,KAAOnD,OAAOoD,YACzCJ,EAAaK,IAAM,EAAIrD,OAAOsD,eAGhDhK,EAAEyJ,SAAWG,EAAoBtU,MAAMrO,KAAM,CAAC8J,EAAKhH,GAAE,EACd,eACvCif,EAAmBhJ,EAAEyJ,SAIzBpB,IAAAA,OAAUphB,MACLuhB,QAAQ,4BAA4B,MAG5CC,GAAG,cAAc,SAASzI,EAAGjW,GAEF,MAApBif,GACAX,IAAAA,OAAUphB,MACLuhB,QAAQ,4BAA4B,MAIjD9R,EAAKwS,UAAU,8BACdX,OAAO,OACPY,KAAK,MAAOe,GACZf,KAAK,QAAS,QACdA,KAAK,SAAU,QACfT,MAAM,WAAY,YAClBA,MAAM,QAAS,OAKhBhB,IACkC,IAA9BA,EAAa3W,EAAM4X,GACnB,OAAOd,EAIf,IAAIsC,EAAuB9B,IAAAA,OAAU,oBAAsBR,GACtDa,MAAM,UAAW,SAEJ,MAAdT,EACAI,IAAAA,OAAU,oBAAsBR,GAC/Ba,MAAM,OAASL,IAAAA,MAAAA,MAAiB,EAAK,MACrCK,MAAM,MAAQL,IAAAA,MAAAA,MAAiB,EAAK,MAErCA,IAAAA,OAAU,oBAAsBR,GAC/Ba,MAAM,OAAQT,EAAW,GAAK,MAC9BS,MAAM,MAAOT,EAAW,GAAK,MAIlC,IAAIyB,EAAeS,EAAqBtI,OAAO8H,wBA2B/C,OAzBID,EAAaG,KAAOH,EAAaO,MAAQvD,OAAO0D,YAA6B,QAAfpC,KAC9DA,EAAc,OAGI,MAAdC,EAEAI,IAAAA,OAAU,oBAAsBR,GAC/Ba,MAAM,OAASL,IAAAA,MAAAA,MAAiB,EAAIqB,EAAaO,MAAS,MAC1DvB,MAAM,MAAQL,IAAAA,MAAAA,MAAiB,EAAK,MAElB,MAAfH,EACAG,IAAAA,OAAU,oBAAsBR,GAC/Ba,MAAM,OAASR,EAAY,GAAKwB,EAAaO,MAAS,MACtDvB,MAAM,MAAOR,EAAY,GAAK,MAE/BG,IAAAA,OAAU,oBAAsBR,GAC/Ba,MAAM,OAAST,EAAW,GAAKyB,EAAaO,MAAS,MACrDvB,MAAM,MAAOT,EAAW,GAAK,OAQtCL,IAGJS,IAAAA,MAAAA,iBACAA,IAAAA,MAAAA,mBAHWR,GCnRnB,IAAIwC,EAAa,SAAS7T,EAAEjG,GAAK,OAAOiG,EAAIjG,GAErC,SAAS+Z,EAAY9T,EAAGjG,GAG7B,GAAIiG,IAAMjG,EAAG,OAAO,EACpB,GAAU,OAANiG,GAAoB,OAANjG,EAAY,OAAO,EACrC,GAAIiG,EAAEvJ,QAAUsD,EAAEtD,OAAQ,OAAO,EAKjC,IAAK,IAAIlD,EAAI,EAAGA,EAAIyM,EAAEvJ,SAAUlD,EAC9B,GAAIyM,EAAEzM,KAAOwG,EAAExG,GAAI,OAAO,EAE5B,OAAO,EAGF,SAASwgB,IACZ,IAAIzjB,EAAOG,KAIXH,EAAK0jB,YAAe,iCAAiCxL,MAAM,IAC3DlY,EAAK2jB,aAAe,iCAAiCzL,MAAM,IAE3DlY,EAAK4jB,gBAAkB,SAASC,GAE5B,IADA,IAAIhW,EAAM,GACD5K,EAAI,EAAGA,EAAI4gB,EAAQ1d,OAAQlD,IAChC4K,EAAIgW,EAAQ5gB,IAAMA,EAEtB,OAAO4K,GAGX7N,EAAK8jB,gBAAkB,SAAyBC,GAQ5C,IALA,IAAIzY,EAAIyY,EAAG,GAIPC,EAAK,IAAIpd,MAAM0E,EAAI,GACfrI,EAAI,EAAGA,GAAKqI,EAAGrI,IAAI,CACvB+gB,EAAG/gB,GAAK,IAAI2D,MAAM0E,EAAI,GACtB,IAAI,IAAIgB,EAAIrJ,EAAGqJ,GAAKhB,EAAGgB,IACvB0X,EAAG/gB,GAAGqJ,GAAK,EAEf,IAAI2X,EAAU,EAGd,IAAQhhB,EAAIqI,EAZD,EAYY,EAAGrI,EAAI,EAAGA,IAEjC,IAAQqJ,EAAIrJ,EAdD,EAcY,EAAGqJ,GAAKhB,EAAGgB,IAAI,CAClC2X,EAAUD,EAAG/gB,GAAGqJ,EAAE,GAElB,IAAI,IAAI+R,EAAI/R,EAjBL,EAiBgB,EAAG+R,GAAKpb,EAAGob,IAC3B0F,EAAG1F,KAAO/R,IAGT2X,EAAUtW,KAAK0C,IAAI4T,GAAW5F,EAAIpb,EAAK+gB,EAAG/gB,GAAGob,EAAE,GAAK,GAAK,GAAM/R,EAAI+R,EAAI,EAAI,EAAK2F,EAAG3F,EAAE,GAAG/R,EAAE,GAAK,KAIvG0X,EAAG/gB,GAAGqJ,GAAK2X,EAKf,OAFAA,EAAUD,EAAG,GAAG1Y,GAET0Y,GAGXhkB,EAAKkkB,yBAA2B,SAASF,EAAIG,GAC3C,IAAIJ,EAAKnd,MAAM4H,MAAM,KACA5H,MAAMod,EAAG7d,SAASie,KAAI,WAAa,OAAO,KAI/D,OADApkB,EAAKqkB,KAAKL,EAAID,EAAII,EAAO,EAAGH,EAAG7d,OAAO,GAC/B4d,GAGT/jB,EAAKqkB,KAAO,SAASL,EAAID,EAAII,EAAOlhB,EAAGqJ,GAErC,IAAI2X,EAAUD,EAAG/gB,GAAGqJ,GAGpB,KAAGA,EAAIrJ,EAAI,EAFA,GAIX,GAAG+gB,EAAG/gB,GAAGqJ,EAAE,IAAM2X,EAAjB,CAKA,IAAI,IAAIvH,EAAIpQ,EATD,EASY,EAAGoQ,GAAKzZ,EAAGyZ,IAChC,GAAIyH,EAAM7X,KAAOoQ,IAGGA,EAAIzZ,EAAK+gB,EAAG/gB,GAAGyZ,EAAE,GAAK,IACtBpQ,EAAIoQ,EAAI,EAAI,EAAKsH,EAAGtH,EAAE,GAAGpQ,EAAE,GAAK,GAEvB,GAAK2X,EAS9B,OAPAF,EAAGrH,GAAKpQ,EACRyX,EAAGzX,GAAKoQ,EAELzZ,EAAIyZ,GACH1c,EAAKqkB,KAAKL,EAAID,EAAII,EAAOlhB,EAAGyZ,EAAI,QAEpC1c,EAAKqkB,KAAKL,EAAID,EAAII,EAAOzH,EAAI,EAAGpQ,EAAI,GAM1C0C,QAAQuK,IAAI,YAActW,EAAI,IAAMqJ,EAAI,+BAzBtCtM,EAAKqkB,KAAKL,EAAID,EAAII,EAAOlhB,EAAGqJ,EAAE,IA6BlCtM,EAAKskB,sBAAwB,SAASC,GAElC,IAAIR,EAAKnd,MAAM4H,MAAM,KAAM,IAAI5H,MAAM2d,EAAWpe,OAAS,IAAIie,IAAI3X,OAAOzL,UAAUwI,QAAQ,GAG1Fua,EAAG,GAAKQ,EAAWpe,OAInB,IADA,IAAI8Q,EAAQ,GACHhU,EAAI,EAAGA,EAAIjD,EAAK0jB,YAAYvd,OAAQlD,IACzCgU,EAAMhU,GAAK,GAIf,IAAIuhB,EAAqBxkB,EAAK4jB,gBAAgB5jB,EAAK0jB,aAC/Ce,EAAsBzkB,EAAK4jB,gBAAgB5jB,EAAK2jB,cAEpD,IAAS1gB,EAAI,EAAGA,EAAIshB,EAAWpe,OAAQlD,IAAK,CACxC,IAAIyM,EAAI6U,EAAWthB,GACfyhB,EAAKzhB,EAAI,EAEb,GAAS,KAALyM,GAAiB,KAALA,EAEZqU,EAAGW,GAAM,OAET,GAAIhV,KAAK8U,EAELvN,EAAMuN,EAAmB9U,IAAIrM,KAAKqhB,OAC/B,MAAIhV,KAAK+U,GAOZ,KAAM,sCALN,IAAInY,EAAI2K,EAAMwN,EAAoB/U,IAAIiV,MAEtCZ,EAAGW,GAAMpY,EACTyX,EAAGzX,GAAKoY,GAOpB,IAAK,IAAInF,KAAOtI,EACZ,GAAIA,EAAMsI,GAAKpZ,OAAS,EACpB,KAAM,8BAAgC8Q,EAAMsI,GAAK,GAIzD,OAAOwE,GAGX/jB,EAAK4kB,gBAAkB,SAAS3N,EAAOhU,EAAGqJ,GAEtC,IADA,IAAIuY,EAAI,EACD5N,EAAM4N,GAAG1e,OAAS,GAAK8Q,EAAM4N,GAAG5N,EAAM4N,GAAG1e,OAAS,GAAKmG,GAC1DuY,GAAK,EAIT,OADA5N,EAAM4N,GAAGxhB,KAAKiJ,GACPuY,GAGX7kB,EAAK8kB,gBAAkB,SAAS7N,EAAO3K,GAEnC,IADA,IAAIuY,EAAI,EACmB,IAApB5N,EAAM4N,GAAG1e,QAAgB8Q,EAAM4N,GAAG5N,EAAM4N,GAAG1e,OAAO,IAAMmG,GAC3DuY,GAAK,EAGT,OADA5N,EAAM4N,GAAGF,MACFE,GAGX7kB,EAAK+kB,sBAAwB,SAAShB,GAGlC,IADA,IAAI9M,EAAQ,GACHhU,EAAI,EAAGA,EAAI8gB,EAAG,GAAI9gB,IACvBgU,EAAMhU,GAAK,GAGf,IAAI+hB,EAAO,GACPnX,EAAM,GAEV,IAAS5K,EAAI,EAAGA,EAAI8gB,EAAG,GAAK,EAAG9gB,IAAK,CAChC,GAAc,IAAV8gB,EAAG9gB,IAAY8gB,EAAG9gB,KAAM+hB,EACxB,KAAM,+CAEVA,EAAKjB,EAAG9gB,KAAM,EAEA,IAAV8gB,EAAG9gB,GACH4K,GAAO,IAEHkW,EAAG9gB,GAAKA,EACR4K,GAAO7N,EAAK0jB,YAAY1jB,EAAK4kB,gBAAgB3N,EAAOhU,EAAG8gB,EAAG9gB,KAE1D4K,GAAO7N,EAAK2jB,aAAa3jB,EAAK8kB,gBAAgB7N,EAAOhU,IAKjE,OAAO4K,GAGX7N,EAAKilB,cAAgB,SAASlB,EAAI3b,EAAM8c,GAWpC,IAPA,IAAIC,EAAW,GACXC,EAAY,GAEZC,EAAWjd,EACXkd,EAASJ,EAGJjiB,EAAImF,EAAMnF,GAAKiiB,EAAIjiB,IACV,IAAV8gB,EAAG9gB,KAAa8gB,EAAG9gB,GAAKmF,GAAQ2b,EAAG9gB,GAAKiiB,IACxCE,EAAU/hB,KAAK,CAACJ,EAAE8gB,EAAG9gB,KAE7B,IAASA,EAAIoiB,EAAUpiB,GAAKqiB,EAAQriB,IAAK,CACrC,KAAiB,IAAV8gB,EAAG9gB,IAAYA,GAAKqiB,GAAQriB,IAInC,IAFAiiB,EAAKnB,EAAG9gB,GAED8gB,EAAG9gB,KAAOiiB,GACbjiB,IACAiiB,IAGJC,EAAWA,EAASxV,OAAO3P,EAAKilB,cAAclB,EAAI9gB,EAAGiiB,IAMzD,OAHIE,EAAUjf,OAAS,GACnBgf,EAAS9hB,KAAK+hB,GAEXD,GAGXnlB,EAAKulB,+BAAiC,SAASxB,GAY3C,IAJA,IAAIC,EAAKhkB,EAAK8jB,gBAAgBC,GAC1ByB,EAAQxlB,EAAKkkB,yBAAyBF,EAAID,GAC1C0B,EAAU,GAELxiB,EAAI,EAAGA,EAAI8gB,EAAG5d,OAAQlD,IACvB8gB,EAAG9gB,GAAKA,GAGRuiB,EAAMviB,IAAM8gB,EAAG9gB,KACfwiB,EAAQpiB,KAAK,CAACJ,EAAG8gB,EAAG9gB,KACpB8gB,EAAGA,EAAG9gB,IAAM,EACZ8gB,EAAG9gB,GAAK,GAIhB,OAAOwiB,GAGXzlB,EAAK0lB,aAAe,SAAS3B,EAAI4B,EAAO1iB,EAAGqJ,EAAGsZ,GAe1C,IAAIC,EAAW,GACXC,EAAK,CAAC7iB,EAAE,GACR8iB,EAAK,CAACzZ,EAAE,GAKZ,GAHI7B,UAAUtE,OAAS,IACnByf,EAAmB,IAEnB3iB,EAAIqJ,EACJ,MAAO,GAKP,KAAiB,IAAVyX,EAAG9gB,GAAUA,IAAO6iB,EAAGziB,KAAKJ,GACnC,KAAiB,IAAV8gB,EAAGzX,GAAUA,IAAOyZ,EAAG1iB,KAAKiJ,GAEnC,GAAIrJ,EAAIqJ,EAAG,CAGP,GADAwZ,EAAGziB,KAAKJ,GACM,IAAV0iB,EACA,MAAO,CAAC,CAAC,IAAIA,EAAOG,EAAGE,KAAKzC,KAO5B,IAHA,IAAI0C,GAAW,EACXlD,EAAO,GACPmD,EAAQ,GACHrB,EAAI,EAAGA,EAAIiB,EAAG3f,OAAQ0e,IACvBoB,EACAC,EAAM7iB,KAAKyiB,EAAGjB,IAEd9B,EAAK1f,KAAKyiB,EAAGjB,IAEbe,EAAiB7e,QAAQ+e,EAAGjB,KAAO,IACnCoB,GAAW,GAGnB,MACW,CAAC,CAAC,IAAIN,EAAOG,EAAGE,KAAKzC,KAQxC,GAAIQ,EAAG9gB,IAAMqJ,EAAG,CAEZ,IAAIf,EAAIua,EAKR,IAJIjB,EAAI5hB,EAGRsI,EAAElI,KAAKwhB,GACAA,GAAKvY,GAAG,CAOX,IALAuZ,EAAWA,EAASlW,OAAO3P,EAAK0lB,aAAa3B,EAAI4B,EAAOd,EAAGd,EAAGc,GAAIe,IAGlEra,EAAElI,KAAK0gB,EAAGc,IACVA,EAAId,EAAGc,GAAK,EACK,IAAVd,EAAGc,IAAYA,GAAKvY,EAAGuY,IAAOtZ,EAAElI,KAAKwhB,GAC5CtZ,EAAElI,KAAKwhB,GAYX,OAVAtZ,EAAEoZ,OACFpZ,EAAIA,EAAEoE,OAAOoW,IAEP5f,OAAS,IACG,IAAVwf,EACAE,EAASxiB,KAAK,CAAC,IAAKsiB,EAAOpa,EAAEya,KAAKzC,KAElCsC,EAASxiB,KAAK,CAAC,IAAKsiB,EAAOpa,EAAEya,KAAKzC,MAGnCsC,EAGX,GAAI9B,EAAG9gB,KAAOqJ,EAAG,CAEbwZ,EAAGziB,KAAKJ,GACR8iB,EAAG1iB,KAAKiJ,GAER,IAAI6Z,EAAWL,EAAGnW,OAAOoW,GACrBI,EAAShgB,OAAS,IACJ,IAAVwf,EACAE,EAASxiB,KAAK,CAAC,IAAIsiB,EAAOG,EAAGnW,OAAOoW,GAAIC,KAAKzC,KAE7CsC,EAASxiB,KAAK,CAAC,IAAIsiB,EAAOG,EAAGnW,OAAOoW,GAAIC,KAAKzC,MAMzD,IAFA,IAAIpK,EAAI,GAED4K,EAAG9gB,KAAOqJ,GAAKrJ,EAAIqJ,GAEtB6M,EAAE9V,KAAKJ,GACPkW,EAAE9V,KAAKiJ,GAEPrJ,GAAK,EACLqJ,GAAK,EAELqZ,GAAS,EAOjB,OAJIG,EAAK,CAAC7iB,EAAE,GACR8iB,EAAK,CAACzZ,EAAE,GACRuZ,EAASxiB,KAAK,CAAC,IAAKsiB,EAAOxM,EAAE6M,KAAKzC,KAE/BsC,EAASlW,OAAO3P,EAAK0lB,aAAa3B,EAAI4B,EAAO1iB,EAAGqJ,EAAGsZ,KAK3D,IAAIQ,EAAe,IAAI3C,EAEvB,SAAS4C,EAAYC,GACxB,IAAItmB,EAAOG,KA+IX,OA9IAH,EAAKsmB,WAAaA,EAElBtmB,EAAKumB,WAAa,SAASC,GAKvB,IAHA,IAAIngB,EAAQmgB,EAAUtO,MAAM,KACxBuO,EAAO,GAEFxjB,EAAI,EAAGA,EAAIoD,EAAMF,OAAQlD,IAAK,CAEnC,IAAIyjB,EAASrgB,EAAMpD,GAAGiV,MAAM,KAE5B,GAAqB,GAAjBwO,EAAOvgB,OACPsgB,EAAKpjB,KAAKwJ,SAAS6Z,EAAO,UACzB,GAAqB,GAAjBA,EAAOvgB,OAKZ,IAJA,IAAIiC,EAAOyE,SAAS6Z,EAAO,IACvBxB,EAAKrY,SAAS6Z,EAAO,IAGhBpa,EAAIlE,EAAMkE,GAAK4Y,EAAI5Y,IACxBma,EAAKpjB,KAAKiJ,QAEd0C,QAAQuK,IAAI,qCAAsCiN,GAI1D,OAAOC,GAGXzmB,EAAK2mB,eAAiB,SAASC,GAe3B,IAPA,IAAIC,EAAQD,EAAU1O,MAAM,MACxB4O,EAAe,GACfC,EAAU,EACVC,EAAa,CAACC,YAAa,CAAC,GAAG,IAAK7P,MAAM,CAAC,QAAS,cACpD8P,EAAe,GAGVjkB,EAAI,EAAGA,EAAI4jB,EAAM1gB,OAAQlD,IAE9B,GAAmB,KAAf4jB,EAAM5jB,GAAG,GAWb,IAFA,IAAIkkB,EAAQN,EAAM5jB,GAAGsN,OAAO2H,MAAM,SAEzB5L,EAAI,EAAGA,EAAI6a,EAAMhhB,OAAQmG,IAC9B,GAAIgN,MAAM6N,EAAM7a,IAAK,CACjB,GAAiC,IAA7B6a,EAAM7a,GAAG8a,OAAO,SAAgB,CAEhC,IACIC,EADQF,EAAM7a,GAAG4L,MAAM,KACJ,GAAGA,MAAM,KAChC8O,EAAW5P,MAAQ,CAACiQ,EAAW,GAAIA,EAAW,IAC9C,SAGJ,GAAiC,GAA7BF,EAAM7a,GAAG8a,OAAO,UAAgB,CAEhC,IACIC,EADQF,EAAM7a,GAAG4L,MAAM,KACJ,GAAGA,MAAM,KAChC8O,EAAWM,OAAS,CAACD,EAAW,GAAIA,EAAW,IAC/C,SASJ,IAJA,IAAIhhB,EAAQ8gB,EAAM7a,GAAG4L,MAAM,KACvBuO,EAAOzmB,EAAKumB,WAAWlgB,EAAM,IAC7BkhB,EAAQlhB,EAAM,GAETwe,EAAI,EAAGA,EAAI4B,EAAKtgB,OAAQ0e,IACzBvL,MAAMiO,GACNP,EAAWC,YAAYH,GAAcL,EAAK5B,IAAM0C,GAEhDP,EAAWC,YAAYH,GAAcL,EAAK5B,KAAO0C,EACjDL,EAAa7jB,KAAKoJ,OAAO8a,UAMjCP,EAAWC,YAAYH,GAAcC,GAAWta,OAAO0a,EAAM7a,IAC7Dya,GAAW,EAEXG,EAAa7jB,KAAKoJ,OAAO0a,EAAM7a,UA/CnCwa,EAAeD,EAAM5jB,GAAGsN,OAAO5H,MAAM,GACrCoe,EAAU,EAEVC,EAAWC,YAAYH,GAAgB,GAsD/C,MALM,WAAYE,IACdA,EAAWM,OAAS,CAAC3Z,KAAKC,IAAIY,MAAM,KAAM0Y,GAAevZ,KAAK0C,IAAI7B,MAAM,KAAM0Y,KAElFlnB,EAAKgnB,WAAaA,EAEXhnB,GAGXA,EAAKwnB,gBAAkB,WAKnB,IAAInf,EAEJ,IAAK,IAAIof,KAAgBznB,EAAKgnB,WAAY,CACtC,IAAIU,EAASjb,OAAOkb,UAChBC,EAASnb,OAAOob,UAGpB,IAAK,IAAIC,KAAU9nB,EAAKgnB,WAAWC,YAAYQ,GAEvB,iBADpBpf,EAAQrI,EAAKgnB,WAAWC,YAAYQ,GAAcK,MAE1Czf,EAAQqf,IACRA,EAASrf,GACTA,EAAQuf,IACRA,EAASvf,IAKrB,IAAKyf,KAAU9nB,EAAKgnB,WAAWC,YAAYQ,GAEnB,iBADpBpf,EAAQrI,EAAKgnB,WAAWC,YAAYQ,GAAcK,MAE9C9nB,EAAKgnB,WAAWC,YAAYQ,GAAcK,IAAWzf,EAAQqf,IAAYE,EAASF,IAK9F,OAAO1nB,GAGXA,EAAK2mB,eAAe3mB,EAAKsmB,YAClBtmB,ECjiBX,IAAIujB,EAAa,SAAS7T,EAAEjG,GAAK,OAAOiG,EAAIjG,GA8CrC,SAASse,IAAsE,IAA7DC,EAA6D,uDAAvD,GAAIzD,EAAmD,uDAAtC,GAAI0D,EAAkC,uDAArB,GAAIC,EAAiB,uDAAH,EAC3EloB,EAAOG,KAEXH,EAAK+J,KAAO,MACZ/J,EAAKmoB,qBAAsB,EAC3BnoB,EAAKgoB,IAAMA,EACXhoB,EAAKukB,WAAaA,EAClBvkB,EAAKioB,WAAaA,EAClBjoB,EAAKooB,UAAW,EAEiB,KAA7BpoB,EAAKukB,WAAW5b,OAAO,KAEvB3I,EAAKukB,WAAavkB,EAAKukB,WAAW5b,MAAM,GAAI,GAC5C3I,EAAKooB,UAAW,GAGpBpoB,EAAK+gB,IAAMC,EAAAA,OAEXhhB,EAAK6lB,SAAW,GAEhB7lB,EAAKqoB,gBAAkB,GACvBroB,EAAKsoB,YAAc,GAEnBtoB,EAAKuoB,QAAU,SAASC,GAGpB,IAFA,IAAIC,EAAkBzoB,EAAK0oB,MAAMC,QAAO,SAASzP,GAAK,MAAqB,cAAdA,EAAE0P,YAEtD3lB,EAAI,EAAGA,EAAIulB,EAAKriB,QAAUlD,EAAIwlB,EAAgBtiB,OAAQlD,IAC3DwlB,EAAgBxlB,GAAG8d,IAAMyH,EAAKvlB,GAGlC,OAAOjD,GAGXA,EAAK6oB,iBAAmB,WACpB7oB,EAAK8oB,UAAY1C,EAAa9B,sBAAsBtkB,EAAKukB,aAG7DvkB,EAAK+oB,aAAe,SAASC,GAMzB,IAHA,IAAIC,EAAS,GACTC,GAAc,GAEVA,EAAaF,EAAajiB,QAAQ,OAAS,GAC/CkiB,EAAO5lB,KAAK6lB,GACZF,EAAeA,EAAanP,UAAU,EAAGqP,GAAcF,EAAanP,UAAUqP,EAAW,EAAGF,EAAa7iB,QAI7G,MAAO,CAAC6iB,aAAcA,EAAeC,OAAQA,IAGjD,IAAIhY,EAAMjR,EAAK+oB,aAAa/oB,EAAKukB,YACjCvkB,EAAKukB,WAAatT,EAAI+X,aACtBhpB,EAAK4lB,iBAAmB3U,EAAIgY,OAE5BhY,EAAMjR,EAAK+oB,aAAa/oB,EAAKgoB,KAC7BhoB,EAAKgoB,IAAM/W,EAAI+X,aACfhpB,EAAKmpB,UAAYlY,EAAIgY,OAErBjpB,EAAKopB,UAAYppB,EAAKukB,WAAWpe,OAE5Bqd,EAAYxjB,EAAK4lB,iBAAkB5lB,EAAKmpB,aACzCna,QAAQuK,IAAI,oDACZvK,QAAQuK,IAAI,+CAGhBvZ,EAAK6oB,mBAEL7oB,EAAKqpB,aAAe,SAAST,EAAUU,GAGnC,IAFA,IAAIC,EAAavpB,EAAK0oB,MAAMC,QAAO,SAASzP,GAAK,OAAOA,EAAE0P,UAAYA,KAE5D3lB,EAAI,EAAGA,EAAIsmB,EAAWpjB,OAAQlD,IACpCsmB,EAAWtmB,GAAGN,EAAI2mB,EAAUrmB,GAAG,GAC/BsmB,EAAWtmB,GAAGL,EAAI0mB,EAAUrmB,GAAG,GAGnC,OAAOjD,GAGXA,EAAKwpB,sBAAwB,WAKzB,IAHA,IAAID,EAAavpB,EAAK0oB,MAAMC,QAAO,SAASzP,GAAK,MAAqB,cAAdA,EAAE0P,YAGjD3lB,EAAI,EAAGA,EAAIsmB,EAAWpjB,OAAQlD,IAC/BjD,EAAK4lB,iBAAiB7e,QAAQ9D,IAAM,IACpCsmB,EAAWtmB,GAAG2lB,SAAW,SACzBW,EAAWtmB,EAAE,GAAG2lB,SAAW,UAInC,IAZoC,eAY3B3lB,GACDnC,GAAS,EAIb,IAAK,IAAIwL,EAAI,EAAGA,EAAItM,EAAK6lB,SAAS5iB,GAAG,GAAGkD,OAAQmG,IACxCtM,EAAK4lB,iBAAiB7e,QAAQ/G,EAAK6lB,SAAS5iB,GAAG,GAAGqJ,KAAO,IACzDxL,GAAS,GAGbA,EACAd,EAAK6lB,SAAS5iB,GAAG,GAAGmhB,KAAI,SAASzhB,GACpB,GAALA,IAEJ3C,EAAK0oB,MAAM/lB,EAAE,GAAG8mB,SAAW,QAG/BzpB,EAAK6lB,SAAS5iB,GAAG,GAAGmhB,KAAI,SAASzhB,GACpB,GAALA,IAEJ3C,EAAK0oB,MAAM/lB,EAAE,GAAG8mB,SAAWzpB,EAAK6lB,SAAS5iB,GAAG,QApB/CA,EAAI,EAAGA,EAAIjD,EAAK6lB,SAAS1f,OAAQlD,IAAK,KACvCnC,EADuC,EAAtCmC,GAwBT,OAAOjD,GAGXA,EAAK0pB,aAAe,SAASd,GAIzB,IAHA,IAAIU,EAAY,GACZb,EAAkBzoB,EAAK0oB,MAAMC,QAAO,SAASzP,GAAK,OAAOA,EAAE0P,UAAYA,KAElE3lB,EAAI,EAAGA,EAAIwlB,EAAgBtiB,OAAQlD,IACxCqmB,EAAUjmB,KAAK,CAAColB,EAAgBxlB,GAAGN,EAAG8lB,EAAgBxlB,GAAGL,IAE7D,OAAO0mB,GAGXtpB,EAAK2pB,QAAU,WAKX,IADA,IAAInB,EAAO,GACFvlB,EAAI,EAAGA,EAAIjD,EAAKukB,WAAWpe,OAAQlD,IACxCulB,EAAKnlB,KAAKrD,EAAK0oB,MAAMzlB,GAAG8d,KAE5B,OAAOyH,GAGXxoB,EAAK4pB,eAAiB,WAMlB,IALA,IAAI7F,EAAK/jB,EAAK8oB,UACVe,EAAmB7pB,EAAK6lB,SAAS8C,QAAQ,SAASzP,GAClD,MAAe,KAARA,EAAE,IAAaA,EAAE,GAAG/S,QAAU,KAGhClD,EAAI,EAAGA,EAAI4mB,EAAiB1jB,OAAQlD,IAIzC,IAHA,IAAI6mB,EAAUD,EAAiB5mB,GAAG,GAC9B8mB,EAAOD,EAAQnhB,MAAM,EAAGmhB,EAAQ3jB,OAAS,GAEpCmG,EAAI,EAAGA,EAAIyd,EAAK5jB,OAAO,EAAGmG,IAC/BtM,EAAKgqB,YAAY,CAACD,EAAKzd,GAAIyd,EAAKzd,EAAE,GAAIyX,EAAGgG,EAAKzd,EAAE,IAAKyX,EAAGgG,EAAKzd,MAIrE,OAAOtM,GAGXA,EAAKiqB,eAAiB,WAQlB,IAJA,IAAIC,EAAa,SAAShR,GACtB,OAAa,IAANA,GAAWA,GAAKlZ,EAAKukB,WAAWpe,QAGlClD,EAAI,EAAGA,EAAIjD,EAAK6lB,SAAS1f,OAAQlD,IACtC,GAA2B,KAAvBjD,EAAK6lB,SAAS5iB,GAAG,KAAejD,EAAKmoB,qBAA8C,KAAvBnoB,EAAK6lB,SAAS5iB,GAAG,IAAjF,CAGA,IAAI8mB,EAAO/pB,EAAK6lB,SAAS5iB,GAAG,GAAG0lB,OAAOuB,GAEtC,GAA2B,KAAvBlqB,EAAK6lB,SAAS5iB,GAAG,GAAW,CAC5B,IAAIknB,EAAW,CAAC,KAAQ,GACpB,KAAQ,EAER,OAAU,EACV,IAAOnqB,EACP,SAAY,SACZ,SAAY,IACZ,KAAQ,GACR,EAAKA,EAAK0oB,MAAM1oB,EAAKopB,UAAU,GAAGzmB,EAClC,EAAK3C,EAAK0oB,MAAM1oB,EAAKopB,UAAU,GAAGxmB,EAClC,GAAM5C,EAAK0oB,MAAM1oB,EAAKopB,UAAU,GAAGgB,GACnC,GAAMpqB,EAAK0oB,MAAM1oB,EAAKopB,UAAU,GAAGiB,GACnC,IAAOrJ,EAAAA,QACPsJ,EAAW,CAAC,KAAQ,GACpB,KAAQ,EAER,OAAU,EACV,IAAOtqB,EACP,SAAY,SACZ,SAAY,IACZ,KAAQ,GACR,EAAKA,EAAK0oB,MAAM,GAAG/lB,EACnB,EAAK3C,EAAK0oB,MAAM,GAAG9lB,EACnB,GAAM5C,EAAK0oB,MAAM,GAAG0B,GACpB,GAAMpqB,EAAK0oB,MAAM,GAAG2B,GACpB,IAAOrJ,EAAAA,QAEP+I,EAAK1mB,KAAKrD,EAAK0oB,MAAMviB,OAAO,GAC5B4jB,EAAK1mB,KAAKrD,EAAK0oB,MAAMviB,OAAO,GAC5BnG,EAAK0oB,MAAMrlB,KAAK8mB,GAChBnqB,EAAK0oB,MAAMrlB,KAAKinB,GAIxBtqB,EAAKgqB,YAAYD,GAGrB,OAAO/pB,GAGXA,EAAKuqB,eAAiB,WAClB,IAAK,IAAItnB,EAAI,EAAGA,EAAIjD,EAAKwqB,MAAMrkB,OAAQlD,IACnCjD,EAAKwqB,MAAMvnB,GAAG8d,IAAM/gB,EAAKwqB,MAAMvnB,GAAGwnB,OAAO1J,IAAM/gB,EAAKwqB,MAAMvnB,GAAGuN,OAAOuQ,IAGxE,OAAO/gB,GAGXA,EAAKgqB,YAAc,SAASD,GAQxB,IAPA,IAEInpB,EAAS,OAAe,EAAImpB,EAAK5jB,QACjCtD,EAHa,IAGW,EAAI8K,KAAK+c,IAAI9pB,IAErC+pB,EAAc,GAET1nB,EAAI,EAAGA,EAAI8mB,EAAK5jB,OAAQlD,IAC7B0nB,GAAe3qB,EAAK0oB,MAAMqB,EAAK9mB,GAAG,GAAG8d,IAEzC,IAAI6J,EAAU,CAAC,KAAQ,GACN,KAAQ,EAER,OAAU/nB,EACV,IAAO7C,EACP,SAAY,SACZ,SAAY,IACZ,KAAQ+pB,EACR,IAAOY,GACxB3qB,EAAK0oB,MAAMrlB,KAAKunB,GAEhB,IAAIC,EAAO,EACPC,EAAO,EACPC,EAAgB,EAEpBnqB,EAA4B,SAAnBmpB,EAAK5jB,OAAS,IAAgB,EAAI4jB,EAAK5jB,QAChDtD,EAAS,GAAM8K,KAAKqd,IAAIpqB,GAExB,IAAK,IAAI0L,EAAI,EAAGA,EAAIyd,EAAK5jB,OAAQmG,IAC7B,KAAgB,IAAZyd,EAAKzd,IAAYyd,EAAKzd,GAAKtM,EAAKukB,WAAWpe,QAA/C,CAIAnG,EAAKwqB,MAAMnnB,KAAK,CAAC,OAAUrD,EAAK0oB,MAAMqB,EAAKzd,GAAK,GAC/B,OAAUtM,EAAK0oB,MAAM1oB,EAAK0oB,MAAMviB,OAAO,GACvC,SAAY,OACZ,MAAStD,EACT,IAAOme,EAAAA,SAEpB+I,EAAK5jB,OAAS,GAEdnG,EAAKwqB,MAAMnnB,KAAK,CAAC,OAAUrD,EAAK0oB,MAAMqB,EAAKzd,GAAK,GAC/B,OAAUtM,EAAK0oB,MAAMqB,GAAMzd,EAAIqB,KAAK6J,MAAMuS,EAAK5jB,OAAS,IAAM4jB,EAAK5jB,QAAU,GAC7E,SAAY,OACZ,MAAkB,EAATtD,EACT,IAAOme,EAAAA,SAG5B,IAAIiK,EAA0B,SAAnBlB,EAAK5jB,OAAS,GAAgB4jB,EAAK5jB,OAC1CjD,EAAI,EAAIyK,KAAKqd,IAAI,SAAcC,EAAK,GAExCjrB,EAAKwqB,MAAMnnB,KAAK,CAAC,OAAUrD,EAAK0oB,MAAMqB,EAAKzd,GAAK,GAC/B,OAAUtM,EAAK0oB,MAAMqB,GAAMzd,EAAI,GAAKyd,EAAK5jB,QAAU,GACnD,SAAY,OACZ,MAASjD,IAI1B,IAAIgoB,EAAWlrB,EAAK0oB,MAAMqB,EAAKzd,GAAG,GAC9B,MAAO4e,IACPL,GAAQK,EAASvoB,EACjBmoB,GAAQI,EAAStoB,EAEjBmoB,GAAiB,GAazB,OATIA,EAAgB,IAGhBH,EAAQjoB,EAAIkoB,EAAOE,EACnBH,EAAQhoB,EAAIkoB,EAAOC,EACnBH,EAAQR,GAAKQ,EAAQjoB,EACrBioB,EAAQP,GAAKO,EAAQhoB,GAGlB5C,GAGXA,EAAKmrB,iBAAmB,WAcpB,IAbA,IAQI7C,EAAc,GACd8C,EAAYprB,EAAK0oB,MAAMC,QALC,SAASzP,GACjC,MAAqB,UAAdA,EAAE0P,YAKTyC,EAAS,GAGJpoB,EAAI,EAAGA,GAAKjD,EAAK0oB,MAAMviB,OAAQlD,IACpCqlB,EAAYrlB,GAAK,GAErB,IAASA,EAAI,EAAGA,EAAImoB,EAAUjlB,OAAQlD,IAIlC,IAHA,IAAIqoB,EAAWF,EAAUnoB,GAGhBqJ,EAAI,EAAGA,EAAIgf,EAASvB,KAAK5jB,OAAQmG,IAAK,CAK3C,IAJA,IAAIif,EAAUD,EAASvB,KAAKzd,GAInBuY,EAAI,EAAGA,EAAIyD,EAAYiD,GAASplB,OAAQ0e,IAC7C,KAAI2G,KAAKxR,UAAU,CAACsO,EAAYiD,GAAS1G,GAAG9D,IAAKuK,EAASvK,KAAKiF,UAAWqF,GAA1E,CAGA,IAAII,EAAWnD,EAAYiD,GAAS1G,GAAGhiB,OAASyoB,EAASzoB,OAEzD7C,EAAKwqB,MAAMnnB,KAAK,CAAC,OAAUilB,EAAYiD,GAAS1G,GAC9B,OAAUyG,EACV,MAASG,EAjCtB,GAkCa,SAAY,cAG9BJ,EAAOG,KAAKxR,UAAU,CAACsO,EAAYiD,GAAS1G,GAAG9D,IAAKuK,EAASvK,KAAKiF,UAAW,EAGjFsC,EAAYiD,GAASloB,KAAKioB,GAIlC,OAAOtrB,GAIXA,EAAK0rB,cAAgB,SAASC,GAC1B,QAAyB,IAAdA,EACP,OAAO3rB,EAEX,IAAK,IAAIiD,EAAI,EAAGA,EAAI0oB,EAAWxlB,OAAQlD,IAAK,CACxC,IAGI2oB,EAAU,CAAC,OAHF5rB,EAAK6rB,uBAAuBF,EAAW1oB,GAAGmF,MAGtB,OAFpBpI,EAAK6rB,uBAAuBF,EAAW1oB,GAAGiiB,IAEJ,SAAY,QAC3D,cAAiByG,EAAW1oB,GAAG6oB,SAAU,IAAO9K,EAAAA,QAEhDhhB,EAAKwqB,MAAMnnB,KAAKuoB,GAGxB,OAAO5rB,GAIXA,EAAK+rB,eAAiB,WAMlB,IAAIhI,EAAK/jB,EAAK8oB,UACC9oB,EAAK6lB,SAEpB7lB,EAAK0oB,MAAQ,GACb1oB,EAAKwqB,MAAQ,GAIb,IAAIwB,EAAY,GAGhBhsB,EAAK6lB,SAASG,OAEd,IAAK,IAAI/iB,EAAI,EAAGA,EAAIjD,EAAK6lB,SAAS1f,OAAQlD,IAEtC,IADA,IAAI8mB,EAAO/pB,EAAK6lB,SAAS5iB,GAAG,GACnBqJ,EAAI,EAAGA,EAAIyd,EAAK5jB,OAAQmG,IAC7B0f,EAAUjC,EAAKzd,IAAMtM,EAAK6lB,SAAS5iB,GAAG,GAI9C,IAAK,IAAIA,EAAI,EAAGA,GAAK8gB,EAAG,GAAI9gB,IAAK,CAC7B,IAAIgpB,EAAWjsB,EAAKgoB,IAAI/kB,EAAE,IAEtBjD,EAAK4lB,iBAAiB7e,QAAQ9D,EAAE,IAAM,GACtCjD,EAAK4lB,iBAAiB7e,QAAQ9D,EAAE,IAAM,KACtCgpB,EAAW,IAIfjsB,EAAK0oB,MAAMrlB,KAAK,CAAC,KAAQ4oB,EACR,IAAO/D,EAAcjlB,EAAI,EACzB,OAAU,EACV,IAAOjD,EACP,SAAY,aACZ,WAAcA,EAAKioB,WACnB,SAAY+D,EAAU/oB,GACtB,IAAO+d,EAAAA,OACP,QAAU,IAG/B,IAAK,IAAI/d,EAAI,EAAGA,EAAIjD,EAAK0oB,MAAMviB,OAAQlD,IAE/BjD,EAAK0oB,MAAMzlB,GAAGipB,SADR,IAANjpB,EACyB,KAEAjD,EAAK0oB,MAAMzlB,EAAE,GAGtCA,GAAKjD,EAAK0oB,MAAMviB,OAAO,EACvBnG,EAAK0oB,MAAMzlB,GAAGkpB,SAAW,KAEzBnsB,EAAK0oB,MAAMzlB,GAAGkpB,SAAWnsB,EAAK0oB,MAAMzlB,EAAE,GAI9C,IAAK,IAAIA,EAAI,EAAGA,GAAK8gB,EAAG,GAAI9gB,IAEV,IAAV8gB,EAAG9gB,IAEHjD,EAAKwqB,MAAMnnB,KAAK,CAAC,OAAUrD,EAAK0oB,MAAMzlB,EAAE,GACvB,OAAUjD,EAAK0oB,MAAM3E,EAAG9gB,GAAG,GAC3B,SAAY,WACZ,MAAS,EACT,IAAO+d,EAAAA,SAGxB/d,EAAI,IAEwC,IAAxCjD,EAAK4lB,iBAAiB7e,QAAQ9D,EAAE,KACO,GAAvCjD,EAAK4lB,iBAAiB7e,QAAQ9D,EAAE,KACO,GAAvCjD,EAAK4lB,iBAAiB7e,QAAQ9D,EAAE,KAGhCjD,EAAKwqB,MAAMnnB,KAAK,CAAC,OAAUrD,EAAK0oB,MAAMzlB,EAAE,GACxB,OAAUjD,EAAK0oB,MAAMzlB,EAAE,GACvB,SAAY,WACZ,MAAS,EACT,IAAO+d,EAAAA,SACvBhhB,EAAK0oB,MAAMzlB,EAAE,GAAGooB,QAAS,GAMrC,IAAK,IAAIpoB,EAAI,EAAGA,EAAIjD,EAAKqoB,gBAAgBliB,OAAQlD,IAC7CjD,EAAKwqB,MAAMnnB,KAAK,CAAC,OAAUrD,EAAK0oB,MAAM1oB,EAAKqoB,gBAAgBplB,GAAG,GAAG,GACjD,OAAUjD,EAAK0oB,MAAM1oB,EAAKqoB,gBAAgBplB,GAAG,GAAG,GAChD,SAAY,aACZ,MAAS,EACT,IAAO+d,EAAAA,SAY3B,OATIhhB,EAAKooB,UACLpoB,EAAKwqB,MAAMnnB,KAAK,CAAC,OAAUrD,EAAK0oB,MAAM,GACtB,OAAU1oB,EAAK0oB,MAAM1oB,EAAKopB,UAAU,GACpC,SAAY,WACZ,MAAS,EACT,IAAOpI,EAAAA,SAIpBhhB,GAGXA,EAAK0lB,aAAe,SAAS3B,EAAI4B,EAAO1iB,EAAGqJ,GAevC,IAAIuZ,EAAW,GACXC,EAAK,CAAC7iB,EAAE,GACR8iB,EAAK,CAACzZ,EAAE,GAEZ,GAAIrJ,EAAIqJ,EACJ,MAAO,GAKP,KAAiB,IAAVyX,EAAG9gB,GAAUA,IAAO6iB,EAAGziB,KAAKJ,GACnC,KAAiB,IAAV8gB,EAAGzX,GAAUA,IAAOyZ,EAAG1iB,KAAKiJ,GAEnC,GAAIrJ,EAAIqJ,EAAG,CAGP,GADAwZ,EAAGziB,KAAKJ,GACM,IAAV0iB,EACA,MAAO,CAAC,CAAC,IAAIA,EAAOG,EAAGE,KAAKzC,KAO5B,IAHA,IAAI0C,GAAW,EACXlD,EAAO,GACPmD,EAAQ,GACHrB,EAAI,EAAGA,EAAIiB,EAAG3f,OAAQ0e,IACvBoB,EACAC,EAAM7iB,KAAKyiB,EAAGjB,IAEd9B,EAAK1f,KAAKyiB,EAAGjB,IAEb7kB,EAAK4lB,iBAAiB7e,QAAQ+e,EAAGjB,KAAO,IACxCoB,GAAW,GAGnB,MACW,CAAC,CAAC,IAAIN,EAAOG,EAAGE,KAAKzC,KAQxC,GAAIQ,EAAG9gB,IAAMqJ,EAAG,CAEZ,IAAIf,EAAIua,EAKR,IAJIjB,EAAI5hB,EAGRsI,EAAElI,KAAKwhB,GACAA,GAAKvY,GAAG,CAOX,IALAuZ,EAAWA,EAASlW,OAAO3P,EAAK0lB,aAAa3B,EAAI4B,EAAOd,EAAGd,EAAGc,KAG9DtZ,EAAElI,KAAK0gB,EAAGc,IACVA,EAAId,EAAGc,GAAK,EACK,IAAVd,EAAGc,IAAYA,GAAKvY,EAAGuY,IAAOtZ,EAAElI,KAAKwhB,GAC5CtZ,EAAElI,KAAKwhB,GAYX,OAVAtZ,EAAEoZ,OACFpZ,EAAIA,EAAEoE,OAAOoW,IAEP5f,OAAS,IACG,IAAVwf,EACAE,EAASxiB,KAAK,CAAC,IAAKsiB,EAAOpa,EAAEya,KAAKzC,KAElCsC,EAASxiB,KAAK,CAAC,IAAKsiB,EAAOpa,EAAEya,KAAKzC,MAGnCsC,EAGP9B,EAAG9gB,KAAOqJ,IAEVwZ,EAAGziB,KAAKJ,GACR8iB,EAAG1iB,KAAKiJ,GAEOwZ,EAAGnW,OAAOoW,GACZ5f,OAAS,IACJ,IAAVwf,EACAE,EAASxiB,KAAK,CAAC,IAAIsiB,EAAOG,EAAGnW,OAAOoW,GAAIC,KAAKzC,KAE7CsC,EAASxiB,KAAK,CAAC,IAAIsiB,EAAOG,EAAGnW,OAAOoW,GAAIC,KAAKzC,OAMzD,IAFA,IAAIpK,EAAI,GAED4K,EAAG9gB,KAAOqJ,GAAKrJ,EAAIqJ,GAEtB6M,EAAE9V,KAAKJ,GACPkW,EAAE9V,KAAKiJ,GAEPrJ,GAAK,EACLqJ,GAAK,EAELqZ,GAAS,EAOjB,OAJIG,EAAK,CAAC7iB,EAAE,GACR8iB,EAAK,CAACzZ,EAAE,GACRuZ,EAASxiB,KAAK,CAAC,IAAKsiB,EAAOxM,EAAE6M,KAAKzC,KAE/BsC,EAASlW,OAAO3P,EAAK0lB,aAAa3B,EAAI4B,EAAO1iB,EAAGqJ,KAG3DtM,EAAKosB,UAAY,WAA8C,IAArClE,EAAqC,uDAAvB,EAAGmE,EAAoB,uDAAJ,GACvD,GAAsB,IAAlBA,EACA,OAAOrsB,EAEX,IAAK,IAAIiD,EAAI,EAAGA,GAAKjD,EAAKopB,UAAWnmB,IAEjC,GAAIA,EAAIopB,GAAkB,EAAG,CAEzB,IAAIxB,OAAI,EAAEC,OAAI,EAEVQ,EAAWtrB,EAAK0oB,MAAMzlB,EAAE,GACxBipB,OAAQ,EAAEC,OAAQ,EAClBG,OAAO,EAAEC,OAAO,EAEE,GAAlBvsB,EAAKopB,WACLmD,EAAU,CAACjB,EAAS3oB,EAAI,GAAI2oB,EAAS1oB,GACrC0pB,EAAU,CAAChB,EAAS3oB,EAAI,GAAI2oB,EAAS1oB,KAIjCspB,EADK,GAALjpB,EACWjD,EAAK0oB,MAAM1oB,EAAKopB,UAAY,GAE5BppB,EAAK0oB,MAAMzlB,EAAI,GAI1BkpB,EADAlpB,GAAKjD,EAAKopB,UACCppB,EAAK0oB,MAAM,GAEX1oB,EAAK0oB,MAAMzlB,GAG2B,IAAjDjD,EAAK8oB,UAAUqD,EAASnlB,IAAMkhB,EAAY,IACO,IAAjDloB,EAAK8oB,UAAUoD,EAASllB,IAAMkhB,EAAY,IACO,IAAjDloB,EAAK8oB,UAAUwC,EAAStkB,IAAMkhB,EAAY,KAE1CgE,EAAWC,EAAWnsB,EAAK0oB,MAAM1oB,EAAK8oB,UAAUwC,EAAStkB,IAAMkhB,EAAY,GAAG,IAK7B,IAAjDloB,EAAK8oB,UAAUwC,EAAStkB,IAAMkhB,EAAY,IACO,IAAjDloB,EAAK8oB,UAAUqD,EAASnlB,IAAMkhB,EAAY,IACO,IAAjDloB,EAAK8oB,UAAUoD,EAASllB,IAAMkhB,EAAY,IAK1CqE,EAAU,CAACJ,EAASxpB,EAAI2oB,EAAS3oB,EAAGwpB,EAASvpB,EAAI0oB,EAAS1oB,GAC1D0pB,EAAU,CAACJ,EAASvpB,EAAI2oB,EAAS3oB,EAAGupB,EAAStpB,EAAI0oB,EAAS1oB,KAL1D2pB,EAAU,CAACjB,EAAS3oB,EAAIwpB,EAASxpB,EAAG2oB,EAAS1oB,EAAIupB,EAASvpB,GAC1D0pB,EAAU,CAAChB,EAAS3oB,EAAIupB,EAASvpB,EAAG2oB,EAAS1oB,EAAIspB,EAAStpB,KAQlE,IAAI4pB,EAAc,CAACD,EAAQ,GAAKD,EAAQ,GAAIC,EAAQ,GAAKD,EAAQ,IAC7DG,EAAY9e,KAAK+e,KAAKF,EAAY,GAAKA,EAAY,GAAKA,EAAY,GAAKA,EAAY,IACrFG,EAAY,CAACH,EAAY,GAAKC,EAAWD,EAAY,GAAKC,GAC1DG,EAAY,EAAE,GAAKD,EAAU,IAAK,GAAKA,EAAU,IAErD9B,EAAO7qB,EAAK0oB,MAAMzlB,EAAE,GAAGN,EAAIiqB,EAAU,GACrC9B,EAAO9qB,EAAK0oB,MAAMzlB,EAAE,GAAGL,EAAIgqB,EAAU,GAErC,IAAIhC,EAAU,CAAC,KAAQ3nB,EAAIilB,EAAa,EACvB,KAAQ,EACR,OAAU,EACV,IAAOloB,EACP,SAAY,QACZ,WAAcA,EAAKioB,WACnB,SAAY,IACZ,EAAK4C,EACL,EAAKC,EACL,GAAMD,EACN,GAAMC,EACN,IAAO9J,EAAAA,QACpB4K,EAAU,CAAC,OAAU5rB,EAAK0oB,MAAMzlB,EAAE,GAC1B,OAAU2nB,EACV,MAAS,EACT,SAAY,aACZ,IAAO5J,EAAAA,QAEnBhhB,EAAK0oB,MAAMrlB,KAAKunB,GAChB5qB,EAAKwqB,MAAMnnB,KAAKuoB,GAIxB,OAAO5rB,GAGXA,EAAK6sB,oBAAsB,WAIvB,GAHA7sB,EAAK8sB,oBACL9sB,EAAK6lB,SAAW7lB,EAAK0lB,aAAa1lB,EAAK8oB,UAAW,EAAG,EAAG9oB,EAAKukB,WAAWpe,QAEpEnG,EAAKooB,SAAU,CAEf,IAAI2E,EAAe/sB,EAAK6lB,SAAS8C,QAAO,SAASzP,GAAK,GAAY,KAARA,EAAE,GAAW,OAAO,KAE9E,GAAI6T,EAAa5mB,OAAS,EAAG,CACzB6mB,MAAQD,EAAa,GACrBhD,KAAOiD,MAAM,GAAGhH,KAAKzC,GAErB0J,KAAOlD,KAAK,GACZmD,OAAQ,EACRC,WAAa,EACb,IAAK,IAAIlqB,EAAI,EAAGA,EAAI8mB,KAAK5jB,OAAQlD,IACzB8mB,KAAK9mB,GAAKgqB,KAAO,IACjBE,YAAc,GAElBF,KAAOlD,KAAK9mB,GAGE,GAAdkqB,WACAH,MAAM,GAAK,IACU,GAAdG,WACPH,MAAM,GAAK,IAEXA,MAAM,GAAK,KAKvB,OAAOhtB,GAGXA,EAAKotB,iBAAmB,WAKpB,IAFA,IAESnqB,EAAI,EAAGA,EAAIjD,EAAKwqB,MAAMrkB,OAAQlD,IACnCjD,EAAKwqB,MAAMvnB,GAAG8d,IAAM/gB,EAAKwqB,MAAMvnB,GAAGwnB,OAAO1J,IAAM/gB,EAAKwqB,MAAMvnB,GAAGuN,OAAOuQ,IAGxE,OAAO/gB,GAGXA,EAAK8sB,kBAAoB,WAIrB,OAHI9sB,EAAK8oB,UAAU3iB,OAAS,IACxBnG,EAAKqoB,gBAAkBroB,EAAKqoB,gBAAgB1Y,OAAOyW,EAAab,+BAA+BvlB,EAAK8oB,aAEjG9oB,GAGXA,EAAKqtB,eAAiB,WAOlB,IAHA,IAAItJ,EAAK/jB,EAAK8oB,UACVT,EAAkBroB,EAAKqoB,gBAElBplB,EAAI,EAAGA,EAAIolB,EAAgBliB,OAAQlD,IACxC8gB,EAAGsE,EAAgBplB,GAAG,IAAMolB,EAAgBplB,GAAG,GAC/C8gB,EAAGsE,EAAgBplB,GAAG,IAAMolB,EAAgBplB,GAAG,GAInD,OADAjD,EAAKqoB,gBAAkB,GAChBroB,GAGXA,EAAKstB,QAAU,SAAStW,GACpB,YAAmB,IAARA,GACPhX,EAAKgX,KAAO,GACLhX,IAEPA,EAAKgX,KAAOA,EACLhX,IAKXA,EAAKopB,UAAY,GACjBppB,EAAK6sB,sBAET7sB,EAAK6rB,uBAAyB,SAAS9B,GAGnC,GAA6C,mBAAzCjiB,OAAO9G,UAAUuJ,SAASqB,KAAKme,IAC/B,IAAK,IAAIzd,EAAI,EAAGA,EAAItM,EAAK0oB,MAAMviB,OAAQmG,IACnC,GAAI,SAAUtM,EAAK0oB,MAAMpc,IACjBtM,EAAK0oB,MAAMpc,GAAGyd,KAAK5Z,OAAO4Z,GAC1B,OAAO/pB,EAAK0oB,MAAMpc,QAK9B,IAAK,IAAIA,EAAI,EAAGA,EAAItM,EAAK0oB,MAAMviB,OAAQmG,IACnC,GAAItM,EAAK0oB,MAAMpc,GAAGtF,KAAO+iB,EACrB,OAAO/pB,EAAK0oB,MAAMpc,GAM9B,OADA0C,QAAQuK,IAAI,iCAAkCwQ,GACvC,MCt0BR,SAASwD,EAAqBC,GACnC,IAOIvqB,EAAG6C,EACF2nB,EAHD9qB,EAAI,GAAIC,EAAI,GAKhBkD,EAAM0nB,EAAW,GACjB,IAAI5sB,EAAQgG,MAAM4H,MAAM,KAAM,IAAI5H,MAAMd,EAAI,IAAIse,IAAI3X,OAAOzL,UAAUwI,QAAQ,GACzEkkB,EAAY9mB,MAAM4H,MAAM,KAAM,IAAI5H,MAAM,GAAG+G,KAAK6J,MAAM1R,EAAI,KAC3Cse,IAAI3X,OAAOzL,UAAUwI,QAAS,GAC7CmkB,EAAa/mB,MAAM4H,MAAM,KAAM,IAAI5H,MAAM,GAAG+G,KAAK6J,MAAM1R,EAAI,KAC5Cse,IAAI3X,OAAOzL,UAAUwI,QAAS,GAE7CokB,EAAK,EACLC,EAAM,EACNC,EAASngB,KAAKogB,GAAK,GAGZ,SAAP3tB,EAAgB6C,EAAGqJ,EAAGkhB,GAItB,IAOGQ,EAAOC,EAASpJ,EAAGxG,EAAG6P,EAASC,EAAS7e,EAAM8e,EAC9CC,EAAO3S,EAAG4S,EACZC,EATGC,EAAQ,EAKTzO,EAAI,EAAG0O,EAAS,EAMnBC,EAAW9nB,MAAM4H,MAAM,KAAM,IAAI5H,MAAO,EAAsB,EAApB+G,KAAK6J,OAAOlL,EAAErJ,GAAG,KAAQmhB,IAAI3X,OAAOzL,UAAUwI,QAAS,GAKrG,IAHAwkB,EAAQ/qB,EAAE,EAAGqJ,IAGNrJ,GAAKqJ,GAER,IADA2hB,EAAUT,EAAWvqB,KACC,GAAHA,EAEd,CACDurB,GAAS,EACT3J,EAAI5hB,EAAGob,EAAI4P,EACXS,IAAW3O,GAAK8E,EAChB6J,IAAW3O,GAAK1B,EAChBpb,EAAIgrB,EAAQ,EAEZC,EAAUrJ,EAAGsJ,EAAU9P,EACvB+P,EAAS,EACT,GACIvJ,IAAKxG,IAAK+P,UAENZ,EAAW3I,IAAMxG,GAAOmP,EAAW3I,GAAKA,GAGhD,GADAvV,EAAO8e,EAAO,EACVA,GAAU,IACVxtB,EAAMstB,EAAQ,EAAE5e,IAASwe,EACzBltB,EAAMutB,EAAQ,EAAE7e,IAASwe,EACzBltB,EAAMstB,IAAmBJ,EACzBltB,EAAMutB,IAAmBL,EACrBM,EAAS,GACT,KAAO9e,GAAQ,EAAGA,IACd1O,EAAMstB,EAAQ5e,GAAQ3B,KAAKogB,GAC3BntB,EAAMutB,EAAQ7e,GAAQ3B,KAAKogB,GAIvCJ,IAAaE,GAAOO,EAChBvJ,GAAKxG,GACPje,EAAKykB,EAAGxG,EAAGmP,QA9BbvqB,IAAKurB,IAASC,IAqCtB,IAHAF,EAAU5gB,KAAKogB,IAAIS,EAAM,GAAGA,EAC5BE,IAAW3O,GAAKzT,EAChB+hB,EAAQL,EAAQ,EAAI,EAAIA,EACnBtS,EAAI,EAAGA,GAAKqE,EAAGrE,IAAK,CAErB,IADA4S,EAAQI,EAAShT,GAAG2S,EACf/e,EAAO,EAAGA,GAAQgf,EAAMhf,IAC7B1O,EAAMytB,EAAM/e,IAASif,EACrB,GAAI7S,EAAIqE,EACJ,MACJsO,EAAQK,IAAWhT,GAEvBgS,IAAYE,GAAMa,EAGlBruB,CAAK,EAAG0F,EAAI,EAAG0nB,GACfE,EAAUE,IAAO,EAEjBH,EAhGe,EAiGf9qB,EAAE,GAhGW,IAiGbC,EAAE,GAhGW,IAkGb,IAAI+rB,EAAO,GAGX,IADAA,EAAKtrB,KAAK,CAACV,EAAE,GAAIC,EAAE,KACdK,EAAI,EAAGA,EAAI6C,EAAK7C,IACjBN,EAAEM,GAAKN,EAAEM,EAAE,GArGD,GAqGW0K,KAAKqd,IAAIyC,GAC9B7qB,EAAEK,GAAKL,EAAEK,EAAE,GAtGD,GAsGW0K,KAAKihB,IAAInB,GAE9BkB,EAAKtrB,KAAK,CAACV,EAAEM,GAAIL,EAAEK,KACnBwqB,GAAS9f,KAAKogB,GAAGntB,EAAMqC,EAAE,GAG7B,OAAO0rB,EChHF,SAASE,IACf1uB,KAAK0C,OAAS,KACd1C,KAAK2uB,WAAa,KAClB3uB,KAAK4uB,KAAO,KACT5uB,KAAK8sB,KAAO,UFCsB,IAA3BhhB,OAAOjL,UAAUuP,OACxBtE,OAAOjL,UAAUuP,KAAO,WACpB,OAAOtE,OAAO9L,MAAMmQ,QAAQ,aAAc,MEAlDue,EAAQ7tB,UAAUgD,UAAY,WAC7B,OAAO7D,KAAK0C,QAGbgsB,EAAQ7tB,UAAUiD,UAAY,SAASpB,GACtC1C,KAAK0C,OAASA,GAGfgsB,EAAQ7tB,UAAUguB,cAAgB,WACjC,OAAO7uB,KAAK2uB,YAGbD,EAAQ7tB,UAAUiuB,cAAgB,SAASH,GAC1C3uB,KAAK2uB,WAAaA,GAGnBD,EAAQ7tB,UAAUkuB,QAAU,WAC3B,OAAO/uB,KAAK4uB,MAGbF,EAAQ7tB,UAAUmuB,QAAU,SAASJ,GACpC5uB,KAAK4uB,KAAOA,GAGbF,EAAQ7tB,UAAUouB,QAAU,WAC3B,OAAOjvB,KAAK8sB,MAGb4B,EAAQ7tB,UAAUquB,QAAU,SAASpC,GACpC9sB,KAAK8sB,KAAOA,wBClCN,SAAStW,IACfxW,KAAKmvB,KAAO,KACZnvB,KAAKwC,EAAI,KACNxC,KAAKyC,EAAI,KACZzC,KAAKovB,UAAY,KACjBpvB,KAAKG,OAAS,IAAIC,EAAAA,EAGnBoW,EAAK3V,UAAUwuB,QAAU,WACxB,OAAOrvB,KAAKmvB,MAGb3Y,EAAK3V,UAAUyuB,QAAU,SAASH,GACjCnvB,KAAKmvB,KAAOA,GAGb3Y,EAAK3V,UAAU4C,KAAO,WACrB,OAAOzD,KAAKwC,GAGbgU,EAAK3V,UAAU6C,KAAO,SAASlB,GAC9BxC,KAAKwC,EAAIA,GAGVgU,EAAK3V,UAAU8C,KAAO,WACrB,OAAO3D,KAAKyC,GAGb+T,EAAK3V,UAAU+C,KAAO,SAASnB,GAC9BzC,KAAKyC,EAAIA,GAGV+T,EAAK3V,UAAU0uB,YAAc,WAC5B,OAAOvvB,KAAKovB,WAGb5Y,EAAK3V,UAAU2uB,aAAe,SAASJ,GACtCpvB,KAAKovB,UAAYA,GAGlB5Y,EAAK3V,UAAUK,UAAY,WAC1B,OAAOlB,KAAKG,QAGbqW,EAAK3V,UAAUM,UAAY,SAAShB,GACnCH,KAAKG,OAASA,gBCzCR,SAASsvB,IACZzvB,KAAK0vB,KAAO,KACf1vB,KAAK2vB,QAAU,IAEf3vB,KAAK4vB,MAAQ,GACb5vB,KAAK6vB,MAAQ,KACV7vB,KAAK8vB,QAAU,KACf9vB,KAAK+vB,WAAa,KAErB/vB,KAAKV,KAAO,IAAIY,EAAAA,EAChBF,KAAKgwB,MAAQ,GAEbhwB,KAAKiwB,QAAU,GAEfjwB,KAAKkwB,QAAU,IAAIxB,EAEnB1uB,KAAKmwB,OAAS,GACdnwB,KAAKowB,wBAA0B,IAG/BpwB,KAAKqwB,SAAW,KAEhBrwB,KAAKswB,GAAK,KAIVtwB,KAAKuwB,aAAe,GACpBvwB,KAAKwwB,kBAAoB,GA4M1B,SAASC,IACL,IAAIhD,EAAK,IAAIvtB,EAAAA,EACT4C,EAAI,KACJqJ,EAAI,KAER,IAAKrJ,EAAI,EAAGA,EAAI9C,KAAK+vB,WAAYjtB,IAAK,CAElC,IADA2qB,EAAKztB,KAAKgwB,MAAMltB,GACXqJ,EAAI,EAAGA,EAAInM,KAAK+vB,WAAY5jB,IAC7BnM,KAAKgwB,MAAM7jB,GAAG3I,SAAQ,GAE1BiqB,EAAGnqB,SAAShB,EAAMmrB,KAI1B,SAASnrB,EAAMmrB,GACX,IAAIY,EAAQ,KACRvd,EAAM,KACNiI,EAAI,KAER,GAAI0U,EAAG9qB,kBAAoB,EACvB,OAAO,EAEX,GAAI8qB,EAAGlqB,SACH,OAAQ,EAEZkqB,EAAGjqB,SAAQ,GACX6qB,EAAQ,EACRvd,EAAM,EACN,IAAK,IAAIhO,EAAI,EAA0B,MAAvB2qB,EAAGzqB,cAAcF,GAAYA,KACzCiW,EAAIzW,EAAMmrB,EAAGzqB,cAAcF,GAAG9B,aACrB,IACU,KAATqtB,GAGGvd,EAAMiI,KAFXjI,EAAMiI,GAQlB,OADA0U,EAAGjqB,SAAQ,GACJsN,EAAM,ECrQV,SAAS4f,EAAeC,GAA6B,IAApBC,EAAoB,uDAAJ,GAChD/wB,EAAOG,KAEP2a,EAAU,CACV,UAAY,EACZ,UAAY,EACZ,WAAa,EACb,iBAAmB,EACnB,cAAiB,GACjB,eAAkB,IAClB,SAAY,IACZ,cAAiB,GACjB,aAAgB,GAChB,uBAA0B,GAC1B,YAAe,KACf,OAAU,qBACV,mBAAsB,IACtB,cAAiB,IAGrB9a,EAAK8a,QAAUhT,OAAOkpB,OAAOlW,EAASiW,GAEL,OAA7B/wB,EAAK8a,QAAQmW,aACbjxB,EAAK8a,QAAQoW,KAAOlxB,EAAK8a,QAAQmW,YAAY,GAC7CjxB,EAAK8a,QAAQqW,KAAOnxB,EAAK8a,QAAQmW,YAAY,KAE7CjxB,EAAK8a,QAAQoW,KAAO,IACpBlxB,EAAK8a,QAAQqW,KAAO,KAGxBnxB,EAAKoxB,cAAgB,CACjB,WAAc,EACd,aAAgB,EAChB,WAAc,EACd,cAAiB,GACjB,SAAY,EACZ,MAAS,IAGbpxB,EAAKqxB,kBAAoB,CACrB,kBAAoB,EACpB,oBAAsB,EACtB,kBAAoB,EACpB,cAAgB,EAChB,wBAA0B,EAC1B,qBAAuB,EACvB,wBAA0B,GAG9BrxB,EAAKsxB,YAAc,YACnBtxB,EAAKuxB,aAAe,GACpBvxB,EAAKwxB,KAAO,GACZxxB,EAAK2rB,WAAa,GAGlB,IACI8F,EAAgB,KAChBC,EAAc,KACdC,GAAuB,EAEvBC,EAAiB,WACjBH,EAAgB,KAChBC,EAAc,MAIdG,EAAQ7xB,EAAK6xB,MAAQ,CACrB,MAAQ,GACR,MAAQ,IA4BZ,GAzBAjrB,MAAM5F,UAAUmP,OAAS,SAAU7F,GAE/B,IAAKA,EACD,OAAO,EAGX,GAAInK,KAAKgG,QAAUmE,EAAMnE,OACrB,OAAO,EAEX,IAAK,IAAIlD,EAAI,EAAGob,EAAEle,KAAKgG,OAAQlD,EAAIob,EAAGpb,IAElC,GAAI9C,KAAK8C,aAAc2D,OAAS0D,EAAMrH,aAAc2D,OAEhD,IAAKzG,KAAK8C,GAAGkN,OAAO7F,EAAMrH,IACtB,OAAO,OAEV,GAAI9C,KAAK8C,IAAMqH,EAAMrH,GAEtB,OAAO,EAGf,OAAO,GAIPjD,EAAK8a,QAAQgX,UAAY9xB,EAAK8a,QAAQiX,UAAW,CACnD,IAAIC,GAAe,EACfC,GAAc,EAEdC,EAAU,WACV,OAAQ3Q,IAAAA,MAAAA,SACJ,KAAK,GACDvS,QAAQuK,IAAI,cAAevZ,EAAKmyB,2BAChC,MACJ,KAAK,GACDH,GAAe,EACf,MACJ,KAAK,GACDC,GAAc,EACd,MACJ,KAAK,GACDjyB,EAAKoyB,aAITH,IAEEjyB,EAAK8a,QAAQuX,UACfC,KAEEtyB,EAAK8a,QAAQgX,UAAY9xB,EAAK8a,QAAQiX,YACxCQ,MAKJC,EAAQ,WACRR,GAAe,EACfC,GAAc,EAGVjyB,EAAK8a,QAAQuX,UACfI,IAEFC,KAGJnR,IAAAA,OAAU,QACTI,GAAG,UAAWuQ,GACdvQ,GAAG,QAAS6Q,GACZ7Q,GAAG,eAAe,WACfJ,IAAAA,MAAAA,oBAKN,GAAIvhB,EAAK8a,QAAQgX,SAAU,CACvB,IAAIa,EAAiB,CACjB,CACIlQ,MAAO,WACPD,OAAQ,SAAST,EAAK7I,EAAGjW,EAAG+e,KAG5BU,SAAU,CAAC,CACP,MAAS,IACTF,OAAQ,SAAST,EAAK7I,EAAGjW,EAAG+e,GACxBhT,QAAQuK,IAAI,YAAayI,EAAUhiB,EAAK8a,QAAQoW,KAAMlxB,EAAK8a,QAAQqW,MACnE,IAAIyB,EAAiB,CAACC,EAAOC,OAAO9Q,EAAS,IACvB+Q,EAAOD,OAAO9Q,EAAS,KAC7ChT,QAAQuK,IAAI,iBAAkBqZ,GAE9B5yB,EAAKgzB,OAAO,IAAK,CAAC,SAAY,IAAK,UAAaJ,MAGxD,CACI,MAAS,IACTpQ,OAAQ,SAAST,EAAK7I,EAAGjW,EAAG+e,GACxBhT,QAAQuK,IAAI,YAAayI,EAAUhiB,EAAK8a,QAAQoW,KAAMlxB,EAAK8a,QAAQqW,MACnE,IAAIyB,EAAiB,CAACC,EAAOC,OAAO9Q,EAAS,IACvB+Q,EAAOD,OAAO9Q,EAAS,KAC7ChT,QAAQuK,IAAI,iBAAkBqZ,GAE9B5yB,EAAKgzB,OAAO,IAAK,CAAC,SAAY,IAAK,UAAaJ,MAIxD,CACI,MAAS,IACTpQ,OAAQ,SAAST,EAAK7I,EAAGjW,EAAG+e,GACxBhT,QAAQuK,IAAI,YAAayI,EAAUhiB,EAAK8a,QAAQoW,KAAMlxB,EAAK8a,QAAQqW,MACnE,IAAIyB,EAAiB,CAACC,EAAOC,OAAO9Q,EAAS,IACvB+Q,EAAOD,OAAO9Q,EAAS,KAC7ChT,QAAQuK,IAAI,iBAAkBqZ,GAE9B5yB,EAAKgzB,OAAO,IAAK,CAAC,SAAY,IAAK,UAAaJ,MAIxD,CACI,MAAS,IACTpQ,OAAQ,SAAST,EAAK7I,EAAGjW,EAAG+e,GACxBhT,QAAQuK,IAAI,YAAayI,EAAUhiB,EAAK8a,QAAQoW,KAAMlxB,EAAK8a,QAAQqW,MACnE,IAAIyB,EAAiB,CAACC,EAAOC,OAAO9Q,EAAS,IACvB+Q,EAAOD,OAAO9Q,EAAS,KAC7ChT,QAAQuK,IAAI,iBAAkBqZ,GAE9B5yB,EAAKgzB,OAAO,IAAK,CAAC,SAAY,IAAK,UAAaJ,OAKxDrQ,UAAU,IAId0Q,EAAW,CACX,CACIxQ,MAAO,cACPD,OAAQ,SAAST,EAAK7I,EAAGjW,GACrBiwB,EAAWha,IAEfqJ,UAAU,GAEd,CACIE,MAAO,cACPD,OAAQ,SAAST,EAAK7I,EAAGjW,GACrB+L,QAAQuK,IAAI,qCACZvK,QAAQuK,IAAI,gCAAkCL,IAElDwJ,SAAU,CACN,CACID,MAAO,IACPD,OAAQ,SAAST,EAAK7I,EAAGjW,GACrBkwB,EAAW,IAAKja,KAGxB,CACIuJ,MAAO,IACPD,OAAQ,SAAST,EAAK7I,EAAGjW,GACrBkwB,EAAW,IAAKja,KAIxB,CACIuJ,MAAO,IACPD,OAAQ,SAAST,EAAK7I,EAAGjW,GACrBkwB,EAAW,IAAKja,KAIxB,CACIuJ,MAAO,IACPD,OAAQ,SAAST,EAAK7I,EAAGjW,GACrBkwB,EAAW,IAAKja,OAKhC,CACIuJ,MAAO,gBACPD,OAAQ,SAAST,EAAK7I,EAAGjW,KAGzByf,SAAU,CACN,CACID,MAAO,IACPD,OAAQ,SAAST,EAAK7I,EAAGjW,GACrBmwB,EAAwB,IAAKla,GAAI,KAGzC,CACIuJ,MAAO,IACPD,OAAQ,SAAST,EAAK7I,EAAGjW,GACrBmwB,EAAwB,IAAKla,GAAI,KAIzC,CACIuJ,MAAO,IACPD,OAAQ,SAAST,EAAK7I,EAAGjW,GACrBmwB,EAAwB,IAAKla,GAAI,KAIzC,CACIuJ,MAAO,IACPD,OAAQ,SAAST,EAAK7I,EAAGjW,GACrBmwB,EAAwB,IAAKla,GAAI,OAKjD,CACIuJ,MAAO,eACPD,OAAQ,SAAST,EAAK7I,EAAGjW,GACrB+L,QAAQuK,IAAI,KAAML,IAGtBwJ,SAAU,CACN,CACID,MAAO,IACPD,OAAQ,SAAST,EAAK7I,EAAGjW,GACrBmwB,EAAwB,IAAKla,EAAG,KAIxC,CACIuJ,MAAO,IACPD,OAAQ,SAAST,EAAK7I,EAAGjW,GACrBmwB,EAAwB,IAAKla,EAAG,KAGxC,CACIuJ,MAAO,IACPD,OAAQ,SAAST,EAAK7I,EAAGjW,GACrBmwB,EAAwB,IAAKla,EAAG,KAGxC,CACIuJ,MAAO,IACPD,OAAQ,SAAST,EAAK7I,EAAGjW,GACrBmwB,EAAwB,IAAKla,EAAG,QAOpDlZ,EAAKqzB,gBAAkB5S,EAAYwS,GACnCjzB,EAAKszB,sBAAwB7S,EAAYkS,QAIzC3yB,EAAKqzB,gBAAkB,aAI3B9R,IAAAA,OAAUuP,GAASyC,OAAO,OAAOC,SAEjC,IAAIC,EAAMlS,IAAAA,OAAUuP,GACnBzO,KAAK,WAAY,GACjBqR,MAAK,WAAavzB,KAAKwzB,WACvBlS,OAAO,WACPY,KAAK,sBAAuB,iBAC5BA,KAAK,UAAW,OAASriB,EAAK8a,QAAQoW,KAAO,IAAMlxB,EAAK8a,QAAQqW,MAIjE,GAFAnxB,EAAK8a,QAAQ2Y,IAAMA,EAEfzzB,EAAK8a,QAAQgX,UAAY9xB,EAAK8a,QAAQiX,WACpC6B,EAAmBH,EAAIhS,OAAO,SACjCE,GAAG,aAAa,WAEX,GAAK8P,EAAL,CAGA,IAAIoC,EAAOtS,IAAAA,MAASuS,EAAI/Y,QACxBgZ,EACC1R,KAAK,KAAMoP,EAAc9uB,GACzB0f,KAAK,KAAMoP,EAAc7uB,GACzByf,KAAK,KAAMwR,EAAK,IAChBxR,KAAK,KAAMwR,EAAK,QAEtBlS,GAAG,aAAa,eAEhBA,GAAG,WAAW,WACL8P,IAAkBE,GAClBoC,EAASrS,QAAQsS,IAAAA,aAAoB,GAGzCpC,OAGLlQ,QAAQsS,IAAAA,kBAAyB,GACjCpS,MAAM,iBAAkB,QAGRH,OAAO,YACvBC,QAAQ,cAAc,GACtBE,MAAM,aAAc,UACpBS,KAAK,QAASriB,EAAK8a,QAAQoW,MAC3B7O,KAAK,SAAUriB,EAAK8a,QAAQqW,MAC5BxP,GAAG,aAAa,WAEfsS,YAGF,IAAIL,EAAmBH,EAGzB,IAAIK,EAAMF,EAAiBnS,OAAO,SACjCC,QAAQsS,IAAAA,MAAa,GAClBE,EAAWJ,EAAIrS,OAAO,SACzBC,QAAQ,gBAAgB,GACrByS,EAAWL,EAAIrS,OAAO,SACzBC,QAAQ,gBAAgB,GAGzB,GAAI1hB,EAAK8a,QAAQgX,SAAU,CACzB,IAAIiC,EAAWD,EAAIrS,OAAO,QACzBY,KAAK,QAAS2R,IAAAA,UACd3R,KAAK,KAAM,GACXA,KAAK,KAAM,GACXA,KAAK,KAAM,GACXA,KAAK,KAAM,GAEZoR,EAAI9R,GAAG,cAAe3hB,EAAKszB,uBAI7B,IAAIT,EAAStR,IAAAA,MAAAA,SACZ+F,OAAO,CAAC,EAAEtnB,EAAK8a,QAAQoW,OAAO9Z,MAAM,CAAC,EAAEpX,EAAK8a,QAAQoW,OACjD6B,EAASxR,IAAAA,MAAAA,SACZ+F,OAAO,CAAC,EAAEtnB,EAAK8a,QAAQqW,OAAO/Z,MAAM,CAAC,EAAGpX,EAAK8a,QAAQqW,OAEtDnxB,EAAKo0B,OAAS7S,IAAAA,SAAAA,OACX8S,YAAY,CAAC,GAAI,KACjB1xB,EAAEkwB,GACFjwB,EAAEmwB,GACFpR,GAAG,QAAQ,WACRmS,EAAIzR,KAAK,YACA,aAAed,IAAAA,MAAAA,UAAf,WAAsDA,IAAAA,MAAAA,MAAiB,QAGtF,IAAIkR,EAAgB,WAClBgB,EAAI7nB,KAAK5L,EAAKo0B,QACbzS,GAAG,gBAAiB,OAGnB2Q,EAAiB,WACnBmB,EAAI7nB,KAAK5L,EAAKo0B,QACbzS,GAAG,gBAAiB,MACpBA,GAAG,iBAAkB,MACrBA,GAAG,kBAAmB,MACtBA,GAAG,iBAAkB,MACrBA,GAAG,gBAAiB,OAGnB3hB,EAAK8a,QAAQuX,UACfI,IAGF,IAAI6B,EAAmB,SAACvZ,GACtBA,EAAKwZ,UAAYxZ,EAAKwZ,SACtBJ,EAAS/R,UAAU,WAAWuG,QAAO,SAACzP,GAAQ,OAAO6B,EAAKgG,KAAO7H,EAAE6H,OAClEW,QAAQsS,IAAAA,cAAqB,SAASxT,GAAK,OAAOA,EAAE+T,aAGnDC,EAAa,SAACzZ,GAChBA,EAAKwZ,UAAW,EAChBJ,EAAS/R,UAAU,WAAWuG,QAAO,SAACzP,GAAQ,OAAO6B,EAAKgG,KAAO7H,EAAE6H,OAClEW,QAAQsS,IAAAA,cAAqB,SAASxT,GAAK,OAAOA,EAAE+T,aAGnDN,EAAmB,WACrBE,EAAS/R,UAAU,WAClBV,QAAQsS,IAAAA,cAAqB,SAASxT,GAAK,OAAOA,EAAE+T,UAAW,MAG9DE,EAAgB,WAElB,OAAON,EAAS/R,UAAU,WAAWuG,QAAO,SAASzP,GAAK,OAAOA,EAAEqb,aAGrEv0B,EAAK00B,QAAUnT,IAAAA,IAAAA,QACZ5e,EAAEkwB,GACFjwB,EAAEmwB,GACFpR,GAAG,cAAc,SAASzI,OAC1ByI,GAAG,SAAS,WAEX,IAAIgT,EAASpT,IAAAA,MAAAA,OAAAA,SAEb4S,EAAS/R,UAAU,WAClBV,QAAQsS,IAAAA,cAAqB,SAAU9a,GACvC,OAAOA,EAAEqb,UAAYI,EAAO,GAAG,IAAMzb,EAAEvW,GAAKuW,EAAEvW,EAAIgyB,EAAO,GAAG,IAClDA,EAAO,GAAG,IAAMzb,EAAEtW,GAAKsW,EAAEtW,EAAI+xB,EAAO,GAAG,UAGnDhT,GAAG,YAAY,WAEd,IAAIgT,EAASpT,IAAAA,MAAAA,OAAAA,SAEb4S,EAAS/R,UAAU,WAClBuG,QAAO,SAAUzP,GACjB,OAAOyb,EAAO,GAAG,IAAMzb,EAAEvW,GAAKuW,EAAEvW,EAAIgyB,EAAO,GAAG,IACpCA,EAAO,GAAG,IAAMzb,EAAEtW,GAAKsW,EAAEtW,EAAI+xB,EAAO,GAAG,MAEnDjB,KAAKY,GAEN/S,IAAAA,MAAAA,OAAAA,QACAA,IAAAA,OAAUphB,MAAMyL,KAAK2V,IAAAA,MAAAA,WAGvB,IAAIgR,EAAiB,WAEpBqB,EAAiBL,OAAO,eAAe3R,MAAM,SAAU,aAEvDgS,EAAiBhoB,KAAK5L,EAAK00B,UAGxBhC,EAAkB,WAErBkB,EAAiBL,OAAO,eAAe3R,MAAM,SAAU,QAEvDgS,EAAiBhoB,KAAK5L,EAAK00B,SAC1B/S,GAAG,kBAAmB,MACtBA,GAAG,mBAAoB,MACvBA,GAAG,kBAAmB,MACtBA,GAAG,iBAAkB,OAIvB3hB,EAAK40B,MAAQrT,IAAAA,OAAAA,QACZsT,QAAO,SAAS3b,GACf,MAAkB,UAAdA,EAAE0P,SACG5oB,EAAK8a,QAAQga,aAEb90B,EAAK8a,QAAQia,eAEvBC,SAASh1B,EAAK8a,QAAQka,UACtBC,cAAa,SAAS/b,GAAK,OAAOlZ,EAAK8a,QAAQoa,uBAAyBhc,EAAE7Q,SAC1E8sB,cAAa,SAASjc,GAAK,OAAIA,EAAE4S,YAAY9rB,EAAKoxB,cACdpxB,EAAKoxB,cAAclY,EAAE4S,UAErB9rB,EAAKoxB,cAAcgE,SAEvDC,QAAQ,GACR3M,MAAM1oB,EAAK6xB,MAAMnJ,OACjB8B,MAAMxqB,EAAK6xB,MAAMrH,OACjB8K,eAAet1B,EAAK8a,QAAQwa,gBAC5BjrB,KAAK,CAACrK,EAAK8a,QAAQoW,KAAMlxB,EAAK8a,QAAQqW,OAEvC,IAAIoE,EAAOhU,IAAAA,SAAAA,OACVI,GAAG,aAAa,SAASzI,GACxBlK,QAAQuK,IAAI,aACZgI,IAAAA,MAAAA,YAAAA,kBAEAkT,IAAgBf,MAAK,SAAS8B,GAC5BA,EAAGC,OAAS,QAGf9T,GAAG,QAAQ,SAACzI,GACP8Y,IACJyC,IAAgBf,MAAK,SAAS8B,GAC5BA,EAAG7yB,GAAK4e,IAAAA,MAAAA,GACRiU,EAAG5yB,GAAK2e,IAAAA,MAAAA,GAERiU,EAAGpL,IAAM7I,IAAAA,MAAAA,GACTiU,EAAGnL,IAAM9I,IAAAA,MAAAA,MAGXvhB,EAAK01B,cACLnU,IAAAA,MAAAA,YAAAA,qBAEDI,GAAG,WAAW,SAACzI,GACdlK,QAAQuK,IAAI,WACZkb,IAAgBf,MAAK,SAAS8B,GAC5BA,EAAGC,QAAS,QAKZE,EAAsB,SAASC,GAA+B,IAApB7E,EAAoB,uDAAJ,GAEtDjW,EAAU,CACE,SAAY,GACZ,KAAQ,QACR,UAAa,GACb,cAAiB9a,EAAK8a,QAAQuR,cAC9B,aAAe,EACf,KAAQ,GACR,qBAAuB,GAMnCwJ,EAAK,IAAI9N,GAHbjN,EAAUhT,OAAOkpB,OAAOlW,EAASiW,IAGH+E,SAAUF,EAAW9a,EAAQ9D,MAC3D6e,EAAG1N,oBAAsBrN,EAAQqN,oBAEjC,IAAI4N,EAAUF,EAAGhJ,sBAEjB,GAAiC,IAA7B/R,EAAQwO,UAAUnjB,OAGlB,GAA2B,UAAvBnG,EAAK8a,QAAQkb,OAAoB,CACjC,IAAIC,EAAS,IAAIrG,EAEbsG,EAAkBD,EAAOE,sBAAsBN,EAAG/M,WACtDhO,EAAQwO,UAAY,GACpB,IAAK,IAAIrmB,EAAI,EAAGA,EAAIizB,EAAgBlG,MAAO/sB,IACvC6X,EAAQwO,UAAUjmB,KAAK,CAAC6yB,EAAgBvzB,EAAEM,GAAIizB,EAAgBtzB,EAAEK,UAEpE6X,EAAQwO,UAAYiE,EAAoBwI,EAAQjN,WAcxD,OAVUiN,EAAQhK,iBACjBxD,QAAQzN,EAAQ0N,MAChBa,aAAa,aAAcvO,EAAQwO,WACnC8C,UAAU,EAAGtR,EAAQuR,eACrBzC,iBACAK,iBACAkB,mBACAiC,mBACA5D,yBAKD4M,EAAiB,SAASC,IAC1BA,EAAcA,EAAY5U,OAAO,KAChCC,QAAQ,SAAS,GACjBW,KAAK,eAAe,SAASnJ,GAAK,OAAOA,EAAE+O,cAC3C5F,KAAK,aAAa,SAASnJ,GACxB,YAAkB,IAAPA,EAAEvW,QAAkC,IAAPuW,EAAEtW,EAC/B,aAAe,CAACsW,EAAEvW,EAAGuW,EAAEtW,GAAK,IAE5B,MAEd8wB,MAAM,SAASxa,GAAKA,EAAEqb,SAAWrb,EAAEod,oBAAqB,MAGxDjU,KAAK,OAAO,SAASnJ,GAAK,MAAO,IAAMA,EAAElS,OACzCqb,KAAK,QAAQ,SAASnJ,GACnB,MAAO,KAAOA,EAAEqd,IAAInN,UAAYlQ,EAAElS,IAAM,MAC3CwvB,aACAC,SAAS,KACTC,KAAK,YAEF12B,EAAK8a,QAAQgX,UAAY9xB,EAAK8a,QAAQiX,YACxCsE,EAAY1U,GAAG,YAAagV,IAE3BhV,GAAG,UAAWiV,IACdjV,GAAG,cAAe3hB,EAAKqzB,iBACvBznB,KAAK2pB,GAGR,IAAIsB,EAAuBR,EAAY1N,QAAO,SAASzP,GACnD,MAAqB,SAAdA,EAAE0P,UAAqC,WAAd1P,EAAE0P,YAGlCH,EAAkB4N,EAAY1N,QAAO,SAASzP,GAC9C,MAAqB,cAAdA,EAAE0P,YAkDb,OA/CAiO,EAAqBpV,OAAO,cAC3BC,QAAQsS,IAAAA,MAAa,GACrB3R,KAAK,KAAK,SAASnJ,GAChB,MAAkB,UAAdA,EAAE0P,SAA6B,EAExB1P,EAAErW,UAGhBwf,KAAK,aAAa,SAASnJ,GAAK,OAAOA,EAAE0P,YACzCvG,KAAK,YAAY,SAASnJ,GAAK,OAAOA,EAAElS,OAGzCyhB,EAAgBhH,OAAO,YACtBY,KAAK,QAAS2R,IAAAA,gBACd3R,KAAK,YAAY,SAASnJ,GAAK,OAAOA,EAAElS,OAGzCyhB,EAAgBhH,OAAO,cACtBY,KAAK,QAAS2R,IAAAA,MACd3R,KAAK,aAAa,SAASnJ,GAAK,OAAOA,EAAE0P,YACzCvG,KAAK,YAAY,SAASnJ,GAAK,OAAOA,EAAElS,OACxCqb,KAAK,KAAK,SAASnJ,GAAK,OAAOA,EAAErW,UACjC4e,OAAO,aACPqV,MAAK,SAAS5d,GACX,MAAkB,cAAdA,EAAE0P,SACK1P,EAAE+O,WAAa,IAAM/O,EAAElS,IAEvB,MAKGqvB,EAAY5U,OAAO,QACpCqV,MAAK,SAAS5d,GAAK,OAAOA,EAAElC,QAC5BqL,KAAK,QAAS2R,IAAAA,WACd3R,KAAK,cAAc,SAASnJ,GAAK,OAAOA,EAAE0P,YAG/BnH,OAAO,aAClBqV,MAAK,SAAS5d,GACX,MAAkB,cAAdA,EAAE0P,SACK1P,EAAE+O,WAAa,IAAM/O,EAAElS,IAEvB,MAIRqvB,GAGPU,EAAiB,SAASC,GAC1B,IAAIC,EAAYD,EAAWvV,OAAO,YAiCnC,OA/BCwV,EAAUxV,OAAO,aAChBqV,MAAK,SAAC5d,GAAQ,OAAOA,EAAE4S,SAAW,IAAM5S,EAAEuR,OAAOzjB,IAAM,IAAMkS,EAAE1I,OAAOxJ,OAEvEiwB,EACCvV,QAAQ,QAAQ,GAChBA,QAAQsS,IAAAA,MAAa,GACrB3R,KAAK,MAAM,SAASnJ,GAAK,OAAOA,EAAEuR,OAAO9nB,KACzC0f,KAAK,MAAM,SAASnJ,GAAK,OAAOA,EAAEuR,OAAO7nB,KACzCyf,KAAK,MAAM,SAASnJ,GAAK,OAAOA,EAAE1I,OAAO7N,KACzC0f,KAAK,MAAM,SAASnJ,GAAK,OAAOA,EAAE1I,OAAO5N,KACzCyf,KAAK,aAAa,SAASnJ,GAAK,OAAOA,EAAE4S,YACzCzJ,KAAK,kBAAkB,SAASnJ,GAAK,MAAkB,QAAdA,EAAE4S,SAA2B,OAAoB,SAEvF9rB,EAAK8a,QAAQgX,UACfmF,EAAUtV,GAAG,QAASuV,IAiBlBD,GAGV,SAASE,EAAmBje,GACxB,IAAIke,EAAY,SAACz0B,GACb,OAAOgL,KAAK+e,KAAK/pB,EAAE,GAAKA,EAAE,GAAKA,EAAE,GAAKA,EAAE,KAGxC00B,EAAWne,EACXoe,EAAape,EAAEgT,SAEfqL,EAAaC,WAAWxD,IAAAA,iBAA0B,EAClDyD,EAAaD,WAAWxD,IAAAA,oBACxB0D,EAAaF,WAAWxD,IAAAA,qBAE5B,GAAmB,OAAfsD,GAICpe,EAAEmS,OAAP,CAIA,IAAIsM,EAAI,GAAGN,EAAS10B,EAAI20B,EAAW30B,KAAM00B,EAASz0B,EAAI00B,EAAW10B,IAEjE,GAAY,GAAR+0B,EAAE,IAAmB,GAARA,EAAE,GAAnB,CAMA,IAAIjc,EAAI,GAFRic,EAAI,CAACA,EAAE,GAAKP,EAAUO,GAAIA,EAAE,GAAKP,EAAUO,KAE/B,GAAIA,EAAE,IAGdC,EAAW,EAAE1e,EAAErW,OAAS00B,GAAcI,EAAE,IAAKze,EAAErW,OAAS00B,GAAcI,EAAE,IAExEE,EAAO,KAAOD,EAAS,GAAKH,GAAcE,EAAE,GAAG,EAAIjc,EAAE,GAAGgc,EAAW,IAAM,KAAOE,EAAS,GAAKH,GAAcE,EAAE,GAAG,EAAIjc,EAAE,GAAGgc,EAAW,IAC9H,IAAOE,EAAS,GAAM,IAAOA,EAAS,GACtC,KAAOA,EAAS,GAAKH,GAAcE,EAAE,GAAG,EAAIjc,EAAE,GAAGgc,EAAW,IAAM,KAAOE,EAAS,GAAKH,GAAcE,EAAE,GAAG,EAAIjc,EAAE,GAAGgc,EAAW,IAEzInW,IAAAA,OAAUphB,MAAMkiB,KAAK,IAAKwV,KAG9B,IAAIC,EAAiB,SAAC5e,GAClB,MAAqB,YAAdA,EAAE4S,UACY,YAAd5S,EAAE4S,UACY,iBAAd5S,EAAE4S,UACY,cAAd5S,EAAE4S,UACY,cAAd5S,EAAE4S,UACY,YAAd5S,EAAE4S,UACY,eAAd5S,EAAE4S,UAGTiM,EAAmB,WAKnB,IAAK,IAAIhX,KAFT/gB,EAAK6xB,MAAMnJ,MAAQ,GACnB1oB,EAAK6xB,MAAMrH,MAAQ,GACHxqB,EAAKwxB,KACjBxxB,EAAK6xB,MAAMnJ,MAAQ1oB,EAAK6xB,MAAMnJ,MAAM/Y,OAAO3P,EAAKwxB,KAAKzQ,GAAK2H,OAC1D1oB,EAAK6xB,MAAMrH,MAAQxqB,EAAK6xB,MAAMrH,MAAM7a,OAAO3P,EAAKwxB,KAAKzQ,GAAKyJ,OAQ9D,IAFA,IAAIwN,EAAc,GAET/0B,EAAI,EAAGA,EAAIjD,EAAK6xB,MAAMnJ,MAAMviB,OAAQlD,IACzC+0B,EAAYh4B,EAAK6xB,MAAMnJ,MAAMzlB,GAAG8d,KAAO/gB,EAAK6xB,MAAMnJ,MAAMzlB,GAE5DjD,EAAK6xB,MAAMrH,MAAMyN,SAAQ,SAASC,GAC9BA,EAAKzN,OAASuN,EAAYE,EAAKzN,OAAO1J,KACtCmX,EAAK1nB,OAASwnB,EAAYE,EAAK1nB,OAAOuQ,QAG1C,IAvByB,eAuBhB9d,GAGL,KAAMjD,EAAK2rB,WAAW1oB,GAAGuN,OAAOuQ,OAAOiX,GAEnC,OADAhpB,QAAQuK,IAAI,aAAcvZ,EAAK2rB,WAAW1oB,IAC1C,WAMJ,GAHAjD,EAAK2rB,WAAW1oB,GAAGwnB,OAASuN,EAAYh4B,EAAK2rB,WAAW1oB,GAAGwnB,OAAO1J,KAClE/gB,EAAK2rB,WAAW1oB,GAAGuN,OAASwnB,EAAYh4B,EAAK2rB,WAAW1oB,GAAGuN,OAAOuQ,KAE/B,iBAA/B/gB,EAAK2rB,WAAW1oB,GAAG6oB,SAQnB,IANA,IAAIqM,EAAYn4B,EAAK6xB,MAAMrH,MAAM7B,QAAO,SAASzP,GAC7C,OAASA,EAAEuR,QAAUzqB,EAAK2rB,WAAW1oB,GAAGwnB,QAAUvR,EAAEuR,QAAUzqB,EAAK2rB,WAAW1oB,GAAGuN,QACzE0I,EAAE1I,QAAUxQ,EAAK2rB,WAAW1oB,GAAGwnB,QAAUvR,EAAE1I,QAAUxQ,EAAK2rB,WAAW1oB,GAAGwnB,SAC1D,QAAdvR,EAAE4S,YAGLxf,EAAI,EAAGA,EAAI6rB,EAAUhyB,OAAQmG,IAAK,CACvC,IAAI8rB,EAAYp4B,EAAK6xB,MAAMrH,MAAMzjB,QAAQoxB,EAAU7rB,IACnDtM,EAAK6xB,MAAMrH,MAAM6N,OAAOD,EAAW,GAI3CvG,EAAMrH,MAAMnnB,KAAKrD,EAAK2rB,WAAW1oB,KAzB5BA,EAAI,EAAGA,EAAIjD,EAAK2rB,WAAWxlB,OAAQlD,IAAK,EAAxCA,IA6BbjD,EAAKs4B,OAAS,WACVt4B,EAAK40B,MAAMlM,MAAM1oB,EAAK6xB,MAAMnJ,OAC3B8B,MAAMxqB,EAAK6xB,MAAMrH,OAEdxqB,EAAK8a,QAAQiX,WACf/xB,EAAK40B,MAAMp0B,QAGb,IAAI+3B,EAAWrE,EAAS9R,UAAU,aACjCnY,KAAKjK,EAAK6xB,MAAMrH,MAAM7B,OAAOmP,GAAiBU,GAE/CD,EAASlW,KAAK,QAAS,IACtBX,QAAQ,QAAQ,GAChBA,QAAQsS,IAAAA,MAAa,GACrB3R,KAAK,aAAa,SAASnJ,GAAK,OAAOA,EAAE4S,YAE1C,IAAIkL,EAAauB,EAAS/W,QAC1BuV,EAAeC,GAEfuB,EAASE,OAAOjF,SAEhB,IAAIkF,EAASvE,EAAS/R,UAAU,WAC/BnY,KAAKjK,EAAK6xB,MAAMnJ,MAAO8P,GAGpBnC,EAAcqC,EAAOlX,QACzB4U,EAAeC,GACfqC,EAAOD,OAAOjF,SAKd,IAAImF,EAAY34B,EAAK6xB,MAAMnJ,MAAMC,QAAO,SAASzP,GAAK,MAAqB,cAAdA,EAAE0P,UAA0C,SAAd1P,EAAE0P,YAE7F8P,EAAOnF,OAAO,IAAMS,IAAAA,gBAAuBN,KAAKyD,GAEhDn3B,EAAK40B,MAAMjT,GAAG,QAAQ,WA6BlB,IA5BA,IAAIjF,EAAI6E,IAAAA,KAAAA,SAAiBoX,GACrB11B,EAAI,EACJqI,EAAIqtB,EAAUxyB,OAEdyyB,EAAU,SAAC7d,GACX,IAAIgF,EAAIhF,EAAKlY,OAAS,GACtBg2B,EAAM9d,EAAKpY,EAAIod,EACf+Y,EAAM/d,EAAKpY,EAAIod,EACfgZ,EAAMhe,EAAKnY,EAAImd,EACfiZ,EAAMje,EAAKnY,EAAImd,EACf,OAAO,SAASkZ,EAAMC,EAAIC,EAAIC,EAAIC,GAC9B,GAAIJ,EAAKK,OAAUL,EAAKK,QAAUve,EAAO,CACrC,IAAIpY,EAAIoY,EAAKpY,EAAIs2B,EAAKK,MAAM32B,EAC5BC,EAAImY,EAAKnY,EAAIq2B,EAAKK,MAAM12B,EACxByb,EAAI1Q,KAAK+e,KAAK/pB,EAAIA,EAAIC,EAAIA,GAC1Bmd,EAAIhF,EAAKlY,OAASo2B,EAAKK,MAAMz2B,OACzBwb,EAAI0B,IACJ1B,GAAKA,EAAI0B,GAAK1B,EAAI,GAClBtD,EAAKpY,GAAKA,GAAK0b,EACftD,EAAKnY,GAAKA,GAAKyb,EACf4a,EAAKK,MAAM32B,GAAKA,EAChBs2B,EAAKK,MAAM12B,GAAKA,GAGxB,OAAOs2B,EAAKJ,GAAOM,EAAKP,GAAOM,EAAKH,GAAOK,EAAKN,MAI/C91B,EAAIqI,GAAGoR,EAAE6c,MAAMX,EAAQD,EAAU11B,KAE1Cs1B,EAASlW,KAAK,MAAM,SAASnJ,GAAK,OAAOA,EAAEuR,OAAO9nB,KACjD0f,KAAK,MAAM,SAASnJ,GAAM,OAAOA,EAAEuR,OAAO7nB,KAC1Cyf,KAAK,MAAM,SAASnJ,GAAK,OAAOA,EAAE1I,OAAO7N,KACzC0f,KAAK,MAAM,SAASnJ,GAAK,OAAOA,EAAE1I,OAAO5N,KAG1C81B,EAAOrW,KAAK,aAAa,SAASnJ,GAC9B,MAAO,aAAe,CAACA,EAAEvW,EAAGuW,EAAEtW,GAAK,OAGvC81B,EAAOnF,OAAO,IAAMS,IAAAA,gBAAuBN,KAAKyD,MAIpDn3B,EAAK40B,MAAMjT,GAAG,OAAO,WACjB+W,EAAOtW,UAAU,0BAChBuG,QAAO,SAACzP,EAAEjW,GAAQ,OAAS,GAALA,KACtBywB,MAAK,SAACxa,EAAEjW,UAYbjD,EAAKw5B,kBAAkBx5B,EAAKsxB,aAExBtxB,EAAK8a,QAAQiX,WACf/xB,EAAK40B,MAAMp0B,QAGbi5B,KAGJz5B,EAAK05B,cAAgB,SAASC,EAAcC,GACxC,GAAI55B,EAAKukB,YAAcoV,EAAvB,CAGI35B,EAAKukB,WAAaoV,EAGtB,IAAIlD,EAAWz2B,EAAK8a,QAAQ+e,mBAExBrR,EAAOxoB,EAAK6xB,MAAMnJ,MACrBC,QAAO,SAASzP,GAAK,MAAqB,cAAdA,EAAE0P,YAC9BxE,KAAI,SAASlL,GAAK,OAAOA,EAAE6H,OAGxB+Y,EAAanE,EAAoBgE,EADvB,CAAC,KAAQnR,IAGnBkQ,EAASvE,EAAS/R,UAAU,WAAWnY,KAAK6vB,EAAWpR,MAAO8P,GAC9DhO,EAAQ0J,EAAS9R,UAAU,aAAanY,KAAK6vB,EAAWtP,MAAM7B,OAAOmP,GAAiBU,GAEzE,IAAb/B,EACAiC,EAAOrW,KAAK,aAAa,SAASnJ,GAC9B,MAAO,aAAe,CAACA,EAAEvW,EAAGuW,EAAEtW,GAAK,OAGvC81B,EAAOlC,aACNnU,KAAK,aAAa,SAASnJ,GACxB,MAAO,aAAe,CAACA,EAAEvW,EAAGuW,EAAEtW,GAAK,OAAQ6zB,SAASA,GAI5D,IAAIsD,EAAW3D,EAAesC,EAAOlX,SACpCa,KAAK,aAAa,SAASnJ,GACxB,YAAkB,IAAPA,EAAEvW,QAAkC,IAAPuW,EAAEtW,EAC/B,aAAe,CAAC,EAAG,GAAK,IAExB,MAGE,IAAb6zB,EACAiC,EAAOD,OAAOjF,SAEdkF,EAAOD,OAAOjC,aACbnU,KAAK,aAAa,SAASnJ,GACxB,YAAkB,IAAPA,EAAEvW,QAAkC,IAAPuW,EAAEtW,EAC/B,aAAe,CAAC,EAAG,GAAK,IAExB,MAGnB5C,EAAK6xB,MAAMnJ,MAAQgQ,EAAOzuB,OAC1ByuB,EAAOnF,OAAO,IAAMS,IAAAA,gBAAuBN,KAAKyD,GAChDn3B,EAAKw5B,kBAAkBx5B,EAAKsxB,aAC5BmI,IACAz5B,EAAKoyB,WAAWqE,GAqBhBjM,EAAMiO,OAAOjF,SAEI,IAAbiD,GACAjM,EACCnI,KAAK,MAAM,SAASnJ,GAAK,OAAOA,EAAEuR,OAAO9nB,KACzC0f,KAAK,MAAM,SAASnJ,GAAK,OAAOA,EAAEuR,OAAO7nB,KACzCyf,KAAK,MAAM,SAASnJ,GAAK,OAAOA,EAAE1I,OAAO7N,KACzC0f,KAAK,MAAM,SAASnJ,GAAK,OAAOA,EAAE1I,OAAO5N,KAE3Bm0B,EAAevM,EAAMhJ,SACpCxhB,EAAK6xB,MAAMrH,MAAQA,EAAMvgB,OAEzBwvB,KAEAjP,EAAMgM,aACLnU,KAAK,MAAM,SAASnJ,GAAK,OAAOA,EAAEuR,OAAO9nB,KACzC0f,KAAK,MAAM,SAASnJ,GAAK,OAAOA,EAAEuR,OAAO7nB,KACzCyf,KAAK,MAAM,SAASnJ,GAAK,OAAOA,EAAE1I,OAAO7N,KACzC0f,KAAK,MAAM,SAASnJ,GAAK,OAAOA,EAAE1I,OAAO5N,KACzC6zB,SAASA,GACT7qB,MAvCL,SAAgB4qB,EAAYwD,GACE,IAAtBxD,EAAWnsB,QAAgB4vB,WAAWD,EAAUvD,GACpD,IAAInrB,EAAI,EACRkrB,EACC9C,MAAK,aAAepoB,KACpBooB,KAAK,OAAO,aAAoBpoB,GAAG0uB,EAASxrB,MAAMrO,KAAMsK,iBAG7D,WACmBssB,EAAevM,EAAMhJ,SACpCxhB,EAAK6xB,MAAMrH,MAAQA,EAAMvgB,OACzBjK,EAAKw5B,kBAAkBx5B,EAAKsxB,aAC5BmI,SAE2B,IAAhBG,GACPA,OA2BS,IAAbnD,EACAsD,EACC1X,KAAK,aAAa,SAASnJ,GACxB,YAAkB,IAAPA,EAAEvW,QAAkC,IAAPuW,EAAEtW,EAC/B,aAAe,CAACsW,EAAEvW,EAAGuW,EAAEtW,GAAK,IAE5B,MAGfm3B,EAASvD,aACRnU,KAAK,aAAa,SAASnJ,GACxB,YAAkB,IAAPA,EAAEvW,QAAkC,IAAPuW,EAAEtW,EAC/B,aAAe,CAACsW,EAAEvW,EAAGuW,EAAEtW,GAAK,IAE5B,QAOvB,IAAIs3B,EAA0B,WAK1B,GAAgC,IAA5Bl6B,EAAK6xB,MAAMnJ,MAAMviB,OACjB,MAAO,CAAC,UAAa,CAAC,EAAE,GAAI,MAAS,GAGzC,IAAIg0B,EAAO5Y,IAAAA,IAAOvhB,EAAK6xB,MAAMnJ,MAAMtE,KAAI,SAASlL,GAAI,OAAOA,EAAEvW,MACzDy3B,EAAO7Y,IAAAA,IAAOvhB,EAAK6xB,MAAMnJ,MAAMtE,KAAI,SAASlL,GAAI,OAAOA,EAAEtW,MAEzDy3B,EAAO9Y,IAAAA,IAAOvhB,EAAK6xB,MAAMnJ,MAAMtE,KAAI,SAASlL,GAAI,OAAOA,EAAEvW,MACzD23B,EAAO/Y,IAAAA,IAAOvhB,EAAK6xB,MAAMnJ,MAAMtE,KAAI,SAASlL,GAAI,OAAOA,EAAEtW,MAEzD23B,EAAYhZ,IAAAA,IAAOvhB,EAAK6xB,MAAMnJ,MAAMtE,KAAI,SAASlL,GAAK,OAAOA,EAAErW,WAG/D23B,EAAWH,EAAOF,EAClBM,EAAYH,EAAOF,EAGnBM,EAAa16B,EAAK8a,QAAQoW,MAAQsJ,EAAW,GAC7CG,EAAc36B,EAAK8a,QAAQqW,MAAQsJ,EAAY,GAI/CG,EAC8D,GADnDjtB,KAAKC,IAAI8sB,EAAYC,EACZ36B,EAAK8a,QAAQ+f,cAAgBN,GAGjDO,EAAcN,EAAWI,EACzBG,EAAeN,EAAYG,EAM/B,MAAO,CAAC,UAAa,EAHNT,EAAQS,GAAY56B,EAAK8a,QAAQoW,KAAO4J,GAAe,GACvDV,EAAQQ,GAAY56B,EAAK8a,QAAQqW,KAAO4J,GAAgB,GAEhC,MAASH,IAGpD56B,EAAKoyB,WAAa,WAAuB,IAAdqE,EAAc,uDAAH,EAC9BuE,EAAcd,IAEE,OAAhBc,IAIJlH,EAAI0C,aAAanU,KAAK,YACb,aAAe2Y,EAAYC,UAA3B,WAAyDD,EAAYE,MAAQ,KAAKzE,SAASA,GAIpGz2B,EAAKo0B,OAAO6G,UAAUD,EAAYC,WAClCj7B,EAAKo0B,OAAO8G,MAAMF,EAAYE,SAGlCl7B,EAAKm7B,QAAU,WAGV,IAFHjK,EAEG,uDAFI3P,IAAAA,OAAUuP,GAAS/V,OAAOqgB,YACjCjK,EACG,uDADI5P,IAAAA,OAAUuP,GAAS/V,OAAOsgB,aAGjCr7B,EAAK8a,QAAQoW,KAAOA,EACpBlxB,EAAK8a,QAAQqW,KAAOA,EAGpBsC,EAAIpR,KAAK,UAAW,OAAS6O,EAAO,IAAMC,GAG1C0B,EAAOzb,MAAM,CAAC,EAAG8Z,IAAO5J,OAAO,CAAC,EAAG4J,IACnC6B,EAAO3b,MAAM,CAAC,EAAG+Z,IAAO7J,OAAO,CAAC,EAAG6J,IAGnCnxB,EAAKo0B,OAAOzxB,EAAEkwB,GACbjwB,EAAEmwB,GACH/yB,EAAK00B,QAAQ/xB,EAAEkwB,GACdjwB,EAAEmwB,GAGHU,EAAIF,OAAO,eACVlR,KAAK,QAAS6O,GACd7O,KAAK,SAAU8O,GAGhBnxB,EAAKoyB,cAIPpyB,EAAKs7B,gBAAkB,SAAS/T,GAChB4M,EAAS/R,UAAU,WAAWmR,OAAO,0BAC3C3R,MAAM,OAAQ2F,IAGxBvnB,EAAKu7B,gBAAkB,SAAyBC,GAE5Cx7B,EAAKuxB,aAAeiK,EACpBx7B,EAAKw5B,kBAAkB,WAG3Bx5B,EAAKy7B,oBAAsB,SAASC,GAChC,IAAIC,EAAK,IAAItV,EAAYqV,GACzB17B,EAAKuxB,aAAeoK,EAAG3U,WACvBhnB,EAAKw5B,kBAAkB,WAG3Bx5B,EAAKw5B,kBAAoB,SAASoC,GACXzH,EAAS/R,UAAU,uBAEzBV,QAAQsS,IAAAA,MAAa,GACrB3R,KAAK,KAAK,SAASnJ,GAAK,OAAOA,EAAErW,UAEjCsxB,EAAS/R,UAAU,WAClB+R,EAAS/R,UAAU,WAAWA,UAAU,UADtD,IAEIsG,EAAQyL,EAAS/R,UAAU,WAAWmR,OAAO,0BAIjD,GAHAvzB,EAAKsxB,YAAcsK,EAGG,YAAlBA,EAA8B,CAC9B,IAAIV,EAAQ3Z,IAAAA,MAAAA,UACXnK,MAAM,CAAC,UAAW,UAAW,UAAW,UAAW,YACnDkQ,OAAO,CAAC,IAAI,IAAI,IAAI,IAAI,MACzBoB,EAAM9G,MAAM,QAAQ,SAAS1I,GACzB,OAAOgiB,EAAMhiB,EAAElC,cAGhB,GAAsB,aAAlB4kB,EACHV,EAAQ3Z,IAAAA,MAAAA,aACX+F,OAAO,CAAC,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,MAChClQ,MAAM,CAAC,aAAc,UAAW,UAAW,cACrC,YAAa,YAAa,gBAE1BsR,EAAM9G,MAAM,QAAQ,SAAS1I,GACzB,OAAOgiB,EAAMhiB,EAAEuQ,kBAGvB,GAAsB,aAAlBmS,EACPlT,EAAM9G,MAAM,QAAQ,SAAS1I,GAMzB,OALYqI,IAAAA,MAAAA,SACXnK,MAAM,CAAC,UAAW,UAAW,YAC7BykB,YAAYta,IAAAA,gBACZ+F,OAAO,CAAC,EAAG,GAAKpO,EAAEqd,IAAInN,UAAY,GAAK,EAAGlQ,EAAEqd,IAAInN,WAE1C8R,CAAMhiB,EAAElS,aAEhB,GAAsB,UAAlB40B,EAA4B,MAGH,IAArB57B,EAAKuxB,cACZ,WAAYvxB,EAAKuxB,cAClB,UAAWvxB,EAAKuxB,eACX2J,EAAQ3Z,IAAAA,MAAAA,SACXsa,YAAYta,IAAAA,gBACZ+F,OAAOtnB,EAAKuxB,aAAajK,QACzBlQ,MAAMpX,EAAKuxB,aAAana,QAG7B,IAAI0kB,EAAe,SAACC,EAAgB7iB,EAAGgiB,GACnC,GAAIa,EAAejc,eAAe5G,EAAElS,KAAM,CACtC,IAAIyE,EAAM+rB,WAAWuE,EAAe7iB,EAAElS,MAEtC,OAAIsS,MAAM7N,GAGCswB,EAAe7iB,EAAElS,KAIjBk0B,EAAMzvB,GAGjB,MAAO,SAIfid,EAAM9G,MAAM,QAAQ,SAAS1I,GACzB,QAAgC,IAArBlZ,EAAKuxB,eACZvxB,EAAKuxB,aAAazR,eAAe,eACjC,MAAO,QAGX,GAAI9f,EAAKuxB,aAAatK,YAAYnH,eAAe5G,EAAE+O,aAC/CjoB,EAAKuxB,aAAatK,YAAY/N,EAAE+O,YAAYnI,eAAe5G,EAAElS,KAAM,CAGnE,IAAI+0B,EAAiB/7B,EAAKuxB,aAAatK,YAAY/N,EAAE+O,YACrD,OAAO6T,EAAaC,EAAgB7iB,EAAGgiB,GACpC,GAAIl7B,EAAKuxB,aAAatK,YAAYnH,eAAe,IAAK,CACzD,IAAIic,EAAiB/7B,EAAKuxB,aAAatK,YAAY,IACnD,OAAO6U,EAAaC,EAAgB7iB,EAAGgiB,GAG3C,MAAO,aAKnB,IAAIzB,EAAc,WAEdtF,EAAS/R,UAAU,qBAAqBV,QAAQsS,IAAAA,aAAqBh0B,EAAKqxB,kBAAkB2K,kBAC5F7H,EAAS/R,UAAU,sBAAsBV,QAAQsS,IAAAA,aAAqBh0B,EAAKqxB,kBAAkB2K,kBAC7F9H,EAAS9R,UAAU,0BAA0BV,QAAQsS,IAAAA,aAAqBh0B,EAAKqxB,kBAAkB2K,kBAEjGvI,EAAIrR,UAAU,0BAA0BV,QAAQsS,IAAAA,aAAqBh0B,EAAKqxB,kBAAkB4K,oBAE5F9H,EAAS/R,UAAU,2BAA2BV,QAAQsS,IAAAA,aAAqBh0B,EAAKqxB,kBAAkB6K,kBAElGzI,EAAIrR,UAAU,4JAA4JV,QAAQsS,IAAAA,aAAqBh0B,EAAKqxB,kBAAkB8K,cAE9N1I,EAAIrR,UAAU,0BAA0BV,QAAQsS,IAAAA,aAAqBh0B,EAAKqxB,kBAAkB+K,wBAE5F3I,EAAIrR,UAAU,6BAA6BV,QAAQsS,IAAAA,aAAqBh0B,EAAKqxB,kBAAkBgL,qBAE/FnI,EAAS9R,UAAU,oBAAoBV,QAAQsS,IAAAA,aAAqBh0B,EAAK8a,QAAQwhB,iBACjFpI,EAAS9R,UAAU,yBAAyBV,QAAQsS,IAAAA,aAAqBh0B,EAAK8a,QAAQwhB,iBAEtF7I,EAAIrR,UAAU,IAAM4R,IAAAA,gBAAuBtS,QAAQsS,IAAAA,aAAqBh0B,EAAKqxB,kBAAkBkL,yBAI/FpJ,EAAa,SAASlH,EAAUuQ,GAEhC,IAAIjG,EAAMiG,EAAcjG,IAEpBhS,EAAa6B,EAAarB,sBAAsBwR,EAAIzN,WACpDQ,EAAYiN,EAAI7M,aAAa,cAC7BoM,EAAWS,EAAIvO,IACfQ,EAAO+N,EAAI5M,UAEX8S,EAAaD,EAAcx1B,IAE3B01B,EAAgBnY,EAChBoY,EAAc7G,EAASntB,MAAM,EAAE8zB,EAAW,GAAMxQ,EAAW6J,EAASntB,MAAM8zB,GAE9EztB,QAAQuK,IAAI,eAAgBojB,GAE5B3tB,QAAQuK,IAAI,QAASiP,GACrBA,EAAK6P,OAAOoE,EAAW,EAAG,EAAGzb,EAAAA,QAC7B,IAAI4b,EAAetT,SAEZtpB,EAAKwxB,KAAK+E,EAAIxV,KACR/gB,EAAKgzB,OAAO0J,EAAe,CAAC,SAAYC,EAC5B,UAAaC,EACb,KAAQpU,EACR,YAAc,KAGvC4K,EAA0B,SAASnH,EAAUuQ,EAAeK,GAG5D,IAAItG,EAAMiG,EAAcjG,IAEpBhS,EAAa6B,EAAarB,sBAAsBwR,EAAIzN,WACpDQ,EAAYiN,EAAI7M,aAAa,cAC7BoM,EAAWS,EAAIvO,IACfQ,EAAO+N,EAAI5M,UAEX8S,EAAaD,EAAcx1B,IAAM61B,EAEjCH,EAAgBnY,EAAW5b,MAAM,EAAE8zB,GAAc,IAAMlY,EAAW5b,MAAM8zB,GACxEE,EAAc7G,EAASntB,MAAM,EAAE8zB,GAAexQ,EAAW6J,EAASntB,MAAM8zB,GAE5EztB,QAAQuK,IAAI,eAAgBojB,GAE5BnU,EAAK6P,OAAOoE,EAAY,EAAGzb,EAAAA,QAC3BsI,EAAU+O,OAAOoE,EAAY,EAAGnT,EAAUmT,EAAaI,EAAe,IAEtE,IAAIC,EAAUtU,EACVoU,EAAetT,EAEnBta,QAAQuK,IAAI,aAAc+P,GAC1Bta,QAAQuK,IAAI,sBAAuBqjB,UAE5B58B,EAAKwxB,KAAK+E,EAAIxV,KACR/gB,EAAKgzB,OAAO0J,EAAe,CAAC,SAAYC,EAC5B,UAAaC,EACb,KAAQE,EACR,YAAc,KAGvC5J,EAAa,SAASnY,GACtB/L,QAAQuK,IAAI,cAAewB,GAE3B,IAAIwb,EAAMxb,EAAKwb,IACXwG,EAAOxG,EAAIzN,UAAU/N,EAAK/T,KAGlB,GAAR+1B,IACAxG,EAAIzN,UAAU/N,EAAK/T,KAAO,EAC1BuvB,EAAIzN,UAAUiU,GAAQ,GAG1B,IAAIxY,EAAa6B,EAAarB,sBAAsBwR,EAAIzN,WACpDQ,EAAYiN,EAAI7M,aAAa,cAC7BoM,EAAWS,EAAIvO,IACfQ,EAAO+N,EAAI5M,UAEX+S,EAAgBnY,EAAW5b,MAAM,EAAGoS,EAAK/T,IAAI,GAAKud,EAAW5b,MAAMoS,EAAK/T,KACxE41B,EAAetT,EAAU3gB,MAAM,EAAGoS,EAAK/T,IAAI,GACtC2I,OAAO2Z,EAAU3gB,MAAMoS,EAAK/T,MACjC21B,EAAc7G,EAASntB,MAAM,EAAGoS,EAAK/T,IAAI,GAAK8uB,EAASntB,MAAMoS,EAAK/T,KAClE81B,EAAUtU,EAAK7f,MAAM,EAAGoS,EAAK/T,IAAI,GAC5B2I,OAAO6Y,EAAK7f,MAAMoS,EAAK/T,aAEzBhH,EAAKwxB,KAAK+E,EAAIxV,KACR/gB,EAAKgzB,OAAO0J,EAAe,CAAC,SAAYC,EAC5B,UAAaC,EACb,KAAQE,EACP,YAAc,IAExC9tB,QAAQuK,IAAI,kBAAmBmjB,IAS/BlE,EAAa,SAACtf,GACd,OAAOA,EAAE6H,KAGTic,GAAiB,SAASjd,GAC1B,IAAIkd,EAAsBld,EAAE2J,aAAa,cACrCwT,EAAiBnd,EAAE2J,aAAa,SAEhClB,EAAOzI,EAAE4J,UAEb5J,EAAE8M,sBACDd,iBACAsB,iBACAhE,aAAa,aAAc4T,GAC3B1U,QAAQC,GACR4D,UAAU,EAAGpsB,EAAK8a,QAAQuR,eAC1BhD,aAAa,QAAS6T,GACtBtT,iBACAK,iBACAM,kBAGD4S,GAAqB,SAASjkB,GAC9B,GAAIA,EAAE1I,OAAOxJ,IAAMkS,EAAEuR,OAAOzjB,KAAO,EAAnC,CASA,IAHA,IAAIuvB,EAAMrd,EAAE1I,OAAO+lB,IACfpR,EAAW,GAENliB,EAAI,EAAGA,EAAIszB,EAAI/L,MAAMrkB,OAAQlD,IAAK,CACvC,IAAIi1B,EAAO3B,EAAI/L,MAAMvnB,GAEA,YAAjBi1B,EAAKpM,UAGLoM,EAAKzN,OAAOzjB,KAAOkS,EAAEuR,OAAOzjB,KAAOkxB,EAAK1nB,OAAOxJ,KAAOkS,EAAE1I,OAAOxJ,MAC/DgI,QAAQuK,IAAI,oBAAqB2e,GACjC/S,EAAS9hB,KAAK60B,IAOtBlpB,QAAQuK,IAAI,YAAa4L,GAEzB,IAAK,IAAIliB,EAAI,EAAGA,EAAIkiB,EAAShf,OAAQlD,IACjCszB,EAAIzN,UAAU3D,EAASliB,GAAGwnB,OAAOzjB,KAAO,EACxCuvB,EAAIzN,UAAU3D,EAASliB,GAAGuN,OAAOxJ,KAAO,EAExCme,EAASliB,GAAGmF,KAAO+c,EAASliB,GAAGwnB,OAAOzjB,IACtCme,EAASliB,GAAGiiB,GAAKC,EAASliB,GAAGuN,OAAOxJ,IAAMkS,EAAEuR,OAAOzjB,IAKxCuvB,EAAIvO,IAAnB,IACIoV,EAAY7G,EAAIvO,IAAIrf,MAAM,EAAGuQ,EAAEuR,OAAOzjB,KACtCq2B,EAAY9G,EAAIvO,IAAIrf,MAAMuQ,EAAEuR,OAAOzjB,KAEnCs2B,EAAgBlX,EAAarB,sBAAsBwR,EAAIzN,WACvDyU,EAAcD,EAAc30B,MAAM,EAAGuQ,EAAEuR,OAAOzjB,KAC9Cw2B,EAAcF,EAAc30B,MAAMuQ,EAAEuR,OAAOzjB,KAI3CsiB,EAAYiN,EAAI7M,aAAa,cAC7BlB,EAAO+N,EAAI5M,UAEX8T,EAAanU,EAAU3gB,MAAM,EAAGuQ,EAAEuR,OAAOzjB,KACzC02B,EAAapU,EAAU3gB,MAAMuQ,EAAEuR,OAAOzjB,KAEtC22B,EAAQnV,EAAK7f,MAAM,EAAGuQ,EAAEuR,OAAOzjB,KAC/B42B,EAAQpV,EAAK7f,MAAMuQ,EAAEuR,OAAOzjB,KAEhCgI,QAAQuK,IAAI,cAAekkB,GAC3BzuB,QAAQuK,IAAI,cAAemkB,UAEpB19B,EAAKwxB,KAAK+E,EAAIxV,KAOrB,IANA,IAAI8c,EAAO79B,EAAKgzB,OAAOuK,EAAa,CAAE,SAAYH,EACvB,UAAaK,EACb,KAAQE,IAC/BG,EAAO99B,EAAKgzB,OAAOwK,EAAa,CAAE,SAAYH,EACvB,UAAaK,EACb,KAAQE,IAC1B36B,EAAI,EAAGA,EAAIkiB,EAAShf,OAAQlD,IACjC+L,QAAQuK,IAAI,QAASskB,GACrB7uB,QAAQuK,IAAI,QAASukB,GACrB9uB,QAAQuK,IAAI,cAAe4L,EAASliB,IACpCjD,EAAK2rB,WAAWtoB,KACZ,CAAC,OAAUw6B,EAAKnV,MAAMvD,EAASliB,GAAGmF,KAAK,GACtC,OAAU01B,EAAKpV,MAAMvD,EAASliB,GAAGiiB,GAAG,GACpC,MAAS,EACT,IAAOlE,EAAAA,OACP,SAAY,kBACb+W,IACA/3B,EAAKs4B,SAGbtpB,QAAQuK,IAAI,mBAAoBvZ,EAAK2rB,iBA9EjC3c,QAAQuK,IAAI,qCAAsCL,EAAE1I,OACxC,UAAW0I,EAAEuR,OAAQ,QAASvR,IAqF9C6kB,GAAa,SAAS7kB,GAEtB,IAAI2I,EAAQ7hB,EAAK6xB,MAAMrH,MAAMzjB,QAAQmS,GAGrC,GAFAlK,QAAQuK,IAAI,iBAAkBsI,GAE1BA,GAAS,EAAG,CAOZ,GAAI3I,EAAEuR,OAAO8L,KAAOrd,EAAE1I,OAAO+lB,IAAK,CAC9B,GAAkB,YAAdrd,EAAE4S,SAGF,OAFA9c,QAAQuK,IAAI,mCAAoCL,EAAEuR,OAAOzjB,IAAKkS,EAAE1I,OAAOxJ,UACvEm2B,GAAmBjkB,GAGnB,IAAI6G,EAAI7G,EAAEuR,OAAO8L,IACjBxW,EAAEsN,iBACFtN,EAAE+I,UAAU5P,EAAEuR,OAAOzjB,KAAO,EAC5B+Y,EAAE+I,UAAU5P,EAAE1I,OAAOxJ,KAAO,EAE5Bg2B,GAAejd,OAEhB,CAEH,IAAIie,EAAiBh+B,EAAK2rB,WAAW5kB,QAAQmS,GAE7ClZ,EAAK2rB,WAAW0M,OAAO2F,EAAgB,GAE3CjG,IAEJ/3B,EAAKs4B,UAGL2F,GAAkB,SAASrS,GAG3B,IAAIiS,EAAOjS,EAAQpb,OAAO+lB,IACtBuH,EAAOlS,EAAQnB,OAAO8L,IACA,GAAtB3K,EAAQpb,OAAOxJ,MACjB62B,EAAOjS,EAAQnB,OAAO8L,IACtBuH,EAAOlS,EAAQpb,OAAO+lB,KAqBxB,IAlBA,IAAI2H,EAAc9X,EAAarB,sBAAsB8Y,EAAK/U,WACtDqV,EAAc/X,EAAarB,sBAAsB+Y,EAAKhV,WAEtDsV,EAAOP,EAAK7V,IACZqW,EAAOP,EAAK9V,IAEZyV,EAAaI,EAAKnU,aAAa,cAC/BgU,EAAaI,EAAKpU,aAAa,cAG/BgT,EAAgBwB,EAAcC,EAC9BG,EAASF,EAAOC,EAChBzB,EAAea,EAAW9tB,OAAO+tB,GAGjCa,EAAgB,GAChBC,EAAW,GAENv7B,EAAI,EAAGA,EAAIjD,EAAK2rB,WAAWxlB,OAAQlD,IACxC+L,QAAQuK,IAAI,qBAAsBvZ,EAAK2rB,WAAW1oB,IAClD+L,QAAQuK,IAAI,QAASskB,GACrB7uB,QAAQuK,IAAI,QAASukB,GACjB99B,EAAK2rB,WAAW1oB,GAAGwnB,OAAO8L,KAAOsH,EAC5B79B,EAAK2rB,WAAW1oB,GAAGuN,OAAO+lB,KAAOuH,IAWlCS,EAAcl7B,KAAK,CACf,OAAUrD,EAAK2rB,WAAW1oB,GAAGuN,OAC7B,OAAUxQ,EAAK2rB,WAAW1oB,GAAGwnB,OAAOzjB,MAGxCw3B,EAASx+B,EAAK2rB,WAAW1oB,GAAG8d,MAAO,GAEhC/gB,EAAK2rB,WAAW1oB,GAAGwnB,OAAO8L,KAAOuH,IACnC99B,EAAK2rB,WAAW1oB,GAAGuN,OAAO+lB,KAAOsH,IASlCU,EAAcl7B,KAAK,CACf,OAAUrD,EAAK2rB,WAAW1oB,GAAGuN,OAC7B,OAAUxQ,EAAK2rB,WAAW1oB,GAAGwnB,OAAOzjB,IAAMk3B,EAAY/3B,SAE1Dq4B,EAASx+B,EAAK2rB,WAAW1oB,GAAG8d,MAAO,IAIvC/gB,EAAK2rB,WAAW1oB,GAAGuN,OAAO+lB,KAAOsH,EAC7B79B,EAAK2rB,WAAW1oB,GAAGwnB,OAAO8L,KAAOuH,IAKjCS,EAAcl7B,KAAK,CACf,OAAUrD,EAAK2rB,WAAW1oB,GAAGwnB,OAC7B,OAAUzqB,EAAK2rB,WAAW1oB,GAAGuN,OAAOxJ,MAGxCw3B,EAASx+B,EAAK2rB,WAAW1oB,GAAG8d,MAAO,GAEhC/gB,EAAK2rB,WAAW1oB,GAAGuN,OAAO+lB,KAAOuH,GACpC99B,EAAK2rB,WAAW1oB,GAAGwnB,OAAO8L,KAAOsH,IACjCU,EAAcl7B,KAAK,CACf,OAAUrD,EAAK2rB,WAAW1oB,GAAGwnB,OAC7B,OAAUzqB,EAAK2rB,WAAW1oB,GAAGuN,OAAOxJ,IAAMk3B,EAAY/3B,SAG1Dq4B,EAASx+B,EAAK2rB,WAAW1oB,GAAG8d,MAAO,GAM/C/gB,EAAK2rB,WAAa3rB,EAAK2rB,WAAWhD,QAAO,SAAC7Z,GAAQ,QAASA,EAAEiS,OAAOyd,aAE7Dx+B,EAAKwxB,KAAKqM,EAAK9c,YACf/gB,EAAKwxB,KAAKsM,EAAK/c,KAEtB,IAAI0d,EAGAA,EADAz+B,EAAK8a,QAAQiX,UACJ/xB,EAAKgzB,OAAO0J,EAAe,CAAE,SAAY4B,EAC9B,UAAa1B,EACb,YAAc,IAEzB58B,EAAKgzB,OAAO0J,EAAe,CAAE,SAAY4B,EACtC,YAAc,IAK9B,IAAK,IAAIr7B,EAAI,EAAGA,EAAIs7B,EAAcp4B,OAAQlD,IACtCjD,EAAK2rB,WAAWtoB,KAAK,CACjB,OAAUk7B,EAAct7B,GAAGwnB,OAC3B,OAAUgU,EAAO/V,MAAM6V,EAAct7B,GAAGuN,OAAO,GAC/C,MAAS,EACT,IAAOwQ,EAAAA,OACP,SAAY,kBAIpB+W,IACA/3B,EAAKs4B,SACLtpB,QAAQuK,IAAI,mBAAoBvZ,EAAK2rB,aAoBrCiL,GAAc,SAAS1d,EAAEjW,GACzB+L,QAAQuK,IAAI,eACZ,IAA6BmlB,GAAmB,EAEhD,GAAIjN,EAAe,CAIf,GAA4B,WAH5BC,EAAcxY,GAGE0P,UAAkD,UAA1B6I,EAAc7I,UAAgD,SAAxB8I,EAAY9I,UAAiD,SAA1B6I,EAAc7I,SAC3H,OAEJ,GAAI8I,GAAeD,EAAmC,YAAlBG,IAGpC,IAFA,IAAIhG,EAAU,CAACnB,OAAQgH,EAAejhB,OAAQkhB,EAAa5F,SAAU,WAAYzjB,MAAO,EAAG0Y,IAAKC,EAAAA,QAEvF/d,EAAI,EAAGA,EAAIjD,EAAK6xB,MAAMrH,MAAMrkB,OAAQlD,IAkBzC,GAjBKjD,EAAK6xB,MAAMrH,MAAMvnB,GAAGwnB,QAAUgH,GAC9BzxB,EAAK6xB,MAAMrH,MAAMvnB,GAAGuN,QAAUihB,GAC9BzxB,EAAK6xB,MAAMrH,MAAMvnB,GAAGwnB,QAAUiH,GAC9B1xB,EAAK6xB,MAAMrH,MAAMvnB,GAAGuN,QAAUkhB,GAKK,YAAhC1xB,EAAK6xB,MAAMrH,MAAMvnB,GAAG6oB,UACY,cAAhC9rB,EAAK6xB,MAAMrH,MAAMvnB,GAAG6oB,UACY,iBAAhC9rB,EAAK6xB,MAAMrH,MAAMvnB,GAAG6oB,WAEpB9c,QAAQuK,IAAI,wBACZmlB,GAAmB,IAIrB1+B,EAAK6xB,MAAMrH,MAAMvnB,GAAGwnB,QAAUiH,GAC9B1xB,EAAK6xB,MAAMrH,MAAMvnB,GAAGuN,QAAUihB,GACzBzxB,EAAK6xB,MAAMrH,MAAMvnB,GAAGwnB,QAAUgH,GAC9BzxB,EAAK6xB,MAAMrH,MAAMvnB,GAAGuN,QAAUkhB,IAID,YAAhC1xB,EAAK6xB,MAAMrH,MAAMvnB,GAAG6oB,SACpB,OAMZ,GAAIF,EAAQnB,OAAO8L,KAAO3K,EAAQpb,OAAO+lB,IAGrC,GAA2B,GAAtB3K,EAAQnB,OAAOzjB,KACf4kB,EAAQpb,OAAOxJ,KAAO4kB,EAAQpb,OAAO+lB,IAAInN,WAClB,GAAtBwC,EAAQpb,OAAOxJ,KACf4kB,EAAQnB,OAAOzjB,KAAO4kB,EAAQnB,OAAO8L,IAAInN,UAAY,CAEjD,IAAIuV,EAAW,CACX,CACIlc,MAAO,gBACPD,OAAQ,SAAST,EAAK7I,EAAGjW,GACrB0uB,GAAuB,EACvB3iB,QAAQuK,IAAI,oBACZvK,QAAQuK,IAAI,gCAAkCL,GAC9C6a,EAAS1R,KAAK,QAAS2R,IAAAA,aACvBiK,GAAgBrS,IAEpBrJ,UAAU,GAEd,CACIE,MAAO,gBACPD,OAAQ,SAAST,EAAK7I,EAAGjW,GACrB0uB,GAAuB,EACvB3iB,QAAQuK,IAAI,qCACZvK,QAAQuK,IAAI,gCAAkCL,GAC9C6a,EAAS1R,KAAK,QAAS2R,IAAAA,aACvBh0B,EAAK4+B,QAAQhT,MAIzB+F,GAAuB,EACvB,IAAIkN,EAAkBpe,EAAYke,GAClC3vB,QAAQuK,IAAI,eACZslB,EAAgBrwB,MAAMrO,KAAM,CAAC+Y,EAAEjW,GAAE,EACX,WAAa8wB,EAAS1R,KAAK,QAAS2R,IAAAA,qBAGtD0K,GACF1+B,EAAK4+B,QAAQhT,QAGrB8S,GACA1+B,EAAK4+B,QAAQhT,KAMzB+K,GAAgB,SAASzd,GAC3BlK,QAAQuK,IAAI,iBACPL,EAAEqb,UAAatC,GAElBgC,IAGGjC,IAECC,EACFqC,EAAiBpb,GAEjBsb,EAAWtb,IAIX8Y,GAAgBhyB,EAAK8a,QAAQgX,WAE/BL,EAAgBvY,EAEhB6a,EACC1R,KAAK,QAAS2R,IAAAA,UACd3R,KAAK,KAAMoP,EAAc9uB,GACzB0f,KAAK,KAAMoP,EAAc7uB,GACzByf,KAAK,KAAMoP,EAAc9uB,GACzB0f,KAAK,KAAMoP,EAAc7uB,GAE1B2e,IAAAA,MAAAA,oBAIA2V,GAAY,SAAChe,GACR8Y,IASLhjB,QAAQuK,IAAI,cAAeL,EAAE4S,UACzB5S,EAAE4S,WANa,CACE,MAAQ,EACR,WAAa,EACb,YAAc,IAMnCiS,GAAW7kB,KAIflZ,EAAK+Q,OAAS,WACX,IAAI9G,EAAO,CAAC,KAAQjK,EAAKwxB,KAAM,WAAcxxB,EAAK2rB,YASlD,OARsBH,KAAKxR,UAAU/P,GAAM,SAASsV,EAAKlX,GAEpD,MAAW,OAAPkX,OACA,EAEOlX,IAEb,OAINrI,EAAK8+B,SAAW,SAASC,GACrB,IAAIvN,EAAM7F,EAEV,IACI,IAAI1hB,EAAOuhB,KAAK5R,MAAMmlB,GACtBvN,EAAOvnB,EAAKunB,KACZ7F,EAAa1hB,EAAK0hB,WACpB,MAAMzP,GACJ,MAAMA,EAGV,IAAK,IAAI6E,KAAOyQ,EACU,OAAlBA,EAAKzQ,GAAKhX,MACVgW,EAAI,IAAIgI,EAERhI,EAAEiI,IAAMwJ,EAAKzQ,GAAKiH,IAClBjI,EAAEwE,WAAaiN,EAAKzQ,GAAKwD,WACzBxE,EAAEqI,SAAWoJ,EAAKzQ,GAAKqH,SACvBrI,EAAE+I,UAAY0I,EAAKzQ,GAAK+H,UACxB/I,EAAEgB,IAAMyQ,EAAKzQ,GAAKA,IAClBhB,EAAEkI,WAAauJ,EAAKzQ,GAAKkH,WACzBlI,EAAE2I,MAAQ8I,EAAKzQ,GAAK2H,MACpB3I,EAAEyK,MAAQgH,EAAKzQ,GAAKyJ,MACpBzK,EAAEqJ,UAAYoI,EAAKzQ,GAAKqI,UACxBrJ,EAAE8F,SAAW2L,EAAKzQ,GAAK8E,SACvB9F,EAAEuI,YAAckJ,EAAKzQ,GAAKuH,YAC1BvI,EAAEsI,gBAAkBmJ,EAAKzQ,GAAKsH,kBAE9BtI,EAAI,IAAIif,aACRjf,EAAE1V,KAAOmnB,EAAKzQ,GAAK1W,KACnB0V,EAAE2I,MAAQ8I,EAAKzQ,GAAK2H,MACpB3I,EAAEgB,IAAMyQ,EAAKzQ,GAAKA,KAGtB/gB,EAAKi/B,WAAWlf,GAAG,GAGvB4L,EAAWsM,SAAQ,SAASC,GACxBl4B,EAAK2rB,WAAWtoB,KAAK60B,MAGzBH,IACA/3B,EAAKs4B,UAGTt4B,EAAKgzB,OAAS,SAAS4C,GAA+B,IAApB7E,EAAoB,uDAAJ,GAC1CgF,EAAUJ,EAAoBC,EAAW7E,GAkB7C,GAAI,eAAgBA,EAAe,CAE/B,IAAImO,EAAWl/B,EAAKm/B,iBAAiBpJ,EAAShF,EAAcpF,YAE5D3rB,EAAK2rB,WAAa3rB,EAAK2rB,WAAWhc,OAAOuvB,GAW7C,MARI,cAAenO,EACf/wB,EAAKi/B,WAAWlJ,EAAS,CAACqJ,UAAWrO,EAAcqO,UACzBhN,YAAY,IACjC,gBAAiBrB,EACtB/wB,EAAKi/B,WAAWlJ,EAAS,CAACsJ,YAAatO,EAAcsO,cAErDr/B,EAAKi/B,WAAWlJ,EAAS,CAAC3D,WAAYrB,EAAcqB,aAEjD2D,GAGX/1B,EAAKi/B,WAAa,SAASK,EAAT,GAIhB,IAMMjF,EAAMF,EANZ,IAHCkF,YAAAA,OAGD,aAFAD,UAAAA,OAEA,MAFY,KAEZ,MADAhN,WAAAA,OACA,SASE,GAAiB,MAAbgN,EAAmB,CAEnB,IAAIG,EAAS,EACTC,EAAS,EACTC,EAAY,EAEhBH,EAAS5W,MAAMuP,SAAQ,SAASld,GAC5BwkB,GAAUxkB,EAAKpY,EACf68B,GAAUzkB,EAAKnY,EACf68B,GAAa,KAGbA,EAAY,GAGZH,EAAS5W,MAAMuP,SAAQ,SAASld,GAC5BA,EAAKpY,EAAIoY,EAAKpY,EAAIy8B,EAAU,GAAKG,EAASE,EAC1C1kB,EAAKnY,EAAImY,EAAKnY,EAAIw8B,EAAU,GAAKI,EAASC,EAE1C1kB,EAAKqP,GAAKrP,EAAKpY,EACfoY,EAAKsP,GAAKtP,EAAKnY,KA+B3B,OA1BIy8B,IAEIhF,EADAr6B,EAAK6xB,MAAMnJ,MAAMviB,OAAS,EACnBob,IAAAA,IAAOvhB,EAAK6xB,MAAMnJ,MAAMtE,KAAI,SAASlL,GAAK,OAAOA,EAAEvW,MAEnD,EAEXw3B,EAAO5Y,IAAAA,IAAO+d,EAAS5W,MAAMtE,KAAI,SAASlL,GAAK,OAAOA,EAAEvW,MAExD28B,EAAS5W,MAAMuP,SAAQ,SAASld,GAC5BA,EAAKpY,GAAM03B,EAAOF,EAAQ,GAC1Bpf,EAAKqP,IAAOiQ,EAAOF,MAI3BmF,EAAS5W,MAAMuP,SAAQ,SAASld,GAC5BA,EAAKwb,IAAM+I,KAGft/B,EAAKwxB,KAAK8N,EAASve,KAAOue,EAC1BvH,IAEA/3B,EAAKs4B,SAEDlG,GACApyB,EAAKoyB,aAEFkN,GAGXt/B,EAAK0/B,SAAW,SAAkBlE,GAK9BA,EAAKhR,MAAMyN,SAAQ,SAAS0H,GACG,iBAAhBA,EAAMlV,SAAoBkV,EAAMlV,OAAS+Q,EAAK9S,MAAMiX,EAAMlV,SAC1C,iBAAhBkV,EAAMnvB,SAAoBmvB,EAAMnvB,OAASgrB,EAAK9S,MAAMiX,EAAMnvB,YAMrExQ,EAAK6xB,MAAMnJ,MAAMviB,OAAS,GAC1Bk0B,KAAO9Y,IAAAA,IAAOvhB,EAAK6xB,MAAMnJ,MAAMtE,KAAI,SAASlL,GAAI,OAAOA,EAAEvW,MACzD23B,KAAO/Y,IAAAA,IAAOvhB,EAAK6xB,MAAMnJ,MAAMtE,KAAI,SAASlL,GAAI,OAAOA,EAAEtW,QAEzDy3B,KAAO,EACPC,KAAO,GAGXkB,EAAK9S,MAAMuP,SAAQ,SAAS0H,GAClBA,EAAMpJ,IAAIxV,OAAO/gB,EAAKwxB,OACxBxxB,EAAKwxB,KAAKmO,EAAMpJ,IAAIxV,KAAO4e,EAAMpJ,KAGrCoJ,EAAMh9B,GAAK03B,KAGXsF,EAAMvV,IAAMiQ,QAIhBta,EAAI,IAAIgI,EAAS,GAAG,IACpBhI,EAAE2I,MAAQ8S,EAAK9S,MACf3I,EAAEyK,MAAQgR,EAAKhR,MAGfuN,IAEA/3B,EAAKs4B,SACLt4B,EAAKoyB,cAGTpyB,EAAK4/B,WAAa,WACd5/B,EAAK6xB,MAAMnJ,MAAQ,GACnB1oB,EAAK6xB,MAAMrH,MAAQ,GAEnBxqB,EAAKwxB,KAAO,GACZxxB,EAAK2rB,WAAa,GAElB3rB,EAAKs4B,UAGTt4B,EAAK4+B,QAAW,SAAShT,GAMrB,GADA5c,QAAQuK,IAAI,mBACRqS,EAAQnB,OAAO8L,KAAO3K,EAAQpb,OAAO+lB,IAAK,CAE1C,IAAIxW,EAAI6L,EAAQnB,OAAO8L,IAEvBxW,EAAE+I,UAAU8C,EAAQnB,OAAOzjB,KAAO4kB,EAAQpb,OAAOxJ,IACjD+Y,EAAE+I,UAAU8C,EAAQpb,OAAOxJ,KAAO4kB,EAAQnB,OAAOzjB,IAEjDg2B,GAAejd,QAIf/Q,QAAQuK,IAAI,iBACZqS,EAAQE,SAAW,gBACnB9rB,EAAK2rB,WAAWtoB,KAAKuoB,GAEzBmM,IACA/3B,EAAKs4B,UAGTt4B,EAAKm/B,iBAAmB,SAASpJ,EAAS8J,GAGtC,IAFA,IAAIX,EAAW,GAENj8B,EAAI,EAAGA,EAAI48B,EAAc15B,OAAQlD,IAAK,CAC3C,IAAI2oB,EAAU,CAACE,SAAU,WAAYzjB,MAAO,EAAG0Y,IAAKC,EAAAA,OAChDyJ,OAAQ,KAAMja,OAAQ,MAE1B,GAA4D,mBAAxD1I,OAAO9G,UAAUuJ,SAASqB,KAAKi0B,EAAc58B,GAAG,KAChD,IAAK,IAAIqJ,EAAI,EAAGA,EAAIypB,EAAQrN,MAAMviB,OAAQmG,IACtC,GAAI,SAAUypB,EAAQrN,MAAMpc,IACpBypB,EAAQrN,MAAMpc,GAAGyd,KAAK5Z,OAAO0vB,EAAc58B,GAAG,IAAK,CACnD2oB,EAAQnB,OAASsL,EAAQrN,MAAMpc,GAC/B,YAKZ,IAAK,IAAIA,EAAI,EAAGA,EAAIypB,EAAQrN,MAAMviB,OAAQmG,IAClCypB,EAAQrN,MAAMpc,GAAGtF,KAAO64B,EAAc58B,GAAG,KACzC2oB,EAAQnB,OAASsL,EAAQrN,MAAMpc,IAM3C,GAA4D,mBAAxDxE,OAAO9G,UAAUuJ,SAASqB,KAAKi0B,EAAc58B,GAAG,IAChD,IAAK,IAAIqJ,EAAI,EAAGA,EAAIypB,EAAQrN,MAAMviB,OAAQmG,IAClC,SAAUypB,EAAQrN,MAAMpc,IACpBypB,EAAQrN,MAAMpc,GAAGyd,KAAK5Z,OAAO0vB,EAAc58B,GAAG,MAC9C2oB,EAAQpb,OAASulB,EAAQrN,MAAMpc,SAK3C,IAAK,IAAIA,EAAI,EAAGA,EAAIypB,EAAQrN,MAAMviB,OAAQmG,IAClCypB,EAAQrN,MAAMpc,GAAGtF,KAAO64B,EAAc58B,GAAG,KACzC2oB,EAAQpb,OAASulB,EAAQrN,MAAMpc,IAKrB,MAAlBsf,EAAQnB,QAAoC,MAAlBmB,EAAQpb,OAKtC0uB,EAAS77B,KAAKuoB,GAJV5c,QAAQuK,IAAI,iDAAkDqS,EAASiU,EAAc58B,IAO7F,OAAOi8B,GAGXl/B,EAAKmyB,wBAA0B,WAC3BnjB,QAAQuK,IAAI,aAAcvZ,EAAKwxB,MAC/B,IAAIsE,EAAW,GACXgK,EAAU,EACVC,EAAW,GACX9W,EAAS,GACTH,EAAY,GAGhB,IAAK,IAAI/H,KAAO/gB,EAAKwxB,KAAM,CAGvB,IAFA,IAAI+E,EAAMv2B,EAAKwxB,KAAKzQ,GAEXzU,EAAI,EAAGA,EAAIiqB,EAAI7N,MAAMviB,OAAQmG,IAAK,CACvC,IAAIyO,EAAOwb,EAAI7N,MAAMpc,GAEA,cAAjByO,EAAK6N,WAGT5Z,QAAQuK,IAAI,QAASwB,GACrBglB,EAAShlB,EAAKgG,KAAO+e,EACrBA,GAAW,EAEXhK,EAASzyB,KAAK0X,EAAK/D,OAGvBiS,EAAO5lB,KAAKy8B,GAGhBhX,EAAY,CAACgX,EAAQ,GACrB,IAAK,IAAI78B,EAAI,EAAGA,EAAI68B,EAAS78B,IACzB6lB,EAAUzlB,KAAK,GAGnB,IAAK,IAAI0d,KAAO/gB,EAAKwxB,KAGjB,IAFA,IAAI+E,EAAMv2B,EAAKwxB,KAAKzQ,GAEXzU,EAAI,EAAGA,EAAIiqB,EAAI/L,MAAMrkB,OAAQmG,IAAK,CACvC,IAAI4rB,EAAO3B,EAAI/L,MAAMle,GAErB,GAAqB,YAAjB4rB,EAAKpM,SAAT,CAGA,IAAIkU,EAAOD,EAAS7H,EAAKzN,OAAO1J,KAC5Bkf,EAAOF,EAAS7H,EAAK1nB,OAAOuQ,KAChC+H,EAAUkX,GAAQC,EAClBnX,EAAUmX,GAAQD,GAI1B,IAAK,IAAI/8B,EAAI,EAAGA,EAAIjD,EAAK2rB,WAAWxlB,OAAQlD,IAAK,CAC7C,IAAIi1B,EAAOl4B,EAAK2rB,WAAW1oB,GAEvB+8B,EAAOD,EAAS7H,EAAKzN,OAAO1J,KAC5Bkf,EAAOF,EAAS7H,EAAK1nB,OAAOuQ,KAEhC+H,EAAUkX,GAAQC,EAClBnX,EAAUmX,GAAQD,EAKtB,IAFA,IAAIpK,EAAYxP,EAAarB,sBAAsB+D,GAAW5Q,MAAM,IAE3DjV,EAAI,EAAGA,EAAIgmB,EAAO9iB,OAAS,EAAGlD,IACnC+L,QAAQuK,IAAI,aAAc0P,EAAOhmB,IACjC6yB,EAASuC,OAAOpP,EAAOhmB,GAAKA,EAAI,EAAG,EAAG,KACtC2yB,EAAUyC,OAAOpP,EAAOhmB,GAAKA,EAAI,EAAG,EAAG,KAK3C,OAFA+L,QAAQuK,IAAI,YAAauc,EAAUA,EAASpvB,KAAK,KACjDsI,QAAQuK,IAAI,aAAcqc,EAAWA,EAAUlvB,KAAK,KAC7C,CAACovB,EAASpvB,KAAK,IAAKkvB,EAAUlvB,KAAK,MAI9C1G,EAAKkgC,eAAiB,WACpBlgC,EAAK8a,QAAQiX,WAAY,EACzB+B,EAAI1R,UAAU,WACXxW,KAAK2pB,GACRv1B,EAAK40B,MAAMp0B,SAGbR,EAAKmgC,cAAgB,WACnBngC,EAAK8a,QAAQiX,WAAY,EACzB+B,EAAI1R,UAAU,WACRT,GAAG,iBAAkB,MAC3B3hB,EAAK40B,MAAMwL,QAGbpgC,EAAK01B,YAAc,WACX11B,EAAK8a,QAAQiX,WACb/xB,EAAK40B,MAAMyL,UAGnBrgC,EAAKsgC,YAAc,SAASj4B,GAC1BrI,EAAK40B,MAAMI,SAAS3sB,GACpBrI,EAAK01B,eAGP11B,EAAKugC,UAAY,SAASl4B,GACxBrI,EAAK40B,MAAMC,OAAOxsB,GAClBrI,EAAK01B,eAGP11B,EAAKwgC,WAAa,SAASn4B,GACzBrI,EAAK40B,MAAMS,QAAQhtB,GACnBrI,EAAK01B,eAGP11B,EAAKygC,sBAAwB,SAASp4B,GACpCrI,EAAKoxB,cAAcsP,WAAar4B,EAChCrI,EAAKs4B,UAGPt4B,EAAKg8B,iBAAmB,SAAS3zB,GAC/BrI,EAAKqxB,kBAAkB2K,iBAAmB3zB,EAC1CoxB,KAGFz5B,EAAKi8B,mBAAqB,SAAS5zB,GACjCrI,EAAKqxB,kBAAkB4K,mBAAqB5zB,EAC5CoxB,KAGFz5B,EAAKk8B,iBAAmB,SAAS7zB,GAC/BrI,EAAKqxB,kBAAkB6K,iBAAmB7zB,EAC1CoxB,KAGFz5B,EAAKm8B,aAAe,SAAS9zB,GAC3BrI,EAAKqxB,kBAAkB8K,aAAe9zB,EACtCoxB,KAGFz5B,EAAKo8B,uBAAyB,SAAS/zB,GACrCrI,EAAKqxB,kBAAkB+K,uBAAyB/zB,EAChDoxB,KAGFz5B,EAAKq8B,oBAAsB,SAASh0B,GAClCrI,EAAKqxB,kBAAkBgL,oBAAsBh0B,EAC7CoxB,KAGFz5B,EAAKu8B,uBAAyB,SAASl0B,GACrCrI,EAAKqxB,kBAAkBkL,uBAAyBl0B,EAChDoxB,KCvsEC,SAASkH,IAA4B,IAiBpC9N,EAAQE,EAjBQhC,EAAoB,uDAAJ,GAChCjW,EAAU,CACV,MAAS,IACT,OAAU,IACV,iBAAoB,EACpB,eAAkB,EAElB,cAAiB,GACjB,sBAAwB,EACxB,sBAAyB,EACzB,qBAAuB,EAEvB,UAAa,SACb,aAAgB,OAMpB,SAAS8lB,EAA8BC,EAASC,GAG5C,IAAIC,EAAUxf,GAAGoT,OAAOkM,GACpBG,EAAUzf,GAAGoT,OAAOmM,GAGxBC,EAAQ,IAAMjmB,EAAQmmB,iBAAmBnmB,EAAQomB,eACjDF,EAAQ,IAAMlmB,EAAQmmB,iBAAmBnmB,EAAQomB,eAEjDH,EAAQ,IAAMjmB,EAAQmmB,iBAAmBnmB,EAAQomB,eACjDF,EAAQ,IAAMlmB,EAAQmmB,iBAAmBnmB,EAAQomB,eAGjD,IAqBIjwB,EArBAkwB,EAASJ,EAAQ,GAAKA,EAAQ,GAC9BK,EAASJ,EAAQ,GAAKA,EAAQ,GAQlC,SAASK,EAAiBC,EAAYC,EAAWC,GAC7C,IAAIC,GAAeH,EAAWlqB,QAAQ,GAAKkqB,EAAWlqB,QAAQ,KAC3CkqB,EAAWha,SAAS,GAAKga,EAAWha,SAAS,IAC5Doa,GAAYH,EAAU,GAAKA,EAAU,IAAME,EAC3CE,GAAcH,EAAS,GAAKA,EAAS,GAAME,GAAY,EAE3D,MAAO,CAAC,YAAeD,EACf,MAASlgB,GAAG2Z,MAAM0G,SACAta,OAAOia,GACPnqB,MAAM,CAACoqB,EAAS,GAAKG,EAAWH,EAAS,GAAKG,KA0B5E,OAxCaR,EAASrmB,EAAQqI,MACjBie,EAAStmB,EAAQ+mB,QAwB1B5wB,EAAMowB,EAJNxO,EAAStR,GAAG2Z,MAAM0G,SACjBta,OAAOyZ,GACP3pB,MAAM,CAAC,EAAG0D,EAAQqI,QAEY6d,EAAS,CAAC,EAAGlmB,EAAQ+mB,SACpD9O,EAAS9hB,EAAIiqB,QAObjqB,EAAMowB,EAJNtO,EAASxR,GAAG2Z,MAAM0G,SACjBta,OAAO0Z,GACP5pB,MAAM,CAAC,EAAG0D,EAAQ+mB,SAEYd,EAAS,CAAC,EAAGjmB,EAAQqI,QACpD0P,EAAS5hB,EAAIiqB,OAGHrI,EAAOzb,QAAQ,GAAKyb,EAAOvL,SAAS,GACpCyL,EAAO3b,QAAQ,GAAK2b,EAAOzL,SAAS,GAE3C,eAAiBuL,EAAOvL,SAAS,GAAKrW,EAAIwwB,YAAc5O,EAAOzb,QAAQ,IACpE,MAAQ2b,EAAOzL,SAAS,GAAKrW,EAAIwwB,YAAc1O,EAAO3b,QAAQ,IADjE,UAEQnG,EAAIwwB,YAAc,IAGrC,SAASK,EAAkBC,EAAWtZ,GAElC,IAAIuZ,EAAKD,EACR3f,UAAU,UACVnY,KAAKwe,GACLjH,QACAC,OAAO,SACPC,QAAQ,SAAS,GACjBW,KAAK,aAAa,SAASnJ,GACxB,MAAO,aAAeA,EAAEvW,EAAI,IAAMuW,EAAEtW,EAAI,OAG9Bo/B,EAAGvgB,OAAO,cACvBC,QAAQsS,IAAAA,MAAa,GACrB3R,KAAK,YAAa,cAClBA,KAAK,aAAa,SAACnJ,GAAQ,GAAIA,EAAElC,KAAQ,OAAOkC,EAAElC,KAAKnM,iBACvDwX,KAAK,IAAKvH,EAAQmmB,kBAGfnmB,EAAQmnB,sBACeD,EAAGvgB,OAAO,YAChCqV,MAAK,SAAS5d,GAAK,OAAOA,EAAElC,QAC5B0K,QAAQsS,IAAAA,WAAkB,GAC1BvS,OAAO,aACPqV,MAAK,SAAS5d,GAAK,OAAOA,EAAEgpB,YAAc,IAAMhpB,EAAElS,OAI3D,SAASm7B,EAAaJ,EAAWxY,GAG7B,IAAIyY,EAAKD,EACR3f,YACAnY,KAAKsf,GACL/H,QACAC,OAAO,SACPC,QAAQ,SAAS,GACjBW,KAAK,aAAa,SAASnJ,GACxB,MAAO,aAAeA,EAAEvW,EAAI,IAAMuW,EAAEtW,EAAI,OAG9Bo/B,EAAGvgB,OAAO,cACvBC,QAAQsS,IAAAA,MAAa,GACrB3R,KAAK,YAAa,SAClBA,KAAK,IAAKvH,EAAQmmB,kBAEAe,EAAGvgB,OAAO,YAC5BC,QAAQsS,IAAAA,WAAkB,GAC1B8C,MAAK,SAAS5d,GAAK,OAAOA,EAAElC,QAGjC,SAASorB,EAAWL,EAAW/qB,GAC3B,IAAIqrB,EAAYN,EAAUtgB,OAAO,YAEhCC,QAAQsS,IAAAA,WAAkB,GAC1B8C,KAAK9f,GAEFsrB,EAAQxnB,EAAQynB,aAAarqB,MAAM,IAAK,GACxCsqB,EAAK,GACLC,EAAWJ,EAAUtnB,OAAO2nB,UAC5BC,EAAW,CAACF,EAAStf,MAAOsf,EAASZ,QACrCe,EAAW,CAAC9nB,EAAQqI,MAAOrI,EAAQ+mB,QAEvC,IAAK,IAAIrhB,IAAK,CAAC,EAAG,GACd,OAAQ8hB,EAAM9hB,IACV,IAAK,IACDgiB,EAAGhiB,GAAKmiB,EAASniB,GAAK,EACtB,MACJ,IAAK,IACDgiB,EAAGhiB,GAAKoiB,EAASpiB,GAAKmiB,EAASniB,GAAK,EACpC,MACJ,IAAK,MACDgiB,EAAGhiB,GAAKoiB,EAASpiB,GAAK,EAIlC6hB,EAAUhgB,KAAK,IAAKmgB,EAAG,IAAIngB,KAAK,IAAKmgB,EAAG,IAG5C,SAASK,EAAwBd,EAAWvX,GACxC,IAAIsY,EAAY,GACZC,EAAY,GAChBvY,EAAQA,EAAM7B,QAAO,SAASzP,GAAK,MAAqB,WAAdA,EAAE4S,UAAuC,aAAd5S,EAAE4S,UAAyC,SAAd5S,EAAE4S,YAEpGiW,EAAU3f,UAAU,qBACnBoR,SAGD,IAAK,IAAIvwB,EAAI,EAAGA,EAAIunB,EAAMrkB,OAAQlD,IACN,OAApBunB,EAAMvnB,GAAGwnB,QAAuC,OAApBD,EAAMvnB,GAAGuN,SAGzCsyB,EAAUtY,EAAMvnB,GAAGwnB,OAAO1J,KAAOyJ,EAAMvnB,GAAGwnB,OAC1CqY,EAAUtY,EAAMvnB,GAAGuN,OAAOuQ,KAAOyJ,EAAMvnB,GAAGuN,OAE1CuyB,EAAU1/B,KAAK,CAAC,OAAUmnB,EAAMvnB,GAAGwnB,OAAO1J,IAAK,OAAUyJ,EAAMvnB,GAAGuN,OAAOuQ,IAAK,SAAYyJ,EAAMvnB,GAAG6oB,SAAU,cAAiBtB,EAAMvnB,GAAG+/B,iBAG3I,IAEIC,EAFY1hB,GAAG2hB,oBAAoBxa,MAAMoa,GAAWK,MAAMJ,GAC7DK,wBAAwB,IAAKC,UAAU,GACxBC,GAEZC,EAAShiB,GAAGkS,IAAI+P,OACf7gC,GAAE,SAASuW,GAAG,OAAOA,EAAEvW,KACvBC,GAAE,SAASsW,GAAG,OAAOA,EAAEtW,KACvBi5B,YAAY,UAEjB,IAAS54B,EAAI,EAAGA,EAAIggC,EAAQ98B,OAAQlD,IAAK,CACrC,IAAIwgC,EAAqBR,EAAQhgC,GAIjC8+B,EAAUtgB,OAAO,QAAQY,KAAK,IAAKkhB,EAAOE,IACzC7hB,MAAM,OAAQ,QACdS,KAAK,aAAa,SAASnJ,GAAK,OAAO6pB,EAAU9/B,GAAG6oB,YACpDzJ,KAAK,mBAAmB,SAASnJ,GAAK,OAAO6pB,EAAU9/B,GAAG+/B,iBAC1DphB,MAAM,iBAAiB,KAKhC,SAAS8hB,EAAY3B,EAAWvX,GAC5BA,EAAQA,EAAM7B,QAAO,SAASzP,GAAK,OAAoB,OAAbA,EAAEuR,QAAgC,OAAbvR,EAAE1I,UACxDuxB,EAAU3f,UAAU,SAC5BnY,KAAKugB,GACLhJ,QACAC,OAAO,YACPY,KAAK,MAAM,SAASnJ,GAAK,OAAOA,EAAEuR,OAAO9nB,KACzC0f,KAAK,MAAM,SAASnJ,GAAK,OAAOA,EAAE1I,OAAO7N,KACzC0f,KAAK,MAAM,SAASnJ,GAAK,OAAOA,EAAEuR,OAAO7nB,KACzCyf,KAAK,MAAM,SAASnJ,GAAK,OAAOA,EAAE1I,OAAO5N,KACzCyf,KAAK,aAAa,SAASnJ,GAAK,OAAOA,EAAE4S,YACzCzJ,KAAK,mBAAmB,SAASnJ,GAAK,OAAOA,EAAE8pB,iBAC/CthB,QAAQ,QAAQ,GAChBA,QAAQsS,IAAAA,MAAa,GAG1B,SAAS2P,EAAM5B,GACXA,EAAUrO,MAAK,SAASzpB,GACpB,IAAI25B,EAAOriB,GAAGgS,OAAOpzB,MAAMshB,OAAO,KACjCC,QAAQsS,IAAAA,MAAa,GAIlB6B,EAAK,IAAI9N,EAAS9d,EAAK6rB,SAAU7rB,EAAK2rB,UAAW3rB,EAAK+M,KAAM8D,EAAQ+oB,uBAC/DhX,sBACAd,iBACAuB,QAAQrjB,EAAK+M,MAEtB/M,EAAKq1B,SAAWzJ,EAIhB,IAAIvM,EAAY,GAEhB,GAA0B,WAAtBxO,EAAQgpB,UAIR,IAHA,IACI5N,GADS,IAAItG,GACYuG,sBAAsBN,EAAG/M,WAE7C7lB,EAAI,EAAGA,EAAIizB,EAAgBlG,MAAO/sB,IACvCqmB,EAAUjmB,KAAK,CAAC6yB,EAAgBvzB,EAAEM,GAAIizB,EAAgBtzB,EAAEK,UAG5DqmB,EAAYiE,EAAoBsI,EAAG/M,WAGvC+M,EAAGxM,aAAa,aAAcC,GAI7B8C,UAAUtR,EAAQ+oB,sBAAuB/oB,EAAQuR,eAIlD,IAAI0X,EAAwBnD,EACxB/K,EAAGnN,MAAMtE,KAAI,SAASlL,GAAK,OAAOA,EAAEvW,KACpCkzB,EAAGnN,MAAMtE,KAAI,SAASlL,GAAK,OAAOA,EAAEtW,MAExCghC,EAAKvhB,KAAK,YAAa0hB,GAEvB,IAAItb,EAAkBoN,EAAGnN,MAAMC,QAAO,SAASzP,GAC3C,MAAqB,cAAdA,EAAE0P,YAGTW,EAAasM,EAAGnN,MAAMC,QAAO,SAASzP,GACtC,MAAqB,SAAdA,EAAE0P,YAGT4B,EAAQqL,EAAGrL,MAEfkZ,EAAYE,EAAMpZ,GAClBsX,EAAkB8B,EAAMnb,GACxB0Z,EAAayB,EAAMra,GACnB6Y,EAAW7gB,GAAGgS,OAAOpzB,MAAO8J,EAAK+M,MAE7B8D,EAAQkpB,qBACRnB,EAAwBe,EAAMpZ,MAwE1C,OA/UI1P,EAAUhT,OAAOkpB,OAAOlW,EAASiW,GA6QrC4S,EAAMxgB,MAAQ,SAAS8gB,GACnB,OAAKx5B,UAAUtE,QACf2U,EAAQqI,MAAQ8gB,EACTN,GAFuB7oB,EAAQqI,OAK1CwgB,EAAM9B,OAAS,SAASoC,GACpB,OAAKx5B,UAAUtE,QACf2U,EAAQ+mB,OAASoC,EACVN,GAFuB7oB,EAAQ+mB,QAK1C8B,EAAM1B,qBAAuB,SAASgC,GAClC,OAAKx5B,UAAUtE,QACf2U,EAAQmnB,qBAAuBgC,EACxBN,GAFuB7oB,EAAQmnB,sBAK1C0B,EAAMzC,eAAiB,SAAS+C,GAC5B,OAAKx5B,UAAUtE,QACf2U,EAAQomB,eAAiB+C,EAClBN,GAFuB7oB,EAAQomB,gBAK1CyC,EAAM1C,iBAAmB,SAASgD,GAC9B,OAAKx5B,UAAUtE,QACf2U,EAAQmmB,iBAAmBgD,EACpBN,GAFuB7oB,EAAQmmB,kBAK1C0C,EAAMtX,cAAgB,SAAS4X,GAC3B,OAAKx5B,UAAUtE,QACf2U,EAAQuR,cAAgB4X,EACjBN,GAFuB7oB,EAAQuR,eAK1CsX,EAAM1B,qBAAuB,SAASgC,GAClC,OAAKx5B,UAAUtE,QACf2U,EAAQmnB,qBAAuBgC,EACxBN,GAFuB7oB,EAAQmnB,sBAK1C0B,EAAME,sBAAwB,SAASI,GACnC,OAAKx5B,UAAUtE,QACf2U,EAAQ+oB,sBAAwBI,EACzBN,GAFuB7oB,EAAQ+oB,uBAK1CF,EAAMK,oBAAsB,SAASC,GACjC,OAAKx5B,UAAUtE,QACf2U,EAAQkpB,oBAAsBC,EACvBN,GAFuB7oB,EAAQkpB,qBAK1CL,EAAMG,UAAY,SAASG,GACvB,OAAKx5B,UAAUtE,QACf2U,EAAQgpB,UAAYG,EACbN,GAFuB7oB,EAAQgpB,WAK1CH,EAAMpB,aAAe,SAAS0B,GAC1B,OAAKx5B,UAAUtE,QACf2U,EAAQynB,aAAe0B,EAChBN,GAFuB7oB,EAAQynB,cAKnCoB,ECnWJ,SAASO,IAA+B,IAApBnT,EAAoB,uDAAJ,GACnCjW,EAAU,CACV,MAAS,IACT,OAAU,IACV,iBAAoB,EACpB,eAAkB,EAElB,cAAiB,GACjB,sBAAwB,EACxB,sBAAyB,EACzB,qBAAuB,EAEvB,UAAa,SACb,aAAgB,OAKpB,SAASqpB,EAAepC,GAEpBA,EAAUrO,MAAK,SAASxa,GACpBqI,GAAGgS,OAAOpzB,MACTkiB,KAAK,aAAa,SAASnJ,GAAK,MAAO,aAAeA,EAAEvW,EAAI,IAAMuW,EAAEtW,EAAI,OACxE6e,OAAO,QACPY,KAAK,OAAQ,eACbA,KAAK,SAAS,SAASnJ,GAAK,OAAOvL,KAAK0C,IAAI,EAAG6I,EAAEkrB,OACjD/hB,KAAK,UAAU,SAASnJ,GAAK,OAAOvL,KAAK0C,IAAI,EAAG6I,EAAEmrB,OAGnD,IAAIV,EAAQhD,EAAQ7lB,GACnBqI,MAAOxV,KAAK0C,IAAI,EAAG6I,EAAEkrB,KACrBvC,OAAQl0B,KAAK0C,IAAI,EAAG6I,EAAEmrB,KAEnB,cAAenrB,GAAGqI,GAAGgS,OAAOpzB,MAAMyL,KAAK+3B,MAjB/C7oB,EAAUhT,OAAOkpB,OAAOlW,EAASiW,GAqBrC,IAAI4S,EAAQ,SAAS5B,GACjBA,EAAUrO,MAAK,SAASzpB,GACpB+E,QAAQuK,IAAI,QAAStP,GAQrB,IAAIq6B,EAAU/iB,GAAGyU,OAAOsO,UACvBj6B,KAAK,CAACyQ,EAAQqI,MAAOrI,EAAQ+mB,SAC7B0C,QAAO,GACPl8B,OAAM,SAAS6Q,GAAK,OAAOA,EAAE7O,QAKjBkX,GAAGgS,OAAOpzB,MAClBshB,OAAO,KACPC,QAAQ,cAAc,GACA8iB,MAAMv6B,GAAMmY,UAAU,gBAC5CnY,KAAKq6B,EAAQ5b,OACblH,QACAC,OAAO,KACPC,QAAQ,eAAe,GACvB9V,KAAKu4B,OA4ElB,OAxEAR,EAAMxgB,MAAQ,SAAS8gB,GACnB,OAAKx5B,UAAUtE,QACf2U,EAAQqI,MAAQ8gB,EACTN,GAFuB7oB,EAAQqI,OAK1CwgB,EAAM9B,OAAS,SAASoC,GACpB,OAAKx5B,UAAUtE,QACf2U,EAAQ+mB,OAASoC,EACVN,GAFuB7oB,EAAQ+mB,QAK1C8B,EAAM1B,qBAAuB,SAASgC,GAClC,OAAKx5B,UAAUtE,QACf2U,EAAQmnB,qBAAuBgC,EACxBN,GAFuB7oB,EAAQmnB,sBAK1C0B,EAAMzC,eAAiB,SAAS+C,GAC5B,OAAKx5B,UAAUtE,QACf2U,EAAQomB,eAAiB+C,EAClBN,GAFuB7oB,EAAQomB,gBAK1CyC,EAAM1C,iBAAmB,SAASgD,GAC9B,OAAKx5B,UAAUtE,QACf2U,EAAQmmB,iBAAmBgD,EACpBN,GAFuB7oB,EAAQmmB,kBAK1C0C,EAAMtX,cAAgB,SAAS4X,GAC3B,OAAKx5B,UAAUtE,QACf2U,EAAQuR,cAAgB4X,EACjBN,GAFuB7oB,EAAQuR,eAK1CsX,EAAM1B,qBAAuB,SAASgC,GAClC,OAAKx5B,UAAUtE,QACf2U,EAAQmnB,qBAAuBgC,EACxBN,GAFuB7oB,EAAQmnB,sBAK1C0B,EAAME,sBAAwB,SAASI,GACnC,OAAKx5B,UAAUtE,QACf2U,EAAQ+oB,sBAAwBI,EACzBN,GAFuB7oB,EAAQ+oB,uBAK1CF,EAAMK,oBAAsB,SAASC,GACjC,OAAKx5B,UAAUtE,QACf2U,EAAQkpB,oBAAsBC,EACvBN,GAFuB7oB,EAAQkpB,qBAK1CL,EAAMG,UAAY,SAASG,GACvB,OAAKx5B,UAAUtE,QACf2U,EAAQgpB,UAAYG,EACbN,GAFuB7oB,EAAQgpB,WAK1CH,EAAMpB,aAAe,SAAS0B,GAC1B,OAAKx5B,UAAUtE,QACf2U,EAAQynB,aAAe0B,EAChBN,GAFuB7oB,EAAQynB,cAK1CoB,EAAMc,KAAO,SAASR,GAClB,OAAKx5B,UAAUtE,QACf2U,EAAQ2pB,KAAOR,EACRN,GAFuB7oB,EAAQ2pB,MAKnCd,EHzGX/T,EAAO5uB,UAAUm1B,sBAAwB,SAAS3I,GAC9C,IAKIvqB,EALAN,EAAI,GACPC,EAAI,GACL,GAA0B,IAAtB4qB,EAAWrnB,QAAkC,IAAlBqnB,EAAW,GACtC,OAAO,EAGXrtB,KAAK6vB,MAAQxC,EAAW,GACxBrtB,KAAK4vB,MAAQ,GACb,IAAK,IAAIlO,EAAQ,EAAGA,EAAQ1hB,KAAK6vB,MAAQ,EAAGnO,IACxC1hB,KAAK4vB,MAAM1sB,KAAK,IAAIsT,GAGxB,IADAxW,KAAKiwB,QAAU,GACNvO,EAAQ,EAAGA,EAAQ1hB,KAAK6vB,MAAQ,EAAGnO,IACxC1hB,KAAKiwB,QAAQ/sB,KAAK,IAAI9C,EAAAA,GAO1B,IALAJ,KAAKukC,cAAclX,GACnBrtB,KAAKkwB,QAAU,KACflwB,KAAKwkC,eACLxkC,KAAK+vB,WAAa,EAClB/vB,KAAKgwB,MAAQ,GACJtO,EAAQ,EAAGA,EAAQ1hB,KAAK6vB,MAAQ,EAAGnO,IACxC1hB,KAAKgwB,MAAM9sB,KAAK,IAAIhD,EAAAA,GAMxB,IAJAF,KAAKykC,eAAe,GACpBzkC,KAAK0kC,oBACL1kC,KAAK2kC,cAAc3kC,KAAKV,KAAM,MAEzBwD,EAAI,EAAGA,EAAI9C,KAAK6vB,MAAO/sB,IACxBN,EAAEU,KAAK,IAAMlD,KAAKwwB,kBAAoBxwB,KAAK4vB,MAAM9sB,EAAI,GAAGW,QACxDhB,EAAES,KAAK,IAAMlD,KAAKwwB,kBAAoBxwB,KAAK4vB,MAAM9sB,EAAI,GAAGa,QAG5D,MAAO,CACHksB,MAAO7vB,KAAK6vB,MACZrtB,EAAGA,EACHC,EAAGA,IAIXgtB,EAAO5uB,UAAU0jC,cAAgB,SAAuBlX,GACpD,IAAIvqB,EAAI,KACJ8hC,EAAS,KASb,IANA5kC,KAAK4vB,MAAM1sB,KAAK,IAAIsT,GACpBxW,KAAK4vB,MAAM,GAAGN,QAAQ,GACtBtvB,KAAK4vB,MAAM,GAAGJ,cAAa,GAC3BxvB,KAAK4vB,MAAM,GAAGlsB,KAAK1D,KAAK0vB,MACxB1vB,KAAK4vB,MAAM,GAAGhsB,KAAK5D,KAAK0vB,MAEnBkV,EAAS,EAAG9hC,EAAI,EAAGA,GAAK9C,KAAK6vB,MAAO/sB,IACrC9C,KAAK4vB,MAAM1sB,KAAK,IAAIsT,GACpBxW,KAAK4vB,MAAM9sB,GAAG0sB,cAAa,GAC3BxvB,KAAK4vB,MAAM9sB,GAAGY,KAAK1D,KAAK0vB,MACxB1vB,KAAK4vB,MAAM9sB,GAAGc,KAAK5D,KAAK0vB,MACxB1vB,KAAK4vB,MAAM9sB,GAAGwsB,QAAQjC,EAAWvqB,IAC7BuqB,EAAWvqB,GAAKA,GAChB8hC,IAGM,GAAVA,IACA5kC,KAAK4vB,MAAM,GAAGN,QAAQtvB,KAAK6vB,OAC3B7vB,KAAK4vB,MAAM5vB,KAAK6vB,OAAOP,QAAQ,KAIvCG,EAAO5uB,UAAU2jC,aAAe,WAC5B,IAEIK,EAFA/hC,EAAI,KACJqsB,EAAO,KAGX0V,EAAM7kC,KAAK6vB,MAAQ,EACnB,IAAIttB,EAAO,GACX,IAAKO,EAAI,EAAGA,EAAI+hC,EAAK/hC,IACjBP,EAAKW,MAAK,GAGd,IADAlD,KAAK8vB,QAAU,EACVhtB,EAAI,EAAGA,GAAK9C,KAAK6vB,MAAO/sB,IACzB,GAAwC,IAAnCqsB,EAAOnvB,KAAK4vB,MAAM9sB,GAAGusB,aAAoB9sB,EAAKO,GAAI,CAOnD,IANA9C,KAAKiwB,QAAQjwB,KAAK8vB,SAAS1rB,UAAUtB,GACrC9C,KAAKiwB,QAAQjwB,KAAK8vB,SAASjrB,QAAQsqB,GACnC5sB,EAAKO,IAAK,EACVP,EAAK4sB,IAAQ,EACbnvB,KAAK4vB,MAAM9sB,GAAG3B,UAAUnB,KAAKiwB,QAAQjwB,KAAK8vB,UAC1C9vB,KAAK4vB,MAAMT,GAAMhuB,UAAUnB,KAAKiwB,QAAQjwB,KAAK8vB,UACxChtB,IAAKqsB,IAAQrsB,EAAIqsB,GAAQnvB,KAAK4vB,MAAM9sB,GAAGusB,WAAaF,EAAMrsB,IAAKqsB,IAChE5sB,EAAK4sB,IAAQ,EACb5sB,EAAKO,IAAI,EACT9C,KAAK4vB,MAAM9sB,GAAG3B,UAAUnB,KAAKiwB,QAAQjwB,KAAK8vB,UAC1C9vB,KAAK4vB,MAAMT,GAAMhuB,UAAUnB,KAAKiwB,QAAQjwB,KAAK8vB,UAEjD9vB,KAAKiwB,QAAQjwB,KAAK8vB,SAASvrB,UAAUzB,GACrC9C,KAAKiwB,QAAQjwB,KAAK8vB,SAASprB,UAAUyqB,EAAO,GAE5CnvB,KAAK8vB,YAKjBL,EAAO5uB,UAAU4jC,eAAiB,SAAwBK,GACtD,IAAIhiC,EAAI,KACJqsB,EAAO,KACP4V,EAAU,IAAI7kC,EAAAA,EACdutB,EAAK,IAAIvtB,EAAAA,EACT8kC,EAAK,IAAIjlC,EAAAA,WACTklC,EAAK,IAAI7kC,EAAAA,EACT8kC,EAAM,IAAIxW,EAOd,KANAqW,EAAU/kC,KAAKgwB,MAAMhwB,KAAK+vB,eAClBntB,eAAe,GACvBmiC,EAAQzhC,SAAS,GACjByhC,EAAQ3hC,UAAUpD,KAAK+vB,YACvBgV,EAAQjhC,UAAU,GAEbohC,EAAMllC,KAAKkwB,QAAgB,MAAPgV,EAAaA,EAAMA,EAAInW,UACxCmW,EAAIrW,iBAAmB7uB,KAAK+vB,YAC5BgV,EAAQjhC,UAAUohC,EAAIrhC,aAC9Bf,EAAIgiC,EACJ,GAC4C,IAAnC3V,EAAOnvB,KAAK4vB,MAAM9sB,GAAGusB,aACtB4V,EAAKjlC,KAAK4vB,MAAM9sB,GAAG5B,YACdlB,KAAK4vB,MAAMqV,EAAG9gC,aAAaorB,gBACxBzsB,GAAKmiC,EAAG9gC,aACRnE,KAAK4vB,MAAMqV,EAAG9gC,aAAaqrB,cAAa,GACxCxvB,KAAK4vB,MAAMqV,EAAG3gC,WAAWkrB,cAAa,GACtCxvB,KAAK4vB,MAAMqV,EAAGxgC,aAAa+qB,cAAa,GACxCxvB,KAAK4vB,MAAMqV,EAAGrgC,WAAW4qB,cAAa,GACtC/B,EAAKztB,KAAKykC,eAAeQ,EAAG3gC,UAAYtE,KAAK6vB,MAAQoV,EAAG3gC,UAAY,EAC1D,IACHxB,GAAKmiC,EAAGxgC,aACfzE,KAAK4vB,MAAMqV,EAAGxgC,aAAa+qB,cAAa,GACxCxvB,KAAK4vB,MAAMqV,EAAGrgC,WAAW4qB,cAAa,GACtCxvB,KAAK4vB,MAAMqV,EAAG9gC,aAAaqrB,cAAa,GACxCxvB,KAAK4vB,MAAMqV,EAAG3gC,WAAWkrB,cAAa,GACtC/B,EAAKztB,KAAKykC,eAAeQ,EAAGrgC,UAAY5E,KAAK6vB,MAAQoV,EAAGrgC,UAAY,EAC1D,IAEViK,QAAQuK,IAAI,sCAEhB2rB,EAAQniC,eAAemiC,EAAQpiC,iBAAmB,GAClDqiC,EAAK,IAAIjlC,EAAAA,WACTglC,EAAQliC,cAAckiC,EAAQpiC,iBAAmB,EAAGqiC,GACpDD,EAAQliC,cAAckiC,EAAQpiC,iBAAkB,MAChDqiC,EAAG/jC,QAAQwsB,GACXuX,EAAG7jC,UAAU8jC,GACVniC,GAAKmiC,EAAG9gC,aACP6gC,EAAG3jC,SAAS4jC,EAAG9gC,aACf6gC,EAAGzjC,OAAO0jC,EAAGrgC,aAEbogC,EAAG3jC,SAAS4jC,EAAGxgC,aACfugC,EAAGzjC,OAAO0jC,EAAG3gC,YAEjB0gC,EAAGjjC,aAAY,GACfijC,EAAG/iC,WAAU,GACbwrB,EAAG7qB,eAAe6qB,EAAG9qB,iBAAmB,GACxCqiC,EAAK,IAAIjlC,EAAAA,WACT0tB,EAAG5qB,cAAc4qB,EAAG9qB,iBAAmB,EAAGqiC,GAC1CvX,EAAG5qB,cAAc4qB,EAAG9qB,iBAAkB,MACtCqiC,EAAG/jC,QAAQ8jC,GACXC,EAAG7jC,UAAU8jC,GACTniC,GAAKmiC,EAAG9gC,aACR6gC,EAAG3jC,SAAS4jC,EAAGxgC,aACfugC,EAAGzjC,OAAO0jC,EAAG3gC,aAEb0gC,EAAG3jC,SAAS4jC,EAAG9gC,aACf6gC,EAAGzjC,OAAO0jC,EAAGrgC,YAEjBogC,EAAGjjC,aAAY,GACfijC,EAAG/iC,WAAU,IAEjBa,EAAIqsB,KAEFrsB,EAAI9C,KAAK6vB,QACX/sB,EAAI,SACHA,GAAKgiC,GACd,OAAOC,GAGXtV,EAAO5uB,UAAU6jC,kBAAoB,WACjC,IAAIjX,EAAK,IAAIvtB,EAAAA,EACTilC,EAAU,KACVC,EAAW,KACXtiC,EAAI,KAKR,IAHA2tB,EAAiBrW,KAAKpa,KAAtBywB,GACA0U,EAAU,EACVC,GAAY,EACPtiC,EAAI,EAAGA,EAAI9C,KAAK+vB,WAAYjtB,KAC7B2qB,EAAKztB,KAAKgwB,MAAMltB,IACTH,iBAAmBwiC,GACtBC,EAAW3X,EAAGpqB,WACd8hC,EAAU1X,EAAG9qB,iBACb3C,KAAKV,KAAOmuB,GACLA,EAAGpqB,WAAa+hC,GAChB3X,EAAG9qB,kBAAoBwiC,IAC9BC,EAAW3X,EAAGpqB,WACdrD,KAAKV,KAAOmuB,IAgDxBgC,EAAO5uB,UAAU8jC,cAAgB,SAAuBlX,EAAI4X,GACxD,IAAIC,EAAIC,EAAIC,EAAQC,EAAIC,EAAIrV,EAAUzQ,EAClCld,EAAQijC,EAAIC,EAAIC,EAAIC,EAAIC,EAAQC,EAAMz2B,EACtCy1B,EAAIiB,EAAQC,EAAKC,EACjBrjC,EAAGqJ,EAAGhB,EAAGi7B,EACTC,EAAIC,EACJjY,EAAOkY,EAASC,EAAOC,EAAUC,EACjCC,EAAMC,EAAsBC,EAC5BC,EACAC,EAAMC,EAAMC,EAAKC,EAAKC,EAAIC,EAAIC,EAAIC,EAAIC,EAAOC,EAAOC,EACpDC,EAAUC,EAAMC,EAAQC,EAAQC,EAChCC,EAAK9D,EAAIC,GAAI8D,GACbC,GAAKC,GAAKC,GAASC,GAASC,GAAUC,GAAKC,GAAIC,GAAKC,GAAKC,GAAIC,GAAIC,GAAKC,GAAIC,GAAIC,GAC9EC,GAAW,EAEf3Y,EAAW,EAAI7iB,KAAKogB,IAAM5tB,KAAK6vB,MAAQ,GACvCqW,EAAM,KACNQ,GAAU,EACV,IAAIuC,GAAS,EAEb,IAAK7C,EAAK,EAAsC,OAAlCpB,EAAKvX,EAAGzqB,cAAcimC,KAAkBA,KAAU7C,IAC5Dd,GAAM93B,KAAKihB,IAAI4B,EAAW2U,EAAG5jC,YAC7BmkC,EAAK/3B,KAAKqd,IAAIwF,EAAW2U,EAAG5jC,YAC5BokC,GAAMh4B,KAAKihB,IAAI4B,EAAW2U,EAAG1jC,UAE7BmkC,EADKj4B,KAAKqd,IAAIwF,EAAW2U,EAAG1jC,UAClBikC,EACVG,EAAKJ,EAAKE,EACV5lB,EAAIpS,KAAK+e,KAAKkZ,EAAKA,EAAKC,EAAKA,GAC7BV,EAAGvjC,QAAQgkC,EAAK7lB,GAChBolB,EAAGrjC,QAAQ+jC,EAAK9lB,GAChBolB,EAAGnjC,SAAS2L,KAAK07B,MAAMxD,EAAID,IACvBT,EAAGpjC,WAAa,GAChBojC,EAAGnjC,SAASmjC,EAAGpjC,WAAa,EAAI4L,KAAKogB,IAEhB,MAArByX,GACOA,EAAkBnkC,aAAe8jC,EAAG9jC,cAC3CglC,EAAMlB,EACN0B,EAASN,GAGjB+C,EAAY,OAAa,CACrBnpC,KAAKopC,iBAAiB3b,EAAIztB,KAAKmwB,QAC/BztB,EAAS+qB,EAAG5pB,YAAY7D,KAAKowB,wBACJ,MAArBiV,EACAM,EAAKC,EAAK,GAGVC,GAAM7lC,KAAK4vB,MAAMsW,EAAI9kC,YAAYqC,OAASzD,KAAK4vB,MACtCsW,EAAI5kC,UAAUmC,QAAU,EACjCqiC,GAAM9lC,KAAK4vB,MAAMsW,EAAI9kC,YAAYuC,OAAS3D,KAAK4vB,MACtCsW,EAAI5kC,UAAUqC,QAAU,EACjCgiC,EAAKE,EAAKnjC,EAASwjC,EAAI1kC,UACvBokC,EAAKE,EAAKpjC,EAASwjC,EAAIxkC,WAWvB6kC,GADW,GAAXG,EACU,EAGAA,EAEd1B,EAAKvX,EAAGzqB,cAAcujC,GACtBlY,EAAQ,EACRsY,GAAO,EACP,GAaI,IAZAx6B,EAAIo6B,EAAU,GACN,IACJp6B,EAAIshB,EAAG9qB,iBAAmB,GAE9BwjC,EAAS1Y,EAAGzqB,cAAcmJ,GACrBnM,KAAKqpC,qBAAqBlD,EAAQnB,IAInCuB,EAAUp6B,EACV64B,EAAKmB,GAJLQ,GAAO,IAMLtY,EAAQZ,EAAG9qB,iBAAkB,CAI/B,IADA2jC,GAAU,EACLF,EAAK,EAAGA,EAAK3Y,EAAG9qB,iBAAkByjC,KACnCj6B,EAAIi6B,EAAK,IACA3Y,EAAG9qB,mBACRwJ,EAAI,GAER64B,EAAKvX,EAAGzqB,cAAcojC,IAEtBuC,IADA1C,EAASxY,EAAGzqB,cAAcmJ,IACdvK,WAAaojC,EAAGpjC,YACnB,IACL+mC,IAAM,EAAIn7B,KAAKogB,IAEf+a,GAAKrC,IACLA,EAASqC,GACTK,GAAW5C,GAGnBI,EAAQwC,IACRzC,EAAUyC,GAAW,IACNvb,EAAG9qB,mBACd4jC,EAAU,IAEdvB,EAAKvX,EAAGzqB,cAAcwjC,IACnBvkC,WAAU,GACb0kC,GAAO,UAELA,GAGV,IAFAC,GAAuB,EACvBc,EAAWnB,GACHK,GAAsB,CAK1B,IAJAvY,EAAQ,EACRsY,GAAO,EACPH,EAAQD,EACRM,GAAS,GACDF,GAUJ,GATA3B,EAAKvX,EAAGzqB,cAAcwjC,GAClBA,GAASE,IACTG,GAAS,IAEb16B,EAAIq6B,EAAQ,IACH/Y,EAAG9qB,mBACRwJ,EAAI,GAER85B,EAASxY,EAAGzqB,cAAcmJ,GACtBnM,KAAKqpC,qBAAqBrE,EAAIiB,GAAS,CACvC,KAAM5X,GAASZ,EAAG9qB,iBACd,MAEJ6jC,EAAQr6B,OAGRw6B,GAAO,EAQf,IAHAP,EAAKuB,EAAOC,EAFZnB,EAAWzmC,KAAKspC,eAAe/C,EAASC,EAAOnB,EACvCa,EAAKzY,GAEbkZ,GAAO,EACPmB,EAAY,GACJnB,IAEAP,EADA0B,EAAY,EACPH,EAEa,GAAbG,EACArB,EAGAmB,IAEC,IACN5C,EAAKvX,EAAGzqB,cAAcojC,GACG,MAArBf,GAA6Ba,GAAOlB,IACnB,GAAb8C,GACA/B,EAASf,EAAGpjC,WACF4L,KAAK+7B,KAAK,GAAY7mC,GAChCsjC,EAAOhB,EAAGpjC,WACA4L,KAAK+7B,KAAK,GAAY7mC,GAChC1C,KAAK4vB,MAAMoV,EAAG5jC,YAAYsC,KAClBiiC,EAAKjjC,EAAS8K,KAAKqd,IAAIkb,IAC/B/lC,KAAK4vB,MAAMoV,EAAG5jC,YAAYwC,KAClBgiC,EAAKljC,EAAS8K,KAAKihB,IAAIsX,IAC/B/lC,KAAK4vB,MAAMoV,EAAG1jC,UAAUoC,KAChBiiC,EAAKjjC,EAAS8K,KAAKqd,IAAImb,IAC/BhmC,KAAK4vB,MAAMoV,EAAG1jC,UAAUsC,KAChBgiC,EAAKljC,EAAS8K,KAAKihB,IAAIuX,KAE1B8B,EAAY,IACjB37B,EAAIi6B,EAAK,IACA3Y,EAAG9qB,mBACRwJ,EAAI,GAER64B,EAAKvX,EAAGzqB,cAAcojC,GACtBH,EAASxY,EAAGzqB,cAAcmJ,GAC1B87B,GAAMjD,EAAGxjC,UACT0mC,GAAMlD,EAAGtjC,UACTinC,IAAM3D,EAAGpjC,WAAaqkC,EAAOrkC,YAAc,EACvCojC,EAAGpjC,WAAaqkC,EAAOrkC,aACvB+mC,IAAMn7B,KAAKogB,IAEfya,GAAM76B,KAAKqd,IAAI8d,IAEfH,GADMh7B,KAAKihB,IAAIka,IAEfF,IAAOJ,IACPhC,EAAKJ,EAAOrkC,WAAaojC,EAAGpjC,YACnB,IACLykC,GAAM,EAAI74B,KAAKogB,IAIX8a,GAFJ1D,EAAGljC,aACCukC,GAAM74B,KAAKogB,GAAK,EACX,EAGA,IAIJ,EAET5tB,KAAK4vB,MAAMoV,EAAG1jC,UAAUoC,KAChB1D,KAAK4vB,MAAMqW,EAAO7kC,YAAYqC,OACpBilC,GAAKF,IACvBxoC,KAAK4vB,MAAMoV,EAAG1jC,UAAUsC,KAChB5D,KAAK4vB,MAAMqW,EAAO7kC,YAAYuC,OACpB+kC,GAAKD,IACvBzoC,KAAK4vB,MAAMoV,EAAG5jC,YAAYsC,KAClB1D,KAAK4vB,MAAMoV,EAAG1jC,UAAUmC,OAASykC,IACzCloC,KAAK4vB,MAAMoV,EAAG5jC,YAAYwC,KAClB5D,KAAK4vB,MAAMoV,EAAG1jC,UAAUqC,OAASskC,OAEzC97B,EAAIi6B,EAAK,GACD,IACJj6B,EAAIshB,EAAG9qB,iBAAmB,GAE9BqiC,EAAKvX,EAAGzqB,cAAcmJ,GAEtBg8B,IADAlC,EAASxY,EAAGzqB,cAAcojC,IACT5kC,UACjB4mC,GAAUnC,EAAOvkC,UACjBinC,IAAM3D,EAAGpjC,WAAaqkC,EAAOrkC,YAAc,EACvCojC,EAAGpjC,WAAaqkC,EAAOrkC,aACvB+mC,IAAMn7B,KAAKogB,IAEfya,GAAM76B,KAAKqd,IAAI8d,IAEfH,IADMh7B,KAAKihB,IAAIka,IAEfF,GAAMJ,IACNhC,EAAKJ,EAAOrkC,WAAaojC,EAAGpjC,YACnB,IACLykC,GAAM,EAAI74B,KAAKogB,IAIX8a,GAFJ1D,EAAGljC,aACCukC,GAAM74B,KAAKogB,GAAK,EACX,EAGA,IAIJ,EAET5tB,KAAK4vB,MAAMqW,EAAO7kC,YAAYsC,KACtB1D,KAAK4vB,MAAMoV,EAAG1jC,UAAUmC,OAASilC,GACvBF,IAClBxoC,KAAK4vB,MAAMqW,EAAO7kC,YAAYwC,KACtB5D,KAAK4vB,MAAMoV,EAAG1jC,UAAUqC,OAAS+kC,GACvBD,IAClBzoC,KAAK4vB,MAAMqW,EAAO3kC,UAAUoC,KACpB1D,KAAK4vB,MAAMqW,EAAO7kC,YAAYqC,OACpB2kC,IAClBpoC,KAAK4vB,MAAMqW,EAAO3kC,UAAUsC,KACpB5D,KAAK4vB,MAAMqW,EAAO7kC,YAAYuC,OACpBwkC,OAI1BL,EAAY,GACRF,GAAUpB,EACVoB,GAAU,EAELA,GAAU,KACTA,GAAUna,EAAG9qB,mBACfilC,EAAS,GAGjBE,EAAY,IAGRH,GAAQpB,EACRoB,GAAQ,EAEHA,GAAQ,KACPA,EAAO,IACTA,EAAOla,EAAG9qB,iBAAmB,GAGrCmlC,GAAa,GAEjBnB,GAAgB,GAATgB,IAAyB,GAAXC,EAMzB,IAJAC,EAASrB,EAAQ,IACH/Y,EAAG9qB,mBACbklC,EAAS,GAETrB,GAASD,IACCA,GAAWmB,GAAYG,GAAUH,GAuD3C,GAjDA1C,EAAKvX,EAAGzqB,cAAcujC,GACtBN,EAASxY,EAAGzqB,cAAcwjC,GAC1BvC,EAAKjkC,KAAK4vB,MAAMqW,EAAO3kC,UAAUmC,OACvBzD,KAAK4vB,MAAMoV,EAAG5jC,YAAYqC,OACpCygC,GAAKlkC,KAAK4vB,MAAMqW,EAAO3kC,UAAUqC,OACvB3D,KAAK4vB,MAAMoV,EAAG5jC,YAAYuC,OACpCojC,EAAO/mC,KAAK4vB,MAAMoV,EAAG5jC,YAAYqC,OAASwgC,EAAK,EAC/C+C,EAAOhnC,KAAK4vB,MAAMoV,EAAG5jC,YAAYuC,OAASugC,GAAK,EAE/CiD,EAAKlD,GADL+D,GAAKx6B,KAAK+e,KAAK0X,EAAKA,EAAKC,GAAKA,KAE9BkD,EAAKlD,GAAK8D,GACVX,EAAK1B,EAAKoB,EACVO,EAAK1B,EAAKoB,EAKVC,GADAM,GAFAF,GADAW,GAAKx6B,KAAK+e,KAAK0X,EAAKA,EAAKC,GAAKA,KAGjBiD,GADbG,GAAMU,IACiBZ,GACTD,EAAKE,EACnBH,EAAMK,EAAQH,EAAKE,EAEnBL,GADAe,GAAKx6B,KAAK+e,KAAK0a,EAAMA,EAAMC,EAAMA,GAEjCA,GAAOc,GAKP/D,EAAKjkC,KAAK4vB,MAAMoV,EAAG5jC,YAAYqC,OAASkiC,EACxCzB,GAAKlkC,KAAK4vB,MAAMoV,EAAG5jC,YAAYuC,OAASiiC,GACxC+C,GAAKn7B,KAAK07B,MAAMhF,GAAID,IACX,IACL0E,IAAM,EAAIn7B,KAAKogB,IAEnBqW,EAAKjkC,KAAK4vB,MAAMqW,EAAO3kC,UAAUmC,OAASkiC,EAC1CzB,GAAKlkC,KAAK4vB,MAAMqW,EAAO3kC,UAAUqC,OAASiiC,GAC1CgD,GAAMp7B,KAAK07B,MAAMhF,GAAID,IACX,IACN2E,IAAO,EAAIp7B,KAAKogB,IAEhBgb,GAAMD,KACNC,IAAO,EAAIp7B,KAAKogB,IAQpB4Z,EAAQ7B,GALJmB,EADA8B,GAAMD,GAAKn7B,KAAKogB,IACR,EAGD,GAESlrB,EAASukC,EAC7BQ,EAAQ7B,EAAKkB,EAAOpkC,EAASwkC,EACzBL,EACAlB,GAAM6B,EAAQT,EACdnB,GAAM6B,EAAQT,OAGd,IAAKZ,EAAKG,EAENzjC,GADAkiC,EAAKvX,EAAGzqB,cAAcojC,IACfhlC,WACPpB,KAAK4vB,MAAM9sB,GAAGY,KACN1D,KAAK4vB,MAAM9sB,GAAGW,OAAS+jC,EAAQT,GACvC/mC,KAAK4vB,MAAM9sB,GAAGc,KACN5D,KAAK4vB,MAAM9sB,GAAGa,OAAS8jC,EAAQT,GACvClkC,EAAIkiC,EAAG1jC,SACPtB,KAAK4vB,MAAM9sB,GAAGY,KACN1D,KAAK4vB,MAAM9sB,GAAGW,OAAS+jC,EAAQT,GACvC/mC,KAAK4vB,MAAM9sB,GAAGc,KACN5D,KAAK4vB,MAAM9sB,GAAGa,OAAS8jC,EAAQT,GACnCZ,GAAMI,KAGJJ,GAAM3Y,EAAG9qB,mBACXyjC,EAAK,GAMrBQ,GADAL,EAAUsB,IACwBH,EAEtC,IAAKtB,EAAK,EAAGA,EAAK3Y,EAAG9qB,iBAAkByjC,IAAM,CA6BzC,GA5BApB,EAAKvX,EAAGzqB,cAAcojC,IACtBj6B,EAAIi6B,EAAK,IACA3Y,EAAG9qB,mBACRwJ,EAAI,GAER85B,EAASxY,EAAGzqB,cAAcmJ,GAC1B83B,EAAKjkC,KAAK4vB,MAAMoV,EAAG1jC,UAAUmC,OAASkiC,EACtCzB,GAAKlkC,KAAK4vB,MAAMoV,EAAG1jC,UAAUqC,OAASiiC,EACtC2C,GAAK/6B,KAAK+e,KAAK0X,EAAKA,EAAKC,GAAKA,KAC9ByE,GAAKn7B,KAAK07B,MAAMhF,GAAID,IACX,IACL0E,IAAM,EAAIn7B,KAAKogB,IAEnBqW,EAAKjkC,KAAK4vB,MAAMqW,EAAO7kC,YAAYqC,OAASkiC,EAC5CzB,GAAKlkC,KAAK4vB,MAAMqW,EAAO7kC,YAAYuC,OAASiiC,EAC5C0C,GAAM96B,KAAK+e,KAAK0X,EAAKA,EAAKC,GAAKA,KAC/B0E,GAAMp7B,KAAK07B,MAAMhF,GAAID,IACX,IACN2E,IAAO,EAAIp7B,KAAKogB,IAEhBgb,GAAMD,KACNC,IAAO,EAAIp7B,KAAKogB,IAEpBma,EAAMa,GAAMD,IACZI,GAAM9C,EAAOrkC,WAAaojC,EAAGpjC,aAClB,IACPmnC,IAAO,EAAIv7B,KAAKogB,IAEhBpgB,KAAKmK,IAAIowB,EAAMgB,IAAOv7B,KAAKogB,GAC3B,GAAIoX,EAAGljC,aACH+M,QAAQuK,IAAI,oCACFqU,EAAGtqB,YAAc,+BAE1B,GAAK8iC,EAAO7kC,WAAa4jC,EAAG1jC,UAAa,EAAG,CAC7C0jC,EAAGjjC,aAAY,GACf,SAASonC,EAGjB,GAAInE,EAAGljC,aACH9B,KAAKwpC,2BAA2BxE,EAAIiB,QAQpC,KALA96B,EAAI86B,EAAO7kC,WAAa4jC,EAAG1jC,UACnB,IACJ6J,GAAKnL,KAAK6vB,MAAQ,GAEtBQ,EAAW0X,EAAM58B,EACZgB,EAAI,EAAGA,EAAIhB,EAAGgB,KACfrJ,EAAIkiC,EAAG1jC,SAAW6K,GACVnM,KAAK6vB,QACT/sB,GAAK9C,KAAK6vB,MAAQ,GAGtBmY,GAAKO,IAAMD,GAAMC,MADjBh5B,EAAIo5B,GAAKx8B,EAAIkkB,GACesY,IAAMZ,EAClC/nC,KAAK4vB,MAAM9sB,GAAGY,KAAKiiC,EAAKqC,GAAKx6B,KAAKqd,IAAItb,IACtCvP,KAAK4vB,MAAM9sB,GAAGc,KAAKgiC,EAAKoC,GAAKx6B,KAAKihB,IAAIlf,IAIlD,MAEJ,IAAK62B,EAAK,EAAGA,EAAK3Y,EAAG9qB,iBAAkByjC,IAC/BM,GAAUN,IACVpB,EAAKvX,EAAGzqB,cAAcojC,GAEtBpmC,KAAKypC,gBAAgBzE,GACrBhlC,KAAK2kC,cAAcK,EAAGhkC,UAAWgkC,IAMzC,IAHA75B,EAAI,EACJ09B,GAAK,EACLC,GAAK,EACA1C,EAAK,EAAGA,EAAK3Y,EAAG9qB,iBAAkByjC,IAYnC,IAXAj6B,EAAIi6B,EAAK,IACA3Y,EAAG9qB,mBACRwJ,EAAI,GAER64B,EAAKvX,EAAGzqB,cAAcojC,GACtBH,EAASxY,EAAGzqB,cAAcmJ,GAC1BhB,GAAK,EACL09B,IAAM7oC,KAAK4vB,MAAMoV,EAAG5jC,YAAYqC,OACtBzD,KAAK4vB,MAAMoV,EAAG1jC,UAAUmC,OAClCqlC,IAAM9oC,KAAK4vB,MAAMoV,EAAG5jC,YAAYuC,OACtB3D,KAAK4vB,MAAMoV,EAAG1jC,UAAUqC,QAC7BqhC,EAAGljC,aACJ,IAAKqK,EAAI64B,EAAG1jC,SAAW,EAAG6K,GAAK85B,EAAO7kC,WAAY+K,IAC1CA,EAAInM,KAAK6vB,QACT1jB,GAAKnM,KAAK6vB,MAAQ,GAEtB1kB,IACA09B,IAAM7oC,KAAK4vB,MAAMzjB,GAAG1I,OACpBqlC,IAAM9oC,KAAK4vB,MAAMzjB,GAAGxI,OAIhC8pB,EAAG/pB,KAAKmlC,GAAK19B,GACbsiB,EAAG7pB,KAAKklC,GAAK39B,IAGjBskB,EAAO5uB,UAAUuoC,iBAAmB,SAA0B3b,EAAI0C,GAC9D,IAAIuZ,EAAQC,EAAIvuB,EAAIwuB,EAAMC,EAAMnnC,EAAQonC,EACpChnC,EAAGqJ,EAAG7L,EAAKD,EAAO0pC,EAAU,EAC5B/E,EAAK,IAAIjlC,EAAAA,WAAckmC,EAAS,IAAIlmC,EAAAA,WACpCiqC,EAAQ,SAEZ,EAAG,CAEC,IADAN,EAAS,KACJG,EAAO,EAAKD,EAAO,EAAK9mC,EAAI,EAAGA,EAAI2qB,EAAG9qB,iBAAkBG,IACzDkiC,EAAKvX,EAAGzqB,cAAcF,IACtBqJ,EAAIrJ,EAAI,IACC2qB,EAAG9qB,mBACRwJ,EAAI,GAER85B,EAASxY,EAAGzqB,cAAcmJ,GAC1B7L,EAAM0kC,EAAG1jC,UACTjB,EAAQ4lC,EAAO7kC,YACHd,IACRD,GAASL,KAAK6vB,MAAQ,IAE1BzU,EAAK6qB,EAAOrkC,WAAaojC,EAAGpjC,aAClB,IACNwZ,GAAM,EAAI5N,KAAKogB,IAanBgc,GAAQxuB,GAAM,GANNuuB,EALH3E,EAAGljC,aAIAsZ,GAAM5N,KAAKogB,GAAK,EACX,EAGA,IAPJvtB,EAAQC,GAUQ,GACzBupC,GAAQzuB,EAAKA,EAAKuuB,GAClBG,EAAM1uB,EAAKuuB,GACDD,IAAW1E,EAAGljC,cAAgB6nC,EAAK,IACzCD,EAASI,EACTC,EAAUjnC,IAGlBJ,EAASknC,EAAOC,GACHG,IACTtnC,EAASsnC,GAETN,EAAShnC,EAASytB,GAClB1C,EAAGzqB,cAAc+mC,GAAShoC,aAAY,SAErC2nC,EAAShnC,EAASytB,GACvB1C,EAAG5pB,YAAc,EACjBnB,EAAS+qB,EAAG5pB,YAGZ4pB,EAAG3pB,UAAUpB,IAIrB+sB,EAAO5uB,UAAUyoC,eAAiB,SAAwB/C,EAASC,EAAOnB,EAAmBa,EAAKzY,GAC9F,IAAIY,EAAOvd,EAAKs1B,EAAItjC,EAChB6jC,EAMJ,IAJAtY,EAAQ,EACRvd,GAAO,EACPs1B,EAAKG,EACLI,GAAO,GACCA,GACAtY,IAAgC,EAAtBZ,EAAG9qB,kBACbkM,QAAQuK,IAAI,qCAES,MAArBisB,GAA6B5X,EAAGzqB,cAAcojC,IAAOF,IACrDp1B,EAAMs1B,GAEVO,EAAOP,GAAMI,IACPJ,GAAM3Y,EAAG9qB,mBACXyjC,EAAK,GAGb,IAAY,GAARt1B,EAAW,CACX,IAAKhO,EAAI,EAAGsjC,EAAKG,EAASzjC,GAAKurB,EAAQ,GAAK,EAAGvrB,MACrCsjC,GAAM3Y,EAAG9qB,mBACXyjC,EAAK,GAEbt1B,EAAMs1B,EAEV,OAAOt1B,GAGX2e,EAAO5uB,UAAU2oC,2BAA6B,SAAoCxE,EAAIiB,GAClF,IAAIF,EAAQkE,EAAOC,EAAOC,EAAMlG,EAAIC,EAAIkG,EAAIC,EAAI1B,EAAIX,EAAI3B,EAAIiE,EACxDjqC,EAAOC,EAAK6K,EAAGo/B,EAAQC,EACvBC,EAkBJ,GAhBA1E,EAASf,EAAGpjC,YACZsoC,EAAQD,EAAQhE,EAAOrkC,YACXmkC,IACRmE,GAAS,EAAI18B,KAAKogB,IAEtBuc,GAAQpE,EAASmE,GAAS,EAC1B7pC,EAAQ2kC,EAAG1jC,UAEX6J,GADA7K,EAAM2lC,EAAO7kC,YACHf,GACF,IACJ8K,GAAKnL,KAAK6vB,MAAQ,IAEtBwW,EAAKJ,EAAOrkC,WAAaojC,EAAGpjC,YACnB,IACLykC,GAAM,EAAI74B,KAAKogB,IAEV,GAALziB,EACAnL,KAAK0qC,yBAAyBrqC,EAAOC,OAEpC,CACD2jC,EAAKjkC,KAAK4vB,MAAMtvB,GAAKmD,OAASzD,KAAK4vB,MAAMvvB,GAAOoD,OAChDygC,EAAKlkC,KAAK4vB,MAAMtvB,GAAKqD,OAAS3D,KAAK4vB,MAAMvvB,GAAOsD,OAEhDsgC,GADA+D,EAAKx6B,KAAK+e,KAAK0X,EAAKA,EAAKC,EAAKA,GAE9BA,GAAM8D,EACFA,GAAM,KAAO3B,GAAM74B,KAAKogB,GAAK,KAC7B2c,EAASlqC,EAAQ,GACJL,KAAK6vB,QACd0a,GAAUvqC,KAAK6vB,MAAQ,IAE3B2a,EAAOlqC,EAAM,GACF,IACPkqC,GAAQxqC,KAAK6vB,MAAQ,GAEzB7vB,KAAK4vB,MAAM2a,GAAQ7mC,KAAK1D,KAAK4vB,MAAMvvB,GAAOoD,OAAS,GAAMwgC,GACzDjkC,KAAK4vB,MAAM2a,GAAQ3mC,KAAK5D,KAAK4vB,MAAMvvB,GAAOsD,OAAS,GAAMugC,GACzDlkC,KAAK4vB,MAAM4a,GAAM9mC,KAAK1D,KAAK4vB,MAAMtvB,GAAKmD,OAAS,GAAMwgC,GACrDjkC,KAAK4vB,MAAM4a,GAAM5mC,KAAK5D,KAAK4vB,MAAMtvB,GAAKqD,OAAS,GAAMugC,GACrD7jC,EAAQkqC,EACRjqC,EAAMkqC,GAEV,GACIC,GAAY,EACZzqC,KAAK0qC,yBAAyBrqC,EAAOC,IACrCiqC,EAASlqC,EAAQ,GACJL,KAAK6vB,QACd0a,GAAUvqC,KAAK6vB,MAAQ,GAE3BoU,EAAKjkC,KAAK4vB,MAAM2a,GAAQ9mC,OAASzD,KAAK4vB,MAAMvvB,GAAOoD,OACnDygC,EAAKlkC,KAAK4vB,MAAM2a,GAAQ5mC,OAAS3D,KAAK4vB,MAAMvvB,GAAOsD,QACnDymC,EAAK58B,KAAK07B,MAAMhF,EAAID,IACX,IACLmG,GAAM,EAAI58B,KAAKogB,KAEnB0c,EAAMF,EAAKrE,GACD,IACNuE,GAAO,EAAI98B,KAAKogB,IAEhB0c,EAAM98B,KAAKogB,KACX6c,GAAY,IAEhBD,EAAOlqC,EAAM,GACF,IACPkqC,GAAQxqC,KAAK6vB,MAAQ,GAEzBoU,EAAKjkC,KAAK4vB,MAAM4a,GAAM/mC,OAASzD,KAAK4vB,MAAMtvB,GAAKmD,OAC/CygC,EAAKlkC,KAAK4vB,MAAM4a,GAAM7mC,OAAS3D,KAAK4vB,MAAMtvB,GAAKqD,QAC/C0mC,EAAK78B,KAAK07B,MAAMhF,EAAID,IACX,IACLoG,GAAM,EAAI78B,KAAKogB,KAEnB0c,EAAML,EAAQI,GACJ,IACNC,GAAO,EAAI98B,KAAKogB,IAEhB0c,EAAM98B,KAAKogB,KACX6c,GAAY,GAEZA,IACA9B,EAAK3oC,KAAK2qC,MAAMR,EAAMpE,EAAS,IAC/B/lC,KAAK4vB,MAAM2a,GAAQ7mC,KACX1D,KAAK4vB,MAAMvvB,GAAOoD,OAAS+J,KAAKqd,IAAI8d,IAC5C3oC,KAAK4vB,MAAM2a,GAAQ3mC,KACX5D,KAAK4vB,MAAMvvB,GAAOsD,OAAS6J,KAAKihB,IAAIka,IAC5CtoC,EAAQkqC,EACR5B,EAAK3oC,KAAK4qC,MAAMT,EAAMD,EAAQ,IAC9BlqC,KAAK4vB,MAAM4a,GAAM9mC,KAAK1D,KAAK4vB,MAAMtvB,GAAKmD,OAAS+J,KAAKqd,IAAI8d,IACxD3oC,KAAK4vB,MAAM4a,GAAM5mC,KAAK5D,KAAK4vB,MAAMtvB,GAAKqD,OAAS6J,KAAKihB,IAAIka,IACxDroC,EAAMkqC,EACNr/B,GAAK,SAEJs/B,GAAat/B,EAAI,KAIlCskB,EAAO5uB,UAAU6pC,yBAA2B,SAAkCrqC,EAAOC,GACjF,IAAI2jC,EAAIC,EAAI8D,EAAIjB,EAAMC,EAAMvB,EAAIC,EAAIuB,EAAKC,EAAKC,EAAIC,EAAI73B,EAClD2O,EAAG/R,EAAGrJ,EASV,GAPAmhC,EAAKjkC,KAAK4vB,MAAMtvB,GAAKmD,OAASzD,KAAK4vB,MAAMvvB,GAAOoD,OAChDygC,EAAKlkC,KAAK4vB,MAAMtvB,GAAKqD,OAAS3D,KAAK4vB,MAAMvvB,GAAOsD,OAChDqkC,EAAKx6B,KAAK+e,KAAK0X,EAAKA,EAAKC,EAAKA,IAC9BhmB,EAAI5d,EAAMD,GACF,IACJ6d,GAAKle,KAAK6vB,MAAQ,GAElBmY,GAAM9pB,EAGN,IAFA+lB,GAAM+D,EACN9D,GAAM8D,EACD77B,EAAI,EAAGA,EAAI+R,EAAG/R,KACfrJ,EAAIzC,EAAQ8L,GACJnM,KAAK6vB,QACT/sB,GAAK9C,KAAK6vB,MAAQ,GAEtB7vB,KAAK4vB,MAAM9sB,GAAGY,KACN1D,KAAK4vB,MAAMvvB,GAAOoD,OAASwgC,EAAK93B,EAAI+R,GAC5Cle,KAAK4vB,MAAM9sB,GAAGc,KACN5D,KAAK4vB,MAAMvvB,GAAOsD,OAASugC,EAAK/3B,EAAI+R,QAiBhD,IAbAle,KAAK6qC,oBAAqB3sB,EAAI,EAAI8pB,GAClC/D,GAAM+D,EACN9D,GAAM8D,EACNjB,EAAO/mC,KAAK4vB,MAAMvvB,GAAOoD,OAASwgC,EAAK+D,EAAK,EAC5ChB,EAAOhnC,KAAK4vB,MAAMvvB,GAAOsD,OAASugC,EAAK8D,EAAK,EAC5CvC,EAAKvB,EACLwB,GAAMzB,EACNgD,EAAMF,EAAO/mC,KAAKswB,GAAKmV,EACvByB,EAAMF,EAAOhnC,KAAKswB,GAAKoV,EACvByB,EAAKnnC,KAAK4vB,MAAMvvB,GAAOoD,OAASwjC,EAChCG,EAAKpnC,KAAK4vB,MAAMvvB,GAAOsD,OAASujC,EAChCc,EAAKx6B,KAAK+e,KAAK4a,EAAKA,EAAKC,EAAKA,GAC9B73B,EAAI/B,KAAK07B,MAAM9B,EAAID,GACdh7B,EAAI,EAAGA,EAAI+R,EAAG/R,KACfrJ,EAAIzC,EAAQ8L,GACJnM,KAAK6vB,QACT/sB,GAAK9C,KAAK6vB,MAAQ,GAEtB7vB,KAAK4vB,MAAM9sB,GAAGY,KAAKujC,EAAMe,EAAKx6B,KAAKqd,IAAItb,EAAIpD,EAAInM,KAAKqwB,WACpDrwB,KAAK4vB,MAAM9sB,GAAGc,KAAKsjC,EAAMc,EAAKx6B,KAAKihB,IAAIlf,EAAIpD,EAAInM,KAAKqwB,YAKhEZ,EAAO5uB,UAAUgqC,oBAAsB,SAA6B1/B,EAAG7B,GACnE,IAAIwhC,EAAGC,EAAKC,EAAMprB,EAAGqrB,EAAMC,EAAOv8B,EAC9Bw8B,EAIJH,IAFAD,GAAO5/B,EAAI,GAAOqC,KAAKogB,IAETtkB,GAAK6B,EAAI,SAAW7B,GAC9BA,EAAI,IAEJ0hC,EAAO,GAEXG,EAAO,EACP,GACIL,GAAKC,EAAMC,GAAQ,EAEnBC,EAAO,EAAM,KADbrrB,EAAIpS,KAAK+e,KAAKue,EAAIA,EAAIxhC,EAAIA,EAAI,IACNsW,GACpBpS,KAAKmK,IAAIszB,GAAQ,GACjBp8B,QAAQuK,IAAI,6CAA+C6xB,EACzC,IAAMrrB,IAI5BjR,GAFAu8B,EAAQ19B,KAAK49B,KAAKH,KAEL9/B,EAAI,GAAK,EADhBqC,KAAK49B,KAAKN,EAAIlrB,GACY,EAAIpS,KAAKogB,IACjC,EACJod,EAAOF,EAGPC,EAAMD,QAELt9B,KAAKmK,IAAIhJ,GAAK,QAAYw8B,EAAOnrC,KAAK2vB,SAC3Cwb,GAAQnrC,KAAK2vB,UACT0b,wBACAx8B,QAAQuK,IAAI,2CACZiyB,uBAAwB,GAE5BP,EAAI,EACJI,EAAQ,GAEZlrC,KAAKswB,GAAKwa,EACV9qC,KAAKqwB,SAAW6a,GAGpBzb,EAAO5uB,UAAU4oC,gBAAkB,SAAyBzE,GACxD,IAAI9mB,EAAG7d,EAAOC,EAAKwC,EAAGqsB,EAClB8V,EAiBJ,IAfAA,EAAKD,EAAG9jC,YACRgd,EAAI,EACA8mB,EAAG5jC,YAAc6jC,EAAG9gC,aACpB9D,EAAQ4kC,EAAG9gC,YACX7D,EAAM2kC,EAAG3gC,YAGTjE,EAAQ4kC,EAAGxgC,YACXnE,EAAM2kC,EAAGrgC,YAET5E,KAAK4vB,MAAMoV,EAAG5jC,YAAYqC,OAASzD,KAAK0vB,KAAO,KACxC1vB,KAAK4vB,MAAMoV,EAAG1jC,UAAUmC,OAASzD,KAAK0vB,KAAO,MACpD7gB,QAAQuK,IACA,kEAEPtW,EAAIzC,EAAQ,EAAGyC,GAAKxC,EAAKwC,IAC1Bob,IACAle,KAAK4vB,MAAM9sB,GAAGY,KACN1D,KAAK4vB,MAAMoV,EAAG5jC,YAAYqC,OAASzD,KAAKuwB,aAAerS,EAC7C8mB,EAAGxjC,WACrBxB,KAAK4vB,MAAM9sB,GAAGc,KACN5D,KAAK4vB,MAAMoV,EAAG5jC,YAAYuC,OAAS3D,KAAKuwB,aAAerS,EAC7C8mB,EAAGtjC,WACrBytB,EAAOnvB,KAAK4vB,MAAM9sB,GAAGusB,UACrBrvB,KAAK4vB,MAAMT,GAAMzrB,KACT1D,KAAK4vB,MAAMoV,EAAG1jC,UAAUmC,OAASzD,KAAKuwB,aAAerS,EAC3C8mB,EAAGxjC,WACrBxB,KAAK4vB,MAAMT,GAAMvrB,KACT5D,KAAK4vB,MAAMoV,EAAG1jC,UAAUqC,OAAS3D,KAAKuwB,aAAerS,EAC3C8mB,EAAGtjC,YAK7B+tB,EAAO5uB,UAAU8pC,MAAQ,SAAe5R,EAAIE,GACxC,OAASF,EAAOE,EAAQF,EAAOE,GAGnCxJ,EAAO5uB,UAAU+pC,MAAQ,SAAe7R,EAAIE,GACxC,OAASF,EAAOE,EAAQF,EAAOE,GAGnCxJ,EAAO5uB,UAAUwoC,qBAAuB,SAA8BrE,EAAIiB,GACtE,QAAIjB,EAAGljC,cAGEkjC,EAAG1jC,SAAW,GAAK2kC,EAAO7kC","sources":["webpack://[name]/webpack/universalModuleDefinition","webpack://[name]/./src/naview/connection.js","webpack://[name]/./src/naview/loop.js","webpack://[name]/./src/naview/region.js","webpack://[name]/./node_modules/base64-js/index.js","webpack://[name]/./node_modules/buffer/index.js","webpack://[name]/./src/d3-context-menu.css?fe1f","webpack://[name]/./src/fornac.css?7f8e","webpack://[name]/./node_modules/ieee754/index.js","webpack://[name]/./node_modules/slugid/index.js","webpack://[name]/./node_modules/slugid/slugid.js","webpack://[name]/./node_modules/uuid/dist/esm-browser/rng.js","webpack://[name]/./node_modules/uuid/dist/esm-browser/regex.js","webpack://[name]/./node_modules/uuid/dist/esm-browser/validate.js","webpack://[name]/./node_modules/uuid/dist/esm-browser/stringify.js","webpack://[name]/./node_modules/uuid/dist/esm-browser/v1.js","webpack://[name]/./node_modules/uuid/dist/esm-browser/parse.js","webpack://[name]/./node_modules/uuid/dist/esm-browser/v35.js","webpack://[name]/./node_modules/uuid/dist/esm-browser/md5.js","webpack://[name]/./node_modules/uuid/dist/esm-browser/v3.js","webpack://[name]/./node_modules/uuid/dist/esm-browser/v4.js","webpack://[name]/./node_modules/uuid/dist/esm-browser/sha1.js","webpack://[name]/./node_modules/uuid/dist/esm-browser/v5.js","webpack://[name]/./node_modules/uuid/dist/esm-browser/nil.js","webpack://[name]/./node_modules/uuid/dist/esm-browser/version.js","webpack://[name]/external umd \"d3\"","webpack://[name]/webpack/bootstrap","webpack://[name]/webpack/runtime/compat get default export","webpack://[name]/webpack/runtime/define property getters","webpack://[name]/webpack/runtime/global","webpack://[name]/webpack/runtime/hasOwnProperty shorthand","webpack://[name]/webpack/runtime/make namespace object","webpack://[name]/webpack/runtime/publicPath","webpack://[name]/./src/img/play.svg","webpack://[name]/./src/d3-context-menu.js","webpack://[name]/./src/rnautils.js","webpack://[name]/./src/rnagraph.js","webpack://[name]/./src/simplernaplot.js","webpack://[name]/./src/naview/radloop.js","webpack://[name]/./src/naview/base.js","webpack://[name]/./src/naview/naview.js","webpack://[name]/./src/fornac.js","webpack://[name]/./src/rnaplot.js","webpack://[name]/./src/rnatreemap.js"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"d3\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([\"d3\"], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"fornac\"] = factory(require(\"d3\"));\n\telse\n\t\troot[\"fornac\"] = factory(root[\"d3\"]);\n})(self, function(__WEBPACK_EXTERNAL_MODULE__990__) {\nreturn ","import {Loop} from './loop.js';\nimport {Region} from './region.js';\n\nexport function Connection() {\n\tthis.loop = new Loop();\n\tthis.region = new Region();\n\t// Start and end form the 1st base pair of the region.\n\tthis.start = null;\n this.end = null;\n\tthis.xrad = null;\n this.yrad = null;\n this.angle = null;\n\t// True if segment between this connection and the\n\t// next must be extruded out of the circle\n\tthis.extruded = null;\n\t// True if the extruded segment must be drawn long.\n\tthis.broken = null;\n\n\tthis._isNull = false;\n}\n\nConnection.prototype.isNull = function(){\n\treturn this._isNull;\n}\n\nConnection.prototype.setNull = function(isNull){\n\tthis._isNull = isNull;\n}\n\nConnection.prototype.getLoop = function(){\n\treturn this.loop;\n}\n\nConnection.prototype.setLoop = function(loop) {\n\tthis.loop = loop;\n}\n\nConnection.prototype.getRegion = function(){\n\treturn this.region;\n}\n\nConnection.prototype.setRegion = function(region){\n\tthis.region = region;\n}\n\nConnection.prototype.getStart = function(){\n\treturn this.start;\n}\n\nConnection.prototype.setStart = function(start) {\n\tthis.start = start;\n}\n\nConnection.prototype.getEnd = function(){\n\treturn this.end;\n}\n\nConnection.prototype.setEnd = function(end){\n\tthis.end = end;\n}\n\nConnection.prototype.getXrad = function(){\n\treturn this.xrad;\n}\n\nConnection.prototype.setXrad = function(xrad){\n\tthis.xrad = xrad;\n}\n\nConnection.prototype.getYrad = function(){\n\treturn this.yrad;\n}\n\nConnection.prototype.setYrad = function(yrad) {\n\tthis.yrad = yrad;\n}\n\nConnection.prototype.getAngle = function(){\n\treturn this.angle;\n}\n\nConnection.prototype.setAngle = function(angle){\n\tthis.angle = angle;\n}\n\nConnection.prototype.isExtruded = function(){\n\treturn this.extruded;\n}\n\nConnection.prototype.setExtruded = function(extruded){\n\tthis.extruded = extruded;\n}\n\nConnection.prototype.isBroken = function(){\n\treturn this.broken;\n}\n\nConnection.prototype.setBroken = function(broken){\n\tthis.broken = broken;\n}\n","import {Connection} from './connection.js';\n\nexport function Loop() {\n\tthis.nconnection = null;\n\tthis.connections = [];\n\tthis._connections = [];\n\tthis.number = null;\n\tthis.depth = null;\n\tthis.mark = null;\n\tthis.x = null;\n this.y = null;\n this.radius = null;\n}\n\nLoop.prototype.getNconnection = function() {\n\treturn this.nconnection;\n}\n\nLoop.prototype.setNconnection = function(nconnection) {\n\tthis.nconnection = nconnection;\n}\n\nLoop.prototype.setConnection = function(i, c){\n\tif (c != null){\n\t\tthis._connections[i] = c;\n }\n\telse {\n\t\tif (!this._connections[i]){\n\t\t\tthis._connections[i] = new Connection();\n\t\t}\n\t\tthis._connections[i].setNull(true);\n\t}\n}\n\nLoop.prototype.getConnection = function(i){\n\tvar Connection = require(\"./connection\");\n\tif (!this._connections[i]){\n this._connections[i] = new Connection();\n }\n\tvar c = this._connections[i];\n\tif (c.isNull()){\n\t\treturn null;\n }\n\telse {\n\t\treturn c;\n }\n}\n\nLoop.prototype.addConnection = function(i, c){\n\tthis._connections.push(c);\n}\n\nLoop.prototype.getNumber = function(){\n\treturn this.number;\n}\n\nLoop.prototype.setNumber = function(number){\n\tthis.number = number;\n}\n\nLoop.prototype.getDepth = function(){\n\treturn this.depth;\n}\n\nLoop.prototype.setDepth = function(depth){\n\tthis.depth = depth;\n}\n\nLoop.prototype.isMark = function(){\n\treturn this.mark;\n}\n\nLoop.prototype.setMark = function(mark){\n\tthis.mark = mark;\n}\n\nLoop.prototype.getX = function(){\n\treturn this.x;\n}\n\nLoop.prototype.setX = function(x){\n\tthis.x = x;\n}\n\nLoop.prototype.getY = function(){\n\treturn this.y;\n}\n\nLoop.prototype.setY = function(y){\n\tthis.y = y;\n}\n\nLoop.prototype.getRadius = function(){\n\treturn this.radius;\n}\n\nLoop.prototype.setRadius = function(radius){\n\tthis.radius = radius;\n}\n","export function Region() {\n\tthis._start1 = null;\n this._end1 = null;\n this._start2 = null;\n this._end2 = null;\n}\n\nRegion.prototype.getStart1 = function(){\n\treturn this._start1;\n}\n\nRegion.prototype.setStart1 = function(start1){\n\tthis._start1 = start1;\n}\n\nRegion.prototype.getEnd1 = function(){\n\treturn this._end1;\n}\n\nRegion.prototype.setEnd1 = function(end1){\n\tthis._end1 = end1;\n}\n\nRegion.prototype.getStart2 = function(){\n\treturn this._start2;\n}\n\nRegion.prototype.setStart2 = function(start2){\n\tthis._start2 = start2;\n}\n\nRegion.prototype.getEnd2 = function(){\n\treturn this._end2;\n}\n\nRegion.prototype.setEnd2 = function(end2){\n\tthis._end2 = end2;\n}\n","'use strict'\n\nexports.byteLength = byteLength\nexports.toByteArray = toByteArray\nexports.fromByteArray = fromByteArray\n\nvar lookup = []\nvar revLookup = []\nvar Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array\n\nvar code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'\nfor (var i = 0, len = code.length; i < len; ++i) {\n lookup[i] = code[i]\n revLookup[code.charCodeAt(i)] = i\n}\n\n// Support decoding URL-safe base64 strings, as Node.js does.\n// See: https://en.wikipedia.org/wiki/Base64#URL_applications\nrevLookup['-'.charCodeAt(0)] = 62\nrevLookup['_'.charCodeAt(0)] = 63\n\nfunction getLens (b64) {\n var len = b64.length\n\n if (len % 4 > 0) {\n throw new Error('Invalid string. Length must be a multiple of 4')\n }\n\n // Trim off extra bytes after placeholder bytes are found\n // See: https://github.com/beatgammit/base64-js/issues/42\n var validLen = b64.indexOf('=')\n if (validLen === -1) validLen = len\n\n var placeHoldersLen = validLen === len\n ? 0\n : 4 - (validLen % 4)\n\n return [validLen, placeHoldersLen]\n}\n\n// base64 is 4/3 + up to two characters of the original data\nfunction byteLength (b64) {\n var lens = getLens(b64)\n var validLen = lens[0]\n var placeHoldersLen = lens[1]\n return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen\n}\n\nfunction _byteLength (b64, validLen, placeHoldersLen) {\n return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen\n}\n\nfunction toByteArray (b64) {\n var tmp\n var lens = getLens(b64)\n var validLen = lens[0]\n var placeHoldersLen = lens[1]\n\n var arr = new Arr(_byteLength(b64, validLen, placeHoldersLen))\n\n var curByte = 0\n\n // if there are placeholders, only get up to the last complete 4 chars\n var len = placeHoldersLen > 0\n ? validLen - 4\n : validLen\n\n var i\n for (i = 0; i < len; i += 4) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 18) |\n (revLookup[b64.charCodeAt(i + 1)] << 12) |\n (revLookup[b64.charCodeAt(i + 2)] << 6) |\n revLookup[b64.charCodeAt(i + 3)]\n arr[curByte++] = (tmp >> 16) & 0xFF\n arr[curByte++] = (tmp >> 8) & 0xFF\n arr[curByte++] = tmp & 0xFF\n }\n\n if (placeHoldersLen === 2) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 2) |\n (revLookup[b64.charCodeAt(i + 1)] >> 4)\n arr[curByte++] = tmp & 0xFF\n }\n\n if (placeHoldersLen === 1) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 10) |\n (revLookup[b64.charCodeAt(i + 1)] << 4) |\n (revLookup[b64.charCodeAt(i + 2)] >> 2)\n arr[curByte++] = (tmp >> 8) & 0xFF\n arr[curByte++] = tmp & 0xFF\n }\n\n return arr\n}\n\nfunction tripletToBase64 (num) {\n return lookup[num >> 18 & 0x3F] +\n lookup[num >> 12 & 0x3F] +\n lookup[num >> 6 & 0x3F] +\n lookup[num & 0x3F]\n}\n\nfunction encodeChunk (uint8, start, end) {\n var tmp\n var output = []\n for (var i = start; i < end; i += 3) {\n tmp =\n ((uint8[i] << 16) & 0xFF0000) +\n ((uint8[i + 1] << 8) & 0xFF00) +\n (uint8[i + 2] & 0xFF)\n output.push(tripletToBase64(tmp))\n }\n return output.join('')\n}\n\nfunction fromByteArray (uint8) {\n var tmp\n var len = uint8.length\n var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes\n var parts = []\n var maxChunkLength = 16383 // must be multiple of 3\n\n // go through the array every three bytes, we'll deal with trailing stuff later\n for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) {\n parts.push(encodeChunk(uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength)))\n }\n\n // pad the end with zeros, but make sure to not forget the extra bytes\n if (extraBytes === 1) {\n tmp = uint8[len - 1]\n parts.push(\n lookup[tmp >> 2] +\n lookup[(tmp << 4) & 0x3F] +\n '=='\n )\n } else if (extraBytes === 2) {\n tmp = (uint8[len - 2] << 8) + uint8[len - 1]\n parts.push(\n lookup[tmp >> 10] +\n lookup[(tmp >> 4) & 0x3F] +\n lookup[(tmp << 2) & 0x3F] +\n '='\n )\n }\n\n return parts.join('')\n}\n","/*!\n * The buffer module from node.js, for the browser.\n *\n * @author Feross Aboukhadijeh \n * @license MIT\n */\n/* eslint-disable no-proto */\n\n'use strict'\n\nconst base64 = require('base64-js')\nconst ieee754 = require('ieee754')\nconst customInspectSymbol =\n (typeof Symbol === 'function' && typeof Symbol['for'] === 'function') // eslint-disable-line dot-notation\n ? Symbol['for']('nodejs.util.inspect.custom') // eslint-disable-line dot-notation\n : null\n\nexports.Buffer = Buffer\nexports.SlowBuffer = SlowBuffer\nexports.INSPECT_MAX_BYTES = 50\n\nconst K_MAX_LENGTH = 0x7fffffff\nexports.kMaxLength = K_MAX_LENGTH\n\n/**\n * If `Buffer.TYPED_ARRAY_SUPPORT`:\n * === true Use Uint8Array implementation (fastest)\n * === false Print warning and recommend using `buffer` v4.x which has an Object\n * implementation (most compatible, even IE6)\n *\n * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+,\n * Opera 11.6+, iOS 4.2+.\n *\n * We report that the browser does not support typed arrays if the are not subclassable\n * using __proto__. Firefox 4-29 lacks support for adding new properties to `Uint8Array`\n * (See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438). IE 10 lacks support\n * for __proto__ and has a buggy typed array implementation.\n */\nBuffer.TYPED_ARRAY_SUPPORT = typedArraySupport()\n\nif (!Buffer.TYPED_ARRAY_SUPPORT && typeof console !== 'undefined' &&\n typeof console.error === 'function') {\n console.error(\n 'This browser lacks typed array (Uint8Array) support which is required by ' +\n '`buffer` v5.x. Use `buffer` v4.x if you require old browser support.'\n )\n}\n\nfunction typedArraySupport () {\n // Can typed array instances can be augmented?\n try {\n const arr = new Uint8Array(1)\n const proto = { foo: function () { return 42 } }\n Object.setPrototypeOf(proto, Uint8Array.prototype)\n Object.setPrototypeOf(arr, proto)\n return arr.foo() === 42\n } catch (e) {\n return false\n }\n}\n\nObject.defineProperty(Buffer.prototype, 'parent', {\n enumerable: true,\n get: function () {\n if (!Buffer.isBuffer(this)) return undefined\n return this.buffer\n }\n})\n\nObject.defineProperty(Buffer.prototype, 'offset', {\n enumerable: true,\n get: function () {\n if (!Buffer.isBuffer(this)) return undefined\n return this.byteOffset\n }\n})\n\nfunction createBuffer (length) {\n if (length > K_MAX_LENGTH) {\n throw new RangeError('The value \"' + length + '\" is invalid for option \"size\"')\n }\n // Return an augmented `Uint8Array` instance\n const buf = new Uint8Array(length)\n Object.setPrototypeOf(buf, Buffer.prototype)\n return buf\n}\n\n/**\n * The Buffer constructor returns instances of `Uint8Array` that have their\n * prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of\n * `Uint8Array`, so the returned instances will have all the node `Buffer` methods\n * and the `Uint8Array` methods. Square bracket notation works as expected -- it\n * returns a single octet.\n *\n * The `Uint8Array` prototype remains unmodified.\n */\n\nfunction Buffer (arg, encodingOrOffset, length) {\n // Common case.\n if (typeof arg === 'number') {\n if (typeof encodingOrOffset === 'string') {\n throw new TypeError(\n 'The \"string\" argument must be of type string. Received type number'\n )\n }\n return allocUnsafe(arg)\n }\n return from(arg, encodingOrOffset, length)\n}\n\nBuffer.poolSize = 8192 // not used by this implementation\n\nfunction from (value, encodingOrOffset, length) {\n if (typeof value === 'string') {\n return fromString(value, encodingOrOffset)\n }\n\n if (ArrayBuffer.isView(value)) {\n return fromArrayView(value)\n }\n\n if (value == null) {\n throw new TypeError(\n 'The first argument must be one of type string, Buffer, ArrayBuffer, Array, ' +\n 'or Array-like Object. Received type ' + (typeof value)\n )\n }\n\n if (isInstance(value, ArrayBuffer) ||\n (value && isInstance(value.buffer, ArrayBuffer))) {\n return fromArrayBuffer(value, encodingOrOffset, length)\n }\n\n if (typeof SharedArrayBuffer !== 'undefined' &&\n (isInstance(value, SharedArrayBuffer) ||\n (value && isInstance(value.buffer, SharedArrayBuffer)))) {\n return fromArrayBuffer(value, encodingOrOffset, length)\n }\n\n if (typeof value === 'number') {\n throw new TypeError(\n 'The \"value\" argument must not be of type number. Received type number'\n )\n }\n\n const valueOf = value.valueOf && value.valueOf()\n if (valueOf != null && valueOf !== value) {\n return Buffer.from(valueOf, encodingOrOffset, length)\n }\n\n const b = fromObject(value)\n if (b) return b\n\n if (typeof Symbol !== 'undefined' && Symbol.toPrimitive != null &&\n typeof value[Symbol.toPrimitive] === 'function') {\n return Buffer.from(value[Symbol.toPrimitive]('string'), encodingOrOffset, length)\n }\n\n throw new TypeError(\n 'The first argument must be one of type string, Buffer, ArrayBuffer, Array, ' +\n 'or Array-like Object. Received type ' + (typeof value)\n )\n}\n\n/**\n * Functionally equivalent to Buffer(arg, encoding) but throws a TypeError\n * if value is a number.\n * Buffer.from(str[, encoding])\n * Buffer.from(array)\n * Buffer.from(buffer)\n * Buffer.from(arrayBuffer[, byteOffset[, length]])\n **/\nBuffer.from = function (value, encodingOrOffset, length) {\n return from(value, encodingOrOffset, length)\n}\n\n// Note: Change prototype *after* Buffer.from is defined to workaround Chrome bug:\n// https://github.com/feross/buffer/pull/148\nObject.setPrototypeOf(Buffer.prototype, Uint8Array.prototype)\nObject.setPrototypeOf(Buffer, Uint8Array)\n\nfunction assertSize (size) {\n if (typeof size !== 'number') {\n throw new TypeError('\"size\" argument must be of type number')\n } else if (size < 0) {\n throw new RangeError('The value \"' + size + '\" is invalid for option \"size\"')\n }\n}\n\nfunction alloc (size, fill, encoding) {\n assertSize(size)\n if (size <= 0) {\n return createBuffer(size)\n }\n if (fill !== undefined) {\n // Only pay attention to encoding if it's a string. This\n // prevents accidentally sending in a number that would\n // be interpreted as a start offset.\n return typeof encoding === 'string'\n ? createBuffer(size).fill(fill, encoding)\n : createBuffer(size).fill(fill)\n }\n return createBuffer(size)\n}\n\n/**\n * Creates a new filled Buffer instance.\n * alloc(size[, fill[, encoding]])\n **/\nBuffer.alloc = function (size, fill, encoding) {\n return alloc(size, fill, encoding)\n}\n\nfunction allocUnsafe (size) {\n assertSize(size)\n return createBuffer(size < 0 ? 0 : checked(size) | 0)\n}\n\n/**\n * Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance.\n * */\nBuffer.allocUnsafe = function (size) {\n return allocUnsafe(size)\n}\n/**\n * Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance.\n */\nBuffer.allocUnsafeSlow = function (size) {\n return allocUnsafe(size)\n}\n\nfunction fromString (string, encoding) {\n if (typeof encoding !== 'string' || encoding === '') {\n encoding = 'utf8'\n }\n\n if (!Buffer.isEncoding(encoding)) {\n throw new TypeError('Unknown encoding: ' + encoding)\n }\n\n const length = byteLength(string, encoding) | 0\n let buf = createBuffer(length)\n\n const actual = buf.write(string, encoding)\n\n if (actual !== length) {\n // Writing a hex string, for example, that contains invalid characters will\n // cause everything after the first invalid character to be ignored. (e.g.\n // 'abxxcd' will be treated as 'ab')\n buf = buf.slice(0, actual)\n }\n\n return buf\n}\n\nfunction fromArrayLike (array) {\n const length = array.length < 0 ? 0 : checked(array.length) | 0\n const buf = createBuffer(length)\n for (let i = 0; i < length; i += 1) {\n buf[i] = array[i] & 255\n }\n return buf\n}\n\nfunction fromArrayView (arrayView) {\n if (isInstance(arrayView, Uint8Array)) {\n const copy = new Uint8Array(arrayView)\n return fromArrayBuffer(copy.buffer, copy.byteOffset, copy.byteLength)\n }\n return fromArrayLike(arrayView)\n}\n\nfunction fromArrayBuffer (array, byteOffset, length) {\n if (byteOffset < 0 || array.byteLength < byteOffset) {\n throw new RangeError('\"offset\" is outside of buffer bounds')\n }\n\n if (array.byteLength < byteOffset + (length || 0)) {\n throw new RangeError('\"length\" is outside of buffer bounds')\n }\n\n let buf\n if (byteOffset === undefined && length === undefined) {\n buf = new Uint8Array(array)\n } else if (length === undefined) {\n buf = new Uint8Array(array, byteOffset)\n } else {\n buf = new Uint8Array(array, byteOffset, length)\n }\n\n // Return an augmented `Uint8Array` instance\n Object.setPrototypeOf(buf, Buffer.prototype)\n\n return buf\n}\n\nfunction fromObject (obj) {\n if (Buffer.isBuffer(obj)) {\n const len = checked(obj.length) | 0\n const buf = createBuffer(len)\n\n if (buf.length === 0) {\n return buf\n }\n\n obj.copy(buf, 0, 0, len)\n return buf\n }\n\n if (obj.length !== undefined) {\n if (typeof obj.length !== 'number' || numberIsNaN(obj.length)) {\n return createBuffer(0)\n }\n return fromArrayLike(obj)\n }\n\n if (obj.type === 'Buffer' && Array.isArray(obj.data)) {\n return fromArrayLike(obj.data)\n }\n}\n\nfunction checked (length) {\n // Note: cannot use `length < K_MAX_LENGTH` here because that fails when\n // length is NaN (which is otherwise coerced to zero.)\n if (length >= K_MAX_LENGTH) {\n throw new RangeError('Attempt to allocate Buffer larger than maximum ' +\n 'size: 0x' + K_MAX_LENGTH.toString(16) + ' bytes')\n }\n return length | 0\n}\n\nfunction SlowBuffer (length) {\n if (+length != length) { // eslint-disable-line eqeqeq\n length = 0\n }\n return Buffer.alloc(+length)\n}\n\nBuffer.isBuffer = function isBuffer (b) {\n return b != null && b._isBuffer === true &&\n b !== Buffer.prototype // so Buffer.isBuffer(Buffer.prototype) will be false\n}\n\nBuffer.compare = function compare (a, b) {\n if (isInstance(a, Uint8Array)) a = Buffer.from(a, a.offset, a.byteLength)\n if (isInstance(b, Uint8Array)) b = Buffer.from(b, b.offset, b.byteLength)\n if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) {\n throw new TypeError(\n 'The \"buf1\", \"buf2\" arguments must be one of type Buffer or Uint8Array'\n )\n }\n\n if (a === b) return 0\n\n let x = a.length\n let y = b.length\n\n for (let i = 0, len = Math.min(x, y); i < len; ++i) {\n if (a[i] !== b[i]) {\n x = a[i]\n y = b[i]\n break\n }\n }\n\n if (x < y) return -1\n if (y < x) return 1\n return 0\n}\n\nBuffer.isEncoding = function isEncoding (encoding) {\n switch (String(encoding).toLowerCase()) {\n case 'hex':\n case 'utf8':\n case 'utf-8':\n case 'ascii':\n case 'latin1':\n case 'binary':\n case 'base64':\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return true\n default:\n return false\n }\n}\n\nBuffer.concat = function concat (list, length) {\n if (!Array.isArray(list)) {\n throw new TypeError('\"list\" argument must be an Array of Buffers')\n }\n\n if (list.length === 0) {\n return Buffer.alloc(0)\n }\n\n let i\n if (length === undefined) {\n length = 0\n for (i = 0; i < list.length; ++i) {\n length += list[i].length\n }\n }\n\n const buffer = Buffer.allocUnsafe(length)\n let pos = 0\n for (i = 0; i < list.length; ++i) {\n let buf = list[i]\n if (isInstance(buf, Uint8Array)) {\n if (pos + buf.length > buffer.length) {\n if (!Buffer.isBuffer(buf)) buf = Buffer.from(buf)\n buf.copy(buffer, pos)\n } else {\n Uint8Array.prototype.set.call(\n buffer,\n buf,\n pos\n )\n }\n } else if (!Buffer.isBuffer(buf)) {\n throw new TypeError('\"list\" argument must be an Array of Buffers')\n } else {\n buf.copy(buffer, pos)\n }\n pos += buf.length\n }\n return buffer\n}\n\nfunction byteLength (string, encoding) {\n if (Buffer.isBuffer(string)) {\n return string.length\n }\n if (ArrayBuffer.isView(string) || isInstance(string, ArrayBuffer)) {\n return string.byteLength\n }\n if (typeof string !== 'string') {\n throw new TypeError(\n 'The \"string\" argument must be one of type string, Buffer, or ArrayBuffer. ' +\n 'Received type ' + typeof string\n )\n }\n\n const len = string.length\n const mustMatch = (arguments.length > 2 && arguments[2] === true)\n if (!mustMatch && len === 0) return 0\n\n // Use a for loop to avoid recursion\n let loweredCase = false\n for (;;) {\n switch (encoding) {\n case 'ascii':\n case 'latin1':\n case 'binary':\n return len\n case 'utf8':\n case 'utf-8':\n return utf8ToBytes(string).length\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return len * 2\n case 'hex':\n return len >>> 1\n case 'base64':\n return base64ToBytes(string).length\n default:\n if (loweredCase) {\n return mustMatch ? -1 : utf8ToBytes(string).length // assume utf8\n }\n encoding = ('' + encoding).toLowerCase()\n loweredCase = true\n }\n }\n}\nBuffer.byteLength = byteLength\n\nfunction slowToString (encoding, start, end) {\n let loweredCase = false\n\n // No need to verify that \"this.length <= MAX_UINT32\" since it's a read-only\n // property of a typed array.\n\n // This behaves neither like String nor Uint8Array in that we set start/end\n // to their upper/lower bounds if the value passed is out of range.\n // undefined is handled specially as per ECMA-262 6th Edition,\n // Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization.\n if (start === undefined || start < 0) {\n start = 0\n }\n // Return early if start > this.length. Done here to prevent potential uint32\n // coercion fail below.\n if (start > this.length) {\n return ''\n }\n\n if (end === undefined || end > this.length) {\n end = this.length\n }\n\n if (end <= 0) {\n return ''\n }\n\n // Force coercion to uint32. This will also coerce falsey/NaN values to 0.\n end >>>= 0\n start >>>= 0\n\n if (end <= start) {\n return ''\n }\n\n if (!encoding) encoding = 'utf8'\n\n while (true) {\n switch (encoding) {\n case 'hex':\n return hexSlice(this, start, end)\n\n case 'utf8':\n case 'utf-8':\n return utf8Slice(this, start, end)\n\n case 'ascii':\n return asciiSlice(this, start, end)\n\n case 'latin1':\n case 'binary':\n return latin1Slice(this, start, end)\n\n case 'base64':\n return base64Slice(this, start, end)\n\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return utf16leSlice(this, start, end)\n\n default:\n if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)\n encoding = (encoding + '').toLowerCase()\n loweredCase = true\n }\n }\n}\n\n// This property is used by `Buffer.isBuffer` (and the `is-buffer` npm package)\n// to detect a Buffer instance. It's not possible to use `instanceof Buffer`\n// reliably in a browserify context because there could be multiple different\n// copies of the 'buffer' package in use. This method works even for Buffer\n// instances that were created from another copy of the `buffer` package.\n// See: https://github.com/feross/buffer/issues/154\nBuffer.prototype._isBuffer = true\n\nfunction swap (b, n, m) {\n const i = b[n]\n b[n] = b[m]\n b[m] = i\n}\n\nBuffer.prototype.swap16 = function swap16 () {\n const len = this.length\n if (len % 2 !== 0) {\n throw new RangeError('Buffer size must be a multiple of 16-bits')\n }\n for (let i = 0; i < len; i += 2) {\n swap(this, i, i + 1)\n }\n return this\n}\n\nBuffer.prototype.swap32 = function swap32 () {\n const len = this.length\n if (len % 4 !== 0) {\n throw new RangeError('Buffer size must be a multiple of 32-bits')\n }\n for (let i = 0; i < len; i += 4) {\n swap(this, i, i + 3)\n swap(this, i + 1, i + 2)\n }\n return this\n}\n\nBuffer.prototype.swap64 = function swap64 () {\n const len = this.length\n if (len % 8 !== 0) {\n throw new RangeError('Buffer size must be a multiple of 64-bits')\n }\n for (let i = 0; i < len; i += 8) {\n swap(this, i, i + 7)\n swap(this, i + 1, i + 6)\n swap(this, i + 2, i + 5)\n swap(this, i + 3, i + 4)\n }\n return this\n}\n\nBuffer.prototype.toString = function toString () {\n const length = this.length\n if (length === 0) return ''\n if (arguments.length === 0) return utf8Slice(this, 0, length)\n return slowToString.apply(this, arguments)\n}\n\nBuffer.prototype.toLocaleString = Buffer.prototype.toString\n\nBuffer.prototype.equals = function equals (b) {\n if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer')\n if (this === b) return true\n return Buffer.compare(this, b) === 0\n}\n\nBuffer.prototype.inspect = function inspect () {\n let str = ''\n const max = exports.INSPECT_MAX_BYTES\n str = this.toString('hex', 0, max).replace(/(.{2})/g, '$1 ').trim()\n if (this.length > max) str += ' ... '\n return ''\n}\nif (customInspectSymbol) {\n Buffer.prototype[customInspectSymbol] = Buffer.prototype.inspect\n}\n\nBuffer.prototype.compare = function compare (target, start, end, thisStart, thisEnd) {\n if (isInstance(target, Uint8Array)) {\n target = Buffer.from(target, target.offset, target.byteLength)\n }\n if (!Buffer.isBuffer(target)) {\n throw new TypeError(\n 'The \"target\" argument must be one of type Buffer or Uint8Array. ' +\n 'Received type ' + (typeof target)\n )\n }\n\n if (start === undefined) {\n start = 0\n }\n if (end === undefined) {\n end = target ? target.length : 0\n }\n if (thisStart === undefined) {\n thisStart = 0\n }\n if (thisEnd === undefined) {\n thisEnd = this.length\n }\n\n if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) {\n throw new RangeError('out of range index')\n }\n\n if (thisStart >= thisEnd && start >= end) {\n return 0\n }\n if (thisStart >= thisEnd) {\n return -1\n }\n if (start >= end) {\n return 1\n }\n\n start >>>= 0\n end >>>= 0\n thisStart >>>= 0\n thisEnd >>>= 0\n\n if (this === target) return 0\n\n let x = thisEnd - thisStart\n let y = end - start\n const len = Math.min(x, y)\n\n const thisCopy = this.slice(thisStart, thisEnd)\n const targetCopy = target.slice(start, end)\n\n for (let i = 0; i < len; ++i) {\n if (thisCopy[i] !== targetCopy[i]) {\n x = thisCopy[i]\n y = targetCopy[i]\n break\n }\n }\n\n if (x < y) return -1\n if (y < x) return 1\n return 0\n}\n\n// Finds either the first index of `val` in `buffer` at offset >= `byteOffset`,\n// OR the last index of `val` in `buffer` at offset <= `byteOffset`.\n//\n// Arguments:\n// - buffer - a Buffer to search\n// - val - a string, Buffer, or number\n// - byteOffset - an index into `buffer`; will be clamped to an int32\n// - encoding - an optional encoding, relevant is val is a string\n// - dir - true for indexOf, false for lastIndexOf\nfunction bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) {\n // Empty buffer means no match\n if (buffer.length === 0) return -1\n\n // Normalize byteOffset\n if (typeof byteOffset === 'string') {\n encoding = byteOffset\n byteOffset = 0\n } else if (byteOffset > 0x7fffffff) {\n byteOffset = 0x7fffffff\n } else if (byteOffset < -0x80000000) {\n byteOffset = -0x80000000\n }\n byteOffset = +byteOffset // Coerce to Number.\n if (numberIsNaN(byteOffset)) {\n // byteOffset: it it's undefined, null, NaN, \"foo\", etc, search whole buffer\n byteOffset = dir ? 0 : (buffer.length - 1)\n }\n\n // Normalize byteOffset: negative offsets start from the end of the buffer\n if (byteOffset < 0) byteOffset = buffer.length + byteOffset\n if (byteOffset >= buffer.length) {\n if (dir) return -1\n else byteOffset = buffer.length - 1\n } else if (byteOffset < 0) {\n if (dir) byteOffset = 0\n else return -1\n }\n\n // Normalize val\n if (typeof val === 'string') {\n val = Buffer.from(val, encoding)\n }\n\n // Finally, search either indexOf (if dir is true) or lastIndexOf\n if (Buffer.isBuffer(val)) {\n // Special case: looking for empty string/buffer always fails\n if (val.length === 0) {\n return -1\n }\n return arrayIndexOf(buffer, val, byteOffset, encoding, dir)\n } else if (typeof val === 'number') {\n val = val & 0xFF // Search for a byte value [0-255]\n if (typeof Uint8Array.prototype.indexOf === 'function') {\n if (dir) {\n return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset)\n } else {\n return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset)\n }\n }\n return arrayIndexOf(buffer, [val], byteOffset, encoding, dir)\n }\n\n throw new TypeError('val must be string, number or Buffer')\n}\n\nfunction arrayIndexOf (arr, val, byteOffset, encoding, dir) {\n let indexSize = 1\n let arrLength = arr.length\n let valLength = val.length\n\n if (encoding !== undefined) {\n encoding = String(encoding).toLowerCase()\n if (encoding === 'ucs2' || encoding === 'ucs-2' ||\n encoding === 'utf16le' || encoding === 'utf-16le') {\n if (arr.length < 2 || val.length < 2) {\n return -1\n }\n indexSize = 2\n arrLength /= 2\n valLength /= 2\n byteOffset /= 2\n }\n }\n\n function read (buf, i) {\n if (indexSize === 1) {\n return buf[i]\n } else {\n return buf.readUInt16BE(i * indexSize)\n }\n }\n\n let i\n if (dir) {\n let foundIndex = -1\n for (i = byteOffset; i < arrLength; i++) {\n if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) {\n if (foundIndex === -1) foundIndex = i\n if (i - foundIndex + 1 === valLength) return foundIndex * indexSize\n } else {\n if (foundIndex !== -1) i -= i - foundIndex\n foundIndex = -1\n }\n }\n } else {\n if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength\n for (i = byteOffset; i >= 0; i--) {\n let found = true\n for (let j = 0; j < valLength; j++) {\n if (read(arr, i + j) !== read(val, j)) {\n found = false\n break\n }\n }\n if (found) return i\n }\n }\n\n return -1\n}\n\nBuffer.prototype.includes = function includes (val, byteOffset, encoding) {\n return this.indexOf(val, byteOffset, encoding) !== -1\n}\n\nBuffer.prototype.indexOf = function indexOf (val, byteOffset, encoding) {\n return bidirectionalIndexOf(this, val, byteOffset, encoding, true)\n}\n\nBuffer.prototype.lastIndexOf = function lastIndexOf (val, byteOffset, encoding) {\n return bidirectionalIndexOf(this, val, byteOffset, encoding, false)\n}\n\nfunction hexWrite (buf, string, offset, length) {\n offset = Number(offset) || 0\n const remaining = buf.length - offset\n if (!length) {\n length = remaining\n } else {\n length = Number(length)\n if (length > remaining) {\n length = remaining\n }\n }\n\n const strLen = string.length\n\n if (length > strLen / 2) {\n length = strLen / 2\n }\n let i\n for (i = 0; i < length; ++i) {\n const parsed = parseInt(string.substr(i * 2, 2), 16)\n if (numberIsNaN(parsed)) return i\n buf[offset + i] = parsed\n }\n return i\n}\n\nfunction utf8Write (buf, string, offset, length) {\n return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length)\n}\n\nfunction asciiWrite (buf, string, offset, length) {\n return blitBuffer(asciiToBytes(string), buf, offset, length)\n}\n\nfunction base64Write (buf, string, offset, length) {\n return blitBuffer(base64ToBytes(string), buf, offset, length)\n}\n\nfunction ucs2Write (buf, string, offset, length) {\n return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length)\n}\n\nBuffer.prototype.write = function write (string, offset, length, encoding) {\n // Buffer#write(string)\n if (offset === undefined) {\n encoding = 'utf8'\n length = this.length\n offset = 0\n // Buffer#write(string, encoding)\n } else if (length === undefined && typeof offset === 'string') {\n encoding = offset\n length = this.length\n offset = 0\n // Buffer#write(string, offset[, length][, encoding])\n } else if (isFinite(offset)) {\n offset = offset >>> 0\n if (isFinite(length)) {\n length = length >>> 0\n if (encoding === undefined) encoding = 'utf8'\n } else {\n encoding = length\n length = undefined\n }\n } else {\n throw new Error(\n 'Buffer.write(string, encoding, offset[, length]) is no longer supported'\n )\n }\n\n const remaining = this.length - offset\n if (length === undefined || length > remaining) length = remaining\n\n if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) {\n throw new RangeError('Attempt to write outside buffer bounds')\n }\n\n if (!encoding) encoding = 'utf8'\n\n let loweredCase = false\n for (;;) {\n switch (encoding) {\n case 'hex':\n return hexWrite(this, string, offset, length)\n\n case 'utf8':\n case 'utf-8':\n return utf8Write(this, string, offset, length)\n\n case 'ascii':\n case 'latin1':\n case 'binary':\n return asciiWrite(this, string, offset, length)\n\n case 'base64':\n // Warning: maxLength not taken into account in base64Write\n return base64Write(this, string, offset, length)\n\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return ucs2Write(this, string, offset, length)\n\n default:\n if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)\n encoding = ('' + encoding).toLowerCase()\n loweredCase = true\n }\n }\n}\n\nBuffer.prototype.toJSON = function toJSON () {\n return {\n type: 'Buffer',\n data: Array.prototype.slice.call(this._arr || this, 0)\n }\n}\n\nfunction base64Slice (buf, start, end) {\n if (start === 0 && end === buf.length) {\n return base64.fromByteArray(buf)\n } else {\n return base64.fromByteArray(buf.slice(start, end))\n }\n}\n\nfunction utf8Slice (buf, start, end) {\n end = Math.min(buf.length, end)\n const res = []\n\n let i = start\n while (i < end) {\n const firstByte = buf[i]\n let codePoint = null\n let bytesPerSequence = (firstByte > 0xEF)\n ? 4\n : (firstByte > 0xDF)\n ? 3\n : (firstByte > 0xBF)\n ? 2\n : 1\n\n if (i + bytesPerSequence <= end) {\n let secondByte, thirdByte, fourthByte, tempCodePoint\n\n switch (bytesPerSequence) {\n case 1:\n if (firstByte < 0x80) {\n codePoint = firstByte\n }\n break\n case 2:\n secondByte = buf[i + 1]\n if ((secondByte & 0xC0) === 0x80) {\n tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F)\n if (tempCodePoint > 0x7F) {\n codePoint = tempCodePoint\n }\n }\n break\n case 3:\n secondByte = buf[i + 1]\n thirdByte = buf[i + 2]\n if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) {\n tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F)\n if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) {\n codePoint = tempCodePoint\n }\n }\n break\n case 4:\n secondByte = buf[i + 1]\n thirdByte = buf[i + 2]\n fourthByte = buf[i + 3]\n if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) {\n tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F)\n if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) {\n codePoint = tempCodePoint\n }\n }\n }\n }\n\n if (codePoint === null) {\n // we did not generate a valid codePoint so insert a\n // replacement char (U+FFFD) and advance only 1 byte\n codePoint = 0xFFFD\n bytesPerSequence = 1\n } else if (codePoint > 0xFFFF) {\n // encode to utf16 (surrogate pair dance)\n codePoint -= 0x10000\n res.push(codePoint >>> 10 & 0x3FF | 0xD800)\n codePoint = 0xDC00 | codePoint & 0x3FF\n }\n\n res.push(codePoint)\n i += bytesPerSequence\n }\n\n return decodeCodePointsArray(res)\n}\n\n// Based on http://stackoverflow.com/a/22747272/680742, the browser with\n// the lowest limit is Chrome, with 0x10000 args.\n// We go 1 magnitude less, for safety\nconst MAX_ARGUMENTS_LENGTH = 0x1000\n\nfunction decodeCodePointsArray (codePoints) {\n const len = codePoints.length\n if (len <= MAX_ARGUMENTS_LENGTH) {\n return String.fromCharCode.apply(String, codePoints) // avoid extra slice()\n }\n\n // Decode in chunks to avoid \"call stack size exceeded\".\n let res = ''\n let i = 0\n while (i < len) {\n res += String.fromCharCode.apply(\n String,\n codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH)\n )\n }\n return res\n}\n\nfunction asciiSlice (buf, start, end) {\n let ret = ''\n end = Math.min(buf.length, end)\n\n for (let i = start; i < end; ++i) {\n ret += String.fromCharCode(buf[i] & 0x7F)\n }\n return ret\n}\n\nfunction latin1Slice (buf, start, end) {\n let ret = ''\n end = Math.min(buf.length, end)\n\n for (let i = start; i < end; ++i) {\n ret += String.fromCharCode(buf[i])\n }\n return ret\n}\n\nfunction hexSlice (buf, start, end) {\n const len = buf.length\n\n if (!start || start < 0) start = 0\n if (!end || end < 0 || end > len) end = len\n\n let out = ''\n for (let i = start; i < end; ++i) {\n out += hexSliceLookupTable[buf[i]]\n }\n return out\n}\n\nfunction utf16leSlice (buf, start, end) {\n const bytes = buf.slice(start, end)\n let res = ''\n // If bytes.length is odd, the last 8 bits must be ignored (same as node.js)\n for (let i = 0; i < bytes.length - 1; i += 2) {\n res += String.fromCharCode(bytes[i] + (bytes[i + 1] * 256))\n }\n return res\n}\n\nBuffer.prototype.slice = function slice (start, end) {\n const len = this.length\n start = ~~start\n end = end === undefined ? len : ~~end\n\n if (start < 0) {\n start += len\n if (start < 0) start = 0\n } else if (start > len) {\n start = len\n }\n\n if (end < 0) {\n end += len\n if (end < 0) end = 0\n } else if (end > len) {\n end = len\n }\n\n if (end < start) end = start\n\n const newBuf = this.subarray(start, end)\n // Return an augmented `Uint8Array` instance\n Object.setPrototypeOf(newBuf, Buffer.prototype)\n\n return newBuf\n}\n\n/*\n * Need to make sure that buffer isn't trying to write out of bounds.\n */\nfunction checkOffset (offset, ext, length) {\n if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint')\n if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length')\n}\n\nBuffer.prototype.readUintLE =\nBuffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) {\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n let val = this[offset]\n let mul = 1\n let i = 0\n while (++i < byteLength && (mul *= 0x100)) {\n val += this[offset + i] * mul\n }\n\n return val\n}\n\nBuffer.prototype.readUintBE =\nBuffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) {\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) {\n checkOffset(offset, byteLength, this.length)\n }\n\n let val = this[offset + --byteLength]\n let mul = 1\n while (byteLength > 0 && (mul *= 0x100)) {\n val += this[offset + --byteLength] * mul\n }\n\n return val\n}\n\nBuffer.prototype.readUint8 =\nBuffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 1, this.length)\n return this[offset]\n}\n\nBuffer.prototype.readUint16LE =\nBuffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 2, this.length)\n return this[offset] | (this[offset + 1] << 8)\n}\n\nBuffer.prototype.readUint16BE =\nBuffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 2, this.length)\n return (this[offset] << 8) | this[offset + 1]\n}\n\nBuffer.prototype.readUint32LE =\nBuffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return ((this[offset]) |\n (this[offset + 1] << 8) |\n (this[offset + 2] << 16)) +\n (this[offset + 3] * 0x1000000)\n}\n\nBuffer.prototype.readUint32BE =\nBuffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return (this[offset] * 0x1000000) +\n ((this[offset + 1] << 16) |\n (this[offset + 2] << 8) |\n this[offset + 3])\n}\n\nBuffer.prototype.readBigUInt64LE = defineBigIntMethod(function readBigUInt64LE (offset) {\n offset = offset >>> 0\n validateNumber(offset, 'offset')\n const first = this[offset]\n const last = this[offset + 7]\n if (first === undefined || last === undefined) {\n boundsError(offset, this.length - 8)\n }\n\n const lo = first +\n this[++offset] * 2 ** 8 +\n this[++offset] * 2 ** 16 +\n this[++offset] * 2 ** 24\n\n const hi = this[++offset] +\n this[++offset] * 2 ** 8 +\n this[++offset] * 2 ** 16 +\n last * 2 ** 24\n\n return BigInt(lo) + (BigInt(hi) << BigInt(32))\n})\n\nBuffer.prototype.readBigUInt64BE = defineBigIntMethod(function readBigUInt64BE (offset) {\n offset = offset >>> 0\n validateNumber(offset, 'offset')\n const first = this[offset]\n const last = this[offset + 7]\n if (first === undefined || last === undefined) {\n boundsError(offset, this.length - 8)\n }\n\n const hi = first * 2 ** 24 +\n this[++offset] * 2 ** 16 +\n this[++offset] * 2 ** 8 +\n this[++offset]\n\n const lo = this[++offset] * 2 ** 24 +\n this[++offset] * 2 ** 16 +\n this[++offset] * 2 ** 8 +\n last\n\n return (BigInt(hi) << BigInt(32)) + BigInt(lo)\n})\n\nBuffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) {\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n let val = this[offset]\n let mul = 1\n let i = 0\n while (++i < byteLength && (mul *= 0x100)) {\n val += this[offset + i] * mul\n }\n mul *= 0x80\n\n if (val >= mul) val -= Math.pow(2, 8 * byteLength)\n\n return val\n}\n\nBuffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) {\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n let i = byteLength\n let mul = 1\n let val = this[offset + --i]\n while (i > 0 && (mul *= 0x100)) {\n val += this[offset + --i] * mul\n }\n mul *= 0x80\n\n if (val >= mul) val -= Math.pow(2, 8 * byteLength)\n\n return val\n}\n\nBuffer.prototype.readInt8 = function readInt8 (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 1, this.length)\n if (!(this[offset] & 0x80)) return (this[offset])\n return ((0xff - this[offset] + 1) * -1)\n}\n\nBuffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 2, this.length)\n const val = this[offset] | (this[offset + 1] << 8)\n return (val & 0x8000) ? val | 0xFFFF0000 : val\n}\n\nBuffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 2, this.length)\n const val = this[offset + 1] | (this[offset] << 8)\n return (val & 0x8000) ? val | 0xFFFF0000 : val\n}\n\nBuffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return (this[offset]) |\n (this[offset + 1] << 8) |\n (this[offset + 2] << 16) |\n (this[offset + 3] << 24)\n}\n\nBuffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return (this[offset] << 24) |\n (this[offset + 1] << 16) |\n (this[offset + 2] << 8) |\n (this[offset + 3])\n}\n\nBuffer.prototype.readBigInt64LE = defineBigIntMethod(function readBigInt64LE (offset) {\n offset = offset >>> 0\n validateNumber(offset, 'offset')\n const first = this[offset]\n const last = this[offset + 7]\n if (first === undefined || last === undefined) {\n boundsError(offset, this.length - 8)\n }\n\n const val = this[offset + 4] +\n this[offset + 5] * 2 ** 8 +\n this[offset + 6] * 2 ** 16 +\n (last << 24) // Overflow\n\n return (BigInt(val) << BigInt(32)) +\n BigInt(first +\n this[++offset] * 2 ** 8 +\n this[++offset] * 2 ** 16 +\n this[++offset] * 2 ** 24)\n})\n\nBuffer.prototype.readBigInt64BE = defineBigIntMethod(function readBigInt64BE (offset) {\n offset = offset >>> 0\n validateNumber(offset, 'offset')\n const first = this[offset]\n const last = this[offset + 7]\n if (first === undefined || last === undefined) {\n boundsError(offset, this.length - 8)\n }\n\n const val = (first << 24) + // Overflow\n this[++offset] * 2 ** 16 +\n this[++offset] * 2 ** 8 +\n this[++offset]\n\n return (BigInt(val) << BigInt(32)) +\n BigInt(this[++offset] * 2 ** 24 +\n this[++offset] * 2 ** 16 +\n this[++offset] * 2 ** 8 +\n last)\n})\n\nBuffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n return ieee754.read(this, offset, true, 23, 4)\n}\n\nBuffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n return ieee754.read(this, offset, false, 23, 4)\n}\n\nBuffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 8, this.length)\n return ieee754.read(this, offset, true, 52, 8)\n}\n\nBuffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 8, this.length)\n return ieee754.read(this, offset, false, 52, 8)\n}\n\nfunction checkInt (buf, value, offset, ext, max, min) {\n if (!Buffer.isBuffer(buf)) throw new TypeError('\"buffer\" argument must be a Buffer instance')\n if (value > max || value < min) throw new RangeError('\"value\" argument is out of bounds')\n if (offset + ext > buf.length) throw new RangeError('Index out of range')\n}\n\nBuffer.prototype.writeUintLE =\nBuffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) {\n const maxBytes = Math.pow(2, 8 * byteLength) - 1\n checkInt(this, value, offset, byteLength, maxBytes, 0)\n }\n\n let mul = 1\n let i = 0\n this[offset] = value & 0xFF\n while (++i < byteLength && (mul *= 0x100)) {\n this[offset + i] = (value / mul) & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeUintBE =\nBuffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) {\n const maxBytes = Math.pow(2, 8 * byteLength) - 1\n checkInt(this, value, offset, byteLength, maxBytes, 0)\n }\n\n let i = byteLength - 1\n let mul = 1\n this[offset + i] = value & 0xFF\n while (--i >= 0 && (mul *= 0x100)) {\n this[offset + i] = (value / mul) & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeUint8 =\nBuffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0)\n this[offset] = (value & 0xff)\n return offset + 1\n}\n\nBuffer.prototype.writeUint16LE =\nBuffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)\n this[offset] = (value & 0xff)\n this[offset + 1] = (value >>> 8)\n return offset + 2\n}\n\nBuffer.prototype.writeUint16BE =\nBuffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)\n this[offset] = (value >>> 8)\n this[offset + 1] = (value & 0xff)\n return offset + 2\n}\n\nBuffer.prototype.writeUint32LE =\nBuffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)\n this[offset + 3] = (value >>> 24)\n this[offset + 2] = (value >>> 16)\n this[offset + 1] = (value >>> 8)\n this[offset] = (value & 0xff)\n return offset + 4\n}\n\nBuffer.prototype.writeUint32BE =\nBuffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)\n this[offset] = (value >>> 24)\n this[offset + 1] = (value >>> 16)\n this[offset + 2] = (value >>> 8)\n this[offset + 3] = (value & 0xff)\n return offset + 4\n}\n\nfunction wrtBigUInt64LE (buf, value, offset, min, max) {\n checkIntBI(value, min, max, buf, offset, 7)\n\n let lo = Number(value & BigInt(0xffffffff))\n buf[offset++] = lo\n lo = lo >> 8\n buf[offset++] = lo\n lo = lo >> 8\n buf[offset++] = lo\n lo = lo >> 8\n buf[offset++] = lo\n let hi = Number(value >> BigInt(32) & BigInt(0xffffffff))\n buf[offset++] = hi\n hi = hi >> 8\n buf[offset++] = hi\n hi = hi >> 8\n buf[offset++] = hi\n hi = hi >> 8\n buf[offset++] = hi\n return offset\n}\n\nfunction wrtBigUInt64BE (buf, value, offset, min, max) {\n checkIntBI(value, min, max, buf, offset, 7)\n\n let lo = Number(value & BigInt(0xffffffff))\n buf[offset + 7] = lo\n lo = lo >> 8\n buf[offset + 6] = lo\n lo = lo >> 8\n buf[offset + 5] = lo\n lo = lo >> 8\n buf[offset + 4] = lo\n let hi = Number(value >> BigInt(32) & BigInt(0xffffffff))\n buf[offset + 3] = hi\n hi = hi >> 8\n buf[offset + 2] = hi\n hi = hi >> 8\n buf[offset + 1] = hi\n hi = hi >> 8\n buf[offset] = hi\n return offset + 8\n}\n\nBuffer.prototype.writeBigUInt64LE = defineBigIntMethod(function writeBigUInt64LE (value, offset = 0) {\n return wrtBigUInt64LE(this, value, offset, BigInt(0), BigInt('0xffffffffffffffff'))\n})\n\nBuffer.prototype.writeBigUInt64BE = defineBigIntMethod(function writeBigUInt64BE (value, offset = 0) {\n return wrtBigUInt64BE(this, value, offset, BigInt(0), BigInt('0xffffffffffffffff'))\n})\n\nBuffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) {\n const limit = Math.pow(2, (8 * byteLength) - 1)\n\n checkInt(this, value, offset, byteLength, limit - 1, -limit)\n }\n\n let i = 0\n let mul = 1\n let sub = 0\n this[offset] = value & 0xFF\n while (++i < byteLength && (mul *= 0x100)) {\n if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) {\n sub = 1\n }\n this[offset + i] = ((value / mul) >> 0) - sub & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) {\n const limit = Math.pow(2, (8 * byteLength) - 1)\n\n checkInt(this, value, offset, byteLength, limit - 1, -limit)\n }\n\n let i = byteLength - 1\n let mul = 1\n let sub = 0\n this[offset + i] = value & 0xFF\n while (--i >= 0 && (mul *= 0x100)) {\n if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) {\n sub = 1\n }\n this[offset + i] = ((value / mul) >> 0) - sub & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80)\n if (value < 0) value = 0xff + value + 1\n this[offset] = (value & 0xff)\n return offset + 1\n}\n\nBuffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)\n this[offset] = (value & 0xff)\n this[offset + 1] = (value >>> 8)\n return offset + 2\n}\n\nBuffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)\n this[offset] = (value >>> 8)\n this[offset + 1] = (value & 0xff)\n return offset + 2\n}\n\nBuffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)\n this[offset] = (value & 0xff)\n this[offset + 1] = (value >>> 8)\n this[offset + 2] = (value >>> 16)\n this[offset + 3] = (value >>> 24)\n return offset + 4\n}\n\nBuffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)\n if (value < 0) value = 0xffffffff + value + 1\n this[offset] = (value >>> 24)\n this[offset + 1] = (value >>> 16)\n this[offset + 2] = (value >>> 8)\n this[offset + 3] = (value & 0xff)\n return offset + 4\n}\n\nBuffer.prototype.writeBigInt64LE = defineBigIntMethod(function writeBigInt64LE (value, offset = 0) {\n return wrtBigUInt64LE(this, value, offset, -BigInt('0x8000000000000000'), BigInt('0x7fffffffffffffff'))\n})\n\nBuffer.prototype.writeBigInt64BE = defineBigIntMethod(function writeBigInt64BE (value, offset = 0) {\n return wrtBigUInt64BE(this, value, offset, -BigInt('0x8000000000000000'), BigInt('0x7fffffffffffffff'))\n})\n\nfunction checkIEEE754 (buf, value, offset, ext, max, min) {\n if (offset + ext > buf.length) throw new RangeError('Index out of range')\n if (offset < 0) throw new RangeError('Index out of range')\n}\n\nfunction writeFloat (buf, value, offset, littleEndian, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) {\n checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38)\n }\n ieee754.write(buf, value, offset, littleEndian, 23, 4)\n return offset + 4\n}\n\nBuffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) {\n return writeFloat(this, value, offset, true, noAssert)\n}\n\nBuffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) {\n return writeFloat(this, value, offset, false, noAssert)\n}\n\nfunction writeDouble (buf, value, offset, littleEndian, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) {\n checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308)\n }\n ieee754.write(buf, value, offset, littleEndian, 52, 8)\n return offset + 8\n}\n\nBuffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) {\n return writeDouble(this, value, offset, true, noAssert)\n}\n\nBuffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) {\n return writeDouble(this, value, offset, false, noAssert)\n}\n\n// copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length)\nBuffer.prototype.copy = function copy (target, targetStart, start, end) {\n if (!Buffer.isBuffer(target)) throw new TypeError('argument should be a Buffer')\n if (!start) start = 0\n if (!end && end !== 0) end = this.length\n if (targetStart >= target.length) targetStart = target.length\n if (!targetStart) targetStart = 0\n if (end > 0 && end < start) end = start\n\n // Copy 0 bytes; we're done\n if (end === start) return 0\n if (target.length === 0 || this.length === 0) return 0\n\n // Fatal error conditions\n if (targetStart < 0) {\n throw new RangeError('targetStart out of bounds')\n }\n if (start < 0 || start >= this.length) throw new RangeError('Index out of range')\n if (end < 0) throw new RangeError('sourceEnd out of bounds')\n\n // Are we oob?\n if (end > this.length) end = this.length\n if (target.length - targetStart < end - start) {\n end = target.length - targetStart + start\n }\n\n const len = end - start\n\n if (this === target && typeof Uint8Array.prototype.copyWithin === 'function') {\n // Use built-in when available, missing from IE11\n this.copyWithin(targetStart, start, end)\n } else {\n Uint8Array.prototype.set.call(\n target,\n this.subarray(start, end),\n targetStart\n )\n }\n\n return len\n}\n\n// Usage:\n// buffer.fill(number[, offset[, end]])\n// buffer.fill(buffer[, offset[, end]])\n// buffer.fill(string[, offset[, end]][, encoding])\nBuffer.prototype.fill = function fill (val, start, end, encoding) {\n // Handle string cases:\n if (typeof val === 'string') {\n if (typeof start === 'string') {\n encoding = start\n start = 0\n end = this.length\n } else if (typeof end === 'string') {\n encoding = end\n end = this.length\n }\n if (encoding !== undefined && typeof encoding !== 'string') {\n throw new TypeError('encoding must be a string')\n }\n if (typeof encoding === 'string' && !Buffer.isEncoding(encoding)) {\n throw new TypeError('Unknown encoding: ' + encoding)\n }\n if (val.length === 1) {\n const code = val.charCodeAt(0)\n if ((encoding === 'utf8' && code < 128) ||\n encoding === 'latin1') {\n // Fast path: If `val` fits into a single byte, use that numeric value.\n val = code\n }\n }\n } else if (typeof val === 'number') {\n val = val & 255\n } else if (typeof val === 'boolean') {\n val = Number(val)\n }\n\n // Invalid ranges are not set to a default, so can range check early.\n if (start < 0 || this.length < start || this.length < end) {\n throw new RangeError('Out of range index')\n }\n\n if (end <= start) {\n return this\n }\n\n start = start >>> 0\n end = end === undefined ? this.length : end >>> 0\n\n if (!val) val = 0\n\n let i\n if (typeof val === 'number') {\n for (i = start; i < end; ++i) {\n this[i] = val\n }\n } else {\n const bytes = Buffer.isBuffer(val)\n ? val\n : Buffer.from(val, encoding)\n const len = bytes.length\n if (len === 0) {\n throw new TypeError('The value \"' + val +\n '\" is invalid for argument \"value\"')\n }\n for (i = 0; i < end - start; ++i) {\n this[i + start] = bytes[i % len]\n }\n }\n\n return this\n}\n\n// CUSTOM ERRORS\n// =============\n\n// Simplified versions from Node, changed for Buffer-only usage\nconst errors = {}\nfunction E (sym, getMessage, Base) {\n errors[sym] = class NodeError extends Base {\n constructor () {\n super()\n\n Object.defineProperty(this, 'message', {\n value: getMessage.apply(this, arguments),\n writable: true,\n configurable: true\n })\n\n // Add the error code to the name to include it in the stack trace.\n this.name = `${this.name} [${sym}]`\n // Access the stack to generate the error message including the error code\n // from the name.\n this.stack // eslint-disable-line no-unused-expressions\n // Reset the name to the actual name.\n delete this.name\n }\n\n get code () {\n return sym\n }\n\n set code (value) {\n Object.defineProperty(this, 'code', {\n configurable: true,\n enumerable: true,\n value,\n writable: true\n })\n }\n\n toString () {\n return `${this.name} [${sym}]: ${this.message}`\n }\n }\n}\n\nE('ERR_BUFFER_OUT_OF_BOUNDS',\n function (name) {\n if (name) {\n return `${name} is outside of buffer bounds`\n }\n\n return 'Attempt to access memory outside buffer bounds'\n }, RangeError)\nE('ERR_INVALID_ARG_TYPE',\n function (name, actual) {\n return `The \"${name}\" argument must be of type number. Received type ${typeof actual}`\n }, TypeError)\nE('ERR_OUT_OF_RANGE',\n function (str, range, input) {\n let msg = `The value of \"${str}\" is out of range.`\n let received = input\n if (Number.isInteger(input) && Math.abs(input) > 2 ** 32) {\n received = addNumericalSeparator(String(input))\n } else if (typeof input === 'bigint') {\n received = String(input)\n if (input > BigInt(2) ** BigInt(32) || input < -(BigInt(2) ** BigInt(32))) {\n received = addNumericalSeparator(received)\n }\n received += 'n'\n }\n msg += ` It must be ${range}. Received ${received}`\n return msg\n }, RangeError)\n\nfunction addNumericalSeparator (val) {\n let res = ''\n let i = val.length\n const start = val[0] === '-' ? 1 : 0\n for (; i >= start + 4; i -= 3) {\n res = `_${val.slice(i - 3, i)}${res}`\n }\n return `${val.slice(0, i)}${res}`\n}\n\n// CHECK FUNCTIONS\n// ===============\n\nfunction checkBounds (buf, offset, byteLength) {\n validateNumber(offset, 'offset')\n if (buf[offset] === undefined || buf[offset + byteLength] === undefined) {\n boundsError(offset, buf.length - (byteLength + 1))\n }\n}\n\nfunction checkIntBI (value, min, max, buf, offset, byteLength) {\n if (value > max || value < min) {\n const n = typeof min === 'bigint' ? 'n' : ''\n let range\n if (byteLength > 3) {\n if (min === 0 || min === BigInt(0)) {\n range = `>= 0${n} and < 2${n} ** ${(byteLength + 1) * 8}${n}`\n } else {\n range = `>= -(2${n} ** ${(byteLength + 1) * 8 - 1}${n}) and < 2 ** ` +\n `${(byteLength + 1) * 8 - 1}${n}`\n }\n } else {\n range = `>= ${min}${n} and <= ${max}${n}`\n }\n throw new errors.ERR_OUT_OF_RANGE('value', range, value)\n }\n checkBounds(buf, offset, byteLength)\n}\n\nfunction validateNumber (value, name) {\n if (typeof value !== 'number') {\n throw new errors.ERR_INVALID_ARG_TYPE(name, 'number', value)\n }\n}\n\nfunction boundsError (value, length, type) {\n if (Math.floor(value) !== value) {\n validateNumber(value, type)\n throw new errors.ERR_OUT_OF_RANGE(type || 'offset', 'an integer', value)\n }\n\n if (length < 0) {\n throw new errors.ERR_BUFFER_OUT_OF_BOUNDS()\n }\n\n throw new errors.ERR_OUT_OF_RANGE(type || 'offset',\n `>= ${type ? 1 : 0} and <= ${length}`,\n value)\n}\n\n// HELPER FUNCTIONS\n// ================\n\nconst INVALID_BASE64_RE = /[^+/0-9A-Za-z-_]/g\n\nfunction base64clean (str) {\n // Node takes equal signs as end of the Base64 encoding\n str = str.split('=')[0]\n // Node strips out invalid characters like \\n and \\t from the string, base64-js does not\n str = str.trim().replace(INVALID_BASE64_RE, '')\n // Node converts strings with length < 2 to ''\n if (str.length < 2) return ''\n // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not\n while (str.length % 4 !== 0) {\n str = str + '='\n }\n return str\n}\n\nfunction utf8ToBytes (string, units) {\n units = units || Infinity\n let codePoint\n const length = string.length\n let leadSurrogate = null\n const bytes = []\n\n for (let i = 0; i < length; ++i) {\n codePoint = string.charCodeAt(i)\n\n // is surrogate component\n if (codePoint > 0xD7FF && codePoint < 0xE000) {\n // last char was a lead\n if (!leadSurrogate) {\n // no lead yet\n if (codePoint > 0xDBFF) {\n // unexpected trail\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n continue\n } else if (i + 1 === length) {\n // unpaired lead\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n continue\n }\n\n // valid lead\n leadSurrogate = codePoint\n\n continue\n }\n\n // 2 leads in a row\n if (codePoint < 0xDC00) {\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n leadSurrogate = codePoint\n continue\n }\n\n // valid surrogate pair\n codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000\n } else if (leadSurrogate) {\n // valid bmp char, but last char was a lead\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n }\n\n leadSurrogate = null\n\n // encode utf8\n if (codePoint < 0x80) {\n if ((units -= 1) < 0) break\n bytes.push(codePoint)\n } else if (codePoint < 0x800) {\n if ((units -= 2) < 0) break\n bytes.push(\n codePoint >> 0x6 | 0xC0,\n codePoint & 0x3F | 0x80\n )\n } else if (codePoint < 0x10000) {\n if ((units -= 3) < 0) break\n bytes.push(\n codePoint >> 0xC | 0xE0,\n codePoint >> 0x6 & 0x3F | 0x80,\n codePoint & 0x3F | 0x80\n )\n } else if (codePoint < 0x110000) {\n if ((units -= 4) < 0) break\n bytes.push(\n codePoint >> 0x12 | 0xF0,\n codePoint >> 0xC & 0x3F | 0x80,\n codePoint >> 0x6 & 0x3F | 0x80,\n codePoint & 0x3F | 0x80\n )\n } else {\n throw new Error('Invalid code point')\n }\n }\n\n return bytes\n}\n\nfunction asciiToBytes (str) {\n const byteArray = []\n for (let i = 0; i < str.length; ++i) {\n // Node's code seems to be doing this and not & 0x7F..\n byteArray.push(str.charCodeAt(i) & 0xFF)\n }\n return byteArray\n}\n\nfunction utf16leToBytes (str, units) {\n let c, hi, lo\n const byteArray = []\n for (let i = 0; i < str.length; ++i) {\n if ((units -= 2) < 0) break\n\n c = str.charCodeAt(i)\n hi = c >> 8\n lo = c % 256\n byteArray.push(lo)\n byteArray.push(hi)\n }\n\n return byteArray\n}\n\nfunction base64ToBytes (str) {\n return base64.toByteArray(base64clean(str))\n}\n\nfunction blitBuffer (src, dst, offset, length) {\n let i\n for (i = 0; i < length; ++i) {\n if ((i + offset >= dst.length) || (i >= src.length)) break\n dst[i + offset] = src[i]\n }\n return i\n}\n\n// ArrayBuffer or Uint8Array objects from other contexts (i.e. iframes) do not pass\n// the `instanceof` check but they should be treated as of that type.\n// See: https://github.com/feross/buffer/issues/166\nfunction isInstance (obj, type) {\n return obj instanceof type ||\n (obj != null && obj.constructor != null && obj.constructor.name != null &&\n obj.constructor.name === type.name)\n}\nfunction numberIsNaN (obj) {\n // For IE11 support\n return obj !== obj // eslint-disable-line no-self-compare\n}\n\n// Create lookup table for `toString('hex')`\n// See: https://github.com/feross/buffer/issues/219\nconst hexSliceLookupTable = (function () {\n const alphabet = '0123456789abcdef'\n const table = new Array(256)\n for (let i = 0; i < 16; ++i) {\n const i16 = i * 16\n for (let j = 0; j < 16; ++j) {\n table[i16 + j] = alphabet[i] + alphabet[j]\n }\n }\n return table\n})()\n\n// Return not function with Error if BigInt not supported\nfunction defineBigIntMethod (fn) {\n return typeof BigInt === 'undefined' ? BufferBigIntNotDefined : fn\n}\n\nfunction BufferBigIntNotDefined () {\n throw new Error('BigInt not supported')\n}\n","// extracted by extract-css-chunks-webpack-plugin\nmodule.exports = {};","// extracted by extract-css-chunks-webpack-plugin\nmodule.exports = {\"nodeStrokeWidth\":\"0.8\",\"directionArrowSize\":\"6\",\"directionArrowWidth\":\"0.7\",\"node\":\"fornac-node\",\"directionArrow\":\"fornac-directionArrow\",\"plot\":\"fornac-plot\",\"selectedNode\":\"fornac-selectedNode\",\"nodeLabel\":\"fornac-nodeLabel\",\"link\":\"fornac-link\",\"plotLabel\":\"fornac-plotLabel\",\"transparent\":\"fornac-transparent\",\"dragLine\":\"fornac-dragLine\",\"mouseEventHelper\":\"fornac-mouseEventHelper\"};","/*! ieee754. BSD-3-Clause License. Feross Aboukhadijeh */\nexports.read = function (buffer, offset, isLE, mLen, nBytes) {\n var e, m\n var eLen = (nBytes * 8) - mLen - 1\n var eMax = (1 << eLen) - 1\n var eBias = eMax >> 1\n var nBits = -7\n var i = isLE ? (nBytes - 1) : 0\n var d = isLE ? -1 : 1\n var s = buffer[offset + i]\n\n i += d\n\n e = s & ((1 << (-nBits)) - 1)\n s >>= (-nBits)\n nBits += eLen\n for (; nBits > 0; e = (e * 256) + buffer[offset + i], i += d, nBits -= 8) {}\n\n m = e & ((1 << (-nBits)) - 1)\n e >>= (-nBits)\n nBits += mLen\n for (; nBits > 0; m = (m * 256) + buffer[offset + i], i += d, nBits -= 8) {}\n\n if (e === 0) {\n e = 1 - eBias\n } else if (e === eMax) {\n return m ? NaN : ((s ? -1 : 1) * Infinity)\n } else {\n m = m + Math.pow(2, mLen)\n e = e - eBias\n }\n return (s ? -1 : 1) * m * Math.pow(2, e - mLen)\n}\n\nexports.write = function (buffer, value, offset, isLE, mLen, nBytes) {\n var e, m, c\n var eLen = (nBytes * 8) - mLen - 1\n var eMax = (1 << eLen) - 1\n var eBias = eMax >> 1\n var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0)\n var i = isLE ? 0 : (nBytes - 1)\n var d = isLE ? 1 : -1\n var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0\n\n value = Math.abs(value)\n\n if (isNaN(value) || value === Infinity) {\n m = isNaN(value) ? 1 : 0\n e = eMax\n } else {\n e = Math.floor(Math.log(value) / Math.LN2)\n if (value * (c = Math.pow(2, -e)) < 1) {\n e--\n c *= 2\n }\n if (e + eBias >= 1) {\n value += rt / c\n } else {\n value += rt * Math.pow(2, 1 - eBias)\n }\n if (value * c >= 2) {\n e++\n c /= 2\n }\n\n if (e + eBias >= eMax) {\n m = 0\n e = eMax\n } else if (e + eBias >= 1) {\n m = ((value * c) - 1) * Math.pow(2, mLen)\n e = e + eBias\n } else {\n m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen)\n e = 0\n }\n }\n\n for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}\n\n e = (e << mLen) | m\n eLen += mLen\n for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}\n\n buffer[offset + i - d] |= s * 128\n}\n","// The MIT License (MIT)\n//\n// Copyright (c) 2014 Jonas Finnemann Jensen\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\nmodule.exports = require('./slugid');\n","// The MIT License (MIT)\n//\n// Copyright (c) 2014 Jonas Finnemann Jensen\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\nvar uuid = require('uuid');\n\n/**\n * Returns the given uuid as a 22 character slug. This can be a regular v4\n * slug or a \"nice\" slug.\n */\nexports.encode = function(uuid_) {\n var bytes = uuid.parse(uuid_);\n var base64 = Buffer.from(bytes).toString('base64');\n var slug = base64\n .replace(/\\+/g, '-') // Replace + with - (see RFC 4648, sec. 5)\n .replace(/\\//g, '_') // Replace / with _ (see RFC 4648, sec. 5)\n .substring(0, 22); // Drop '==' padding\n return slug;\n};\n\n/**\n * Returns the uuid represented by the given v4 or \"nice\" slug\n */\nexports.decode = function(slug) {\n var base64 = slug\n .replace(/-/g, '+')\n .replace(/_/g, '/')\n + '==';\n return uuid.stringify(Buffer.from(base64, 'base64'));\n};\n\n/**\n * Returns a randomly generated uuid v4 compliant slug\n */\nexports.v4 = function() {\n var bytes = uuid.v4(null, Buffer.alloc(16));\n var base64 = bytes.toString('base64');\n var slug = base64\n .replace(/\\+/g, '-') // Replace + with - (see RFC 4648, sec. 5)\n .replace(/\\//g, '_') // Replace / with _ (see RFC 4648, sec. 5)\n .substring(0, 22); // Drop '==' padding\n return slug;\n};\n\n/**\n * Returns a randomly generated uuid v4 compliant slug which conforms to a set\n * of \"nice\" properties, at the cost of some entropy. Currently this means one\n * extra fixed bit (the first bit of the uuid is set to 0) which guarantees the\n * slug will begin with [A-Za-f]. For example such slugs don't require special\n * handling when used as command line parameters (whereas non-nice slugs may\n * start with `-` which can confuse command line tools).\n *\n * Potentially other \"nice\" properties may be added in future to further\n * restrict the range of potential uuids that may be generated.\n */\nexports.nice = function() {\n var bytes = uuid.v4(null, Buffer.alloc(16));\n bytes[0] = bytes[0] & 0x7f; // unset first bit to ensure [A-Za-f] first char\n var base64 = bytes.toString('base64');\n var slug = base64\n .replace(/\\+/g, '-') // Replace + with - (see RFC 4648, sec. 5)\n .replace(/\\//g, '_') // Replace / with _ (see RFC 4648, sec. 5)\n .substring(0, 22); // Drop '==' padding\n return slug;\n};\n","// Unique ID creation requires a high quality random # generator. In the browser we therefore\n// require the crypto API and do not support built-in fallback to lower quality random number\n// generators (like Math.random()).\nvar getRandomValues;\nvar rnds8 = new Uint8Array(16);\nexport default function rng() {\n // lazy load so that environments that need to polyfill have a chance to do so\n if (!getRandomValues) {\n // getRandomValues needs to be invoked in a context where \"this\" is a Crypto implementation. Also,\n // find the complete implementation of crypto (msCrypto) on IE11.\n getRandomValues = typeof crypto !== 'undefined' && crypto.getRandomValues && crypto.getRandomValues.bind(crypto) || typeof msCrypto !== 'undefined' && typeof msCrypto.getRandomValues === 'function' && msCrypto.getRandomValues.bind(msCrypto);\n\n if (!getRandomValues) {\n throw new Error('crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported');\n }\n }\n\n return getRandomValues(rnds8);\n}","export default /^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;","import REGEX from './regex.js';\n\nfunction validate(uuid) {\n return typeof uuid === 'string' && REGEX.test(uuid);\n}\n\nexport default validate;","import validate from './validate.js';\n/**\n * Convert array of 16 byte values to UUID string format of the form:\n * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX\n */\n\nvar byteToHex = [];\n\nfor (var i = 0; i < 256; ++i) {\n byteToHex.push((i + 0x100).toString(16).substr(1));\n}\n\nfunction stringify(arr) {\n var offset = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n // Note: Be careful editing this code! It's been tuned for performance\n // and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434\n var uuid = (byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + '-' + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + '-' + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + '-' + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + '-' + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]]).toLowerCase(); // Consistency check for valid UUID. If this throws, it's likely due to one\n // of the following:\n // - One or more input array values don't map to a hex octet (leading to\n // \"undefined\" in the uuid)\n // - Invalid input values for the RFC `version` or `variant` fields\n\n if (!validate(uuid)) {\n throw TypeError('Stringified UUID is invalid');\n }\n\n return uuid;\n}\n\nexport default stringify;","import rng from './rng.js';\nimport stringify from './stringify.js'; // **`v1()` - Generate time-based UUID**\n//\n// Inspired by https://github.com/LiosK/UUID.js\n// and http://docs.python.org/library/uuid.html\n\nvar _nodeId;\n\nvar _clockseq; // Previous uuid creation time\n\n\nvar _lastMSecs = 0;\nvar _lastNSecs = 0; // See https://github.com/uuidjs/uuid for API details\n\nfunction v1(options, buf, offset) {\n var i = buf && offset || 0;\n var b = buf || new Array(16);\n options = options || {};\n var node = options.node || _nodeId;\n var clockseq = options.clockseq !== undefined ? options.clockseq : _clockseq; // node and clockseq need to be initialized to random values if they're not\n // specified. We do this lazily to minimize issues related to insufficient\n // system entropy. See #189\n\n if (node == null || clockseq == null) {\n var seedBytes = options.random || (options.rng || rng)();\n\n if (node == null) {\n // Per 4.5, create and 48-bit node id, (47 random bits + multicast bit = 1)\n node = _nodeId = [seedBytes[0] | 0x01, seedBytes[1], seedBytes[2], seedBytes[3], seedBytes[4], seedBytes[5]];\n }\n\n if (clockseq == null) {\n // Per 4.2.2, randomize (14 bit) clockseq\n clockseq = _clockseq = (seedBytes[6] << 8 | seedBytes[7]) & 0x3fff;\n }\n } // UUID timestamps are 100 nano-second units since the Gregorian epoch,\n // (1582-10-15 00:00). JSNumbers aren't precise enough for this, so\n // time is handled internally as 'msecs' (integer milliseconds) and 'nsecs'\n // (100-nanoseconds offset from msecs) since unix epoch, 1970-01-01 00:00.\n\n\n var msecs = options.msecs !== undefined ? options.msecs : Date.now(); // Per 4.2.1.2, use count of uuid's generated during the current clock\n // cycle to simulate higher resolution clock\n\n var nsecs = options.nsecs !== undefined ? options.nsecs : _lastNSecs + 1; // Time since last uuid creation (in msecs)\n\n var dt = msecs - _lastMSecs + (nsecs - _lastNSecs) / 10000; // Per 4.2.1.2, Bump clockseq on clock regression\n\n if (dt < 0 && options.clockseq === undefined) {\n clockseq = clockseq + 1 & 0x3fff;\n } // Reset nsecs if clock regresses (new clockseq) or we've moved onto a new\n // time interval\n\n\n if ((dt < 0 || msecs > _lastMSecs) && options.nsecs === undefined) {\n nsecs = 0;\n } // Per 4.2.1.2 Throw error if too many uuids are requested\n\n\n if (nsecs >= 10000) {\n throw new Error(\"uuid.v1(): Can't create more than 10M uuids/sec\");\n }\n\n _lastMSecs = msecs;\n _lastNSecs = nsecs;\n _clockseq = clockseq; // Per 4.1.4 - Convert from unix epoch to Gregorian epoch\n\n msecs += 12219292800000; // `time_low`\n\n var tl = ((msecs & 0xfffffff) * 10000 + nsecs) % 0x100000000;\n b[i++] = tl >>> 24 & 0xff;\n b[i++] = tl >>> 16 & 0xff;\n b[i++] = tl >>> 8 & 0xff;\n b[i++] = tl & 0xff; // `time_mid`\n\n var tmh = msecs / 0x100000000 * 10000 & 0xfffffff;\n b[i++] = tmh >>> 8 & 0xff;\n b[i++] = tmh & 0xff; // `time_high_and_version`\n\n b[i++] = tmh >>> 24 & 0xf | 0x10; // include version\n\n b[i++] = tmh >>> 16 & 0xff; // `clock_seq_hi_and_reserved` (Per 4.2.2 - include variant)\n\n b[i++] = clockseq >>> 8 | 0x80; // `clock_seq_low`\n\n b[i++] = clockseq & 0xff; // `node`\n\n for (var n = 0; n < 6; ++n) {\n b[i + n] = node[n];\n }\n\n return buf || stringify(b);\n}\n\nexport default v1;","import validate from './validate.js';\n\nfunction parse(uuid) {\n if (!validate(uuid)) {\n throw TypeError('Invalid UUID');\n }\n\n var v;\n var arr = new Uint8Array(16); // Parse ########-....-....-....-............\n\n arr[0] = (v = parseInt(uuid.slice(0, 8), 16)) >>> 24;\n arr[1] = v >>> 16 & 0xff;\n arr[2] = v >>> 8 & 0xff;\n arr[3] = v & 0xff; // Parse ........-####-....-....-............\n\n arr[4] = (v = parseInt(uuid.slice(9, 13), 16)) >>> 8;\n arr[5] = v & 0xff; // Parse ........-....-####-....-............\n\n arr[6] = (v = parseInt(uuid.slice(14, 18), 16)) >>> 8;\n arr[7] = v & 0xff; // Parse ........-....-....-####-............\n\n arr[8] = (v = parseInt(uuid.slice(19, 23), 16)) >>> 8;\n arr[9] = v & 0xff; // Parse ........-....-....-....-############\n // (Use \"/\" to avoid 32-bit truncation when bit-shifting high-order bytes)\n\n arr[10] = (v = parseInt(uuid.slice(24, 36), 16)) / 0x10000000000 & 0xff;\n arr[11] = v / 0x100000000 & 0xff;\n arr[12] = v >>> 24 & 0xff;\n arr[13] = v >>> 16 & 0xff;\n arr[14] = v >>> 8 & 0xff;\n arr[15] = v & 0xff;\n return arr;\n}\n\nexport default parse;","import stringify from './stringify.js';\nimport parse from './parse.js';\n\nfunction stringToBytes(str) {\n str = unescape(encodeURIComponent(str)); // UTF8 escape\n\n var bytes = [];\n\n for (var i = 0; i < str.length; ++i) {\n bytes.push(str.charCodeAt(i));\n }\n\n return bytes;\n}\n\nexport var DNS = '6ba7b810-9dad-11d1-80b4-00c04fd430c8';\nexport var URL = '6ba7b811-9dad-11d1-80b4-00c04fd430c8';\nexport default function (name, version, hashfunc) {\n function generateUUID(value, namespace, buf, offset) {\n if (typeof value === 'string') {\n value = stringToBytes(value);\n }\n\n if (typeof namespace === 'string') {\n namespace = parse(namespace);\n }\n\n if (namespace.length !== 16) {\n throw TypeError('Namespace must be array-like (16 iterable integer values, 0-255)');\n } // Compute hash of namespace and value, Per 4.3\n // Future: Use spread syntax when supported on all platforms, e.g. `bytes =\n // hashfunc([...namespace, ... value])`\n\n\n var bytes = new Uint8Array(16 + value.length);\n bytes.set(namespace);\n bytes.set(value, namespace.length);\n bytes = hashfunc(bytes);\n bytes[6] = bytes[6] & 0x0f | version;\n bytes[8] = bytes[8] & 0x3f | 0x80;\n\n if (buf) {\n offset = offset || 0;\n\n for (var i = 0; i < 16; ++i) {\n buf[offset + i] = bytes[i];\n }\n\n return buf;\n }\n\n return stringify(bytes);\n } // Function#name is not settable on some platforms (#270)\n\n\n try {\n generateUUID.name = name; // eslint-disable-next-line no-empty\n } catch (err) {} // For CommonJS default export support\n\n\n generateUUID.DNS = DNS;\n generateUUID.URL = URL;\n return generateUUID;\n}","/*\n * Browser-compatible JavaScript MD5\n *\n * Modification of JavaScript MD5\n * https://github.com/blueimp/JavaScript-MD5\n *\n * Copyright 2011, Sebastian Tschan\n * https://blueimp.net\n *\n * Licensed under the MIT license:\n * https://opensource.org/licenses/MIT\n *\n * Based on\n * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message\n * Digest Algorithm, as defined in RFC 1321.\n * Version 2.2 Copyright (C) Paul Johnston 1999 - 2009\n * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet\n * Distributed under the BSD License\n * See http://pajhome.org.uk/crypt/md5 for more info.\n */\nfunction md5(bytes) {\n if (typeof bytes === 'string') {\n var msg = unescape(encodeURIComponent(bytes)); // UTF8 escape\n\n bytes = new Uint8Array(msg.length);\n\n for (var i = 0; i < msg.length; ++i) {\n bytes[i] = msg.charCodeAt(i);\n }\n }\n\n return md5ToHexEncodedArray(wordsToMd5(bytesToWords(bytes), bytes.length * 8));\n}\n/*\n * Convert an array of little-endian words to an array of bytes\n */\n\n\nfunction md5ToHexEncodedArray(input) {\n var output = [];\n var length32 = input.length * 32;\n var hexTab = '0123456789abcdef';\n\n for (var i = 0; i < length32; i += 8) {\n var x = input[i >> 5] >>> i % 32 & 0xff;\n var hex = parseInt(hexTab.charAt(x >>> 4 & 0x0f) + hexTab.charAt(x & 0x0f), 16);\n output.push(hex);\n }\n\n return output;\n}\n/**\n * Calculate output length with padding and bit length\n */\n\n\nfunction getOutputLength(inputLength8) {\n return (inputLength8 + 64 >>> 9 << 4) + 14 + 1;\n}\n/*\n * Calculate the MD5 of an array of little-endian words, and a bit length.\n */\n\n\nfunction wordsToMd5(x, len) {\n /* append padding */\n x[len >> 5] |= 0x80 << len % 32;\n x[getOutputLength(len) - 1] = len;\n var a = 1732584193;\n var b = -271733879;\n var c = -1732584194;\n var d = 271733878;\n\n for (var i = 0; i < x.length; i += 16) {\n var olda = a;\n var oldb = b;\n var oldc = c;\n var oldd = d;\n a = md5ff(a, b, c, d, x[i], 7, -680876936);\n d = md5ff(d, a, b, c, x[i + 1], 12, -389564586);\n c = md5ff(c, d, a, b, x[i + 2], 17, 606105819);\n b = md5ff(b, c, d, a, x[i + 3], 22, -1044525330);\n a = md5ff(a, b, c, d, x[i + 4], 7, -176418897);\n d = md5ff(d, a, b, c, x[i + 5], 12, 1200080426);\n c = md5ff(c, d, a, b, x[i + 6], 17, -1473231341);\n b = md5ff(b, c, d, a, x[i + 7], 22, -45705983);\n a = md5ff(a, b, c, d, x[i + 8], 7, 1770035416);\n d = md5ff(d, a, b, c, x[i + 9], 12, -1958414417);\n c = md5ff(c, d, a, b, x[i + 10], 17, -42063);\n b = md5ff(b, c, d, a, x[i + 11], 22, -1990404162);\n a = md5ff(a, b, c, d, x[i + 12], 7, 1804603682);\n d = md5ff(d, a, b, c, x[i + 13], 12, -40341101);\n c = md5ff(c, d, a, b, x[i + 14], 17, -1502002290);\n b = md5ff(b, c, d, a, x[i + 15], 22, 1236535329);\n a = md5gg(a, b, c, d, x[i + 1], 5, -165796510);\n d = md5gg(d, a, b, c, x[i + 6], 9, -1069501632);\n c = md5gg(c, d, a, b, x[i + 11], 14, 643717713);\n b = md5gg(b, c, d, a, x[i], 20, -373897302);\n a = md5gg(a, b, c, d, x[i + 5], 5, -701558691);\n d = md5gg(d, a, b, c, x[i + 10], 9, 38016083);\n c = md5gg(c, d, a, b, x[i + 15], 14, -660478335);\n b = md5gg(b, c, d, a, x[i + 4], 20, -405537848);\n a = md5gg(a, b, c, d, x[i + 9], 5, 568446438);\n d = md5gg(d, a, b, c, x[i + 14], 9, -1019803690);\n c = md5gg(c, d, a, b, x[i + 3], 14, -187363961);\n b = md5gg(b, c, d, a, x[i + 8], 20, 1163531501);\n a = md5gg(a, b, c, d, x[i + 13], 5, -1444681467);\n d = md5gg(d, a, b, c, x[i + 2], 9, -51403784);\n c = md5gg(c, d, a, b, x[i + 7], 14, 1735328473);\n b = md5gg(b, c, d, a, x[i + 12], 20, -1926607734);\n a = md5hh(a, b, c, d, x[i + 5], 4, -378558);\n d = md5hh(d, a, b, c, x[i + 8], 11, -2022574463);\n c = md5hh(c, d, a, b, x[i + 11], 16, 1839030562);\n b = md5hh(b, c, d, a, x[i + 14], 23, -35309556);\n a = md5hh(a, b, c, d, x[i + 1], 4, -1530992060);\n d = md5hh(d, a, b, c, x[i + 4], 11, 1272893353);\n c = md5hh(c, d, a, b, x[i + 7], 16, -155497632);\n b = md5hh(b, c, d, a, x[i + 10], 23, -1094730640);\n a = md5hh(a, b, c, d, x[i + 13], 4, 681279174);\n d = md5hh(d, a, b, c, x[i], 11, -358537222);\n c = md5hh(c, d, a, b, x[i + 3], 16, -722521979);\n b = md5hh(b, c, d, a, x[i + 6], 23, 76029189);\n a = md5hh(a, b, c, d, x[i + 9], 4, -640364487);\n d = md5hh(d, a, b, c, x[i + 12], 11, -421815835);\n c = md5hh(c, d, a, b, x[i + 15], 16, 530742520);\n b = md5hh(b, c, d, a, x[i + 2], 23, -995338651);\n a = md5ii(a, b, c, d, x[i], 6, -198630844);\n d = md5ii(d, a, b, c, x[i + 7], 10, 1126891415);\n c = md5ii(c, d, a, b, x[i + 14], 15, -1416354905);\n b = md5ii(b, c, d, a, x[i + 5], 21, -57434055);\n a = md5ii(a, b, c, d, x[i + 12], 6, 1700485571);\n d = md5ii(d, a, b, c, x[i + 3], 10, -1894986606);\n c = md5ii(c, d, a, b, x[i + 10], 15, -1051523);\n b = md5ii(b, c, d, a, x[i + 1], 21, -2054922799);\n a = md5ii(a, b, c, d, x[i + 8], 6, 1873313359);\n d = md5ii(d, a, b, c, x[i + 15], 10, -30611744);\n c = md5ii(c, d, a, b, x[i + 6], 15, -1560198380);\n b = md5ii(b, c, d, a, x[i + 13], 21, 1309151649);\n a = md5ii(a, b, c, d, x[i + 4], 6, -145523070);\n d = md5ii(d, a, b, c, x[i + 11], 10, -1120210379);\n c = md5ii(c, d, a, b, x[i + 2], 15, 718787259);\n b = md5ii(b, c, d, a, x[i + 9], 21, -343485551);\n a = safeAdd(a, olda);\n b = safeAdd(b, oldb);\n c = safeAdd(c, oldc);\n d = safeAdd(d, oldd);\n }\n\n return [a, b, c, d];\n}\n/*\n * Convert an array bytes to an array of little-endian words\n * Characters >255 have their high-byte silently ignored.\n */\n\n\nfunction bytesToWords(input) {\n if (input.length === 0) {\n return [];\n }\n\n var length8 = input.length * 8;\n var output = new Uint32Array(getOutputLength(length8));\n\n for (var i = 0; i < length8; i += 8) {\n output[i >> 5] |= (input[i / 8] & 0xff) << i % 32;\n }\n\n return output;\n}\n/*\n * Add integers, wrapping at 2^32. This uses 16-bit operations internally\n * to work around bugs in some JS interpreters.\n */\n\n\nfunction safeAdd(x, y) {\n var lsw = (x & 0xffff) + (y & 0xffff);\n var msw = (x >> 16) + (y >> 16) + (lsw >> 16);\n return msw << 16 | lsw & 0xffff;\n}\n/*\n * Bitwise rotate a 32-bit number to the left.\n */\n\n\nfunction bitRotateLeft(num, cnt) {\n return num << cnt | num >>> 32 - cnt;\n}\n/*\n * These functions implement the four basic operations the algorithm uses.\n */\n\n\nfunction md5cmn(q, a, b, x, s, t) {\n return safeAdd(bitRotateLeft(safeAdd(safeAdd(a, q), safeAdd(x, t)), s), b);\n}\n\nfunction md5ff(a, b, c, d, x, s, t) {\n return md5cmn(b & c | ~b & d, a, b, x, s, t);\n}\n\nfunction md5gg(a, b, c, d, x, s, t) {\n return md5cmn(b & d | c & ~d, a, b, x, s, t);\n}\n\nfunction md5hh(a, b, c, d, x, s, t) {\n return md5cmn(b ^ c ^ d, a, b, x, s, t);\n}\n\nfunction md5ii(a, b, c, d, x, s, t) {\n return md5cmn(c ^ (b | ~d), a, b, x, s, t);\n}\n\nexport default md5;","import v35 from './v35.js';\nimport md5 from './md5.js';\nvar v3 = v35('v3', 0x30, md5);\nexport default v3;","import rng from './rng.js';\nimport stringify from './stringify.js';\n\nfunction v4(options, buf, offset) {\n options = options || {};\n var rnds = options.random || (options.rng || rng)(); // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`\n\n rnds[6] = rnds[6] & 0x0f | 0x40;\n rnds[8] = rnds[8] & 0x3f | 0x80; // Copy bytes to buffer, if provided\n\n if (buf) {\n offset = offset || 0;\n\n for (var i = 0; i < 16; ++i) {\n buf[offset + i] = rnds[i];\n }\n\n return buf;\n }\n\n return stringify(rnds);\n}\n\nexport default v4;","// Adapted from Chris Veness' SHA1 code at\n// http://www.movable-type.co.uk/scripts/sha1.html\nfunction f(s, x, y, z) {\n switch (s) {\n case 0:\n return x & y ^ ~x & z;\n\n case 1:\n return x ^ y ^ z;\n\n case 2:\n return x & y ^ x & z ^ y & z;\n\n case 3:\n return x ^ y ^ z;\n }\n}\n\nfunction ROTL(x, n) {\n return x << n | x >>> 32 - n;\n}\n\nfunction sha1(bytes) {\n var K = [0x5a827999, 0x6ed9eba1, 0x8f1bbcdc, 0xca62c1d6];\n var H = [0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0];\n\n if (typeof bytes === 'string') {\n var msg = unescape(encodeURIComponent(bytes)); // UTF8 escape\n\n bytes = [];\n\n for (var i = 0; i < msg.length; ++i) {\n bytes.push(msg.charCodeAt(i));\n }\n } else if (!Array.isArray(bytes)) {\n // Convert Array-like to Array\n bytes = Array.prototype.slice.call(bytes);\n }\n\n bytes.push(0x80);\n var l = bytes.length / 4 + 2;\n var N = Math.ceil(l / 16);\n var M = new Array(N);\n\n for (var _i = 0; _i < N; ++_i) {\n var arr = new Uint32Array(16);\n\n for (var j = 0; j < 16; ++j) {\n arr[j] = bytes[_i * 64 + j * 4] << 24 | bytes[_i * 64 + j * 4 + 1] << 16 | bytes[_i * 64 + j * 4 + 2] << 8 | bytes[_i * 64 + j * 4 + 3];\n }\n\n M[_i] = arr;\n }\n\n M[N - 1][14] = (bytes.length - 1) * 8 / Math.pow(2, 32);\n M[N - 1][14] = Math.floor(M[N - 1][14]);\n M[N - 1][15] = (bytes.length - 1) * 8 & 0xffffffff;\n\n for (var _i2 = 0; _i2 < N; ++_i2) {\n var W = new Uint32Array(80);\n\n for (var t = 0; t < 16; ++t) {\n W[t] = M[_i2][t];\n }\n\n for (var _t = 16; _t < 80; ++_t) {\n W[_t] = ROTL(W[_t - 3] ^ W[_t - 8] ^ W[_t - 14] ^ W[_t - 16], 1);\n }\n\n var a = H[0];\n var b = H[1];\n var c = H[2];\n var d = H[3];\n var e = H[4];\n\n for (var _t2 = 0; _t2 < 80; ++_t2) {\n var s = Math.floor(_t2 / 20);\n var T = ROTL(a, 5) + f(s, b, c, d) + e + K[s] + W[_t2] >>> 0;\n e = d;\n d = c;\n c = ROTL(b, 30) >>> 0;\n b = a;\n a = T;\n }\n\n H[0] = H[0] + a >>> 0;\n H[1] = H[1] + b >>> 0;\n H[2] = H[2] + c >>> 0;\n H[3] = H[3] + d >>> 0;\n H[4] = H[4] + e >>> 0;\n }\n\n return [H[0] >> 24 & 0xff, H[0] >> 16 & 0xff, H[0] >> 8 & 0xff, H[0] & 0xff, H[1] >> 24 & 0xff, H[1] >> 16 & 0xff, H[1] >> 8 & 0xff, H[1] & 0xff, H[2] >> 24 & 0xff, H[2] >> 16 & 0xff, H[2] >> 8 & 0xff, H[2] & 0xff, H[3] >> 24 & 0xff, H[3] >> 16 & 0xff, H[3] >> 8 & 0xff, H[3] & 0xff, H[4] >> 24 & 0xff, H[4] >> 16 & 0xff, H[4] >> 8 & 0xff, H[4] & 0xff];\n}\n\nexport default sha1;","import v35 from './v35.js';\nimport sha1 from './sha1.js';\nvar v5 = v35('v5', 0x50, sha1);\nexport default v5;","export default '00000000-0000-0000-0000-000000000000';","import validate from './validate.js';\n\nfunction version(uuid) {\n if (!validate(uuid)) {\n throw TypeError('Invalid UUID');\n }\n\n return parseInt(uuid.substr(14, 1), 16);\n}\n\nexport default version;","module.exports = __WEBPACK_EXTERNAL_MODULE__990__;","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","var scriptUrl;\nif (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + \"\";\nvar document = __webpack_require__.g.document;\nif (!scriptUrl && document) {\n\tif (document.currentScript)\n\t\tscriptUrl = document.currentScript.src\n\tif (!scriptUrl) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tif(scripts.length) scriptUrl = scripts[scripts.length - 1].src\n\t}\n}\n// When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration\n// or pass an empty string (\"\") and set the __webpack_public_path__ variable from your code to use your own logic.\nif (!scriptUrl) throw new Error(\"Automatic publicPath is not supported in this browser\");\nscriptUrl = scriptUrl.replace(/#.*$/, \"\").replace(/\\?.*$/, \"\").replace(/\\/[^\\/]+$/, \"/\");\n__webpack_require__.p = scriptUrl;","export default __webpack_public_path__ + \"02188894d5236b1517df3210b79c2a7f.svg\";","import './d3-context-menu.css';\nimport ArrowIcon from './img/play.svg';\n\nimport d3 from 'd3';\nimport slugid from 'slugid';\n\nexport function contextMenu(menu, opts) {\n let previouslyMouseUp = false;\n let clickAway = () => {};\n let uid = slugid.nice();\n let rootElement = null;\n let orientation = 'right'; // display the menu to the right of the mouse click\n // or parent elemement\n let initialPos = null;\n let parentStart = null;\n\n var openCallback,\n closeCallback;\n\n if (typeof opts === 'function') {\n openCallback = opts;\n } else {\n opts = opts || {};\n openCallback = opts.onOpen;\n closeCallback = opts.onClose;\n }\n\n if ('rootElement' in opts)\n rootElement = opts['rootElement']\n\n if ('pos' in opts) {\n // do we want to place this menu somewhere specific?\n initialPos = opts.pos;\n }\n\n if ('orientation' in opts) {\n orientation = opts.orientation;\n }\n\n if ('parentStart' in opts) {\n parentStart = opts.parentStart;\n }\n\n // create the div element that will hold the context menu\n d3.selectAll('.d3-context-menu-' + uid).data([1])\n .enter()\n .append('div')\n .classed('d3-context-menu', true)\n .classed('d3-context-menu-' + uid, true)\n\n // close menu\n d3.select('body').on('click.d3-context-menu-' + uid, function() {\n if (previouslyMouseUp) {\n previouslyMouseUp = false;\n return;\n }\n console.log('body click close');\n\n d3.select('.d3-context-menu-' + uid).style('display', 'none');\n orientation = 'right';\n\n if (closeCallback) {\n closeCallback();\n }\n });\n\n // this gets executed when a contextmenu event occurs\n return function(data, index, pMouseUp=false,\n clickAwayFunc = function() { } ) {\n var elm = this;\n var contextMenuPos = null;\n let mousePos = null;\n let currentThis = this;\n\n if (rootElement == null)\n mousePos = d3.mouse(this);\n else\n mousePos = d3.mouse(rootElement); // for recursive menus, we need the mouse\n // position relative to another element\n\n clickAway = clickAwayFunc;\n let openChildMenuUid = null;\n\n previouslyMouseUp = pMouseUp;\n\n d3.selectAll('.d3-context-menu-' + uid).html('');\n var list = d3.selectAll('.d3-context-menu-' + uid)\n .on('contextmenu', function(d) {\n console.log('context-menu close');\n d3.select('.d3-context-menu-' + uid).style('display', 'none'); \n orientation = 'right';\n\n d3.event.preventDefault();\n d3.event.stopPropagation();\n })\n .append('ul');\n\n list.selectAll('li').data(typeof menu === 'function' ? menu(data) : menu).enter()\n .append('li')\n .attr('class', function(d) {\n console.log('d:', d);\n var ret = '';\n if (d.divider) {\n ret += ' is-divider';\n }\n if (d.disabled) {\n ret += ' is-disabled';\n }\n if (!d.action) {\n ret += ' is-header';\n }\n if ('children' in d) {\n ret += ' d3-context-menu-recursive';\n }\n return ret;\n })\n .html(function(d) {\n if (d.divider) {\n return '
';\n }\n if (!d.title) {\n console.error('No title attribute set. Check the spelling of your options.');\n }\n return (typeof d.title === 'string') ? d.title : d.title(data);\n })\n .on('click', function(d, i) {\n if (d.disabled) return; // do nothing if disabled\n if (!d.action) return; // headers have no \"action\"\n d.action(elm, data, index, mousePos);\n console.log('click close');\n\n // close all context menus\n d3.selectAll('.d3-context-menu').style('display', 'none');\n orientation = 'right';\n\n if (closeCallback) {\n closeCallback();\n }\n })\n .on('mouseenter', function(d, i) {\n d3.select(this)\n .classed('d3-context-menu-selected', true)\n\n if (openChildMenuUid != null) {\n // there's a child menu open\n\n // unselect all items\n d3.select('.d3-context-menu-' + uid)\n .selectAll('li')\n .classed('d3-context-menu-selected', false);\n\n if (typeof d.children == 'undefined') {\n console.log(\"no children close\");\n // no children, so hide any open child menus\n d3.select('.d3-context-menu-' + openChildMenuUid)\n .style('display', 'none');\n\n openChildMenuUid = null;\n return;\n }\n\n if (d.childUid == openChildMenuUid) {\n // the correct child menu is already open\n return;\n\n } else {\n // need to open a different child menu\n console.log('open different child menu close');\n \n // close the already open one\n d3.select('.d3-context-menu-' + openChildMenuUid)\n .style('display', 'none');\n\n openChildMenuUid = null;\n\n }\n } \n\n // there should be no menu open right now\n if (typeof d.children != 'undefined') {\n let boundingRect = this.getBoundingClientRect();\n\n let childrenContextMenu = null\n if (orientation == 'left') {\n childrenContextMenu = contextMenu(d.children, {'rootElement': currentThis,\n 'pos': [ boundingRect.left + window.pageXOffset,\n boundingRect.top - 2 + window.pageYOffset],\n 'orientation': 'left'});\n } else {\n childrenContextMenu = contextMenu(d.children, \n {\n 'pos': [ boundingRect.left + boundingRect.width + window.pageXOffset,\n boundingRect.top - 2 + window.pageYOffset],\n 'rootElement': currentThis,\n 'parentStart': [boundingRect.left + window.pageXOffset,\n boundingRect.top - 2 + window.pageYOffset]});\n }\n\n d.childUid = childrenContextMenu.apply(this, [data,i,true,\n function() { }]);\n openChildMenuUid = d.childUid;\n }\n\n\n d3.select(this)\n .classed('d3-context-menu-selected', true)\n \n })\n .on('mouseleave', function(d, i) {\n\n if (openChildMenuUid == null) {\n d3.select(this)\n .classed('d3-context-menu-selected', false);\n }\n });\n\n list.selectAll('.d3-context-menu-recursive')\n .append('img')\n .attr('src', ArrowIcon)\n .attr('width', '14px')\n .attr('height', '14px')\n .style('position', 'absolute')\n .style('right', '5px')\n ;\n\n // the openCallback allows an action to fire before the menu is displayed\n // an example usage would be closing a tooltip\n if (openCallback) {\n if (openCallback(data, index) === false) {\n return uid;\n }\n }\n\n let contextMenuSelection = d3.select('.d3-context-menu-' + uid)\n .style('display', 'block');\n\n if (initialPos == null) {\n d3.select('.d3-context-menu-' + uid)\n .style('left', (d3.event.pageX - 2) + 'px')\n .style('top', (d3.event.pageY - 2) + 'px')\n } else {\n d3.select('.d3-context-menu-' + uid)\n .style('left', initialPos[0] + 'px')\n .style('top', initialPos[1] + 'px')\n }\n\n // check if the menu disappears off the side of the window\n let boundingRect = contextMenuSelection.node().getBoundingClientRect();\n\n if (boundingRect.left + boundingRect.width > window.innerWidth || orientation == 'left') {\n orientation = 'left';\n\n // menu goes of the end of the window, position it the other way\n if (initialPos == null) {\n // place the menu where the user clicked\n d3.select('.d3-context-menu-' + uid)\n .style('left', (d3.event.pageX - 2 - boundingRect.width) + 'px')\n .style('top', (d3.event.pageY - 2) + 'px')\n } else {\n if (parentStart != null) {\n d3.select('.d3-context-menu-' + uid)\n .style('left', (parentStart[0] - boundingRect.width) + 'px')\n .style('top', parentStart[1] + 'px')\n } else {\n d3.select('.d3-context-menu-' + uid)\n .style('left', (initialPos[0] - boundingRect.width) + 'px')\n .style('top', initialPos[1] + 'px')\n }\n }\n \n }\n\n // display context menu\n\n if (previouslyMouseUp)\n return uid;\n\n d3.event.preventDefault();\n d3.event.stopPropagation();\n //d3.event.stopImmediatePropagation();\n //\n return uid;\n };\n};\n","var numberSort = function(a,b) { return a - b; };\n\nexport function arraysEqual(a, b) {\n // courtesy of \n // http://stackoverflow.com/questions/3115982/how-to-check-if-two-arrays-are-equal-with-javascript\n if (a === b) return true;\n if (a === null || b === null) return false;\n if (a.length != b.length) return false;\n\n // If you don't care about the order of the elements inside\n // the array, you should sort both arrays here.\n\n for (var i = 0; i < a.length; ++i) {\n if (a[i] !== b[i]) return false;\n }\n return true;\n}\n\nexport function RNAUtilities() {\n var self = this;\n\n // the brackets to use when constructing dotbracket strings\n // with pseudoknots\n self.bracketLeft = \"([{abcdefghijklmnopqrstuvwxyz\".split(\"\");\n\n self.inverseBrackets = function(bracket) {\n var res = {};\n for (var i = 0; i < bracket.length; i++) {\n res[bracket[i]] = i;\n }\n return res;\n };\n\n self.maximumMatching = function maximumMatching(pt){\n // Courtesy of the great Ronny Lorenz\n\n var n = pt[0];\n var TURN = 0; //minimal number of nucleotides in the hairpin\n\n /* array init */\n var mm = new Array(n + 1);\n for(var i = 0; i <= n; i++){\n mm[i] = new Array(n + 1);\n for(var j = i; j <= n; j++)\n mm[i][j] = 0;\n }\n var maximum = 0;\n\n /* actual computation */\n for(var i = n - TURN - 1; i > 0; i--)\n\n for(var j = i + TURN + 1; j <= n; j++){\n maximum = mm[i][j-1];\n\n for(var l = j - TURN - 1; l >= i; l--) {\n if(pt[l] === j) {\n\n // we have a base pair here\n maximum = Math.max(maximum, ((l > i) ? mm[i][l-1] : 0) + 1 + ((j - l - 1 > 0) ? mm[l+1][j-1] : 0));\n }\n }\n\n mm[i][j] = maximum;\n }\n\n maximum = mm[1][n];\n\n return mm;\n };\n\n self.backtrackMaximumMatching = function(mm, oldPt) {\n var pt = Array.apply(null, \n Array(mm.length)).map(function() { return 0 }); \n //create an array containing zeros\n\n self.mmBt(mm, pt, oldPt, 1, mm.length-1);\n return pt;\n }\n\n self.mmBt = function(mm, pt, oldPt, i, j){\n // Create a pairtable from the backtracking\n var maximum = mm[i][j];\n var TURN = 0;\n\n if(j - i - 1 < TURN) return; /* no more pairs */\n\n if(mm[i][j-1] == maximum){ /* j is unpaired */\n self.mmBt(mm, pt, oldPt, i, j-1);\n return;\n }\n\n for(var q = j - TURN - 1; q >= i; q--){ /* j is paired with some q */\n if (oldPt[j] !== q)\n continue;\n\n var leftPart = (q > i) ? mm[i][q-1] : 0;\n var enclosedPart = (j - q - 1 > 0) ? mm[q+1][j-1] : 0;\n\n if(leftPart + enclosedPart + 1 == maximum) {\n // there's a base pair between j and q\n pt[q] = j;\n pt[j] = q;\n\n if(i < q) \n self.mmBt(mm, pt, oldPt, i, q - 1);\n\n self.mmBt(mm, pt, oldPt, q + 1, j - 1);\n return;\n }\n }\n\n //alert(i + \",\" + j + \": backtracking failed!\");\n console.log('FAILED!!!' + i + ',' + j + ': backtracking failed!');\n\n };\n\n self.dotbracketToPairtable = function(dotbracket) {\n // create an array and initialize it to 0\n var pt = Array.apply(null, new Array(dotbracket.length + 1)).map(Number.prototype.valueOf,0);\n \n // the first element is always the length of the RNA molecule\n pt[0] = dotbracket.length;\n\n // store the pairing partners for each symbol\n var stack = {};\n for (var i = 0; i < self.bracketLeft.length; i++) {\n stack[i] = [];\n }\n\n // lookup the index of each symbol in the bracket array\n var inverseBracketLeft = self.inverseBrackets(self.bracketLeft);\n var inverseBracketRight = self.inverseBrackets(self.bracketRight);\n\n for (var i = 0; i < dotbracket.length; i++) {\n var a = dotbracket[i];\n var ni = i + 1;\n\n if (a == '.' || a == 'o') {\n // unpaired\n pt[ni] = 0;\n } else {\n if (a in inverseBracketLeft) {\n // open pair?\n stack[inverseBracketLeft[a]].push(ni);\n } else if (a in inverseBracketRight){\n // close pair?\n var j = stack[inverseBracketRight[a]].pop();\n\n pt[ni] = j;\n pt[j] = ni;\n } else {\n throw \"Unknown symbol in dotbracket string\";\n }\n }\n }\n\n for (var key in stack) {\n if (stack[key].length > 0) {\n throw \"Unmatched base at position \" + stack[key][0];\n }\n }\n\n return pt;\n };\n\n self.insertIntoStack = function(stack, i, j) {\n var k = 0;\n while (stack[k].length > 0 && stack[k][stack[k].length - 1] < j) {\n k += 1;\n }\n\n stack[k].push(j);\n return k;\n };\n\n self.deleteFromStack = function(stack, j) {\n var k = 0;\n while (stack[k].length === 0 || stack[k][stack[k].length-1] != j) {\n k += 1;\n }\n stack[k].pop();\n return k;\n };\n\n self.pairtableToDotbracket = function(pt) {\n // store the pairing partners for each symbol\n var stack = {};\n for (var i = 0; i < pt[0]; i++) {\n stack[i] = [];\n }\n\n var seen = {};\n var res = \"\";\n var i;\n for (var i = 1; i < pt[0] + 1; i++) {\n if (pt[i] !== 0 && pt[i] in seen) {\n throw \"Invalid pairtable contains duplicate entries\";\n }\n seen[pt[i]] = true;\n\n if (pt[i] === 0) {\n res += '.';\n } else {\n if (pt[i] > i) {\n res += self.bracketLeft[self.insertIntoStack(stack, i, pt[i])];\n } else {\n res += self.bracketRight[self.deleteFromStack(stack, i)];\n }\n }\n }\n\n return res;\n };\n\n self.findUnmatched = function(pt, from, to) {\n /*\n * Find unmatched nucleotides in this molecule.\n */\n var toRemove = [];\n var unmatched = [];\n\n var origFrom = from;\n var origTo = to;\n var i;\n\n for (var i = from; i <= to; i++)\n if (pt[i] !== 0 && (pt[i] < from || pt[i] > to))\n unmatched.push([i,pt[i]]);\n\n for (var i = origFrom; i <= origTo; i++) {\n while (pt[i] === 0 && i <= origTo) i++;\n\n to = pt[i];\n\n while (pt[i] === to) {\n i++;\n to--;\n }\n \n toRemove = toRemove.concat(self.findUnmatched(pt, i, to));\n }\n\n if (unmatched.length > 0)\n toRemove.push(unmatched);\n\n return toRemove;\n };\n\n self.removePseudoknotsFromPairtable = function(pt) {\n /* Remove the pseudoknots from this structure in such a fashion\n * that the least amount of base-pairs need to be broken\n *\n * The pairtable is manipulated in place and a list of tuples\n * indicating the broken base pairs is returned.\n */\n\n var mm = self.maximumMatching(pt);\n var newPt = self.backtrackMaximumMatching(mm, pt);\n var removed = [];\n\n for (var i = 1; i < pt.length; i++) {\n if (pt[i] < i)\n continue;\n\n if (newPt[i] != pt[i]) {\n removed.push([i, pt[i]]);\n pt[pt[i]] = 0;\n pt[i] = 0;\n }\n }\n\n return removed;\n };\n\n self.ptToElements = function(pt, level, i, j, dotBracketBreaks) {\n /* Convert a pair table to a list of secondary structure \n * elements:\n *\n * [['s',1,[2,3]]\n *\n * The 's' indicates that an element can be a stem. It can also be\n * an interior loop ('i'), a hairpin loop ('h') or a multiloop ('m')\n *\n * The second number (1 in this case) indicates the depth or\n * how many base pairs have to be broken to get to this element.\n *\n * Finally, there is the list of nucleotides which are part of\n * of this element.\n */\n var elements = [];\n var u5 = [i-1];\n var u3 = [j+1];\n\n if (arguments.length < 5)\n dotBracketBreaks = [];\n\n if (i > j)\n return [];\n \n //iterate over the unpaired regions on either side\n //this is either 5' and 3' unpaired if level == 0\n //or an interior loop or a multiloop\n for (; pt[i] === 0; i++) { u5.push(i); }\n for (; pt[j] === 0; j--) { u3.push(j); }\n\n if (i > j) {\n //hairpin loop or one large unpaired molecule\n u5.push(i);\n if (level === 0)\n return [['e',level, u5.sort(numberSort)]];\n else {\n // check to see if we have chain breaks due\n // to multiple strands in the input\n var external = false;\n var left = [];\n var right = [];\n for (var k = 0; k < u5.length; k++) {\n if (external)\n right.push(u5[k]);\n else\n left.push(u5[k]);\n\n if (dotBracketBreaks.indexOf(u5[k]) >= 0)\n external = true;\n }\n\n if (external) {\n return [['h',level, u5.sort(numberSort)]];\n }\n else\n // if not, this is a simple hairpin loop\n return [['h',level, u5.sort(numberSort)]];\n }\n }\n\n if (pt[i] != j) {\n //multiloop\n var m = u5;\n var k = i;\n\n // the nucleotide before and the starting nucleotide\n m.push(k);\n while (k <= j) {\n // recurse into a stem\n elements = elements.concat(self.ptToElements(pt, level, k, pt[k], dotBracketBreaks));\n\n // add the nucleotides between stems\n m.push(pt[k]);\n k = pt[k] + 1;\n for (; pt[k] === 0 && k <= j; k++) { m.push(k);}\n m.push(k);\n }\n m.pop();\n m = m.concat(u3);\n \n if (m.length > 0) {\n if (level === 0)\n elements.push(['e', level, m.sort(numberSort)]);\n else\n elements.push(['m', level, m.sort(numberSort)]);\n }\n \n return elements;\n }\n\n if (pt[i] === j) {\n //interior loop\n u5.push(i);\n u3.push(j);\n\n var combined = u5.concat(u3);\n if (combined.length > 4) {\n if (level === 0)\n elements.push(['e',level, u5.concat(u3).sort(numberSort)]);\n else\n elements.push(['i',level, u5.concat(u3).sort(numberSort)]);\n }\n } \n\n var s = [];\n //go through the stem\n while (pt[i] === j && i < j) {\n //one stem\n s.push(i);\n s.push(j);\n\n i += 1;\n j -= 1;\n\n level += 1;\n }\n\n u5 = [i-1];\n u3 = [j+1];\n elements.push(['s', level, s.sort(numberSort)]);\n\n return elements.concat(self.ptToElements(pt, level, i, j, dotBracketBreaks));\n };\n\n}\n\nexport var rnaUtilities = new RNAUtilities();\n\nexport function ColorScheme(colorsText) {\n var self = this;\n self.colorsText = colorsText;\n\n self.parseRange = function(rangeText) {\n //parse a number range such as 1-10 or 3,7,9 or just 7\n var parts = rangeText.split(',')\n var nums = [];\n\n for (var i = 0; i < parts.length; i++) {\n //could be 1 or 10-11 or something like that\n var parts1 = parts[i].split('-');\n\n if (parts1.length == 1)\n nums.push(parseInt(parts1[0]));\n else if (parts1.length == 2) {\n var from = parseInt(parts1[0]);\n var to = parseInt(parts1[1]);\n\n // add each number in this range\n for (var j = from; j <= to; j++) \n nums.push(j)\n } else {\n console.log('Malformed range (too many dashes):', rangeText);\n }\n }\n\n return nums;\n }\n\n self.parseColorText = function(colorText) {\n /* Parse the text of an RNA color string. Instructions and description\n * of the format are given below.\n *\n * The return is a json double dictionary indexed first by the \n * molecule name, then by the nucleotide. This is then applied\n * by force.js to the RNAs it is displaying. When no molecule\n * name is specified, the color is applied to all molecules*/\n var lines = colorText.split('\\n');\n var currMolecule = '';\n var counter = 1;\n var colorsJson = {colorValues: {'':{}}, range:['white', 'steelblue']};\n var domainValues = [];\n\n\n for (var i = 0; i < lines.length; i++) {\n\n if (lines[i][0] == '>') {\n // new molecule\n currMolecule = lines[i].trim().slice(1);\n counter = 1;\n\n colorsJson.colorValues[currMolecule] = {};\n continue;\n }\n\n let words = lines[i].trim().split(/[\\s]+/);\n\n for (var j = 0; j < words.length; j++) {\n if (isNaN(words[j])) {\n if (words[j].search('range') === 0) {\n //there's a color scale in this entry\n let parts = words[j].split('=');\n let partsRight = parts[1].split(':')\n colorsJson.range = [partsRight[0], partsRight[1]];\n continue;\n }\n\n if (words[j].search('domain') == 0) {\n //there's a color scale in this entry\n let parts = words[j].split('=');\n let partsRight = parts[1].split(':')\n colorsJson.domain = [partsRight[0], partsRight[1]];\n continue;\n }\n\n // it's not a number, should be a combination \n // of a number (nucleotide #) and a color\n let parts = words[j].split(':');\n let nums = self.parseRange(parts[0]);\n let color = parts[1]\n\n for (var k = 0; k < nums.length; k++) {\n if (isNaN(color)) {\n colorsJson.colorValues[currMolecule][nums[k]] = color;\n } else {\n colorsJson.colorValues[currMolecule][nums[k]] = +color;\n domainValues.push(Number(color));\n }\n }\n } else {\n //it's a number, so we add it to the list of values\n //seen for this molecule\n colorsJson.colorValues[currMolecule][counter] = Number(words[j]);\n counter += 1;\n\n domainValues.push(Number(words[j]));\n }\n }\n }\n\n if (!('domain' in colorsJson))\n colorsJson.domain = [Math.min.apply(null, domainValues), Math.max.apply(null, domainValues)];\n\n self.colorsJson = colorsJson;\n\n return self;\n };\n\n self.normalizeColors = function() {\n /* \n * Normalize the passed in values so that they range from\n * 0 to 1\n */\n var value;\n\n for (var moleculeName in self.colorsJson) {\n var minNum = Number.MAX_VALUE;\n var maxNum = Number.MIN_VALUE;\n\n // iterate once to find the min and max values;\n for (var resnum in self.colorsJson.colorValues[moleculeName]) {\n value = self.colorsJson.colorValues[moleculeName][resnum];\n if (typeof value == 'number') {\n if (value < minNum)\n minNum = value;\n if (value > maxNum)\n maxNum = value;\n }\n }\n\n // iterate again to normalize\n for (resnum in self.colorsJson.colorValues[moleculeName]) {\n value = self.colorsJson.colorValues[moleculeName][resnum];\n if (typeof value == 'number') {\n self.colorsJson.colorValues[moleculeName][resnum] = (value - minNum ) / (maxNum - minNum);\n }\n }\n }\n\n return self;\n };\n\n self.parseColorText(self.colorsText);\n return self;\n}\n","import {arraysEqual,RNAUtilities,rnaUtilities} from './rnautils.js';\nimport slugid from 'slugid';\n\nvar numberSort = function(a,b) { return a - b; };\n\nif (typeof(String.prototype.trim) === 'undefined') {\n String.prototype.trim = function() {\n return String(this).replace(/^\\s+|\\s+$/g, '');\n };\n}\n\nexport function ProteinGraph(structName, size, uid) {\n var self = this;\n\n self.type = 'protein';\n self.size = size;\n self.nodes = [{'name': 'P',\n 'num': 1,\n 'radius': 3 * Math.sqrt(size),\n 'rna': self,\n 'nodeType': 'protein',\n 'structName': structName,\n 'elemType': 'p',\n 'size': size,\n 'uid': slugid.nice()}];\n\n self.links = [];\n self.uid = slugid.nice();\n\n self.addUids = function(uids) {\n for (let i = 0; i < uids.length; i++)\n self.nodes[i].uid = uids[i];\n\n return self;\n };\n\n self.getUids = function() {\n /* Get the positions of each node so that they\n * can be passed to elementsToJson later\n */\n uids = [];\n for (let i = 0; i < self.dotbracket.length; i++)\n uids.push(self.nodes[i].uid);\n\n return uids;\n };\n\n}\n\nexport function RNAGraph(seq = '', dotbracket = '', structName = '', startNumber = 1) {\n var self = this;\n\n self.type = 'rna';\n self.circularizeExternal = false;\n self.seq = seq;\n self.dotbracket = dotbracket; //i.e. ..((..))..\n self.structName = structName;\n self.circular = false;\n\n if (self.dotbracket.slice(-1) == '*') {\n //circular RNA\n self.dotbracket = self.dotbracket.slice(0, -1);\n self.circular = true;\n }\n\n self.uid = slugid.nice();\n\n self.elements = []; //store the elements and the\n //nucleotides they contain\n self.pseudoknotPairs = [];\n self.nucsToNodes = {};\n\n self.addUids = function(uids) {\n let nucleotideNodes = self.nodes.filter(function(d) { return d.nodeType == 'nucleotide'; });\n\n for (let i = 0; i < uids.length && i < nucleotideNodes.length; i++) {\n nucleotideNodes[i].uid = uids[i];\n }\n\n return self;\n };\n\n self.computePairtable = function() {\n self.pairtable = rnaUtilities.dotbracketToPairtable(self.dotbracket);\n };\n\n self.removeBreaks = function(targetString) {\n // Remove all chain breaks (denoted with a '&', which indicate\n // that the input represents more than one strand)\n var breaks = [];\n var breakIndex = -1;\n\n while ((breakIndex = targetString.indexOf('&')) >= 0) {\n breaks.push(breakIndex);\n targetString = targetString.substring(0, breakIndex) + targetString.substring(breakIndex+1, targetString.length);\n\n }\n\n return {targetString: targetString, breaks: breaks};\n };\n\n var ret = self.removeBreaks(self.dotbracket);\n self.dotbracket = ret.targetString;\n self.dotBracketBreaks = ret.breaks;\n\n ret = self.removeBreaks(self.seq);\n self.seq = ret.targetString;\n self.seqBreaks = ret.breaks;\n\n self.rnaLength = self.dotbracket.length;\n\n if (!arraysEqual(self.dotBracketBreaks, self.seqBreaks)) {\n console.log('WARNING: Sequence and structure breaks not equal');\n console.log('WARNING: Using the breaks in the structure');\n }\n\n self.computePairtable();\n\n self.addPositions = function(nodeType, positions) {\n let labelNodes = self.nodes.filter(function(d) { return d.nodeType == nodeType; });\n\n for (let i = 0; i < labelNodes.length; i++) {\n labelNodes[i].x = positions[i][0];\n labelNodes[i].y = positions[i][1];\n }\n\n return self;\n };\n\n self.breakNodesToFakeNodes = function() {\n // convert all the nodes following breaks to fake nodes\n let labelNodes = self.nodes.filter(function(d) { return d.nodeType == 'nucleotide'; });\n\n // if a node was an artifical break node, convert it to a middle\n for (let i = 0; i < labelNodes.length; i++) {\n if (self.dotBracketBreaks.indexOf(i) >= 0) {\n labelNodes[i].nodeType = 'middle';\n labelNodes[i+1].nodeType = 'middle';\n }\n }\n\n for (let i = 0; i < self.elements.length; i++) {\n var broken = false;\n\n // change the elemType of the other nodes in the element containing\n // the break\n for (let j = 0; j < self.elements[i][2].length; j++) {\n if (self.dotBracketBreaks.indexOf(self.elements[i][2][j]) >= 0)\n broken = true;\n }\n\n if (broken) {\n self.elements[i][2].map(function(x) {\n if (x == 0)\n return;\n self.nodes[x-1].elemType = 'e';\n });\n } else {\n self.elements[i][2].map(function(x) {\n if (x == 0)\n return;\n self.nodes[x-1].elemType = self.elements[i][0];\n });\n }\n }\n return self;\n };\n\n self.getPositions = function(nodeType) {\n var positions = [];\n let nucleotideNodes = self.nodes.filter(function(d) { return d.nodeType == nodeType; });\n\n for (let i = 0; i < nucleotideNodes.length; i++)\n positions.push([nucleotideNodes[i].x, nucleotideNodes[i].y]);\n\n return positions;\n };\n\n self.getUids = function() {\n /* Get the positions of each node so that they\n * can be passed to elementsToJson later\n */\n var uids = [];\n for (let i = 0; i < self.dotbracket.length; i++)\n uids.push(self.nodes[i].uid);\n\n return uids;\n };\n\n self.reinforceStems = function() {\n var pt = self.pairtable;\n let relevantElements = self.elements.filter( function(d) {\n return d[0] == 's' && d[2].length >= 4;\n });\n\n for (let i = 0; i < relevantElements.length; i++) {\n let allNucs = relevantElements[i][2];\n let nucs = allNucs.slice(0, allNucs.length / 2);\n\n for (let j = 0; j < nucs.length-1; j++) {\n self.addFakeNode([nucs[j], nucs[j+1], pt[nucs[j+1]], pt[nucs[j]]]);\n }\n }\n\n return self;\n };\n\n self.reinforceLoops = function() {\n /*\n * Add a set of fake nodes to enforce the structure\n */\n var filterNucs = function(d) {\n return d !== 0 && d <= self.dotbracket.length;\n };\n\n for (let i = 0; i < self.elements.length; i++) {\n if (self.elements[i][0] == 's' || (!self.circularizeExternal && self.elements[i][0] == 'e'))\n continue;\n\n var nucs = self.elements[i][2].filter(filterNucs);\n\n if (self.elements[i][0] == 'e') {\n var newNode1 = {'name': '',\n 'num': -3,\n //'radius': 18 * radius -6,\n 'radius': 0,\n 'rna': self,\n 'nodeType': 'middle',\n 'elemType': 'f',\n 'nucs': [],\n 'x': self.nodes[self.rnaLength-1].x,\n 'y': self.nodes[self.rnaLength-1].y,\n 'px': self.nodes[self.rnaLength-1].px,\n 'py': self.nodes[self.rnaLength-1].py,\n 'uid': slugid.nice() };\n var newNode2 = {'name': '',\n 'num': -2,\n //'radius': 18 * radius -6,\n 'radius': 0,\n 'rna': self,\n 'nodeType': 'middle',\n 'elemType': 'f',\n 'nucs': [],\n 'x': self.nodes[0].x,\n 'y': self.nodes[0].y,\n 'px': self.nodes[0].px,\n 'py': self.nodes[0].py,\n 'uid': slugid.nice() };\n\n nucs.push(self.nodes.length+1);\n nucs.push(self.nodes.length+2);\n self.nodes.push(newNode1);\n self.nodes.push(newNode2);\n }\n\n\n self.addFakeNode(nucs);\n }\n\n return self;\n };\n\n self.updateLinkUids = function() {\n for (let i = 0; i < self.links.length; i++) {\n self.links[i].uid = self.links[i].source.uid + self.links[i].target.uid;\n }\n\n return self;\n };\n\n self.addFakeNode = function(nucs) {\n var linkLength = 18; //make sure this is consistent with the value in force.js\n var nodeWidth = 6;\n var angle = (3.1415 * 2) / (2 * nucs.length);\n var radius = linkLength / (2 * Math.tan(angle));\n\n var fakeNodeUid = '';\n\n for (let i = 0; i < nucs.length; i++)\n fakeNodeUid += self.nodes[nucs[i]-1].uid;\n\n var newNode = {'name': '',\n 'num': -1,\n //'radius': 18 * radius -6,\n 'radius': radius,\n 'rna': self,\n 'nodeType': 'middle',\n 'elemType': 'f',\n 'nucs': nucs,\n 'uid': fakeNodeUid };\n self.nodes.push(newNode);\n\n var newX = 0;\n var newY = 0;\n var coordsCounted = 0;\n\n angle = (nucs.length - 2) * 3.14159 / (2 * nucs.length);\n radius = 0.5 / Math.cos(angle);\n\n for (let j = 0; j < nucs.length; j++) {\n if (nucs[j] === 0 || nucs[j] > self.dotbracket.length)\n continue;\n\n //link to the center node\n self.links.push({'source': self.nodes[nucs[j] - 1],\n 'target': self.nodes[self.nodes.length-1],\n 'linkType': 'fake',\n 'value': radius,\n 'uid': slugid.nice() });\n\n if (nucs.length > 4) {\n //link across the loop\n self.links.push({'source': self.nodes[nucs[j] - 1],\n 'target': self.nodes[nucs[(j + Math.floor(nucs.length / 2)) % nucs.length] - 1],\n 'linkType': 'fake',\n 'value': radius * 2,\n 'uid': slugid.nice() });\n }\n\n var ia = ((nucs.length - 2) * 3.14159) / nucs.length;\n var c = 2 * Math.cos(3.14159 / 2 - ia / 2);\n //link to over-neighbor\n self.links.push({'source': self.nodes[nucs[j] - 1],\n 'target': self.nodes[nucs[(j + 2) % nucs.length] - 1],\n 'linkType': 'fake',\n 'value': c});\n\n // calculate the mean of the coordinats in this loop\n // and place the fake node there\n var fromNode = self.nodes[nucs[j]-1];\n if ('x' in fromNode) {\n newX += fromNode.x;\n newY += fromNode.y;\n\n coordsCounted += 1;\n }\n }\n\n if (coordsCounted > 0) {\n // the nucleotides had set positions so we can calculate the position\n // of the fake node\n newNode.x = newX / coordsCounted;\n newNode.y = newY / coordsCounted;\n newNode.px = newNode.x;\n newNode.py = newNode.y;\n }\n\n return self;\n };\n\n self.connectFakeNodes = function() {\n var linkLength = 18;\n\n // We want to be able to connect all of the fake nodes\n // and create a structure consisting of just them\n var filterOutNonFakeNodes = function(d) {\n return d.nodeType == 'middle';\n }\n\n var nucsToNodes = {};\n var fakeNodes = self.nodes.filter(filterOutNonFakeNodes);\n var linked = {};\n\n // initialize the nucleotides to nodes\n for (var i = 1; i <= self.nodes.length; i++)\n nucsToNodes[i] = [];\n\n for (var i = 0; i < fakeNodes.length; i++) {\n var thisNode = fakeNodes[i];\n\n // each fake node represents a certain set of nucleotides (thisNode.nucs)\n for (var j = 0; j < thisNode.nucs.length; j++) {\n var thisNuc = thisNode.nucs[j];\n\n // check to see if this nucleotide has been seen in another fake node\n // if it has, then we add a link between the two nodes\n for (var k = 0; k < nucsToNodes[thisNuc].length; k++) {\n if (JSON.stringify([nucsToNodes[thisNuc][k].uid, thisNode.uid].sort()) in linked)\n continue; //already linked\n\n var distance = nucsToNodes[thisNuc][k].radius + thisNode.radius;\n\n self.links.push({'source': nucsToNodes[thisNuc][k],\n 'target': thisNode,\n 'value': distance / linkLength,\n 'linkType': 'fake_fake'});\n\n // note that we've already seen this link\n linked[JSON.stringify([nucsToNodes[thisNuc][k].uid, thisNode.uid].sort())] = true;\n }\n\n nucsToNodes[thisNuc].push(thisNode);\n }\n }\n\n return self;\n\n };\n\n self.addExtraLinks = function(extraLinks) {\n if (typeof extraLinks == 'undefined')\n return self;\n\n for (var i = 0; i < extraLinks.length; i++) {\n var source = self.getNodeFromNucleotides(extraLinks[i].from);\n var target = self.getNodeFromNucleotides(extraLinks[i].to);\n\n var newLink = {'source': source, 'target': target, 'linkType': 'extra',\n 'extraLinkType': extraLinks[i].linkType, 'uid': slugid.nice() };\n\n self.links.push(newLink);\n }\n\n return self;\n }\n\n\n self.elementsToJson = function() {\n /* Convert a set of secondary structure elements to a json\n * representation of the graph that can be used with d3's\n * force-directed layout to generate a visualization of\n * the structure.\n */\n var pt = self.pairtable;\n var elements = self.elements;\n\n self.nodes = [];\n self.links = [];\n\n //create a reverse lookup so we can find out the type\n //of element that a node is part of\n var elemTypes = {};\n\n //sort so that we count stems last\n self.elements.sort();\n\n for (let i = 0; i < self.elements.length; i++) {\n var nucs = self.elements[i][2];\n for (let j = 0; j < nucs.length; j++) {\n elemTypes[nucs[j]] = self.elements[i][0];\n }\n }\n\n for (let i = 1; i <= pt[0]; i++) {\n var nodeName = self.seq[i-1];\n\n if (self.dotBracketBreaks.indexOf(i-1) >= 0 ||\n self.dotBracketBreaks.indexOf(i-2) >= 0) {\n nodeName = '';\n }\n\n //create a node for each nucleotide\n self.nodes.push({'name': nodeName,\n 'num': startNumber + i - 1,\n 'radius': 5,\n 'rna': self,\n 'nodeType': 'nucleotide',\n 'structName': self.structName,\n 'elemType': elemTypes[i],\n 'uid': slugid.nice(),\n 'linked': false});\n }\n\n for (let i = 0; i < self.nodes.length; i++) {\n if (i === 0)\n self.nodes[i].prevNode = null;\n else {\n self.nodes[i].prevNode = self.nodes[i-1];\n }\n\n if (i == self.nodes.length-1)\n self.nodes[i].nextNode = null;\n else {\n self.nodes[i].nextNode = self.nodes[i+1];\n }\n }\n\n for (let i = 1; i <= pt[0]; i++) {\n\n if (pt[i] !== 0) {\n // base-pair links\n self.links.push({'source': self.nodes[i-1],\n 'target': self.nodes[pt[i]-1],\n 'linkType': 'basepair',\n 'value': 1,\n 'uid': slugid.nice() });\n }\n\n if (i > 1) {\n // backbone links\n if (self.dotBracketBreaks.indexOf(i-1) === -1 &&\n self.dotBracketBreaks.indexOf(i-2) == -1 &&\n self.dotBracketBreaks.indexOf(i-3) == -1) {\n // there is no break in the strands here\n // we can add a backbone link\n self.links.push({'source': self.nodes[i-2],\n 'target': self.nodes[i-1],\n 'linkType': 'backbone',\n 'value': 1,\n 'uid': slugid.nice() });\n self.nodes[i-1].linked = true;\n }\n }\n }\n\n //add the pseudoknot links\n for (let i = 0; i < self.pseudoknotPairs.length; i++) {\n self.links.push({'source': self.nodes[self.pseudoknotPairs[i][0]-1],\n 'target': self.nodes[self.pseudoknotPairs[i][1]-1],\n 'linkType': 'pseudoknot',\n 'value': 1,\n 'uid': slugid.nice()});\n }\n\n if (self.circular) {\n self.links.push({'source': self.nodes[0],\n 'target': self.nodes[self.rnaLength-1],\n 'linkType': 'backbone',\n 'value': 1,\n 'uid': slugid.nice() });\n\n }\n\n return self;\n };\n\n self.ptToElements = function(pt, level, i, j) {\n /* Convert a pair table to a list of secondary structure\n * elements:\n *\n * [['s',1,[2,3]]\n *\n * The 's' indicates that an element can be a stem. It can also be\n * an interior loop ('i'), a hairpin loop ('h') or a multiloop ('m')\n *\n * The second number (1 in this case) indicates the depth or\n * how many base pairs have to be broken to get to this element.\n *\n * Finally, there is the list of nucleotides which are part of\n * of this element.\n */\n var elements = [];\n var u5 = [i-1];\n var u3 = [j+1];\n\n if (i > j)\n return [];\n\n //iterate over the unpaired regions on either side\n //this is either 5' and 3' unpaired if level == 0\n //or an interior loop or a multiloop\n for (; pt[i] === 0; i++) { u5.push(i); }\n for (; pt[j] === 0; j--) { u3.push(j); }\n\n if (i > j) {\n //hairpin loop or one large unpaired molecule\n u5.push(i);\n if (level === 0)\n return [['e',level, u5.sort(numberSort)]];\n else {\n // check to see if we have chain breaks due\n // to multiple strands in the input\n var external = false;\n var left = [];\n var right = [];\n for (var k = 0; k < u5.length; k++) {\n if (external)\n right.push(u5[k]);\n else\n left.push(u5[k]);\n\n if (self.dotBracketBreaks.indexOf(u5[k]) >= 0)\n external = true;\n }\n\n if (external) {\n return [['h',level, u5.sort(numberSort)]];\n }\n else\n // if not, this is a simple hairpin loop\n return [['h',level, u5.sort(numberSort)]];\n }\n }\n\n if (pt[i] != j) {\n //multiloop\n var m = u5;\n var k = i;\n\n // the nucleotide before and the starting nucleotide\n m.push(k);\n while (k <= j) {\n // recurse into a stem\n elements = elements.concat(self.ptToElements(pt, level, k, pt[k]));\n\n // add the nucleotides between stems\n m.push(pt[k]);\n k = pt[k] + 1;\n for (; pt[k] === 0 && k <= j; k++) { m.push(k);}\n m.push(k);\n }\n m.pop();\n m = m.concat(u3);\n\n if (m.length > 0) {\n if (level === 0)\n elements.push(['e', level, m.sort(numberSort)]);\n else\n elements.push(['m', level, m.sort(numberSort)]);\n }\n\n return elements;\n }\n\n if (pt[i] === j) {\n //interior loop\n u5.push(i);\n u3.push(j);\n\n var combined = u5.concat(u3);\n if (combined.length > 4) {\n if (level === 0)\n elements.push(['e',level, u5.concat(u3).sort(numberSort)]);\n else\n elements.push(['i',level, u5.concat(u3).sort(numberSort)]);\n }\n }\n\n var s = [];\n //go through the stem\n while (pt[i] === j && i < j) {\n //one stem\n s.push(i);\n s.push(j);\n\n i += 1;\n j -= 1;\n\n level += 1;\n }\n\n u5 = [i-1];\n u3 = [j+1];\n elements.push(['s', level, s.sort(numberSort)]);\n\n return elements.concat(self.ptToElements(pt, level, i, j));\n };\n\n self.addLabels = function(startNumber = 1, labelInterval = 10) {\n if (labelInterval === 0)\n return self;\n\n for (let i = 1; i <= self.rnaLength; i++) {\n // add labels\n if (i % labelInterval === 0) {\n //create a node for each label\n let newX, newY;\n\n let thisNode = self.nodes[i-1];\n let prevNode, nextNode;\n let prevVec, nextVec;\n\n if (self.rnaLength == 1) {\n nextVec = [thisNode.x - 15, thisNode.y];\n prevVec = [thisNode.x - 15, thisNode.y];\n } else {\n // if we're labelling the first node, then label it in relation to the last\n if (i == 1)\n prevNode = self.nodes[self.rnaLength - 1];\n else\n prevNode = self.nodes[i - 2];\n\n // if we're labelling the last node, then label it in relation to the first\n if (i == self.rnaLength)\n nextNode = self.nodes[0];\n else\n nextNode = self.nodes[i];\n\n // this nucleotide and its neighbors are paired\n if (self.pairtable[nextNode.num - startNumber+1] !== 0 &&\n self.pairtable[prevNode.num - startNumber+1] !== 0 &&\n self.pairtable[thisNode.num - startNumber+1] !== 0) {\n\n prevNode = nextNode = self.nodes[self.pairtable[thisNode.num - startNumber+1]-1];\n }\n\n // this node is paired but at least one of its neighbors is unpaired\n // place the label in the direction of the two neighbors\n if (self.pairtable[thisNode.num - startNumber+1] !== 0 && (\n self.pairtable[nextNode.num - startNumber+1] === 0 ||\n self.pairtable[prevNode.num - startNumber+1] === 0)) {\n nextVec = [thisNode.x - nextNode.x, thisNode.y - nextNode.y];\n prevVec = [thisNode.x - prevNode.x, thisNode.y - prevNode.y];\n\n } else {\n nextVec = [nextNode.x - thisNode.x, nextNode.y - thisNode.y];\n prevVec = [prevNode.x - thisNode.x, prevNode.y - thisNode.y];\n }\n }\n\n var combinedVec = [nextVec[0] + prevVec[0], nextVec[1] + prevVec[1]];\n var vecLength = Math.sqrt(combinedVec[0] * combinedVec[0] + combinedVec[1] * combinedVec[1]);\n var normedVec = [combinedVec[0] / vecLength, combinedVec[1] / vecLength];\n var offsetVec = [-15 * normedVec[0], -15 * normedVec[1]];\n\n newX = self.nodes[i-1].x + offsetVec[0];\n newY = self.nodes[i-1].y + offsetVec[1];\n\n var newNode = {'name': i + startNumber -1,\n 'num': -1,\n 'radius': 6,\n 'rna': self,\n 'nodeType': 'label',\n 'structName': self.structName,\n 'elemType': 'l',\n 'x': newX,\n 'y': newY,\n 'px': newX,\n 'py': newY,\n 'uid': slugid.nice() };\n var newLink = {'source': self.nodes[i-1],\n 'target': newNode,\n 'value': 1,\n 'linkType': 'label_link',\n 'uid': slugid.nice() };\n\n self.nodes.push(newNode);\n self.links.push(newLink);\n }\n }\n\n return self;\n };\n\n self.recalculateElements = function() {\n self.removePseudoknots();\n self.elements = self.ptToElements(self.pairtable, 0, 1, self.dotbracket.length);\n\n if (self.circular) {\n //check to see if the external loop is a hairpin or a multiloop\n let externalLoop = self.elements.filter(function(d) { if (d[0] == 'e') return true; });\n\n if (externalLoop.length > 0) {\n eloop = externalLoop[0];\n nucs = eloop[2].sort(numberSort);\n\n prev = nucs[0];\n hloop = true;\n numGreater = 0;\n for (let i = 1; i < nucs.length; i++) {\n if (nucs[i] - prev > 1) {\n numGreater += 1;\n }\n prev = nucs[i];\n }\n\n if (numGreater == 1) {\n eloop[0] = 'h';\n } else if (numGreater == 2) {\n eloop[0] = 'i';\n } else {\n eloop[0] = 'm';\n }\n }\n }\n\n return self;\n };\n\n self.reassignLinkUids = function() {\n // reassign uids to the links, corresponding to the uids of the two nodes\n // they connect\n var i;\n\n for (var i = 0; i < self.links.length; i++) {\n self.links[i].uid = self.links[i].source.uid + self.links[i].target.uid;\n }\n\n return self;\n }\n\n self.removePseudoknots = function() {\n if (self.pairtable.length > 1)\n self.pseudoknotPairs = self.pseudoknotPairs.concat(rnaUtilities.removePseudoknotsFromPairtable(self.pairtable));\n\n return self;\n };\n\n self.addPseudoknots = function() {\n /* Add all of the pseudoknot pairs which are stored outside\n * of the pairtable back to the pairtable\n */\n var pt = self.pairtable;\n var pseudoknotPairs = self.pseudoknotPairs;\n\n for (var i = 0; i < pseudoknotPairs.length; i++) {\n pt[pseudoknotPairs[i][0]] = pseudoknotPairs[i][1];\n pt[pseudoknotPairs[i][1]] = pseudoknotPairs[i][0];\n }\n\n self.pseudoknotPairs = [];\n return self;\n };\n\n self.addName = function(name) {\n if (typeof name == 'undefined') {\n self.name = '';\n return self;\n } else {\n self.name = name;\n return self;\n }\n };\n\n\n if (self.rnaLength > 0)\n self.recalculateElements();\n\n self.getNodeFromNucleotides = function(nucs) {\n /* Get a node given a nucleotide number or an array of nucleotide\n * numbers indicating an element node */\n if (Object.prototype.toString.call(nucs) === '[object Array]') {\n for (let j = 0; j < self.nodes.length; j++) {\n if ('nucs' in self.nodes[j]) {\n if (self.nodes[j].nucs.equals(nucs)) {\n return self.nodes[j];\n }\n }\n }\n } else {\n for (let j = 0; j < self.nodes.length; j++) {\n if (self.nodes[j].num == nucs) {\n return self.nodes[j];\n }\n }\n }\n\n console.log('ERROR: No node found for nucs:', nucs);\n return null;\n }\n}\n\nexport function moleculesToJson(moleculesJson) {\n /* Convert a list of RNA and protein molecules to a list of RNAGraph\n * ProteinGraph and extraLinks structure */\n\n var nodes = {}; //index the nodes by uid\n var graphs = [];\n var extraLinks = [];\n\n\n // Create the graphs for each molecule\n for (var i = 0; i < moleculesJson.molecules.length; i++) {\n var molecule = moleculesJson.molecules[i];\n var rg;\n\n if (molecule.type == 'rna') {\n rg = new RNAGraph(molecule.seq, molecule.ss, molecule.header);\n rg.circularizeExternal = true;\n rg.elementsToJson()\n .addPositions('nucleotide', molecule.positions)\n .addLabels()\n .reinforceStems()\n .reinforceLoops();\n\n\n } else if (molecule.type == 'protein') {\n rg = new ProteinGraph(molecule.header, molecule.size);\n\n }\n\n rg.addUids(molecule.uids);\n\n for (var j = 0; j < rg.nodes.length; j++) {\n nodes[rg.nodes[j].uid] = rg.nodes[j];\n }\n\n graphs.push(rg);\n }\n\n //Add the extra links\n for (var i = 0; i < moleculesJson.extraLinks.length; i++) {\n link = moleculesJson.extraLinks[i];\n\n link.source = nodes[link.source];\n link.target = nodes[link.target];\n link.uid = slugid.nice();\n\n extraLinks.push(link);\n }\n\n return {'graphs': graphs, 'extraLinks': extraLinks};\n};\n","export function simpleXyCoordinates (pair_table) {\n var INIT_ANGLE=0.; /* initial bending angle */\n var INIT_X = 100.; /* coordinate of first digit */\n var INIT_Y = 100.; /* see above */\n var RADIUS = 15.;\n\n var x = [], y = [];\n\n var i, len;\n var alpha;\n\n len = pair_table[0];\n var angle = Array.apply(null, new Array(len+5)).map(Number.prototype.valueOf,0); \n var loop_size = Array.apply(null, new Array(16+Math.floor(len/5)))\n .map(Number.prototype.valueOf, 0); \n var stack_size = Array.apply(null, new Array(16+Math.floor(len/5)))\n .map(Number.prototype.valueOf, 0); \n\n var lp = 0;\n var stk = 0;\n var PIHALF = Math.PI / 2;\n\n\n var loop = function(i, j, pair_table)\n /* i, j are the positions AFTER the last pair of a stack; i.e\n i-1 and j+1 are paired. */\n {\n var count = 2; /* counts the VERTICES of a loop polygon; that's\n NOT necessarily the number of unpaired bases!\n Upon entry the loop has already 2 vertices, namely\n the pair i-1/j+1. */\n\n var r = 0, bubble = 0; /* bubble counts the unpaired digits in loops */\n\n var i_old, partner, k, l, start_k, start_l, fill, ladder;\n var begin, v, diff;\n var polygon;\n\n var remember = Array.apply(null, new Array((3+Math.floor((j-i)/5)*2))).map(Number.prototype.valueOf, 0);\n\n i_old = i-1, j++; /* j has now been set to the partner of the\n previous pair for correct while-loop\n termination. */\n while (i != j) {\n partner = pair_table[i];\n if ((!partner) || (i==0))\n i++, count++, bubble++;\n else {\n count += 2;\n k = i, l = partner; /* beginning of stack */\n remember[++r] = k;\n remember[++r] = l;\n i = partner+1; /* next i for the current loop */\n\n start_k = k, start_l = l;\n ladder = 0;\n do {\n k++, l--, ladder++; /* go along the stack region */\n }\n while ((pair_table[k] == l) && (pair_table[k] > k));\n\n fill = ladder-2;\n if (ladder >= 2) {\n angle[start_k+1+fill] += PIHALF; /* Loop entries and */\n angle[start_l-1-fill] += PIHALF; /* exits get an */\n angle[start_k] += PIHALF; /* additional PI/2. */\n angle[start_l] += PIHALF; /* Why ? (exercise) */\n if (ladder > 2) {\n for (; fill >= 1; fill--) {\n angle[start_k+fill] = Math.PI; /* fill in the angles */\n angle[start_l-fill] = Math.PI; /* for the backbone */\n }\n }\n }\n stack_size[++stk] = ladder;\n if (k <= l)\n loop(k, l, pair_table);\n }\n }\n\n polygon = Math.PI*(count-2)/count; /* bending angle in loop polygon */\n remember[++r] = j;\n begin = i_old < 0 ? 0 : i_old;\n for (v = 1; v <= r; v++) {\n diff = remember[v]-begin;\n for (fill = 0; fill <= diff; fill++)\n angle[begin+fill] += polygon;\n if (v > r)\n break;\n begin = remember[++v];\n }\n loop_size[++lp] = bubble;\n }\n\n loop(0, len+1, pair_table);\n loop_size[lp] -= 2; /* correct for cheating with function loop */\n\n alpha = INIT_ANGLE;\n x[0] = INIT_X;\n y[0] = INIT_Y;\n\n var poss = [];\n\n poss.push([x[0], y[0]]);\n for (i = 1; i < len; i++) {\n x[i] = x[i-1]+RADIUS*Math.cos(alpha);\n y[i] = y[i-1]+RADIUS*Math.sin(alpha);\n\n poss.push([x[i], y[i]]);\n alpha += Math.PI-angle[i+1];\n }\n\n return poss;\n}\n","export function Radloop() {\n\tthis.radius = null;\n\tthis.loopnumber = null;\n\tthis.next = null;\n this.prev = null;\n}\n\nRadloop.prototype.getRadius = function(){\n\treturn this.radius;\n}\n\nRadloop.prototype.setRadius = function(radius){\n\tthis.radius = radius;\n}\n\nRadloop.prototype.getLoopnumber = function(){\n\treturn this.loopnumber;\n}\n\nRadloop.prototype.setLoopnumber = function(loopnumber){\n\tthis.loopnumber = loopnumber;\n}\n\nRadloop.prototype.getNext = function(){\n\treturn this.next;\n}\n\nRadloop.prototype.setNext = function(next){\n\tthis.next = next;\n}\n\nRadloop.prototype.getPrev = function(){\n\treturn this.prev;\n}\n\nRadloop.prototype.setPrev = function(prev){\n\tthis.prev = prev;\n}\n","import {Region} from './region.js';\n\nexport function Base() {\n\tthis.mate = null;\n\tthis.x = null;\n this.y = null;\n\tthis.extracted = null;\n\tthis.region = new Region();\n}\n\nBase.prototype.getMate = function(){\n\treturn this.mate;\n}\n\nBase.prototype.setMate = function(mate){\n\tthis.mate = mate;\n}\n\nBase.prototype.getX = function(){\n\treturn this.x;\n}\n\nBase.prototype.setX = function(x){\n\tthis.x = x;\n}\n\nBase.prototype.getY = function(){\n\treturn this.y;\n}\n\nBase.prototype.setY = function(y){\n\tthis.y = y;\n}\n\nBase.prototype.isExtracted = function(){\n\treturn this.extracted;\n}\n\nBase.prototype.setExtracted = function(extracted){\n\tthis.extracted = extracted;\n}\n\nBase.prototype.getRegion = function(){\n\treturn this.region;\n}\n\nBase.prototype.setRegion = function(region){\n\tthis.region = region;\n}\n","import {Radloop} from './radloop.js';\nimport {Connection} from './connection.js';\nimport {Region} from './region.js';\nimport {Base} from './base.js';\nimport {Loop} from './loop.js';\n\nexport function NAView(){\n this.ANUM = 9999.0;\n\tthis.MAXITER = 500;\n\n\tthis.bases = [];\n\tthis.nbase = null;\n this.nregion = null;\n this.loop_count = null;\n\n\tthis.root = new Loop();\n\tthis.loops = [];\n\n\tthis.regions = [];\n\n\tthis.rlphead = new Radloop();\n\n\tthis.lencut = 0.8;\n\tthis.RADIUS_REDUCTION_FACTOR = 1.4;\n\n\t// show algorithm step by step\n\tthis.angleinc = null;\n\n\tthis._h = null;\n\n\t// private boolean noIterationFailureYet = true;\n\n\tthis.HELIX_FACTOR = 0.6;\n\tthis.BACKBONE_DISTANCE = 27;\n}\n\nNAView.prototype.naview_xy_coordinates = function(pair_table){\n var x = [];\n\tvar y = [];\n if (pair_table.length === 0 || pair_table[0] === 0){\n return 0;\n }\n var i;\n this.nbase = pair_table[0];\n this.bases = [];\n for (var index = 0; index < this.nbase + 1; index++){\n this.bases.push(new Base());\n }\n this.regions = [];\n for (var index = 0; index < this.nbase + 1; index++){\n this.regions.push(new Region());\n }\n this.read_in_bases(pair_table);\n this.rlphead = null;\n this.find_regions();\n this.loop_count = 0;\n this.loops = [];\n for (var index = 0; index < this.nbase + 1; index++){\n this.loops.push(new Loop());\n }\n this.construct_loop(0);\n this.find_central_loop();\n this.traverse_loop(this.root, null);\n\n for (i = 0; i < this.nbase; i++){\n x.push(100 + this.BACKBONE_DISTANCE * this.bases[i + 1].getX());\n y.push(100 + this.BACKBONE_DISTANCE * this.bases[i + 1].getY());\n }\n\n return {\n nbase: this.nbase,\n x: x,\n y: y\n }\n}\n\nNAView.prototype.read_in_bases = function read_in_bases(pair_table){\n var i = null;\n var npairs = null;\n\n // Set up an origin.\n this.bases.push(new Base());\n this.bases[0].setMate(0);\n this.bases[0].setExtracted(false);\n this.bases[0].setX(this.ANUM);\n this.bases[0].setY(this.ANUM);\n\n for (npairs = 0, i = 1; i <= this.nbase; i++){\n this.bases.push(new Base());\n this.bases[i].setExtracted(false);\n this.bases[i].setX(this.ANUM);\n this.bases[i].setY(this.ANUM);\n this.bases[i].setMate(pair_table[i]);\n if (pair_table[i] > i)\n npairs++;\n }\n // must have at least 1 pair to avoid segfault\n if (npairs == 0){\n this.bases[1].setMate(this.nbase);\n this.bases[this.nbase].setMate(1);\n }\n}\n\nNAView.prototype.find_regions = function find_regions(){\n var i = null;\n var mate = null;\n var nb1 = null;\n\n nb1 = this.nbase + 1;\n var mark = [];\n for (i = 0; i < nb1; i++){\n mark.push(false);\n }\n this.nregion = 0;\n for (i = 0; i <= this.nbase; i++) {\n if ((mate = this.bases[i].getMate()) != 0 && !mark[i]) {\n this.regions[this.nregion].setStart1(i);\n this.regions[this.nregion].setEnd2(mate);\n mark[i] = true;\n mark[mate] = true;\n this.bases[i].setRegion(this.regions[this.nregion]);\n this.bases[mate].setRegion(this.regions[this.nregion]);\n for (i++, mate--; i < mate && this.bases[i].getMate() == mate; i++, mate--) {\n mark[mate] = true;\n mark[i]= true;\n this.bases[i].setRegion(this.regions[this.nregion]);\n this.bases[mate].setRegion(this.regions[this.nregion]);\n }\n this.regions[this.nregion].setEnd1(--i);\n this.regions[this.nregion].setStart2(mate + 1);\n\n this.nregion++;\n }\n }\n}\n\nNAView.prototype.construct_loop = function construct_loop(ibase){\n var i = null;\n var mate = null;\n var retloop = new Loop();\n var lp = new Loop();\n var cp = new Connection();\n var rp = new Region();\n var rlp = new Radloop();\n retloop = this.loops[this.loop_count++];\n retloop.setNconnection(0);\n retloop.setDepth(0);\n retloop.setNumber(this.loop_count);\n retloop.setRadius(0.0);\n\n for (rlp = this.rlphead; rlp != null; rlp = rlp.getNext())\n if (rlp.getLoopnumber() == this.loop_count)\n retloop.setRadius(rlp.getRadius());\n i = ibase;\n do {\n if ((mate = this.bases[i].getMate()) != 0) {\n rp = this.bases[i].getRegion();\n if (!this.bases[rp.getStart1()].isExtracted()) {\n if (i == rp.getStart1()) {\n this.bases[rp.getStart1()].setExtracted(true);\n this.bases[rp.getEnd1()].setExtracted(true);\n this.bases[rp.getStart2()].setExtracted(true);\n this.bases[rp.getEnd2()].setExtracted(true);\n lp = this.construct_loop(rp.getEnd1() < this.nbase ? rp.getEnd1() + 1\n : 0);\n } else if (i == rp.getStart2()) {\n this.bases[rp.getStart2()].setExtracted(true);\n this.bases[rp.getEnd2()].setExtracted(true);\n this.bases[rp.getStart1()].setExtracted(true);\n this.bases[rp.getEnd1()].setExtracted(true);\n lp = this.construct_loop(rp.getEnd2() < this.nbase ? rp.getEnd2() + 1\n : 0);\n } else {\n console.log(\"Something went terribly wrong ....\");\n }\n retloop.setNconnection(retloop.getNconnection() + 1);\n cp = new Connection();\n retloop.setConnection(retloop.getNconnection() - 1,\tcp);\n retloop.setConnection(retloop.getNconnection(), null);\n cp.setLoop(lp);\n cp.setRegion(rp);\n if(i == rp.getStart1()) {\n cp.setStart(rp.getStart1());\n cp.setEnd(rp.getEnd2());\n } else {\n cp.setStart(rp.getStart2());\n cp.setEnd(rp.getEnd1());\n }\n cp.setExtruded(false);\n cp.setBroken(false);\n lp.setNconnection(lp.getNconnection() + 1);\n cp = new Connection();\n lp.setConnection(lp.getNconnection() - 1, cp);\n lp.setConnection(lp.getNconnection(), null);\n cp.setLoop(retloop);\n cp.setRegion(rp);\n if (i == rp.getStart1()) {\n cp.setStart(rp.getStart2());\n cp.setEnd(rp.getEnd1());\n } else {\n cp.setStart(rp.getStart1());\n cp.setEnd(rp.getEnd2());\n }\n cp.setExtruded(false);\n cp.setBroken(false);\n }\n i = mate;\n }\n if (++i > this.nbase)\n i = 0;\n } while (i != ibase);\n return retloop;\n}\n\nNAView.prototype.find_central_loop = function find_central_loop(){\n var lp = new Loop();\n var maxconn = null;\n var maxdepth = null;\n var i = null;\n\n determine_depths.bind(this)();\n maxconn = 0;\n maxdepth = -1;\n for (i = 0; i < this.loop_count; i++) {\n lp = this.loops[i];\n if (lp.getNconnection() > maxconn) {\n maxdepth = lp.getDepth();\n maxconn = lp.getNconnection();\n this.root = lp;\n } else if (lp.getDepth() > maxdepth\n && lp.getNconnection() == maxconn) {\n maxdepth = lp.getDepth();\n this.root = lp;\n }\n }\n}\n\nfunction determine_depths() {\n var lp = new Loop();\n var i = null;\n var j = null;\n\n for (i = 0; i < this.loop_count; i++) {\n lp = this.loops[i];\n for (j = 0; j < this.loop_count; j++){\n this.loops[j].setMark(false);\n }\n lp.setDepth(depth(lp));\n }\n}\n\nfunction depth(lp){\n var count = null;\n var ret = null;\n var d = null;\n\n if (lp.getNconnection() <= 1){\n return 0;\n }\n if (lp.isMark()){\n return -1;\n }\n lp.setMark(true);\n count = 0;\n ret = 0;\n for (var i = 0; lp.getConnection(i) != null; i++) {\n d = depth(lp.getConnection(i).getLoop());\n if (d >= 0) {\n if (++count == 1){\n ret = d;\n }\n else if (ret > d){\n ret = d;\n }\n }\n }\n lp.setMark(false);\n return ret + 1;\n}\n\nNAView.prototype.traverse_loop = function traverse_loop(lp, anchor_connection){\n var xs, ys, xe, ye, xn, yn, angleinc, r;\n var radius, xc, yc, xo, yo, astart, aend, a;\n var cp, cpnext, acp, cpprev;\n var i, j, n, ic;\n var da, maxang;\n var count, icstart, icend, icmiddle, icroot;\n var done, done_all_connections, rooted;\n var sign;\n var midx, midy, nrx, nry, mx, my, vx, vy, dotmv, nmidx, nmidy;\n var icstart1, icup, icdown, icnext, direction;\n var dan, dx, dy, rr;\n var cpx, cpy, cpnextx, cpnexty, cnx, cny, rcn, rc, lnx, lny, rl, ac, acn, sx, sy, dcp;\n var imaxloop = 0;\n\n angleinc = 2 * Math.PI / (this.nbase + 1);\n acp = null;\n icroot = -1;\n var indice = 0;\n\n for (ic = 0; (cp = lp.getConnection(indice)) != null; indice++, ic++) {\n xs = -Math.sin(angleinc * cp.getStart());\n ys = Math.cos(angleinc * cp.getStart());\n xe = -Math.sin(angleinc * cp.getEnd());\n ye = Math.cos(angleinc * cp.getEnd());\n xn = ye - ys;\n yn = xs - xe;\n r = Math.sqrt(xn * xn + yn * yn);\n cp.setXrad(xn / r);\n cp.setYrad(yn / r);\n cp.setAngle(Math.atan2(yn, xn));\n if (cp.getAngle() < 0.0){\n cp.setAngle(cp.getAngle() + 2 * Math.PI);\n }\n if (anchor_connection != null\n && anchor_connection.getRegion() == cp.getRegion()) {\n acp = cp;\n icroot = ic;\n }\n }\n set_radius: while (true) {\n this.determine_radius(lp, this.lencut);\n radius = lp.getRadius()/this.RADIUS_REDUCTION_FACTOR;\n if (anchor_connection == null){\n xc = yc = 0.0;\n }\n else {\n xo = (this.bases[acp.getStart()].getX() + this.bases\n [acp.getEnd()].getX()) / 2.0;\n yo = (this.bases[acp.getStart()].getY() + this.bases\n [acp.getEnd()].getY()) / 2.0;\n xc = xo - radius * acp.getXrad();\n yc = yo - radius * acp.getYrad();\n }\n\n // The construction of the connectors will proceed in blocks of\n // connected connectors, where a connected connector pairs means two\n // connectors that are forced out of the drawn circle because they\n // are too close together in angle.\n\n // First, find the start of a block of connected connectors\n\n if (icroot == -1){\n icstart = 0;\n }\n else {\n icstart = icroot;\n }\n cp = lp.getConnection(icstart);\n count = 0;\n done = false;\n do {\n j = icstart - 1;\n if (j < 0){\n j = lp.getNconnection() - 1;\n }\n cpprev = lp.getConnection(j);\n if (!this.connected_connection(cpprev, cp)) {\n done = true;\n }\n else {\n icstart = j;\n cp = cpprev;\n }\n if (++count > lp.getNconnection()) {\n // Here everything is connected. Break on maximum angular\n // separation between connections.\n maxang = -1.0;\n for (ic = 0; ic < lp.getNconnection(); ic++) {\n j = ic + 1;\n if (j >= lp.getNconnection()){\n j = 0;\n }\n cp = lp.getConnection(ic);\n cpnext = lp.getConnection(j);\n ac = cpnext.getAngle() - cp.getAngle();\n if (ac < 0.0){\n ac += 2 * Math.PI;\n }\n if (ac > maxang) {\n maxang = ac;\n imaxloop = ic;\n }\n }\n icend = imaxloop;\n icstart = imaxloop + 1;\n if (icstart >= lp.getNconnection()){\n icstart = 0;\n }\n cp = lp.getConnection(icend);\n cp.setBroken(true);\n done = true;\n }\n } while (!done);\n done_all_connections = false;\n icstart1 = icstart;\n while (!done_all_connections) {\n count = 0;\n done = false;\n icend = icstart;\n rooted = false;\n while (!done) {\n cp = lp.getConnection(icend);\n if (icend == icroot){\n rooted = true;\n }\n j = icend + 1;\n if (j >= lp.getNconnection()) {\n j = 0;\n }\n cpnext = lp.getConnection(j);\n if (this.connected_connection(cp, cpnext)) {\n if (++count >= lp.getNconnection()){\n break;\n }\n icend = j;\n }\n else {\n done = true;\n }\n }\n icmiddle = this.find_ic_middle(icstart, icend, anchor_connection,\n acp, lp);\n ic = icup = icdown = icmiddle;\n done = false;\n direction = 0;\n while (!done) {\n if (direction < 0) {\n ic = icup;\n }\n else if (direction == 0) {\n ic = icmiddle;\n }\n else {\n ic = icdown;\n }\n if (ic >= 0) {\n cp = lp.getConnection(ic);\n if (anchor_connection == null || acp != cp) {\n if (direction == 0) {\n astart = cp.getAngle()\n - Math.asin(1.0 / 2.0 / radius);\n aend = cp.getAngle()\n + Math.asin(1.0 / 2.0 / radius);\n this.bases[cp.getStart()].setX(\n xc + radius * Math.cos(astart));\n this.bases[cp.getStart()].setY(\n yc + radius * Math.sin(astart));\n this.bases[cp.getEnd()].setX(\n xc + radius * Math.cos(aend));\n this.bases[cp.getEnd()].setY(\n yc + radius * Math.sin(aend));\n }\n else if (direction < 0) {\n j = ic + 1;\n if (j >= lp.getNconnection()){\n j = 0;\n }\n cp = lp.getConnection(ic);\n cpnext = lp.getConnection(j);\n cpx = cp.getXrad();\n cpy = cp.getYrad();\n ac = (cp.getAngle() + cpnext.getAngle()) / 2.0;\n if (cp.getAngle() > cpnext.getAngle()){\n ac -= Math.PI;\n }\n cnx = Math.cos(ac);\n cny = Math.sin(ac);\n lnx = cny;\n lny = -cnx;\n da = cpnext.getAngle() - cp.getAngle();\n if (da < 0.0){\n da += 2 * Math.PI;\n }\n if (cp.isExtruded()) {\n if (da <= Math.PI / 2){\n rl = 2.0;\n }\n else {\n rl = 1.5;\n }\n }\n else {\n rl = 1.0;\n }\n this.bases[cp.getEnd()].setX(\n this.bases[cpnext.getStart()].getX()\n + rl * lnx);\n this.bases[cp.getEnd()].setY(\n this.bases[cpnext.getStart()].getY()\n + rl * lny);\n this.bases[cp.getStart()].setX(\n this.bases[cp.getEnd()].getX() + cpy);\n this.bases[cp.getStart()].setY(\n this.bases[cp.getEnd()].getY() - cpx);\n } else {\n j = ic - 1;\n if (j < 0){\n j = lp.getNconnection() - 1;\n }\n cp = lp.getConnection(j);\n cpnext = lp.getConnection(ic);\n cpnextx = cpnext.getXrad();\n cpnexty = cpnext.getYrad();\n ac = (cp.getAngle() + cpnext.getAngle()) / 2.0;\n if (cp.getAngle() > cpnext.getAngle()){\n ac -= Math.PI;\n }\n cnx = Math.cos(ac);\n cny = Math.sin(ac);\n lnx = -cny;\n lny = cnx;\n da = cpnext.getAngle() - cp.getAngle();\n if (da < 0.0){\n da += 2 * Math.PI;\n }\n if (cp.isExtruded()) {\n if (da <= Math.PI / 2){\n rl = 2.0;\n }\n else {\n rl = 1.5;\n }\n }\n else {\n rl = 1.0;\n }\n this.bases[cpnext.getStart()].setX(\n this.bases[cp.getEnd()].getX() + rl\n * lnx);\n this.bases[cpnext.getStart()].setY(\n this.bases[cp.getEnd()].getY() + rl\n * lny);\n this.bases[cpnext.getEnd()].setX(\n this.bases[cpnext.getStart()].getX()\n - cpnexty);\n this.bases[cpnext.getEnd()].setY(\n this.bases[cpnext.getStart()].getY()\n + cpnextx);\n }\n }\n }\n if (direction < 0) {\n if (icdown == icend) {\n icdown = -1;\n }\n else if (icdown >= 0) {\n if (++icdown >= lp.getNconnection()) {\n icdown = 0;\n }\n }\n direction = 1;\n }\n else {\n if (icup == icstart){\n icup = -1;\n }\n else if (icup >= 0) {\n if (--icup < 0) {\n icup = lp.getNconnection() - 1;\n }\n }\n direction = -1;\n }\n done = icup == -1 && icdown == -1;\n }\n icnext = icend + 1;\n if (icnext >= lp.getNconnection()){\n icnext = 0;\n }\n if (icend != icstart\n && (!(icstart == icstart1 && icnext == icstart1))) {\n\n // Move the bases just constructed (or the radius) so that\n // the bisector of the end points is radius distance away\n // from the loop center.\n\n cp = lp.getConnection(icstart);\n cpnext = lp.getConnection(icend);\n dx = this.bases[cpnext.getEnd()].getX()\n - this.bases[cp.getStart()].getX();\n dy = this.bases[cpnext.getEnd()].getY()\n - this.bases[cp.getStart()].getY();\n midx = this.bases[cp.getStart()].getX() + dx / 2.0;\n midy = this.bases[cp.getStart()].getY() + dy / 2.0;\n rr = Math.sqrt(dx * dx + dy * dy);\n mx = dx / rr;\n my = dy / rr;\n vx = xc - midx;\n vy = yc - midy;\n rr = Math.sqrt(dx * dx + dy * dy);\n vx /= rr;\n vy /= rr;\n dotmv = vx * mx + vy * my;\n nrx = dotmv * mx - vx;\n nry = dotmv * my - vy;\n rr = Math.sqrt(nrx * nrx + nry * nry);\n nrx /= rr;\n nry /= rr;\n\n // Determine which side of the bisector the center should\n // be.\n\n dx = this.bases[cp.getStart()].getX() - xc;\n dy = this.bases[cp.getStart()].getY() - yc;\n ac = Math.atan2(dy, dx);\n if (ac < 0.0){\n ac += 2 * Math.PI;\n }\n dx = this.bases[cpnext.getEnd()].getX() - xc;\n dy = this.bases[cpnext.getEnd()].getY() - yc;\n acn = Math.atan2(dy, dx);\n if (acn < 0.0){\n acn += 2 * Math.PI;\n }\n if (acn < ac){\n acn += 2 * Math.PI;\n }\n if (acn - ac > Math.PI){\n sign = -1;\n }\n else {\n sign = 1;\n }\n nmidx = xc + sign * radius * nrx;\n nmidy = yc + sign * radius * nry;\n if (rooted) {\n xc -= nmidx - midx;\n yc -= nmidy - midy;\n }\n else {\n for (ic = icstart;;) {\n cp = lp.getConnection(ic);\n i = cp.getStart();\n this.bases[i].setX(\n this.bases[i].getX() + nmidx - midx);\n this.bases[i].setY(\n this.bases[i].getY() + nmidy - midy);\n i = cp.getEnd();\n this.bases[i].setX(\n this.bases[i].getX() + nmidx - midx);\n this.bases[i].setY(\n this.bases[i].getY() + nmidy - midy);\n if (ic == icend){\n break;\n }\n if (++ic >= lp.getNconnection()){\n ic = 0;\n }\n }\n }\n }\n icstart = icnext;\n done_all_connections = icstart == icstart1;\n }\n for (ic = 0; ic < lp.getNconnection(); ic++) {\n cp = lp.getConnection(ic);\n j = ic + 1;\n if (j >= lp.getNconnection()){\n j = 0;\n }\n cpnext = lp.getConnection(j);\n dx = this.bases[cp.getEnd()].getX() - xc;\n dy = this.bases[cp.getEnd()].getY() - yc;\n rc = Math.sqrt(dx * dx + dy * dy);\n ac = Math.atan2(dy, dx);\n if (ac < 0.0){\n ac += 2 * Math.PI;\n }\n dx = this.bases[cpnext.getStart()].getX() - xc;\n dy = this.bases[cpnext.getStart()].getY() - yc;\n rcn = Math.sqrt(dx * dx + dy * dy);\n acn = Math.atan2(dy, dx);\n if (acn < 0.0){\n acn += 2 * Math.PI;\n }\n if (acn < ac){\n acn += 2 * Math.PI;\n }\n dan = acn - ac;\n dcp = cpnext.getAngle() - cp.getAngle();\n if (dcp <= 0.0){\n dcp += 2 * Math.PI;\n }\n if (Math.abs(dan - dcp) > Math.PI) {\n if (cp.isExtruded()) {\n console.log(\"Warning from traverse_loop. Loop \"\n + lp.getNumber() + \" has crossed regions\\n\");\n }\n else if ((cpnext.getStart() - cp.getEnd()) != 1) {\n cp.setExtruded(true);\n continue set_radius; // remplacement du goto\n }\n }\n if (cp.isExtruded()) {\n this.construct_extruded_segment(cp, cpnext);\n }\n else {\n n = cpnext.getStart() - cp.getEnd();\n if (n < 0){\n n += this.nbase + 1;\n }\n angleinc = dan / n;\n for (j = 1; j < n; j++) {\n i = cp.getEnd() + j;\n if (i > this.nbase){\n i -= this.nbase + 1;\n }\n a = ac + j * angleinc;\n rr = rc + (rcn - rc) * (a - ac) / dan;\n this.bases[i].setX(xc + rr * Math.cos(a));\n this.bases[i].setY(yc + rr * Math.sin(a));\n }\n }\n }\n break;\n }\n for (ic = 0; ic < lp.getNconnection(); ic++) {\n if (icroot != ic) {\n cp = lp.getConnection(ic);\n //IM HERE\n this.generate_region(cp);\n this.traverse_loop(cp.getLoop(), cp);\n }\n }\n n = 0;\n sx = 0.0;\n sy = 0.0;\n for (ic = 0; ic < lp.getNconnection(); ic++) {\n j = ic + 1;\n if (j >= lp.getNconnection()){\n j = 0;\n }\n cp = lp.getConnection(ic);\n cpnext = lp.getConnection(j);\n n += 2;\n sx += this.bases[cp.getStart()].getX()\n + this.bases[cp.getEnd()].getX();\n sy += this.bases[cp.getStart()].getY()\n + this.bases[cp.getEnd()].getY();\n if (!cp.isExtruded()) {\n for (j = cp.getEnd() + 1; j != cpnext.getStart(); j++) {\n if (j > this.nbase){\n j -= this.nbase + 1;\n }\n n++;\n sx += this.bases[j].getX();\n sy += this.bases[j].getY();\n }\n }\n }\n lp.setX(sx / n);\n lp.setY(sy / n);\n}\n\nNAView.prototype.determine_radius = function determine_radius(lp, lencut){\n var mindit, ci, dt, sumn, sumd, radius, dit;\n var i, j, end, start, imindit = 0;\n var cp = new Connection(), cpnext = new Connection();\n var rt2_2 = 0.7071068;\n\n do {\n mindit = 1.0e10;\n for (sumd = 0.0, sumn = 0.0, i = 0; i < lp.getNconnection(); i++) {\n cp = lp.getConnection(i);\n j = i + 1;\n if (j >= lp.getNconnection()){\n j = 0;\n }\n cpnext = lp.getConnection(j);\n end = cp.getEnd();\n start = cpnext.getStart();\n if (start < end){\n start += this.nbase + 1;\n }\n dt = cpnext.getAngle() - cp.getAngle();\n if (dt <= 0.0){\n dt += 2 * Math.PI;\n }\n if (!cp.isExtruded()){\n ci = start - end;\n }\n else {\n if (dt <= Math.PI / 2){\n ci = 2.0;\n }\n else {\n ci = 1.5;\n }\n }\n sumn += dt * (1.0 / ci + 1.0);\n sumd += dt * dt / ci;\n dit = dt / ci;\n if (dit < mindit && !cp.isExtruded() && ci > 1.0) {\n mindit = dit;\n imindit = i;\n }\n }\n radius = sumn / sumd;\n if (radius < rt2_2){\n radius = rt2_2;\n }\n if (mindit * radius < lencut) {\n lp.getConnection(imindit).setExtruded(true);\n }\n } while (mindit * radius < lencut);\n if (lp.getRadius() > 0.0){\n radius = lp.getRadius();\n }\n else {\n lp.setRadius(radius);\n }\n}\n\nNAView.prototype.find_ic_middle = function find_ic_middle(icstart, icend, anchor_connection, acp, lp){\n var count, ret, ic, i;\n var done;\n\n count = 0;\n ret = -1;\n ic = icstart;\n done = false;\n while (!done) {\n if (count++ > lp.getNconnection() * 2) {\n console.log(\"Infinite loop in 'find_ic_middle'\");\n }\n if (anchor_connection != null && lp.getConnection(ic) == acp) {\n ret = ic;\n }\n done = ic == icend;\n if (++ic >= lp.getNconnection()) {\n ic = 0;\n }\n }\n if (ret == -1) {\n for (i = 1, ic = icstart; i < (count + 1) / 2; i++) {\n if (++ic >= lp.getNconnection())\n ic = 0;\n }\n ret = ic;\n }\n return ret;\n}\n\nNAView.prototype.construct_extruded_segment = function construct_extruded_segment(cp, cpnext){\n var astart, aend1, aend2, aave, dx, dy, a1, a2, ac, rr, da, dac;\n var start, end, n, nstart, nend;\n var collision;\n\n astart = cp.getAngle();\n aend2 = aend1 = cpnext.getAngle();\n if (aend2 < astart){\n aend2 += 2 * Math.PI;\n }\n aave = (astart + aend2) / 2.0;\n start = cp.getEnd();\n end = cpnext.getStart();\n n = end - start;\n if (n < 0){\n n += this.nbase + 1;\n }\n da = cpnext.getAngle() - cp.getAngle();\n if (da < 0.0) {\n da += 2 * Math.PI;\n }\n if (n == 2) {\n this.construct_circle_segment(start, end);\n }\n else {\n dx = this.bases[end].getX() - this.bases[start].getX();\n dy = this.bases[end].getY() - this.bases[start].getY();\n rr = Math.sqrt(dx * dx + dy * dy);\n dx /= rr;\n dy /= rr;\n if (rr >= 1.5 && da <= Math.PI / 2) {\n nstart = start + 1;\n if (nstart > this.nbase){\n nstart -= this.nbase + 1;\n }\n nend = end - 1;\n if (nend < 0){\n nend += this.nbase + 1;\n }\n this.bases[nstart].setX(this.bases[start].getX() + 0.5 * dx);\n this.bases[nstart].setY(this.bases[start].getY() + 0.5 * dy);\n this.bases[nend].setX(this.bases[end].getX() - 0.5 * dx);\n this.bases[nend].setY(this.bases[end].getY() - 0.5 * dy);\n start = nstart;\n end = nend;\n }\n do {\n collision = false;\n this.construct_circle_segment(start, end);\n nstart = start + 1;\n if (nstart > this.nbase) {\n nstart -= this.nbase + 1;\n }\n dx = this.bases[nstart].getX() - this.bases[start].getX();\n dy = this.bases[nstart].getY() - this.bases[start].getY();\n a1 = Math.atan2(dy, dx);\n if (a1 < 0.0){\n a1 += 2 * Math.PI;\n }\n dac = a1 - astart;\n if (dac < 0.0){\n dac += 2 * Math.PI;\n }\n if (dac > Math.PI){\n collision = true;\n }\n nend = end - 1;\n if (nend < 0){\n nend += this.nbase + 1;\n }\n dx = this.bases[nend].getX() - this.bases[end].getX();\n dy = this.bases[nend].getY() - this.bases[end].getY();\n a2 = Math.atan2(dy, dx);\n if (a2 < 0.0){\n a2 += 2 * Math.PI;\n }\n dac = aend1 - a2;\n if (dac < 0.0){\n dac += 2 * Math.PI;\n }\n if (dac > Math.PI){\n collision = true;\n }\n if (collision) {\n ac = this.minf2(aave, astart + 0.5);\n this.bases[nstart].setX(\n this.bases[start].getX() + Math.cos(ac));\n this.bases[nstart].setY(\n this.bases[start].getY() + Math.sin(ac));\n start = nstart;\n ac = this.maxf2(aave, aend2 - 0.5);\n this.bases[nend].setX(this.bases[end].getX() + Math.cos(ac));\n this.bases[nend].setY(this.bases[end].getY() + Math.sin(ac));\n end = nend;\n n -= 2;\n }\n } while (collision && n > 1);\n }\n}\n\nNAView.prototype.construct_circle_segment = function construct_circle_segment(start, end){\n var dx, dy, rr, midx, midy, xn, yn, nrx, nry, mx, my, a;\n var l, j, i;\n\n dx = this.bases[end].getX() - this.bases[start].getX();\n dy = this.bases[end].getY() - this.bases[start].getY();\n rr = Math.sqrt(dx * dx + dy * dy);\n l = end - start;\n if (l < 0){\n l += this.nbase + 1;\n }\n if (rr >= l) {\n dx /= rr;\n dy /= rr;\n for (j = 1; j < l; j++) {\n i = start + j;\n if (i > this.nbase){\n i -= this.nbase + 1;\n }\n this.bases[i].setX(\n this.bases[start].getX() + dx * j / l);\n this.bases[i].setY(\n this.bases[start].getY() + dy * j / l);\n }\n }\n else {\n this.find_center_for_arc((l - 1), rr);\n dx /= rr;\n dy /= rr;\n midx = this.bases[start].getX() + dx * rr / 2.0;\n midy = this.bases[start].getY() + dy * rr / 2.0;\n xn = dy;\n yn = -dx;\n nrx = midx + this._h * xn;\n nry = midy + this._h * yn;\n mx = this.bases[start].getX() - nrx;\n my = this.bases[start].getY() - nry;\n rr = Math.sqrt(mx * mx + my * my);\n a = Math.atan2(my, mx);\n for (j = 1; j < l; j++) {\n i = start + j;\n if (i > this.nbase){\n i -= this.nbase + 1;\n }\n this.bases[i].setX(nrx + rr * Math.cos(a + j * this.angleinc));\n this.bases[i].setY(nry + rr * Math.sin(a + j * this.angleinc));\n }\n }\n}\n\nNAView.prototype.find_center_for_arc = function find_center_for_arc(n, b){\n var h, hhi, hlow, r, disc, theta, e, phi;\n var iter;\n\n hhi = (n + 1.0) / Math.PI;\n // changed to prevent div by zero if (ih)\n hlow = -hhi - b / (n + 1.000001 - b);\n if (b < 1){\n // otherwise we might fail below (ih)\n hlow = 0;\n }\n iter = 0;\n do {\n h = (hhi + hlow) / 2.0;\n r = Math.sqrt(h * h + b * b / 4.0);\n disc = 1.0 - 0.5 / (r * r);\n if (Math.abs(disc) > 1.0) {\n console.log(\"Unexpected large magnitude discriminant = \" + disc\n + \" \" + r);\n }\n theta = Math.acos(disc);\n phi = Math.acos(h / r);\n e = theta * (n + 1) + 2 * phi - 2 * Math.PI;\n if (e > 0.0) {\n hlow = h;\n }\n else {\n hhi = h;\n }\n } while (Math.abs(e) > 0.0001 && ++iter < this.MAXITER);\n if (iter >= this.MAXITER) {\n if (noIterationFailureYet) {\n console.log(\"Iteration failed in find_center_for_arc\");\n noIterationFailureYet = false;\n }\n h = 0.0;\n theta = 0.0;\n }\n this._h = h;\n this.angleinc = theta;\n}\n\nNAView.prototype.generate_region = function generate_region(cp){\n var l, start, end, i, mate;\n var rp;\n\n rp = cp.getRegion();\n l = 0;\n if (cp.getStart() == rp.getStart1()) {\n start = rp.getStart1();\n end = rp.getEnd1();\n }\n else {\n start = rp.getStart2();\n end = rp.getEnd2();\n }\n if (this.bases[cp.getStart()].getX() > this.ANUM - 100.0\n || this.bases[cp.getEnd()].getX() > this.ANUM - 100.0) {\n console.log(\n \"Bad region passed to generate_region. Coordinates not defined.\");\n }\n for (i = start + 1; i <= end; i++) {\n l++;\n this.bases[i].setX(\n this.bases[cp.getStart()].getX() + this.HELIX_FACTOR * l\n * cp.getXrad());\n this.bases[i].setY(\n this.bases[cp.getStart()].getY() + this.HELIX_FACTOR * l\n * cp.getYrad());\n mate = this.bases[i].getMate();\n this.bases[mate].setX(\n this.bases[cp.getEnd()].getX() + this.HELIX_FACTOR * l\n * cp.getXrad());\n this.bases[mate].setY(\n this.bases[cp.getEnd()].getY() + this.HELIX_FACTOR * l\n * cp.getYrad());\n\n }\n}\n\nNAView.prototype.minf2 = function minf2(x1, x2) {\n return ((x1) < (x2)) ? (x1) : (x2);\n}\n\nNAView.prototype.maxf2 = function maxf2(x1, x2) {\n return ((x1) > (x2)) ? (x1) : (x2);\n}\n\nNAView.prototype.connected_connection = function connected_connection(cp, cpnext) {\n if (cp.isExtruded()) {\n return true;\n }\n else if (cp.getEnd() + 1 == cpnext.getStart()) {\n return true;\n }\n else {\n return false;\n }\n}\n","/* Version: 0.2\n* Date: 2015-03-15\n*/\n\nimport fstyle from './fornac.css';\n\nimport d3 from 'd3';\nimport slugid from 'slugid';\nimport {contextMenu} from './d3-context-menu.js';\n\nimport {RNAGraph} from './rnagraph.js';\nimport {ColorScheme, rnaUtilities} from './rnautils.js';\n\nimport {simpleXyCoordinates} from './simplernaplot.js';\nimport {NAView} from './naview/naview.js';\n\nexport function FornaContainer(element, passedOptions = {}) {\n var self = this;\n\n let options = {\n 'editable': false,\n 'zoomable': true,\n 'animation': true,\n 'displayAllLinks': false,\n 'labelInterval': 10,\n 'chargeDistance': 110,\n 'friction': 0.35,\n 'middleCharge': -30,\n 'otherCharge': -30,\n 'linkDistanceMultiplier': 15,\n 'initialSize': null,\n 'layout': 'standard-polygonal',\n 'transitionDuration': 500,\n 'maxNodeRadius': 80 // the maximum radius of a node when the view is centered\n };\n\n self.options = Object.assign(options, passedOptions);\n\n if (self.options.initialSize !== null) {\n self.options.svgW = self.options.initialSize[0];\n self.options.svgH = self.options.initialSize[1];\n } else {\n self.options.svgW = 300;\n self.options.svgH = 300;\n }\n\n self.linkStrengths = {\n 'pseudoknot': 0.00,\n 'proteinChain': 0.00,\n 'chainChain': 0.00,\n 'intermolecule': 10.00,\n 'external': 0.00,\n 'other': 10.00\n };\n\n self.displayParameters = {\n 'displayNumbering': true,\n 'displayNodeOutline': true,\n 'displayNodeLabel': true,\n 'displayLinks': true,\n 'displayPseudoknotLinks': true,\n 'displayProteinLinks': true,\n 'displayDirectionArrows': true\n };\n\n self.colorScheme = 'structure';\n self.customColors = {};\n self.rnas = {};\n self.extraLinks = []; //store links between different RNAs\n\n // global mouse event vars\n var mousedownLink = null,\n mousedownNode = null,\n mouseupNode = null;\n let linkContextMenuShown = false;\n\n let resetMouseVars = () => {\n mousedownNode = null;\n mouseupNode = null;\n mousedownLink = null;\n }\n\n var graph = self.graph = {\n 'nodes':[],\n 'links':[]\n };\n\n Array.prototype.equals = function (array) {\n // if the other array is a falsy value, return\n if (!array)\n return false;\n\n // compare lengths - can save a lot of time\n if (this.length != array.length)\n return false;\n\n for (var i = 0, l=this.length; i < l; i++) {\n // Check if we have nested arrays\n if (this[i] instanceof Array && array[i] instanceof Array) {\n // recurse into the nested arrays\n if (!this[i].equals(array[i]))\n return false;\n }\n else if (this[i] != array[i]) {\n // Warning - two different object instances will never be equal: {x:20} != {x:20}\n return false;\n }\n }\n return true;\n };\n\n /* Register global mouse and key events */\n if (self.options.editable || self.options.animation) {\n var shiftKeydown = false;\n var ctrlKeydown = false;\n\n let keydown = () => {\n switch (d3.event.keyCode) {\n case 68: //'d' key\n console.log('dotbracket:', self.getStructuresDotBracket());\n break;\n case 16:\n shiftKeydown = true;\n break;\n case 17:\n ctrlKeydown = true;\n break;\n case 67: //c\n self.centerView();\n break;\n }\n\n if (ctrlKeydown) {\n // Ctrl key must disable panning and zooming\n if (self.options.zoomable)\n disableZooming()\n // Ctrl Button must enable crosshair and start brusher\n if (self.options.editable || self.options.animation) {\n enableBrushing()\n }\n }\n }\n\n let keyup = () => {\n shiftKeydown = false;\n ctrlKeydown = false;\n\n // enable zoomer\n if (self.options.zoomable)\n enableZooming()\n // disable brushing events\n disableBrushing()\n }\n\n d3.select('body')\n .on('keydown', keydown)\n .on('keyup', keyup)\n .on('contextmenu', function() {\n d3.event.preventDefault();\n });\n }\n\n /* Register global context menu */\n if (self.options.editable) {\n let backgroundMenu = [\n {\n title: 'Add Node',\n action: function(elm, d, i, mousePos) {\n\n },\n children: [{\n 'title': 'A',\n action: function(elm, d, i, mousePos) {\n console.log('mousePos:', mousePos, self.options.svgW, self.options.svgH);\n let canvasMousePos = [xScale.invert(mousePos[0]),\n yScale.invert(mousePos[1])];\n console.log('canvasMousePos', canvasMousePos);\n\n self.addRNA('.', {'sequence': 'A', 'centerPos': canvasMousePos});\n }\n },\n {\n 'title': 'C',\n action: function(elm, d, i, mousePos) {\n console.log('mousePos:', mousePos, self.options.svgW, self.options.svgH);\n let canvasMousePos = [xScale.invert(mousePos[0]),\n yScale.invert(mousePos[1])];\n console.log('canvasMousePos', canvasMousePos);\n\n self.addRNA('.', {'sequence': 'C', 'centerPos': canvasMousePos});\n }\n\n },\n {\n 'title': 'G',\n action: function(elm, d, i, mousePos) {\n console.log('mousePos:', mousePos, self.options.svgW, self.options.svgH);\n let canvasMousePos = [xScale.invert(mousePos[0]),\n yScale.invert(mousePos[1])];\n console.log('canvasMousePos', canvasMousePos);\n\n self.addRNA('.', {'sequence': 'G', 'centerPos': canvasMousePos});\n }\n\n },\n {\n 'title': 'U',\n action: function(elm, d, i, mousePos) {\n console.log('mousePos:', mousePos, self.options.svgW, self.options.svgH);\n let canvasMousePos = [xScale.invert(mousePos[0]),\n yScale.invert(mousePos[1])];\n console.log('canvasMousePos', canvasMousePos);\n\n self.addRNA('.', {'sequence': 'U', 'centerPos': canvasMousePos});\n\n }\n }\n ],\n disabled: false // optional, defaults to false\n }\n ]\n\n let nodeMenu = [\n {\n title: 'Delete Node',\n action: function(elm, d, i) {\n deleteNode(d);\n },\n disabled: false // optional, defaults to false\n },\n {\n title: 'Change Node',\n action: function(elm, d, i) {\n console.log('You have clicked the second item!');\n console.log('The data for this circle is: ' + d);\n },\n children: [\n {\n title: 'A',\n action: function(elm, d, i) {\n changeNode('A', d);\n }\n },\n {\n title: 'C',\n action: function(elm, d, i) {\n changeNode('C', d);\n\n }\n },\n {\n title: 'G',\n action: function(elm, d, i) {\n changeNode('G', d);\n\n }\n },\n {\n title: 'U',\n action: function(elm, d, i) {\n changeNode('U', d);\n }\n },\n ]\n },\n {\n title: 'Insert Before',\n action: function(elm, d, i) {\n\n },\n children: [\n {\n title: 'A',\n action: function(elm, d, i) {\n insertNodeBeforeOrAfter('A', d, -1);\n }\n },\n {\n title: 'C',\n action: function(elm, d, i) {\n insertNodeBeforeOrAfter('C', d, -1);\n\n }\n },\n {\n title: 'G',\n action: function(elm, d, i) {\n insertNodeBeforeOrAfter('G', d, -1);\n\n }\n },\n {\n title: 'U',\n action: function(elm, d, i) {\n insertNodeBeforeOrAfter('U', d, -1);\n }\n },\n ]\n },\n {\n title: 'Insert After',\n action: function(elm, d, i) {\n console.log('d:', d);\n\n },\n children: [\n {\n title: 'A',\n action: function(elm, d, i) {\n insertNodeBeforeOrAfter('A', d, 0);\n\n }\n },\n {\n title: 'C',\n action: function(elm, d, i) {\n insertNodeBeforeOrAfter('C', d, 0);\n }\n },\n {\n title: 'G',\n action: function(elm, d, i) {\n insertNodeBeforeOrAfter('G', d, 0);\n }\n },\n {\n title: 'U',\n action: function(elm, d, i) {\n insertNodeBeforeOrAfter('U', d, 0);\n }\n },\n ]\n }\n ]\n\n self.nodeContextMenu = contextMenu(nodeMenu);\n self.backgroundContextMenu = contextMenu(backgroundMenu);\n\n } else {\n //console.log('empty context menu');\n self.nodeContextMenu = function() {};\n }\n\n /* Draw the plot here */\n d3.select(element).select('svg').remove();\n\n var svg = d3.select(element)\n .attr('tabindex', 1)\n .each(function() { this.focus(); })\n .append('svg:svg')\n .attr('preserveAspectRatio', 'xMidYMid meet')\n .attr('viewBox', '0 0 ' + self.options.svgW + ' ' + self.options.svgH)\n\n self.options.svg = svg;\n\n if (self.options.editable || self.options.animation) {\n var mouseEventHelper = svg.append('svg:g')\n .on('mousemove', () => {\n // only if we are dragging\n if (!mousedownNode) return;\n\n // update drag line\n let mpos = d3.mouse(vis.node());\n dragLine\n .attr('x1', mousedownNode.x)\n .attr('y1', mousedownNode.y)\n .attr('x2', mpos[0])\n .attr('y2', mpos[1]);\n })\n .on('mousedown', () => {\n })\n .on('mouseup', () => {\n if (mousedownNode && !linkContextMenuShown) {\n dragLine.classed(fstyle.transparent, true);\n }\n // clear mouse event vars\n resetMouseVars();\n //update()\n })\n .classed(fstyle.mouseEventHelper, true)\n .style('pointer-events', 'all')\n\n // draw a background layer for mouse events\n mouseEventHelper.append('svg:rect')\n .classed('background', true)\n .style('visibility', 'hidden')\n .attr('width', self.options.svgW)\n .attr('height', self.options.svgH)\n .on('mousedown', function() {\n //console.log('background click');\n deselectAllNodes()\n })\n } else {\n var mouseEventHelper = svg;\n }\n\n var vis = mouseEventHelper.append('svg:g')\n .classed(fstyle.plot, true)\n var visLinks = vis.append('svg:g')\n .classed('fornac-links', true);\n var visNodes = vis.append('svg:g')\n .classed('fornac-nodes', true);\n\n // line displayed when dragging new nodes\n if (self.options.editable) {\n var dragLine = vis.append('line')\n .attr('class', fstyle.dragLine)\n .attr('x1', 0)\n .attr('y1', 0)\n .attr('x2', 0)\n .attr('y2', 0);\n\n svg.on('contextmenu', self.backgroundContextMenu);\n }\n\n /* Zooming related objects and functions */\n var xScale = d3.scale.linear()\n .domain([0,self.options.svgW]).range([0,self.options.svgW]);\n var yScale = d3.scale.linear()\n .domain([0,self.options.svgH]).range([0, self.options.svgH]);\n\n self.zoomer = d3.behavior.zoom()\n .scaleExtent([0.1,10])\n .x(xScale)\n .y(yScale)\n .on('zoom', () => {\n vis.attr('transform',\n 'translate(' + d3.event.translate + ')' + ' scale(' + d3.event.scale + ')');\n });\n\n let enableZooming = () => {\n svg.call(self.zoomer)\n .on(\"dblclick.zoom\", null);\n }\n\n let disableZooming = () => {\n svg.call(self.zoomer)\n .on(\"dblclick.zoom\", null)\n .on('mousedown.zoom', null)\n .on('touchstart.zoom', null)\n .on('touchmove.zoom', null)\n .on('touchend.zoom', null);\n }\n\n if (self.options.zoomable)\n enableZooming()\n\n /* Node selection related objects and functions */\n let toggleSelectNode = (node) => {\n node.selected = !node.selected;\n visNodes.selectAll('g.gnode').filter((d) => { return node.uid == d.uid; })\n .classed(fstyle.selectedNode, function(p) { return p.selected; });\n }\n\n let selectNode = (node) => {\n node.selected = true;\n visNodes.selectAll('g.gnode').filter((d) => { return node.uid == d.uid; })\n .classed(fstyle.selectedNode, function(p) { return p.selected; });\n }\n\n let deselectAllNodes = () => {\n visNodes.selectAll('g.gnode')\n .classed(fstyle.selectedNode, function(p) { return p.selected = false; });\n }\n\n let selectedNodes = () => {\n // return all selected nodes\n return visNodes.selectAll('g.gnode').filter(function(d) { return d.selected; });\n }\n\n self.brusher = d3.svg.brush()\n .x(xScale)\n .y(yScale)\n .on('brushstart', function(d) {})\n .on('brush', function() {\n // during brushing invert styling of selection as preview\n let extent = d3.event.target.extent();\n\n visNodes.selectAll('g.gnode')\n .classed(fstyle.selectedNode, function (d) {\n return d.selected ^ (extent[0][0] <= d.x && d.x < extent[1][0]\n && extent[0][1] <= d.y && d.y < extent[1][1])\n })\n })\n .on('brushend', function() {\n // after brushing finally toggle the selection\n let extent = d3.event.target.extent();\n\n visNodes.selectAll('g.gnode')\n .filter(function (d) {\n return extent[0][0] <= d.x && d.x < extent[1][0]\n && extent[0][1] <= d.y && d.y < extent[1][1]\n })\n .each(toggleSelectNode)\n\n d3.event.target.clear();\n d3.select(this).call(d3.event.target);\n });\n\n let enableBrushing = () => {\n // crosshair curson\n mouseEventHelper.select('.background').style('cursor', 'crosshair');\n // bind brusher\n mouseEventHelper.call(self.brusher);\n }\n\n let disableBrushing = () => {\n // normal cursor\n mouseEventHelper.select('.background').style('cursor', 'auto');\n // disable brushing events\n mouseEventHelper.call(self.brusher)\n .on('mousedown.brush', null)\n .on('touchstart.brush', null)\n .on('touchmove.brush', null)\n .on('touchend.brush', null);\n }\n\n /* Force related objects and functions */\n self.force = d3.layout.force()\n .charge(function(d) {\n if (d.nodeType == 'middle')\n return self.options.middleCharge;\n else\n return self.options.otherCharge;\n })\n .friction(self.options.friction)\n .linkDistance(function(d) { return self.options.linkDistanceMultiplier * d.value; })\n .linkStrength(function(d) { if (d.linkType in self.linkStrengths) {\n return self.linkStrengths[d.linkType];\n } else {\n return self.linkStrengths.other; }\n })\n .gravity(0.000)\n .nodes(self.graph.nodes)\n .links(self.graph.links)\n .chargeDistance(self.options.chargeDistance)\n .size([self.options.svgW, self.options.svgH]);\n\n var drag = d3.behavior.drag()\n .on('dragstart', function(d) {\n console.log('dragstart')\n d3.event.sourceEvent.stopPropagation();\n\n selectedNodes().each(function(d1) {\n d1.fixed |= 2;\n });\n })\n .on('drag', (d) => {\n if (shiftKeydown) return\n selectedNodes().each(function(d1) {\n d1.x += d3.event.dx;\n d1.y += d3.event.dy;\n\n d1.px += d3.event.dx;\n d1.py += d3.event.dy;\n });\n\n self.resumeForce();\n d3.event.sourceEvent.preventDefault();\n })\n .on('dragend', (d) => {\n console.log('dragend')\n selectedNodes().each(function(d1) {\n d1.fixed &= ~6;\n });\n });\n\n /* Main plot drawing functions */\n let createInitialLayout = function(structure, passedOptions = {}) {\n // the default options\n let options = {\n 'sequence': '',\n 'name': 'empty',\n 'positions': [],\n 'labelInterval': self.options.labelInterval,\n 'avoidOthers': true,\n 'uids': [],\n 'circularizeExternal': true\n };\n\n options = Object.assign(options, passedOptions);\n\n //console.log('options.uids:', options.uids);\n let rg = new RNAGraph(options.sequence, structure, options.name);\n rg.circularizeExternal = options.circularizeExternal;\n\n let rnaJson = rg.recalculateElements();\n\n if (options.positions.length === 0) {\n // no provided positions means we need to calculate an initial layout\n\n if (self.options.layout == 'naview') {\n let naview = new NAView();\n\n let naViewPositions = naview.naview_xy_coordinates(rg.pairtable);\n options.positions = []\n for (let i = 0; i < naViewPositions.nbase; i++)\n options.positions.push([naViewPositions.x[i], naViewPositions.y[i]]);\n } else {\n options.positions = simpleXyCoordinates(rnaJson.pairtable);\n }\n }\n\n rnaJson = rnaJson.elementsToJson()\n .addUids(options.uids)\n .addPositions('nucleotide', options.positions)\n .addLabels(1, options.labelInterval)\n .reinforceStems()\n .reinforceLoops()\n .connectFakeNodes()\n .reassignLinkUids()\n .breakNodesToFakeNodes();\n\n return rnaJson;\n };\n\n let createNewNodes = function(gnodesEnter) {\n gnodesEnter = gnodesEnter.append('g')\n .classed('gnode', true)\n .attr('struct_name', function(d) { return d.structName; })\n .attr('transform', function(d) {\n if (typeof d.x != 'undefined' && typeof d.y != 'undefined')\n return 'translate(' + [d.x, d.y] + ')';\n else\n return '';\n })\n .each( function(d) { d.selected = d.previouslySelected = false; });\n\n gnodesEnter\n .attr('num', function(d) { return 'n' + d.num; })\n .attr('rnum', function(d) {\n return 'n' + (d.rna.rnaLength - d.num + 1); })\n .transition()\n .duration(750)\n .ease('elastic');\n\n if (self.options.editable || self.options.animation) {\n gnodesEnter.on('mousedown', nodeMousedown)\n //.on('mousedrag', function(d) {})\n .on('mouseup', nodeMouseup)\n .on('contextmenu', self.nodeContextMenu)\n .call(drag)\n }\n\n let labelAndProteinNodes = gnodesEnter.filter(function(d) {\n return d.nodeType == 'label' || d.nodeType == 'protein';\n });\n\n let nucleotideNodes = gnodesEnter.filter(function(d) {\n return d.nodeType == 'nucleotide';\n });\n\n labelAndProteinNodes.append('svg:circle')\n .classed(fstyle.node, true)\n .attr('r', function(d) {\n if (d.nodeType == 'middle') return 0;\n else {\n return d.radius;\n }\n })\n .attr('node_type', function(d) { return d.nodeType; })\n .attr('node_num', function(d) { return d.num; });\n\n // direction arrows\n nucleotideNodes.append('svg:path')\n .attr('class', fstyle.directionArrow)\n .attr('node_num', function(d) { return d.num; })\n\n // nucleotide outlines\n nucleotideNodes.append('svg:circle')\n .attr('class', fstyle.node)\n .attr('node_type', function(d) { return d.nodeType; })\n .attr('node_num', function(d) { return d.num; })\n .attr('r', function(d) { return d.radius; })\n .append('svg:title')\n .text(function(d) {\n if (d.nodeType == 'nucleotide') {\n return d.structName + ':' + d.num;\n } else {\n return '';\n }\n });\n\n // nucleotide labels\n var labelsEnter = gnodesEnter.append('text')\n .text(function(d) { return d.name; })\n .attr('class', fstyle.nodeLabel)\n .attr('label_type', function(d) { return d.nodeType; })\n\n // nucleotide label title\n labelsEnter.append('svg:title')\n .text(function(d) {\n if (d.nodeType == 'nucleotide') {\n return d.structName + ':' + d.num;\n } else {\n return '';\n }\n });\n\n return gnodesEnter;\n };\n\n let createNewLinks = function(linksEnter) {\n var linkLines = linksEnter.append('svg:line');\n\n linkLines.append('svg:title')\n .text((d) => { return d.linkType + ':' + d.source.num + '-' + d.target.num });\n\n linkLines\n .classed('link', true)\n .classed(fstyle.link, true)\n .attr('x1', function(d) { return d.source.x; })\n .attr('y1', function(d) { return d.source.y; })\n .attr('x2', function(d) { return d.target.x; })\n .attr('y2', function(d) { return d.target.y; })\n .attr('link_type', function(d) { return d.linkType; } )\n .attr('pointer-events', function(d) { if (d.linkType == 'fake') return 'none'; else return 'all';});\n\n if (self.options.editable)\n linkLines.on('click', linkClick);\n\n /* We don't need to update the positions of the stabilizing links */\n /*\n basepairLinks = visLinks.selectAll('[link_type=basepair]');\n basepairLinks.classed('basepair', true);\n\n fakeLinks = visLinks.selectAll('[link_type=fake]')\n fakeLinks.classed('fake', true);\n\n intermolecule_links = vis_links.selectAll('[link_type=intermolecule]');\n intermolecule_links.classed('intermolecule', true);\n\n plink = vis_links.selectAll('[link_type=protein_chain],[link_type=chain_chain]');\n plink.classed('chain_chain', true);\n */\n\n return linkLines;\n };\n\n function drawDirectionArrow(d) {\n let magnitude = (x) => {\n return Math.sqrt(x[0] * x[0] + x[1] * x[1]);\n }\n\n let endPoint = d;\n let startPoint = d.prevNode;\n // get stroke width and arrow size values from css\n let nodeStroke = parseFloat(fstyle.nodeStrokeWidth) / 2;\n let lengthMult = parseFloat(fstyle.directionArrowSize);\n let arrowWidth = parseFloat(fstyle.directionArrowWidth);\n\n if (startPoint === null)\n return;\n\n // does this node have a link pointing to it?\n if (!d.linked)\n return;\n\n // point back toward the previous node\n let u = [-(endPoint.x - startPoint.x), -(endPoint.y - startPoint.y)];\n\n if (u[0] == 0 && u[1] == 0)\n return; // will lead to a NaN error\n\n // scale u to unit length\n u = [u[0] / magnitude(u), u[1] / magnitude(u)];\n // normal vector of u\n let v = [-u[1], u[0]];\n\n // calculate the tip position\n let arrowTip = [(d.radius + nodeStroke) * u[0], (d.radius + nodeStroke) * u[1]];\n\n let path = 'M' + (arrowTip[0] + lengthMult * (u[0]/2 + v[0]*arrowWidth/2)) + ',' + (arrowTip[1] + lengthMult * (u[1]/2 + v[1]*arrowWidth/2)) +\n 'L' + (arrowTip[0]) + ',' + (arrowTip[1]) +\n 'L' + (arrowTip[0] + lengthMult * (u[0]/2 - v[0]*arrowWidth/2)) + ',' + (arrowTip[1] + lengthMult * (u[1]/2 - v[1]*arrowWidth/2));\n\n d3.select(this).attr('d', path);\n }\n\n let realLinkFilter = (d) => {\n return d.linkType == 'basepair' ||\n d.linkType == 'backbone' ||\n d.linkType == 'intermolecule' ||\n d.linkType == 'pseudoknot' ||\n d.linkType == 'label_link' ||\n d.linkType == 'external' ||\n d.linkType == 'chain_chain';\n }\n\n let recalculateGraph = () => {\n // Condense all of the individual RNAs into one\n // collection of nodes and links\n self.graph.nodes = [];\n self.graph.links = [];\n for (let uid in self.rnas) {\n self.graph.nodes = self.graph.nodes.concat(self.rnas[uid].nodes);\n self.graph.links = self.graph.links.concat(self.rnas[uid].links);\n }\n\n // Create a lookup table so that we can access each node\n // based on its uid. This will be used to create the links\n // between different RNAs\n var uidsToNodes = {};\n\n for (let i = 0; i < self.graph.nodes.length; i++)\n uidsToNodes[self.graph.nodes[i].uid] = self.graph.nodes[i];\n\n self.graph.links.forEach(function(link) {\n link.source = uidsToNodes[link.source.uid];\n link.target = uidsToNodes[link.target.uid];\n });\n\n for (let i = 0; i < self.extraLinks.length; i++) {\n // the actual node objects may have changed, so we hae to recreate\n // the extra links based on the uids\n if (!(self.extraLinks[i].target.uid in uidsToNodes)) {\n console.log('not there:', self.extraLinks[i]);\n continue;\n }\n\n self.extraLinks[i].source = uidsToNodes[self.extraLinks[i].source.uid];\n self.extraLinks[i].target = uidsToNodes[self.extraLinks[i].target.uid];\n\n if (self.extraLinks[i].linkType == 'intermolecule') {\n //remove links to middle nodes\n let fakeLinks = self.graph.links.filter(function(d) {\n return ((d.source == self.extraLinks[i].source || d.source == self.extraLinks[i].target ||\n d.target == self.extraLinks[i].source || d.target == self.extraLinks[i].source) &&\n d.linkType == 'fake');\n });\n\n for (let j = 0; j < fakeLinks.length; j++) {\n let linkIndex = self.graph.links.indexOf(fakeLinks[j]);\n self.graph.links.splice(linkIndex, 1);\n }\n }\n\n graph.links.push(self.extraLinks[i]);\n }\n };\n\n self.update = function () {\n self.force.nodes(self.graph.nodes)\n .links(self.graph.links);\n\n if (self.options.animation) {\n self.force.start();\n }\n\n let allLinks = visLinks.selectAll('line.link')\n .data(self.graph.links.filter(realLinkFilter), elementKey);\n\n allLinks.attr('class', '')\n .classed('link', true)\n .classed(fstyle.link, true)\n .attr('link_type', function(d) { return d.linkType; } )\n\n let linksEnter = allLinks.enter();\n createNewLinks(linksEnter);\n\n allLinks.exit().remove();\n\n let gnodes = visNodes.selectAll('g.gnode')\n .data(self.graph.nodes, elementKey);\n //.attr('pointer-events', 'all');\n\n let gnodesEnter = gnodes.enter();\n createNewNodes(gnodesEnter);\n gnodes.exit().remove();\n\n\n //fake_nodes = self.graph.nodes.filter(function(d) { return d.nodeType == 'middle'; });\n //fakeNodes = self.graph.nodes.filter(function(d) { return true; });\n let realNodes = self.graph.nodes.filter(function(d) { return d.nodeType == 'nucleotide' || d.nodeType == 'label';});\n\n gnodes.select('.' + fstyle.directionArrow).each(drawDirectionArrow);\n\n self.force.on('tick', function() {\n let q = d3.geom.quadtree(realNodes);\n let i = 0;\n let n = realNodes.length;\n\n let collide = (node) => {\n let r = node.radius + 16,\n nx1 = node.x - r,\n nx2 = node.x + r,\n ny1 = node.y - r,\n ny2 = node.y + r;\n return function(quad, x1, y1, x2, y2) {\n if (quad.point && (quad.point !== node)) {\n let x = node.x - quad.point.x,\n y = node.y - quad.point.y,\n l = Math.sqrt(x * x + y * y),\n r = node.radius + quad.point.radius;\n if (l < r) {\n l = (l - r) / l * 0.1;\n node.x -= x *= l;\n node.y -= y *= l;\n quad.point.x += x;\n quad.point.y += y;\n }\n }\n return x1 > nx2 || x2 < nx1 || y1 > ny2 || y2 < ny1;\n };\n }\n\n while (++i < n) q.visit(collide(realNodes[i]));\n\n allLinks.attr('x1', function(d) { return d.source.x; })\n .attr('y1', function(d) { return d.source.y; })\n .attr('x2', function(d) { return d.target.x; })\n .attr('y2', function(d) { return d.target.y; });\n\n // Translate the groups\n gnodes.attr('transform', function(d) {\n return 'translate(' + [d.x, d.y] + ')';\n });\n\n gnodes.select('.' + fstyle.directionArrow).each(drawDirectionArrow);\n\n });\n\n self.force.on('end', () => {\n gnodes.selectAll('[node_type=nucleotide]')\n .filter((d,i) => { if (i == 0) return true; else return false; })\n .each((d,i) => {\n //console.log(\"pos\", d.num, d.x, d.y);\n });\n\n //for (let uid in self.rnas) {\n // for (let i = 1; i < self.rnas[uid].pairtable[0]; i++) {\n // console.log('pt', i, self.rnas[uid].pairtable[i]);\n // }\n //}\n\n });\n\n self.changeColorScheme(self.colorScheme);\n\n if (self.options.animation) {\n self.force.start();\n }\n\n updateStyle();\n };\n\n self.transitionRNA = function(newStructure, nextFunction) {\n if (self.dotbracket == newStructure) {\n return;\n } else {\n self.dotbracket = newStructure;\n }\n //transition from an RNA which is already displayed to a new structure\n var duration = self.options.transitionDuration;\n\n var uids = self.graph.nodes\n .filter(function(d) { return d.nodeType == 'nucleotide'; })\n .map(function(d) { return d.uid; });\n\n let options = {'uids': uids};\n var newRNAJson = createInitialLayout(newStructure, options);\n\n let gnodes = visNodes.selectAll('g.gnode').data(newRNAJson.nodes, elementKey);\n var links = visLinks.selectAll('line.link').data(newRNAJson.links.filter(realLinkFilter), elementKey);\n\n if (duration === 0)\n gnodes.attr('transform', function(d) {\n return 'translate(' + [d.x, d.y] + ')';\n });\n else {\n gnodes.transition()\n .attr('transform', function(d) {\n return 'translate(' + [d.x, d.y] + ')'; }).duration(duration);\n }\n\n\n var newNodes = createNewNodes(gnodes.enter())\n .attr('transform', function(d) {\n if (typeof d.x != 'undefined' && typeof d.y != 'undefined')\n return 'translate(' + [0, 0] + ')';\n else\n return '';\n });\n\n if (duration === 0)\n gnodes.exit().remove();\n else\n gnodes.exit().transition()\n .attr('transform', function(d) {\n if (typeof d.x != 'undefined' && typeof d.y != 'undefined')\n return 'translate(' + [0, 0] + ')';\n else\n return '';\n });\n\n self.graph.nodes = gnodes.data();\n gnodes.select('.' + fstyle.directionArrow).each(drawDirectionArrow);\n self.changeColorScheme(self.colorScheme);\n updateStyle();\n self.centerView(duration);\n\n function endall(transition, callback) {\n if (transition.size() === 0) { setTimeout(callback, duration); }\n var n = 0;\n transition\n .each(function() { ++n; })\n .each('end', function() { if (!--n) callback.apply(this, arguments); });\n }\n\n function afterAnimation() {\n var newLinks = createNewLinks(links.enter());\n self.graph.links = links.data();\n self.changeColorScheme(self.colorScheme);\n updateStyle();\n\n if (typeof nextFunction != 'undefined')\n nextFunction();\n\n }\n\n links.exit().remove();\n\n if (duration === 0) {\n links\n .attr('x1', function(d) { return d.source.x; })\n .attr('y1', function(d) { return d.source.y; })\n .attr('x2', function(d) { return d.target.x; })\n .attr('y2', function(d) { return d.target.y; });\n\n var newLinks = createNewLinks(links.enter());\n self.graph.links = links.data();\n\n updateStyle();\n } else {\n links.transition()\n .attr('x1', function(d) { return d.source.x; })\n .attr('y1', function(d) { return d.source.y; })\n .attr('x2', function(d) { return d.target.x; })\n .attr('y2', function(d) { return d.target.y; })\n .duration(duration)\n .call(endall, afterAnimation);\n }\n\n if (duration === 0) {\n newNodes\n .attr('transform', function(d) {\n if (typeof d.x != 'undefined' && typeof d.y != 'undefined')\n return 'translate(' + [d.x, d.y] + ')';\n else\n return '';\n });\n } else {\n newNodes.transition()\n .attr('transform', function(d) {\n if (typeof d.x != 'undefined' && typeof d.y != 'undefined')\n return 'translate(' + [d.x, d.y] + ')';\n else\n return '';\n });\n }\n\n };\n\n /* Plot presentation related functions */\n let getBoundingBoxTransform = () => {\n // Center the view on the molecule(s) and scale it so that everything\n // fits in the window\n\n //no molecules, nothing to do\n if (self.graph.nodes.length === 0)\n return {'translate': [0,0], 'scale': 1};\n\n // Get the bounding box\n var minX = d3.min(self.graph.nodes.map(function(d) {return d.x;}));\n var minY = d3.min(self.graph.nodes.map(function(d) {return d.y;}));\n\n var maxX = d3.max(self.graph.nodes.map(function(d) {return d.x;}));\n var maxY = d3.max(self.graph.nodes.map(function(d) {return d.y;}));\n\n var maxRadius = d3.max(self.graph.nodes.map(function(d) { return d.radius; }));\n\n // The width and the height of the molecule\n var molWidth = maxX - minX;\n var molHeight = maxY - minY;\n\n // how much larger the drawing area is than the width and the height\n var widthRatio = self.options.svgW / (molWidth + 1);\n var heightRatio = self.options.svgH / (molHeight + 1);\n\n // we need to fit it in both directions, so we scale according to\n // the direction in which we need to shrink the most\n var minRatio = Math.min(widthRatio, heightRatio,\n self.options.maxNodeRadius / maxRadius) * 0.8;\n\n // the new dimensions of the molecule\n var newMolWidth = molWidth * minRatio;\n var newMolHeight = molHeight * minRatio;\n\n // translate so that it's in the center of the window\n var xTrans = -(minX) * minRatio + (self.options.svgW - newMolWidth) / 2;\n var yTrans = -(minY) * minRatio + (self.options.svgH - newMolHeight) / 2;\n\n return {'translate': [xTrans, yTrans], 'scale': minRatio};\n };\n\n self.centerView = function(duration = 0) {\n var bbTransform = getBoundingBoxTransform();\n\n if (bbTransform === null)\n return;\n\n // do the actual moving\n vis.transition().attr('transform',\n 'translate(' + bbTransform.translate + ')' + ' scale(' + bbTransform.scale + ')').duration(duration);\n\n // tell the zoomer what we did so that next we zoom, it uses the\n // transformation we entered here\n self.zoomer.translate(bbTransform.translate);\n self.zoomer.scale(bbTransform.scale);\n };\n\n self.setSize = (\n svgW = d3.select(element).node().offsetWidth,\n svgH = d3.select(element).node().offsetHeight\n ) => {\n // save width and height\n self.options.svgW = svgW;\n self.options.svgH = svgH;\n\n // set the viewBox\n svg.attr('viewBox', \"0 0 \" + svgW + \" \" + svgH)\n\n //Set the output range of the scales\n xScale.range([0, svgW]).domain([0, svgW]);\n yScale.range([0, svgH]).domain([0, svgH]);\n\n //re-attach the scales to the zoom behaviour\n self.zoomer.x(xScale)\n .y(yScale);\n self.brusher.x(xScale)\n .y(yScale);\n\n //resize the background\n svg.select('.background')\n .attr('width', svgW)\n .attr('height', svgH);\n\n // center the view\n self.centerView();\n }\n\n /* Style and color related functions */\n self.setOutlineColor = function(color) {\n var nodes = visNodes.selectAll('g.gnode').select('[node_type=nucleotide]');\n nodes.style('fill', color);\n }\n\n self.addCustomColors = function addCustomColors(json) {\n // Add a json file containing the custom colors\n self.customColors = json;\n self.changeColorScheme('custom');\n };\n\n self.addCustomColorsText = function(customColorsText) {\n let cs = new ColorScheme(customColorsText);\n self.customColors = cs.colorsJson;\n self.changeColorScheme('custom');\n };\n\n self.changeColorScheme = function(newColorScheme) {\n var proteinNodes = visNodes.selectAll('[node_type=protein]');\n\n proteinNodes.classed(fstyle.node, true)\n .attr('r', function(d) { return d.radius; });\n\n var gnodes = visNodes.selectAll('g.gnode');\n var circles = visNodes.selectAll('g.gnode').selectAll('circle');\n var nodes = visNodes.selectAll('g.gnode').select('[node_type=nucleotide]');\n self.colorScheme = newColorScheme;\n\n\n if (newColorScheme == 'sequence') {\n var scale = d3.scale.ordinal()\n .range(['#dbdb8d', '#98df8a', '#ff9896', '#aec7e8', '#aec7e8'])\n .domain(['A','C','G','U','T']);\n nodes.style('fill', function(d) {\n return scale(d.name);\n });\n\n } else if (newColorScheme == 'structure') {\n var scale = d3.scale.category10()\n .domain(['s','m','i','e','t','h','x'])\n .range(['lightgreen', '#ff9896', '#dbdb8d', 'lightsalmon',\n 'lightcyan', 'lightblue', 'transparent']);\n\n nodes.style('fill', function(d) {\n return scale(d.elemType);\n });\n\n } else if (newColorScheme == 'positions') {\n nodes.style('fill', function(d) {\n var scale = d3.scale.linear()\n .range(['#98df8a', '#dbdb8d', '#ff9896'])\n .interpolate(d3.interpolateLab)\n .domain([1, 1 + (d.rna.rnaLength - 1) / 2, d.rna.rnaLength]);\n\n return scale(d.num);\n });\n } else if (newColorScheme == 'custom') {\n // scale to be used in case the user passes scalar\n // values rather than color names\n if (typeof self.customColors != 'undefined' &&\n 'domain' in self.customColors &&\n 'range' in self.customColors) {\n var scale = d3.scale.linear()\n .interpolate(d3.interpolateLab)\n .domain(self.customColors.domain)\n .range(self.customColors.range);\n }\n\n let changeColors = (moleculeColors, d, scale) => {\n if (moleculeColors.hasOwnProperty(d.num)) {\n let val = parseFloat(moleculeColors[d.num]);\n\n if (isNaN(val)) {\n // passed in color is not a scalar, so\n // treat it as a color\n return moleculeColors[d.num];\n } else {\n // the user passed in a float, let's use a colormap\n // to convert it to a color\n return scale(val);\n }\n } else {\n return 'white';\n }\n }\n\n nodes.style('fill', function(d) {\n if (typeof self.customColors == 'undefined' ||\n !self.customColors.hasOwnProperty('colorValues')) {\n return 'white';\n }\n\n if (self.customColors.colorValues.hasOwnProperty(d.structName) &&\n self.customColors.colorValues[d.structName].hasOwnProperty(d.num)) {\n // if a molecule name is specified, it supercedes the default colors\n // (for which no molecule name has been specified)\n let moleculeColors = self.customColors.colorValues[d.structName];\n return changeColors(moleculeColors, d, scale);\n } else if (self.customColors.colorValues.hasOwnProperty('')) {\n let moleculeColors = self.customColors.colorValues[''];\n return changeColors(moleculeColors, d, scale);\n }\n\n return 'white';\n });\n }\n };\n\n let updateStyle = () => {\n // Numbering\n visNodes.selectAll('[node_type=label]').classed(fstyle.transparent, !self.displayParameters.displayNumbering);\n visNodes.selectAll('[label_type=label]').classed(fstyle.transparent, !self.displayParameters.displayNumbering);\n visLinks.selectAll('[link_type=label_link]').classed(fstyle.transparent, !self.displayParameters.displayNumbering);\n // Node Outline\n svg.selectAll('[node_type=nucleotide]').classed(fstyle.transparent, !self.displayParameters.displayNodeOutline);\n // Node Labels\n visNodes.selectAll('[label_type=nucleotide]').classed(fstyle.transparent, !self.displayParameters.displayNodeLabel);\n // Links\n svg.selectAll('[link_type=real],[link_type=basepair],[link_type=backbone],[link_type=pseudoknot],[link_type=protein_chain],[link_type=chain_chain],[link_type=external]').classed(fstyle.transparent, !self.displayParameters.displayLinks);\n // Pseudoknot Links\n svg.selectAll('[link_type=pseudoknot]').classed(fstyle.transparent, !self.displayParameters.displayPseudoknotLinks);\n // Protein Links\n svg.selectAll('[link_type=protein_chain]').classed(fstyle.transparent, !self.displayParameters.displayProteinLinks);\n // Fake Links\n visLinks.selectAll('[link_type=fake]').classed(fstyle.transparent, !self.options.displayAllLinks);\n visLinks.selectAll('[link_type=fake_fake]').classed(fstyle.transparent, !self.options.displayAllLinks);\n // direction Arrows\n svg.selectAll('.' + fstyle.directionArrow).classed(fstyle.transparent, !self.displayParameters.displayDirectionArrows);\n };\n\n /* RNA edditing related functions */\n let changeNode = function(nodeName, referenceNode) {\n // change the label of a node\n let rna = referenceNode.rna;\n\n let dotbracket = rnaUtilities.pairtableToDotbracket(rna.pairtable);\n let positions = rna.getPositions('nucleotide');\n let sequence = rna.seq\n let uids = rna.getUids();\n\n let newNodeNum = referenceNode.num;\n\n let newDotbracket = dotbracket;\n let newSequence = sequence.slice(0,newNodeNum-1) + nodeName + sequence.slice(newNodeNum);\n\n console.log('newSequence:', newSequence);\n\n console.log('uids:', uids);\n uids.splice(newNodeNum-1, 1, slugid.nice());\n let newPositions = positions;\n\n delete self.rnas[rna.uid];\n let newRNA = self.addRNA(newDotbracket, {'sequence': newSequence,\n 'positions': newPositions,\n 'uids': uids,\n 'centerView': false});\n }\n\n let insertNodeBeforeOrAfter = function(nodeName, referenceNode, positionOffset) {\n //insert a new node before or after another one\n //positionOffset specifies who far from the original to insert the new node\n let rna = referenceNode.rna;\n\n let dotbracket = rnaUtilities.pairtableToDotbracket(rna.pairtable);\n let positions = rna.getPositions('nucleotide');\n let sequence = rna.seq\n let uids = rna.getUids();\n\n let newNodeNum = referenceNode.num + positionOffset;\n\n let newDotbracket = dotbracket.slice(0,newNodeNum) + '.' + dotbracket.slice(newNodeNum);\n let newSequence = sequence.slice(0,newNodeNum) + nodeName + sequence.slice(newNodeNum);\n\n console.log('newSequence:', newSequence);\n\n uids.splice(newNodeNum, 0, slugid.nice());\n positions.splice(newNodeNum, 0, positions[newNodeNum - positionOffset-1]);\n\n let newUids = uids;\n let newPositions = positions;\n\n console.log('positions:', positions);\n console.log('new node positions:', newPositions);\n\n delete self.rnas[rna.uid];\n let newRNA = self.addRNA(newDotbracket, {'sequence': newSequence,\n 'positions': newPositions,\n 'uids': newUids,\n 'centerView': false});\n }\n\n let deleteNode = function(node) {\n console.log('deleting...', node);\n // get the dotbracket string for this rna\n let rna = node.rna;\n let pair = rna.pairtable[node.num];\n\n // remove basepairs for this node\n if (pair != 0) {\n rna.pairtable[node.num] = 0;\n rna.pairtable[pair] = 0;\n }\n\n let dotbracket = rnaUtilities.pairtableToDotbracket(rna.pairtable);\n let positions = rna.getPositions('nucleotide');\n let sequence = rna.seq\n let uids = rna.getUids();\n\n let newDotbracket = dotbracket.slice(0, node.num-1) + dotbracket.slice(node.num)\n let newPositions = positions.slice(0, node.num-1)\n .concat(positions.slice(node.num));\n let newSequence = sequence.slice(0, node.num-1) + sequence.slice(node.num)\n let newUids = uids.slice(0, node.num-1)\n .concat(uids.slice(node.num));\n\n delete self.rnas[rna.uid];\n let newRNA = self.addRNA(newDotbracket, {'sequence': newSequence,\n 'positions': newPositions,\n 'uids': newUids,\n 'centerView': false});\n\n console.log('new dotbracket:', newDotbracket);\n //recalculateGraph();\n\n //remove backbone links associated with this node\n\n //remove this node\n\n }\n\n let elementKey = (d) => {\n return d.uid;\n };\n\n let updateRnaGraph = function(r) {\n let nucleotidePositions = r.getPositions('nucleotide');\n let labelPositions = r.getPositions('label');\n\n let uids = r.getUids();\n\n r.recalculateElements()\n .elementsToJson()\n .addPseudoknots()\n .addPositions('nucleotide', nucleotidePositions)\n .addUids(uids)\n .addLabels(1, self.options.labelInterval)\n .addPositions('label', labelPositions)\n .reinforceStems()\n .reinforceLoops()\n .updateLinkUids();\n };\n\n let removeBackBoneLink = function(d) {\n if (d.target.num - d.source.num != 1) {\n console.log('ERROR: non adjacent nodes. Target:', d.target,\n 'Source:', d.source, 'Link:', d);\n return;\n }\n\n let rna = d.target.rna;\n let toRemove = [];\n\n for (let i = 0; i < rna.links.length; i++) {\n let link = rna.links[i];\n\n if (link.linkType != 'basepair')\n continue;\n\n if (link.source.num <= d.source.num && link.target.num >= d.target.num) {\n console.log('crossing basepair', link);\n toRemove.push(link);\n }\n }\n\n\n // Remove all base pairs that are between these two nodes and add them as extra\n // links\n console.log('toRemove:', toRemove);\n\n for (let i = 0; i < toRemove.length; i++) {\n rna.pairtable[toRemove[i].source.num] = 0;\n rna.pairtable[toRemove[i].target.num] = 0;\n\n toRemove[i].from = toRemove[i].source.num;\n toRemove[i].to = toRemove[i].target.num - d.source.num;\n }\n\n // extract the dotbracket string of the rna\n // cut it at the position of this backbone bond\n let sequence = rna.seq;\n let sequence1 = rna.seq.slice(0, d.source.num);\n let sequence2 = rna.seq.slice(d.source.num);\n\n let rnaDotBracket = rnaUtilities.pairtableToDotbracket(rna.pairtable);\n let dotBracket1 = rnaDotBracket.slice(0, d.source.num);\n let dotBracket2 = rnaDotBracket.slice(d.source.num)\n\n // get the nucleotide positions\n // cut them at the positions of the backbone bond\n let positions = rna.getPositions('nucleotide')\n let uids = rna.getUids();\n\n let positions1 = positions.slice(0, d.source.num);\n let positions2 = positions.slice(d.source.num);\n\n let uids1 = uids.slice(0, d.source.num);\n let uids2 = uids.slice(d.source.num);\n\n console.log('positions1:', positions1);\n console.log('positions2:', positions2);\n\n delete self.rnas[rna.uid];\n let rna1 = self.addRNA(dotBracket1, { 'sequence': sequence1,\n 'positions': positions1,\n 'uids': uids1 });\n let rna2 = self.addRNA(dotBracket2, { 'sequence': sequence2,\n 'positions': positions2,\n 'uids': uids2 });\n for (let i = 0; i < toRemove.length; i++) {\n console.log('rna1:', rna1);\n console.log('rna2:', rna2);\n console.log('toRemove[i]', toRemove[i]);\n self.extraLinks.push(\n {'source': rna1.nodes[toRemove[i].from-1],\n 'target': rna2.nodes[toRemove[i].to-1],\n 'value': 1,\n 'uid': slugid.nice(),\n 'linkType': 'intermolecule'});\n recalculateGraph();\n self.update();\n\n }\n console.log('self.extraLinks:', self.extraLinks);\n //self.extraLinks.push({'source': rna1.nodes[\n\n // create two new rnas\n // add their positions\n // add them back to the plot\n }\n\n var removeLink = function(d) {\n // remove a link between two nodes\n let index = self.graph.links.indexOf(d);\n console.log('removing link:', index);\n\n if (index > -1) {\n //remove a link\n //graph.links.splice(index, 1);\n\n // there should be two cases\n // 1. The link is within a single molecule\n\n if (d.source.rna == d.target.rna) {\n if (d.linkType == 'backbone') {\n console.log('trying to remove a backbone link', d.source.num, d.target.num);\n removeBackBoneLink(d);\n return;\n } else {\n let r = d.source.rna;\n r.addPseudoknots();\n r.pairtable[d.source.num] = 0;\n r.pairtable[d.target.num] = 0;\n\n updateRnaGraph(r);\n }\n } else {\n // 2. The link is between two different molecules\n let extraLinkIndex = self.extraLinks.indexOf(d);\n\n self.extraLinks.splice(extraLinkIndex, 1);\n }\n recalculateGraph();\n }\n self.update();\n };\n\n let addBackBoneLink = function(newLink) {\n // opposite of deleting a link\n // get the two dotbracket strings\n let rna1 = newLink.target.rna;\n let rna2 = newLink.source.rna;\n if (newLink.target.num == 1) {\n rna1 = newLink.source.rna;\n rna2 = newLink.target.rna;\n }\n\n let dotbracket1 = rnaUtilities.pairtableToDotbracket(rna1.pairtable);\n let dotbracket2 = rnaUtilities.pairtableToDotbracket(rna2.pairtable);\n\n let seq1 = rna1.seq;\n let seq2 = rna2.seq;\n\n let positions1 = rna1.getPositions('nucleotide');\n let positions2 = rna2.getPositions('nucleotide');\n\n // concatenate them\n let newDotbracket = dotbracket1 + dotbracket2;\n let newSeq = seq1 + seq2;\n let newPositions = positions1.concat(positions2);\n\n let toAddInternal = [];\n let toAddExternal = [];\n let toDelete = {};\n\n for (let i = 0; i < self.extraLinks.length; i++) {\n console.log('self.extraLinks[i]', self.extraLinks[i]);\n console.log('rna1:', rna1);\n console.log('rna2:', rna2);\n if (self.extraLinks[i].source.rna == rna1) {\n if ( self.extraLinks[i].target.rna == rna2) {\n // both ends of the extra link are within what will become the new molecule\n // need to be added as base pairs afterwards\n //self.extraLinks[i].from = self.extraLinks[i].source.num;\n //self.extraLinks[i].to = dotbracket1.length + self.extraLinks[i].target.num;\n //toAddInternal.push(self.extraLinks[i]);\n } else {\n // only one end of the extra link is within what will become the newly\n // created molecule, needs to remain an extra link\n // source will always be the unchanged molecule, whereas target will be\n // the newly created one\n toAddExternal.push({\n 'source': self.extraLinks[i].target,\n 'target': self.extraLinks[i].source.num\n });\n\n toDelete[self.extraLinks[i].uid] = true;\n }\n } else if (self.extraLinks[i].source.rna == rna2) {\n if ( self.extraLinks[i].target.rna == rna1) {\n // add internal link\n // both ends of the extra link are within what will become the new molecule\n // need to be added as base pairs afterwards\n //self.extraLinks[i].from = self.extraLinks[i].target.num;\n //self.extraLinks[i].to = dotbracket1.length + self.extraLinks[i].source.num;\n\n //toAddInternal.push(self.extraLinks[i]);\n } else {\n toAddExternal.push({\n 'source': self.extraLinks[i].target,\n 'target': self.extraLinks[i].source.num + dotbracket1.length\n });\n toDelete[self.extraLinks[i].uid] = true;\n }\n }\n\n if (self.extraLinks[i].target.rna == rna1) {\n if (self.extraLinks[i].source.rna == rna2) {\n // covered in previous if statement\n } else {\n // only one end of the extra link is within what will become the newly\n // created molecule, needs to remain an extra link\n toAddExternal.push({\n 'source': self.extraLinks[i].source,\n 'target': self.extraLinks[i].target.num\n });\n\n toDelete[self.extraLinks[i].uid] = true;\n }\n } else if (self.extraLinks[i].target.rna == rna2) {\n if (self.extraLinks[i].source.rna == rna1) {\n toAddExternal.push({\n 'source': self.extraLinks[i].source,\n 'target': self.extraLinks[i].target.num + dotbracket1.length\n });\n\n toDelete[self.extraLinks[i].uid] = true;\n }\n }\n }\n\n\n self.extraLinks = self.extraLinks.filter((e) => { return !(e.uid in toDelete) });\n\n delete self.rnas[rna1.uid];\n delete self.rnas[rna2.uid];\n\n let newRna = null;\n // create a new RNA\n if (self.options.animation)\n newRna = self.addRNA(newDotbracket, { 'sequence': newSeq,\n 'positions': newPositions,\n 'centerView': false});\n else\n newRna = self.addRNA(newDotbracket, { 'sequence': newSeq,\n 'centerView': false });\n\n\n\n // add new external links\n for (let i = 0; i < toAddExternal.length; i++) {\n self.extraLinks.push({\n 'source': toAddExternal[i].source,\n 'target': newRna.nodes[toAddExternal[i].target-1],\n 'value': 1,\n 'uid': slugid.nice(),\n 'linkType': 'intermolecule'\n });\n }\n\n recalculateGraph();\n self.update();\n console.log('self.extraLinks:', self.extraLinks);\n };\n\n function nudge(dx, dy) {\n // TODO currently unused\n node.filter(function(d) { return d.selected; })\n .attr('cx', function(d) { return d.x += dx; })\n .attr('cy', function(d) { return d.y += dy; });\n\n link.filter(function(d) { return d.source.selected; })\n .attr('x1', function(d) { return d.source.x; })\n .attr('y1', function(d) { return d.source.y; });\n\n link.filter(function(d) { return d.target.selected; })\n .attr('x2', function(d) { return d.target.x; })\n .attr('y2', function(d) { return d.target.y; });\n\n d3.event.preventDefault();\n }\n\n let nodeMouseup = function(d,i) {\n console.log(\"nodeMouseup\")\n let backbonePossible = true, basepairPossible = true;\n\n if (mousedownNode) {\n mouseupNode = d;\n\n // if the node isn't a nucleotide, we can't create a link\n if (mouseupNode.nodeType == 'middle' || mousedownNode.nodeType == 'middle' || mouseupNode.nodeType == 'label' || mousedownNode.nodeType == 'label')\n return;\n\n if (mouseupNode == mousedownNode) { resetMouseVars(); return; }\n let newLink = {source: mousedownNode, target: mouseupNode, linkType: 'basepair', value: 1, uid: slugid.nice()};\n\n for (let i = 0; i < self.graph.links.length; i++) {\n if ((self.graph.links[i].source == mousedownNode) ||\n (self.graph.links[i].target == mousedownNode) ||\n (self.graph.links[i].source == mouseupNode) ||\n (self.graph.links[i].target == mouseupNode)) {\n // either one of the nodes is already in a link\n\n // if any of the nodes are already involved in a basepair or a pseudoknot\n // then we can't make a basepair link\n if (self.graph.links[i].linkType == 'basepair' ||\n self.graph.links[i].linkType == 'pseudoknot' ||\n self.graph.links[i].linkType == 'intermolecule') {\n // although should be able to make a backbone link\n console.log('no basepair possible');\n basepairPossible = false;\n }\n }\n\n if (((self.graph.links[i].source == mouseupNode) &&\n (self.graph.links[i].target == mousedownNode)) ||\n ((self.graph.links[i].source == mousedownNode) &&\n (self.graph.links[i].target == mouseupNode))) {\n\n // if we're trying to make a link between two nodes which already have\n // a backbone between them, then we can't make a link\n if (self.graph.links[i].linkType == 'backbone') {\n return;\n }\n }\n }\n\n\n if (newLink.source.rna != newLink.target.rna) {\n // could be either a backbone link or an intermolecule link\n\n if ((newLink.source.num == 1 &&\n newLink.target.num == newLink.target.rna.rnaLength) ||\n (newLink.target.num == 1 &&\n newLink.source.num == newLink.source.rna.rnaLength)) {\n //\n let linkMenu = [\n {\n title: 'Backbone Link',\n action: function(elm, d, i) {\n linkContextMenuShown = false;\n console.log('Item #1 clicked!');\n console.log('The data for this circle is: ' + d);\n dragLine.attr('class', fstyle.transparent);\n addBackBoneLink(newLink);\n },\n disabled: false // optional, defaults to false\n },\n {\n title: 'Basepair Link',\n action: function(elm, d, i) {\n linkContextMenuShown = false;\n console.log('You have clicked the second item!');\n console.log('The data for this circle is: ' + d);\n dragLine.attr('class', fstyle.transparent);\n self.addLink(newLink);\n }\n }\n ]\n linkContextMenuShown = true;\n let linkContextMenu = contextMenu(linkMenu);\n console.log('newLinkMenu');\n linkContextMenu.apply(this, [d,i,true,\n function() { dragLine.attr('class', fstyle.transparent) }]);\n } else {\n // between end points but can't make a backbone\n if (basepairPossible)\n self.addLink(newLink);\n }\n } else {\n if (basepairPossible)\n self.addLink(newLink);\n }\n\n }\n };\n\n let nodeMousedown = function(d) {\n console.log(\"nodeMousedown\")\n if (!d.selected && !ctrlKeydown) {\n // if this node isn't selected, then we have to unselect every other node\n deselectAllNodes()\n }\n\n if (!shiftKeydown) {\n // only without shift, toggle select or select\n if (ctrlKeydown) {\n toggleSelectNode(d)\n } else {\n selectNode(d)\n }\n }\n\n if (shiftKeydown && self.options.editable) {\n // with shift key and editable continue to draw dragline\n mousedownNode = d;\n\n dragLine\n .attr('class', fstyle.dragLine)\n .attr('x1', mousedownNode.x)\n .attr('y1', mousedownNode.y)\n .attr('x2', mousedownNode.x)\n .attr('y2', mousedownNode.y);\n\n d3.event.stopPropagation();\n }\n };\n\n let linkClick = (d) => {\n if (!shiftKeydown) {\n return;\n }\n\n var invalidLinks = { //'backbone': true,\n 'fake': true,\n 'fake_fake': true,\n 'label_link': true};\n\n console.log('d.linkType:', d.linkType);\n if (d.linkType in invalidLinks )\n return;\n\n removeLink(d);\n };\n\n /* I/O functions */\n self.toJSON = function toJSON() {\n var data = {'rnas': self.rnas, 'extraLinks': self.extraLinks};\n var dataString = JSON.stringify(data, function(key, value) {\n //remove circular references\n if (key == 'rna') {\n return;\n } else {\n return value;\n }\n }, '\\t');\n return dataString;\n };\n\n self.fromJSON = function(jsonString) {\n var rnas, extraLinks;\n\n try{\n var data = JSON.parse(jsonString);\n rnas = data.rnas;\n extraLinks = data.extraLinks;\n } catch(err) {\n throw err;\n }\n\n for (var uid in rnas) {\n if (rnas[uid].type == 'rna') {\n r = new RNAGraph();\n\n r.seq = rnas[uid].seq;\n r.dotbracket = rnas[uid].dotbracket;\n r.circular = rnas[uid].circular;\n r.pairtable = rnas[uid].pairtable;\n r.uid = rnas[uid].uid;\n r.structName = rnas[uid].structName;\n r.nodes = rnas[uid].nodes;\n r.links = rnas[uid].links;\n r.rnaLength = rnas[uid].rnaLength;\n r.elements = rnas[uid].elements;\n r.nucsToNodes = rnas[uid].nucsToNodes;\n r.pseudoknotPairs = rnas[uid].pseudoknotPairs;\n } else {\n r = new ProteinGraph();\n r.size = rnas[uid].size;\n r.nodes = rnas[uid].nodes;\n r.uid = rnas[uid].uid;\n }\n\n self.addRNAJSON(r, false);\n }\n\n extraLinks.forEach(function(link) {\n self.extraLinks.push(link);\n });\n\n recalculateGraph();\n self.update();\n };\n\n self.addRNA = function(structure, passedOptions = {}) {\n let rnaJson = createInitialLayout(structure, passedOptions);\n let centerView = false;\n\n /*\n * Code to display the JSONs representing the structure\n *\n rnaJson.nodes[0].rna = null;\n rnaJson.nodes[0].nextNode = null;\n\n rnaJson.links[0].source = null;\n rnaJson.links[0].target = null;\n\n console.log(rnaJson.nodes[0]);\n console.log(rnaJson.links[0]);\n console.log(JSON.stringify(rnaJson.nodes[0],null,2));\n console.log(JSON.stringify(rnaJson.links[0],null,2));\n */\n\n if ('extraLinks' in passedOptions) {\n // presumably the passed in links are within the passed molecule\n let newLinks = self.addExternalLinks(rnaJson, passedOptions.extraLinks);\n\n self.extraLinks = self.extraLinks.concat(newLinks);\n }\n\n if ('centerPos' in passedOptions)\n self.addRNAJSON(rnaJson, {centerPos: passedOptions.centerPos,\n centerView: false})\n else if ('avoidOthers' in passedOptions)\n self.addRNAJSON(rnaJson, {avoidOthers: passedOptions.avoidOthers});\n else\n self.addRNAJSON(rnaJson, {centerView: passedOptions.centerView});\n\n return rnaJson;\n };\n\n self.addRNAJSON = function(rnaGraph,\n { avoidOthers = false,\n centerPos = null,\n centerView = true}\n ) {\n // Add an RNAGraph, which contains nodes and links as part of the\n // structure\n // Each RNA will have uid to identify it\n // when it is modified, it is replaced in the global list of RNAs\n //\n var maxX, minX;\n //console.log('centerView:', centerView);\n\n if (centerPos != null) {\n // center the newly created RNA at a given position\n let totalX = 0;\n let totalY = 0;\n let nodeCount = 0;\n\n rnaGraph.nodes.forEach(function(node) {\n totalX += node.x;\n totalY += node.y;\n nodeCount += 1;\n });\n\n if (nodeCount > 0) {\n // center the nodes at centerPos\n\n rnaGraph.nodes.forEach(function(node) {\n node.x = node.x + centerPos[0] - totalX / nodeCount;\n node.y = node.y + centerPos[1] - totalY / nodeCount;\n\n node.px = node.x;\n node.py = node.y;\n });\n }\n }\n\n if (avoidOthers) {\n if (self.graph.nodes.length > 0)\n maxX = d3.max(self.graph.nodes.map(function(d) { return d.x; }));\n else\n maxX = 0;\n\n minX = d3.min(rnaGraph.nodes.map(function(d) { return d.x; }));\n\n rnaGraph.nodes.forEach(function(node) {\n node.x += (maxX - minX) + 20;\n node.px += (maxX - minX);\n });\n }\n\n rnaGraph.nodes.forEach(function(node) {\n node.rna = rnaGraph;\n });\n\n self.rnas[rnaGraph.uid] = rnaGraph;\n recalculateGraph();\n\n self.update();\n\n if (centerView)\n self.centerView();\n\n return rnaGraph;\n };\n\n self.addNodes = function addNodes(json) {\n // add a new set of nodes from a json file\n\n // Resolve the sources and targets of the links so that they\n // are not just indeces into an array\n json.links.forEach(function(entry) {\n if (typeof entry.source == 'number') entry.source = json.nodes[entry.source];\n if (typeof entry.target == 'number') entry.target = json.nodes[entry.target];\n });\n\n // Get the maximum x and y values of the current graph\n // so that we don't place a new structure on top of the\n // old one\n if (self.graph.nodes.length > 0) {\n maxX = d3.max(self.graph.nodes.map(function(d) {return d.x;}));\n maxY = d3.max(self.graph.nodes.map(function(d) {return d.y;}));\n } else {\n maxX = 0;\n maxY = 0;\n }\n\n json.nodes.forEach(function(entry) {\n if (!(entry.rna.uid in self.rnas)) {\n self.rnas[entry.rna.uid] = entry.rna;\n }\n\n entry.x += maxX;\n //entry.y += maxY;\n\n entry.px += maxX;\n //entry.py += maxY;\n });\n\n r = new RNAGraph('','');\n r.nodes = json.nodes;\n r.links = json.links;\n\n //self.addRNA(r);\n recalculateGraph();\n\n self.update();\n self.centerView();\n };\n\n self.clearNodes = () => {\n self.graph.nodes = [];\n self.graph.links = [];\n\n self.rnas = {};\n self.extraLinks = [];\n\n self.update();\n };\n\n self.addLink = function(newLink) {\n // this means we have a new json, which means we have\n // to recalculate the structure and change the colors\n // appropriately\n //\n console.log('adding new link');\n if (newLink.source.rna == newLink.target.rna) {\n // must be a basepair\n let r = newLink.source.rna;\n\n r.pairtable[newLink.source.num] = newLink.target.num;\n r.pairtable[newLink.target.num] = newLink.source.num;\n\n updateRnaGraph(r);\n\n } else {\n //Add an extra link\n console.log('intermolecule');\n newLink.linkType = 'intermolecule';\n self.extraLinks.push(newLink);\n }\n recalculateGraph();\n self.update();\n };\n\n self.addExternalLinks = function(rnaJson, externalLinks) {\n let newLinks = [];\n\n for (let i = 0; i < externalLinks.length; i++) {\n let newLink = {linkType: 'external', value: 1, uid: slugid.nice(),\n source: null, target: null};\n // check if the source node is an array\n if (Object.prototype.toString.call(externalLinks[i][0]) === '[object Array]') {\n for (let j = 0; j < rnaJson.nodes.length; j++) {\n if ('nucs' in rnaJson.nodes[j]) {\n if (rnaJson.nodes[j].nucs.equals(externalLinks[i][0])) {\n newLink.source = rnaJson.nodes[j];\n break;\n }\n }\n }\n } else {\n for (let j = 0; j < rnaJson.nodes.length; j++) {\n if (rnaJson.nodes[j].num == externalLinks[i][0]) {\n newLink.source = rnaJson.nodes[j];\n }\n }\n }\n\n // check if the target node is an array\n if (Object.prototype.toString.call(externalLinks[i][1]) === '[object Array]') {\n for (let j = 0; j < rnaJson.nodes.length; j++) {\n if ('nucs' in rnaJson.nodes[j]) {\n if (rnaJson.nodes[j].nucs.equals(externalLinks[i][1])) {\n newLink.target = rnaJson.nodes[j];\n }\n }\n }\n } else {\n for (let j = 0; j < rnaJson.nodes.length; j++) {\n if (rnaJson.nodes[j].num == externalLinks[i][1]) {\n newLink.target = rnaJson.nodes[j];\n }\n }\n }\n\n if (newLink.source == null || newLink.target == null) {\n console.log('ERROR: source or target of new link not found:', newLink, externalLinks[i]);\n continue;\n }\n\n newLinks.push(newLink);\n }\n\n return newLinks;\n };\n\n self.getStructuresDotBracket = function() {\n console.log('self.rnas:', self.rnas);\n let sequence = [];\n let currIdx = 1;\n let nodeIdxs = {};\n let breaks = [];\n let pairtable = [];\n\n // add the nodes\n for (let uid in self.rnas) {\n let rna = self.rnas[uid];\n\n for (let j = 0; j < rna.nodes.length; j++) {\n let node = rna.nodes[j];\n\n if (node.nodeType != 'nucleotide')\n continue;\n\n console.log('node:', node);\n nodeIdxs[node.uid] = currIdx;\n currIdx += 1;\n\n sequence.push(node.name);\n }\n\n breaks.push(currIdx);\n }\n\n pairtable = [currIdx-1]\n for (let i = 0; i < currIdx; i++)\n pairtable.push(0)\n\n // add the links\n for (let uid in self.rnas) {\n let rna = self.rnas[uid];\n\n for (let j = 0; j < rna.links.length; j++) {\n let link = rna.links[j];\n\n if (link.linkType != 'basepair')\n continue;\n\n let idx1 = nodeIdxs[link.source.uid];\n let idx2 = nodeIdxs[link.target.uid];\n pairtable[idx1] = idx2;\n pairtable[idx2] = idx1;\n }\n }\n\n for (let i = 0; i < self.extraLinks.length; i++) {\n let link = self.extraLinks[i];\n\n let idx1 = nodeIdxs[link.source.uid];\n let idx2 = nodeIdxs[link.target.uid];\n\n pairtable[idx1] = idx2;\n pairtable[idx2] = idx1;\n }\n\n let structure = rnaUtilities.pairtableToDotbracket(pairtable).split('');\n\n for (let i = 0; i < breaks.length - 1; i++) {\n console.log('breaks[i]:', breaks[i]);\n sequence.splice(breaks[i] + i - 1, 0, '&');\n structure.splice(breaks[i] + i - 1, 0, '&');\n }\n\n console.log('sequence:', sequence, sequence.join(''));\n console.log('structure:', structure, structure.join(''));\n return [sequence.join(''), structure.join('')];\n };\n\n /* APIs */\n self.startAnimation = function() {\n self.options.animation = true;\n vis.selectAll('g.gnode')\n .call(drag);\n self.force.start();\n };\n\n self.stopAnimation = function() {\n self.options.animation = false;\n vis.selectAll('g.gnode')\n .on('mousedown.drag', null);\n self.force.stop();\n };\n\n self.resumeForce = function() {\n if (self.options.animation)\n self.force.resume();\n };\n\n self.setFriction = function(value) {\n self.force.friction(value);\n self.resumeForce();\n };\n\n self.setCharge = function(value) {\n self.force.charge(value);\n self.resumeForce();\n };\n\n self.setGravity = function(value) {\n self.force.gravity(value);\n self.resumeForce();\n };\n\n self.setPseudoknotStrength = function(value) {\n self.linkStrengths.pseudoknot = value;\n self.update();\n };\n\n self.displayNumbering = function(value) {\n self.displayParameters.displayNumbering = value;\n updateStyle();\n };\n\n self.displayNodeOutline = function(value) {\n self.displayParameters.displayNodeOutline = value;\n updateStyle();\n };\n\n self.displayNodeLabel = function(value) {\n self.displayParameters.displayNodeLabel = value;\n updateStyle();\n };\n\n self.displayLinks = function(value) {\n self.displayParameters.displayLinks = value;\n updateStyle();\n };\n\n self.displayPseudoknotLinks = function(value) {\n self.displayParameters.displayPseudoknotLinks = value;\n updateStyle();\n };\n\n self.displayProteinLinks = function(value) {\n self.displayParameters.displayProteinLinks = value;\n updateStyle();\n };\n\n self.displayDirectionArrows = function(value) {\n self.displayParameters.displayDirectionArrows = value;\n updateStyle();\n };\n}\n","import {RNAGraph} from './rnagraph.js';\n\nimport {simpleXyCoordinates} from './simplernaplot.js';\nimport {NAView} from './naview/naview.js'\n\nimport fstyle from './fornac.css';\n\nexport function rnaPlot(passedOptions = {}) {\n var options = {\n 'width': 300,\n 'height': 300,\n 'nucleotideRadius': 5,\n 'rnaEdgePadding': 1, // how far the leftmost, rightmost, topmost and bottomost\n // nucleotides are from the edge of the plot\n 'labelInterval': 10,\n 'showNucleotideLabels': true,\n 'startNucleotideNumber': 1,\n 'bundleExternalLinks': false,\n\n 'rnaLayout': 'simple', // simple or naview\n 'namePosition': '0 0' // for x and y either 0, 0.5 or 1\n };\n var options = Object.assign(options, passedOptions);\n\n var xScale, yScale;\n\n function createTransformToFillViewport(xValues, yValues) {\n // create transform that will scale the x and y values so that\n // they fill the available viewport\n let xExtent = d3.extent(xValues);\n let yExtent = d3.extent(yValues);\n\n // add the radius of the nucleotides\n xExtent[0] -= options.nucleotideRadius + options.rnaEdgePadding;\n yExtent[0] -= options.nucleotideRadius + options.rnaEdgePadding;\n\n xExtent[1] += options.nucleotideRadius + options.rnaEdgePadding;\n yExtent[1] += options.nucleotideRadius + options.rnaEdgePadding;\n\n // find out how wide and height the molecule\n var xRange = xExtent[1] - xExtent[0];\n var yRange = yExtent[1] - yExtent[0];\n\n // how much wider / taller is it than the available viewport\n var xExtra = xRange - options.width;\n var yExtra = yRange - options.height;\n\n // once we have a scale for one dimension, we can create the scale for the other\n // keeping the same expansion / shrinking ratio\n function createOtherScale(firstScale, newDomain, newRange) {\n var scaleFactor = (firstScale.range()[1] - firstScale.range()[0]) /\n (firstScale.domain()[1] - firstScale.domain()[0]);\n var newWidth = (newDomain[1] - newDomain[0]) * scaleFactor\n var newMargin = ((newRange[1] - newRange[0]) - newWidth) / 2;\n\n return {'scaleFactor': scaleFactor,\n 'scale': d3.scale.linear()\n .domain(newDomain)\n .range([newRange[0] + newMargin, newRange[1] - newMargin])};\n }\n\n var ret;\n\n if (xExtra > yExtra) {\n // we have to shrink more in the x-dimension than the y\n xScale = d3.scale.linear()\n .domain(xExtent)\n .range([0, options.width])\n\n ret = createOtherScale(xScale, yExtent, [0, options.height]);\n yScale = ret.scale;\n } else {\n // we have to shrink more in the x-dimension than the y\n yScale = d3.scale.linear()\n .domain(yExtent)\n .range([0, options.height])\n\n ret = createOtherScale(yScale, xExtent, [0, options.width]);\n xScale = ret.scale;\n }\n\n var xOffset = xScale.range()[0] - xScale.domain()[0];\n var yOffset = yScale.range()[0] - yScale.domain()[0];\n\n return 'translate(' + -(xScale.domain()[0] * ret.scaleFactor - xScale.range()[0]) +\n ',' + -(yScale.domain()[0] * ret.scaleFactor - yScale.range()[0]) + ')' +\n 'scale(' + ret.scaleFactor + ')';\n }\n\n function createNucleotides(selection, nucleotideNodes) {\n // create groupings for each nucleotide and label\n var gs = selection\n .selectAll('.gnode')\n .data(nucleotideNodes)\n .enter()\n .append('svg:g')\n .classed('gnode', true)\n .attr('transform', function(d) {\n return 'translate(' + d.x + ',' + d.y + ')';\n });\n\n var circles = gs.append('svg:circle')\n .classed(fstyle.node, true)\n .attr('node_type', 'nucleotide')\n .attr('base_type', (d) => { if (d.name) { return d.name.toLowerCase(); }})\n .attr('r', options.nucleotideRadius)\n\n\n if (options.showNucleotideLabels) {\n var nucleotideLabels = gs.append('svg:text')\n .text(function(d) { return d.name; })\n .classed(fstyle.nodeLabel, true)\n .append('svg:title')\n .text(function(d) { return d.struct_name + ':' + d.num; });\n }\n }\n\n function createLabels(selection, labelNodes) {\n // create groupings for each nucleotide and label\n\n var gs = selection\n .selectAll()\n .data(labelNodes)\n .enter()\n .append('svg:g')\n .classed('gnode', true)\n .attr('transform', function(d) {\n return 'translate(' + d.x + ',' + d.y + ')';\n });\n\n var circles = gs.append('svg:circle')\n .classed(fstyle.node, true)\n .attr('node_type', 'label')\n .attr('r', options.nucleotideRadius)\n\n var numberLabels = gs.append('svg:text')\n .classed(fstyle.nodeLabel, true)\n .text(function(d) { return d.name; })\n }\n\n function createName(selection, name) {\n let nameLabel = selection.append('svg:text')\n //.attr('dy', -10)\n .classed(fstyle.plotLabel, true)\n .text(name);\n\n let xyPos = options.namePosition.split(\" \", 2) // 0 0.5 1\n let xy = []\n let textBBox = nameLabel.node().getBBox()\n let textSize = [textBBox.width, textBBox.height]\n let plotSize = [options.width, options.height]\n\n for (let p in [0, 1]) {\n switch (xyPos[p]) {\n case '0':\n xy[p] = textSize[p] / 2\n break;\n case '1':\n xy[p] = plotSize[p] - textSize[p] / 2\n break;\n case '0.5':\n xy[p] = plotSize[p] / 2\n break;\n }\n }\n nameLabel.attr('x', xy[0]).attr('y', xy[1])\n }\n\n function makeExternalLinksBundle(selection, links) {\n var nodesDict = {};\n var linksList = [];\n links = links.filter(function(d) { return d.linkType == 'correct' || d.linkType == 'incorrect' || d.linkType == 'extra'; });\n\n selection.selectAll('[link-type=extra]')\n .remove();\n\n\n for (var i = 0; i < links.length; i++) {\n if (links[i].source === null || links[i].target === null)\n continue;\n\n nodesDict[links[i].source.uid] = links[i].source;\n nodesDict[links[i].target.uid] = links[i].target;\n\n linksList.push({'source': links[i].source.uid, 'target': links[i].target.uid, 'linkType': links[i].linkType, 'extraLinkType': links[i].extraLinkType}) ;\n }\n\n var fbundling = d3.ForceEdgeBundling().nodes(nodesDict).edges(linksList)\n .compatibility_threshold(0.8).step_size(0.2);\n var results = fbundling();\n\n var d3line = d3.svg.line()\n .x(function(d){return d.x;})\n .y(function(d){return d.y;})\n .interpolate('linear');\n\n for (var i = 0; i < results.length; i++) {\n var edge_subpoint_data = results[i];\n // for each of the arrays in the results\n // draw a line between the subdivions points for that edge\n\n selection.append('path').attr('d', d3line(edge_subpoint_data))\n .style('fill', 'none')\n .attr('link-type', function(d) { return linksList[i].linkType; })\n .attr('extra-link-type', function(d) { return linksList[i].extraLinkType; })\n .style('stroke-opacity',0.4); //use opacity as blending\n }\n\n }\n\n function createLinks(selection, links) {\n links = links.filter(function(d) { return d.source !== null && d.target !== null; });\n var gs = selection.selectAll('.link')\n .data(links)\n .enter()\n .append('svg:line')\n .attr('x1', function(d) { return d.source.x; })\n .attr('x2', function(d) { return d.target.x; })\n .attr('y1', function(d) { return d.source.y; })\n .attr('y2', function(d) { return d.target.y; })\n .attr('link-type', function(d) { return d.linkType; })\n .attr('extra-link-type', function(d) { return d.extraLinkType; })\n .classed('link', true)\n .classed(fstyle.link, true)\n }\n\n function chart(selection) {\n selection.each(function(data) {\n let plot = d3.select(this).append('g')\n .classed(fstyle.plot, true)\n\n // data should be a dictionary containing at least a structure\n // and possibly a sequence\n let rg = new RNAGraph(data.sequence, data.structure, data.name, options.startNucleotideNumber)\n .recalculateElements()\n .elementsToJson()\n .addName(data.name);\n\n data.rnaGraph = rg;\n // calculate the position of each nucleotide\n // the positions of the labels will be calculated in\n // the addLabels function\n let positions = [];\n\n if (options.rnaLayout === 'naview') {\n var naview = new NAView();\n var naViewPositions = naview.naview_xy_coordinates(rg.pairtable);\n\n for (var i = 0; i < naViewPositions.nbase; i++) {\n positions.push([naViewPositions.x[i], naViewPositions.y[i]]);\n }\n } else {\n positions = simpleXyCoordinates(rg.pairtable);\n }\n\n rg.addPositions('nucleotide', positions)\n //.reinforceStems()\n //.reinforceLoops()\n //.addExtraLinks(data.extraLinks)\n .addLabels(options.startNucleotideNumber, options.labelInterval);\n\n // create a transform that will fit the molecule to the\n // size of the viewport (canvas, svg, whatever)\n let fillViewportTransform = createTransformToFillViewport(\n rg.nodes.map(function(d) { return d.x; }),\n rg.nodes.map(function(d) { return d.y; })\n );\n plot.attr('transform', fillViewportTransform);\n\n let nucleotideNodes = rg.nodes.filter(function(d) {\n return d.nodeType == 'nucleotide';\n });\n\n let labelNodes = rg.nodes.filter(function(d) {\n return d.nodeType == 'label';\n });\n\n let links = rg.links;\n\n createLinks(plot, links);\n createNucleotides(plot, nucleotideNodes);\n createLabels(plot, labelNodes);\n createName(d3.select(this), data.name);\n\n if (options.bundleExternalLinks) {\n makeExternalLinksBundle(plot, links);\n }\n\n });\n }\n\n chart.width = function(_) {\n if (!arguments.length) return options.width;\n options.width = _;\n return chart;\n };\n\n chart.height = function(_) {\n if (!arguments.length) return options.height;\n options.height = _;\n return chart;\n };\n\n chart.showNucleotideLabels = function(_) {\n if (!arguments.length) return options.showNucleotideLabels;\n options.showNucleotideLabels = _;\n return chart;\n };\n\n chart.rnaEdgePadding = function(_) {\n if (!arguments.length) return options.rnaEdgePadding;\n options.rnaEdgePadding = _;\n return chart;\n };\n\n chart.nucleotideRadius = function(_) {\n if (!arguments.length) return options.nucleotideRadius;\n options.nucleotideRadius = _;\n return chart;\n };\n\n chart.labelInterval = function(_) {\n if (!arguments.length) return options.labelInterval;\n options.labelInterval = _;\n return chart;\n };\n\n chart.showNucleotideLabels = function(_) {\n if (!arguments.length) return options.showNucleotideLabels;\n options.showNucleotideLabels = _;\n return chart;\n };\n\n chart.startNucleotideNumber = function(_) {\n if (!arguments.length) return options.startNucleotideNumber;\n options.startNucleotideNumber = _;\n return chart;\n };\n\n chart.bundleExternalLinks = function(_) {\n if (!arguments.length) return options.bundleExternalLinks;\n options.bundleExternalLinks = _;\n return chart;\n };\n\n chart.rnaLayout = function(_) {\n if (!arguments.length) return options.rnaLayout;\n options.rnaLayout = _;\n return chart;\n };\n\n chart.namePosition = function(_) {\n if (!arguments.length) return options.namePosition;\n options.namePosition = _;\n return chart;\n };\n\n return chart;\n}\n","import {rnaPlot} from './rnaplot.js';\n\nexport function rnaTreemap(passedOptions = {}) {\n var options = {\n 'width': 300,\n 'height': 300,\n 'nucleotideRadius': 5,\n 'rnaEdgePadding': 1, // how far the leftmost, rightmost, topmost and bottomost\n // nucleotides are from the edge of the plot\n 'labelInterval': 10,\n 'showNucleotideLabels': true,\n 'startNucleotideNumber': 1,\n 'bundleExternalLinks': false,\n\n 'rnaLayout': 'simple', // simple or naview\n 'namePosition': '0 0', // for x and y either 0, 0.5 or 1\n };\n\n var options = Object.assign(options, passedOptions);\n\n function rnaTreemapNode(selection) {\n // create a background rectangle for each RNA structure\n selection.each(function(d) {\n d3.select(this)\n .attr('transform', function(d) { return 'translate(' + d.x + ',' + d.y + ')' })\n .append('rect')\n .attr('fill', 'transparent')\n .attr('width', function(d) { return Math.max(0, d.dx); })\n .attr('height', function(d) { return Math.max(0, d.dy); })\n\n // draw the actual RNA structure\n var chart = rnaPlot(options)\n .width( Math.max(0, d.dx))\n .height( Math.max(0, d.dy))\n\n if ('structure' in d) d3.select(this).call(chart)\n });\n }\n\n var chart = function(selection) {\n selection.each(function(data) {\n console.log('data:', data)\n // initialize the treemap structure\n // sample input\n // { 'name': 'blah',\n // 'children: [{'structure': '..((..))',\n // 'sequence': 'ACCGGCC',\n // 'size': 50}]\n // }\n var treemap = d3.layout.treemap()\n .size([options.width, options.height])\n .sticky(false)\n .value(function(d) { return d.size; });\n\n // create a new for each node in the treemap\n // this may be a little redundant, since we expect the calling\n // selection to contain their own g elements\n var gEnter = d3.select(this)\n .append('g')\n .classed('rnatreemap', true)\n var treemapGnodes = gEnter.datum(data).selectAll('.treemapnode')\n .data(treemap.nodes)\n .enter()\n .append('g')\n .classed('treemapnode', true)\n .call(rnaTreemapNode);\n });\n };\n\n chart.width = function(_) {\n if (!arguments.length) return options.width;\n options.width = _;\n return chart;\n };\n\n chart.height = function(_) {\n if (!arguments.length) return options.height;\n options.height = _;\n return chart;\n };\n\n chart.showNucleotideLabels = function(_) {\n if (!arguments.length) return options.showNucleotideLabels;\n options.showNucleotideLabels = _;\n return chart;\n };\n\n chart.rnaEdgePadding = function(_) {\n if (!arguments.length) return options.rnaEdgePadding;\n options.rnaEdgePadding = _;\n return chart;\n };\n\n chart.nucleotideRadius = function(_) {\n if (!arguments.length) return options.nucleotideRadius;\n options.nucleotideRadius = _;\n return chart;\n };\n\n chart.labelInterval = function(_) {\n if (!arguments.length) return options.labelInterval;\n options.labelInterval = _;\n return chart;\n };\n\n chart.showNucleotideLabels = function(_) {\n if (!arguments.length) return options.showNucleotideLabels;\n options.showNucleotideLabels = _;\n return chart;\n };\n\n chart.startNucleotideNumber = function(_) {\n if (!arguments.length) return options.startNucleotideNumber;\n options.startNucleotideNumber = _;\n return chart;\n };\n\n chart.bundleExternalLinks = function(_) {\n if (!arguments.length) return options.bundleExternalLinks;\n options.bundleExternalLinks = _;\n return chart;\n };\n\n chart.rnaLayout = function(_) {\n if (!arguments.length) return options.rnaLayout;\n options.rnaLayout = _;\n return chart;\n };\n\n chart.namePosition = function(_) {\n if (!arguments.length) return options.namePosition;\n options.namePosition = _;\n return chart;\n };\n\n chart.zoom = function(_) {\n if (!arguments.length) return options.zoom;\n options.zoom = _;\n return chart;\n };\n\n return chart;\n}\n"],"names":["root","factory","exports","module","require","define","amd","self","__WEBPACK_EXTERNAL_MODULE__990__","Connection","this","loop","Loop","region","Region","start","end","xrad","yrad","angle","extruded","broken","_isNull","prototype","isNull","setNull","getLoop","setLoop","getRegion","setRegion","getStart","setStart","getEnd","setEnd","getXrad","setXrad","getYrad","setYrad","getAngle","setAngle","isExtruded","setExtruded","isBroken","setBroken","nconnection","connections","_connections","number","depth","mark","x","y","radius","getNconnection","setNconnection","setConnection","i","c","getConnection","addConnection","push","getNumber","setNumber","getDepth","setDepth","isMark","setMark","getX","setX","getY","setY","getRadius","setRadius","_start1","_end1","_start2","_end2","getStart1","setStart1","start1","getEnd1","setEnd1","end1","getStart2","setStart2","start2","getEnd2","setEnd2","end2","byteLength","b64","lens","getLens","validLen","placeHoldersLen","toByteArray","tmp","arr","Arr","_byteLength","curByte","len","revLookup","charCodeAt","fromByteArray","uint8","length","extraBytes","parts","maxChunkLength","len2","encodeChunk","lookup","join","Uint8Array","Array","code","Error","indexOf","num","output","base64","ieee754","customInspectSymbol","Symbol","Buffer","SlowBuffer","alloc","INSPECT_MAX_BYTES","K_MAX_LENGTH","createBuffer","RangeError","buf","Object","setPrototypeOf","arg","encodingOrOffset","TypeError","allocUnsafe","from","value","string","encoding","isEncoding","actual","write","slice","fromString","ArrayBuffer","isView","arrayView","isInstance","copy","fromArrayBuffer","buffer","byteOffset","fromArrayLike","fromArrayView","SharedArrayBuffer","valueOf","b","obj","isBuffer","checked","undefined","numberIsNaN","type","isArray","data","fromObject","toPrimitive","assertSize","size","array","toString","mustMatch","arguments","loweredCase","utf8ToBytes","base64ToBytes","toLowerCase","slowToString","hexSlice","utf8Slice","asciiSlice","latin1Slice","base64Slice","utf16leSlice","swap","n","m","bidirectionalIndexOf","val","dir","arrayIndexOf","call","lastIndexOf","indexSize","arrLength","valLength","String","read","readUInt16BE","foundIndex","found","j","hexWrite","offset","Number","remaining","strLen","parsed","parseInt","substr","utf8Write","blitBuffer","asciiWrite","str","byteArray","asciiToBytes","base64Write","ucs2Write","units","hi","lo","utf16leToBytes","Math","min","res","firstByte","codePoint","bytesPerSequence","secondByte","thirdByte","fourthByte","tempCodePoint","codePoints","MAX_ARGUMENTS_LENGTH","fromCharCode","apply","decodeCodePointsArray","kMaxLength","TYPED_ARRAY_SUPPORT","proto","foo","e","typedArraySupport","console","error","defineProperty","enumerable","get","poolSize","fill","allocUnsafeSlow","_isBuffer","compare","a","concat","list","pos","set","swap16","swap32","swap64","toLocaleString","equals","inspect","max","replace","trim","target","thisStart","thisEnd","thisCopy","targetCopy","includes","isFinite","toJSON","_arr","ret","out","hexSliceLookupTable","bytes","checkOffset","ext","checkInt","wrtBigUInt64LE","checkIntBI","BigInt","wrtBigUInt64BE","checkIEEE754","writeFloat","littleEndian","noAssert","writeDouble","newBuf","subarray","readUintLE","readUIntLE","mul","readUintBE","readUIntBE","readUint8","readUInt8","readUint16LE","readUInt16LE","readUint16BE","readUint32LE","readUInt32LE","readUint32BE","readUInt32BE","readBigUInt64LE","defineBigIntMethod","validateNumber","first","last","boundsError","readBigUInt64BE","readIntLE","pow","readIntBE","readInt8","readInt16LE","readInt16BE","readInt32LE","readInt32BE","readBigInt64LE","readBigInt64BE","readFloatLE","readFloatBE","readDoubleLE","readDoubleBE","writeUintLE","writeUIntLE","writeUintBE","writeUIntBE","writeUint8","writeUInt8","writeUint16LE","writeUInt16LE","writeUint16BE","writeUInt16BE","writeUint32LE","writeUInt32LE","writeUint32BE","writeUInt32BE","writeBigUInt64LE","writeBigUInt64BE","writeIntLE","limit","sub","writeIntBE","writeInt8","writeInt16LE","writeInt16BE","writeInt32LE","writeInt32BE","writeBigInt64LE","writeBigInt64BE","writeFloatLE","writeFloatBE","writeDoubleLE","writeDoubleBE","targetStart","copyWithin","errors","E","sym","getMessage","Base","constructor","super","writable","configurable","name","stack","message","addNumericalSeparator","range","ERR_OUT_OF_RANGE","checkBounds","ERR_INVALID_ARG_TYPE","floor","ERR_BUFFER_OUT_OF_BOUNDS","input","msg","received","isInteger","abs","INVALID_BASE64_RE","Infinity","leadSurrogate","split","base64clean","src","dst","alphabet","table","i16","fn","BufferBigIntNotDefined","isLE","mLen","nBytes","eLen","eMax","eBias","nBits","d","s","NaN","rt","isNaN","log","LN2","uuid","encode","uuid_","parse","substring","decode","slug","stringify","v4","nice","getRandomValues","rnds8","rng","crypto","bind","msCrypto","byteToHex","_nodeId","_clockseq","_lastMSecs","_lastNSecs","options","node","clockseq","seedBytes","random","msecs","Date","now","nsecs","dt","tl","tmh","v","version","hashfunc","generateUUID","namespace","unescape","encodeURIComponent","stringToBytes","err","DNS","URL","getOutputLength","inputLength8","safeAdd","lsw","md5cmn","q","t","cnt","md5ff","md5gg","md5hh","md5ii","v35","length32","hexTab","hex","charAt","md5ToHexEncodedArray","olda","oldb","oldc","oldd","wordsToMd5","length8","Uint32Array","bytesToWords","rnds","f","z","ROTL","K","H","l","N","ceil","M","_i","_i2","W","_t","_t2","T","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","getter","__esModule","definition","key","o","g","globalThis","Function","window","prop","hasOwnProperty","r","toStringTag","scriptUrl","importScripts","location","document","currentScript","scripts","getElementsByTagName","p","contextMenu","menu","opts","openCallback","closeCallback","previouslyMouseUp","uid","slugid","rootElement","orientation","initialPos","parentStart","onOpen","onClose","d3","enter","append","classed","on","style","index","pMouseUp","elm","mousePos","currentThis","openChildMenuUid","html","selectAll","attr","divider","disabled","action","title","children","childUid","boundingRect","getBoundingClientRect","childrenContextMenu","left","pageXOffset","top","pageYOffset","width","ArrowIcon","contextMenuSelection","innerWidth","numberSort","arraysEqual","RNAUtilities","bracketLeft","bracketRight","inverseBrackets","bracket","maximumMatching","pt","mm","maximum","backtrackMaximumMatching","oldPt","map","mmBt","dotbracketToPairtable","dotbracket","inverseBracketLeft","inverseBracketRight","ni","pop","insertIntoStack","k","deleteFromStack","pairtableToDotbracket","seen","findUnmatched","to","toRemove","unmatched","origFrom","origTo","removePseudoknotsFromPairtable","newPt","removed","ptToElements","level","dotBracketBreaks","elements","u5","u3","sort","external","right","combined","rnaUtilities","ColorScheme","colorsText","parseRange","rangeText","nums","parts1","parseColorText","colorText","lines","currMolecule","counter","colorsJson","colorValues","domainValues","words","search","partsRight","domain","color","normalizeColors","moleculeName","minNum","MAX_VALUE","maxNum","MIN_VALUE","resnum","RNAGraph","seq","structName","startNumber","circularizeExternal","circular","pseudoknotPairs","nucsToNodes","addUids","uids","nucleotideNodes","nodes","filter","nodeType","computePairtable","pairtable","removeBreaks","targetString","breaks","breakIndex","seqBreaks","rnaLength","addPositions","positions","labelNodes","breakNodesToFakeNodes","elemType","getPositions","getUids","reinforceStems","relevantElements","allNucs","nucs","addFakeNode","reinforceLoops","filterNucs","newNode1","px","py","newNode2","updateLinkUids","links","source","tan","fakeNodeUid","newNode","newX","newY","coordsCounted","cos","ia","fromNode","connectFakeNodes","fakeNodes","linked","thisNode","thisNuc","JSON","distance","addExtraLinks","extraLinks","newLink","getNodeFromNucleotides","linkType","elementsToJson","elemTypes","nodeName","prevNode","nextNode","addLabels","labelInterval","prevVec","nextVec","combinedVec","vecLength","sqrt","normedVec","offsetVec","recalculateElements","removePseudoknots","externalLoop","eloop","prev","hloop","numGreater","reassignLinkUids","addPseudoknots","addName","simpleXyCoordinates","pair_table","alpha","loop_size","stack_size","lp","stk","PIHALF","PI","i_old","partner","start_k","start_l","ladder","begin","diff","polygon","count","bubble","remember","poss","sin","Radloop","loopnumber","next","getLoopnumber","setLoopnumber","getNext","setNext","getPrev","setPrev","mate","extracted","getMate","setMate","isExtracted","setExtracted","NAView","ANUM","MAXITER","bases","nbase","nregion","loop_count","loops","regions","rlphead","lencut","RADIUS_REDUCTION_FACTOR","angleinc","_h","HELIX_FACTOR","BACKBONE_DISTANCE","determine_depths","FornaContainer","element","passedOptions","assign","initialSize","svgW","svgH","linkStrengths","displayParameters","colorScheme","customColors","rnas","mousedownNode","mouseupNode","linkContextMenuShown","resetMouseVars","graph","editable","animation","shiftKeydown","ctrlKeydown","keydown","getStructuresDotBracket","centerView","zoomable","disableZooming","enableBrushing","keyup","enableZooming","disableBrushing","backgroundMenu","canvasMousePos","xScale","invert","yScale","addRNA","nodeMenu","deleteNode","changeNode","insertNodeBeforeOrAfter","nodeContextMenu","backgroundContextMenu","select","remove","svg","each","focus","mouseEventHelper","mpos","vis","dragLine","fstyle","deselectAllNodes","visLinks","visNodes","zoomer","scaleExtent","toggleSelectNode","selected","selectNode","selectedNodes","brusher","extent","force","charge","middleCharge","otherCharge","friction","linkDistance","linkDistanceMultiplier","linkStrength","other","gravity","chargeDistance","drag","d1","fixed","resumeForce","createInitialLayout","structure","rg","sequence","rnaJson","layout","naview","naViewPositions","naview_xy_coordinates","createNewNodes","gnodesEnter","previouslySelected","rna","transition","duration","ease","nodeMousedown","nodeMouseup","labelAndProteinNodes","text","createNewLinks","linksEnter","linkLines","linkClick","drawDirectionArrow","magnitude","endPoint","startPoint","nodeStroke","parseFloat","lengthMult","arrowWidth","u","arrowTip","path","realLinkFilter","recalculateGraph","uidsToNodes","forEach","link","fakeLinks","linkIndex","splice","update","allLinks","elementKey","exit","gnodes","realNodes","collide","nx1","nx2","ny1","ny2","quad","x1","y1","x2","y2","point","visit","changeColorScheme","updateStyle","transitionRNA","newStructure","nextFunction","transitionDuration","newRNAJson","newNodes","callback","setTimeout","getBoundingBoxTransform","minX","minY","maxX","maxY","maxRadius","molWidth","molHeight","widthRatio","heightRatio","minRatio","maxNodeRadius","newMolWidth","newMolHeight","bbTransform","translate","scale","setSize","offsetWidth","offsetHeight","setOutlineColor","addCustomColors","json","addCustomColorsText","customColorsText","cs","newColorScheme","interpolate","changeColors","moleculeColors","displayNumbering","displayNodeOutline","displayNodeLabel","displayLinks","displayPseudoknotLinks","displayProteinLinks","displayAllLinks","displayDirectionArrows","referenceNode","newNodeNum","newDotbracket","newSequence","newPositions","positionOffset","newUids","pair","updateRnaGraph","nucleotidePositions","labelPositions","removeBackBoneLink","sequence1","sequence2","rnaDotBracket","dotBracket1","dotBracket2","positions1","positions2","uids1","uids2","rna1","rna2","removeLink","extraLinkIndex","addBackBoneLink","dotbracket1","dotbracket2","seq1","seq2","newSeq","toAddExternal","toDelete","newRna","basepairPossible","linkMenu","addLink","linkContextMenu","fromJSON","jsonString","ProteinGraph","addRNAJSON","newLinks","addExternalLinks","centerPos","avoidOthers","rnaGraph","totalX","totalY","nodeCount","addNodes","entry","clearNodes","externalLinks","currIdx","nodeIdxs","idx1","idx2","startAnimation","stopAnimation","stop","resume","setFriction","setCharge","setGravity","setPseudoknotStrength","pseudoknot","rnaPlot","createTransformToFillViewport","xValues","yValues","xExtent","yExtent","nucleotideRadius","rnaEdgePadding","xRange","yRange","createOtherScale","firstScale","newDomain","newRange","scaleFactor","newWidth","newMargin","linear","height","createNucleotides","selection","gs","showNucleotideLabels","struct_name","createLabels","createName","nameLabel","xyPos","namePosition","xy","textBBox","getBBox","textSize","plotSize","makeExternalLinksBundle","nodesDict","linksList","extraLinkType","results","ForceEdgeBundling","edges","compatibility_threshold","step_size","fbundling","d3line","line","edge_subpoint_data","createLinks","chart","plot","startNucleotideNumber","rnaLayout","fillViewportTransform","bundleExternalLinks","_","rnaTreemap","rnaTreemapNode","dx","dy","treemap","sticky","datum","zoom","read_in_bases","find_regions","construct_loop","find_central_loop","traverse_loop","npairs","nb1","ibase","retloop","cp","rp","rlp","maxconn","maxdepth","anchor_connection","xs","ys","xe","xn","yn","xc","yc","xo","yo","astart","aend","cpnext","acp","cpprev","ic","da","maxang","icstart","icend","icmiddle","icroot","done","done_all_connections","rooted","sign","midx","midy","nrx","nry","mx","my","vx","vy","dotmv","nmidx","nmidy","icstart1","icup","icdown","icnext","direction","dan","rr","cpx","cpy","cpnextx","cpnexty","cnx","rcn","rc","lnx","lny","rl","ac","acn","sx","sy","dcp","imaxloop","indice","atan2","set_radius","determine_radius","connected_connection","find_ic_middle","asin","construct_extruded_segment","generate_region","mindit","ci","sumn","sumd","dit","imindit","rt2_2","aend1","aend2","aave","a1","a2","dac","nstart","nend","collision","construct_circle_segment","minf2","maxf2","find_center_for_arc","h","hhi","hlow","disc","theta","iter","acos","noIterationFailureYet"],"sourceRoot":""}
\ No newline at end of file
+{"version":3,"file":"fornac.js","mappings":"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","sources":["webpack://fornac/webpack/universalModuleDefinition","webpack://fornac/./src/naview/connection.js","webpack://fornac/./src/naview/loop.js","webpack://fornac/./src/naview/region.js","webpack://fornac/./node_modules/base64-js/index.js","webpack://fornac/./node_modules/buffer/index.js","webpack://fornac/./src/d3-context-menu.css?fe1f","webpack://fornac/./src/fornac.css?7f8e","webpack://fornac/./node_modules/ieee754/index.js","webpack://fornac/./node_modules/slugid/index.js","webpack://fornac/./node_modules/slugid/slugid.js","webpack://fornac/./node_modules/uuid/dist/esm-browser/rng.js","webpack://fornac/./node_modules/uuid/dist/esm-browser/regex.js","webpack://fornac/./node_modules/uuid/dist/esm-browser/validate.js","webpack://fornac/./node_modules/uuid/dist/esm-browser/stringify.js","webpack://fornac/./node_modules/uuid/dist/esm-browser/v1.js","webpack://fornac/./node_modules/uuid/dist/esm-browser/parse.js","webpack://fornac/./node_modules/uuid/dist/esm-browser/v35.js","webpack://fornac/./node_modules/uuid/dist/esm-browser/md5.js","webpack://fornac/./node_modules/uuid/dist/esm-browser/v3.js","webpack://fornac/./node_modules/uuid/dist/esm-browser/v4.js","webpack://fornac/./node_modules/uuid/dist/esm-browser/sha1.js","webpack://fornac/./node_modules/uuid/dist/esm-browser/v5.js","webpack://fornac/./node_modules/uuid/dist/esm-browser/nil.js","webpack://fornac/./node_modules/uuid/dist/esm-browser/version.js","webpack://fornac/external umd \"d3\"","webpack://fornac/webpack/bootstrap","webpack://fornac/webpack/runtime/compat get default export","webpack://fornac/webpack/runtime/define property getters","webpack://fornac/webpack/runtime/global","webpack://fornac/webpack/runtime/hasOwnProperty shorthand","webpack://fornac/webpack/runtime/make namespace object","webpack://fornac/webpack/runtime/publicPath","webpack://fornac/./src/img/play.svg","webpack://fornac/./src/d3-context-menu.js","webpack://fornac/./src/rnautils.js","webpack://fornac/./src/rnagraph.js","webpack://fornac/./src/simplernaplot.js","webpack://fornac/./src/naview/radloop.js","webpack://fornac/./src/naview/base.js","webpack://fornac/./src/naview/naview.js","webpack://fornac/./src/fornac.js","webpack://fornac/./src/rnaplot.js","webpack://fornac/./src/rnatreemap.js"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"d3\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([\"d3\"], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"fornac\"] = factory(require(\"d3\"));\n\telse\n\t\troot[\"fornac\"] = factory(root[\"d3\"]);\n})(self, (__WEBPACK_EXTERNAL_MODULE__893__) => {\nreturn ","import {Loop} from './loop.js';\nimport {Region} from './region.js';\n\nexport function Connection() {\n\tthis.loop = new Loop();\n\tthis.region = new Region();\n\t// Start and end form the 1st base pair of the region.\n\tthis.start = null;\n this.end = null;\n\tthis.xrad = null;\n this.yrad = null;\n this.angle = null;\n\t// True if segment between this connection and the\n\t// next must be extruded out of the circle\n\tthis.extruded = null;\n\t// True if the extruded segment must be drawn long.\n\tthis.broken = null;\n\n\tthis._isNull = false;\n}\n\nConnection.prototype.isNull = function(){\n\treturn this._isNull;\n}\n\nConnection.prototype.setNull = function(isNull){\n\tthis._isNull = isNull;\n}\n\nConnection.prototype.getLoop = function(){\n\treturn this.loop;\n}\n\nConnection.prototype.setLoop = function(loop) {\n\tthis.loop = loop;\n}\n\nConnection.prototype.getRegion = function(){\n\treturn this.region;\n}\n\nConnection.prototype.setRegion = function(region){\n\tthis.region = region;\n}\n\nConnection.prototype.getStart = function(){\n\treturn this.start;\n}\n\nConnection.prototype.setStart = function(start) {\n\tthis.start = start;\n}\n\nConnection.prototype.getEnd = function(){\n\treturn this.end;\n}\n\nConnection.prototype.setEnd = function(end){\n\tthis.end = end;\n}\n\nConnection.prototype.getXrad = function(){\n\treturn this.xrad;\n}\n\nConnection.prototype.setXrad = function(xrad){\n\tthis.xrad = xrad;\n}\n\nConnection.prototype.getYrad = function(){\n\treturn this.yrad;\n}\n\nConnection.prototype.setYrad = function(yrad) {\n\tthis.yrad = yrad;\n}\n\nConnection.prototype.getAngle = function(){\n\treturn this.angle;\n}\n\nConnection.prototype.setAngle = function(angle){\n\tthis.angle = angle;\n}\n\nConnection.prototype.isExtruded = function(){\n\treturn this.extruded;\n}\n\nConnection.prototype.setExtruded = function(extruded){\n\tthis.extruded = extruded;\n}\n\nConnection.prototype.isBroken = function(){\n\treturn this.broken;\n}\n\nConnection.prototype.setBroken = function(broken){\n\tthis.broken = broken;\n}\n","import {Connection} from './connection.js';\n\nexport function Loop() {\n\tthis.nconnection = null;\n\tthis.connections = [];\n\tthis._connections = [];\n\tthis.number = null;\n\tthis.depth = null;\n\tthis.mark = null;\n\tthis.x = null;\n this.y = null;\n this.radius = null;\n}\n\nLoop.prototype.getNconnection = function() {\n\treturn this.nconnection;\n}\n\nLoop.prototype.setNconnection = function(nconnection) {\n\tthis.nconnection = nconnection;\n}\n\nLoop.prototype.setConnection = function(i, c){\n\tif (c != null){\n\t\tthis._connections[i] = c;\n }\n\telse {\n\t\tif (!this._connections[i]){\n\t\t\tthis._connections[i] = new Connection();\n\t\t}\n\t\tthis._connections[i].setNull(true);\n\t}\n}\n\nLoop.prototype.getConnection = function(i){\n\tvar Connection = require(\"./connection\");\n\tif (!this._connections[i]){\n this._connections[i] = new Connection();\n }\n\tvar c = this._connections[i];\n\tif (c.isNull()){\n\t\treturn null;\n }\n\telse {\n\t\treturn c;\n }\n}\n\nLoop.prototype.addConnection = function(i, c){\n\tthis._connections.push(c);\n}\n\nLoop.prototype.getNumber = function(){\n\treturn this.number;\n}\n\nLoop.prototype.setNumber = function(number){\n\tthis.number = number;\n}\n\nLoop.prototype.getDepth = function(){\n\treturn this.depth;\n}\n\nLoop.prototype.setDepth = function(depth){\n\tthis.depth = depth;\n}\n\nLoop.prototype.isMark = function(){\n\treturn this.mark;\n}\n\nLoop.prototype.setMark = function(mark){\n\tthis.mark = mark;\n}\n\nLoop.prototype.getX = function(){\n\treturn this.x;\n}\n\nLoop.prototype.setX = function(x){\n\tthis.x = x;\n}\n\nLoop.prototype.getY = function(){\n\treturn this.y;\n}\n\nLoop.prototype.setY = function(y){\n\tthis.y = y;\n}\n\nLoop.prototype.getRadius = function(){\n\treturn this.radius;\n}\n\nLoop.prototype.setRadius = function(radius){\n\tthis.radius = radius;\n}\n","export function Region() {\n\tthis._start1 = null;\n this._end1 = null;\n this._start2 = null;\n this._end2 = null;\n}\n\nRegion.prototype.getStart1 = function(){\n\treturn this._start1;\n}\n\nRegion.prototype.setStart1 = function(start1){\n\tthis._start1 = start1;\n}\n\nRegion.prototype.getEnd1 = function(){\n\treturn this._end1;\n}\n\nRegion.prototype.setEnd1 = function(end1){\n\tthis._end1 = end1;\n}\n\nRegion.prototype.getStart2 = function(){\n\treturn this._start2;\n}\n\nRegion.prototype.setStart2 = function(start2){\n\tthis._start2 = start2;\n}\n\nRegion.prototype.getEnd2 = function(){\n\treturn this._end2;\n}\n\nRegion.prototype.setEnd2 = function(end2){\n\tthis._end2 = end2;\n}\n","'use strict'\n\nexports.byteLength = byteLength\nexports.toByteArray = toByteArray\nexports.fromByteArray = fromByteArray\n\nvar lookup = []\nvar revLookup = []\nvar Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array\n\nvar code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'\nfor (var i = 0, len = code.length; i < len; ++i) {\n lookup[i] = code[i]\n revLookup[code.charCodeAt(i)] = i\n}\n\n// Support decoding URL-safe base64 strings, as Node.js does.\n// See: https://en.wikipedia.org/wiki/Base64#URL_applications\nrevLookup['-'.charCodeAt(0)] = 62\nrevLookup['_'.charCodeAt(0)] = 63\n\nfunction getLens (b64) {\n var len = b64.length\n\n if (len % 4 > 0) {\n throw new Error('Invalid string. Length must be a multiple of 4')\n }\n\n // Trim off extra bytes after placeholder bytes are found\n // See: https://github.com/beatgammit/base64-js/issues/42\n var validLen = b64.indexOf('=')\n if (validLen === -1) validLen = len\n\n var placeHoldersLen = validLen === len\n ? 0\n : 4 - (validLen % 4)\n\n return [validLen, placeHoldersLen]\n}\n\n// base64 is 4/3 + up to two characters of the original data\nfunction byteLength (b64) {\n var lens = getLens(b64)\n var validLen = lens[0]\n var placeHoldersLen = lens[1]\n return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen\n}\n\nfunction _byteLength (b64, validLen, placeHoldersLen) {\n return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen\n}\n\nfunction toByteArray (b64) {\n var tmp\n var lens = getLens(b64)\n var validLen = lens[0]\n var placeHoldersLen = lens[1]\n\n var arr = new Arr(_byteLength(b64, validLen, placeHoldersLen))\n\n var curByte = 0\n\n // if there are placeholders, only get up to the last complete 4 chars\n var len = placeHoldersLen > 0\n ? validLen - 4\n : validLen\n\n var i\n for (i = 0; i < len; i += 4) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 18) |\n (revLookup[b64.charCodeAt(i + 1)] << 12) |\n (revLookup[b64.charCodeAt(i + 2)] << 6) |\n revLookup[b64.charCodeAt(i + 3)]\n arr[curByte++] = (tmp >> 16) & 0xFF\n arr[curByte++] = (tmp >> 8) & 0xFF\n arr[curByte++] = tmp & 0xFF\n }\n\n if (placeHoldersLen === 2) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 2) |\n (revLookup[b64.charCodeAt(i + 1)] >> 4)\n arr[curByte++] = tmp & 0xFF\n }\n\n if (placeHoldersLen === 1) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 10) |\n (revLookup[b64.charCodeAt(i + 1)] << 4) |\n (revLookup[b64.charCodeAt(i + 2)] >> 2)\n arr[curByte++] = (tmp >> 8) & 0xFF\n arr[curByte++] = tmp & 0xFF\n }\n\n return arr\n}\n\nfunction tripletToBase64 (num) {\n return lookup[num >> 18 & 0x3F] +\n lookup[num >> 12 & 0x3F] +\n lookup[num >> 6 & 0x3F] +\n lookup[num & 0x3F]\n}\n\nfunction encodeChunk (uint8, start, end) {\n var tmp\n var output = []\n for (var i = start; i < end; i += 3) {\n tmp =\n ((uint8[i] << 16) & 0xFF0000) +\n ((uint8[i + 1] << 8) & 0xFF00) +\n (uint8[i + 2] & 0xFF)\n output.push(tripletToBase64(tmp))\n }\n return output.join('')\n}\n\nfunction fromByteArray (uint8) {\n var tmp\n var len = uint8.length\n var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes\n var parts = []\n var maxChunkLength = 16383 // must be multiple of 3\n\n // go through the array every three bytes, we'll deal with trailing stuff later\n for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) {\n parts.push(encodeChunk(uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength)))\n }\n\n // pad the end with zeros, but make sure to not forget the extra bytes\n if (extraBytes === 1) {\n tmp = uint8[len - 1]\n parts.push(\n lookup[tmp >> 2] +\n lookup[(tmp << 4) & 0x3F] +\n '=='\n )\n } else if (extraBytes === 2) {\n tmp = (uint8[len - 2] << 8) + uint8[len - 1]\n parts.push(\n lookup[tmp >> 10] +\n lookup[(tmp >> 4) & 0x3F] +\n lookup[(tmp << 2) & 0x3F] +\n '='\n )\n }\n\n return parts.join('')\n}\n","/*!\n * The buffer module from node.js, for the browser.\n *\n * @author Feross Aboukhadijeh \n * @license MIT\n */\n/* eslint-disable no-proto */\n\n'use strict'\n\nconst base64 = require('base64-js')\nconst ieee754 = require('ieee754')\nconst customInspectSymbol =\n (typeof Symbol === 'function' && typeof Symbol['for'] === 'function') // eslint-disable-line dot-notation\n ? Symbol['for']('nodejs.util.inspect.custom') // eslint-disable-line dot-notation\n : null\n\nexports.Buffer = Buffer\nexports.SlowBuffer = SlowBuffer\nexports.INSPECT_MAX_BYTES = 50\n\nconst K_MAX_LENGTH = 0x7fffffff\nexports.kMaxLength = K_MAX_LENGTH\n\n/**\n * If `Buffer.TYPED_ARRAY_SUPPORT`:\n * === true Use Uint8Array implementation (fastest)\n * === false Print warning and recommend using `buffer` v4.x which has an Object\n * implementation (most compatible, even IE6)\n *\n * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+,\n * Opera 11.6+, iOS 4.2+.\n *\n * We report that the browser does not support typed arrays if the are not subclassable\n * using __proto__. Firefox 4-29 lacks support for adding new properties to `Uint8Array`\n * (See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438). IE 10 lacks support\n * for __proto__ and has a buggy typed array implementation.\n */\nBuffer.TYPED_ARRAY_SUPPORT = typedArraySupport()\n\nif (!Buffer.TYPED_ARRAY_SUPPORT && typeof console !== 'undefined' &&\n typeof console.error === 'function') {\n console.error(\n 'This browser lacks typed array (Uint8Array) support which is required by ' +\n '`buffer` v5.x. Use `buffer` v4.x if you require old browser support.'\n )\n}\n\nfunction typedArraySupport () {\n // Can typed array instances can be augmented?\n try {\n const arr = new Uint8Array(1)\n const proto = { foo: function () { return 42 } }\n Object.setPrototypeOf(proto, Uint8Array.prototype)\n Object.setPrototypeOf(arr, proto)\n return arr.foo() === 42\n } catch (e) {\n return false\n }\n}\n\nObject.defineProperty(Buffer.prototype, 'parent', {\n enumerable: true,\n get: function () {\n if (!Buffer.isBuffer(this)) return undefined\n return this.buffer\n }\n})\n\nObject.defineProperty(Buffer.prototype, 'offset', {\n enumerable: true,\n get: function () {\n if (!Buffer.isBuffer(this)) return undefined\n return this.byteOffset\n }\n})\n\nfunction createBuffer (length) {\n if (length > K_MAX_LENGTH) {\n throw new RangeError('The value \"' + length + '\" is invalid for option \"size\"')\n }\n // Return an augmented `Uint8Array` instance\n const buf = new Uint8Array(length)\n Object.setPrototypeOf(buf, Buffer.prototype)\n return buf\n}\n\n/**\n * The Buffer constructor returns instances of `Uint8Array` that have their\n * prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of\n * `Uint8Array`, so the returned instances will have all the node `Buffer` methods\n * and the `Uint8Array` methods. Square bracket notation works as expected -- it\n * returns a single octet.\n *\n * The `Uint8Array` prototype remains unmodified.\n */\n\nfunction Buffer (arg, encodingOrOffset, length) {\n // Common case.\n if (typeof arg === 'number') {\n if (typeof encodingOrOffset === 'string') {\n throw new TypeError(\n 'The \"string\" argument must be of type string. Received type number'\n )\n }\n return allocUnsafe(arg)\n }\n return from(arg, encodingOrOffset, length)\n}\n\nBuffer.poolSize = 8192 // not used by this implementation\n\nfunction from (value, encodingOrOffset, length) {\n if (typeof value === 'string') {\n return fromString(value, encodingOrOffset)\n }\n\n if (ArrayBuffer.isView(value)) {\n return fromArrayView(value)\n }\n\n if (value == null) {\n throw new TypeError(\n 'The first argument must be one of type string, Buffer, ArrayBuffer, Array, ' +\n 'or Array-like Object. Received type ' + (typeof value)\n )\n }\n\n if (isInstance(value, ArrayBuffer) ||\n (value && isInstance(value.buffer, ArrayBuffer))) {\n return fromArrayBuffer(value, encodingOrOffset, length)\n }\n\n if (typeof SharedArrayBuffer !== 'undefined' &&\n (isInstance(value, SharedArrayBuffer) ||\n (value && isInstance(value.buffer, SharedArrayBuffer)))) {\n return fromArrayBuffer(value, encodingOrOffset, length)\n }\n\n if (typeof value === 'number') {\n throw new TypeError(\n 'The \"value\" argument must not be of type number. Received type number'\n )\n }\n\n const valueOf = value.valueOf && value.valueOf()\n if (valueOf != null && valueOf !== value) {\n return Buffer.from(valueOf, encodingOrOffset, length)\n }\n\n const b = fromObject(value)\n if (b) return b\n\n if (typeof Symbol !== 'undefined' && Symbol.toPrimitive != null &&\n typeof value[Symbol.toPrimitive] === 'function') {\n return Buffer.from(value[Symbol.toPrimitive]('string'), encodingOrOffset, length)\n }\n\n throw new TypeError(\n 'The first argument must be one of type string, Buffer, ArrayBuffer, Array, ' +\n 'or Array-like Object. Received type ' + (typeof value)\n )\n}\n\n/**\n * Functionally equivalent to Buffer(arg, encoding) but throws a TypeError\n * if value is a number.\n * Buffer.from(str[, encoding])\n * Buffer.from(array)\n * Buffer.from(buffer)\n * Buffer.from(arrayBuffer[, byteOffset[, length]])\n **/\nBuffer.from = function (value, encodingOrOffset, length) {\n return from(value, encodingOrOffset, length)\n}\n\n// Note: Change prototype *after* Buffer.from is defined to workaround Chrome bug:\n// https://github.com/feross/buffer/pull/148\nObject.setPrototypeOf(Buffer.prototype, Uint8Array.prototype)\nObject.setPrototypeOf(Buffer, Uint8Array)\n\nfunction assertSize (size) {\n if (typeof size !== 'number') {\n throw new TypeError('\"size\" argument must be of type number')\n } else if (size < 0) {\n throw new RangeError('The value \"' + size + '\" is invalid for option \"size\"')\n }\n}\n\nfunction alloc (size, fill, encoding) {\n assertSize(size)\n if (size <= 0) {\n return createBuffer(size)\n }\n if (fill !== undefined) {\n // Only pay attention to encoding if it's a string. This\n // prevents accidentally sending in a number that would\n // be interpreted as a start offset.\n return typeof encoding === 'string'\n ? createBuffer(size).fill(fill, encoding)\n : createBuffer(size).fill(fill)\n }\n return createBuffer(size)\n}\n\n/**\n * Creates a new filled Buffer instance.\n * alloc(size[, fill[, encoding]])\n **/\nBuffer.alloc = function (size, fill, encoding) {\n return alloc(size, fill, encoding)\n}\n\nfunction allocUnsafe (size) {\n assertSize(size)\n return createBuffer(size < 0 ? 0 : checked(size) | 0)\n}\n\n/**\n * Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance.\n * */\nBuffer.allocUnsafe = function (size) {\n return allocUnsafe(size)\n}\n/**\n * Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance.\n */\nBuffer.allocUnsafeSlow = function (size) {\n return allocUnsafe(size)\n}\n\nfunction fromString (string, encoding) {\n if (typeof encoding !== 'string' || encoding === '') {\n encoding = 'utf8'\n }\n\n if (!Buffer.isEncoding(encoding)) {\n throw new TypeError('Unknown encoding: ' + encoding)\n }\n\n const length = byteLength(string, encoding) | 0\n let buf = createBuffer(length)\n\n const actual = buf.write(string, encoding)\n\n if (actual !== length) {\n // Writing a hex string, for example, that contains invalid characters will\n // cause everything after the first invalid character to be ignored. (e.g.\n // 'abxxcd' will be treated as 'ab')\n buf = buf.slice(0, actual)\n }\n\n return buf\n}\n\nfunction fromArrayLike (array) {\n const length = array.length < 0 ? 0 : checked(array.length) | 0\n const buf = createBuffer(length)\n for (let i = 0; i < length; i += 1) {\n buf[i] = array[i] & 255\n }\n return buf\n}\n\nfunction fromArrayView (arrayView) {\n if (isInstance(arrayView, Uint8Array)) {\n const copy = new Uint8Array(arrayView)\n return fromArrayBuffer(copy.buffer, copy.byteOffset, copy.byteLength)\n }\n return fromArrayLike(arrayView)\n}\n\nfunction fromArrayBuffer (array, byteOffset, length) {\n if (byteOffset < 0 || array.byteLength < byteOffset) {\n throw new RangeError('\"offset\" is outside of buffer bounds')\n }\n\n if (array.byteLength < byteOffset + (length || 0)) {\n throw new RangeError('\"length\" is outside of buffer bounds')\n }\n\n let buf\n if (byteOffset === undefined && length === undefined) {\n buf = new Uint8Array(array)\n } else if (length === undefined) {\n buf = new Uint8Array(array, byteOffset)\n } else {\n buf = new Uint8Array(array, byteOffset, length)\n }\n\n // Return an augmented `Uint8Array` instance\n Object.setPrototypeOf(buf, Buffer.prototype)\n\n return buf\n}\n\nfunction fromObject (obj) {\n if (Buffer.isBuffer(obj)) {\n const len = checked(obj.length) | 0\n const buf = createBuffer(len)\n\n if (buf.length === 0) {\n return buf\n }\n\n obj.copy(buf, 0, 0, len)\n return buf\n }\n\n if (obj.length !== undefined) {\n if (typeof obj.length !== 'number' || numberIsNaN(obj.length)) {\n return createBuffer(0)\n }\n return fromArrayLike(obj)\n }\n\n if (obj.type === 'Buffer' && Array.isArray(obj.data)) {\n return fromArrayLike(obj.data)\n }\n}\n\nfunction checked (length) {\n // Note: cannot use `length < K_MAX_LENGTH` here because that fails when\n // length is NaN (which is otherwise coerced to zero.)\n if (length >= K_MAX_LENGTH) {\n throw new RangeError('Attempt to allocate Buffer larger than maximum ' +\n 'size: 0x' + K_MAX_LENGTH.toString(16) + ' bytes')\n }\n return length | 0\n}\n\nfunction SlowBuffer (length) {\n if (+length != length) { // eslint-disable-line eqeqeq\n length = 0\n }\n return Buffer.alloc(+length)\n}\n\nBuffer.isBuffer = function isBuffer (b) {\n return b != null && b._isBuffer === true &&\n b !== Buffer.prototype // so Buffer.isBuffer(Buffer.prototype) will be false\n}\n\nBuffer.compare = function compare (a, b) {\n if (isInstance(a, Uint8Array)) a = Buffer.from(a, a.offset, a.byteLength)\n if (isInstance(b, Uint8Array)) b = Buffer.from(b, b.offset, b.byteLength)\n if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) {\n throw new TypeError(\n 'The \"buf1\", \"buf2\" arguments must be one of type Buffer or Uint8Array'\n )\n }\n\n if (a === b) return 0\n\n let x = a.length\n let y = b.length\n\n for (let i = 0, len = Math.min(x, y); i < len; ++i) {\n if (a[i] !== b[i]) {\n x = a[i]\n y = b[i]\n break\n }\n }\n\n if (x < y) return -1\n if (y < x) return 1\n return 0\n}\n\nBuffer.isEncoding = function isEncoding (encoding) {\n switch (String(encoding).toLowerCase()) {\n case 'hex':\n case 'utf8':\n case 'utf-8':\n case 'ascii':\n case 'latin1':\n case 'binary':\n case 'base64':\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return true\n default:\n return false\n }\n}\n\nBuffer.concat = function concat (list, length) {\n if (!Array.isArray(list)) {\n throw new TypeError('\"list\" argument must be an Array of Buffers')\n }\n\n if (list.length === 0) {\n return Buffer.alloc(0)\n }\n\n let i\n if (length === undefined) {\n length = 0\n for (i = 0; i < list.length; ++i) {\n length += list[i].length\n }\n }\n\n const buffer = Buffer.allocUnsafe(length)\n let pos = 0\n for (i = 0; i < list.length; ++i) {\n let buf = list[i]\n if (isInstance(buf, Uint8Array)) {\n if (pos + buf.length > buffer.length) {\n if (!Buffer.isBuffer(buf)) buf = Buffer.from(buf)\n buf.copy(buffer, pos)\n } else {\n Uint8Array.prototype.set.call(\n buffer,\n buf,\n pos\n )\n }\n } else if (!Buffer.isBuffer(buf)) {\n throw new TypeError('\"list\" argument must be an Array of Buffers')\n } else {\n buf.copy(buffer, pos)\n }\n pos += buf.length\n }\n return buffer\n}\n\nfunction byteLength (string, encoding) {\n if (Buffer.isBuffer(string)) {\n return string.length\n }\n if (ArrayBuffer.isView(string) || isInstance(string, ArrayBuffer)) {\n return string.byteLength\n }\n if (typeof string !== 'string') {\n throw new TypeError(\n 'The \"string\" argument must be one of type string, Buffer, or ArrayBuffer. ' +\n 'Received type ' + typeof string\n )\n }\n\n const len = string.length\n const mustMatch = (arguments.length > 2 && arguments[2] === true)\n if (!mustMatch && len === 0) return 0\n\n // Use a for loop to avoid recursion\n let loweredCase = false\n for (;;) {\n switch (encoding) {\n case 'ascii':\n case 'latin1':\n case 'binary':\n return len\n case 'utf8':\n case 'utf-8':\n return utf8ToBytes(string).length\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return len * 2\n case 'hex':\n return len >>> 1\n case 'base64':\n return base64ToBytes(string).length\n default:\n if (loweredCase) {\n return mustMatch ? -1 : utf8ToBytes(string).length // assume utf8\n }\n encoding = ('' + encoding).toLowerCase()\n loweredCase = true\n }\n }\n}\nBuffer.byteLength = byteLength\n\nfunction slowToString (encoding, start, end) {\n let loweredCase = false\n\n // No need to verify that \"this.length <= MAX_UINT32\" since it's a read-only\n // property of a typed array.\n\n // This behaves neither like String nor Uint8Array in that we set start/end\n // to their upper/lower bounds if the value passed is out of range.\n // undefined is handled specially as per ECMA-262 6th Edition,\n // Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization.\n if (start === undefined || start < 0) {\n start = 0\n }\n // Return early if start > this.length. Done here to prevent potential uint32\n // coercion fail below.\n if (start > this.length) {\n return ''\n }\n\n if (end === undefined || end > this.length) {\n end = this.length\n }\n\n if (end <= 0) {\n return ''\n }\n\n // Force coercion to uint32. This will also coerce falsey/NaN values to 0.\n end >>>= 0\n start >>>= 0\n\n if (end <= start) {\n return ''\n }\n\n if (!encoding) encoding = 'utf8'\n\n while (true) {\n switch (encoding) {\n case 'hex':\n return hexSlice(this, start, end)\n\n case 'utf8':\n case 'utf-8':\n return utf8Slice(this, start, end)\n\n case 'ascii':\n return asciiSlice(this, start, end)\n\n case 'latin1':\n case 'binary':\n return latin1Slice(this, start, end)\n\n case 'base64':\n return base64Slice(this, start, end)\n\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return utf16leSlice(this, start, end)\n\n default:\n if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)\n encoding = (encoding + '').toLowerCase()\n loweredCase = true\n }\n }\n}\n\n// This property is used by `Buffer.isBuffer` (and the `is-buffer` npm package)\n// to detect a Buffer instance. It's not possible to use `instanceof Buffer`\n// reliably in a browserify context because there could be multiple different\n// copies of the 'buffer' package in use. This method works even for Buffer\n// instances that were created from another copy of the `buffer` package.\n// See: https://github.com/feross/buffer/issues/154\nBuffer.prototype._isBuffer = true\n\nfunction swap (b, n, m) {\n const i = b[n]\n b[n] = b[m]\n b[m] = i\n}\n\nBuffer.prototype.swap16 = function swap16 () {\n const len = this.length\n if (len % 2 !== 0) {\n throw new RangeError('Buffer size must be a multiple of 16-bits')\n }\n for (let i = 0; i < len; i += 2) {\n swap(this, i, i + 1)\n }\n return this\n}\n\nBuffer.prototype.swap32 = function swap32 () {\n const len = this.length\n if (len % 4 !== 0) {\n throw new RangeError('Buffer size must be a multiple of 32-bits')\n }\n for (let i = 0; i < len; i += 4) {\n swap(this, i, i + 3)\n swap(this, i + 1, i + 2)\n }\n return this\n}\n\nBuffer.prototype.swap64 = function swap64 () {\n const len = this.length\n if (len % 8 !== 0) {\n throw new RangeError('Buffer size must be a multiple of 64-bits')\n }\n for (let i = 0; i < len; i += 8) {\n swap(this, i, i + 7)\n swap(this, i + 1, i + 6)\n swap(this, i + 2, i + 5)\n swap(this, i + 3, i + 4)\n }\n return this\n}\n\nBuffer.prototype.toString = function toString () {\n const length = this.length\n if (length === 0) return ''\n if (arguments.length === 0) return utf8Slice(this, 0, length)\n return slowToString.apply(this, arguments)\n}\n\nBuffer.prototype.toLocaleString = Buffer.prototype.toString\n\nBuffer.prototype.equals = function equals (b) {\n if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer')\n if (this === b) return true\n return Buffer.compare(this, b) === 0\n}\n\nBuffer.prototype.inspect = function inspect () {\n let str = ''\n const max = exports.INSPECT_MAX_BYTES\n str = this.toString('hex', 0, max).replace(/(.{2})/g, '$1 ').trim()\n if (this.length > max) str += ' ... '\n return ''\n}\nif (customInspectSymbol) {\n Buffer.prototype[customInspectSymbol] = Buffer.prototype.inspect\n}\n\nBuffer.prototype.compare = function compare (target, start, end, thisStart, thisEnd) {\n if (isInstance(target, Uint8Array)) {\n target = Buffer.from(target, target.offset, target.byteLength)\n }\n if (!Buffer.isBuffer(target)) {\n throw new TypeError(\n 'The \"target\" argument must be one of type Buffer or Uint8Array. ' +\n 'Received type ' + (typeof target)\n )\n }\n\n if (start === undefined) {\n start = 0\n }\n if (end === undefined) {\n end = target ? target.length : 0\n }\n if (thisStart === undefined) {\n thisStart = 0\n }\n if (thisEnd === undefined) {\n thisEnd = this.length\n }\n\n if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) {\n throw new RangeError('out of range index')\n }\n\n if (thisStart >= thisEnd && start >= end) {\n return 0\n }\n if (thisStart >= thisEnd) {\n return -1\n }\n if (start >= end) {\n return 1\n }\n\n start >>>= 0\n end >>>= 0\n thisStart >>>= 0\n thisEnd >>>= 0\n\n if (this === target) return 0\n\n let x = thisEnd - thisStart\n let y = end - start\n const len = Math.min(x, y)\n\n const thisCopy = this.slice(thisStart, thisEnd)\n const targetCopy = target.slice(start, end)\n\n for (let i = 0; i < len; ++i) {\n if (thisCopy[i] !== targetCopy[i]) {\n x = thisCopy[i]\n y = targetCopy[i]\n break\n }\n }\n\n if (x < y) return -1\n if (y < x) return 1\n return 0\n}\n\n// Finds either the first index of `val` in `buffer` at offset >= `byteOffset`,\n// OR the last index of `val` in `buffer` at offset <= `byteOffset`.\n//\n// Arguments:\n// - buffer - a Buffer to search\n// - val - a string, Buffer, or number\n// - byteOffset - an index into `buffer`; will be clamped to an int32\n// - encoding - an optional encoding, relevant is val is a string\n// - dir - true for indexOf, false for lastIndexOf\nfunction bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) {\n // Empty buffer means no match\n if (buffer.length === 0) return -1\n\n // Normalize byteOffset\n if (typeof byteOffset === 'string') {\n encoding = byteOffset\n byteOffset = 0\n } else if (byteOffset > 0x7fffffff) {\n byteOffset = 0x7fffffff\n } else if (byteOffset < -0x80000000) {\n byteOffset = -0x80000000\n }\n byteOffset = +byteOffset // Coerce to Number.\n if (numberIsNaN(byteOffset)) {\n // byteOffset: it it's undefined, null, NaN, \"foo\", etc, search whole buffer\n byteOffset = dir ? 0 : (buffer.length - 1)\n }\n\n // Normalize byteOffset: negative offsets start from the end of the buffer\n if (byteOffset < 0) byteOffset = buffer.length + byteOffset\n if (byteOffset >= buffer.length) {\n if (dir) return -1\n else byteOffset = buffer.length - 1\n } else if (byteOffset < 0) {\n if (dir) byteOffset = 0\n else return -1\n }\n\n // Normalize val\n if (typeof val === 'string') {\n val = Buffer.from(val, encoding)\n }\n\n // Finally, search either indexOf (if dir is true) or lastIndexOf\n if (Buffer.isBuffer(val)) {\n // Special case: looking for empty string/buffer always fails\n if (val.length === 0) {\n return -1\n }\n return arrayIndexOf(buffer, val, byteOffset, encoding, dir)\n } else if (typeof val === 'number') {\n val = val & 0xFF // Search for a byte value [0-255]\n if (typeof Uint8Array.prototype.indexOf === 'function') {\n if (dir) {\n return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset)\n } else {\n return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset)\n }\n }\n return arrayIndexOf(buffer, [val], byteOffset, encoding, dir)\n }\n\n throw new TypeError('val must be string, number or Buffer')\n}\n\nfunction arrayIndexOf (arr, val, byteOffset, encoding, dir) {\n let indexSize = 1\n let arrLength = arr.length\n let valLength = val.length\n\n if (encoding !== undefined) {\n encoding = String(encoding).toLowerCase()\n if (encoding === 'ucs2' || encoding === 'ucs-2' ||\n encoding === 'utf16le' || encoding === 'utf-16le') {\n if (arr.length < 2 || val.length < 2) {\n return -1\n }\n indexSize = 2\n arrLength /= 2\n valLength /= 2\n byteOffset /= 2\n }\n }\n\n function read (buf, i) {\n if (indexSize === 1) {\n return buf[i]\n } else {\n return buf.readUInt16BE(i * indexSize)\n }\n }\n\n let i\n if (dir) {\n let foundIndex = -1\n for (i = byteOffset; i < arrLength; i++) {\n if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) {\n if (foundIndex === -1) foundIndex = i\n if (i - foundIndex + 1 === valLength) return foundIndex * indexSize\n } else {\n if (foundIndex !== -1) i -= i - foundIndex\n foundIndex = -1\n }\n }\n } else {\n if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength\n for (i = byteOffset; i >= 0; i--) {\n let found = true\n for (let j = 0; j < valLength; j++) {\n if (read(arr, i + j) !== read(val, j)) {\n found = false\n break\n }\n }\n if (found) return i\n }\n }\n\n return -1\n}\n\nBuffer.prototype.includes = function includes (val, byteOffset, encoding) {\n return this.indexOf(val, byteOffset, encoding) !== -1\n}\n\nBuffer.prototype.indexOf = function indexOf (val, byteOffset, encoding) {\n return bidirectionalIndexOf(this, val, byteOffset, encoding, true)\n}\n\nBuffer.prototype.lastIndexOf = function lastIndexOf (val, byteOffset, encoding) {\n return bidirectionalIndexOf(this, val, byteOffset, encoding, false)\n}\n\nfunction hexWrite (buf, string, offset, length) {\n offset = Number(offset) || 0\n const remaining = buf.length - offset\n if (!length) {\n length = remaining\n } else {\n length = Number(length)\n if (length > remaining) {\n length = remaining\n }\n }\n\n const strLen = string.length\n\n if (length > strLen / 2) {\n length = strLen / 2\n }\n let i\n for (i = 0; i < length; ++i) {\n const parsed = parseInt(string.substr(i * 2, 2), 16)\n if (numberIsNaN(parsed)) return i\n buf[offset + i] = parsed\n }\n return i\n}\n\nfunction utf8Write (buf, string, offset, length) {\n return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length)\n}\n\nfunction asciiWrite (buf, string, offset, length) {\n return blitBuffer(asciiToBytes(string), buf, offset, length)\n}\n\nfunction base64Write (buf, string, offset, length) {\n return blitBuffer(base64ToBytes(string), buf, offset, length)\n}\n\nfunction ucs2Write (buf, string, offset, length) {\n return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length)\n}\n\nBuffer.prototype.write = function write (string, offset, length, encoding) {\n // Buffer#write(string)\n if (offset === undefined) {\n encoding = 'utf8'\n length = this.length\n offset = 0\n // Buffer#write(string, encoding)\n } else if (length === undefined && typeof offset === 'string') {\n encoding = offset\n length = this.length\n offset = 0\n // Buffer#write(string, offset[, length][, encoding])\n } else if (isFinite(offset)) {\n offset = offset >>> 0\n if (isFinite(length)) {\n length = length >>> 0\n if (encoding === undefined) encoding = 'utf8'\n } else {\n encoding = length\n length = undefined\n }\n } else {\n throw new Error(\n 'Buffer.write(string, encoding, offset[, length]) is no longer supported'\n )\n }\n\n const remaining = this.length - offset\n if (length === undefined || length > remaining) length = remaining\n\n if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) {\n throw new RangeError('Attempt to write outside buffer bounds')\n }\n\n if (!encoding) encoding = 'utf8'\n\n let loweredCase = false\n for (;;) {\n switch (encoding) {\n case 'hex':\n return hexWrite(this, string, offset, length)\n\n case 'utf8':\n case 'utf-8':\n return utf8Write(this, string, offset, length)\n\n case 'ascii':\n case 'latin1':\n case 'binary':\n return asciiWrite(this, string, offset, length)\n\n case 'base64':\n // Warning: maxLength not taken into account in base64Write\n return base64Write(this, string, offset, length)\n\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return ucs2Write(this, string, offset, length)\n\n default:\n if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)\n encoding = ('' + encoding).toLowerCase()\n loweredCase = true\n }\n }\n}\n\nBuffer.prototype.toJSON = function toJSON () {\n return {\n type: 'Buffer',\n data: Array.prototype.slice.call(this._arr || this, 0)\n }\n}\n\nfunction base64Slice (buf, start, end) {\n if (start === 0 && end === buf.length) {\n return base64.fromByteArray(buf)\n } else {\n return base64.fromByteArray(buf.slice(start, end))\n }\n}\n\nfunction utf8Slice (buf, start, end) {\n end = Math.min(buf.length, end)\n const res = []\n\n let i = start\n while (i < end) {\n const firstByte = buf[i]\n let codePoint = null\n let bytesPerSequence = (firstByte > 0xEF)\n ? 4\n : (firstByte > 0xDF)\n ? 3\n : (firstByte > 0xBF)\n ? 2\n : 1\n\n if (i + bytesPerSequence <= end) {\n let secondByte, thirdByte, fourthByte, tempCodePoint\n\n switch (bytesPerSequence) {\n case 1:\n if (firstByte < 0x80) {\n codePoint = firstByte\n }\n break\n case 2:\n secondByte = buf[i + 1]\n if ((secondByte & 0xC0) === 0x80) {\n tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F)\n if (tempCodePoint > 0x7F) {\n codePoint = tempCodePoint\n }\n }\n break\n case 3:\n secondByte = buf[i + 1]\n thirdByte = buf[i + 2]\n if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) {\n tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F)\n if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) {\n codePoint = tempCodePoint\n }\n }\n break\n case 4:\n secondByte = buf[i + 1]\n thirdByte = buf[i + 2]\n fourthByte = buf[i + 3]\n if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) {\n tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F)\n if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) {\n codePoint = tempCodePoint\n }\n }\n }\n }\n\n if (codePoint === null) {\n // we did not generate a valid codePoint so insert a\n // replacement char (U+FFFD) and advance only 1 byte\n codePoint = 0xFFFD\n bytesPerSequence = 1\n } else if (codePoint > 0xFFFF) {\n // encode to utf16 (surrogate pair dance)\n codePoint -= 0x10000\n res.push(codePoint >>> 10 & 0x3FF | 0xD800)\n codePoint = 0xDC00 | codePoint & 0x3FF\n }\n\n res.push(codePoint)\n i += bytesPerSequence\n }\n\n return decodeCodePointsArray(res)\n}\n\n// Based on http://stackoverflow.com/a/22747272/680742, the browser with\n// the lowest limit is Chrome, with 0x10000 args.\n// We go 1 magnitude less, for safety\nconst MAX_ARGUMENTS_LENGTH = 0x1000\n\nfunction decodeCodePointsArray (codePoints) {\n const len = codePoints.length\n if (len <= MAX_ARGUMENTS_LENGTH) {\n return String.fromCharCode.apply(String, codePoints) // avoid extra slice()\n }\n\n // Decode in chunks to avoid \"call stack size exceeded\".\n let res = ''\n let i = 0\n while (i < len) {\n res += String.fromCharCode.apply(\n String,\n codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH)\n )\n }\n return res\n}\n\nfunction asciiSlice (buf, start, end) {\n let ret = ''\n end = Math.min(buf.length, end)\n\n for (let i = start; i < end; ++i) {\n ret += String.fromCharCode(buf[i] & 0x7F)\n }\n return ret\n}\n\nfunction latin1Slice (buf, start, end) {\n let ret = ''\n end = Math.min(buf.length, end)\n\n for (let i = start; i < end; ++i) {\n ret += String.fromCharCode(buf[i])\n }\n return ret\n}\n\nfunction hexSlice (buf, start, end) {\n const len = buf.length\n\n if (!start || start < 0) start = 0\n if (!end || end < 0 || end > len) end = len\n\n let out = ''\n for (let i = start; i < end; ++i) {\n out += hexSliceLookupTable[buf[i]]\n }\n return out\n}\n\nfunction utf16leSlice (buf, start, end) {\n const bytes = buf.slice(start, end)\n let res = ''\n // If bytes.length is odd, the last 8 bits must be ignored (same as node.js)\n for (let i = 0; i < bytes.length - 1; i += 2) {\n res += String.fromCharCode(bytes[i] + (bytes[i + 1] * 256))\n }\n return res\n}\n\nBuffer.prototype.slice = function slice (start, end) {\n const len = this.length\n start = ~~start\n end = end === undefined ? len : ~~end\n\n if (start < 0) {\n start += len\n if (start < 0) start = 0\n } else if (start > len) {\n start = len\n }\n\n if (end < 0) {\n end += len\n if (end < 0) end = 0\n } else if (end > len) {\n end = len\n }\n\n if (end < start) end = start\n\n const newBuf = this.subarray(start, end)\n // Return an augmented `Uint8Array` instance\n Object.setPrototypeOf(newBuf, Buffer.prototype)\n\n return newBuf\n}\n\n/*\n * Need to make sure that buffer isn't trying to write out of bounds.\n */\nfunction checkOffset (offset, ext, length) {\n if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint')\n if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length')\n}\n\nBuffer.prototype.readUintLE =\nBuffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) {\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n let val = this[offset]\n let mul = 1\n let i = 0\n while (++i < byteLength && (mul *= 0x100)) {\n val += this[offset + i] * mul\n }\n\n return val\n}\n\nBuffer.prototype.readUintBE =\nBuffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) {\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) {\n checkOffset(offset, byteLength, this.length)\n }\n\n let val = this[offset + --byteLength]\n let mul = 1\n while (byteLength > 0 && (mul *= 0x100)) {\n val += this[offset + --byteLength] * mul\n }\n\n return val\n}\n\nBuffer.prototype.readUint8 =\nBuffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 1, this.length)\n return this[offset]\n}\n\nBuffer.prototype.readUint16LE =\nBuffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 2, this.length)\n return this[offset] | (this[offset + 1] << 8)\n}\n\nBuffer.prototype.readUint16BE =\nBuffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 2, this.length)\n return (this[offset] << 8) | this[offset + 1]\n}\n\nBuffer.prototype.readUint32LE =\nBuffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return ((this[offset]) |\n (this[offset + 1] << 8) |\n (this[offset + 2] << 16)) +\n (this[offset + 3] * 0x1000000)\n}\n\nBuffer.prototype.readUint32BE =\nBuffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return (this[offset] * 0x1000000) +\n ((this[offset + 1] << 16) |\n (this[offset + 2] << 8) |\n this[offset + 3])\n}\n\nBuffer.prototype.readBigUInt64LE = defineBigIntMethod(function readBigUInt64LE (offset) {\n offset = offset >>> 0\n validateNumber(offset, 'offset')\n const first = this[offset]\n const last = this[offset + 7]\n if (first === undefined || last === undefined) {\n boundsError(offset, this.length - 8)\n }\n\n const lo = first +\n this[++offset] * 2 ** 8 +\n this[++offset] * 2 ** 16 +\n this[++offset] * 2 ** 24\n\n const hi = this[++offset] +\n this[++offset] * 2 ** 8 +\n this[++offset] * 2 ** 16 +\n last * 2 ** 24\n\n return BigInt(lo) + (BigInt(hi) << BigInt(32))\n})\n\nBuffer.prototype.readBigUInt64BE = defineBigIntMethod(function readBigUInt64BE (offset) {\n offset = offset >>> 0\n validateNumber(offset, 'offset')\n const first = this[offset]\n const last = this[offset + 7]\n if (first === undefined || last === undefined) {\n boundsError(offset, this.length - 8)\n }\n\n const hi = first * 2 ** 24 +\n this[++offset] * 2 ** 16 +\n this[++offset] * 2 ** 8 +\n this[++offset]\n\n const lo = this[++offset] * 2 ** 24 +\n this[++offset] * 2 ** 16 +\n this[++offset] * 2 ** 8 +\n last\n\n return (BigInt(hi) << BigInt(32)) + BigInt(lo)\n})\n\nBuffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) {\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n let val = this[offset]\n let mul = 1\n let i = 0\n while (++i < byteLength && (mul *= 0x100)) {\n val += this[offset + i] * mul\n }\n mul *= 0x80\n\n if (val >= mul) val -= Math.pow(2, 8 * byteLength)\n\n return val\n}\n\nBuffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) {\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n let i = byteLength\n let mul = 1\n let val = this[offset + --i]\n while (i > 0 && (mul *= 0x100)) {\n val += this[offset + --i] * mul\n }\n mul *= 0x80\n\n if (val >= mul) val -= Math.pow(2, 8 * byteLength)\n\n return val\n}\n\nBuffer.prototype.readInt8 = function readInt8 (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 1, this.length)\n if (!(this[offset] & 0x80)) return (this[offset])\n return ((0xff - this[offset] + 1) * -1)\n}\n\nBuffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 2, this.length)\n const val = this[offset] | (this[offset + 1] << 8)\n return (val & 0x8000) ? val | 0xFFFF0000 : val\n}\n\nBuffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 2, this.length)\n const val = this[offset + 1] | (this[offset] << 8)\n return (val & 0x8000) ? val | 0xFFFF0000 : val\n}\n\nBuffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return (this[offset]) |\n (this[offset + 1] << 8) |\n (this[offset + 2] << 16) |\n (this[offset + 3] << 24)\n}\n\nBuffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return (this[offset] << 24) |\n (this[offset + 1] << 16) |\n (this[offset + 2] << 8) |\n (this[offset + 3])\n}\n\nBuffer.prototype.readBigInt64LE = defineBigIntMethod(function readBigInt64LE (offset) {\n offset = offset >>> 0\n validateNumber(offset, 'offset')\n const first = this[offset]\n const last = this[offset + 7]\n if (first === undefined || last === undefined) {\n boundsError(offset, this.length - 8)\n }\n\n const val = this[offset + 4] +\n this[offset + 5] * 2 ** 8 +\n this[offset + 6] * 2 ** 16 +\n (last << 24) // Overflow\n\n return (BigInt(val) << BigInt(32)) +\n BigInt(first +\n this[++offset] * 2 ** 8 +\n this[++offset] * 2 ** 16 +\n this[++offset] * 2 ** 24)\n})\n\nBuffer.prototype.readBigInt64BE = defineBigIntMethod(function readBigInt64BE (offset) {\n offset = offset >>> 0\n validateNumber(offset, 'offset')\n const first = this[offset]\n const last = this[offset + 7]\n if (first === undefined || last === undefined) {\n boundsError(offset, this.length - 8)\n }\n\n const val = (first << 24) + // Overflow\n this[++offset] * 2 ** 16 +\n this[++offset] * 2 ** 8 +\n this[++offset]\n\n return (BigInt(val) << BigInt(32)) +\n BigInt(this[++offset] * 2 ** 24 +\n this[++offset] * 2 ** 16 +\n this[++offset] * 2 ** 8 +\n last)\n})\n\nBuffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n return ieee754.read(this, offset, true, 23, 4)\n}\n\nBuffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n return ieee754.read(this, offset, false, 23, 4)\n}\n\nBuffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 8, this.length)\n return ieee754.read(this, offset, true, 52, 8)\n}\n\nBuffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 8, this.length)\n return ieee754.read(this, offset, false, 52, 8)\n}\n\nfunction checkInt (buf, value, offset, ext, max, min) {\n if (!Buffer.isBuffer(buf)) throw new TypeError('\"buffer\" argument must be a Buffer instance')\n if (value > max || value < min) throw new RangeError('\"value\" argument is out of bounds')\n if (offset + ext > buf.length) throw new RangeError('Index out of range')\n}\n\nBuffer.prototype.writeUintLE =\nBuffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) {\n const maxBytes = Math.pow(2, 8 * byteLength) - 1\n checkInt(this, value, offset, byteLength, maxBytes, 0)\n }\n\n let mul = 1\n let i = 0\n this[offset] = value & 0xFF\n while (++i < byteLength && (mul *= 0x100)) {\n this[offset + i] = (value / mul) & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeUintBE =\nBuffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) {\n const maxBytes = Math.pow(2, 8 * byteLength) - 1\n checkInt(this, value, offset, byteLength, maxBytes, 0)\n }\n\n let i = byteLength - 1\n let mul = 1\n this[offset + i] = value & 0xFF\n while (--i >= 0 && (mul *= 0x100)) {\n this[offset + i] = (value / mul) & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeUint8 =\nBuffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0)\n this[offset] = (value & 0xff)\n return offset + 1\n}\n\nBuffer.prototype.writeUint16LE =\nBuffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)\n this[offset] = (value & 0xff)\n this[offset + 1] = (value >>> 8)\n return offset + 2\n}\n\nBuffer.prototype.writeUint16BE =\nBuffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)\n this[offset] = (value >>> 8)\n this[offset + 1] = (value & 0xff)\n return offset + 2\n}\n\nBuffer.prototype.writeUint32LE =\nBuffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)\n this[offset + 3] = (value >>> 24)\n this[offset + 2] = (value >>> 16)\n this[offset + 1] = (value >>> 8)\n this[offset] = (value & 0xff)\n return offset + 4\n}\n\nBuffer.prototype.writeUint32BE =\nBuffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)\n this[offset] = (value >>> 24)\n this[offset + 1] = (value >>> 16)\n this[offset + 2] = (value >>> 8)\n this[offset + 3] = (value & 0xff)\n return offset + 4\n}\n\nfunction wrtBigUInt64LE (buf, value, offset, min, max) {\n checkIntBI(value, min, max, buf, offset, 7)\n\n let lo = Number(value & BigInt(0xffffffff))\n buf[offset++] = lo\n lo = lo >> 8\n buf[offset++] = lo\n lo = lo >> 8\n buf[offset++] = lo\n lo = lo >> 8\n buf[offset++] = lo\n let hi = Number(value >> BigInt(32) & BigInt(0xffffffff))\n buf[offset++] = hi\n hi = hi >> 8\n buf[offset++] = hi\n hi = hi >> 8\n buf[offset++] = hi\n hi = hi >> 8\n buf[offset++] = hi\n return offset\n}\n\nfunction wrtBigUInt64BE (buf, value, offset, min, max) {\n checkIntBI(value, min, max, buf, offset, 7)\n\n let lo = Number(value & BigInt(0xffffffff))\n buf[offset + 7] = lo\n lo = lo >> 8\n buf[offset + 6] = lo\n lo = lo >> 8\n buf[offset + 5] = lo\n lo = lo >> 8\n buf[offset + 4] = lo\n let hi = Number(value >> BigInt(32) & BigInt(0xffffffff))\n buf[offset + 3] = hi\n hi = hi >> 8\n buf[offset + 2] = hi\n hi = hi >> 8\n buf[offset + 1] = hi\n hi = hi >> 8\n buf[offset] = hi\n return offset + 8\n}\n\nBuffer.prototype.writeBigUInt64LE = defineBigIntMethod(function writeBigUInt64LE (value, offset = 0) {\n return wrtBigUInt64LE(this, value, offset, BigInt(0), BigInt('0xffffffffffffffff'))\n})\n\nBuffer.prototype.writeBigUInt64BE = defineBigIntMethod(function writeBigUInt64BE (value, offset = 0) {\n return wrtBigUInt64BE(this, value, offset, BigInt(0), BigInt('0xffffffffffffffff'))\n})\n\nBuffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) {\n const limit = Math.pow(2, (8 * byteLength) - 1)\n\n checkInt(this, value, offset, byteLength, limit - 1, -limit)\n }\n\n let i = 0\n let mul = 1\n let sub = 0\n this[offset] = value & 0xFF\n while (++i < byteLength && (mul *= 0x100)) {\n if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) {\n sub = 1\n }\n this[offset + i] = ((value / mul) >> 0) - sub & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) {\n const limit = Math.pow(2, (8 * byteLength) - 1)\n\n checkInt(this, value, offset, byteLength, limit - 1, -limit)\n }\n\n let i = byteLength - 1\n let mul = 1\n let sub = 0\n this[offset + i] = value & 0xFF\n while (--i >= 0 && (mul *= 0x100)) {\n if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) {\n sub = 1\n }\n this[offset + i] = ((value / mul) >> 0) - sub & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80)\n if (value < 0) value = 0xff + value + 1\n this[offset] = (value & 0xff)\n return offset + 1\n}\n\nBuffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)\n this[offset] = (value & 0xff)\n this[offset + 1] = (value >>> 8)\n return offset + 2\n}\n\nBuffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)\n this[offset] = (value >>> 8)\n this[offset + 1] = (value & 0xff)\n return offset + 2\n}\n\nBuffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)\n this[offset] = (value & 0xff)\n this[offset + 1] = (value >>> 8)\n this[offset + 2] = (value >>> 16)\n this[offset + 3] = (value >>> 24)\n return offset + 4\n}\n\nBuffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)\n if (value < 0) value = 0xffffffff + value + 1\n this[offset] = (value >>> 24)\n this[offset + 1] = (value >>> 16)\n this[offset + 2] = (value >>> 8)\n this[offset + 3] = (value & 0xff)\n return offset + 4\n}\n\nBuffer.prototype.writeBigInt64LE = defineBigIntMethod(function writeBigInt64LE (value, offset = 0) {\n return wrtBigUInt64LE(this, value, offset, -BigInt('0x8000000000000000'), BigInt('0x7fffffffffffffff'))\n})\n\nBuffer.prototype.writeBigInt64BE = defineBigIntMethod(function writeBigInt64BE (value, offset = 0) {\n return wrtBigUInt64BE(this, value, offset, -BigInt('0x8000000000000000'), BigInt('0x7fffffffffffffff'))\n})\n\nfunction checkIEEE754 (buf, value, offset, ext, max, min) {\n if (offset + ext > buf.length) throw new RangeError('Index out of range')\n if (offset < 0) throw new RangeError('Index out of range')\n}\n\nfunction writeFloat (buf, value, offset, littleEndian, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) {\n checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38)\n }\n ieee754.write(buf, value, offset, littleEndian, 23, 4)\n return offset + 4\n}\n\nBuffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) {\n return writeFloat(this, value, offset, true, noAssert)\n}\n\nBuffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) {\n return writeFloat(this, value, offset, false, noAssert)\n}\n\nfunction writeDouble (buf, value, offset, littleEndian, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) {\n checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308)\n }\n ieee754.write(buf, value, offset, littleEndian, 52, 8)\n return offset + 8\n}\n\nBuffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) {\n return writeDouble(this, value, offset, true, noAssert)\n}\n\nBuffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) {\n return writeDouble(this, value, offset, false, noAssert)\n}\n\n// copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length)\nBuffer.prototype.copy = function copy (target, targetStart, start, end) {\n if (!Buffer.isBuffer(target)) throw new TypeError('argument should be a Buffer')\n if (!start) start = 0\n if (!end && end !== 0) end = this.length\n if (targetStart >= target.length) targetStart = target.length\n if (!targetStart) targetStart = 0\n if (end > 0 && end < start) end = start\n\n // Copy 0 bytes; we're done\n if (end === start) return 0\n if (target.length === 0 || this.length === 0) return 0\n\n // Fatal error conditions\n if (targetStart < 0) {\n throw new RangeError('targetStart out of bounds')\n }\n if (start < 0 || start >= this.length) throw new RangeError('Index out of range')\n if (end < 0) throw new RangeError('sourceEnd out of bounds')\n\n // Are we oob?\n if (end > this.length) end = this.length\n if (target.length - targetStart < end - start) {\n end = target.length - targetStart + start\n }\n\n const len = end - start\n\n if (this === target && typeof Uint8Array.prototype.copyWithin === 'function') {\n // Use built-in when available, missing from IE11\n this.copyWithin(targetStart, start, end)\n } else {\n Uint8Array.prototype.set.call(\n target,\n this.subarray(start, end),\n targetStart\n )\n }\n\n return len\n}\n\n// Usage:\n// buffer.fill(number[, offset[, end]])\n// buffer.fill(buffer[, offset[, end]])\n// buffer.fill(string[, offset[, end]][, encoding])\nBuffer.prototype.fill = function fill (val, start, end, encoding) {\n // Handle string cases:\n if (typeof val === 'string') {\n if (typeof start === 'string') {\n encoding = start\n start = 0\n end = this.length\n } else if (typeof end === 'string') {\n encoding = end\n end = this.length\n }\n if (encoding !== undefined && typeof encoding !== 'string') {\n throw new TypeError('encoding must be a string')\n }\n if (typeof encoding === 'string' && !Buffer.isEncoding(encoding)) {\n throw new TypeError('Unknown encoding: ' + encoding)\n }\n if (val.length === 1) {\n const code = val.charCodeAt(0)\n if ((encoding === 'utf8' && code < 128) ||\n encoding === 'latin1') {\n // Fast path: If `val` fits into a single byte, use that numeric value.\n val = code\n }\n }\n } else if (typeof val === 'number') {\n val = val & 255\n } else if (typeof val === 'boolean') {\n val = Number(val)\n }\n\n // Invalid ranges are not set to a default, so can range check early.\n if (start < 0 || this.length < start || this.length < end) {\n throw new RangeError('Out of range index')\n }\n\n if (end <= start) {\n return this\n }\n\n start = start >>> 0\n end = end === undefined ? this.length : end >>> 0\n\n if (!val) val = 0\n\n let i\n if (typeof val === 'number') {\n for (i = start; i < end; ++i) {\n this[i] = val\n }\n } else {\n const bytes = Buffer.isBuffer(val)\n ? val\n : Buffer.from(val, encoding)\n const len = bytes.length\n if (len === 0) {\n throw new TypeError('The value \"' + val +\n '\" is invalid for argument \"value\"')\n }\n for (i = 0; i < end - start; ++i) {\n this[i + start] = bytes[i % len]\n }\n }\n\n return this\n}\n\n// CUSTOM ERRORS\n// =============\n\n// Simplified versions from Node, changed for Buffer-only usage\nconst errors = {}\nfunction E (sym, getMessage, Base) {\n errors[sym] = class NodeError extends Base {\n constructor () {\n super()\n\n Object.defineProperty(this, 'message', {\n value: getMessage.apply(this, arguments),\n writable: true,\n configurable: true\n })\n\n // Add the error code to the name to include it in the stack trace.\n this.name = `${this.name} [${sym}]`\n // Access the stack to generate the error message including the error code\n // from the name.\n this.stack // eslint-disable-line no-unused-expressions\n // Reset the name to the actual name.\n delete this.name\n }\n\n get code () {\n return sym\n }\n\n set code (value) {\n Object.defineProperty(this, 'code', {\n configurable: true,\n enumerable: true,\n value,\n writable: true\n })\n }\n\n toString () {\n return `${this.name} [${sym}]: ${this.message}`\n }\n }\n}\n\nE('ERR_BUFFER_OUT_OF_BOUNDS',\n function (name) {\n if (name) {\n return `${name} is outside of buffer bounds`\n }\n\n return 'Attempt to access memory outside buffer bounds'\n }, RangeError)\nE('ERR_INVALID_ARG_TYPE',\n function (name, actual) {\n return `The \"${name}\" argument must be of type number. Received type ${typeof actual}`\n }, TypeError)\nE('ERR_OUT_OF_RANGE',\n function (str, range, input) {\n let msg = `The value of \"${str}\" is out of range.`\n let received = input\n if (Number.isInteger(input) && Math.abs(input) > 2 ** 32) {\n received = addNumericalSeparator(String(input))\n } else if (typeof input === 'bigint') {\n received = String(input)\n if (input > BigInt(2) ** BigInt(32) || input < -(BigInt(2) ** BigInt(32))) {\n received = addNumericalSeparator(received)\n }\n received += 'n'\n }\n msg += ` It must be ${range}. Received ${received}`\n return msg\n }, RangeError)\n\nfunction addNumericalSeparator (val) {\n let res = ''\n let i = val.length\n const start = val[0] === '-' ? 1 : 0\n for (; i >= start + 4; i -= 3) {\n res = `_${val.slice(i - 3, i)}${res}`\n }\n return `${val.slice(0, i)}${res}`\n}\n\n// CHECK FUNCTIONS\n// ===============\n\nfunction checkBounds (buf, offset, byteLength) {\n validateNumber(offset, 'offset')\n if (buf[offset] === undefined || buf[offset + byteLength] === undefined) {\n boundsError(offset, buf.length - (byteLength + 1))\n }\n}\n\nfunction checkIntBI (value, min, max, buf, offset, byteLength) {\n if (value > max || value < min) {\n const n = typeof min === 'bigint' ? 'n' : ''\n let range\n if (byteLength > 3) {\n if (min === 0 || min === BigInt(0)) {\n range = `>= 0${n} and < 2${n} ** ${(byteLength + 1) * 8}${n}`\n } else {\n range = `>= -(2${n} ** ${(byteLength + 1) * 8 - 1}${n}) and < 2 ** ` +\n `${(byteLength + 1) * 8 - 1}${n}`\n }\n } else {\n range = `>= ${min}${n} and <= ${max}${n}`\n }\n throw new errors.ERR_OUT_OF_RANGE('value', range, value)\n }\n checkBounds(buf, offset, byteLength)\n}\n\nfunction validateNumber (value, name) {\n if (typeof value !== 'number') {\n throw new errors.ERR_INVALID_ARG_TYPE(name, 'number', value)\n }\n}\n\nfunction boundsError (value, length, type) {\n if (Math.floor(value) !== value) {\n validateNumber(value, type)\n throw new errors.ERR_OUT_OF_RANGE(type || 'offset', 'an integer', value)\n }\n\n if (length < 0) {\n throw new errors.ERR_BUFFER_OUT_OF_BOUNDS()\n }\n\n throw new errors.ERR_OUT_OF_RANGE(type || 'offset',\n `>= ${type ? 1 : 0} and <= ${length}`,\n value)\n}\n\n// HELPER FUNCTIONS\n// ================\n\nconst INVALID_BASE64_RE = /[^+/0-9A-Za-z-_]/g\n\nfunction base64clean (str) {\n // Node takes equal signs as end of the Base64 encoding\n str = str.split('=')[0]\n // Node strips out invalid characters like \\n and \\t from the string, base64-js does not\n str = str.trim().replace(INVALID_BASE64_RE, '')\n // Node converts strings with length < 2 to ''\n if (str.length < 2) return ''\n // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not\n while (str.length % 4 !== 0) {\n str = str + '='\n }\n return str\n}\n\nfunction utf8ToBytes (string, units) {\n units = units || Infinity\n let codePoint\n const length = string.length\n let leadSurrogate = null\n const bytes = []\n\n for (let i = 0; i < length; ++i) {\n codePoint = string.charCodeAt(i)\n\n // is surrogate component\n if (codePoint > 0xD7FF && codePoint < 0xE000) {\n // last char was a lead\n if (!leadSurrogate) {\n // no lead yet\n if (codePoint > 0xDBFF) {\n // unexpected trail\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n continue\n } else if (i + 1 === length) {\n // unpaired lead\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n continue\n }\n\n // valid lead\n leadSurrogate = codePoint\n\n continue\n }\n\n // 2 leads in a row\n if (codePoint < 0xDC00) {\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n leadSurrogate = codePoint\n continue\n }\n\n // valid surrogate pair\n codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000\n } else if (leadSurrogate) {\n // valid bmp char, but last char was a lead\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n }\n\n leadSurrogate = null\n\n // encode utf8\n if (codePoint < 0x80) {\n if ((units -= 1) < 0) break\n bytes.push(codePoint)\n } else if (codePoint < 0x800) {\n if ((units -= 2) < 0) break\n bytes.push(\n codePoint >> 0x6 | 0xC0,\n codePoint & 0x3F | 0x80\n )\n } else if (codePoint < 0x10000) {\n if ((units -= 3) < 0) break\n bytes.push(\n codePoint >> 0xC | 0xE0,\n codePoint >> 0x6 & 0x3F | 0x80,\n codePoint & 0x3F | 0x80\n )\n } else if (codePoint < 0x110000) {\n if ((units -= 4) < 0) break\n bytes.push(\n codePoint >> 0x12 | 0xF0,\n codePoint >> 0xC & 0x3F | 0x80,\n codePoint >> 0x6 & 0x3F | 0x80,\n codePoint & 0x3F | 0x80\n )\n } else {\n throw new Error('Invalid code point')\n }\n }\n\n return bytes\n}\n\nfunction asciiToBytes (str) {\n const byteArray = []\n for (let i = 0; i < str.length; ++i) {\n // Node's code seems to be doing this and not & 0x7F..\n byteArray.push(str.charCodeAt(i) & 0xFF)\n }\n return byteArray\n}\n\nfunction utf16leToBytes (str, units) {\n let c, hi, lo\n const byteArray = []\n for (let i = 0; i < str.length; ++i) {\n if ((units -= 2) < 0) break\n\n c = str.charCodeAt(i)\n hi = c >> 8\n lo = c % 256\n byteArray.push(lo)\n byteArray.push(hi)\n }\n\n return byteArray\n}\n\nfunction base64ToBytes (str) {\n return base64.toByteArray(base64clean(str))\n}\n\nfunction blitBuffer (src, dst, offset, length) {\n let i\n for (i = 0; i < length; ++i) {\n if ((i + offset >= dst.length) || (i >= src.length)) break\n dst[i + offset] = src[i]\n }\n return i\n}\n\n// ArrayBuffer or Uint8Array objects from other contexts (i.e. iframes) do not pass\n// the `instanceof` check but they should be treated as of that type.\n// See: https://github.com/feross/buffer/issues/166\nfunction isInstance (obj, type) {\n return obj instanceof type ||\n (obj != null && obj.constructor != null && obj.constructor.name != null &&\n obj.constructor.name === type.name)\n}\nfunction numberIsNaN (obj) {\n // For IE11 support\n return obj !== obj // eslint-disable-line no-self-compare\n}\n\n// Create lookup table for `toString('hex')`\n// See: https://github.com/feross/buffer/issues/219\nconst hexSliceLookupTable = (function () {\n const alphabet = '0123456789abcdef'\n const table = new Array(256)\n for (let i = 0; i < 16; ++i) {\n const i16 = i * 16\n for (let j = 0; j < 16; ++j) {\n table[i16 + j] = alphabet[i] + alphabet[j]\n }\n }\n return table\n})()\n\n// Return not function with Error if BigInt not supported\nfunction defineBigIntMethod (fn) {\n return typeof BigInt === 'undefined' ? BufferBigIntNotDefined : fn\n}\n\nfunction BufferBigIntNotDefined () {\n throw new Error('BigInt not supported')\n}\n","// extracted by extract-css-chunks-webpack-plugin\nmodule.exports = {};","// extracted by extract-css-chunks-webpack-plugin\nmodule.exports = {\"nodeStrokeWidth\":\"0.8\",\"directionArrowSize\":\"6\",\"directionArrowWidth\":\"0.7\",\"node\":\"fornac-node\",\"directionArrow\":\"fornac-directionArrow\",\"plot\":\"fornac-plot\",\"selectedNode\":\"fornac-selectedNode\",\"nodeLabel\":\"fornac-nodeLabel\",\"link\":\"fornac-link\",\"plotLabel\":\"fornac-plotLabel\",\"transparent\":\"fornac-transparent\",\"dragLine\":\"fornac-dragLine\",\"mouseEventHelper\":\"fornac-mouseEventHelper\"};","/*! ieee754. BSD-3-Clause License. Feross Aboukhadijeh */\nexports.read = function (buffer, offset, isLE, mLen, nBytes) {\n var e, m\n var eLen = (nBytes * 8) - mLen - 1\n var eMax = (1 << eLen) - 1\n var eBias = eMax >> 1\n var nBits = -7\n var i = isLE ? (nBytes - 1) : 0\n var d = isLE ? -1 : 1\n var s = buffer[offset + i]\n\n i += d\n\n e = s & ((1 << (-nBits)) - 1)\n s >>= (-nBits)\n nBits += eLen\n for (; nBits > 0; e = (e * 256) + buffer[offset + i], i += d, nBits -= 8) {}\n\n m = e & ((1 << (-nBits)) - 1)\n e >>= (-nBits)\n nBits += mLen\n for (; nBits > 0; m = (m * 256) + buffer[offset + i], i += d, nBits -= 8) {}\n\n if (e === 0) {\n e = 1 - eBias\n } else if (e === eMax) {\n return m ? NaN : ((s ? -1 : 1) * Infinity)\n } else {\n m = m + Math.pow(2, mLen)\n e = e - eBias\n }\n return (s ? -1 : 1) * m * Math.pow(2, e - mLen)\n}\n\nexports.write = function (buffer, value, offset, isLE, mLen, nBytes) {\n var e, m, c\n var eLen = (nBytes * 8) - mLen - 1\n var eMax = (1 << eLen) - 1\n var eBias = eMax >> 1\n var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0)\n var i = isLE ? 0 : (nBytes - 1)\n var d = isLE ? 1 : -1\n var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0\n\n value = Math.abs(value)\n\n if (isNaN(value) || value === Infinity) {\n m = isNaN(value) ? 1 : 0\n e = eMax\n } else {\n e = Math.floor(Math.log(value) / Math.LN2)\n if (value * (c = Math.pow(2, -e)) < 1) {\n e--\n c *= 2\n }\n if (e + eBias >= 1) {\n value += rt / c\n } else {\n value += rt * Math.pow(2, 1 - eBias)\n }\n if (value * c >= 2) {\n e++\n c /= 2\n }\n\n if (e + eBias >= eMax) {\n m = 0\n e = eMax\n } else if (e + eBias >= 1) {\n m = ((value * c) - 1) * Math.pow(2, mLen)\n e = e + eBias\n } else {\n m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen)\n e = 0\n }\n }\n\n for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}\n\n e = (e << mLen) | m\n eLen += mLen\n for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}\n\n buffer[offset + i - d] |= s * 128\n}\n","// The MIT License (MIT)\n//\n// Copyright (c) 2014 Jonas Finnemann Jensen\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\nmodule.exports = require('./slugid');\n","// The MIT License (MIT)\n//\n// Copyright (c) 2014 Jonas Finnemann Jensen\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\nvar uuid = require('uuid');\n\n/** @type {(bytes: Uint8Array) => string} */\nvar toBase64 = (() => {\n if (typeof Buffer !== 'undefined') {\n return (bytes) => Buffer.from(bytes).toString('base64');\n }\n return (bytes) => btoa(String.fromCharCode(...bytes));\n})();\n\n/** @type {(base64: string) => Uint8Array | Buffer} */\nvar fromBase64 = (() => {\n if (typeof Buffer !== 'undefined') {\n return (base64) => Buffer.from(base64, 'base64');\n }\n return (base64) => Uint8Array.from(atob(base64), c => c.charCodeAt(0));\n})();\n\n/**\n * Returns the given uuid as a 22 character slug. This can be a regular v4\n * slug or a \"nice\" slug.\n */\nexports.encode = function(uuid_) {\n var bytes = uuid.parse(uuid_);\n var base64 = toBase64(bytes);\n var slug = base64\n .replace(/\\+/g, '-') // Replace + with - (see RFC 4648, sec. 5)\n .replace(/\\//g, '_') // Replace / with _ (see RFC 4648, sec. 5)\n .substring(0, 22); // Drop '==' padding\n return slug;\n};\n\n/**\n * Returns the uuid represented by the given v4 or \"nice\" slug\n */\nexports.decode = function(slug) {\n var base64 = slug\n .replace(/-/g, '+')\n .replace(/_/g, '/')\n + '==';\n return uuid.stringify(fromBase64(base64));\n};\n\n/**\n * Returns a randomly generated uuid v4 compliant slug\n */\nexports.v4 = function() {\n var bytes = uuid.v4(null, new Uint8Array(16));\n var base64 = toBase64(bytes);\n var slug = base64\n .replace(/\\+/g, '-') // Replace + with - (see RFC 4648, sec. 5)\n .replace(/\\//g, '_') // Replace / with _ (see RFC 4648, sec. 5)\n .substring(0, 22); // Drop '==' padding\n return slug;\n};\n\n/**\n * Returns a randomly generated uuid v4 compliant slug which conforms to a set\n * of \"nice\" properties, at the cost of some entropy. Currently this means one\n * extra fixed bit (the first bit of the uuid is set to 0) which guarantees the\n * slug will begin with [A-Za-f]. For example such slugs don't require special\n * handling when used as command line parameters (whereas non-nice slugs may\n * start with `-` which can confuse command line tools).\n *\n * Potentially other \"nice\" properties may be added in future to further\n * restrict the range of potential uuids that may be generated.\n */\nexports.nice = function() {\n var bytes = uuid.v4(null, new Uint8Array(16));\n bytes[0] = bytes[0] & 0x7f; // unset first bit to ensure [A-Za-f] first char\n var base64 = toBase64(bytes);\n var slug = base64\n .replace(/\\+/g, '-') // Replace + with - (see RFC 4648, sec. 5)\n .replace(/\\//g, '_') // Replace / with _ (see RFC 4648, sec. 5)\n .substring(0, 22); // Drop '==' padding\n return slug;\n};\n","// Unique ID creation requires a high quality random # generator. In the browser we therefore\n// require the crypto API and do not support built-in fallback to lower quality random number\n// generators (like Math.random()).\nvar getRandomValues;\nvar rnds8 = new Uint8Array(16);\nexport default function rng() {\n // lazy load so that environments that need to polyfill have a chance to do so\n if (!getRandomValues) {\n // getRandomValues needs to be invoked in a context where \"this\" is a Crypto implementation. Also,\n // find the complete implementation of crypto (msCrypto) on IE11.\n getRandomValues = typeof crypto !== 'undefined' && crypto.getRandomValues && crypto.getRandomValues.bind(crypto) || typeof msCrypto !== 'undefined' && typeof msCrypto.getRandomValues === 'function' && msCrypto.getRandomValues.bind(msCrypto);\n\n if (!getRandomValues) {\n throw new Error('crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported');\n }\n }\n\n return getRandomValues(rnds8);\n}","export default /^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;","import REGEX from './regex.js';\n\nfunction validate(uuid) {\n return typeof uuid === 'string' && REGEX.test(uuid);\n}\n\nexport default validate;","import validate from './validate.js';\n/**\n * Convert array of 16 byte values to UUID string format of the form:\n * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX\n */\n\nvar byteToHex = [];\n\nfor (var i = 0; i < 256; ++i) {\n byteToHex.push((i + 0x100).toString(16).substr(1));\n}\n\nfunction stringify(arr) {\n var offset = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n // Note: Be careful editing this code! It's been tuned for performance\n // and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434\n var uuid = (byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + '-' + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + '-' + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + '-' + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + '-' + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]]).toLowerCase(); // Consistency check for valid UUID. If this throws, it's likely due to one\n // of the following:\n // - One or more input array values don't map to a hex octet (leading to\n // \"undefined\" in the uuid)\n // - Invalid input values for the RFC `version` or `variant` fields\n\n if (!validate(uuid)) {\n throw TypeError('Stringified UUID is invalid');\n }\n\n return uuid;\n}\n\nexport default stringify;","import rng from './rng.js';\nimport stringify from './stringify.js'; // **`v1()` - Generate time-based UUID**\n//\n// Inspired by https://github.com/LiosK/UUID.js\n// and http://docs.python.org/library/uuid.html\n\nvar _nodeId;\n\nvar _clockseq; // Previous uuid creation time\n\n\nvar _lastMSecs = 0;\nvar _lastNSecs = 0; // See https://github.com/uuidjs/uuid for API details\n\nfunction v1(options, buf, offset) {\n var i = buf && offset || 0;\n var b = buf || new Array(16);\n options = options || {};\n var node = options.node || _nodeId;\n var clockseq = options.clockseq !== undefined ? options.clockseq : _clockseq; // node and clockseq need to be initialized to random values if they're not\n // specified. We do this lazily to minimize issues related to insufficient\n // system entropy. See #189\n\n if (node == null || clockseq == null) {\n var seedBytes = options.random || (options.rng || rng)();\n\n if (node == null) {\n // Per 4.5, create and 48-bit node id, (47 random bits + multicast bit = 1)\n node = _nodeId = [seedBytes[0] | 0x01, seedBytes[1], seedBytes[2], seedBytes[3], seedBytes[4], seedBytes[5]];\n }\n\n if (clockseq == null) {\n // Per 4.2.2, randomize (14 bit) clockseq\n clockseq = _clockseq = (seedBytes[6] << 8 | seedBytes[7]) & 0x3fff;\n }\n } // UUID timestamps are 100 nano-second units since the Gregorian epoch,\n // (1582-10-15 00:00). JSNumbers aren't precise enough for this, so\n // time is handled internally as 'msecs' (integer milliseconds) and 'nsecs'\n // (100-nanoseconds offset from msecs) since unix epoch, 1970-01-01 00:00.\n\n\n var msecs = options.msecs !== undefined ? options.msecs : Date.now(); // Per 4.2.1.2, use count of uuid's generated during the current clock\n // cycle to simulate higher resolution clock\n\n var nsecs = options.nsecs !== undefined ? options.nsecs : _lastNSecs + 1; // Time since last uuid creation (in msecs)\n\n var dt = msecs - _lastMSecs + (nsecs - _lastNSecs) / 10000; // Per 4.2.1.2, Bump clockseq on clock regression\n\n if (dt < 0 && options.clockseq === undefined) {\n clockseq = clockseq + 1 & 0x3fff;\n } // Reset nsecs if clock regresses (new clockseq) or we've moved onto a new\n // time interval\n\n\n if ((dt < 0 || msecs > _lastMSecs) && options.nsecs === undefined) {\n nsecs = 0;\n } // Per 4.2.1.2 Throw error if too many uuids are requested\n\n\n if (nsecs >= 10000) {\n throw new Error(\"uuid.v1(): Can't create more than 10M uuids/sec\");\n }\n\n _lastMSecs = msecs;\n _lastNSecs = nsecs;\n _clockseq = clockseq; // Per 4.1.4 - Convert from unix epoch to Gregorian epoch\n\n msecs += 12219292800000; // `time_low`\n\n var tl = ((msecs & 0xfffffff) * 10000 + nsecs) % 0x100000000;\n b[i++] = tl >>> 24 & 0xff;\n b[i++] = tl >>> 16 & 0xff;\n b[i++] = tl >>> 8 & 0xff;\n b[i++] = tl & 0xff; // `time_mid`\n\n var tmh = msecs / 0x100000000 * 10000 & 0xfffffff;\n b[i++] = tmh >>> 8 & 0xff;\n b[i++] = tmh & 0xff; // `time_high_and_version`\n\n b[i++] = tmh >>> 24 & 0xf | 0x10; // include version\n\n b[i++] = tmh >>> 16 & 0xff; // `clock_seq_hi_and_reserved` (Per 4.2.2 - include variant)\n\n b[i++] = clockseq >>> 8 | 0x80; // `clock_seq_low`\n\n b[i++] = clockseq & 0xff; // `node`\n\n for (var n = 0; n < 6; ++n) {\n b[i + n] = node[n];\n }\n\n return buf || stringify(b);\n}\n\nexport default v1;","import validate from './validate.js';\n\nfunction parse(uuid) {\n if (!validate(uuid)) {\n throw TypeError('Invalid UUID');\n }\n\n var v;\n var arr = new Uint8Array(16); // Parse ########-....-....-....-............\n\n arr[0] = (v = parseInt(uuid.slice(0, 8), 16)) >>> 24;\n arr[1] = v >>> 16 & 0xff;\n arr[2] = v >>> 8 & 0xff;\n arr[3] = v & 0xff; // Parse ........-####-....-....-............\n\n arr[4] = (v = parseInt(uuid.slice(9, 13), 16)) >>> 8;\n arr[5] = v & 0xff; // Parse ........-....-####-....-............\n\n arr[6] = (v = parseInt(uuid.slice(14, 18), 16)) >>> 8;\n arr[7] = v & 0xff; // Parse ........-....-....-####-............\n\n arr[8] = (v = parseInt(uuid.slice(19, 23), 16)) >>> 8;\n arr[9] = v & 0xff; // Parse ........-....-....-....-############\n // (Use \"/\" to avoid 32-bit truncation when bit-shifting high-order bytes)\n\n arr[10] = (v = parseInt(uuid.slice(24, 36), 16)) / 0x10000000000 & 0xff;\n arr[11] = v / 0x100000000 & 0xff;\n arr[12] = v >>> 24 & 0xff;\n arr[13] = v >>> 16 & 0xff;\n arr[14] = v >>> 8 & 0xff;\n arr[15] = v & 0xff;\n return arr;\n}\n\nexport default parse;","import stringify from './stringify.js';\nimport parse from './parse.js';\n\nfunction stringToBytes(str) {\n str = unescape(encodeURIComponent(str)); // UTF8 escape\n\n var bytes = [];\n\n for (var i = 0; i < str.length; ++i) {\n bytes.push(str.charCodeAt(i));\n }\n\n return bytes;\n}\n\nexport var DNS = '6ba7b810-9dad-11d1-80b4-00c04fd430c8';\nexport var URL = '6ba7b811-9dad-11d1-80b4-00c04fd430c8';\nexport default function (name, version, hashfunc) {\n function generateUUID(value, namespace, buf, offset) {\n if (typeof value === 'string') {\n value = stringToBytes(value);\n }\n\n if (typeof namespace === 'string') {\n namespace = parse(namespace);\n }\n\n if (namespace.length !== 16) {\n throw TypeError('Namespace must be array-like (16 iterable integer values, 0-255)');\n } // Compute hash of namespace and value, Per 4.3\n // Future: Use spread syntax when supported on all platforms, e.g. `bytes =\n // hashfunc([...namespace, ... value])`\n\n\n var bytes = new Uint8Array(16 + value.length);\n bytes.set(namespace);\n bytes.set(value, namespace.length);\n bytes = hashfunc(bytes);\n bytes[6] = bytes[6] & 0x0f | version;\n bytes[8] = bytes[8] & 0x3f | 0x80;\n\n if (buf) {\n offset = offset || 0;\n\n for (var i = 0; i < 16; ++i) {\n buf[offset + i] = bytes[i];\n }\n\n return buf;\n }\n\n return stringify(bytes);\n } // Function#name is not settable on some platforms (#270)\n\n\n try {\n generateUUID.name = name; // eslint-disable-next-line no-empty\n } catch (err) {} // For CommonJS default export support\n\n\n generateUUID.DNS = DNS;\n generateUUID.URL = URL;\n return generateUUID;\n}","/*\n * Browser-compatible JavaScript MD5\n *\n * Modification of JavaScript MD5\n * https://github.com/blueimp/JavaScript-MD5\n *\n * Copyright 2011, Sebastian Tschan\n * https://blueimp.net\n *\n * Licensed under the MIT license:\n * https://opensource.org/licenses/MIT\n *\n * Based on\n * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message\n * Digest Algorithm, as defined in RFC 1321.\n * Version 2.2 Copyright (C) Paul Johnston 1999 - 2009\n * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet\n * Distributed under the BSD License\n * See http://pajhome.org.uk/crypt/md5 for more info.\n */\nfunction md5(bytes) {\n if (typeof bytes === 'string') {\n var msg = unescape(encodeURIComponent(bytes)); // UTF8 escape\n\n bytes = new Uint8Array(msg.length);\n\n for (var i = 0; i < msg.length; ++i) {\n bytes[i] = msg.charCodeAt(i);\n }\n }\n\n return md5ToHexEncodedArray(wordsToMd5(bytesToWords(bytes), bytes.length * 8));\n}\n/*\n * Convert an array of little-endian words to an array of bytes\n */\n\n\nfunction md5ToHexEncodedArray(input) {\n var output = [];\n var length32 = input.length * 32;\n var hexTab = '0123456789abcdef';\n\n for (var i = 0; i < length32; i += 8) {\n var x = input[i >> 5] >>> i % 32 & 0xff;\n var hex = parseInt(hexTab.charAt(x >>> 4 & 0x0f) + hexTab.charAt(x & 0x0f), 16);\n output.push(hex);\n }\n\n return output;\n}\n/**\n * Calculate output length with padding and bit length\n */\n\n\nfunction getOutputLength(inputLength8) {\n return (inputLength8 + 64 >>> 9 << 4) + 14 + 1;\n}\n/*\n * Calculate the MD5 of an array of little-endian words, and a bit length.\n */\n\n\nfunction wordsToMd5(x, len) {\n /* append padding */\n x[len >> 5] |= 0x80 << len % 32;\n x[getOutputLength(len) - 1] = len;\n var a = 1732584193;\n var b = -271733879;\n var c = -1732584194;\n var d = 271733878;\n\n for (var i = 0; i < x.length; i += 16) {\n var olda = a;\n var oldb = b;\n var oldc = c;\n var oldd = d;\n a = md5ff(a, b, c, d, x[i], 7, -680876936);\n d = md5ff(d, a, b, c, x[i + 1], 12, -389564586);\n c = md5ff(c, d, a, b, x[i + 2], 17, 606105819);\n b = md5ff(b, c, d, a, x[i + 3], 22, -1044525330);\n a = md5ff(a, b, c, d, x[i + 4], 7, -176418897);\n d = md5ff(d, a, b, c, x[i + 5], 12, 1200080426);\n c = md5ff(c, d, a, b, x[i + 6], 17, -1473231341);\n b = md5ff(b, c, d, a, x[i + 7], 22, -45705983);\n a = md5ff(a, b, c, d, x[i + 8], 7, 1770035416);\n d = md5ff(d, a, b, c, x[i + 9], 12, -1958414417);\n c = md5ff(c, d, a, b, x[i + 10], 17, -42063);\n b = md5ff(b, c, d, a, x[i + 11], 22, -1990404162);\n a = md5ff(a, b, c, d, x[i + 12], 7, 1804603682);\n d = md5ff(d, a, b, c, x[i + 13], 12, -40341101);\n c = md5ff(c, d, a, b, x[i + 14], 17, -1502002290);\n b = md5ff(b, c, d, a, x[i + 15], 22, 1236535329);\n a = md5gg(a, b, c, d, x[i + 1], 5, -165796510);\n d = md5gg(d, a, b, c, x[i + 6], 9, -1069501632);\n c = md5gg(c, d, a, b, x[i + 11], 14, 643717713);\n b = md5gg(b, c, d, a, x[i], 20, -373897302);\n a = md5gg(a, b, c, d, x[i + 5], 5, -701558691);\n d = md5gg(d, a, b, c, x[i + 10], 9, 38016083);\n c = md5gg(c, d, a, b, x[i + 15], 14, -660478335);\n b = md5gg(b, c, d, a, x[i + 4], 20, -405537848);\n a = md5gg(a, b, c, d, x[i + 9], 5, 568446438);\n d = md5gg(d, a, b, c, x[i + 14], 9, -1019803690);\n c = md5gg(c, d, a, b, x[i + 3], 14, -187363961);\n b = md5gg(b, c, d, a, x[i + 8], 20, 1163531501);\n a = md5gg(a, b, c, d, x[i + 13], 5, -1444681467);\n d = md5gg(d, a, b, c, x[i + 2], 9, -51403784);\n c = md5gg(c, d, a, b, x[i + 7], 14, 1735328473);\n b = md5gg(b, c, d, a, x[i + 12], 20, -1926607734);\n a = md5hh(a, b, c, d, x[i + 5], 4, -378558);\n d = md5hh(d, a, b, c, x[i + 8], 11, -2022574463);\n c = md5hh(c, d, a, b, x[i + 11], 16, 1839030562);\n b = md5hh(b, c, d, a, x[i + 14], 23, -35309556);\n a = md5hh(a, b, c, d, x[i + 1], 4, -1530992060);\n d = md5hh(d, a, b, c, x[i + 4], 11, 1272893353);\n c = md5hh(c, d, a, b, x[i + 7], 16, -155497632);\n b = md5hh(b, c, d, a, x[i + 10], 23, -1094730640);\n a = md5hh(a, b, c, d, x[i + 13], 4, 681279174);\n d = md5hh(d, a, b, c, x[i], 11, -358537222);\n c = md5hh(c, d, a, b, x[i + 3], 16, -722521979);\n b = md5hh(b, c, d, a, x[i + 6], 23, 76029189);\n a = md5hh(a, b, c, d, x[i + 9], 4, -640364487);\n d = md5hh(d, a, b, c, x[i + 12], 11, -421815835);\n c = md5hh(c, d, a, b, x[i + 15], 16, 530742520);\n b = md5hh(b, c, d, a, x[i + 2], 23, -995338651);\n a = md5ii(a, b, c, d, x[i], 6, -198630844);\n d = md5ii(d, a, b, c, x[i + 7], 10, 1126891415);\n c = md5ii(c, d, a, b, x[i + 14], 15, -1416354905);\n b = md5ii(b, c, d, a, x[i + 5], 21, -57434055);\n a = md5ii(a, b, c, d, x[i + 12], 6, 1700485571);\n d = md5ii(d, a, b, c, x[i + 3], 10, -1894986606);\n c = md5ii(c, d, a, b, x[i + 10], 15, -1051523);\n b = md5ii(b, c, d, a, x[i + 1], 21, -2054922799);\n a = md5ii(a, b, c, d, x[i + 8], 6, 1873313359);\n d = md5ii(d, a, b, c, x[i + 15], 10, -30611744);\n c = md5ii(c, d, a, b, x[i + 6], 15, -1560198380);\n b = md5ii(b, c, d, a, x[i + 13], 21, 1309151649);\n a = md5ii(a, b, c, d, x[i + 4], 6, -145523070);\n d = md5ii(d, a, b, c, x[i + 11], 10, -1120210379);\n c = md5ii(c, d, a, b, x[i + 2], 15, 718787259);\n b = md5ii(b, c, d, a, x[i + 9], 21, -343485551);\n a = safeAdd(a, olda);\n b = safeAdd(b, oldb);\n c = safeAdd(c, oldc);\n d = safeAdd(d, oldd);\n }\n\n return [a, b, c, d];\n}\n/*\n * Convert an array bytes to an array of little-endian words\n * Characters >255 have their high-byte silently ignored.\n */\n\n\nfunction bytesToWords(input) {\n if (input.length === 0) {\n return [];\n }\n\n var length8 = input.length * 8;\n var output = new Uint32Array(getOutputLength(length8));\n\n for (var i = 0; i < length8; i += 8) {\n output[i >> 5] |= (input[i / 8] & 0xff) << i % 32;\n }\n\n return output;\n}\n/*\n * Add integers, wrapping at 2^32. This uses 16-bit operations internally\n * to work around bugs in some JS interpreters.\n */\n\n\nfunction safeAdd(x, y) {\n var lsw = (x & 0xffff) + (y & 0xffff);\n var msw = (x >> 16) + (y >> 16) + (lsw >> 16);\n return msw << 16 | lsw & 0xffff;\n}\n/*\n * Bitwise rotate a 32-bit number to the left.\n */\n\n\nfunction bitRotateLeft(num, cnt) {\n return num << cnt | num >>> 32 - cnt;\n}\n/*\n * These functions implement the four basic operations the algorithm uses.\n */\n\n\nfunction md5cmn(q, a, b, x, s, t) {\n return safeAdd(bitRotateLeft(safeAdd(safeAdd(a, q), safeAdd(x, t)), s), b);\n}\n\nfunction md5ff(a, b, c, d, x, s, t) {\n return md5cmn(b & c | ~b & d, a, b, x, s, t);\n}\n\nfunction md5gg(a, b, c, d, x, s, t) {\n return md5cmn(b & d | c & ~d, a, b, x, s, t);\n}\n\nfunction md5hh(a, b, c, d, x, s, t) {\n return md5cmn(b ^ c ^ d, a, b, x, s, t);\n}\n\nfunction md5ii(a, b, c, d, x, s, t) {\n return md5cmn(c ^ (b | ~d), a, b, x, s, t);\n}\n\nexport default md5;","import v35 from './v35.js';\nimport md5 from './md5.js';\nvar v3 = v35('v3', 0x30, md5);\nexport default v3;","import rng from './rng.js';\nimport stringify from './stringify.js';\n\nfunction v4(options, buf, offset) {\n options = options || {};\n var rnds = options.random || (options.rng || rng)(); // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`\n\n rnds[6] = rnds[6] & 0x0f | 0x40;\n rnds[8] = rnds[8] & 0x3f | 0x80; // Copy bytes to buffer, if provided\n\n if (buf) {\n offset = offset || 0;\n\n for (var i = 0; i < 16; ++i) {\n buf[offset + i] = rnds[i];\n }\n\n return buf;\n }\n\n return stringify(rnds);\n}\n\nexport default v4;","// Adapted from Chris Veness' SHA1 code at\n// http://www.movable-type.co.uk/scripts/sha1.html\nfunction f(s, x, y, z) {\n switch (s) {\n case 0:\n return x & y ^ ~x & z;\n\n case 1:\n return x ^ y ^ z;\n\n case 2:\n return x & y ^ x & z ^ y & z;\n\n case 3:\n return x ^ y ^ z;\n }\n}\n\nfunction ROTL(x, n) {\n return x << n | x >>> 32 - n;\n}\n\nfunction sha1(bytes) {\n var K = [0x5a827999, 0x6ed9eba1, 0x8f1bbcdc, 0xca62c1d6];\n var H = [0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0];\n\n if (typeof bytes === 'string') {\n var msg = unescape(encodeURIComponent(bytes)); // UTF8 escape\n\n bytes = [];\n\n for (var i = 0; i < msg.length; ++i) {\n bytes.push(msg.charCodeAt(i));\n }\n } else if (!Array.isArray(bytes)) {\n // Convert Array-like to Array\n bytes = Array.prototype.slice.call(bytes);\n }\n\n bytes.push(0x80);\n var l = bytes.length / 4 + 2;\n var N = Math.ceil(l / 16);\n var M = new Array(N);\n\n for (var _i = 0; _i < N; ++_i) {\n var arr = new Uint32Array(16);\n\n for (var j = 0; j < 16; ++j) {\n arr[j] = bytes[_i * 64 + j * 4] << 24 | bytes[_i * 64 + j * 4 + 1] << 16 | bytes[_i * 64 + j * 4 + 2] << 8 | bytes[_i * 64 + j * 4 + 3];\n }\n\n M[_i] = arr;\n }\n\n M[N - 1][14] = (bytes.length - 1) * 8 / Math.pow(2, 32);\n M[N - 1][14] = Math.floor(M[N - 1][14]);\n M[N - 1][15] = (bytes.length - 1) * 8 & 0xffffffff;\n\n for (var _i2 = 0; _i2 < N; ++_i2) {\n var W = new Uint32Array(80);\n\n for (var t = 0; t < 16; ++t) {\n W[t] = M[_i2][t];\n }\n\n for (var _t = 16; _t < 80; ++_t) {\n W[_t] = ROTL(W[_t - 3] ^ W[_t - 8] ^ W[_t - 14] ^ W[_t - 16], 1);\n }\n\n var a = H[0];\n var b = H[1];\n var c = H[2];\n var d = H[3];\n var e = H[4];\n\n for (var _t2 = 0; _t2 < 80; ++_t2) {\n var s = Math.floor(_t2 / 20);\n var T = ROTL(a, 5) + f(s, b, c, d) + e + K[s] + W[_t2] >>> 0;\n e = d;\n d = c;\n c = ROTL(b, 30) >>> 0;\n b = a;\n a = T;\n }\n\n H[0] = H[0] + a >>> 0;\n H[1] = H[1] + b >>> 0;\n H[2] = H[2] + c >>> 0;\n H[3] = H[3] + d >>> 0;\n H[4] = H[4] + e >>> 0;\n }\n\n return [H[0] >> 24 & 0xff, H[0] >> 16 & 0xff, H[0] >> 8 & 0xff, H[0] & 0xff, H[1] >> 24 & 0xff, H[1] >> 16 & 0xff, H[1] >> 8 & 0xff, H[1] & 0xff, H[2] >> 24 & 0xff, H[2] >> 16 & 0xff, H[2] >> 8 & 0xff, H[2] & 0xff, H[3] >> 24 & 0xff, H[3] >> 16 & 0xff, H[3] >> 8 & 0xff, H[3] & 0xff, H[4] >> 24 & 0xff, H[4] >> 16 & 0xff, H[4] >> 8 & 0xff, H[4] & 0xff];\n}\n\nexport default sha1;","import v35 from './v35.js';\nimport sha1 from './sha1.js';\nvar v5 = v35('v5', 0x50, sha1);\nexport default v5;","export default '00000000-0000-0000-0000-000000000000';","import validate from './validate.js';\n\nfunction version(uuid) {\n if (!validate(uuid)) {\n throw TypeError('Invalid UUID');\n }\n\n return parseInt(uuid.substr(14, 1), 16);\n}\n\nexport default version;","module.exports = __WEBPACK_EXTERNAL_MODULE__893__;","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","var scriptUrl;\nif (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + \"\";\nvar document = __webpack_require__.g.document;\nif (!scriptUrl && document) {\n\tif (document.currentScript)\n\t\tscriptUrl = document.currentScript.src;\n\tif (!scriptUrl) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tif(scripts.length) {\n\t\t\tvar i = scripts.length - 1;\n\t\t\twhile (i > -1 && (!scriptUrl || !/^http(s?):/.test(scriptUrl))) scriptUrl = scripts[i--].src;\n\t\t}\n\t}\n}\n// When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration\n// or pass an empty string (\"\") and set the __webpack_public_path__ variable from your code to use your own logic.\nif (!scriptUrl) throw new Error(\"Automatic publicPath is not supported in this browser\");\nscriptUrl = scriptUrl.replace(/#.*$/, \"\").replace(/\\?.*$/, \"\").replace(/\\/[^\\/]+$/, \"/\");\n__webpack_require__.p = scriptUrl;","export default __webpack_public_path__ + \"02188894d5236b1517df3210b79c2a7f.svg\";","import './d3-context-menu.css';\nimport ArrowIcon from './img/play.svg';\n\nimport d3 from 'd3';\nimport slugid from 'slugid';\n\nexport function contextMenu(menu, opts) {\n let previouslyMouseUp = false;\n let clickAway = () => {};\n let uid = slugid.nice();\n let rootElement = null;\n let orientation = 'right'; // display the menu to the right of the mouse click\n // or parent elemement\n let initialPos = null;\n let parentStart = null;\n\n var openCallback,\n closeCallback;\n\n if (typeof opts === 'function') {\n openCallback = opts;\n } else {\n opts = opts || {};\n openCallback = opts.onOpen;\n closeCallback = opts.onClose;\n }\n\n if ('rootElement' in opts)\n rootElement = opts['rootElement']\n\n if ('pos' in opts) {\n // do we want to place this menu somewhere specific?\n initialPos = opts.pos;\n }\n\n if ('orientation' in opts) {\n orientation = opts.orientation;\n }\n\n if ('parentStart' in opts) {\n parentStart = opts.parentStart;\n }\n\n // create the div element that will hold the context menu\n d3.selectAll('.d3-context-menu-' + uid).data([1])\n .enter()\n .append('div')\n .classed('d3-context-menu', true)\n .classed('d3-context-menu-' + uid, true)\n\n // close menu\n d3.select('body').on('click.d3-context-menu-' + uid, function() {\n if (previouslyMouseUp) {\n previouslyMouseUp = false;\n return;\n }\n console.log('body click close');\n\n d3.select('.d3-context-menu-' + uid).style('display', 'none');\n orientation = 'right';\n\n if (closeCallback) {\n closeCallback();\n }\n });\n\n // this gets executed when a contextmenu event occurs\n return function(data, index, pMouseUp=false,\n clickAwayFunc = function() { } ) {\n var elm = this;\n var contextMenuPos = null;\n let mousePos = null;\n let currentThis = this;\n\n if (rootElement == null)\n mousePos = d3.mouse(this);\n else\n mousePos = d3.mouse(rootElement); // for recursive menus, we need the mouse\n // position relative to another element\n\n clickAway = clickAwayFunc;\n let openChildMenuUid = null;\n\n previouslyMouseUp = pMouseUp;\n\n d3.selectAll('.d3-context-menu-' + uid).html('');\n var list = d3.selectAll('.d3-context-menu-' + uid)\n .on('contextmenu', function(d) {\n console.log('context-menu close');\n d3.select('.d3-context-menu-' + uid).style('display', 'none'); \n orientation = 'right';\n\n d3.event.preventDefault();\n d3.event.stopPropagation();\n })\n .append('ul');\n\n list.selectAll('li').data(typeof menu === 'function' ? menu(data) : menu).enter()\n .append('li')\n .attr('class', function(d) {\n console.log('d:', d);\n var ret = '';\n if (d.divider) {\n ret += ' is-divider';\n }\n if (d.disabled) {\n ret += ' is-disabled';\n }\n if (!d.action) {\n ret += ' is-header';\n }\n if ('children' in d) {\n ret += ' d3-context-menu-recursive';\n }\n return ret;\n })\n .html(function(d) {\n if (d.divider) {\n return '
';\n }\n if (!d.title) {\n console.error('No title attribute set. Check the spelling of your options.');\n }\n return (typeof d.title === 'string') ? d.title : d.title(data);\n })\n .on('click', function(d, i) {\n if (d.disabled) return; // do nothing if disabled\n if (!d.action) return; // headers have no \"action\"\n d.action(elm, data, index, mousePos);\n console.log('click close');\n\n // close all context menus\n d3.selectAll('.d3-context-menu').style('display', 'none');\n orientation = 'right';\n\n if (closeCallback) {\n closeCallback();\n }\n })\n .on('mouseenter', function(d, i) {\n d3.select(this)\n .classed('d3-context-menu-selected', true)\n\n if (openChildMenuUid != null) {\n // there's a child menu open\n\n // unselect all items\n d3.select('.d3-context-menu-' + uid)\n .selectAll('li')\n .classed('d3-context-menu-selected', false);\n\n if (typeof d.children == 'undefined') {\n console.log(\"no children close\");\n // no children, so hide any open child menus\n d3.select('.d3-context-menu-' + openChildMenuUid)\n .style('display', 'none');\n\n openChildMenuUid = null;\n return;\n }\n\n if (d.childUid == openChildMenuUid) {\n // the correct child menu is already open\n return;\n\n } else {\n // need to open a different child menu\n console.log('open different child menu close');\n \n // close the already open one\n d3.select('.d3-context-menu-' + openChildMenuUid)\n .style('display', 'none');\n\n openChildMenuUid = null;\n\n }\n } \n\n // there should be no menu open right now\n if (typeof d.children != 'undefined') {\n let boundingRect = this.getBoundingClientRect();\n\n let childrenContextMenu = null\n if (orientation == 'left') {\n childrenContextMenu = contextMenu(d.children, {'rootElement': currentThis,\n 'pos': [ boundingRect.left + window.pageXOffset,\n boundingRect.top - 2 + window.pageYOffset],\n 'orientation': 'left'});\n } else {\n childrenContextMenu = contextMenu(d.children, \n {\n 'pos': [ boundingRect.left + boundingRect.width + window.pageXOffset,\n boundingRect.top - 2 + window.pageYOffset],\n 'rootElement': currentThis,\n 'parentStart': [boundingRect.left + window.pageXOffset,\n boundingRect.top - 2 + window.pageYOffset]});\n }\n\n d.childUid = childrenContextMenu.apply(this, [data,i,true,\n function() { }]);\n openChildMenuUid = d.childUid;\n }\n\n\n d3.select(this)\n .classed('d3-context-menu-selected', true)\n \n })\n .on('mouseleave', function(d, i) {\n\n if (openChildMenuUid == null) {\n d3.select(this)\n .classed('d3-context-menu-selected', false);\n }\n });\n\n list.selectAll('.d3-context-menu-recursive')\n .append('img')\n .attr('src', ArrowIcon)\n .attr('width', '14px')\n .attr('height', '14px')\n .style('position', 'absolute')\n .style('right', '5px')\n ;\n\n // the openCallback allows an action to fire before the menu is displayed\n // an example usage would be closing a tooltip\n if (openCallback) {\n if (openCallback(data, index) === false) {\n return uid;\n }\n }\n\n let contextMenuSelection = d3.select('.d3-context-menu-' + uid)\n .style('display', 'block');\n\n if (initialPos == null) {\n d3.select('.d3-context-menu-' + uid)\n .style('left', (d3.event.pageX - 2) + 'px')\n .style('top', (d3.event.pageY - 2) + 'px')\n } else {\n d3.select('.d3-context-menu-' + uid)\n .style('left', initialPos[0] + 'px')\n .style('top', initialPos[1] + 'px')\n }\n\n // check if the menu disappears off the side of the window\n let boundingRect = contextMenuSelection.node().getBoundingClientRect();\n\n if (boundingRect.left + boundingRect.width > window.innerWidth || orientation == 'left') {\n orientation = 'left';\n\n // menu goes of the end of the window, position it the other way\n if (initialPos == null) {\n // place the menu where the user clicked\n d3.select('.d3-context-menu-' + uid)\n .style('left', (d3.event.pageX - 2 - boundingRect.width) + 'px')\n .style('top', (d3.event.pageY - 2) + 'px')\n } else {\n if (parentStart != null) {\n d3.select('.d3-context-menu-' + uid)\n .style('left', (parentStart[0] - boundingRect.width) + 'px')\n .style('top', parentStart[1] + 'px')\n } else {\n d3.select('.d3-context-menu-' + uid)\n .style('left', (initialPos[0] - boundingRect.width) + 'px')\n .style('top', initialPos[1] + 'px')\n }\n }\n \n }\n\n // display context menu\n\n if (previouslyMouseUp)\n return uid;\n\n d3.event.preventDefault();\n d3.event.stopPropagation();\n //d3.event.stopImmediatePropagation();\n //\n return uid;\n };\n};\n","var numberSort = function(a,b) { return a - b; };\n\nexport function arraysEqual(a, b) {\n // courtesy of \n // http://stackoverflow.com/questions/3115982/how-to-check-if-two-arrays-are-equal-with-javascript\n if (a === b) return true;\n if (a === null || b === null) return false;\n if (a.length != b.length) return false;\n\n // If you don't care about the order of the elements inside\n // the array, you should sort both arrays here.\n\n for (var i = 0; i < a.length; ++i) {\n if (a[i] !== b[i]) return false;\n }\n return true;\n}\n\nexport function RNAUtilities() {\n var self = this;\n\n // the brackets to use when constructing dotbracket strings\n // with pseudoknots\n self.bracketLeft = \"([{abcdefghijklmnopqrstuvwxyz\".split(\"\");\n\n self.inverseBrackets = function(bracket) {\n var res = {};\n for (var i = 0; i < bracket.length; i++) {\n res[bracket[i]] = i;\n }\n return res;\n };\n\n self.maximumMatching = function maximumMatching(pt){\n // Courtesy of the great Ronny Lorenz\n\n var n = pt[0];\n var TURN = 0; //minimal number of nucleotides in the hairpin\n\n /* array init */\n var mm = new Array(n + 1);\n for(var i = 0; i <= n; i++){\n mm[i] = new Array(n + 1);\n for(var j = i; j <= n; j++)\n mm[i][j] = 0;\n }\n var maximum = 0;\n\n /* actual computation */\n for(var i = n - TURN - 1; i > 0; i--)\n\n for(var j = i + TURN + 1; j <= n; j++){\n maximum = mm[i][j-1];\n\n for(var l = j - TURN - 1; l >= i; l--) {\n if(pt[l] === j) {\n\n // we have a base pair here\n maximum = Math.max(maximum, ((l > i) ? mm[i][l-1] : 0) + 1 + ((j - l - 1 > 0) ? mm[l+1][j-1] : 0));\n }\n }\n\n mm[i][j] = maximum;\n }\n\n maximum = mm[1][n];\n\n return mm;\n };\n\n self.backtrackMaximumMatching = function(mm, oldPt) {\n var pt = Array.apply(null, \n Array(mm.length)).map(function() { return 0 }); \n //create an array containing zeros\n\n self.mmBt(mm, pt, oldPt, 1, mm.length-1);\n return pt;\n }\n\n self.mmBt = function(mm, pt, oldPt, i, j){\n // Create a pairtable from the backtracking\n var maximum = mm[i][j];\n var TURN = 0;\n\n if(j - i - 1 < TURN) return; /* no more pairs */\n\n if(mm[i][j-1] == maximum){ /* j is unpaired */\n self.mmBt(mm, pt, oldPt, i, j-1);\n return;\n }\n\n for(var q = j - TURN - 1; q >= i; q--){ /* j is paired with some q */\n if (oldPt[j] !== q)\n continue;\n\n var leftPart = (q > i) ? mm[i][q-1] : 0;\n var enclosedPart = (j - q - 1 > 0) ? mm[q+1][j-1] : 0;\n\n if(leftPart + enclosedPart + 1 == maximum) {\n // there's a base pair between j and q\n pt[q] = j;\n pt[j] = q;\n\n if(i < q) \n self.mmBt(mm, pt, oldPt, i, q - 1);\n\n self.mmBt(mm, pt, oldPt, q + 1, j - 1);\n return;\n }\n }\n\n //alert(i + \",\" + j + \": backtracking failed!\");\n console.log('FAILED!!!' + i + ',' + j + ': backtracking failed!');\n\n };\n\n self.dotbracketToPairtable = function(dotbracket) {\n // create an array and initialize it to 0\n var pt = Array.apply(null, new Array(dotbracket.length + 1)).map(Number.prototype.valueOf,0);\n \n // the first element is always the length of the RNA molecule\n pt[0] = dotbracket.length;\n\n // store the pairing partners for each symbol\n var stack = {};\n for (var i = 0; i < self.bracketLeft.length; i++) {\n stack[i] = [];\n }\n\n // lookup the index of each symbol in the bracket array\n var inverseBracketLeft = self.inverseBrackets(self.bracketLeft);\n var inverseBracketRight = self.inverseBrackets(self.bracketRight);\n\n for (var i = 0; i < dotbracket.length; i++) {\n var a = dotbracket[i];\n var ni = i + 1;\n\n if (a == '.' || a == 'o') {\n // unpaired\n pt[ni] = 0;\n } else {\n if (a in inverseBracketLeft) {\n // open pair?\n stack[inverseBracketLeft[a]].push(ni);\n } else if (a in inverseBracketRight){\n // close pair?\n var j = stack[inverseBracketRight[a]].pop();\n\n pt[ni] = j;\n pt[j] = ni;\n } else if (a == '&'){\n // there is a sequence break here, ignore it\n } else {\n throw \"Unknown symbol in dotbracket string\";\n }\n }\n }\n\n for (var key in stack) {\n if (stack[key].length > 0) {\n throw \"Unmatched base at position \" + stack[key][0];\n }\n }\n\n return pt;\n };\n\n self.insertIntoStack = function(stack, i, j) {\n var k = 0;\n while (stack[k].length > 0 && stack[k][stack[k].length - 1] < j) {\n k += 1;\n }\n\n stack[k].push(j);\n return k;\n };\n\n self.deleteFromStack = function(stack, j) {\n var k = 0;\n while (stack[k].length === 0 || stack[k][stack[k].length-1] != j) {\n k += 1;\n }\n stack[k].pop();\n return k;\n };\n\n self.pairtableToDotbracket = function(pt) {\n // store the pairing partners for each symbol\n var stack = {};\n for (var i = 0; i < pt[0]; i++) {\n stack[i] = [];\n }\n\n var seen = {};\n var res = \"\";\n var i;\n for (var i = 1; i < pt[0] + 1; i++) {\n if (pt[i] !== 0 && pt[i] in seen) {\n throw \"Invalid pairtable contains duplicate entries\";\n }\n seen[pt[i]] = true;\n\n if (pt[i] === 0) {\n res += '.';\n } else {\n if (pt[i] > i) {\n res += self.bracketLeft[self.insertIntoStack(stack, i, pt[i])];\n } else {\n res += self.bracketRight[self.deleteFromStack(stack, i)];\n }\n }\n }\n\n return res;\n };\n\n self.findUnmatched = function(pt, from, to) {\n /*\n * Find unmatched nucleotides in this molecule.\n */\n var toRemove = [];\n var unmatched = [];\n\n var origFrom = from;\n var origTo = to;\n var i;\n\n for (var i = from; i <= to; i++)\n if (pt[i] !== 0 && (pt[i] < from || pt[i] > to))\n unmatched.push([i,pt[i]]);\n\n for (var i = origFrom; i <= origTo; i++) {\n while (pt[i] === 0 && i <= origTo) i++;\n\n to = pt[i];\n\n while (pt[i] === to) {\n i++;\n to--;\n }\n \n toRemove = toRemove.concat(self.findUnmatched(pt, i, to));\n }\n\n if (unmatched.length > 0)\n toRemove.push(unmatched);\n\n return toRemove;\n };\n\n self.removePseudoknotsFromPairtable = function(pt) {\n /* Remove the pseudoknots from this structure in such a fashion\n * that the least amount of base-pairs need to be broken\n *\n * The pairtable is manipulated in place and a list of tuples\n * indicating the broken base pairs is returned.\n */\n\n var mm = self.maximumMatching(pt);\n var newPt = self.backtrackMaximumMatching(mm, pt);\n var removed = [];\n\n for (var i = 1; i < pt.length; i++) {\n if (pt[i] < i)\n continue;\n\n if (newPt[i] != pt[i]) {\n removed.push([i, pt[i]]);\n pt[pt[i]] = 0;\n pt[i] = 0;\n }\n }\n\n return removed;\n };\n\n self.ptToElements = function(pt, level, i, j, dotBracketBreaks) {\n /* Convert a pair table to a list of secondary structure \n * elements:\n *\n * [['s',1,[2,3]]\n *\n * The 's' indicates that an element can be a stem. It can also be\n * an interior loop ('i'), a hairpin loop ('h') or a multiloop ('m')\n *\n * The second number (1 in this case) indicates the depth or\n * how many base pairs have to be broken to get to this element.\n *\n * Finally, there is the list of nucleotides which are part of\n * of this element.\n */\n var elements = [];\n var u5 = [i-1];\n var u3 = [j+1];\n\n if (arguments.length < 5)\n dotBracketBreaks = [];\n\n if (i > j)\n return [];\n \n //iterate over the unpaired regions on either side\n //this is either 5' and 3' unpaired if level == 0\n //or an interior loop or a multiloop\n for (; pt[i] === 0; i++) { u5.push(i); }\n for (; pt[j] === 0; j--) { u3.push(j); }\n\n if (i > j) {\n //hairpin loop or one large unpaired molecule\n u5.push(i);\n if (level === 0)\n return [['e',level, u5.sort(numberSort)]];\n else {\n // check to see if we have chain breaks due\n // to multiple strands in the input\n var external = false;\n var left = [];\n var right = [];\n for (var k = 0; k < u5.length; k++) {\n if (external)\n right.push(u5[k]);\n else\n left.push(u5[k]);\n\n if (dotBracketBreaks.indexOf(u5[k]) >= 0)\n external = true;\n }\n\n if (external) {\n return [['h',level, u5.sort(numberSort)]];\n }\n else\n // if not, this is a simple hairpin loop\n return [['h',level, u5.sort(numberSort)]];\n }\n }\n\n if (pt[i] != j) {\n //multiloop\n var m = u5;\n var k = i;\n\n // the nucleotide before and the starting nucleotide\n m.push(k);\n while (k <= j) {\n // recurse into a stem\n elements = elements.concat(self.ptToElements(pt, level, k, pt[k], dotBracketBreaks));\n\n // add the nucleotides between stems\n m.push(pt[k]);\n k = pt[k] + 1;\n for (; pt[k] === 0 && k <= j; k++) { m.push(k);}\n m.push(k);\n }\n m.pop();\n m = m.concat(u3);\n \n if (m.length > 0) {\n if (level === 0)\n elements.push(['e', level, m.sort(numberSort)]);\n else\n elements.push(['m', level, m.sort(numberSort)]);\n }\n \n return elements;\n }\n\n if (pt[i] === j) {\n //interior loop\n u5.push(i);\n u3.push(j);\n\n var combined = u5.concat(u3);\n if (combined.length > 4) {\n if (level === 0)\n elements.push(['e',level, u5.concat(u3).sort(numberSort)]);\n else\n elements.push(['i',level, u5.concat(u3).sort(numberSort)]);\n }\n } \n\n var s = [];\n //go through the stem\n while (pt[i] === j && i < j) {\n //one stem\n s.push(i);\n s.push(j);\n\n i += 1;\n j -= 1;\n\n level += 1;\n }\n\n u5 = [i-1];\n u3 = [j+1];\n elements.push(['s', level, s.sort(numberSort)]);\n\n return elements.concat(self.ptToElements(pt, level, i, j, dotBracketBreaks));\n };\n\n}\n\nexport var rnaUtilities = new RNAUtilities();\n\nexport function ColorScheme(colorsText) {\n var self = this;\n self.colorsText = colorsText;\n\n self.parseRange = function(rangeText) {\n //parse a number range such as 1-10 or 3,7,9 or just 7\n var parts = rangeText.split(',')\n var nums = [];\n\n for (var i = 0; i < parts.length; i++) {\n //could be 1 or 10-11 or something like that\n var parts1 = parts[i].split('-');\n\n if (parts1.length == 1)\n nums.push(parseInt(parts1[0]));\n else if (parts1.length == 2) {\n var from = parseInt(parts1[0]);\n var to = parseInt(parts1[1]);\n\n // add each number in this range\n for (var j = from; j <= to; j++) \n nums.push(j)\n } else {\n console.log('Malformed range (too many dashes):', rangeText);\n }\n }\n\n return nums;\n }\n\n self.parseColorText = function(colorText) {\n /* Parse the text of an RNA color string. Instructions and description\n * of the format are given below.\n *\n * The return is a json double dictionary indexed first by the \n * molecule name, then by the nucleotide. This is then applied\n * by force.js to the RNAs it is displaying. When no molecule\n * name is specified, the color is applied to all molecules*/\n var lines = colorText.split('\\n');\n var currMolecule = '';\n var counter = 1;\n var colorsJson = {colorValues: {'':{}}, range:['white', 'steelblue']};\n var domainValues = [];\n\n\n for (var i = 0; i < lines.length; i++) {\n\n if (lines[i][0] == '>') {\n // new molecule\n currMolecule = lines[i].trim().slice(1);\n counter = 1;\n\n colorsJson.colorValues[currMolecule] = {};\n continue;\n }\n\n let words = lines[i].trim().split(/[\\s]+/);\n\n for (var j = 0; j < words.length; j++) {\n if (isNaN(words[j])) {\n if (words[j].search('range') === 0) {\n //there's a color scale in this entry\n let parts = words[j].split('=');\n let partsRight = parts[1].split(':')\n colorsJson.range = [partsRight[0], partsRight[1]];\n continue;\n }\n\n if (words[j].search('domain') == 0) {\n //there's a color scale in this entry\n let parts = words[j].split('=');\n let partsRight = parts[1].split(':')\n colorsJson.domain = [partsRight[0], partsRight[1]];\n continue;\n }\n\n // it's not a number, should be a combination \n // of a number (nucleotide #) and a color\n let parts = words[j].split(':');\n let nums = self.parseRange(parts[0]);\n let color = parts[1]\n\n for (var k = 0; k < nums.length; k++) {\n if (isNaN(color)) {\n colorsJson.colorValues[currMolecule][nums[k]] = color;\n } else {\n colorsJson.colorValues[currMolecule][nums[k]] = +color;\n domainValues.push(Number(color));\n }\n }\n } else {\n //it's a number, so we add it to the list of values\n //seen for this molecule\n colorsJson.colorValues[currMolecule][counter] = Number(words[j]);\n counter += 1;\n\n domainValues.push(Number(words[j]));\n }\n }\n }\n\n if (!('domain' in colorsJson))\n colorsJson.domain = [Math.min.apply(null, domainValues), Math.max.apply(null, domainValues)];\n\n self.colorsJson = colorsJson;\n\n return self;\n };\n\n self.normalizeColors = function() {\n /* \n * Normalize the passed in values so that they range from\n * 0 to 1\n */\n var value;\n\n for (var moleculeName in self.colorsJson) {\n var minNum = Number.MAX_VALUE;\n var maxNum = Number.MIN_VALUE;\n\n // iterate once to find the min and max values;\n for (var resnum in self.colorsJson.colorValues[moleculeName]) {\n value = self.colorsJson.colorValues[moleculeName][resnum];\n if (typeof value == 'number') {\n if (value < minNum)\n minNum = value;\n if (value > maxNum)\n maxNum = value;\n }\n }\n\n // iterate again to normalize\n for (resnum in self.colorsJson.colorValues[moleculeName]) {\n value = self.colorsJson.colorValues[moleculeName][resnum];\n if (typeof value == 'number') {\n self.colorsJson.colorValues[moleculeName][resnum] = (value - minNum ) / (maxNum - minNum);\n }\n }\n }\n\n return self;\n };\n\n self.parseColorText(self.colorsText);\n return self;\n}\n","import {arraysEqual,RNAUtilities,rnaUtilities} from './rnautils.js';\nimport slugid from 'slugid';\n\nvar numberSort = function(a,b) { return a - b; };\n\nif (typeof(String.prototype.trim) === 'undefined') {\n String.prototype.trim = function() {\n return String(this).replace(/^\\s+|\\s+$/g, '');\n };\n}\n\nexport function ProteinGraph(structName, size, uid) {\n var self = this;\n\n self.type = 'protein';\n self.size = size;\n self.nodes = [{'name': 'P',\n 'num': 1,\n 'radius': 3 * Math.sqrt(size),\n 'rna': self,\n 'nodeType': 'protein',\n 'structName': structName,\n 'elemType': 'p',\n 'size': size,\n 'uid': slugid.nice()}];\n\n self.links = [];\n self.uid = slugid.nice();\n\n self.addUids = function(uids) {\n for (let i = 0; i < uids.length; i++)\n self.nodes[i].uid = uids[i];\n\n return self;\n };\n\n self.getUids = function() {\n /* Get the positions of each node so that they\n * can be passed to elementsToJson later\n */\n uids = [];\n for (let i = 0; i < self.dotbracket.length; i++)\n uids.push(self.nodes[i].uid);\n\n return uids;\n };\n\n}\n\nexport function RNAGraph(seq = '', dotbracket = '', structName = '', startNumber = 1) {\n var self = this;\n\n self.type = 'rna';\n self.circularizeExternal = false;\n self.seq = seq;\n self.dotbracket = dotbracket; //i.e. ..((..))..\n self.structName = structName;\n self.circular = false;\n\n if (self.dotbracket.slice(-1) == '*') {\n //circular RNA\n self.dotbracket = self.dotbracket.slice(0, -1);\n self.circular = true;\n }\n\n self.uid = slugid.nice();\n\n self.elements = []; //store the elements and the\n //nucleotides they contain\n self.pseudoknotPairs = [];\n self.nucsToNodes = {};\n\n self.addUids = function(uids) {\n let nucleotideNodes = self.nodes.filter(function(d) { return d.nodeType == 'nucleotide'; });\n\n for (let i = 0; i < uids.length && i < nucleotideNodes.length; i++) {\n nucleotideNodes[i].uid = uids[i];\n }\n\n return self;\n };\n\n self.computePairtable = function() {\n self.pairtable = rnaUtilities.dotbracketToPairtable(self.dotbracket);\n };\n\n // self.removeBreaks = function(targetString) {\n // // Collect the indexes of the chain breaks in the targetString\n // // chain breaks are indicated by '&'\n // var breaks = [];\n // for (var i = 0; i < targetString.length; i++) {\n // if (targetString[i] === '&') {\n // breaks.push(i);\n // }\n // }\n\n // return {targetString: targetString, breaks: breaks};\n // };\n\n // var ret = self.removeBreaks(self.dotbracket);\n // commented out to avoid removing the break node, let's keep it in the dotbracket\n // self.dotbracket = ret.targetString;\n // self.dotBracketBreaks = ret.breaks;\n\n // ret = self.removeBreaks(self.seq);\n // commented out to avoid removing the break node, let's keep it in the sequence\n // self.seq = ret.targetString;\n // self.seqBreaks = ret.breaks;\n\n self.rnaLength = self.dotbracket.length;\n\n // if (!arraysEqual(self.dotBracketBreaks, self.seqBreaks)) {\n // console.log('WARNING: Sequence and structure breaks not equal');\n // console.log('WARNING: Using the breaks in the structure');\n // }\n\n self.computePairtable();\n\n self.addPositions = function(nodeType, positions) {\n let labelNodes = self.nodes.filter(function(d) { return d.nodeType == nodeType; });\n\n for (let i = 0; i < labelNodes.length; i++) {\n labelNodes[i].x = positions[i][0];\n labelNodes[i].y = positions[i][1];\n }\n\n return self;\n };\n\n self.breakNodesToFakeNodes = function() {\n // convert all the nodes following breaks to fake nodes\n let labelNodes = self.nodes.filter(function(d) { return d.nodeType == 'nucleotide'; });\n\n // // if a node was an artifical break node, convert it to a middle\n // for (let i = 0; i < labelNodes.length; i++) {\n // if (self.dotBracketBreaks.indexOf(i) >= 0) {\n // labelNodes[i].nodeType = 'middle';\n // // commented out to avoid removing the node after the break\n // // labelNodes[i+1].nodeType = 'middle';\n // }\n // }\n\n for (let i = 0; i < self.elements.length; i++) {\n var broken = false;\n\n // // change the elemType of the other nodes in the element containing\n // // the break\n // for (let j = 0; j < self.elements[i][2].length; j++) {\n // if (self.dotBracketBreaks.indexOf(self.elements[i][2][j]) >= 0)\n // broken = true;\n // }\n\n if (broken) {\n self.elements[i][2].map(function(x) {\n if (x == 0)\n return;\n self.nodes[x-1].elemType = 'e';\n });\n } else {\n self.elements[i][2].map(function(x) {\n if (x == 0)\n return;\n self.nodes[x-1].elemType = self.elements[i][0];\n });\n }\n }\n return self;\n };\n\n self.getPositions = function(nodeType) {\n var positions = [];\n let nucleotideNodes = self.nodes.filter(function(d) { return d.nodeType == nodeType; });\n\n for (let i = 0; i < nucleotideNodes.length; i++)\n positions.push([nucleotideNodes[i].x, nucleotideNodes[i].y]);\n\n return positions;\n };\n\n self.getUids = function() {\n /* Get the positions of each node so that they\n * can be passed to elementsToJson later\n */\n var uids = [];\n for (let i = 0; i < self.dotbracket.length; i++)\n uids.push(self.nodes[i].uid);\n\n return uids;\n };\n\n self.reinforceStems = function() {\n var pt = self.pairtable;\n let relevantElements = self.elements.filter( function(d) {\n return d[0] == 's' && d[2].length >= 4;\n });\n\n for (let i = 0; i < relevantElements.length; i++) {\n let allNucs = relevantElements[i][2];\n let nucs = allNucs.slice(0, allNucs.length / 2);\n\n for (let j = 0; j < nucs.length-1; j++) {\n self.addFakeNode([nucs[j], nucs[j+1], pt[nucs[j+1]], pt[nucs[j]]]);\n }\n }\n\n return self;\n };\n\n self.reinforceLoops = function() {\n /*\n * Add a set of fake nodes to enforce the structure\n */\n var filterNucs = function(d) {\n return d !== 0 && d <= self.dotbracket.length;\n };\n\n for (let i = 0; i < self.elements.length; i++) {\n if (self.elements[i][0] == 's' || (!self.circularizeExternal && self.elements[i][0] == 'e'))\n continue;\n\n var nucs = self.elements[i][2].filter(filterNucs);\n\n if (self.elements[i][0] == 'e') {\n var newNode1 = {'name': '',\n 'num': -3,\n //'radius': 18 * radius -6,\n 'radius': 0,\n 'rna': self,\n 'nodeType': 'middle',\n 'elemType': 'f',\n 'nucs': [],\n 'x': self.nodes[self.rnaLength-1].x,\n 'y': self.nodes[self.rnaLength-1].y,\n 'px': self.nodes[self.rnaLength-1].px,\n 'py': self.nodes[self.rnaLength-1].py,\n 'uid': slugid.nice() };\n var newNode2 = {'name': '',\n 'num': -2,\n //'radius': 18 * radius -6,\n 'radius': 0,\n 'rna': self,\n 'nodeType': 'middle',\n 'elemType': 'f',\n 'nucs': [],\n 'x': self.nodes[0].x,\n 'y': self.nodes[0].y,\n 'px': self.nodes[0].px,\n 'py': self.nodes[0].py,\n 'uid': slugid.nice() };\n\n nucs.push(self.nodes.length+1);\n nucs.push(self.nodes.length+2);\n self.nodes.push(newNode1);\n self.nodes.push(newNode2);\n }\n\n\n self.addFakeNode(nucs);\n }\n\n return self;\n };\n\n self.updateLinkUids = function() {\n for (let i = 0; i < self.links.length; i++) {\n self.links[i].uid = self.links[i].source.uid + self.links[i].target.uid;\n }\n\n return self;\n };\n\n self.addFakeNode = function(nucs) {\n var linkLength = 18; //make sure this is consistent with the value in force.js\n var nodeWidth = 6;\n var angle = (3.1415 * 2) / (2 * nucs.length);\n var radius = linkLength / (2 * Math.tan(angle));\n\n var fakeNodeUid = '';\n\n for (let i = 0; i < nucs.length; i++)\n fakeNodeUid += self.nodes[nucs[i]-1].uid;\n\n var newNode = {'name': '',\n 'num': -1,\n //'radius': 18 * radius -6,\n 'radius': radius,\n 'rna': self,\n 'nodeType': 'middle',\n 'elemType': 'f',\n 'nucs': nucs,\n 'uid': fakeNodeUid };\n self.nodes.push(newNode);\n\n var newX = 0;\n var newY = 0;\n var coordsCounted = 0;\n\n angle = (nucs.length - 2) * 3.14159 / (2 * nucs.length);\n radius = 0.5 / Math.cos(angle);\n\n for (let j = 0; j < nucs.length; j++) {\n if (nucs[j] === 0 || nucs[j] > self.dotbracket.length)\n continue;\n\n //link to the center node\n self.links.push({'source': self.nodes[nucs[j] - 1],\n 'target': self.nodes[self.nodes.length-1],\n 'linkType': 'fake',\n 'value': radius,\n 'uid': slugid.nice() });\n\n if (nucs.length > 4) {\n //link across the loop\n self.links.push({'source': self.nodes[nucs[j] - 1],\n 'target': self.nodes[nucs[(j + Math.floor(nucs.length / 2)) % nucs.length] - 1],\n 'linkType': 'fake',\n 'value': radius * 2,\n 'uid': slugid.nice() });\n }\n\n var ia = ((nucs.length - 2) * 3.14159) / nucs.length;\n var c = 2 * Math.cos(3.14159 / 2 - ia / 2);\n //link to over-neighbor\n self.links.push({'source': self.nodes[nucs[j] - 1],\n 'target': self.nodes[nucs[(j + 2) % nucs.length] - 1],\n 'linkType': 'fake',\n 'value': c});\n\n // calculate the mean of the coordinats in this loop\n // and place the fake node there\n var fromNode = self.nodes[nucs[j]-1];\n if ('x' in fromNode) {\n newX += fromNode.x;\n newY += fromNode.y;\n\n coordsCounted += 1;\n }\n }\n\n if (coordsCounted > 0) {\n // the nucleotides had set positions so we can calculate the position\n // of the fake node\n newNode.x = newX / coordsCounted;\n newNode.y = newY / coordsCounted;\n newNode.px = newNode.x;\n newNode.py = newNode.y;\n }\n\n return self;\n };\n\n self.connectFakeNodes = function() {\n var linkLength = 18;\n\n // We want to be able to connect all of the fake nodes\n // and create a structure consisting of just them\n var filterOutNonFakeNodes = function(d) {\n return d.nodeType == 'middle';\n }\n\n var nucsToNodes = {};\n var fakeNodes = self.nodes.filter(filterOutNonFakeNodes);\n var linked = {};\n\n // initialize the nucleotides to nodes\n for (var i = 1; i <= self.nodes.length; i++)\n nucsToNodes[i] = [];\n\n for (var i = 0; i < fakeNodes.length; i++) {\n var thisNode = fakeNodes[i];\n\n // each fake node represents a certain set of nucleotides (thisNode.nucs)\n for (var j = 0; j < thisNode.nucs.length; j++) {\n var thisNuc = thisNode.nucs[j];\n\n // check to see if this nucleotide has been seen in another fake node\n // if it has, then we add a link between the two nodes\n for (var k = 0; k < nucsToNodes[thisNuc].length; k++) {\n if (JSON.stringify([nucsToNodes[thisNuc][k].uid, thisNode.uid].sort()) in linked)\n continue; //already linked\n\n var distance = nucsToNodes[thisNuc][k].radius + thisNode.radius;\n\n self.links.push({'source': nucsToNodes[thisNuc][k],\n 'target': thisNode,\n 'value': distance / linkLength,\n 'linkType': 'fake_fake'});\n\n // note that we've already seen this link\n linked[JSON.stringify([nucsToNodes[thisNuc][k].uid, thisNode.uid].sort())] = true;\n }\n\n nucsToNodes[thisNuc].push(thisNode);\n }\n }\n\n return self;\n\n };\n\n self.addExtraLinks = function(extraLinks) {\n if (typeof extraLinks == 'undefined')\n return self;\n\n for (var i = 0; i < extraLinks.length; i++) {\n var source = self.getNodeFromNucleotides(extraLinks[i].from);\n var target = self.getNodeFromNucleotides(extraLinks[i].to);\n\n var newLink = {'source': source, 'target': target, 'linkType': 'extra',\n 'extraLinkType': extraLinks[i].linkType, 'uid': slugid.nice() };\n\n self.links.push(newLink);\n }\n\n return self;\n }\n\n\n self.elementsToJson = function() {\n /* Convert a set of secondary structure elements to a json\n * representation of the graph that can be used with d3's\n * force-directed layout to generate a visualization of\n * the structure.\n */\n var pt = self.pairtable;\n var elements = self.elements;\n\n self.nodes = [];\n self.links = [];\n\n //create a reverse lookup so we can find out the type\n //of element that a node is part of\n var elemTypes = {};\n\n //sort so that we count stems last\n self.elements.sort();\n\n for (let i = 0; i < self.elements.length; i++) {\n var nucs = self.elements[i][2];\n for (let j = 0; j < nucs.length; j++) {\n elemTypes[nucs[j]] = self.elements[i][0];\n }\n }\n\n for (let i = 1; i <= pt[0]; i++) {\n var nodeName = self.seq[i-1];\n\n // // remove only the breaks that are in the sequence\n // if (self.dotBracketBreaks.indexOf(i-1) >= 0) {\n // nodeName = '';\n // }\n\n //create a node for each nucleotide\n self.nodes.push({'name': nodeName,\n 'num': startNumber + i - 1,\n 'radius': 5,\n 'rna': self,\n 'nodeType': 'nucleotide',\n 'structName': self.structName,\n 'elemType': elemTypes[i],\n 'uid': slugid.nice(),\n 'linked': false});\n }\n\n for (let i = 0; i < self.nodes.length; i++) {\n if (i === 0)\n self.nodes[i].prevNode = null;\n else {\n self.nodes[i].prevNode = self.nodes[i-1];\n }\n\n if (i == self.nodes.length-1)\n self.nodes[i].nextNode = null;\n else {\n self.nodes[i].nextNode = self.nodes[i+1];\n }\n }\n\n for (let i = 1; i <= pt[0]; i++) {\n\n if (pt[i] !== 0) {\n // base-pair links\n self.links.push({'source': self.nodes[i-1],\n 'target': self.nodes[pt[i]-1],\n 'linkType': 'basepair',\n 'value': 1,\n 'uid': slugid.nice() });\n }\n\n if (i > 1) {\n // backbone links\n // unlink only the break and the nucleotide before it\n // if (self.dotBracketBreaks.indexOf(i-1) === -1 &&\n // self.dotBracketBreaks.indexOf(i-2) == -1) {\n // there is no break in the strands here\n // we can add a backbone link\n self.links.push({'source': self.nodes[i-2],\n 'target': self.nodes[i-1],\n 'linkType': 'backbone',\n 'value': 1,\n 'uid': slugid.nice() });\n self.nodes[i-1].linked = true;\n // }\n }\n }\n\n //add the pseudoknot links\n for (let i = 0; i < self.pseudoknotPairs.length; i++) {\n self.links.push({'source': self.nodes[self.pseudoknotPairs[i][0]-1],\n 'target': self.nodes[self.pseudoknotPairs[i][1]-1],\n 'linkType': 'pseudoknot',\n 'value': 1,\n 'uid': slugid.nice()});\n }\n\n if (self.circular) {\n self.links.push({'source': self.nodes[0],\n 'target': self.nodes[self.rnaLength-1],\n 'linkType': 'backbone',\n 'value': 1,\n 'uid': slugid.nice() });\n\n }\n\n return self;\n };\n\n self.ptToElements = function(pt, level, i, j) {\n /* Convert a pair table to a list of secondary structure\n * elements:\n *\n * [['s',1,[2,3]]\n *\n * The 's' indicates that an element can be a stem. It can also be\n * an interior loop ('i'), a hairpin loop ('h') or a multiloop ('m')\n *\n * The second number (1 in this case) indicates the depth or\n * how many base pairs have to be broken to get to this element.\n *\n * Finally, there is the list of nucleotides which are part of\n * of this element.\n */\n var elements = [];\n var u5 = [i-1];\n var u3 = [j+1];\n\n if (i > j)\n return [];\n\n //iterate over the unpaired regions on either side\n //this is either 5' and 3' unpaired if level == 0\n //or an interior loop or a multiloop\n for (; pt[i] === 0; i++) { u5.push(i); }\n for (; pt[j] === 0; j--) { u3.push(j); }\n\n if (i > j) {\n //hairpin loop or one large unpaired molecule\n u5.push(i);\n // if (level === 0)\n return [['e',level, u5.sort(numberSort)]];\n // else {\n // // check to see if we have chain breaks due\n // // to multiple strands in the input\n // var external = false;\n // var left = [];\n // var right = [];\n // for (var k = 0; k < u5.length; k++) {\n // if (external)\n // right.push(u5[k]);\n // else\n // left.push(u5[k]);\n\n // if (self.dotBracketBreaks.indexOf(u5[k]) >= 0)\n // external = true;\n // }\n\n // if (external) {\n // return [['h',level, u5.sort(numberSort)]];\n // }\n // else\n // // if not, this is a simple hairpin loop\n // return [['h',level, u5.sort(numberSort)]];\n // }\n }\n\n if (pt[i] != j) {\n //multiloop\n var m = u5;\n var k = i;\n\n // the nucleotide before and the starting nucleotide\n m.push(k);\n while (k <= j) {\n // recurse into a stem\n elements = elements.concat(self.ptToElements(pt, level, k, pt[k]));\n\n // add the nucleotides between stems\n m.push(pt[k]);\n k = pt[k] + 1;\n for (; pt[k] === 0 && k <= j; k++) { m.push(k);}\n m.push(k);\n }\n m.pop();\n m = m.concat(u3);\n\n if (m.length > 0) {\n if (level === 0)\n elements.push(['e', level, m.sort(numberSort)]);\n else\n elements.push(['m', level, m.sort(numberSort)]);\n }\n\n return elements;\n }\n\n if (pt[i] === j) {\n //interior loop\n u5.push(i);\n u3.push(j);\n\n var combined = u5.concat(u3);\n if (combined.length > 4) {\n if (level === 0)\n elements.push(['e',level, u5.concat(u3).sort(numberSort)]);\n else\n elements.push(['i',level, u5.concat(u3).sort(numberSort)]);\n }\n }\n\n var s = [];\n //go through the stem\n while (pt[i] === j && i < j) {\n //one stem\n s.push(i);\n s.push(j);\n\n i += 1;\n j -= 1;\n\n level += 1;\n }\n\n u5 = [i-1];\n u3 = [j+1];\n elements.push(['s', level, s.sort(numberSort)]);\n\n return elements.concat(self.ptToElements(pt, level, i, j));\n };\n\n self.addLabels = function(startNumber = 1, labelInterval = 10) {\n if (labelInterval === 0)\n return self;\n\n for (let i = 1; i <= self.rnaLength; i++) {\n // add labels\n if (i % labelInterval === 0) {\n //create a node for each label\n let newX, newY;\n\n let thisNode = self.nodes[i-1];\n let prevNode, nextNode;\n let prevVec, nextVec;\n\n if (self.rnaLength == 1) {\n nextVec = [thisNode.x - 15, thisNode.y];\n prevVec = [thisNode.x - 15, thisNode.y];\n } else {\n // if we're labelling the first node, then label it in relation to the last\n if (i == 1)\n prevNode = self.nodes[self.rnaLength - 1];\n else\n prevNode = self.nodes[i - 2];\n\n // if we're labelling the last node, then label it in relation to the first\n if (i == self.rnaLength)\n nextNode = self.nodes[0];\n else\n nextNode = self.nodes[i];\n\n // this nucleotide and its neighbors are paired\n if (self.pairtable[nextNode.num - startNumber+1] !== 0 &&\n self.pairtable[prevNode.num - startNumber+1] !== 0 &&\n self.pairtable[thisNode.num - startNumber+1] !== 0) {\n\n prevNode = nextNode = self.nodes[self.pairtable[thisNode.num - startNumber+1]-1];\n }\n\n // this node is paired but at least one of its neighbors is unpaired\n // place the label in the direction of the two neighbors\n if (self.pairtable[thisNode.num - startNumber+1] !== 0 && (\n self.pairtable[nextNode.num - startNumber+1] === 0 ||\n self.pairtable[prevNode.num - startNumber+1] === 0)) {\n nextVec = [thisNode.x - nextNode.x, thisNode.y - nextNode.y];\n prevVec = [thisNode.x - prevNode.x, thisNode.y - prevNode.y];\n\n } else {\n nextVec = [nextNode.x - thisNode.x, nextNode.y - thisNode.y];\n prevVec = [prevNode.x - thisNode.x, prevNode.y - thisNode.y];\n }\n }\n\n var combinedVec = [nextVec[0] + prevVec[0], nextVec[1] + prevVec[1]];\n var vecLength = Math.sqrt(combinedVec[0] * combinedVec[0] + combinedVec[1] * combinedVec[1]);\n var normedVec = [combinedVec[0] / vecLength, combinedVec[1] / vecLength];\n var offsetVec = [-15 * normedVec[0], -15 * normedVec[1]];\n\n newX = self.nodes[i-1].x + offsetVec[0];\n newY = self.nodes[i-1].y + offsetVec[1];\n\n var newNode = {'name': i + startNumber -1,\n 'num': -1,\n 'radius': 6,\n 'rna': self,\n 'nodeType': 'label',\n 'structName': self.structName,\n 'elemType': 'l',\n 'x': newX,\n 'y': newY,\n 'px': newX,\n 'py': newY,\n 'uid': slugid.nice() };\n var newLink = {'source': self.nodes[i-1],\n 'target': newNode,\n 'value': 1,\n 'linkType': 'label_link',\n 'uid': slugid.nice() };\n\n self.nodes.push(newNode);\n self.links.push(newLink);\n }\n }\n\n return self;\n };\n\n self.recalculateElements = function() {\n self.removePseudoknots();\n self.elements = self.ptToElements(self.pairtable, 0, 1, self.dotbracket.length);\n\n if (self.circular) {\n //check to see if the external loop is a hairpin or a multiloop\n let externalLoop = self.elements.filter(function(d) { if (d[0] == 'e') return true; });\n\n if (externalLoop.length > 0) {\n eloop = externalLoop[0];\n nucs = eloop[2].sort(numberSort);\n\n prev = nucs[0];\n hloop = true;\n numGreater = 0;\n for (let i = 1; i < nucs.length; i++) {\n if (nucs[i] - prev > 1) {\n numGreater += 1;\n }\n prev = nucs[i];\n }\n\n if (numGreater == 1) {\n eloop[0] = 'h';\n } else if (numGreater == 2) {\n eloop[0] = 'i';\n } else {\n eloop[0] = 'm';\n }\n }\n }\n\n return self;\n };\n\n self.reassignLinkUids = function() {\n // reassign uids to the links, corresponding to the uids of the two nodes\n // they connect\n var i;\n\n for (var i = 0; i < self.links.length; i++) {\n self.links[i].uid = self.links[i].source.uid + self.links[i].target.uid;\n }\n\n return self;\n }\n\n self.removePseudoknots = function() {\n if (self.pairtable.length > 1)\n self.pseudoknotPairs = self.pseudoknotPairs.concat(rnaUtilities.removePseudoknotsFromPairtable(self.pairtable));\n\n return self;\n };\n\n self.addPseudoknots = function() {\n /* Add all of the pseudoknot pairs which are stored outside\n * of the pairtable back to the pairtable\n */\n var pt = self.pairtable;\n var pseudoknotPairs = self.pseudoknotPairs;\n\n for (var i = 0; i < pseudoknotPairs.length; i++) {\n pt[pseudoknotPairs[i][0]] = pseudoknotPairs[i][1];\n pt[pseudoknotPairs[i][1]] = pseudoknotPairs[i][0];\n }\n\n self.pseudoknotPairs = [];\n return self;\n };\n\n self.addName = function(name) {\n if (typeof name == 'undefined') {\n self.name = '';\n return self;\n } else {\n self.name = name;\n return self;\n }\n };\n\n\n if (self.rnaLength > 0)\n self.recalculateElements();\n\n self.getNodeFromNucleotides = function(nucs) {\n /* Get a node given a nucleotide number or an array of nucleotide\n * numbers indicating an element node */\n if (Object.prototype.toString.call(nucs) === '[object Array]') {\n for (let j = 0; j < self.nodes.length; j++) {\n if ('nucs' in self.nodes[j]) {\n if (self.nodes[j].nucs.equals(nucs)) {\n return self.nodes[j];\n }\n }\n }\n } else {\n for (let j = 0; j < self.nodes.length; j++) {\n if (self.nodes[j].num == nucs) {\n return self.nodes[j];\n }\n }\n }\n\n console.log('ERROR: No node found for nucs:', nucs);\n return null;\n }\n}\n\nexport function moleculesToJson(moleculesJson) {\n /* Convert a list of RNA and protein molecules to a list of RNAGraph\n * ProteinGraph and extraLinks structure */\n\n var nodes = {}; //index the nodes by uid\n var graphs = [];\n var extraLinks = [];\n\n\n // Create the graphs for each molecule\n for (var i = 0; i < moleculesJson.molecules.length; i++) {\n var molecule = moleculesJson.molecules[i];\n var rg;\n\n if (molecule.type == 'rna') {\n rg = new RNAGraph(molecule.seq, molecule.ss, molecule.header);\n rg.circularizeExternal = true;\n rg.elementsToJson()\n .addPositions('nucleotide', molecule.positions)\n .addLabels()\n .reinforceStems()\n .reinforceLoops();\n\n\n } else if (molecule.type == 'protein') {\n rg = new ProteinGraph(molecule.header, molecule.size);\n\n }\n\n rg.addUids(molecule.uids);\n\n for (var j = 0; j < rg.nodes.length; j++) {\n nodes[rg.nodes[j].uid] = rg.nodes[j];\n }\n\n graphs.push(rg);\n }\n\n //Add the extra links\n for (var i = 0; i < moleculesJson.extraLinks.length; i++) {\n link = moleculesJson.extraLinks[i];\n\n link.source = nodes[link.source];\n link.target = nodes[link.target];\n link.uid = slugid.nice();\n\n extraLinks.push(link);\n }\n\n return {'graphs': graphs, 'extraLinks': extraLinks};\n};\n","export function simpleXyCoordinates (pair_table) {\n var INIT_ANGLE=0.; /* initial bending angle */\n var INIT_X = 100.; /* coordinate of first digit */\n var INIT_Y = 100.; /* see above */\n var RADIUS = 15.;\n\n var x = [], y = [];\n\n var i, len;\n var alpha;\n\n len = pair_table[0];\n var angle = Array.apply(null, new Array(len+5)).map(Number.prototype.valueOf,0); \n var loop_size = Array.apply(null, new Array(16+Math.floor(len/5)))\n .map(Number.prototype.valueOf, 0); \n var stack_size = Array.apply(null, new Array(16+Math.floor(len/5)))\n .map(Number.prototype.valueOf, 0); \n\n var lp = 0;\n var stk = 0;\n var PIHALF = Math.PI / 2;\n\n\n var loop = function(i, j, pair_table)\n /* i, j are the positions AFTER the last pair of a stack; i.e\n i-1 and j+1 are paired. */\n {\n var count = 2; /* counts the VERTICES of a loop polygon; that's\n NOT necessarily the number of unpaired bases!\n Upon entry the loop has already 2 vertices, namely\n the pair i-1/j+1. */\n\n var r = 0, bubble = 0; /* bubble counts the unpaired digits in loops */\n\n var i_old, partner, k, l, start_k, start_l, fill, ladder;\n var begin, v, diff;\n var polygon;\n\n var remember = Array.apply(null, new Array((3+Math.floor((j-i)/5)*2))).map(Number.prototype.valueOf, 0);\n\n i_old = i-1, j++; /* j has now been set to the partner of the\n previous pair for correct while-loop\n termination. */\n while (i != j) {\n partner = pair_table[i];\n if ((!partner) || (i==0))\n i++, count++, bubble++;\n else {\n count += 2;\n k = i, l = partner; /* beginning of stack */\n remember[++r] = k;\n remember[++r] = l;\n i = partner+1; /* next i for the current loop */\n\n start_k = k, start_l = l;\n ladder = 0;\n do {\n k++, l--, ladder++; /* go along the stack region */\n }\n while ((pair_table[k] == l) && (pair_table[k] > k));\n\n fill = ladder-2;\n if (ladder >= 2) {\n angle[start_k+1+fill] += PIHALF; /* Loop entries and */\n angle[start_l-1-fill] += PIHALF; /* exits get an */\n angle[start_k] += PIHALF; /* additional PI/2. */\n angle[start_l] += PIHALF; /* Why ? (exercise) */\n if (ladder > 2) {\n for (; fill >= 1; fill--) {\n angle[start_k+fill] = Math.PI; /* fill in the angles */\n angle[start_l-fill] = Math.PI; /* for the backbone */\n }\n }\n }\n stack_size[++stk] = ladder;\n if (k <= l)\n loop(k, l, pair_table);\n }\n }\n\n polygon = Math.PI*(count-2)/count; /* bending angle in loop polygon */\n remember[++r] = j;\n begin = i_old < 0 ? 0 : i_old;\n for (v = 1; v <= r; v++) {\n diff = remember[v]-begin;\n for (fill = 0; fill <= diff; fill++)\n angle[begin+fill] += polygon;\n if (v > r)\n break;\n begin = remember[++v];\n }\n loop_size[++lp] = bubble;\n }\n\n loop(0, len+1, pair_table);\n loop_size[lp] -= 2; /* correct for cheating with function loop */\n\n alpha = INIT_ANGLE;\n x[0] = INIT_X;\n y[0] = INIT_Y;\n\n var poss = [];\n\n poss.push([x[0], y[0]]);\n for (i = 1; i < len; i++) {\n x[i] = x[i-1]+RADIUS*Math.cos(alpha);\n y[i] = y[i-1]+RADIUS*Math.sin(alpha);\n\n poss.push([x[i], y[i]]);\n alpha += Math.PI-angle[i+1];\n }\n\n return poss;\n}\n","export function Radloop() {\n\tthis.radius = null;\n\tthis.loopnumber = null;\n\tthis.next = null;\n this.prev = null;\n}\n\nRadloop.prototype.getRadius = function(){\n\treturn this.radius;\n}\n\nRadloop.prototype.setRadius = function(radius){\n\tthis.radius = radius;\n}\n\nRadloop.prototype.getLoopnumber = function(){\n\treturn this.loopnumber;\n}\n\nRadloop.prototype.setLoopnumber = function(loopnumber){\n\tthis.loopnumber = loopnumber;\n}\n\nRadloop.prototype.getNext = function(){\n\treturn this.next;\n}\n\nRadloop.prototype.setNext = function(next){\n\tthis.next = next;\n}\n\nRadloop.prototype.getPrev = function(){\n\treturn this.prev;\n}\n\nRadloop.prototype.setPrev = function(prev){\n\tthis.prev = prev;\n}\n","import {Region} from './region.js';\n\nexport function Base() {\n\tthis.mate = null;\n\tthis.x = null;\n this.y = null;\n\tthis.extracted = null;\n\tthis.region = new Region();\n}\n\nBase.prototype.getMate = function(){\n\treturn this.mate;\n}\n\nBase.prototype.setMate = function(mate){\n\tthis.mate = mate;\n}\n\nBase.prototype.getX = function(){\n\treturn this.x;\n}\n\nBase.prototype.setX = function(x){\n\tthis.x = x;\n}\n\nBase.prototype.getY = function(){\n\treturn this.y;\n}\n\nBase.prototype.setY = function(y){\n\tthis.y = y;\n}\n\nBase.prototype.isExtracted = function(){\n\treturn this.extracted;\n}\n\nBase.prototype.setExtracted = function(extracted){\n\tthis.extracted = extracted;\n}\n\nBase.prototype.getRegion = function(){\n\treturn this.region;\n}\n\nBase.prototype.setRegion = function(region){\n\tthis.region = region;\n}\n","import {Radloop} from './radloop.js';\nimport {Connection} from './connection.js';\nimport {Region} from './region.js';\nimport {Base} from './base.js';\nimport {Loop} from './loop.js';\n\nexport function NAView(){\n this.ANUM = 9999.0;\n\tthis.MAXITER = 500;\n\n\tthis.bases = [];\n\tthis.nbase = null;\n this.nregion = null;\n this.loop_count = null;\n\n\tthis.root = new Loop();\n\tthis.loops = [];\n\n\tthis.regions = [];\n\n\tthis.rlphead = new Radloop();\n\n\tthis.lencut = 0.8;\n\tthis.RADIUS_REDUCTION_FACTOR = 1.4;\n\n\t// show algorithm step by step\n\tthis.angleinc = null;\n\n\tthis._h = null;\n\n\t// private boolean noIterationFailureYet = true;\n\n\tthis.HELIX_FACTOR = 0.6;\n\tthis.BACKBONE_DISTANCE = 27;\n}\n\nNAView.prototype.naview_xy_coordinates = function(pair_table){\n var x = [];\n\tvar y = [];\n if (pair_table.length === 0 || pair_table[0] === 0){\n return 0;\n }\n var i;\n this.nbase = pair_table[0];\n this.bases = [];\n for (var index = 0; index < this.nbase + 1; index++){\n this.bases.push(new Base());\n }\n this.regions = [];\n for (var index = 0; index < this.nbase + 1; index++){\n this.regions.push(new Region());\n }\n this.read_in_bases(pair_table);\n this.rlphead = null;\n this.find_regions();\n this.loop_count = 0;\n this.loops = [];\n for (var index = 0; index < this.nbase + 1; index++){\n this.loops.push(new Loop());\n }\n this.construct_loop(0);\n this.find_central_loop();\n this.traverse_loop(this.root, null);\n\n for (i = 0; i < this.nbase; i++){\n x.push(100 + this.BACKBONE_DISTANCE * this.bases[i + 1].getX());\n y.push(100 + this.BACKBONE_DISTANCE * this.bases[i + 1].getY());\n }\n\n return {\n nbase: this.nbase,\n x: x,\n y: y\n }\n}\n\nNAView.prototype.read_in_bases = function read_in_bases(pair_table){\n var i = null;\n var npairs = null;\n\n // Set up an origin.\n this.bases.push(new Base());\n this.bases[0].setMate(0);\n this.bases[0].setExtracted(false);\n this.bases[0].setX(this.ANUM);\n this.bases[0].setY(this.ANUM);\n\n for (npairs = 0, i = 1; i <= this.nbase; i++){\n this.bases.push(new Base());\n this.bases[i].setExtracted(false);\n this.bases[i].setX(this.ANUM);\n this.bases[i].setY(this.ANUM);\n this.bases[i].setMate(pair_table[i]);\n if (pair_table[i] > i)\n npairs++;\n }\n // must have at least 1 pair to avoid segfault\n if (npairs == 0){\n this.bases[1].setMate(this.nbase);\n this.bases[this.nbase].setMate(1);\n }\n}\n\nNAView.prototype.find_regions = function find_regions(){\n var i = null;\n var mate = null;\n var nb1 = null;\n\n nb1 = this.nbase + 1;\n var mark = [];\n for (i = 0; i < nb1; i++){\n mark.push(false);\n }\n this.nregion = 0;\n for (i = 0; i <= this.nbase; i++) {\n if ((mate = this.bases[i].getMate()) != 0 && !mark[i]) {\n this.regions[this.nregion].setStart1(i);\n this.regions[this.nregion].setEnd2(mate);\n mark[i] = true;\n mark[mate] = true;\n this.bases[i].setRegion(this.regions[this.nregion]);\n this.bases[mate].setRegion(this.regions[this.nregion]);\n for (i++, mate--; i < mate && this.bases[i].getMate() == mate; i++, mate--) {\n mark[mate] = true;\n mark[i]= true;\n this.bases[i].setRegion(this.regions[this.nregion]);\n this.bases[mate].setRegion(this.regions[this.nregion]);\n }\n this.regions[this.nregion].setEnd1(--i);\n this.regions[this.nregion].setStart2(mate + 1);\n\n this.nregion++;\n }\n }\n}\n\nNAView.prototype.construct_loop = function construct_loop(ibase){\n var i = null;\n var mate = null;\n var retloop = new Loop();\n var lp = new Loop();\n var cp = new Connection();\n var rp = new Region();\n var rlp = new Radloop();\n retloop = this.loops[this.loop_count++];\n retloop.setNconnection(0);\n retloop.setDepth(0);\n retloop.setNumber(this.loop_count);\n retloop.setRadius(0.0);\n\n for (rlp = this.rlphead; rlp != null; rlp = rlp.getNext())\n if (rlp.getLoopnumber() == this.loop_count)\n retloop.setRadius(rlp.getRadius());\n i = ibase;\n do {\n if ((mate = this.bases[i].getMate()) != 0) {\n rp = this.bases[i].getRegion();\n if (!this.bases[rp.getStart1()].isExtracted()) {\n if (i == rp.getStart1()) {\n this.bases[rp.getStart1()].setExtracted(true);\n this.bases[rp.getEnd1()].setExtracted(true);\n this.bases[rp.getStart2()].setExtracted(true);\n this.bases[rp.getEnd2()].setExtracted(true);\n lp = this.construct_loop(rp.getEnd1() < this.nbase ? rp.getEnd1() + 1\n : 0);\n } else if (i == rp.getStart2()) {\n this.bases[rp.getStart2()].setExtracted(true);\n this.bases[rp.getEnd2()].setExtracted(true);\n this.bases[rp.getStart1()].setExtracted(true);\n this.bases[rp.getEnd1()].setExtracted(true);\n lp = this.construct_loop(rp.getEnd2() < this.nbase ? rp.getEnd2() + 1\n : 0);\n } else {\n console.log(\"Something went terribly wrong ....\");\n }\n retloop.setNconnection(retloop.getNconnection() + 1);\n cp = new Connection();\n retloop.setConnection(retloop.getNconnection() - 1,\tcp);\n retloop.setConnection(retloop.getNconnection(), null);\n cp.setLoop(lp);\n cp.setRegion(rp);\n if(i == rp.getStart1()) {\n cp.setStart(rp.getStart1());\n cp.setEnd(rp.getEnd2());\n } else {\n cp.setStart(rp.getStart2());\n cp.setEnd(rp.getEnd1());\n }\n cp.setExtruded(false);\n cp.setBroken(false);\n lp.setNconnection(lp.getNconnection() + 1);\n cp = new Connection();\n lp.setConnection(lp.getNconnection() - 1, cp);\n lp.setConnection(lp.getNconnection(), null);\n cp.setLoop(retloop);\n cp.setRegion(rp);\n if (i == rp.getStart1()) {\n cp.setStart(rp.getStart2());\n cp.setEnd(rp.getEnd1());\n } else {\n cp.setStart(rp.getStart1());\n cp.setEnd(rp.getEnd2());\n }\n cp.setExtruded(false);\n cp.setBroken(false);\n }\n i = mate;\n }\n if (++i > this.nbase)\n i = 0;\n } while (i != ibase);\n return retloop;\n}\n\nNAView.prototype.find_central_loop = function find_central_loop(){\n var lp = new Loop();\n var maxconn = null;\n var maxdepth = null;\n var i = null;\n\n determine_depths.bind(this)();\n maxconn = 0;\n maxdepth = -1;\n for (i = 0; i < this.loop_count; i++) {\n lp = this.loops[i];\n if (lp.getNconnection() > maxconn) {\n maxdepth = lp.getDepth();\n maxconn = lp.getNconnection();\n this.root = lp;\n } else if (lp.getDepth() > maxdepth\n && lp.getNconnection() == maxconn) {\n maxdepth = lp.getDepth();\n this.root = lp;\n }\n }\n}\n\nfunction determine_depths() {\n var lp = new Loop();\n var i = null;\n var j = null;\n\n for (i = 0; i < this.loop_count; i++) {\n lp = this.loops[i];\n for (j = 0; j < this.loop_count; j++){\n this.loops[j].setMark(false);\n }\n lp.setDepth(depth(lp));\n }\n}\n\nfunction depth(lp){\n var count = null;\n var ret = null;\n var d = null;\n\n if (lp.getNconnection() <= 1){\n return 0;\n }\n if (lp.isMark()){\n return -1;\n }\n lp.setMark(true);\n count = 0;\n ret = 0;\n for (var i = 0; lp.getConnection(i) != null; i++) {\n d = depth(lp.getConnection(i).getLoop());\n if (d >= 0) {\n if (++count == 1){\n ret = d;\n }\n else if (ret > d){\n ret = d;\n }\n }\n }\n lp.setMark(false);\n return ret + 1;\n}\n\nNAView.prototype.traverse_loop = function traverse_loop(lp, anchor_connection){\n var xs, ys, xe, ye, xn, yn, angleinc, r;\n var radius, xc, yc, xo, yo, astart, aend, a;\n var cp, cpnext, acp, cpprev;\n var i, j, n, ic;\n var da, maxang;\n var count, icstart, icend, icmiddle, icroot;\n var done, done_all_connections, rooted;\n var sign;\n var midx, midy, nrx, nry, mx, my, vx, vy, dotmv, nmidx, nmidy;\n var icstart1, icup, icdown, icnext, direction;\n var dan, dx, dy, rr;\n var cpx, cpy, cpnextx, cpnexty, cnx, cny, rcn, rc, lnx, lny, rl, ac, acn, sx, sy, dcp;\n var imaxloop = 0;\n\n angleinc = 2 * Math.PI / (this.nbase + 1);\n acp = null;\n icroot = -1;\n var indice = 0;\n\n for (ic = 0; (cp = lp.getConnection(indice)) != null; indice++, ic++) {\n xs = -Math.sin(angleinc * cp.getStart());\n ys = Math.cos(angleinc * cp.getStart());\n xe = -Math.sin(angleinc * cp.getEnd());\n ye = Math.cos(angleinc * cp.getEnd());\n xn = ye - ys;\n yn = xs - xe;\n r = Math.sqrt(xn * xn + yn * yn);\n cp.setXrad(xn / r);\n cp.setYrad(yn / r);\n cp.setAngle(Math.atan2(yn, xn));\n if (cp.getAngle() < 0.0){\n cp.setAngle(cp.getAngle() + 2 * Math.PI);\n }\n if (anchor_connection != null\n && anchor_connection.getRegion() == cp.getRegion()) {\n acp = cp;\n icroot = ic;\n }\n }\n set_radius: while (true) {\n this.determine_radius(lp, this.lencut);\n radius = lp.getRadius()/this.RADIUS_REDUCTION_FACTOR;\n if (anchor_connection == null){\n xc = yc = 0.0;\n }\n else {\n xo = (this.bases[acp.getStart()].getX() + this.bases\n [acp.getEnd()].getX()) / 2.0;\n yo = (this.bases[acp.getStart()].getY() + this.bases\n [acp.getEnd()].getY()) / 2.0;\n xc = xo - radius * acp.getXrad();\n yc = yo - radius * acp.getYrad();\n }\n\n // The construction of the connectors will proceed in blocks of\n // connected connectors, where a connected connector pairs means two\n // connectors that are forced out of the drawn circle because they\n // are too close together in angle.\n\n // First, find the start of a block of connected connectors\n\n if (icroot == -1){\n icstart = 0;\n }\n else {\n icstart = icroot;\n }\n cp = lp.getConnection(icstart);\n count = 0;\n done = false;\n do {\n j = icstart - 1;\n if (j < 0){\n j = lp.getNconnection() - 1;\n }\n cpprev = lp.getConnection(j);\n if (!this.connected_connection(cpprev, cp)) {\n done = true;\n }\n else {\n icstart = j;\n cp = cpprev;\n }\n if (++count > lp.getNconnection()) {\n // Here everything is connected. Break on maximum angular\n // separation between connections.\n maxang = -1.0;\n for (ic = 0; ic < lp.getNconnection(); ic++) {\n j = ic + 1;\n if (j >= lp.getNconnection()){\n j = 0;\n }\n cp = lp.getConnection(ic);\n cpnext = lp.getConnection(j);\n ac = cpnext.getAngle() - cp.getAngle();\n if (ac < 0.0){\n ac += 2 * Math.PI;\n }\n if (ac > maxang) {\n maxang = ac;\n imaxloop = ic;\n }\n }\n icend = imaxloop;\n icstart = imaxloop + 1;\n if (icstart >= lp.getNconnection()){\n icstart = 0;\n }\n cp = lp.getConnection(icend);\n cp.setBroken(true);\n done = true;\n }\n } while (!done);\n done_all_connections = false;\n icstart1 = icstart;\n while (!done_all_connections) {\n count = 0;\n done = false;\n icend = icstart;\n rooted = false;\n while (!done) {\n cp = lp.getConnection(icend);\n if (icend == icroot){\n rooted = true;\n }\n j = icend + 1;\n if (j >= lp.getNconnection()) {\n j = 0;\n }\n cpnext = lp.getConnection(j);\n if (this.connected_connection(cp, cpnext)) {\n if (++count >= lp.getNconnection()){\n break;\n }\n icend = j;\n }\n else {\n done = true;\n }\n }\n icmiddle = this.find_ic_middle(icstart, icend, anchor_connection,\n acp, lp);\n ic = icup = icdown = icmiddle;\n done = false;\n direction = 0;\n while (!done) {\n if (direction < 0) {\n ic = icup;\n }\n else if (direction == 0) {\n ic = icmiddle;\n }\n else {\n ic = icdown;\n }\n if (ic >= 0) {\n cp = lp.getConnection(ic);\n if (anchor_connection == null || acp != cp) {\n if (direction == 0) {\n astart = cp.getAngle()\n - Math.asin(1.0 / 2.0 / radius);\n aend = cp.getAngle()\n + Math.asin(1.0 / 2.0 / radius);\n this.bases[cp.getStart()].setX(\n xc + radius * Math.cos(astart));\n this.bases[cp.getStart()].setY(\n yc + radius * Math.sin(astart));\n this.bases[cp.getEnd()].setX(\n xc + radius * Math.cos(aend));\n this.bases[cp.getEnd()].setY(\n yc + radius * Math.sin(aend));\n }\n else if (direction < 0) {\n j = ic + 1;\n if (j >= lp.getNconnection()){\n j = 0;\n }\n cp = lp.getConnection(ic);\n cpnext = lp.getConnection(j);\n cpx = cp.getXrad();\n cpy = cp.getYrad();\n ac = (cp.getAngle() + cpnext.getAngle()) / 2.0;\n if (cp.getAngle() > cpnext.getAngle()){\n ac -= Math.PI;\n }\n cnx = Math.cos(ac);\n cny = Math.sin(ac);\n lnx = cny;\n lny = -cnx;\n da = cpnext.getAngle() - cp.getAngle();\n if (da < 0.0){\n da += 2 * Math.PI;\n }\n if (cp.isExtruded()) {\n if (da <= Math.PI / 2){\n rl = 2.0;\n }\n else {\n rl = 1.5;\n }\n }\n else {\n rl = 1.0;\n }\n this.bases[cp.getEnd()].setX(\n this.bases[cpnext.getStart()].getX()\n + rl * lnx);\n this.bases[cp.getEnd()].setY(\n this.bases[cpnext.getStart()].getY()\n + rl * lny);\n this.bases[cp.getStart()].setX(\n this.bases[cp.getEnd()].getX() + cpy);\n this.bases[cp.getStart()].setY(\n this.bases[cp.getEnd()].getY() - cpx);\n } else {\n j = ic - 1;\n if (j < 0){\n j = lp.getNconnection() - 1;\n }\n cp = lp.getConnection(j);\n cpnext = lp.getConnection(ic);\n cpnextx = cpnext.getXrad();\n cpnexty = cpnext.getYrad();\n ac = (cp.getAngle() + cpnext.getAngle()) / 2.0;\n if (cp.getAngle() > cpnext.getAngle()){\n ac -= Math.PI;\n }\n cnx = Math.cos(ac);\n cny = Math.sin(ac);\n lnx = -cny;\n lny = cnx;\n da = cpnext.getAngle() - cp.getAngle();\n if (da < 0.0){\n da += 2 * Math.PI;\n }\n if (cp.isExtruded()) {\n if (da <= Math.PI / 2){\n rl = 2.0;\n }\n else {\n rl = 1.5;\n }\n }\n else {\n rl = 1.0;\n }\n this.bases[cpnext.getStart()].setX(\n this.bases[cp.getEnd()].getX() + rl\n * lnx);\n this.bases[cpnext.getStart()].setY(\n this.bases[cp.getEnd()].getY() + rl\n * lny);\n this.bases[cpnext.getEnd()].setX(\n this.bases[cpnext.getStart()].getX()\n - cpnexty);\n this.bases[cpnext.getEnd()].setY(\n this.bases[cpnext.getStart()].getY()\n + cpnextx);\n }\n }\n }\n if (direction < 0) {\n if (icdown == icend) {\n icdown = -1;\n }\n else if (icdown >= 0) {\n if (++icdown >= lp.getNconnection()) {\n icdown = 0;\n }\n }\n direction = 1;\n }\n else {\n if (icup == icstart){\n icup = -1;\n }\n else if (icup >= 0) {\n if (--icup < 0) {\n icup = lp.getNconnection() - 1;\n }\n }\n direction = -1;\n }\n done = icup == -1 && icdown == -1;\n }\n icnext = icend + 1;\n if (icnext >= lp.getNconnection()){\n icnext = 0;\n }\n if (icend != icstart\n && (!(icstart == icstart1 && icnext == icstart1))) {\n\n // Move the bases just constructed (or the radius) so that\n // the bisector of the end points is radius distance away\n // from the loop center.\n\n cp = lp.getConnection(icstart);\n cpnext = lp.getConnection(icend);\n dx = this.bases[cpnext.getEnd()].getX()\n - this.bases[cp.getStart()].getX();\n dy = this.bases[cpnext.getEnd()].getY()\n - this.bases[cp.getStart()].getY();\n midx = this.bases[cp.getStart()].getX() + dx / 2.0;\n midy = this.bases[cp.getStart()].getY() + dy / 2.0;\n rr = Math.sqrt(dx * dx + dy * dy);\n mx = dx / rr;\n my = dy / rr;\n vx = xc - midx;\n vy = yc - midy;\n rr = Math.sqrt(dx * dx + dy * dy);\n vx /= rr;\n vy /= rr;\n dotmv = vx * mx + vy * my;\n nrx = dotmv * mx - vx;\n nry = dotmv * my - vy;\n rr = Math.sqrt(nrx * nrx + nry * nry);\n nrx /= rr;\n nry /= rr;\n\n // Determine which side of the bisector the center should\n // be.\n\n dx = this.bases[cp.getStart()].getX() - xc;\n dy = this.bases[cp.getStart()].getY() - yc;\n ac = Math.atan2(dy, dx);\n if (ac < 0.0){\n ac += 2 * Math.PI;\n }\n dx = this.bases[cpnext.getEnd()].getX() - xc;\n dy = this.bases[cpnext.getEnd()].getY() - yc;\n acn = Math.atan2(dy, dx);\n if (acn < 0.0){\n acn += 2 * Math.PI;\n }\n if (acn < ac){\n acn += 2 * Math.PI;\n }\n if (acn - ac > Math.PI){\n sign = -1;\n }\n else {\n sign = 1;\n }\n nmidx = xc + sign * radius * nrx;\n nmidy = yc + sign * radius * nry;\n if (rooted) {\n xc -= nmidx - midx;\n yc -= nmidy - midy;\n }\n else {\n for (ic = icstart;;) {\n cp = lp.getConnection(ic);\n i = cp.getStart();\n this.bases[i].setX(\n this.bases[i].getX() + nmidx - midx);\n this.bases[i].setY(\n this.bases[i].getY() + nmidy - midy);\n i = cp.getEnd();\n this.bases[i].setX(\n this.bases[i].getX() + nmidx - midx);\n this.bases[i].setY(\n this.bases[i].getY() + nmidy - midy);\n if (ic == icend){\n break;\n }\n if (++ic >= lp.getNconnection()){\n ic = 0;\n }\n }\n }\n }\n icstart = icnext;\n done_all_connections = icstart == icstart1;\n }\n for (ic = 0; ic < lp.getNconnection(); ic++) {\n cp = lp.getConnection(ic);\n j = ic + 1;\n if (j >= lp.getNconnection()){\n j = 0;\n }\n cpnext = lp.getConnection(j);\n dx = this.bases[cp.getEnd()].getX() - xc;\n dy = this.bases[cp.getEnd()].getY() - yc;\n rc = Math.sqrt(dx * dx + dy * dy);\n ac = Math.atan2(dy, dx);\n if (ac < 0.0){\n ac += 2 * Math.PI;\n }\n dx = this.bases[cpnext.getStart()].getX() - xc;\n dy = this.bases[cpnext.getStart()].getY() - yc;\n rcn = Math.sqrt(dx * dx + dy * dy);\n acn = Math.atan2(dy, dx);\n if (acn < 0.0){\n acn += 2 * Math.PI;\n }\n if (acn < ac){\n acn += 2 * Math.PI;\n }\n dan = acn - ac;\n dcp = cpnext.getAngle() - cp.getAngle();\n if (dcp <= 0.0){\n dcp += 2 * Math.PI;\n }\n if (Math.abs(dan - dcp) > Math.PI) {\n if (cp.isExtruded()) {\n console.log(\"Warning from traverse_loop. Loop \"\n + lp.getNumber() + \" has crossed regions\\n\");\n }\n else if ((cpnext.getStart() - cp.getEnd()) != 1) {\n cp.setExtruded(true);\n continue set_radius; // remplacement du goto\n }\n }\n if (cp.isExtruded()) {\n this.construct_extruded_segment(cp, cpnext);\n }\n else {\n n = cpnext.getStart() - cp.getEnd();\n if (n < 0){\n n += this.nbase + 1;\n }\n angleinc = dan / n;\n for (j = 1; j < n; j++) {\n i = cp.getEnd() + j;\n if (i > this.nbase){\n i -= this.nbase + 1;\n }\n a = ac + j * angleinc;\n rr = rc + (rcn - rc) * (a - ac) / dan;\n this.bases[i].setX(xc + rr * Math.cos(a));\n this.bases[i].setY(yc + rr * Math.sin(a));\n }\n }\n }\n break;\n }\n for (ic = 0; ic < lp.getNconnection(); ic++) {\n if (icroot != ic) {\n cp = lp.getConnection(ic);\n //IM HERE\n this.generate_region(cp);\n this.traverse_loop(cp.getLoop(), cp);\n }\n }\n n = 0;\n sx = 0.0;\n sy = 0.0;\n for (ic = 0; ic < lp.getNconnection(); ic++) {\n j = ic + 1;\n if (j >= lp.getNconnection()){\n j = 0;\n }\n cp = lp.getConnection(ic);\n cpnext = lp.getConnection(j);\n n += 2;\n sx += this.bases[cp.getStart()].getX()\n + this.bases[cp.getEnd()].getX();\n sy += this.bases[cp.getStart()].getY()\n + this.bases[cp.getEnd()].getY();\n if (!cp.isExtruded()) {\n for (j = cp.getEnd() + 1; j != cpnext.getStart(); j++) {\n if (j > this.nbase){\n j -= this.nbase + 1;\n }\n n++;\n sx += this.bases[j].getX();\n sy += this.bases[j].getY();\n }\n }\n }\n lp.setX(sx / n);\n lp.setY(sy / n);\n}\n\nNAView.prototype.determine_radius = function determine_radius(lp, lencut){\n var mindit, ci, dt, sumn, sumd, radius, dit;\n var i, j, end, start, imindit = 0;\n var cp = new Connection(), cpnext = new Connection();\n var rt2_2 = 0.7071068;\n\n do {\n mindit = 1.0e10;\n for (sumd = 0.0, sumn = 0.0, i = 0; i < lp.getNconnection(); i++) {\n cp = lp.getConnection(i);\n j = i + 1;\n if (j >= lp.getNconnection()){\n j = 0;\n }\n cpnext = lp.getConnection(j);\n end = cp.getEnd();\n start = cpnext.getStart();\n if (start < end){\n start += this.nbase + 1;\n }\n dt = cpnext.getAngle() - cp.getAngle();\n if (dt <= 0.0){\n dt += 2 * Math.PI;\n }\n if (!cp.isExtruded()){\n ci = start - end;\n }\n else {\n if (dt <= Math.PI / 2){\n ci = 2.0;\n }\n else {\n ci = 1.5;\n }\n }\n sumn += dt * (1.0 / ci + 1.0);\n sumd += dt * dt / ci;\n dit = dt / ci;\n if (dit < mindit && !cp.isExtruded() && ci > 1.0) {\n mindit = dit;\n imindit = i;\n }\n }\n radius = sumn / sumd;\n if (radius < rt2_2){\n radius = rt2_2;\n }\n if (mindit * radius < lencut) {\n lp.getConnection(imindit).setExtruded(true);\n }\n } while (mindit * radius < lencut);\n if (lp.getRadius() > 0.0){\n radius = lp.getRadius();\n }\n else {\n lp.setRadius(radius);\n }\n}\n\nNAView.prototype.find_ic_middle = function find_ic_middle(icstart, icend, anchor_connection, acp, lp){\n var count, ret, ic, i;\n var done;\n\n count = 0;\n ret = -1;\n ic = icstart;\n done = false;\n while (!done) {\n if (count++ > lp.getNconnection() * 2) {\n console.log(\"Infinite loop in 'find_ic_middle'\");\n }\n if (anchor_connection != null && lp.getConnection(ic) == acp) {\n ret = ic;\n }\n done = ic == icend;\n if (++ic >= lp.getNconnection()) {\n ic = 0;\n }\n }\n if (ret == -1) {\n for (i = 1, ic = icstart; i < (count + 1) / 2; i++) {\n if (++ic >= lp.getNconnection())\n ic = 0;\n }\n ret = ic;\n }\n return ret;\n}\n\nNAView.prototype.construct_extruded_segment = function construct_extruded_segment(cp, cpnext){\n var astart, aend1, aend2, aave, dx, dy, a1, a2, ac, rr, da, dac;\n var start, end, n, nstart, nend;\n var collision;\n\n astart = cp.getAngle();\n aend2 = aend1 = cpnext.getAngle();\n if (aend2 < astart){\n aend2 += 2 * Math.PI;\n }\n aave = (astart + aend2) / 2.0;\n start = cp.getEnd();\n end = cpnext.getStart();\n n = end - start;\n if (n < 0){\n n += this.nbase + 1;\n }\n da = cpnext.getAngle() - cp.getAngle();\n if (da < 0.0) {\n da += 2 * Math.PI;\n }\n if (n == 2) {\n this.construct_circle_segment(start, end);\n }\n else {\n dx = this.bases[end].getX() - this.bases[start].getX();\n dy = this.bases[end].getY() - this.bases[start].getY();\n rr = Math.sqrt(dx * dx + dy * dy);\n dx /= rr;\n dy /= rr;\n if (rr >= 1.5 && da <= Math.PI / 2) {\n nstart = start + 1;\n if (nstart > this.nbase){\n nstart -= this.nbase + 1;\n }\n nend = end - 1;\n if (nend < 0){\n nend += this.nbase + 1;\n }\n this.bases[nstart].setX(this.bases[start].getX() + 0.5 * dx);\n this.bases[nstart].setY(this.bases[start].getY() + 0.5 * dy);\n this.bases[nend].setX(this.bases[end].getX() - 0.5 * dx);\n this.bases[nend].setY(this.bases[end].getY() - 0.5 * dy);\n start = nstart;\n end = nend;\n }\n do {\n collision = false;\n this.construct_circle_segment(start, end);\n nstart = start + 1;\n if (nstart > this.nbase) {\n nstart -= this.nbase + 1;\n }\n dx = this.bases[nstart].getX() - this.bases[start].getX();\n dy = this.bases[nstart].getY() - this.bases[start].getY();\n a1 = Math.atan2(dy, dx);\n if (a1 < 0.0){\n a1 += 2 * Math.PI;\n }\n dac = a1 - astart;\n if (dac < 0.0){\n dac += 2 * Math.PI;\n }\n if (dac > Math.PI){\n collision = true;\n }\n nend = end - 1;\n if (nend < 0){\n nend += this.nbase + 1;\n }\n dx = this.bases[nend].getX() - this.bases[end].getX();\n dy = this.bases[nend].getY() - this.bases[end].getY();\n a2 = Math.atan2(dy, dx);\n if (a2 < 0.0){\n a2 += 2 * Math.PI;\n }\n dac = aend1 - a2;\n if (dac < 0.0){\n dac += 2 * Math.PI;\n }\n if (dac > Math.PI){\n collision = true;\n }\n if (collision) {\n ac = this.minf2(aave, astart + 0.5);\n this.bases[nstart].setX(\n this.bases[start].getX() + Math.cos(ac));\n this.bases[nstart].setY(\n this.bases[start].getY() + Math.sin(ac));\n start = nstart;\n ac = this.maxf2(aave, aend2 - 0.5);\n this.bases[nend].setX(this.bases[end].getX() + Math.cos(ac));\n this.bases[nend].setY(this.bases[end].getY() + Math.sin(ac));\n end = nend;\n n -= 2;\n }\n } while (collision && n > 1);\n }\n}\n\nNAView.prototype.construct_circle_segment = function construct_circle_segment(start, end){\n var dx, dy, rr, midx, midy, xn, yn, nrx, nry, mx, my, a;\n var l, j, i;\n\n dx = this.bases[end].getX() - this.bases[start].getX();\n dy = this.bases[end].getY() - this.bases[start].getY();\n rr = Math.sqrt(dx * dx + dy * dy);\n l = end - start;\n if (l < 0){\n l += this.nbase + 1;\n }\n if (rr >= l) {\n dx /= rr;\n dy /= rr;\n for (j = 1; j < l; j++) {\n i = start + j;\n if (i > this.nbase){\n i -= this.nbase + 1;\n }\n this.bases[i].setX(\n this.bases[start].getX() + dx * j / l);\n this.bases[i].setY(\n this.bases[start].getY() + dy * j / l);\n }\n }\n else {\n this.find_center_for_arc((l - 1), rr);\n dx /= rr;\n dy /= rr;\n midx = this.bases[start].getX() + dx * rr / 2.0;\n midy = this.bases[start].getY() + dy * rr / 2.0;\n xn = dy;\n yn = -dx;\n nrx = midx + this._h * xn;\n nry = midy + this._h * yn;\n mx = this.bases[start].getX() - nrx;\n my = this.bases[start].getY() - nry;\n rr = Math.sqrt(mx * mx + my * my);\n a = Math.atan2(my, mx);\n for (j = 1; j < l; j++) {\n i = start + j;\n if (i > this.nbase){\n i -= this.nbase + 1;\n }\n this.bases[i].setX(nrx + rr * Math.cos(a + j * this.angleinc));\n this.bases[i].setY(nry + rr * Math.sin(a + j * this.angleinc));\n }\n }\n}\n\nNAView.prototype.find_center_for_arc = function find_center_for_arc(n, b){\n var h, hhi, hlow, r, disc, theta, e, phi;\n var iter;\n\n hhi = (n + 1.0) / Math.PI;\n // changed to prevent div by zero if (ih)\n hlow = -hhi - b / (n + 1.000001 - b);\n if (b < 1){\n // otherwise we might fail below (ih)\n hlow = 0;\n }\n iter = 0;\n do {\n h = (hhi + hlow) / 2.0;\n r = Math.sqrt(h * h + b * b / 4.0);\n disc = 1.0 - 0.5 / (r * r);\n if (Math.abs(disc) > 1.0) {\n console.log(\"Unexpected large magnitude discriminant = \" + disc\n + \" \" + r);\n }\n theta = Math.acos(disc);\n phi = Math.acos(h / r);\n e = theta * (n + 1) + 2 * phi - 2 * Math.PI;\n if (e > 0.0) {\n hlow = h;\n }\n else {\n hhi = h;\n }\n } while (Math.abs(e) > 0.0001 && ++iter < this.MAXITER);\n if (iter >= this.MAXITER) {\n if (noIterationFailureYet) {\n console.log(\"Iteration failed in find_center_for_arc\");\n noIterationFailureYet = false;\n }\n h = 0.0;\n theta = 0.0;\n }\n this._h = h;\n this.angleinc = theta;\n}\n\nNAView.prototype.generate_region = function generate_region(cp){\n var l, start, end, i, mate;\n var rp;\n\n rp = cp.getRegion();\n l = 0;\n if (cp.getStart() == rp.getStart1()) {\n start = rp.getStart1();\n end = rp.getEnd1();\n }\n else {\n start = rp.getStart2();\n end = rp.getEnd2();\n }\n if (this.bases[cp.getStart()].getX() > this.ANUM - 100.0\n || this.bases[cp.getEnd()].getX() > this.ANUM - 100.0) {\n console.log(\n \"Bad region passed to generate_region. Coordinates not defined.\");\n }\n for (i = start + 1; i <= end; i++) {\n l++;\n this.bases[i].setX(\n this.bases[cp.getStart()].getX() + this.HELIX_FACTOR * l\n * cp.getXrad());\n this.bases[i].setY(\n this.bases[cp.getStart()].getY() + this.HELIX_FACTOR * l\n * cp.getYrad());\n mate = this.bases[i].getMate();\n this.bases[mate].setX(\n this.bases[cp.getEnd()].getX() + this.HELIX_FACTOR * l\n * cp.getXrad());\n this.bases[mate].setY(\n this.bases[cp.getEnd()].getY() + this.HELIX_FACTOR * l\n * cp.getYrad());\n\n }\n}\n\nNAView.prototype.minf2 = function minf2(x1, x2) {\n return ((x1) < (x2)) ? (x1) : (x2);\n}\n\nNAView.prototype.maxf2 = function maxf2(x1, x2) {\n return ((x1) > (x2)) ? (x1) : (x2);\n}\n\nNAView.prototype.connected_connection = function connected_connection(cp, cpnext) {\n if (cp.isExtruded()) {\n return true;\n }\n else if (cp.getEnd() + 1 == cpnext.getStart()) {\n return true;\n }\n else {\n return false;\n }\n}\n","/* Version: 0.2\n* Date: 2015-03-15\n*/\n\nimport fstyle from './fornac.css';\n\nimport d3 from 'd3';\nimport slugid from 'slugid';\nimport {contextMenu} from './d3-context-menu.js';\n\nimport {RNAGraph} from './rnagraph.js';\nimport {ColorScheme, rnaUtilities} from './rnautils.js';\n\nimport {simpleXyCoordinates} from './simplernaplot.js';\nimport {NAView} from './naview/naview.js';\n\nexport function FornaContainer(element, passedOptions = {}) {\n var self = this;\n\n let options = {\n 'editable': false,\n 'zoomable': true,\n 'animation': true,\n 'displayAllLinks': false,\n 'labelInterval': 10,\n 'chargeDistance': 110,\n 'friction': 0.35,\n 'middleCharge': -30,\n 'otherCharge': -30,\n 'linkDistanceMultiplier': 15,\n 'initialSize': null,\n 'layout': 'standard-polygonal',\n 'transitionDuration': 500,\n 'maxNodeRadius': 80 // the maximum radius of a node when the view is centered\n };\n\n self.options = Object.assign(options, passedOptions);\n\n if (self.options.initialSize !== null) {\n self.options.svgW = self.options.initialSize[0];\n self.options.svgH = self.options.initialSize[1];\n } else {\n self.options.svgW = 300;\n self.options.svgH = 300;\n }\n\n self.linkStrengths = {\n 'pseudoknot': 0.00,\n 'proteinChain': 0.00,\n 'chainChain': 0.00,\n 'intermolecule': 10.00,\n 'external': 0.00,\n 'other': 10.00\n };\n\n self.displayParameters = {\n 'displayNumbering': true,\n 'displayNodeOutline': true,\n 'displayNodeLabel': true,\n 'displayLinks': true,\n 'displayPseudoknotLinks': true,\n 'displayProteinLinks': true,\n 'displayDirectionArrows': true\n };\n\n self.colorScheme = 'structure';\n self.customColors = {};\n self.rnas = {};\n self.extraLinks = []; //store links between different RNAs\n\n // global mouse event vars\n var mousedownLink = null,\n mousedownNode = null,\n mouseupNode = null;\n let linkContextMenuShown = false;\n\n let resetMouseVars = () => {\n mousedownNode = null;\n mouseupNode = null;\n mousedownLink = null;\n }\n\n var graph = self.graph = {\n 'nodes':[],\n 'links':[]\n };\n\n Array.prototype.equals = function (array) {\n // if the other array is a falsy value, return\n if (!array)\n return false;\n\n // compare lengths - can save a lot of time\n if (this.length != array.length)\n return false;\n\n for (var i = 0, l=this.length; i < l; i++) {\n // Check if we have nested arrays\n if (this[i] instanceof Array && array[i] instanceof Array) {\n // recurse into the nested arrays\n if (!this[i].equals(array[i]))\n return false;\n }\n else if (this[i] != array[i]) {\n // Warning - two different object instances will never be equal: {x:20} != {x:20}\n return false;\n }\n }\n return true;\n };\n\n /* Register global mouse and key events */\n if (self.options.editable || self.options.animation) {\n var shiftKeydown = false;\n var ctrlKeydown = false;\n\n let keydown = () => {\n switch (d3.event.keyCode) {\n case 68: //'d' key\n console.log('dotbracket:', self.getStructuresDotBracket());\n break;\n case 16:\n shiftKeydown = true;\n break;\n case 17:\n ctrlKeydown = true;\n break;\n case 67: //c\n self.centerView();\n break;\n }\n\n if (ctrlKeydown) {\n // Ctrl key must disable panning and zooming\n if (self.options.zoomable)\n disableZooming()\n // Ctrl Button must enable crosshair and start brusher\n if (self.options.editable || self.options.animation) {\n enableBrushing()\n }\n }\n }\n\n let keyup = () => {\n shiftKeydown = false;\n ctrlKeydown = false;\n\n // enable zoomer\n if (self.options.zoomable)\n enableZooming()\n // disable brushing events\n disableBrushing()\n }\n\n d3.select('body')\n .on('keydown', keydown)\n .on('keyup', keyup)\n .on('contextmenu', function() {\n d3.event.preventDefault();\n });\n }\n\n /* Register global context menu */\n if (self.options.editable) {\n let backgroundMenu = [\n {\n title: 'Add Node',\n action: function(elm, d, i, mousePos) {\n\n },\n children: [{\n 'title': 'A',\n action: function(elm, d, i, mousePos) {\n console.log('mousePos:', mousePos, self.options.svgW, self.options.svgH);\n let canvasMousePos = [xScale.invert(mousePos[0]),\n yScale.invert(mousePos[1])];\n console.log('canvasMousePos', canvasMousePos);\n\n self.addRNA('.', {'sequence': 'A', 'centerPos': canvasMousePos});\n }\n },\n {\n 'title': 'C',\n action: function(elm, d, i, mousePos) {\n console.log('mousePos:', mousePos, self.options.svgW, self.options.svgH);\n let canvasMousePos = [xScale.invert(mousePos[0]),\n yScale.invert(mousePos[1])];\n console.log('canvasMousePos', canvasMousePos);\n\n self.addRNA('.', {'sequence': 'C', 'centerPos': canvasMousePos});\n }\n\n },\n {\n 'title': 'G',\n action: function(elm, d, i, mousePos) {\n console.log('mousePos:', mousePos, self.options.svgW, self.options.svgH);\n let canvasMousePos = [xScale.invert(mousePos[0]),\n yScale.invert(mousePos[1])];\n console.log('canvasMousePos', canvasMousePos);\n\n self.addRNA('.', {'sequence': 'G', 'centerPos': canvasMousePos});\n }\n\n },\n {\n 'title': 'U',\n action: function(elm, d, i, mousePos) {\n console.log('mousePos:', mousePos, self.options.svgW, self.options.svgH);\n let canvasMousePos = [xScale.invert(mousePos[0]),\n yScale.invert(mousePos[1])];\n console.log('canvasMousePos', canvasMousePos);\n\n self.addRNA('.', {'sequence': 'U', 'centerPos': canvasMousePos});\n\n }\n }\n ],\n disabled: false // optional, defaults to false\n }\n ]\n\n let nodeMenu = [\n {\n title: 'Delete Node',\n action: function(elm, d, i) {\n deleteNode(d);\n },\n disabled: false // optional, defaults to false\n },\n {\n title: 'Change Node',\n action: function(elm, d, i) {\n console.log('You have clicked the second item!');\n console.log('The data for this circle is: ' + d);\n },\n children: [\n {\n title: 'A',\n action: function(elm, d, i) {\n changeNode('A', d);\n }\n },\n {\n title: 'C',\n action: function(elm, d, i) {\n changeNode('C', d);\n\n }\n },\n {\n title: 'G',\n action: function(elm, d, i) {\n changeNode('G', d);\n\n }\n },\n {\n title: 'U',\n action: function(elm, d, i) {\n changeNode('U', d);\n }\n },\n ]\n },\n {\n title: 'Insert Before',\n action: function(elm, d, i) {\n\n },\n children: [\n {\n title: 'A',\n action: function(elm, d, i) {\n insertNodeBeforeOrAfter('A', d, -1);\n }\n },\n {\n title: 'C',\n action: function(elm, d, i) {\n insertNodeBeforeOrAfter('C', d, -1);\n\n }\n },\n {\n title: 'G',\n action: function(elm, d, i) {\n insertNodeBeforeOrAfter('G', d, -1);\n\n }\n },\n {\n title: 'U',\n action: function(elm, d, i) {\n insertNodeBeforeOrAfter('U', d, -1);\n }\n },\n ]\n },\n {\n title: 'Insert After',\n action: function(elm, d, i) {\n console.log('d:', d);\n\n },\n children: [\n {\n title: 'A',\n action: function(elm, d, i) {\n insertNodeBeforeOrAfter('A', d, 0);\n\n }\n },\n {\n title: 'C',\n action: function(elm, d, i) {\n insertNodeBeforeOrAfter('C', d, 0);\n }\n },\n {\n title: 'G',\n action: function(elm, d, i) {\n insertNodeBeforeOrAfter('G', d, 0);\n }\n },\n {\n title: 'U',\n action: function(elm, d, i) {\n insertNodeBeforeOrAfter('U', d, 0);\n }\n },\n ]\n }\n ]\n\n self.nodeContextMenu = contextMenu(nodeMenu);\n self.backgroundContextMenu = contextMenu(backgroundMenu);\n\n } else {\n //console.log('empty context menu');\n self.nodeContextMenu = function() {};\n }\n\n /* Draw the plot here */\n d3.select(element).select('svg').remove();\n\n var svg = d3.select(element)\n .attr('tabindex', 1)\n .each(function() { this.focus(); })\n .append('svg:svg')\n .attr('preserveAspectRatio', 'xMidYMid meet')\n .attr('viewBox', '0 0 ' + self.options.svgW + ' ' + self.options.svgH)\n\n self.options.svg = svg;\n\n if (self.options.editable || self.options.animation) {\n var mouseEventHelper = svg.append('svg:g')\n .on('mousemove', () => {\n // only if we are dragging\n if (!mousedownNode) return;\n\n // update drag line\n let mpos = d3.mouse(vis.node());\n dragLine\n .attr('x1', mousedownNode.x)\n .attr('y1', mousedownNode.y)\n .attr('x2', mpos[0])\n .attr('y2', mpos[1]);\n })\n .on('mousedown', () => {\n })\n .on('mouseup', () => {\n if (mousedownNode && !linkContextMenuShown) {\n dragLine.classed(fstyle.transparent, true);\n }\n // clear mouse event vars\n resetMouseVars();\n //update()\n })\n .classed(fstyle.mouseEventHelper, true)\n .style('pointer-events', 'all')\n\n // draw a background layer for mouse events\n mouseEventHelper.append('svg:rect')\n .classed('background', true)\n .style('visibility', 'hidden')\n .attr('width', self.options.svgW)\n .attr('height', self.options.svgH)\n .on('mousedown', function() {\n //console.log('background click');\n deselectAllNodes()\n })\n } else {\n var mouseEventHelper = svg;\n }\n\n var vis = mouseEventHelper.append('svg:g')\n .classed(fstyle.plot, true)\n var visLinks = vis.append('svg:g')\n .classed('fornac-links', true);\n var visNodes = vis.append('svg:g')\n .classed('fornac-nodes', true);\n\n // line displayed when dragging new nodes\n if (self.options.editable) {\n var dragLine = vis.append('line')\n .attr('class', fstyle.dragLine)\n .attr('x1', 0)\n .attr('y1', 0)\n .attr('x2', 0)\n .attr('y2', 0);\n\n svg.on('contextmenu', self.backgroundContextMenu);\n }\n\n /* Zooming related objects and functions */\n var xScale = d3.scale.linear()\n .domain([0,self.options.svgW]).range([0,self.options.svgW]);\n var yScale = d3.scale.linear()\n .domain([0,self.options.svgH]).range([0, self.options.svgH]);\n\n self.zoomer = d3.behavior.zoom()\n .scaleExtent([0.1,10])\n .x(xScale)\n .y(yScale)\n .on('zoom', () => {\n vis.attr('transform',\n 'translate(' + d3.event.translate + ')' + ' scale(' + d3.event.scale + ')');\n });\n\n let enableZooming = () => {\n svg.call(self.zoomer)\n .on(\"dblclick.zoom\", null);\n }\n\n let disableZooming = () => {\n svg.call(self.zoomer)\n .on(\"dblclick.zoom\", null)\n .on('mousedown.zoom', null)\n .on('touchstart.zoom', null)\n .on('touchmove.zoom', null)\n .on('touchend.zoom', null);\n }\n\n if (self.options.zoomable)\n enableZooming()\n\n /* Node selection related objects and functions */\n let toggleSelectNode = (node) => {\n node.selected = !node.selected;\n visNodes.selectAll('g.gnode').filter((d) => { return node.uid == d.uid; })\n .classed(fstyle.selectedNode, function(p) { return p.selected; });\n }\n\n let selectNode = (node) => {\n node.selected = true;\n visNodes.selectAll('g.gnode').filter((d) => { return node.uid == d.uid; })\n .classed(fstyle.selectedNode, function(p) { return p.selected; });\n }\n\n let deselectAllNodes = () => {\n visNodes.selectAll('g.gnode')\n .classed(fstyle.selectedNode, function(p) { return p.selected = false; });\n }\n\n let selectedNodes = () => {\n // return all selected nodes\n return visNodes.selectAll('g.gnode').filter(function(d) { return d.selected; });\n }\n\n self.brusher = d3.svg.brush()\n .x(xScale)\n .y(yScale)\n .on('brushstart', function(d) {})\n .on('brush', function() {\n // during brushing invert styling of selection as preview\n let extent = d3.event.target.extent();\n\n visNodes.selectAll('g.gnode')\n .classed(fstyle.selectedNode, function (d) {\n return d.selected ^ (extent[0][0] <= d.x && d.x < extent[1][0]\n && extent[0][1] <= d.y && d.y < extent[1][1])\n })\n })\n .on('brushend', function() {\n // after brushing finally toggle the selection\n let extent = d3.event.target.extent();\n\n visNodes.selectAll('g.gnode')\n .filter(function (d) {\n return extent[0][0] <= d.x && d.x < extent[1][0]\n && extent[0][1] <= d.y && d.y < extent[1][1]\n })\n .each(toggleSelectNode)\n\n d3.event.target.clear();\n d3.select(this).call(d3.event.target);\n });\n\n let enableBrushing = () => {\n // crosshair curson\n mouseEventHelper.select('.background').style('cursor', 'crosshair');\n // bind brusher\n mouseEventHelper.call(self.brusher);\n }\n\n let disableBrushing = () => {\n // normal cursor\n mouseEventHelper.select('.background').style('cursor', 'auto');\n // disable brushing events\n mouseEventHelper.call(self.brusher)\n .on('mousedown.brush', null)\n .on('touchstart.brush', null)\n .on('touchmove.brush', null)\n .on('touchend.brush', null);\n }\n\n /* Force related objects and functions */\n self.force = d3.layout.force()\n .charge(function(d) {\n if (d.nodeType == 'middle')\n return self.options.middleCharge;\n else\n return self.options.otherCharge;\n })\n .friction(self.options.friction)\n .linkDistance(function(d) { return self.options.linkDistanceMultiplier * d.value; })\n .linkStrength(function(d) { if (d.linkType in self.linkStrengths) {\n return self.linkStrengths[d.linkType];\n } else {\n return self.linkStrengths.other; }\n })\n .gravity(0.000)\n .nodes(self.graph.nodes)\n .links(self.graph.links)\n .chargeDistance(self.options.chargeDistance)\n .size([self.options.svgW, self.options.svgH]);\n\n var drag = d3.behavior.drag()\n .on('dragstart', function(d) {\n console.log('dragstart')\n d3.event.sourceEvent.stopPropagation();\n\n selectedNodes().each(function(d1) {\n d1.fixed |= 2;\n });\n })\n .on('drag', (d) => {\n if (shiftKeydown) return\n selectedNodes().each(function(d1) {\n d1.x += d3.event.dx;\n d1.y += d3.event.dy;\n\n d1.px += d3.event.dx;\n d1.py += d3.event.dy;\n });\n\n self.resumeForce();\n d3.event.sourceEvent.preventDefault();\n })\n .on('dragend', (d) => {\n console.log('dragend')\n selectedNodes().each(function(d1) {\n d1.fixed &= ~6;\n });\n });\n\n /* Main plot drawing functions */\n let createInitialLayout = function(structure, passedOptions = {}) {\n // the default options\n let options = {\n 'sequence': '',\n 'name': 'empty',\n 'positions': [],\n 'labelInterval': self.options.labelInterval,\n 'avoidOthers': true,\n 'uids': [],\n 'circularizeExternal': true\n };\n\n options = Object.assign(options, passedOptions);\n\n //console.log('options.uids:', options.uids);\n let rg = new RNAGraph(options.sequence, structure, options.name);\n rg.circularizeExternal = options.circularizeExternal;\n\n let rnaJson = rg.recalculateElements();\n\n if (options.positions.length === 0) {\n // no provided positions means we need to calculate an initial layout\n\n if (self.options.layout == 'naview') {\n let naview = new NAView();\n\n let naViewPositions = naview.naview_xy_coordinates(rg.pairtable);\n options.positions = []\n for (let i = 0; i < naViewPositions.nbase; i++)\n options.positions.push([naViewPositions.x[i], naViewPositions.y[i]]);\n } else {\n options.positions = simpleXyCoordinates(rnaJson.pairtable);\n }\n }\n\n rnaJson = rnaJson.elementsToJson()\n .addUids(options.uids)\n .addPositions('nucleotide', options.positions)\n .addLabels(1, options.labelInterval)\n .reinforceStems()\n .reinforceLoops()\n .connectFakeNodes()\n .reassignLinkUids()\n .breakNodesToFakeNodes();\n\n return rnaJson;\n };\n\n let createNewNodes = function(gnodesEnter) {\n gnodesEnter = gnodesEnter.append('g')\n .classed('gnode', true)\n .attr('struct_name', function(d) { return d.structName; })\n .attr('transform', function(d) {\n if (typeof d.x != 'undefined' && typeof d.y != 'undefined')\n return 'translate(' + [d.x, d.y] + ')';\n else\n return '';\n })\n .each( function(d) { d.selected = d.previouslySelected = false; });\n\n gnodesEnter\n .attr('num', function(d) { return 'n' + d.num; })\n .attr('rnum', function(d) {\n return 'n' + (d.rna.rnaLength - d.num + 1); })\n .transition()\n .duration(750)\n .ease('elastic');\n\n if (self.options.editable || self.options.animation) {\n gnodesEnter.on('mousedown', nodeMousedown)\n //.on('mousedrag', function(d) {})\n .on('mouseup', nodeMouseup)\n .on('contextmenu', self.nodeContextMenu)\n .call(drag)\n }\n\n let labelAndProteinNodes = gnodesEnter.filter(function(d) {\n return d.nodeType == 'label' || d.nodeType == 'protein';\n });\n\n let nucleotideNodes = gnodesEnter.filter(function(d) {\n return d.nodeType == 'nucleotide';\n });\n\n labelAndProteinNodes.append('svg:circle')\n .classed(fstyle.node, true)\n .attr('r', function(d) {\n if (d.nodeType == 'middle') return 0;\n else {\n return d.radius;\n }\n })\n .attr('node_type', function(d) { return d.nodeType; })\n .attr('node_num', function(d) { return d.num; });\n\n // direction arrows\n nucleotideNodes.append('svg:path')\n .attr('class', fstyle.directionArrow)\n .attr('node_num', function(d) { return d.num; })\n\n // nucleotide outlines\n nucleotideNodes.append('svg:circle')\n .attr('class', fstyle.node)\n .attr('node_type', function(d) { return d.nodeType; })\n .attr('node_num', function(d) { return d.num; })\n .attr('r', function(d) { return d.radius; })\n .append('svg:title')\n .text(function(d) {\n if (d.nodeType == 'nucleotide') {\n return d.structName + ':' + d.num;\n } else {\n return '';\n }\n });\n\n // nucleotide labels\n var labelsEnter = gnodesEnter.append('text')\n .text(function(d) { return d.name; })\n .attr('class', fstyle.nodeLabel)\n .attr('label_type', function(d) { return d.nodeType; })\n\n // nucleotide label title\n labelsEnter.append('svg:title')\n .text(function(d) {\n if (d.nodeType == 'nucleotide') {\n return d.structName + ':' + d.num;\n } else {\n return '';\n }\n });\n\n return gnodesEnter;\n };\n\n let createNewLinks = function(linksEnter) {\n var linkLines = linksEnter.append('svg:line');\n\n linkLines.append('svg:title')\n .text((d) => { return d.linkType + ':' + d.source.num + '-' + d.target.num });\n\n linkLines\n .classed('link', true)\n .classed(fstyle.link, true)\n .attr('x1', function(d) { return d.source.x; })\n .attr('y1', function(d) { return d.source.y; })\n .attr('x2', function(d) { return d.target.x; })\n .attr('y2', function(d) { return d.target.y; })\n .attr('link_type', function(d) { return d.linkType; } )\n .attr('pointer-events', function(d) { if (d.linkType == 'fake') return 'none'; else return 'all';});\n\n if (self.options.editable)\n linkLines.on('click', linkClick);\n\n /* We don't need to update the positions of the stabilizing links */\n /*\n basepairLinks = visLinks.selectAll('[link_type=basepair]');\n basepairLinks.classed('basepair', true);\n\n fakeLinks = visLinks.selectAll('[link_type=fake]')\n fakeLinks.classed('fake', true);\n\n intermolecule_links = vis_links.selectAll('[link_type=intermolecule]');\n intermolecule_links.classed('intermolecule', true);\n\n plink = vis_links.selectAll('[link_type=protein_chain],[link_type=chain_chain]');\n plink.classed('chain_chain', true);\n */\n\n return linkLines;\n };\n\n function drawDirectionArrow(d) {\n let magnitude = (x) => {\n return Math.sqrt(x[0] * x[0] + x[1] * x[1]);\n }\n\n let endPoint = d;\n let startPoint = d.prevNode;\n // get stroke width and arrow size values from css\n let nodeStroke = parseFloat(fstyle.nodeStrokeWidth) / 2;\n let lengthMult = parseFloat(fstyle.directionArrowSize);\n let arrowWidth = parseFloat(fstyle.directionArrowWidth);\n\n if (startPoint === null)\n return;\n\n // does this node have a link pointing to it?\n if (!d.linked)\n return;\n\n // point back toward the previous node\n let u = [-(endPoint.x - startPoint.x), -(endPoint.y - startPoint.y)];\n\n if (u[0] == 0 && u[1] == 0)\n return; // will lead to a NaN error\n\n // scale u to unit length\n u = [u[0] / magnitude(u), u[1] / magnitude(u)];\n // normal vector of u\n let v = [-u[1], u[0]];\n\n // calculate the tip position\n let arrowTip = [(d.radius + nodeStroke) * u[0], (d.radius + nodeStroke) * u[1]];\n\n let path = 'M' + (arrowTip[0] + lengthMult * (u[0]/2 + v[0]*arrowWidth/2)) + ',' + (arrowTip[1] + lengthMult * (u[1]/2 + v[1]*arrowWidth/2)) +\n 'L' + (arrowTip[0]) + ',' + (arrowTip[1]) +\n 'L' + (arrowTip[0] + lengthMult * (u[0]/2 - v[0]*arrowWidth/2)) + ',' + (arrowTip[1] + lengthMult * (u[1]/2 - v[1]*arrowWidth/2));\n\n d3.select(this).attr('d', path);\n }\n\n let realLinkFilter = (d) => {\n return d.linkType == 'basepair' ||\n d.linkType == 'backbone' ||\n d.linkType == 'intermolecule' ||\n d.linkType == 'pseudoknot' ||\n d.linkType == 'label_link' ||\n d.linkType == 'external' ||\n d.linkType == 'chain_chain';\n }\n\n let recalculateGraph = () => {\n // Condense all of the individual RNAs into one\n // collection of nodes and links\n self.graph.nodes = [];\n self.graph.links = [];\n for (let uid in self.rnas) {\n self.graph.nodes = self.graph.nodes.concat(self.rnas[uid].nodes);\n self.graph.links = self.graph.links.concat(self.rnas[uid].links);\n }\n\n // Create a lookup table so that we can access each node\n // based on its uid. This will be used to create the links\n // between different RNAs\n var uidsToNodes = {};\n\n for (let i = 0; i < self.graph.nodes.length; i++)\n uidsToNodes[self.graph.nodes[i].uid] = self.graph.nodes[i];\n\n self.graph.links.forEach(function(link) {\n link.source = uidsToNodes[link.source.uid];\n link.target = uidsToNodes[link.target.uid];\n });\n\n for (let i = 0; i < self.extraLinks.length; i++) {\n // the actual node objects may have changed, so we hae to recreate\n // the extra links based on the uids\n if (!(self.extraLinks[i].target.uid in uidsToNodes)) {\n console.log('not there:', self.extraLinks[i]);\n continue;\n }\n\n self.extraLinks[i].source = uidsToNodes[self.extraLinks[i].source.uid];\n self.extraLinks[i].target = uidsToNodes[self.extraLinks[i].target.uid];\n\n if (self.extraLinks[i].linkType == 'intermolecule') {\n //remove links to middle nodes\n let fakeLinks = self.graph.links.filter(function(d) {\n return ((d.source == self.extraLinks[i].source || d.source == self.extraLinks[i].target ||\n d.target == self.extraLinks[i].source || d.target == self.extraLinks[i].source) &&\n d.linkType == 'fake');\n });\n\n for (let j = 0; j < fakeLinks.length; j++) {\n let linkIndex = self.graph.links.indexOf(fakeLinks[j]);\n self.graph.links.splice(linkIndex, 1);\n }\n }\n\n graph.links.push(self.extraLinks[i]);\n }\n };\n\n self.update = function () {\n self.force.nodes(self.graph.nodes)\n .links(self.graph.links);\n\n if (self.options.animation) {\n self.force.start();\n }\n\n let allLinks = visLinks.selectAll('line.link')\n .data(self.graph.links.filter(realLinkFilter), elementKey);\n\n allLinks.attr('class', '')\n .classed('link', true)\n .classed(fstyle.link, true)\n .attr('link_type', function(d) { return d.linkType; } )\n\n let linksEnter = allLinks.enter();\n createNewLinks(linksEnter);\n\n allLinks.exit().remove();\n\n let gnodes = visNodes.selectAll('g.gnode')\n .data(self.graph.nodes, elementKey);\n //.attr('pointer-events', 'all');\n\n let gnodesEnter = gnodes.enter();\n createNewNodes(gnodesEnter);\n gnodes.exit().remove();\n\n\n //fake_nodes = self.graph.nodes.filter(function(d) { return d.nodeType == 'middle'; });\n //fakeNodes = self.graph.nodes.filter(function(d) { return true; });\n let realNodes = self.graph.nodes.filter(function(d) { return d.nodeType == 'nucleotide' || d.nodeType == 'label';});\n\n gnodes.select('.' + fstyle.directionArrow).each(drawDirectionArrow);\n\n self.force.on('tick', function() {\n let q = d3.geom.quadtree(realNodes);\n let i = 0;\n let n = realNodes.length;\n\n let collide = (node) => {\n let r = node.radius + 16,\n nx1 = node.x - r,\n nx2 = node.x + r,\n ny1 = node.y - r,\n ny2 = node.y + r;\n return function(quad, x1, y1, x2, y2) {\n if (quad.point && (quad.point !== node)) {\n let x = node.x - quad.point.x,\n y = node.y - quad.point.y,\n l = Math.sqrt(x * x + y * y),\n r = node.radius + quad.point.radius;\n if (l < r) {\n l = (l - r) / l * 0.1;\n node.x -= x *= l;\n node.y -= y *= l;\n quad.point.x += x;\n quad.point.y += y;\n }\n }\n return x1 > nx2 || x2 < nx1 || y1 > ny2 || y2 < ny1;\n };\n }\n\n while (++i < n) q.visit(collide(realNodes[i]));\n\n allLinks.attr('x1', function(d) { return d.source.x; })\n .attr('y1', function(d) { return d.source.y; })\n .attr('x2', function(d) { return d.target.x; })\n .attr('y2', function(d) { return d.target.y; });\n\n // Translate the groups\n gnodes.attr('transform', function(d) {\n return 'translate(' + [d.x, d.y] + ')';\n });\n\n gnodes.select('.' + fstyle.directionArrow).each(drawDirectionArrow);\n\n });\n\n self.force.on('end', () => {\n gnodes.selectAll('[node_type=nucleotide]')\n .filter((d,i) => { if (i == 0) return true; else return false; })\n .each((d,i) => {\n //console.log(\"pos\", d.num, d.x, d.y);\n });\n\n //for (let uid in self.rnas) {\n // for (let i = 1; i < self.rnas[uid].pairtable[0]; i++) {\n // console.log('pt', i, self.rnas[uid].pairtable[i]);\n // }\n //}\n\n });\n\n self.changeColorScheme(self.colorScheme);\n\n if (self.options.animation) {\n self.force.start();\n }\n\n updateStyle();\n };\n\n self.transitionRNA = function(newStructure, nextFunction) {\n if (self.dotbracket == newStructure) {\n return;\n } else {\n self.dotbracket = newStructure;\n }\n //transition from an RNA which is already displayed to a new structure\n var duration = self.options.transitionDuration;\n\n var uids = self.graph.nodes\n .filter(function(d) { return d.nodeType == 'nucleotide'; })\n .map(function(d) { return d.uid; });\n\n let options = {'uids': uids};\n var newRNAJson = createInitialLayout(newStructure, options);\n\n let gnodes = visNodes.selectAll('g.gnode').data(newRNAJson.nodes, elementKey);\n var links = visLinks.selectAll('line.link').data(newRNAJson.links.filter(realLinkFilter), elementKey);\n\n if (duration === 0)\n gnodes.attr('transform', function(d) {\n return 'translate(' + [d.x, d.y] + ')';\n });\n else {\n gnodes.transition()\n .attr('transform', function(d) {\n return 'translate(' + [d.x, d.y] + ')'; }).duration(duration);\n }\n\n\n var newNodes = createNewNodes(gnodes.enter())\n .attr('transform', function(d) {\n if (typeof d.x != 'undefined' && typeof d.y != 'undefined')\n return 'translate(' + [0, 0] + ')';\n else\n return '';\n });\n\n if (duration === 0)\n gnodes.exit().remove();\n else\n gnodes.exit().transition()\n .attr('transform', function(d) {\n if (typeof d.x != 'undefined' && typeof d.y != 'undefined')\n return 'translate(' + [0, 0] + ')';\n else\n return '';\n });\n\n self.graph.nodes = gnodes.data();\n gnodes.select('.' + fstyle.directionArrow).each(drawDirectionArrow);\n self.changeColorScheme(self.colorScheme);\n updateStyle();\n self.centerView(duration);\n\n function endall(transition, callback) {\n if (transition.size() === 0) { setTimeout(callback, duration); }\n var n = 0;\n transition\n .each(function() { ++n; })\n .each('end', function() { if (!--n) callback.apply(this, arguments); });\n }\n\n function afterAnimation() {\n var newLinks = createNewLinks(links.enter());\n self.graph.links = links.data();\n self.changeColorScheme(self.colorScheme);\n updateStyle();\n\n if (typeof nextFunction != 'undefined')\n nextFunction();\n\n }\n\n links.exit().remove();\n\n if (duration === 0) {\n links\n .attr('x1', function(d) { return d.source.x; })\n .attr('y1', function(d) { return d.source.y; })\n .attr('x2', function(d) { return d.target.x; })\n .attr('y2', function(d) { return d.target.y; });\n\n var newLinks = createNewLinks(links.enter());\n self.graph.links = links.data();\n\n updateStyle();\n } else {\n links.transition()\n .attr('x1', function(d) { return d.source.x; })\n .attr('y1', function(d) { return d.source.y; })\n .attr('x2', function(d) { return d.target.x; })\n .attr('y2', function(d) { return d.target.y; })\n .duration(duration)\n .call(endall, afterAnimation);\n }\n\n if (duration === 0) {\n newNodes\n .attr('transform', function(d) {\n if (typeof d.x != 'undefined' && typeof d.y != 'undefined')\n return 'translate(' + [d.x, d.y] + ')';\n else\n return '';\n });\n } else {\n newNodes.transition()\n .attr('transform', function(d) {\n if (typeof d.x != 'undefined' && typeof d.y != 'undefined')\n return 'translate(' + [d.x, d.y] + ')';\n else\n return '';\n });\n }\n\n };\n\n /* Plot presentation related functions */\n let getBoundingBoxTransform = () => {\n // Center the view on the molecule(s) and scale it so that everything\n // fits in the window\n\n //no molecules, nothing to do\n if (self.graph.nodes.length === 0)\n return {'translate': [0,0], 'scale': 1};\n\n // Get the bounding box\n var minX = d3.min(self.graph.nodes.map(function(d) {return d.x;}));\n var minY = d3.min(self.graph.nodes.map(function(d) {return d.y;}));\n\n var maxX = d3.max(self.graph.nodes.map(function(d) {return d.x;}));\n var maxY = d3.max(self.graph.nodes.map(function(d) {return d.y;}));\n\n var maxRadius = d3.max(self.graph.nodes.map(function(d) { return d.radius; }));\n\n // The width and the height of the molecule\n var molWidth = maxX - minX;\n var molHeight = maxY - minY;\n\n // how much larger the drawing area is than the width and the height\n var widthRatio = self.options.svgW / (molWidth + 1);\n var heightRatio = self.options.svgH / (molHeight + 1);\n\n // we need to fit it in both directions, so we scale according to\n // the direction in which we need to shrink the most\n var minRatio = Math.min(widthRatio, heightRatio,\n self.options.maxNodeRadius / maxRadius) * 0.8;\n\n // the new dimensions of the molecule\n var newMolWidth = molWidth * minRatio;\n var newMolHeight = molHeight * minRatio;\n\n // translate so that it's in the center of the window\n var xTrans = -(minX) * minRatio + (self.options.svgW - newMolWidth) / 2;\n var yTrans = -(minY) * minRatio + (self.options.svgH - newMolHeight) / 2;\n\n return {'translate': [xTrans, yTrans], 'scale': minRatio};\n };\n\n self.centerView = function(duration = 0) {\n var bbTransform = getBoundingBoxTransform();\n\n if (bbTransform === null)\n return;\n\n // do the actual moving\n vis.transition().attr('transform',\n 'translate(' + bbTransform.translate + ')' + ' scale(' + bbTransform.scale + ')').duration(duration);\n\n // tell the zoomer what we did so that next we zoom, it uses the\n // transformation we entered here\n self.zoomer.translate(bbTransform.translate);\n self.zoomer.scale(bbTransform.scale);\n };\n\n self.setSize = (\n svgW = d3.select(element).node().offsetWidth,\n svgH = d3.select(element).node().offsetHeight\n ) => {\n // save width and height\n self.options.svgW = svgW;\n self.options.svgH = svgH;\n\n // set the viewBox\n svg.attr('viewBox', \"0 0 \" + svgW + \" \" + svgH)\n\n //Set the output range of the scales\n xScale.range([0, svgW]).domain([0, svgW]);\n yScale.range([0, svgH]).domain([0, svgH]);\n\n //re-attach the scales to the zoom behaviour\n self.zoomer.x(xScale)\n .y(yScale);\n self.brusher.x(xScale)\n .y(yScale);\n\n //resize the background\n svg.select('.background')\n .attr('width', svgW)\n .attr('height', svgH);\n\n // center the view\n self.centerView();\n }\n\n /* Style and color related functions */\n self.setOutlineColor = function(color) {\n var nodes = visNodes.selectAll('g.gnode').select('[node_type=nucleotide]');\n nodes.style('fill', color);\n }\n\n self.addCustomColors = function addCustomColors(json) {\n // Add a json file containing the custom colors\n self.customColors = json;\n self.changeColorScheme('custom');\n };\n\n self.addCustomColorsText = function(customColorsText) {\n let cs = new ColorScheme(customColorsText);\n self.customColors = cs.colorsJson;\n self.changeColorScheme('custom');\n };\n\n self.changeColorScheme = function(newColorScheme) {\n var proteinNodes = visNodes.selectAll('[node_type=protein]');\n\n proteinNodes.classed(fstyle.node, true)\n .attr('r', function(d) { return d.radius; });\n\n var gnodes = visNodes.selectAll('g.gnode');\n var circles = visNodes.selectAll('g.gnode').selectAll('circle');\n var nodes = visNodes.selectAll('g.gnode').select('[node_type=nucleotide]');\n self.colorScheme = newColorScheme;\n\n\n if (newColorScheme == 'sequence') {\n var scale = d3.scale.ordinal()\n .range(['#dbdb8d', '#98df8a', '#ff9896', '#aec7e8', '#aec7e8'])\n .domain(['A','C','G','U','T']);\n nodes.style('fill', function(d) {\n return scale(d.name);\n });\n\n } else if (newColorScheme == 'structure') {\n var scale = d3.scale.category10()\n .domain(['s','m','i','e','t','h','x'])\n .range(['lightgreen', '#ff9896', '#dbdb8d', 'lightsalmon',\n 'lightcyan', 'lightblue', 'transparent']);\n\n nodes.style('fill', function(d) {\n return scale(d.elemType);\n });\n\n } else if (newColorScheme == 'positions') {\n nodes.style('fill', function(d) {\n var scale = d3.scale.linear()\n .range(['#98df8a', '#dbdb8d', '#ff9896'])\n .interpolate(d3.interpolateLab)\n .domain([1, 1 + (d.rna.rnaLength - 1) / 2, d.rna.rnaLength]);\n\n return scale(d.num);\n });\n } else if (newColorScheme == 'custom') {\n // scale to be used in case the user passes scalar\n // values rather than color names\n if (typeof self.customColors != 'undefined' &&\n 'domain' in self.customColors &&\n 'range' in self.customColors) {\n var scale = d3.scale.linear()\n .interpolate(d3.interpolateLab)\n .domain(self.customColors.domain)\n .range(self.customColors.range);\n }\n\n let changeColors = (moleculeColors, d, scale) => {\n if (moleculeColors.hasOwnProperty(d.num)) {\n let val = parseFloat(moleculeColors[d.num]);\n\n if (isNaN(val)) {\n // passed in color is not a scalar, so\n // treat it as a color\n return moleculeColors[d.num];\n } else {\n // the user passed in a float, let's use a colormap\n // to convert it to a color\n return scale(val);\n }\n } else {\n return 'white';\n }\n }\n\n nodes.style('fill', function(d) {\n if (typeof self.customColors == 'undefined' ||\n !self.customColors.hasOwnProperty('colorValues')) {\n return 'white';\n }\n\n if (self.customColors.colorValues.hasOwnProperty(d.structName) &&\n self.customColors.colorValues[d.structName].hasOwnProperty(d.num)) {\n // if a molecule name is specified, it supercedes the default colors\n // (for which no molecule name has been specified)\n let moleculeColors = self.customColors.colorValues[d.structName];\n return changeColors(moleculeColors, d, scale);\n } else if (self.customColors.colorValues.hasOwnProperty('')) {\n let moleculeColors = self.customColors.colorValues[''];\n return changeColors(moleculeColors, d, scale);\n }\n\n return 'white';\n });\n }\n };\n\n let updateStyle = () => {\n // Numbering\n visNodes.selectAll('[node_type=label]').classed(fstyle.transparent, !self.displayParameters.displayNumbering);\n visNodes.selectAll('[label_type=label]').classed(fstyle.transparent, !self.displayParameters.displayNumbering);\n visLinks.selectAll('[link_type=label_link]').classed(fstyle.transparent, !self.displayParameters.displayNumbering);\n // Node Outline\n svg.selectAll('[node_type=nucleotide]').classed(fstyle.transparent, !self.displayParameters.displayNodeOutline);\n // Node Labels\n visNodes.selectAll('[label_type=nucleotide]').classed(fstyle.transparent, !self.displayParameters.displayNodeLabel);\n // Links\n svg.selectAll('[link_type=real],[link_type=basepair],[link_type=backbone],[link_type=pseudoknot],[link_type=protein_chain],[link_type=chain_chain],[link_type=external]').classed(fstyle.transparent, !self.displayParameters.displayLinks);\n // Pseudoknot Links\n svg.selectAll('[link_type=pseudoknot]').classed(fstyle.transparent, !self.displayParameters.displayPseudoknotLinks);\n // Protein Links\n svg.selectAll('[link_type=protein_chain]').classed(fstyle.transparent, !self.displayParameters.displayProteinLinks);\n // Fake Links\n visLinks.selectAll('[link_type=fake]').classed(fstyle.transparent, !self.options.displayAllLinks);\n visLinks.selectAll('[link_type=fake_fake]').classed(fstyle.transparent, !self.options.displayAllLinks);\n // direction Arrows\n svg.selectAll('.' + fstyle.directionArrow).classed(fstyle.transparent, !self.displayParameters.displayDirectionArrows);\n };\n\n /* RNA edditing related functions */\n let changeNode = function(nodeName, referenceNode) {\n // change the label of a node\n let rna = referenceNode.rna;\n\n let dotbracket = rnaUtilities.pairtableToDotbracket(rna.pairtable);\n let positions = rna.getPositions('nucleotide');\n let sequence = rna.seq\n let uids = rna.getUids();\n\n let newNodeNum = referenceNode.num;\n\n let newDotbracket = dotbracket;\n let newSequence = sequence.slice(0,newNodeNum-1) + nodeName + sequence.slice(newNodeNum);\n\n console.log('newSequence:', newSequence);\n\n console.log('uids:', uids);\n uids.splice(newNodeNum-1, 1, slugid.nice());\n let newPositions = positions;\n\n delete self.rnas[rna.uid];\n let newRNA = self.addRNA(newDotbracket, {'sequence': newSequence,\n 'positions': newPositions,\n 'uids': uids,\n 'centerView': false});\n }\n\n let insertNodeBeforeOrAfter = function(nodeName, referenceNode, positionOffset) {\n //insert a new node before or after another one\n //positionOffset specifies who far from the original to insert the new node\n let rna = referenceNode.rna;\n\n let dotbracket = rnaUtilities.pairtableToDotbracket(rna.pairtable);\n let positions = rna.getPositions('nucleotide');\n let sequence = rna.seq\n let uids = rna.getUids();\n\n let newNodeNum = referenceNode.num + positionOffset;\n\n let newDotbracket = dotbracket.slice(0,newNodeNum) + '.' + dotbracket.slice(newNodeNum);\n let newSequence = sequence.slice(0,newNodeNum) + nodeName + sequence.slice(newNodeNum);\n\n console.log('newSequence:', newSequence);\n\n uids.splice(newNodeNum, 0, slugid.nice());\n positions.splice(newNodeNum, 0, positions[newNodeNum - positionOffset-1]);\n\n let newUids = uids;\n let newPositions = positions;\n\n console.log('positions:', positions);\n console.log('new node positions:', newPositions);\n\n delete self.rnas[rna.uid];\n let newRNA = self.addRNA(newDotbracket, {'sequence': newSequence,\n 'positions': newPositions,\n 'uids': newUids,\n 'centerView': false});\n }\n\n let deleteNode = function(node) {\n console.log('deleting...', node);\n // get the dotbracket string for this rna\n let rna = node.rna;\n let pair = rna.pairtable[node.num];\n\n // remove basepairs for this node\n if (pair != 0) {\n rna.pairtable[node.num] = 0;\n rna.pairtable[pair] = 0;\n }\n\n let dotbracket = rnaUtilities.pairtableToDotbracket(rna.pairtable);\n let positions = rna.getPositions('nucleotide');\n let sequence = rna.seq\n let uids = rna.getUids();\n\n let newDotbracket = dotbracket.slice(0, node.num-1) + dotbracket.slice(node.num)\n let newPositions = positions.slice(0, node.num-1)\n .concat(positions.slice(node.num));\n let newSequence = sequence.slice(0, node.num-1) + sequence.slice(node.num)\n let newUids = uids.slice(0, node.num-1)\n .concat(uids.slice(node.num));\n\n delete self.rnas[rna.uid];\n let newRNA = self.addRNA(newDotbracket, {'sequence': newSequence,\n 'positions': newPositions,\n 'uids': newUids,\n 'centerView': false});\n\n console.log('new dotbracket:', newDotbracket);\n //recalculateGraph();\n\n //remove backbone links associated with this node\n\n //remove this node\n\n }\n\n let elementKey = (d) => {\n return d.uid;\n };\n\n let updateRnaGraph = function(r) {\n let nucleotidePositions = r.getPositions('nucleotide');\n let labelPositions = r.getPositions('label');\n\n let uids = r.getUids();\n\n r.recalculateElements()\n .elementsToJson()\n .addPseudoknots()\n .addPositions('nucleotide', nucleotidePositions)\n .addUids(uids)\n .addLabels(1, self.options.labelInterval)\n .addPositions('label', labelPositions)\n .reinforceStems()\n .reinforceLoops()\n .updateLinkUids();\n };\n\n let removeBackBoneLink = function(d) {\n if (d.target.num - d.source.num != 1) {\n console.log('ERROR: non adjacent nodes. Target:', d.target,\n 'Source:', d.source, 'Link:', d);\n return;\n }\n\n let rna = d.target.rna;\n let toRemove = [];\n\n for (let i = 0; i < rna.links.length; i++) {\n let link = rna.links[i];\n\n if (link.linkType != 'basepair')\n continue;\n\n if (link.source.num <= d.source.num && link.target.num >= d.target.num) {\n console.log('crossing basepair', link);\n toRemove.push(link);\n }\n }\n\n\n // Remove all base pairs that are between these two nodes and add them as extra\n // links\n console.log('toRemove:', toRemove);\n\n for (let i = 0; i < toRemove.length; i++) {\n rna.pairtable[toRemove[i].source.num] = 0;\n rna.pairtable[toRemove[i].target.num] = 0;\n\n toRemove[i].from = toRemove[i].source.num;\n toRemove[i].to = toRemove[i].target.num - d.source.num;\n }\n\n // extract the dotbracket string of the rna\n // cut it at the position of this backbone bond\n let sequence = rna.seq;\n let sequence1 = rna.seq.slice(0, d.source.num);\n let sequence2 = rna.seq.slice(d.source.num);\n\n let rnaDotBracket = rnaUtilities.pairtableToDotbracket(rna.pairtable);\n let dotBracket1 = rnaDotBracket.slice(0, d.source.num);\n let dotBracket2 = rnaDotBracket.slice(d.source.num)\n\n // get the nucleotide positions\n // cut them at the positions of the backbone bond\n let positions = rna.getPositions('nucleotide')\n let uids = rna.getUids();\n\n let positions1 = positions.slice(0, d.source.num);\n let positions2 = positions.slice(d.source.num);\n\n let uids1 = uids.slice(0, d.source.num);\n let uids2 = uids.slice(d.source.num);\n\n console.log('positions1:', positions1);\n console.log('positions2:', positions2);\n\n delete self.rnas[rna.uid];\n let rna1 = self.addRNA(dotBracket1, { 'sequence': sequence1,\n 'positions': positions1,\n 'uids': uids1 });\n let rna2 = self.addRNA(dotBracket2, { 'sequence': sequence2,\n 'positions': positions2,\n 'uids': uids2 });\n for (let i = 0; i < toRemove.length; i++) {\n console.log('rna1:', rna1);\n console.log('rna2:', rna2);\n console.log('toRemove[i]', toRemove[i]);\n self.extraLinks.push(\n {'source': rna1.nodes[toRemove[i].from-1],\n 'target': rna2.nodes[toRemove[i].to-1],\n 'value': 1,\n 'uid': slugid.nice(),\n 'linkType': 'intermolecule'});\n recalculateGraph();\n self.update();\n\n }\n console.log('self.extraLinks:', self.extraLinks);\n //self.extraLinks.push({'source': rna1.nodes[\n\n // create two new rnas\n // add their positions\n // add them back to the plot\n }\n\n let splitMultiStrand = function(rna) {\n // split a multi strand RNA into its individual strands\n // get the position of the '&' character in the dotbracket string\n let breakPositions = [];\n for (let i = 0; i < rna.dotbracket.length; i++) {\n if (rna.dotbracket[i] == '&') {\n breakPositions.push(i);\n }\n }\n\n let toRemove = [];\n // collect all the base pairs that are between split strands\n for (let i = 0; i < rna.links.length; i++) {\n let link = rna.links[i];\n\n if (link.linkType != 'basepair')\n continue; // only consider base pairs\n \n for (let j = 0; j < breakPositions.length; j++) {\n let node = rna.nodes[breakPositions[j]]; // take the split node\n // take the two links that connect the split node \n let linkSource = rna.links.filter(link => link.source === node)[0];\n let linkTarget = rna.links.filter(link => link.target === node)[0];\n if (link.source.num <= linkSource.source.num && link.target.num >= linkTarget.target.num) {\n console.log('crossing basepair', link);\n link.breakFrom = 0;\n // find the strand that the source is in\n for (let k = 0; k < breakPositions.length - 1; k++) {\n if (link.source.num > breakPositions[k] && link.source.num < breakPositions[k+1])\n link.breakFrom = k+1;\n }\n // find the strand that the target is in\n link.breakTo = j+1; \n link.from = link.source.num;\n // find the position of the source in the strand\n if (link.breakFrom > 0) link.from -= breakPositions[link.breakFrom-1] + link.breakFrom;\n // find the position of the target in the strand\n link.to = link.target.num - linkTarget.target.num;\n toRemove.push(link);\n }\n }\n }\n\n\n // Remove all base pairs that are between these two nodes and add them as extra\n // links\n console.log('toRemove:', toRemove);\n let sequences = rna.seq.split('&');\n\n // remove the base pairs\n for (let i = 0; i < toRemove.length; i++) {\n rna.pairtable[toRemove[i].source.num] = 0;\n rna.pairtable[toRemove[i].target.num] = 0;\n }\n\n // extract the dotbracket string of the rna\n // cut it at the position of this backbone bond\n console.log('sequences:', sequences);\n\n let rnaDotBracket = rnaUtilities.pairtableToDotbracket(rna.pairtable);\n let dotbrackets = []; // array to hold the dotbracket strings of the individual strands\n let rnaPositions = rna.getPositions('nucleotide') // get the nucleotide positions, cut them at the positions of the backbone bond\n let positions = [];\n let rnaUids = rna.getUids();\n let uids = [];\n let lastBreak = 0; // the position of the last break\n for (let i = 0; i <= breakPositions.length; i++) {\n // cut the dotbracket\n dotbrackets.push(rnaDotBracket.slice(lastBreak, breakPositions[i]));\n // add the positions\n positions.push(rnaPositions.slice(lastBreak, breakPositions[i]));\n // add the uids\n uids.push(rnaUids.slice(lastBreak, breakPositions[i]));\n lastBreak = breakPositions[i] + 1;\n }\n\n console.log('positions:', positions);\n\n delete self.rnas[rna.uid];\n let newRnas = [];\n for (let i = 0; i < sequences.length; i++) {\n let newRna = self.addRNA(dotbrackets[i], { 'sequence': sequences[i],\n 'positions': positions[i], \n 'uids': uids[i] });\n newRnas.push(newRna);\n }\n // add the extra links\n for (let i = 0; i < toRemove.length; i++) {\n console.log('toRemove[i]', toRemove[i]);\n self.extraLinks.push(\n {'source': newRnas[toRemove[i].breakFrom].nodes[toRemove[i].from-1],\n 'target': newRnas[toRemove[i].breakTo].nodes[toRemove[i].to-1],\n 'value': 1,\n 'uid': slugid.nice(),\n 'linkType': 'intermolecule'});\n recalculateGraph();\n self.update();\n }\n console.log('self.extraLinks:', self.extraLinks);\n }\n\n var removeLink = function(d) {\n // remove a link between two nodes\n let index = self.graph.links.indexOf(d);\n console.log('removing link:', index);\n\n if (index > -1) {\n //remove a link\n //graph.links.splice(index, 1);\n\n // there should be two cases\n // 1. The link is within a single molecule\n\n if (d.source.rna == d.target.rna) {\n if (d.linkType == 'backbone') {\n console.log('trying to remove a backbone link', d.source.num, d.target.num);\n removeBackBoneLink(d);\n return;\n } else {\n let r = d.source.rna;\n r.addPseudoknots();\n r.pairtable[d.source.num] = 0;\n r.pairtable[d.target.num] = 0;\n\n updateRnaGraph(r);\n }\n } else {\n // 2. The link is between two different molecules\n let extraLinkIndex = self.extraLinks.indexOf(d);\n\n self.extraLinks.splice(extraLinkIndex, 1);\n }\n recalculateGraph();\n }\n self.update();\n };\n\n let addBackBoneLink = function(newLink) {\n // opposite of deleting a link\n // get the two dotbracket strings\n let rna1 = newLink.target.rna;\n let rna2 = newLink.source.rna;\n if (newLink.target.num == 1) {\n rna1 = newLink.source.rna;\n rna2 = newLink.target.rna;\n }\n\n let dotbracket1 = rnaUtilities.pairtableToDotbracket(rna1.pairtable);\n let dotbracket2 = rnaUtilities.pairtableToDotbracket(rna2.pairtable);\n\n let seq1 = rna1.seq;\n let seq2 = rna2.seq;\n\n let positions1 = rna1.getPositions('nucleotide');\n let positions2 = rna2.getPositions('nucleotide');\n\n // concatenate them\n let newDotbracket = dotbracket1 + dotbracket2;\n let newSeq = seq1 + seq2;\n let newPositions = positions1.concat(positions2);\n\n let toAddInternal = [];\n let toAddExternal = [];\n let toDelete = {};\n\n for (let i = 0; i < self.extraLinks.length; i++) {\n console.log('self.extraLinks[i]', self.extraLinks[i]);\n console.log('rna1:', rna1);\n console.log('rna2:', rna2);\n if (self.extraLinks[i].source.rna == rna1) {\n if ( self.extraLinks[i].target.rna == rna2) {\n // both ends of the extra link are within what will become the new molecule\n // need to be added as base pairs afterwards\n //self.extraLinks[i].from = self.extraLinks[i].source.num;\n //self.extraLinks[i].to = dotbracket1.length + self.extraLinks[i].target.num;\n //toAddInternal.push(self.extraLinks[i]);\n } else {\n // only one end of the extra link is within what will become the newly\n // created molecule, needs to remain an extra link\n // source will always be the unchanged molecule, whereas target will be\n // the newly created one\n toAddExternal.push({\n 'source': self.extraLinks[i].target,\n 'target': self.extraLinks[i].source.num\n });\n\n toDelete[self.extraLinks[i].uid] = true;\n }\n } else if (self.extraLinks[i].source.rna == rna2) {\n if ( self.extraLinks[i].target.rna == rna1) {\n // add internal link\n // both ends of the extra link are within what will become the new molecule\n // need to be added as base pairs afterwards\n //self.extraLinks[i].from = self.extraLinks[i].target.num;\n //self.extraLinks[i].to = dotbracket1.length + self.extraLinks[i].source.num;\n\n //toAddInternal.push(self.extraLinks[i]);\n } else {\n toAddExternal.push({\n 'source': self.extraLinks[i].target,\n 'target': self.extraLinks[i].source.num + dotbracket1.length\n });\n toDelete[self.extraLinks[i].uid] = true;\n }\n }\n\n if (self.extraLinks[i].target.rna == rna1) {\n if (self.extraLinks[i].source.rna == rna2) {\n // covered in previous if statement\n } else {\n // only one end of the extra link is within what will become the newly\n // created molecule, needs to remain an extra link\n toAddExternal.push({\n 'source': self.extraLinks[i].source,\n 'target': self.extraLinks[i].target.num\n });\n\n toDelete[self.extraLinks[i].uid] = true;\n }\n } else if (self.extraLinks[i].target.rna == rna2) {\n if (self.extraLinks[i].source.rna == rna1) {\n toAddExternal.push({\n 'source': self.extraLinks[i].source,\n 'target': self.extraLinks[i].target.num + dotbracket1.length\n });\n\n toDelete[self.extraLinks[i].uid] = true;\n }\n }\n }\n\n\n self.extraLinks = self.extraLinks.filter((e) => { return !(e.uid in toDelete) });\n\n delete self.rnas[rna1.uid];\n delete self.rnas[rna2.uid];\n\n let newRna = null;\n // create a new RNA\n if (self.options.animation)\n newRna = self.addRNA(newDotbracket, { 'sequence': newSeq,\n 'positions': newPositions,\n 'centerView': false});\n else\n newRna = self.addRNA(newDotbracket, { 'sequence': newSeq,\n 'centerView': false });\n\n\n\n // add new external links\n for (let i = 0; i < toAddExternal.length; i++) {\n self.extraLinks.push({\n 'source': toAddExternal[i].source,\n 'target': newRna.nodes[toAddExternal[i].target-1],\n 'value': 1,\n 'uid': slugid.nice(),\n 'linkType': 'intermolecule'\n });\n }\n\n recalculateGraph();\n self.update();\n console.log('self.extraLinks:', self.extraLinks);\n };\n\n function nudge(dx, dy) {\n // TODO currently unused\n node.filter(function(d) { return d.selected; })\n .attr('cx', function(d) { return d.x += dx; })\n .attr('cy', function(d) { return d.y += dy; });\n\n link.filter(function(d) { return d.source.selected; })\n .attr('x1', function(d) { return d.source.x; })\n .attr('y1', function(d) { return d.source.y; });\n\n link.filter(function(d) { return d.target.selected; })\n .attr('x2', function(d) { return d.target.x; })\n .attr('y2', function(d) { return d.target.y; });\n\n d3.event.preventDefault();\n }\n\n let nodeMouseup = function(d,i) {\n console.log(\"nodeMouseup\")\n let backbonePossible = true, basepairPossible = true;\n\n if (mousedownNode) {\n mouseupNode = d;\n\n // if the node isn't a nucleotide, we can't create a link\n if (mouseupNode.nodeType == 'middle' || mousedownNode.nodeType == 'middle' || mouseupNode.nodeType == 'label' || mousedownNode.nodeType == 'label')\n return;\n\n if (mouseupNode == mousedownNode) { resetMouseVars(); return; }\n let newLink = {source: mousedownNode, target: mouseupNode, linkType: 'basepair', value: 1, uid: slugid.nice()};\n\n for (let i = 0; i < self.graph.links.length; i++) {\n if ((self.graph.links[i].source == mousedownNode) ||\n (self.graph.links[i].target == mousedownNode) ||\n (self.graph.links[i].source == mouseupNode) ||\n (self.graph.links[i].target == mouseupNode)) {\n // either one of the nodes is already in a link\n\n // if any of the nodes are already involved in a basepair or a pseudoknot\n // then we can't make a basepair link\n if (self.graph.links[i].linkType == 'basepair' ||\n self.graph.links[i].linkType == 'pseudoknot' ||\n self.graph.links[i].linkType == 'intermolecule') {\n // although should be able to make a backbone link\n console.log('no basepair possible');\n basepairPossible = false;\n }\n }\n\n if (((self.graph.links[i].source == mouseupNode) &&\n (self.graph.links[i].target == mousedownNode)) ||\n ((self.graph.links[i].source == mousedownNode) &&\n (self.graph.links[i].target == mouseupNode))) {\n\n // if we're trying to make a link between two nodes which already have\n // a backbone between them, then we can't make a link\n if (self.graph.links[i].linkType == 'backbone') {\n return;\n }\n }\n }\n\n\n if (newLink.source.rna != newLink.target.rna) {\n // could be either a backbone link or an intermolecule link\n\n if ((newLink.source.num == 1 &&\n newLink.target.num == newLink.target.rna.rnaLength) ||\n (newLink.target.num == 1 &&\n newLink.source.num == newLink.source.rna.rnaLength)) {\n //\n let linkMenu = [\n {\n title: 'Backbone Link',\n action: function(elm, d, i) {\n linkContextMenuShown = false;\n console.log('Item #1 clicked!');\n console.log('The data for this circle is: ' + d);\n dragLine.attr('class', fstyle.transparent);\n addBackBoneLink(newLink);\n },\n disabled: false // optional, defaults to false\n },\n {\n title: 'Basepair Link',\n action: function(elm, d, i) {\n linkContextMenuShown = false;\n console.log('You have clicked the second item!');\n console.log('The data for this circle is: ' + d);\n dragLine.attr('class', fstyle.transparent);\n self.addLink(newLink);\n }\n }\n ]\n linkContextMenuShown = true;\n let linkContextMenu = contextMenu(linkMenu);\n console.log('newLinkMenu');\n linkContextMenu.apply(this, [d,i,true,\n function() { dragLine.attr('class', fstyle.transparent) }]);\n } else {\n // between end points but can't make a backbone\n if (basepairPossible)\n self.addLink(newLink);\n }\n } else {\n if (basepairPossible)\n self.addLink(newLink);\n }\n\n }\n };\n\n let nodeMousedown = function(d) {\n console.log(\"nodeMousedown\")\n if (!d.selected && !ctrlKeydown) {\n // if this node isn't selected, then we have to unselect every other node\n deselectAllNodes()\n }\n\n if (!shiftKeydown) {\n // only without shift, toggle select or select\n if (ctrlKeydown) {\n toggleSelectNode(d)\n } else {\n selectNode(d)\n }\n }\n\n if (shiftKeydown && self.options.editable) {\n // with shift key and editable continue to draw dragline\n mousedownNode = d;\n\n dragLine\n .attr('class', fstyle.dragLine)\n .attr('x1', mousedownNode.x)\n .attr('y1', mousedownNode.y)\n .attr('x2', mousedownNode.x)\n .attr('y2', mousedownNode.y);\n\n d3.event.stopPropagation();\n }\n };\n\n let linkClick = (d) => {\n if (!shiftKeydown) {\n return;\n }\n\n var invalidLinks = { //'backbone': true,\n 'fake': true,\n 'fake_fake': true,\n 'label_link': true};\n\n console.log('d.linkType:', d.linkType);\n if (d.linkType in invalidLinks )\n return;\n\n removeLink(d);\n };\n\n /* I/O functions */\n self.toJSON = function toJSON() {\n var data = {'rnas': self.rnas, 'extraLinks': self.extraLinks};\n var dataString = JSON.stringify(data, function(key, value) {\n //remove circular references\n if (key == 'rna') {\n return;\n } else {\n return value;\n }\n }, '\\t');\n return dataString;\n };\n\n self.fromJSON = function(jsonString) {\n var rnas, extraLinks;\n\n try{\n var data = JSON.parse(jsonString);\n rnas = data.rnas;\n extraLinks = data.extraLinks;\n } catch(err) {\n throw err;\n }\n\n for (var uid in rnas) {\n if (rnas[uid].type == 'rna') {\n r = new RNAGraph();\n\n r.seq = rnas[uid].seq;\n r.dotbracket = rnas[uid].dotbracket;\n r.circular = rnas[uid].circular;\n r.pairtable = rnas[uid].pairtable;\n r.uid = rnas[uid].uid;\n r.structName = rnas[uid].structName;\n r.nodes = rnas[uid].nodes;\n r.links = rnas[uid].links;\n r.rnaLength = rnas[uid].rnaLength;\n r.elements = rnas[uid].elements;\n r.nucsToNodes = rnas[uid].nucsToNodes;\n r.pseudoknotPairs = rnas[uid].pseudoknotPairs;\n } else {\n r = new ProteinGraph();\n r.size = rnas[uid].size;\n r.nodes = rnas[uid].nodes;\n r.uid = rnas[uid].uid;\n }\n\n self.addRNAJSON(r, false);\n }\n\n extraLinks.forEach(function(link) {\n self.extraLinks.push(link);\n });\n\n recalculateGraph();\n self.update();\n };\n\n self.addRNA = function(structure, passedOptions = {}) {\n let rnaJson = createInitialLayout(structure, passedOptions);\n let centerView = false;\n\n /*\n * Code to display the JSONs representing the structure\n *\n rnaJson.nodes[0].rna = null;\n rnaJson.nodes[0].nextNode = null;\n\n rnaJson.links[0].source = null;\n rnaJson.links[0].target = null;\n\n console.log(rnaJson.nodes[0]);\n console.log(rnaJson.links[0]);\n console.log(JSON.stringify(rnaJson.nodes[0],null,2));\n console.log(JSON.stringify(rnaJson.links[0],null,2));\n */\n\n if ('extraLinks' in passedOptions) {\n // presumably the passed in links are within the passed molecule\n let newLinks = self.addExternalLinks(rnaJson, passedOptions.extraLinks);\n\n self.extraLinks = self.extraLinks.concat(newLinks);\n }\n\n if ('centerPos' in passedOptions)\n self.addRNAJSON(rnaJson, {centerPos: passedOptions.centerPos,\n centerView: false})\n else if ('avoidOthers' in passedOptions)\n self.addRNAJSON(rnaJson, {avoidOthers: passedOptions.avoidOthers});\n else\n self.addRNAJSON(rnaJson, {centerView: passedOptions.centerView});\n\n // if the structure containes multistrands, let's split before the '&'\n console.log('structure:', structure);\n if (structure.indexOf('&') !== -1 && structure != '&' && structure.indexOf('&') !== 0) {\n console.log('splitting multistrand');\n splitMultiStrand(rnaJson);\n return;\n };\n return rnaJson;\n };\n\n self.addRNAJSON = function(rnaGraph,\n { avoidOthers = false,\n centerPos = null,\n centerView = true}\n ) {\n // Add an RNAGraph, which contains nodes and links as part of the\n // structure\n // Each RNA will have uid to identify it\n // when it is modified, it is replaced in the global list of RNAs\n //\n var maxX, minX;\n //console.log('centerView:', centerView);\n\n if (centerPos != null) {\n // center the newly created RNA at a given position\n let totalX = 0;\n let totalY = 0;\n let nodeCount = 0;\n\n rnaGraph.nodes.forEach(function(node) {\n totalX += node.x;\n totalY += node.y;\n nodeCount += 1;\n });\n\n if (nodeCount > 0) {\n // center the nodes at centerPos\n\n rnaGraph.nodes.forEach(function(node) {\n node.x = node.x + centerPos[0] - totalX / nodeCount;\n node.y = node.y + centerPos[1] - totalY / nodeCount;\n\n node.px = node.x;\n node.py = node.y;\n });\n }\n }\n\n if (avoidOthers) {\n if (self.graph.nodes.length > 0)\n maxX = d3.max(self.graph.nodes.map(function(d) { return d.x; }));\n else\n maxX = 0;\n\n minX = d3.min(rnaGraph.nodes.map(function(d) { return d.x; }));\n\n rnaGraph.nodes.forEach(function(node) {\n node.x += (maxX - minX) + 20;\n node.px += (maxX - minX);\n });\n }\n\n rnaGraph.nodes.forEach(function(node) {\n node.rna = rnaGraph;\n });\n\n self.rnas[rnaGraph.uid] = rnaGraph;\n recalculateGraph();\n\n self.update();\n\n if (centerView)\n self.centerView();\n\n return rnaGraph;\n };\n\n self.addNodes = function addNodes(json) {\n // add a new set of nodes from a json file\n\n // Resolve the sources and targets of the links so that they\n // are not just indeces into an array\n json.links.forEach(function(entry) {\n if (typeof entry.source == 'number') entry.source = json.nodes[entry.source];\n if (typeof entry.target == 'number') entry.target = json.nodes[entry.target];\n });\n\n // Get the maximum x and y values of the current graph\n // so that we don't place a new structure on top of the\n // old one\n if (self.graph.nodes.length > 0) {\n maxX = d3.max(self.graph.nodes.map(function(d) {return d.x;}));\n maxY = d3.max(self.graph.nodes.map(function(d) {return d.y;}));\n } else {\n maxX = 0;\n maxY = 0;\n }\n\n json.nodes.forEach(function(entry) {\n if (!(entry.rna.uid in self.rnas)) {\n self.rnas[entry.rna.uid] = entry.rna;\n }\n\n entry.x += maxX;\n //entry.y += maxY;\n\n entry.px += maxX;\n //entry.py += maxY;\n });\n\n r = new RNAGraph('','');\n r.nodes = json.nodes;\n r.links = json.links;\n\n //self.addRNA(r);\n recalculateGraph();\n\n self.update();\n self.centerView();\n };\n\n self.clearNodes = () => {\n self.graph.nodes = [];\n self.graph.links = [];\n\n self.rnas = {};\n self.extraLinks = [];\n\n self.update();\n };\n\n self.addLink = function(newLink) {\n // this means we have a new json, which means we have\n // to recalculate the structure and change the colors\n // appropriately\n //\n console.log('adding new link');\n if (newLink.source.rna == newLink.target.rna) {\n // must be a basepair\n let r = newLink.source.rna;\n\n r.pairtable[newLink.source.num] = newLink.target.num;\n r.pairtable[newLink.target.num] = newLink.source.num;\n\n updateRnaGraph(r);\n\n } else {\n //Add an extra link\n console.log('intermolecule');\n newLink.linkType = 'intermolecule';\n self.extraLinks.push(newLink);\n }\n recalculateGraph();\n self.update();\n };\n\n self.addExternalLinks = function(rnaJson, externalLinks) {\n let newLinks = [];\n\n for (let i = 0; i < externalLinks.length; i++) {\n let newLink = {linkType: 'external', value: 1, uid: slugid.nice(),\n source: null, target: null};\n // check if the source node is an array\n if (Object.prototype.toString.call(externalLinks[i][0]) === '[object Array]') {\n for (let j = 0; j < rnaJson.nodes.length; j++) {\n if ('nucs' in rnaJson.nodes[j]) {\n if (rnaJson.nodes[j].nucs.equals(externalLinks[i][0])) {\n newLink.source = rnaJson.nodes[j];\n break;\n }\n }\n }\n } else {\n for (let j = 0; j < rnaJson.nodes.length; j++) {\n if (rnaJson.nodes[j].num == externalLinks[i][0]) {\n newLink.source = rnaJson.nodes[j];\n }\n }\n }\n\n // check if the target node is an array\n if (Object.prototype.toString.call(externalLinks[i][1]) === '[object Array]') {\n for (let j = 0; j < rnaJson.nodes.length; j++) {\n if ('nucs' in rnaJson.nodes[j]) {\n if (rnaJson.nodes[j].nucs.equals(externalLinks[i][1])) {\n newLink.target = rnaJson.nodes[j];\n }\n }\n }\n } else {\n for (let j = 0; j < rnaJson.nodes.length; j++) {\n if (rnaJson.nodes[j].num == externalLinks[i][1]) {\n newLink.target = rnaJson.nodes[j];\n }\n }\n }\n\n if (newLink.source == null || newLink.target == null) {\n console.log('ERROR: source or target of new link not found:', newLink, externalLinks[i]);\n continue;\n }\n\n newLinks.push(newLink);\n }\n\n return newLinks;\n };\n\n self.getStructuresDotBracket = function() {\n console.log('self.rnas:', self.rnas);\n let sequence = [];\n let currIdx = 1;\n let nodeIdxs = {};\n let breaks = [];\n let pairtable = [];\n\n // add the nodes\n for (let uid in self.rnas) {\n let rna = self.rnas[uid];\n\n for (let j = 0; j < rna.nodes.length; j++) {\n let node = rna.nodes[j];\n\n if (node.nodeType != 'nucleotide')\n continue;\n\n // console.log('node:', node);\n nodeIdxs[node.uid] = currIdx;\n currIdx += 1;\n\n sequence.push(node.name);\n }\n\n breaks.push(currIdx);\n }\n\n pairtable = [currIdx-1]\n for (let i = 0; i < currIdx; i++)\n pairtable.push(0)\n\n // add the links\n for (let uid in self.rnas) {\n let rna = self.rnas[uid];\n\n for (let j = 0; j < rna.links.length; j++) {\n let link = rna.links[j];\n\n if (link.linkType != 'basepair')\n continue;\n\n let idx1 = nodeIdxs[link.source.uid];\n let idx2 = nodeIdxs[link.target.uid];\n pairtable[idx1] = idx2;\n pairtable[idx2] = idx1;\n }\n }\n\n for (let i = 0; i < self.extraLinks.length; i++) {\n let link = self.extraLinks[i];\n\n let idx1 = nodeIdxs[link.source.uid];\n let idx2 = nodeIdxs[link.target.uid];\n\n pairtable[idx1] = idx2;\n pairtable[idx2] = idx1;\n }\n\n let structure = rnaUtilities.pairtableToDotbracket(pairtable).split('');\n\n for (let i = 0; i < breaks.length - 1; i++) {\n console.log('breaks[i]:', breaks[i]);\n sequence.splice(breaks[i] + i - 1, 0, '&');\n structure.splice(breaks[i] + i - 1, 0, '&');\n }\n\n console.log('sequence:', sequence, sequence.join(''));\n console.log('structure:', structure, structure.join(''));\n return [sequence.join(''), structure.join('')];\n };\n\n /* APIs */\n self.startAnimation = function() {\n self.options.animation = true;\n vis.selectAll('g.gnode')\n .call(drag);\n self.force.start();\n };\n\n self.stopAnimation = function() {\n self.options.animation = false;\n vis.selectAll('g.gnode')\n .on('mousedown.drag', null);\n self.force.stop();\n };\n\n self.resumeForce = function() {\n if (self.options.animation)\n self.force.resume();\n };\n\n self.setFriction = function(value) {\n self.force.friction(value);\n self.resumeForce();\n };\n\n self.setCharge = function(value) {\n self.force.charge(value);\n self.resumeForce();\n };\n\n self.setGravity = function(value) {\n self.force.gravity(value);\n self.resumeForce();\n };\n\n self.setPseudoknotStrength = function(value) {\n self.linkStrengths.pseudoknot = value;\n self.update();\n };\n\n self.displayNumbering = function(value) {\n self.displayParameters.displayNumbering = value;\n updateStyle();\n };\n\n self.displayNodeOutline = function(value) {\n self.displayParameters.displayNodeOutline = value;\n updateStyle();\n };\n\n self.displayNodeLabel = function(value) {\n self.displayParameters.displayNodeLabel = value;\n updateStyle();\n };\n\n self.displayLinks = function(value) {\n self.displayParameters.displayLinks = value;\n updateStyle();\n };\n\n self.displayPseudoknotLinks = function(value) {\n self.displayParameters.displayPseudoknotLinks = value;\n updateStyle();\n };\n\n self.displayProteinLinks = function(value) {\n self.displayParameters.displayProteinLinks = value;\n updateStyle();\n };\n\n self.displayDirectionArrows = function(value) {\n self.displayParameters.displayDirectionArrows = value;\n updateStyle();\n };\n}\n","import {RNAGraph} from './rnagraph.js';\n\nimport {simpleXyCoordinates} from './simplernaplot.js';\nimport {NAView} from './naview/naview.js'\n\nimport fstyle from './fornac.css';\n\nexport function rnaPlot(passedOptions = {}) {\n var options = {\n 'width': 300,\n 'height': 300,\n 'nucleotideRadius': 5,\n 'rnaEdgePadding': 1, // how far the leftmost, rightmost, topmost and bottomost\n // nucleotides are from the edge of the plot\n 'labelInterval': 10,\n 'showNucleotideLabels': true,\n 'startNucleotideNumber': 1,\n 'bundleExternalLinks': false,\n\n 'rnaLayout': 'simple', // simple or naview\n 'namePosition': '0 0' // for x and y either 0, 0.5 or 1\n };\n var options = Object.assign(options, passedOptions);\n\n var xScale, yScale;\n\n function createTransformToFillViewport(xValues, yValues) {\n // create transform that will scale the x and y values so that\n // they fill the available viewport\n let xExtent = d3.extent(xValues);\n let yExtent = d3.extent(yValues);\n\n // add the radius of the nucleotides\n xExtent[0] -= options.nucleotideRadius + options.rnaEdgePadding;\n yExtent[0] -= options.nucleotideRadius + options.rnaEdgePadding;\n\n xExtent[1] += options.nucleotideRadius + options.rnaEdgePadding;\n yExtent[1] += options.nucleotideRadius + options.rnaEdgePadding;\n\n // find out how wide and height the molecule\n var xRange = xExtent[1] - xExtent[0];\n var yRange = yExtent[1] - yExtent[0];\n\n // how much wider / taller is it than the available viewport\n var xExtra = xRange - options.width;\n var yExtra = yRange - options.height;\n\n // once we have a scale for one dimension, we can create the scale for the other\n // keeping the same expansion / shrinking ratio\n function createOtherScale(firstScale, newDomain, newRange) {\n var scaleFactor = (firstScale.range()[1] - firstScale.range()[0]) /\n (firstScale.domain()[1] - firstScale.domain()[0]);\n var newWidth = (newDomain[1] - newDomain[0]) * scaleFactor\n var newMargin = ((newRange[1] - newRange[0]) - newWidth) / 2;\n\n return {'scaleFactor': scaleFactor,\n 'scale': d3.scale.linear()\n .domain(newDomain)\n .range([newRange[0] + newMargin, newRange[1] - newMargin])};\n }\n\n var ret;\n\n if (xExtra > yExtra) {\n // we have to shrink more in the x-dimension than the y\n xScale = d3.scale.linear()\n .domain(xExtent)\n .range([0, options.width])\n\n ret = createOtherScale(xScale, yExtent, [0, options.height]);\n yScale = ret.scale;\n } else {\n // we have to shrink more in the x-dimension than the y\n yScale = d3.scale.linear()\n .domain(yExtent)\n .range([0, options.height])\n\n ret = createOtherScale(yScale, xExtent, [0, options.width]);\n xScale = ret.scale;\n }\n\n var xOffset = xScale.range()[0] - xScale.domain()[0];\n var yOffset = yScale.range()[0] - yScale.domain()[0];\n\n return 'translate(' + -(xScale.domain()[0] * ret.scaleFactor - xScale.range()[0]) +\n ',' + -(yScale.domain()[0] * ret.scaleFactor - yScale.range()[0]) + ')' +\n 'scale(' + ret.scaleFactor + ')';\n }\n\n function createNucleotides(selection, nucleotideNodes) {\n // create groupings for each nucleotide and label\n var gs = selection\n .selectAll('.gnode')\n .data(nucleotideNodes)\n .enter()\n .append('svg:g')\n .classed('gnode', true)\n .attr('transform', function(d) {\n return 'translate(' + d.x + ',' + d.y + ')';\n });\n\n var circles = gs.append('svg:circle')\n .classed(fstyle.node, true)\n .attr('node_type', 'nucleotide')\n .attr('base_type', (d) => { if (d.name) { return d.name.toLowerCase(); }})\n .attr('r', options.nucleotideRadius)\n\n\n if (options.showNucleotideLabels) {\n var nucleotideLabels = gs.append('svg:text')\n .text(function(d) { return d.name; })\n .classed(fstyle.nodeLabel, true)\n .append('svg:title')\n .text(function(d) { return d.struct_name + ':' + d.num; });\n }\n }\n\n function createLabels(selection, labelNodes) {\n // create groupings for each nucleotide and label\n\n var gs = selection\n .selectAll()\n .data(labelNodes)\n .enter()\n .append('svg:g')\n .classed('gnode', true)\n .attr('transform', function(d) {\n return 'translate(' + d.x + ',' + d.y + ')';\n });\n\n var circles = gs.append('svg:circle')\n .classed(fstyle.node, true)\n .attr('node_type', 'label')\n .attr('r', options.nucleotideRadius)\n\n var numberLabels = gs.append('svg:text')\n .classed(fstyle.nodeLabel, true)\n .text(function(d) { return d.name; })\n }\n\n function createName(selection, name) {\n let nameLabel = selection.append('svg:text')\n //.attr('dy', -10)\n .classed(fstyle.plotLabel, true)\n .text(name);\n\n let xyPos = options.namePosition.split(\" \", 2) // 0 0.5 1\n let xy = []\n let textBBox = nameLabel.node().getBBox()\n let textSize = [textBBox.width, textBBox.height]\n let plotSize = [options.width, options.height]\n\n for (let p in [0, 1]) {\n switch (xyPos[p]) {\n case '0':\n xy[p] = textSize[p] / 2\n break;\n case '1':\n xy[p] = plotSize[p] - textSize[p] / 2\n break;\n case '0.5':\n xy[p] = plotSize[p] / 2\n break;\n }\n }\n nameLabel.attr('x', xy[0]).attr('y', xy[1])\n }\n\n function makeExternalLinksBundle(selection, links) {\n var nodesDict = {};\n var linksList = [];\n links = links.filter(function(d) { return d.linkType == 'correct' || d.linkType == 'incorrect' || d.linkType == 'extra'; });\n\n selection.selectAll('[link-type=extra]')\n .remove();\n\n\n for (var i = 0; i < links.length; i++) {\n if (links[i].source === null || links[i].target === null)\n continue;\n\n nodesDict[links[i].source.uid] = links[i].source;\n nodesDict[links[i].target.uid] = links[i].target;\n\n linksList.push({'source': links[i].source.uid, 'target': links[i].target.uid, 'linkType': links[i].linkType, 'extraLinkType': links[i].extraLinkType}) ;\n }\n\n var fbundling = d3.ForceEdgeBundling().nodes(nodesDict).edges(linksList)\n .compatibility_threshold(0.8).step_size(0.2);\n var results = fbundling();\n\n var d3line = d3.svg.line()\n .x(function(d){return d.x;})\n .y(function(d){return d.y;})\n .interpolate('linear');\n\n for (var i = 0; i < results.length; i++) {\n var edge_subpoint_data = results[i];\n // for each of the arrays in the results\n // draw a line between the subdivions points for that edge\n\n selection.append('path').attr('d', d3line(edge_subpoint_data))\n .style('fill', 'none')\n .attr('link-type', function(d) { return linksList[i].linkType; })\n .attr('extra-link-type', function(d) { return linksList[i].extraLinkType; })\n .style('stroke-opacity',0.4); //use opacity as blending\n }\n\n }\n\n function createLinks(selection, links) {\n links = links.filter(function(d) { return d.source !== null && d.target !== null; });\n var gs = selection.selectAll('.link')\n .data(links)\n .enter()\n .append('svg:line')\n .attr('x1', function(d) { return d.source.x; })\n .attr('x2', function(d) { return d.target.x; })\n .attr('y1', function(d) { return d.source.y; })\n .attr('y2', function(d) { return d.target.y; })\n .attr('link-type', function(d) { return d.linkType; })\n .attr('extra-link-type', function(d) { return d.extraLinkType; })\n .classed('link', true)\n .classed(fstyle.link, true)\n }\n\n function chart(selection) {\n selection.each(function(data) {\n let plot = d3.select(this).append('g')\n .classed(fstyle.plot, true)\n\n // data should be a dictionary containing at least a structure\n // and possibly a sequence\n let rg = new RNAGraph(data.sequence, data.structure, data.name, options.startNucleotideNumber)\n .recalculateElements()\n .elementsToJson()\n .addName(data.name);\n\n data.rnaGraph = rg;\n // calculate the position of each nucleotide\n // the positions of the labels will be calculated in\n // the addLabels function\n let positions = [];\n\n if (options.rnaLayout === 'naview') {\n var naview = new NAView();\n var naViewPositions = naview.naview_xy_coordinates(rg.pairtable);\n\n for (var i = 0; i < naViewPositions.nbase; i++) {\n positions.push([naViewPositions.x[i], naViewPositions.y[i]]);\n }\n } else {\n positions = simpleXyCoordinates(rg.pairtable);\n }\n\n rg.addPositions('nucleotide', positions)\n //.reinforceStems()\n //.reinforceLoops()\n //.addExtraLinks(data.extraLinks)\n .addLabels(options.startNucleotideNumber, options.labelInterval);\n\n // create a transform that will fit the molecule to the\n // size of the viewport (canvas, svg, whatever)\n let fillViewportTransform = createTransformToFillViewport(\n rg.nodes.map(function(d) { return d.x; }),\n rg.nodes.map(function(d) { return d.y; })\n );\n plot.attr('transform', fillViewportTransform);\n\n let nucleotideNodes = rg.nodes.filter(function(d) {\n return d.nodeType == 'nucleotide';\n });\n\n let labelNodes = rg.nodes.filter(function(d) {\n return d.nodeType == 'label';\n });\n\n let links = rg.links;\n\n createLinks(plot, links);\n createNucleotides(plot, nucleotideNodes);\n createLabels(plot, labelNodes);\n createName(d3.select(this), data.name);\n\n if (options.bundleExternalLinks) {\n makeExternalLinksBundle(plot, links);\n }\n\n });\n }\n\n chart.width = function(_) {\n if (!arguments.length) return options.width;\n options.width = _;\n return chart;\n };\n\n chart.height = function(_) {\n if (!arguments.length) return options.height;\n options.height = _;\n return chart;\n };\n\n chart.showNucleotideLabels = function(_) {\n if (!arguments.length) return options.showNucleotideLabels;\n options.showNucleotideLabels = _;\n return chart;\n };\n\n chart.rnaEdgePadding = function(_) {\n if (!arguments.length) return options.rnaEdgePadding;\n options.rnaEdgePadding = _;\n return chart;\n };\n\n chart.nucleotideRadius = function(_) {\n if (!arguments.length) return options.nucleotideRadius;\n options.nucleotideRadius = _;\n return chart;\n };\n\n chart.labelInterval = function(_) {\n if (!arguments.length) return options.labelInterval;\n options.labelInterval = _;\n return chart;\n };\n\n chart.showNucleotideLabels = function(_) {\n if (!arguments.length) return options.showNucleotideLabels;\n options.showNucleotideLabels = _;\n return chart;\n };\n\n chart.startNucleotideNumber = function(_) {\n if (!arguments.length) return options.startNucleotideNumber;\n options.startNucleotideNumber = _;\n return chart;\n };\n\n chart.bundleExternalLinks = function(_) {\n if (!arguments.length) return options.bundleExternalLinks;\n options.bundleExternalLinks = _;\n return chart;\n };\n\n chart.rnaLayout = function(_) {\n if (!arguments.length) return options.rnaLayout;\n options.rnaLayout = _;\n return chart;\n };\n\n chart.namePosition = function(_) {\n if (!arguments.length) return options.namePosition;\n options.namePosition = _;\n return chart;\n };\n\n return chart;\n}\n","import {rnaPlot} from './rnaplot.js';\n\nexport function rnaTreemap(passedOptions = {}) {\n var options = {\n 'width': 300,\n 'height': 300,\n 'nucleotideRadius': 5,\n 'rnaEdgePadding': 1, // how far the leftmost, rightmost, topmost and bottomost\n // nucleotides are from the edge of the plot\n 'labelInterval': 10,\n 'showNucleotideLabels': true,\n 'startNucleotideNumber': 1,\n 'bundleExternalLinks': false,\n\n 'rnaLayout': 'simple', // simple or naview\n 'namePosition': '0 0', // for x and y either 0, 0.5 or 1\n };\n\n var options = Object.assign(options, passedOptions);\n\n function rnaTreemapNode(selection) {\n // create a background rectangle for each RNA structure\n selection.each(function(d) {\n d3.select(this)\n .attr('transform', function(d) { return 'translate(' + d.x + ',' + d.y + ')' })\n .append('rect')\n .attr('fill', 'transparent')\n .attr('width', function(d) { return Math.max(0, d.dx); })\n .attr('height', function(d) { return Math.max(0, d.dy); })\n\n // draw the actual RNA structure\n var chart = rnaPlot(options)\n .width( Math.max(0, d.dx))\n .height( Math.max(0, d.dy))\n\n if ('structure' in d) d3.select(this).call(chart)\n });\n }\n\n var chart = function(selection) {\n selection.each(function(data) {\n console.log('data:', data)\n // initialize the treemap structure\n // sample input\n // { 'name': 'blah',\n // 'children: [{'structure': '..((..))',\n // 'sequence': 'ACCGGCC',\n // 'size': 50}]\n // }\n var treemap = d3.layout.treemap()\n .size([options.width, options.height])\n .sticky(false)\n .value(function(d) { return d.size; });\n\n // create a new for each node in the treemap\n // this may be a little redundant, since we expect the calling\n // selection to contain their own g elements\n var gEnter = d3.select(this)\n .append('g')\n .classed('rnatreemap', true)\n var treemapGnodes = gEnter.datum(data).selectAll('.treemapnode')\n .data(treemap.nodes)\n .enter()\n .append('g')\n .classed('treemapnode', true)\n .call(rnaTreemapNode);\n });\n };\n\n chart.width = function(_) {\n if (!arguments.length) return options.width;\n options.width = _;\n return chart;\n };\n\n chart.height = function(_) {\n if (!arguments.length) return options.height;\n options.height = _;\n return chart;\n };\n\n chart.showNucleotideLabels = function(_) {\n if (!arguments.length) return options.showNucleotideLabels;\n options.showNucleotideLabels = _;\n return chart;\n };\n\n chart.rnaEdgePadding = function(_) {\n if (!arguments.length) return options.rnaEdgePadding;\n options.rnaEdgePadding = _;\n return chart;\n };\n\n chart.nucleotideRadius = function(_) {\n if (!arguments.length) return options.nucleotideRadius;\n options.nucleotideRadius = _;\n return chart;\n };\n\n chart.labelInterval = function(_) {\n if (!arguments.length) return options.labelInterval;\n options.labelInterval = _;\n return chart;\n };\n\n chart.showNucleotideLabels = function(_) {\n if (!arguments.length) return options.showNucleotideLabels;\n options.showNucleotideLabels = _;\n return chart;\n };\n\n chart.startNucleotideNumber = function(_) {\n if (!arguments.length) return options.startNucleotideNumber;\n options.startNucleotideNumber = _;\n return chart;\n };\n\n chart.bundleExternalLinks = function(_) {\n if (!arguments.length) return options.bundleExternalLinks;\n options.bundleExternalLinks = _;\n return chart;\n };\n\n chart.rnaLayout = function(_) {\n if (!arguments.length) return options.rnaLayout;\n options.rnaLayout = _;\n return chart;\n };\n\n chart.namePosition = function(_) {\n if (!arguments.length) return options.namePosition;\n options.namePosition = _;\n return chart;\n };\n\n chart.zoom = function(_) {\n if (!arguments.length) return options.zoom;\n options.zoom = _;\n return chart;\n };\n\n return chart;\n}\n"],"names":["root","factory","exports","module","require","define","amd","self","__WEBPACK_EXTERNAL_MODULE__893__","Connection","this","loop","Loop","region","Region","start","end","xrad","yrad","angle","extruded","broken","_isNull","prototype","isNull","setNull","getLoop","setLoop","getRegion","setRegion","getStart","setStart","getEnd","setEnd","getXrad","setXrad","getYrad","setYrad","getAngle","setAngle","isExtruded","setExtruded","isBroken","setBroken","nconnection","connections","_connections","number","depth","mark","x","y","radius","getNconnection","setNconnection","setConnection","i","c","getConnection","addConnection","push","getNumber","setNumber","getDepth","setDepth","isMark","setMark","getX","setX","getY","setY","getRadius","setRadius","_start1","_end1","_start2","_end2","getStart1","setStart1","start1","getEnd1","setEnd1","end1","getStart2","setStart2","start2","getEnd2","setEnd2","end2","byteLength","b64","lens","getLens","validLen","placeHoldersLen","toByteArray","tmp","arr","Arr","_byteLength","curByte","len","revLookup","charCodeAt","fromByteArray","uint8","length","extraBytes","parts","maxChunkLength","len2","encodeChunk","lookup","join","Uint8Array","Array","code","Error","indexOf","num","output","base64","ieee754","customInspectSymbol","Symbol","Buffer","K_MAX_LENGTH","createBuffer","RangeError","buf","Object","setPrototypeOf","arg","encodingOrOffset","TypeError","allocUnsafe","from","value","string","encoding","isEncoding","actual","write","slice","fromString","ArrayBuffer","isView","arrayView","isInstance","copy","fromArrayBuffer","buffer","byteOffset","fromArrayLike","fromArrayView","SharedArrayBuffer","valueOf","b","obj","isBuffer","checked","undefined","numberIsNaN","type","isArray","data","fromObject","toPrimitive","assertSize","size","array","toString","mustMatch","arguments","loweredCase","utf8ToBytes","base64ToBytes","toLowerCase","slowToString","hexSlice","utf8Slice","asciiSlice","latin1Slice","base64Slice","utf16leSlice","swap","n","m","bidirectionalIndexOf","val","dir","arrayIndexOf","call","lastIndexOf","indexSize","arrLength","valLength","String","read","readUInt16BE","foundIndex","found","j","hexWrite","offset","Number","remaining","strLen","parsed","parseInt","substr","utf8Write","blitBuffer","asciiWrite","str","byteArray","asciiToBytes","base64Write","ucs2Write","units","hi","lo","utf16leToBytes","Math","min","res","firstByte","codePoint","bytesPerSequence","secondByte","thirdByte","fourthByte","tempCodePoint","codePoints","MAX_ARGUMENTS_LENGTH","fromCharCode","apply","decodeCodePointsArray","TYPED_ARRAY_SUPPORT","proto","foo","e","typedArraySupport","console","error","defineProperty","enumerable","get","poolSize","alloc","fill","allocUnsafeSlow","_isBuffer","compare","a","concat","list","pos","set","swap16","swap32","swap64","toLocaleString","equals","inspect","max","replace","trim","target","thisStart","thisEnd","thisCopy","targetCopy","includes","isFinite","toJSON","_arr","ret","out","hexSliceLookupTable","bytes","checkOffset","ext","checkInt","wrtBigUInt64LE","checkIntBI","BigInt","wrtBigUInt64BE","checkIEEE754","writeFloat","littleEndian","noAssert","writeDouble","newBuf","subarray","readUintLE","readUIntLE","mul","readUintBE","readUIntBE","readUint8","readUInt8","readUint16LE","readUInt16LE","readUint16BE","readUint32LE","readUInt32LE","readUint32BE","readUInt32BE","readBigUInt64LE","defineBigIntMethod","validateNumber","first","last","boundsError","readBigUInt64BE","readIntLE","pow","readIntBE","readInt8","readInt16LE","readInt16BE","readInt32LE","readInt32BE","readBigInt64LE","readBigInt64BE","readFloatLE","readFloatBE","readDoubleLE","readDoubleBE","writeUintLE","writeUIntLE","writeUintBE","writeUIntBE","writeUint8","writeUInt8","writeUint16LE","writeUInt16LE","writeUint16BE","writeUInt16BE","writeUint32LE","writeUInt32LE","writeUint32BE","writeUInt32BE","writeBigUInt64LE","writeBigUInt64BE","writeIntLE","limit","sub","writeIntBE","writeInt8","writeInt16LE","writeInt16BE","writeInt32LE","writeInt32BE","writeBigInt64LE","writeBigInt64BE","writeFloatLE","writeFloatBE","writeDoubleLE","writeDoubleBE","targetStart","copyWithin","errors","E","sym","getMessage","Base","constructor","super","writable","configurable","name","stack","message","addNumericalSeparator","range","ERR_OUT_OF_RANGE","checkBounds","ERR_INVALID_ARG_TYPE","floor","ERR_BUFFER_OUT_OF_BOUNDS","input","msg","received","isInteger","abs","INVALID_BASE64_RE","Infinity","leadSurrogate","split","base64clean","src","dst","alphabet","table","i16","fn","BufferBigIntNotDefined","isLE","mLen","nBytes","eLen","eMax","eBias","nBits","d","s","NaN","rt","isNaN","log","LN2","uuid","toBase64","btoa","fromBase64","atob","encode","uuid_","parse","substring","decode","slug","stringify","v4","nice","getRandomValues","rnds8","rng","crypto","bind","msCrypto","test","byteToHex","_nodeId","_clockseq","_lastMSecs","_lastNSecs","options","node","clockseq","seedBytes","random","msecs","Date","now","nsecs","dt","tl","tmh","v","version","hashfunc","generateUUID","namespace","unescape","encodeURIComponent","stringToBytes","err","DNS","URL","getOutputLength","inputLength8","safeAdd","lsw","md5cmn","q","t","cnt","md5ff","md5gg","md5hh","md5ii","v35","length32","hexTab","hex","charAt","md5ToHexEncodedArray","olda","oldb","oldc","oldd","wordsToMd5","length8","Uint32Array","bytesToWords","rnds","f","z","ROTL","K","H","l","N","ceil","M","_i","_i2","W","_t","_t2","T","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","getter","__esModule","definition","key","o","g","globalThis","Function","window","prop","hasOwnProperty","r","toStringTag","scriptUrl","importScripts","location","document","currentScript","scripts","getElementsByTagName","p","contextMenu","menu","opts","openCallback","closeCallback","previouslyMouseUp","uid","slugid","rootElement","orientation","initialPos","parentStart","onOpen","onClose","d3","enter","append","classed","on","style","index","mousePos","pMouseUp","elm","currentThis","openChildMenuUid","html","preventDefault","stopPropagation","selectAll","attr","divider","disabled","action","title","children","childUid","boundingRect","getBoundingClientRect","childrenContextMenu","left","pageXOffset","top","pageYOffset","width","ArrowIcon","contextMenuSelection","pageX","pageY","innerWidth","numberSort","RNAUtilities","bracketLeft","bracketRight","inverseBrackets","bracket","maximumMatching","pt","mm","maximum","backtrackMaximumMatching","oldPt","map","mmBt","dotbracketToPairtable","dotbracket","inverseBracketLeft","inverseBracketRight","ni","pop","insertIntoStack","k","deleteFromStack","pairtableToDotbracket","seen","findUnmatched","to","toRemove","unmatched","origFrom","origTo","removePseudoknotsFromPairtable","newPt","removed","ptToElements","level","dotBracketBreaks","elements","u5","u3","sort","external","right","rnaUtilities","ColorScheme","colorsText","parseRange","rangeText","nums","parts1","parseColorText","colorText","lines","currMolecule","counter","colorsJson","colorValues","domainValues","words","search","partsRight","domain","color","normalizeColors","moleculeName","minNum","MAX_VALUE","maxNum","MIN_VALUE","resnum","RNAGraph","seq","structName","startNumber","circularizeExternal","circular","pseudoknotPairs","nucsToNodes","addUids","uids","nucleotideNodes","nodes","filter","nodeType","computePairtable","pairtable","rnaLength","addPositions","positions","labelNodes","breakNodesToFakeNodes","_loop","elemType","getPositions","getUids","reinforceStems","relevantElements","allNucs","nucs","addFakeNode","reinforceLoops","filterNucs","newNode1","px","py","newNode2","updateLinkUids","links","source","tan","fakeNodeUid","newNode","newX","newY","coordsCounted","cos","ia","fromNode","connectFakeNodes","fakeNodes","linked","thisNode","thisNuc","JSON","distance","addExtraLinks","extraLinks","newLink","getNodeFromNucleotides","linkType","elementsToJson","elemTypes","nodeName","prevNode","nextNode","addLabels","labelInterval","prevVec","nextVec","combinedVec","vecLength","sqrt","normedVec","offsetVec","recalculateElements","removePseudoknots","externalLoop","eloop","prev","hloop","numGreater","reassignLinkUids","addPseudoknots","addName","simpleXyCoordinates","pair_table","alpha","loop_size","stack_size","lp","stk","PIHALF","PI","i_old","partner","start_k","start_l","ladder","begin","diff","polygon","count","bubble","remember","poss","sin","Radloop","loopnumber","next","getLoopnumber","setLoopnumber","getNext","setNext","getPrev","setPrev","mate","extracted","getMate","setMate","isExtracted","setExtracted","NAView","ANUM","MAXITER","bases","nbase","nregion","loop_count","loops","regions","rlphead","lencut","RADIUS_REDUCTION_FACTOR","angleinc","_h","HELIX_FACTOR","BACKBONE_DISTANCE","determine_depths","FornaContainer","element","passedOptions","assign","initialSize","svgW","svgH","linkStrengths","displayParameters","colorScheme","customColors","rnas","mousedownNode","mouseupNode","linkContextMenuShown","resetMouseVars","graph","editable","animation","shiftKeydown","ctrlKeydown","keyCode","getStructuresDotBracket","centerView","zoomable","disableZooming","enableBrushing","enableZooming","disableBrushing","backgroundMenu","canvasMousePos","xScale","invert","yScale","addRNA","nodeMenu","deleteNode","changeNode","insertNodeBeforeOrAfter","nodeContextMenu","backgroundContextMenu","select","remove","svg","each","focus","mouseEventHelper","mpos","vis","dragLine","fstyle","deselectAllNodes","visLinks","visNodes","linear","zoomer","zoom","scaleExtent","translate","scale","toggleSelectNode","selected","selectedNodes","brusher","brush","extent","clear","force","charge","middleCharge","otherCharge","friction","linkDistance","linkDistanceMultiplier","linkStrength","other","gravity","chargeDistance","drag","sourceEvent","d1","fixed","dx","dy","resumeForce","createInitialLayout","structure","rg","sequence","rnaJson","layout","naViewPositions","naview_xy_coordinates","createNewNodes","gnodesEnter","previouslySelected","rna","transition","duration","ease","nodeMousedown","nodeMouseup","labelAndProteinNodes","text","createNewLinks","linksEnter","linkLines","linkClick","drawDirectionArrow","magnitude","endPoint","startPoint","nodeStroke","parseFloat","lengthMult","arrowWidth","u","arrowTip","path","realLinkFilter","recalculateGraph","uidsToNodes","forEach","link","fakeLinks","linkIndex","splice","update","allLinks","elementKey","exit","gnodes","realNodes","quadtree","collide","nx1","nx2","ny1","ny2","quad","x1","y1","x2","y2","point","visit","changeColorScheme","updateStyle","transitionRNA","newStructure","nextFunction","transitionDuration","newRNAJson","newNodes","callback","setTimeout","bbTransform","minX","minY","maxX","maxY","maxRadius","molWidth","molHeight","widthRatio","heightRatio","minRatio","maxNodeRadius","newMolWidth","newMolHeight","getBoundingBoxTransform","setSize","offsetWidth","offsetHeight","setOutlineColor","addCustomColors","json","addCustomColorsText","customColorsText","cs","newColorScheme","ordinal","category10","interpolate","changeColors","moleculeColors","displayNumbering","displayNodeOutline","displayNodeLabel","displayLinks","displayPseudoknotLinks","displayProteinLinks","displayAllLinks","displayDirectionArrows","referenceNode","newNodeNum","newDotbracket","newSequence","newPositions","positionOffset","newUids","pair","updateRnaGraph","nucleotidePositions","labelPositions","basepairPossible","linkMenu","rna1","rna2","dotbracket1","dotbracket2","seq1","seq2","positions1","positions2","newSeq","toAddExternal","toDelete","newRna","addBackBoneLink","addLink","linkContextMenu","sequence1","sequence2","rnaDotBracket","dotBracket1","dotBracket2","uids1","uids2","removeBackBoneLink","extraLinkIndex","removeLink","fromJSON","jsonString","ProteinGraph","addRNAJSON","newLinks","addExternalLinks","centerPos","avoidOthers","breakPositions","_loop2","linkSource","linkTarget","breakFrom","breakTo","sequences","dotbrackets","rnaPositions","rnaUids","lastBreak","newRnas","splitMultiStrand","rnaGraph","_ref","_ref$avoidOthers","_ref$centerPos","_ref$centerView","totalX","totalY","nodeCount","addNodes","entry","clearNodes","externalLinks","currIdx","nodeIdxs","breaks","idx1","idx2","startAnimation","stopAnimation","stop","resume","setFriction","setCharge","setGravity","setPseudoknotStrength","pseudoknot","rnaPlot","chart","selection","plot","startNucleotideNumber","rnaLayout","fillViewportTransform","xValues","yValues","xExtent","yExtent","nucleotideRadius","rnaEdgePadding","xRange","yRange","createOtherScale","firstScale","newDomain","newRange","scaleFactor","newWidth","newMargin","height","createTransformToFillViewport","extraLinkType","createLinks","gs","showNucleotideLabels","struct_name","createNucleotides","createLabels","nameLabel","xyPos","namePosition","xy","textBBox","getBBox","textSize","plotSize","createName","bundleExternalLinks","nodesDict","linksList","results","ForceEdgeBundling","edges","compatibility_threshold","step_size","fbundling","d3line","line","edge_subpoint_data","makeExternalLinksBundle","_","rnaTreemap","rnaTreemapNode","treemap","sticky","datum","read_in_bases","find_regions","construct_loop","find_central_loop","traverse_loop","npairs","nb1","ibase","retloop","cp","rp","rlp","maxconn","maxdepth","anchor_connection","xs","ys","xe","xn","yn","xc","yc","xo","yo","astart","aend","cpnext","acp","cpprev","ic","da","maxang","icstart","icend","icmiddle","icroot","done","done_all_connections","rooted","sign","midx","midy","nrx","nry","mx","my","vx","vy","dotmv","nmidx","nmidy","icstart1","icup","icdown","icnext","direction","dan","rr","cpx","cpy","cpnextx","cpnexty","cnx","rcn","rc","lnx","lny","rl","ac","acn","sx","sy","dcp","imaxloop","indice","atan2","set_radius","determine_radius","connected_connection","find_ic_middle","asin","construct_extruded_segment","generate_region","mindit","ci","sumn","sumd","dit","imindit","rt2_2","aend1","aend2","aave","a1","a2","dac","nstart","nend","collision","construct_circle_segment","minf2","maxf2","find_center_for_arc","h","hhi","hlow","disc","theta","iter","acos","noIterationFailureYet"],"sourceRoot":""}
\ No newline at end of file
diff --git a/doc/img/cofold_example.png b/doc/img/cofold_example.png
index 05bb1bb..5ca1687 100644
Binary files a/doc/img/cofold_example.png and b/doc/img/cofold_example.png differ
diff --git a/doc/img/uncircularized_exterior.png b/doc/img/uncircularized_exterior.png
index 70ea687..af784a4 100644
Binary files a/doc/img/uncircularized_exterior.png and b/doc/img/uncircularized_exterior.png differ
diff --git a/examples/demo.html b/examples/demo.html
index 7b7bf38..2c29519 100644
--- a/examples/demo.html
+++ b/examples/demo.html
@@ -95,7 +95,7 @@ This is a custom-colored RNA
function cofoldContainer() {
var container = new fornac.FornaContainer("#cofold_ss",
- {'animation': true, 'zoomable': false, 'initialSize':[500,300]});
+ {'animation': false, 'zoomable': false, 'initialSize':[500,300]});
var options = {'structure': '..((((...))))...((...((...((..&............))...))...))..',
'sequence': 'ACGAUCAGAGAUCAGAGCAUACGACAGCAG&ACGAAAAAAAGAGCAUACGACAGCAG'
diff --git a/src/fornac.js b/src/fornac.js
index f117407..bcafff5 100644
--- a/src/fornac.js
+++ b/src/fornac.js
@@ -1490,6 +1490,107 @@ export function FornaContainer(element, passedOptions = {}) {
// add them back to the plot
}
+ let splitMultiStrand = function(rna) {
+ // split a multi strand RNA into its individual strands
+ // get the position of the '&' character in the dotbracket string
+ let breakPositions = [];
+ for (let i = 0; i < rna.dotbracket.length; i++) {
+ if (rna.dotbracket[i] == '&') {
+ breakPositions.push(i);
+ }
+ }
+
+ let toRemove = [];
+ // collect all the base pairs that are between split strands
+ for (let i = 0; i < rna.links.length; i++) {
+ let link = rna.links[i];
+
+ if (link.linkType != 'basepair')
+ continue; // only consider base pairs
+
+ for (let j = 0; j < breakPositions.length; j++) {
+ let node = rna.nodes[breakPositions[j]]; // take the split node
+ // take the two links that connect the split node
+ let linkSource = rna.links.filter(link => link.source === node)[0];
+ let linkTarget = rna.links.filter(link => link.target === node)[0];
+ if (link.source.num <= linkSource.source.num && link.target.num >= linkTarget.target.num) {
+ console.log('crossing basepair', link);
+ link.breakFrom = 0;
+ // find the strand that the source is in
+ for (let k = 0; k < breakPositions.length - 1; k++) {
+ if (link.source.num > breakPositions[k] && link.source.num < breakPositions[k+1])
+ link.breakFrom = k+1;
+ }
+ // find the strand that the target is in
+ link.breakTo = j+1;
+ link.from = link.source.num;
+ // find the position of the source in the strand
+ if (link.breakFrom > 0) link.from -= breakPositions[link.breakFrom-1] + link.breakFrom;
+ // find the position of the target in the strand
+ link.to = link.target.num - linkTarget.target.num;
+ toRemove.push(link);
+ }
+ }
+ }
+
+
+ // Remove all base pairs that are between these two nodes and add them as extra
+ // links
+ console.log('toRemove:', toRemove);
+ let sequences = rna.seq.split('&');
+
+ // remove the base pairs
+ for (let i = 0; i < toRemove.length; i++) {
+ rna.pairtable[toRemove[i].source.num] = 0;
+ rna.pairtable[toRemove[i].target.num] = 0;
+ }
+
+ // extract the dotbracket string of the rna
+ // cut it at the position of this backbone bond
+ console.log('sequences:', sequences);
+
+ let rnaDotBracket = rnaUtilities.pairtableToDotbracket(rna.pairtable);
+ let dotbrackets = []; // array to hold the dotbracket strings of the individual strands
+ let rnaPositions = rna.getPositions('nucleotide') // get the nucleotide positions, cut them at the positions of the backbone bond
+ let positions = [];
+ let rnaUids = rna.getUids();
+ let uids = [];
+ let lastBreak = 0; // the position of the last break
+ for (let i = 0; i <= breakPositions.length; i++) {
+ // cut the dotbracket
+ dotbrackets.push(rnaDotBracket.slice(lastBreak, breakPositions[i]));
+ // add the positions
+ positions.push(rnaPositions.slice(lastBreak, breakPositions[i]));
+ // add the uids
+ uids.push(rnaUids.slice(lastBreak, breakPositions[i]));
+ lastBreak = breakPositions[i] + 1;
+ }
+
+ console.log('positions:', positions);
+
+ delete self.rnas[rna.uid];
+ let newRnas = [];
+ for (let i = 0; i < sequences.length; i++) {
+ let newRna = self.addRNA(dotbrackets[i], { 'sequence': sequences[i],
+ 'positions': positions[i],
+ 'uids': uids[i] });
+ newRnas.push(newRna);
+ }
+ // add the extra links
+ for (let i = 0; i < toRemove.length; i++) {
+ console.log('toRemove[i]', toRemove[i]);
+ self.extraLinks.push(
+ {'source': newRnas[toRemove[i].breakFrom].nodes[toRemove[i].from-1],
+ 'target': newRnas[toRemove[i].breakTo].nodes[toRemove[i].to-1],
+ 'value': 1,
+ 'uid': slugid.nice(),
+ 'linkType': 'intermolecule'});
+ recalculateGraph();
+ self.update();
+ }
+ console.log('self.extraLinks:', self.extraLinks);
+ }
+
var removeLink = function(d) {
// remove a link between two nodes
let index = self.graph.links.indexOf(d);
@@ -1907,6 +2008,13 @@ export function FornaContainer(element, passedOptions = {}) {
else
self.addRNAJSON(rnaJson, {centerView: passedOptions.centerView});
+ // if the structure containes multistrands, let's split before the '&'
+ console.log('structure:', structure);
+ if (structure.indexOf('&') !== -1 && structure != '&' && structure.indexOf('&') !== 0) {
+ console.log('splitting multistrand');
+ splitMultiStrand(rnaJson);
+ return;
+ };
return rnaJson;
};
@@ -2126,7 +2234,7 @@ export function FornaContainer(element, passedOptions = {}) {
if (node.nodeType != 'nucleotide')
continue;
- console.log('node:', node);
+ // console.log('node:', node);
nodeIdxs[node.uid] = currIdx;
currIdx += 1;
diff --git a/src/rnagraph.js b/src/rnagraph.js
index ab3a4d7..790e353 100644
--- a/src/rnagraph.js
+++ b/src/rnagraph.js
@@ -84,35 +84,35 @@ export function RNAGraph(seq = '', dotbracket = '', structName = '', startNumber
self.pairtable = rnaUtilities.dotbracketToPairtable(self.dotbracket);
};
- self.removeBreaks = function(targetString) {
- // Remove all chain breaks (denoted with a '&', which indicate
- // that the input represents more than one strand)
- var breaks = [];
- var breakIndex = -1;
-
- while ((breakIndex = targetString.indexOf('&')) >= 0) {
- breaks.push(breakIndex);
- targetString = targetString.substring(0, breakIndex) + targetString.substring(breakIndex+1, targetString.length);
-
- }
-
- return {targetString: targetString, breaks: breaks};
- };
-
- var ret = self.removeBreaks(self.dotbracket);
- self.dotbracket = ret.targetString;
- self.dotBracketBreaks = ret.breaks;
-
- ret = self.removeBreaks(self.seq);
- self.seq = ret.targetString;
- self.seqBreaks = ret.breaks;
+ // self.removeBreaks = function(targetString) {
+ // // Collect the indexes of the chain breaks in the targetString
+ // // chain breaks are indicated by '&'
+ // var breaks = [];
+ // for (var i = 0; i < targetString.length; i++) {
+ // if (targetString[i] === '&') {
+ // breaks.push(i);
+ // }
+ // }
+
+ // return {targetString: targetString, breaks: breaks};
+ // };
+
+ // var ret = self.removeBreaks(self.dotbracket);
+ // commented out to avoid removing the break node, let's keep it in the dotbracket
+ // self.dotbracket = ret.targetString;
+ // self.dotBracketBreaks = ret.breaks;
+
+ // ret = self.removeBreaks(self.seq);
+ // commented out to avoid removing the break node, let's keep it in the sequence
+ // self.seq = ret.targetString;
+ // self.seqBreaks = ret.breaks;
self.rnaLength = self.dotbracket.length;
- if (!arraysEqual(self.dotBracketBreaks, self.seqBreaks)) {
- console.log('WARNING: Sequence and structure breaks not equal');
- console.log('WARNING: Using the breaks in the structure');
- }
+ // if (!arraysEqual(self.dotBracketBreaks, self.seqBreaks)) {
+ // console.log('WARNING: Sequence and structure breaks not equal');
+ // console.log('WARNING: Using the breaks in the structure');
+ // }
self.computePairtable();
@@ -131,23 +131,24 @@ export function RNAGraph(seq = '', dotbracket = '', structName = '', startNumber
// convert all the nodes following breaks to fake nodes
let labelNodes = self.nodes.filter(function(d) { return d.nodeType == 'nucleotide'; });
- // if a node was an artifical break node, convert it to a middle
- for (let i = 0; i < labelNodes.length; i++) {
- if (self.dotBracketBreaks.indexOf(i) >= 0) {
- labelNodes[i].nodeType = 'middle';
- labelNodes[i+1].nodeType = 'middle';
- }
- }
+ // // if a node was an artifical break node, convert it to a middle
+ // for (let i = 0; i < labelNodes.length; i++) {
+ // if (self.dotBracketBreaks.indexOf(i) >= 0) {
+ // labelNodes[i].nodeType = 'middle';
+ // // commented out to avoid removing the node after the break
+ // // labelNodes[i+1].nodeType = 'middle';
+ // }
+ // }
for (let i = 0; i < self.elements.length; i++) {
var broken = false;
- // change the elemType of the other nodes in the element containing
- // the break
- for (let j = 0; j < self.elements[i][2].length; j++) {
- if (self.dotBracketBreaks.indexOf(self.elements[i][2][j]) >= 0)
- broken = true;
- }
+ // // change the elemType of the other nodes in the element containing
+ // // the break
+ // for (let j = 0; j < self.elements[i][2].length; j++) {
+ // if (self.dotBracketBreaks.indexOf(self.elements[i][2][j]) >= 0)
+ // broken = true;
+ // }
if (broken) {
self.elements[i][2].map(function(x) {
@@ -444,10 +445,10 @@ export function RNAGraph(seq = '', dotbracket = '', structName = '', startNumber
for (let i = 1; i <= pt[0]; i++) {
var nodeName = self.seq[i-1];
- if (self.dotBracketBreaks.indexOf(i-1) >= 0 ||
- self.dotBracketBreaks.indexOf(i-2) >= 0) {
- nodeName = '';
- }
+ // // remove only the breaks that are in the sequence
+ // if (self.dotBracketBreaks.indexOf(i-1) >= 0) {
+ // nodeName = '';
+ // }
//create a node for each nucleotide
self.nodes.push({'name': nodeName,
@@ -488,9 +489,9 @@ export function RNAGraph(seq = '', dotbracket = '', structName = '', startNumber
if (i > 1) {
// backbone links
- if (self.dotBracketBreaks.indexOf(i-1) === -1 &&
- self.dotBracketBreaks.indexOf(i-2) == -1 &&
- self.dotBracketBreaks.indexOf(i-3) == -1) {
+ // unlink only the break and the nucleotide before it
+ // if (self.dotBracketBreaks.indexOf(i-1) === -1 &&
+ // self.dotBracketBreaks.indexOf(i-2) == -1) {
// there is no break in the strands here
// we can add a backbone link
self.links.push({'source': self.nodes[i-2],
@@ -499,7 +500,7 @@ export function RNAGraph(seq = '', dotbracket = '', structName = '', startNumber
'value': 1,
'uid': slugid.nice() });
self.nodes[i-1].linked = true;
- }
+ // }
}
}
@@ -555,31 +556,31 @@ export function RNAGraph(seq = '', dotbracket = '', structName = '', startNumber
if (i > j) {
//hairpin loop or one large unpaired molecule
u5.push(i);
- if (level === 0)
+ // if (level === 0)
return [['e',level, u5.sort(numberSort)]];
- else {
- // check to see if we have chain breaks due
- // to multiple strands in the input
- var external = false;
- var left = [];
- var right = [];
- for (var k = 0; k < u5.length; k++) {
- if (external)
- right.push(u5[k]);
- else
- left.push(u5[k]);
-
- if (self.dotBracketBreaks.indexOf(u5[k]) >= 0)
- external = true;
- }
-
- if (external) {
- return [['h',level, u5.sort(numberSort)]];
- }
- else
- // if not, this is a simple hairpin loop
- return [['h',level, u5.sort(numberSort)]];
- }
+ // else {
+ // // check to see if we have chain breaks due
+ // // to multiple strands in the input
+ // var external = false;
+ // var left = [];
+ // var right = [];
+ // for (var k = 0; k < u5.length; k++) {
+ // if (external)
+ // right.push(u5[k]);
+ // else
+ // left.push(u5[k]);
+
+ // if (self.dotBracketBreaks.indexOf(u5[k]) >= 0)
+ // external = true;
+ // }
+
+ // if (external) {
+ // return [['h',level, u5.sort(numberSort)]];
+ // }
+ // else
+ // // if not, this is a simple hairpin loop
+ // return [['h',level, u5.sort(numberSort)]];
+ // }
}
if (pt[i] != j) {
diff --git a/src/rnautils.js b/src/rnautils.js
index 0c6c54c..444d8b2 100644
--- a/src/rnautils.js
+++ b/src/rnautils.js
@@ -149,6 +149,8 @@ export function RNAUtilities() {
pt[ni] = j;
pt[j] = ni;
+ } else if (a == '&'){
+ // there is a sequence break here, ignore it
} else {
throw "Unknown symbol in dotbracket string";
}