diff --git a/dist/js/ideogram.min.js b/dist/js/ideogram.min.js index 21b0eaa0..684d12c4 100644 --- a/dist/js/ideogram.min.js +++ b/dist/js/ideogram.min.js @@ -1,3 +1,3 @@ /*! For license information please see ideogram.min.js.LICENSE.txt */ -!function(t,n){if("object"==typeof exports&&"object"==typeof module)module.exports=n();else if("function"==typeof define&&define.amd)define([],n);else{var e=n();for(var o in e)("object"==typeof exports?exports:t)[o]=e[o]}}(self,(function(){return(()=>{"use strict";var t={d:(n,e)=>{for(var o in e)t.o(e,o)&&!t.o(n,o)&&Object.defineProperty(n,o,{enumerable:!0,get:e[o]})},o:(t,n)=>Object.prototype.hasOwnProperty.call(t,n),r:t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})}},n={};t.r(n),t.d(n,{default:()=>$l});var e={};t.r(e),t.d(e,{blob:()=>_t,buffer:()=>Ct,csv:()=>Gt,dsv:()=>Ot,html:()=>Yt,image:()=>zt,json:()=>Ht,svg:()=>Ut,text:()=>Ft,tsv:()=>jt,xml:()=>$t});var o={};t.r(o),t.d(o,{brush:()=>Oo,brushSelection:()=>Do,brushX:()=>Fo,brushY:()=>Ro});var r={};t.r(r),t.d(r,{dispatch:()=>tn});var i={};t.r(i),t.d(i,{FormatSpecifier:()=>$o,format:()=>Qo,formatDefaultLocale:()=>nr,formatLocale:()=>tr,formatPrefix:()=>Jo,formatSpecifier:()=>qo,precisionFixed:()=>er,precisionPrefix:()=>or,precisionRound:()=>rr});function a(){}function s(t){return null==t?a:function(){return this.querySelector(t)}}function c(t){return"object"==typeof t&&"length"in t?t:Array.from(t)}function l(){return[]}function u(t){return null==t?l:function(){return this.querySelectorAll(t)}}function h(t){return function(){return this.matches(t)}}function f(t){return function(n){return n.matches(t)}}var d=Array.prototype.find;function m(){return this.firstElementChild}var g=Array.prototype.filter;function p(){return this.children}function y(t){return new Array(t.length)}function v(t,n){this.ownerDocument=t.ownerDocument,this.namespaceURI=t.namespaceURI,this._next=null,this._parent=t,this.__data__=n}function b(t){return function(){return t}}function w(t,n,e,o,r,i){for(var a,s=0,c=n.length,l=i.length;sn?1:t>=n?0:NaN}v.prototype={constructor:v,appendChild:function(t){return this._parent.insertBefore(t,this._next)},insertBefore:function(t,n){return this._parent.insertBefore(t,n)},querySelector:function(t){return this._parent.querySelector(t)},querySelectorAll:function(t){return this._parent.querySelectorAll(t)}};var C="http://www.w3.org/1999/xhtml";const k={svg:"http://www.w3.org/2000/svg",xhtml:C,xlink:"http://www.w3.org/1999/xlink",xml:"http://www.w3.org/XML/1998/namespace",xmlns:"http://www.w3.org/2000/xmlns/"};function S(t){var n=t+="",e=n.indexOf(":");return e>=0&&"xmlns"!==(n=t.slice(0,e))&&(t=t.slice(e+1)),k.hasOwnProperty(n)?{space:k[n],local:t}:t}function L(t){return function(){this.removeAttribute(t)}}function T(t){return function(){this.removeAttributeNS(t.space,t.local)}}function M(t,n){return function(){this.setAttribute(t,n)}}function P(t,n){return function(){this.setAttributeNS(t.space,t.local,n)}}function N(t,n){return function(){var e=n.apply(this,arguments);null==e?this.removeAttribute(t):this.setAttribute(t,e)}}function I(t,n){return function(){var e=n.apply(this,arguments);null==e?this.removeAttributeNS(t.space,t.local):this.setAttributeNS(t.space,t.local,e)}}function B(t){return t.ownerDocument&&t.ownerDocument.defaultView||t.document&&t||t.defaultView}function E(t){return function(){this.style.removeProperty(t)}}function D(t,n,e){return function(){this.style.setProperty(t,n,e)}}function F(t,n,e){return function(){var o=n.apply(this,arguments);null==o?this.style.removeProperty(t):this.style.setProperty(t,o,e)}}function R(t,n){return t.style.getPropertyValue(n)||B(t).getComputedStyle(t,null).getPropertyValue(n)}function O(t){return function(){delete this[t]}}function G(t,n){return function(){this[t]=n}}function j(t,n){return function(){var e=n.apply(this,arguments);null==e?delete this[t]:this[t]=e}}function z(t){return t.trim().split(/^|\s+/)}function W(t){return t.classList||new H(t)}function H(t){this._node=t,this._names=z(t.getAttribute("class")||"")}function q(t,n){for(var e=W(t),o=-1,r=n.length;++o=0&&(n=t.slice(e+1),t=t.slice(0,e)),{type:t,name:n}}))}function ht(t){return function(){var n=this.__on;if(n){for(var e,o=0,r=-1,i=n.length;o=0&&(this._names.splice(n,1),this._node.setAttribute("class",this._names.join(" ")))},contains:function(t){return this._names.indexOf(t)>=0}};var pt=[null];function yt(t,n){this._groups=t,this._parents=n}function vt(){return new yt([[document.documentElement]],pt)}yt.prototype=vt.prototype={constructor:yt,select:function(t){"function"!=typeof t&&(t=s(t));for(var n=this._groups,e=n.length,o=new Array(e),r=0;r=S&&(S=k+1);!(C=y[S])&&++S=0;)(o=r[i])&&(a&&4^o.compareDocumentPosition(a)&&a.parentNode.insertBefore(o,a),a=o);return this},sort:function(t){function n(n,e){return n&&e?t(n.__data__,e.__data__):!n-!e}t||(t=A);for(var e=this._groups,o=e.length,r=new Array(o),i=0;i1?this.each((null==n?E:"function"==typeof n?F:D)(t,n,null==e?"":e)):R(this.node(),t)},property:function(t,n){return arguments.length>1?this.each((null==n?O:"function"==typeof n?j:G)(t,n)):this.node()[t]},classed:function(t,n){var e=z(t+"");if(arguments.length<2){for(var o=W(this.node()),r=-1,i=e.length;++r=i?c=!0:10===(o=t.charCodeAt(a++))?l=!0:13===o&&(l=!0,10===t.charCodeAt(a)&&++a),t.slice(r+1,n-1).replace(/""/g,'"')}for(;a9999?"+"+Mt(n,6):Mt(n,4))+"-"+Mt(t.getUTCMonth()+1,2)+"-"+Mt(t.getUTCDate(),2)+(i?"T"+Mt(e,2)+":"+Mt(o,2)+":"+Mt(r,2)+"."+Mt(i,3)+"Z":r?"T"+Mt(e,2)+":"+Mt(o,2)+":"+Mt(r,2)+"Z":o||e?"T"+Mt(e,2)+":"+Mt(o,2)+"Z":"")}(t):n.test(t+="")?'"'+t.replace(/"/g,'""')+'"':t}return{parse:function(t,n){var e,r,i=o(t,(function(t,o){if(e)return e(t,o-1);r=t,e=n?function(t,n){var e=Lt(t);return function(o,r){return n(e(o),r,t)}}(t,n):Lt(t)}));return i.columns=r||[],i},parseRows:o,format:function(n,e){return null==e&&(e=Tt(n)),[e.map(a).join(t)].concat(r(n,e)).join("\n")},formatBody:function(t,n){return null==n&&(n=Tt(t)),r(t,n).join("\n")},formatRows:function(t){return t.map(i).join("\n")},formatRow:i,formatValue:a}}var Nt=Pt(","),It=Nt.parse,Bt=(Nt.parseRows,Nt.format,Nt.formatBody,Nt.formatRows,Nt.formatRow,Nt.formatValue,Pt("\t")),Et=Bt.parse;function Dt(t){if(!t.ok)throw new Error(t.status+" "+t.statusText);return t.text()}function Ft(t,n){return fetch(t,n).then(Dt)}function Rt(t){return function(n,e,o){return 2===arguments.length&&"function"==typeof e&&(o=e,e=void 0),Ft(n,e).then((function(n){return t(n,o)}))}}function Ot(t,n,e,o){3===arguments.length&&"function"==typeof e&&(o=e,e=void 0);var r=Pt(t);return Ft(n,e).then((function(t){return r.parse(t,o)}))}Bt.parseRows,Bt.format,Bt.formatBody,Bt.formatRows,Bt.formatRow,Bt.formatValue;var Gt=Rt(It),jt=Rt(Et);function zt(t,n){return new Promise((function(e,o){var r=new Image;for(var i in n)r[i]=n[i];r.onerror=o,r.onload=function(){e(r)},r.src=t}))}function Wt(t){if(!t.ok)throw new Error(t.status+" "+t.statusText);if(204!==t.status&&205!==t.status)return t.json()}function Ht(t,n){return fetch(t,n).then(Wt)}function qt(t){return(n,e)=>Ft(n,e).then((n=>(new DOMParser).parseFromString(n,t)))}const $t=qt("application/xml");var Yt=qt("text/html"),Ut=qt("image/svg+xml"),Xt={value:()=>{}};function Vt(){for(var t,n=0,e=arguments.length,o={};n=0&&(e=t.slice(o+1),t=t.slice(0,o)),t&&!n.hasOwnProperty(t))throw new Error("unknown type: "+t);return{type:t,name:e}}))}function Kt(t,n){for(var e,o=0,r=t.length;o0)for(var e,o,r=new Array(e),i=0;i>8&15|n>>4&240,n>>4&15|240&n,(15&n)<<4|15&n,1):8===e?kn(n>>24&255,n>>16&255,n>>8&255,(255&n)/255):4===e?kn(n>>12&15|n>>8&240,n>>8&15|n>>4&240,n>>4&15|240&n,((15&n)<<4|15&n)/255):null):(n=mn.exec(t))?new Tn(n[1],n[2],n[3],1):(n=gn.exec(t))?new Tn(255*n[1]/100,255*n[2]/100,255*n[3]/100,1):(n=pn.exec(t))?kn(n[1],n[2],n[3],n[4]):(n=yn.exec(t))?kn(255*n[1]/100,255*n[2]/100,255*n[3]/100,n[4]):(n=vn.exec(t))?In(n[1],n[2]/100,n[3]/100,1):(n=bn.exec(t))?In(n[1],n[2]/100,n[3]/100,n[4]):wn.hasOwnProperty(t)?Cn(wn[t]):"transparent"===t?new Tn(NaN,NaN,NaN,0):null}function Cn(t){return new Tn(t>>16&255,t>>8&255,255&t,1)}function kn(t,n,e,o){return o<=0&&(t=n=e=NaN),new Tn(t,n,e,o)}function Sn(t){return t instanceof sn||(t=An(t)),t?new Tn((t=t.rgb()).r,t.g,t.b,t.opacity):new Tn}function Ln(t,n,e,o){return 1===arguments.length?Sn(t):new Tn(t,n,e,null==o?1:o)}function Tn(t,n,e,o){this.r=+t,this.g=+n,this.b=+e,this.opacity=+o}function Mn(){return"#"+Nn(this.r)+Nn(this.g)+Nn(this.b)}function Pn(){var t=this.opacity;return(1===(t=isNaN(t)?1:Math.max(0,Math.min(1,t)))?"rgb(":"rgba(")+Math.max(0,Math.min(255,Math.round(this.r)||0))+", "+Math.max(0,Math.min(255,Math.round(this.g)||0))+", "+Math.max(0,Math.min(255,Math.round(this.b)||0))+(1===t?")":", "+t+")")}function Nn(t){return((t=Math.max(0,Math.min(255,Math.round(t)||0)))<16?"0":"")+t.toString(16)}function In(t,n,e,o){return o<=0?t=n=e=NaN:e<=0||e>=1?t=n=NaN:n<=0&&(t=NaN),new En(t,n,e,o)}function Bn(t){if(t instanceof En)return new En(t.h,t.s,t.l,t.opacity);if(t instanceof sn||(t=An(t)),!t)return new En;if(t instanceof En)return t;var n=(t=t.rgb()).r/255,e=t.g/255,o=t.b/255,r=Math.min(n,e,o),i=Math.max(n,e,o),a=NaN,s=i-r,c=(i+r)/2;return s?(a=n===i?(e-o)/s+6*(e0&&c<1?0:a,new En(a,s,c,t.opacity)}function En(t,n,e,o){this.h=+t,this.s=+n,this.l=+e,this.opacity=+o}function Dn(t,n,e){return 255*(t<60?n+(e-n)*t/60:t<180?e:t<240?n+(e-n)*(240-t)/60:n)}function Fn(t,n,e,o,r){var i=t*t,a=i*t;return((1-3*t+3*i-a)*n+(4-6*i+3*a)*e+(1+3*t+3*i-3*a)*o+a*r)/6}rn(sn,An,{copy:function(t){return Object.assign(new this.constructor,this,t)},displayable:function(){return this.rgb().displayable()},hex:xn,formatHex:xn,formatHsl:function(){return Bn(this).formatHsl()},formatRgb:_n,toString:_n}),rn(Tn,Ln,an(sn,{brighter:function(t){return t=null==t?ln:Math.pow(ln,t),new Tn(this.r*t,this.g*t,this.b*t,this.opacity)},darker:function(t){return t=null==t?cn:Math.pow(cn,t),new Tn(this.r*t,this.g*t,this.b*t,this.opacity)},rgb:function(){return this},displayable:function(){return-.5<=this.r&&this.r<255.5&&-.5<=this.g&&this.g<255.5&&-.5<=this.b&&this.b<255.5&&0<=this.opacity&&this.opacity<=1},hex:Mn,formatHex:Mn,formatRgb:Pn,toString:Pn})),rn(En,(function(t,n,e,o){return 1===arguments.length?Bn(t):new En(t,n,e,null==o?1:o)}),an(sn,{brighter:function(t){return t=null==t?ln:Math.pow(ln,t),new En(this.h,this.s,this.l*t,this.opacity)},darker:function(t){return t=null==t?cn:Math.pow(cn,t),new En(this.h,this.s,this.l*t,this.opacity)},rgb:function(){var t=this.h%360+360*(this.h<0),n=isNaN(t)||isNaN(this.s)?0:this.s,e=this.l,o=e+(e<.5?e:1-e)*n,r=2*e-o;return new Tn(Dn(t>=240?t-240:t+120,r,o),Dn(t,r,o),Dn(t<120?t+240:t-120,r,o),this.opacity)},displayable:function(){return(0<=this.s&&this.s<=1||isNaN(this.s))&&0<=this.l&&this.l<=1&&0<=this.opacity&&this.opacity<=1},formatHsl:function(){var t=this.opacity;return(1===(t=isNaN(t)?1:Math.max(0,Math.min(1,t)))?"hsl(":"hsla(")+(this.h||0)+", "+100*(this.s||0)+"%, "+100*(this.l||0)+"%"+(1===t?")":", "+t+")")}}));const Rn=t=>()=>t;function On(t,n){var e=n-t;return e?function(t,n){return function(e){return t+e*n}}(t,e):Rn(isNaN(t)?n:t)}const Gn=function t(n){var e=function(t){return 1==(t=+t)?On:function(n,e){return e-n?function(t,n,e){return t=Math.pow(t,e),n=Math.pow(n,e)-t,e=1/e,function(o){return Math.pow(t+o*n,e)}}(n,e,t):Rn(isNaN(n)?e:n)}}(n);function o(t,n){var o=e((t=Ln(t)).r,(n=Ln(n)).r),r=e(t.g,n.g),i=e(t.b,n.b),a=On(t.opacity,n.opacity);return function(n){return t.r=o(n),t.g=r(n),t.b=i(n),t.opacity=a(n),t+""}}return o.gamma=t,o}(1);function jn(t){return function(n){var e,o,r=n.length,i=new Array(r),a=new Array(r),s=new Array(r);for(e=0;e=1?(e=1,n-1):Math.floor(e*n),r=t[o],i=t[o+1],a=o>0?t[o-1]:2*r-i,s=oi&&(r=n.slice(i,r),s[a]?s[a]+=r:s[++a]=r),(e=e[0])===(o=o[0])?s[a]?s[a]+=o:s[++a]=o:(s[++a]=null,c.push({i:a,x:Hn(e,o)})),i=Yn.lastIndex;return i=0&&n._call.call(null,t),n=n._next;--Zn}()}finally{Zn=0,function(){for(var t,n,e=Jn,o=1/0;e;)e._call?(o>e._time&&(o=e._time),t=e,e=e._next):(n=e._next,e._next=null,e=t?t._next=n:Jn=n);Kn=t,de(o)}(),oe=0}}function fe(){var t=ie.now(),n=t-ee;n>1e3&&(re-=n,ee=t)}function de(t){Zn||(te&&(te=clearTimeout(te)),t-oe>24?(t<1/0&&(te=setTimeout(he,t-ie.now()-re)),ne&&(ne=clearInterval(ne))):(ne||(ee=ie.now(),ne=setInterval(fe,1e3)),Zn=1,ae(he)))}function me(t,n,e){var o=new le;return n=null==n?0:+n,o.restart((e=>{o.stop(),t(e+n)}),n,e),o}le.prototype=ue.prototype={constructor:le,restart:function(t,n,e){if("function"!=typeof t)throw new TypeError("callback is not a function");e=(null==e?se():+e)+(null==n?0:+n),this._next||Kn===this||(Kn?Kn._next=this:Jn=this,Kn=this),this._call=t,this._time=e,de()},stop:function(){this._call&&(this._call=null,this._time=1/0,de())}};var ge=tn("start","end","cancel","interrupt"),pe=[];function ye(t,n,e,o,r,i){var a=t.__transition;if(a){if(e in a)return}else t.__transition={};!function(t,n,e){var o,r=t.__transition;function i(c){var l,u,h,f;if(1!==e.state)return s();for(l in r)if((f=r[l]).name===e.name){if(3===f.state)return me(i);4===f.state?(f.state=6,f.timer.stop(),f.on.call("interrupt",t,t.__data__,f.index,f.group),delete r[l]):+l0)throw new Error("too late; already scheduled");return e}function be(t,n){var e=we(t,n);if(e.state>3)throw new Error("too late; already running");return e}function we(t,n){var e=t.__transition;if(!e||!(e=e[n]))throw new Error("transition not found");return e}function xe(t,n){var e,o,r,i=t.__transition,a=!0;if(i){for(r in n=null==n?null:n+"",i)(e=i[r]).name===n?(o=e.state>2&&e.state<5,e.state=6,e.timer.stop(),e.on.call(o?"interrupt":"cancel",t,t.__data__,e.index,e.group),delete i[r]):a=!1;a&&delete t.__transition}}var _e,Ae=180/Math.PI,Ce={translateX:0,translateY:0,rotate:0,skewX:0,scaleX:1,scaleY:1};function ke(t,n,e,o,r,i){var a,s,c;return(a=Math.sqrt(t*t+n*n))&&(t/=a,n/=a),(c=t*e+n*o)&&(e-=t*c,o-=n*c),(s=Math.sqrt(e*e+o*o))&&(e/=s,o/=s,c/=s),t*o180?n+=360:n-t>180&&(t+=360),i.push({i:e.push(r(e)+"rotate(",null,o)-2,x:Hn(t,n)})):n&&e.push(r(e)+"rotate("+n+o)}(i.rotate,a.rotate,s,c),function(t,n,e,i){t!==n?i.push({i:e.push(r(e)+"skewX(",null,o)-2,x:Hn(t,n)}):n&&e.push(r(e)+"skewX("+n+o)}(i.skewX,a.skewX,s,c),function(t,n,e,o,i,a){if(t!==e||n!==o){var s=i.push(r(i)+"scale(",null,",",null,")");a.push({i:s-4,x:Hn(t,e)},{i:s-2,x:Hn(n,o)})}else 1===e&&1===o||i.push(r(i)+"scale("+e+","+o+")")}(i.scaleX,i.scaleY,a.scaleX,a.scaleY,s,c),i=a=null,function(t){for(var n,e=-1,o=c.length;++e=0&&(t=t.slice(0,n)),!t||"start"===t}))}(n)?ve:be;return function(){var a=i(this,t),s=a.on;s!==o&&(r=(o=s).copy()).on(n,e),a.on=r}}var Ve=bt.prototype.constructor;function Qe(t){return function(){this.style.removeProperty(t)}}function Je(t,n,e){return function(o){this.style.setProperty(t,n.call(this,o),e)}}function Ke(t,n,e){var o,r;function i(){var i=n.apply(this,arguments);return i!==r&&(o=(r=i)&&Je(t,i,e)),o}return i._value=n,i}function Ze(t){return function(n){this.textContent=t.call(this,n)}}function to(t){var n,e;function o(){var o=t.apply(this,arguments);return o!==e&&(n=(e=o)&&Ze(o)),n}return o._value=t,o}var no=0;function eo(t,n,e,o){this._groups=t,this._parents=n,this._name=e,this._id=o}function oo(){return++no}var ro=bt.prototype;eo.prototype=function(t){return bt().transition(t)}.prototype={constructor:eo,select:function(t){var n=this._name,e=this._id;"function"!=typeof t&&(t=s(t));for(var o=this._groups,r=o.length,i=new Array(r),a=0;a()=>t;function co(t,{sourceEvent:n,target:e,selection:o,mode:r,dispatch:i}){Object.defineProperties(this,{type:{value:t,enumerable:!0,configurable:!0},sourceEvent:{value:n,enumerable:!0,configurable:!0},target:{value:e,enumerable:!0,configurable:!0},selection:{value:o,enumerable:!0,configurable:!0},mode:{value:r,enumerable:!0,configurable:!0},_:{value:i}})}function lo(t){t.stopImmediatePropagation()}function uo(t){t.preventDefault(),t.stopImmediatePropagation()}var ho={name:"drag"},fo={name:"space"},mo={name:"handle"},go={name:"center"};const{abs:po,max:yo,min:vo}=Math;function bo(t){return[+t[0],+t[1]]}function wo(t){return[bo(t[0]),bo(t[1])]}var xo={name:"x",handles:["w","e"].map(Mo),input:function(t,n){return null==t?null:[[+t[0],n[0][1]],[+t[1],n[1][1]]]},output:function(t){return t&&[t[0][0],t[1][0]]}},_o={name:"y",handles:["n","s"].map(Mo),input:function(t,n){return null==t?null:[[n[0][0],+t[0]],[n[1][0],+t[1]]]},output:function(t){return t&&[t[0][1],t[1][1]]}},Ao={name:"xy",handles:["n","w","e","s","nw","ne","sw","se"].map(Mo),input:function(t){return null==t?null:wo(t)},output:function(t){return t}},Co={overlay:"crosshair",selection:"move",n:"ns-resize",e:"ew-resize",s:"ns-resize",w:"ew-resize",nw:"nwse-resize",ne:"nesw-resize",se:"nwse-resize",sw:"nesw-resize"},ko={e:"w",w:"e",nw:"ne",ne:"nw",se:"sw",sw:"se"},So={n:"s",s:"n",nw:"sw",ne:"se",se:"ne",sw:"nw"},Lo={overlay:1,selection:1,n:null,e:1,s:null,w:-1,nw:-1,ne:1,se:1,sw:-1},To={overlay:1,selection:1,n:-1,e:null,s:1,w:null,nw:-1,ne:-1,se:1,sw:1};function Mo(t){return{type:t}}function Po(t){return!t.ctrlKey&&!t.button}function No(){var t=this.ownerSVGElement||this;return t.hasAttribute("viewBox")?[[(t=t.viewBox.baseVal).x,t.y],[t.x+t.width,t.y+t.height]]:[[0,0],[t.width.baseVal.value,t.height.baseVal.value]]}function Io(){return navigator.maxTouchPoints||"ontouchstart"in this}function Bo(t){for(;!t.__brush;)if(!(t=t.parentNode))return;return t.__brush}function Eo(t){return t[0][0]===t[1][0]||t[0][1]===t[1][1]}function Do(t){var n=t.__brush;return n?n.dim.output(n.selection):null}function Fo(){return Go(xo)}function Ro(){return Go(_o)}function Oo(){return Go(Ao)}function Go(t){var n,e=No,o=Po,r=Io,i=!0,a=tn("start","brush","end"),s=6;function c(n){var e=n.property("__brush",g).selectAll(".overlay").data([Mo("overlay")]);e.enter().append("rect").attr("class","overlay").attr("pointer-events","all").attr("cursor",Co.overlay).merge(e).each((function(){var t=Bo(this).extent;wt(this).attr("x",t[0][0]).attr("y",t[0][1]).attr("width",t[1][0]-t[0][0]).attr("height",t[1][1]-t[0][1])})),n.selectAll(".selection").data([Mo("selection")]).enter().append("rect").attr("class","selection").attr("cursor",Co.selection).attr("fill","#777").attr("fill-opacity",.3).attr("stroke","#fff").attr("shape-rendering","crispEdges");var o=n.selectAll(".handle").data(t.handles,(function(t){return t.type}));o.exit().remove(),o.enter().append("rect").attr("class",(function(t){return"handle handle--"+t.type})).attr("cursor",(function(t){return Co[t.type]})),n.each(l).attr("fill","none").attr("pointer-events","all").on("mousedown.brush",f).filter(r).on("touchstart.brush",f).on("touchmove.brush",d).on("touchend.brush touchcancel.brush",m).style("touch-action","none").style("-webkit-tap-highlight-color","rgba(0,0,0,0)")}function l(){var t=wt(this),n=Bo(this).selection;n?(t.selectAll(".selection").style("display",null).attr("x",n[0][0]).attr("y",n[0][1]).attr("width",n[1][0]-n[0][0]).attr("height",n[1][1]-n[0][1]),t.selectAll(".handle").style("display",null).attr("x",(function(t){return"e"===t.type[t.type.length-1]?n[1][0]-s/2:n[0][0]-s/2})).attr("y",(function(t){return"s"===t.type[0]?n[1][1]-s/2:n[0][1]-s/2})).attr("width",(function(t){return"n"===t.type||"s"===t.type?n[1][0]-n[0][0]+s:s})).attr("height",(function(t){return"e"===t.type||"w"===t.type?n[1][1]-n[0][1]+s:s}))):t.selectAll(".selection,.handle").style("display","none").attr("x",null).attr("y",null).attr("width",null).attr("height",null)}function u(t,n,e){var o=t.__brush.emitter;return!o||e&&o.clean?new h(t,n,e):o}function h(t,n,e){this.that=t,this.args=n,this.state=t.__brush,this.active=0,this.clean=e}function f(e){if((!n||e.touches)&&o.apply(this,arguments)){var r,a,s,c,h,f,d,m,g,p,y,v=this,b=e.target.__data__.type,w="selection"===(i&&e.metaKey?b="overlay":b)?ho:i&&e.altKey?go:mo,x=t===_o?null:Lo[b],_=t===xo?null:To[b],A=Bo(v),C=A.extent,k=A.selection,S=C[0][0],L=C[0][1],T=C[1][0],M=C[1][1],P=0,N=0,I=x&&_&&i&&e.shiftKey,B=Array.from(e.touches||[e],(t=>{const n=t.identifier;return(t=Qn(t,v)).point0=t.slice(),t.identifier=n,t}));if("overlay"===b){k&&(g=!0);const n=[B[0],B[1]||B[0]];A.selection=k=[[r=t===_o?S:vo(n[0][0],n[1][0]),s=t===xo?L:vo(n[0][1],n[1][1])],[h=t===_o?T:yo(n[0][0],n[1][0]),d=t===xo?M:yo(n[0][1],n[1][1])]],B.length>1&&G()}else r=k[0][0],s=k[0][1],h=k[1][0],d=k[1][1];a=r,c=s,f=h,m=d;var E=wt(v).attr("pointer-events","none"),D=E.selectAll(".overlay").attr("cursor",Co[b]);xe(v);var F=u(v,arguments,!0).beforestart();if(e.touches)F.moved=O,F.ended=j;else{var R=wt(e.view).on("mousemove.brush",O,!0).on("mouseup.brush",j,!0);i&&R.on("keydown.brush",z,!0).on("keyup.brush",W,!0),en(e.view)}l.call(v),F.start(e,w.name)}function O(t){for(const n of t.changedTouches||[t])for(const t of B)t.identifier===n.identifier&&(t.cur=Qn(n,v));if(I&&!p&&!y&&1===B.length){const t=B[0];po(t.cur[0]-t[0])>po(t.cur[1]-t[1])?y=!0:p=!0}for(const t of B)t.cur&&(t[0]=t.cur[0],t[1]=t.cur[1]);g=!0,uo(t),G(t)}function G(t){const n=B[0],e=n.point0;var o;switch(P=n[0]-e[0],N=n[1]-e[1],w){case fo:case ho:x&&(P=yo(S-r,vo(T-h,P)),a=r+P,f=h+P),_&&(N=yo(L-s,vo(M-d,N)),c=s+N,m=d+N);break;case mo:B[1]?(x&&(a=yo(S,vo(T,B[0][0])),f=yo(S,vo(T,B[1][0])),x=1),_&&(c=yo(L,vo(M,B[0][1])),m=yo(L,vo(M,B[1][1])),_=1)):(x<0?(P=yo(S-r,vo(T-r,P)),a=r+P,f=h):x>0&&(P=yo(S-h,vo(T-h,P)),a=r,f=h+P),_<0?(N=yo(L-s,vo(M-s,N)),c=s+N,m=d):_>0&&(N=yo(L-d,vo(M-d,N)),c=s,m=d+N));break;case go:x&&(a=yo(S,vo(T,r-P*x)),f=yo(S,vo(T,h+P*x))),_&&(c=yo(L,vo(M,s-N*_)),m=yo(L,vo(M,d+N*_)))}f0&&(r=a-P),_<0?d=m-N:_>0&&(s=c-N),w=fo,D.attr("cursor",Co.selection),G());break;default:return}uo(t)}function W(t){switch(t.keyCode){case 16:I&&(p=y=I=!1,G());break;case 18:w===go&&(x<0?h=f:x>0&&(r=a),_<0?d=m:_>0&&(s=c),w=mo,G());break;case 32:w===fo&&(t.altKey?(x&&(h=f-P*x,r=a+P*x),_&&(d=m-N*_,s=c+N*_),w=go):(x<0?h=f:x>0&&(r=a),_<0?d=m:_>0&&(s=c),w=mo),D.attr("cursor",Co[b]),G());break;default:return}uo(t)}}function d(t){u(this,arguments).moved(t)}function m(t){u(this,arguments).ended(t)}function g(){var n=this.__brush||{selection:null};return n.extent=wo(e.apply(this,arguments)),n.dim=t,n}return c.move=function(n,e){n.tween?n.on("start.brush",(function(t){u(this,arguments).beforestart().start(t)})).on("interrupt.brush end.brush",(function(t){u(this,arguments).end(t)})).tween("brush",(function(){var n=this,o=n.__brush,r=u(n,arguments),i=o.selection,a=t.input("function"==typeof e?e.apply(this,arguments):e,o.extent),s=Vn(i,a);function c(t){o.selection=1===t&&null===a?null:s(t),l.call(n),r.brush()}return null!==i&&null!==a?c:c(1)})):n.each((function(){var n=this,o=arguments,r=n.__brush,i=t.input("function"==typeof e?e.apply(n,o):e,r.extent),a=u(n,o).beforestart();xe(n),r.selection=null===i?null:i,l.call(n),a.start().brush().end()}))},c.clear=function(t){c.move(t,null)},h.prototype={beforestart:function(){return 1==++this.active&&(this.state.emitter=this,this.starting=!0),this},start:function(t,n){return this.starting?(this.starting=!1,this.emit("start",t,n)):this.emit("brush",t),this},brush:function(t,n){return this.emit("brush",t,n),this},end:function(t,n){return 0==--this.active&&(delete this.state.emitter,this.emit("end",t,n)),this},emit:function(n,e,o){var r=wt(this.that).datum();a.call(n,this.that,new co(n,{sourceEvent:e,target:c,selection:t.output(this.state.selection),mode:o,dispatch:a}),r)}},c.extent=function(t){return arguments.length?(e="function"==typeof t?t:so(wo(t)),c):e},c.filter=function(t){return arguments.length?(o="function"==typeof t?t:so(!!t),c):o},c.touchable=function(t){return arguments.length?(r="function"==typeof t?t:so(!!t),c):r},c.handleSize=function(t){return arguments.length?(s=+t,c):s},c.keyModifiers=function(t){return arguments.length?(i=!!t,c):i},c.on=function(){var t=a.on.apply(a,arguments);return t===a?c:t},c}function jo(t,n){if((e=(t=n?t.toExponential(n-1):t.toExponential()).indexOf("e"))<0)return null;var e,o=t.slice(0,e);return[o.length>1?o[0]+o.slice(2):o,+t.slice(e+1)]}function zo(t){return(t=jo(Math.abs(t)))?t[1]:NaN}var Wo,Ho=/^(?:(.)?([<>=^]))?([+\-( ])?([$#])?(0)?(\d+)?(,)?(\.\d+)?(~)?([a-z%])?$/i;function qo(t){if(!(n=Ho.exec(t)))throw new Error("invalid format: "+t);var n;return new $o({fill:n[1],align:n[2],sign:n[3],symbol:n[4],zero:n[5],width:n[6],comma:n[7],precision:n[8]&&n[8].slice(1),trim:n[9],type:n[10]})}function $o(t){this.fill=void 0===t.fill?" ":t.fill+"",this.align=void 0===t.align?">":t.align+"",this.sign=void 0===t.sign?"-":t.sign+"",this.symbol=void 0===t.symbol?"":t.symbol+"",this.zero=!!t.zero,this.width=void 0===t.width?void 0:+t.width,this.comma=!!t.comma,this.precision=void 0===t.precision?void 0:+t.precision,this.trim=!!t.trim,this.type=void 0===t.type?"":t.type+""}function Yo(t,n){var e=jo(t,n);if(!e)return t+"";var o=e[0],r=e[1];return r<0?"0."+new Array(-r).join("0")+o:o.length>r+1?o.slice(0,r+1)+"."+o.slice(r+1):o+new Array(r-o.length+2).join("0")}qo.prototype=$o.prototype,$o.prototype.toString=function(){return this.fill+this.align+this.sign+this.symbol+(this.zero?"0":"")+(void 0===this.width?"":Math.max(1,0|this.width))+(this.comma?",":"")+(void 0===this.precision?"":"."+Math.max(0,0|this.precision))+(this.trim?"~":"")+this.type};const Uo={"%":(t,n)=>(100*t).toFixed(n),b:t=>Math.round(t).toString(2),c:t=>t+"",d:function(t){return Math.abs(t=Math.round(t))>=1e21?t.toLocaleString("en").replace(/,/g,""):t.toString(10)},e:(t,n)=>t.toExponential(n),f:(t,n)=>t.toFixed(n),g:(t,n)=>t.toPrecision(n),o:t=>Math.round(t).toString(8),p:(t,n)=>Yo(100*t,n),r:Yo,s:function(t,n){var e=jo(t,n);if(!e)return t+"";var o=e[0],r=e[1],i=r-(Wo=3*Math.max(-8,Math.min(8,Math.floor(r/3))))+1,a=o.length;return i===a?o:i>a?o+new Array(i-a+1).join("0"):i>0?o.slice(0,i)+"."+o.slice(i):"0."+new Array(1-i).join("0")+jo(t,Math.max(0,n+i-1))[0]},X:t=>Math.round(t).toString(16).toUpperCase(),x:t=>Math.round(t).toString(16)};function Xo(t){return t}var Vo,Qo,Jo,Ko=Array.prototype.map,Zo=["y","z","a","f","p","n","µ","m","","k","M","G","T","P","E","Z","Y"];function tr(t){var n,e,o=void 0===t.grouping||void 0===t.thousands?Xo:(n=Ko.call(t.grouping,Number),e=t.thousands+"",function(t,o){for(var r=t.length,i=[],a=0,s=n[0],c=0;r>0&&s>0&&(c+s+1>o&&(s=Math.max(1,o-c)),i.push(t.substring(r-=s,r+s)),!((c+=s+1)>o));)s=n[a=(a+1)%n.length];return i.reverse().join(e)}),r=void 0===t.currency?"":t.currency[0]+"",i=void 0===t.currency?"":t.currency[1]+"",a=void 0===t.decimal?".":t.decimal+"",s=void 0===t.numerals?Xo:function(t){return function(n){return n.replace(/[0-9]/g,(function(n){return t[+n]}))}}(Ko.call(t.numerals,String)),c=void 0===t.percent?"%":t.percent+"",l=void 0===t.minus?"−":t.minus+"",u=void 0===t.nan?"NaN":t.nan+"";function h(t){var n=(t=qo(t)).fill,e=t.align,h=t.sign,f=t.symbol,d=t.zero,m=t.width,g=t.comma,p=t.precision,y=t.trim,v=t.type;"n"===v?(g=!0,v="g"):Uo[v]||(void 0===p&&(p=12),y=!0,v="g"),(d||"0"===n&&"="===e)&&(d=!0,n="0",e="=");var b="$"===f?r:"#"===f&&/[boxX]/.test(v)?"0"+v.toLowerCase():"",w="$"===f?i:/[%p]/.test(v)?c:"",x=Uo[v],_=/[defgprs%]/.test(v);function A(t){var r,i,c,f=b,A=w;if("c"===v)A=x(t)+A,t="";else{var C=(t=+t)<0||1/t<0;if(t=isNaN(t)?u:x(Math.abs(t),p),y&&(t=function(t){t:for(var n,e=t.length,o=1,r=-1;o0&&(r=0)}return r>0?t.slice(0,r)+t.slice(n+1):t}(t)),C&&0==+t&&"+"!==h&&(C=!1),f=(C?"("===h?h:l:"-"===h||"("===h?"":h)+f,A=("s"===v?Zo[8+Wo/3]:"")+A+(C&&"("===h?")":""),_)for(r=-1,i=t.length;++r(c=t.charCodeAt(r))||c>57){A=(46===c?a+t.slice(r+1):t.slice(r))+A,t=t.slice(0,r);break}}g&&!d&&(t=o(t,1/0));var k=f.length+t.length+A.length,S=k>1)+f+t+A+S.slice(k);break;default:t=S+f+t+A}return s(t)}return p=void 0===p?6:/[gprs]/.test(v)?Math.max(1,Math.min(21,p)):Math.max(0,Math.min(20,p)),A.toString=function(){return t+""},A}return{format:h,formatPrefix:function(t,n){var e=h(((t=qo(t)).type="f",t)),o=3*Math.max(-8,Math.min(8,Math.floor(zo(n)/3))),r=Math.pow(10,-o),i=Zo[8+o/3];return function(t){return e(r*t)+i}}}}function nr(t){return Vo=tr(t),Qo=Vo.format,Jo=Vo.formatPrefix,Vo}function er(t){return Math.max(0,-zo(Math.abs(t)))}function or(t,n){return Math.max(0,3*Math.max(-8,Math.min(8,Math.floor(zo(n)/3)))-zo(Math.abs(t)))}function rr(t,n){return t=Math.abs(t),n=Math.abs(n)-t,Math.max(0,zo(n)-zo(t))+1}nr({thousands:",",grouping:[3],currency:["$",""]});var ir=Math.sqrt(50),ar=Math.sqrt(10),sr=Math.sqrt(2);function cr(t,n,e){var o=(n-t)/Math.max(0,e),r=Math.floor(Math.log(o)/Math.LN10),i=o/Math.pow(10,r);return r>=0?(i>=ir?10:i>=ar?5:i>=sr?2:1)*Math.pow(10,r):-Math.pow(10,-r)/(i>=ir?10:i>=ar?5:i>=sr?2:1)}function lr(t,n){return tn?1:t>=n?0:NaN}function ur(t){let n=t,e=t;function o(t,n,o,r){for(null==o&&(o=0),null==r&&(r=t.length);o>>1;e(t[i],n)<0?o=i+1:r=i}return o}return 1===t.length&&(n=(n,e)=>t(n)-e,e=function(t){return(n,e)=>lr(t(n),e)}(t)),{left:o,center:function(t,e,r,i){null==r&&(r=0),null==i&&(i=t.length);const a=o(t,e,r,i-1);return a>r&&n(t[a-1],e)>-n(t[a],e)?a-1:a},right:function(t,n,o,r){for(null==o&&(o=0),null==r&&(r=t.length);o>>1;e(t[i],n)>0?r=i:o=i+1}return o}}}const hr=ur(lr),fr=hr.right,dr=(hr.left,ur((function(t){return null===t?NaN:+t})).center,fr);function mr(t,n){return t=+t,n=+n,function(e){return Math.round(t*(1-e)+n*e)}}function gr(t){return+t}var pr=[0,1];function yr(t){return t}function vr(t,n){return(n-=t=+t)?function(e){return(e-t)/n}:function(t){return function(){return t}}(isNaN(n)?NaN:.5)}function br(t,n,e){var o=t[0],r=t[1],i=n[0],a=n[1];return rn&&(e=t,t=n,n=e),l=function(e){return Math.max(t,Math.min(n,e))}),o=c>2?wr:br,r=i=null,h}function h(n){return isNaN(n=+n)?e:(r||(r=o(a.map(t),s,c)))(t(l(n)))}return h.invert=function(e){return l(n((i||(i=o(s,a.map(t),Hn)))(e)))},h.domain=function(t){return arguments.length?(a=Array.from(t,gr),u()):a.slice()},h.range=function(t){return arguments.length?(s=Array.from(t),u()):s.slice()},h.rangeRound=function(t){return s=Array.from(t),c=mr,u()},h.clamp=function(t){return arguments.length?(l=!!t||yr,u()):l!==yr},h.interpolate=function(t){return arguments.length?(c=t,u()):c},h.unknown=function(t){return arguments.length?(e=t,h):e},function(e,o){return t=e,n=o,u()}}()(yr,yr)}function Ar(t,n){switch(arguments.length){case 0:break;case 1:this.range(t);break;default:this.range(n).domain(t)}return this}function Cr(t){var n=t.domain;return t.ticks=function(t){var e=n();return function(t,n,e){var o,r,i,a,s=-1;if(e=+e,(t=+t)==(n=+n)&&e>0)return[t];if((o=n0)for(t=Math.ceil(t/a),n=Math.floor(n/a),i=new Array(r=Math.ceil(n-t+1));++s=ir?r*=10:i>=ar?r*=5:i>=sr&&(r*=2),n0;){if((r=cr(c,l,e))===o)return i[a]=c,i[s]=l,n(i);if(r>0)c=Math.floor(c/r)*r,l=Math.ceil(l/r)*r;else{if(!(r<0))break;c=Math.ceil(c*r)/r,l=Math.floor(l*r)/r}o=r}return t},t}var kr,Sr={9606:{commonName:"Human",scientificName:"Homo sapiens",assemblies:{default:"GCF_000001405.26",GRCh38:"GCF_000001405.26",GRCh37:"GCF_000001405.13",NCBI36:"GCF_000001405.12"},hasGeneCache:!0,hasParalogCache:!0,hasInteractionCache:!0},10090:{commonName:"Mouse",scientificName:"Mus musculus",assemblies:{default:"GCF_000001635.20",GRCm38:"GCF_000001635.20",MGSCv37:"GCF_000001635.18"},hasGeneCache:!0,hasParalogCache:!0,hasInteractionCache:!0},9598:{commonName:"Chimpanzee",scientificName:"Pan troglodytes",assemblies:{default:"GCF_000001515.7","Pan_tro 3.0":"GCF_000001515.7"},hasGeneCache:!0,hasParalogCache:!0},10116:{commonName:"Rat",scientificName:"Rattus norvegicus",assemblies:{default:"GCF_000001895.5","Rnor_6.0":"GCF_000001895.5"},hasGeneCache:!0,hasParalogCache:!0},3702:{commonName:"Thale cress",scientificName:"Arabidopsis thaliana",assemblies:{default:"GCF_000001735.3",TAIR10:"GCF_000001735.3"}},4530:{commonName:"Rice",scientificName:"Oryza sativa",assemblies:{default:"GCA_001433935.1","IRGSP-1.0":"GCA_001433935.1"}},4577:{commonName:"Maize",scientificName:"Zea mays",assemblies:{default:"GCA_000005005.5","IRGSP-1.0":"GCA_001433935.1"}},4641:{commonName:"Banana",scientificName:"Musa acuminata",assemblies:{default:"mock"}},7227:{commonName:"Fly",scientificName:"Drosophila melanogaster",assemblies:{default:"GCA_000001215.4","Release 6 plus ISO1 MT":"GCA_000001215.4"}},7165:{commonName:"Mosquito",scientificName:"Anopheles gambiae",assemblies:{default:"GCF_000005575.2"}},746128:{commonName:"Aspergillis fumigatus",scientificName:"Aspergillis fumigatus",assemblies:{default:"GCF_000002655.1"}},227321:{scientificName:"Aspergillus nidulans",assemblies:{default:"GCF_000149205.2"}},5061:{commonName:"black mold",scientificName:"Aspergillus niger",assemblies:{default:"GCF_003184595.1"}},5062:{commonName:"koji",scientificName:"Aspergillus oryzae",assemblies:{default:"GCF_000184455.2"}},15368:{commonName:"stiff brome",scientificName:"Brachypodium distachyon",assemblies:{default:"GCF_000005505.3"}},60711:{commonName:"green monkey",scientificName:"Chlorocebus sabaeus",assemblies:{default:"GCF_015252025.1"}},7719:{commonName:"Vase tunicate",scientificName:"Ciona intestinalis",assemblies:{default:"GCF_000224145.3"}},9685:{commonName:"Cat",scientificName:"Felis catus",assemblies:{default:"GCF_000181335.3"},hasGeneCache:!0},9031:{commonName:"Chicken",scientificName:"Gallus gallus",assemblies:{default:"GCF_000002315.6"},hasGeneCache:!0,hasParalogCache:!0},9593:{commonName:"Gorilla",scientificName:"Gorilla gorilla",assemblies:{default:"GCF_008122165.1"}},4513:{commonName:"Barley",scientificName:"Hordeum vulgare",assemblies:{default:"GCA_901482405.1"}},9541:{commonName:"Crab-eating macaque",scientificName:"Macaca fascicularis",assemblies:{default:"GCF_000364345.1"},hasGeneCache:!0,hasParalogCache:!0},9544:{commonName:"Rhesus macaque",scientificName:"Macaca mulatta",assemblies:{default:"GCF_003339765.1"},hasGeneCache:!0,hasParalogCache:!0},9597:{commonName:"Bonobo",scientificName:"Pan paniscus",assemblies:{default:"GCF_013052645.1"}},9615:{commonName:"Dog",scientificName:"Canis lupus familiaris",assemblies:{default:"GCF_014441545.1"},hasGeneCache:!0,hasParalogCache:!0},4932:{commonName:"Yeast",scientificName:"Saccharomyces cerevisiae",assemblies:{default:"GCA_000146045.2",R64:"GCA_000146045.2"}},5833:{commonName:"malaria parasite",scientificName:"Plasmodium falciparum",assemblies:{default:"GCA_000002765.3",GCA_000002765:"GCA_000002765.3"}},6239:{commonName:"worm",scientificName:"Caenorhabditis elegans",assemblies:{default:"GCF_000002985.6"},hasGeneCache:!0,hasParalogCache:!0},4081:{commonName:"tomato",scientificName:"Solanum lycopersicum",assemblies:{default:"GCF_000188115.4"}},4072:{commonName:"pepper",scientificName:"Capsicum annuum",assemblies:{default:"GCF_000710875.1"}}},Lr=Object.assign({},e,o,r,i);function Tr(){return"assembly"in this.config&&/(GCF_|GCA_)/.test(this.config.assembly)}function Mr(t){var n,e,o,r=document.scripts,i=Ideogram.version;if(!1===location.pathname.includes("/examples/vanilla/"))return`https://cdn.jsdelivr.net/npm/ideogram@${i}/dist/data/${t}`;for(var a=0;a{if(e.ok)return e;if(!1===n)return Pr(t.replace(".json",""),!0);throw Error("Fetch failed for "+t)}))}function Nr(){return Mr("bands/native/")}function Ir(t){return Math.round(100*t)/100}function Br(t){call(this.onDidRotateCallback,t)}function Er(){return Lr.select(this.selector).node()}function Dr(t,n){var e=this.config,o=new Headers;return e.accessToken&&(o=new Headers({Authorization:"Bearer "+e.accessToken})),"text"===n?Lr.text(t,{headers:o}):Lr.json(t,{headers:o})}function Fr(t){t=jr(t);for(const n in Sr){const e=Sr[n],o=jr(e.commonName),r=jr(e.scientificName);if(o===t||r===t)return n}return null}function Rr(t){var n,e,o,r,i=this.organisms;for(e in t=jr(t),i)if(o=jr((n=i[e]).commonName),r=jr(n.scientificName),o===t||r===t)return e;return null}function Or(t){return t in this.organisms?this.organisms[t].commonName:null}function Gr(t){return t in this.organisms?this.organisms[t].scientificName:null}function jr(t){return void 0===t?"":t.toLowerCase().replace(/ /g,"-")}function zr(t){return/^M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})$/i.test(t)}function Wr(t){var n={M:1e3,D:500,C:100,L:50,X:10,V:5,I:1};return t.toUpperCase().split("").reduce((function(t,e,o,r){return n[e]=n)&&(e=n);else{let o=-1;for(let r of t)null!=(r=n(r,++o,t))&&(e=r)&&(e=r)}return e},kr=[["gneg","#FFF","#FFF","#DDD"],["gpos25","#C8C8C8","#DDD","#BBB"],["gpos33","#BBB","#BBB","#AAA"],["gpos50","#999","#AAA","#888"],["gpos66","#888","#888","#666"],["gpos75","#777","#777","#444"],["gpos100","#444","#666","#000"],["acen","#FEE","#FEE","#FDD"],["noBands","#BBB","#BBB","#AAA"]];let Yr='#_ideogram {padding-left: 5px;} #_ideogram .labeled {padding-left: 15px;} #_ideogram.labeledLeft {padding-left: 15px; padding-top: 15px;} #_ideogram text {font: 9px Tahoma; fill: #000;} #_ideogram .italic {font-style: italic;} #_ideogram .chromosome {cursor: pointer; fill: #AAA;}#_ideogram.no-rotate .chromosome {cursor: default;} #_ideogram .chrLabel, #_ideogram .annot {cursor: pointer;}#_ideogram .chrSetLabel {font-weight: bolder;}#_ideogram .ghost {opacity: 0.2;}#_ideogram .hidden {display: none;}#_ideogram .bandLabelStalk line {stroke: #AAA; stroke-width: 1;}#_ideogram .syntenyBorder {stroke:#AAA;stroke-width:1;}#_ideogram rect.cursor { fill: #F00; stroke: #F00; fill-opacity: .3; shape-rendering: crispEdges;}#_ideogram .brush .selection { fill: #F00; stroke: #F00; fill-opacity: .3; shape-rendering: crispEdges;}#_ideogram .noBands {fill: #AAA;}#_ideogram .gneg {fill: #FFF}#_ideogram .gpos25 {fill: #BBB}#_ideogram .gpos33 {fill: #AAA}#_ideogram .gpos50 {fill: #888}#_ideogram .gpos66 {fill: #666}#_ideogram .gpos75 {fill: #444}#_ideogram .gpos100 {fill: #000}#_ideogram .gpos {fill: #000}#_ideogram .acen {fill: #FDD}#_ideogram .stalk {fill: #CCE;}#_ideogram .gvar {fill: #DDF}#_ideogram.faint .gneg {fill: #FFF}#_ideogram.faint .gpos25 {fill: #EEE}#_ideogram.faint .gpos33 {fill: #EEE}#_ideogram.faint .gpos50 {fill: #EEE}#_ideogram.faint .gpos66 {fill: #EEE}#_ideogram.faint .gpos75 {fill: #EEE}#_ideogram.faint .gpos100 {fill: #DDD}#_ideogram.faint .gpos {fill: #DDD}#_ideogram.faint .acen {fill: #FEE}#_ideogram.faint .stalk {fill: #EEF;}#_ideogram.faint .gvar {fill: #EEF}#_ideogram .gneg {fill: url("#gneg")} #_ideogram .gpos25 {fill: url("#gpos25")} #_ideogram .gpos33 {fill: url("#gpos33")} #_ideogram .gpos50 {fill: url("#gpos50")} #_ideogram .gpos66 {fill: url("#gpos66")} #_ideogram .gpos75 {fill: url("#gpos75")} #_ideogram .gpos100 {fill: url("#gpos100")} #_ideogram .gpos {fill: url("#gpos100")} #_ideogram .acen {fill: url("#acen")} #_ideogram .stalk {fill: url("#stalk")} #_ideogram .gvar {fill: url("#gvar")} #_ideogram .noBands {fill: url("#noBands")} #_ideogram .chromosome {fill: url("#noBands")} ';function Ur(t){var n;this.config=JSON.parse(JSON.stringify(t)),(n=this).chromosomesArray=[],n.coordinateSystem="iscn",n.maxLength={bp:0,iscn:0},n.chromosomes={},n.numChromosomes=0,n.config.debug||(n.config.debug=!1),n.config.dataDir||(n.config.dataDir=n.getDataDir()),n.config.container||(n.config.container="body"),n.selector=n.config.container+" #_ideogram",n.config.resolution||(n.config.resolution=""),n.config.orientation||(n.config.orientation="vertical"),n.config.brush||(n.config.brush=null),n.config.rows||(n.config.rows=1),"showChromosomeLabels"in n.config==0&&(n.config.showChromosomeLabels=!0),n.config.showNonNuclearChromosomes||(n.config.showNonNuclearChromosomes=!1),n.config.chromosomeScale||(n.config.chromosomeScale="absolute"),n.config.showTools||(n.config.showTools=!1),function(t){t.config.ploidy||(t.config.ploidy=1),t.config.ploidy>1&&(t.sexChromosomes={},t.config.sex||(t.config.sex="male"),2!==t.config.ploidy||t.config.ancestors||(t.config.ancestors={M:"#ffb6c1",P:"#add8e6"},t.config.ploidyDesc="MP"))}(this),function(t){t.config.showBandLabels||(t.config.showBandLabels=!1),"showFullyBanded"in t.config==0&&(t.config.showFullyBanded=!0),t.bandsToShow=[],t.bandData={}}(this),function(t){var n,e,o;t.config.chrHeight||(n=t.config.container,e=document.querySelector(n).getBoundingClientRect(),o="vertical"===t.config.orientation?e.height:e.width,"body"!==n&&0!==o||(o=400),t.config.chrHeight=o)}(this),function(t){var n,e;t.config.chrWidth||(n=10,(e=t.config.chrHeight)<900&&e>500?n=Math.round(e/40):e>=900&&(n=Math.round(e/45)),t.config.chrWidth=n)}(this),function(t){t.config.geometry&&"collinear"===t.config.geometry?"chrMargin"in t.config==0&&(t.config.chrMargin=0):(t.config.chrMargin||(1===t.config.ploidy?t.config.chrMargin=10:t.config.chrMargin=Math.round(t.config.chrWidth/4)),t.config.showBandLabels&&(t.config.chrMargin+=20))}(this),function(t,n){t.onLoad&&(n.onLoadCallback=t.onLoad),t.onLoadAnnots&&(n.onLoadAnnotsCallback=t.onLoadAnnots),t.onDrawAnnots&&(n.onDrawAnnotsCallback=t.onDrawAnnots),t.onBrushMove&&(n.onBrushMoveCallback=t.onBrushMove),t.onBrushEnd&&(n.onBrushEndCallback=t.onBrushEnd),t.onCursorMove&&(n.onCursorMoveCallback=t.onCursorMove),t.onDidRotate&&(n.onDidRotateCallback=t.onDidRotate),t.onWillShowAnnotTooltip&&(n.onWillShowAnnotTooltipCallback=t.onWillShowAnnotTooltip),t.onClickAnnot&&(n.onClickAnnotCallback=t.onClickAnnot)}(t,this),function(t,n){n.organisms=Object.assign({},Sr),t.taxid&&t.organismMetadata&&(n.organisms[t.taxid]=t.organismMetadata),n.organismsWithBands=Object.assign({},n.organisms)}(t,this),function(t){t.bump=Math.round(t.config.chrHeight/125),t.adjustedBump=!1,t.config.chrHeight<200&&(t.adjustedBump=!0,t.bump=4)}(this),function(t,n){t.chromosome&&(n.config.chromosomes=[t.chromosome],"showBandLabels"in t==0&&(n.config.showBandLabels=!0),"rotatable"in t==0&&(n.config.rotatable=!1))}(t,this),function(t){const n=t.config;n.chrLabelSize||(t.config.chrLabelSize=9),n.chrLabelColor||(t.config.chrLabelColor="#000"),n.fontFamily||(t.config.fontFamily="");const e=`font-size: ${n.chrLabelSize}px`,o=`fill: ${n.chrLabelColor}`,r=`font-family: ${n.fontFamily}`;Yr+=`#_ideogram text {${r}; ${e}; ${o};}`,Yr+=`#_ideogramLabel text {${r};}`}(this),this.initAnnotSettings(),this.config.geometry&&"parallel"!==this.config.geometry||(this.config.chrMargin+=this.config.chrWidth,"heatmap"===this.config.annotationsLayout?this.config.chrMargin+=this.config.annotTracksHeight:this.config.chrMargin+=2*this.config.annotTracksHeight),this.init()}const Xr=function(t){var n,e,o,r,i=t.config;if(t.config.annotLabelHeight=12,"demarcateCollinearChromosomes"in t.config==0&&(t.config.demarcateCollinearChromosomes=!0),e=function(t,n){var e,o,r,i,a,s,c,l={};for(e=[],o=0;o tspan");t.setAttribute("x",s),t.setAttribute("dy",f-8),i.querySelector(".chrLabel").setAttribute("text-anchor","start")}i.setAttribute("transform","rotate(90) translate("+a+","+c+")"),i.querySelector(".chromosome").setAttribute("transform","translate(-13, 10)")}!function(t){t.config.taxids.forEach(((n,e)=>{var o=t.organisms[n].scientificName;Lr.select(t.selector).append("text").attr("class","genomeLabel italic").attr("x",55+200*e).attr("y",10).text(o).attr("text-anchor","middle")}))}(o)}(n,e,-40,t),r=Math.round(e.slice(-1)[0]+70),i.multiorganism){o*=8;var a=0;e.forEach((t=>{t>a&&(a=t)})),o=a+30}else o=xOffsets.slice(-1)[0]+30;Lr.select(t.selector).attr("height",o).attr("width",r),Lr.select("#_ideogramTrackLabelContainer").remove(),Lr.select("#_ideogramInnerWrap").insert("div",":first-child").attr("id","_ideogramTrackLabelContainer").style("position","absolute")};const Vr=function(t){var n,e,o,r,i,a=t.config,s=a.annotationHeight||0;if("vertical"!==a.orientation){t.config.annotLabelHeight=12;var c=t.config.annotLabelHeight;if("demarcateCollinearChromosomes"in t.config==0&&(t.config.demarcateCollinearChromosomes=!0),n=document.querySelectorAll(".chromosome-set"),o=a.numAnnotTracks*(s+c+4)-a.chrWidth+1,e=function(t,n){var e,o,r,i,a,s,c,l={};for(e=[],o=0;o{var o=t.organisms[n],r=t.config,i=o.scientificName;Lr.select(t.selector).append("text").attr("class","genomeLabel italic").attr("x",5).attr("y",r.chrLabelSize+(200+3*r.chrWidth)*e).text(i)}))}(o)}(n,e,o,t),r=o+2*a.chrWidth+20,a.multiorganism){r*=8;var l=0;e.forEach((t=>{t>l&&(l=t)})),i=l+20}else i=e.slice(-1)[0]+20;Lr.select(t.selector).attr("width",i).attr("height",r),Lr.select("#_ideogramTrackLabelContainer").remove(),Lr.select("#_ideogramInnerWrap").insert("div",":first-child").attr("id","_ideogramTrackLabelContainer").style("position","absolute")}else Xr(t)};function Qr(t){void 0!==t.timeout&&window.clearTimeout(t.timeout),t.rawAnnots=t.setOriginalTrackIndexes(t.rawAnnots),t.config.annotationsDisplayedTracks?t.annots=t.updateDisplayedTracks(t.config.annotationsDisplayedTracks):(t.annots=t.processAnnotData(t.rawAnnots),t.config.filterable&&t.initCrossFilter(),t.drawProcessedAnnots(t.annots))}function Jr(t){var n=(new Date).getTime(),e=this,o=e.config,r=o.annotations;e.initDrawChromosomes(),o.annotationsPath&&function(t){t.rawAnnots?Qr(t):function n(){t.timeout=setTimeout((function(){!t.rawAnnots||t.rawAnnots&&void 0!==t.rawAnnots.then?n():Qr(t)}),50)}()}(e),function(t,n){var e,o,r,i;if(!0===t.showBandLabels&&(r=(new Date).getTime(),n.hideUnshownBandLabels(),i=(new Date).getTime(),t.debug&&console.log("Time in showing bands: "+(i-r)+" ms"),"vertical"===t.orientation))for(e=0;e0}return!0}}class Zr{constructor(t){this._node=t}getLabel(){return Lr.select(this._node.parentNode).select("text.chrLabel").text()}getSetLabel(){return Lr.select(this._node.parentNode).select("text.chrSetLabel").text()}}const ti=class{constructor(t,n){if(this._config=t,this._ideo=n,this._ploidy=this._ideo._ploidy,this._translate=void 0,"chrSetMargin"in t)this.chrSetMargin=t.chrSetMargin;else{var e=this._config.chrMargin;this.chrSetMargin=this._config.ploidy>1?e:0}this._tickSize=8,this._isRotated=!1}_getLeftMargin(){return this.margin.left}_getYScale(){return 20/this._config.chrWidth}getChromosomeLabels(t){var n=new Zr(t),e=[];return this._ideo.config.ploidy>1&&e.push(n.getSetLabel()),e.push(n.getLabel()),e.filter((function(t){return t.length>0}))}getChromosomeBandLabelTranslate(t){var n,e,o,r=this._ideo,i=this._tickSize,a=r.config.orientation;return"vertical"===a?o="rotate(-90)translate("+(n=i)+","+(e=r.round(2+t.px.start+t.px.width/2))+")":"horizontal"===a&&(o="translate("+(n=r.round(-i+t.px.start+t.px.width/2))+","+(e=-10)+")"),{x:n,y:e,translate:o}}didRotate(t,n){var e,o,r,i,a,s,c,l,u;o=(e=this._ideo).config.taxid,r=n.id.split("-")[0].replace("chr",""),i=(a=e.chromosomes[o][r]).bands,l=(c=Lr.select(n.parentNode)).attr("transform"),u=/scale\(.*\)/.exec(l),l=l.replace(u,""),c.attr("transform",l),s=a.width,(a=e.getChromosomeModel(i,r,o,t)).oldWidth=s,e.chromosomes[o][r]=a,e.drawChromosome(a),e.handleRotateOnClick(),e.rawAnnots&&(e.displayedTrackIndexes?e.updateDisplayedTracks(e.displayedTrackIndexes):(e.annots=e.processAnnotData(e.rawAnnots),e.drawProcessedAnnots(e.annots),e.config.filterable&&e.initCrossFilter())),!0===e.config.showBandLabels&&(e.drawBandLabels(e.chromosomes),e.hideUnshownBandLabels()),e.onDidRotateCallback&&e.onDidRotateCallback(a)}rotate(t,n,e){var o,r,i,a;o=this._ideo,a=o.selector+" .chrSetLabel, "+o.selector+" .chrLabel",i=document.querySelector(o.selector).getBoundingClientRect(),r=Lr.selectAll(o.selector+" g.chromosome").filter((function(){return this!==e})),this._isRotated?(this._isRotated=!1,o.config.chrHeight=o.config.chrHeightOriginal,o.config.chrWidth=o.config.chrWidthOriginal,o.config.annotationHeight=o.config.annotationHeightOriginal,this.rotateBack(t,n,e,(function(){r.style("display",null),Lr.selectAll(a).style("display",null),o._layout.didRotate(n,e)}))):(this._isRotated=!0,r.style("display","none"),Lr.selectAll(a).style("display","none"),this.rotateForward(t,n,e,(function(){var t,r,a;o.config.chrHeightOriginal=o.config.chrHeight,o.config.chrWidthOriginal=o.config.chrWidth,o.config.annotationHeightOriginal=o.config.annotationHeight,"VerticalLayout"===o._layout._class?(r=i.width-20,a=window.innerWidth-20):(r=i.height-10,a=window.innerHeight-10),t=a0?n:n+4+2*t);if(!this._translate){var a;this._translate=[this._ploidy.getSetSize(0)*i*2];for(var s=1;s1&&(t*=1.8),t}rotateForward(t,n,e,o){var r;Lr.select(e.parentNode).transition().attr("transform","rotate(90) translate(30, -37.5) ").on("end",o),r=this.getChromosomeLabels(e),Lr.select(this._ideo.getSvg()).append("g").attr("class","tmp").selectAll("text").data(r).enter().append("text").attr("class",(function(t,n){return 0===n&&2===r.length?"chrSetLabel":null})).attr("x",26).attr("y",(function(t,n){return 12*(n+1+r.length%2)})).style("text-anchor","middle").style("opacity",0).text(String).transition().style("opacity",1),this._ideo.config.orientation="vertical"}rotateBack(t,n,e,o){var r=this.getChromosomeSetTranslate(t);Lr.select(e.parentNode).transition().attr("transform",r).on("end",o),Lr.selectAll(this._ideo.selector+" g.tmp").style("opacity",0).remove(),this._ideo.config.orientation="horizontal"}getHeight(t){void 0===t&&(t=this._config.taxids[0]);var n=this._config.chromosomes[t].length,e=this.getChromosomeSetYTranslate(n-1);return(e+=this._getChromosomeSetSize(n-1))+2*this._getAdditionalOffset()}getWidth(){return this._config.chrHeight+1.5*this.margin.top}getChromosomeSetLabelAnchor(){return"end"}getChromosomeBandLabelAnchor(){return null}getChromosomeBandTickY1(){return 2}getChromosomeBandTickY2(){return 10}getChromosomeSetLabelTranslate(){return null}getChromosomeSetTranslate(t){return"translate("+this._getLeftMargin()+", "+this.getChromosomeSetYTranslate(t)+")"}getChromosomeSetYTranslate(t){if(!this._config.ploidyDesc)return this._config.chrMargin*(t+1);if(!this._translate){this._translate=[1];for(var n=1;nthis.chrsPerRow-1?(n=this.margin.left+1.3*this._config.chrHeight,e=this.getChromosomeSetYTranslate(t-this.chrsPerRow)):(n=this.margin.left,e=this.getChromosomeSetYTranslate(t)),"rotate(90) translate("+n+", -"+e+")"}getChromosomeSetYTranslate(t){var n=.3*this._getAdditionalOffset();return this.margin.left*t+this._config.chrWidth+2*n+n*t}getChromosomeSetLabelXPosition(t){return(this._ploidy.getSetSize(t)*this._config.chrWidth+20)/-2+(this._config.ploidy>1?0:this._config.chrWidth)}getChromosomeLabelXPosition(){return this._config.chrWidth/-2}};function ii(t){var n=this;n.config.annotationsPath&&n.fetchAnnots(n.config.annotationsPath),function(t){if("ploidyDesc"in t.config&&"string"==typeof t.config.ploidyDesc){for(var n=[],e=0;e1?new ri(n,t):"vertical"===n.orientation?new ni(n,t):"horizontal"===n.orientation?new ei(n,t):new ni(n,t)}(n),function(t){Lr.selectAll(t.config.container+" #_ideogramOuterWrap").remove(),Lr.select(t.config.container).append("div").attr("id","_ideogramOuterWrap").append("div").attr("id","_ideogramTrackLabelContainer").style("position","absolute"),Lr.select(t.config.container+" #_ideogramOuterWrap").append("div").attr("id","_ideogramMiddleWrap").style("position","relative").style("overflow-x","auto").style("transform","translateZ(0)").append("div").attr("id","_ideogramInnerWrap").append("svg").attr("id","_ideogram").attr("class",function(t){var n="";return t.config.showChromosomeLabels&&("horizontal"===t.config.orientation?n+="labeledLeft ":n+="labeled "),!1===t.config.rotatable&&(n+="no-rotate "),t.config.annotationsLayout&&"overlay"===t.config.annotationsLayout&&(n+="faint"),n}(t)).attr("width",t._layout.getWidth()).attr("height",t._layout.getHeight()).html(t.getBandColorGradients())}(n),n.isOnlyIdeogram=1===document.querySelectorAll("#_ideogram").length,function(t){Lr.select(t.config.container+" #_ideogramOuterWrap").append("div").attr("class","_ideogramTooltip").attr("id","_ideogramTooltip").style("opacity",0).style("position","fixed").style("text-align","center").style("padding","4px").style("font","12px sans-serif").style("background","white").style("border","1px solid black").style("border-radius","5px").style("z-index","1000")}(n),n.finishInit(t)}var ai="";function si(t,n,e){return e.config.dataDir+t[n]}function ci(t,n,e){var o=e.config.ploidy;return"sex"in e.config&&(2===o&&e.sexChromosomes.index+1===n||"female"===e.config.sex&&"Y"===t.name)}function li(t,n,e,o){var r,i,a,s,c;for(r=0;r=chrBands.length/2&&(n.coordinateSystem="bp")}function hi(){var t,n,e,o,r=this,i=r.config.taxids;for(n=0;n"MT"!==t)),void 0!==o&&(o=o.filter((t=>"MT"!==t[0].chr)))),ui(e,r),r.chromosomes[t]={},r.setSexChromosomes(e),li(o,e,t,r),r.config.showBandLabels&&r.drawBandLabels(r.chromosomes),r.handleRotateOnClick(),r._gotChrModels=!0}function fi(){var t=this;"rotatable"in t.config&&!1===t.config.rotatable?Lr.selectAll(t.selector).style("cursor","default"):Lr.selectAll(t.selector+" .chromosome-set").on("click",(function(){const n=this.children[1];t.rotateAndToggleDisplay(n)}))}function di(){call(this.onLoadCallback)}function mi(t,n,e){var o=e.organisms[t],r=[jr(o.scientificName)],i=o.assemblies,a=e.config.resolution;return n!==i.default&&r.push(n),"9606"===t&&(n in i==="false"&&Object.values(i).includes(config.assembly)||""!==a&&850!==a)&&r.push(a),r=r.join("-"),["9606","10090","10116"].includes(t)&&!e.config.showFullyBanded&&(r+="-no-bands"),r+".json"}function gi(t,n,e){var o,r,i,a=e.config;o=e.organisms[t],a.assembly||(e.config.assembly="default"),r=o.assemblies,i=mi(t,e.assemblyIsAccession()?a.assembly:r[a.assembly],e);var s="-1"===t;return(t in e.organismsWithBands||s)&&(n[t]=i),n}function pi(t,n,e,o){return function(t,n,e){var o=si(t,n,e);return(!(void 0!==window.chrBands&&""===ai)||ai!==o)&&function(t){return"assembly"in t.config&&!1===/(GCA_)/.test(t.config.assembly)}(e)&&n in t}(n,t,o)?function(t,n,e,o){var r=si(t,n,o);return o.numBandDataResponses||(o.numBandDataResponses=0),Pr(r).then((function(n){return n.json().then((function(e){ai=r,delete window.chrBands,window.chrBands=e.chrBands,function(t,n,e,o){var r,i,a;for(r in n)a=n[r],t.includes(a)&&""!==a&&(i=r);o.bandData[i]=e}(n.url,t,chrBands,o)}))}))}(n,t,0,o).then((function(){return o.processBandData(t)})):new Promise((function(n){o.processBandData(t),n([t,void 0])}))}var yi={},vi={},bi={};function wi(t){var n=(t=t||this).config.container;bi[n]?(vi[n]=!0,yi[n]=t):(bi[n]=!0,function(t){return new Promise((function(n){var e=t.config.organism;"number"==typeof e?t.getOrganismFromEutils(e,(function(){t.getTaxids(n)})):t.getTaxids(n)}))}(t).then((function(e){var o=e[0];t.config.taxid=o,t.config.taxids=e,t.organismScientificName=t.getScientificName(t.config.taxid),function(t,n,e){var o,r,i,a=[];for(i in o={},Sr)o[i]="";for(r=0;r=4&&(l=u[3],o[0]=l),u.length>=8&&(s=u[8].split(","),c=xi.rgbToHex(s[0],s[1],s[2]),o.push(c)),[r,o])}parseRawAnnots(t,n,e,o){var r,i,a,s,c,l;for(l=!0,!1===isNaN(parseInt(e[n],10))&&(l=!1),r=n;r=8&&c.push("color"),{keys:c,annots:t}}parseBed(t,n){var e,o,r,i,a=[],s=t.split(/\r\n|\n/);for(o=Object.keys(n.chromosomes[n.config.taxid]),e=0;e{n.includes(t)&&(e=o)})),e}parseAnnotFromTsvLine(t,n,e){var o,r,i,a,s,c,l,u,h=t.split(/\t/g);return[i,a,stop,length]=this.parseGenomicCoordinates(h),-1===(r=e.indexOf(i))?[null,null]:(o=[h[0],a,length,0],n.includes("color")&&(s=h[this.getValueColumnIndex("color",n)],o.push(s)),n.includes("full_name")&&(c=h[this.getValueColumnIndex("full_name",n)],o.push(c)),n.includes("citations")&&(u=h[this.getValueColumnIndex("citations",n)],o.push(u)),n.includes("significance")&&(l=h[this.getValueColumnIndex("significance",n)],o.push(l)),[r,o])}parseRawAnnots(t,n,e,o){var r,i,a,s,c;const l=e[0];for(r=n;r(t.annots=t.annots.map((t=>(t[n]=t[n]+" citations "+e.replace(/_/g," "),t))),t)))}return a}}var Ai=["name","start","length","trackIndex","trackIndexOriginal","color"],Ci={3:["00B","DDD","F00"],5:["00D","66D","DDD","F88","F00"],17:["00D","00D","00D","00D","00D","44D","44D","DDD","DDD","DDD","DDD","F88","F66","F22","F22","F00","F00","F00"]};function ki(t){var n,e,o;if(t.rawAnnots.metadata&&t.rawAnnots.metadata.trackLabels)n=t.rawAnnots.metadata.trackLabels;else if(t.config.heatmaps)for(n=[],e=t.config.heatmaps,o=0;o!Ai.includes(t)));return t.displayedTrackIndexes&&(n=n.filter((function(n,e){return t.displayedTrackIndexes.includes(e+1)}))),n}function Si(t){var n,e,o=t.rawAnnots;if(!o.metadata||o.metadata.heatmapThresholds||t.config.heatmapThresholds)return n=t.config.heatmapThresholds?t.config.heatmapThresholds:t.rawAnnots.metadata.heatmapThresholds,e=Ci[n.length+1],n=n.map(((t,n)=>[t,"#"+e[n]])),n.push(["+","#"+e.slice(-1)[0]]),n}function Li(t,n,e,o,r){return t===n&&"+"===r&&e>o||e===r||0!==t&&t!==n&&e<=r&&e>o||0===t&&e<=r}function Ti(t,n){var e,o,r,i,a,s,c,l;for(e=0;e0&&(r+=e.config.chrMargin*t.chrIndex-1),a=Lr.select(e.config.container+" #_ideogramInnerWrap").append("canvas").attr("id",s).attr("width",c+1).attr("height",i).style("position","absolute").style("left",r+"px").style("top",i*o+1+"px").nodes()[0].getContext("2d"),l.push([a,t]);return l}function Pi(t,n,e){var o,r,i,a,s=e.config.annotLabelHeight,c=e.config.annotationHeight,l=e.config.demarcateCollinearChromosomes,u=c+s+4;for(o=0;oa.width-1)continue;i.fillRect(r.startPx,1,.5,u)}else i.fillRect(r.startPx,s+1,.5,c);if(l)for(o=0;o"),Lr.select(n.config.container+" #_ideogramTrackLabel").interrupt().style("top","").style("left","").style("transform",null).style("transform","rotate(-90deg)").html(e),[o,r]=function(t,n,e){var o,r,i,a,s;return o=n.id.split("-").slice(0,-1).join("-")+"-0",r=Lr.select(e.config.container+" #"+o).nodes()[0].getBoundingClientRect(),i=Lr.select(e.config.container+" #_ideogramTrackLabel").nodes()[0].getBoundingClientRect(),a=Lr.select(e.config.container).nodes()[0].getBoundingClientRect(),s=Math.round(r.left+i.width)-r.width-1,[s-=a.left-7,-(t.split("
").length-2)*r.width+2]}(e,t,n),function(t,n,e){Lr.select(e.config.container+" #_ideogramTrackLabel").style("opacity",1).style("left",n+"px").style("top",t+"px").style("width","max-content").style("transform-origin","bottom left").style("text-align","left").on("mouseover",(function(){clearTimeout(e.hideTrackLabelTimeout)})).on("mouseout",(function(){Bi(e)}))}(r,o,n)}(this,i)})).on("mouseout",(function(){Bi(i)})),i.onDrawAnnotsCallback&&i.onDrawAnnotsCallback()}function Ri(t,n,e){var o,r,i,a,s,c,l,u=[];for(o=0;o0&&(o+="-"+t.stop.toLocaleString()),n=o,e=24,t.name&&(n=(t.displayName?t.displayName:t.name)+"
"+n,e+=8),[n,e]}(t),function(t,n,e,o,r){t.html(n).style("opacity",1).style("left",e.e+"px").style("top",e.f-o+"px").style("font-family",r.config.fontFamily).style("pointer-events",null).on("mouseover",(function(){clearTimeout(r.hideAnnotTooltipTimeout)})).on("mouseout",(function(){r.startHideAnnotTooltipTimeout()}))}(i,o,e,r,c)):zi())}function Yi(t){return"ideogramLabel_"+t.domId}function Ui(t,n,e){Lr.selectAll("._ideoActive").classed("_ideoActive",!1),Lr.select("#"+n).attr("class","_ideogramLabel "+t),Lr.select("#"+e+" > path").attr("class",t)}function Xi(t,n){let e,o;const r=t.target,i=t.type;if(Array.from(r.classList).includes("_ideogramLabel"))e=r.id,o=r.id.split("ideogramLabel_")[1],Lr.select("#"+o+" path").dispatch(i);else{const t=r.parentElement;e="ideogramLabel_"+t.id,o=t.id}"mouseout"===i&&(n.time.prevTooltipOff=performance.now(),n.time.prevTooltipAnnotDomId=o),"mouseover"===i?(clearTimeout(window._ideoActiveTimeout),Ui("_ideoActive",e,o)):window._ideoActiveTimeout=window.setTimeout((function(){Ui("",e,o)}),250)}function Vi(t,n){var e,o=!1;return n.annots.forEach((n=>{o||n.annots.forEach((n=>{o||n.name===t&&(e=n,o=!0)}))})),e}function Qi(t,n){var e,o,r,i,a,s,c,l,u,h=n.config;return null===(e=document.querySelector("#"+t.domId))?null:(o=e.getBoundingClientRect(),r=document.querySelector("#_ideogram").getBoundingClientRect(),i=qr(t.name,n).width,i+=h.fontFamily?9:7,a=h.annotLabelSize?h.annotLabelSize:13,c=(s=o.top-r.top+a-1)+a,u=(l=o.left-r.left-i)+i,name=t.name,{top:s,bottom:c,right:u,left:l,width:i,height:a,name})}function Ji(t,n,e){var o,r=this;const i=Qi(o=Vi(t,r),r);null!==i&&function(t,n,e){e.didSetLabelStyle||(document.querySelector("#_ideogramInnerWrap").insertAdjacentHTML("afterbegin","\n \n "),e.didSetLabelStyle=!0);const o=Yi(t),r=Hr(e),i="pink"===t.color?"#CF406B":t.color;Lr.select("#_ideogram").append("text").attr("id",o).attr("class","_ideogramLabel").attr("x",n.left).attr("y",n.top).style("font",r).style("fill",i).style("pointer-events",null).html(t.name)}(o,Object.assign(i,{backgroundColor:n,borderColor:e}),r)}function Ki(t=[]){const n=this;t=$r(t),n.clearAnnotLabels();let e=[];const o=[];0===t.length&&(t=n.flattenAnnots()),t.forEach(((t,r)=>{const i=Qi(t,n);null!==i?o.length>0&&o.some(((t,n)=>{const e=function(t,n,e){const o=t.left-0,r=n.left-0,i=t.right+0,a=n.right+0;return o<=r&&o<=a&&i<=a&&i>=r||o>=r&&o<=a&&i>=a&&i>=r||o<=r&&o<=a&&i>=a&&i>=r||o>=r&&o<=a&&i>=r&&i<=a}(t,i),o=function(t,n,e){const o=t.top-0,r=n.top-0,i=t.bottom+0,a=n.bottom+0;return o<=r&&o<=a&&i<=a&&i>=r||o>=r&&o<=a&&i>=a&&i>=r}(t,i);return e&&o}))||(e.push(t),o.push(i)):console.log(t.name+" has null layout")}));let r=10;const i=n.config;"relatedGenesMode"in i&&"hints"===i.relatedGenesMode&&(r=20),e=e.sort(n.annotSortFunction).slice(0,r),e.reverse(),e.forEach((t=>{n.addAnnotLabel(t.name)})),Lr.selectAll("._ideogramLabel, .annot").on("mouseover",(t=>Xi(t))).on("mouseout",(t=>Xi(t,n))).on("click",(t=>Xi(t)))}function Zi(t){const n=Yi(Vi(t,this));document.querySelector("#"+n).remove()}function ta(){document.querySelectorAll("._ideogramLabel").forEach((t=>{t.remove()}))}function na(t){var n,e,o=!1,r=(new Date).getTime(),i=this;return n=i.chromosomes[i.config.taxid],function(t){"histogramScaling"in t.config==0&&(t.config.histogramScaling="absolute")}(i),void 0===i.maxAnnotsPerBar&&(i.maxAnnotsPerBar={},o=!0),e=function(t,n){var e,o,r,i,a,s,c,l,u=n.config.barWidth,h=[];for(s=0;s=f&&ui&&(i=l),l>o&&(o=l);e.maxAnnotsPerBar[s]=i}e.maxAnnotsPerBarAllChrs=o}}(e,o,i),e=function(t,n){var e,o,r,i,a,s,c,l=n._layout._isRotated;for(e=0;e";else if("triangle"===r){var i="";"vertical"===n.config.orientation&&(i=' transform="rotate(90, 7, 7)"'),e='"}}else e='";return e}function ra(t,n,e,o,r){var i,a,s,c=ia(r);for(i=0;i"+(s=e.rows[i]).name+"",a=c*(i-1)+o+1,"name"in e&&(a+=c),n+=''+oa(s,r)+"";return[t,n]}function ia(t){return 2*Ir(qr("A",t).height)+.5}function aa(t){var n,e,o,r,i,a,s=t.config,c=ia(t);for(Lr.select(s.container+" #_ideogramLegend").remove(),e=s.legend,a="",n=0;n`+i.name+""),o='',[r,o]=ra(r,o,i,s,t),a+=(o+="")+"
    "+r+"
"}var l=`font-family: ${s.fontFamily};`,u=`line-height: ${ia(t)}px;`;ea+=`#_ideogramLegend {${l} ${u}}`;var h=Lr.select(s.container+" #_ideogramOuterWrap");h.append("style").html(ea),h.append("div").attr("id","_ideogramLegend").html(a)}function sa(t,n,e=!1,o=!1){var r,i,a=[],s=this,c=s.chromosomes[s.config.taxid];if("annots"in t[0]||"values"in t[0])return s.drawProcessedAnnots(t,n);for(i in c)a.push({chr:i,annots:[]});a=function(t,n){var e,o,r,i;for(e=0;e2e3&&console.warn('Rendering more than 2000 annotations in Ideogram?\nTry setting "annotationsLayout" to "heatmap" or "histogram" in your Ideogram configuration object for better layout and performance.')}}(t,n),"histogram"===t&&(n=e.getHistogramBars(n)),o=function(t,n){return Lr.selectAll(n.selector+" .chromosome").data(t).selectAll("path.annot").data((function(t){return t.annots})).enter()}(e.fillAnnots(n),e),"tracks"===t?function(t,n){var e,o=n.config.annotationHeight;e=function(t){var n;return{triangle:"m0,0 l -"+t+" "+2*t+" l "+2*t+" 0 z",circle:"m -"+(n=t)+", "+n+"a "+n+","+n+" 0 1,0 "+2*n+",0a "+n+","+n+" 0 1,0 -"+2*n+",0",rectangle:"m0,0 l 0 "+2*t+"l "+t+" 0l 0 -"+2*t+"z"}}(o),t.append("g").attr("id",(function(t){return t.domId})).attr("class","annot").attr("transform",(function(t){var e=n.config.chrWidth+t.trackIndex*o*2;return"translate("+t.px+","+e+")"})).append("path").attr("d",(function(t){return function(t,n){return t.shape&&"triangle"!==t.shape?"circle"===t.shape?n.circle:"rectangle"===t.shape?n.rectangle:t.shape:n.triangle}(t,e)})).attr("fill",(function(t){return t.color})).on("mouseover",(function(t,e){n.showAnnotTooltip(e,this)})).on("mouseout",(function(){n.startHideAnnotTooltipTimeout()})).on("click",(function(t,e){n.onClickAnnot(e)}))}(o,e):"overlay"===t?function(t,n){t.append("polygon").attr("id",(function(t){return t.id})).attr("class","annot").attr("points",(function(t){var e,o,r=n.config.chrWidth;return t.stopPx-t.startPx>1?(e=t.startPx,o=t.stopPx):(e=t.px-.5,o=t.px+.5),e+","+r+" "+o+","+r+" "+o+",0 "+e+",0"})).attr("fill",(function(t){return t.color})).on("mouseover",(function(t,e){n.showAnnotTooltip(e,this)})).on("mouseout",(function(){n.startHideAnnotTooltipTimeout()}))}(o,e):"histogram"===t&&function(t,n){var e,o,r={},i=n.config.chrWidth;for(o in e=n.chromosomes[n.config.taxid])r[o]=e[o];t.append("polygon").attr("class","annot").attr("points",(function(t){return function(t,n,e,o){var r,i,a,s;r=t.px+o.bump,i=t.px+o.config.barWidth+o.bump,a=n,s=n+t.height;var c=e[t.chr];return i>c&&(i=c),r+","+a+" "+i+","+a+" "+i+","+s+" "+r+","+s}(t,i,r,n)})).attr("fill",(function(t){return t.color}))}(o,e)}(n,t,o),o.onDrawAnnotsCallback&&o.onDrawAnnotsCallback())}function la(t,n,e){return t.append("g").attr("class","syntenicRegion").attr("id",n).on("click",(function(){var t=this,n=Lr.selectAll(e.selector+" .syntenicRegion").filter((function(){return this!==t}));n.classed("hidden",!n.classed("hidden"))})).on("mouseover",(function(){var t=this;Lr.selectAll(e.selector+" .syntenicRegion").filter((function(){return this!==t})).classed("ghost",!0)})).on("mouseout",(function(){Lr.selectAll(e.selector+" .syntenicRegion").classed("ghost",!1)}))}function ua(t,n,e,o,r,i){var a,s;a="color"in i?i.color:"#CFC",s="opacity"in i?i.opacity:1,t.append("polygon").attr("points",n+", "+o.startPx+" "+n+", "+o.stopPx+" "+e+", "+r.stopPx+" "+e+", "+r.startPx).style("fill",a).style("fill-opacity",s)}function ha(t,n,e,o,r,i){var a,s;a="color"in i?i.color:"#CFC",s="opacity"in i?i.opacity:1,t.append("polygon").attr("points",o.startPx-15+", "+n+" "+(o.stopPx-15)+", "+n+" "+(r.stopPx-15)+", "+e+" "+(r.startPx-15)+", "+e).style("fill",a).style("fill-opacity",s)}function fa(t,n,e=null){var o,r,i,a;if(o=t.r1,r=t.r2,"string"==typeof o.chr){const t=n.config.taxids;n.config.multiorganism?(o.chr=n.chromosomes[t[0]][o.chr],r.chr=n.chromosomes[t[1]][r.chr]):(o.chr=n.chromosomes[t[0]][o.chr],r.chr=n.chromosomes[t[0]][r.chr])}var s=document.querySelector("#"+o.chr.id+"-chromosome-set"),c=s.getCTM().e,l=s.getCTM().f,u=document.querySelector("#"+r.chr.id+"-chromosome-set"),h=u.getCTM().e,f=u.getCTM().f;return null===e?"vertical"===n.config.orientation?(i=l-12,a=f-12):(i=c,a=h):(i=e,a=e),o.startPx=n.convertBpToPx(o.chr,o.start)+i,o.stopPx=n.convertBpToPx(o.chr,o.stop)+i,r.startPx=n.convertBpToPx(r.chr,r.start)+a,r.stopPx=n.convertBpToPx(r.chr,r.stop)+a,[o,r]}function da(t,n,e,o,r){t.append("line").attr("class","syntenyBorder").attr("x1",n).attr("x2",e).attr("y1",o.startPx).attr("y2",r.startPx),t.append("line").attr("class","syntenyBorder").attr("x1",n).attr("x2",e).attr("y1",o.stopPx).attr("y2",r.stopPx)}function ma(t,n,e,o,r){t.append("line").attr("class","syntenyBorder").attr("x1",o.startPx-15).attr("x2",r.startPx-15).attr("y1",n).attr("y2",e),t.append("line").attr("class","syntenyBorder").attr("x1",o.stopPx-15).attr("x2",r.stopPx-15).attr("y1",n).attr("y2",e)}function ga(t,n,e,o,r,i){var a,s;Math.abs(o.startPx-o.startPx)<2&&Math.abs(o.stopPx-o.stopPx)<2?(a=i.color,s=i.width):(a="",s=""),t.append("line").attr("class","syntenyBorder").attr("x1",n).attr("x2",e).attr("y1",o.startPx).attr("y2",r.startPx).style("stroke",a).style("stroke-width",s),t.append("line").attr("class","syntenyBorder").attr("x1",n).attr("x2",e).attr("y1",o.stopPx).attr("y2",r.stopPx).style("stroke",a).style("stroke-width",a)}function pa(t,n,e,o,r,i){var a=i.split("__").map((t=>"label_"+t));if("name"in o){t.append("text").attr("id",a[0]).attr("y",o.startPx+3).text(o.name);var s=document.querySelector("#"+a[0]).getBoundingClientRect().width;Lr.select("#"+a[0]).attr("x",n-15-s)}"name"in r&&t.append("text").attr("id",a[1]).text(r.name).attr("x",e+15).attr("y",r.startPx+3).text(r.name)}function ya(t){var n=(new Date).getTime(),e=this,o=e.config;if(e.syntenicRegions=t,o.multiorganism&&"collinear"===o.geometry)return"vertical"===o.orientation?function(t,n){var e=(new Date).getTime();(function(t,n,e){var o,r,i,a,s,c,l,u;for(o=0;oc&&(c=s+1),i.splice(4,0,s),a.push(i);l.push({chr:r.chr,annots:a})}return n.numAvailTracks=c,l}(t.annots,o),n.splice(4,0,"trackIndexOriginal"),t={keys:n,annots:e},o.rawAnnots.metadata&&(t.metadata=o.rawAnnots.metadata)),t}var xa=[["F00"],["F00","88F"],["F00","CCC","88F"],["F00","FA0","0AF","88F"],["F00","FA0","CCC","0AF","88F"],["F00","FA0","875","578","0AF","88F"],["F00","FA0","875","CCC","578","0AF","88F"],["F00","FA0","7A0","875","0A7","578","0AF","88F"],["F00","FA0","7A0","875","CCC","0A7","578","0AF","88F"],["F00","FA0","7A0","875","552","255","0A7","578","0AF","88F"]];function _a(t,n,e,o,r,i,a){return a.config.annotationTracks?r=function(t,n,e,o,r){var i;return n.trackIndex=e[3],(i=r.config.annotationTracks[n.trackIndex]).color&&(n.color=i.color),i.shape&&(n.shape=i.shape),t[o].annots.push(n),t}(r,t,e,i,a):"trackIndex"===n[3]&&1!==a.numAvailTracks?[r,o]=function(t,n,e,o,r,i){var a=xa[i.numAvailTracks-1];return t.trackIndex=n[3],t.trackIndexOriginal=n[4],t.color="#"+a[t.trackIndexOriginal],t.trackIndex>i.config.numTracks-1?(t.trackIndex in e?e[t.trackIndex].push(t):e[t.trackIndex]=[t],[o,e]):(o[r].annots.push(t),[o,e])}(t,e,o,r,i,a):r=function(t,n,e,o){return n.trackIndex=0,n.color||(n.color=o.config.annotationsColor),n.shape||(n.shape="triangle"),t[e].annots.push(n),t}(r,t,i,a),[r,o]}function Aa(t,n){return"_c"+t+"_a"+n}function Ca(t,n,e,o,r,i,a){var s,c,l,u;const h=!a.config.annotationsLayout||"tracks"===a.config.annotationsLayout;for(s=0;s-a.annotSortFunction(t,n)))):t[r].annots.sort(((t,n)=>t[1]-n[1])),s=0;s10&&console.error("Ideogram only displays up to 10 tracks at a time. You specified "+r+" tracks. Perhaps consider a different way to visualize your data."),(e=Object.keys(t).length)&&console.warn("Ideogram configuration specified "+r+" tracks, but loaded annotations contain "+e+" extra tracks.")}(o,r),e}class La{constructor(t,n){this.matrix=t,this.ideo=n}setRawAnnots(){var t,n,e;return t=this,n=this.ideo,e=this.matrix,new Promise((function(o){t.rawAnnots=t.fetchCoordinates(n).then((function(r){t.coordinates=r,o(t.parseExpressionMatrix(e,n))}))}))}fetchCoordinates(t){var n={};if("human"===t.config.organism){var e=t.config.dataDir+"../../annotations/Homo_sapiens,_Ensembl_80.tsv";return new Promise((function(o){t.fetch(e,"text").then((function(t){var e,r,i,a,s,c,l;for(e=t.split(/\r\n|\n/).slice(1),r=0;rparseFloat(t))),[o,r,length]=this.coordinates[i],-1===(e=n.indexOf(o))?[null,null]:[e,[i,r,length].concat(a)])}parseExpressionMatrix(t,n){var e,o,r,i,a,s,c=[],l=t.split(/\r\n|\n/);for(o=Object.keys(n.chromosomes[n.config.taxid]),e=0;e{e.annots.forEach((e=>{const o=t.annotDescriptions.annots[e.name];n[e.name]=[e.name,o.ensemblId,e.chr,e.start,e.stop,e.length,o.type]}))}));const e=[["# Gene name","Ensembl ID","Chromosome","Start","Stop","Length","Type"]].concat(Object.values(n)),o=t.annotDescriptions.headers+"\n#\n"+e.map((t=>t.join("\t"))).join("\n"),r="data:text/plain;charset=utf-8,"+encodeURIComponent(o);var i=new MouseEvent("click",{view:window,bubbles:!1,cancelable:!0}),a=document.createElement("a");a.setAttribute("download","ideogram.tsv"),a.setAttribute("href",r),a.setAttribute("target","_blank"),a.setAttribute("id","_ideo-undisplayed-dl-annots-link"),a.setAttribute("style","display: none;"),document.body.appendChild(a),a.dispatchEvent(i)}function Ma(){var t=this,n=t.config;!function(t){var n,e=t.config;e.annotationHeight||("heatmap"===e.annotationsLayout?n=e.chrWidth-1:(n=Math.round(e.chrHeight/100))<3&&(n=3),t.config.annotationHeight=n)}(t),n.annotationsPath||n.localAnnotationsPath||t.annots||n.annotations?function(t,n){n.annotationTracks?t.config.numAnnotTracks=n.annotationTracks.length:n.annotationsNumTracks?t.config.numAnnotTracks=n.annotationsNumTracks:t.config.numAnnotTracks=1,t.config.annotTracksHeight=n.annotationHeight*n.numAnnotTracks,void 0===n.barWidth&&(t.config.barWidth=3)}(t,n):(t.config.annotTracksHeight=0,t.config.numAnnotTracks=0),void 0===n.annotationsColor&&(t.config.annotationsColor="#F00"),n.onClickAnnot&&(t.onClickAnnotCallback=n.onClickAnnot),function(t,n){!1!==n.showAnnotTooltip&&(t.config.showAnnotTooltip=!0),n.onWillShowAnnotTooltip&&(t.onWillShowAnnotTooltipCallback=n.onWillShowAnnotTooltip)}(t,n),function(t,n){!1!==n.addAnnotLabel&&(t.config.addAnnotLabel=!0),n.onWillAddAnnotLabel&&(t.onWillAddAnnotLabelCallback=n.onWillAddAnnotLabel)}(t,n)}function Pa(){var t=this,n=t.config;t.rawAnnots.annots=t.rawAnnots.annots.sort(Ideogram.sortChromosomes),t.onLoadAnnotsCallback&&t.onLoadAnnotsCallback(),("heatmapThresholds"in n||"metadata"in t.rawAnnots&&"heatmapThresholds"in t.rawAnnots.metadata)&&("heatmap"===n.annotationsLayout?function(t){var n,e,o,r,i,a,s=t.config.heatmapThresholds;for(o=[],e=(i=t.rawAnnots).keys.slice(3),r=[],a=[],!i.metadata&&isNaN(s[0])||(s=Si(t)),n=0;nt.chr));if(o.forEach((t=>{t in n&&e.push(t),n[t]=1})),e.length>0)throw Error(`Duplicate chromosomes detected.\nChromosome list: ${o}. Duplicates: ${e}.\nTo fix this, edit your raw annotations JSON data to remove redundant chromosomes.`)}(t)}function Na(){return this.annots.reduce(((t,n)=>[...t,...n.annots]),[])}function Ia(t){var n,e=this,o=e.config;n="heatmap-2d"===o.annotationsLayout;var r=function(t){var n,e;return e=(n=t.split("?")[0].split("."))[n.length-1],!1===["bed","json","tsv"].includes(e)?(e=e.toUpperCase(),void alert("Ideogram.js only supports BED and Ideogram JSON and TSV at the moment. Sorry, check back soon for "+e+" support!")):e}(t);"http"===t.slice(0,4)||n||"tsv"===r?(r=n?"":r,e.fetch(t,"text").then((function(t){e.rawAnnotsResponse=t,n?new La(t,e).setRawAnnots().then((function(t){e.rawAnnots=t,e.afterRawAnnots()})):(e.rawAnnots="tsv"===r?new _i(t,e).rawAnnots:"bed"===r?new xi(t,e).rawAnnots:JSON.parse(t),e.afterRawAnnots())}))):e.fetch(t).then((function(t){e.rawAnnotsResponse=t,e.rawAnnots=t,e.afterRawAnnots()}))}function Ba(t){var n,e,o,r,i,a,s;for(n=[],e=[],o=this.chromosomesArray,r=0;r(e.includes(t.name)?t.rank=e.indexOf(t.name)+1:t.rank=1e10,t)))}function Da(t,n="red"){const e=this,o=e.config.taxid,r=t.map((t=>{const r=e.chromosomes[o][t].id,i=`${e.selector} #${r}-chromosome-set`,a=document.querySelector(i),s=a.getBoundingClientRect();return``})).join();document.querySelector(e.selector).insertAdjacentHTML("afterBegin",r)}function Fa(t){const n=this;let e=`${n.selector} .ideo-highlight`;if(void 0!==t){const o=n.config.taxid;e=t.map((t=>{const e=n.chromosomes[o][t].id;return`${n.selector} #ideo-highlight-${e}`}))}document.querySelectorAll(e).forEach((t=>{t.remove()}))}function Ra(t,n){var e,o;return e=n.esearch+"&db=taxonomy&term="+t,Lr.json(e).then((function(n){if(0===n.esearchresult.idlist.length)throw'Organism "'+t+"\" is generally unknown; it was not found in the NCBI Taxonomy database. If you did not intend to specify a novel or custom taxon, then try using the organism's scientific name, e.g. Homo sapiens or Arabidopsis thaliana.";return o=n.esearchresult.idlist[0],[t,o]}))}function Oa(t,n){var e,o,r=this;t=r.config.organism,o=r.esummary+"&db=taxonomy&id="+t,Lr.json(o).then((function(o){return e=o.result[String(t)].commonname,r.config.organism=e,n(e)}))}function Ga(t,n,e){var o,r,i,a,s,c=e.config;(function(t,n){var e,o,r;if(console.log("here"),n.assemblyIsAccession())return new Promise((function(e){n.coordinateSystem="bp",n.getAssemblyAndChromosomesFromEutils(t,e)}));console.log("here2"),e=n.config.dataDir,o=jr(n.organisms[t].scientificName),r=[t],["9606","10090","10116"].includes(t)&&!n.config.showFullyBanded&&(o+="-no-bands");var i=e+o+".json",a=new Promise(((t,n)=>Pr(i).then((n=>n.json().then((function(n){t(n)})))).catch((t=>{n(t)}))));return a.then((function(e){var o,i,a,s,c=e.chrBands,l=[""],u=[],h={};n.bandData[e.taxid]=c;for(var f=0;f{t.length>i.bp&&(i.bp=t.length)})),n.maxLength[t]=i,l.push(u),l.push(r),l}),(function(){return new Promise((function(e){n.coordinateSystem="bp",n.getAssemblyAndChromosomesFromEutils(t,e)}))}))})(t,e).then((function(l){o=l[0],r=l[1],"chromosomes"in c==0||null===c.chromosomes?(e.config.chromosomes={},e.config.chromosomes[t]=r):(c.multiorganism?t in c.chromosomes?i=c.chromosomes[t]:(a=jr(e.getScientificName(t)),e.config.chromosomes[t]=c.chromosomes[a].slice(),i=e.config.chromosomes[t]):i=c.chromosomes,s=r.filter((t=>i.includes(t.name))),e.config.chromosomes[t]=s),e.chromosomes[t]=e.config.chromosomes[t].slice(),e.organisms[t].assemblies={default:o},n()}))}function ja(t,n){var e,o;for(e in n.organisms)if(o=n.organisms[e],e===jr(t)||jr(o.commonName)===jr(t)||jr(o.scientificName)===jr(t))return!0;return!1}function za(t,n){console.log("here"),function(t){var n,e,o,r,i,a=t.config;return n=[],e={},function(t,n){var e,o,r,i=[],a={};for(r=0;rjr(t))),i.includes(jr(s.scientificName))?o=s.scientificName:i.includes(jr(s.commonName))&&(o=s.commonName),jr(o)in a.chromosomes?e[r]=a.chromosomes[jr(o)]:e[r]=a.chromosomes[o.toLowerCase()]):e=null);return[e,n]}))}(n).then((function([e,o]){var r,i,a,s,c,l=n.config,u=[];for(r=0;r{t.length>a.bp&&(a.bp=t.length)})),a.bp>e.maxLength.bp&&(e.maxLength.bp=a.bp),e.maxLength[n]=a,e.coordinateSystem="bp",c}(r.result,t,o);return n([e,i])}),(function(t){console.warn(t)}))}function $a(){var t=this,n=t.bandsToShow.join(",");0!==t.bandsToShow.length&&(Lr.selectAll(t.selector+" .bandLabel, .bandLabelStalk").style("display","none"),Lr.selectAll(n).style("display",""))}function Ya(t,n,e,o,r){return n!==e&&(t=o[r.id][e]+36),t}function Ua(t,n,e,o,r,i,a){var s,c;return e"pter"!==t.name)),s=a.drawBandLabelText(e,i,o,s),a.drawBandLabelStalk(e,i,o,s);a.setBandsToShow(r,s)}function Za(t,n){return[n[t][0],n[t][1],n[t][2],n[t][3]]}function ts(){var t="";return t=function(t){var n,e,o,r,i,a="";for(n=0;n',a+="gneg"===e?'':'',a+="";return a}(kr),``+(t+=' ')+""}function ns(t,n,e){var o,r,i;return(o=n[0])in t==0&&(t[o]=[]),r=function(t){var n=t[7];return t[8]&&(n+=t[8]),n}(n),i=function(t,n,e,o){return{chr:t,bp:{start:parseInt(n[5],10),stop:parseInt(n[6],10)},iscn:{start:parseInt(n[3],10),stop:parseInt(n[4],10)},px:{start:-1,stop:-1,width:-1},name:n[1]+n[2],stain:e,taxid:o}}(o,n,r,e),t[o].push(i),t}function es(t,n,e,o){var r,i,a=o.config.multiorganism;return null!=t&&(i=(r=Array.isArray(t))&&-1===t.indexOf(n),!(!r||"object"==typeof t||!i)||(e in t!=0||!a)&&(a?"string"==typeof t[e][0]?!1===t[e].includes(n):0===t[e].filter((t=>t.name===n)).length:0===t.filter((t=>t===n)).length))}function os(t,n,e,o){var r,i,a=[];return r=n[t],a.push(r),i={iscn:r[r.length-1].iscn.stop,bp:r[r.length-1].bp.stop},e in o.maxLength==0&&(o.maxLength[e]={bp:0,iscn:0}),i.iscn>o.maxLength[e].iscn&&(o.maxLength[e].iscn=i.iscn,i.iscn>o.maxLength.iscn&&(o.maxLength.iscn=i.iscn)),i.bp>o.maxLength[e].bp&&(o.maxLength[e].bp=i.bp,i.bp>o.maxLength.bp&&(o.maxLength.bp=i.bp)),a}function rs(t,n,e,o){var r,i;if(t in o.bandData||t in Sr&&!1===o.assemblyIsAccession())e=function(t,n,e,o){var r,i,a;r=function(t,n,e){var o,r,i,a,s,c,l={};c=e.bandData[t],Array.isArray(c)&&(s="native"),n=function(t){var n,e;if(t instanceof Array&&"object"==typeof t[0]){for(n=[],e=0;e0&&(o.config.chromosomes[t]=n.slice()),o.numChromosomes+=o.config.chromosomes[t].length;for(i=0;io.maxLength.bp&&(o.maxLength.bp=r.length);return e}function is(t){console.log(t);var n,e,o=this,r=o.config,i=(new Date).getTime();return n=[],"chromosomes"in r&&(e=r.multiorganism?r.chromosomes:t in r.chromosomes?r.chromosomes[t].slice():r.chromosomes.slice()),n=rs(t,e,n,o),function(t,n){var e=(new Date).getTime();n.config.debug&&console.log("Time in processBandData: "+(e-t)+" ms")}(i,o),[t,n]}function as(){call(this.onBrushMoveCallback)}function ss(){call(this.onBrushEndCallback)}function cs(t,n,e){var o,r,i,a,s=this,c=s.config.chrWidth+6.5,l=s._layout.margin.left;[t,n,e]=function(t,n,e){var o,r;return o=t.split(":"),r=t.split("-"),o.length>1&&r.length>1&&(t=o[0].replace("chr",""),r=o[1].split("-"),n=parseInt(r[0]),e=parseInt(r[1]-1)),[t,n,e]}(t,n,e),o=function(t,n){var e,o;for(e=0;e1||"MT"===t.name){if([o,e]=function(t,n){var e,o,r,i,a,s,c,l,u;for(e=0;e=a&&n<=s)return[l+u*(r+i/c*(n-a)-r)/i,o];return[null,o]}(t,n),null!==o)return o}else if(n>=1&&n<=t.length)return t.scale.bp*n;!function(t,n,e){throw new Error("Base pair out of range. bp: "+t+"; length of chr"+n.name+": "+e.bp.stop)}(n,t,e)}function ms(t,n,e,o,r,i,a){var s,c,l,u;return a=t-n,s=o-r,c=i.bp.stop-i.bp.start,l=n+a/s*(e-r),u=i.bp.start+c*(l-n)/a,Math.round(u)}function gs(t,n){var e,o,r,i,a,s;for(0===n&&(n=t.bands[0].px.start),e=0;e=r&&n<=i)return ms(s,a,n,i,r,o,void 0);!function(t,n,e){throw new Error("Pixel out of range. px: "+t+"; length of chr"+n.name+": "+e)}(n,t,i)}let ps=xs,ys=xs,vs=xs,bs=_s,ws=As;function xs(t){for(var n=new Array(t),e=-1;++e32)throw new Error("invalid array width!");return t}function Cs(t){this.length=t,this.subarrays=1,this.width=8,this.masks={0:0},this[0]=ps(t)}"undefined"!=typeof Uint8Array&&(ps=function(t){return new Uint8Array(t)},ys=function(t){return new Uint16Array(t)},vs=function(t){return new Uint32Array(t)},bs=function(t,n){if(t.length>=n)return t;var e=new t.constructor(n);return e.set(t),e},ws=function(t,n){var e;switch(n){case 16:e=ys(t.length);break;case 32:e=vs(t.length);break;default:throw new Error("invalid array width!")}return e.set(t),e}),Cs.prototype.lengthen=function(t){var n,e;for(n=0,e=this.subarrays;n>>0,!((n=this.width-32*o)>=32)||e)return n<32&&e&1<=t;o--)this[n][o]=0;this.length=t},Cs.prototype.zero=function(t){var n,e;for(n=0,e=this.subarrays;nfunction(e){var o=e.length;return[t.left(e,n,0,o),t.right(e,n,0,o)]},Ls=(t,n)=>{var e=n[0],o=n[1];return function(n){var r=n.length;return[t.left(n,e,0,r),t.left(n,o,0,r)]}},Ts=t=>[0,t.length],Ms=t=>t,Ps=()=>null,Ns=()=>0;function Is(t){function n(t,n,o){for(var r=o-n,i=1+(r>>>1);--i>0;)e(t,i,r,n);return t}function e(n,e,o,r){for(var i,a=n[--r+e],s=t(a);(i=e<<1)<=o&&(it(n[r+i+1])&&i++,!(s<=t(n[r+i])));)n[r+e]=n[r+i],e=i;n[r+e]=a}return n.sort=function(t,n,o){for(var r,i=o-n;--i>0;)r=t[n],t[n]=t[n+i],t[n+i]=r,e(t,1,i,n);return t},n}const Bs=Is(Ms);Bs.by=Is;const Es=Bs;function Ds(t){var n=Es.by(t);return function(e,o,r,i){var a,s,c,l=new Array(i=Math.min(r-o,i));for(s=0;sa&&(l[0]=c,a=t(n(l,0,i)[0]))}while(++o>>1;e>>1;t(n[i]){for(var o=0,r=n.length,i=e?JSON.parse(JSON.stringify(t)):new Array(r);ot+1,Hs=t=>t-1,qs=t=>function(n,e){return n+ +t(e)},$s=t=>function(n,e){return n-t(e)},Ys=(t,n)=>{const e=t[n];return"function"==typeof e?e.call(t):e},Us=/\[([\w\d]+)\]/g,Xs=(t,n)=>function(t,n,e,o,r){for(r in o=(e=e.split(".")).splice(-1,1),e)n=n[e[r]]=n[e[r]]||{};return t(n,o)}(Ys,t,n.replace(Us,".$1"));var Vs=-1;Js.heap=Es,Js.heapselect=Rs,Js.bisect=js,Js.permute=zs;const Qs=Js;function Js(){var t,n={add:c,remove:l,dimension:f,groupAll:d,size:m,all:g,allFiltered:p,onChange:y,isElementFiltered:h},e=[],o=0,r=[],i=[],a=[],s=[];function c(r){var a=o,s=r.length;return s&&(e=e.concat(r),t.lengthen(o+=s),i.forEach((function(t){t(r,a,s)})),v("dataAdded")),n}function l(n){for(var i=new Array(o),s=[],c="function"==typeof n,l=function(o){return c?n(e[o],o):t.zero(o)},u=0,h=0;u>7]&=~(1<<(63&i));return a}function h(n,e){var o=u(e||[]);return t.zeroExceptMask(n,o)}function f(n,s){if("string"==typeof n){var c=n;n=function(t){return Xs(t,c)}}var l,u,h,f,d,m,g,p,y,b,w,x,_,A,C={filter:function(t){return null==t?j():Array.isArray(t)?G(t):"function"==typeof t?z(t):O(t)},filterExact:O,filterRange:G,filterFunction:z,filterAll:j,currentFilter:function(){return x},hasCurrentFilter:function(){return _},top:function(n,o){var r,i=[],a=N,c=0;for(o&&o>0&&(c=o);--a>=P&&n>0;)t.zero(r=m[a])&&(c>0?--c:(i.push(e[r]),--n));if(s)for(a=0;a0;a++)t.zero(r=k[a])&&(c>0?--c:(i.push(e[r]),--n));return i},bottom:function(n,o){var r,i,a=[],c=0;if(o&&o>0&&(c=o),s)for(r=0;r0;r++)t.zero(i=k[r])&&(c>0?--c:(a.push(e[i]),--n));for(r=P;r0;)t.zero(i=m[r])&&(c>0?--c:(a.push(e[i]),--n)),r++;return a},group:H,groupAll:function(){var t=H(Ps),n=t.all;return delete t.all,delete t.top,delete t.order,delete t.orderNatural,delete t.size,t.value=function(){return n()[0].value},t},dispose:q,remove:q,accessor:n,id:function(){return f}},k=[],S=function(t){return Zs(t).sort((function(t,n){var e=g[t],o=g[n];return eo?1:t-n}))},L=Ts,T=[],M=[],P=0,N=0,I=0;i.unshift(E),i.push(D),a.push(F);var B=t.add();function E(e,r,i){var a,c;if(s){I=0,W=0,A=[];for(var u=0;uP)for(i=P,a=Math.min(e,N);iN)for(i=Math.max(e,N),a=o;i1?ks.arrayLengthen(f,o):Ks(o,_),z&&(T=(p=F[0]).key);H=M);)++H;for(;H=m));)M=n(i[H]);$()}for(;WW)if(s)for(W=0;W1||s?(C=I,k=E):(!A&&L&&(A=1,c=[{key:null,value:j()}]),1===A?(C=B,k=D):(C=Ps,k=Ps),f=null),r[g]=C}function N(t){if(A>1||s){var n,e,i,a=A,l=c,u=Ks(a,a);if(s){for(n=0,i=0;n1||s)if(s)for(n=0;n1||s?(k=E,C=I):1===A?(k=D,C=B):k=C=Ps}else if(1===A){if(L)return;for(var h=0;h=0&&r.splice(t,1),(t=T.indexOf(P))>=0&&T.splice(t,1),(t=a.indexOf(N))>=0&&a.splice(t,1),(t=M.indexOf(i))>=0&&M.splice(t,1),i}return arguments.length<1&&(n=Ms),r.push(C),T.push(P),a.push(N),P(d,m,0,o),G().orderNatural()}function q(){M.forEach((function(t){t.dispose()}));var n=i.indexOf(E);return n>=0&&i.splice(n,1),(n=i.indexOf(D))>=0&&i.splice(n,1),(n=a.indexOf(F))>=0&&a.splice(n,1),t.masks[h]&=u,j()}return h=B.offset,l=B.one,u=~l,f=h<<7|Math.log(l)/Math.log(2),E(e,0,o),D(0,0,o),C}function d(){var n,a,s,c,l={reduce:d,reduceCount:m,reduceSum:function(t){return d(qs(t),$s(t),Ns)},value:function(){return u&&(function(){var r;for(n=c(),r=0;r=0&&r.splice(t,1),(t=i.indexOf(h))>=0&&i.splice(t,1),l}return r.push(f),i.push(h),h(0,0),m()}function m(){return o}function g(){return e}function p(n){var r=[],i=0,a=u(n||[]);for(i=0;i{t.classList.remove("active")}))}function cc(){sc(document.querySelectorAll("#tools > ul > li")),document.querySelectorAll(".ideo-modal, .ideo-tool-panel").forEach((t=>{t.remove()})),document.querySelector("#tools").style.display="none"}function lc(t){const n=document.querySelectorAll("#tools > ul > li");n.forEach((e=>{const o=function(t){return Array.from(t.classList).includes("ideo-tool-hover")?"mouseenter":"click"}(e);e.addEventListener(o,(r=>{sc(n),e.classList+=" active";const i=e.id.split("-")[0],a=function(t,n){var e;return"download"===t&&(e=`\n
\n
  • Image
  • \n
  • 0?"":"ideo-disabled"}">Annotations
  • \n
    \n `),"about"===t&&(e='\n
    \n \n \n Ideogram.js, version 1.37.0 x
    \n Chromosome visualization for the web\n
    '),e.trim()}(i);"mouseenter"===o?(e.insertAdjacentHTML("beforeend",a),function(t,n,e,o){"mouseenter"===t&&e.addEventListener("mouseleave",(t=>{const e=t.toElement,r=e.id,i=document.querySelector(".ideo-tool-panel");document.querySelector("#tools").contains(e)&&i&&!i.contains(e)&&r!==n&&(sc(o),i.remove())}))}(o,i,e,n),"download"===i&&(document.querySelector("#download-image").addEventListener("click",(n=>{cc(),function(t){var n=document.querySelector(t.selector),e="_ideo-undisplayed-dl-canvas";(o=document.createElement("canvas")).setAttribute("style","display: none"),o.setAttribute("id",e);var o,r=n.width.baseVal.value+30,i=n.cloneNode(!0);i.style.left="",o.setAttribute("width",r),document.body.appendChild(o),(o=document.getElementById(e)).width*=2,o.height*=2;var a=o.getContext("2d");a.setTransform(2,0,0,2,0,0),a.imageSmoothingEnabled=!1;var s=(new XMLSerializer).serializeToString(i),c=window.URL||window.webkitURL||window,l=new Image,u=new Blob([s],{type:"image/svg+xml;charset=utf-8"}),h=c.createObjectURL(u);l.onload=function(){var t,n,e;a.drawImage(l,0,0),c.revokeObjectURL(h),t=o.toDataURL("image/png").replace("image/png","image/octet-stream"),n=new MouseEvent("click",{view:window,bubbles:!1,cancelable:!0}),(e=document.createElement("a")).setAttribute("download","ideogram.png"),e.setAttribute("href",t),e.setAttribute("target","_blank"),e.setAttribute("id","_ideo-undisplayed-dl-image-link"),e.setAttribute("style","display: none;"),document.body.appendChild(e),e.dispatchEvent(n),o.remove()},l.src=h}(t)})),document.querySelector("#download-annots").addEventListener("click",(n=>{const e=document.querySelector("#download-annots");!1===Array.from(e.classList).includes("ideo-disabled")&&(cc(),t.downloadAnnotations())})))):document.querySelector("#gear").insertAdjacentHTML("beforeend",a)}))})),document.querySelectorAll("#close").forEach((t=>{t.addEventListener("click",(()=>{cc()}))}))}function uc(t){document.querySelector(t.selector).insertAdjacentHTML("beforebegin",'\n \n \n \n '),function(t){document.querySelector("#gear").addEventListener("click",(t=>{var n=document.querySelector("#tools");"none"===n.style.display?(n.style.display="",function(t){const n=document.querySelectorAll("#gear, #tools"),e=t=>{let e=0;n.forEach((n=>{n.contains(t.target)||(e+=1)})),e===n.length&&(cc(),o())},o=()=>{document.removeEventListener("click",e)};document.addEventListener("click",e)}()):(n.style.display="none",cc())})),lc(t)}(t),function(t){const n=document.querySelector(t.selector),e=document.querySelector("#gear"),o=document.querySelector("#tools");n.addEventListener("mouseover",(()=>e.style.display="")),n.addEventListener("mouseout",(()=>{"none"===o.style.display&&(e.style.display="none")})),e.addEventListener("mouseover",(()=>e.style.display=""))}(t)}class hc{constructor(t){this._model=t,this._class="ModelAdapter"}static getInstance(t){return t.bands?new hc(t):new fc(t)}getModel(){return this._model}getCssClass(){return""}}class fc extends hc{constructor(t){super(t),this._class="ModelNoBandsAdapter"}getModel(){this._model.bands=[];const t="MT"===this._model.name,n=this._model.width;return(n>1||t)&&this._model.bands.push({name:"q",px:{start:0,stop:n,width:n},bp:{start:1,stop:this._model.bpLength},iscn:{start:1,stop:this._model.length}}),this._model}getCssClass(){return"noBands"}}class dc{constructor(t){this._config=t,this._ploidy=new Kr(this._config)}getArmColor(t,n,e){return this._config.armColors?this._config.armColors[e]:this._config.ancestors?this._getPolyploidArmColor(t,n,e):null}getBorderColor(t,n,e){const o=this._config,r=o.chrBorderColor?o.chrBorderColor:"#000";return n1&&(o=this._ploidy.getChromosomesNumber(n)),i=0;i1||""===n.orientation)&&(t-=1),t}(n,s),r=-4,!0===s.showBandLabels&&(r=s.chrMargin+s.chrWidth+26),i=s.chrMargin*n,s.numAnnotTracks>1==0&&(i+=1),a=i+r,t.selectAll("text.chrLabel").attr("transform",e.scaleSvg).selectAll("tspan").attr("x",e.x).attr("y",a)}(t,n,r,this):function(t,n,e,o){var r,i,a,s=o.config;r=-s.chrWidth-2,!0===s.showBandLabels&&(r=s.chrMargin+8),i=s.annotTracksHeight,"overlay"!==s.annotationsLayout&&(i*=2),a=3-(s.chrMargin*n+r)+i,a/=e.scale.x,t.selectAll("text.chrLabel").attr("transform","rotate(-90)"+e.scaleSvg).selectAll("tspan").attr("x",a).attr("y",e.y)}(t,n,r,this)}var kc=Uint8Array,Sc=Uint16Array,Lc=Uint32Array,Tc=new kc([0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0,0]),Mc=new kc([0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,0,0]),Pc=new kc([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]),Nc=function(t,n){for(var e=new Sc(31),o=0;o<31;++o)e[o]=n+=1<>>1|(21845&Oc)<<1;Gc=(61680&(Gc=(52428&Gc)>>>2|(13107&Gc)<<2))>>>4|(3855&Gc)<<4,Rc[Oc]=((65280&Gc)>>>8|(255&Gc)<<8)>>>1}var jc=function(t,n,e){for(var o=t.length,r=0,i=new Sc(n);r>>c]=l}else for(a=new Sc(o),r=0;r>>15-t[r]);return a},zc=new kc(288);for(Oc=0;Oc<144;++Oc)zc[Oc]=8;for(Oc=144;Oc<256;++Oc)zc[Oc]=9;for(Oc=256;Oc<280;++Oc)zc[Oc]=7;for(Oc=280;Oc<288;++Oc)zc[Oc]=8;var Wc=new kc(32);for(Oc=0;Oc<32;++Oc)Wc[Oc]=5;var Hc=jc(zc,9,1),qc=jc(Wc,5,1),$c=function(t){for(var n=t[0],e=1;en&&(n=t[e]);return n},Yc=function(t,n,e){var o=n/8|0;return(t[o]|t[o+1]<<8)>>(7&n)&e},Uc=function(t,n){var e=n/8|0;return(t[e]|t[e+1]<<8|t[e+2]<<16)>>(7&n)},Xc=function(t,n,e){(null==n||n<0)&&(n=0),(null==e||e>t.length)&&(e=t.length);var o=new(2==t.BYTES_PER_ELEMENT?Sc:4==t.BYTES_PER_ELEMENT?Lc:kc)(e-n);return o.set(t.subarray(n,e)),o},Vc=["unexpected EOF","invalid block type","invalid length/literal","invalid distance","stream finished","no stream handler",,"no callback","invalid UTF-8 data","extra field too long","date not in range 1980-2099","filename too long","stream finishing","invalid zip data"],Qc=function(t,n,e){var o=new Error(n||Vc[t]);if(o.code=t,Error.captureStackTrace&&Error.captureStackTrace(o,Qc),!e)throw o;return o},Jc=function(t,n,e){var o=t.length;if(!o||e&&e.f&&!e.l)return n||new kc(0);var r=!n||e,i=!e||e.i;e||(e={}),n||(n=new kc(3*o));var a,s=function(t){var e=n.length;if(t>e){var o=new kc(Math.max(2*e,t));o.set(n),n=o}},c=e.f||0,l=e.p||0,u=e.b||0,h=e.l,f=e.d,d=e.m,m=e.n,g=8*o;do{if(!h){c=Yc(t,l,1);var p=Yc(t,l+1,3);if(l+=3,!p){var y=t[(a=l,(T=4+((a+7)/8|0))-4)]|t[T-3]<<8,v=T+y;if(v>o){i&&Qc(0);break}r&&s(u+y),n.set(t.subarray(T,v),u),e.b=u+=y,e.p=l=8*v,e.f=c;continue}if(1==p)h=Hc,f=qc,d=9,m=5;else if(2==p){var b=Yc(t,l,31)+257,w=Yc(t,l+10,15)+4,x=b+Yc(t,l+5,31)+1;l+=14;for(var _=new kc(x),A=new kc(19),C=0;C>>4)<16)_[C++]=T;else{var P=0,N=0;for(16==T?(N=3+Yc(t,l,3),l+=2,P=_[C-1]):17==T?(N=3+Yc(t,l,7),l+=3):18==T&&(N=11+Yc(t,l,127),l+=7);N--;)_[C++]=P}}var I=_.subarray(0,b),B=_.subarray(b);d=$c(I),m=$c(B),h=jc(I,d,1),f=jc(B,m,1)}else Qc(1);if(l>g){i&&Qc(0);break}}r&&s(u+131072);for(var E=(1<>>4;if((l+=15&P)>g){i&&Qc(0);break}if(P||Qc(2),R<256)n[u++]=R;else{if(256==R){F=l,h=null;break}var O=R-254;if(R>264){var G=Tc[C=R-257];O=Yc(t,l,(1<>>4;if(j||Qc(3),l+=15&j,B=Fc[z],z>3&&(G=Mc[z],B+=Uc(t,l)&(1<g){i&&Qc(0);break}r&&s(u+131072);for(var W=u+O;u>3&1)+(n>>4&1);o>0;o-=!t[e++]);return e+(2&n)}(t),-8),n||new kc((o=(e=t).length,(e[o-4]|e[o-3]<<8|e[o-2]<<16|e[o-1]<<24)>>>0)));var e,o}function tl(t,n){return Jc(((8!=(15&(e=t)[0])||e[0]>>>4>7||(e[0]<<8|e[1])%31)&&Qc(6,"invalid zlib data"),32&e[1]&&Qc(6,"invalid zlib data: preset dictionaries not supported"),t.subarray(2,-4)),n);var e}function nl(t,n){return 31==t[0]&&139==t[1]&&8==t[2]?Zc(t,n):8!=(15&t[0])||t[0]>>4>7||(t[0]<<8|t[1])%31?function(t,n){return Jc(t,n)}(t,n):tl(t,n)}var el="undefined"!=typeof TextDecoder&&new TextDecoder;try{el.decode(Kc,{stream:!0})}catch(t){}function ol(t,n){if(n){for(var e="",o=0;o127)+(o>223)+(o>239);if(e+r>t.length)return[n,Xc(t,e-1)];r?3==r?(o=((15&o)<<18|(63&t[e++])<<12|(63&t[e++])<<6|63&t[e++])-65536,n+=String.fromCharCode(55296|o>>10,56320|1023&o)):n+=1&r?String.fromCharCode((31&o)<<6|63&t[e++]):String.fromCharCode((15&o)<<12|(63&t[e++])<<6|63&t[e++]):n+=String.fromCharCode(o)}}(t),i=r[0];return r[1].length&&Qc(8),i}function rl(t){return Math.round(performance.now()-t)}function il(t){t.time={rg:{t0:performance.now()}},"_didRelatedGenesFirstPlot"in t&&delete t._didRelatedGenesFirstPlot}function al(){const t=this.annotDescriptions.annots,n=Object.values(t).slice(),e=n.filter((t=>t.type&&t.type.includes("paralogous"))),o=n.filter((t=>t.type&&t.type.includes("interacting gene")));return{related:n,paralogous:e,interacting:o,searched:Object.entries(t).filter((t=>t[1].type&&t[1].type.includes("searched gene")))[0][0]}}function sl(t){const n=this,e=performance.now()-n.time.prevTooltipOff,o=n.time.prevTooltipAnnotDomId;if(e<300&&t.domId===o)return null;const r=t.name,i=n.annotDescriptions.annots[t.name].type.split(" ")[0],a=cl(n);return Object.assign({tooltipGene:r,tooltipRelatedType:i},a)}function cl(t){const n=t.getRelatedGenesByType();return{numRelatedGenes:n.related.length,numParalogs:n.paralogous.length,numInteractingGenes:n.interacting.length,searchedGene:n.searched}}let ll,ul,hl;function fl(t,n){const e="WBGene"===t?8:11;return t+n.padStart(e,"0")}async function dl(t){const n=t.replace(".gz","");if(void 0===await Ideogram.cache.match(n)){const e=await fetch(t),o=await e.blob(),r=ol(nl(new Uint8Array(await o.arrayBuffer()))),i=new Response(new Blob([r],{type:"text/tab-separated-values"}),e.init);return await Ideogram.cache.put(n,i),await Ideogram.cache.match(n)}return await Ideogram.cache.match(n)}async function ml(t,n,e=null){const o=performance.now();if(ll={},!function(t){const n=function(t){const n=Fr(t);return Sr[n]||{}}(t);return n.hasGeneCache&&!0===n.hasGeneCache}(t))return;if(Ideogram.geneCache&&Ideogram.geneCache[t])return void(n.geneCache=Ideogram.geneCache[t]);Ideogram.geneCache||(Ideogram.geneCache={}),Ideogram.cache=await caches.open("ideogram-1.37.0");const r=function(t,n){const e=jr(t);return n||(n=Mr("cache/")),n+e+"-genes.tsv.gz"}(t,e),i=performance.now(),a=await dl(r),s=await a.text(),c=performance.now();ll.fetch=Math.round(c-i);const[l,u,h,f,d,m,g,p,y]=function(t,n){const e=[],o={},r={},i={},a={},s={},c={},l={},u=[];let h,f=performance.now();const d=t.split(/\r\n|\n/);ll.rawTsvSplit=Math.round(performance.now()-f),f=performance.now();for(let t=0;t{e[t]={chr:t,annots:n.annots.sort(((t,n)=>t.start-n.start))}})),e}(u);return ll.parseAnnots=Math.round(performance.now()-m),[e,o,r,i,a,s,c,l,g]}(s);ll.parseCache=Math.round(performance.now()-c),n.geneCache={interestingNames:l,nameCaseMap:u,namesById:h,fullNamesById:f,idsByName:d,idsByFullName:m,lociByName:g,lociById:p,sortedAnnots:y},Ideogram.geneCache[t]=n.geneCache,n.config.debug&&(ll.total=Math.round(performance.now()-o),console.log("perfTimes in initGeneCache:",ll))}function gl(t,n){const e="WBGene"===t?8:11;return t+n.padStart(e,"0")}async function pl(t,n,e=null){const o=performance.now();if(ul={},!function(t){const n=function(t){const n=Fr(t);return Sr[n]||{}}(t);return n.hasParalogCache&&!0===n.hasParalogCache}(t))return;if(Ideogram.paralogCache&&Ideogram.paralogCache[t])return void(n.paralogCache=Ideogram.paralogCache[t]);Ideogram.paralogCache||(Ideogram.paralogCache={}),Ideogram.cache=await caches.open("ideogram-1.37.0");const r=function(t,n){const e=jr(t);return n?n+="paralogs/":n=Mr("cache/paralogs/"),n+e+"-paralogs.tsv.gz"}(t,e),i=performance.now(),a=await dl(r),s=await a.text(),c=performance.now();ul.fetch=Math.round(c-i);const l=function(t){const n={};let e,o=performance.now();const r=t.split(/\r\n|\n/);ul.rawTsvSplit=Math.round(performance.now()-o),o=performance.now();for(let t=0;tt.length>0&&"ixnType"in t[0]))[0].ixnType.toLowerCase()}function wl(t,n){const e=Array.from(t.querySelectorAll(`DataNode[TextLabel="${n}"]`)).map((t=>({type:"node",matchedLabel:n,textLabel:t.getAttribute("TextLabel"),graphId:t.getAttribute("GraphId"),groupRef:t.getAttribute("GroupRef")}))),o=e.map((t=>t.graphId)),r=e.map((t=>t.groupRef)).map((t=>`Group[GroupId="${t}"]`)).join(",");let i=[];if(""!==r){const e=t.querySelectorAll(r);i=Array.from(e).map((t=>({type:"group",matchedLabel:n,graphId:t.getAttribute("GraphId"),groupId:t.getAttribute("GroupId")})))}const a=i.map((t=>t.graphId));return[o.concat(a),e.concat(i)]}function xl(t){const n=t.name,e=t.genomic_pos.ensemblgene;let o=e;return void 0===e&&(o=t.genomic_pos.filter((t=>!t.chr.includes("_")))[0].ensemblgene),{name:n,ensemblId:o}}function _l(t,n){const e=n.organismScientificName;throw Error(`"${t}" is not a known gene in ${e}`)}async function Al(t,n,e){let o;"string"==typeof t&&(t=[t]);const r=`?q=${t.map((t=>`${n}:${t.trim()}`)).join(" OR ")}&species=${e.config.taxid}&fields=`;if(e.geneCache){const r=function(t,n,e){const o=e.geneCache,r="symbol"===n,i=r?o.lociByName:o.lociById,a=r?o.idsByName:o.namesById;return t.map((t=>{const n=t.toLowerCase();if(!i[t]&&!o.nameCaseMap[n]){if(!r)return;_l(t,e)}r&&!i[t]&&o.nameCaseMap[n]&&(t=o.nameCaseMap[n]);const s=i[t],c=r?t:a[t],l=r?a[t]:t;return{symbol:c,name:o.fullNamesById[l],source:"cache",genomic_pos:{chr:s[0],start:s[1],end:s[2],ensemblgene:l}}})).filter((t=>void 0!==t))}(t,n,e);r.forEach((t=>{const n=t.symbol,o=t.name;n in e.annotDescriptions.annots?e.annotDescriptions.annots[n].name=o:e.annotDescriptions.annots[n]={name:o}})),o={hits:r,fromGeneCache:!0}}else{const t=`${r}symbol,genomic_pos,name`;o=await async function(t){const n=await fetch("https://mygene.info/v3/query"+t+"&size=400");return await n.json()}(t)}return o}async function Cl(t,n,e){const o=[],r=Object.keys(t);return 0===r.length||((await Al(r,"symbol",e)).hits.forEach((r=>{if("genomic_pos"in r==0||r.symbol===n.name)return;const i=Sl(r,e,"purple");o.push(i);const a=t[r.symbol.toLowerCase()],s=function(t,n,e){const o=[],r=[];let i="";if(void 0!==n){const t=n.map((t=>{const n=`https://www.wikipathways.org/index.php/Pathway:${t.pathwayId}`;return o.push(t.pathwayId),r.push(t.name),`${t.name}`})).join("
    ");i=`Interacts with ${e.name} in:
    ${t}`}const{name:a,ensemblId:s}=xl(t);return{description:i,ixnsDescription:i,ensemblId:s,name:a,type:"interacting gene",pathwayIds:o,pathwayNames:r}}(r,a,n);Nl(i,s,e)})),function(t){const n={};Object.entries(t.annotDescriptions.annots).forEach((([t,e])=>{"type"in e&&e.type.includes("interacting gene")&&(n[t]=e.pathwayIds)}));const e={};Object.entries(n).forEach((([t,n])=>{e[t]={},n.map((async n=>{const o=await async function(t){const n=`https://cdn.jsdelivr.net/npm/ixn2/${t}.xml.gz`,e=await fetch(n),o=await e.blob(),r=ol(nl(new Uint8Array(await o.arrayBuffer())));return(new DOMParser).parseFromString(r,"text/xml")}(n);e[t][n]=o}))})),t.gpmlsByInteractingGene=e}(e)),o}function kl(t,n){let e=null;return e=Array.isArray(t.genomic_pos)?t.genomic_pos.filter((t=>t.chr in n.chromosomes[n.config.taxid]))[0]:t.genomic_pos,e}function Sl(t,n,e="red"){const o=kl(t,n);return{name:t.symbol,chr:o.chr,start:o.start,stop:o.end,id:o.ensemblgene,color:e}}function Ll(){const t=document.querySelector("#_ideogramInnerWrap"),n=`position: absolute; top: 15px; left: ${Wl({}).legendPad+20}px`,e=document.querySelector("#_ideogramLegend");t.prepend(e),e.style=n}function Tl(t,n){return new Promise((async e=>{const o=performance.now(),r=await async function(t,n){const e={},o={},r=n.config.organism.replace(/-/g," "),i=t.name.toUpperCase();let a={result:[]};if(n.interactionCache)i in n.interactionCache&&(a=n.interactionCache[i]);else{const t=`https://cdn.jsdelivr.net/npm/ixn2/${i}.json.gz`,n=await fetch(t);if(n.ok){const t=await n.blob(),e=new Uint8Array(await t.arrayBuffer());a=JSON.parse(ol(nl(e)))}}return a.result.forEach((i=>{if(i.species.toLowerCase()===r){const r=i.fields.right.values,a=i.fields.left.values,s=r.concat(a),c=i.name,l=i.id,u=function(t,n){return n&&(t=Ea(t,n)),t.sort(((t,n)=>t.rank-n.rank))}(s.map((t=>({name:t,color:""}))),n).map((t=>t.name));u.forEach((r=>{const i=r.toLowerCase();if(i.includes(t.name.toLowerCase()))return;const a=c+l,s=function(t,n,e,o,r){let i;return i="geneCache"in r&&n.name?t.toLowerCase()in r.geneCache.nameCaseMap:function(t,n){return""!==t&&!t.includes(" ")&&!t.includes("/")&&t.toLowerCase()!==n.name.toLowerCase()}(t,n),i&&!(e in o)}(i,t,a,o,n);if(s){o[a]=1;const t={name:c,pathwayId:l};i in e?e[i].push(t):e[i]=[t]}}))}})),e}(t,n),i=await Cl(r,t,n);n.relatedAnnots.push(...i),Bl("interacting",n),n.time.rg.interactions=rl(o),e()}))}function Ml(t,n){return new Promise((async e=>{const o=performance.now(),r=await async function(t,n){const e=n.config.taxid;let o;if(n.paralogCache){const e=n.paralogCache.paralogsByName,r=t.name.toUpperCase();o=r in e?e[r]:[]}else{const n=`&format=condensed&type=paralogues&target_taxon=${e}`,r=`/homology/id/${t.id}?${n}`;o=(await Ideogram.fetchEnsembl(r)).data[0].homologies}let r=await async function(t,n,e){const o=[],r=t.length&&"string"==typeof t[0]?t:t.map((t=>t.id));return(await Al(r,"ensemblgene",e)).hits.forEach((t=>{if("genomic_pos"in t==0)return;if("name"in t==0)return;const r=Sl(t,e,"pink");o.push(r);const i=`Paralog of ${n.name}`,{name:a,ensemblId:s}=xl(t);Nl(r,{description:i,ensemblId:s,name:a,type:"paralogous gene"},e)})),o}(o,t,n);return r=r.filter((t=>!t.name.match(/^AC[0-9.]+$/))),r}(t,n);n.relatedAnnots.push(...r),Bl("paralogous",n),function(t,n){if(!n.config.showParalogNeighborhoods)return;if(t.length<2)return;const e={};e[t[0].chr]={},e[t[0].chr][t[0].start]=[t[0]];for(let n=1;n{const a=parseInt(Object.keys(e)[0]);let s=Object.values(e)[0];if(s.length<2)return{paralogs:s};const c=`${s.length} nearby paralogs of ${r}`,l=n.chromosomes[n.config.taxid][t].bpLength;let u=a-75e5,h=a+75e5;h>l?(u=a-o,h=l):u<1&&(u=1,h=o),"geneCache"in n&&(s=s.map((t=>(t.fullName=n.geneCache.fullNamesById[t.id],t))));const f={name:"paralogNeighborhood-"+i,chr:t,start:u,stop:h,color:"pink",description:c,paralogs:s,type:"paralog neighborhood",displayCoordinates:`chr${t}:${a.toLocaleString()} ± 2 Mbp`};return n.annotDescriptions.annots[f.name]=f,f})).filter((t=>t.paralogs.length>1));i.length>0&&(n.drawAnnots(i,"overlay",!0,!0),Ll())}(r,n),n.time.rg.paralogs=rl(o),e()}))}function Pl(t,n){var e,o,r,i;return"name"in t?(e=t.name,o=n.name,r=t.color,i=n.color):([e,r]=[t[0],t[3]],[o,i]=[n[0],n[3]]),"red"===r?-1:"red"===i?1:"purple"===r&&"pink"===i?-1:"purple"===i&&"pink"===r?1:t.rank-n.rank}function Nl(t,n,e){let o;const r=e.annotDescriptions.annots;if(t.name in r){const e=r[t.name];if(o=n,n.type===e.type)return;Object.keys(e).forEach((function(t){t in o==0&&(o[t]=e[t])})),"type"in e&&(o.type+=", "+e.type,o.description+=`

    ${e.description}`)}else o=n;e.annotDescriptions.annots[t.name]=o}function Il(t){const n={};let e=[];return t.forEach((t=>{t.name in n==0?(e.push(t),n[t.name]=1):"purple"===t.color&&(e=e.map((n=>t.name===n.name?t:n)))})),e}function Bl(t,n){!function(t){const n=[],e=t.chromosomesArray.map((t=>t.name)),o={};t.relatedAnnots=t.relatedAnnots.filter((t=>!(t.name in o)&&(o[t.name]=1,!0)));const r={};t.relatedAnnots.forEach((t=>{t.chr in r?r[t.chr].push(t):r[t.chr]=[t]}));const i={};Object.entries(r).map((([n,e])=>{(e=Ea(e,t)).sort(((n,e)=>-t.annotSortFunction(n,e)));const o=e.map((t=>t.name));i[n]=o})),t.relatedAnnots.forEach((t=>{const o=t.chr,r=e.indexOf(o),a=i[o].indexOf(t.name);t.domId=Aa(r,a),n.push(t)})),t.relatedAnnots=n}(n);let e=$r(n.relatedAnnots);e=function(t,n){if("all"===n.config.annotsInList)return t;const e=[];return t.forEach((t=>{n.config.annotsInList.includes(t.name.toLowerCase())&&e.push(t)})),e}(e,n),e=Il(e),n.relatedAnnots=Il(e),n.relatedAnnots.sort(n.annotSortFunction),e.length>1&&n.onFindRelatedGenesCallback&&n.onFindRelatedGenesCallback(),n.drawAnnots(e),n.config.showAnnotLabels&&n.fillAnnotLabels(n.relatedAnnots),Ll(),function(t,n){if("pathway"===t)return;const e=n.getRelatedGenesByType(),o={paralogous:"interacting",interacting:"paralogous"}[t],r=e[t].length,i=e[o]?e[o].length:0;if(n._didRelatedGenesFirstPlot)if(r>0&&i>0){const t=n.time.rg.timestampFirstPlot;n.time.rg.totalLastPlotDiff=rl(t)}else r>0&&0===i?(n.time.rg.timestampFirstPlot=performance.now(),n.time.rg.totalFirstPlot=rl(n.time.rg.t0),n._relatedGenesFirstPlotType=t,n.time.rg.totalLastPlotDiff=0):(0===r&&i>0||(n._relatedGenesFirstPlotType="searched"),n.time.rg.totalLastPlotDiff=0);else n._didRelatedGenesFirstPlot=!0,n.time.rg.totalFirstPlot=rl(n.time.rg.t0),r>0&&(n.time.rg.timestampFirstPlot=performance.now(),n._relatedGenesFirstPlotType=t)}(t,n)}function El(t){var n=document.querySelector(t.config.container);n.style.visibility="",n.style.position="absolute",n.style.width="100%";var e=document.querySelector("#_ideogramInnerWrap");e.style.position="relative",e.style.marginLeft="auto",e.style.marginRight="auto",e.style.overflowY="hidden",document.querySelector("#_ideogramMiddleWrap").style.overflowY="hidden";const o=t.config.legendPad;if(void 0===t.didAdjustIdeogramLegend){var r=document.querySelector("#_ideogram");const n=160;e.style.maxWidth=parseInt(e.style.maxWidth)+n+o+"px",r.style.minWidth=parseInt(r.style.minWidth)+o+"px",r.style.maxWidth=parseInt(r.style.minWidth)+o+"px",r.style.position="relative",r.style.left=n+"px",t.didAdjustIdeogramLegend=!0}}async function Dl(t=null){const n=this;n.clearAnnotLabels();const e=document.querySelector("#_ideogramLegend");if(e&&e.remove(),!t)return Hl();n.config=Wl(n.config),function(t,n){const e=[`# ${n}`,`# Organism: ${t.getScientificName(t.config.taxid)}`,`# Generated by Ideogram.js version ${Ideogram.version}, https://github.com/eweitz/ideogram`,`# Generated at ${window.location.href}`].join("\n");delete t.annotDescriptions,t.annotDescriptions={headers:e,annots:{}}}(n,`Related genes for ${t}`);const o=n.selector+" .annot";document.querySelectorAll(o).forEach((t=>t.remove())),n.startHideAnnotTooltipTimeout(),document.querySelectorAll(".chromosome").forEach((t=>{t.style.cursor=""})),El(n),n.relatedAnnots=[];const r=await async function(t,n){const e=performance.now(),o=await Al(t,"symbol",n);if(0===o.hits.length)return;const r=o.hits.find((t=>{const e=kl(t,n);return e&&e.ensemblgene}));let i={description:"",ensemblId:r.genomic_pos.ensemblgene,type:"searched gene"};if(r.symbol in n.annotDescriptions.annots){const t=n.annotDescriptions.annots[r.symbol];i=Object.assign(t,i)}else i.name=r.name;n.annotDescriptions.annots[r.symbol]=i;const a=Sl(r,n);return n.relatedAnnots.push(a),n.time.rg.searchedGene=rl(e),a}(t,n);void 0===r&&_l(t,n),n.config.legend=jl,aa(n),Ll(),await Promise.all([Tl(r,n),Ml(r,n)]),n.time.rg.total=rl(n.time.rg.t0),function(t){const n=cl(t),e=t.time.rg.total,o=t.time.rg.totalFirstPlot,r=t.time.rg.totalLastPlotDiff,i=t.time.rg.paralogs,a=t.time.rg.interactions,s=t.time.rg.searchedGene,c=t._relatedGenesFirstPlotType,l=Object.assign({firstPlotType:c,timeTotal:e,timeTotalFirstPlot:o,timeTotalLastPlotDiff:r,timeSearchedGene:s,timeInteractingGenes:a,timeParalogs:i},n);t.relatedGenesAnalytics=l}(n),n.onPlotRelatedGenesCallback&&n.onPlotRelatedGenesCallback()}function Fl(t){return Object.entries(t.annotDescriptions.annots).find((([t,n])=>"searched gene"===n.type))[0]}function Rl(t){var n;const e=this;if(t.name===(null===(n=e.prevClickedAnnot)||void 0===n?void 0:n.name)&&e.isTooltipCooling)return null;const o=e.annotDescriptions.annots[t.name];if("type"in o&&o.type.includes("interacting gene")){const n=o.pathwayIds,r=Fl(e),i=e.gpmlsByInteractingGene[t.name],a=function(t,n,e,o){let r=null;const i=function(t,n,e,o){const r={};return e.map((e=>{const i=o[e],a=function(t,n,e){const[o,r]=wl(e,n),[i,a]=wl(e,t),s={searchedGene:r,interactingGene:a},c=o.concat(i),l={searchedGeneGraphIds:o,matchingGraphIds:c},u=[],h=e.querySelectorAll("Interaction Graphics");return Array.from(h).forEach((t=>{const n=function(t,n){let e=null;const{searchedGeneGraphIds:o,matchingGraphIds:r}=n,i=[];let a=0,s=!1,c=null,l=null;return Array.from(t.children).forEach((t=>{if("Point"!==t.nodeName)return;const n=t,e=n.getAttribute("GraphRef");if(null!==e&&r.includes(e)&&(a+=1,i.push(e),o.includes(e)&&(s=!0),n.getAttribute("ArrowHead"))){const t=n.getAttribute("ArrowHead"),r=o.includes(e);null===l&&(l=r?0:1),c=vl[t][r?0:1]}})),a>=2&&s&&(null===l&&(c="interacts with"),c=c[0].toUpperCase()+c.slice(1),e={interactionId:t.parentNode.getAttribute("GraphId"),endIds:i,ixnType:c}),e}(t,l);null!==n&&(n.elements=s,u.push(n))})),u}(t,n,i);r[e]=a})),r}(t,n,e,o),a=i[e[0]];if(a.length>0){let t={ixnsByPwid:i,isSameByPwid:{},isSame:null,isDirectionSameByPwid:{},isDirectionSame:null,directionsByPwid:{}};t=function(t){let n=!0;const e=t.ixnsByPwid,o=bl(e);return Object.entries(e).map((([e,r])=>{const{isRefMatch:i,thisIsSame:a}=function(t,n){let e=!0,o=!0;if(0===t.length)return{isRefMatch:e,thisIsSame:o};const r=t[0].ixnType.toLowerCase();return t.forEach((t=>{const i=t.ixnType.toLowerCase();i!==n&&(e=!1),i!==r&&(o=!1)})),{isRefMatch:e,thisIsSame:o}}(r,o);a&&i||(n=!1),t.isSameByPwid[e]=a})),t.isSame=n,t}(t),t.isSame?r=a[0].ixnType:(t=function(t){let n=!0;const e=[],o=[];Object.values(vl).forEach((t=>{o.push(t[0]),e.push(t[1])}));const r="Acts on",i="Acted on by",a=t.ixnsByPwid,s=bl(a),c=o.includes(s)?r:i;return Object.entries(a).map((([e,a])=>{let s=!0;if(a.length>0){const l=a[0].ixnType.toLowerCase(),u=o.includes(l)?r:i;a.forEach((a=>{const l=a.ixnType.toLowerCase(),h=o.includes(l)?r:i;t.directionsByPwid[e]=h,h!==c&&(n=!1),h!==u&&(s=!1)}))}t.isDirectionSameByPwid[e]=s})),t.isDirectionSame=n,!0===n&&(t.direction=c),t}(t),r=t.isDirectionSame?t.direction:"Interacts with")}return r}(t.name,r,n,i);if(null!==a){const t="Interacts with";o.description=o.description.replace(t,a)}}const r=o.description.length>0?`
    ${o.description}`:"",i=o.name,a='style="color: #0366d6; cursor: pointer;"';let s=i;"rank"in t&&(s=`${i}`);let c=`${t.name}
    ${s}
    ${r}
    `;if(t.name.includes("paralogNeighborhood")){const n=o.paralogs.sort(((t,n)=>t.rank-n.rank)),e=n.shift();n.push(e),c="Paralog neighborhood

    "+o.description+":
    "+`${n.map((t=>{let n="";return t.fullName&&(n=t.fullName),t.rank&&(n+=` Ranked ${t.rank} in general or scholarly interest`),""!==n&&(n=`title="${n}"`),`${t.name}`})).join("
    ")}
    `,t.displayCoordinates=o.displayCoordinates}return t.displayName=c,function(t){const n=document.querySelector("._ideogramTooltip");t.addedTooltipClickHandler||(n.addEventListener("click",(n=>{let e=document.querySelector("#ideo-related-gene");e||(e=n.target);const o=function(t,n){var e;return n.annots.forEach((n=>{n.annots.forEach((n=>{t===n.name&&(e=n)}))})),null===e&&(e=n.annotDescriptions.annots[t]),e}(e.textContent,t);t.onClickAnnot(o)})),t.addedTooltipClickHandler=!0)}(e),t}const Ol="triangle",Gl="font-size: 14px; font-weight: bold; font-color: #333;",jl=[{name:`\n
    \n
    Related genes
    \n Click gene to search\n
    \n `,nameHeight:50,rows:[{name:"Interacting gene",color:"purple",shape:Ol},{name:"Paralogous gene",color:"pink",shape:Ol},{name:"Searched gene",color:"red",shape:Ol}]}],zl=[{name:`\n
    \n
    Highly cited genes
    \n Click gene to search\n
    \n `,nameHeight:30,rows:[]}];function Wl(t){return t.showAnnotLabels?t.legendPad=70:t.legendPad=30,t}function Hl(){const t=this;if(!t||"annotDescriptions"in t)return;t.annotDescriptions={annots:{}},t.flattenAnnots().map((n=>{let e=[];"significance"in n&&"n/a"!==n.significance&&e.push(n.significance),"citations"in n&&void 0!==n.citations&&e.push(n.citations),e=e.join("

    "),t.annotDescriptions.annots[n.name]={description:e,name:n.fullName}})),El(t),Ll(),t.fillAnnotLabels([]);const n=t.config.container;document.querySelector(n).style.visibility=""}class ql{constructor(t){this.configure=Ur,this.initDrawChromosomes=hi,this.onLoad=di,this.handleRotateOnClick=fi,this.init=wi,this.finishInit=Jr,this.writeContainer=ii,this.onLoadAnnots=Gi,this.onDrawAnnots=ji,this.processAnnotData=Sa,this.restoreDefaultTracks=va,this.updateDisplayedTracks=ba,this.initAnnotSettings=Ma,this.fetchAnnots=Ia,this.drawAnnots=sa,this.getHistogramBars=na,this.drawHeatmaps=Fi,this.deserializeAnnotsForHeatmap=Oi,this.fillAnnots=Ba,this.drawProcessedAnnots=ca,this.drawSynteny=ya,this.startHideAnnotTooltipTimeout=Wi,this.showAnnotTooltip=$i,this.onWillShowAnnotTooltip=Hi,this.onClickAnnot=qi,this.setOriginalTrackIndexes=wa,this.afterRawAnnots=Pa,this.downloadAnnotations=Ta,this.addAnnotLabel=Ji,this.removeAnnotLabel=Zi,this.fillAnnotLabels=Ki,this.clearAnnotLabels=ta,this.flattenAnnots=Na,this.highlight=Da,this.unhighlight=Fa,this.esearch="https://eutils.ncbi.nlm.nih.gov/entrez/eutils/esearch.fcgi?retmode=json&api_key=7e33ac6a08a6955ec3b83d214d22b21a2808",this.esummary="https://eutils.ncbi.nlm.nih.gov/entrez/eutils/esummary.fcgi?retmode=json&api_key=7e33ac6a08a6955ec3b83d214d22b21a2808",this.elink="https://eutils.ncbi.nlm.nih.gov/entrez/eutils/elink.fcgi?retmode=json&api_key=7e33ac6a08a6955ec3b83d214d22b21a2808",this.getOrganismFromEutils=Oa,this.getTaxids=Wa,this.getAssemblyAndChromosomesFromEutils=qa,this.drawBandLabels=Ka,this.getBandColorGradients=ts,this.processBandData=is,this.setBandsToShow=Va,this.hideUnshownBandLabels=$a,this.drawBandLabelText=Qa,this.drawBandLabelStalk=Ja,this.onBrushMove=as,this.onBrushEnd=ss,this.createBrush=cs,this.createClickCursor=us,this.onCursorMove=ls,this.drawSexChromosomes=hs,this.setSexChromosomes=fs,this.convertBpToPx=ds,this.convertPxToBp=gs,this.unpackAnnots=nc,this.packAnnots=ec,this.initCrossFilter=oc,this.filterAnnots=rc,this.assemblyIsAccession=Tr,this.getDataDir=Nr,this.round=Ir,this.onDidRotate=Br,this.getSvg=Er,this.fetch=Dr,this.getTaxid=Rr,this.getCommonName=Or,this.getScientificName=Gr,this.getChromosomeModel=ac,this.getChromosomePixels=ic,this.drawChromosomeLabels=Ac,this.rotateChromosomeLabels=Cc,this.appendHomolog=bc,this.drawChromosome=wc,this.rotateAndToggleDisplay=xc,this.setOverflowScroll=_c,this.plotRelatedGenes=Dl,this.getRelatedGenesByType=al,this.configure(t)}static get version(){return"1.37.0"}static get d3(){return Lr}static async fetchEnsembl(t,n=null,e="GET"){const o={method:e};if(null!==n&&(o.body=JSON.stringify(n)),"GET"===e){const n=t.includes("&")?"&":"?";t+=n+"content-type=application/json"}else o.headers={"Content-Type":"application/json"};const r=await fetch(`https://rest.ensembl.org${t}`,o);return await r.json()}static getChrSortNamesAndTypes(t,n){var e,o,r,i,a,s,c,l,u,h;return"string"==typeof t||"chr"in t&&"annots"in t?(a="MT"===(e="string"==typeof t?t:t.chr),s="MT"===(o="string"==typeof n?n:n.chr),c="AP"===e,l="AP"===o,u=!(r="CP"===e)&&!a&&!c,h=!(i="CP"===o)&&!s&&!l):(e=t.name,o=n.name,r="chloroplast"===t.type,i="chloroplast"===n.type,a="mitochondrion"===t.type,s="mitochondrion"===n.type,c="apicoplast"===t.type,l="apicoplast"===n.type,u="nuclear"===t.type,h="nuclear"===n.type),[e,o,{aIsNuclear:u,bIsNuclear:h,aIsCP:r,bIsCP:i,aIsMT:a,bIsMT:s,aIsAP:c,bIsAP:l}]}static sortChromosomes(t,n){let[e,o,r]=ql.getChrSortNamesAndTypes(t,n);const{aIsNuclear:i,bIsNuclear:a,aIsCP:s,bIsCP:c,aIsMT:l,bIsMT:u,aIsAP:h,bIsAP:f}=r;return i&&a?(zr(e)&&zr(o)&&(e=Wr(e).toString(),o=Wr(o).toString()),e.localeCompare(o,"en",{numeric:!0})):!i&&a||l&&c?1:s&&u?-1:h||l||s||!(u||c||f)?void 0:-1}static initRelatedGenes(t,n="all"){return function(t,n){"all"!==n&&(n=n.map((t=>t.toLowerCase())));const e={showFullyBanded:!1,rotatable:!1,legend:jl,chrBorderColor:"#333",chrLabelColor:"#333",onWillShowAnnotTooltip:Rl,annotsInList:n,showTools:!0,showAnnotLabels:!0,showParalogNeighborhoods:!0,chrFillColor:{centromere:"#DAAAAA"},relatedGenesMode:"related"};if("onWillShowAnnotTooltip"in t){const n="onWillShowAnnotTooltip",o=t[n],r=e[n],i=function(t){return t=r.bind(this)(t),o.bind(this)(t)};e[n]=i,delete t[n]}let o=Object.assign(e,t);o=Wl(o);const r=new Ideogram(o);t.onPlotRelatedGenes&&(r.onPlotRelatedGenesCallback=t.onPlotRelatedGenes),t.onFindRelatedGenes&&(r.onFindRelatedGenesCallback=t.onFindRelatedGenes),r.getTooltipAnalytics=sl,r.annotSortFunction=Pl,il(r);let i=null;return t.cacheDir&&(i=t.cacheDir),ml(r.config.organism,r,i),pl(r.config.organism,r,i),yl(r.config.organism,r,i),r}(t,n)}static initGeneHints(t,n="all"){return function(t,n){delete t.onPlotRelatedGenes,"all"!==n&&(n=n.map((t=>t.toLowerCase())));const e=Mr("cache/homo-sapiens-top-genes.tsv"),o={showFullyBanded:!1,rotatable:!1,legend:zl,chrMargin:-4,chrBorderColor:"#333",chrLabelColor:"#333",onWillShowAnnotTooltip:Rl,annotsInList:n,showTools:!0,showAnnotLabels:!0,showParalogNeighborhoods:!0,onDrawAnnots:Hl,annotationsPath:e,relatedGenesMode:"hints"};if("onWillShowAnnotTooltip"in t){const n="onWillShowAnnotTooltip",e=t[n],r=o[n],i=function(t){return t=r.bind(this)(t),e.bind(this)(t)};o[n]=i,delete t[n]}if("onDrawAnnots"in t){const n="onDrawAnnots",e=t[n],r=o[n],i=function(){r.bind(this)(),e.bind(this)()};o[n]=i,delete t[n]}const r=Object.assign(o,t);r.showAnnotLabels?r.legendPad=80:r.legendPad=30;const i=new Ideogram(r);t.onPlotRelatedGenes&&(i.onPlotRelatedGenesCallback=t.onPlotRelatedGenes),t.onFindRelatedGenes&&(i.onFindRelatedGenesCallback=t.onFindRelatedGenes),i.getTooltipAnalytics=sl,i.annotSortFunction=Pl,il(i);let a=null;return t.cacheDir&&(a=t.cacheDir),ml(i.config.organism,i,a),pl(i.config.organism,i,a),yl(i.config.organism,i,a),i}(t,n)}}window.Ideogram=ql;const $l=ql;return n})()})); +!function(t,n){if("object"==typeof exports&&"object"==typeof module)module.exports=n();else if("function"==typeof define&&define.amd)define([],n);else{var e=n();for(var o in e)("object"==typeof exports?exports:t)[o]=e[o]}}(self,(function(){return(()=>{"use strict";var t={d:(n,e)=>{for(var o in e)t.o(e,o)&&!t.o(n,o)&&Object.defineProperty(n,o,{enumerable:!0,get:e[o]})},o:(t,n)=>Object.prototype.hasOwnProperty.call(t,n),r:t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})}},n={};t.r(n),t.d(n,{default:()=>$l});var e={};t.r(e),t.d(e,{blob:()=>_t,buffer:()=>Ct,csv:()=>Gt,dsv:()=>Ot,html:()=>Yt,image:()=>zt,json:()=>Ht,svg:()=>Ut,text:()=>Ft,tsv:()=>jt,xml:()=>$t});var o={};t.r(o),t.d(o,{brush:()=>Oo,brushSelection:()=>Do,brushX:()=>Fo,brushY:()=>Ro});var r={};t.r(r),t.d(r,{dispatch:()=>tn});var i={};t.r(i),t.d(i,{FormatSpecifier:()=>$o,format:()=>Qo,formatDefaultLocale:()=>nr,formatLocale:()=>tr,formatPrefix:()=>Jo,formatSpecifier:()=>qo,precisionFixed:()=>er,precisionPrefix:()=>or,precisionRound:()=>rr});function a(){}function s(t){return null==t?a:function(){return this.querySelector(t)}}function c(t){return"object"==typeof t&&"length"in t?t:Array.from(t)}function l(){return[]}function u(t){return null==t?l:function(){return this.querySelectorAll(t)}}function h(t){return function(){return this.matches(t)}}function f(t){return function(n){return n.matches(t)}}var d=Array.prototype.find;function m(){return this.firstElementChild}var g=Array.prototype.filter;function p(){return this.children}function y(t){return new Array(t.length)}function v(t,n){this.ownerDocument=t.ownerDocument,this.namespaceURI=t.namespaceURI,this._next=null,this._parent=t,this.__data__=n}function b(t){return function(){return t}}function w(t,n,e,o,r,i){for(var a,s=0,c=n.length,l=i.length;sn?1:t>=n?0:NaN}v.prototype={constructor:v,appendChild:function(t){return this._parent.insertBefore(t,this._next)},insertBefore:function(t,n){return this._parent.insertBefore(t,n)},querySelector:function(t){return this._parent.querySelector(t)},querySelectorAll:function(t){return this._parent.querySelectorAll(t)}};var C="http://www.w3.org/1999/xhtml";const k={svg:"http://www.w3.org/2000/svg",xhtml:C,xlink:"http://www.w3.org/1999/xlink",xml:"http://www.w3.org/XML/1998/namespace",xmlns:"http://www.w3.org/2000/xmlns/"};function S(t){var n=t+="",e=n.indexOf(":");return e>=0&&"xmlns"!==(n=t.slice(0,e))&&(t=t.slice(e+1)),k.hasOwnProperty(n)?{space:k[n],local:t}:t}function L(t){return function(){this.removeAttribute(t)}}function T(t){return function(){this.removeAttributeNS(t.space,t.local)}}function M(t,n){return function(){this.setAttribute(t,n)}}function P(t,n){return function(){this.setAttributeNS(t.space,t.local,n)}}function N(t,n){return function(){var e=n.apply(this,arguments);null==e?this.removeAttribute(t):this.setAttribute(t,e)}}function I(t,n){return function(){var e=n.apply(this,arguments);null==e?this.removeAttributeNS(t.space,t.local):this.setAttributeNS(t.space,t.local,e)}}function B(t){return t.ownerDocument&&t.ownerDocument.defaultView||t.document&&t||t.defaultView}function E(t){return function(){this.style.removeProperty(t)}}function D(t,n,e){return function(){this.style.setProperty(t,n,e)}}function F(t,n,e){return function(){var o=n.apply(this,arguments);null==o?this.style.removeProperty(t):this.style.setProperty(t,o,e)}}function R(t,n){return t.style.getPropertyValue(n)||B(t).getComputedStyle(t,null).getPropertyValue(n)}function O(t){return function(){delete this[t]}}function G(t,n){return function(){this[t]=n}}function j(t,n){return function(){var e=n.apply(this,arguments);null==e?delete this[t]:this[t]=e}}function z(t){return t.trim().split(/^|\s+/)}function W(t){return t.classList||new H(t)}function H(t){this._node=t,this._names=z(t.getAttribute("class")||"")}function q(t,n){for(var e=W(t),o=-1,r=n.length;++o=0&&(n=t.slice(e+1),t=t.slice(0,e)),{type:t,name:n}}))}function ht(t){return function(){var n=this.__on;if(n){for(var e,o=0,r=-1,i=n.length;o=0&&(this._names.splice(n,1),this._node.setAttribute("class",this._names.join(" ")))},contains:function(t){return this._names.indexOf(t)>=0}};var pt=[null];function yt(t,n){this._groups=t,this._parents=n}function vt(){return new yt([[document.documentElement]],pt)}yt.prototype=vt.prototype={constructor:yt,select:function(t){"function"!=typeof t&&(t=s(t));for(var n=this._groups,e=n.length,o=new Array(e),r=0;r=S&&(S=k+1);!(C=y[S])&&++S=0;)(o=r[i])&&(a&&4^o.compareDocumentPosition(a)&&a.parentNode.insertBefore(o,a),a=o);return this},sort:function(t){function n(n,e){return n&&e?t(n.__data__,e.__data__):!n-!e}t||(t=A);for(var e=this._groups,o=e.length,r=new Array(o),i=0;i1?this.each((null==n?E:"function"==typeof n?F:D)(t,n,null==e?"":e)):R(this.node(),t)},property:function(t,n){return arguments.length>1?this.each((null==n?O:"function"==typeof n?j:G)(t,n)):this.node()[t]},classed:function(t,n){var e=z(t+"");if(arguments.length<2){for(var o=W(this.node()),r=-1,i=e.length;++r=i?c=!0:10===(o=t.charCodeAt(a++))?l=!0:13===o&&(l=!0,10===t.charCodeAt(a)&&++a),t.slice(r+1,n-1).replace(/""/g,'"')}for(;a9999?"+"+Mt(n,6):Mt(n,4))+"-"+Mt(t.getUTCMonth()+1,2)+"-"+Mt(t.getUTCDate(),2)+(i?"T"+Mt(e,2)+":"+Mt(o,2)+":"+Mt(r,2)+"."+Mt(i,3)+"Z":r?"T"+Mt(e,2)+":"+Mt(o,2)+":"+Mt(r,2)+"Z":o||e?"T"+Mt(e,2)+":"+Mt(o,2)+"Z":"")}(t):n.test(t+="")?'"'+t.replace(/"/g,'""')+'"':t}return{parse:function(t,n){var e,r,i=o(t,(function(t,o){if(e)return e(t,o-1);r=t,e=n?function(t,n){var e=Lt(t);return function(o,r){return n(e(o),r,t)}}(t,n):Lt(t)}));return i.columns=r||[],i},parseRows:o,format:function(n,e){return null==e&&(e=Tt(n)),[e.map(a).join(t)].concat(r(n,e)).join("\n")},formatBody:function(t,n){return null==n&&(n=Tt(t)),r(t,n).join("\n")},formatRows:function(t){return t.map(i).join("\n")},formatRow:i,formatValue:a}}var Nt=Pt(","),It=Nt.parse,Bt=(Nt.parseRows,Nt.format,Nt.formatBody,Nt.formatRows,Nt.formatRow,Nt.formatValue,Pt("\t")),Et=Bt.parse;function Dt(t){if(!t.ok)throw new Error(t.status+" "+t.statusText);return t.text()}function Ft(t,n){return fetch(t,n).then(Dt)}function Rt(t){return function(n,e,o){return 2===arguments.length&&"function"==typeof e&&(o=e,e=void 0),Ft(n,e).then((function(n){return t(n,o)}))}}function Ot(t,n,e,o){3===arguments.length&&"function"==typeof e&&(o=e,e=void 0);var r=Pt(t);return Ft(n,e).then((function(t){return r.parse(t,o)}))}Bt.parseRows,Bt.format,Bt.formatBody,Bt.formatRows,Bt.formatRow,Bt.formatValue;var Gt=Rt(It),jt=Rt(Et);function zt(t,n){return new Promise((function(e,o){var r=new Image;for(var i in n)r[i]=n[i];r.onerror=o,r.onload=function(){e(r)},r.src=t}))}function Wt(t){if(!t.ok)throw new Error(t.status+" "+t.statusText);if(204!==t.status&&205!==t.status)return t.json()}function Ht(t,n){return fetch(t,n).then(Wt)}function qt(t){return(n,e)=>Ft(n,e).then((n=>(new DOMParser).parseFromString(n,t)))}const $t=qt("application/xml");var Yt=qt("text/html"),Ut=qt("image/svg+xml"),Xt={value:()=>{}};function Vt(){for(var t,n=0,e=arguments.length,o={};n=0&&(e=t.slice(o+1),t=t.slice(0,o)),t&&!n.hasOwnProperty(t))throw new Error("unknown type: "+t);return{type:t,name:e}}))}function Kt(t,n){for(var e,o=0,r=t.length;o0)for(var e,o,r=new Array(e),i=0;i>8&15|n>>4&240,n>>4&15|240&n,(15&n)<<4|15&n,1):8===e?kn(n>>24&255,n>>16&255,n>>8&255,(255&n)/255):4===e?kn(n>>12&15|n>>8&240,n>>8&15|n>>4&240,n>>4&15|240&n,((15&n)<<4|15&n)/255):null):(n=mn.exec(t))?new Tn(n[1],n[2],n[3],1):(n=gn.exec(t))?new Tn(255*n[1]/100,255*n[2]/100,255*n[3]/100,1):(n=pn.exec(t))?kn(n[1],n[2],n[3],n[4]):(n=yn.exec(t))?kn(255*n[1]/100,255*n[2]/100,255*n[3]/100,n[4]):(n=vn.exec(t))?In(n[1],n[2]/100,n[3]/100,1):(n=bn.exec(t))?In(n[1],n[2]/100,n[3]/100,n[4]):wn.hasOwnProperty(t)?Cn(wn[t]):"transparent"===t?new Tn(NaN,NaN,NaN,0):null}function Cn(t){return new Tn(t>>16&255,t>>8&255,255&t,1)}function kn(t,n,e,o){return o<=0&&(t=n=e=NaN),new Tn(t,n,e,o)}function Sn(t){return t instanceof sn||(t=An(t)),t?new Tn((t=t.rgb()).r,t.g,t.b,t.opacity):new Tn}function Ln(t,n,e,o){return 1===arguments.length?Sn(t):new Tn(t,n,e,null==o?1:o)}function Tn(t,n,e,o){this.r=+t,this.g=+n,this.b=+e,this.opacity=+o}function Mn(){return"#"+Nn(this.r)+Nn(this.g)+Nn(this.b)}function Pn(){var t=this.opacity;return(1===(t=isNaN(t)?1:Math.max(0,Math.min(1,t)))?"rgb(":"rgba(")+Math.max(0,Math.min(255,Math.round(this.r)||0))+", "+Math.max(0,Math.min(255,Math.round(this.g)||0))+", "+Math.max(0,Math.min(255,Math.round(this.b)||0))+(1===t?")":", "+t+")")}function Nn(t){return((t=Math.max(0,Math.min(255,Math.round(t)||0)))<16?"0":"")+t.toString(16)}function In(t,n,e,o){return o<=0?t=n=e=NaN:e<=0||e>=1?t=n=NaN:n<=0&&(t=NaN),new En(t,n,e,o)}function Bn(t){if(t instanceof En)return new En(t.h,t.s,t.l,t.opacity);if(t instanceof sn||(t=An(t)),!t)return new En;if(t instanceof En)return t;var n=(t=t.rgb()).r/255,e=t.g/255,o=t.b/255,r=Math.min(n,e,o),i=Math.max(n,e,o),a=NaN,s=i-r,c=(i+r)/2;return s?(a=n===i?(e-o)/s+6*(e0&&c<1?0:a,new En(a,s,c,t.opacity)}function En(t,n,e,o){this.h=+t,this.s=+n,this.l=+e,this.opacity=+o}function Dn(t,n,e){return 255*(t<60?n+(e-n)*t/60:t<180?e:t<240?n+(e-n)*(240-t)/60:n)}function Fn(t,n,e,o,r){var i=t*t,a=i*t;return((1-3*t+3*i-a)*n+(4-6*i+3*a)*e+(1+3*t+3*i-3*a)*o+a*r)/6}rn(sn,An,{copy:function(t){return Object.assign(new this.constructor,this,t)},displayable:function(){return this.rgb().displayable()},hex:xn,formatHex:xn,formatHsl:function(){return Bn(this).formatHsl()},formatRgb:_n,toString:_n}),rn(Tn,Ln,an(sn,{brighter:function(t){return t=null==t?ln:Math.pow(ln,t),new Tn(this.r*t,this.g*t,this.b*t,this.opacity)},darker:function(t){return t=null==t?cn:Math.pow(cn,t),new Tn(this.r*t,this.g*t,this.b*t,this.opacity)},rgb:function(){return this},displayable:function(){return-.5<=this.r&&this.r<255.5&&-.5<=this.g&&this.g<255.5&&-.5<=this.b&&this.b<255.5&&0<=this.opacity&&this.opacity<=1},hex:Mn,formatHex:Mn,formatRgb:Pn,toString:Pn})),rn(En,(function(t,n,e,o){return 1===arguments.length?Bn(t):new En(t,n,e,null==o?1:o)}),an(sn,{brighter:function(t){return t=null==t?ln:Math.pow(ln,t),new En(this.h,this.s,this.l*t,this.opacity)},darker:function(t){return t=null==t?cn:Math.pow(cn,t),new En(this.h,this.s,this.l*t,this.opacity)},rgb:function(){var t=this.h%360+360*(this.h<0),n=isNaN(t)||isNaN(this.s)?0:this.s,e=this.l,o=e+(e<.5?e:1-e)*n,r=2*e-o;return new Tn(Dn(t>=240?t-240:t+120,r,o),Dn(t,r,o),Dn(t<120?t+240:t-120,r,o),this.opacity)},displayable:function(){return(0<=this.s&&this.s<=1||isNaN(this.s))&&0<=this.l&&this.l<=1&&0<=this.opacity&&this.opacity<=1},formatHsl:function(){var t=this.opacity;return(1===(t=isNaN(t)?1:Math.max(0,Math.min(1,t)))?"hsl(":"hsla(")+(this.h||0)+", "+100*(this.s||0)+"%, "+100*(this.l||0)+"%"+(1===t?")":", "+t+")")}}));const Rn=t=>()=>t;function On(t,n){var e=n-t;return e?function(t,n){return function(e){return t+e*n}}(t,e):Rn(isNaN(t)?n:t)}const Gn=function t(n){var e=function(t){return 1==(t=+t)?On:function(n,e){return e-n?function(t,n,e){return t=Math.pow(t,e),n=Math.pow(n,e)-t,e=1/e,function(o){return Math.pow(t+o*n,e)}}(n,e,t):Rn(isNaN(n)?e:n)}}(n);function o(t,n){var o=e((t=Ln(t)).r,(n=Ln(n)).r),r=e(t.g,n.g),i=e(t.b,n.b),a=On(t.opacity,n.opacity);return function(n){return t.r=o(n),t.g=r(n),t.b=i(n),t.opacity=a(n),t+""}}return o.gamma=t,o}(1);function jn(t){return function(n){var e,o,r=n.length,i=new Array(r),a=new Array(r),s=new Array(r);for(e=0;e=1?(e=1,n-1):Math.floor(e*n),r=t[o],i=t[o+1],a=o>0?t[o-1]:2*r-i,s=oi&&(r=n.slice(i,r),s[a]?s[a]+=r:s[++a]=r),(e=e[0])===(o=o[0])?s[a]?s[a]+=o:s[++a]=o:(s[++a]=null,c.push({i:a,x:Hn(e,o)})),i=Yn.lastIndex;return i=0&&n._call.call(null,t),n=n._next;--Zn}()}finally{Zn=0,function(){for(var t,n,e=Jn,o=1/0;e;)e._call?(o>e._time&&(o=e._time),t=e,e=e._next):(n=e._next,e._next=null,e=t?t._next=n:Jn=n);Kn=t,de(o)}(),oe=0}}function fe(){var t=ie.now(),n=t-ee;n>1e3&&(re-=n,ee=t)}function de(t){Zn||(te&&(te=clearTimeout(te)),t-oe>24?(t<1/0&&(te=setTimeout(he,t-ie.now()-re)),ne&&(ne=clearInterval(ne))):(ne||(ee=ie.now(),ne=setInterval(fe,1e3)),Zn=1,ae(he)))}function me(t,n,e){var o=new le;return n=null==n?0:+n,o.restart((e=>{o.stop(),t(e+n)}),n,e),o}le.prototype=ue.prototype={constructor:le,restart:function(t,n,e){if("function"!=typeof t)throw new TypeError("callback is not a function");e=(null==e?se():+e)+(null==n?0:+n),this._next||Kn===this||(Kn?Kn._next=this:Jn=this,Kn=this),this._call=t,this._time=e,de()},stop:function(){this._call&&(this._call=null,this._time=1/0,de())}};var ge=tn("start","end","cancel","interrupt"),pe=[];function ye(t,n,e,o,r,i){var a=t.__transition;if(a){if(e in a)return}else t.__transition={};!function(t,n,e){var o,r=t.__transition;function i(c){var l,u,h,f;if(1!==e.state)return s();for(l in r)if((f=r[l]).name===e.name){if(3===f.state)return me(i);4===f.state?(f.state=6,f.timer.stop(),f.on.call("interrupt",t,t.__data__,f.index,f.group),delete r[l]):+l0)throw new Error("too late; already scheduled");return e}function be(t,n){var e=we(t,n);if(e.state>3)throw new Error("too late; already running");return e}function we(t,n){var e=t.__transition;if(!e||!(e=e[n]))throw new Error("transition not found");return e}function xe(t,n){var e,o,r,i=t.__transition,a=!0;if(i){for(r in n=null==n?null:n+"",i)(e=i[r]).name===n?(o=e.state>2&&e.state<5,e.state=6,e.timer.stop(),e.on.call(o?"interrupt":"cancel",t,t.__data__,e.index,e.group),delete i[r]):a=!1;a&&delete t.__transition}}var _e,Ae=180/Math.PI,Ce={translateX:0,translateY:0,rotate:0,skewX:0,scaleX:1,scaleY:1};function ke(t,n,e,o,r,i){var a,s,c;return(a=Math.sqrt(t*t+n*n))&&(t/=a,n/=a),(c=t*e+n*o)&&(e-=t*c,o-=n*c),(s=Math.sqrt(e*e+o*o))&&(e/=s,o/=s,c/=s),t*o180?n+=360:n-t>180&&(t+=360),i.push({i:e.push(r(e)+"rotate(",null,o)-2,x:Hn(t,n)})):n&&e.push(r(e)+"rotate("+n+o)}(i.rotate,a.rotate,s,c),function(t,n,e,i){t!==n?i.push({i:e.push(r(e)+"skewX(",null,o)-2,x:Hn(t,n)}):n&&e.push(r(e)+"skewX("+n+o)}(i.skewX,a.skewX,s,c),function(t,n,e,o,i,a){if(t!==e||n!==o){var s=i.push(r(i)+"scale(",null,",",null,")");a.push({i:s-4,x:Hn(t,e)},{i:s-2,x:Hn(n,o)})}else 1===e&&1===o||i.push(r(i)+"scale("+e+","+o+")")}(i.scaleX,i.scaleY,a.scaleX,a.scaleY,s,c),i=a=null,function(t){for(var n,e=-1,o=c.length;++e=0&&(t=t.slice(0,n)),!t||"start"===t}))}(n)?ve:be;return function(){var a=i(this,t),s=a.on;s!==o&&(r=(o=s).copy()).on(n,e),a.on=r}}var Ve=bt.prototype.constructor;function Qe(t){return function(){this.style.removeProperty(t)}}function Je(t,n,e){return function(o){this.style.setProperty(t,n.call(this,o),e)}}function Ke(t,n,e){var o,r;function i(){var i=n.apply(this,arguments);return i!==r&&(o=(r=i)&&Je(t,i,e)),o}return i._value=n,i}function Ze(t){return function(n){this.textContent=t.call(this,n)}}function to(t){var n,e;function o(){var o=t.apply(this,arguments);return o!==e&&(n=(e=o)&&Ze(o)),n}return o._value=t,o}var no=0;function eo(t,n,e,o){this._groups=t,this._parents=n,this._name=e,this._id=o}function oo(){return++no}var ro=bt.prototype;eo.prototype=function(t){return bt().transition(t)}.prototype={constructor:eo,select:function(t){var n=this._name,e=this._id;"function"!=typeof t&&(t=s(t));for(var o=this._groups,r=o.length,i=new Array(r),a=0;a()=>t;function co(t,{sourceEvent:n,target:e,selection:o,mode:r,dispatch:i}){Object.defineProperties(this,{type:{value:t,enumerable:!0,configurable:!0},sourceEvent:{value:n,enumerable:!0,configurable:!0},target:{value:e,enumerable:!0,configurable:!0},selection:{value:o,enumerable:!0,configurable:!0},mode:{value:r,enumerable:!0,configurable:!0},_:{value:i}})}function lo(t){t.stopImmediatePropagation()}function uo(t){t.preventDefault(),t.stopImmediatePropagation()}var ho={name:"drag"},fo={name:"space"},mo={name:"handle"},go={name:"center"};const{abs:po,max:yo,min:vo}=Math;function bo(t){return[+t[0],+t[1]]}function wo(t){return[bo(t[0]),bo(t[1])]}var xo={name:"x",handles:["w","e"].map(Mo),input:function(t,n){return null==t?null:[[+t[0],n[0][1]],[+t[1],n[1][1]]]},output:function(t){return t&&[t[0][0],t[1][0]]}},_o={name:"y",handles:["n","s"].map(Mo),input:function(t,n){return null==t?null:[[n[0][0],+t[0]],[n[1][0],+t[1]]]},output:function(t){return t&&[t[0][1],t[1][1]]}},Ao={name:"xy",handles:["n","w","e","s","nw","ne","sw","se"].map(Mo),input:function(t){return null==t?null:wo(t)},output:function(t){return t}},Co={overlay:"crosshair",selection:"move",n:"ns-resize",e:"ew-resize",s:"ns-resize",w:"ew-resize",nw:"nwse-resize",ne:"nesw-resize",se:"nwse-resize",sw:"nesw-resize"},ko={e:"w",w:"e",nw:"ne",ne:"nw",se:"sw",sw:"se"},So={n:"s",s:"n",nw:"sw",ne:"se",se:"ne",sw:"nw"},Lo={overlay:1,selection:1,n:null,e:1,s:null,w:-1,nw:-1,ne:1,se:1,sw:-1},To={overlay:1,selection:1,n:-1,e:null,s:1,w:null,nw:-1,ne:-1,se:1,sw:1};function Mo(t){return{type:t}}function Po(t){return!t.ctrlKey&&!t.button}function No(){var t=this.ownerSVGElement||this;return t.hasAttribute("viewBox")?[[(t=t.viewBox.baseVal).x,t.y],[t.x+t.width,t.y+t.height]]:[[0,0],[t.width.baseVal.value,t.height.baseVal.value]]}function Io(){return navigator.maxTouchPoints||"ontouchstart"in this}function Bo(t){for(;!t.__brush;)if(!(t=t.parentNode))return;return t.__brush}function Eo(t){return t[0][0]===t[1][0]||t[0][1]===t[1][1]}function Do(t){var n=t.__brush;return n?n.dim.output(n.selection):null}function Fo(){return Go(xo)}function Ro(){return Go(_o)}function Oo(){return Go(Ao)}function Go(t){var n,e=No,o=Po,r=Io,i=!0,a=tn("start","brush","end"),s=6;function c(n){var e=n.property("__brush",g).selectAll(".overlay").data([Mo("overlay")]);e.enter().append("rect").attr("class","overlay").attr("pointer-events","all").attr("cursor",Co.overlay).merge(e).each((function(){var t=Bo(this).extent;wt(this).attr("x",t[0][0]).attr("y",t[0][1]).attr("width",t[1][0]-t[0][0]).attr("height",t[1][1]-t[0][1])})),n.selectAll(".selection").data([Mo("selection")]).enter().append("rect").attr("class","selection").attr("cursor",Co.selection).attr("fill","#777").attr("fill-opacity",.3).attr("stroke","#fff").attr("shape-rendering","crispEdges");var o=n.selectAll(".handle").data(t.handles,(function(t){return t.type}));o.exit().remove(),o.enter().append("rect").attr("class",(function(t){return"handle handle--"+t.type})).attr("cursor",(function(t){return Co[t.type]})),n.each(l).attr("fill","none").attr("pointer-events","all").on("mousedown.brush",f).filter(r).on("touchstart.brush",f).on("touchmove.brush",d).on("touchend.brush touchcancel.brush",m).style("touch-action","none").style("-webkit-tap-highlight-color","rgba(0,0,0,0)")}function l(){var t=wt(this),n=Bo(this).selection;n?(t.selectAll(".selection").style("display",null).attr("x",n[0][0]).attr("y",n[0][1]).attr("width",n[1][0]-n[0][0]).attr("height",n[1][1]-n[0][1]),t.selectAll(".handle").style("display",null).attr("x",(function(t){return"e"===t.type[t.type.length-1]?n[1][0]-s/2:n[0][0]-s/2})).attr("y",(function(t){return"s"===t.type[0]?n[1][1]-s/2:n[0][1]-s/2})).attr("width",(function(t){return"n"===t.type||"s"===t.type?n[1][0]-n[0][0]+s:s})).attr("height",(function(t){return"e"===t.type||"w"===t.type?n[1][1]-n[0][1]+s:s}))):t.selectAll(".selection,.handle").style("display","none").attr("x",null).attr("y",null).attr("width",null).attr("height",null)}function u(t,n,e){var o=t.__brush.emitter;return!o||e&&o.clean?new h(t,n,e):o}function h(t,n,e){this.that=t,this.args=n,this.state=t.__brush,this.active=0,this.clean=e}function f(e){if((!n||e.touches)&&o.apply(this,arguments)){var r,a,s,c,h,f,d,m,g,p,y,v=this,b=e.target.__data__.type,w="selection"===(i&&e.metaKey?b="overlay":b)?ho:i&&e.altKey?go:mo,x=t===_o?null:Lo[b],_=t===xo?null:To[b],A=Bo(v),C=A.extent,k=A.selection,S=C[0][0],L=C[0][1],T=C[1][0],M=C[1][1],P=0,N=0,I=x&&_&&i&&e.shiftKey,B=Array.from(e.touches||[e],(t=>{const n=t.identifier;return(t=Qn(t,v)).point0=t.slice(),t.identifier=n,t}));if("overlay"===b){k&&(g=!0);const n=[B[0],B[1]||B[0]];A.selection=k=[[r=t===_o?S:vo(n[0][0],n[1][0]),s=t===xo?L:vo(n[0][1],n[1][1])],[h=t===_o?T:yo(n[0][0],n[1][0]),d=t===xo?M:yo(n[0][1],n[1][1])]],B.length>1&&G()}else r=k[0][0],s=k[0][1],h=k[1][0],d=k[1][1];a=r,c=s,f=h,m=d;var E=wt(v).attr("pointer-events","none"),D=E.selectAll(".overlay").attr("cursor",Co[b]);xe(v);var F=u(v,arguments,!0).beforestart();if(e.touches)F.moved=O,F.ended=j;else{var R=wt(e.view).on("mousemove.brush",O,!0).on("mouseup.brush",j,!0);i&&R.on("keydown.brush",z,!0).on("keyup.brush",W,!0),en(e.view)}l.call(v),F.start(e,w.name)}function O(t){for(const n of t.changedTouches||[t])for(const t of B)t.identifier===n.identifier&&(t.cur=Qn(n,v));if(I&&!p&&!y&&1===B.length){const t=B[0];po(t.cur[0]-t[0])>po(t.cur[1]-t[1])?y=!0:p=!0}for(const t of B)t.cur&&(t[0]=t.cur[0],t[1]=t.cur[1]);g=!0,uo(t),G(t)}function G(t){const n=B[0],e=n.point0;var o;switch(P=n[0]-e[0],N=n[1]-e[1],w){case fo:case ho:x&&(P=yo(S-r,vo(T-h,P)),a=r+P,f=h+P),_&&(N=yo(L-s,vo(M-d,N)),c=s+N,m=d+N);break;case mo:B[1]?(x&&(a=yo(S,vo(T,B[0][0])),f=yo(S,vo(T,B[1][0])),x=1),_&&(c=yo(L,vo(M,B[0][1])),m=yo(L,vo(M,B[1][1])),_=1)):(x<0?(P=yo(S-r,vo(T-r,P)),a=r+P,f=h):x>0&&(P=yo(S-h,vo(T-h,P)),a=r,f=h+P),_<0?(N=yo(L-s,vo(M-s,N)),c=s+N,m=d):_>0&&(N=yo(L-d,vo(M-d,N)),c=s,m=d+N));break;case go:x&&(a=yo(S,vo(T,r-P*x)),f=yo(S,vo(T,h+P*x))),_&&(c=yo(L,vo(M,s-N*_)),m=yo(L,vo(M,d+N*_)))}f0&&(r=a-P),_<0?d=m-N:_>0&&(s=c-N),w=fo,D.attr("cursor",Co.selection),G());break;default:return}uo(t)}function W(t){switch(t.keyCode){case 16:I&&(p=y=I=!1,G());break;case 18:w===go&&(x<0?h=f:x>0&&(r=a),_<0?d=m:_>0&&(s=c),w=mo,G());break;case 32:w===fo&&(t.altKey?(x&&(h=f-P*x,r=a+P*x),_&&(d=m-N*_,s=c+N*_),w=go):(x<0?h=f:x>0&&(r=a),_<0?d=m:_>0&&(s=c),w=mo),D.attr("cursor",Co[b]),G());break;default:return}uo(t)}}function d(t){u(this,arguments).moved(t)}function m(t){u(this,arguments).ended(t)}function g(){var n=this.__brush||{selection:null};return n.extent=wo(e.apply(this,arguments)),n.dim=t,n}return c.move=function(n,e){n.tween?n.on("start.brush",(function(t){u(this,arguments).beforestart().start(t)})).on("interrupt.brush end.brush",(function(t){u(this,arguments).end(t)})).tween("brush",(function(){var n=this,o=n.__brush,r=u(n,arguments),i=o.selection,a=t.input("function"==typeof e?e.apply(this,arguments):e,o.extent),s=Vn(i,a);function c(t){o.selection=1===t&&null===a?null:s(t),l.call(n),r.brush()}return null!==i&&null!==a?c:c(1)})):n.each((function(){var n=this,o=arguments,r=n.__brush,i=t.input("function"==typeof e?e.apply(n,o):e,r.extent),a=u(n,o).beforestart();xe(n),r.selection=null===i?null:i,l.call(n),a.start().brush().end()}))},c.clear=function(t){c.move(t,null)},h.prototype={beforestart:function(){return 1==++this.active&&(this.state.emitter=this,this.starting=!0),this},start:function(t,n){return this.starting?(this.starting=!1,this.emit("start",t,n)):this.emit("brush",t),this},brush:function(t,n){return this.emit("brush",t,n),this},end:function(t,n){return 0==--this.active&&(delete this.state.emitter,this.emit("end",t,n)),this},emit:function(n,e,o){var r=wt(this.that).datum();a.call(n,this.that,new co(n,{sourceEvent:e,target:c,selection:t.output(this.state.selection),mode:o,dispatch:a}),r)}},c.extent=function(t){return arguments.length?(e="function"==typeof t?t:so(wo(t)),c):e},c.filter=function(t){return arguments.length?(o="function"==typeof t?t:so(!!t),c):o},c.touchable=function(t){return arguments.length?(r="function"==typeof t?t:so(!!t),c):r},c.handleSize=function(t){return arguments.length?(s=+t,c):s},c.keyModifiers=function(t){return arguments.length?(i=!!t,c):i},c.on=function(){var t=a.on.apply(a,arguments);return t===a?c:t},c}function jo(t,n){if((e=(t=n?t.toExponential(n-1):t.toExponential()).indexOf("e"))<0)return null;var e,o=t.slice(0,e);return[o.length>1?o[0]+o.slice(2):o,+t.slice(e+1)]}function zo(t){return(t=jo(Math.abs(t)))?t[1]:NaN}var Wo,Ho=/^(?:(.)?([<>=^]))?([+\-( ])?([$#])?(0)?(\d+)?(,)?(\.\d+)?(~)?([a-z%])?$/i;function qo(t){if(!(n=Ho.exec(t)))throw new Error("invalid format: "+t);var n;return new $o({fill:n[1],align:n[2],sign:n[3],symbol:n[4],zero:n[5],width:n[6],comma:n[7],precision:n[8]&&n[8].slice(1),trim:n[9],type:n[10]})}function $o(t){this.fill=void 0===t.fill?" ":t.fill+"",this.align=void 0===t.align?">":t.align+"",this.sign=void 0===t.sign?"-":t.sign+"",this.symbol=void 0===t.symbol?"":t.symbol+"",this.zero=!!t.zero,this.width=void 0===t.width?void 0:+t.width,this.comma=!!t.comma,this.precision=void 0===t.precision?void 0:+t.precision,this.trim=!!t.trim,this.type=void 0===t.type?"":t.type+""}function Yo(t,n){var e=jo(t,n);if(!e)return t+"";var o=e[0],r=e[1];return r<0?"0."+new Array(-r).join("0")+o:o.length>r+1?o.slice(0,r+1)+"."+o.slice(r+1):o+new Array(r-o.length+2).join("0")}qo.prototype=$o.prototype,$o.prototype.toString=function(){return this.fill+this.align+this.sign+this.symbol+(this.zero?"0":"")+(void 0===this.width?"":Math.max(1,0|this.width))+(this.comma?",":"")+(void 0===this.precision?"":"."+Math.max(0,0|this.precision))+(this.trim?"~":"")+this.type};const Uo={"%":(t,n)=>(100*t).toFixed(n),b:t=>Math.round(t).toString(2),c:t=>t+"",d:function(t){return Math.abs(t=Math.round(t))>=1e21?t.toLocaleString("en").replace(/,/g,""):t.toString(10)},e:(t,n)=>t.toExponential(n),f:(t,n)=>t.toFixed(n),g:(t,n)=>t.toPrecision(n),o:t=>Math.round(t).toString(8),p:(t,n)=>Yo(100*t,n),r:Yo,s:function(t,n){var e=jo(t,n);if(!e)return t+"";var o=e[0],r=e[1],i=r-(Wo=3*Math.max(-8,Math.min(8,Math.floor(r/3))))+1,a=o.length;return i===a?o:i>a?o+new Array(i-a+1).join("0"):i>0?o.slice(0,i)+"."+o.slice(i):"0."+new Array(1-i).join("0")+jo(t,Math.max(0,n+i-1))[0]},X:t=>Math.round(t).toString(16).toUpperCase(),x:t=>Math.round(t).toString(16)};function Xo(t){return t}var Vo,Qo,Jo,Ko=Array.prototype.map,Zo=["y","z","a","f","p","n","µ","m","","k","M","G","T","P","E","Z","Y"];function tr(t){var n,e,o=void 0===t.grouping||void 0===t.thousands?Xo:(n=Ko.call(t.grouping,Number),e=t.thousands+"",function(t,o){for(var r=t.length,i=[],a=0,s=n[0],c=0;r>0&&s>0&&(c+s+1>o&&(s=Math.max(1,o-c)),i.push(t.substring(r-=s,r+s)),!((c+=s+1)>o));)s=n[a=(a+1)%n.length];return i.reverse().join(e)}),r=void 0===t.currency?"":t.currency[0]+"",i=void 0===t.currency?"":t.currency[1]+"",a=void 0===t.decimal?".":t.decimal+"",s=void 0===t.numerals?Xo:function(t){return function(n){return n.replace(/[0-9]/g,(function(n){return t[+n]}))}}(Ko.call(t.numerals,String)),c=void 0===t.percent?"%":t.percent+"",l=void 0===t.minus?"−":t.minus+"",u=void 0===t.nan?"NaN":t.nan+"";function h(t){var n=(t=qo(t)).fill,e=t.align,h=t.sign,f=t.symbol,d=t.zero,m=t.width,g=t.comma,p=t.precision,y=t.trim,v=t.type;"n"===v?(g=!0,v="g"):Uo[v]||(void 0===p&&(p=12),y=!0,v="g"),(d||"0"===n&&"="===e)&&(d=!0,n="0",e="=");var b="$"===f?r:"#"===f&&/[boxX]/.test(v)?"0"+v.toLowerCase():"",w="$"===f?i:/[%p]/.test(v)?c:"",x=Uo[v],_=/[defgprs%]/.test(v);function A(t){var r,i,c,f=b,A=w;if("c"===v)A=x(t)+A,t="";else{var C=(t=+t)<0||1/t<0;if(t=isNaN(t)?u:x(Math.abs(t),p),y&&(t=function(t){t:for(var n,e=t.length,o=1,r=-1;o0&&(r=0)}return r>0?t.slice(0,r)+t.slice(n+1):t}(t)),C&&0==+t&&"+"!==h&&(C=!1),f=(C?"("===h?h:l:"-"===h||"("===h?"":h)+f,A=("s"===v?Zo[8+Wo/3]:"")+A+(C&&"("===h?")":""),_)for(r=-1,i=t.length;++r(c=t.charCodeAt(r))||c>57){A=(46===c?a+t.slice(r+1):t.slice(r))+A,t=t.slice(0,r);break}}g&&!d&&(t=o(t,1/0));var k=f.length+t.length+A.length,S=k>1)+f+t+A+S.slice(k);break;default:t=S+f+t+A}return s(t)}return p=void 0===p?6:/[gprs]/.test(v)?Math.max(1,Math.min(21,p)):Math.max(0,Math.min(20,p)),A.toString=function(){return t+""},A}return{format:h,formatPrefix:function(t,n){var e=h(((t=qo(t)).type="f",t)),o=3*Math.max(-8,Math.min(8,Math.floor(zo(n)/3))),r=Math.pow(10,-o),i=Zo[8+o/3];return function(t){return e(r*t)+i}}}}function nr(t){return Vo=tr(t),Qo=Vo.format,Jo=Vo.formatPrefix,Vo}function er(t){return Math.max(0,-zo(Math.abs(t)))}function or(t,n){return Math.max(0,3*Math.max(-8,Math.min(8,Math.floor(zo(n)/3)))-zo(Math.abs(t)))}function rr(t,n){return t=Math.abs(t),n=Math.abs(n)-t,Math.max(0,zo(n)-zo(t))+1}nr({thousands:",",grouping:[3],currency:["$",""]});var ir=Math.sqrt(50),ar=Math.sqrt(10),sr=Math.sqrt(2);function cr(t,n,e){var o=(n-t)/Math.max(0,e),r=Math.floor(Math.log(o)/Math.LN10),i=o/Math.pow(10,r);return r>=0?(i>=ir?10:i>=ar?5:i>=sr?2:1)*Math.pow(10,r):-Math.pow(10,-r)/(i>=ir?10:i>=ar?5:i>=sr?2:1)}function lr(t,n){return tn?1:t>=n?0:NaN}function ur(t){let n=t,e=t;function o(t,n,o,r){for(null==o&&(o=0),null==r&&(r=t.length);o>>1;e(t[i],n)<0?o=i+1:r=i}return o}return 1===t.length&&(n=(n,e)=>t(n)-e,e=function(t){return(n,e)=>lr(t(n),e)}(t)),{left:o,center:function(t,e,r,i){null==r&&(r=0),null==i&&(i=t.length);const a=o(t,e,r,i-1);return a>r&&n(t[a-1],e)>-n(t[a],e)?a-1:a},right:function(t,n,o,r){for(null==o&&(o=0),null==r&&(r=t.length);o>>1;e(t[i],n)>0?r=i:o=i+1}return o}}}const hr=ur(lr),fr=hr.right,dr=(hr.left,ur((function(t){return null===t?NaN:+t})).center,fr);function mr(t,n){return t=+t,n=+n,function(e){return Math.round(t*(1-e)+n*e)}}function gr(t){return+t}var pr=[0,1];function yr(t){return t}function vr(t,n){return(n-=t=+t)?function(e){return(e-t)/n}:function(t){return function(){return t}}(isNaN(n)?NaN:.5)}function br(t,n,e){var o=t[0],r=t[1],i=n[0],a=n[1];return rn&&(e=t,t=n,n=e),l=function(e){return Math.max(t,Math.min(n,e))}),o=c>2?wr:br,r=i=null,h}function h(n){return isNaN(n=+n)?e:(r||(r=o(a.map(t),s,c)))(t(l(n)))}return h.invert=function(e){return l(n((i||(i=o(s,a.map(t),Hn)))(e)))},h.domain=function(t){return arguments.length?(a=Array.from(t,gr),u()):a.slice()},h.range=function(t){return arguments.length?(s=Array.from(t),u()):s.slice()},h.rangeRound=function(t){return s=Array.from(t),c=mr,u()},h.clamp=function(t){return arguments.length?(l=!!t||yr,u()):l!==yr},h.interpolate=function(t){return arguments.length?(c=t,u()):c},h.unknown=function(t){return arguments.length?(e=t,h):e},function(e,o){return t=e,n=o,u()}}()(yr,yr)}function Ar(t,n){switch(arguments.length){case 0:break;case 1:this.range(t);break;default:this.range(n).domain(t)}return this}function Cr(t){var n=t.domain;return t.ticks=function(t){var e=n();return function(t,n,e){var o,r,i,a,s=-1;if(e=+e,(t=+t)==(n=+n)&&e>0)return[t];if((o=n0)for(t=Math.ceil(t/a),n=Math.floor(n/a),i=new Array(r=Math.ceil(n-t+1));++s=ir?r*=10:i>=ar?r*=5:i>=sr&&(r*=2),n0;){if((r=cr(c,l,e))===o)return i[a]=c,i[s]=l,n(i);if(r>0)c=Math.floor(c/r)*r,l=Math.ceil(l/r)*r;else{if(!(r<0))break;c=Math.ceil(c*r)/r,l=Math.floor(l*r)/r}o=r}return t},t}var kr,Sr={9606:{commonName:"Human",scientificName:"Homo sapiens",assemblies:{default:"GCF_000001405.26",GRCh38:"GCF_000001405.26",GRCh37:"GCF_000001405.13",NCBI36:"GCF_000001405.12"},hasGeneCache:!0,hasParalogCache:!0,hasInteractionCache:!0},10090:{commonName:"Mouse",scientificName:"Mus musculus",assemblies:{default:"GCF_000001635.20",GRCm38:"GCF_000001635.20",MGSCv37:"GCF_000001635.18"},hasGeneCache:!0,hasParalogCache:!0,hasInteractionCache:!0},9598:{commonName:"Chimpanzee",scientificName:"Pan troglodytes",assemblies:{default:"GCF_000001515.7","Pan_tro 3.0":"GCF_000001515.7"},hasGeneCache:!0,hasParalogCache:!0},10116:{commonName:"Rat",scientificName:"Rattus norvegicus",assemblies:{default:"GCF_000001895.5","Rnor_6.0":"GCF_000001895.5"},hasGeneCache:!0,hasParalogCache:!0},3702:{commonName:"Thale cress",scientificName:"Arabidopsis thaliana",assemblies:{default:"GCF_000001735.3",TAIR10:"GCF_000001735.3"}},4530:{commonName:"Rice",scientificName:"Oryza sativa",assemblies:{default:"GCA_001433935.1","IRGSP-1.0":"GCA_001433935.1"}},4577:{commonName:"Maize",scientificName:"Zea mays",assemblies:{default:"GCA_000005005.5","IRGSP-1.0":"GCA_001433935.1"}},4641:{commonName:"Banana",scientificName:"Musa acuminata",assemblies:{default:"mock"}},7227:{commonName:"Fly",scientificName:"Drosophila melanogaster",assemblies:{default:"GCA_000001215.4","Release 6 plus ISO1 MT":"GCA_000001215.4"}},7165:{commonName:"Mosquito",scientificName:"Anopheles gambiae",assemblies:{default:"GCF_000005575.2"}},746128:{commonName:"Aspergillis fumigatus",scientificName:"Aspergillis fumigatus",assemblies:{default:"GCF_000002655.1"}},227321:{scientificName:"Aspergillus nidulans",assemblies:{default:"GCF_000149205.2"}},5061:{commonName:"black mold",scientificName:"Aspergillus niger",assemblies:{default:"GCF_003184595.1"}},5062:{commonName:"koji",scientificName:"Aspergillus oryzae",assemblies:{default:"GCF_000184455.2"}},15368:{commonName:"stiff brome",scientificName:"Brachypodium distachyon",assemblies:{default:"GCF_000005505.3"}},60711:{commonName:"green monkey",scientificName:"Chlorocebus sabaeus",assemblies:{default:"GCF_015252025.1"}},7719:{commonName:"Vase tunicate",scientificName:"Ciona intestinalis",assemblies:{default:"GCF_000224145.3"}},9685:{commonName:"Cat",scientificName:"Felis catus",assemblies:{default:"GCF_000181335.3"},hasGeneCache:!0},9031:{commonName:"Chicken",scientificName:"Gallus gallus",assemblies:{default:"GCF_000002315.6"},hasGeneCache:!0,hasParalogCache:!0},9593:{commonName:"Gorilla",scientificName:"Gorilla gorilla",assemblies:{default:"GCF_008122165.1"}},4513:{commonName:"Barley",scientificName:"Hordeum vulgare",assemblies:{default:"GCA_901482405.1"}},9541:{commonName:"Crab-eating macaque",scientificName:"Macaca fascicularis",assemblies:{default:"GCF_000364345.1"},hasGeneCache:!0,hasParalogCache:!0},9544:{commonName:"Rhesus macaque",scientificName:"Macaca mulatta",assemblies:{default:"GCF_003339765.1"},hasGeneCache:!0,hasParalogCache:!0},9597:{commonName:"Bonobo",scientificName:"Pan paniscus",assemblies:{default:"GCF_013052645.1"}},9615:{commonName:"Dog",scientificName:"Canis lupus familiaris",assemblies:{default:"GCF_014441545.1"},hasGeneCache:!0,hasParalogCache:!0},4932:{commonName:"Yeast",scientificName:"Saccharomyces cerevisiae",assemblies:{default:"GCA_000146045.2",R64:"GCA_000146045.2"}},5833:{commonName:"malaria parasite",scientificName:"Plasmodium falciparum",assemblies:{default:"GCA_000002765.3",GCA_000002765:"GCA_000002765.3"}},6239:{commonName:"worm",scientificName:"Caenorhabditis elegans",assemblies:{default:"GCF_000002985.6"},hasGeneCache:!0,hasParalogCache:!0},4081:{commonName:"tomato",scientificName:"Solanum lycopersicum",assemblies:{default:"GCF_000188115.4"}},4072:{commonName:"pepper",scientificName:"Capsicum annuum",assemblies:{default:"GCF_000710875.1"}}},Lr=Object.assign({},e,o,r,i);function Tr(){return"assembly"in this.config&&/(GCF_|GCA_)/.test(this.config.assembly)}function Mr(t){var n,e,o,r=document.scripts,i=Ideogram.version;if(!1===location.pathname.includes("/examples/vanilla/"))return`https://cdn.jsdelivr.net/npm/ideogram@${i}/dist/data/${t}`;for(var a=0;a{if(e.ok)return e;if(!1===n)return Pr(t.replace(".json",""),!0);throw Error("Fetch failed for "+t)}))}function Nr(){return Mr("bands/native/")}function Ir(t){return Math.round(100*t)/100}function Br(t){call(this.onDidRotateCallback,t)}function Er(){return Lr.select(this.selector).node()}function Dr(t,n){var e=this.config,o=new Headers;return e.accessToken&&(o=new Headers({Authorization:"Bearer "+e.accessToken})),"text"===n?Lr.text(t,{headers:o}):Lr.json(t,{headers:o})}function Fr(t){t=jr(t);for(const n in Sr){const e=Sr[n],o=jr(e.commonName),r=jr(e.scientificName);if(o===t||r===t)return n}return null}function Rr(t){var n,e,o,r,i=this.organisms;for(e in t=jr(t),i)if(o=jr((n=i[e]).commonName),r=jr(n.scientificName),o===t||r===t)return e;return null}function Or(t){return t in this.organisms?this.organisms[t].commonName:null}function Gr(t){return t in this.organisms?this.organisms[t].scientificName:null}function jr(t){return void 0===t?"":t.toLowerCase().replace(/ /g,"-")}function zr(t){return/^M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})$/i.test(t)}function Wr(t){var n={M:1e3,D:500,C:100,L:50,X:10,V:5,I:1};return t.toUpperCase().split("").reduce((function(t,e,o,r){return n[e]=n)&&(e=n);else{let o=-1;for(let r of t)null!=(r=n(r,++o,t))&&(e=r)&&(e=r)}return e},kr=[["gneg","#FFF","#FFF","#DDD"],["gpos25","#C8C8C8","#DDD","#BBB"],["gpos33","#BBB","#BBB","#AAA"],["gpos50","#999","#AAA","#888"],["gpos66","#888","#888","#666"],["gpos75","#777","#777","#444"],["gpos100","#444","#666","#000"],["acen","#FEE","#FEE","#FDD"],["noBands","#BBB","#BBB","#AAA"]];let Yr='#_ideogram {padding-left: 5px;} #_ideogram .labeled {padding-left: 15px;} #_ideogram.labeledLeft {padding-left: 15px; padding-top: 15px;} #_ideogram text {font: 9px Tahoma; fill: #000;} #_ideogram .italic {font-style: italic;} #_ideogram .chromosome {cursor: pointer; fill: #AAA;}#_ideogram.no-rotate .chromosome {cursor: default;} #_ideogram .chrLabel, #_ideogram .annot {cursor: pointer;}#_ideogram .chrSetLabel {font-weight: bolder;}#_ideogram .ghost {opacity: 0.2;}#_ideogram .hidden {display: none;}#_ideogram .bandLabelStalk line {stroke: #AAA; stroke-width: 1;}#_ideogram .syntenyBorder {stroke:#AAA;stroke-width:1;}#_ideogram rect.cursor { fill: #F00; stroke: #F00; fill-opacity: .3; shape-rendering: crispEdges;}#_ideogram .brush .selection { fill: #F00; stroke: #F00; fill-opacity: .3; shape-rendering: crispEdges;}#_ideogram .noBands {fill: #AAA;}#_ideogram .gneg {fill: #FFF}#_ideogram .gpos25 {fill: #BBB}#_ideogram .gpos33 {fill: #AAA}#_ideogram .gpos50 {fill: #888}#_ideogram .gpos66 {fill: #666}#_ideogram .gpos75 {fill: #444}#_ideogram .gpos100 {fill: #000}#_ideogram .gpos {fill: #000}#_ideogram .acen {fill: #FDD}#_ideogram .stalk {fill: #CCE;}#_ideogram .gvar {fill: #DDF}#_ideogram.faint .gneg {fill: #FFF}#_ideogram.faint .gpos25 {fill: #EEE}#_ideogram.faint .gpos33 {fill: #EEE}#_ideogram.faint .gpos50 {fill: #EEE}#_ideogram.faint .gpos66 {fill: #EEE}#_ideogram.faint .gpos75 {fill: #EEE}#_ideogram.faint .gpos100 {fill: #DDD}#_ideogram.faint .gpos {fill: #DDD}#_ideogram.faint .acen {fill: #FEE}#_ideogram.faint .stalk {fill: #EEF;}#_ideogram.faint .gvar {fill: #EEF}#_ideogram .gneg {fill: url("#gneg")} #_ideogram .gpos25 {fill: url("#gpos25")} #_ideogram .gpos33 {fill: url("#gpos33")} #_ideogram .gpos50 {fill: url("#gpos50")} #_ideogram .gpos66 {fill: url("#gpos66")} #_ideogram .gpos75 {fill: url("#gpos75")} #_ideogram .gpos100 {fill: url("#gpos100")} #_ideogram .gpos {fill: url("#gpos100")} #_ideogram .acen {fill: url("#acen")} #_ideogram .stalk {fill: url("#stalk")} #_ideogram .gvar {fill: url("#gvar")} #_ideogram .noBands {fill: url("#noBands")} #_ideogram .chromosome {fill: url("#noBands")} ';function Ur(t){var n;this.config=JSON.parse(JSON.stringify(t)),(n=this).chromosomesArray=[],n.coordinateSystem="iscn",n.maxLength={bp:0,iscn:0},n.chromosomes={},n.numChromosomes=0,n.config.debug||(n.config.debug=!1),n.config.dataDir||(n.config.dataDir=n.getDataDir()),n.config.container||(n.config.container="body"),n.selector=n.config.container+" #_ideogram",n.config.resolution||(n.config.resolution=""),n.config.orientation||(n.config.orientation="vertical"),n.config.brush||(n.config.brush=null),n.config.rows||(n.config.rows=1),"showChromosomeLabels"in n.config==0&&(n.config.showChromosomeLabels=!0),n.config.showNonNuclearChromosomes||(n.config.showNonNuclearChromosomes=!1),n.config.chromosomeScale||(n.config.chromosomeScale="absolute"),n.config.showTools||(n.config.showTools=!1),function(t){t.config.ploidy||(t.config.ploidy=1),t.config.ploidy>1&&(t.sexChromosomes={},t.config.sex||(t.config.sex="male"),2!==t.config.ploidy||t.config.ancestors||(t.config.ancestors={M:"#ffb6c1",P:"#add8e6"},t.config.ploidyDesc="MP"))}(this),function(t){t.config.showBandLabels||(t.config.showBandLabels=!1),"showFullyBanded"in t.config==0&&(t.config.showFullyBanded=!0),t.bandsToShow=[],t.bandData={}}(this),function(t){var n,e,o;t.config.chrHeight||(n=t.config.container,e=document.querySelector(n).getBoundingClientRect(),o="vertical"===t.config.orientation?e.height:e.width,"body"!==n&&0!==o||(o=400),t.config.chrHeight=o)}(this),function(t){var n,e;t.config.chrWidth||(n=10,(e=t.config.chrHeight)<900&&e>500?n=Math.round(e/40):e>=900&&(n=Math.round(e/45)),t.config.chrWidth=n)}(this),function(t){t.config.geometry&&"collinear"===t.config.geometry?"chrMargin"in t.config==0&&(t.config.chrMargin=0):(t.config.chrMargin||(1===t.config.ploidy?t.config.chrMargin=10:t.config.chrMargin=Math.round(t.config.chrWidth/4)),t.config.showBandLabels&&(t.config.chrMargin+=20))}(this),function(t,n){t.onLoad&&(n.onLoadCallback=t.onLoad),t.onLoadAnnots&&(n.onLoadAnnotsCallback=t.onLoadAnnots),t.onDrawAnnots&&(n.onDrawAnnotsCallback=t.onDrawAnnots),t.onBrushMove&&(n.onBrushMoveCallback=t.onBrushMove),t.onBrushEnd&&(n.onBrushEndCallback=t.onBrushEnd),t.onCursorMove&&(n.onCursorMoveCallback=t.onCursorMove),t.onDidRotate&&(n.onDidRotateCallback=t.onDidRotate),t.onWillShowAnnotTooltip&&(n.onWillShowAnnotTooltipCallback=t.onWillShowAnnotTooltip),t.onClickAnnot&&(n.onClickAnnotCallback=t.onClickAnnot)}(t,this),function(t,n){n.organisms=Object.assign({},Sr),t.taxid&&t.organismMetadata&&(n.organisms[t.taxid]=t.organismMetadata),n.organismsWithBands=Object.assign({},n.organisms)}(t,this),function(t){t.bump=Math.round(t.config.chrHeight/125),t.adjustedBump=!1,t.config.chrHeight<200&&(t.adjustedBump=!0,t.bump=4)}(this),function(t,n){t.chromosome&&(n.config.chromosomes=[t.chromosome],"showBandLabels"in t==0&&(n.config.showBandLabels=!0),"rotatable"in t==0&&(n.config.rotatable=!1))}(t,this),function(t){const n=t.config;n.chrLabelSize||(t.config.chrLabelSize=9),n.chrLabelColor||(t.config.chrLabelColor="#000"),n.fontFamily||(t.config.fontFamily="");const e=`font-size: ${n.chrLabelSize}px`,o=`fill: ${n.chrLabelColor}`,r=`font-family: ${n.fontFamily}`;Yr+=`#_ideogram text {${r}; ${e}; ${o};}`,Yr+=`#_ideogramLabel text {${r};}`}(this),this.initAnnotSettings(),this.config.geometry&&"parallel"!==this.config.geometry||(this.config.chrMargin+=this.config.chrWidth,"heatmap"===this.config.annotationsLayout?this.config.chrMargin+=this.config.annotTracksHeight:this.config.chrMargin+=2*this.config.annotTracksHeight),this.init()}const Xr=function(t){var n,e,o,r,i=t.config;if(t.config.annotLabelHeight=12,"demarcateCollinearChromosomes"in t.config==0&&(t.config.demarcateCollinearChromosomes=!0),e=function(t,n){var e,o,r,i,a,s,c,l={};for(e=[],o=0;o tspan");t.setAttribute("x",s),t.setAttribute("dy",f-8),i.querySelector(".chrLabel").setAttribute("text-anchor","start")}i.setAttribute("transform","rotate(90) translate("+a+","+c+")"),i.querySelector(".chromosome").setAttribute("transform","translate(-13, 10)")}!function(t){t.config.taxids.forEach(((n,e)=>{var o=t.organisms[n].scientificName;Lr.select(t.selector).append("text").attr("class","genomeLabel italic").attr("x",55+200*e).attr("y",10).text(o).attr("text-anchor","middle")}))}(o)}(n,e,-40,t),r=Math.round(e.slice(-1)[0]+70),i.multiorganism){o*=8;var a=0;e.forEach((t=>{t>a&&(a=t)})),o=a+30}else o=xOffsets.slice(-1)[0]+30;Lr.select(t.selector).attr("height",o).attr("width",r),Lr.select("#_ideogramTrackLabelContainer").remove(),Lr.select("#_ideogramInnerWrap").insert("div",":first-child").attr("id","_ideogramTrackLabelContainer").style("position","absolute")};const Vr=function(t){var n,e,o,r,i,a=t.config,s=a.annotationHeight||0;if("vertical"!==a.orientation){t.config.annotLabelHeight=12;var c=t.config.annotLabelHeight;if("demarcateCollinearChromosomes"in t.config==0&&(t.config.demarcateCollinearChromosomes=!0),n=document.querySelectorAll(".chromosome-set"),o=a.numAnnotTracks*(s+c+4)-a.chrWidth+1,e=function(t,n){var e,o,r,i,a,s,c,l={};for(e=[],o=0;o{var o=t.organisms[n],r=t.config,i=o.scientificName;Lr.select(t.selector).append("text").attr("class","genomeLabel italic").attr("x",5).attr("y",r.chrLabelSize+(200+3*r.chrWidth)*e).text(i)}))}(o)}(n,e,o,t),r=o+2*a.chrWidth+20,a.multiorganism){r*=8;var l=0;e.forEach((t=>{t>l&&(l=t)})),i=l+20}else i=e.slice(-1)[0]+20;Lr.select(t.selector).attr("width",i).attr("height",r),Lr.select("#_ideogramTrackLabelContainer").remove(),Lr.select("#_ideogramInnerWrap").insert("div",":first-child").attr("id","_ideogramTrackLabelContainer").style("position","absolute")}else Xr(t)};function Qr(t){void 0!==t.timeout&&window.clearTimeout(t.timeout),t.rawAnnots=t.setOriginalTrackIndexes(t.rawAnnots),t.config.annotationsDisplayedTracks?t.annots=t.updateDisplayedTracks(t.config.annotationsDisplayedTracks):(t.annots=t.processAnnotData(t.rawAnnots),t.config.filterable&&t.initCrossFilter(),t.drawProcessedAnnots(t.annots))}function Jr(t){var n=(new Date).getTime(),e=this,o=e.config,r=o.annotations;e.initDrawChromosomes(),o.annotationsPath&&function(t){t.rawAnnots?Qr(t):function n(){t.timeout=setTimeout((function(){!t.rawAnnots||t.rawAnnots&&void 0!==t.rawAnnots.then?n():Qr(t)}),50)}()}(e),function(t,n){var e,o,r,i;if(!0===t.showBandLabels&&(r=(new Date).getTime(),n.hideUnshownBandLabels(),i=(new Date).getTime(),t.debug&&console.log("Time in showing bands: "+(i-r)+" ms"),"vertical"===t.orientation))for(e=0;e0}return!0}}class Zr{constructor(t){this._node=t}getLabel(){return Lr.select(this._node.parentNode).select("text.chrLabel").text()}getSetLabel(){return Lr.select(this._node.parentNode).select("text.chrSetLabel").text()}}const ti=class{constructor(t,n){if(this._config=t,this._ideo=n,this._ploidy=this._ideo._ploidy,this._translate=void 0,"chrSetMargin"in t)this.chrSetMargin=t.chrSetMargin;else{var e=this._config.chrMargin;this.chrSetMargin=this._config.ploidy>1?e:0}this._tickSize=8,this._isRotated=!1}_getLeftMargin(){return this.margin.left}_getYScale(){return 20/this._config.chrWidth}getChromosomeLabels(t){var n=new Zr(t),e=[];return this._ideo.config.ploidy>1&&e.push(n.getSetLabel()),e.push(n.getLabel()),e.filter((function(t){return t.length>0}))}getChromosomeBandLabelTranslate(t){var n,e,o,r=this._ideo,i=this._tickSize,a=r.config.orientation;return"vertical"===a?o="rotate(-90)translate("+(n=i)+","+(e=r.round(2+t.px.start+t.px.width/2))+")":"horizontal"===a&&(o="translate("+(n=r.round(-i+t.px.start+t.px.width/2))+","+(e=-10)+")"),{x:n,y:e,translate:o}}didRotate(t,n){var e,o,r,i,a,s,c,l,u;o=(e=this._ideo).config.taxid,r=n.id.split("-")[0].replace("chr",""),i=(a=e.chromosomes[o][r]).bands,l=(c=Lr.select(n.parentNode)).attr("transform"),u=/scale\(.*\)/.exec(l),l=l.replace(u,""),c.attr("transform",l),s=a.width,(a=e.getChromosomeModel(i,r,o,t)).oldWidth=s,e.chromosomes[o][r]=a,e.drawChromosome(a),e.handleRotateOnClick(),e.rawAnnots&&(e.displayedTrackIndexes?e.updateDisplayedTracks(e.displayedTrackIndexes):(e.annots=e.processAnnotData(e.rawAnnots),e.drawProcessedAnnots(e.annots),e.config.filterable&&e.initCrossFilter())),!0===e.config.showBandLabels&&(e.drawBandLabels(e.chromosomes),e.hideUnshownBandLabels()),e.onDidRotateCallback&&e.onDidRotateCallback(a)}rotate(t,n,e){var o,r,i,a;o=this._ideo,a=o.selector+" .chrSetLabel, "+o.selector+" .chrLabel",i=document.querySelector(o.selector).getBoundingClientRect(),r=Lr.selectAll(o.selector+" g.chromosome").filter((function(){return this!==e})),this._isRotated?(this._isRotated=!1,o.config.chrHeight=o.config.chrHeightOriginal,o.config.chrWidth=o.config.chrWidthOriginal,o.config.annotationHeight=o.config.annotationHeightOriginal,this.rotateBack(t,n,e,(function(){r.style("display",null),Lr.selectAll(a).style("display",null),o._layout.didRotate(n,e)}))):(this._isRotated=!0,r.style("display","none"),Lr.selectAll(a).style("display","none"),this.rotateForward(t,n,e,(function(){var t,r,a;o.config.chrHeightOriginal=o.config.chrHeight,o.config.chrWidthOriginal=o.config.chrWidth,o.config.annotationHeightOriginal=o.config.annotationHeight,"VerticalLayout"===o._layout._class?(r=i.width-20,a=window.innerWidth-20):(r=i.height-10,a=window.innerHeight-10),t=a0?n:n+4+2*t);if(!this._translate){var a;this._translate=[this._ploidy.getSetSize(0)*i*2];for(var s=1;s1&&(t*=1.8),t}rotateForward(t,n,e,o){var r;Lr.select(e.parentNode).transition().attr("transform","rotate(90) translate(30, -37.5) ").on("end",o),r=this.getChromosomeLabels(e),Lr.select(this._ideo.getSvg()).append("g").attr("class","tmp").selectAll("text").data(r).enter().append("text").attr("class",(function(t,n){return 0===n&&2===r.length?"chrSetLabel":null})).attr("x",26).attr("y",(function(t,n){return 12*(n+1+r.length%2)})).style("text-anchor","middle").style("opacity",0).text(String).transition().style("opacity",1),this._ideo.config.orientation="vertical"}rotateBack(t,n,e,o){var r=this.getChromosomeSetTranslate(t);Lr.select(e.parentNode).transition().attr("transform",r).on("end",o),Lr.selectAll(this._ideo.selector+" g.tmp").style("opacity",0).remove(),this._ideo.config.orientation="horizontal"}getHeight(t){void 0===t&&(t=this._config.taxids[0]);var n=this._config.chromosomes[t].length,e=this.getChromosomeSetYTranslate(n-1);return(e+=this._getChromosomeSetSize(n-1))+2*this._getAdditionalOffset()}getWidth(){return this._config.chrHeight+1.5*this.margin.top}getChromosomeSetLabelAnchor(){return"end"}getChromosomeBandLabelAnchor(){return null}getChromosomeBandTickY1(){return 2}getChromosomeBandTickY2(){return 10}getChromosomeSetLabelTranslate(){return null}getChromosomeSetTranslate(t){return"translate("+this._getLeftMargin()+", "+this.getChromosomeSetYTranslate(t)+")"}getChromosomeSetYTranslate(t){if(!this._config.ploidyDesc)return this._config.chrMargin*(t+1);if(!this._translate){this._translate=[1];for(var n=1;nthis.chrsPerRow-1?(n=this.margin.left+1.3*this._config.chrHeight,e=this.getChromosomeSetYTranslate(t-this.chrsPerRow)):(n=this.margin.left,e=this.getChromosomeSetYTranslate(t)),"rotate(90) translate("+n+", -"+e+")"}getChromosomeSetYTranslate(t){var n=.3*this._getAdditionalOffset();return this.margin.left*t+this._config.chrWidth+2*n+n*t}getChromosomeSetLabelXPosition(t){return(this._ploidy.getSetSize(t)*this._config.chrWidth+20)/-2+(this._config.ploidy>1?0:this._config.chrWidth)}getChromosomeLabelXPosition(){return this._config.chrWidth/-2}};function ii(t){var n=this;n.config.annotationsPath&&n.fetchAnnots(n.config.annotationsPath),function(t){if("ploidyDesc"in t.config&&"string"==typeof t.config.ploidyDesc){for(var n=[],e=0;e1?new ri(n,t):"vertical"===n.orientation?new ni(n,t):"horizontal"===n.orientation?new ei(n,t):new ni(n,t)}(n),function(t){Lr.selectAll(t.config.container+" #_ideogramOuterWrap").remove(),Lr.select(t.config.container).append("div").attr("id","_ideogramOuterWrap").append("div").attr("id","_ideogramTrackLabelContainer").style("position","absolute"),Lr.select(t.config.container+" #_ideogramOuterWrap").append("div").attr("id","_ideogramMiddleWrap").style("position","relative").style("overflow-x","auto").style("transform","translateZ(0)").append("div").attr("id","_ideogramInnerWrap").append("svg").attr("id","_ideogram").attr("class",function(t){var n="";return t.config.showChromosomeLabels&&("horizontal"===t.config.orientation?n+="labeledLeft ":n+="labeled "),!1===t.config.rotatable&&(n+="no-rotate "),t.config.annotationsLayout&&"overlay"===t.config.annotationsLayout&&(n+="faint"),n}(t)).attr("width",t._layout.getWidth()).attr("height",t._layout.getHeight()).html(t.getBandColorGradients())}(n),n.isOnlyIdeogram=1===document.querySelectorAll("#_ideogram").length,function(t){Lr.select(t.config.container+" #_ideogramOuterWrap").append("div").attr("class","_ideogramTooltip").attr("id","_ideogramTooltip").style("opacity",0).style("position","fixed").style("text-align","center").style("padding","4px").style("font","12px sans-serif").style("background","white").style("border","1px solid black").style("border-radius","5px").style("z-index","1000")}(n),n.finishInit(t)}var ai="";function si(t,n,e){return e.config.dataDir+t[n]}function ci(t,n,e){var o=e.config.ploidy;return"sex"in e.config&&(2===o&&e.sexChromosomes.index+1===n||"female"===e.config.sex&&"Y"===t.name)}function li(t,n,e,o){var r,i,a,s,c;for(r=0;r=chrBands.length/2&&(n.coordinateSystem="bp")}function hi(){var t,n,e,o,r=this,i=r.config.taxids;for(n=0;n"MT"!==t)),void 0!==o&&(o=o.filter((t=>"MT"!==t[0].chr)))),ui(e,r),r.chromosomes[t]={},r.setSexChromosomes(e),li(o,e,t,r),r.config.showBandLabels&&r.drawBandLabels(r.chromosomes),r.handleRotateOnClick(),r._gotChrModels=!0}function fi(){var t=this;"rotatable"in t.config&&!1===t.config.rotatable?Lr.selectAll(t.selector).style("cursor","default"):Lr.selectAll(t.selector+" .chromosome-set").on("click",(function(){const n=this.children[1];t.rotateAndToggleDisplay(n)}))}function di(){call(this.onLoadCallback)}function mi(t,n,e){var o=e.organisms[t],r=[jr(o.scientificName)],i=o.assemblies,a=e.config.resolution;return n!==i.default&&r.push(n),"9606"===t&&(n in i==="false"&&Object.values(i).includes(config.assembly)||""!==a&&850!==a)&&r.push(a),r=r.join("-"),["9606","10090","10116"].includes(t)&&!e.config.showFullyBanded&&(r+="-no-bands"),r+".json"}function gi(t,n,e){var o,r,i,a=e.config;o=e.organisms[t],a.assembly||(e.config.assembly="default"),r=o.assemblies,i=mi(t,e.assemblyIsAccession()?a.assembly:r[a.assembly],e);var s="-1"===t;return(t in e.organismsWithBands||s)&&(n[t]=i),n}function pi(t,n,e,o){return function(t,n,e){var o=si(t,n,e);return(!(void 0!==window.chrBands&&""===ai)||ai!==o)&&function(t){return"assembly"in t.config&&!1===/(GCA_)/.test(t.config.assembly)}(e)&&n in t}(n,t,o)?function(t,n,e,o){var r=si(t,n,o);return o.numBandDataResponses||(o.numBandDataResponses=0),Pr(r).then((function(n){return n.json().then((function(e){ai=r,delete window.chrBands,window.chrBands=e.chrBands,function(t,n,e,o){var r,i,a;for(r in n)a=n[r],t.includes(a)&&""!==a&&(i=r);o.bandData[i]=e}(n.url,t,chrBands,o)}))}))}(n,t,0,o).then((function(){return o.processBandData(t)})):new Promise((function(n){o.processBandData(t),n([t,void 0])}))}var yi={},vi={},bi={};function wi(t){var n=(t=t||this).config.container;bi[n]?(vi[n]=!0,yi[n]=t):(bi[n]=!0,function(t){return new Promise((function(n){var e=t.config.organism;"number"==typeof e?t.getOrganismFromEutils(e,(function(){t.getTaxids(n)})):t.getTaxids(n)}))}(t).then((function(e){var o=e[0];t.config.taxid=o,t.config.taxids=e,t.organismScientificName=t.getScientificName(t.config.taxid),function(t,n,e){var o,r,i,a=[];for(i in o={},Sr)o[i]="";for(r=0;r=4&&(l=u[3],o[0]=l),u.length>=8&&(s=u[8].split(","),c=xi.rgbToHex(s[0],s[1],s[2]),o.push(c)),[r,o])}parseRawAnnots(t,n,e,o){var r,i,a,s,c,l;for(l=!0,!1===isNaN(parseInt(e[n],10))&&(l=!1),r=n;r=8&&c.push("color"),{keys:c,annots:t}}parseBed(t,n){var e,o,r,i,a=[],s=t.split(/\r\n|\n/);for(o=Object.keys(n.chromosomes[n.config.taxid]),e=0;e{n.includes(t)&&(e=o)})),e}parseAnnotFromTsvLine(t,n,e){var o,r,i,a,s,c,l,u,h=t.split(/\t/g);return[i,a,stop,length]=this.parseGenomicCoordinates(h),-1===(r=e.indexOf(i))?[null,null]:(o=[h[0],a,length,0],n.includes("color")&&(s=h[this.getValueColumnIndex("color",n)],o.push(s)),n.includes("full_name")&&(c=h[this.getValueColumnIndex("full_name",n)],o.push(c)),n.includes("citations")&&(u=h[this.getValueColumnIndex("citations",n)],o.push(u)),n.includes("significance")&&(l=h[this.getValueColumnIndex("significance",n)],o.push(l)),[r,o])}parseRawAnnots(t,n,e,o){var r,i,a,s,c;const l=e[0];for(r=n;r(t.annots=t.annots.map((t=>(t[n]=t[n]+" citations "+e.replace(/_/g," "),t))),t)))}return a}}var Ai=["name","start","length","trackIndex","trackIndexOriginal","color"],Ci={3:["00B","DDD","F00"],5:["00D","66D","DDD","F88","F00"],17:["00D","00D","00D","00D","00D","44D","44D","DDD","DDD","DDD","DDD","F88","F66","F22","F22","F00","F00","F00"]};function ki(t){var n,e,o;if(t.rawAnnots.metadata&&t.rawAnnots.metadata.trackLabels)n=t.rawAnnots.metadata.trackLabels;else if(t.config.heatmaps)for(n=[],e=t.config.heatmaps,o=0;o!Ai.includes(t)));return t.displayedTrackIndexes&&(n=n.filter((function(n,e){return t.displayedTrackIndexes.includes(e+1)}))),n}function Si(t){var n,e,o=t.rawAnnots;if(!o.metadata||o.metadata.heatmapThresholds||t.config.heatmapThresholds)return n=t.config.heatmapThresholds?t.config.heatmapThresholds:t.rawAnnots.metadata.heatmapThresholds,e=Ci[n.length+1],n=n.map(((t,n)=>[t,"#"+e[n]])),n.push(["+","#"+e.slice(-1)[0]]),n}function Li(t,n,e,o,r){return t===n&&"+"===r&&e>o||e===r||0!==t&&t!==n&&e<=r&&e>o||0===t&&e<=r}function Ti(t,n){var e,o,r,i,a,s,c,l;for(e=0;e0&&(r+=e.config.chrMargin*t.chrIndex-1),a=Lr.select(e.config.container+" #_ideogramInnerWrap").append("canvas").attr("id",s).attr("width",c+1).attr("height",i).style("position","absolute").style("left",r+"px").style("top",i*o+1+"px").nodes()[0].getContext("2d"),l.push([a,t]);return l}function Pi(t,n,e){var o,r,i,a,s=e.config.annotLabelHeight,c=e.config.annotationHeight,l=e.config.demarcateCollinearChromosomes,u=c+s+4;for(o=0;oa.width-1)continue;i.fillRect(r.startPx,1,.5,u)}else i.fillRect(r.startPx,s+1,.5,c);if(l)for(o=0;o"),Lr.select(n.config.container+" #_ideogramTrackLabel").interrupt().style("top","").style("left","").style("transform",null).style("transform","rotate(-90deg)").html(e),[o,r]=function(t,n,e){var o,r,i,a,s;return o=n.id.split("-").slice(0,-1).join("-")+"-0",r=Lr.select(e.config.container+" #"+o).nodes()[0].getBoundingClientRect(),i=Lr.select(e.config.container+" #_ideogramTrackLabel").nodes()[0].getBoundingClientRect(),a=Lr.select(e.config.container).nodes()[0].getBoundingClientRect(),s=Math.round(r.left+i.width)-r.width-1,[s-=a.left-7,-(t.split("
    ").length-2)*r.width+2]}(e,t,n),function(t,n,e){Lr.select(e.config.container+" #_ideogramTrackLabel").style("opacity",1).style("left",n+"px").style("top",t+"px").style("width","max-content").style("transform-origin","bottom left").style("text-align","left").on("mouseover",(function(){clearTimeout(e.hideTrackLabelTimeout)})).on("mouseout",(function(){Bi(e)}))}(r,o,n)}(this,i)})).on("mouseout",(function(){Bi(i)})),i.onDrawAnnotsCallback&&i.onDrawAnnotsCallback()}function Ri(t,n,e){var o,r,i,a,s,c,l,u=[];for(o=0;o0&&(o+="-"+t.stop.toLocaleString()),n=o,e=24,t.name&&(n=(t.displayName?t.displayName:t.name)+"
    "+n,e+=8),[n,e]}(t),function(t,n,e,o,r){t.html(n).style("opacity",1).style("left",e.e+"px").style("top",e.f-o+"px").style("font-family",r.config.fontFamily).style("pointer-events",null).on("mouseover",(function(){clearTimeout(r.hideAnnotTooltipTimeout)})).on("mouseout",(function(){r.startHideAnnotTooltipTimeout()}))}(i,o,e,r,c)):zi())}function Yi(t){return"ideogramLabel_"+t.domId}function Ui(t,n,e){Lr.selectAll("._ideoActive").classed("_ideoActive",!1),Lr.select("#"+n).attr("class","_ideogramLabel "+t),Lr.select("#"+e+" > path").attr("class",t)}function Xi(t,n){let e,o;const r=t.target,i=t.type;if(Array.from(r.classList).includes("_ideogramLabel"))e=r.id,o=r.id.split("ideogramLabel_")[1],Lr.select("#"+o+" path").dispatch(i);else{const t=r.parentElement;e="ideogramLabel_"+t.id,o=t.id}"mouseout"===i&&(n.time.prevTooltipOff=performance.now(),n.time.prevTooltipAnnotDomId=o),"mouseover"===i?(clearTimeout(window._ideoActiveTimeout),Ui("_ideoActive",e,o)):window._ideoActiveTimeout=window.setTimeout((function(){Ui("",e,o)}),250)}function Vi(t,n){var e,o=!1;return n.annots.forEach((n=>{o||n.annots.forEach((n=>{o||n.name===t&&(e=n,o=!0)}))})),e}function Qi(t,n){var e,o,r,i,a,s,c,l,u,h=n.config;return null===(e=document.querySelector("#"+t.domId))?null:(o=e.getBoundingClientRect(),r=document.querySelector("#_ideogram").getBoundingClientRect(),i=qr(t.name,n).width,i+=h.fontFamily?9:7,a=h.annotLabelSize?h.annotLabelSize:13,c=(s=o.top-r.top+a-1)+a,u=(l=o.left-r.left-i)+i,name=t.name,{top:s,bottom:c,right:u,left:l,width:i,height:a,name})}function Ji(t,n,e){var o,r=this;const i=Qi(o=Vi(t,r),r);null!==i&&function(t,n,e){e.didSetLabelStyle||(document.querySelector("#_ideogramInnerWrap").insertAdjacentHTML("afterbegin","\n \n "),e.didSetLabelStyle=!0);const o=Yi(t),r=Hr(e),i="pink"===t.color?"#CF406B":t.color;Lr.select("#_ideogram").append("text").attr("id",o).attr("class","_ideogramLabel").attr("x",n.left).attr("y",n.top).style("font",r).style("fill",i).style("pointer-events",null).html(t.name)}(o,Object.assign(i,{backgroundColor:n,borderColor:e}),r)}function Ki(t=[]){const n=this;t=$r(t),n.clearAnnotLabels();let e=[];const o=[];0===t.length&&(t=n.flattenAnnots()),t.forEach(((t,r)=>{const i=Qi(t,n);null!==i?o.length>0&&o.some(((t,n)=>{const e=function(t,n,e){const o=t.left-0,r=n.left-0,i=t.right+0,a=n.right+0;return o<=r&&o<=a&&i<=a&&i>=r||o>=r&&o<=a&&i>=a&&i>=r||o<=r&&o<=a&&i>=a&&i>=r||o>=r&&o<=a&&i>=r&&i<=a}(t,i),o=function(t,n,e){const o=t.top-0,r=n.top-0,i=t.bottom+0,a=n.bottom+0;return o<=r&&o<=a&&i<=a&&i>=r||o>=r&&o<=a&&i>=a&&i>=r}(t,i);return e&&o}))||(e.push(t),o.push(i)):console.log(t.name+" has null layout")}));let r=10;const i=n.config;"relatedGenesMode"in i&&"hints"===i.relatedGenesMode&&(r=20),e=e.sort(n.annotSortFunction).slice(0,r),e.reverse(),e.forEach((t=>{n.addAnnotLabel(t.name)})),Lr.selectAll("._ideogramLabel, .annot").on("mouseover",(t=>Xi(t))).on("mouseout",(t=>Xi(t,n))).on("click",(t=>Xi(t)))}function Zi(t){const n=Yi(Vi(t,this));document.querySelector("#"+n).remove()}function ta(){document.querySelectorAll("._ideogramLabel").forEach((t=>{t.remove()}))}function na(t){var n,e,o=!1,r=(new Date).getTime(),i=this;return n=i.chromosomes[i.config.taxid],function(t){"histogramScaling"in t.config==0&&(t.config.histogramScaling="absolute")}(i),void 0===i.maxAnnotsPerBar&&(i.maxAnnotsPerBar={},o=!0),e=function(t,n){var e,o,r,i,a,s,c,l,u=n.config.barWidth,h=[];for(s=0;s=f&&ui&&(i=l),l>o&&(o=l);e.maxAnnotsPerBar[s]=i}e.maxAnnotsPerBarAllChrs=o}}(e,o,i),e=function(t,n){var e,o,r,i,a,s,c,l=n._layout._isRotated;for(e=0;e";else if("triangle"===r){var i="";"vertical"===n.config.orientation&&(i=' transform="rotate(90, 7, 7)"'),e='"}}else e='";return e}function ra(t,n,e,o,r){var i,a,s,c=ia(r);for(i=0;i"+(s=e.rows[i]).name+"",a=c*(i-1)+o+1,"name"in e&&(a+=c),n+=''+oa(s,r)+"";return[t,n]}function ia(t){return 2*Ir(qr("A",t).height)+.5}function aa(t){var n,e,o,r,i,a,s=t.config,c=ia(t);for(Lr.select(s.container+" #_ideogramLegend").remove(),e=s.legend,a="",n=0;n`+i.name+""),o='',[r,o]=ra(r,o,i,s,t),a+=(o+="")+"
      "+r+"
    "}var l=`font-family: ${s.fontFamily};`,u=`line-height: ${ia(t)}px;`;ea+=`#_ideogramLegend {${l} ${u}}`;var h=Lr.select(s.container+" #_ideogramOuterWrap");h.append("style").html(ea),h.append("div").attr("id","_ideogramLegend").html(a)}function sa(t,n,e=!1,o=!1){var r,i,a=[],s=this,c=s.chromosomes[s.config.taxid];if("annots"in t[0]||"values"in t[0])return s.drawProcessedAnnots(t,n);for(i in c)a.push({chr:i,annots:[]});a=function(t,n){var e,o,r,i;for(e=0;e2e3&&console.warn('Rendering more than 2000 annotations in Ideogram?\nTry setting "annotationsLayout" to "heatmap" or "histogram" in your Ideogram configuration object for better layout and performance.')}}(t,n),"histogram"===t&&(n=e.getHistogramBars(n)),o=function(t,n){return Lr.selectAll(n.selector+" .chromosome").data(t).selectAll("path.annot").data((function(t){return t.annots})).enter()}(e.fillAnnots(n),e),"tracks"===t?function(t,n){var e,o=n.config.annotationHeight;e=function(t){var n;return{triangle:"m0,0 l -"+t+" "+2*t+" l "+2*t+" 0 z",circle:"m -"+(n=t)+", "+n+"a "+n+","+n+" 0 1,0 "+2*n+",0a "+n+","+n+" 0 1,0 -"+2*n+",0",rectangle:"m0,0 l 0 "+2*t+"l "+t+" 0l 0 -"+2*t+"z"}}(o),t.append("g").attr("id",(function(t){return t.domId})).attr("class","annot").attr("transform",(function(t){var e=n.config.chrWidth+t.trackIndex*o*2;return"translate("+t.px+","+e+")"})).append("path").attr("d",(function(t){return function(t,n){return t.shape&&"triangle"!==t.shape?"circle"===t.shape?n.circle:"rectangle"===t.shape?n.rectangle:t.shape:n.triangle}(t,e)})).attr("fill",(function(t){return t.color})).on("mouseover",(function(t,e){n.showAnnotTooltip(e,this)})).on("mouseout",(function(){n.startHideAnnotTooltipTimeout()})).on("click",(function(t,e){n.onClickAnnot(e)}))}(o,e):"overlay"===t?function(t,n){t.append("polygon").attr("id",(function(t){return t.id})).attr("class","annot").attr("points",(function(t){var e,o,r=n.config.chrWidth;return t.stopPx-t.startPx>1?(e=t.startPx,o=t.stopPx):(e=t.px-.5,o=t.px+.5),e+","+r+" "+o+","+r+" "+o+",0 "+e+",0"})).attr("fill",(function(t){return t.color})).on("mouseover",(function(t,e){n.showAnnotTooltip(e,this)})).on("mouseout",(function(){n.startHideAnnotTooltipTimeout()}))}(o,e):"histogram"===t&&function(t,n){var e,o,r={},i=n.config.chrWidth;for(o in e=n.chromosomes[n.config.taxid])r[o]=e[o];t.append("polygon").attr("class","annot").attr("points",(function(t){return function(t,n,e,o){var r,i,a,s;r=t.px+o.bump,i=t.px+o.config.barWidth+o.bump,a=n,s=n+t.height;var c=e[t.chr];return i>c&&(i=c),r+","+a+" "+i+","+a+" "+i+","+s+" "+r+","+s}(t,i,r,n)})).attr("fill",(function(t){return t.color}))}(o,e)}(n,t,o),o.onDrawAnnotsCallback&&o.onDrawAnnotsCallback())}function la(t,n,e){return t.append("g").attr("class","syntenicRegion").attr("id",n).on("click",(function(){var t=this,n=Lr.selectAll(e.selector+" .syntenicRegion").filter((function(){return this!==t}));n.classed("hidden",!n.classed("hidden"))})).on("mouseover",(function(){var t=this;Lr.selectAll(e.selector+" .syntenicRegion").filter((function(){return this!==t})).classed("ghost",!0)})).on("mouseout",(function(){Lr.selectAll(e.selector+" .syntenicRegion").classed("ghost",!1)}))}function ua(t,n,e,o,r,i){var a,s;a="color"in i?i.color:"#CFC",s="opacity"in i?i.opacity:1,t.append("polygon").attr("points",n+", "+o.startPx+" "+n+", "+o.stopPx+" "+e+", "+r.stopPx+" "+e+", "+r.startPx).style("fill",a).style("fill-opacity",s)}function ha(t,n,e,o,r,i){var a,s;a="color"in i?i.color:"#CFC",s="opacity"in i?i.opacity:1,t.append("polygon").attr("points",o.startPx-15+", "+n+" "+(o.stopPx-15)+", "+n+" "+(r.stopPx-15)+", "+e+" "+(r.startPx-15)+", "+e).style("fill",a).style("fill-opacity",s)}function fa(t,n,e=null){var o,r,i,a;if(o=t.r1,r=t.r2,"string"==typeof o.chr){const t=n.config.taxids;n.config.multiorganism?(o.chr=n.chromosomes[t[0]][o.chr],r.chr=n.chromosomes[t[1]][r.chr]):(o.chr=n.chromosomes[t[0]][o.chr],r.chr=n.chromosomes[t[0]][r.chr])}var s=document.querySelector("#"+o.chr.id+"-chromosome-set"),c=s.getCTM().e,l=s.getCTM().f,u=document.querySelector("#"+r.chr.id+"-chromosome-set"),h=u.getCTM().e,f=u.getCTM().f;return null===e?"vertical"===n.config.orientation?(i=l-12,a=f-12):(i=c,a=h):(i=e,a=e),o.startPx=n.convertBpToPx(o.chr,o.start)+i,o.stopPx=n.convertBpToPx(o.chr,o.stop)+i,r.startPx=n.convertBpToPx(r.chr,r.start)+a,r.stopPx=n.convertBpToPx(r.chr,r.stop)+a,[o,r]}function da(t,n,e,o,r){t.append("line").attr("class","syntenyBorder").attr("x1",n).attr("x2",e).attr("y1",o.startPx).attr("y2",r.startPx),t.append("line").attr("class","syntenyBorder").attr("x1",n).attr("x2",e).attr("y1",o.stopPx).attr("y2",r.stopPx)}function ma(t,n,e,o,r){t.append("line").attr("class","syntenyBorder").attr("x1",o.startPx-15).attr("x2",r.startPx-15).attr("y1",n).attr("y2",e),t.append("line").attr("class","syntenyBorder").attr("x1",o.stopPx-15).attr("x2",r.stopPx-15).attr("y1",n).attr("y2",e)}function ga(t,n,e,o,r,i){var a,s;Math.abs(o.startPx-o.startPx)<2&&Math.abs(o.stopPx-o.stopPx)<2?(a=i.color,s=i.width):(a="",s=""),t.append("line").attr("class","syntenyBorder").attr("x1",n).attr("x2",e).attr("y1",o.startPx).attr("y2",r.startPx).style("stroke",a).style("stroke-width",s),t.append("line").attr("class","syntenyBorder").attr("x1",n).attr("x2",e).attr("y1",o.stopPx).attr("y2",r.stopPx).style("stroke",a).style("stroke-width",a)}function pa(t,n,e,o,r,i){var a=i.split("__").map((t=>"label_"+t));if("name"in o){t.append("text").attr("id",a[0]).attr("y",o.startPx+3).text(o.name);var s=document.querySelector("#"+a[0]).getBoundingClientRect().width;Lr.select("#"+a[0]).attr("x",n-15-s)}"name"in r&&t.append("text").attr("id",a[1]).text(r.name).attr("x",e+15).attr("y",r.startPx+3).text(r.name)}function ya(t){var n=(new Date).getTime(),e=this,o=e.config;if(e.syntenicRegions=t,o.multiorganism&&"collinear"===o.geometry)return"vertical"===o.orientation?function(t,n){var e=(new Date).getTime();(function(t,n,e){var o,r,i,a,s,c,l,u;for(o=0;oc&&(c=s+1),i.splice(4,0,s),a.push(i);l.push({chr:r.chr,annots:a})}return n.numAvailTracks=c,l}(t.annots,o),n.splice(4,0,"trackIndexOriginal"),t={keys:n,annots:e},o.rawAnnots.metadata&&(t.metadata=o.rawAnnots.metadata)),t}var xa=[["F00"],["F00","88F"],["F00","CCC","88F"],["F00","FA0","0AF","88F"],["F00","FA0","CCC","0AF","88F"],["F00","FA0","875","578","0AF","88F"],["F00","FA0","875","CCC","578","0AF","88F"],["F00","FA0","7A0","875","0A7","578","0AF","88F"],["F00","FA0","7A0","875","CCC","0A7","578","0AF","88F"],["F00","FA0","7A0","875","552","255","0A7","578","0AF","88F"]];function _a(t,n,e,o,r,i,a){return a.config.annotationTracks?r=function(t,n,e,o,r){var i;return n.trackIndex=e[3],(i=r.config.annotationTracks[n.trackIndex]).color&&(n.color=i.color),i.shape&&(n.shape=i.shape),t[o].annots.push(n),t}(r,t,e,i,a):"trackIndex"===n[3]&&1!==a.numAvailTracks?[r,o]=function(t,n,e,o,r,i){var a=xa[i.numAvailTracks-1];return t.trackIndex=n[3],t.trackIndexOriginal=n[4],t.color="#"+a[t.trackIndexOriginal],t.trackIndex>i.config.numTracks-1?(t.trackIndex in e?e[t.trackIndex].push(t):e[t.trackIndex]=[t],[o,e]):(o[r].annots.push(t),[o,e])}(t,e,o,r,i,a):r=function(t,n,e,o){return n.trackIndex=0,n.color||(n.color=o.config.annotationsColor),n.shape||(n.shape="triangle"),t[e].annots.push(n),t}(r,t,i,a),[r,o]}function Aa(t,n){return"_c"+t+"_a"+n}function Ca(t,n,e,o,r,i,a){var s,c,l,u;const h=!a.config.annotationsLayout||"tracks"===a.config.annotationsLayout;for(s=0;s-a.annotSortFunction(t,n)))):t[r].annots.sort(((t,n)=>t[1]-n[1])),s=0;s10&&console.error("Ideogram only displays up to 10 tracks at a time. You specified "+r+" tracks. Perhaps consider a different way to visualize your data."),(e=Object.keys(t).length)&&console.warn("Ideogram configuration specified "+r+" tracks, but loaded annotations contain "+e+" extra tracks.")}(o,r),e}class La{constructor(t,n){this.matrix=t,this.ideo=n}setRawAnnots(){var t,n,e;return t=this,n=this.ideo,e=this.matrix,new Promise((function(o){t.rawAnnots=t.fetchCoordinates(n).then((function(r){t.coordinates=r,o(t.parseExpressionMatrix(e,n))}))}))}fetchCoordinates(t){var n={};if("human"===t.config.organism){var e=t.config.dataDir+"../../annotations/Homo_sapiens,_Ensembl_80.tsv";return new Promise((function(o){t.fetch(e,"text").then((function(t){var e,r,i,a,s,c,l;for(e=t.split(/\r\n|\n/).slice(1),r=0;rparseFloat(t))),[o,r,length]=this.coordinates[i],-1===(e=n.indexOf(o))?[null,null]:[e,[i,r,length].concat(a)])}parseExpressionMatrix(t,n){var e,o,r,i,a,s,c=[],l=t.split(/\r\n|\n/);for(o=Object.keys(n.chromosomes[n.config.taxid]),e=0;e{e.annots.forEach((e=>{const o=t.annotDescriptions.annots[e.name];n[e.name]=[e.name,o.ensemblId,e.chr,e.start,e.stop,e.length,o.type]}))}));const e=[["# Gene name","Ensembl ID","Chromosome","Start","Stop","Length","Type"]].concat(Object.values(n)),o=t.annotDescriptions.headers+"\n#\n"+e.map((t=>t.join("\t"))).join("\n"),r="data:text/plain;charset=utf-8,"+encodeURIComponent(o);var i=new MouseEvent("click",{view:window,bubbles:!1,cancelable:!0}),a=document.createElement("a");a.setAttribute("download","ideogram.tsv"),a.setAttribute("href",r),a.setAttribute("target","_blank"),a.setAttribute("id","_ideo-undisplayed-dl-annots-link"),a.setAttribute("style","display: none;"),document.body.appendChild(a),a.dispatchEvent(i)}function Ma(){var t=this,n=t.config;!function(t){var n,e=t.config;e.annotationHeight||("heatmap"===e.annotationsLayout?n=e.chrWidth-1:(n=Math.round(e.chrHeight/100))<3&&(n=3),t.config.annotationHeight=n)}(t),n.annotationsPath||n.localAnnotationsPath||t.annots||n.annotations?function(t,n){n.annotationTracks?t.config.numAnnotTracks=n.annotationTracks.length:n.annotationsNumTracks?t.config.numAnnotTracks=n.annotationsNumTracks:t.config.numAnnotTracks=1,t.config.annotTracksHeight=n.annotationHeight*n.numAnnotTracks,void 0===n.barWidth&&(t.config.barWidth=3)}(t,n):(t.config.annotTracksHeight=0,t.config.numAnnotTracks=0),void 0===n.annotationsColor&&(t.config.annotationsColor="#F00"),n.onClickAnnot&&(t.onClickAnnotCallback=n.onClickAnnot),function(t,n){!1!==n.showAnnotTooltip&&(t.config.showAnnotTooltip=!0),n.onWillShowAnnotTooltip&&(t.onWillShowAnnotTooltipCallback=n.onWillShowAnnotTooltip)}(t,n),function(t,n){!1!==n.addAnnotLabel&&(t.config.addAnnotLabel=!0),n.onWillAddAnnotLabel&&(t.onWillAddAnnotLabelCallback=n.onWillAddAnnotLabel)}(t,n)}function Pa(){var t=this,n=t.config;t.rawAnnots.annots=t.rawAnnots.annots.sort(Ideogram.sortChromosomes),t.onLoadAnnotsCallback&&t.onLoadAnnotsCallback(),("heatmapThresholds"in n||"metadata"in t.rawAnnots&&"heatmapThresholds"in t.rawAnnots.metadata)&&("heatmap"===n.annotationsLayout?function(t){var n,e,o,r,i,a,s=t.config.heatmapThresholds;for(o=[],e=(i=t.rawAnnots).keys.slice(3),r=[],a=[],!i.metadata&&isNaN(s[0])||(s=Si(t)),n=0;nt.chr));if(o.forEach((t=>{t in n&&e.push(t),n[t]=1})),e.length>0)throw Error(`Duplicate chromosomes detected.\nChromosome list: ${o}. Duplicates: ${e}.\nTo fix this, edit your raw annotations JSON data to remove redundant chromosomes.`)}(t)}function Na(){return this.annots.reduce(((t,n)=>[...t,...n.annots]),[])}function Ia(t){var n,e=this,o=e.config;n="heatmap-2d"===o.annotationsLayout;var r=function(t){var n,e;return e=(n=t.split("?")[0].split("."))[n.length-1],!1===["bed","json","tsv"].includes(e)?(e=e.toUpperCase(),void alert("Ideogram.js only supports BED and Ideogram JSON and TSV at the moment. Sorry, check back soon for "+e+" support!")):e}(t);"http"===t.slice(0,4)||n||"tsv"===r?(r=n?"":r,e.fetch(t,"text").then((function(t){e.rawAnnotsResponse=t,n?new La(t,e).setRawAnnots().then((function(t){e.rawAnnots=t,e.afterRawAnnots()})):(e.rawAnnots="tsv"===r?new _i(t,e).rawAnnots:"bed"===r?new xi(t,e).rawAnnots:JSON.parse(t),e.afterRawAnnots())}))):e.fetch(t).then((function(t){e.rawAnnotsResponse=t,e.rawAnnots=t,e.afterRawAnnots()}))}function Ba(t){var n,e,o,r,i,a,s;for(n=[],e=[],o=this.chromosomesArray,r=0;r(e.includes(t.name)?t.rank=e.indexOf(t.name)+1:t.rank=1e10,t)))}function Da(t,n="red"){const e=this,o=e.config.taxid,r=t.map((t=>{const r=e.chromosomes[o][t].id,i=`${e.selector} #${r}-chromosome-set`,a=document.querySelector(i),s=a.getBoundingClientRect();return``})).join();document.querySelector(e.selector).insertAdjacentHTML("afterBegin",r)}function Fa(t){const n=this;let e=`${n.selector} .ideo-highlight`;if(void 0!==t){const o=n.config.taxid;e=t.map((t=>{const e=n.chromosomes[o][t].id;return`${n.selector} #ideo-highlight-${e}`}))}document.querySelectorAll(e).forEach((t=>{t.remove()}))}function Ra(t,n){var e,o;return e=n.esearch+"&db=taxonomy&term="+t,Lr.json(e).then((function(n){if(0===n.esearchresult.idlist.length)throw'Organism "'+t+"\" is generally unknown; it was not found in the NCBI Taxonomy database. If you did not intend to specify a novel or custom taxon, then try using the organism's scientific name, e.g. Homo sapiens or Arabidopsis thaliana.";return o=n.esearchresult.idlist[0],[t,o]}))}function Oa(t,n){var e,o,r=this;t=r.config.organism,o=r.esummary+"&db=taxonomy&id="+t,Lr.json(o).then((function(o){return e=o.result[String(t)].commonname,r.config.organism=e,n(e)}))}function Ga(t,n,e){var o,r,i,a,s,c=e.config;(function(t,n){var e,o,r;if(n.assemblyIsAccession())return new Promise((function(e){n.coordinateSystem="bp",n.getAssemblyAndChromosomesFromEutils(t,e)}));e=n.config.dataDir,o=jr(n.organisms[t].scientificName),r=[t],["9606","10090","10116"].includes(t)&&!n.config.showFullyBanded&&(o+="-no-bands");var i=e+o+".json",a=new Promise(((t,n)=>Pr(i).then((n=>n.json().then((function(n){t(n)})))).catch((t=>{n(t)}))));return a.then((function(e){var o,i,a,s,c=e.chrBands,l=[""],u=[],h={};n.bandData[e.taxid]=c;for(var f=0;f{t.length>i.bp&&(i.bp=t.length)})),n.maxLength[t]=i,l.push(u),l.push(r),l}),(function(){return new Promise((function(e){n.coordinateSystem="bp",n.getAssemblyAndChromosomesFromEutils(t,e)}))}))})(t,e).then((function(l){o=l[0],r=l[1],"chromosomes"in c==0||null===c.chromosomes?(e.config.chromosomes={},e.config.chromosomes[t]=r):(c.multiorganism?t in c.chromosomes?i=c.chromosomes[t]:(a=jr(e.getScientificName(t)),e.config.chromosomes[t]=c.chromosomes[a].slice(),i=e.config.chromosomes[t]):i=c.chromosomes,s=r.filter((t=>i.includes(t.name))),e.config.chromosomes[t]=s),e.chromosomes[t]=e.config.chromosomes[t].slice(),e.organisms[t].assemblies={default:o},n()}))}function ja(t,n){var e,o;for(e in n.organisms)if(o=n.organisms[e],e===jr(t)||jr(o.commonName)===jr(t)||jr(o.scientificName)===jr(t))return!0;return!1}function za(t,n){(function(t){var n,e,o,r,i,a=t.config;return n=[],e={},function(t,n){var e,o,r,i=[],a={};for(r=0;rjr(t))),i.includes(jr(s.scientificName))?o=s.scientificName:i.includes(jr(s.commonName))&&(o=s.commonName),jr(o)in a.chromosomes?e[r]=a.chromosomes[jr(o)]:e[r]=a.chromosomes[o.toLowerCase()]):e=null);return[e,n]}))})(n).then((function([e,o]){var r,i,a,s,c,l=n.config,u=[];for(r=0;r{t.length>a.bp&&(a.bp=t.length)})),a.bp>e.maxLength.bp&&(e.maxLength.bp=a.bp),e.maxLength[n]=a,e.coordinateSystem="bp",c}(r.result,t,o);return n([e,i])}),(function(t){console.warn(t)}))}function $a(){var t=this,n=t.bandsToShow.join(",");0!==t.bandsToShow.length&&(Lr.selectAll(t.selector+" .bandLabel, .bandLabelStalk").style("display","none"),Lr.selectAll(n).style("display",""))}function Ya(t,n,e,o,r){return n!==e&&(t=o[r.id][e]+36),t}function Ua(t,n,e,o,r,i,a){var s,c;return e"pter"!==t.name)),s=a.drawBandLabelText(e,i,o,s),a.drawBandLabelStalk(e,i,o,s);a.setBandsToShow(r,s)}function Za(t,n){return[n[t][0],n[t][1],n[t][2],n[t][3]]}function ts(){var t="";return t=function(t){var n,e,o,r,i,a="";for(n=0;n',a+="gneg"===e?'':'',a+="";return a}(kr),``+(t+=' ')+""}function ns(t,n,e){var o,r,i;return(o=n[0])in t==0&&(t[o]=[]),r=function(t){var n=t[7];return t[8]&&(n+=t[8]),n}(n),i=function(t,n,e,o){return{chr:t,bp:{start:parseInt(n[5],10),stop:parseInt(n[6],10)},iscn:{start:parseInt(n[3],10),stop:parseInt(n[4],10)},px:{start:-1,stop:-1,width:-1},name:n[1]+n[2],stain:e,taxid:o}}(o,n,r,e),t[o].push(i),t}function es(t,n,e,o){var r,i,a=o.config.multiorganism;return null!=t&&(i=(r=Array.isArray(t))&&-1===t.indexOf(n),!(!r||"object"==typeof t||!i)||(e in t!=0||!a)&&(a?"string"==typeof t[e][0]?!1===t[e].includes(n):0===t[e].filter((t=>t.name===n)).length:0===t.filter((t=>t===n)).length))}function os(t,n,e,o){var r,i,a=[];return r=n[t],a.push(r),i={iscn:r[r.length-1].iscn.stop,bp:r[r.length-1].bp.stop},e in o.maxLength==0&&(o.maxLength[e]={bp:0,iscn:0}),i.iscn>o.maxLength[e].iscn&&(o.maxLength[e].iscn=i.iscn,i.iscn>o.maxLength.iscn&&(o.maxLength.iscn=i.iscn)),i.bp>o.maxLength[e].bp&&(o.maxLength[e].bp=i.bp,i.bp>o.maxLength.bp&&(o.maxLength.bp=i.bp)),a}function rs(t,n,e,o){var r,i;if(t in o.bandData||t in Sr&&!1===o.assemblyIsAccession())e=function(t,n,e,o){var r,i,a;r=function(t,n,e){var o,r,i,a,s,c,l={};c=e.bandData[t],Array.isArray(c)&&(s="native"),n=function(t){var n,e;if(t instanceof Array&&"object"==typeof t[0]){for(n=[],e=0;e0&&(o.config.chromosomes[t]=n.slice()),o.numChromosomes+=o.config.chromosomes[t].length;for(i=0;io.maxLength.bp&&(o.maxLength.bp=r.length);return e}function is(t){var n,e,o=this,r=o.config,i=(new Date).getTime();return n=[],"chromosomes"in r&&(e=r.multiorganism?r.chromosomes:t in r.chromosomes?r.chromosomes[t].slice():r.chromosomes.slice()),n=rs(t,e,n,o),function(t,n){var e=(new Date).getTime();n.config.debug&&console.log("Time in processBandData: "+(e-t)+" ms")}(i,o),[t,n]}function as(){call(this.onBrushMoveCallback)}function ss(){call(this.onBrushEndCallback)}function cs(t,n,e){var o,r,i,a,s=this,c=s.config.chrWidth+6.5,l=s._layout.margin.left;[t,n,e]=function(t,n,e){var o,r;return o=t.split(":"),r=t.split("-"),o.length>1&&r.length>1&&(t=o[0].replace("chr",""),r=o[1].split("-"),n=parseInt(r[0]),e=parseInt(r[1]-1)),[t,n,e]}(t,n,e),o=function(t,n){var e,o;for(e=0;e1||"MT"===t.name){if([o,e]=function(t,n){var e,o,r,i,a,s,c,l,u;for(e=0;e=a&&n<=s)return[l+u*(r+i/c*(n-a)-r)/i,o];return[null,o]}(t,n),null!==o)return o}else if(n>=1&&n<=t.length)return t.scale.bp*n;!function(t,n,e){throw new Error("Base pair out of range. bp: "+t+"; length of chr"+n.name+": "+e.bp.stop)}(n,t,e)}function ms(t,n,e,o,r,i,a){var s,c,l,u;return a=t-n,s=o-r,c=i.bp.stop-i.bp.start,l=n+a/s*(e-r),u=i.bp.start+c*(l-n)/a,Math.round(u)}function gs(t,n){var e,o,r,i,a,s;for(0===n&&(n=t.bands[0].px.start),e=0;e=r&&n<=i)return ms(s,a,n,i,r,o,void 0);!function(t,n,e){throw new Error("Pixel out of range. px: "+t+"; length of chr"+n.name+": "+e)}(n,t,i)}let ps=xs,ys=xs,vs=xs,bs=_s,ws=As;function xs(t){for(var n=new Array(t),e=-1;++e32)throw new Error("invalid array width!");return t}function Cs(t){this.length=t,this.subarrays=1,this.width=8,this.masks={0:0},this[0]=ps(t)}"undefined"!=typeof Uint8Array&&(ps=function(t){return new Uint8Array(t)},ys=function(t){return new Uint16Array(t)},vs=function(t){return new Uint32Array(t)},bs=function(t,n){if(t.length>=n)return t;var e=new t.constructor(n);return e.set(t),e},ws=function(t,n){var e;switch(n){case 16:e=ys(t.length);break;case 32:e=vs(t.length);break;default:throw new Error("invalid array width!")}return e.set(t),e}),Cs.prototype.lengthen=function(t){var n,e;for(n=0,e=this.subarrays;n>>0,!((n=this.width-32*o)>=32)||e)return n<32&&e&1<=t;o--)this[n][o]=0;this.length=t},Cs.prototype.zero=function(t){var n,e;for(n=0,e=this.subarrays;nfunction(e){var o=e.length;return[t.left(e,n,0,o),t.right(e,n,0,o)]},Ls=(t,n)=>{var e=n[0],o=n[1];return function(n){var r=n.length;return[t.left(n,e,0,r),t.left(n,o,0,r)]}},Ts=t=>[0,t.length],Ms=t=>t,Ps=()=>null,Ns=()=>0;function Is(t){function n(t,n,o){for(var r=o-n,i=1+(r>>>1);--i>0;)e(t,i,r,n);return t}function e(n,e,o,r){for(var i,a=n[--r+e],s=t(a);(i=e<<1)<=o&&(it(n[r+i+1])&&i++,!(s<=t(n[r+i])));)n[r+e]=n[r+i],e=i;n[r+e]=a}return n.sort=function(t,n,o){for(var r,i=o-n;--i>0;)r=t[n],t[n]=t[n+i],t[n+i]=r,e(t,1,i,n);return t},n}const Bs=Is(Ms);Bs.by=Is;const Es=Bs;function Ds(t){var n=Es.by(t);return function(e,o,r,i){var a,s,c,l=new Array(i=Math.min(r-o,i));for(s=0;sa&&(l[0]=c,a=t(n(l,0,i)[0]))}while(++o>>1;e>>1;t(n[i]){for(var o=0,r=n.length,i=e?JSON.parse(JSON.stringify(t)):new Array(r);ot+1,Hs=t=>t-1,qs=t=>function(n,e){return n+ +t(e)},$s=t=>function(n,e){return n-t(e)},Ys=(t,n)=>{const e=t[n];return"function"==typeof e?e.call(t):e},Us=/\[([\w\d]+)\]/g,Xs=(t,n)=>function(t,n,e,o,r){for(r in o=(e=e.split(".")).splice(-1,1),e)n=n[e[r]]=n[e[r]]||{};return t(n,o)}(Ys,t,n.replace(Us,".$1"));var Vs=-1;Js.heap=Es,Js.heapselect=Rs,Js.bisect=js,Js.permute=zs;const Qs=Js;function Js(){var t,n={add:c,remove:l,dimension:f,groupAll:d,size:m,all:g,allFiltered:p,onChange:y,isElementFiltered:h},e=[],o=0,r=[],i=[],a=[],s=[];function c(r){var a=o,s=r.length;return s&&(e=e.concat(r),t.lengthen(o+=s),i.forEach((function(t){t(r,a,s)})),v("dataAdded")),n}function l(n){for(var i=new Array(o),s=[],c="function"==typeof n,l=function(o){return c?n(e[o],o):t.zero(o)},u=0,h=0;u>7]&=~(1<<(63&i));return a}function h(n,e){var o=u(e||[]);return t.zeroExceptMask(n,o)}function f(n,s){if("string"==typeof n){var c=n;n=function(t){return Xs(t,c)}}var l,u,h,f,d,m,g,p,y,b,w,x,_,A,C={filter:function(t){return null==t?j():Array.isArray(t)?G(t):"function"==typeof t?z(t):O(t)},filterExact:O,filterRange:G,filterFunction:z,filterAll:j,currentFilter:function(){return x},hasCurrentFilter:function(){return _},top:function(n,o){var r,i=[],a=N,c=0;for(o&&o>0&&(c=o);--a>=P&&n>0;)t.zero(r=m[a])&&(c>0?--c:(i.push(e[r]),--n));if(s)for(a=0;a0;a++)t.zero(r=k[a])&&(c>0?--c:(i.push(e[r]),--n));return i},bottom:function(n,o){var r,i,a=[],c=0;if(o&&o>0&&(c=o),s)for(r=0;r0;r++)t.zero(i=k[r])&&(c>0?--c:(a.push(e[i]),--n));for(r=P;r0;)t.zero(i=m[r])&&(c>0?--c:(a.push(e[i]),--n)),r++;return a},group:H,groupAll:function(){var t=H(Ps),n=t.all;return delete t.all,delete t.top,delete t.order,delete t.orderNatural,delete t.size,t.value=function(){return n()[0].value},t},dispose:q,remove:q,accessor:n,id:function(){return f}},k=[],S=function(t){return Zs(t).sort((function(t,n){var e=g[t],o=g[n];return eo?1:t-n}))},L=Ts,T=[],M=[],P=0,N=0,I=0;i.unshift(E),i.push(D),a.push(F);var B=t.add();function E(e,r,i){var a,c;if(s){I=0,W=0,A=[];for(var u=0;uP)for(i=P,a=Math.min(e,N);iN)for(i=Math.max(e,N),a=o;i1?ks.arrayLengthen(f,o):Ks(o,_),z&&(T=(p=F[0]).key);H=M);)++H;for(;H=m));)M=n(i[H]);$()}for(;WW)if(s)for(W=0;W1||s?(C=I,k=E):(!A&&L&&(A=1,c=[{key:null,value:j()}]),1===A?(C=B,k=D):(C=Ps,k=Ps),f=null),r[g]=C}function N(t){if(A>1||s){var n,e,i,a=A,l=c,u=Ks(a,a);if(s){for(n=0,i=0;n1||s)if(s)for(n=0;n1||s?(k=E,C=I):1===A?(k=D,C=B):k=C=Ps}else if(1===A){if(L)return;for(var h=0;h=0&&r.splice(t,1),(t=T.indexOf(P))>=0&&T.splice(t,1),(t=a.indexOf(N))>=0&&a.splice(t,1),(t=M.indexOf(i))>=0&&M.splice(t,1),i}return arguments.length<1&&(n=Ms),r.push(C),T.push(P),a.push(N),P(d,m,0,o),G().orderNatural()}function q(){M.forEach((function(t){t.dispose()}));var n=i.indexOf(E);return n>=0&&i.splice(n,1),(n=i.indexOf(D))>=0&&i.splice(n,1),(n=a.indexOf(F))>=0&&a.splice(n,1),t.masks[h]&=u,j()}return h=B.offset,l=B.one,u=~l,f=h<<7|Math.log(l)/Math.log(2),E(e,0,o),D(0,0,o),C}function d(){var n,a,s,c,l={reduce:d,reduceCount:m,reduceSum:function(t){return d(qs(t),$s(t),Ns)},value:function(){return u&&(function(){var r;for(n=c(),r=0;r=0&&r.splice(t,1),(t=i.indexOf(h))>=0&&i.splice(t,1),l}return r.push(f),i.push(h),h(0,0),m()}function m(){return o}function g(){return e}function p(n){var r=[],i=0,a=u(n||[]);for(i=0;i{t.classList.remove("active")}))}function cc(){sc(document.querySelectorAll("#tools > ul > li")),document.querySelectorAll(".ideo-modal, .ideo-tool-panel").forEach((t=>{t.remove()})),document.querySelector("#tools").style.display="none"}function lc(t){const n=document.querySelectorAll("#tools > ul > li");n.forEach((e=>{const o=function(t){return Array.from(t.classList).includes("ideo-tool-hover")?"mouseenter":"click"}(e);e.addEventListener(o,(r=>{sc(n),e.classList+=" active";const i=e.id.split("-")[0],a=function(t,n){var e;return"download"===t&&(e=`\n
    \n
  • Image
  • \n
  • 0?"":"ideo-disabled"}">Annotations
  • \n
    \n `),"about"===t&&(e='\n
    \n \n \n Ideogram.js, version 1.37.0 x
    \n Chromosome visualization for the web\n
    '),e.trim()}(i);"mouseenter"===o?(e.insertAdjacentHTML("beforeend",a),function(t,n,e,o){"mouseenter"===t&&e.addEventListener("mouseleave",(t=>{const e=t.toElement,r=e.id,i=document.querySelector(".ideo-tool-panel");document.querySelector("#tools").contains(e)&&i&&!i.contains(e)&&r!==n&&(sc(o),i.remove())}))}(o,i,e,n),"download"===i&&(document.querySelector("#download-image").addEventListener("click",(n=>{cc(),function(t){var n=document.querySelector(t.selector),e="_ideo-undisplayed-dl-canvas";(o=document.createElement("canvas")).setAttribute("style","display: none"),o.setAttribute("id",e);var o,r=n.width.baseVal.value+30,i=n.cloneNode(!0);i.style.left="",o.setAttribute("width",r),document.body.appendChild(o),(o=document.getElementById(e)).width*=2,o.height*=2;var a=o.getContext("2d");a.setTransform(2,0,0,2,0,0),a.imageSmoothingEnabled=!1;var s=(new XMLSerializer).serializeToString(i),c=window.URL||window.webkitURL||window,l=new Image,u=new Blob([s],{type:"image/svg+xml;charset=utf-8"}),h=c.createObjectURL(u);l.onload=function(){var t,n,e;a.drawImage(l,0,0),c.revokeObjectURL(h),t=o.toDataURL("image/png").replace("image/png","image/octet-stream"),n=new MouseEvent("click",{view:window,bubbles:!1,cancelable:!0}),(e=document.createElement("a")).setAttribute("download","ideogram.png"),e.setAttribute("href",t),e.setAttribute("target","_blank"),e.setAttribute("id","_ideo-undisplayed-dl-image-link"),e.setAttribute("style","display: none;"),document.body.appendChild(e),e.dispatchEvent(n),o.remove()},l.src=h}(t)})),document.querySelector("#download-annots").addEventListener("click",(n=>{const e=document.querySelector("#download-annots");!1===Array.from(e.classList).includes("ideo-disabled")&&(cc(),t.downloadAnnotations())})))):document.querySelector("#gear").insertAdjacentHTML("beforeend",a)}))})),document.querySelectorAll("#close").forEach((t=>{t.addEventListener("click",(()=>{cc()}))}))}function uc(t){document.querySelector(t.selector).insertAdjacentHTML("beforebegin",'\n \n \n \n '),function(t){document.querySelector("#gear").addEventListener("click",(t=>{var n=document.querySelector("#tools");"none"===n.style.display?(n.style.display="",function(t){const n=document.querySelectorAll("#gear, #tools"),e=t=>{let e=0;n.forEach((n=>{n.contains(t.target)||(e+=1)})),e===n.length&&(cc(),o())},o=()=>{document.removeEventListener("click",e)};document.addEventListener("click",e)}()):(n.style.display="none",cc())})),lc(t)}(t),function(t){const n=document.querySelector(t.selector),e=document.querySelector("#gear"),o=document.querySelector("#tools");n.addEventListener("mouseover",(()=>e.style.display="")),n.addEventListener("mouseout",(()=>{"none"===o.style.display&&(e.style.display="none")})),e.addEventListener("mouseover",(()=>e.style.display=""))}(t)}class hc{constructor(t){this._model=t,this._class="ModelAdapter"}static getInstance(t){return t.bands?new hc(t):new fc(t)}getModel(){return this._model}getCssClass(){return""}}class fc extends hc{constructor(t){super(t),this._class="ModelNoBandsAdapter"}getModel(){this._model.bands=[];const t="MT"===this._model.name,n=this._model.width;return(n>1||t)&&this._model.bands.push({name:"q",px:{start:0,stop:n,width:n},bp:{start:1,stop:this._model.bpLength},iscn:{start:1,stop:this._model.length}}),this._model}getCssClass(){return"noBands"}}class dc{constructor(t){this._config=t,this._ploidy=new Kr(this._config)}getArmColor(t,n,e){return this._config.armColors?this._config.armColors[e]:this._config.ancestors?this._getPolyploidArmColor(t,n,e):null}getBorderColor(t,n,e){const o=this._config,r=o.chrBorderColor?o.chrBorderColor:"#000";return n1&&(o=this._ploidy.getChromosomesNumber(n)),i=0;i1||""===n.orientation)&&(t-=1),t}(n,s),r=-4,!0===s.showBandLabels&&(r=s.chrMargin+s.chrWidth+26),i=s.chrMargin*n,s.numAnnotTracks>1==0&&(i+=1),a=i+r,t.selectAll("text.chrLabel").attr("transform",e.scaleSvg).selectAll("tspan").attr("x",e.x).attr("y",a)}(t,n,r,this):function(t,n,e,o){var r,i,a,s=o.config;r=-s.chrWidth-2,!0===s.showBandLabels&&(r=s.chrMargin+8),i=s.annotTracksHeight,"overlay"!==s.annotationsLayout&&(i*=2),a=3-(s.chrMargin*n+r)+i,a/=e.scale.x,t.selectAll("text.chrLabel").attr("transform","rotate(-90)"+e.scaleSvg).selectAll("tspan").attr("x",a).attr("y",e.y)}(t,n,r,this)}var kc=Uint8Array,Sc=Uint16Array,Lc=Uint32Array,Tc=new kc([0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0,0]),Mc=new kc([0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,0,0]),Pc=new kc([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]),Nc=function(t,n){for(var e=new Sc(31),o=0;o<31;++o)e[o]=n+=1<>>1|(21845&Oc)<<1;Gc=(61680&(Gc=(52428&Gc)>>>2|(13107&Gc)<<2))>>>4|(3855&Gc)<<4,Rc[Oc]=((65280&Gc)>>>8|(255&Gc)<<8)>>>1}var jc=function(t,n,e){for(var o=t.length,r=0,i=new Sc(n);r>>c]=l}else for(a=new Sc(o),r=0;r>>15-t[r]);return a},zc=new kc(288);for(Oc=0;Oc<144;++Oc)zc[Oc]=8;for(Oc=144;Oc<256;++Oc)zc[Oc]=9;for(Oc=256;Oc<280;++Oc)zc[Oc]=7;for(Oc=280;Oc<288;++Oc)zc[Oc]=8;var Wc=new kc(32);for(Oc=0;Oc<32;++Oc)Wc[Oc]=5;var Hc=jc(zc,9,1),qc=jc(Wc,5,1),$c=function(t){for(var n=t[0],e=1;en&&(n=t[e]);return n},Yc=function(t,n,e){var o=n/8|0;return(t[o]|t[o+1]<<8)>>(7&n)&e},Uc=function(t,n){var e=n/8|0;return(t[e]|t[e+1]<<8|t[e+2]<<16)>>(7&n)},Xc=function(t,n,e){(null==n||n<0)&&(n=0),(null==e||e>t.length)&&(e=t.length);var o=new(2==t.BYTES_PER_ELEMENT?Sc:4==t.BYTES_PER_ELEMENT?Lc:kc)(e-n);return o.set(t.subarray(n,e)),o},Vc=["unexpected EOF","invalid block type","invalid length/literal","invalid distance","stream finished","no stream handler",,"no callback","invalid UTF-8 data","extra field too long","date not in range 1980-2099","filename too long","stream finishing","invalid zip data"],Qc=function(t,n,e){var o=new Error(n||Vc[t]);if(o.code=t,Error.captureStackTrace&&Error.captureStackTrace(o,Qc),!e)throw o;return o},Jc=function(t,n,e){var o=t.length;if(!o||e&&e.f&&!e.l)return n||new kc(0);var r=!n||e,i=!e||e.i;e||(e={}),n||(n=new kc(3*o));var a,s=function(t){var e=n.length;if(t>e){var o=new kc(Math.max(2*e,t));o.set(n),n=o}},c=e.f||0,l=e.p||0,u=e.b||0,h=e.l,f=e.d,d=e.m,m=e.n,g=8*o;do{if(!h){c=Yc(t,l,1);var p=Yc(t,l+1,3);if(l+=3,!p){var y=t[(a=l,(T=4+((a+7)/8|0))-4)]|t[T-3]<<8,v=T+y;if(v>o){i&&Qc(0);break}r&&s(u+y),n.set(t.subarray(T,v),u),e.b=u+=y,e.p=l=8*v,e.f=c;continue}if(1==p)h=Hc,f=qc,d=9,m=5;else if(2==p){var b=Yc(t,l,31)+257,w=Yc(t,l+10,15)+4,x=b+Yc(t,l+5,31)+1;l+=14;for(var _=new kc(x),A=new kc(19),C=0;C>>4)<16)_[C++]=T;else{var P=0,N=0;for(16==T?(N=3+Yc(t,l,3),l+=2,P=_[C-1]):17==T?(N=3+Yc(t,l,7),l+=3):18==T&&(N=11+Yc(t,l,127),l+=7);N--;)_[C++]=P}}var I=_.subarray(0,b),B=_.subarray(b);d=$c(I),m=$c(B),h=jc(I,d,1),f=jc(B,m,1)}else Qc(1);if(l>g){i&&Qc(0);break}}r&&s(u+131072);for(var E=(1<>>4;if((l+=15&P)>g){i&&Qc(0);break}if(P||Qc(2),R<256)n[u++]=R;else{if(256==R){F=l,h=null;break}var O=R-254;if(R>264){var G=Tc[C=R-257];O=Yc(t,l,(1<>>4;if(j||Qc(3),l+=15&j,B=Fc[z],z>3&&(G=Mc[z],B+=Uc(t,l)&(1<g){i&&Qc(0);break}r&&s(u+131072);for(var W=u+O;u>3&1)+(n>>4&1);o>0;o-=!t[e++]);return e+(2&n)}(t),-8),n||new kc((o=(e=t).length,(e[o-4]|e[o-3]<<8|e[o-2]<<16|e[o-1]<<24)>>>0)));var e,o}function tl(t,n){return Jc(((8!=(15&(e=t)[0])||e[0]>>>4>7||(e[0]<<8|e[1])%31)&&Qc(6,"invalid zlib data"),32&e[1]&&Qc(6,"invalid zlib data: preset dictionaries not supported"),t.subarray(2,-4)),n);var e}function nl(t,n){return 31==t[0]&&139==t[1]&&8==t[2]?Zc(t,n):8!=(15&t[0])||t[0]>>4>7||(t[0]<<8|t[1])%31?function(t,n){return Jc(t,n)}(t,n):tl(t,n)}var el="undefined"!=typeof TextDecoder&&new TextDecoder;try{el.decode(Kc,{stream:!0})}catch(t){}function ol(t,n){if(n){for(var e="",o=0;o127)+(o>223)+(o>239);if(e+r>t.length)return[n,Xc(t,e-1)];r?3==r?(o=((15&o)<<18|(63&t[e++])<<12|(63&t[e++])<<6|63&t[e++])-65536,n+=String.fromCharCode(55296|o>>10,56320|1023&o)):n+=1&r?String.fromCharCode((31&o)<<6|63&t[e++]):String.fromCharCode((15&o)<<12|(63&t[e++])<<6|63&t[e++]):n+=String.fromCharCode(o)}}(t),i=r[0];return r[1].length&&Qc(8),i}function rl(t){return Math.round(performance.now()-t)}function il(t){t.time={rg:{t0:performance.now()}},"_didRelatedGenesFirstPlot"in t&&delete t._didRelatedGenesFirstPlot}function al(){const t=this.annotDescriptions.annots,n=Object.values(t).slice(),e=n.filter((t=>t.type&&t.type.includes("paralogous"))),o=n.filter((t=>t.type&&t.type.includes("interacting gene")));return{related:n,paralogous:e,interacting:o,searched:Object.entries(t).filter((t=>t[1].type&&t[1].type.includes("searched gene")))[0][0]}}function sl(t){const n=this,e=performance.now()-n.time.prevTooltipOff,o=n.time.prevTooltipAnnotDomId;if(e<300&&t.domId===o)return null;const r=t.name,i=n.annotDescriptions.annots[t.name].type.split(" ")[0],a=cl(n);return Object.assign({tooltipGene:r,tooltipRelatedType:i},a)}function cl(t){const n=t.getRelatedGenesByType();return{numRelatedGenes:n.related.length,numParalogs:n.paralogous.length,numInteractingGenes:n.interacting.length,searchedGene:n.searched}}let ll,ul,hl;function fl(t,n){const e="WBGene"===t?8:11;return t+n.padStart(e,"0")}async function dl(t){const n=t.replace(".gz","");if(void 0===await Ideogram.cache.match(n)){const e=await fetch(t),o=await e.blob(),r=ol(nl(new Uint8Array(await o.arrayBuffer()))),i=new Response(new Blob([r],{type:"text/tab-separated-values"}),e.init);return await Ideogram.cache.put(n,i),await Ideogram.cache.match(n)}return await Ideogram.cache.match(n)}async function ml(t,n,e=null){const o=performance.now();if(ll={},!function(t){const n=function(t){const n=Fr(t);return Sr[n]||{}}(t);return n.hasGeneCache&&!0===n.hasGeneCache}(t))return;if(Ideogram.geneCache&&Ideogram.geneCache[t])return void(n.geneCache=Ideogram.geneCache[t]);Ideogram.geneCache||(Ideogram.geneCache={}),Ideogram.cache=await caches.open("ideogram-1.37.0");const r=function(t,n){const e=jr(t);return n||(n=Mr("cache/")),n+e+"-genes.tsv.gz"}(t,e),i=performance.now(),a=await dl(r),s=await a.text(),c=performance.now();ll.fetch=Math.round(c-i);const[l,u,h,f,d,m,g,p,y]=function(t,n){const e=[],o={},r={},i={},a={},s={},c={},l={},u=[];let h,f=performance.now();const d=t.split(/\r\n|\n/);ll.rawTsvSplit=Math.round(performance.now()-f),f=performance.now();for(let t=0;t{e[t]={chr:t,annots:n.annots.sort(((t,n)=>t.start-n.start))}})),e}(u);return ll.parseAnnots=Math.round(performance.now()-m),[e,o,r,i,a,s,c,l,g]}(s);ll.parseCache=Math.round(performance.now()-c),n.geneCache={interestingNames:l,nameCaseMap:u,namesById:h,fullNamesById:f,idsByName:d,idsByFullName:m,lociByName:g,lociById:p,sortedAnnots:y},Ideogram.geneCache[t]=n.geneCache,n.config.debug&&(ll.total=Math.round(performance.now()-o),console.log("perfTimes in initGeneCache:",ll))}function gl(t,n){const e="WBGene"===t?8:11;return t+n.padStart(e,"0")}async function pl(t,n,e=null){const o=performance.now();if(ul={},!function(t){const n=function(t){const n=Fr(t);return Sr[n]||{}}(t);return n.hasParalogCache&&!0===n.hasParalogCache}(t))return;if(Ideogram.paralogCache&&Ideogram.paralogCache[t])return void(n.paralogCache=Ideogram.paralogCache[t]);Ideogram.paralogCache||(Ideogram.paralogCache={}),Ideogram.cache=await caches.open("ideogram-1.37.0");const r=function(t,n){const e=jr(t);return n?n+="paralogs/":n=Mr("cache/paralogs/"),n+e+"-paralogs.tsv.gz"}(t,e),i=performance.now(),a=await dl(r),s=await a.text(),c=performance.now();ul.fetch=Math.round(c-i);const l=function(t){const n={};let e,o=performance.now();const r=t.split(/\r\n|\n/);ul.rawTsvSplit=Math.round(performance.now()-o),o=performance.now();for(let t=0;tt.length>0&&"ixnType"in t[0]))[0].ixnType.toLowerCase()}function wl(t,n){const e=Array.from(t.querySelectorAll(`DataNode[TextLabel="${n}"]`)).map((t=>({type:"node",matchedLabel:n,textLabel:t.getAttribute("TextLabel"),graphId:t.getAttribute("GraphId"),groupRef:t.getAttribute("GroupRef")}))),o=e.map((t=>t.graphId)),r=e.map((t=>t.groupRef)).map((t=>`Group[GroupId="${t}"]`)).join(",");let i=[];if(""!==r){const e=t.querySelectorAll(r);i=Array.from(e).map((t=>({type:"group",matchedLabel:n,graphId:t.getAttribute("GraphId"),groupId:t.getAttribute("GroupId")})))}const a=i.map((t=>t.graphId));return[o.concat(a),e.concat(i)]}function xl(t){const n=t.name,e=t.genomic_pos.ensemblgene;let o=e;return void 0===e&&(o=t.genomic_pos.filter((t=>!t.chr.includes("_")))[0].ensemblgene),{name:n,ensemblId:o}}function _l(t,n){const e=n.organismScientificName;throw Error(`"${t}" is not a known gene in ${e}`)}async function Al(t,n,e){let o;"string"==typeof t&&(t=[t]);const r=`?q=${t.map((t=>`${n}:${t.trim()}`)).join(" OR ")}&species=${e.config.taxid}&fields=`;if(e.geneCache){const r=function(t,n,e){const o=e.geneCache,r="symbol"===n,i=r?o.lociByName:o.lociById,a=r?o.idsByName:o.namesById;return t.map((t=>{const n=t.toLowerCase();if(!i[t]&&!o.nameCaseMap[n]){if(!r)return;_l(t,e)}r&&!i[t]&&o.nameCaseMap[n]&&(t=o.nameCaseMap[n]);const s=i[t],c=r?t:a[t],l=r?a[t]:t;return{symbol:c,name:o.fullNamesById[l],source:"cache",genomic_pos:{chr:s[0],start:s[1],end:s[2],ensemblgene:l}}})).filter((t=>void 0!==t))}(t,n,e);r.forEach((t=>{const n=t.symbol,o=t.name;n in e.annotDescriptions.annots?e.annotDescriptions.annots[n].name=o:e.annotDescriptions.annots[n]={name:o}})),o={hits:r,fromGeneCache:!0}}else{const t=`${r}symbol,genomic_pos,name`;o=await async function(t){const n=await fetch("https://mygene.info/v3/query"+t+"&size=400");return await n.json()}(t)}return o}async function Cl(t,n,e){const o=[],r=Object.keys(t);return 0===r.length||((await Al(r,"symbol",e)).hits.forEach((r=>{if("genomic_pos"in r==0||r.symbol===n.name)return;const i=Sl(r,e,"purple");o.push(i);const a=t[r.symbol.toLowerCase()],s=function(t,n,e){const o=[],r=[];let i="";if(void 0!==n){const t=n.map((t=>{const n=`https://www.wikipathways.org/index.php/Pathway:${t.pathwayId}`;return o.push(t.pathwayId),r.push(t.name),`${t.name}`})).join("
    ");i=`Interacts with ${e.name} in:
    ${t}`}const{name:a,ensemblId:s}=xl(t);return{description:i,ixnsDescription:i,ensemblId:s,name:a,type:"interacting gene",pathwayIds:o,pathwayNames:r}}(r,a,n);Nl(i,s,e)})),function(t){const n={};Object.entries(t.annotDescriptions.annots).forEach((([t,e])=>{"type"in e&&e.type.includes("interacting gene")&&(n[t]=e.pathwayIds)}));const e={};Object.entries(n).forEach((([t,n])=>{e[t]={},n.map((async n=>{const o=await async function(t){const n=`https://cdn.jsdelivr.net/npm/ixn2/${t}.xml.gz`,e=await fetch(n),o=await e.blob(),r=ol(nl(new Uint8Array(await o.arrayBuffer())));return(new DOMParser).parseFromString(r,"text/xml")}(n);e[t][n]=o}))})),t.gpmlsByInteractingGene=e}(e)),o}function kl(t,n){let e=null;return e=Array.isArray(t.genomic_pos)?t.genomic_pos.filter((t=>t.chr in n.chromosomes[n.config.taxid]))[0]:t.genomic_pos,e}function Sl(t,n,e="red"){const o=kl(t,n);return{name:t.symbol,chr:o.chr,start:o.start,stop:o.end,id:o.ensemblgene,color:e}}function Ll(){const t=document.querySelector("#_ideogramInnerWrap"),n=`position: absolute; top: 15px; left: ${Wl({}).legendPad+20}px`,e=document.querySelector("#_ideogramLegend");t.prepend(e),e.style=n}function Tl(t,n){return new Promise((async e=>{const o=performance.now(),r=await async function(t,n){const e={},o={},r=n.config.organism.replace(/-/g," "),i=t.name.toUpperCase();let a={result:[]};if(n.interactionCache)i in n.interactionCache&&(a=n.interactionCache[i]);else{const t=`https://cdn.jsdelivr.net/npm/ixn2/${i}.json.gz`,n=await fetch(t);if(n.ok){const t=await n.blob(),e=new Uint8Array(await t.arrayBuffer());a=JSON.parse(ol(nl(e)))}}return a.result.forEach((i=>{if(i.species.toLowerCase()===r){const r=i.fields.right.values,a=i.fields.left.values,s=r.concat(a),c=i.name,l=i.id,u=function(t,n){return n&&(t=Ea(t,n)),t.sort(((t,n)=>t.rank-n.rank))}(s.map((t=>({name:t,color:""}))),n).map((t=>t.name));u.forEach((r=>{const i=r.toLowerCase();if(i.includes(t.name.toLowerCase()))return;const a=c+l,s=function(t,n,e,o,r){let i;return i="geneCache"in r&&n.name?t.toLowerCase()in r.geneCache.nameCaseMap:function(t,n){return""!==t&&!t.includes(" ")&&!t.includes("/")&&t.toLowerCase()!==n.name.toLowerCase()}(t,n),i&&!(e in o)}(i,t,a,o,n);if(s){o[a]=1;const t={name:c,pathwayId:l};i in e?e[i].push(t):e[i]=[t]}}))}})),e}(t,n),i=await Cl(r,t,n);n.relatedAnnots.push(...i),Bl("interacting",n),n.time.rg.interactions=rl(o),e()}))}function Ml(t,n){return new Promise((async e=>{const o=performance.now(),r=await async function(t,n){const e=n.config.taxid;let o;if(n.paralogCache){const e=n.paralogCache.paralogsByName,r=t.name.toUpperCase();o=r in e?e[r]:[]}else{const n=`&format=condensed&type=paralogues&target_taxon=${e}`,r=`/homology/id/${t.id}?${n}`;o=(await Ideogram.fetchEnsembl(r)).data[0].homologies}let r=await async function(t,n,e){const o=[],r=t.length&&"string"==typeof t[0]?t:t.map((t=>t.id));return(await Al(r,"ensemblgene",e)).hits.forEach((t=>{if("genomic_pos"in t==0)return;if("name"in t==0)return;const r=Sl(t,e,"pink");o.push(r);const i=`Paralog of ${n.name}`,{name:a,ensemblId:s}=xl(t);Nl(r,{description:i,ensemblId:s,name:a,type:"paralogous gene"},e)})),o}(o,t,n);return r=r.filter((t=>!t.name.match(/^AC[0-9.]+$/))),r}(t,n);n.relatedAnnots.push(...r),Bl("paralogous",n),function(t,n){if(!n.config.showParalogNeighborhoods)return;if(t.length<2)return;const e={};e[t[0].chr]={},e[t[0].chr][t[0].start]=[t[0]];for(let n=1;n{const a=parseInt(Object.keys(e)[0]);let s=Object.values(e)[0];if(s.length<2)return{paralogs:s};const c=`${s.length} nearby paralogs of ${r}`,l=n.chromosomes[n.config.taxid][t].bpLength;let u=a-75e5,h=a+75e5;h>l?(u=a-o,h=l):u<1&&(u=1,h=o),"geneCache"in n&&(s=s.map((t=>(t.fullName=n.geneCache.fullNamesById[t.id],t))));const f={name:"paralogNeighborhood-"+i,chr:t,start:u,stop:h,color:"pink",description:c,paralogs:s,type:"paralog neighborhood",displayCoordinates:`chr${t}:${a.toLocaleString()} ± 2 Mbp`};return n.annotDescriptions.annots[f.name]=f,f})).filter((t=>t.paralogs.length>1));i.length>0&&(n.drawAnnots(i,"overlay",!0,!0),Ll())}(r,n),n.time.rg.paralogs=rl(o),e()}))}function Pl(t,n){var e,o,r,i;return"name"in t?(e=t.name,o=n.name,r=t.color,i=n.color):([e,r]=[t[0],t[3]],[o,i]=[n[0],n[3]]),"red"===r?-1:"red"===i?1:"purple"===r&&"pink"===i?-1:"purple"===i&&"pink"===r?1:t.rank-n.rank}function Nl(t,n,e){let o;const r=e.annotDescriptions.annots;if(t.name in r){const e=r[t.name];if(o=n,n.type===e.type)return;Object.keys(e).forEach((function(t){t in o==0&&(o[t]=e[t])})),"type"in e&&(o.type+=", "+e.type,o.description+=`

    ${e.description}`)}else o=n;e.annotDescriptions.annots[t.name]=o}function Il(t){const n={};let e=[];return t.forEach((t=>{t.name in n==0?(e.push(t),n[t.name]=1):"purple"===t.color&&(e=e.map((n=>t.name===n.name?t:n)))})),e}function Bl(t,n){!function(t){const n=[],e=t.chromosomesArray.map((t=>t.name)),o={};t.relatedAnnots=t.relatedAnnots.filter((t=>!(t.name in o)&&(o[t.name]=1,!0)));const r={};t.relatedAnnots.forEach((t=>{t.chr in r?r[t.chr].push(t):r[t.chr]=[t]}));const i={};Object.entries(r).map((([n,e])=>{(e=Ea(e,t)).sort(((n,e)=>-t.annotSortFunction(n,e)));const o=e.map((t=>t.name));i[n]=o})),t.relatedAnnots.forEach((t=>{const o=t.chr,r=e.indexOf(o),a=i[o].indexOf(t.name);t.domId=Aa(r,a),n.push(t)})),t.relatedAnnots=n}(n);let e=$r(n.relatedAnnots);e=function(t,n){if("all"===n.config.annotsInList)return t;const e=[];return t.forEach((t=>{n.config.annotsInList.includes(t.name.toLowerCase())&&e.push(t)})),e}(e,n),e=Il(e),n.relatedAnnots=Il(e),n.relatedAnnots.sort(n.annotSortFunction),e.length>1&&n.onFindRelatedGenesCallback&&n.onFindRelatedGenesCallback(),n.drawAnnots(e),n.config.showAnnotLabels&&n.fillAnnotLabels(n.relatedAnnots),Ll(),function(t,n){if("pathway"===t)return;const e=n.getRelatedGenesByType(),o={paralogous:"interacting",interacting:"paralogous"}[t],r=e[t].length,i=e[o]?e[o].length:0;if(n._didRelatedGenesFirstPlot)if(r>0&&i>0){const t=n.time.rg.timestampFirstPlot;n.time.rg.totalLastPlotDiff=rl(t)}else r>0&&0===i?(n.time.rg.timestampFirstPlot=performance.now(),n.time.rg.totalFirstPlot=rl(n.time.rg.t0),n._relatedGenesFirstPlotType=t,n.time.rg.totalLastPlotDiff=0):(0===r&&i>0||(n._relatedGenesFirstPlotType="searched"),n.time.rg.totalLastPlotDiff=0);else n._didRelatedGenesFirstPlot=!0,n.time.rg.totalFirstPlot=rl(n.time.rg.t0),r>0&&(n.time.rg.timestampFirstPlot=performance.now(),n._relatedGenesFirstPlotType=t)}(t,n)}function El(t){var n=document.querySelector(t.config.container);n.style.visibility="",n.style.position="absolute",n.style.width="100%";var e=document.querySelector("#_ideogramInnerWrap");e.style.position="relative",e.style.marginLeft="auto",e.style.marginRight="auto",e.style.overflowY="hidden",document.querySelector("#_ideogramMiddleWrap").style.overflowY="hidden";const o=t.config.legendPad;if(void 0===t.didAdjustIdeogramLegend){var r=document.querySelector("#_ideogram");const n=160;e.style.maxWidth=parseInt(e.style.maxWidth)+n+o+"px",r.style.minWidth=parseInt(r.style.minWidth)+o+"px",r.style.maxWidth=parseInt(r.style.minWidth)+o+"px",r.style.position="relative",r.style.left=n+"px",t.didAdjustIdeogramLegend=!0}}async function Dl(t=null){const n=this;n.clearAnnotLabels();const e=document.querySelector("#_ideogramLegend");if(e&&e.remove(),!t)return Hl();n.config=Wl(n.config),function(t,n){const e=[`# ${n}`,`# Organism: ${t.getScientificName(t.config.taxid)}`,`# Generated by Ideogram.js version ${Ideogram.version}, https://github.com/eweitz/ideogram`,`# Generated at ${window.location.href}`].join("\n");delete t.annotDescriptions,t.annotDescriptions={headers:e,annots:{}}}(n,`Related genes for ${t}`);const o=n.selector+" .annot";document.querySelectorAll(o).forEach((t=>t.remove())),n.startHideAnnotTooltipTimeout(),document.querySelectorAll(".chromosome").forEach((t=>{t.style.cursor=""})),El(n),n.relatedAnnots=[];const r=await async function(t,n){const e=performance.now(),o=await Al(t,"symbol",n);if(0===o.hits.length)return;const r=o.hits.find((t=>{const e=kl(t,n);return e&&e.ensemblgene}));let i={description:"",ensemblId:r.genomic_pos.ensemblgene,type:"searched gene"};if(r.symbol in n.annotDescriptions.annots){const t=n.annotDescriptions.annots[r.symbol];i=Object.assign(t,i)}else i.name=r.name;n.annotDescriptions.annots[r.symbol]=i;const a=Sl(r,n);return n.relatedAnnots.push(a),n.time.rg.searchedGene=rl(e),a}(t,n);void 0===r&&_l(t,n),n.config.legend=jl,aa(n),Ll(),await Promise.all([Tl(r,n),Ml(r,n)]),n.time.rg.total=rl(n.time.rg.t0),function(t){const n=cl(t),e=t.time.rg.total,o=t.time.rg.totalFirstPlot,r=t.time.rg.totalLastPlotDiff,i=t.time.rg.paralogs,a=t.time.rg.interactions,s=t.time.rg.searchedGene,c=t._relatedGenesFirstPlotType,l=Object.assign({firstPlotType:c,timeTotal:e,timeTotalFirstPlot:o,timeTotalLastPlotDiff:r,timeSearchedGene:s,timeInteractingGenes:a,timeParalogs:i},n);t.relatedGenesAnalytics=l}(n),n.onPlotRelatedGenesCallback&&n.onPlotRelatedGenesCallback()}function Fl(t){return Object.entries(t.annotDescriptions.annots).find((([t,n])=>"searched gene"===n.type))[0]}function Rl(t){var n;const e=this;if(t.name===(null===(n=e.prevClickedAnnot)||void 0===n?void 0:n.name)&&e.isTooltipCooling)return null;const o=e.annotDescriptions.annots[t.name];if("type"in o&&o.type.includes("interacting gene")){const n=o.pathwayIds,r=Fl(e),i=e.gpmlsByInteractingGene[t.name],a=function(t,n,e,o){let r=null;const i=function(t,n,e,o){const r={};return e.map((e=>{const i=o[e],a=function(t,n,e){const[o,r]=wl(e,n),[i,a]=wl(e,t),s={searchedGene:r,interactingGene:a},c=o.concat(i),l={searchedGeneGraphIds:o,matchingGraphIds:c},u=[],h=e.querySelectorAll("Interaction Graphics");return Array.from(h).forEach((t=>{const n=function(t,n){let e=null;const{searchedGeneGraphIds:o,matchingGraphIds:r}=n,i=[];let a=0,s=!1,c=null,l=null;return Array.from(t.children).forEach((t=>{if("Point"!==t.nodeName)return;const n=t,e=n.getAttribute("GraphRef");if(null!==e&&r.includes(e)&&(a+=1,i.push(e),o.includes(e)&&(s=!0),n.getAttribute("ArrowHead"))){const t=n.getAttribute("ArrowHead"),r=o.includes(e);null===l&&(l=r?0:1),c=vl[t][r?0:1]}})),a>=2&&s&&(null===l&&(c="interacts with"),c=c[0].toUpperCase()+c.slice(1),e={interactionId:t.parentNode.getAttribute("GraphId"),endIds:i,ixnType:c}),e}(t,l);null!==n&&(n.elements=s,u.push(n))})),u}(t,n,i);r[e]=a})),r}(t,n,e,o),a=i[e[0]];if(a.length>0){let t={ixnsByPwid:i,isSameByPwid:{},isSame:null,isDirectionSameByPwid:{},isDirectionSame:null,directionsByPwid:{}};t=function(t){let n=!0;const e=t.ixnsByPwid,o=bl(e);return Object.entries(e).map((([e,r])=>{const{isRefMatch:i,thisIsSame:a}=function(t,n){let e=!0,o=!0;if(0===t.length)return{isRefMatch:e,thisIsSame:o};const r=t[0].ixnType.toLowerCase();return t.forEach((t=>{const i=t.ixnType.toLowerCase();i!==n&&(e=!1),i!==r&&(o=!1)})),{isRefMatch:e,thisIsSame:o}}(r,o);a&&i||(n=!1),t.isSameByPwid[e]=a})),t.isSame=n,t}(t),t.isSame?r=a[0].ixnType:(t=function(t){let n=!0;const e=[],o=[];Object.values(vl).forEach((t=>{o.push(t[0]),e.push(t[1])}));const r="Acts on",i="Acted on by",a=t.ixnsByPwid,s=bl(a),c=o.includes(s)?r:i;return Object.entries(a).map((([e,a])=>{let s=!0;if(a.length>0){const l=a[0].ixnType.toLowerCase(),u=o.includes(l)?r:i;a.forEach((a=>{const l=a.ixnType.toLowerCase(),h=o.includes(l)?r:i;t.directionsByPwid[e]=h,h!==c&&(n=!1),h!==u&&(s=!1)}))}t.isDirectionSameByPwid[e]=s})),t.isDirectionSame=n,!0===n&&(t.direction=c),t}(t),r=t.isDirectionSame?t.direction:"Interacts with")}return r}(t.name,r,n,i);if(null!==a){const t="Interacts with";o.description=o.description.replace(t,a)}}const r=o.description.length>0?`
    ${o.description}`:"",i=o.name,a='style="color: #0366d6; cursor: pointer;"';let s=i;"rank"in t&&(s=`${i}`);let c=`${t.name}
    ${s}
    ${r}
    `;if(t.name.includes("paralogNeighborhood")){const n=o.paralogs.sort(((t,n)=>t.rank-n.rank)),e=n.shift();n.push(e),c="Paralog neighborhood

    "+o.description+":
    "+`${n.map((t=>{let n="";return t.fullName&&(n=t.fullName),t.rank&&(n+=` Ranked ${t.rank} in general or scholarly interest`),""!==n&&(n=`title="${n}"`),`${t.name}`})).join("
    ")}
    `,t.displayCoordinates=o.displayCoordinates}return t.displayName=c,function(t){const n=document.querySelector("._ideogramTooltip");t.addedTooltipClickHandler||(n.addEventListener("click",(n=>{let e=document.querySelector("#ideo-related-gene");e||(e=n.target);const o=function(t,n){var e;return n.annots.forEach((n=>{n.annots.forEach((n=>{t===n.name&&(e=n)}))})),null===e&&(e=n.annotDescriptions.annots[t]),e}(e.textContent,t);t.onClickAnnot(o)})),t.addedTooltipClickHandler=!0)}(e),t}const Ol="triangle",Gl="font-size: 14px; font-weight: bold; font-color: #333;",jl=[{name:`\n
    \n
    Related genes
    \n Click gene to search\n
    \n `,nameHeight:50,rows:[{name:"Interacting gene",color:"purple",shape:Ol},{name:"Paralogous gene",color:"pink",shape:Ol},{name:"Searched gene",color:"red",shape:Ol}]}],zl=[{name:`\n
    \n
    Highly cited genes
    \n Click gene to search\n
    \n `,nameHeight:30,rows:[]}];function Wl(t){return t.showAnnotLabels?t.legendPad=70:t.legendPad=30,t}function Hl(){const t=this;if(!t||"annotDescriptions"in t)return;t.annotDescriptions={annots:{}},t.flattenAnnots().map((n=>{let e=[];"significance"in n&&"n/a"!==n.significance&&e.push(n.significance),"citations"in n&&void 0!==n.citations&&e.push(n.citations),e=e.join("

    "),t.annotDescriptions.annots[n.name]={description:e,name:n.fullName}})),El(t),Ll(),t.fillAnnotLabels([]);const n=t.config.container;document.querySelector(n).style.visibility=""}class ql{constructor(t){this.configure=Ur,this.initDrawChromosomes=hi,this.onLoad=di,this.handleRotateOnClick=fi,this.init=wi,this.finishInit=Jr,this.writeContainer=ii,this.onLoadAnnots=Gi,this.onDrawAnnots=ji,this.processAnnotData=Sa,this.restoreDefaultTracks=va,this.updateDisplayedTracks=ba,this.initAnnotSettings=Ma,this.fetchAnnots=Ia,this.drawAnnots=sa,this.getHistogramBars=na,this.drawHeatmaps=Fi,this.deserializeAnnotsForHeatmap=Oi,this.fillAnnots=Ba,this.drawProcessedAnnots=ca,this.drawSynteny=ya,this.startHideAnnotTooltipTimeout=Wi,this.showAnnotTooltip=$i,this.onWillShowAnnotTooltip=Hi,this.onClickAnnot=qi,this.setOriginalTrackIndexes=wa,this.afterRawAnnots=Pa,this.downloadAnnotations=Ta,this.addAnnotLabel=Ji,this.removeAnnotLabel=Zi,this.fillAnnotLabels=Ki,this.clearAnnotLabels=ta,this.flattenAnnots=Na,this.highlight=Da,this.unhighlight=Fa,this.esearch="https://eutils.ncbi.nlm.nih.gov/entrez/eutils/esearch.fcgi?retmode=json&api_key=7e33ac6a08a6955ec3b83d214d22b21a2808",this.esummary="https://eutils.ncbi.nlm.nih.gov/entrez/eutils/esummary.fcgi?retmode=json&api_key=7e33ac6a08a6955ec3b83d214d22b21a2808",this.elink="https://eutils.ncbi.nlm.nih.gov/entrez/eutils/elink.fcgi?retmode=json&api_key=7e33ac6a08a6955ec3b83d214d22b21a2808",this.getOrganismFromEutils=Oa,this.getTaxids=Wa,this.getAssemblyAndChromosomesFromEutils=qa,this.drawBandLabels=Ka,this.getBandColorGradients=ts,this.processBandData=is,this.setBandsToShow=Va,this.hideUnshownBandLabels=$a,this.drawBandLabelText=Qa,this.drawBandLabelStalk=Ja,this.onBrushMove=as,this.onBrushEnd=ss,this.createBrush=cs,this.createClickCursor=us,this.onCursorMove=ls,this.drawSexChromosomes=hs,this.setSexChromosomes=fs,this.convertBpToPx=ds,this.convertPxToBp=gs,this.unpackAnnots=nc,this.packAnnots=ec,this.initCrossFilter=oc,this.filterAnnots=rc,this.assemblyIsAccession=Tr,this.getDataDir=Nr,this.round=Ir,this.onDidRotate=Br,this.getSvg=Er,this.fetch=Dr,this.fetchWithRetry=Pr,this.getTaxid=Rr,this.getCommonName=Or,this.getScientificName=Gr,this.getChromosomeModel=ac,this.getChromosomePixels=ic,this.drawChromosomeLabels=Ac,this.rotateChromosomeLabels=Cc,this.appendHomolog=bc,this.drawChromosome=wc,this.rotateAndToggleDisplay=xc,this.setOverflowScroll=_c,this.plotRelatedGenes=Dl,this.getRelatedGenesByType=al,this.configure(t)}static get version(){return"1.37.0"}static get d3(){return Lr}static async fetchEnsembl(t,n=null,e="GET"){const o={method:e};if(null!==n&&(o.body=JSON.stringify(n)),"GET"===e){const n=t.includes("&")?"&":"?";t+=n+"content-type=application/json"}else o.headers={"Content-Type":"application/json"};const r=await fetch(`https://rest.ensembl.org${t}`,o);return await r.json()}static getChrSortNamesAndTypes(t,n){var e,o,r,i,a,s,c,l,u,h;return"string"==typeof t||"chr"in t&&"annots"in t?(a="MT"===(e="string"==typeof t?t:t.chr),s="MT"===(o="string"==typeof n?n:n.chr),c="AP"===e,l="AP"===o,u=!(r="CP"===e)&&!a&&!c,h=!(i="CP"===o)&&!s&&!l):(e=t.name,o=n.name,r="chloroplast"===t.type,i="chloroplast"===n.type,a="mitochondrion"===t.type,s="mitochondrion"===n.type,c="apicoplast"===t.type,l="apicoplast"===n.type,u="nuclear"===t.type,h="nuclear"===n.type),[e,o,{aIsNuclear:u,bIsNuclear:h,aIsCP:r,bIsCP:i,aIsMT:a,bIsMT:s,aIsAP:c,bIsAP:l}]}static sortChromosomes(t,n){let[e,o,r]=ql.getChrSortNamesAndTypes(t,n);const{aIsNuclear:i,bIsNuclear:a,aIsCP:s,bIsCP:c,aIsMT:l,bIsMT:u,aIsAP:h,bIsAP:f}=r;return i&&a?(zr(e)&&zr(o)&&(e=Wr(e).toString(),o=Wr(o).toString()),e.localeCompare(o,"en",{numeric:!0})):!i&&a||l&&c?1:s&&u?-1:h||l||s||!(u||c||f)?void 0:-1}static initRelatedGenes(t,n="all"){return function(t,n){"all"!==n&&(n=n.map((t=>t.toLowerCase())));const e={showFullyBanded:!1,rotatable:!1,legend:jl,chrBorderColor:"#333",chrLabelColor:"#333",onWillShowAnnotTooltip:Rl,annotsInList:n,showTools:!0,showAnnotLabels:!0,showParalogNeighborhoods:!0,chrFillColor:{centromere:"#DAAAAA"},relatedGenesMode:"related"};if("onWillShowAnnotTooltip"in t){const n="onWillShowAnnotTooltip",o=t[n],r=e[n],i=function(t){return t=r.bind(this)(t),o.bind(this)(t)};e[n]=i,delete t[n]}let o=Object.assign(e,t);o=Wl(o);const r=new Ideogram(o);t.onPlotRelatedGenes&&(r.onPlotRelatedGenesCallback=t.onPlotRelatedGenes),t.onFindRelatedGenes&&(r.onFindRelatedGenesCallback=t.onFindRelatedGenes),r.getTooltipAnalytics=sl,r.annotSortFunction=Pl,il(r);let i=null;return t.cacheDir&&(i=t.cacheDir),ml(r.config.organism,r,i),pl(r.config.organism,r,i),yl(r.config.organism,r,i),r}(t,n)}static initGeneHints(t,n="all"){return function(t,n){delete t.onPlotRelatedGenes,"all"!==n&&(n=n.map((t=>t.toLowerCase())));const e=Mr("cache/homo-sapiens-top-genes.tsv"),o={showFullyBanded:!1,rotatable:!1,legend:zl,chrMargin:-4,chrBorderColor:"#333",chrLabelColor:"#333",onWillShowAnnotTooltip:Rl,annotsInList:n,showTools:!0,showAnnotLabels:!0,showParalogNeighborhoods:!0,onDrawAnnots:Hl,annotationsPath:e,relatedGenesMode:"hints"};if("onWillShowAnnotTooltip"in t){const n="onWillShowAnnotTooltip",e=t[n],r=o[n],i=function(t){return t=r.bind(this)(t),e.bind(this)(t)};o[n]=i,delete t[n]}if("onDrawAnnots"in t){const n="onDrawAnnots",e=t[n],r=o[n],i=function(){r.bind(this)(),e.bind(this)()};o[n]=i,delete t[n]}const r=Object.assign(o,t);r.showAnnotLabels?r.legendPad=80:r.legendPad=30;const i=new Ideogram(r);t.onPlotRelatedGenes&&(i.onPlotRelatedGenesCallback=t.onPlotRelatedGenes),t.onFindRelatedGenes&&(i.onFindRelatedGenesCallback=t.onFindRelatedGenes),i.getTooltipAnalytics=sl,i.annotSortFunction=Pl,il(i);let a=null;return t.cacheDir&&(a=t.cacheDir),ml(i.config.organism,i,a),pl(i.config.organism,i,a),yl(i.config.organism,i,a),i}(t,n)}}window.Ideogram=ql;const $l=ql;return n})()})); //# sourceMappingURL=ideogram.min.js.map \ No newline at end of file diff --git a/dist/js/ideogram.min.js.map b/dist/js/ideogram.min.js.map index f2dfc045..f57983b6 100644 --- a/dist/js/ideogram.min.js.map +++ b/dist/js/ideogram.min.js.map @@ -1 +1 @@ -{"version":3,"file":"ideogram.min.js","mappings":"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","sources":["webpack://ideogram/webpack/universalModuleDefinition","webpack://ideogram/webpack/bootstrap","webpack://ideogram/webpack/runtime/define property getters","webpack://ideogram/webpack/runtime/hasOwnProperty shorthand","webpack://ideogram/webpack/runtime/make namespace object","webpack://ideogram/./node_modules/d3-selection/src/selector.js","webpack://ideogram/./node_modules/d3-selection/src/array.js","webpack://ideogram/./node_modules/d3-selection/src/selectorAll.js","webpack://ideogram/./node_modules/d3-selection/src/matcher.js","webpack://ideogram/./node_modules/d3-selection/src/selection/selectChild.js","webpack://ideogram/./node_modules/d3-selection/src/selection/selectChildren.js","webpack://ideogram/./node_modules/d3-selection/src/selection/sparse.js","webpack://ideogram/./node_modules/d3-selection/src/selection/enter.js","webpack://ideogram/./node_modules/d3-selection/src/constant.js","webpack://ideogram/./node_modules/d3-selection/src/selection/data.js","webpack://ideogram/./node_modules/d3-selection/src/selection/sort.js","webpack://ideogram/./node_modules/d3-selection/src/namespaces.js","webpack://ideogram/./node_modules/d3-selection/src/namespace.js","webpack://ideogram/./node_modules/d3-selection/src/selection/attr.js","webpack://ideogram/./node_modules/d3-selection/src/window.js","webpack://ideogram/./node_modules/d3-selection/src/selection/style.js","webpack://ideogram/./node_modules/d3-selection/src/selection/property.js","webpack://ideogram/./node_modules/d3-selection/src/selection/classed.js","webpack://ideogram/./node_modules/d3-selection/src/selection/text.js","webpack://ideogram/./node_modules/d3-selection/src/selection/html.js","webpack://ideogram/./node_modules/d3-selection/src/selection/raise.js","webpack://ideogram/./node_modules/d3-selection/src/selection/lower.js","webpack://ideogram/./node_modules/d3-selection/src/creator.js","webpack://ideogram/./node_modules/d3-selection/src/selection/insert.js","webpack://ideogram/./node_modules/d3-selection/src/selection/remove.js","webpack://ideogram/./node_modules/d3-selection/src/selection/clone.js","webpack://ideogram/./node_modules/d3-selection/src/selection/on.js","webpack://ideogram/./node_modules/d3-selection/src/selection/dispatch.js","webpack://ideogram/./node_modules/d3-selection/src/selection/index.js","webpack://ideogram/./node_modules/d3-selection/src/selection/select.js","webpack://ideogram/./node_modules/d3-selection/src/selection/selectAll.js","webpack://ideogram/./node_modules/d3-selection/src/selection/filter.js","webpack://ideogram/./node_modules/d3-selection/src/selection/exit.js","webpack://ideogram/./node_modules/d3-selection/src/selection/join.js","webpack://ideogram/./node_modules/d3-selection/src/selection/merge.js","webpack://ideogram/./node_modules/d3-selection/src/selection/order.js","webpack://ideogram/./node_modules/d3-selection/src/selection/call.js","webpack://ideogram/./node_modules/d3-selection/src/selection/nodes.js","webpack://ideogram/./node_modules/d3-selection/src/selection/node.js","webpack://ideogram/./node_modules/d3-selection/src/selection/size.js","webpack://ideogram/./node_modules/d3-selection/src/selection/empty.js","webpack://ideogram/./node_modules/d3-selection/src/selection/each.js","webpack://ideogram/./node_modules/d3-selection/src/selection/append.js","webpack://ideogram/./node_modules/d3-selection/src/selection/datum.js","webpack://ideogram/./node_modules/d3-selection/src/selection/iterator.js","webpack://ideogram/./node_modules/d3-selection/src/select.js","webpack://ideogram/./node_modules/d3-fetch/src/blob.js","webpack://ideogram/./node_modules/d3-fetch/src/buffer.js","webpack://ideogram/./node_modules/d3-dsv/src/dsv.js","webpack://ideogram/./node_modules/d3-dsv/src/csv.js","webpack://ideogram/./node_modules/d3-dsv/src/tsv.js","webpack://ideogram/./node_modules/d3-fetch/src/text.js","webpack://ideogram/./node_modules/d3-fetch/src/dsv.js","webpack://ideogram/./node_modules/d3-fetch/src/image.js","webpack://ideogram/./node_modules/d3-fetch/src/json.js","webpack://ideogram/./node_modules/d3-fetch/src/xml.js","webpack://ideogram/./node_modules/d3-dispatch/src/dispatch.js","webpack://ideogram/./node_modules/d3-drag/src/noevent.js","webpack://ideogram/./node_modules/d3-drag/src/nodrag.js","webpack://ideogram/./node_modules/d3-color/src/define.js","webpack://ideogram/./node_modules/d3-color/src/color.js","webpack://ideogram/./node_modules/d3-interpolate/src/basis.js","webpack://ideogram/./node_modules/d3-interpolate/src/constant.js","webpack://ideogram/./node_modules/d3-interpolate/src/color.js","webpack://ideogram/./node_modules/d3-interpolate/src/rgb.js","webpack://ideogram/./node_modules/d3-interpolate/src/array.js","webpack://ideogram/./node_modules/d3-interpolate/src/date.js","webpack://ideogram/./node_modules/d3-interpolate/src/number.js","webpack://ideogram/./node_modules/d3-interpolate/src/object.js","webpack://ideogram/./node_modules/d3-interpolate/src/basisClosed.js","webpack://ideogram/./node_modules/d3-interpolate/src/string.js","webpack://ideogram/./node_modules/d3-interpolate/src/numberArray.js","webpack://ideogram/./node_modules/d3-interpolate/src/value.js","webpack://ideogram/./node_modules/d3-selection/src/pointer.js","webpack://ideogram/./node_modules/d3-selection/src/sourceEvent.js","webpack://ideogram/./node_modules/d3-timer/src/timer.js","webpack://ideogram/./node_modules/d3-timer/src/timeout.js","webpack://ideogram/./node_modules/d3-transition/src/transition/schedule.js","webpack://ideogram/./node_modules/d3-transition/src/interrupt.js","webpack://ideogram/./node_modules/d3-interpolate/src/transform/decompose.js","webpack://ideogram/./node_modules/d3-interpolate/src/transform/parse.js","webpack://ideogram/./node_modules/d3-interpolate/src/transform/index.js","webpack://ideogram/./node_modules/d3-transition/src/transition/tween.js","webpack://ideogram/./node_modules/d3-transition/src/transition/interpolate.js","webpack://ideogram/./node_modules/d3-transition/src/transition/attr.js","webpack://ideogram/./node_modules/d3-transition/src/transition/attrTween.js","webpack://ideogram/./node_modules/d3-transition/src/transition/delay.js","webpack://ideogram/./node_modules/d3-transition/src/transition/duration.js","webpack://ideogram/./node_modules/d3-transition/src/transition/ease.js","webpack://ideogram/./node_modules/d3-transition/src/transition/on.js","webpack://ideogram/./node_modules/d3-transition/src/transition/selection.js","webpack://ideogram/./node_modules/d3-transition/src/transition/style.js","webpack://ideogram/./node_modules/d3-transition/src/transition/styleTween.js","webpack://ideogram/./node_modules/d3-transition/src/transition/textTween.js","webpack://ideogram/./node_modules/d3-transition/src/transition/index.js","webpack://ideogram/./node_modules/d3-transition/src/transition/select.js","webpack://ideogram/./node_modules/d3-transition/src/transition/selectAll.js","webpack://ideogram/./node_modules/d3-transition/src/transition/filter.js","webpack://ideogram/./node_modules/d3-transition/src/transition/merge.js","webpack://ideogram/./node_modules/d3-transition/src/transition/transition.js","webpack://ideogram/./node_modules/d3-transition/src/transition/text.js","webpack://ideogram/./node_modules/d3-transition/src/transition/remove.js","webpack://ideogram/./node_modules/d3-transition/src/transition/easeVarying.js","webpack://ideogram/./node_modules/d3-transition/src/transition/end.js","webpack://ideogram/./node_modules/d3-transition/src/selection/transition.js","webpack://ideogram/./node_modules/d3-ease/src/cubic.js","webpack://ideogram/./node_modules/d3-transition/src/selection/index.js","webpack://ideogram/./node_modules/d3-transition/src/selection/interrupt.js","webpack://ideogram/./node_modules/d3-brush/src/constant.js","webpack://ideogram/./node_modules/d3-brush/src/event.js","webpack://ideogram/./node_modules/d3-brush/src/noevent.js","webpack://ideogram/./node_modules/d3-brush/src/brush.js","webpack://ideogram/./node_modules/d3-format/src/formatDecimal.js","webpack://ideogram/./node_modules/d3-format/src/exponent.js","webpack://ideogram/./node_modules/d3-format/src/formatSpecifier.js","webpack://ideogram/./node_modules/d3-format/src/formatPrefixAuto.js","webpack://ideogram/./node_modules/d3-format/src/formatRounded.js","webpack://ideogram/./node_modules/d3-format/src/formatTypes.js","webpack://ideogram/./node_modules/d3-format/src/identity.js","webpack://ideogram/./node_modules/d3-format/src/locale.js","webpack://ideogram/./node_modules/d3-format/src/defaultLocale.js","webpack://ideogram/./node_modules/d3-format/src/formatGroup.js","webpack://ideogram/./node_modules/d3-format/src/formatNumerals.js","webpack://ideogram/./node_modules/d3-format/src/formatTrim.js","webpack://ideogram/./node_modules/d3-format/src/precisionFixed.js","webpack://ideogram/./node_modules/d3-format/src/precisionPrefix.js","webpack://ideogram/./node_modules/d3-format/src/precisionRound.js","webpack://ideogram/./node_modules/d3-array/src/ticks.js","webpack://ideogram/./node_modules/d3-array/src/ascending.js","webpack://ideogram/./node_modules/d3-array/src/bisector.js","webpack://ideogram/./node_modules/d3-array/src/bisect.js","webpack://ideogram/./node_modules/d3-array/src/number.js","webpack://ideogram/./node_modules/d3-interpolate/src/round.js","webpack://ideogram/./node_modules/d3-scale/src/number.js","webpack://ideogram/./node_modules/d3-scale/src/continuous.js","webpack://ideogram/./node_modules/d3-scale/src/constant.js","webpack://ideogram/./node_modules/d3-scale/src/init.js","webpack://ideogram/./node_modules/d3-scale/src/linear.js","webpack://ideogram/./node_modules/d3-scale/src/tickFormat.js","webpack://ideogram/./src/js/init/organism-metadata.js","webpack://ideogram/./src/js/bands/styles.js","webpack://ideogram/./src/js/lib.js","webpack://ideogram/./node_modules/d3-selection/src/selectAll.js","webpack://ideogram/./node_modules/d3-array/src/max.js","webpack://ideogram/./src/js/init/configure.js","webpack://ideogram/./src/js/collinear-vertical.js","webpack://ideogram/./src/js/collinear.js","webpack://ideogram/./src/js/init/finish-init.js","webpack://ideogram/./src/js/ploidy.js","webpack://ideogram/./src/js/views/chromosome-util.js","webpack://ideogram/./src/js/layouts/layout.js","webpack://ideogram/./src/js/layouts/vertical-layout.js","webpack://ideogram/./src/js/layouts/horizontal-layout.js","webpack://ideogram/./src/js/layouts/paired-layout.js","webpack://ideogram/./src/js/layouts/small-layout.js","webpack://ideogram/./src/js/init/write-container.js","webpack://ideogram/./src/js/layouts/layout-adapter.js","webpack://ideogram/./src/js/bands/fetch.js","webpack://ideogram/./src/js/init/init.js","webpack://ideogram/./src/js/parsers/bed-parser.js","webpack://ideogram/./src/js/parsers/tsv-parser.js","webpack://ideogram/./src/js/annotations/heatmap-lib.js","webpack://ideogram/./src/js/annotations/heatmap-collinear.js","webpack://ideogram/./src/js/annotations/heatmap-2d.js","webpack://ideogram/./src/js/annotations/track-labels.js","webpack://ideogram/./src/js/annotations/heatmap.js","webpack://ideogram/./src/js/annotations/track-labels-collinear.js","webpack://ideogram/./src/js/annotations/events.js","webpack://ideogram/./src/js/annotations/labels.js","webpack://ideogram/./src/js/annotations/histogram.js","webpack://ideogram/./src/js/annotations/legend.js","webpack://ideogram/./src/js/annotations/draw.js","webpack://ideogram/./src/js/annotations/synteny-lib.js","webpack://ideogram/./src/js/annotations/synteny-collinear.js","webpack://ideogram/./src/js/annotations/synteny-collinear-horizontal.js","webpack://ideogram/./src/js/annotations/synteny.js","webpack://ideogram/./src/js/annotations/filter.js","webpack://ideogram/./src/js/annotations/process.js","webpack://ideogram/./src/js/parsers/expression-matrix-parser.js","webpack://ideogram/./src/js/annotations/download.js","webpack://ideogram/./src/js/annotations/annotations.js","webpack://ideogram/./src/js/annotations/highlight.js","webpack://ideogram/./src/js/services/organisms.js","webpack://ideogram/./src/js/services/services.js","webpack://ideogram/./src/js/services/eutils-config.js","webpack://ideogram/./src/js/bands/show.js","webpack://ideogram/./src/js/bands/draw.js","webpack://ideogram/./src/js/bands/parse.js","webpack://ideogram/./src/js/bands/bands.js","webpack://ideogram/./src/js/brush.js","webpack://ideogram/./src/js/cursor.js","webpack://ideogram/./src/js/sex-chromosomes.js","webpack://ideogram/./src/js/coordinate-converters.js","webpack://ideogram/./node_modules/crossfilter2/src/array.js","webpack://ideogram/./node_modules/crossfilter2/src/filter.js","webpack://ideogram/./node_modules/crossfilter2/src/identity.js","webpack://ideogram/./node_modules/crossfilter2/src/null.js","webpack://ideogram/./node_modules/crossfilter2/src/zero.js","webpack://ideogram/./node_modules/crossfilter2/src/heap.js","webpack://ideogram/./node_modules/crossfilter2/src/heapselect.js","webpack://ideogram/./node_modules/crossfilter2/src/bisect.js","webpack://ideogram/./node_modules/crossfilter2/src/permute.js","webpack://ideogram/./node_modules/crossfilter2/src/reduce.js","webpack://ideogram/./node_modules/crossfilter2/src/result.js","webpack://ideogram/./node_modules/@ranfdev/deepobj/dist/deepobj.m.js","webpack://ideogram/./node_modules/crossfilter2/src/index.js","webpack://ideogram/./src/js/filter.js","webpack://ideogram/./src/js/views/chromosome-model.js","webpack://ideogram/./src/js/tools/tools.js","webpack://ideogram/./src/js/model-adapter.js","webpack://ideogram/./src/js/color.js","webpack://ideogram/./src/js/range.js","webpack://ideogram/./src/js/views/chromosome.js","webpack://ideogram/./src/js/views/draw-chromosomes.js","webpack://ideogram/./src/js/views/chromosome-labels.js","webpack://ideogram/./node_modules/fflate/esm/browser.js","webpack://ideogram/./src/js/kit/analyze-related-genes.js","webpack://ideogram/./src/js/gene-cache.js","webpack://ideogram/./src/js/paralog-cache.js","webpack://ideogram/./src/js/interaction-cache.js","webpack://ideogram/./src/js/kit/wikipathways.js","webpack://ideogram/./src/js/kit/related-genes.js","webpack://ideogram/./src/js/ideogram.js","webpack://ideogram/./src/js/version.js","webpack://ideogram/./src/js/index.js"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse {\n\t\tvar a = factory();\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(self, function() {\nreturn ","// The require scope\nvar __webpack_require__ = {};\n\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__.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};","function none() {}\n\nexport default function(selector) {\n return selector == null ? none : function() {\n return this.querySelector(selector);\n };\n}\n","export default function(x) {\n return typeof x === \"object\" && \"length\" in x\n ? x // Array, TypedArray, NodeList, array-like\n : Array.from(x); // Map, Set, iterable, string, or anything else\n}\n","function empty() {\n return [];\n}\n\nexport default function(selector) {\n return selector == null ? empty : function() {\n return this.querySelectorAll(selector);\n };\n}\n","export default function(selector) {\n return function() {\n return this.matches(selector);\n };\n}\n\nexport function childMatcher(selector) {\n return function(node) {\n return node.matches(selector);\n };\n}\n\n","import {childMatcher} from \"../matcher.js\";\n\nvar find = Array.prototype.find;\n\nfunction childFind(match) {\n return function() {\n return find.call(this.children, match);\n };\n}\n\nfunction childFirst() {\n return this.firstElementChild;\n}\n\nexport default function(match) {\n return this.select(match == null ? childFirst\n : childFind(typeof match === \"function\" ? match : childMatcher(match)));\n}\n","import {childMatcher} from \"../matcher.js\";\n\nvar filter = Array.prototype.filter;\n\nfunction children() {\n return this.children;\n}\n\nfunction childrenFilter(match) {\n return function() {\n return filter.call(this.children, match);\n };\n}\n\nexport default function(match) {\n return this.selectAll(match == null ? children\n : childrenFilter(typeof match === \"function\" ? match : childMatcher(match)));\n}\n","export default function(update) {\n return new Array(update.length);\n}\n","import sparse from \"./sparse.js\";\nimport {Selection} from \"./index.js\";\n\nexport default function() {\n return new Selection(this._enter || this._groups.map(sparse), this._parents);\n}\n\nexport function EnterNode(parent, datum) {\n this.ownerDocument = parent.ownerDocument;\n this.namespaceURI = parent.namespaceURI;\n this._next = null;\n this._parent = parent;\n this.__data__ = datum;\n}\n\nEnterNode.prototype = {\n constructor: EnterNode,\n appendChild: function(child) { return this._parent.insertBefore(child, this._next); },\n insertBefore: function(child, next) { return this._parent.insertBefore(child, next); },\n querySelector: function(selector) { return this._parent.querySelector(selector); },\n querySelectorAll: function(selector) { return this._parent.querySelectorAll(selector); }\n};\n","export default function(x) {\n return function() {\n return x;\n };\n}\n","import {Selection} from \"./index.js\";\nimport {EnterNode} from \"./enter.js\";\nimport array from \"../array.js\";\nimport constant from \"../constant.js\";\n\nfunction bindIndex(parent, group, enter, update, exit, data) {\n var i = 0,\n node,\n groupLength = group.length,\n dataLength = data.length;\n\n // Put any non-null nodes that fit into update.\n // Put any null nodes into enter.\n // Put any remaining data into enter.\n for (; i < dataLength; ++i) {\n if (node = group[i]) {\n node.__data__ = data[i];\n update[i] = node;\n } else {\n enter[i] = new EnterNode(parent, data[i]);\n }\n }\n\n // Put any non-null nodes that don’t fit into exit.\n for (; i < groupLength; ++i) {\n if (node = group[i]) {\n exit[i] = node;\n }\n }\n}\n\nfunction bindKey(parent, group, enter, update, exit, data, key) {\n var i,\n node,\n nodeByKeyValue = new Map,\n groupLength = group.length,\n dataLength = data.length,\n keyValues = new Array(groupLength),\n keyValue;\n\n // Compute the key for each node.\n // If multiple nodes have the same key, the duplicates are added to exit.\n for (i = 0; i < groupLength; ++i) {\n if (node = group[i]) {\n keyValues[i] = keyValue = key.call(node, node.__data__, i, group) + \"\";\n if (nodeByKeyValue.has(keyValue)) {\n exit[i] = node;\n } else {\n nodeByKeyValue.set(keyValue, node);\n }\n }\n }\n\n // Compute the key for each datum.\n // If there a node associated with this key, join and add it to update.\n // If there is not (or the key is a duplicate), add it to enter.\n for (i = 0; i < dataLength; ++i) {\n keyValue = key.call(parent, data[i], i, data) + \"\";\n if (node = nodeByKeyValue.get(keyValue)) {\n update[i] = node;\n node.__data__ = data[i];\n nodeByKeyValue.delete(keyValue);\n } else {\n enter[i] = new EnterNode(parent, data[i]);\n }\n }\n\n // Add any remaining nodes that were not bound to data to exit.\n for (i = 0; i < groupLength; ++i) {\n if ((node = group[i]) && (nodeByKeyValue.get(keyValues[i]) === node)) {\n exit[i] = node;\n }\n }\n}\n\nfunction datum(node) {\n return node.__data__;\n}\n\nexport default function(value, key) {\n if (!arguments.length) return Array.from(this, datum);\n\n var bind = key ? bindKey : bindIndex,\n parents = this._parents,\n groups = this._groups;\n\n if (typeof value !== \"function\") value = constant(value);\n\n for (var m = groups.length, update = new Array(m), enter = new Array(m), exit = new Array(m), j = 0; j < m; ++j) {\n var parent = parents[j],\n group = groups[j],\n groupLength = group.length,\n data = array(value.call(parent, parent && parent.__data__, j, parents)),\n dataLength = data.length,\n enterGroup = enter[j] = new Array(dataLength),\n updateGroup = update[j] = new Array(dataLength),\n exitGroup = exit[j] = new Array(groupLength);\n\n bind(parent, group, enterGroup, updateGroup, exitGroup, data, key);\n\n // Now connect the enter nodes to their following update node, such that\n // appendChild can insert the materialized enter node before this node,\n // rather than at the end of the parent node.\n for (var i0 = 0, i1 = 0, previous, next; i0 < dataLength; ++i0) {\n if (previous = enterGroup[i0]) {\n if (i0 >= i1) i1 = i0 + 1;\n while (!(next = updateGroup[i1]) && ++i1 < dataLength);\n previous._next = next || null;\n }\n }\n }\n\n update = new Selection(update, parents);\n update._enter = enter;\n update._exit = exit;\n return update;\n}\n","import {Selection} from \"./index.js\";\n\nexport default function(compare) {\n if (!compare) compare = ascending;\n\n function compareNode(a, b) {\n return a && b ? compare(a.__data__, b.__data__) : !a - !b;\n }\n\n for (var groups = this._groups, m = groups.length, sortgroups = new Array(m), j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, sortgroup = sortgroups[j] = new Array(n), node, i = 0; i < n; ++i) {\n if (node = group[i]) {\n sortgroup[i] = node;\n }\n }\n sortgroup.sort(compareNode);\n }\n\n return new Selection(sortgroups, this._parents).order();\n}\n\nfunction ascending(a, b) {\n return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;\n}\n","export var xhtml = \"http://www.w3.org/1999/xhtml\";\n\nexport default {\n svg: \"http://www.w3.org/2000/svg\",\n xhtml: xhtml,\n xlink: \"http://www.w3.org/1999/xlink\",\n xml: \"http://www.w3.org/XML/1998/namespace\",\n xmlns: \"http://www.w3.org/2000/xmlns/\"\n};\n","import namespaces from \"./namespaces.js\";\n\nexport default function(name) {\n var prefix = name += \"\", i = prefix.indexOf(\":\");\n if (i >= 0 && (prefix = name.slice(0, i)) !== \"xmlns\") name = name.slice(i + 1);\n return namespaces.hasOwnProperty(prefix) ? {space: namespaces[prefix], local: name} : name; // eslint-disable-line no-prototype-builtins\n}\n","import namespace from \"../namespace.js\";\n\nfunction attrRemove(name) {\n return function() {\n this.removeAttribute(name);\n };\n}\n\nfunction attrRemoveNS(fullname) {\n return function() {\n this.removeAttributeNS(fullname.space, fullname.local);\n };\n}\n\nfunction attrConstant(name, value) {\n return function() {\n this.setAttribute(name, value);\n };\n}\n\nfunction attrConstantNS(fullname, value) {\n return function() {\n this.setAttributeNS(fullname.space, fullname.local, value);\n };\n}\n\nfunction attrFunction(name, value) {\n return function() {\n var v = value.apply(this, arguments);\n if (v == null) this.removeAttribute(name);\n else this.setAttribute(name, v);\n };\n}\n\nfunction attrFunctionNS(fullname, value) {\n return function() {\n var v = value.apply(this, arguments);\n if (v == null) this.removeAttributeNS(fullname.space, fullname.local);\n else this.setAttributeNS(fullname.space, fullname.local, v);\n };\n}\n\nexport default function(name, value) {\n var fullname = namespace(name);\n\n if (arguments.length < 2) {\n var node = this.node();\n return fullname.local\n ? node.getAttributeNS(fullname.space, fullname.local)\n : node.getAttribute(fullname);\n }\n\n return this.each((value == null\n ? (fullname.local ? attrRemoveNS : attrRemove) : (typeof value === \"function\"\n ? (fullname.local ? attrFunctionNS : attrFunction)\n : (fullname.local ? attrConstantNS : attrConstant)))(fullname, value));\n}\n","export default function(node) {\n return (node.ownerDocument && node.ownerDocument.defaultView) // node is a Node\n || (node.document && node) // node is a Window\n || node.defaultView; // node is a Document\n}\n","import defaultView from \"../window.js\";\n\nfunction styleRemove(name) {\n return function() {\n this.style.removeProperty(name);\n };\n}\n\nfunction styleConstant(name, value, priority) {\n return function() {\n this.style.setProperty(name, value, priority);\n };\n}\n\nfunction styleFunction(name, value, priority) {\n return function() {\n var v = value.apply(this, arguments);\n if (v == null) this.style.removeProperty(name);\n else this.style.setProperty(name, v, priority);\n };\n}\n\nexport default function(name, value, priority) {\n return arguments.length > 1\n ? this.each((value == null\n ? styleRemove : typeof value === \"function\"\n ? styleFunction\n : styleConstant)(name, value, priority == null ? \"\" : priority))\n : styleValue(this.node(), name);\n}\n\nexport function styleValue(node, name) {\n return node.style.getPropertyValue(name)\n || defaultView(node).getComputedStyle(node, null).getPropertyValue(name);\n}\n","function propertyRemove(name) {\n return function() {\n delete this[name];\n };\n}\n\nfunction propertyConstant(name, value) {\n return function() {\n this[name] = value;\n };\n}\n\nfunction propertyFunction(name, value) {\n return function() {\n var v = value.apply(this, arguments);\n if (v == null) delete this[name];\n else this[name] = v;\n };\n}\n\nexport default function(name, value) {\n return arguments.length > 1\n ? this.each((value == null\n ? propertyRemove : typeof value === \"function\"\n ? propertyFunction\n : propertyConstant)(name, value))\n : this.node()[name];\n}\n","function classArray(string) {\n return string.trim().split(/^|\\s+/);\n}\n\nfunction classList(node) {\n return node.classList || new ClassList(node);\n}\n\nfunction ClassList(node) {\n this._node = node;\n this._names = classArray(node.getAttribute(\"class\") || \"\");\n}\n\nClassList.prototype = {\n add: function(name) {\n var i = this._names.indexOf(name);\n if (i < 0) {\n this._names.push(name);\n this._node.setAttribute(\"class\", this._names.join(\" \"));\n }\n },\n remove: function(name) {\n var i = this._names.indexOf(name);\n if (i >= 0) {\n this._names.splice(i, 1);\n this._node.setAttribute(\"class\", this._names.join(\" \"));\n }\n },\n contains: function(name) {\n return this._names.indexOf(name) >= 0;\n }\n};\n\nfunction classedAdd(node, names) {\n var list = classList(node), i = -1, n = names.length;\n while (++i < n) list.add(names[i]);\n}\n\nfunction classedRemove(node, names) {\n var list = classList(node), i = -1, n = names.length;\n while (++i < n) list.remove(names[i]);\n}\n\nfunction classedTrue(names) {\n return function() {\n classedAdd(this, names);\n };\n}\n\nfunction classedFalse(names) {\n return function() {\n classedRemove(this, names);\n };\n}\n\nfunction classedFunction(names, value) {\n return function() {\n (value.apply(this, arguments) ? classedAdd : classedRemove)(this, names);\n };\n}\n\nexport default function(name, value) {\n var names = classArray(name + \"\");\n\n if (arguments.length < 2) {\n var list = classList(this.node()), i = -1, n = names.length;\n while (++i < n) if (!list.contains(names[i])) return false;\n return true;\n }\n\n return this.each((typeof value === \"function\"\n ? classedFunction : value\n ? classedTrue\n : classedFalse)(names, value));\n}\n","function textRemove() {\n this.textContent = \"\";\n}\n\nfunction textConstant(value) {\n return function() {\n this.textContent = value;\n };\n}\n\nfunction textFunction(value) {\n return function() {\n var v = value.apply(this, arguments);\n this.textContent = v == null ? \"\" : v;\n };\n}\n\nexport default function(value) {\n return arguments.length\n ? this.each(value == null\n ? textRemove : (typeof value === \"function\"\n ? textFunction\n : textConstant)(value))\n : this.node().textContent;\n}\n","function htmlRemove() {\n this.innerHTML = \"\";\n}\n\nfunction htmlConstant(value) {\n return function() {\n this.innerHTML = value;\n };\n}\n\nfunction htmlFunction(value) {\n return function() {\n var v = value.apply(this, arguments);\n this.innerHTML = v == null ? \"\" : v;\n };\n}\n\nexport default function(value) {\n return arguments.length\n ? this.each(value == null\n ? htmlRemove : (typeof value === \"function\"\n ? htmlFunction\n : htmlConstant)(value))\n : this.node().innerHTML;\n}\n","function raise() {\n if (this.nextSibling) this.parentNode.appendChild(this);\n}\n\nexport default function() {\n return this.each(raise);\n}\n","function lower() {\n if (this.previousSibling) this.parentNode.insertBefore(this, this.parentNode.firstChild);\n}\n\nexport default function() {\n return this.each(lower);\n}\n","import namespace from \"./namespace.js\";\nimport {xhtml} from \"./namespaces.js\";\n\nfunction creatorInherit(name) {\n return function() {\n var document = this.ownerDocument,\n uri = this.namespaceURI;\n return uri === xhtml && document.documentElement.namespaceURI === xhtml\n ? document.createElement(name)\n : document.createElementNS(uri, name);\n };\n}\n\nfunction creatorFixed(fullname) {\n return function() {\n return this.ownerDocument.createElementNS(fullname.space, fullname.local);\n };\n}\n\nexport default function(name) {\n var fullname = namespace(name);\n return (fullname.local\n ? creatorFixed\n : creatorInherit)(fullname);\n}\n","import creator from \"../creator.js\";\nimport selector from \"../selector.js\";\n\nfunction constantNull() {\n return null;\n}\n\nexport default function(name, before) {\n var create = typeof name === \"function\" ? name : creator(name),\n select = before == null ? constantNull : typeof before === \"function\" ? before : selector(before);\n return this.select(function() {\n return this.insertBefore(create.apply(this, arguments), select.apply(this, arguments) || null);\n });\n}\n","function remove() {\n var parent = this.parentNode;\n if (parent) parent.removeChild(this);\n}\n\nexport default function() {\n return this.each(remove);\n}\n","function selection_cloneShallow() {\n var clone = this.cloneNode(false), parent = this.parentNode;\n return parent ? parent.insertBefore(clone, this.nextSibling) : clone;\n}\n\nfunction selection_cloneDeep() {\n var clone = this.cloneNode(true), parent = this.parentNode;\n return parent ? parent.insertBefore(clone, this.nextSibling) : clone;\n}\n\nexport default function(deep) {\n return this.select(deep ? selection_cloneDeep : selection_cloneShallow);\n}\n","function contextListener(listener) {\n return function(event) {\n listener.call(this, event, this.__data__);\n };\n}\n\nfunction parseTypenames(typenames) {\n return typenames.trim().split(/^|\\s+/).map(function(t) {\n var name = \"\", i = t.indexOf(\".\");\n if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i);\n return {type: t, name: name};\n });\n}\n\nfunction onRemove(typename) {\n return function() {\n var on = this.__on;\n if (!on) return;\n for (var j = 0, i = -1, m = on.length, o; j < m; ++j) {\n if (o = on[j], (!typename.type || o.type === typename.type) && o.name === typename.name) {\n this.removeEventListener(o.type, o.listener, o.options);\n } else {\n on[++i] = o;\n }\n }\n if (++i) on.length = i;\n else delete this.__on;\n };\n}\n\nfunction onAdd(typename, value, options) {\n return function() {\n var on = this.__on, o, listener = contextListener(value);\n if (on) for (var j = 0, m = on.length; j < m; ++j) {\n if ((o = on[j]).type === typename.type && o.name === typename.name) {\n this.removeEventListener(o.type, o.listener, o.options);\n this.addEventListener(o.type, o.listener = listener, o.options = options);\n o.value = value;\n return;\n }\n }\n this.addEventListener(typename.type, listener, options);\n o = {type: typename.type, name: typename.name, value: value, listener: listener, options: options};\n if (!on) this.__on = [o];\n else on.push(o);\n };\n}\n\nexport default function(typename, value, options) {\n var typenames = parseTypenames(typename + \"\"), i, n = typenames.length, t;\n\n if (arguments.length < 2) {\n var on = this.node().__on;\n if (on) for (var j = 0, m = on.length, o; j < m; ++j) {\n for (i = 0, o = on[j]; i < n; ++i) {\n if ((t = typenames[i]).type === o.type && t.name === o.name) {\n return o.value;\n }\n }\n }\n return;\n }\n\n on = value ? onAdd : onRemove;\n for (i = 0; i < n; ++i) this.each(on(typenames[i], value, options));\n return this;\n}\n","import defaultView from \"../window.js\";\n\nfunction dispatchEvent(node, type, params) {\n var window = defaultView(node),\n event = window.CustomEvent;\n\n if (typeof event === \"function\") {\n event = new event(type, params);\n } else {\n event = window.document.createEvent(\"Event\");\n if (params) event.initEvent(type, params.bubbles, params.cancelable), event.detail = params.detail;\n else event.initEvent(type, false, false);\n }\n\n node.dispatchEvent(event);\n}\n\nfunction dispatchConstant(type, params) {\n return function() {\n return dispatchEvent(this, type, params);\n };\n}\n\nfunction dispatchFunction(type, params) {\n return function() {\n return dispatchEvent(this, type, params.apply(this, arguments));\n };\n}\n\nexport default function(type, params) {\n return this.each((typeof params === \"function\"\n ? dispatchFunction\n : dispatchConstant)(type, params));\n}\n","import selection_select from \"./select.js\";\nimport selection_selectAll from \"./selectAll.js\";\nimport selection_selectChild from \"./selectChild.js\";\nimport selection_selectChildren from \"./selectChildren.js\";\nimport selection_filter from \"./filter.js\";\nimport selection_data from \"./data.js\";\nimport selection_enter from \"./enter.js\";\nimport selection_exit from \"./exit.js\";\nimport selection_join from \"./join.js\";\nimport selection_merge from \"./merge.js\";\nimport selection_order from \"./order.js\";\nimport selection_sort from \"./sort.js\";\nimport selection_call from \"./call.js\";\nimport selection_nodes from \"./nodes.js\";\nimport selection_node from \"./node.js\";\nimport selection_size from \"./size.js\";\nimport selection_empty from \"./empty.js\";\nimport selection_each from \"./each.js\";\nimport selection_attr from \"./attr.js\";\nimport selection_style from \"./style.js\";\nimport selection_property from \"./property.js\";\nimport selection_classed from \"./classed.js\";\nimport selection_text from \"./text.js\";\nimport selection_html from \"./html.js\";\nimport selection_raise from \"./raise.js\";\nimport selection_lower from \"./lower.js\";\nimport selection_append from \"./append.js\";\nimport selection_insert from \"./insert.js\";\nimport selection_remove from \"./remove.js\";\nimport selection_clone from \"./clone.js\";\nimport selection_datum from \"./datum.js\";\nimport selection_on from \"./on.js\";\nimport selection_dispatch from \"./dispatch.js\";\nimport selection_iterator from \"./iterator.js\";\n\nexport var root = [null];\n\nexport function Selection(groups, parents) {\n this._groups = groups;\n this._parents = parents;\n}\n\nfunction selection() {\n return new Selection([[document.documentElement]], root);\n}\n\nfunction selection_selection() {\n return this;\n}\n\nSelection.prototype = selection.prototype = {\n constructor: Selection,\n select: selection_select,\n selectAll: selection_selectAll,\n selectChild: selection_selectChild,\n selectChildren: selection_selectChildren,\n filter: selection_filter,\n data: selection_data,\n enter: selection_enter,\n exit: selection_exit,\n join: selection_join,\n merge: selection_merge,\n selection: selection_selection,\n order: selection_order,\n sort: selection_sort,\n call: selection_call,\n nodes: selection_nodes,\n node: selection_node,\n size: selection_size,\n empty: selection_empty,\n each: selection_each,\n attr: selection_attr,\n style: selection_style,\n property: selection_property,\n classed: selection_classed,\n text: selection_text,\n html: selection_html,\n raise: selection_raise,\n lower: selection_lower,\n append: selection_append,\n insert: selection_insert,\n remove: selection_remove,\n clone: selection_clone,\n datum: selection_datum,\n on: selection_on,\n dispatch: selection_dispatch,\n [Symbol.iterator]: selection_iterator\n};\n\nexport default selection;\n","import {Selection} from \"./index.js\";\nimport selector from \"../selector.js\";\n\nexport default function(select) {\n if (typeof select !== \"function\") select = selector(select);\n\n for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) {\n if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) {\n if (\"__data__\" in node) subnode.__data__ = node.__data__;\n subgroup[i] = subnode;\n }\n }\n }\n\n return new Selection(subgroups, this._parents);\n}\n","import {Selection} from \"./index.js\";\nimport array from \"../array.js\";\nimport selectorAll from \"../selectorAll.js\";\n\nfunction arrayAll(select) {\n return function() {\n var group = select.apply(this, arguments);\n return group == null ? [] : array(group);\n };\n}\n\nexport default function(select) {\n if (typeof select === \"function\") select = arrayAll(select);\n else select = selectorAll(select);\n\n for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {\n if (node = group[i]) {\n subgroups.push(select.call(node, node.__data__, i, group));\n parents.push(node);\n }\n }\n }\n\n return new Selection(subgroups, parents);\n}\n","import {Selection} from \"./index.js\";\nimport matcher from \"../matcher.js\";\n\nexport default function(match) {\n if (typeof match !== \"function\") match = matcher(match);\n\n for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) {\n if ((node = group[i]) && match.call(node, node.__data__, i, group)) {\n subgroup.push(node);\n }\n }\n }\n\n return new Selection(subgroups, this._parents);\n}\n","import sparse from \"./sparse.js\";\nimport {Selection} from \"./index.js\";\n\nexport default function() {\n return new Selection(this._exit || this._groups.map(sparse), this._parents);\n}\n","export default function(onenter, onupdate, onexit) {\n var enter = this.enter(), update = this, exit = this.exit();\n enter = typeof onenter === \"function\" ? onenter(enter) : enter.append(onenter + \"\");\n if (onupdate != null) update = onupdate(update);\n if (onexit == null) exit.remove(); else onexit(exit);\n return enter && update ? enter.merge(update).order() : update;\n}\n","import {Selection} from \"./index.js\";\n\nexport default function(selection) {\n if (!(selection instanceof Selection)) throw new Error(\"invalid merge\");\n\n for (var groups0 = this._groups, groups1 = selection._groups, m0 = groups0.length, m1 = groups1.length, m = Math.min(m0, m1), merges = new Array(m0), j = 0; j < m; ++j) {\n for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) {\n if (node = group0[i] || group1[i]) {\n merge[i] = node;\n }\n }\n }\n\n for (; j < m0; ++j) {\n merges[j] = groups0[j];\n }\n\n return new Selection(merges, this._parents);\n}\n","export default function() {\n\n for (var groups = this._groups, j = -1, m = groups.length; ++j < m;) {\n for (var group = groups[j], i = group.length - 1, next = group[i], node; --i >= 0;) {\n if (node = group[i]) {\n if (next && node.compareDocumentPosition(next) ^ 4) next.parentNode.insertBefore(node, next);\n next = node;\n }\n }\n }\n\n return this;\n}\n","export default function() {\n var callback = arguments[0];\n arguments[0] = this;\n callback.apply(null, arguments);\n return this;\n}\n","export default function() {\n return Array.from(this);\n}\n","export default function() {\n\n for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) {\n for (var group = groups[j], i = 0, n = group.length; i < n; ++i) {\n var node = group[i];\n if (node) return node;\n }\n }\n\n return null;\n}\n","export default function() {\n let size = 0;\n for (const node of this) ++size; // eslint-disable-line no-unused-vars\n return size;\n}\n","export default function() {\n return !this.node();\n}\n","export default function(callback) {\n\n for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) {\n for (var group = groups[j], i = 0, n = group.length, node; i < n; ++i) {\n if (node = group[i]) callback.call(node, node.__data__, i, group);\n }\n }\n\n return this;\n}\n","import creator from \"../creator.js\";\n\nexport default function(name) {\n var create = typeof name === \"function\" ? name : creator(name);\n return this.select(function() {\n return this.appendChild(create.apply(this, arguments));\n });\n}\n","export default function(value) {\n return arguments.length\n ? this.property(\"__data__\", value)\n : this.node().__data__;\n}\n","export default function*() {\n for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) {\n for (var group = groups[j], i = 0, n = group.length, node; i < n; ++i) {\n if (node = group[i]) yield node;\n }\n }\n}\n","import {Selection, root} from \"./selection/index.js\";\n\nexport default function(selector) {\n return typeof selector === \"string\"\n ? new Selection([[document.querySelector(selector)]], [document.documentElement])\n : new Selection([[selector]], root);\n}\n","function responseBlob(response) {\n if (!response.ok) throw new Error(response.status + \" \" + response.statusText);\n return response.blob();\n}\n\nexport default function(input, init) {\n return fetch(input, init).then(responseBlob);\n}\n","function responseArrayBuffer(response) {\n if (!response.ok) throw new Error(response.status + \" \" + response.statusText);\n return response.arrayBuffer();\n}\n\nexport default function(input, init) {\n return fetch(input, init).then(responseArrayBuffer);\n}\n","var EOL = {},\n EOF = {},\n QUOTE = 34,\n NEWLINE = 10,\n RETURN = 13;\n\nfunction objectConverter(columns) {\n return new Function(\"d\", \"return {\" + columns.map(function(name, i) {\n return JSON.stringify(name) + \": d[\" + i + \"] || \\\"\\\"\";\n }).join(\",\") + \"}\");\n}\n\nfunction customConverter(columns, f) {\n var object = objectConverter(columns);\n return function(row, i) {\n return f(object(row), i, columns);\n };\n}\n\n// Compute unique columns in order of discovery.\nfunction inferColumns(rows) {\n var columnSet = Object.create(null),\n columns = [];\n\n rows.forEach(function(row) {\n for (var column in row) {\n if (!(column in columnSet)) {\n columns.push(columnSet[column] = column);\n }\n }\n });\n\n return columns;\n}\n\nfunction pad(value, width) {\n var s = value + \"\", length = s.length;\n return length < width ? new Array(width - length + 1).join(0) + s : s;\n}\n\nfunction formatYear(year) {\n return year < 0 ? \"-\" + pad(-year, 6)\n : year > 9999 ? \"+\" + pad(year, 6)\n : pad(year, 4);\n}\n\nfunction formatDate(date) {\n var hours = date.getUTCHours(),\n minutes = date.getUTCMinutes(),\n seconds = date.getUTCSeconds(),\n milliseconds = date.getUTCMilliseconds();\n return isNaN(date) ? \"Invalid Date\"\n : formatYear(date.getUTCFullYear(), 4) + \"-\" + pad(date.getUTCMonth() + 1, 2) + \"-\" + pad(date.getUTCDate(), 2)\n + (milliseconds ? \"T\" + pad(hours, 2) + \":\" + pad(minutes, 2) + \":\" + pad(seconds, 2) + \".\" + pad(milliseconds, 3) + \"Z\"\n : seconds ? \"T\" + pad(hours, 2) + \":\" + pad(minutes, 2) + \":\" + pad(seconds, 2) + \"Z\"\n : minutes || hours ? \"T\" + pad(hours, 2) + \":\" + pad(minutes, 2) + \"Z\"\n : \"\");\n}\n\nexport default function(delimiter) {\n var reFormat = new RegExp(\"[\\\"\" + delimiter + \"\\n\\r]\"),\n DELIMITER = delimiter.charCodeAt(0);\n\n function parse(text, f) {\n var convert, columns, rows = parseRows(text, function(row, i) {\n if (convert) return convert(row, i - 1);\n columns = row, convert = f ? customConverter(row, f) : objectConverter(row);\n });\n rows.columns = columns || [];\n return rows;\n }\n\n function parseRows(text, f) {\n var rows = [], // output rows\n N = text.length,\n I = 0, // current character index\n n = 0, // current line number\n t, // current token\n eof = N <= 0, // current token followed by EOF?\n eol = false; // current token followed by EOL?\n\n // Strip the trailing newline.\n if (text.charCodeAt(N - 1) === NEWLINE) --N;\n if (text.charCodeAt(N - 1) === RETURN) --N;\n\n function token() {\n if (eof) return EOF;\n if (eol) return eol = false, EOL;\n\n // Unescape quotes.\n var i, j = I, c;\n if (text.charCodeAt(j) === QUOTE) {\n while (I++ < N && text.charCodeAt(I) !== QUOTE || text.charCodeAt(++I) === QUOTE);\n if ((i = I) >= N) eof = true;\n else if ((c = text.charCodeAt(I++)) === NEWLINE) eol = true;\n else if (c === RETURN) { eol = true; if (text.charCodeAt(I) === NEWLINE) ++I; }\n return text.slice(j + 1, i - 1).replace(/\"\"/g, \"\\\"\");\n }\n\n // Find next delimiter or newline.\n while (I < N) {\n if ((c = text.charCodeAt(i = I++)) === NEWLINE) eol = true;\n else if (c === RETURN) { eol = true; if (text.charCodeAt(I) === NEWLINE) ++I; }\n else if (c !== DELIMITER) continue;\n return text.slice(j, i);\n }\n\n // Return last token before EOF.\n return eof = true, text.slice(j, N);\n }\n\n while ((t = token()) !== EOF) {\n var row = [];\n while (t !== EOL && t !== EOF) row.push(t), t = token();\n if (f && (row = f(row, n++)) == null) continue;\n rows.push(row);\n }\n\n return rows;\n }\n\n function preformatBody(rows, columns) {\n return rows.map(function(row) {\n return columns.map(function(column) {\n return formatValue(row[column]);\n }).join(delimiter);\n });\n }\n\n function format(rows, columns) {\n if (columns == null) columns = inferColumns(rows);\n return [columns.map(formatValue).join(delimiter)].concat(preformatBody(rows, columns)).join(\"\\n\");\n }\n\n function formatBody(rows, columns) {\n if (columns == null) columns = inferColumns(rows);\n return preformatBody(rows, columns).join(\"\\n\");\n }\n\n function formatRows(rows) {\n return rows.map(formatRow).join(\"\\n\");\n }\n\n function formatRow(row) {\n return row.map(formatValue).join(delimiter);\n }\n\n function formatValue(value) {\n return value == null ? \"\"\n : value instanceof Date ? formatDate(value)\n : reFormat.test(value += \"\") ? \"\\\"\" + value.replace(/\"/g, \"\\\"\\\"\") + \"\\\"\"\n : value;\n }\n\n return {\n parse: parse,\n parseRows: parseRows,\n format: format,\n formatBody: formatBody,\n formatRows: formatRows,\n formatRow: formatRow,\n formatValue: formatValue\n };\n}\n","import dsv from \"./dsv.js\";\n\nvar csv = dsv(\",\");\n\nexport var csvParse = csv.parse;\nexport var csvParseRows = csv.parseRows;\nexport var csvFormat = csv.format;\nexport var csvFormatBody = csv.formatBody;\nexport var csvFormatRows = csv.formatRows;\nexport var csvFormatRow = csv.formatRow;\nexport var csvFormatValue = csv.formatValue;\n","import dsv from \"./dsv.js\";\n\nvar tsv = dsv(\"\\t\");\n\nexport var tsvParse = tsv.parse;\nexport var tsvParseRows = tsv.parseRows;\nexport var tsvFormat = tsv.format;\nexport var tsvFormatBody = tsv.formatBody;\nexport var tsvFormatRows = tsv.formatRows;\nexport var tsvFormatRow = tsv.formatRow;\nexport var tsvFormatValue = tsv.formatValue;\n","function responseText(response) {\n if (!response.ok) throw new Error(response.status + \" \" + response.statusText);\n return response.text();\n}\n\nexport default function(input, init) {\n return fetch(input, init).then(responseText);\n}\n","import {csvParse, dsvFormat, tsvParse} from \"d3-dsv\";\nimport text from \"./text.js\";\n\nfunction dsvParse(parse) {\n return function(input, init, row) {\n if (arguments.length === 2 && typeof init === \"function\") row = init, init = undefined;\n return text(input, init).then(function(response) {\n return parse(response, row);\n });\n };\n}\n\nexport default function dsv(delimiter, input, init, row) {\n if (arguments.length === 3 && typeof init === \"function\") row = init, init = undefined;\n var format = dsvFormat(delimiter);\n return text(input, init).then(function(response) {\n return format.parse(response, row);\n });\n}\n\nexport var csv = dsvParse(csvParse);\nexport var tsv = dsvParse(tsvParse);\n","export default function(input, init) {\n return new Promise(function(resolve, reject) {\n var image = new Image;\n for (var key in init) image[key] = init[key];\n image.onerror = reject;\n image.onload = function() { resolve(image); };\n image.src = input;\n });\n}\n","function responseJson(response) {\n if (!response.ok) throw new Error(response.status + \" \" + response.statusText);\n if (response.status === 204 || response.status === 205) return;\n return response.json();\n}\n\nexport default function(input, init) {\n return fetch(input, init).then(responseJson);\n}\n","import text from \"./text.js\";\n\nfunction parser(type) {\n return (input, init) => text(input, init)\n .then(text => (new DOMParser).parseFromString(text, type));\n}\n\nexport default parser(\"application/xml\");\n\nexport var html = parser(\"text/html\");\n\nexport var svg = parser(\"image/svg+xml\");\n","var noop = {value: () => {}};\n\nfunction dispatch() {\n for (var i = 0, n = arguments.length, _ = {}, t; i < n; ++i) {\n if (!(t = arguments[i] + \"\") || (t in _) || /[\\s.]/.test(t)) throw new Error(\"illegal type: \" + t);\n _[t] = [];\n }\n return new Dispatch(_);\n}\n\nfunction Dispatch(_) {\n this._ = _;\n}\n\nfunction parseTypenames(typenames, types) {\n return typenames.trim().split(/^|\\s+/).map(function(t) {\n var name = \"\", i = t.indexOf(\".\");\n if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i);\n if (t && !types.hasOwnProperty(t)) throw new Error(\"unknown type: \" + t);\n return {type: t, name: name};\n });\n}\n\nDispatch.prototype = dispatch.prototype = {\n constructor: Dispatch,\n on: function(typename, callback) {\n var _ = this._,\n T = parseTypenames(typename + \"\", _),\n t,\n i = -1,\n n = T.length;\n\n // If no callback was specified, return the callback of the given type and name.\n if (arguments.length < 2) {\n while (++i < n) if ((t = (typename = T[i]).type) && (t = get(_[t], typename.name))) return t;\n return;\n }\n\n // If a type was specified, set the callback for the given type and name.\n // Otherwise, if a null callback was specified, remove callbacks of the given name.\n if (callback != null && typeof callback !== \"function\") throw new Error(\"invalid callback: \" + callback);\n while (++i < n) {\n if (t = (typename = T[i]).type) _[t] = set(_[t], typename.name, callback);\n else if (callback == null) for (t in _) _[t] = set(_[t], typename.name, null);\n }\n\n return this;\n },\n copy: function() {\n var copy = {}, _ = this._;\n for (var t in _) copy[t] = _[t].slice();\n return new Dispatch(copy);\n },\n call: function(type, that) {\n if ((n = arguments.length - 2) > 0) for (var args = new Array(n), i = 0, n, t; i < n; ++i) args[i] = arguments[i + 2];\n if (!this._.hasOwnProperty(type)) throw new Error(\"unknown type: \" + type);\n for (t = this._[type], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args);\n },\n apply: function(type, that, args) {\n if (!this._.hasOwnProperty(type)) throw new Error(\"unknown type: \" + type);\n for (var t = this._[type], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args);\n }\n};\n\nfunction get(type, name) {\n for (var i = 0, n = type.length, c; i < n; ++i) {\n if ((c = type[i]).name === name) {\n return c.value;\n }\n }\n}\n\nfunction set(type, name, callback) {\n for (var i = 0, n = type.length; i < n; ++i) {\n if (type[i].name === name) {\n type[i] = noop, type = type.slice(0, i).concat(type.slice(i + 1));\n break;\n }\n }\n if (callback != null) type.push({name: name, value: callback});\n return type;\n}\n\nexport default dispatch;\n","export function nopropagation(event) {\n event.stopImmediatePropagation();\n}\n\nexport default function(event) {\n event.preventDefault();\n event.stopImmediatePropagation();\n}\n","import {select} from \"d3-selection\";\nimport noevent from \"./noevent.js\";\n\nexport default function(view) {\n var root = view.document.documentElement,\n selection = select(view).on(\"dragstart.drag\", noevent, true);\n if (\"onselectstart\" in root) {\n selection.on(\"selectstart.drag\", noevent, true);\n } else {\n root.__noselect = root.style.MozUserSelect;\n root.style.MozUserSelect = \"none\";\n }\n}\n\nexport function yesdrag(view, noclick) {\n var root = view.document.documentElement,\n selection = select(view).on(\"dragstart.drag\", null);\n if (noclick) {\n selection.on(\"click.drag\", noevent, true);\n setTimeout(function() { selection.on(\"click.drag\", null); }, 0);\n }\n if (\"onselectstart\" in root) {\n selection.on(\"selectstart.drag\", null);\n } else {\n root.style.MozUserSelect = root.__noselect;\n delete root.__noselect;\n }\n}\n","export default function(constructor, factory, prototype) {\n constructor.prototype = factory.prototype = prototype;\n prototype.constructor = constructor;\n}\n\nexport function extend(parent, definition) {\n var prototype = Object.create(parent.prototype);\n for (var key in definition) prototype[key] = definition[key];\n return prototype;\n}\n","import define, {extend} from \"./define.js\";\n\nexport function Color() {}\n\nexport var darker = 0.7;\nexport var brighter = 1 / darker;\n\nvar reI = \"\\\\s*([+-]?\\\\d+)\\\\s*\",\n reN = \"\\\\s*([+-]?\\\\d*\\\\.?\\\\d+(?:[eE][+-]?\\\\d+)?)\\\\s*\",\n reP = \"\\\\s*([+-]?\\\\d*\\\\.?\\\\d+(?:[eE][+-]?\\\\d+)?)%\\\\s*\",\n reHex = /^#([0-9a-f]{3,8})$/,\n reRgbInteger = new RegExp(\"^rgb\\\\(\" + [reI, reI, reI] + \"\\\\)$\"),\n reRgbPercent = new RegExp(\"^rgb\\\\(\" + [reP, reP, reP] + \"\\\\)$\"),\n reRgbaInteger = new RegExp(\"^rgba\\\\(\" + [reI, reI, reI, reN] + \"\\\\)$\"),\n reRgbaPercent = new RegExp(\"^rgba\\\\(\" + [reP, reP, reP, reN] + \"\\\\)$\"),\n reHslPercent = new RegExp(\"^hsl\\\\(\" + [reN, reP, reP] + \"\\\\)$\"),\n reHslaPercent = new RegExp(\"^hsla\\\\(\" + [reN, reP, reP, reN] + \"\\\\)$\");\n\nvar named = {\n aliceblue: 0xf0f8ff,\n antiquewhite: 0xfaebd7,\n aqua: 0x00ffff,\n aquamarine: 0x7fffd4,\n azure: 0xf0ffff,\n beige: 0xf5f5dc,\n bisque: 0xffe4c4,\n black: 0x000000,\n blanchedalmond: 0xffebcd,\n blue: 0x0000ff,\n blueviolet: 0x8a2be2,\n brown: 0xa52a2a,\n burlywood: 0xdeb887,\n cadetblue: 0x5f9ea0,\n chartreuse: 0x7fff00,\n chocolate: 0xd2691e,\n coral: 0xff7f50,\n cornflowerblue: 0x6495ed,\n cornsilk: 0xfff8dc,\n crimson: 0xdc143c,\n cyan: 0x00ffff,\n darkblue: 0x00008b,\n darkcyan: 0x008b8b,\n darkgoldenrod: 0xb8860b,\n darkgray: 0xa9a9a9,\n darkgreen: 0x006400,\n darkgrey: 0xa9a9a9,\n darkkhaki: 0xbdb76b,\n darkmagenta: 0x8b008b,\n darkolivegreen: 0x556b2f,\n darkorange: 0xff8c00,\n darkorchid: 0x9932cc,\n darkred: 0x8b0000,\n darksalmon: 0xe9967a,\n darkseagreen: 0x8fbc8f,\n darkslateblue: 0x483d8b,\n darkslategray: 0x2f4f4f,\n darkslategrey: 0x2f4f4f,\n darkturquoise: 0x00ced1,\n darkviolet: 0x9400d3,\n deeppink: 0xff1493,\n deepskyblue: 0x00bfff,\n dimgray: 0x696969,\n dimgrey: 0x696969,\n dodgerblue: 0x1e90ff,\n firebrick: 0xb22222,\n floralwhite: 0xfffaf0,\n forestgreen: 0x228b22,\n fuchsia: 0xff00ff,\n gainsboro: 0xdcdcdc,\n ghostwhite: 0xf8f8ff,\n gold: 0xffd700,\n goldenrod: 0xdaa520,\n gray: 0x808080,\n green: 0x008000,\n greenyellow: 0xadff2f,\n grey: 0x808080,\n honeydew: 0xf0fff0,\n hotpink: 0xff69b4,\n indianred: 0xcd5c5c,\n indigo: 0x4b0082,\n ivory: 0xfffff0,\n khaki: 0xf0e68c,\n lavender: 0xe6e6fa,\n lavenderblush: 0xfff0f5,\n lawngreen: 0x7cfc00,\n lemonchiffon: 0xfffacd,\n lightblue: 0xadd8e6,\n lightcoral: 0xf08080,\n lightcyan: 0xe0ffff,\n lightgoldenrodyellow: 0xfafad2,\n lightgray: 0xd3d3d3,\n lightgreen: 0x90ee90,\n lightgrey: 0xd3d3d3,\n lightpink: 0xffb6c1,\n lightsalmon: 0xffa07a,\n lightseagreen: 0x20b2aa,\n lightskyblue: 0x87cefa,\n lightslategray: 0x778899,\n lightslategrey: 0x778899,\n lightsteelblue: 0xb0c4de,\n lightyellow: 0xffffe0,\n lime: 0x00ff00,\n limegreen: 0x32cd32,\n linen: 0xfaf0e6,\n magenta: 0xff00ff,\n maroon: 0x800000,\n mediumaquamarine: 0x66cdaa,\n mediumblue: 0x0000cd,\n mediumorchid: 0xba55d3,\n mediumpurple: 0x9370db,\n mediumseagreen: 0x3cb371,\n mediumslateblue: 0x7b68ee,\n mediumspringgreen: 0x00fa9a,\n mediumturquoise: 0x48d1cc,\n mediumvioletred: 0xc71585,\n midnightblue: 0x191970,\n mintcream: 0xf5fffa,\n mistyrose: 0xffe4e1,\n moccasin: 0xffe4b5,\n navajowhite: 0xffdead,\n navy: 0x000080,\n oldlace: 0xfdf5e6,\n olive: 0x808000,\n olivedrab: 0x6b8e23,\n orange: 0xffa500,\n orangered: 0xff4500,\n orchid: 0xda70d6,\n palegoldenrod: 0xeee8aa,\n palegreen: 0x98fb98,\n paleturquoise: 0xafeeee,\n palevioletred: 0xdb7093,\n papayawhip: 0xffefd5,\n peachpuff: 0xffdab9,\n peru: 0xcd853f,\n pink: 0xffc0cb,\n plum: 0xdda0dd,\n powderblue: 0xb0e0e6,\n purple: 0x800080,\n rebeccapurple: 0x663399,\n red: 0xff0000,\n rosybrown: 0xbc8f8f,\n royalblue: 0x4169e1,\n saddlebrown: 0x8b4513,\n salmon: 0xfa8072,\n sandybrown: 0xf4a460,\n seagreen: 0x2e8b57,\n seashell: 0xfff5ee,\n sienna: 0xa0522d,\n silver: 0xc0c0c0,\n skyblue: 0x87ceeb,\n slateblue: 0x6a5acd,\n slategray: 0x708090,\n slategrey: 0x708090,\n snow: 0xfffafa,\n springgreen: 0x00ff7f,\n steelblue: 0x4682b4,\n tan: 0xd2b48c,\n teal: 0x008080,\n thistle: 0xd8bfd8,\n tomato: 0xff6347,\n turquoise: 0x40e0d0,\n violet: 0xee82ee,\n wheat: 0xf5deb3,\n white: 0xffffff,\n whitesmoke: 0xf5f5f5,\n yellow: 0xffff00,\n yellowgreen: 0x9acd32\n};\n\ndefine(Color, color, {\n copy: function(channels) {\n return Object.assign(new this.constructor, this, channels);\n },\n displayable: function() {\n return this.rgb().displayable();\n },\n hex: color_formatHex, // Deprecated! Use color.formatHex.\n formatHex: color_formatHex,\n formatHsl: color_formatHsl,\n formatRgb: color_formatRgb,\n toString: color_formatRgb\n});\n\nfunction color_formatHex() {\n return this.rgb().formatHex();\n}\n\nfunction color_formatHsl() {\n return hslConvert(this).formatHsl();\n}\n\nfunction color_formatRgb() {\n return this.rgb().formatRgb();\n}\n\nexport default function color(format) {\n var m, l;\n format = (format + \"\").trim().toLowerCase();\n return (m = reHex.exec(format)) ? (l = m[1].length, m = parseInt(m[1], 16), l === 6 ? rgbn(m) // #ff0000\n : l === 3 ? new Rgb((m >> 8 & 0xf) | (m >> 4 & 0xf0), (m >> 4 & 0xf) | (m & 0xf0), ((m & 0xf) << 4) | (m & 0xf), 1) // #f00\n : l === 8 ? rgba(m >> 24 & 0xff, m >> 16 & 0xff, m >> 8 & 0xff, (m & 0xff) / 0xff) // #ff000000\n : l === 4 ? rgba((m >> 12 & 0xf) | (m >> 8 & 0xf0), (m >> 8 & 0xf) | (m >> 4 & 0xf0), (m >> 4 & 0xf) | (m & 0xf0), (((m & 0xf) << 4) | (m & 0xf)) / 0xff) // #f000\n : null) // invalid hex\n : (m = reRgbInteger.exec(format)) ? new Rgb(m[1], m[2], m[3], 1) // rgb(255, 0, 0)\n : (m = reRgbPercent.exec(format)) ? new Rgb(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, 1) // rgb(100%, 0%, 0%)\n : (m = reRgbaInteger.exec(format)) ? rgba(m[1], m[2], m[3], m[4]) // rgba(255, 0, 0, 1)\n : (m = reRgbaPercent.exec(format)) ? rgba(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, m[4]) // rgb(100%, 0%, 0%, 1)\n : (m = reHslPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, 1) // hsl(120, 50%, 50%)\n : (m = reHslaPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, m[4]) // hsla(120, 50%, 50%, 1)\n : named.hasOwnProperty(format) ? rgbn(named[format]) // eslint-disable-line no-prototype-builtins\n : format === \"transparent\" ? new Rgb(NaN, NaN, NaN, 0)\n : null;\n}\n\nfunction rgbn(n) {\n return new Rgb(n >> 16 & 0xff, n >> 8 & 0xff, n & 0xff, 1);\n}\n\nfunction rgba(r, g, b, a) {\n if (a <= 0) r = g = b = NaN;\n return new Rgb(r, g, b, a);\n}\n\nexport function rgbConvert(o) {\n if (!(o instanceof Color)) o = color(o);\n if (!o) return new Rgb;\n o = o.rgb();\n return new Rgb(o.r, o.g, o.b, o.opacity);\n}\n\nexport function rgb(r, g, b, opacity) {\n return arguments.length === 1 ? rgbConvert(r) : new Rgb(r, g, b, opacity == null ? 1 : opacity);\n}\n\nexport function Rgb(r, g, b, opacity) {\n this.r = +r;\n this.g = +g;\n this.b = +b;\n this.opacity = +opacity;\n}\n\ndefine(Rgb, rgb, extend(Color, {\n brighter: function(k) {\n k = k == null ? brighter : Math.pow(brighter, k);\n return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);\n },\n darker: function(k) {\n k = k == null ? darker : Math.pow(darker, k);\n return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);\n },\n rgb: function() {\n return this;\n },\n displayable: function() {\n return (-0.5 <= this.r && this.r < 255.5)\n && (-0.5 <= this.g && this.g < 255.5)\n && (-0.5 <= this.b && this.b < 255.5)\n && (0 <= this.opacity && this.opacity <= 1);\n },\n hex: rgb_formatHex, // Deprecated! Use color.formatHex.\n formatHex: rgb_formatHex,\n formatRgb: rgb_formatRgb,\n toString: rgb_formatRgb\n}));\n\nfunction rgb_formatHex() {\n return \"#\" + hex(this.r) + hex(this.g) + hex(this.b);\n}\n\nfunction rgb_formatRgb() {\n var a = this.opacity; a = isNaN(a) ? 1 : Math.max(0, Math.min(1, a));\n return (a === 1 ? \"rgb(\" : \"rgba(\")\n + Math.max(0, Math.min(255, Math.round(this.r) || 0)) + \", \"\n + Math.max(0, Math.min(255, Math.round(this.g) || 0)) + \", \"\n + Math.max(0, Math.min(255, Math.round(this.b) || 0))\n + (a === 1 ? \")\" : \", \" + a + \")\");\n}\n\nfunction hex(value) {\n value = Math.max(0, Math.min(255, Math.round(value) || 0));\n return (value < 16 ? \"0\" : \"\") + value.toString(16);\n}\n\nfunction hsla(h, s, l, a) {\n if (a <= 0) h = s = l = NaN;\n else if (l <= 0 || l >= 1) h = s = NaN;\n else if (s <= 0) h = NaN;\n return new Hsl(h, s, l, a);\n}\n\nexport function hslConvert(o) {\n if (o instanceof Hsl) return new Hsl(o.h, o.s, o.l, o.opacity);\n if (!(o instanceof Color)) o = color(o);\n if (!o) return new Hsl;\n if (o instanceof Hsl) return o;\n o = o.rgb();\n var r = o.r / 255,\n g = o.g / 255,\n b = o.b / 255,\n min = Math.min(r, g, b),\n max = Math.max(r, g, b),\n h = NaN,\n s = max - min,\n l = (max + min) / 2;\n if (s) {\n if (r === max) h = (g - b) / s + (g < b) * 6;\n else if (g === max) h = (b - r) / s + 2;\n else h = (r - g) / s + 4;\n s /= l < 0.5 ? max + min : 2 - max - min;\n h *= 60;\n } else {\n s = l > 0 && l < 1 ? 0 : h;\n }\n return new Hsl(h, s, l, o.opacity);\n}\n\nexport function hsl(h, s, l, opacity) {\n return arguments.length === 1 ? hslConvert(h) : new Hsl(h, s, l, opacity == null ? 1 : opacity);\n}\n\nfunction Hsl(h, s, l, opacity) {\n this.h = +h;\n this.s = +s;\n this.l = +l;\n this.opacity = +opacity;\n}\n\ndefine(Hsl, hsl, extend(Color, {\n brighter: function(k) {\n k = k == null ? brighter : Math.pow(brighter, k);\n return new Hsl(this.h, this.s, this.l * k, this.opacity);\n },\n darker: function(k) {\n k = k == null ? darker : Math.pow(darker, k);\n return new Hsl(this.h, this.s, this.l * k, this.opacity);\n },\n rgb: function() {\n var h = this.h % 360 + (this.h < 0) * 360,\n s = isNaN(h) || isNaN(this.s) ? 0 : this.s,\n l = this.l,\n m2 = l + (l < 0.5 ? l : 1 - l) * s,\n m1 = 2 * l - m2;\n return new Rgb(\n hsl2rgb(h >= 240 ? h - 240 : h + 120, m1, m2),\n hsl2rgb(h, m1, m2),\n hsl2rgb(h < 120 ? h + 240 : h - 120, m1, m2),\n this.opacity\n );\n },\n displayable: function() {\n return (0 <= this.s && this.s <= 1 || isNaN(this.s))\n && (0 <= this.l && this.l <= 1)\n && (0 <= this.opacity && this.opacity <= 1);\n },\n formatHsl: function() {\n var a = this.opacity; a = isNaN(a) ? 1 : Math.max(0, Math.min(1, a));\n return (a === 1 ? \"hsl(\" : \"hsla(\")\n + (this.h || 0) + \", \"\n + (this.s || 0) * 100 + \"%, \"\n + (this.l || 0) * 100 + \"%\"\n + (a === 1 ? \")\" : \", \" + a + \")\");\n }\n}));\n\n/* From FvD 13.37, CSS Color Module Level 3 */\nfunction hsl2rgb(h, m1, m2) {\n return (h < 60 ? m1 + (m2 - m1) * h / 60\n : h < 180 ? m2\n : h < 240 ? m1 + (m2 - m1) * (240 - h) / 60\n : m1) * 255;\n}\n","export function basis(t1, v0, v1, v2, v3) {\n var t2 = t1 * t1, t3 = t2 * t1;\n return ((1 - 3 * t1 + 3 * t2 - t3) * v0\n + (4 - 6 * t2 + 3 * t3) * v1\n + (1 + 3 * t1 + 3 * t2 - 3 * t3) * v2\n + t3 * v3) / 6;\n}\n\nexport default function(values) {\n var n = values.length - 1;\n return function(t) {\n var i = t <= 0 ? (t = 0) : t >= 1 ? (t = 1, n - 1) : Math.floor(t * n),\n v1 = values[i],\n v2 = values[i + 1],\n v0 = i > 0 ? values[i - 1] : 2 * v1 - v2,\n v3 = i < n - 1 ? values[i + 2] : 2 * v2 - v1;\n return basis((t - i / n) * n, v0, v1, v2, v3);\n };\n}\n","export default x => () => x;\n","import constant from \"./constant.js\";\n\nfunction linear(a, d) {\n return function(t) {\n return a + t * d;\n };\n}\n\nfunction exponential(a, b, y) {\n return a = Math.pow(a, y), b = Math.pow(b, y) - a, y = 1 / y, function(t) {\n return Math.pow(a + t * b, y);\n };\n}\n\nexport function hue(a, b) {\n var d = b - a;\n return d ? linear(a, d > 180 || d < -180 ? d - 360 * Math.round(d / 360) : d) : constant(isNaN(a) ? b : a);\n}\n\nexport function gamma(y) {\n return (y = +y) === 1 ? nogamma : function(a, b) {\n return b - a ? exponential(a, b, y) : constant(isNaN(a) ? b : a);\n };\n}\n\nexport default function nogamma(a, b) {\n var d = b - a;\n return d ? linear(a, d) : constant(isNaN(a) ? b : a);\n}\n","import {rgb as colorRgb} from \"d3-color\";\nimport basis from \"./basis.js\";\nimport basisClosed from \"./basisClosed.js\";\nimport nogamma, {gamma} from \"./color.js\";\n\nexport default (function rgbGamma(y) {\n var color = gamma(y);\n\n function rgb(start, end) {\n var r = color((start = colorRgb(start)).r, (end = colorRgb(end)).r),\n g = color(start.g, end.g),\n b = color(start.b, end.b),\n opacity = nogamma(start.opacity, end.opacity);\n return function(t) {\n start.r = r(t);\n start.g = g(t);\n start.b = b(t);\n start.opacity = opacity(t);\n return start + \"\";\n };\n }\n\n rgb.gamma = rgbGamma;\n\n return rgb;\n})(1);\n\nfunction rgbSpline(spline) {\n return function(colors) {\n var n = colors.length,\n r = new Array(n),\n g = new Array(n),\n b = new Array(n),\n i, color;\n for (i = 0; i < n; ++i) {\n color = colorRgb(colors[i]);\n r[i] = color.r || 0;\n g[i] = color.g || 0;\n b[i] = color.b || 0;\n }\n r = spline(r);\n g = spline(g);\n b = spline(b);\n color.opacity = 1;\n return function(t) {\n color.r = r(t);\n color.g = g(t);\n color.b = b(t);\n return color + \"\";\n };\n };\n}\n\nexport var rgbBasis = rgbSpline(basis);\nexport var rgbBasisClosed = rgbSpline(basisClosed);\n","import value from \"./value.js\";\nimport numberArray, {isNumberArray} from \"./numberArray.js\";\n\nexport default function(a, b) {\n return (isNumberArray(b) ? numberArray : genericArray)(a, b);\n}\n\nexport function genericArray(a, b) {\n var nb = b ? b.length : 0,\n na = a ? Math.min(nb, a.length) : 0,\n x = new Array(na),\n c = new Array(nb),\n i;\n\n for (i = 0; i < na; ++i) x[i] = value(a[i], b[i]);\n for (; i < nb; ++i) c[i] = b[i];\n\n return function(t) {\n for (i = 0; i < na; ++i) c[i] = x[i](t);\n return c;\n };\n}\n","export default function(a, b) {\n var d = new Date;\n return a = +a, b = +b, function(t) {\n return d.setTime(a * (1 - t) + b * t), d;\n };\n}\n","export default function(a, b) {\n return a = +a, b = +b, function(t) {\n return a * (1 - t) + b * t;\n };\n}\n","import value from \"./value.js\";\n\nexport default function(a, b) {\n var i = {},\n c = {},\n k;\n\n if (a === null || typeof a !== \"object\") a = {};\n if (b === null || typeof b !== \"object\") b = {};\n\n for (k in b) {\n if (k in a) {\n i[k] = value(a[k], b[k]);\n } else {\n c[k] = b[k];\n }\n }\n\n return function(t) {\n for (k in i) c[k] = i[k](t);\n return c;\n };\n}\n","import {basis} from \"./basis.js\";\n\nexport default function(values) {\n var n = values.length;\n return function(t) {\n var i = Math.floor(((t %= 1) < 0 ? ++t : t) * n),\n v0 = values[(i + n - 1) % n],\n v1 = values[i % n],\n v2 = values[(i + 1) % n],\n v3 = values[(i + 2) % n];\n return basis((t - i / n) * n, v0, v1, v2, v3);\n };\n}\n","import number from \"./number.js\";\n\nvar reA = /[-+]?(?:\\d+\\.?\\d*|\\.?\\d+)(?:[eE][-+]?\\d+)?/g,\n reB = new RegExp(reA.source, \"g\");\n\nfunction zero(b) {\n return function() {\n return b;\n };\n}\n\nfunction one(b) {\n return function(t) {\n return b(t) + \"\";\n };\n}\n\nexport default function(a, b) {\n var bi = reA.lastIndex = reB.lastIndex = 0, // scan index for next number in b\n am, // current match in a\n bm, // current match in b\n bs, // string preceding current number in b, if any\n i = -1, // index in s\n s = [], // string constants and placeholders\n q = []; // number interpolators\n\n // Coerce inputs to strings.\n a = a + \"\", b = b + \"\";\n\n // Interpolate pairs of numbers in a & b.\n while ((am = reA.exec(a))\n && (bm = reB.exec(b))) {\n if ((bs = bm.index) > bi) { // a string precedes the next number in b\n bs = b.slice(bi, bs);\n if (s[i]) s[i] += bs; // coalesce with previous string\n else s[++i] = bs;\n }\n if ((am = am[0]) === (bm = bm[0])) { // numbers in a & b match\n if (s[i]) s[i] += bm; // coalesce with previous string\n else s[++i] = bm;\n } else { // interpolate non-matching numbers\n s[++i] = null;\n q.push({i: i, x: number(am, bm)});\n }\n bi = reB.lastIndex;\n }\n\n // Add remains of b.\n if (bi < b.length) {\n bs = b.slice(bi);\n if (s[i]) s[i] += bs; // coalesce with previous string\n else s[++i] = bs;\n }\n\n // Special optimization for only a single match.\n // Otherwise, interpolate each of the numbers and rejoin the string.\n return s.length < 2 ? (q[0]\n ? one(q[0].x)\n : zero(b))\n : (b = q.length, function(t) {\n for (var i = 0, o; i < b; ++i) s[(o = q[i]).i] = o.x(t);\n return s.join(\"\");\n });\n}\n","export default function(a, b) {\n if (!b) b = [];\n var n = a ? Math.min(b.length, a.length) : 0,\n c = b.slice(),\n i;\n return function(t) {\n for (i = 0; i < n; ++i) c[i] = a[i] * (1 - t) + b[i] * t;\n return c;\n };\n}\n\nexport function isNumberArray(x) {\n return ArrayBuffer.isView(x) && !(x instanceof DataView);\n}\n","import {color} from \"d3-color\";\nimport rgb from \"./rgb.js\";\nimport {genericArray} from \"./array.js\";\nimport date from \"./date.js\";\nimport number from \"./number.js\";\nimport object from \"./object.js\";\nimport string from \"./string.js\";\nimport constant from \"./constant.js\";\nimport numberArray, {isNumberArray} from \"./numberArray.js\";\n\nexport default function(a, b) {\n var t = typeof b, c;\n return b == null || t === \"boolean\" ? constant(b)\n : (t === \"number\" ? number\n : t === \"string\" ? ((c = color(b)) ? (b = c, rgb) : string)\n : b instanceof color ? rgb\n : b instanceof Date ? date\n : isNumberArray(b) ? numberArray\n : Array.isArray(b) ? genericArray\n : typeof b.valueOf !== \"function\" && typeof b.toString !== \"function\" || isNaN(b) ? object\n : number)(a, b);\n}\n","import sourceEvent from \"./sourceEvent.js\";\n\nexport default function(event, node) {\n event = sourceEvent(event);\n if (node === undefined) node = event.currentTarget;\n if (node) {\n var svg = node.ownerSVGElement || node;\n if (svg.createSVGPoint) {\n var point = svg.createSVGPoint();\n point.x = event.clientX, point.y = event.clientY;\n point = point.matrixTransform(node.getScreenCTM().inverse());\n return [point.x, point.y];\n }\n if (node.getBoundingClientRect) {\n var rect = node.getBoundingClientRect();\n return [event.clientX - rect.left - node.clientLeft, event.clientY - rect.top - node.clientTop];\n }\n }\n return [event.pageX, event.pageY];\n}\n","export default function(event) {\n let sourceEvent;\n while (sourceEvent = event.sourceEvent) event = sourceEvent;\n return event;\n}\n","var frame = 0, // is an animation frame pending?\n timeout = 0, // is a timeout pending?\n interval = 0, // are any timers active?\n pokeDelay = 1000, // how frequently we check for clock skew\n taskHead,\n taskTail,\n clockLast = 0,\n clockNow = 0,\n clockSkew = 0,\n clock = typeof performance === \"object\" && performance.now ? performance : Date,\n setFrame = typeof window === \"object\" && window.requestAnimationFrame ? window.requestAnimationFrame.bind(window) : function(f) { setTimeout(f, 17); };\n\nexport function now() {\n return clockNow || (setFrame(clearNow), clockNow = clock.now() + clockSkew);\n}\n\nfunction clearNow() {\n clockNow = 0;\n}\n\nexport function Timer() {\n this._call =\n this._time =\n this._next = null;\n}\n\nTimer.prototype = timer.prototype = {\n constructor: Timer,\n restart: function(callback, delay, time) {\n if (typeof callback !== \"function\") throw new TypeError(\"callback is not a function\");\n time = (time == null ? now() : +time) + (delay == null ? 0 : +delay);\n if (!this._next && taskTail !== this) {\n if (taskTail) taskTail._next = this;\n else taskHead = this;\n taskTail = this;\n }\n this._call = callback;\n this._time = time;\n sleep();\n },\n stop: function() {\n if (this._call) {\n this._call = null;\n this._time = Infinity;\n sleep();\n }\n }\n};\n\nexport function timer(callback, delay, time) {\n var t = new Timer;\n t.restart(callback, delay, time);\n return t;\n}\n\nexport function timerFlush() {\n now(); // Get the current time, if not already set.\n ++frame; // Pretend we’ve set an alarm, if we haven’t already.\n var t = taskHead, e;\n while (t) {\n if ((e = clockNow - t._time) >= 0) t._call.call(null, e);\n t = t._next;\n }\n --frame;\n}\n\nfunction wake() {\n clockNow = (clockLast = clock.now()) + clockSkew;\n frame = timeout = 0;\n try {\n timerFlush();\n } finally {\n frame = 0;\n nap();\n clockNow = 0;\n }\n}\n\nfunction poke() {\n var now = clock.now(), delay = now - clockLast;\n if (delay > pokeDelay) clockSkew -= delay, clockLast = now;\n}\n\nfunction nap() {\n var t0, t1 = taskHead, t2, time = Infinity;\n while (t1) {\n if (t1._call) {\n if (time > t1._time) time = t1._time;\n t0 = t1, t1 = t1._next;\n } else {\n t2 = t1._next, t1._next = null;\n t1 = t0 ? t0._next = t2 : taskHead = t2;\n }\n }\n taskTail = t0;\n sleep(time);\n}\n\nfunction sleep(time) {\n if (frame) return; // Soonest alarm already set, or will be.\n if (timeout) timeout = clearTimeout(timeout);\n var delay = time - clockNow; // Strictly less than if we recomputed clockNow.\n if (delay > 24) {\n if (time < Infinity) timeout = setTimeout(wake, time - clock.now() - clockSkew);\n if (interval) interval = clearInterval(interval);\n } else {\n if (!interval) clockLast = clock.now(), interval = setInterval(poke, pokeDelay);\n frame = 1, setFrame(wake);\n }\n}\n","import {Timer} from \"./timer.js\";\n\nexport default function(callback, delay, time) {\n var t = new Timer;\n delay = delay == null ? 0 : +delay;\n t.restart(elapsed => {\n t.stop();\n callback(elapsed + delay);\n }, delay, time);\n return t;\n}\n","import {dispatch} from \"d3-dispatch\";\nimport {timer, timeout} from \"d3-timer\";\n\nvar emptyOn = dispatch(\"start\", \"end\", \"cancel\", \"interrupt\");\nvar emptyTween = [];\n\nexport var CREATED = 0;\nexport var SCHEDULED = 1;\nexport var STARTING = 2;\nexport var STARTED = 3;\nexport var RUNNING = 4;\nexport var ENDING = 5;\nexport var ENDED = 6;\n\nexport default function(node, name, id, index, group, timing) {\n var schedules = node.__transition;\n if (!schedules) node.__transition = {};\n else if (id in schedules) return;\n create(node, id, {\n name: name,\n index: index, // For context during callback.\n group: group, // For context during callback.\n on: emptyOn,\n tween: emptyTween,\n time: timing.time,\n delay: timing.delay,\n duration: timing.duration,\n ease: timing.ease,\n timer: null,\n state: CREATED\n });\n}\n\nexport function init(node, id) {\n var schedule = get(node, id);\n if (schedule.state > CREATED) throw new Error(\"too late; already scheduled\");\n return schedule;\n}\n\nexport function set(node, id) {\n var schedule = get(node, id);\n if (schedule.state > STARTED) throw new Error(\"too late; already running\");\n return schedule;\n}\n\nexport function get(node, id) {\n var schedule = node.__transition;\n if (!schedule || !(schedule = schedule[id])) throw new Error(\"transition not found\");\n return schedule;\n}\n\nfunction create(node, id, self) {\n var schedules = node.__transition,\n tween;\n\n // Initialize the self timer when the transition is created.\n // Note the actual delay is not known until the first callback!\n schedules[id] = self;\n self.timer = timer(schedule, 0, self.time);\n\n function schedule(elapsed) {\n self.state = SCHEDULED;\n self.timer.restart(start, self.delay, self.time);\n\n // If the elapsed delay is less than our first sleep, start immediately.\n if (self.delay <= elapsed) start(elapsed - self.delay);\n }\n\n function start(elapsed) {\n var i, j, n, o;\n\n // If the state is not SCHEDULED, then we previously errored on start.\n if (self.state !== SCHEDULED) return stop();\n\n for (i in schedules) {\n o = schedules[i];\n if (o.name !== self.name) continue;\n\n // While this element already has a starting transition during this frame,\n // defer starting an interrupting transition until that transition has a\n // chance to tick (and possibly end); see d3/d3-transition#54!\n if (o.state === STARTED) return timeout(start);\n\n // Interrupt the active transition, if any.\n if (o.state === RUNNING) {\n o.state = ENDED;\n o.timer.stop();\n o.on.call(\"interrupt\", node, node.__data__, o.index, o.group);\n delete schedules[i];\n }\n\n // Cancel any pre-empted transitions.\n else if (+i < id) {\n o.state = ENDED;\n o.timer.stop();\n o.on.call(\"cancel\", node, node.__data__, o.index, o.group);\n delete schedules[i];\n }\n }\n\n // Defer the first tick to end of the current frame; see d3/d3#1576.\n // Note the transition may be canceled after start and before the first tick!\n // Note this must be scheduled before the start event; see d3/d3-transition#16!\n // Assuming this is successful, subsequent callbacks go straight to tick.\n timeout(function() {\n if (self.state === STARTED) {\n self.state = RUNNING;\n self.timer.restart(tick, self.delay, self.time);\n tick(elapsed);\n }\n });\n\n // Dispatch the start event.\n // Note this must be done before the tween are initialized.\n self.state = STARTING;\n self.on.call(\"start\", node, node.__data__, self.index, self.group);\n if (self.state !== STARTING) return; // interrupted\n self.state = STARTED;\n\n // Initialize the tween, deleting null tween.\n tween = new Array(n = self.tween.length);\n for (i = 0, j = -1; i < n; ++i) {\n if (o = self.tween[i].value.call(node, node.__data__, self.index, self.group)) {\n tween[++j] = o;\n }\n }\n tween.length = j + 1;\n }\n\n function tick(elapsed) {\n var t = elapsed < self.duration ? self.ease.call(null, elapsed / self.duration) : (self.timer.restart(stop), self.state = ENDING, 1),\n i = -1,\n n = tween.length;\n\n while (++i < n) {\n tween[i].call(node, t);\n }\n\n // Dispatch the end event.\n if (self.state === ENDING) {\n self.on.call(\"end\", node, node.__data__, self.index, self.group);\n stop();\n }\n }\n\n function stop() {\n self.state = ENDED;\n self.timer.stop();\n delete schedules[id];\n for (var i in schedules) return; // eslint-disable-line no-unused-vars\n delete node.__transition;\n }\n}\n","import {STARTING, ENDING, ENDED} from \"./transition/schedule.js\";\n\nexport default function(node, name) {\n var schedules = node.__transition,\n schedule,\n active,\n empty = true,\n i;\n\n if (!schedules) return;\n\n name = name == null ? null : name + \"\";\n\n for (i in schedules) {\n if ((schedule = schedules[i]).name !== name) { empty = false; continue; }\n active = schedule.state > STARTING && schedule.state < ENDING;\n schedule.state = ENDED;\n schedule.timer.stop();\n schedule.on.call(active ? \"interrupt\" : \"cancel\", node, node.__data__, schedule.index, schedule.group);\n delete schedules[i];\n }\n\n if (empty) delete node.__transition;\n}\n","var degrees = 180 / Math.PI;\n\nexport var identity = {\n translateX: 0,\n translateY: 0,\n rotate: 0,\n skewX: 0,\n scaleX: 1,\n scaleY: 1\n};\n\nexport default function(a, b, c, d, e, f) {\n var scaleX, scaleY, skewX;\n if (scaleX = Math.sqrt(a * a + b * b)) a /= scaleX, b /= scaleX;\n if (skewX = a * c + b * d) c -= a * skewX, d -= b * skewX;\n if (scaleY = Math.sqrt(c * c + d * d)) c /= scaleY, d /= scaleY, skewX /= scaleY;\n if (a * d < b * c) a = -a, b = -b, skewX = -skewX, scaleX = -scaleX;\n return {\n translateX: e,\n translateY: f,\n rotate: Math.atan2(b, a) * degrees,\n skewX: Math.atan(skewX) * degrees,\n scaleX: scaleX,\n scaleY: scaleY\n };\n}\n","import decompose, {identity} from \"./decompose.js\";\n\nvar svgNode;\n\n/* eslint-disable no-undef */\nexport function parseCss(value) {\n const m = new (typeof DOMMatrix === \"function\" ? DOMMatrix : WebKitCSSMatrix)(value + \"\");\n return m.isIdentity ? identity : decompose(m.a, m.b, m.c, m.d, m.e, m.f);\n}\n\nexport function parseSvg(value) {\n if (value == null) return identity;\n if (!svgNode) svgNode = document.createElementNS(\"http://www.w3.org/2000/svg\", \"g\");\n svgNode.setAttribute(\"transform\", value);\n if (!(value = svgNode.transform.baseVal.consolidate())) return identity;\n value = value.matrix;\n return decompose(value.a, value.b, value.c, value.d, value.e, value.f);\n}\n","import number from \"../number.js\";\nimport {parseCss, parseSvg} from \"./parse.js\";\n\nfunction interpolateTransform(parse, pxComma, pxParen, degParen) {\n\n function pop(s) {\n return s.length ? s.pop() + \" \" : \"\";\n }\n\n function translate(xa, ya, xb, yb, s, q) {\n if (xa !== xb || ya !== yb) {\n var i = s.push(\"translate(\", null, pxComma, null, pxParen);\n q.push({i: i - 4, x: number(xa, xb)}, {i: i - 2, x: number(ya, yb)});\n } else if (xb || yb) {\n s.push(\"translate(\" + xb + pxComma + yb + pxParen);\n }\n }\n\n function rotate(a, b, s, q) {\n if (a !== b) {\n if (a - b > 180) b += 360; else if (b - a > 180) a += 360; // shortest path\n q.push({i: s.push(pop(s) + \"rotate(\", null, degParen) - 2, x: number(a, b)});\n } else if (b) {\n s.push(pop(s) + \"rotate(\" + b + degParen);\n }\n }\n\n function skewX(a, b, s, q) {\n if (a !== b) {\n q.push({i: s.push(pop(s) + \"skewX(\", null, degParen) - 2, x: number(a, b)});\n } else if (b) {\n s.push(pop(s) + \"skewX(\" + b + degParen);\n }\n }\n\n function scale(xa, ya, xb, yb, s, q) {\n if (xa !== xb || ya !== yb) {\n var i = s.push(pop(s) + \"scale(\", null, \",\", null, \")\");\n q.push({i: i - 4, x: number(xa, xb)}, {i: i - 2, x: number(ya, yb)});\n } else if (xb !== 1 || yb !== 1) {\n s.push(pop(s) + \"scale(\" + xb + \",\" + yb + \")\");\n }\n }\n\n return function(a, b) {\n var s = [], // string constants and placeholders\n q = []; // number interpolators\n a = parse(a), b = parse(b);\n translate(a.translateX, a.translateY, b.translateX, b.translateY, s, q);\n rotate(a.rotate, b.rotate, s, q);\n skewX(a.skewX, b.skewX, s, q);\n scale(a.scaleX, a.scaleY, b.scaleX, b.scaleY, s, q);\n a = b = null; // gc\n return function(t) {\n var i = -1, n = q.length, o;\n while (++i < n) s[(o = q[i]).i] = o.x(t);\n return s.join(\"\");\n };\n };\n}\n\nexport var interpolateTransformCss = interpolateTransform(parseCss, \"px, \", \"px)\", \"deg)\");\nexport var interpolateTransformSvg = interpolateTransform(parseSvg, \", \", \")\", \")\");\n","import {get, set} from \"./schedule.js\";\n\nfunction tweenRemove(id, name) {\n var tween0, tween1;\n return function() {\n var schedule = set(this, id),\n tween = schedule.tween;\n\n // If this node shared tween with the previous node,\n // just assign the updated shared tween and we’re done!\n // Otherwise, copy-on-write.\n if (tween !== tween0) {\n tween1 = tween0 = tween;\n for (var i = 0, n = tween1.length; i < n; ++i) {\n if (tween1[i].name === name) {\n tween1 = tween1.slice();\n tween1.splice(i, 1);\n break;\n }\n }\n }\n\n schedule.tween = tween1;\n };\n}\n\nfunction tweenFunction(id, name, value) {\n var tween0, tween1;\n if (typeof value !== \"function\") throw new Error;\n return function() {\n var schedule = set(this, id),\n tween = schedule.tween;\n\n // If this node shared tween with the previous node,\n // just assign the updated shared tween and we’re done!\n // Otherwise, copy-on-write.\n if (tween !== tween0) {\n tween1 = (tween0 = tween).slice();\n for (var t = {name: name, value: value}, i = 0, n = tween1.length; i < n; ++i) {\n if (tween1[i].name === name) {\n tween1[i] = t;\n break;\n }\n }\n if (i === n) tween1.push(t);\n }\n\n schedule.tween = tween1;\n };\n}\n\nexport default function(name, value) {\n var id = this._id;\n\n name += \"\";\n\n if (arguments.length < 2) {\n var tween = get(this.node(), id).tween;\n for (var i = 0, n = tween.length, t; i < n; ++i) {\n if ((t = tween[i]).name === name) {\n return t.value;\n }\n }\n return null;\n }\n\n return this.each((value == null ? tweenRemove : tweenFunction)(id, name, value));\n}\n\nexport function tweenValue(transition, name, value) {\n var id = transition._id;\n\n transition.each(function() {\n var schedule = set(this, id);\n (schedule.value || (schedule.value = {}))[name] = value.apply(this, arguments);\n });\n\n return function(node) {\n return get(node, id).value[name];\n };\n}\n","import {color} from \"d3-color\";\nimport {interpolateNumber, interpolateRgb, interpolateString} from \"d3-interpolate\";\n\nexport default function(a, b) {\n var c;\n return (typeof b === \"number\" ? interpolateNumber\n : b instanceof color ? interpolateRgb\n : (c = color(b)) ? (b = c, interpolateRgb)\n : interpolateString)(a, b);\n}\n","import {interpolateTransformSvg as interpolateTransform} from \"d3-interpolate\";\nimport {namespace} from \"d3-selection\";\nimport {tweenValue} from \"./tween.js\";\nimport interpolate from \"./interpolate.js\";\n\nfunction attrRemove(name) {\n return function() {\n this.removeAttribute(name);\n };\n}\n\nfunction attrRemoveNS(fullname) {\n return function() {\n this.removeAttributeNS(fullname.space, fullname.local);\n };\n}\n\nfunction attrConstant(name, interpolate, value1) {\n var string00,\n string1 = value1 + \"\",\n interpolate0;\n return function() {\n var string0 = this.getAttribute(name);\n return string0 === string1 ? null\n : string0 === string00 ? interpolate0\n : interpolate0 = interpolate(string00 = string0, value1);\n };\n}\n\nfunction attrConstantNS(fullname, interpolate, value1) {\n var string00,\n string1 = value1 + \"\",\n interpolate0;\n return function() {\n var string0 = this.getAttributeNS(fullname.space, fullname.local);\n return string0 === string1 ? null\n : string0 === string00 ? interpolate0\n : interpolate0 = interpolate(string00 = string0, value1);\n };\n}\n\nfunction attrFunction(name, interpolate, value) {\n var string00,\n string10,\n interpolate0;\n return function() {\n var string0, value1 = value(this), string1;\n if (value1 == null) return void this.removeAttribute(name);\n string0 = this.getAttribute(name);\n string1 = value1 + \"\";\n return string0 === string1 ? null\n : string0 === string00 && string1 === string10 ? interpolate0\n : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1));\n };\n}\n\nfunction attrFunctionNS(fullname, interpolate, value) {\n var string00,\n string10,\n interpolate0;\n return function() {\n var string0, value1 = value(this), string1;\n if (value1 == null) return void this.removeAttributeNS(fullname.space, fullname.local);\n string0 = this.getAttributeNS(fullname.space, fullname.local);\n string1 = value1 + \"\";\n return string0 === string1 ? null\n : string0 === string00 && string1 === string10 ? interpolate0\n : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1));\n };\n}\n\nexport default function(name, value) {\n var fullname = namespace(name), i = fullname === \"transform\" ? interpolateTransform : interpolate;\n return this.attrTween(name, typeof value === \"function\"\n ? (fullname.local ? attrFunctionNS : attrFunction)(fullname, i, tweenValue(this, \"attr.\" + name, value))\n : value == null ? (fullname.local ? attrRemoveNS : attrRemove)(fullname)\n : (fullname.local ? attrConstantNS : attrConstant)(fullname, i, value));\n}\n","import {namespace} from \"d3-selection\";\n\nfunction attrInterpolate(name, i) {\n return function(t) {\n this.setAttribute(name, i.call(this, t));\n };\n}\n\nfunction attrInterpolateNS(fullname, i) {\n return function(t) {\n this.setAttributeNS(fullname.space, fullname.local, i.call(this, t));\n };\n}\n\nfunction attrTweenNS(fullname, value) {\n var t0, i0;\n function tween() {\n var i = value.apply(this, arguments);\n if (i !== i0) t0 = (i0 = i) && attrInterpolateNS(fullname, i);\n return t0;\n }\n tween._value = value;\n return tween;\n}\n\nfunction attrTween(name, value) {\n var t0, i0;\n function tween() {\n var i = value.apply(this, arguments);\n if (i !== i0) t0 = (i0 = i) && attrInterpolate(name, i);\n return t0;\n }\n tween._value = value;\n return tween;\n}\n\nexport default function(name, value) {\n var key = \"attr.\" + name;\n if (arguments.length < 2) return (key = this.tween(key)) && key._value;\n if (value == null) return this.tween(key, null);\n if (typeof value !== \"function\") throw new Error;\n var fullname = namespace(name);\n return this.tween(key, (fullname.local ? attrTweenNS : attrTween)(fullname, value));\n}\n","import {get, init} from \"./schedule.js\";\n\nfunction delayFunction(id, value) {\n return function() {\n init(this, id).delay = +value.apply(this, arguments);\n };\n}\n\nfunction delayConstant(id, value) {\n return value = +value, function() {\n init(this, id).delay = value;\n };\n}\n\nexport default function(value) {\n var id = this._id;\n\n return arguments.length\n ? this.each((typeof value === \"function\"\n ? delayFunction\n : delayConstant)(id, value))\n : get(this.node(), id).delay;\n}\n","import {get, set} from \"./schedule.js\";\n\nfunction durationFunction(id, value) {\n return function() {\n set(this, id).duration = +value.apply(this, arguments);\n };\n}\n\nfunction durationConstant(id, value) {\n return value = +value, function() {\n set(this, id).duration = value;\n };\n}\n\nexport default function(value) {\n var id = this._id;\n\n return arguments.length\n ? this.each((typeof value === \"function\"\n ? durationFunction\n : durationConstant)(id, value))\n : get(this.node(), id).duration;\n}\n","import {get, set} from \"./schedule.js\";\n\nfunction easeConstant(id, value) {\n if (typeof value !== \"function\") throw new Error;\n return function() {\n set(this, id).ease = value;\n };\n}\n\nexport default function(value) {\n var id = this._id;\n\n return arguments.length\n ? this.each(easeConstant(id, value))\n : get(this.node(), id).ease;\n}\n","import {get, set, init} from \"./schedule.js\";\n\nfunction start(name) {\n return (name + \"\").trim().split(/^|\\s+/).every(function(t) {\n var i = t.indexOf(\".\");\n if (i >= 0) t = t.slice(0, i);\n return !t || t === \"start\";\n });\n}\n\nfunction onFunction(id, name, listener) {\n var on0, on1, sit = start(name) ? init : set;\n return function() {\n var schedule = sit(this, id),\n on = schedule.on;\n\n // If this node shared a dispatch with the previous node,\n // just assign the updated shared dispatch and we’re done!\n // Otherwise, copy-on-write.\n if (on !== on0) (on1 = (on0 = on).copy()).on(name, listener);\n\n schedule.on = on1;\n };\n}\n\nexport default function(name, listener) {\n var id = this._id;\n\n return arguments.length < 2\n ? get(this.node(), id).on.on(name)\n : this.each(onFunction(id, name, listener));\n}\n","import {selection} from \"d3-selection\";\n\nvar Selection = selection.prototype.constructor;\n\nexport default function() {\n return new Selection(this._groups, this._parents);\n}\n","import {interpolateTransformCss as interpolateTransform} from \"d3-interpolate\";\nimport {style} from \"d3-selection\";\nimport {set} from \"./schedule.js\";\nimport {tweenValue} from \"./tween.js\";\nimport interpolate from \"./interpolate.js\";\n\nfunction styleNull(name, interpolate) {\n var string00,\n string10,\n interpolate0;\n return function() {\n var string0 = style(this, name),\n string1 = (this.style.removeProperty(name), style(this, name));\n return string0 === string1 ? null\n : string0 === string00 && string1 === string10 ? interpolate0\n : interpolate0 = interpolate(string00 = string0, string10 = string1);\n };\n}\n\nfunction styleRemove(name) {\n return function() {\n this.style.removeProperty(name);\n };\n}\n\nfunction styleConstant(name, interpolate, value1) {\n var string00,\n string1 = value1 + \"\",\n interpolate0;\n return function() {\n var string0 = style(this, name);\n return string0 === string1 ? null\n : string0 === string00 ? interpolate0\n : interpolate0 = interpolate(string00 = string0, value1);\n };\n}\n\nfunction styleFunction(name, interpolate, value) {\n var string00,\n string10,\n interpolate0;\n return function() {\n var string0 = style(this, name),\n value1 = value(this),\n string1 = value1 + \"\";\n if (value1 == null) string1 = value1 = (this.style.removeProperty(name), style(this, name));\n return string0 === string1 ? null\n : string0 === string00 && string1 === string10 ? interpolate0\n : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1));\n };\n}\n\nfunction styleMaybeRemove(id, name) {\n var on0, on1, listener0, key = \"style.\" + name, event = \"end.\" + key, remove;\n return function() {\n var schedule = set(this, id),\n on = schedule.on,\n listener = schedule.value[key] == null ? remove || (remove = styleRemove(name)) : undefined;\n\n // If this node shared a dispatch with the previous node,\n // just assign the updated shared dispatch and we’re done!\n // Otherwise, copy-on-write.\n if (on !== on0 || listener0 !== listener) (on1 = (on0 = on).copy()).on(event, listener0 = listener);\n\n schedule.on = on1;\n };\n}\n\nexport default function(name, value, priority) {\n var i = (name += \"\") === \"transform\" ? interpolateTransform : interpolate;\n return value == null ? this\n .styleTween(name, styleNull(name, i))\n .on(\"end.style.\" + name, styleRemove(name))\n : typeof value === \"function\" ? this\n .styleTween(name, styleFunction(name, i, tweenValue(this, \"style.\" + name, value)))\n .each(styleMaybeRemove(this._id, name))\n : this\n .styleTween(name, styleConstant(name, i, value), priority)\n .on(\"end.style.\" + name, null);\n}\n","function styleInterpolate(name, i, priority) {\n return function(t) {\n this.style.setProperty(name, i.call(this, t), priority);\n };\n}\n\nfunction styleTween(name, value, priority) {\n var t, i0;\n function tween() {\n var i = value.apply(this, arguments);\n if (i !== i0) t = (i0 = i) && styleInterpolate(name, i, priority);\n return t;\n }\n tween._value = value;\n return tween;\n}\n\nexport default function(name, value, priority) {\n var key = \"style.\" + (name += \"\");\n if (arguments.length < 2) return (key = this.tween(key)) && key._value;\n if (value == null) return this.tween(key, null);\n if (typeof value !== \"function\") throw new Error;\n return this.tween(key, styleTween(name, value, priority == null ? \"\" : priority));\n}\n","function textInterpolate(i) {\n return function(t) {\n this.textContent = i.call(this, t);\n };\n}\n\nfunction textTween(value) {\n var t0, i0;\n function tween() {\n var i = value.apply(this, arguments);\n if (i !== i0) t0 = (i0 = i) && textInterpolate(i);\n return t0;\n }\n tween._value = value;\n return tween;\n}\n\nexport default function(value) {\n var key = \"text\";\n if (arguments.length < 1) return (key = this.tween(key)) && key._value;\n if (value == null) return this.tween(key, null);\n if (typeof value !== \"function\") throw new Error;\n return this.tween(key, textTween(value));\n}\n","import {selection} from \"d3-selection\";\nimport transition_attr from \"./attr.js\";\nimport transition_attrTween from \"./attrTween.js\";\nimport transition_delay from \"./delay.js\";\nimport transition_duration from \"./duration.js\";\nimport transition_ease from \"./ease.js\";\nimport transition_easeVarying from \"./easeVarying.js\";\nimport transition_filter from \"./filter.js\";\nimport transition_merge from \"./merge.js\";\nimport transition_on from \"./on.js\";\nimport transition_remove from \"./remove.js\";\nimport transition_select from \"./select.js\";\nimport transition_selectAll from \"./selectAll.js\";\nimport transition_selection from \"./selection.js\";\nimport transition_style from \"./style.js\";\nimport transition_styleTween from \"./styleTween.js\";\nimport transition_text from \"./text.js\";\nimport transition_textTween from \"./textTween.js\";\nimport transition_transition from \"./transition.js\";\nimport transition_tween from \"./tween.js\";\nimport transition_end from \"./end.js\";\n\nvar id = 0;\n\nexport function Transition(groups, parents, name, id) {\n this._groups = groups;\n this._parents = parents;\n this._name = name;\n this._id = id;\n}\n\nexport default function transition(name) {\n return selection().transition(name);\n}\n\nexport function newId() {\n return ++id;\n}\n\nvar selection_prototype = selection.prototype;\n\nTransition.prototype = transition.prototype = {\n constructor: Transition,\n select: transition_select,\n selectAll: transition_selectAll,\n filter: transition_filter,\n merge: transition_merge,\n selection: transition_selection,\n transition: transition_transition,\n call: selection_prototype.call,\n nodes: selection_prototype.nodes,\n node: selection_prototype.node,\n size: selection_prototype.size,\n empty: selection_prototype.empty,\n each: selection_prototype.each,\n on: transition_on,\n attr: transition_attr,\n attrTween: transition_attrTween,\n style: transition_style,\n styleTween: transition_styleTween,\n text: transition_text,\n textTween: transition_textTween,\n remove: transition_remove,\n tween: transition_tween,\n delay: transition_delay,\n duration: transition_duration,\n ease: transition_ease,\n easeVarying: transition_easeVarying,\n end: transition_end,\n [Symbol.iterator]: selection_prototype[Symbol.iterator]\n};\n","import {selector} from \"d3-selection\";\nimport {Transition} from \"./index.js\";\nimport schedule, {get} from \"./schedule.js\";\n\nexport default function(select) {\n var name = this._name,\n id = this._id;\n\n if (typeof select !== \"function\") select = selector(select);\n\n for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) {\n if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) {\n if (\"__data__\" in node) subnode.__data__ = node.__data__;\n subgroup[i] = subnode;\n schedule(subgroup[i], name, id, i, subgroup, get(node, id));\n }\n }\n }\n\n return new Transition(subgroups, this._parents, name, id);\n}\n","import {selectorAll} from \"d3-selection\";\nimport {Transition} from \"./index.js\";\nimport schedule, {get} from \"./schedule.js\";\n\nexport default function(select) {\n var name = this._name,\n id = this._id;\n\n if (typeof select !== \"function\") select = selectorAll(select);\n\n for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {\n if (node = group[i]) {\n for (var children = select.call(node, node.__data__, i, group), child, inherit = get(node, id), k = 0, l = children.length; k < l; ++k) {\n if (child = children[k]) {\n schedule(child, name, id, k, children, inherit);\n }\n }\n subgroups.push(children);\n parents.push(node);\n }\n }\n }\n\n return new Transition(subgroups, parents, name, id);\n}\n","import {matcher} from \"d3-selection\";\nimport {Transition} from \"./index.js\";\n\nexport default function(match) {\n if (typeof match !== \"function\") match = matcher(match);\n\n for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) {\n if ((node = group[i]) && match.call(node, node.__data__, i, group)) {\n subgroup.push(node);\n }\n }\n }\n\n return new Transition(subgroups, this._parents, this._name, this._id);\n}\n","import {Transition} from \"./index.js\";\n\nexport default function(transition) {\n if (transition._id !== this._id) throw new Error;\n\n for (var groups0 = this._groups, groups1 = transition._groups, m0 = groups0.length, m1 = groups1.length, m = Math.min(m0, m1), merges = new Array(m0), j = 0; j < m; ++j) {\n for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) {\n if (node = group0[i] || group1[i]) {\n merge[i] = node;\n }\n }\n }\n\n for (; j < m0; ++j) {\n merges[j] = groups0[j];\n }\n\n return new Transition(merges, this._parents, this._name, this._id);\n}\n","import {Transition, newId} from \"./index.js\";\nimport schedule, {get} from \"./schedule.js\";\n\nexport default function() {\n var name = this._name,\n id0 = this._id,\n id1 = newId();\n\n for (var groups = this._groups, m = groups.length, j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {\n if (node = group[i]) {\n var inherit = get(node, id0);\n schedule(node, name, id1, i, group, {\n time: inherit.time + inherit.delay + inherit.duration,\n delay: 0,\n duration: inherit.duration,\n ease: inherit.ease\n });\n }\n }\n }\n\n return new Transition(groups, this._parents, name, id1);\n}\n","import {tweenValue} from \"./tween.js\";\n\nfunction textConstant(value) {\n return function() {\n this.textContent = value;\n };\n}\n\nfunction textFunction(value) {\n return function() {\n var value1 = value(this);\n this.textContent = value1 == null ? \"\" : value1;\n };\n}\n\nexport default function(value) {\n return this.tween(\"text\", typeof value === \"function\"\n ? textFunction(tweenValue(this, \"text\", value))\n : textConstant(value == null ? \"\" : value + \"\"));\n}\n","function removeFunction(id) {\n return function() {\n var parent = this.parentNode;\n for (var i in this.__transition) if (+i !== id) return;\n if (parent) parent.removeChild(this);\n };\n}\n\nexport default function() {\n return this.on(\"end.remove\", removeFunction(this._id));\n}\n","import {set} from \"./schedule.js\";\n\nfunction easeVarying(id, value) {\n return function() {\n var v = value.apply(this, arguments);\n if (typeof v !== \"function\") throw new Error;\n set(this, id).ease = v;\n };\n}\n\nexport default function(value) {\n if (typeof value !== \"function\") throw new Error;\n return this.each(easeVarying(this._id, value));\n}\n","import {set} from \"./schedule.js\";\n\nexport default function() {\n var on0, on1, that = this, id = that._id, size = that.size();\n return new Promise(function(resolve, reject) {\n var cancel = {value: reject},\n end = {value: function() { if (--size === 0) resolve(); }};\n\n that.each(function() {\n var schedule = set(this, id),\n on = schedule.on;\n\n // If this node shared a dispatch with the previous node,\n // just assign the updated shared dispatch and we’re done!\n // Otherwise, copy-on-write.\n if (on !== on0) {\n on1 = (on0 = on).copy();\n on1._.cancel.push(cancel);\n on1._.interrupt.push(cancel);\n on1._.end.push(end);\n }\n\n schedule.on = on1;\n });\n\n // The selection was empty, resolve end immediately\n if (size === 0) resolve();\n });\n}\n","import {Transition, newId} from \"../transition/index.js\";\nimport schedule from \"../transition/schedule.js\";\nimport {easeCubicInOut} from \"d3-ease\";\nimport {now} from \"d3-timer\";\n\nvar defaultTiming = {\n time: null, // Set on use.\n delay: 0,\n duration: 250,\n ease: easeCubicInOut\n};\n\nfunction inherit(node, id) {\n var timing;\n while (!(timing = node.__transition) || !(timing = timing[id])) {\n if (!(node = node.parentNode)) {\n throw new Error(`transition ${id} not found`);\n }\n }\n return timing;\n}\n\nexport default function(name) {\n var id,\n timing;\n\n if (name instanceof Transition) {\n id = name._id, name = name._name;\n } else {\n id = newId(), (timing = defaultTiming).time = now(), name = name == null ? null : name + \"\";\n }\n\n for (var groups = this._groups, m = groups.length, j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {\n if (node = group[i]) {\n schedule(node, name, id, i, group, timing || inherit(node, id));\n }\n }\n }\n\n return new Transition(groups, this._parents, name, id);\n}\n","export function cubicIn(t) {\n return t * t * t;\n}\n\nexport function cubicOut(t) {\n return --t * t * t + 1;\n}\n\nexport function cubicInOut(t) {\n return ((t *= 2) <= 1 ? t * t * t : (t -= 2) * t * t + 2) / 2;\n}\n","import {selection} from \"d3-selection\";\nimport selection_interrupt from \"./interrupt.js\";\nimport selection_transition from \"./transition.js\";\n\nselection.prototype.interrupt = selection_interrupt;\nselection.prototype.transition = selection_transition;\n","import interrupt from \"../interrupt.js\";\n\nexport default function(name) {\n return this.each(function() {\n interrupt(this, name);\n });\n}\n","export default x => () => x;\n","export default function BrushEvent(type, {\n sourceEvent,\n target,\n selection,\n mode,\n dispatch\n}) {\n Object.defineProperties(this, {\n type: {value: type, enumerable: true, configurable: true},\n sourceEvent: {value: sourceEvent, enumerable: true, configurable: true},\n target: {value: target, enumerable: true, configurable: true},\n selection: {value: selection, enumerable: true, configurable: true},\n mode: {value: mode, enumerable: true, configurable: true},\n _: {value: dispatch}\n });\n}\n","export function nopropagation(event) {\n event.stopImmediatePropagation();\n}\n\nexport default function(event) {\n event.preventDefault();\n event.stopImmediatePropagation();\n}\n","import {dispatch} from \"d3-dispatch\";\nimport {dragDisable, dragEnable} from \"d3-drag\";\nimport {interpolate} from \"d3-interpolate\";\nimport {pointer, select} from \"d3-selection\";\nimport {interrupt} from \"d3-transition\";\nimport constant from \"./constant.js\";\nimport BrushEvent from \"./event.js\";\nimport noevent, {nopropagation} from \"./noevent.js\";\n\nvar MODE_DRAG = {name: \"drag\"},\n MODE_SPACE = {name: \"space\"},\n MODE_HANDLE = {name: \"handle\"},\n MODE_CENTER = {name: \"center\"};\n\nconst {abs, max, min} = Math;\n\nfunction number1(e) {\n return [+e[0], +e[1]];\n}\n\nfunction number2(e) {\n return [number1(e[0]), number1(e[1])];\n}\n\nvar X = {\n name: \"x\",\n handles: [\"w\", \"e\"].map(type),\n input: function(x, e) { return x == null ? null : [[+x[0], e[0][1]], [+x[1], e[1][1]]]; },\n output: function(xy) { return xy && [xy[0][0], xy[1][0]]; }\n};\n\nvar Y = {\n name: \"y\",\n handles: [\"n\", \"s\"].map(type),\n input: function(y, e) { return y == null ? null : [[e[0][0], +y[0]], [e[1][0], +y[1]]]; },\n output: function(xy) { return xy && [xy[0][1], xy[1][1]]; }\n};\n\nvar XY = {\n name: \"xy\",\n handles: [\"n\", \"w\", \"e\", \"s\", \"nw\", \"ne\", \"sw\", \"se\"].map(type),\n input: function(xy) { return xy == null ? null : number2(xy); },\n output: function(xy) { return xy; }\n};\n\nvar cursors = {\n overlay: \"crosshair\",\n selection: \"move\",\n n: \"ns-resize\",\n e: \"ew-resize\",\n s: \"ns-resize\",\n w: \"ew-resize\",\n nw: \"nwse-resize\",\n ne: \"nesw-resize\",\n se: \"nwse-resize\",\n sw: \"nesw-resize\"\n};\n\nvar flipX = {\n e: \"w\",\n w: \"e\",\n nw: \"ne\",\n ne: \"nw\",\n se: \"sw\",\n sw: \"se\"\n};\n\nvar flipY = {\n n: \"s\",\n s: \"n\",\n nw: \"sw\",\n ne: \"se\",\n se: \"ne\",\n sw: \"nw\"\n};\n\nvar signsX = {\n overlay: +1,\n selection: +1,\n n: null,\n e: +1,\n s: null,\n w: -1,\n nw: -1,\n ne: +1,\n se: +1,\n sw: -1\n};\n\nvar signsY = {\n overlay: +1,\n selection: +1,\n n: -1,\n e: null,\n s: +1,\n w: null,\n nw: -1,\n ne: -1,\n se: +1,\n sw: +1\n};\n\nfunction type(t) {\n return {type: t};\n}\n\n// Ignore right-click, since that should open the context menu.\nfunction defaultFilter(event) {\n return !event.ctrlKey && !event.button;\n}\n\nfunction defaultExtent() {\n var svg = this.ownerSVGElement || this;\n if (svg.hasAttribute(\"viewBox\")) {\n svg = svg.viewBox.baseVal;\n return [[svg.x, svg.y], [svg.x + svg.width, svg.y + svg.height]];\n }\n return [[0, 0], [svg.width.baseVal.value, svg.height.baseVal.value]];\n}\n\nfunction defaultTouchable() {\n return navigator.maxTouchPoints || (\"ontouchstart\" in this);\n}\n\n// Like d3.local, but with the name “__brush” rather than auto-generated.\nfunction local(node) {\n while (!node.__brush) if (!(node = node.parentNode)) return;\n return node.__brush;\n}\n\nfunction empty(extent) {\n return extent[0][0] === extent[1][0]\n || extent[0][1] === extent[1][1];\n}\n\nexport function brushSelection(node) {\n var state = node.__brush;\n return state ? state.dim.output(state.selection) : null;\n}\n\nexport function brushX() {\n return brush(X);\n}\n\nexport function brushY() {\n return brush(Y);\n}\n\nexport default function() {\n return brush(XY);\n}\n\nfunction brush(dim) {\n var extent = defaultExtent,\n filter = defaultFilter,\n touchable = defaultTouchable,\n keys = true,\n listeners = dispatch(\"start\", \"brush\", \"end\"),\n handleSize = 6,\n touchending;\n\n function brush(group) {\n var overlay = group\n .property(\"__brush\", initialize)\n .selectAll(\".overlay\")\n .data([type(\"overlay\")]);\n\n overlay.enter().append(\"rect\")\n .attr(\"class\", \"overlay\")\n .attr(\"pointer-events\", \"all\")\n .attr(\"cursor\", cursors.overlay)\n .merge(overlay)\n .each(function() {\n var extent = local(this).extent;\n select(this)\n .attr(\"x\", extent[0][0])\n .attr(\"y\", extent[0][1])\n .attr(\"width\", extent[1][0] - extent[0][0])\n .attr(\"height\", extent[1][1] - extent[0][1]);\n });\n\n group.selectAll(\".selection\")\n .data([type(\"selection\")])\n .enter().append(\"rect\")\n .attr(\"class\", \"selection\")\n .attr(\"cursor\", cursors.selection)\n .attr(\"fill\", \"#777\")\n .attr(\"fill-opacity\", 0.3)\n .attr(\"stroke\", \"#fff\")\n .attr(\"shape-rendering\", \"crispEdges\");\n\n var handle = group.selectAll(\".handle\")\n .data(dim.handles, function(d) { return d.type; });\n\n handle.exit().remove();\n\n handle.enter().append(\"rect\")\n .attr(\"class\", function(d) { return \"handle handle--\" + d.type; })\n .attr(\"cursor\", function(d) { return cursors[d.type]; });\n\n group\n .each(redraw)\n .attr(\"fill\", \"none\")\n .attr(\"pointer-events\", \"all\")\n .on(\"mousedown.brush\", started)\n .filter(touchable)\n .on(\"touchstart.brush\", started)\n .on(\"touchmove.brush\", touchmoved)\n .on(\"touchend.brush touchcancel.brush\", touchended)\n .style(\"touch-action\", \"none\")\n .style(\"-webkit-tap-highlight-color\", \"rgba(0,0,0,0)\");\n }\n\n brush.move = function(group, selection) {\n if (group.tween) {\n group\n .on(\"start.brush\", function(event) { emitter(this, arguments).beforestart().start(event); })\n .on(\"interrupt.brush end.brush\", function(event) { emitter(this, arguments).end(event); })\n .tween(\"brush\", function() {\n var that = this,\n state = that.__brush,\n emit = emitter(that, arguments),\n selection0 = state.selection,\n selection1 = dim.input(typeof selection === \"function\" ? selection.apply(this, arguments) : selection, state.extent),\n i = interpolate(selection0, selection1);\n\n function tween(t) {\n state.selection = t === 1 && selection1 === null ? null : i(t);\n redraw.call(that);\n emit.brush();\n }\n\n return selection0 !== null && selection1 !== null ? tween : tween(1);\n });\n } else {\n group\n .each(function() {\n var that = this,\n args = arguments,\n state = that.__brush,\n selection1 = dim.input(typeof selection === \"function\" ? selection.apply(that, args) : selection, state.extent),\n emit = emitter(that, args).beforestart();\n\n interrupt(that);\n state.selection = selection1 === null ? null : selection1;\n redraw.call(that);\n emit.start().brush().end();\n });\n }\n };\n\n brush.clear = function(group) {\n brush.move(group, null);\n };\n\n function redraw() {\n var group = select(this),\n selection = local(this).selection;\n\n if (selection) {\n group.selectAll(\".selection\")\n .style(\"display\", null)\n .attr(\"x\", selection[0][0])\n .attr(\"y\", selection[0][1])\n .attr(\"width\", selection[1][0] - selection[0][0])\n .attr(\"height\", selection[1][1] - selection[0][1]);\n\n group.selectAll(\".handle\")\n .style(\"display\", null)\n .attr(\"x\", function(d) { return d.type[d.type.length - 1] === \"e\" ? selection[1][0] - handleSize / 2 : selection[0][0] - handleSize / 2; })\n .attr(\"y\", function(d) { return d.type[0] === \"s\" ? selection[1][1] - handleSize / 2 : selection[0][1] - handleSize / 2; })\n .attr(\"width\", function(d) { return d.type === \"n\" || d.type === \"s\" ? selection[1][0] - selection[0][0] + handleSize : handleSize; })\n .attr(\"height\", function(d) { return d.type === \"e\" || d.type === \"w\" ? selection[1][1] - selection[0][1] + handleSize : handleSize; });\n }\n\n else {\n group.selectAll(\".selection,.handle\")\n .style(\"display\", \"none\")\n .attr(\"x\", null)\n .attr(\"y\", null)\n .attr(\"width\", null)\n .attr(\"height\", null);\n }\n }\n\n function emitter(that, args, clean) {\n var emit = that.__brush.emitter;\n return emit && (!clean || !emit.clean) ? emit : new Emitter(that, args, clean);\n }\n\n function Emitter(that, args, clean) {\n this.that = that;\n this.args = args;\n this.state = that.__brush;\n this.active = 0;\n this.clean = clean;\n }\n\n Emitter.prototype = {\n beforestart: function() {\n if (++this.active === 1) this.state.emitter = this, this.starting = true;\n return this;\n },\n start: function(event, mode) {\n if (this.starting) this.starting = false, this.emit(\"start\", event, mode);\n else this.emit(\"brush\", event);\n return this;\n },\n brush: function(event, mode) {\n this.emit(\"brush\", event, mode);\n return this;\n },\n end: function(event, mode) {\n if (--this.active === 0) delete this.state.emitter, this.emit(\"end\", event, mode);\n return this;\n },\n emit: function(type, event, mode) {\n var d = select(this.that).datum();\n listeners.call(\n type,\n this.that,\n new BrushEvent(type, {\n sourceEvent: event,\n target: brush,\n selection: dim.output(this.state.selection),\n mode,\n dispatch: listeners\n }),\n d\n );\n }\n };\n\n function started(event) {\n if (touchending && !event.touches) return;\n if (!filter.apply(this, arguments)) return;\n\n var that = this,\n type = event.target.__data__.type,\n mode = (keys && event.metaKey ? type = \"overlay\" : type) === \"selection\" ? MODE_DRAG : (keys && event.altKey ? MODE_CENTER : MODE_HANDLE),\n signX = dim === Y ? null : signsX[type],\n signY = dim === X ? null : signsY[type],\n state = local(that),\n extent = state.extent,\n selection = state.selection,\n W = extent[0][0], w0, w1,\n N = extent[0][1], n0, n1,\n E = extent[1][0], e0, e1,\n S = extent[1][1], s0, s1,\n dx = 0,\n dy = 0,\n moving,\n shifting = signX && signY && keys && event.shiftKey,\n lockX,\n lockY,\n points = Array.from(event.touches || [event], t => {\n const i = t.identifier;\n t = pointer(t, that);\n t.point0 = t.slice();\n t.identifier = i;\n return t;\n });\n\n if (type === \"overlay\") {\n if (selection) moving = true;\n const pts = [points[0], points[1] || points[0]];\n state.selection = selection = [[\n w0 = dim === Y ? W : min(pts[0][0], pts[1][0]),\n n0 = dim === X ? N : min(pts[0][1], pts[1][1])\n ], [\n e0 = dim === Y ? E : max(pts[0][0], pts[1][0]),\n s0 = dim === X ? S : max(pts[0][1], pts[1][1])\n ]];\n if (points.length > 1) move();\n } else {\n w0 = selection[0][0];\n n0 = selection[0][1];\n e0 = selection[1][0];\n s0 = selection[1][1];\n }\n\n w1 = w0;\n n1 = n0;\n e1 = e0;\n s1 = s0;\n\n var group = select(that)\n .attr(\"pointer-events\", \"none\");\n\n var overlay = group.selectAll(\".overlay\")\n .attr(\"cursor\", cursors[type]);\n\n interrupt(that);\n var emit = emitter(that, arguments, true).beforestart();\n\n if (event.touches) {\n emit.moved = moved;\n emit.ended = ended;\n } else {\n var view = select(event.view)\n .on(\"mousemove.brush\", moved, true)\n .on(\"mouseup.brush\", ended, true);\n if (keys) view\n .on(\"keydown.brush\", keydowned, true)\n .on(\"keyup.brush\", keyupped, true)\n\n dragDisable(event.view);\n }\n\n redraw.call(that);\n emit.start(event, mode.name);\n\n function moved(event) {\n for (const p of event.changedTouches || [event]) {\n for (const d of points)\n if (d.identifier === p.identifier) d.cur = pointer(p, that);\n }\n if (shifting && !lockX && !lockY && points.length === 1) {\n const point = points[0];\n if (abs(point.cur[0] - point[0]) > abs(point.cur[1] - point[1]))\n lockY = true;\n else\n lockX = true;\n }\n for (const point of points)\n if (point.cur) point[0] = point.cur[0], point[1] = point.cur[1];\n moving = true;\n noevent(event);\n move(event);\n }\n\n function move(event) {\n const point = points[0], point0 = point.point0;\n var t;\n\n dx = point[0] - point0[0];\n dy = point[1] - point0[1];\n\n switch (mode) {\n case MODE_SPACE:\n case MODE_DRAG: {\n if (signX) dx = max(W - w0, min(E - e0, dx)), w1 = w0 + dx, e1 = e0 + dx;\n if (signY) dy = max(N - n0, min(S - s0, dy)), n1 = n0 + dy, s1 = s0 + dy;\n break;\n }\n case MODE_HANDLE: {\n if (points[1]) {\n if (signX) w1 = max(W, min(E, points[0][0])), e1 = max(W, min(E, points[1][0])), signX = 1;\n if (signY) n1 = max(N, min(S, points[0][1])), s1 = max(N, min(S, points[1][1])), signY = 1;\n } else {\n if (signX < 0) dx = max(W - w0, min(E - w0, dx)), w1 = w0 + dx, e1 = e0;\n else if (signX > 0) dx = max(W - e0, min(E - e0, dx)), w1 = w0, e1 = e0 + dx;\n if (signY < 0) dy = max(N - n0, min(S - n0, dy)), n1 = n0 + dy, s1 = s0;\n else if (signY > 0) dy = max(N - s0, min(S - s0, dy)), n1 = n0, s1 = s0 + dy;\n }\n break;\n }\n case MODE_CENTER: {\n if (signX) w1 = max(W, min(E, w0 - dx * signX)), e1 = max(W, min(E, e0 + dx * signX));\n if (signY) n1 = max(N, min(S, n0 - dy * signY)), s1 = max(N, min(S, s0 + dy * signY));\n break;\n }\n }\n\n if (e1 < w1) {\n signX *= -1;\n t = w0, w0 = e0, e0 = t;\n t = w1, w1 = e1, e1 = t;\n if (type in flipX) overlay.attr(\"cursor\", cursors[type = flipX[type]]);\n }\n\n if (s1 < n1) {\n signY *= -1;\n t = n0, n0 = s0, s0 = t;\n t = n1, n1 = s1, s1 = t;\n if (type in flipY) overlay.attr(\"cursor\", cursors[type = flipY[type]]);\n }\n\n if (state.selection) selection = state.selection; // May be set by brush.move!\n if (lockX) w1 = selection[0][0], e1 = selection[1][0];\n if (lockY) n1 = selection[0][1], s1 = selection[1][1];\n\n if (selection[0][0] !== w1\n || selection[0][1] !== n1\n || selection[1][0] !== e1\n || selection[1][1] !== s1) {\n state.selection = [[w1, n1], [e1, s1]];\n redraw.call(that);\n emit.brush(event, mode.name);\n }\n }\n\n function ended(event) {\n nopropagation(event);\n if (event.touches) {\n if (event.touches.length) return;\n if (touchending) clearTimeout(touchending);\n touchending = setTimeout(function() { touchending = null; }, 500); // Ghost clicks are delayed!\n } else {\n dragEnable(event.view, moving);\n view.on(\"keydown.brush keyup.brush mousemove.brush mouseup.brush\", null);\n }\n group.attr(\"pointer-events\", \"all\");\n overlay.attr(\"cursor\", cursors.overlay);\n if (state.selection) selection = state.selection; // May be set by brush.move (on start)!\n if (empty(selection)) state.selection = null, redraw.call(that);\n emit.end(event, mode.name);\n }\n\n function keydowned(event) {\n switch (event.keyCode) {\n case 16: { // SHIFT\n shifting = signX && signY;\n break;\n }\n case 18: { // ALT\n if (mode === MODE_HANDLE) {\n if (signX) e0 = e1 - dx * signX, w0 = w1 + dx * signX;\n if (signY) s0 = s1 - dy * signY, n0 = n1 + dy * signY;\n mode = MODE_CENTER;\n move();\n }\n break;\n }\n case 32: { // SPACE; takes priority over ALT\n if (mode === MODE_HANDLE || mode === MODE_CENTER) {\n if (signX < 0) e0 = e1 - dx; else if (signX > 0) w0 = w1 - dx;\n if (signY < 0) s0 = s1 - dy; else if (signY > 0) n0 = n1 - dy;\n mode = MODE_SPACE;\n overlay.attr(\"cursor\", cursors.selection);\n move();\n }\n break;\n }\n default: return;\n }\n noevent(event);\n }\n\n function keyupped(event) {\n switch (event.keyCode) {\n case 16: { // SHIFT\n if (shifting) {\n lockX = lockY = shifting = false;\n move();\n }\n break;\n }\n case 18: { // ALT\n if (mode === MODE_CENTER) {\n if (signX < 0) e0 = e1; else if (signX > 0) w0 = w1;\n if (signY < 0) s0 = s1; else if (signY > 0) n0 = n1;\n mode = MODE_HANDLE;\n move();\n }\n break;\n }\n case 32: { // SPACE\n if (mode === MODE_SPACE) {\n if (event.altKey) {\n if (signX) e0 = e1 - dx * signX, w0 = w1 + dx * signX;\n if (signY) s0 = s1 - dy * signY, n0 = n1 + dy * signY;\n mode = MODE_CENTER;\n } else {\n if (signX < 0) e0 = e1; else if (signX > 0) w0 = w1;\n if (signY < 0) s0 = s1; else if (signY > 0) n0 = n1;\n mode = MODE_HANDLE;\n }\n overlay.attr(\"cursor\", cursors[type]);\n move();\n }\n break;\n }\n default: return;\n }\n noevent(event);\n }\n }\n\n function touchmoved(event) {\n emitter(this, arguments).moved(event);\n }\n\n function touchended(event) {\n emitter(this, arguments).ended(event);\n }\n\n function initialize() {\n var state = this.__brush || {selection: null};\n state.extent = number2(extent.apply(this, arguments));\n state.dim = dim;\n return state;\n }\n\n brush.extent = function(_) {\n return arguments.length ? (extent = typeof _ === \"function\" ? _ : constant(number2(_)), brush) : extent;\n };\n\n brush.filter = function(_) {\n return arguments.length ? (filter = typeof _ === \"function\" ? _ : constant(!!_), brush) : filter;\n };\n\n brush.touchable = function(_) {\n return arguments.length ? (touchable = typeof _ === \"function\" ? _ : constant(!!_), brush) : touchable;\n };\n\n brush.handleSize = function(_) {\n return arguments.length ? (handleSize = +_, brush) : handleSize;\n };\n\n brush.keyModifiers = function(_) {\n return arguments.length ? (keys = !!_, brush) : keys;\n };\n\n brush.on = function() {\n var value = listeners.on.apply(listeners, arguments);\n return value === listeners ? brush : value;\n };\n\n return brush;\n}\n","export default function(x) {\n return Math.abs(x = Math.round(x)) >= 1e21\n ? x.toLocaleString(\"en\").replace(/,/g, \"\")\n : x.toString(10);\n}\n\n// Computes the decimal coefficient and exponent of the specified number x with\n// significant digits p, where x is positive and p is in [1, 21] or undefined.\n// For example, formatDecimalParts(1.23) returns [\"123\", 0].\nexport function formatDecimalParts(x, p) {\n if ((i = (x = p ? x.toExponential(p - 1) : x.toExponential()).indexOf(\"e\")) < 0) return null; // NaN, ±Infinity\n var i, coefficient = x.slice(0, i);\n\n // The string returned by toExponential either has the form \\d\\.\\d+e[-+]\\d+\n // (e.g., 1.2e+3) or the form \\de[-+]\\d+ (e.g., 1e+3).\n return [\n coefficient.length > 1 ? coefficient[0] + coefficient.slice(2) : coefficient,\n +x.slice(i + 1)\n ];\n}\n","import {formatDecimalParts} from \"./formatDecimal.js\";\n\nexport default function(x) {\n return x = formatDecimalParts(Math.abs(x)), x ? x[1] : NaN;\n}\n","// [[fill]align][sign][symbol][0][width][,][.precision][~][type]\nvar re = /^(?:(.)?([<>=^]))?([+\\-( ])?([$#])?(0)?(\\d+)?(,)?(\\.\\d+)?(~)?([a-z%])?$/i;\n\nexport default function formatSpecifier(specifier) {\n if (!(match = re.exec(specifier))) throw new Error(\"invalid format: \" + specifier);\n var match;\n return new FormatSpecifier({\n fill: match[1],\n align: match[2],\n sign: match[3],\n symbol: match[4],\n zero: match[5],\n width: match[6],\n comma: match[7],\n precision: match[8] && match[8].slice(1),\n trim: match[9],\n type: match[10]\n });\n}\n\nformatSpecifier.prototype = FormatSpecifier.prototype; // instanceof\n\nexport function FormatSpecifier(specifier) {\n this.fill = specifier.fill === undefined ? \" \" : specifier.fill + \"\";\n this.align = specifier.align === undefined ? \">\" : specifier.align + \"\";\n this.sign = specifier.sign === undefined ? \"-\" : specifier.sign + \"\";\n this.symbol = specifier.symbol === undefined ? \"\" : specifier.symbol + \"\";\n this.zero = !!specifier.zero;\n this.width = specifier.width === undefined ? undefined : +specifier.width;\n this.comma = !!specifier.comma;\n this.precision = specifier.precision === undefined ? undefined : +specifier.precision;\n this.trim = !!specifier.trim;\n this.type = specifier.type === undefined ? \"\" : specifier.type + \"\";\n}\n\nFormatSpecifier.prototype.toString = function() {\n return this.fill\n + this.align\n + this.sign\n + this.symbol\n + (this.zero ? \"0\" : \"\")\n + (this.width === undefined ? \"\" : Math.max(1, this.width | 0))\n + (this.comma ? \",\" : \"\")\n + (this.precision === undefined ? \"\" : \".\" + Math.max(0, this.precision | 0))\n + (this.trim ? \"~\" : \"\")\n + this.type;\n};\n","import {formatDecimalParts} from \"./formatDecimal.js\";\n\nexport var prefixExponent;\n\nexport default function(x, p) {\n var d = formatDecimalParts(x, p);\n if (!d) return x + \"\";\n var coefficient = d[0],\n exponent = d[1],\n i = exponent - (prefixExponent = Math.max(-8, Math.min(8, Math.floor(exponent / 3))) * 3) + 1,\n n = coefficient.length;\n return i === n ? coefficient\n : i > n ? coefficient + new Array(i - n + 1).join(\"0\")\n : i > 0 ? coefficient.slice(0, i) + \".\" + coefficient.slice(i)\n : \"0.\" + new Array(1 - i).join(\"0\") + formatDecimalParts(x, Math.max(0, p + i - 1))[0]; // less than 1y!\n}\n","import {formatDecimalParts} from \"./formatDecimal.js\";\n\nexport default function(x, p) {\n var d = formatDecimalParts(x, p);\n if (!d) return x + \"\";\n var coefficient = d[0],\n exponent = d[1];\n return exponent < 0 ? \"0.\" + new Array(-exponent).join(\"0\") + coefficient\n : coefficient.length > exponent + 1 ? coefficient.slice(0, exponent + 1) + \".\" + coefficient.slice(exponent + 1)\n : coefficient + new Array(exponent - coefficient.length + 2).join(\"0\");\n}\n","import formatDecimal from \"./formatDecimal.js\";\nimport formatPrefixAuto from \"./formatPrefixAuto.js\";\nimport formatRounded from \"./formatRounded.js\";\n\nexport default {\n \"%\": (x, p) => (x * 100).toFixed(p),\n \"b\": (x) => Math.round(x).toString(2),\n \"c\": (x) => x + \"\",\n \"d\": formatDecimal,\n \"e\": (x, p) => x.toExponential(p),\n \"f\": (x, p) => x.toFixed(p),\n \"g\": (x, p) => x.toPrecision(p),\n \"o\": (x) => Math.round(x).toString(8),\n \"p\": (x, p) => formatRounded(x * 100, p),\n \"r\": formatRounded,\n \"s\": formatPrefixAuto,\n \"X\": (x) => Math.round(x).toString(16).toUpperCase(),\n \"x\": (x) => Math.round(x).toString(16)\n};\n","export default function(x) {\n return x;\n}\n","import exponent from \"./exponent.js\";\nimport formatGroup from \"./formatGroup.js\";\nimport formatNumerals from \"./formatNumerals.js\";\nimport formatSpecifier from \"./formatSpecifier.js\";\nimport formatTrim from \"./formatTrim.js\";\nimport formatTypes from \"./formatTypes.js\";\nimport {prefixExponent} from \"./formatPrefixAuto.js\";\nimport identity from \"./identity.js\";\n\nvar map = Array.prototype.map,\n prefixes = [\"y\",\"z\",\"a\",\"f\",\"p\",\"n\",\"µ\",\"m\",\"\",\"k\",\"M\",\"G\",\"T\",\"P\",\"E\",\"Z\",\"Y\"];\n\nexport default function(locale) {\n var group = locale.grouping === undefined || locale.thousands === undefined ? identity : formatGroup(map.call(locale.grouping, Number), locale.thousands + \"\"),\n currencyPrefix = locale.currency === undefined ? \"\" : locale.currency[0] + \"\",\n currencySuffix = locale.currency === undefined ? \"\" : locale.currency[1] + \"\",\n decimal = locale.decimal === undefined ? \".\" : locale.decimal + \"\",\n numerals = locale.numerals === undefined ? identity : formatNumerals(map.call(locale.numerals, String)),\n percent = locale.percent === undefined ? \"%\" : locale.percent + \"\",\n minus = locale.minus === undefined ? \"−\" : locale.minus + \"\",\n nan = locale.nan === undefined ? \"NaN\" : locale.nan + \"\";\n\n function newFormat(specifier) {\n specifier = formatSpecifier(specifier);\n\n var fill = specifier.fill,\n align = specifier.align,\n sign = specifier.sign,\n symbol = specifier.symbol,\n zero = specifier.zero,\n width = specifier.width,\n comma = specifier.comma,\n precision = specifier.precision,\n trim = specifier.trim,\n type = specifier.type;\n\n // The \"n\" type is an alias for \",g\".\n if (type === \"n\") comma = true, type = \"g\";\n\n // The \"\" type, and any invalid type, is an alias for \".12~g\".\n else if (!formatTypes[type]) precision === undefined && (precision = 12), trim = true, type = \"g\";\n\n // If zero fill is specified, padding goes after sign and before digits.\n if (zero || (fill === \"0\" && align === \"=\")) zero = true, fill = \"0\", align = \"=\";\n\n // Compute the prefix and suffix.\n // For SI-prefix, the suffix is lazily computed.\n var prefix = symbol === \"$\" ? currencyPrefix : symbol === \"#\" && /[boxX]/.test(type) ? \"0\" + type.toLowerCase() : \"\",\n suffix = symbol === \"$\" ? currencySuffix : /[%p]/.test(type) ? percent : \"\";\n\n // What format function should we use?\n // Is this an integer type?\n // Can this type generate exponential notation?\n var formatType = formatTypes[type],\n maybeSuffix = /[defgprs%]/.test(type);\n\n // Set the default precision if not specified,\n // or clamp the specified precision to the supported range.\n // For significant precision, it must be in [1, 21].\n // For fixed precision, it must be in [0, 20].\n precision = precision === undefined ? 6\n : /[gprs]/.test(type) ? Math.max(1, Math.min(21, precision))\n : Math.max(0, Math.min(20, precision));\n\n function format(value) {\n var valuePrefix = prefix,\n valueSuffix = suffix,\n i, n, c;\n\n if (type === \"c\") {\n valueSuffix = formatType(value) + valueSuffix;\n value = \"\";\n } else {\n value = +value;\n\n // Determine the sign. -0 is not less than 0, but 1 / -0 is!\n var valueNegative = value < 0 || 1 / value < 0;\n\n // Perform the initial formatting.\n value = isNaN(value) ? nan : formatType(Math.abs(value), precision);\n\n // Trim insignificant zeros.\n if (trim) value = formatTrim(value);\n\n // If a negative value rounds to zero after formatting, and no explicit positive sign is requested, hide the sign.\n if (valueNegative && +value === 0 && sign !== \"+\") valueNegative = false;\n\n // Compute the prefix and suffix.\n valuePrefix = (valueNegative ? (sign === \"(\" ? sign : minus) : sign === \"-\" || sign === \"(\" ? \"\" : sign) + valuePrefix;\n valueSuffix = (type === \"s\" ? prefixes[8 + prefixExponent / 3] : \"\") + valueSuffix + (valueNegative && sign === \"(\" ? \")\" : \"\");\n\n // Break the formatted value into the integer “value” part that can be\n // grouped, and fractional or exponential “suffix” part that is not.\n if (maybeSuffix) {\n i = -1, n = value.length;\n while (++i < n) {\n if (c = value.charCodeAt(i), 48 > c || c > 57) {\n valueSuffix = (c === 46 ? decimal + value.slice(i + 1) : value.slice(i)) + valueSuffix;\n value = value.slice(0, i);\n break;\n }\n }\n }\n }\n\n // If the fill character is not \"0\", grouping is applied before padding.\n if (comma && !zero) value = group(value, Infinity);\n\n // Compute the padding.\n var length = valuePrefix.length + value.length + valueSuffix.length,\n padding = length < width ? new Array(width - length + 1).join(fill) : \"\";\n\n // If the fill character is \"0\", grouping is applied after padding.\n if (comma && zero) value = group(padding + value, padding.length ? width - valueSuffix.length : Infinity), padding = \"\";\n\n // Reconstruct the final output based on the desired alignment.\n switch (align) {\n case \"<\": value = valuePrefix + value + valueSuffix + padding; break;\n case \"=\": value = valuePrefix + padding + value + valueSuffix; break;\n case \"^\": value = padding.slice(0, length = padding.length >> 1) + valuePrefix + value + valueSuffix + padding.slice(length); break;\n default: value = padding + valuePrefix + value + valueSuffix; break;\n }\n\n return numerals(value);\n }\n\n format.toString = function() {\n return specifier + \"\";\n };\n\n return format;\n }\n\n function formatPrefix(specifier, value) {\n var f = newFormat((specifier = formatSpecifier(specifier), specifier.type = \"f\", specifier)),\n e = Math.max(-8, Math.min(8, Math.floor(exponent(value) / 3))) * 3,\n k = Math.pow(10, -e),\n prefix = prefixes[8 + e / 3];\n return function(value) {\n return f(k * value) + prefix;\n };\n }\n\n return {\n format: newFormat,\n formatPrefix: formatPrefix\n };\n}\n","import formatLocale from \"./locale.js\";\n\nvar locale;\nexport var format;\nexport var formatPrefix;\n\ndefaultLocale({\n thousands: \",\",\n grouping: [3],\n currency: [\"$\", \"\"]\n});\n\nexport default function defaultLocale(definition) {\n locale = formatLocale(definition);\n format = locale.format;\n formatPrefix = locale.formatPrefix;\n return locale;\n}\n","export default function(grouping, thousands) {\n return function(value, width) {\n var i = value.length,\n t = [],\n j = 0,\n g = grouping[0],\n length = 0;\n\n while (i > 0 && g > 0) {\n if (length + g + 1 > width) g = Math.max(1, width - length);\n t.push(value.substring(i -= g, i + g));\n if ((length += g + 1) > width) break;\n g = grouping[j = (j + 1) % grouping.length];\n }\n\n return t.reverse().join(thousands);\n };\n}\n","export default function(numerals) {\n return function(value) {\n return value.replace(/[0-9]/g, function(i) {\n return numerals[+i];\n });\n };\n}\n","// Trims insignificant zeros, e.g., replaces 1.2000k with 1.2k.\nexport default function(s) {\n out: for (var n = s.length, i = 1, i0 = -1, i1; i < n; ++i) {\n switch (s[i]) {\n case \".\": i0 = i1 = i; break;\n case \"0\": if (i0 === 0) i0 = i; i1 = i; break;\n default: if (!+s[i]) break out; if (i0 > 0) i0 = 0; break;\n }\n }\n return i0 > 0 ? s.slice(0, i0) + s.slice(i1 + 1) : s;\n}\n","import exponent from \"./exponent.js\";\n\nexport default function(step) {\n return Math.max(0, -exponent(Math.abs(step)));\n}\n","import exponent from \"./exponent.js\";\n\nexport default function(step, value) {\n return Math.max(0, Math.max(-8, Math.min(8, Math.floor(exponent(value) / 3))) * 3 - exponent(Math.abs(step)));\n}\n","import exponent from \"./exponent.js\";\n\nexport default function(step, max) {\n step = Math.abs(step), max = Math.abs(max) - step;\n return Math.max(0, exponent(max) - exponent(step)) + 1;\n}\n","var e10 = Math.sqrt(50),\n e5 = Math.sqrt(10),\n e2 = Math.sqrt(2);\n\nexport default function(start, stop, count) {\n var reverse,\n i = -1,\n n,\n ticks,\n step;\n\n stop = +stop, start = +start, count = +count;\n if (start === stop && count > 0) return [start];\n if (reverse = stop < start) n = start, start = stop, stop = n;\n if ((step = tickIncrement(start, stop, count)) === 0 || !isFinite(step)) return [];\n\n if (step > 0) {\n start = Math.ceil(start / step);\n stop = Math.floor(stop / step);\n ticks = new Array(n = Math.ceil(stop - start + 1));\n while (++i < n) ticks[i] = (start + i) * step;\n } else {\n step = -step;\n start = Math.ceil(start * step);\n stop = Math.floor(stop * step);\n ticks = new Array(n = Math.ceil(stop - start + 1));\n while (++i < n) ticks[i] = (start + i) / step;\n }\n\n if (reverse) ticks.reverse();\n\n return ticks;\n}\n\nexport function tickIncrement(start, stop, count) {\n var step = (stop - start) / Math.max(0, count),\n power = Math.floor(Math.log(step) / Math.LN10),\n error = step / Math.pow(10, power);\n return power >= 0\n ? (error >= e10 ? 10 : error >= e5 ? 5 : error >= e2 ? 2 : 1) * Math.pow(10, power)\n : -Math.pow(10, -power) / (error >= e10 ? 10 : error >= e5 ? 5 : error >= e2 ? 2 : 1);\n}\n\nexport function tickStep(start, stop, count) {\n var step0 = Math.abs(stop - start) / Math.max(0, count),\n step1 = Math.pow(10, Math.floor(Math.log(step0) / Math.LN10)),\n error = step0 / step1;\n if (error >= e10) step1 *= 10;\n else if (error >= e5) step1 *= 5;\n else if (error >= e2) step1 *= 2;\n return stop < start ? -step1 : step1;\n}\n","export default function(a, b) {\n return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;\n}\n","import ascending from \"./ascending.js\";\n\nexport default function(f) {\n let delta = f;\n let compare = f;\n\n if (f.length === 1) {\n delta = (d, x) => f(d) - x;\n compare = ascendingComparator(f);\n }\n\n function left(a, x, lo, hi) {\n if (lo == null) lo = 0;\n if (hi == null) hi = a.length;\n while (lo < hi) {\n const mid = (lo + hi) >>> 1;\n if (compare(a[mid], x) < 0) lo = mid + 1;\n else hi = mid;\n }\n return lo;\n }\n\n function right(a, x, lo, hi) {\n if (lo == null) lo = 0;\n if (hi == null) hi = a.length;\n while (lo < hi) {\n const mid = (lo + hi) >>> 1;\n if (compare(a[mid], x) > 0) hi = mid;\n else lo = mid + 1;\n }\n return lo;\n }\n\n function center(a, x, lo, hi) {\n if (lo == null) lo = 0;\n if (hi == null) hi = a.length;\n const i = left(a, x, lo, hi - 1);\n return i > lo && delta(a[i - 1], x) > -delta(a[i], x) ? i - 1 : i;\n }\n\n return {left, center, right};\n}\n\nfunction ascendingComparator(f) {\n return (d, x) => ascending(f(d), x);\n}\n","import ascending from \"./ascending.js\";\nimport bisector from \"./bisector.js\";\nimport number from \"./number.js\";\n\nconst ascendingBisect = bisector(ascending);\nexport const bisectRight = ascendingBisect.right;\nexport const bisectLeft = ascendingBisect.left;\nexport const bisectCenter = bisector(number).center;\nexport default bisectRight;\n","export default function(x) {\n return x === null ? NaN : +x;\n}\n\nexport function* numbers(values, valueof) {\n if (valueof === undefined) {\n for (let value of values) {\n if (value != null && (value = +value) >= value) {\n yield value;\n }\n }\n } else {\n let index = -1;\n for (let value of values) {\n if ((value = valueof(value, ++index, values)) != null && (value = +value) >= value) {\n yield value;\n }\n }\n }\n}\n","export default function(a, b) {\n return a = +a, b = +b, function(t) {\n return Math.round(a * (1 - t) + b * t);\n };\n}\n","export default function number(x) {\n return +x;\n}\n","import {bisect} from \"d3-array\";\nimport {interpolate as interpolateValue, interpolateNumber, interpolateRound} from \"d3-interpolate\";\nimport constant from \"./constant.js\";\nimport number from \"./number.js\";\n\nvar unit = [0, 1];\n\nexport function identity(x) {\n return x;\n}\n\nfunction normalize(a, b) {\n return (b -= (a = +a))\n ? function(x) { return (x - a) / b; }\n : constant(isNaN(b) ? NaN : 0.5);\n}\n\nfunction clamper(a, b) {\n var t;\n if (a > b) t = a, a = b, b = t;\n return function(x) { return Math.max(a, Math.min(b, x)); };\n}\n\n// normalize(a, b)(x) takes a domain value x in [a,b] and returns the corresponding parameter t in [0,1].\n// interpolate(a, b)(t) takes a parameter t in [0,1] and returns the corresponding range value x in [a,b].\nfunction bimap(domain, range, interpolate) {\n var d0 = domain[0], d1 = domain[1], r0 = range[0], r1 = range[1];\n if (d1 < d0) d0 = normalize(d1, d0), r0 = interpolate(r1, r0);\n else d0 = normalize(d0, d1), r0 = interpolate(r0, r1);\n return function(x) { return r0(d0(x)); };\n}\n\nfunction polymap(domain, range, interpolate) {\n var j = Math.min(domain.length, range.length) - 1,\n d = new Array(j),\n r = new Array(j),\n i = -1;\n\n // Reverse descending domains.\n if (domain[j] < domain[0]) {\n domain = domain.slice().reverse();\n range = range.slice().reverse();\n }\n\n while (++i < j) {\n d[i] = normalize(domain[i], domain[i + 1]);\n r[i] = interpolate(range[i], range[i + 1]);\n }\n\n return function(x) {\n var i = bisect(domain, x, 1, j) - 1;\n return r[i](d[i](x));\n };\n}\n\nexport function copy(source, target) {\n return target\n .domain(source.domain())\n .range(source.range())\n .interpolate(source.interpolate())\n .clamp(source.clamp())\n .unknown(source.unknown());\n}\n\nexport function transformer() {\n var domain = unit,\n range = unit,\n interpolate = interpolateValue,\n transform,\n untransform,\n unknown,\n clamp = identity,\n piecewise,\n output,\n input;\n\n function rescale() {\n var n = Math.min(domain.length, range.length);\n if (clamp !== identity) clamp = clamper(domain[0], domain[n - 1]);\n piecewise = n > 2 ? polymap : bimap;\n output = input = null;\n return scale;\n }\n\n function scale(x) {\n return isNaN(x = +x) ? unknown : (output || (output = piecewise(domain.map(transform), range, interpolate)))(transform(clamp(x)));\n }\n\n scale.invert = function(y) {\n return clamp(untransform((input || (input = piecewise(range, domain.map(transform), interpolateNumber)))(y)));\n };\n\n scale.domain = function(_) {\n return arguments.length ? (domain = Array.from(_, number), rescale()) : domain.slice();\n };\n\n scale.range = function(_) {\n return arguments.length ? (range = Array.from(_), rescale()) : range.slice();\n };\n\n scale.rangeRound = function(_) {\n return range = Array.from(_), interpolate = interpolateRound, rescale();\n };\n\n scale.clamp = function(_) {\n return arguments.length ? (clamp = _ ? true : identity, rescale()) : clamp !== identity;\n };\n\n scale.interpolate = function(_) {\n return arguments.length ? (interpolate = _, rescale()) : interpolate;\n };\n\n scale.unknown = function(_) {\n return arguments.length ? (unknown = _, scale) : unknown;\n };\n\n return function(t, u) {\n transform = t, untransform = u;\n return rescale();\n };\n}\n\nexport default function continuous() {\n return transformer()(identity, identity);\n}\n","export default function constants(x) {\n return function() {\n return x;\n };\n}\n","export function initRange(domain, range) {\n switch (arguments.length) {\n case 0: break;\n case 1: this.range(domain); break;\n default: this.range(range).domain(domain); break;\n }\n return this;\n}\n\nexport function initInterpolator(domain, interpolator) {\n switch (arguments.length) {\n case 0: break;\n case 1: {\n if (typeof domain === \"function\") this.interpolator(domain);\n else this.range(domain);\n break;\n }\n default: {\n this.domain(domain);\n if (typeof interpolator === \"function\") this.interpolator(interpolator);\n else this.range(interpolator);\n break;\n }\n }\n return this;\n}\n","import {ticks, tickIncrement} from \"d3-array\";\nimport continuous, {copy} from \"./continuous.js\";\nimport {initRange} from \"./init.js\";\nimport tickFormat from \"./tickFormat.js\";\n\nexport function linearish(scale) {\n var domain = scale.domain;\n\n scale.ticks = function(count) {\n var d = domain();\n return ticks(d[0], d[d.length - 1], count == null ? 10 : count);\n };\n\n scale.tickFormat = function(count, specifier) {\n var d = domain();\n return tickFormat(d[0], d[d.length - 1], count == null ? 10 : count, specifier);\n };\n\n scale.nice = function(count) {\n if (count == null) count = 10;\n\n var d = domain();\n var i0 = 0;\n var i1 = d.length - 1;\n var start = d[i0];\n var stop = d[i1];\n var prestep;\n var step;\n var maxIter = 10;\n\n if (stop < start) {\n step = start, start = stop, stop = step;\n step = i0, i0 = i1, i1 = step;\n }\n \n while (maxIter-- > 0) {\n step = tickIncrement(start, stop, count);\n if (step === prestep) {\n d[i0] = start\n d[i1] = stop\n return domain(d);\n } else if (step > 0) {\n start = Math.floor(start / step) * step;\n stop = Math.ceil(stop / step) * step;\n } else if (step < 0) {\n start = Math.ceil(start * step) / step;\n stop = Math.floor(stop * step) / step;\n } else {\n break;\n }\n prestep = step;\n }\n\n return scale;\n };\n\n return scale;\n}\n\nexport default function linear() {\n var scale = continuous();\n\n scale.copy = function() {\n return copy(scale, linear());\n };\n\n initRange.apply(scale, arguments);\n\n return linearish(scale);\n}\n","import {tickStep} from \"d3-array\";\nimport {format, formatPrefix, formatSpecifier, precisionFixed, precisionPrefix, precisionRound} from \"d3-format\";\n\nexport default function tickFormat(start, stop, count, specifier) {\n var step = tickStep(start, stop, count),\n precision;\n specifier = formatSpecifier(specifier == null ? \",f\" : specifier);\n switch (specifier.type) {\n case \"s\": {\n var value = Math.max(Math.abs(start), Math.abs(stop));\n if (specifier.precision == null && !isNaN(precision = precisionPrefix(step, value))) specifier.precision = precision;\n return formatPrefix(specifier, value);\n }\n case \"\":\n case \"e\":\n case \"g\":\n case \"p\":\n case \"r\": {\n if (specifier.precision == null && !isNaN(precision = precisionRound(step, Math.max(Math.abs(start), Math.abs(stop))))) specifier.precision = precision - (specifier.type === \"e\");\n break;\n }\n case \"f\":\n case \"%\": {\n if (specifier.precision == null && !isNaN(precision = precisionFixed(step))) specifier.precision = precision - (specifier.type === \"%\") * 2;\n break;\n }\n }\n return format(specifier);\n}\n","var organismMetadata = {\r\n 9606: {\r\n commonName: 'Human',\r\n scientificName: 'Homo sapiens',\r\n assemblies: {\r\n default: 'GCF_000001405.26', // GRCh38\r\n GRCh38: 'GCF_000001405.26',\r\n GRCh37: 'GCF_000001405.13',\r\n NCBI36: 'GCF_000001405.12'\r\n },\r\n hasGeneCache: true,\r\n hasParalogCache: true,\r\n hasInteractionCache: true\r\n },\r\n 10090: {\r\n commonName: 'Mouse',\r\n scientificName: 'Mus musculus',\r\n assemblies: {\r\n default: 'GCF_000001635.20', // GRCm38\r\n GRCm38: 'GCF_000001635.20',\r\n MGSCv37: 'GCF_000001635.18'\r\n },\r\n hasGeneCache: true,\r\n hasParalogCache: true,\r\n hasInteractionCache: true\r\n },\r\n 9598: {\r\n commonName: 'Chimpanzee',\r\n scientificName: 'Pan troglodytes',\r\n assemblies: {\r\n 'default': 'GCF_000001515.7',\r\n 'Pan_tro 3.0': 'GCF_000001515.7'\r\n },\r\n hasGeneCache: true,\r\n hasParalogCache: true\r\n },\r\n 10116: {\r\n commonName: 'Rat',\r\n scientificName: 'Rattus norvegicus',\r\n assemblies: {\r\n 'default': 'GCF_000001895.5',\r\n 'Rnor_6.0': 'GCF_000001895.5'\r\n },\r\n hasGeneCache: true,\r\n hasParalogCache: true\r\n },\r\n 3702: {\r\n commonName: 'Thale cress',\r\n scientificName: 'Arabidopsis thaliana',\r\n assemblies: {\r\n default: 'GCF_000001735.3', // TAIR10\r\n TAIR10: 'GCF_000001735.3'\r\n }\r\n },\r\n 4530: {\r\n commonName: 'Rice',\r\n scientificName: 'Oryza sativa',\r\n assemblies: {\r\n 'default': 'GCA_001433935.1',\r\n 'IRGSP-1.0': 'GCA_001433935.1'\r\n }\r\n },\r\n 4577: {\r\n commonName: 'Maize',\r\n scientificName: 'Zea mays',\r\n assemblies: {\r\n 'default': 'GCA_000005005.5',\r\n 'IRGSP-1.0': 'GCA_001433935.1'\r\n }\r\n },\r\n 4641: {\r\n commonName: 'Banana',\r\n scientificName: 'Musa acuminata',\r\n assemblies: {\r\n default: 'mock'\r\n }\r\n },\r\n 7227: {\r\n commonName: 'Fly',\r\n scientificName: 'Drosophila melanogaster',\r\n assemblies: {\r\n 'default': 'GCA_000001215.4',\r\n 'Release 6 plus ISO1 MT': 'GCA_000001215.4'\r\n }\r\n },\r\n 7165: {\r\n commonName: 'Mosquito',\r\n scientificName: 'Anopheles gambiae',\r\n assemblies: {\r\n default: 'GCF_000005575.2'\r\n }\r\n },\r\n 746128: {\r\n commonName: 'Aspergillis fumigatus',\r\n scientificName: 'Aspergillis fumigatus',\r\n assemblies: {\r\n default: 'GCF_000002655.1'\r\n }\r\n },\r\n 227321: {\r\n scientificName: 'Aspergillus nidulans',\r\n assemblies: {\r\n default: 'GCF_000149205.2'\r\n }\r\n },\r\n 5061: {\r\n commonName: 'black mold',\r\n scientificName: 'Aspergillus niger',\r\n assemblies: {\r\n default: 'GCF_003184595.1'\r\n }\r\n },\r\n 5062: {\r\n commonName: 'koji',\r\n scientificName: 'Aspergillus oryzae',\r\n assemblies: {\r\n default: 'GCF_000184455.2'\r\n }\r\n },\r\n 15368: {\r\n commonName: 'stiff brome',\r\n scientificName: 'Brachypodium distachyon',\r\n assemblies: {\r\n default: 'GCF_000005505.3'\r\n }\r\n },\r\n 60711: {\r\n commonName: 'green monkey',\r\n scientificName: 'Chlorocebus sabaeus',\r\n assemblies: {\r\n default: 'GCF_015252025.1'\r\n }\r\n },\r\n 7719: {\r\n commonName: 'Vase tunicate',\r\n scientificName: 'Ciona intestinalis',\r\n assemblies: {\r\n default: 'GCF_000224145.3'\r\n }\r\n },\r\n 9685: {\r\n commonName: 'Cat',\r\n scientificName: 'Felis catus',\r\n assemblies: {\r\n default: 'GCF_000181335.3'\r\n },\r\n hasGeneCache: true\r\n },\r\n 9031: {\r\n commonName: 'Chicken',\r\n scientificName: 'Gallus gallus',\r\n assemblies: {\r\n default: 'GCF_000002315.6'\r\n },\r\n hasGeneCache: true,\r\n hasParalogCache: true\r\n },\r\n 9593: {\r\n commonName: 'Gorilla',\r\n scientificName: 'Gorilla gorilla',\r\n assemblies: {\r\n default: 'GCF_008122165.1'\r\n }\r\n },\r\n 4513: {\r\n commonName: 'Barley',\r\n scientificName: 'Hordeum vulgare',\r\n assemblies: {\r\n default: 'GCA_901482405.1'\r\n }\r\n },\r\n 9541: {\r\n commonName: 'Crab-eating macaque',\r\n scientificName: 'Macaca fascicularis',\r\n assemblies: {\r\n default: 'GCF_000364345.1'\r\n },\r\n hasGeneCache: true,\r\n hasParalogCache: true\r\n },\r\n 9544: {\r\n commonName: 'Rhesus macaque',\r\n scientificName: 'Macaca mulatta',\r\n assemblies: {\r\n default: 'GCF_003339765.1'\r\n },\r\n hasGeneCache: true,\r\n hasParalogCache: true\r\n },\r\n 9597: {\r\n commonName: 'Bonobo',\r\n scientificName: 'Pan paniscus',\r\n assemblies: {\r\n default: 'GCF_013052645.1'\r\n }\r\n },\r\n 9615: {\r\n commonName: 'Dog',\r\n scientificName: 'Canis lupus familiaris',\r\n assemblies: {\r\n default: 'GCF_014441545.1'\r\n },\r\n hasGeneCache: true,\r\n hasParalogCache: true\r\n },\r\n 4932: {\r\n commonName: 'Yeast',\r\n scientificName: 'Saccharomyces cerevisiae',\r\n assemblies: {\r\n default: 'GCA_000146045.2',\r\n R64: 'GCA_000146045.2'\r\n }\r\n },\r\n 5833: {\r\n commonName: 'malaria parasite',\r\n scientificName: 'Plasmodium falciparum',\r\n assemblies: {\r\n default: 'GCA_000002765.3',\r\n GCA_000002765: 'GCA_000002765.3'\r\n }\r\n },\r\n 6239: {\r\n commonName: 'worm',\r\n scientificName: 'Caenorhabditis elegans',\r\n assemblies: {\r\n default: 'GCF_000002985.6'\r\n },\r\n hasGeneCache: true,\r\n hasParalogCache: true\r\n },\r\n 4081: {\r\n commonName: 'tomato',\r\n scientificName: 'Solanum lycopersicum',\r\n assemblies: {\r\n default: 'GCF_000188115.4'\r\n }\r\n },\r\n 4072: {\r\n commonName: 'pepper',\r\n scientificName: 'Capsicum annuum',\r\n assemblies: {\r\n default: 'GCF_000710875.1'\r\n }\r\n }\r\n};\r\n\r\nexport {organismMetadata};\r\n","var staticColors, staticCss, staticGradients;\r\n\r\n// Gradient colors for each class, for polished rendering\r\nstaticColors = [\r\n ['gneg', '#FFF', '#FFF', '#DDD'],\r\n ['gpos25', '#C8C8C8', '#DDD', '#BBB'],\r\n ['gpos33', '#BBB', '#BBB', '#AAA'],\r\n ['gpos50', '#999', '#AAA', '#888'],\r\n ['gpos66', '#888', '#888', '#666'],\r\n ['gpos75', '#777', '#777', '#444'],\r\n ['gpos100', '#444', '#666', '#000'],\r\n ['acen', '#FEE', '#FEE', '#FDD'],\r\n ['noBands', '#BBB', '#BBB', '#AAA']\r\n];\r\n\r\nstaticCss =\r\n '#_ideogram {padding-left: 5px;} ' +\r\n '#_ideogram .labeled {padding-left: 15px;} ' +\r\n '#_ideogram.labeledLeft {padding-left: 15px; padding-top: 15px;} ' +\r\n // Tahoma has great readability and space utilization at small sizes\r\n // More: http://ux.stackexchange.com/a/3334\r\n '#_ideogram text {font: 9px Tahoma; fill: #000;} ' +\r\n '#_ideogram .italic {font-style: italic;} ' +\r\n '#_ideogram .chromosome {cursor: pointer; fill: #AAA;}' +\r\n '#_ideogram.no-rotate .chromosome {cursor: default;} ' +\r\n '#_ideogram .chrLabel, #_ideogram .annot {cursor: pointer;}' +\r\n '#_ideogram .chrSetLabel {font-weight: bolder;}' +\r\n '#_ideogram .ghost {opacity: 0.2;}' +\r\n '#_ideogram .hidden {display: none;}' +\r\n '#_ideogram .bandLabelStalk line {stroke: #AAA; stroke-width: 1;}' +\r\n '#_ideogram .syntenyBorder {stroke:#AAA;stroke-width:1;}' +\r\n '#_ideogram rect.cursor {' +\r\n ' fill: #F00;' +\r\n ' stroke: #F00;' +\r\n ' fill-opacity: .3;' +\r\n ' shape-rendering: crispEdges;' +\r\n '}' +\r\n '#_ideogram .brush .selection {' +\r\n ' fill: #F00;' +\r\n ' stroke: #F00;' +\r\n ' fill-opacity: .3;' +\r\n ' shape-rendering: crispEdges;' +\r\n '}' +\r\n '#_ideogram .noBands {fill: #AAA;}' +\r\n // NCBI stain density colors\r\n '#_ideogram .gneg {fill: #FFF}' +\r\n '#_ideogram .gpos25 {fill: #BBB}' +\r\n '#_ideogram .gpos33 {fill: #AAA}' +\r\n '#_ideogram .gpos50 {fill: #888}' +\r\n '#_ideogram .gpos66 {fill: #666}' +\r\n '#_ideogram .gpos75 {fill: #444}' +\r\n '#_ideogram .gpos100 {fill: #000}' +\r\n '#_ideogram .gpos {fill: #000}' +\r\n '#_ideogram .acen {fill: #FDD}' +\r\n '#_ideogram .stalk {fill: #CCE;}' +\r\n '#_ideogram .gvar {fill: #DDF}' +\r\n // Used when overlaid with annotations\r\n '#_ideogram.faint .gneg {fill: #FFF}' +\r\n '#_ideogram.faint .gpos25 {fill: #EEE}' +\r\n '#_ideogram.faint .gpos33 {fill: #EEE}' +\r\n '#_ideogram.faint .gpos50 {fill: #EEE}' +\r\n '#_ideogram.faint .gpos66 {fill: #EEE}' +\r\n '#_ideogram.faint .gpos75 {fill: #EEE}' +\r\n '#_ideogram.faint .gpos100 {fill: #DDD}' +\r\n '#_ideogram.faint .gpos {fill: #DDD}' +\r\n '#_ideogram.faint .acen {fill: #FEE}' +\r\n '#_ideogram.faint .stalk {fill: #EEF;}' +\r\n '#_ideogram.faint .gvar {fill: #EEF}' +\r\n // For sheen, i.e. the soft shine in chromosomes\r\n '#_ideogram .gneg {fill: url(\"#gneg\")} ' +\r\n '#_ideogram .gpos25 {fill: url(\"#gpos25\")} ' +\r\n '#_ideogram .gpos33 {fill: url(\"#gpos33\")} ' +\r\n '#_ideogram .gpos50 {fill: url(\"#gpos50\")} ' +\r\n '#_ideogram .gpos66 {fill: url(\"#gpos66\")} ' +\r\n '#_ideogram .gpos75 {fill: url(\"#gpos75\")} ' +\r\n '#_ideogram .gpos100 {fill: url(\"#gpos100\")} ' +\r\n '#_ideogram .gpos {fill: url(\"#gpos100\")} ' +\r\n '#_ideogram .acen {fill: url(\"#acen\")} ' +\r\n '#_ideogram .stalk {fill: url(\"#stalk\")} ' +\r\n '#_ideogram .gvar {fill: url(\"#gvar\")} ' +\r\n '#_ideogram .noBands {fill: url(\"#noBands\")} ' +\r\n '#_ideogram .chromosome {fill: url(\"#noBands\")} ';\r\n\r\nstaticGradients =\r\n '' +\r\n ' ' +\r\n '' +\r\n '' +\r\n '' +\r\n ' ' +\r\n '' +\r\n '';\r\n\r\nexport {staticColors, staticCss, staticGradients};\r\n","/**\r\n * @fileoverview A collection of Ideogram methods that don't fit elsewhere.\r\n */\r\n\r\nimport {select, selectAll} from 'd3-selection';\r\nimport * as d3fetch from 'd3-fetch';\r\nimport * as d3brush from 'd3-brush';\r\nimport * as d3dispatch from 'd3-dispatch';\r\nimport * as d3format from 'd3-format';\r\nimport {scaleLinear} from 'd3-scale';\r\nimport {max} from 'd3-array';\r\n\r\nimport {organismMetadata} from './init/organism-metadata';\r\n\r\nvar d3 = Object.assign(\r\n {}, d3fetch, d3brush, d3dispatch, d3format\r\n);\r\n\r\nd3.select = select;\r\nd3.selectAll = selectAll;\r\nd3.scaleLinear = scaleLinear;\r\nd3.max = max;\r\n\r\n/**\r\n * Is the assembly in this.config an NCBI Assembly accession?\r\n *\r\n * @returns {boolean}\r\n */\r\nfunction assemblyIsAccession() {\r\n return (\r\n 'assembly' in this.config &&\r\n /(GCF_|GCA_)/.test(this.config.assembly)\r\n );\r\n}\r\n\r\n/**\r\n * Is the assembly in this.config not from GenBank?\r\n *\r\n * @returns {boolean}\r\n */\r\nfunction hasNonGenBankAssembly(ideo) {\r\n return (\r\n 'assembly' in ideo.config &&\r\n /(GCA_)/.test(ideo.config.assembly) === false\r\n );\r\n}\r\n\r\n/**\r\n * Is the assembly in this.config from GenBank?\r\n *\r\n * @returns {boolean}\r\n */\r\nfunction hasGenBankAssembly(ideo) {\r\n return (\r\n 'assembly' in ideo.config &&\r\n /(GCA_)/.test(ideo.config.assembly)\r\n );\r\n}\r\n\r\nfunction getDir(dir) {\r\n var script, tmp, protocol, dataDir, ideogramInLeaf,\r\n scripts = document.scripts,\r\n version = Ideogram.version;\r\n\r\n if (location.pathname.includes('/examples/vanilla/') === false) {\r\n return (\r\n `https://cdn.jsdelivr.net/npm/ideogram@${version}/dist/data/${dir}`\r\n );\r\n }\r\n\r\n for (var i = 0; i < scripts.length; i++) {\r\n script = scripts[i];\r\n ideogramInLeaf = /ideogram/.test(script.src.split('/').slice(-1));\r\n if ('src' in script && ideogramInLeaf) {\r\n tmp = script.src.split('//');\r\n protocol = tmp[0];\r\n tmp = '/' + tmp[1].split('/').slice(0, -2).join('/');\r\n dataDir = protocol + '//' + tmp + '/data/' + dir;\r\n return dataDir;\r\n }\r\n }\r\n\r\n return '../data/' + dir;\r\n}\r\n\r\n/** Try request, and if failed then retry with URL lacking extension */\r\nfunction fetchWithRetry(url, isRetry=false) {\r\n return fetch(url)\r\n .then((response) => {\r\n if (response.ok) {\r\n return response;\r\n } else {\r\n if (isRetry === false) {\r\n var urlWithoutExtension = url.replace('.json', '');\r\n return fetchWithRetry(urlWithoutExtension, true);\r\n } else {\r\n throw Error('Fetch failed for ' + url);\r\n }\r\n }\r\n });\r\n}\r\n\r\n/**\r\n * Returns directory used to fetch data for bands and annotations\r\n *\r\n * This simplifies ideogram configuration. By default, the dataDir is\r\n * set to an external CDN unless we're serving from the local Ideogram\r\n * working directory\r\n *\r\n * @returns {String}\r\n */\r\nfunction getDataDir() {\r\n return getDir('bands/native/');\r\n}\r\n\r\n/**\r\n * Rounds a float (e.g. SVG coordinate) to two decimal places\r\n *\r\n * @param coord Floating-point number, e.g. 42.1234567890\r\n * @returns {number} Rounded value, e.g. 42.12\r\n */\r\nfunction round(coord) {\r\n // Per http://stackoverflow.com/a/9453447, below method is fastest\r\n return Math.round(coord * 100) / 100;\r\n}\r\n\r\nfunction onDidRotate(chrModel) {\r\n call(this.onDidRotateCallback, chrModel);\r\n}\r\n\r\n/**\r\n * Get ideogram SVG container\r\n */\r\nfunction getSvg() {\r\n return d3.select(this.selector).node();\r\n}\r\n\r\n/** Request data with Ideogram's authorization bearer token */\r\nfunction fetchWithAuth(url, contentType) {\r\n var ideo = this,\r\n config = ideo.config,\r\n headers = new Headers();\r\n\r\n if (config.accessToken) {\r\n headers = new Headers({Authorization: 'Bearer ' + config.accessToken});\r\n }\r\n\r\n if (contentType === 'text') {\r\n return d3.text(url, {headers: headers});\r\n } else {\r\n return d3.json(url, {headers: headers});\r\n }\r\n}\r\n\r\n/** getTaxid(), but without need to initialize ideogram */\r\nfunction getEarlyTaxid(name) {\r\n name = slug(name);\r\n for (const taxid in organismMetadata) {\r\n const organism = organismMetadata[taxid];\r\n const commonName = slug(organism.commonName);\r\n const scientificName = slug(organism.scientificName);\r\n if (commonName === name || scientificName === name) {\r\n return taxid;\r\n }\r\n }\r\n\r\n return null;\r\n}\r\n\r\n/**\r\n * Get organism's taxid (NCBI Taxonomy ID) given its common or scientific name\r\n */\r\nfunction getTaxid(name) {\r\n var organism, taxid, commonName, scientificName,\r\n ideo = this,\r\n organisms = ideo.organisms;\r\n\r\n name = slug(name);\r\n\r\n for (taxid in organisms) {\r\n organism = organisms[taxid];\r\n commonName = slug(organism.commonName);\r\n scientificName = slug(organism.scientificName);\r\n if (commonName === name || scientificName === name) {\r\n return taxid;\r\n }\r\n }\r\n\r\n return null;\r\n}\r\n\r\n/**\r\n * Get organism's common name given its taxid\r\n */\r\nfunction getCommonName(taxid) {\r\n var ideo = this;\r\n if (taxid in ideo.organisms) {\r\n return ideo.organisms[taxid].commonName;\r\n }\r\n return null;\r\n}\r\n\r\n/**\r\n * Get organism's scientific name given its taxid\r\n */\r\nfunction getScientificName(taxid) {\r\n var ideo = this;\r\n if (taxid in ideo.organisms) {\r\n return ideo.organisms[taxid].scientificName;\r\n }\r\n return null;\r\n}\r\n\r\n/**\r\n* Examples:\r\n* \"Homo sapiens\" -> \"homo-sapiens\"\r\n* \"Canis lupus familiaris\" -> \"canis-lupus-familiaris\"\r\n*/\r\nfunction slug(value) {\r\n if (typeof value === 'undefined') return '';\r\n return value.toLowerCase().replace(/ /g, '-');\r\n}\r\n\r\n// Determine if a string is a Roman numeral\r\n// From https://stackoverflow.com/a/48601418\r\nfunction isRoman(s) {\r\n // http://stackoverflow.com/a/267405/1447675\r\n return /^M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})$/i.test(s);\r\n}\r\n\r\n// Convert Roman numeral to integer\r\n// From https://stackoverflow.com/a/48601418\r\nfunction parseRoman(s) {\r\n var val = {M: 1000, D: 500, C: 100, L: 50, X: 10, V: 5, I: 1};\r\n return s.toUpperCase().split('').reduce(function(r, a, i, aa) {\r\n return val[a] < val[aa[i + 1]] ? r - val[a] : r + val[a];\r\n }, 0);\r\n}\r\n\r\n/**\r\n* Download a PNG image of the ideogram\r\n*\r\n* Includes any annotations, but not legend.\r\n*/\r\nfunction downloadPng(ideo) {\r\n var ideoSvg = document.querySelector(ideo.selector);\r\n\r\n // Create a hidden canvas. This will contain the raster image to download.\r\n var canvas = document.createElement('canvas');\r\n var canvasId = '_ideo-undisplayed-dl-canvas';\r\n canvas.setAttribute('style', 'display: none');\r\n canvas.setAttribute('id', canvasId);\r\n var width = ideoSvg.width.baseVal.value + 30;\r\n var ideoSvgClone = ideoSvg.cloneNode(true);\r\n ideoSvgClone.style.left = '';\r\n canvas.setAttribute('width', width);\r\n document.body.appendChild(canvas);\r\n\r\n // Called after PNG image is created from data URL\r\n function triggerDownload(imgUrl) {\r\n var evt = new MouseEvent('click', {\r\n view: window,\r\n bubbles: false,\r\n cancelable: true\r\n });\r\n\r\n var a = document.createElement('a');\r\n a.setAttribute('download', 'ideogram.png');\r\n a.setAttribute('href', imgUrl);\r\n a.setAttribute('target', '_blank');\r\n\r\n // Enables easy testing\r\n a.setAttribute('id', '_ideo-undisplayed-dl-image-link');\r\n a.setAttribute('style', 'display: none;');\r\n document.body.appendChild(a);\r\n\r\n a.dispatchEvent(evt);\r\n canvas.remove();\r\n }\r\n\r\n var canvas = document.getElementById(canvasId);\r\n\r\n // Enlarge canvas and disable smoothing, for higher resolution PNG\r\n canvas.width *= 2;\r\n canvas.height *= 2;\r\n var ctx = canvas.getContext('2d');\r\n ctx.setTransform(2, 0, 0, 2, 0, 0);\r\n ctx.imageSmoothingEnabled = false;\r\n\r\n var data = (new XMLSerializer()).serializeToString(ideoSvgClone);\r\n var domUrl = window.URL || window.webkitURL || window;\r\n\r\n var img = new Image();\r\n var svgBlob = new Blob([data], {type: 'image/svg+xml;charset=utf-8'});\r\n var url = domUrl.createObjectURL(svgBlob);\r\n\r\n img.onload = function() {\r\n ctx.drawImage(img, 0, 0);\r\n domUrl.revokeObjectURL(url);\r\n\r\n var imgUrl = canvas\r\n .toDataURL('image/png')\r\n .replace('image/png', 'image/octet-stream');\r\n\r\n triggerDownload(imgUrl);\r\n };\r\n\r\n img.src = url;\r\n}\r\n\r\n\r\nfunction getFont(ideo) {\r\n const config = ideo.config;\r\n\r\n let family = 'sans-serif';\r\n if (config.fontFamily) {\r\n family = config.fontFamily;\r\n }\r\n\r\n const labelSize = config.annotLabelSize ? config.annotLabelSize : 13;\r\n const font = '600 ' + labelSize + 'px ' + family;\r\n\r\n return font;\r\n}\r\n\r\n/**\r\n * Get width and height of given text in pixels.\r\n *\r\n * Background: https://erikonarheim.com/posts/canvas-text-metrics/\r\n */\r\nfunction getTextSize(text, ideo) {\r\n var font = getFont(ideo);\r\n\r\n // re-use canvas object for better performance\r\n var canvas =\r\n getTextSize.canvas ||\r\n (getTextSize.canvas = document.createElement('canvas'));\r\n var context = canvas.getContext('2d');\r\n context.font = font;\r\n var metrics = context.measureText(text);\r\n\r\n // metrics.width is less precise than technique below\r\n var right = metrics.actualBoundingBoxRight;\r\n var left = metrics.actualBoundingBoxLeft;\r\n var width = Math.abs(left) + Math.abs(right);\r\n\r\n const height =\r\n Math.abs(metrics.actualBoundingBoxAscent) +\r\n Math.abs(metrics.actualBoundingBoxDescent);\r\n\r\n return {width, height};\r\n}\r\n\r\n/** Clone a nested array */\r\nfunction deepCopy(array) {\r\n return JSON.parse(JSON.stringify(array));\r\n}\r\n\r\nexport {\r\n assemblyIsAccession, hasNonGenBankAssembly, hasGenBankAssembly, getDataDir,\r\n getDir, round, onDidRotate, getSvg, d3, getEarlyTaxid, getTaxid,\r\n getCommonName, getScientificName, slug, isRoman, parseRoman, downloadPng,\r\n fetchWithRetry, getTextSize, getFont, deepCopy,\r\n fetchWithAuth as fetch\r\n};\r\n","import array from \"./array.js\";\nimport {Selection, root} from \"./selection/index.js\";\n\nexport default function(selector) {\n return typeof selector === \"string\"\n ? new Selection([document.querySelectorAll(selector)], [document.documentElement])\n : new Selection([selector == null ? [] : array(selector)], root);\n}\n","export default function max(values, valueof) {\n let max;\n if (valueof === undefined) {\n for (const value of values) {\n if (value != null\n && (max < value || (max === undefined && value >= value))) {\n max = value;\n }\n }\n } else {\n let index = -1;\n for (let value of values) {\n if ((value = valueof(value, ++index, values)) != null\n && (max < value || (max === undefined && value >= value))) {\n max = value;\n }\n }\n }\n return max;\n}\n","import {organismMetadata} from './organism-metadata';\r\nimport {staticCss} from './../bands/styles';\r\n\r\nfunction configurePloidy(ideo) {\r\n if (!ideo.config.ploidy) ideo.config.ploidy = 1;\r\n\r\n if (ideo.config.ploidy > 1) {\r\n ideo.sexChromosomes = {};\r\n if (!ideo.config.sex) {\r\n // Default to 'male' per human, mouse reference genomes.\r\n // TODO: The default sex value should probably be the heterogametic sex,\r\n // i.e. whichever sex has allosomes that differ in morphology.\r\n // In mammals and most insects that is the male.\r\n // However, in birds and reptiles, that is female.\r\n ideo.config.sex = 'male';\r\n }\r\n if (ideo.config.ploidy === 2 && !ideo.config.ancestors) {\r\n ideo.config.ancestors = {M: '#ffb6c1', P: '#add8e6'};\r\n ideo.config.ploidyDesc = 'MP';\r\n }\r\n }\r\n}\r\n\r\nfunction configureHeight(ideo) {\r\n var container, rect, chrHeight;\r\n\r\n if (!ideo.config.chrHeight) {\r\n container = ideo.config.container;\r\n rect = document.querySelector(container).getBoundingClientRect();\r\n\r\n if (ideo.config.orientation === 'vertical') {\r\n chrHeight = rect.height;\r\n } else {\r\n chrHeight = rect.width;\r\n }\r\n\r\n if (container === 'body' || chrHeight === 0) chrHeight = 400;\r\n ideo.config.chrHeight = chrHeight;\r\n }\r\n}\r\n\r\nfunction configureWidth(ideo) {\r\n var chrWidth, chrHeight;\r\n\r\n if (!ideo.config.chrWidth) {\r\n chrWidth = 10;\r\n chrHeight = ideo.config.chrHeight;\r\n\r\n if (chrHeight < 900 && chrHeight > 500) {\r\n chrWidth = Math.round(chrHeight / 40);\r\n } else if (chrHeight >= 900) {\r\n chrWidth = Math.round(chrHeight / 45);\r\n }\r\n ideo.config.chrWidth = chrWidth;\r\n }\r\n}\r\n\r\nfunction configureMargin(ideo) {\r\n if (ideo.config.geometry && ideo.config.geometry === 'collinear') {\r\n if ('chrMargin' in ideo.config === false) {\r\n ideo.config.chrMargin = 0;\r\n }\r\n return;\r\n }\r\n if (!ideo.config.chrMargin) {\r\n if (ideo.config.ploidy === 1) {\r\n ideo.config.chrMargin = 10;\r\n } else {\r\n // Defaults polyploid chromosomes to relatively small interchromatid gap\r\n ideo.config.chrMargin = Math.round(ideo.config.chrWidth / 4);\r\n }\r\n }\r\n if (ideo.config.showBandLabels) ideo.config.chrMargin += 20;\r\n}\r\n\r\nfunction configureBump(ideo) {\r\n ideo.bump = Math.round(ideo.config.chrHeight / 125);\r\n ideo.adjustedBump = false;\r\n if (ideo.config.chrHeight < 200) {\r\n ideo.adjustedBump = true;\r\n ideo.bump = 4;\r\n }\r\n}\r\n\r\nfunction configureSingleChromosome(config, ideo) {\r\n if (config.chromosome) {\r\n ideo.config.chromosomes = [config.chromosome];\r\n if ('showBandLabels' in config === false) {\r\n ideo.config.showBandLabels = true;\r\n }\r\n if ('rotatable' in config === false) ideo.config.rotatable = false;\r\n }\r\n}\r\n\r\nfunction configureOrganisms(config, ideo) {\r\n ideo.organisms = Object.assign({}, organismMetadata);\r\n if (config.taxid && config.organismMetadata) ideo.organisms[config.taxid] = config.organismMetadata\r\n ideo.organismsWithBands = Object.assign({}, ideo.organisms);\r\n}\r\n\r\nfunction configureCallbacks(config, ideo) {\r\n if (config.onLoad) ideo.onLoadCallback = config.onLoad;\r\n if (config.onLoadAnnots) ideo.onLoadAnnotsCallback = config.onLoadAnnots;\r\n if (config.onDrawAnnots) ideo.onDrawAnnotsCallback = config.onDrawAnnots;\r\n if (config.onBrushMove) ideo.onBrushMoveCallback = config.onBrushMove;\r\n if (config.onBrushEnd) ideo.onBrushEndCallback = config.onBrushEnd;\r\n if (config.onCursorMove) ideo.onCursorMoveCallback = config.onCursorMove;\r\n if (config.onDidRotate) ideo.onDidRotateCallback = config.onDidRotate;\r\n if (config.onWillShowAnnotTooltip) {\r\n ideo.onWillShowAnnotTooltipCallback = config.onWillShowAnnotTooltip;\r\n }\r\n if (config.onClickAnnot) {\r\n ideo.onClickAnnotCallback = config.onClickAnnot;\r\n }\r\n}\r\n\r\nfunction configureMiscellaneous(ideo) {\r\n ideo.chromosomesArray = [];\r\n ideo.coordinateSystem = 'iscn';\r\n ideo.maxLength = {bp: 0, iscn: 0};\r\n ideo.chromosomes = {};\r\n ideo.numChromosomes = 0;\r\n if (!ideo.config.debug) ideo.config.debug = false;\r\n if (!ideo.config.dataDir) ideo.config.dataDir = ideo.getDataDir();\r\n if (!ideo.config.container) ideo.config.container = 'body';\r\n ideo.selector = ideo.config.container + ' #_ideogram';\r\n if (!ideo.config.resolution) ideo.config.resolution = '';\r\n if (!ideo.config.orientation) ideo.config.orientation = 'vertical';\r\n if (!ideo.config.brush) ideo.config.brush = null;\r\n if (!ideo.config.rows) ideo.config.rows = 1;\r\n if ('showChromosomeLabels' in ideo.config === false) {\r\n ideo.config.showChromosomeLabels = true;\r\n }\r\n if (!ideo.config.showNonNuclearChromosomes) {\r\n ideo.config.showNonNuclearChromosomes = false;\r\n }\r\n if (!ideo.config.chromosomeScale) {\r\n ideo.config.chromosomeScale = 'absolute';\r\n }\r\n if (!ideo.config.showTools) ideo.config.showTools = false;\r\n}\r\n\r\nfunction configureBands(ideo) {\r\n if (!ideo.config.showBandLabels) ideo.config.showBandLabels = false;\r\n\r\n if ('showFullyBanded' in ideo.config === false) {\r\n ideo.config.showFullyBanded = true;\r\n }\r\n\r\n ideo.bandsToShow = [];\r\n ideo.bandData = {};\r\n}\r\n\r\nlet configuredCss = staticCss;\r\nfunction configureTextStyle(ideo) {\r\n const config = ideo.config;\r\n if (!config.chrLabelSize) ideo.config.chrLabelSize = 9;\r\n if (!config.chrLabelColor) ideo.config.chrLabelColor = '#000';\r\n if (!config.fontFamily) ideo.config.fontFamily = '';\r\n\r\n const size = `font-size: ${config.chrLabelSize}px`;\r\n const color = `fill: ${config.chrLabelColor}`;\r\n const fontFamily = `font-family: ${config.fontFamily}`;\r\n configuredCss += `#_ideogram text {${fontFamily}; ${size}; ${color};}`;\r\n configuredCss += `#_ideogramLabel text {${fontFamily};}`;\r\n}\r\n\r\n/**\r\n * High-level helper method for Ideogram constructor.\r\n *\r\n * @param config Configuration object. Enables setting Ideogram properties.\r\n *\r\n * Docs: https://github.com/eweitz/ideogram/blob/master/api.md\r\n */\r\nfunction configure(config) {\r\n // Clone the config object, to allow multiple instantiations\r\n // without picking up prior ideogram's settings\r\n this.config = JSON.parse(JSON.stringify(config));\r\n\r\n configureMiscellaneous(this);\r\n configurePloidy(this);\r\n configureBands(this);\r\n configureHeight(this);\r\n configureWidth(this);\r\n configureMargin(this);\r\n configureCallbacks(config, this);\r\n configureOrganisms(config, this);\r\n configureBump(this);\r\n configureSingleChromosome(config, this);\r\n configureTextStyle(this);\r\n this.initAnnotSettings();\r\n if (!this.config.geometry || this.config.geometry === 'parallel') {\r\n this.config.chrMargin += this.config.chrWidth;\r\n if (this.config.annotationsLayout === 'heatmap') {\r\n this.config.chrMargin += this.config.annotTracksHeight;\r\n } else {\r\n this.config.chrMargin += this.config.annotTracksHeight * 2;\r\n }\r\n }\r\n this.init();\r\n}\r\n\r\nexport {configure, configuredCss};\r\n","/**\r\n * @fileoverview Functions for collinear chromosomes.\r\n * Collinear chromosomes form a line together, unlike the default parallel\r\n * geometry.\r\n */\r\n\r\nimport {d3} from './lib';\r\n\r\nfunction labelGenomes(ideo) {\r\n\r\n ideo.config.taxids.forEach((taxid, i) => {\r\n var org = ideo.organisms[taxid];\r\n // var commonName = slug(org.commonName);\r\n var scientificName = org.scientificName;\r\n d3.select(ideo.selector)\r\n .append('text')\r\n .attr('class', 'genomeLabel italic')\r\n .attr('x', 55 + 200 * i)\r\n .attr('y', 10)\r\n .text(scientificName)\r\n .attr('text-anchor', 'middle');\r\n });\r\n}\r\n\r\n/**\r\n* Rearrange chromosomes from parallel vertical to collinear vertical\r\n*\r\n* Parallel vertical (as in https://eweitz.github.io/ideogram/human)\r\n* | | |\r\n*\r\n* Collinear vertical (as in https://eweitz.github.io/ideogram/orthologs?loci=2:150000000,5:20000000;3:100000000,10:80000000&org=homo-sapiens&org2=mus-musculus)\r\n* |\r\n* |\r\n* |\r\n*/\r\nfunction rearrangeChromosomes(chrSets, yOffsets, x, ideo) {\r\n var i, chrSet, y, chrLabelX, adjustedX, chr, taxid, orgIndex,\r\n config = ideo.config,\r\n chrLabelSize = config.chrLabelSize;\r\n\r\n for (i = 0; i < chrSets.length; i++) {\r\n chrSet = chrSets[i];\r\n y = yOffsets[i] + 23 - chrLabelSize;\r\n\r\n chr = ideo.chromosomesArray[i];\r\n taxid = chr.id.split('-')[1];\r\n orgIndex = ideo.config.taxids.indexOf(taxid);\r\n adjustedX = x - orgIndex * 200 - 30 - 5;\r\n if (orgIndex === 0) {\r\n chrLabelX = -34;\r\n adjustedX += ideo.config.chrWidth * 2 - 16;\r\n } else {\r\n chrLabelX = ideo.config.chrWidth * 2 - 24;\r\n }\r\n\r\n if (config.showChromosomeLabels) {\r\n const labelSpan = chrSet.querySelector('.chrLabel > tspan');\r\n labelSpan.setAttribute('x', chrLabelX);\r\n labelSpan.setAttribute('dy', chrLabelSize - 8);\r\n chrSet.querySelector('.chrLabel').setAttribute('text-anchor', 'start');\r\n }\r\n chrSet.setAttribute(\r\n 'transform', 'rotate(90) translate(' + y + ',' + adjustedX + ')'\r\n );\r\n chrSet.querySelector('.chromosome').setAttribute(\r\n 'transform', 'translate(-13, 10)'\r\n );\r\n }\r\n\r\n labelGenomes(ideo);\r\n}\r\n\r\n/**\r\n* Get pixel coordinates to use for rearrangement\r\n*/\r\nfunction getYOffsets(chrSets, ideo) {\r\n var yOffsets, i, index, chr, prevChr, y, prevWidth, prevY, yBump, taxid,\r\n seenTaxids = {};\r\n\r\n yOffsets = [];\r\n for (i = 0; i < chrSets.length; i++) {\r\n chr = ideo.chromosomesArray[i];\r\n taxid = chr.id.split('-')[1];\r\n index = (i === 0) ? i : i - 1;\r\n prevChr = ideo.chromosomesArray[index];\r\n if (i === 0 || taxid in seenTaxids === false) {\r\n y = 20;\r\n seenTaxids[taxid] = 1;\r\n } else {\r\n prevWidth = prevChr.width;\r\n prevY = yOffsets[index];\r\n yBump = (ideo.config.showChromosomeLabels ? 0 : 2);\r\n y = prevY + prevWidth + yBump + ideo.config.chrMargin;\r\n }\r\n yOffsets.push(y);\r\n }\r\n\r\n return yOffsets;\r\n}\r\n\r\nfunction collinearizeVerticalChromosomes(ideo) {\r\n var chrSets, yOffsets, x, height, width,\r\n config = ideo.config;\r\n\r\n ideo.config.annotLabelHeight = 12;\r\n // var annotLabelHeight = ideo.config.annotLabelHeight;\r\n\r\n if ('demarcateCollinearChromosomes' in ideo.config === false) {\r\n ideo.config.demarcateCollinearChromosomes = true;\r\n }\r\n\r\n chrSets = document.querySelectorAll('.chromosome-set');\r\n\r\n x = -40;\r\n\r\n yOffsets = getYOffsets(chrSets, ideo);\r\n rearrangeChromosomes(chrSets, yOffsets, x, ideo);\r\n\r\n width = Math.round(yOffsets.slice(-1)[0] + 70);\r\n\r\n if (config.multiorganism) {\r\n height *= 8;\r\n var maxHeight = 0;\r\n yOffsets.forEach(d => {\r\n if (d > maxHeight) maxHeight = d;\r\n });\r\n height = maxHeight + 30;\r\n } else {\r\n height = xOffsets.slice(-1)[0] + 30;\r\n }\r\n\r\n d3.select(ideo.selector)\r\n .attr('height', height)\r\n .attr('width', width);\r\n\r\n d3.select('#_ideogramTrackLabelContainer').remove();\r\n d3.select('#_ideogramInnerWrap')\r\n .insert('div', ':first-child')\r\n .attr('id', '_ideogramTrackLabelContainer')\r\n .style('position', 'absolute');\r\n}\r\n\r\nexport default collinearizeVerticalChromosomes;\r\n","/**\r\n * @fileoverview Functions for collinear chromosomes.\r\n * Collinear chromosomes form a line together, unlike the default parallel\r\n * geometry.\r\n */\r\n\r\nimport {d3} from './lib';\r\nimport collinearizeVerticalChromosomes from './collinear-vertical';\r\n\r\nfunction labelGenomes(ideo) {\r\n\r\n ideo.config.taxids.forEach((taxid, i) => {\r\n var org = ideo.organisms[taxid];\r\n var config = ideo.config;\r\n // var commonName = slug(org.commonName);\r\n var scientificName = org.scientificName;\r\n d3.select(ideo.selector)\r\n .append('text')\r\n .attr('class', 'genomeLabel italic')\r\n .attr('x', 5)\r\n .attr('y', config.chrLabelSize + (200 + (3 * config.chrWidth)) * i)\r\n .text(scientificName);\r\n });\r\n}\r\n\r\n/**\r\n* Rearrange chromosomes from parallel horizontal to collinear horizontal\r\n*\r\n* Parallel horizontal (as in https://eweitz.github.io/ideogram/mouse)\r\n* ---\r\n* ---\r\n* ---\r\n*\r\n* Collinear horizontal (as in https://eweitz.github.io/ideogram/geometry-collinear):\r\n* --- --- ---\r\n*/\r\nfunction rearrangeChromosomes(chrSets, xOffsets, y, ideo) {\r\n var i, chr, chrSet, taxid, x, adjustedY, orgIndex, chrLabelY,\r\n config = ideo.config,\r\n chrWidth = config.chrWidth,\r\n chrLabelSize = config.chrLabelSize;\r\n\r\n for (i = 0; i < chrSets.length; i++) {\r\n chrSet = chrSets[i];\r\n x = xOffsets[i];\r\n\r\n chr = ideo.chromosomesArray[i];\r\n taxid = chr.id.split('-')[1];\r\n orgIndex = config.taxids.indexOf(taxid);\r\n adjustedY = y + orgIndex * 200;\r\n if (orgIndex === 0 && ideo.config.multiorganism) {\r\n chrLabelY = chrLabelSize - 4;\r\n adjustedY += chrWidth * 2 + chrLabelSize;\r\n } else {\r\n chrLabelY = chrWidth * 2 + chrLabelSize + 2;\r\n }\r\n\r\n if (ideo.config.showChromosomeLabels) {\r\n chrSet.querySelector('.chrLabel').setAttribute('y', chrLabelY);\r\n chrSet.querySelector('.chrLabel').setAttribute('text-anchor', 'middle');\r\n }\r\n chrSet.setAttribute('transform', 'translate(' + x + ',' + adjustedY + ')');\r\n chrSet.querySelector('.chromosome').setAttribute(\r\n 'transform', 'translate(-13, 10)'\r\n );\r\n }\r\n\r\n if (config.multiorganism) {\r\n labelGenomes(ideo);\r\n }\r\n}\r\n\r\n/**\r\n* Get pixel coordinates to use for rearrangement\r\n*/\r\nfunction getXOffsets(chrSets, ideo) {\r\n var xOffsets, i, index, chr, prevChr, x, prevWidth, prevX, xBump, taxid,\r\n seenTaxids = {};\r\n\r\n xOffsets = [];\r\n for (i = 0; i < chrSets.length; i++) {\r\n chr = ideo.chromosomesArray[i];\r\n taxid = chr.id.split('-')[1];\r\n index = (i === 0) ? i : i - 1;\r\n prevChr = ideo.chromosomesArray[index];\r\n if (i === 0 || taxid in seenTaxids === false) {\r\n x = 20;\r\n seenTaxids[taxid] = 1;\r\n } else {\r\n prevWidth = prevChr.width;\r\n prevX = xOffsets[index];\r\n xBump = (ideo.config.showChromosomeLabels ? 0 : 2);\r\n x = prevX + prevWidth + xBump + ideo.config.chrMargin;\r\n }\r\n xOffsets.push(x);\r\n }\r\n\r\n return xOffsets;\r\n}\r\n\r\n// /**\r\n// * Track number of chromosomes in preceding organisms.\r\n// * Adds an instance variable to the ideogram object to offset\r\n// * chromosome indices. Needed for multiorganism collinear ideograms.\r\n// */\r\n// function setTaxidChrOffsets(ideo) {\r\n// var taxidChrOffsets, taxidChrOffset;\r\n\r\n// taxidChrOffsets = {};\r\n\r\n// taxidChrOffset = 0;\r\n// ideo.config.organism.forEach((org) => {\r\n// var taxid, numChrs;\r\n// taxid = ideo.getTaxid(org);\r\n// taxidChrOffsets[taxid] = taxidChrOffset;\r\n// numChrs = Object.keys(ideo.chromosomes[taxid]).length;\r\n// taxidChrOffset += numChrs;\r\n// });\r\n\r\n// ideo.taxidChrOffsets = taxidChrOffsets;\r\n// }\r\n\r\n// /**\r\n// * Change chromosome indices for multiorganism collinear ideograms\r\n// * This is needed to account for x-offsets.\r\n// */\r\n// function adjustChrIndex(ideo) {\r\n// setTaxidChrOffsets(ideo);\r\n\r\n// ideo.chromosomesArray.map((chr) => {\r\n// var taxid = chr.id.split('-')[1];\r\n// var taxidChrOffset = ideo.taxidChrOffsets[taxid];\r\n// chr.chrIndex -= taxidChrOffset;\r\n// ideo.chromosomes[taxid][chr.name].chrIndex = chr.chrIndex;\r\n// });\r\n// }\r\n\r\nfunction collinearizeChromosomes(ideo) {\r\n var chrSets, xOffsets, y, height, width,\r\n config = ideo.config,\r\n annotHeight = config.annotationHeight || 0;\r\n\r\n if (config.orientation === 'vertical') {\r\n collinearizeVerticalChromosomes(ideo);\r\n return;\r\n }\r\n\r\n // if (config.multiorganism) adjustChrIndex(ideo);\r\n\r\n ideo.config.annotLabelHeight = 12;\r\n var annotLabelHeight = ideo.config.annotLabelHeight;\r\n\r\n if ('demarcateCollinearChromosomes' in ideo.config === false) {\r\n ideo.config.demarcateCollinearChromosomes = true;\r\n }\r\n\r\n chrSets = document.querySelectorAll('.chromosome-set');\r\n\r\n y = (\r\n (config.numAnnotTracks * (annotHeight + annotLabelHeight + 4)) -\r\n config.chrWidth + 1\r\n );\r\n\r\n xOffsets = getXOffsets(chrSets, ideo);\r\n rearrangeChromosomes(chrSets, xOffsets, y, ideo);\r\n\r\n height = y + config.chrWidth * 2 + 20;\r\n\r\n if (config.multiorganism) {\r\n height *= 8;\r\n var maxWidth = 0;\r\n xOffsets.forEach(d => {\r\n if (d > maxWidth) maxWidth = d;\r\n });\r\n width = maxWidth + 20;\r\n } else {\r\n width = xOffsets.slice(-1)[0] + 20;\r\n }\r\n\r\n d3.select(ideo.selector)\r\n .attr('width', width)\r\n .attr('height', height);\r\n\r\n d3.select('#_ideogramTrackLabelContainer').remove();\r\n d3.select('#_ideogramInnerWrap')\r\n .insert('div', ':first-child')\r\n .attr('id', '_ideogramTrackLabelContainer')\r\n .style('position', 'absolute');\r\n}\r\n\r\nexport default collinearizeChromosomes;\r\n","import {d3} from '../lib';\r\nimport collinearizeChromosomes from '../collinear';\r\n\r\nfunction processLabels(config, ideo) {\r\n var i, chrID, t0C, t1C;\r\n\r\n if (config.showBandLabels === true) {\r\n t0C = new Date().getTime();\r\n ideo.hideUnshownBandLabels();\r\n t1C = new Date().getTime();\r\n if (config.debug) {\r\n console.log('Time in showing bands: ' + (t1C - t0C) + ' ms');\r\n }\r\n\r\n if (config.orientation === 'vertical') {\r\n for (i = 0; i < ideo.chromosomesArray.length; i++) {\r\n chrID = '#' + ideo.chromosomesArray[i].id;\r\n ideo.rotateChromosomeLabels(d3.select(chrID), i);\r\n }\r\n }\r\n }\r\n\r\n if (config.showChromosomeLabels === true) {\r\n ideo.drawChromosomeLabels(ideo.chromosomes);\r\n }\r\n}\r\n\r\nfunction processAnnots(ideo) {\r\n if (typeof ideo.timeout !== 'undefined') window.clearTimeout(ideo.timeout);\r\n\r\n ideo.rawAnnots = ideo.setOriginalTrackIndexes(ideo.rawAnnots);\r\n\r\n if (ideo.config.annotationsDisplayedTracks) {\r\n ideo.annots =\r\n ideo.updateDisplayedTracks(ideo.config.annotationsDisplayedTracks);\r\n } else {\r\n ideo.annots = ideo.processAnnotData(ideo.rawAnnots);\r\n if (ideo.config.filterable) ideo.initCrossFilter();\r\n ideo.drawProcessedAnnots(ideo.annots);\r\n }\r\n}\r\n\r\n/**\r\n * Load (potentially large) annotation dataset, then process it.\r\n */\r\nfunction waitForAndProcessAnnots(ideo) {\r\n if (ideo.rawAnnots) {\r\n processAnnots(ideo);\r\n } else {\r\n (function checkAnnotData() {\r\n ideo.timeout = setTimeout(function() {\r\n if (\r\n !ideo.rawAnnots ||\r\n (ideo.rawAnnots && typeof ideo.rawAnnots.then !== 'undefined')\r\n ) {\r\n // Ensure rawAnnots is defined and not a Promise (not \"then\"-able)\r\n checkAnnotData();\r\n } else {\r\n processAnnots(ideo);\r\n }\r\n }, 50);\r\n })();\r\n }\r\n}\r\n\r\nfunction reportDebugTimings(config, t0, t0A) {\r\n\r\n var t1A = new Date().getTime();\r\n if (config.debug) {\r\n console.log('Time in drawChromosome: ' + (t1A - t0A) + ' ms');\r\n }\r\n\r\n var t1 = new Date().getTime();\r\n if (config.debug) {\r\n console.log('Time constructing ideogram: ' + (t1 - t0) + ' ms');\r\n }\r\n}\r\n\r\n/**\r\n * Completes high-level initialization.\r\n * Draws chromosomes and band labels, rotating as needed;\r\n * processes and draws annotations;\r\n * creates brush, emits notification of load completion, etc.\r\n */\r\nfunction finishInit(t0) {\r\n var t0A = new Date().getTime(),\r\n ideo = this,\r\n config = ideo.config,\r\n confAnnots = config.annotations;\r\n\r\n ideo.initDrawChromosomes();\r\n\r\n if (config.annotationsPath) waitForAndProcessAnnots(ideo);\r\n\r\n processLabels(config, ideo);\r\n\r\n // Create a brush or a click cursor if specified\r\n if (config.brush) ideo.createBrush(config.brush);\r\n else if (config.cursorPosition) ideo.createClickCursor(config.cursorPosition);\r\n\r\n if (confAnnots) {\r\n if (Array.isArray(confAnnots)) {\r\n ideo.drawAnnots(confAnnots);\r\n } else {\r\n // Enable client-side-defined annotations to be formatted\r\n // like the wider variety of server-side-defined annotations.\r\n // Supports https://github.com/eweitz/ideogram/issues/137\r\n ideo.rawAnnots = confAnnots;\r\n ideo.afterRawAnnots();\r\n processAnnots(ideo);\r\n }\r\n }\r\n\r\n reportDebugTimings(config, t0, t0A);\r\n\r\n ideo.setOverflowScroll();\r\n\r\n if (config.geometry === 'collinear') collinearizeChromosomes(ideo);\r\n\r\n if (ideo.onLoadCallback) ideo.onLoadCallback();\r\n}\r\n\r\nexport {finishInit};\r\n","export class Ploidy {\r\n\r\n constructor(config) {\r\n this._config = config;\r\n this._description = this._normalize(this._config.ploidyDesc);\r\n }\r\n\r\n // Get number of chromosomes in a chromosome set\r\n getChromosomesNumber(setIndex) {\r\n if (this._config.ploidyDesc) {\r\n var chrSetCode = this._config.ploidyDesc[setIndex];\r\n if (chrSetCode instanceof Object) {\r\n return Object.keys(chrSetCode)[0].length;\r\n } else {\r\n return chrSetCode.length;\r\n }\r\n } else {\r\n return this._config.ploidy || 1;\r\n }\r\n }\r\n\r\n // Normalize use defined description\r\n _normalize(description) {\r\n var key, descValue,\r\n normalized = [];\r\n\r\n if (!description) return description;\r\n\r\n // Loop through description and normalize\r\n for (key in description) {\r\n descValue = description[key];\r\n if (typeof descValue === 'string') {\r\n if (this._config.orientation === 'vertical') {\r\n descValue = descValue.split('').reverse();\r\n }\r\n normalized.push({\r\n ancestors: descValue,\r\n existence: this._getexistenceArray(descValue.length)\r\n });\r\n } else {\r\n normalized.push({\r\n ancestors: Object.keys(descValue)[0],\r\n existence: descValue[Object.keys(descValue)[0]]\r\n });\r\n }\r\n }\r\n\r\n return normalized;\r\n }\r\n\r\n // Get array filled by '11' elements\r\n _getexistenceArray(length) {\r\n var array = [];\r\n\r\n for (var i = 0; i < length; i++) {\r\n array.push('11');\r\n }\r\n\r\n return array;\r\n }\r\n\r\n getSetSize(chrSetIndex) {\r\n if (this._description) {\r\n return this._description[chrSetIndex].ancestors.length;\r\n } else {\r\n return 1;\r\n }\r\n }\r\n\r\n // Get ancestor letter\r\n getAncestor(chrSetIndex, chrIndex) {\r\n if (this._description) {\r\n return this._description[chrSetIndex].ancestors[chrIndex];\r\n } else {\r\n return '';\r\n }\r\n }\r\n\r\n // Check if chromosome's arm should be rendered.\r\n // If no description was provided, method returns true and\r\n // something another depending on user provided description.\r\n exists(chrSetIndex, chrIndex, armIndex) {\r\n if (this._description) {\r\n var desc =\r\n this._description[chrSetIndex].existence[chrIndex][armIndex];\r\n return Number(desc) > 0;\r\n } else {\r\n return true;\r\n }\r\n }\r\n\r\n}\r\n","import {d3} from '../lib';\r\n\r\n/**\r\n * Chromosome's view utility class\r\n */\r\nexport class ChromosomeUtil {\r\n\r\n constructor(node) {\r\n this._node = node;\r\n }\r\n\r\n getLabel() {\r\n var label =\r\n d3\r\n .select(this._node.parentNode)\r\n .select('text.chrLabel')\r\n .text();\r\n return label;\r\n }\r\n\r\n /**\r\n * Get chromosome set label\r\n */\r\n getSetLabel() {\r\n var setLabel =\r\n d3\r\n .select(this._node.parentNode)\r\n .select('text.chrSetLabel')\r\n .text();\r\n return setLabel;\r\n }\r\n}\r\n","import {d3} from '../lib';\r\nimport {ChromosomeUtil} from './../views/chromosome-util';\r\n\r\nclass Layout {\r\n\r\n constructor(config, ideo) {\r\n this._config = config;\r\n this._ideo = ideo;\r\n this._ploidy = this._ideo._ploidy;\r\n this._translate = undefined;\r\n\r\n if ('chrSetMargin' in config) {\r\n this.chrSetMargin = config.chrSetMargin;\r\n } else {\r\n var chrMargin = this._config.chrMargin;\r\n this.chrSetMargin = (this._config.ploidy > 1 ? chrMargin : 0);\r\n }\r\n\r\n // Chromosome band's size.\r\n this._tickSize = 8;\r\n\r\n // Chromosome rotation state.\r\n this._isRotated = false;\r\n }\r\n\r\n // Get chart left margin\r\n _getLeftMargin() {\r\n return this.margin.left;\r\n }\r\n\r\n // Get rotated chromosome y scale\r\n _getYScale() {\r\n // 20 is width of rotated chromosome.\r\n return 20 / this._config.chrWidth;\r\n }\r\n\r\n // Get chromosome labels\r\n getChromosomeLabels(chrElement) {\r\n var util = new ChromosomeUtil(chrElement),\r\n labels = [];\r\n\r\n if (this._ideo.config.ploidy > 1) {\r\n labels.push(util.getSetLabel());\r\n }\r\n labels.push(util.getLabel());\r\n\r\n return labels.filter(function(d) {\r\n return d.length > 0;\r\n });\r\n }\r\n\r\n getChromosomeBandLabelTranslate(band) {\r\n var x, y, translate,\r\n ideo = this._ideo,\r\n tickSize = this._tickSize,\r\n orientation = ideo.config.orientation;\r\n\r\n if (orientation === 'vertical') {\r\n x = tickSize;\r\n y = ideo.round(2 + band.px.start + band.px.width / 2);\r\n translate = 'rotate(-90)translate(' + x + ',' + y + ')';\r\n } else if (orientation === 'horizontal') {\r\n x = ideo.round(-tickSize + band.px.start + band.px.width / 2);\r\n y = -10;\r\n translate = 'translate(' + x + ',' + y + ')';\r\n }\r\n\r\n return {\r\n x: x,\r\n y: y,\r\n translate: translate\r\n };\r\n }\r\n\r\n didRotate(chrIndex, chrElement) {\r\n var ideo, taxid, chrName, bands, chrModel, oldWidth,\r\n chrSetElement, transform, scale, scaleRE;\r\n\r\n ideo = this._ideo;\r\n taxid = ideo.config.taxid;\r\n chrName = chrElement.id.split('-')[0].replace('chr', '');\r\n chrModel = ideo.chromosomes[taxid][chrName];\r\n bands = chrModel.bands;\r\n\r\n chrSetElement = d3.select(chrElement.parentNode);\r\n transform = chrSetElement.attr('transform');\r\n scaleRE = /scale\\(.*\\)/;\r\n scale = scaleRE.exec(transform);\r\n transform = transform.replace(scale, '');\r\n chrSetElement.attr('transform', transform);\r\n\r\n oldWidth = chrModel.width;\r\n\r\n chrModel = ideo.getChromosomeModel(bands, chrName, taxid, chrIndex);\r\n\r\n chrModel.oldWidth = oldWidth;\r\n\r\n ideo.chromosomes[taxid][chrName] = chrModel;\r\n ideo.drawChromosome(chrModel);\r\n\r\n ideo.handleRotateOnClick();\r\n\r\n if (ideo.rawAnnots) {\r\n if (ideo.displayedTrackIndexes) {\r\n ideo.updateDisplayedTracks(ideo.displayedTrackIndexes);\r\n } else {\r\n ideo.annots = ideo.processAnnotData(ideo.rawAnnots);\r\n ideo.drawProcessedAnnots(ideo.annots);\r\n\r\n if (ideo.config.filterable) {\r\n ideo.initCrossFilter();\r\n }\r\n }\r\n }\r\n\r\n if (ideo.config.showBandLabels === true) {\r\n ideo.drawBandLabels(ideo.chromosomes);\r\n ideo.hideUnshownBandLabels();\r\n }\r\n\r\n if (ideo.onDidRotateCallback) {\r\n ideo.onDidRotateCallback(chrModel);\r\n }\r\n }\r\n\r\n rotate(chrSetIndex, chrIndex, chrElement) {\r\n var ideo, otherChrs, ideoBounds, labelSelectors;\r\n ideo = this._ideo;\r\n\r\n labelSelectors = (\r\n ideo.selector + ' .chrSetLabel, ' + ideo.selector + ' .chrLabel'\r\n );\r\n\r\n ideoBounds = document.querySelector(ideo.selector).getBoundingClientRect();\r\n\r\n // Find chromosomes which should be hidden\r\n otherChrs = d3.selectAll(ideo.selector + ' g.chromosome')\r\n .filter(function() {return this !== chrElement;});\r\n\r\n if (this._isRotated) {\r\n\r\n this._isRotated = false;\r\n\r\n ideo.config.chrHeight = ideo.config.chrHeightOriginal;\r\n ideo.config.chrWidth = ideo.config.chrWidthOriginal;\r\n ideo.config.annotationHeight = ideo.config.annotationHeightOriginal;\r\n\r\n // Rotate chromosome back\r\n this.rotateBack(chrSetIndex, chrIndex, chrElement, function() {\r\n // Show all other chromosomes and chromosome labels\r\n otherChrs.style('display', null);\r\n d3.selectAll(labelSelectors).style('display', null);\r\n ideo._layout.didRotate(chrIndex, chrElement);\r\n });\r\n\r\n } else {\r\n\r\n this._isRotated = true;\r\n\r\n // Hide all other chromosomes and chromosome labels\r\n otherChrs.style('display', 'none');\r\n d3.selectAll(labelSelectors).style('display', 'none');\r\n\r\n // Rotate chromosome\r\n this.rotateForward(chrSetIndex, chrIndex, chrElement, function() {\r\n\r\n var chrHeight, elementLength, windowLength;\r\n\r\n ideo.config.chrHeightOriginal = ideo.config.chrHeight;\r\n ideo.config.chrWidthOriginal = ideo.config.chrWidth;\r\n ideo.config.annotationHeightOriginal = ideo.config.annotationHeight;\r\n\r\n const settingsGearWidth = 20;\r\n\r\n if (ideo._layout._class === 'VerticalLayout') {\r\n elementLength = ideoBounds.width - settingsGearWidth;\r\n windowLength = window.innerWidth - settingsGearWidth;\r\n } else {\r\n elementLength = ideoBounds.height - 10;\r\n windowLength = window.innerHeight - 10;\r\n }\r\n\r\n // Set chromosome height to window length or ideogram element length,\r\n // whichever is smaller. This keeps whole chromosome viewable, while\r\n // also ensuring the height doesn't exceed what the user specified.\r\n if (windowLength < elementLength) {\r\n chrHeight = windowLength;\r\n } else {\r\n chrHeight = elementLength;\r\n }\r\n chrHeight -= ideo.config.chrMargin * 2;\r\n ideo.config.chrHeight = chrHeight;\r\n\r\n // Account for chromosome label\r\n // TODO: Make this dynamic, not hard-coded\r\n ideo.config.chrWidth *= 2.3;\r\n\r\n ideo.config.annotationHeight *= 1.7;\r\n\r\n ideo._layout.didRotate(chrIndex, chrElement);\r\n });\r\n }\r\n }\r\n\r\n getChromosomeLabelClass() {\r\n if (this._config.ploidy === 1) {\r\n return 'chrLabel';\r\n } else {\r\n return 'chrSetLabel';\r\n }\r\n }\r\n\r\n _getAdditionalOffset() {\r\n var config = this._config;\r\n var numTracks = config.annotationsNumTracks || config.numAnnotTracks || 1;\r\n return (config.annotationHeight || 0) * numTracks;\r\n }\r\n\r\n _getChromosomeSetSize(chrSetIndex) {\r\n // Get last chromosome set size.\r\n var setSize = this._ploidy.getSetSize(chrSetIndex);\r\n\r\n // Increase offset by last chromosome set size\r\n return (\r\n setSize * this._config.chrWidth * 2 + (this.chrSetMargin)\r\n );\r\n }\r\n\r\n // Get chromosome set label anchor property\r\n getChromosomeSetLabelAnchor() {\r\n return 'middle';\r\n }\r\n\r\n // Get chromosome label y position.\r\n getChromosomeLabelYPosition() {\r\n return -5.5;\r\n }\r\n\r\n getChromosomeSetLabelYPosition(chrIndex) {\r\n if (this._config.ploidy === 1) {\r\n return this.getChromosomeLabelYPosition(chrIndex);\r\n } else {\r\n return -2 * this._config.chrWidth;\r\n }\r\n }\r\n\r\n}\r\n\r\nexport default Layout;\r\n","/**\r\n* @fileoverview Vertical layout class\r\n* Ideogram instances with vertical layout are oriented with each chromosome\r\n* starting at top and ending at bottom, and aligned as columns.\r\n*/\r\n\r\nimport {d3} from '../lib';\r\nimport Layout from './layout';\r\n\r\nclass VerticalLayout extends Layout {\r\n\r\n constructor(config, ideo) {\r\n super(config, ideo);\r\n this._class = 'VerticalLayout';\r\n // Layout margins\r\n this.margin = {\r\n top: 30,\r\n left: 15\r\n };\r\n }\r\n\r\n rotateForward(chrSetIndex, chrIndex, chrElement, callback) {\r\n // TODO: Integrate chrSetIndex and chrIndex to support polyploid rotation.\r\n\r\n var self = this;\r\n\r\n var xOffset = 20;\r\n\r\n var scale = this.getChromosomeScale(chrElement);\r\n\r\n var transform =\r\n 'translate(' + xOffset + ', 25) ' + scale;\r\n\r\n d3.select(chrElement.parentNode)\r\n .transition()\r\n .attr('transform', transform)\r\n .on('end', callback);\r\n\r\n // Append new chromosome labels\r\n var labels = this.getChromosomeLabels(chrElement);\r\n var y = (xOffset + self._config.chrWidth) * 1.3;\r\n d3.select(this._ideo.getSvg())\r\n .append('g')\r\n .attr('class', 'tmp')\r\n .selectAll('text')\r\n .data(labels)\r\n .enter()\r\n .append('text')\r\n .attr('class', function(d, i) {\r\n return i === 0 && labels.length === 2 ? 'chrSetLabel' : null;\r\n })\r\n .attr('x', 0)\r\n .attr('y', y).style('opacity', 0)\r\n .text(String)\r\n .transition()\r\n .style('opacity', 1);\r\n\r\n this._ideo.config.orientation = 'horizontal';\r\n }\r\n\r\n rotateBack(setIndex, chrIndex, chrElement, callback) {\r\n\r\n var scale = this.getChromosomeScaleBack(chrElement);\r\n var translate = this.getChromosomeSetTranslate(setIndex);\r\n\r\n d3.select(chrElement.parentNode)\r\n .transition()\r\n .attr('transform', translate + ' ' + scale)\r\n .on('end', callback);\r\n\r\n d3.selectAll(this._ideo.selector + ' g.tmp')\r\n .style('opacity', 0)\r\n .remove();\r\n\r\n this._ideo.config.orientation = 'vertical';\r\n }\r\n\r\n getHeight() {\r\n return this._config.chrHeight + this.margin.top * 1.5;\r\n }\r\n\r\n getWidth() {\r\n return '97%';\r\n }\r\n\r\n getChromosomeBandTickY1() {\r\n return 2;\r\n }\r\n\r\n getChromosomeBandTickY2() {\r\n return 10;\r\n }\r\n\r\n getChromosomeSetLabelTranslate() {\r\n return 'rotate(-90)';\r\n }\r\n\r\n getChromosomeBandLabelAnchor() {\r\n return null;\r\n }\r\n\r\n getChromosomeScale(chrElement) {\r\n var ideoBox, chrBox, scaleX, scaleY;\r\n\r\n ideoBox = d3.select(this._ideo.selector).node().getBoundingClientRect();\r\n chrBox = chrElement.getBoundingClientRect();\r\n\r\n scaleX = (ideoBox.width / chrBox.height) * 0.97;\r\n scaleY = this._getYScale();\r\n\r\n return 'scale(' + scaleX + ', ' + scaleY + ')';\r\n }\r\n\r\n getChromosomeScaleBack(chrElement) {\r\n var scale, scaleX, scaleY, chrName, chrModel, taxid, ideo, config;\r\n\r\n ideo = this._ideo;\r\n config = ideo.config;\r\n taxid = config.taxid;\r\n\r\n chrName = chrElement.id.split('-')[0].replace('chr', '');\r\n chrModel = this._ideo.chromosomes[taxid][chrName];\r\n scaleX = (chrModel.oldWidth / (config.chrHeight * 3)) * 0.97;\r\n scaleY = 1 / this._getYScale();\r\n scale = 'scale(' + scaleX + ', ' + scaleY + ')';\r\n return scale;\r\n }\r\n\r\n getChromosomeSetTranslate(setIndex) {\r\n var marginTop = this.margin.top;\r\n var chromosomeSetYTranslate = this.getChromosomeSetYTranslate(setIndex);\r\n return (\r\n 'rotate(90) ' +\r\n 'translate(' + marginTop + ', -' + chromosomeSetYTranslate + ')'\r\n );\r\n }\r\n\r\n getChromosomeSetYTranslate(setIndex) {\r\n // Get additional padding caused by annotation/histogram tracks\r\n var pad = this._getAdditionalOffset(),\r\n config = this._config,\r\n margin = config.chrMargin,\r\n width = config.chrWidth,\r\n translate;\r\n\r\n // If no detailed description provided just use one formula for all cases\r\n if (!config.ploidyDesc) {\r\n // TODO:\r\n // This part of code contains a lot magic numbers and if\r\n // statements for exactly corresponing to original ideogram examples.\r\n // But all this stuff should be removed. Calculation of translate\r\n // should be a simple formula applied for all cases listed below.\r\n // Now they are diffirent because of Layout:_getAdditionalOffset do\r\n // not meet for cases when no annotation, when annotation exists and\r\n // when histogram used\r\n\r\n if (config.annotationsLayout === 'histogram') {\r\n var barWidth = config.barWidth;\r\n return margin + setIndex * (margin + width + 3) + barWidth * 2;\r\n } else {\r\n const decorPad =\r\n 'legendPad' in config ? config.legendPad : 0;\r\n translate = width + setIndex * (margin + width) + pad * 2 + decorPad;\r\n if (pad > 0) {\r\n return translate;\r\n } else {\r\n return translate + 4 + (2 * setIndex);\r\n }\r\n }\r\n }\r\n\r\n // If detailed description provided start to calculate offsets\r\n // for each chromosome set separately. This should be done only once\r\n if (!this._translate) {\r\n // First offset equals to zero\r\n this._translate = [this._ploidy.getSetSize(0) * width * 2];\r\n var prevTranslate;\r\n // Loop through description set\r\n for (var i = 1; i < this._config.ploidyDesc.length; i++) {\r\n prevTranslate = this._translate[i - 1];\r\n this._translate[i] = prevTranslate + this._getChromosomeSetSize(i - 1);\r\n }\r\n }\r\n\r\n return this._translate[setIndex];\r\n }\r\n\r\n getChromosomeSetLabelXPosition() {\r\n return (this._config.chrWidth * this._config.ploidy) / -2;\r\n }\r\n\r\n getChromosomeLabelXPosition() {\r\n return this._config.chrWidth / -2;\r\n }\r\n}\r\n\r\nexport default VerticalLayout;\r\n","/**\r\n* @fileoverview Horizontal layout class\r\n* Ideogram instances with horizontal layout are oriented with each chromosome\r\n* starting at left and ending at right, and aligned as rows.\r\n*/\r\n\r\nimport {d3} from '../lib';\r\nimport Layout from './layout';\r\n\r\nclass HorizontalLayout extends Layout {\r\n\r\n constructor(config, ideo) {\r\n super(config, ideo);\r\n this._class = 'HorizontalLayout';\r\n this.margin = {\r\n left: 20,\r\n top: 30\r\n };\r\n }\r\n\r\n _getLeftMargin() {\r\n var margin = Layout.prototype._getLeftMargin.call(this);\r\n if (this._config.ploidy > 1) {\r\n margin *= 1.8;\r\n }\r\n\r\n return margin;\r\n }\r\n\r\n rotateForward(setIndex, chrIndex, chrElement, callback) {\r\n\r\n var xOffset, yOffset, transform, labels;\r\n\r\n xOffset = 30;\r\n\r\n yOffset = xOffset + 7.5;\r\n\r\n transform = (\r\n 'rotate(90) ' +\r\n 'translate(' + xOffset + ', -' + yOffset + ') '\r\n );\r\n\r\n d3.select(chrElement.parentNode)\r\n .transition()\r\n .attr('transform', transform)\r\n .on('end', callback);\r\n\r\n // Append new chromosome labels\r\n labels = this.getChromosomeLabels(chrElement);\r\n d3.select(this._ideo.getSvg())\r\n .append('g')\r\n .attr('class', 'tmp')\r\n .selectAll('text')\r\n .data(labels)\r\n .enter()\r\n .append('text')\r\n .attr('class', function(d, i) {\r\n return i === 0 && labels.length === 2 ? 'chrSetLabel' : null;\r\n })\r\n .attr('x', xOffset - 4)\r\n .attr('y', function(d, i) {\r\n return (i + 1 + labels.length % 2) * 12;\r\n })\r\n .style('text-anchor', 'middle')\r\n .style('opacity', 0)\r\n .text(String)\r\n .transition()\r\n .style('opacity', 1);\r\n\r\n this._ideo.config.orientation = 'vertical';\r\n }\r\n\r\n rotateBack(setIndex, chrIndex, chrElement, callback) {\r\n var translate = this.getChromosomeSetTranslate(setIndex);\r\n\r\n d3.select(chrElement.parentNode)\r\n .transition()\r\n .attr('transform', translate)\r\n .on('end', callback);\r\n\r\n d3.selectAll(this._ideo.selector + ' g.tmp')\r\n .style('opacity', 0)\r\n .remove();\r\n\r\n this._ideo.config.orientation = 'horizontal';\r\n }\r\n\r\n getHeight(taxid) {\r\n if (typeof taxid === 'undefined') taxid = this._config.taxids[0];\r\n // Get last chromosome set offset.\r\n var numChromosomes = this._config.chromosomes[taxid].length;\r\n var lastSetOffset = this.getChromosomeSetYTranslate(numChromosomes - 1);\r\n\r\n // Get last chromosome set size.\r\n var lastSetSize = this._getChromosomeSetSize(numChromosomes - 1);\r\n\r\n // Increase offset by last chromosome set size\r\n lastSetOffset += lastSetSize;\r\n\r\n return lastSetOffset + this._getAdditionalOffset() * 2;\r\n }\r\n\r\n getWidth() {\r\n return this._config.chrHeight + this.margin.top * 1.5;\r\n }\r\n\r\n getChromosomeSetLabelAnchor() {\r\n return 'end';\r\n }\r\n\r\n getChromosomeBandLabelAnchor() {\r\n return null;\r\n }\r\n\r\n getChromosomeBandTickY1() {\r\n return 2;\r\n }\r\n\r\n getChromosomeBandTickY2() {\r\n return 10;\r\n }\r\n\r\n getChromosomeSetLabelTranslate() {\r\n return null;\r\n }\r\n\r\n getChromosomeSetTranslate(setIndex) {\r\n var leftMargin = this._getLeftMargin();\r\n var yTranslate = this.getChromosomeSetYTranslate(setIndex);\r\n return 'translate(' + leftMargin + ', ' + yTranslate + ')';\r\n }\r\n\r\n getChromosomeSetYTranslate(setIndex) {\r\n // If no detailed description provided just use one formula for all cases.\r\n if (!this._config.ploidyDesc) {\r\n return this._config.chrMargin * (setIndex + 1);\r\n }\r\n\r\n // Id detailed description provided start to calculate offsets\r\n // for each chromosome set separately. This should be done only once.\r\n if (!this._translate) {\r\n // First offset equals to zero.\r\n this._translate = [1];\r\n\r\n // Loop through description set\r\n for (var i = 1; i < this._config.ploidyDesc.length; i++) {\r\n this._translate[i] =\r\n this._translate[i - 1] + this._getChromosomeSetSize(i - 1);\r\n }\r\n }\r\n\r\n return this._translate[setIndex];\r\n }\r\n\r\n getChromosomeSetLabelXPosition(i) {\r\n if (this._config.ploidy === 1) {\r\n return this.getChromosomeLabelXPosition(i);\r\n } else {\r\n return -20;\r\n }\r\n }\r\n\r\n getChromosomeSetLabelYPosition(i) {\r\n var setSize = this._ploidy.getSetSize(i),\r\n config = this._config,\r\n chrMargin = config.chrMargin,\r\n chrWidth = config.chrWidth,\r\n y;\r\n\r\n if (config.ploidy === 1) {\r\n y = chrWidth / 2 + 3;\r\n } else {\r\n y = (setSize * chrMargin) / 2;\r\n }\r\n\r\n return y;\r\n }\r\n\r\n getChromosomeLabelXPosition() {\r\n return -8;\r\n }\r\n\r\n getChromosomeLabelYPosition() {\r\n return this._config.chrWidth;\r\n }\r\n\r\n}\r\n\r\nexport default HorizontalLayout;\r\n","/**\r\n* @fileoverview Paired layout class\r\n* Ideograms with paired layout group each chromosome in a chromosome set.\r\n* This enables ploidy support beyond the default haploid; e.g. diploid genomes.\r\n*/\r\n\r\nimport Layout from './layout';\r\n\r\nclass PairedLayout extends Layout {\r\n\r\n constructor(config, ideo) {\r\n super(config, ideo);\r\n\r\n this._class = 'PairedLayout';\r\n\r\n this.margin = {\r\n left: 30\r\n };\r\n }\r\n\r\n getHeight() {\r\n return this._config.chrHeight + this.margin.left * 1.5;\r\n }\r\n\r\n getWidth() {\r\n return '97%';\r\n }\r\n\r\n getChromosomeBandTickY1(chrIndex) {\r\n return chrIndex % 2 ? this._config.chrWidth : this._config.chrWidth * 2;\r\n }\r\n\r\n getChromosomeBandTickY2(chrIndex) {\r\n var width = this._config.chrWidth;\r\n return chrIndex % 2 ? width - this._tickSize : width * 2 + this._tickSize;\r\n }\r\n\r\n getChromosomeBandLabelAnchor(chrIndex) {\r\n return chrIndex % 2 ? null : 'end';\r\n }\r\n\r\n getChromosomeBandLabelTranslate(band, chrIndex) {\r\n var x = chrIndex % 2 ? 10 : -this._config.chrWidth - 10;\r\n var y = this._ideo.round(band.px.start + band.px.width / 2) + 3;\r\n\r\n return {\r\n x: y,\r\n y: y,\r\n translate: 'rotate(-90) translate(' + x + ', ' + y + ')'\r\n };\r\n }\r\n\r\n getChromosomeLabelXPosition() {\r\n return -this._tickSize;\r\n }\r\n\r\n getChromosomeSetLabelXPosition() {\r\n return this._config.chrWidth / -2;\r\n }\r\n\r\n getChromosomeSetLabelTranslate() {\r\n return 'rotate(-90)';\r\n }\r\n\r\n getChromosomeSetTranslate(setIndex) {\r\n var chromosomeSetYTranslate = this.getChromosomeSetYTranslate(setIndex);\r\n return (\r\n 'rotate(90) ' +\r\n 'translate(' + this.margin.left + ', -' + chromosomeSetYTranslate + ')'\r\n );\r\n }\r\n\r\n getChromosomeSetYTranslate(setIndex) {\r\n return 200 * (setIndex + 1);\r\n }\r\n\r\n}\r\n\r\nexport default PairedLayout;\r\n","import Layout from './layout';\r\n\r\nclass SmallLayout extends Layout {\r\n\r\n constructor(config, ideo) {\r\n super(config, ideo);\r\n\r\n this._class = 'SmallLayout';\r\n\r\n this.margin = {\r\n left: 36.5,\r\n top: 10\r\n };\r\n\r\n var taxid = this._ideo.getTaxid(this._ideo.config.organism);\r\n\r\n this.chrs = config.chromosomes[taxid];\r\n var numChrs = this.chrs.length;\r\n\r\n // Number of chromosomes per row\r\n this.chrsPerRow = Math.ceil(numChrs / config.rows);\r\n }\r\n\r\n // rotateForward(setIndex, chrIndex, chrElement, callback) {\r\n // var ideoBox =\r\n // d3.select(this._ideo.selector).node().getBoundingClientRect();\r\n // var chrBox = chrElement.getBoundingClientRect();\r\n //\r\n // var scaleX = (ideoBox.width / chrBox.height) * 0.97;\r\n // var scaleY = this._getYScale();\r\n //\r\n // transform = 'translate(5, 25) scale(' + scaleX + ', ' + scaleY + ')';\r\n //\r\n // d3.select(chrElement.parentNode)\r\n // .transition()\r\n // .attr('transform', transform)\r\n // .on('end', callback);\r\n // }\r\n //\r\n // rotateBack(setIndex, chrIndex, chrElement, callback) {\r\n // var translate = this.getChromosomeSetTranslate(setIndex);\r\n //\r\n // d3.select(chrElement.parentNode)\r\n // .transition()\r\n // .attr('transform', translate)\r\n // .on('end', callback);\r\n // }\r\n\r\n /**\r\n * eweitz 2020-04-13:\r\n * This height metric is crude because it is calculated before\r\n * the height (\"width\") of each chromosome is calculated.\r\n *\r\n * It calculates height by multiplying the max height of all chromosomes\r\n * (specified in the Ideogram configuration object) by the number of rows.\r\n * This ensures the ideogram height doesn't truncate in cases like dog\r\n * (where chrX on the second row is longer than chr1 on the first), but it\r\n * often leaves too much space on the second row, e.g. for human.\r\n *\r\n * Ideally, ideogram height would be cumulative height per row, plus top\r\n * margin. This would require calling getHeight _after_ all chromosomes\r\n * have had their height (technically, chr.width) assigned. See draft new\r\n * getHeight method below this getHeight method.\r\n */\r\n getHeight() {\r\n var config = this._config;\r\n var chrHeight = config.chrHeight * 1.25;\r\n return this._config.rows * (chrHeight + this.margin.top);\r\n }\r\n\r\n /**\r\n * eweitz 2020-04-13:\r\n * Draft refinement of getHeight. See note in classic version above.\r\n *\r\n * Total height is cumulative height per row, plus top margin\r\n */\r\n // getHeight() {\r\n // let height = 0;\r\n // const rows = this._config.rows;\r\n // const chrEntries = Object.entries(this.chrs);\r\n\r\n // for (let i = 0; i < rows; i++) {\r\n // let rowHeight = 0;\r\n // // Starting and ending indexes of chromosomes of this row\r\n // const startIndex = this.chrsPerRow * i;\r\n // const endIndex = this.chrsPerRow * (i + 1) - 1;\r\n\r\n // for (let j = startIndex; j < endIndex; j++) {\r\n // const thisChrHeight = chrEntries[j][1].width;\r\n // if (thisChrHeight > rowHeight) {\r\n // rowHeight = thisChrHeight;\r\n // }\r\n // }\r\n // height += rowHeight + this.margin.top;\r\n // }\r\n\r\n // return height;\r\n // }\r\n\r\n getWidth() {\r\n return '97%';\r\n }\r\n\r\n getChromosomeBandLabelTranslate() {\r\n\r\n }\r\n\r\n getChromosomeSetLabelTranslate() {\r\n return 'rotate(-90)';\r\n }\r\n\r\n getChromosomeSetTranslate(setIndex) {\r\n var xOffset, yOffset;\r\n\r\n if (setIndex > this.chrsPerRow - 1) {\r\n xOffset = this.margin.left + this._config.chrHeight * 1.3;\r\n yOffset = this.getChromosomeSetYTranslate(setIndex - this.chrsPerRow);\r\n } else {\r\n xOffset = this.margin.left;\r\n yOffset = this.getChromosomeSetYTranslate(setIndex);\r\n }\r\n\r\n return 'rotate(90) translate(' + xOffset + ', -' + yOffset + ')';\r\n }\r\n\r\n getChromosomeSetYTranslate(setIndex) {\r\n // Get additional padding caused by annotation tracks\r\n var additionalPadding = this._getAdditionalOffset() * 0.3;\r\n // If no detailed description provided just use one formula for all cases\r\n return (\r\n this.margin.left * (setIndex) + this._config.chrWidth +\r\n additionalPadding * 2 + additionalPadding * setIndex\r\n );\r\n }\r\n\r\n getChromosomeSetLabelXPosition(setIndex) {\r\n return (\r\n ((this._ploidy.getSetSize(setIndex) * this._config.chrWidth + 20) / -2) +\r\n (this._config.ploidy > 1 ? 0 : this._config.chrWidth)\r\n );\r\n }\r\n\r\n getChromosomeLabelXPosition() {\r\n return this._config.chrWidth / -2;\r\n }\r\n\r\n}\r\n\r\nexport default SmallLayout;\r\n","import {d3} from '../lib';\r\nimport {Ploidy} from '../ploidy';\r\nimport {getLayout} from '../layouts/layout-adapter';\r\n\r\n/**\r\n * If ploidy description is a string, then convert it to the canonical\r\n * array format. String ploidyDesc is used when depicting e.g. parental\r\n * origin each member of chromosome pair in a human genome.\r\n * See ploidy-basic.html for usage example.\r\n */\r\nfunction setPloidy(ideo) {\r\n if (\r\n 'ploidyDesc' in ideo.config &&\r\n typeof ideo.config.ploidyDesc === 'string'\r\n ) {\r\n var tmp = [];\r\n for (var i = 0; i < ideo.numChromosomes; i++) {\r\n tmp.push(ideo.config.ploidyDesc);\r\n }\r\n ideo.config.ploidyDesc = tmp;\r\n }\r\n // Organism ploidy description\r\n ideo._ploidy = new Ploidy(ideo.config);\r\n}\r\n\r\nfunction getContainerSvgClass(ideo) {\r\n var svgClass = '';\r\n if (ideo.config.showChromosomeLabels) {\r\n if (ideo.config.orientation === 'horizontal') {\r\n svgClass += 'labeledLeft ';\r\n } else {\r\n svgClass += 'labeled ';\r\n }\r\n }\r\n\r\n if (ideo.config.rotatable === false) {\r\n svgClass += 'no-rotate ';\r\n }\r\n\r\n if (\r\n ideo.config.annotationsLayout &&\r\n ideo.config.annotationsLayout === 'overlay'\r\n ) {\r\n svgClass += 'faint';\r\n }\r\n\r\n return svgClass;\r\n}\r\n\r\n/**\r\n * Write tooltip div setup with default styling.\r\n */\r\nfunction writeTooltipContainer(ideo) {\r\n d3.select(ideo.config.container + ' #_ideogramOuterWrap').append('div')\r\n .attr('class', '_ideogramTooltip')\r\n .attr('id', '_ideogramTooltip')\r\n .style('opacity', 0)\r\n .style('position', 'fixed')\r\n .style('text-align', 'center')\r\n .style('padding', '4px')\r\n .style('font', '12px sans-serif')\r\n .style('background', 'white')\r\n .style('border', '1px solid black')\r\n .style('border-radius', '5px')\r\n .style('z-index', '1000');\r\n}\r\n\r\nfunction writeContainerDom(ideo) {\r\n\r\n // Remove any previous container content\r\n d3.selectAll(ideo.config.container + ' #_ideogramOuterWrap').remove();\r\n\r\n d3.select(ideo.config.container)\r\n .append('div')\r\n .attr('id', '_ideogramOuterWrap')\r\n .append('div')\r\n .attr('id', '_ideogramTrackLabelContainer')\r\n .style('position', 'absolute');\r\n\r\n d3.select(ideo.config.container + ' #_ideogramOuterWrap').append('div')\r\n .attr('id', '_ideogramMiddleWrap') // needed for overflow and scrolling\r\n .style('position', 'relative')\r\n .style('overflow-x', 'auto')\r\n .style('transform', 'translateZ(0)') // add compositing layer for ideogram\r\n .append('div')\r\n .attr('id', '_ideogramInnerWrap') // needed for overflow and scrolling\r\n .append('svg')\r\n .attr('id', '_ideogram')\r\n .attr('class', getContainerSvgClass(ideo))\r\n .attr('width', ideo._layout.getWidth())\r\n .attr('height', ideo._layout.getHeight())\r\n .html(ideo.getBandColorGradients());\r\n}\r\n\r\n/**\r\n * Writes the HTML elements that contain this ideogram instance.\r\n */\r\nfunction writeContainer(t0) {\r\n var ideo = this;\r\n\r\n if (ideo.config.annotationsPath) {\r\n ideo.fetchAnnots(ideo.config.annotationsPath);\r\n }\r\n\r\n setPloidy(ideo);\r\n\r\n ideo._layout = getLayout(ideo);\r\n\r\n writeContainerDom(ideo);\r\n\r\n ideo.isOnlyIdeogram = document.querySelectorAll('#_ideogram').length === 1;\r\n writeTooltipContainer(ideo);\r\n ideo.finishInit(t0);\r\n}\r\n\r\nexport {writeContainer};\r\n","import VerticalLayout from './vertical-layout';\r\nimport HorizontalLayout from './horizontal-layout';\r\nimport PairedLayout from './paired-layout';\r\nimport SmallLayout from './small-layout';\r\n\r\nfunction getLayout(ideo) {\r\n var config = ideo.config;\r\n\r\n if ('perspective' in config && config.perspective === 'comparative') {\r\n return new PairedLayout(config, ideo);\r\n } else if ('rows' in config && config.rows > 1) {\r\n return new SmallLayout(config, ideo);\r\n } else if (config.orientation === 'vertical') {\r\n return new VerticalLayout(config, ideo);\r\n } else if (config.orientation === 'horizontal') {\r\n return new HorizontalLayout(config, ideo);\r\n } else {\r\n return new VerticalLayout(config, ideo);\r\n }\r\n}\r\n\r\nexport {getLayout};\r\n","import {hasNonGenBankAssembly, fetchWithRetry} from '../lib';\r\n\r\nvar lastBandDataUrl = '';\r\n\r\nfunction getBandUrl(bandDataFileNames, taxid, ideo) {\r\n return ideo.config.dataDir + bandDataFileNames[taxid];\r\n}\r\n\r\nfunction shouldFetchBands(bandDataFileNames, taxid, ideo) {\r\n var bandDataUrl = getBandUrl(bandDataFileNames, taxid, ideo);\r\n return (\r\n !(typeof window.chrBands !== 'undefined' && lastBandDataUrl === '') ||\r\n lastBandDataUrl !== bandDataUrl\r\n ) &&\r\n hasNonGenBankAssembly(ideo) &&\r\n taxid in bandDataFileNames;\r\n}\r\n\r\nfunction setBandData(url, fileNames, chrBands, ideo) {\r\n var taxid, fetchedTaxid, fileName;\r\n\r\n // Ensures correct taxid is processed in response callback;\r\n // using simply upstream 'taxid' variable gives the last\r\n // *requested* taxid, which fails when dealing with multiple taxa.\r\n for (taxid in fileNames) {\r\n fileName = fileNames[taxid];\r\n if (url.includes(fileName) && fileName !== '') {\r\n fetchedTaxid = taxid;\r\n }\r\n }\r\n\r\n ideo.bandData[fetchedTaxid] = chrBands;\r\n}\r\n\r\nfunction fetchBands(bandDataFileNames, taxid, t0, ideo) {\r\n var bandDataUrl = getBandUrl(bandDataFileNames, taxid, ideo);\r\n\r\n if (!ideo.numBandDataResponses) ideo.numBandDataResponses = 0;\r\n\r\n return fetchWithRetry(bandDataUrl)\r\n .then(function(response) {\r\n return response.json().then(function(rawBands) {\r\n lastBandDataUrl = bandDataUrl;\r\n\r\n delete window.chrBands; // Remove any previous chrBands variable\r\n window.chrBands = rawBands.chrBands;\r\n\r\n setBandData(response.url, bandDataFileNames, chrBands, ideo);\r\n });\r\n });\r\n}\r\n\r\nexport {shouldFetchBands, fetchBands};\r\n","/**\r\n * @fileoveriew Methods for initialization\r\n */\r\n\r\nimport {d3, slug} from '../lib';\r\nimport {configure} from './configure';\r\nimport {finishInit} from './finish-init';\r\nimport {writeContainer} from './write-container';\r\nimport {shouldFetchBands, fetchBands} from '../bands/fetch';\r\nimport {organismMetadata} from './organism-metadata';\r\n\r\nfunction isHeterogameticChromosome(chrModel, chrIndex, ideo) {\r\n var ploidy = ideo.config.ploidy;\r\n return (\r\n 'sex' in ideo.config &&\r\n (\r\n ploidy === 2 && ideo.sexChromosomes.index + 1 === chrIndex ||\r\n ideo.config.sex === 'female' && chrModel.name === 'Y'\r\n )\r\n );\r\n}\r\n\r\nfunction prepareChromosomes(bandsArray, chrs, taxid, ideo) {\r\n var j, bands, chromosome, chrModel, chrIndex;\r\n\r\n for (j = 0; j < chrs.length; j++) {\r\n chromosome = chrs[j];\r\n if (typeof bandsArray !== 'undefined') bands = bandsArray[j];\r\n\r\n chrIndex = j + ideo.config.taxids.indexOf(taxid);\r\n chrModel = ideo.getChromosomeModel(bands, chromosome, taxid, chrIndex);\r\n\r\n if (typeof chromosome !== 'string') {\r\n chromosome = chromosome.name.split(' ').slice(-1)[0].replace('chr', '');\r\n }\r\n\r\n ideo.chromosomes[taxid][chromosome] = chrModel;\r\n ideo.chromosomesArray.push(chrModel);\r\n\r\n if (isHeterogameticChromosome(chrModel, j, ideo)) continue;\r\n\r\n ideo.drawChromosome(chrModel);\r\n }\r\n}\r\n\r\nfunction setCoordinateSystem(chrs, ideo) {\r\n if (\r\n typeof chrBands !== 'undefined' &&\r\n chrs.length >= chrBands.length / 2\r\n ) {\r\n ideo.coordinateSystem = 'bp';\r\n }\r\n}\r\n\r\n/**\r\n * Configures chromosome data and calls downstream chromosome drawing functions\r\n */\r\nfunction initDrawChromosomes() {\r\n var taxid, i, chrs, bandsArray,\r\n ideo = this,\r\n taxids = ideo.config.taxids;\r\n\r\n for (i = 0; i < taxids.length; i++) {\r\n taxid = taxids[i];\r\n chrs = ideo.config.chromosomes[taxid];\r\n\r\n bandsArray = ideo.bandsArray[taxid];\r\n\r\n if (!ideo.config.showNonNuclearChromosomes) {\r\n // Remove MT\r\n // TODO: Handle other non-nuclear chromosomes, e.g. CP, AP\r\n chrs = chrs.filter(chr => chr !== 'MT');\r\n if (typeof bandsArray !== 'undefined') {\r\n bandsArray = bandsArray.filter(bands => {\r\n return bands[0].chr !== 'MT';\r\n });\r\n }\r\n }\r\n\r\n setCoordinateSystem(chrs, ideo);\r\n\r\n ideo.chromosomes[taxid] = {};\r\n ideo.setSexChromosomes(chrs);\r\n\r\n prepareChromosomes(bandsArray, chrs, taxid, ideo);\r\n\r\n if (ideo.config.showBandLabels) ideo.drawBandLabels(ideo.chromosomes);\r\n ideo.handleRotateOnClick();\r\n ideo._gotChrModels = true; // Prevent issue with errant rat centromeres\r\n }\r\n}\r\n\r\n/**\r\n * Attach any click handlers to rotate and toggle chromosomes\r\n */\r\nfunction handleRotateOnClick() {\r\n var ideo = this;\r\n\r\n if (!('rotatable' in ideo.config && ideo.config.rotatable === false)) {\r\n d3.selectAll(ideo.selector + ' .chromosome-set').on('click', function() {\r\n // Handles click on chromosome graphic or label.\r\n // Label click needed to toggle e.g. human MT\r\n const element = this.children[1];\r\n\r\n ideo.rotateAndToggleDisplay(element);\r\n });\r\n } else {\r\n d3.selectAll(ideo.selector).style('cursor', 'default');\r\n }\r\n}\r\n\r\n/**\r\n * Called when Ideogram has finished initializing.\r\n * Accounts for certain ideogram properties not being set until\r\n * asynchronous requests succeed, etc.\r\n */\r\nfunction onLoad() {\r\n call(this.onLoadCallback);\r\n}\r\n\r\nfunction getBandFileName(taxid, accession, ideo) {\r\n var organism = ideo.organisms[taxid];\r\n var bandFileName = [slug(organism.scientificName)];\r\n var assemblies = organism.assemblies;\r\n var resolution = ideo.config.resolution;\r\n\r\n if (accession !== assemblies.default) {\r\n bandFileName.push(accession);\r\n }\r\n if (\r\n taxid === '9606' &&\r\n (accession in assemblies === 'false' &&\r\n Object.values(assemblies).includes(config.assembly) ||\r\n (resolution !== '' && resolution !== 850))\r\n ) {\r\n bandFileName.push(resolution);\r\n }\r\n\r\n bandFileName = bandFileName.join('-');\r\n\r\n var fullyBandedTaxids = ['9606', '10090', '10116'];\r\n if (fullyBandedTaxids.includes(taxid) && !ideo.config.showFullyBanded) {\r\n bandFileName += '-no-bands';\r\n }\r\n\r\n bandFileName += '.json';\r\n\r\n return bandFileName;\r\n}\r\n\r\nfunction getBandFileNames(taxid, bandFileNames, ideo) {\r\n var organism, assemblies, accession, bandFileName,\r\n config = ideo.config;\r\n\r\n organism = ideo.organisms[taxid];\r\n\r\n if (!config.assembly) ideo.config.assembly = 'default';\r\n\r\n assemblies = organism.assemblies;\r\n\r\n if (ideo.assemblyIsAccession()) {\r\n accession = config.assembly;\r\n } else {\r\n accession = assemblies[config.assembly];\r\n }\r\n\r\n bandFileName = getBandFileName(taxid, accession, ideo);\r\n var isCustomOrganism = taxid === '-1';\r\n\r\n if (taxid in ideo.organismsWithBands || isCustomOrganism) {\r\n bandFileNames[taxid] = bandFileName;\r\n }\r\n return bandFileNames;\r\n}\r\n\r\nfunction prepareContainer(taxid, bandFileNames, t0, ideo) {\r\n\r\n if (shouldFetchBands(bandFileNames, taxid, ideo)) {\r\n return fetchBands(bandFileNames, taxid, t0, ideo).then(function() {\r\n return ideo.processBandData(taxid);\r\n });\r\n } else {\r\n return new Promise(function(resolve) {\r\n ideo.processBandData(taxid);\r\n resolve([taxid, undefined]);\r\n });\r\n }\r\n}\r\n\r\nfunction initializeTaxids(ideo) {\r\n return new Promise(function(resolve) {\r\n var organism = ideo.config.organism;\r\n if (typeof organism === 'number') {\r\n // 'organism' is a taxid, e.g. 9606\r\n ideo.getOrganismFromEutils(organism, function() {\r\n ideo.getTaxids(resolve);\r\n });\r\n } else {\r\n ideo.getTaxids(resolve);\r\n }\r\n\r\n });\r\n}\r\n\r\nfunction getBandsAndPrepareContainer(taxids, t0, ideo) {\r\n var bandFileNames, i, taxid,\r\n promises = [];\r\n\r\n bandFileNames = {};\r\n for (taxid in organismMetadata) {\r\n bandFileNames[taxid] = '';\r\n }\r\n\r\n for (i = 0; i < taxids.length; i++) {\r\n taxid = String(taxids[i]);\r\n bandFileNames = getBandFileNames(taxid, bandFileNames, ideo);\r\n promises.push(prepareContainer(taxid, bandFileNames, t0, ideo));\r\n }\r\n\r\n Promise.all(promises).then(function(taxidsAndBandsArrays) {\r\n var taxidAndBandsArray, taxid, bandsArray;\r\n\r\n for (i = 0; i < taxidsAndBandsArrays.length; i++) {\r\n taxidAndBandsArray = taxidsAndBandsArrays[i];\r\n taxid = taxidAndBandsArray[0];\r\n bandsArray = taxidAndBandsArray[1];\r\n\r\n if ('bandsArray' in ideo === false) {\r\n ideo.bandsArray = {};\r\n }\r\n\r\n ideo.bandsArray[taxid] = bandsArray;\r\n }\r\n ideo.writeContainer(t0);\r\n });\r\n}\r\n\r\n/**\r\n * Initializes an ideogram.\r\n * Sets some high-level properties based on instance configuration,\r\n * fetches band and annotation data if needed, and\r\n * writes an SVG element to the document to contain the ideogram\r\n */\r\n// Prevents race condition when init is called multiple times in\r\n// quick succession.\r\n// See https://github.com/eweitz/ideogram/pull/154.\r\nvar ideoNext = {};\r\nvar ideoQueued = {};\r\nvar ideoWait = {};\r\n\r\nfunction init(ideo) {\r\n ideo = ideo || this;\r\n var containerId = ideo.config.container;\r\n\r\n if (ideoWait[containerId]) {\r\n ideoQueued[containerId] = true;\r\n ideoNext[containerId] = ideo;\r\n } else {\r\n ideoWait[containerId] = true;\r\n initializeTaxids(ideo)\r\n .then(function(taxids) {\r\n\r\n var taxid = taxids[0];\r\n ideo.config.taxid = taxid;\r\n ideo.config.taxids = taxids;\r\n\r\n ideo.organismScientificName =\r\n ideo.getScientificName(ideo.config.taxid);\r\n\r\n var t0 = new Date().getTime();\r\n getBandsAndPrepareContainer(taxids, t0, ideo);\r\n\r\n ideoWait[containerId] = false;\r\n if (ideoQueued[containerId]) {\r\n ideoQueued[containerId] = false;\r\n init(ideoNext[containerId]);\r\n }\r\n });\r\n }\r\n}\r\n\r\nexport {\r\n configure, initDrawChromosomes, handleRotateOnClick,\r\n onLoad, init, finishInit, writeContainer\r\n};\r\n","/**\r\n * @fileoverview Parse raw Ideogram.js annotations from a BED file\r\n * BED documentation: https://genome.ucsc.edu/FAQ/FAQformat#format1\r\n */\r\n\r\nexport class BedParser {\r\n\r\n constructor(bed, ideo) {\r\n this.rawAnnots = this.parseBed(bed, ideo);\r\n }\r\n\r\n // http://stackoverflow.com/a/5624139\r\n static componentToHex(c) {\r\n var hex = parseInt(c, 10).toString(16);\r\n return hex.length === 1 ? '0' + hex : hex;\r\n }\r\n\r\n static rgbToHex(r, g, b) {\r\n return (\r\n '#' +\r\n BedParser.componentToHex(r) +\r\n BedParser.componentToHex(g) +\r\n BedParser.componentToHex(b)\r\n );\r\n }\r\n\r\n parseGenomicCoordinates(columns, ucscStyle) {\r\n var chr, start, stop, length;\r\n\r\n // These three columns (i.e. fields) are required\r\n chr = columns[0];\r\n start = parseInt(columns[1], 10);\r\n stop = parseInt(columns[2], 10);\r\n\r\n length = stop - start;\r\n\r\n if (ucscStyle) {\r\n chr = chr.slice(3);\r\n }\r\n\r\n return [chr, start, stop, length];\r\n }\r\n\r\n /**\r\n * Parses an annotation from a tab-separated line of a BED file\r\n */\r\n parseAnnotFromTsvLine(tsvLine, chrs, ucscStyle) {\r\n var annot, chrIndex, chr, start, rgb, color, label,\r\n columns = tsvLine.split(/\\s/g);\r\n\r\n [chr, start, stop, length] =\r\n this.parseGenomicCoordinates(columns, ucscStyle);\r\n\r\n chrIndex = chrs.indexOf(chr);\r\n if (chrIndex === -1) return [null, null];\r\n\r\n annot = ['', start, length, 0];\r\n\r\n if (columns.length >= 4) {\r\n label = columns[3];\r\n annot[0] = label;\r\n }\r\n\r\n if (columns.length >= 8) {\r\n rgb = columns[8].split(',');\r\n color = BedParser.rgbToHex(rgb[0], rgb[1], rgb[2]);\r\n annot.push(color);\r\n }\r\n\r\n return [chrIndex, annot];\r\n }\r\n\r\n parseRawAnnots(annots, bedStartIndex, tsvLines, chrs) {\r\n var i, line, chrIndex, annot, keys, rawAnnots, ucscStyle;\r\n\r\n ucscStyle = true;\r\n if (isNaN(parseInt(tsvLines[bedStartIndex], 10)) === false) {\r\n ucscStyle = false;\r\n }\r\n\r\n for (i = bedStartIndex; i < tsvLines.length; i++) {\r\n line = tsvLines[i];\r\n [chrIndex, annot] = this.parseAnnotFromTsvLine(line, chrs, ucscStyle);\r\n if (chrIndex !== null) annots[chrIndex].annots.push(annot);\r\n }\r\n\r\n keys = ['name', 'start', 'length', 'trackIndex'];\r\n if (tsvLines[bedStartIndex].length >= 8) keys.push('color');\r\n\r\n rawAnnots = {keys: keys, annots: annots};\r\n\r\n return rawAnnots;\r\n }\r\n\r\n /**\r\n * Parses a BED file, returns raw annotations\r\n */\r\n parseBed(bed, ideo) {\r\n var i, chrs, chr, bedStartIndex, rawAnnots,\r\n annots = [],\r\n tsvLines = bed.split(/\\r\\n|\\n/);\r\n\r\n chrs = Object.keys(ideo.chromosomes[ideo.config.taxid]);\r\n\r\n for (i = 0; i < chrs.length; i++) {\r\n chr = chrs[i];\r\n annots.push({chr: chr, annots: []});\r\n }\r\n\r\n bedStartIndex = 0; // 1 if BED has header (i.e. track line), 0 otherwise\r\n if (tsvLines[0].slice(0, 3) === 'chr' || isNaN(parseInt(tsvLines[0], 10))) {\r\n bedStartIndex = 1;\r\n }\r\n\r\n rawAnnots = this.parseRawAnnots(annots, bedStartIndex, tsvLines, chrs);\r\n return rawAnnots;\r\n }\r\n\r\n}\r\n","/**\r\n * @fileoverview Parse raw Ideogram.js annotations from a TSV file\r\n */\r\n\r\nexport class TsvParser {\r\n\r\n constructor(tsv, ideo) {\r\n this.rawAnnots = this.parseTsv(tsv, ideo);\r\n }\r\n\r\n parseGenomicCoordinates(columns) {\r\n var chr, start, stop, length;\r\n\r\n // These three columns (i.e. fields) are required\r\n chr = columns[1];\r\n start = parseInt(columns[2], 10);\r\n length = parseInt(columns[3], 10);\r\n\r\n stop = start + length;\r\n\r\n return [chr, start, stop, length];\r\n }\r\n\r\n /** If value has substring match in headers, return column index */\r\n getValueColumnIndex(value, headerLine) {\r\n let index;\r\n headerLine.split(/\\t/g).forEach((header, i) => {\r\n if (header.includes(value)) index = i;\r\n });\r\n return index;\r\n }\r\n\r\n /**\r\n * Parses an annotation from a tab-separated line of a TSV file\r\n */\r\n parseAnnotFromTsvLine(tsvLine, headerLine, chrs) {\r\n var annot, chrIndex, chr, start, color, fullName, significance, citations,\r\n name, index,\r\n columns = tsvLine.split(/\\t/g);\r\n\r\n [chr, start, stop, length] =\r\n this.parseGenomicCoordinates(columns);\r\n chrIndex = chrs.indexOf(chr);\r\n if (chrIndex === -1) return [null, null];\r\n\r\n name = columns[0];\r\n annot = [name, start, length, 0];\r\n\r\n if (headerLine.includes('color')) {\r\n index = this.getValueColumnIndex('color', headerLine);\r\n color = columns[index];\r\n annot.push(color);\r\n }\r\n if (headerLine.includes('full_name')) {\r\n index = this.getValueColumnIndex('full_name', headerLine);\r\n fullName = columns[index];\r\n annot.push(fullName);\r\n }\r\n if (headerLine.includes('citations')) {\r\n index = this.getValueColumnIndex('citations', headerLine);\r\n citations = columns[index];\r\n annot.push(citations);\r\n }\r\n if (headerLine.includes('significance')) {\r\n index = this.getValueColumnIndex('significance', headerLine);\r\n significance = columns[index];\r\n annot.push(significance);\r\n }\r\n\r\n return [chrIndex, annot];\r\n }\r\n\r\n parseRawAnnots(annots, tsvStartIndex, tsvLines, chrs) {\r\n var i, line, chrIndex, annot, keys, rawAnnots;\r\n\r\n const headerLine = tsvLines[0];\r\n\r\n for (i = tsvStartIndex; i < tsvLines.length; i++) {\r\n line = tsvLines[i];\r\n if (line.length === 0) continue; // Skip blank lines\r\n [chrIndex, annot] = this.parseAnnotFromTsvLine(line, headerLine, chrs);\r\n if (chrIndex !== null) annots[chrIndex].annots.push(annot);\r\n }\r\n\r\n keys = ['name', 'start', 'length', 'trackIndex'];\r\n if (headerLine.includes('color')) keys.push('color');\r\n if (headerLine.includes('full_name')) keys.push('fullName');\r\n if (headerLine.includes('citations')) keys.push('citations');\r\n if (headerLine.includes('significance')) keys.push('significance');\r\n\r\n rawAnnots = {keys: keys, annots: annots};\r\n\r\n return rawAnnots;\r\n }\r\n\r\n /**\r\n * Parses a TSV file, returns raw annotations\r\n */\r\n parseTsv(tsv, ideo) {\r\n var i, chrs, chr, tsvStartIndex, rawAnnots,\r\n annots = [],\r\n tsvLines = tsv.split(/\\r\\n|\\n/);\r\n\r\n chrs = Object.keys(ideo.chromosomes[ideo.config.taxid]);\r\n\r\n for (i = 0; i < chrs.length; i++) {\r\n chr = chrs[i];\r\n annots.push({chr: chr, annots: []});\r\n }\r\n\r\n tsvStartIndex = 0; // 1 if TSV has header (i.e. track line), 0 otherwise\r\n if (tsvLines[0].slice(0, 3) === 'chr' || isNaN(parseInt(tsvLines[0], 10))) {\r\n tsvStartIndex = 1;\r\n }\r\n\r\n rawAnnots = this.parseRawAnnots(annots, tsvStartIndex, tsvLines, chrs);\r\n\r\n if (tsvStartIndex === 1 && tsvLines[0].includes('citations')) {\r\n // TSV has a header, so parse citation_from__to_\r\n const headers = tsvLines[0].split('\\t');\r\n const citeIndex = 6;\r\n const citeHeader = headers[citeIndex];\r\n const fromTo = citeHeader.split('citations_')[1];\r\n rawAnnots.annots = rawAnnots.annots.map((annotsByChr) => {\r\n annotsByChr.annots = annotsByChr.annots.map((annot) => {\r\n annot[citeIndex] =\r\n annot[citeIndex] + ' citations ' + fromTo.replace(/_/g, ' ');\r\n return annot;\r\n });\r\n return annotsByChr;\r\n });\r\n }\r\n\r\n return rawAnnots;\r\n }\r\n\r\n}\r\n","/**\r\n * @fileoverview Functions used by parallel and collinear heatmaps.\r\n */\r\n\r\nvar reservedTrackKeys = [\r\n 'name', 'start', 'length', 'trackIndex', 'trackIndexOriginal', 'color'\r\n];\r\n\r\nvar defaultHeatmapColors = {\r\n 3: ['00B', 'DDD', 'F00'],\r\n 5: ['00D', '66D', 'DDD', 'F88', 'F00'],\r\n 17: [\r\n '00D', '00D', '00D', '00D', '00D', '44D', '44D', 'DDD', 'DDD',\r\n 'DDD', 'DDD', 'F88', 'F66', 'F22', 'F22', 'F00', 'F00', 'F00'\r\n ]\r\n};\r\n\r\n/**\r\n * Get label text for displayed tracks from annotation container metadata,\r\n * heatmap keys, or annotation container keys\r\n */\r\nfunction getLabels(ideo) {\r\n var annotKeys, labels, heatmaps, i;\r\n\r\n if (ideo.rawAnnots.metadata && ideo.rawAnnots.metadata.trackLabels) {\r\n labels = ideo.rawAnnots.metadata.trackLabels;\r\n } else if (ideo.config.heatmaps) {\r\n labels = [];\r\n heatmaps = ideo.config.heatmaps;\r\n for (i = 0; i < heatmaps.length; i++) {\r\n labels.push(heatmaps[i].key);\r\n }\r\n } else {\r\n annotKeys = ideo.rawAnnots.keys.slice(0);\r\n labels = annotKeys.filter(d => !reservedTrackKeys.includes(d));\r\n }\r\n\r\n if (ideo.displayedTrackIndexes) {\r\n labels = labels.filter(function(d, i) {\r\n return ideo.displayedTrackIndexes.includes(i + 1);\r\n });\r\n }\r\n\r\n return labels;\r\n}\r\n\r\n/**\r\n * Apply heatmap thresholds that are passed in as annotation metadata\r\n */\r\nfunction inflateThresholds(ideo) {\r\n var thresholds, colors,\r\n rawAnnots = ideo.rawAnnots;\r\n\r\n if (\r\n rawAnnots.metadata && !rawAnnots.metadata.heatmapThresholds &&\r\n !ideo.config.heatmapThresholds\r\n ) {\r\n return;\r\n }\r\n\r\n if (ideo.config.heatmapThresholds) {\r\n thresholds = ideo.config.heatmapThresholds;\r\n } else {\r\n thresholds = ideo.rawAnnots.metadata.heatmapThresholds;\r\n }\r\n\r\n colors = defaultHeatmapColors[thresholds.length + 1];\r\n thresholds = thresholds.map((d, i) => {\r\n return [d, '#' + colors[i]];\r\n });\r\n\r\n thresholds.push(['+', '#' + colors.slice(-1)[0]]);\r\n\r\n return thresholds;\r\n}\r\n\r\n/**\r\n * Set needed configuration options from raw annotation data.\r\n * Simplifies heatmap API by inferring reasonable defaults.\r\n */\r\nfunction inflateHeatmaps(ideo) {\r\n var i, labels, heatmaps, annotationTracks, rawAnnots, displayedTracks,\r\n thresholds = ideo.config.heatmapThresholds;\r\n\r\n heatmaps = [];\r\n rawAnnots = ideo.rawAnnots;\r\n labels = rawAnnots.keys.slice(3);\r\n\r\n annotationTracks = [];\r\n displayedTracks = [];\r\n if (rawAnnots.metadata || !isNaN(thresholds[0])) {\r\n thresholds = inflateThresholds(ideo);\r\n }\r\n\r\n for (i = 0; i < labels.length; i++) {\r\n heatmaps.push({key: labels[i], thresholds: thresholds});\r\n annotationTracks.push({id: labels[i]});\r\n displayedTracks.push(i + 1);\r\n }\r\n ideo.config.annotationsNumTracks = labels.length;\r\n ideo.config.annotationsDisplayedTracks = displayedTracks;\r\n ideo.config.heatmaps = heatmaps;\r\n ideo.config.annotationTracks = annotationTracks;\r\n}\r\n\r\n/**\r\n * Given annotation value (m), should it use the color in this threshold?\r\n */\r\nfunction shouldUseThresholdColor(m, numThresholds, value, prevThreshold,\r\n threshold) {\r\n\r\n return (\r\n // If this is the last threshold, and\r\n // its value is \"+\" and the value is above the previous threshold...\r\n m === numThresholds && (\r\n threshold === '+' && value > prevThreshold\r\n ) ||\r\n\r\n // ... or if the value matches the threshold...\r\n value === threshold ||\r\n\r\n // ... or if this isn't the first or last threshold, and\r\n // the value is between this threshold and the previous one...\r\n m !== 0 && m !== numThresholds && (\r\n value <= threshold &&\r\n value > prevThreshold\r\n ) ||\r\n\r\n // ... or if this is the first threshold and the value is\r\n // at or below the threshold\r\n m === 0 && value <= threshold\r\n );\r\n}\r\n\r\n/**\r\n * Determine the color of the heatmap annotation.\r\n */\r\nfunction getHeatmapAnnotColor(thresholds, value) {\r\n var m, numThresholds, thresholdList, threshold, tvNum, thresholdColor,\r\n prevThreshold, useThresholdColor, color;\r\n\r\n for (m = 0; m < thresholds.length; m++) {\r\n numThresholds = thresholds.length - 1;\r\n thresholdList = thresholds[m];\r\n threshold = thresholdList[0];\r\n\r\n // The threshold value is usually a number,\r\n // but can also be a \"+\" character indicating that\r\n // this threshold is anything greater than the previous threshold.\r\n tvNum = parseFloat(threshold);\r\n if (isNaN(tvNum) === false) threshold = tvNum;\r\n if (m !== 0) prevThreshold = parseFloat(thresholds[m - 1][0]);\r\n thresholdColor = thresholdList[1];\r\n\r\n useThresholdColor = shouldUseThresholdColor(m, numThresholds, value,\r\n prevThreshold, threshold);\r\n\r\n if (useThresholdColor) color = thresholdColor;\r\n }\r\n\r\n return color;\r\n}\r\n\r\nexport {\r\n getLabels, inflateHeatmaps, inflateThresholds, defaultHeatmapColors,\r\n getHeatmapAnnotColor\r\n};\r\n","/**\r\n * @fileoverview Functions for collinear heatmaps of genome annotations.\r\n * See heatmap.js for more.\r\n */\r\n\r\nimport {d3} from '../lib';\r\nimport {writeTrackLabels} from './track-labels-collinear';\r\nimport {inflateHeatmaps} from './heatmap-lib';\r\n\r\n/**\r\n * Add canvases that will contain annotations. One canvas per track.\r\n */\r\nfunction writeCanvases(chr, chrLeft, ideo) {\r\n var j, trackLeft, trackWidth, canvas, context, id,\r\n chrWidth = chr.width,\r\n contextArray = [],\r\n annotLabelHeight = ideo.config.annotLabelHeight,\r\n numAnnotTracks = ideo.config.numAnnotTracks;\r\n\r\n // Create a canvas for each annotation track on this chromosome\r\n for (j = 0; j < numAnnotTracks; j++) {\r\n trackWidth = ideo.config.annotationHeight + annotLabelHeight + 4;\r\n id = chr.id + '-canvas-' + j; // e.g. chr1-9606-canvas-0\r\n trackLeft = chrLeft;\r\n if (chr.chrIndex > 0) {\r\n trackLeft += (ideo.config.chrMargin * chr.chrIndex) - 1;\r\n }\r\n canvas = d3.select(ideo.config.container + ' #_ideogramInnerWrap')\r\n .append('canvas')\r\n .attr('id', id)\r\n .attr('width', chrWidth + 1)\r\n .attr('height', trackWidth)\r\n .style('position', 'absolute')\r\n .style('left', trackLeft + 'px')\r\n .style('top', (trackWidth * j + 1) + 'px');\r\n context = canvas.nodes()[0].getContext('2d');\r\n contextArray.push([context, chr]);\r\n }\r\n\r\n return contextArray;\r\n}\r\n\r\n/**\r\n * Render annotations on the canvas\r\n */\r\nfunction fillCanvasAnnots(annots, contextArray, ideo) {\r\n var j, annot, context, chr,\r\n annotLabelHeight = ideo.config.annotLabelHeight,\r\n annotHeight = ideo.config.annotationHeight,\r\n demarcateChrs = ideo.config.demarcateCollinearChromosomes;\r\n\r\n var trackWidth = annotHeight + annotLabelHeight + 4;\r\n\r\n // Fill in the canvas(es) with annotation colors to draw a heatmap\r\n for (j = 0; j < annots.length; j++) {\r\n annot = annots[j];\r\n context = contextArray[annot.trackIndex][0];\r\n chr = contextArray[annot.trackIndex][1];\r\n context.fillStyle = annot.color;\r\n if (demarcateChrs) {\r\n if (annot.startPx < 1 || annot.startPx > chr.width - 1) continue;\r\n context.fillRect(annot.startPx, 1, 0.5, trackWidth);\r\n } else {\r\n context.fillRect(annot.startPx, annotLabelHeight + 1, 0.5, annotHeight);\r\n }\r\n }\r\n\r\n if (demarcateChrs) {\r\n for (j = 0; j < contextArray.length; j++) {\r\n context = contextArray[j][0];\r\n chr = contextArray[j][1];\r\n context.fillStyle = '#555';\r\n if (chr.chrIndex === 0) context.fillRect(0, 0, 1, trackWidth);\r\n context.fillRect(chr.width - 1, 0, 1.1, trackWidth);\r\n context.fillRect(0, 0, chr.width + 1, 1);\r\n if (ideo.config.chrMargin) context.fillRect(0, 0, 1.1, trackWidth);\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Draw a 1D heatmap of annotations along each chromosome.\r\n * Ideal for representing very dense annotation sets in a granular manner\r\n * without subsampling.\r\n *\r\n * TODO:\r\n * - Support in 'vertical' orientation\r\n * - Support after rotating chromosome on click\r\n */\r\nfunction drawHeatmapsCollinear(annotContainers, ideo) {\r\n var annots, chrLeft, contextArray, i, chr,\r\n prevX = 0,\r\n xBump = (ideo.config.showChromosomesLabels) ? 2 : -0.1;\r\n\r\n d3.select(ideo.selector).classed('labeledLeft', false);\r\n d3.selectAll(ideo.config.container + ' canvas').remove();\r\n\r\n // Each \"annotationContainer\" represents annotations for a chromosome\r\n for (i = 0; i < annotContainers.length; i++) {\r\n annots = annotContainers[i].annots;\r\n chr = ideo.chromosomesArray[i];\r\n if (i === 0) {\r\n chrLeft = 12;\r\n } else {\r\n chrLeft = prevX + ideo.chromosomesArray[i - 1].width + 14;\r\n prevX += ideo.chromosomesArray[i - 1].width + xBump;\r\n }\r\n contextArray = writeCanvases(chr, chrLeft, ideo);\r\n fillCanvasAnnots(annots, contextArray, ideo);\r\n }\r\n\r\n writeTrackLabels(ideo);\r\n\r\n if (ideo.onDrawAnnotsCallback) ideo.onDrawAnnotsCallback();\r\n}\r\n\r\nexport {drawHeatmapsCollinear, inflateHeatmaps};\r\n","/**\r\n * @fileoverview Functions for 2D heatmaps of genome annotations.\r\n * 2D heatmaps enable showing many (100+) tracks of data in one dimension,\r\n * for features (e.g. genes) along a dimension of genomic coordinates in\r\n * chromosome context.\r\n *\r\n * TO DO:\r\n * - Horizontal orientation\r\n * - Multiple chromosomes\r\n * - Non-human organisms\r\n */\r\n\r\nimport {d3} from '../lib';\r\nimport {getHeatmapAnnotColor} from './heatmap-lib';\r\n\r\n/**\r\n * Add one canvas that will contain all annotations. One canvas per chromosome.\r\n */\r\nfunction writeCanvas(chr, ideoHeight, width, ideo) {\r\n var left, canvas, context, id;\r\n\r\n id = chr.id + '-canvas'; // e.g. chr1-9606-canvas\r\n left = (ideo.config.chrWidth * 2) + ideo.config.annotationHeight - 0.5;\r\n canvas = d3.select(ideo.config.container + ' #_ideogramInnerWrap')\r\n .append('canvas')\r\n .attr('id', id)\r\n .attr('width', width)\r\n .attr('height', ideoHeight)\r\n .style('position', 'absolute')\r\n .style('left', left + 'px')\r\n .style('top', '0px');\r\n context = canvas.nodes()[0].getContext('2d');\r\n\r\n return context;\r\n}\r\n\r\n/**\r\n * Render annotations on the canvas.\r\n *\r\n * These annotations are 2D; each annotation has many values, each on a track.\r\n */\r\nfunction fillCanvasAnnotValues(annot, context, ideo) {\r\n var i, x, values,\r\n annotHeight = ideo.config.annotationHeight,\r\n ideoMarginTop = ideo._layout.margin.top;\r\n\r\n values = annot.values;\r\n\r\n // Fill canvas with annotation colors to draw the heatmap\r\n for (i = 0; i < values.length; i++) {\r\n context.fillStyle = values[i];\r\n x = (i - 1) * annotHeight;\r\n context.fillRect(x, annot.startPx + ideoMarginTop, annotHeight, 2);\r\n }\r\n}\r\n\r\n/**\r\n * Draw a 2D heatmap of annotations along one chromosome.\r\n *\r\n * TODO:\r\n * - Support in 'horizontal' orientation\r\n * - Support after rotating chromosome on click\r\n */\r\nfunction drawHeatmaps2d(annotContainers, ideo) {\r\n var annot, context, i, chr,\r\n container = ideo.config.container,\r\n ideoMarginTop = ideo._layout.margin.top,\r\n ideoHeight = ideo.config.chrHeight + ideoMarginTop,\r\n width = ideo.config.annotationHeight * annotContainers[0].values.length;\r\n\r\n d3.selectAll(container + ' canvas').remove();\r\n\r\n d3.select(container + ' #_ideogramInnerWrap')\r\n .style('max-width', width + 'px');\r\n d3.select(container + ' #_ideogram').attr('width', width);\r\n\r\n chr = ideo.chromosomesArray[0];\r\n\r\n context = writeCanvas(chr, ideoHeight, width, ideo);\r\n\r\n // Each \"annotationContainer\" represents annotations for a chromosome\r\n for (i = 0; i < annotContainers.length; i++) {\r\n annot = annotContainers[i];\r\n fillCanvasAnnotValues(annot, context, ideo);\r\n }\r\n\r\n if (ideo.onDrawAnnotsCallback) {\r\n ideo.onDrawAnnotsCallback();\r\n }\r\n}\r\n\r\nfunction add2dAnnotsForChr(annots, omittedAnnots, annotsByChr, chrModel,\r\n m, keys, ideo) {\r\n var j, k, annot, ra, stop, stopPx, color,\r\n thresholds = ideo.config.heatmapThresholds;\r\n\r\n for (j = 0; j < annotsByChr.annots.length; j++) {\r\n ra = annotsByChr.annots[j];\r\n annot = {};\r\n\r\n annot.values = []; // one value per track\r\n\r\n for (k = 0; k < 3; k++) {\r\n annot[keys[k]] = ra[k];\r\n }\r\n\r\n for (k = 3; k < keys.length; k++) {\r\n color = getHeatmapAnnotColor(thresholds, ra[k]);\r\n annot.values.push(color);\r\n }\r\n\r\n stop = annot.start + annot.length;\r\n\r\n annot.chr = annotsByChr.chr;\r\n annot.chrIndex = m;\r\n annot.startPx = ideo.convertBpToPx(chrModel, annot.start);\r\n stopPx = ideo.convertBpToPx(chrModel, stop);\r\n annot.px = Math.round((annot.startPx + stopPx) / 2);\r\n\r\n annots.push(annot);\r\n }\r\n\r\n annots.shift();\r\n\r\n return [annots, omittedAnnots];\r\n}\r\n\r\nexport {drawHeatmaps2d, add2dAnnotsForChr};\r\n","/**\r\n * @fileoverview Functions for labeling tracks of genome annotations.\r\n * Tracks are columns of annotations that run beside a chromosome.\r\n * Labeling tracks with descriptive names makes them easier to understand.\r\n */\r\n\r\nimport {d3} from '../lib';\r\nimport {getLabels} from './heatmap-lib';\r\n\r\n/**\r\n * Start a timer that, upon expiring, hides the track label.\r\n *\r\n * To enable users to copy label content to their clipboard, a timer is\r\n * used to control when the label disappears. It starts when the user's\r\n * cursor leaves the track or the label. If the user moves the cursor\r\n * back over the annot or label after the timer starts and before it expires,\r\n * then the timer is cleared.\r\n */\r\nfunction startHideTrackLabelTimeout(ideo) {\r\n if (ideo.config.showTrackLabel === false) return;\r\n\r\n ideo.hideTrackLabelTimeout = window.setTimeout(function() {\r\n d3.select(ideo.config.container + ' #_ideogramTrackLabel').transition()\r\n .duration(500)\r\n .style('opacity', 0);\r\n }, 250);\r\n}\r\n\r\n/**\r\n * Write label div setup with default styling.\r\n */\r\nfunction writeTrackLabelContainer(ideo) {\r\n d3.select(ideo.config.container + ' #_ideogramTrackLabelContainer')\r\n .append('div')\r\n .attr('id', '_ideogramTrackLabel')\r\n .style('opacity', 0)\r\n .style('position', 'absolute')\r\n .style('text-align', 'center')\r\n .style('padding', '1px')\r\n .style('font', '11px sans-serif')\r\n .style('background', 'white')\r\n .style('line-height', '10px')\r\n .style('z-index', '9000');\r\n}\r\n\r\n/**\r\n * Display track labels on the page\r\n */\r\nfunction renderTrackLabels(top, left, ideo) {\r\n d3.select(ideo.config.container + ' #_ideogramTrackLabel')\r\n .style('opacity', 1) // Make label visible\r\n .style('left', left + 'px')\r\n .style('top', top + 'px')\r\n .style('width', 'max-content')\r\n .style('transform-origin', 'bottom left')\r\n .style('text-align', 'left')\r\n .on('mouseover', function() {\r\n clearTimeout(ideo.hideTrackLabelTimeout);\r\n })\r\n .on('mouseout', function() {\r\n startHideTrackLabelTimeout(ideo);\r\n });\r\n}\r\n\r\n/**\r\n * Get left and top (x and y) offset for track label text\r\n */\r\nfunction getTrackLabelOffsets(labels, trackCanvas, ideo) {\r\n var firstTrackId, firstTrack, trackBox, labelBox, ideoBox, left, top,\r\n marginHack = 7; // TODO: Make this dynamic\r\n\r\n firstTrackId = trackCanvas.id.split('-').slice(0, -1).join('-') + '-0';\r\n firstTrack = d3.select(ideo.config.container + ' #' + firstTrackId)\r\n .nodes()[0];\r\n trackBox = firstTrack.getBoundingClientRect();\r\n\r\n labelBox = d3.select(ideo.config.container + ' #_ideogramTrackLabel')\r\n .nodes()[0].getBoundingClientRect();\r\n ideoBox = d3.select(ideo.config.container).nodes()[0]\r\n .getBoundingClientRect();\r\n\r\n left = Math.round(trackBox.left + labelBox.width) - trackBox.width - 1;\r\n left -= ideoBox.left - marginHack;\r\n top = -(labels.split('
    ').length - 2) * trackBox.width + 2;\r\n\r\n return [left, top];\r\n}\r\n\r\n/**\r\n * Show the label for this track\r\n */\r\nfunction showTrackLabel(trackCanvas, ideo) {\r\n var labels, left, top;\r\n\r\n clearTimeout(ideo.hideTrackLabelTimeout);\r\n\r\n labels = getLabels(ideo);\r\n labels = labels.join('
    ');\r\n\r\n // Clear any previous positioning, write track label text to DOM\r\n d3.select(ideo.config.container + ' #_ideogramTrackLabel')\r\n .interrupt() // Stop any in-progress disapperance\r\n .style('top', '')\r\n .style('left', '')\r\n .style('transform', null)\r\n .style('transform', 'rotate(-90deg)')\r\n .html(labels);\r\n\r\n [left, top] = getTrackLabelOffsets(labels, trackCanvas, ideo);\r\n\r\n renderTrackLabels(top, left, ideo);\r\n}\r\n\r\nexport {\r\n startHideTrackLabelTimeout, writeTrackLabelContainer, showTrackLabel\r\n};\r\n","/**\r\n * @fileoverview Functions for 2D heatmaps of genome annotations.\r\n * Heatmaps provide an easy way to visualize very dense annotation data.\r\n * Unlike the rest of Ideogram's graphics, which use SVG, heatmaps are\r\n * rendered using the Canvas element.\r\n */\r\n\r\nimport {d3} from '../lib';\r\nimport {drawHeatmapsCollinear} from './heatmap-collinear';\r\nimport {drawHeatmaps2d} from './heatmap-2d';\r\nimport {getHeatmapAnnotColor} from './heatmap-lib';\r\n\r\nimport {\r\n startHideTrackLabelTimeout, writeTrackLabelContainer, showTrackLabel\r\n} from './track-labels';\r\n\r\n/**\r\n * Add canvases that will contain annotations. One canvas per track.\r\n */\r\nfunction writeCanvases(chr, chrLeft, ideoHeight, ideo) {\r\n var j, trackLeft, trackWidth, canvas, context, id,\r\n contextArray = [],\r\n numAnnotTracks = ideo.config.numAnnotTracks;\r\n\r\n var marginHack = 7; // TODO: Make this dynamic\r\n\r\n // Create a canvas for each annotation track on this chromosome\r\n for (j = 0; j < numAnnotTracks; j++) {\r\n trackWidth = ideo.config.annotationHeight;\r\n id = chr.id + '-canvas-' + j; // e.g. chr1-9606-canvas-0\r\n trackLeft = chrLeft - trackWidth * (numAnnotTracks - j) - marginHack;\r\n canvas = d3.select(ideo.config.container + ' #_ideogramInnerWrap')\r\n .append('canvas')\r\n .attr('id', id)\r\n .attr('width', trackWidth)\r\n .attr('height', ideoHeight)\r\n .style('position', 'absolute')\r\n .style('left', trackLeft + 'px');\r\n context = canvas.nodes()[0].getContext('2d');\r\n contextArray.push(context);\r\n }\r\n\r\n return contextArray;\r\n}\r\n\r\n/**\r\n * Render annotations on the canvas\r\n */\r\nfunction fillCanvasAnnots(annots, contextArray, chrWidth, ideoMarginTop) {\r\n var j, annot, context, x;\r\n\r\n // Fill in the canvas(es) with annotation colors to draw a heatmap\r\n for (j = 0; j < annots.length; j++) {\r\n annot = annots[j];\r\n context = contextArray[annot.trackIndex];\r\n context.fillStyle = annot.color;\r\n x = annot.trackIndex - 1;\r\n context.fillRect(x, annot.startPx + ideoMarginTop, chrWidth, 0.5);\r\n }\r\n}\r\n\r\n/**\r\n * Draw a 1D heatmap of annotations along each chromosome.\r\n * Ideal for representing very dense annotation sets in a granular manner\r\n * without subsampling.\r\n *\r\n * TODO:\r\n * - Support in 'horizontal' orientation\r\n * - Support after rotating chromosome on click\r\n */\r\nfunction drawHeatmaps(annotContainers) {\r\n var annots, chrLeft, contextArray, chrWidth, i, chr,\r\n ideo = this,\r\n config = ideo.config,\r\n ideoMarginTop = ideo._layout.margin.top,\r\n ideoHeight = config.chrHeight + ideoMarginTop;\r\n\r\n if (config.geometry === 'collinear') {\r\n return drawHeatmapsCollinear(annotContainers, ideo);\r\n } else if (config.annotationsLayout === 'heatmap-2d') {\r\n return drawHeatmaps2d(annotContainers, ideo);\r\n }\r\n\r\n d3.selectAll(ideo.config.container + ' canvas').remove();\r\n\r\n writeTrackLabelContainer(ideo);\r\n\r\n // Each \"annotationContainer\" represents annotations for a chromosome\r\n for (i = 0; i < annotContainers.length; i++) {\r\n\r\n annots = annotContainers[i].annots;\r\n chr = ideo.chromosomesArray[i];\r\n chrWidth = ideo.config.chrWidth;\r\n chrLeft = ideo._layout.getChromosomeSetYTranslate(i);\r\n\r\n contextArray = writeCanvases(chr, chrLeft, ideoHeight, ideo);\r\n fillCanvasAnnots(annots, contextArray, chrWidth, ideoMarginTop);\r\n }\r\n\r\n d3.selectAll(ideo.config.container + ' canvas')\r\n .on('mouseover', function() {showTrackLabel(this, ideo);})\r\n .on('mouseout', function() {startHideTrackLabelTimeout(ideo);});\r\n\r\n if (ideo.onDrawAnnotsCallback) {\r\n ideo.onDrawAnnotsCallback();\r\n }\r\n}\r\n\r\n/**\r\n * Set color and track index for raw annotation objects.\r\n */\r\nfunction getNewRawAnnots(heatmapKeyIndexes, rawAnnots, ideo) {\r\n var j, k, ra, newRa, value, thresholds, color, trackIndex,\r\n newRas = [];\r\n\r\n for (j = 0; j < rawAnnots.length; j++) {\r\n ra = rawAnnots[j];\r\n for (k = 0; k < heatmapKeyIndexes.length; k++) {\r\n newRa = ra.slice(0, 3); // name, start, length\r\n\r\n value = ra[heatmapKeyIndexes[k]];\r\n thresholds = ideo.config.heatmaps[k].thresholds;\r\n color = getHeatmapAnnotColor(thresholds, value);\r\n\r\n trackIndex = k;\r\n newRa.push(trackIndex, color, value);\r\n newRas.push(newRa);\r\n }\r\n }\r\n\r\n return newRas;\r\n}\r\n\r\nfunction getNewRawAnnotContainers(heatmapKeyIndexes, rawAnnotBoxes, ideo) {\r\n var raContainer, chr, rawAnnots, newRas, i,\r\n newRaContainers = [];\r\n\r\n for (i = 0; i < rawAnnotBoxes.length; i++) {\r\n raContainer = rawAnnotBoxes[i];\r\n chr = raContainer.chr;\r\n\r\n rawAnnots = raContainer.annots;\r\n newRas = getNewRawAnnots(heatmapKeyIndexes, rawAnnots, ideo);\r\n\r\n newRaContainers.push({chr: chr, annots: newRas});\r\n }\r\n return newRaContainers;\r\n}\r\n\r\nfunction reportPerformance(t0, ideo) {\r\n var t1 = new Date().getTime();\r\n if (ideo.config.debug) {\r\n console.log('Time in deserializeAnnotsForHeatmap: ' + (t1 - t0) + ' ms');\r\n }\r\n}\r\n\r\n/**\r\n * Deserialize compressed annotation data into a format suited for heatmaps.\r\n *\r\n * This enables the annotations to be downloaded from a server without the\r\n * requested annotations JSON needing to explicitly specify track index or\r\n * color. The track index and color are inferred from the \"heatmaps\" Ideogram\r\n * configuration option defined before ideogram initialization.\r\n *\r\n * This saves time for the user.\r\n *\r\n * @param rawAnnotsContainer {Object} Raw annotations as passed from server\r\n */\r\nfunction deserializeAnnotsForHeatmap(rawAnnotsContainer) {\r\n var newRaContainers, heatmapKey, heatmapKeyIndexes, i,\r\n t0 = new Date().getTime(),\r\n keys = rawAnnotsContainer.keys,\r\n rawAnnotBoxes = rawAnnotsContainer.annots,\r\n ideo = this;\r\n\r\n heatmapKeyIndexes = [];\r\n for (i = 0; i < ideo.config.heatmaps.length; i++) {\r\n heatmapKey = ideo.config.heatmaps[i].key;\r\n heatmapKeyIndexes.push(keys.indexOf(heatmapKey));\r\n }\r\n\r\n newRaContainers =\r\n getNewRawAnnotContainers(heatmapKeyIndexes, rawAnnotBoxes, ideo);\r\n\r\n keys.splice(3, 0, 'trackIndex');\r\n keys.splice(4, 0, 'color');\r\n\r\n ideo.rawAnnots.keys = keys;\r\n ideo.rawAnnots.annots = newRaContainers;\r\n\r\n reportPerformance(t0, ideo);\r\n}\r\n\r\nexport {drawHeatmaps, deserializeAnnotsForHeatmap};\r\n","/**\r\n * @fileoverview Functions for labeling collinear tracks of genome annotations.\r\n * See track-labels.js for more.\r\n */\r\n\r\nimport {d3} from '../lib';\r\nimport {getLabels} from './heatmap-lib';\r\n\r\nfunction renderTrackLabels(labels, ideo) {\r\n var i, x, y, labelContainer, markBump,\r\n annotLabelHeight = ideo.config.annotLabelHeight,\r\n demarcateChrs = ideo.config.demarcateCollinearChromosomes;\r\n\r\n x = 11; // Close to chrLeft in heatmap-collinear.js. For tabs.\r\n markBump = (demarcateChrs ? 2 : 0); // Make labels flush with demarcations\r\n\r\n labelContainer =\r\n d3.select(ideo.config.container + ' #_ideogramTrackLabelContainer');\r\n labelContainer.html('');\r\n\r\n y = ideo.config.annotationHeight + annotLabelHeight + 4;\r\n\r\n for (i = 0; i < labels.length; i++) {\r\n labelContainer\r\n .style('position', 'absolute')\r\n .append('div')\r\n .attr('class', '_ideogramTrackLabel')\r\n .style('opacity', 1)\r\n .style('position', 'absolute')\r\n .style('text-align', 'center')\r\n .style('padding', '1px')\r\n .style('font', '11px sans-serif')\r\n .style('background', 'white')\r\n .style('line-height', '10px')\r\n .style('z-index', '5')\r\n .style('left', (x + markBump) + 'px')\r\n .style('top', (y * i + markBump) + 'px')\r\n .style('width', 'max-content')\r\n .style('transform-origin', 'bottom left')\r\n .style('text-align', 'left')\r\n .html(labels[i]);\r\n }\r\n\r\n}\r\n\r\n/**\r\n * Show the label for this track\r\n */\r\nfunction writeTrackLabels(ideo) {\r\n var labels = getLabels(ideo);\r\n renderTrackLabels(labels, ideo);\r\n}\r\n\r\nexport {writeTrackLabels};\r\n","import {d3} from '../lib';\r\n// import {getShapes} from './draw';\r\n\r\n/**\r\n * Optional callback, invoked when annotations are drawn\r\n */\r\nfunction onLoadAnnots() {\r\n call(this.onLoadAnnotsCallback);\r\n}\r\n\r\n/**\r\n * Optional callback, invoked when annotations are drawn\r\n */\r\nfunction onDrawAnnots() {\r\n call(this.onDrawAnnotsCallback);\r\n}\r\n\r\nfunction hideAnnotTooltip() {\r\n d3.select('._ideogramTooltip').transition()\r\n .duration(500) // fade out for half second\r\n .style('opacity', 0)\r\n .style('pointer-events', 'none');\r\n}\r\n\r\n/**\r\n * Starts a timer that, upon expiring, hides the annotation tooltip.\r\n *\r\n * To enable users to copy tooltip content to their clipboard, a timer is\r\n * used to control when the tooltip disappears. It starts when the user's\r\n * cursor leaves the annotation or the tooltip. If the user moves the cursor\r\n * back over the annot or tooltip after the timer starts and before it expires,\r\n * then the timer is cleared.\r\n */\r\nfunction startHideAnnotTooltipTimeout() {\r\n const ideo = this;\r\n\r\n if (ideo.config.showAnnotTooltip === false) {\r\n return;\r\n }\r\n\r\n ideo.hideAnnotTooltipTimeout = window.setTimeout(function() {\r\n hideAnnotTooltip();\r\n }, 250);\r\n\r\n ideo.isTooltipCooling = true;\r\n ideo.hideAnnotTooltipCounter = window.setTimeout(function() {\r\n ideo.isTooltipCooling = false;\r\n }, 500);\r\n}\r\n\r\nfunction renderTooltip(tooltip, content, matrix, yOffset, ideo) {\r\n tooltip.html(content)\r\n .style('opacity', 1) // Make tooltip visible\r\n .style('left', matrix.e + 'px')\r\n .style('top', (matrix.f - yOffset) + 'px')\r\n .style('font-family', ideo.config.fontFamily)\r\n .style('pointer-events', null) // Prevent bug in clicking chromosome\r\n .on('mouseover', function() {\r\n clearTimeout(ideo.hideAnnotTooltipTimeout);\r\n })\r\n .on('mouseout', function() {\r\n ideo.startHideAnnotTooltipTimeout();\r\n });\r\n}\r\n\r\nfunction getContentAndYOffset(annot) {\r\n var content, yOffset, range, displayName;\r\n\r\n range = 'chr' + annot.chr + ':' + annot.start.toLocaleString();\r\n if (annot.displayCoordinates) {\r\n range = annot.displayCoordinates;\r\n } else if (annot.length > 0) {\r\n // Only show range if stop differs from start\r\n range += '-' + annot.stop.toLocaleString();\r\n }\r\n content = range;\r\n yOffset = 24;\r\n\r\n if (annot.name) {\r\n displayName = annot.displayName ? annot.displayName : annot.name;\r\n content = displayName + '
    ' + content;\r\n yOffset += 8;\r\n }\r\n\r\n return [content, yOffset];\r\n}\r\n\r\n/**\r\n * Optional callback, invoked before showing annotation tooltip\r\n */\r\nfunction onWillShowAnnotTooltip(annot) {\r\n call(this.onWillShowAnnotTooltipCallback, annot);\r\n}\r\n\r\n/**\r\n * Optional callback, invoked on clicking annotation\r\n */\r\nfunction onClickAnnot(annot) {\r\n this.prevClickedAnnot = annot;\r\n this.onClickAnnotCallback(annot);\r\n}\r\n\r\n// /** Get list of annotation objects by names, e.g. [\"BRCA1\", \"APOE\"] */\r\n// function getAnnotsByName(annotNames, ideo) {\r\n// return annotNames.map(name => getAnnotByName(name, ideo));\r\n// }\r\n\r\n// /** Briefly show a circle around specified annotations */\r\n// function pulseAnnots(annotNames, ideo, duration=2000) {\r\n// const annots = getAnnotsByName(annotNames, ideo);\r\n// const circle = getShapes(ideo.config.annotationHeight + 2).circle;\r\n// const ids = annots.map(annot => annot.domId);\r\n\r\n// d3.selectAll(ids).each(function() {\r\n// d3.select('#' + this)\r\n// .insert('path', ':first-child')\r\n// .attr('class', '_ideogramAnnotPulse')\r\n// .attr('d', circle)\r\n// .attr('fill-opacity', 0.5)\r\n// .attr('fill', 'yellow')\r\n// .attr('stroke', 'orange');\r\n// });\r\n\r\n// const annotPulses = d3.selectAll('._ideogramAnnotPulse');\r\n// annotPulses.transition()\r\n// .duration(duration) // fade out for `duration` milliseconds\r\n// .style('opacity', 0)\r\n// .style('pointer-events', 'none')\r\n// .on('end', function(d, i) {\r\n// if (i === annotPulses.size() - 1) {\r\n// annotPulses.remove();\r\n// }\r\n// });\r\n// }\r\n\r\n/**\r\n * Shows a tooltip for the given annotation.\r\n *\r\n * See notes in startHideAnnotTooltipTimeout about show/hide logic.\r\n *\r\n * @param annot {Object} Processed annotation object\r\n * @param context {Object} \"This\" of the caller -- an SVG path DOM object\r\n */\r\nfunction showAnnotTooltip(annot, context) {\r\n var matrix, content, yOffset, tooltip,\r\n cx = Number(context.getAttribute('cx')),\r\n cy = Number(context.getAttribute('cy')),\r\n ideo = this;\r\n\r\n if (ideo.config.showAnnotTooltip === false) return;\r\n\r\n clearTimeout(ideo.hideAnnotTooltipTimeout);\r\n\r\n if (ideo.onWillShowAnnotTooltipCallback) {\r\n annot = ideo.onWillShowAnnotTooltipCallback(annot);\r\n }\r\n\r\n // Enable onWillShowAnnotTooltipCallback to cancel showing tooltip\r\n if (annot === null) {\r\n hideAnnotTooltip();\r\n return;\r\n }\r\n\r\n ideo.prevTooltipAnnotName = annot.name;\r\n\r\n tooltip = d3.select('._ideogramTooltip');\r\n tooltip.interrupt(); // Stop any in-progress disapperance\r\n\r\n matrix = context.getScreenCTM().translate(cx, cy);\r\n\r\n [content, yOffset] = getContentAndYOffset(annot);\r\n\r\n renderTooltip(tooltip, content, matrix, yOffset, ideo);\r\n}\r\n\r\nexport {\r\n onLoadAnnots, onDrawAnnots, startHideAnnotTooltipTimeout,\r\n onWillShowAnnotTooltip, showAnnotTooltip, onClickAnnot\r\n};\r\n","import {d3, getFont, getTextSize, deepCopy} from '../lib';\r\n\r\nimport {sortAnnotsByRank} from './annotations';\r\n\r\nconst allLabelStyle = `\r\n \r\n `;\r\n\r\n/** Return DOM ID of annotation object */\r\nfunction getAnnotDomLabelId(annot) {\r\n return 'ideogramLabel_' + annot.domId;\r\n}\r\n\r\nfunction changeAnnotState(state, labelId, annotId) {\r\n d3.selectAll('._ideoActive').classed('_ideoActive', false);\r\n d3.select('#' + labelId).attr('class', '_ideogramLabel ' + state);\r\n d3.select('#' + annotId + ' > path').attr('class', state);\r\n}\r\n\r\nfunction triggerAnnotEvent(event, ideo) {\r\n let labelId, annotId;\r\n const target = event.target;\r\n const type = event.type;\r\n\r\n const targetClasses = Array.from(target.classList);\r\n if (targetClasses.includes('_ideogramLabel')) {\r\n labelId = target.id;\r\n annotId = target.id.split('ideogramLabel_')[1];\r\n d3.select('#' + annotId + ' path').dispatch(type);\r\n } else {\r\n const annotElement = target.parentElement;\r\n labelId = 'ideogramLabel_' + annotElement.id;\r\n annotId = annotElement.id;\r\n }\r\n\r\n if (type === 'mouseout') {\r\n ideo.time.prevTooltipOff = performance.now();\r\n ideo.time.prevTooltipAnnotDomId = annotId;\r\n }\r\n\r\n // On mouseover, activate immediately\r\n // Otherwise, wait a moment (250 ms), then deactivate.\r\n // Delayed deactivation mitigates flicker when moving from\r\n // annot label to annot triangle.\r\n if (type === 'mouseover') {\r\n clearTimeout(window._ideoActiveTimeout);\r\n changeAnnotState('_ideoActive', labelId, annotId);\r\n } else {\r\n window._ideoActiveTimeout = window.setTimeout(function() {\r\n changeAnnotState('', labelId, annotId);\r\n }, 250);\r\n }\r\n}\r\n\r\nfunction renderLabel(annot, style, ideo) {\r\n\r\n if (!ideo.didSetLabelStyle) {\r\n document.querySelector('#_ideogramInnerWrap')\r\n .insertAdjacentHTML('afterbegin', allLabelStyle);\r\n ideo.didSetLabelStyle = true;\r\n }\r\n\r\n const id = getAnnotDomLabelId(annot);\r\n\r\n const font = getFont(ideo);\r\n\r\n const fill = annot.color === 'pink' ? '#CF406B' : annot.color;\r\n\r\n d3.select('#_ideogram').append('text')\r\n .attr('id', id)\r\n .attr('class', '_ideogramLabel')\r\n .attr('x', style.left)\r\n .attr('y', style.top)\r\n .style('font', font)\r\n .style('fill', fill)\r\n .style('pointer-events', null) // Prevent bug in clicking chromosome\r\n .html(annot.name);\r\n}\r\n\r\n/** Get annotation object by name, e.g. \"BRCA1\" */\r\nfunction getAnnotByName(annotName, ideo) {\r\n var annot;\r\n var found = false;\r\n ideo.annots.forEach((annotsByChr) => {\r\n if (found) return;\r\n annotsByChr.annots.forEach((thisAnnot) => {\r\n if (found) return;\r\n if (thisAnnot.name === annotName) {\r\n annot = thisAnnot;\r\n found = true;\r\n }\r\n });\r\n });\r\n\r\n return annot;\r\n}\r\n\r\n/** Get label's top and left offsets relative to chromosome, and width */\r\nfunction getAnnotLabelLayout(annot, ideo) {\r\n var annotDom, annotRect, ideoRect, width, height, top, bottom, left, right,\r\n config = ideo.config;\r\n\r\n annotDom = document.querySelector('#' + annot.domId);\r\n\r\n // Handles cases when annotation is not yet in DOM\r\n if (annotDom === null) return null;\r\n\r\n annotRect = annotDom.getBoundingClientRect();\r\n\r\n ideoRect =\r\n document.querySelector('#_ideogram').getBoundingClientRect();\r\n\r\n const textSize = getTextSize(annot.name, ideo);\r\n width = textSize.width;\r\n\r\n // `pad` is a heuristic that accounts for:\r\n // 1px left pad, 1px right pad, 1px right border, 1px left border\r\n // as set in renderLabel\r\n const pad = (config.fontFamily) ? 9 : 7;\r\n width += pad;\r\n\r\n const labelSize = config.annotLabelSize ? config.annotLabelSize : 13;\r\n\r\n // Accounts for 1px top border, 1px bottom border as set in renderLabel\r\n height = labelSize;\r\n\r\n top = annotRect.top - ideoRect.top + height - 1;\r\n bottom = top + height;\r\n left = annotRect.left - ideoRect.left - width;\r\n right = left + width;\r\n name = annot.name;\r\n\r\n return {top, bottom, right, left, width, height, name};\r\n}\r\n\r\n/**\r\n * Label an annotation.\r\n *\r\n * @param annotName {String} Name of annotation, e.g. \"BRCA1\"\r\n * @param backgroundColor {String} Background color. Default: white.\r\n * @param backgroundColor {String} Border color. Default: black.\r\n */\r\nfunction addAnnotLabel(annotName, backgroundColor, borderColor) {\r\n var annot,\r\n ideo = this;\r\n\r\n annot = getAnnotByName(annotName, ideo);\r\n\r\n const layout = getAnnotLabelLayout(annot, ideo);\r\n if (layout === null) return;\r\n\r\n const style = Object.assign(layout, {backgroundColor, borderColor});\r\n\r\n renderLabel(annot, style, ideo);\r\n}\r\n\r\nfunction getIsXOverlap(o, n, p) {\r\n const oLeft = o.left - p;\r\n const nLeft = n.left - p;\r\n const oRight = o.right + p;\r\n const nRight = n.right + p;\r\n // A) oLeft < nLeft && oLeft < nRight && oRight < nRight && oRight > nLeft\r\n // o o\r\n // o o\r\n // o o\r\n //\r\n // n n\r\n // n n\r\n // n n\r\n //\r\n // B) oLeft > nLeft && oLeft < nRight && oRight > nRight && oRight > nLeft\r\n // o o\r\n // o o\r\n // o o\r\n //\r\n // n n\r\n // n n\r\n // n n\r\n //\r\n // C) oLeft < nLeft && oLeft < nRight && oRight > nRight && oRight > nLeft\r\n // o o\r\n // o o\r\n // o o\r\n //\r\n // n n\r\n // n n\r\n //\r\n // D) oLeft > nLeft && oLeft < nRight && oRight > nLeft && oRight < nRight\r\n // o o\r\n // o o\r\n // o o\r\n //\r\n // n n\r\n // n n\r\n // n n\r\n return (\r\n (oLeft <= nLeft && oLeft <= nRight && oRight <= nRight && oRight >= nLeft) ||\r\n (oLeft >= nLeft && oLeft <= nRight && oRight >= nRight && oRight >= nLeft) ||\r\n (oLeft <= nLeft && oLeft <= nRight && oRight >= nRight && oRight >= nLeft) ||\r\n (oLeft >= nLeft && oLeft <= nRight && oRight >= nLeft && oRight <= nRight)\r\n )\r\n}\r\n\r\nfunction getIsYOverlap(o, n, p) {\r\n const oTop = o.top - p;\r\n const nTop = n.top - p;\r\n const oBottom = o.bottom + p;\r\n const nBottom = n.bottom + p;\r\n // Top of old annot (o) is above bottom of new annot (n),\r\n // and bottom of old annot is below top of new annot\r\n //\r\n // A) yOverlap = true\r\n // o.top < n.top && o.top < n.bottom && o.bottom < n.bottom && o.bottom > n.top\r\n // ooooo\r\n // nnnnn\r\n //\r\n // ooooo\r\n // nnnnn\r\n //\r\n // A.2)\r\n //\r\n // ppppp\r\n // ppppp\r\n // ooooo\r\n //\r\n // ppppp\r\n // ooooo ppppp\r\n // ppppp nnnnn\r\n // ppppp\r\n //\r\n // nnnnn\r\n // ppppp\r\n // ppppp\r\n //\r\n // B) yOverlap = true\r\n // o.top > n.top && o.top < n.bottom && o.bottom > n.bottom && o.bottom > n.top\r\n // nnnnn\r\n // ooooo\r\n //\r\n // nnnnn\r\n // ooooo\r\n //\r\n // B.2)\r\n //\r\n // ppppp\r\n // ppppp ppppp\r\n // ppppp nnnnn\r\n // ooooo\r\n //\r\n // nnnnn\r\n // ooooo ppppp\r\n // ppppp ppppp\r\n // ppppp\r\n //\r\n //\r\n // C) yOverlap = false\r\n // old.top < new.top && old.bottom < new.top\r\n // ooooo\r\n //\r\n //\r\n // ooooo\r\n //\r\n // nnnnn\r\n //\r\n //\r\n // nnnnn\r\n //\r\n // D) yOverlap = false\r\n // nnnnn\r\n //\r\n //\r\n // nnnnn\r\n //\r\n // ooooo\r\n //\r\n //\r\n // ooooo\r\n // sl.top - p < layout.bottom && sl.bottom > layout.top - p ||\r\n // layout.top - p < sl.bottom && layout.bottom > sl.bottom\r\n\r\n // XY overlap\r\n // A)\r\n //\r\n // ooooooo\r\n // o o\r\n // o nonnnnn\r\n // ooooooo n\r\n // n n\r\n // nnnnnnn\r\n //\r\n //\r\n // B)\r\n // ooooooo\r\n // o o\r\n // nnnnnnn o\r\n // n onooooo\r\n // n n\r\n // nnnnnnn\r\n //\r\n // C)\r\n //\r\n // ooooooo nnnnnnn\r\n // o o n n\r\n // o o n n\r\n // ooooooo nnnnnnn\r\n //\r\n // D)\r\n //\r\n // ooooooo\r\n // o o\r\n // o o\r\n // ooooooo\r\n //\r\n // nnnnnnn\r\n // n n\r\n // n n\r\n // nnnnnnn\r\n return (\r\n // false\r\n (oTop <= nTop && oTop <= nBottom && oBottom <= nBottom && oBottom >= nTop) ||\r\n (oTop >= nTop && oTop <= nBottom && oBottom >= nBottom && oBottom >= nTop)\r\n );\r\n\r\n // (sl.top - p < layout.bottom || sl.bottom > layout.top - p) &&\r\n // (layout.top - p < sl.bottom || layout.bottom > sl.bottom)\r\n}\r\n\r\n/** Label as many annotations as possible, without overlap */\r\nfunction fillAnnotLabels(sortedAnnots=[]) {\r\n const ideo = this;\r\n\r\n sortedAnnots = deepCopy(sortedAnnots); // copy by value\r\n\r\n // Remove any pre-existing annotation labels, to avoid duplicates\r\n ideo.clearAnnotLabels();\r\n\r\n let spacedAnnots = [];\r\n const spacedLayouts = [];\r\n\r\n // sortedAnnots = applyRankCutoff(sortedAnnots, 100, ideo);\r\n\r\n // sortedAnnots = sortedAnnots.sort(ideo.annotSortFunction);\r\n\r\n if (sortedAnnots.length === 0) {\r\n sortedAnnots = ideo.flattenAnnots();\r\n }\r\n\r\n const strokeWidth = 0; // like padding\r\n\r\n sortedAnnots.forEach((annot, i) => {\r\n const layout = getAnnotLabelLayout(annot, ideo);\r\n\r\n if (layout === null) {\r\n console.log(annot.name + ' has null layout')\r\n return;\r\n }\r\n\r\n const hasOverlap =\r\n spacedLayouts.length > 0 && spacedLayouts.some((sl, j) => {\r\n const xOverlap = getIsXOverlap(sl, layout, strokeWidth);\r\n const yOverlap = getIsYOverlap(sl, layout, strokeWidth);\r\n\r\n // if (annot.name === 'AKT1' || annot.name === 'XRCC3') {\r\n // const spacedAnnot = spacedAnnots[j].name;\r\n // if (spacedAnnot === 'HIF1A' || spacedAnnot === 'RAD51') {\r\n // // if (xOverlap && yOverlap) {\r\n // // console.log('sl.top - strokeWidth', sl.top - strokeWidth)\r\n // // console.log('sl.top - strokeWidth < layout.bottom')\r\n // // console.log(sl.top - strokeWidth < layout.bottom)\r\n // // console.log('sl.bottom > layout.top - strokeWidth')\r\n // // console.log(sl.bottom > layout.top - strokeWidth)\r\n // // console.log('layout.top - strokeWidth < sl.bottom')\r\n // // console.log(layout.top - strokeWidth < sl.bottom)\r\n // // console.log('layout.bottom > sl.bottom')\r\n // // console.log(layout.bottom > sl.bottom)\r\n // console.log(\r\n // 'xOverlap, yOverlap, spacedAnnot, sl, annot.name, layout'\r\n // );\r\n // console.log(\r\n // xOverlap, yOverlap, spacedAnnot, sl, annot.name, layout\r\n // );\r\n // }\r\n // }\r\n\r\n // if (xOverlap && yOverlap) {\r\n // console.log('overlap! annot');\r\n // console.log(annot.name, annot.chr, annot.color);\r\n // }\r\n return xOverlap && yOverlap;\r\n });\r\n\r\n if (hasOverlap) return;\r\n\r\n spacedAnnots.push(annot);\r\n spacedLayouts.push(layout);\r\n });\r\n\r\n let numLabels = 10;\r\n const config = ideo.config;\r\n if ('relatedGenesMode' in config && config.relatedGenesMode === 'hints') {\r\n numLabels = 20;\r\n }\r\n // spacedAnnots = applyRankCutoff(spacedAnnots, numLabels, ideo);\r\n spacedAnnots = spacedAnnots.sort(ideo.annotSortFunction).slice(0, numLabels)\r\n\r\n\r\n // Ensure highest-ranked annots are ordered last in SVG,\r\n // to ensure the are written before lower-ranked annots\r\n // (which, due to SVG z-index being tied to layering)\r\n spacedAnnots.reverse();\r\n\r\n spacedAnnots.forEach((annot) => {\r\n ideo.addAnnotLabel(annot.name);\r\n });\r\n\r\n d3.selectAll('._ideogramLabel, .annot')\r\n .on('mouseover', (event) => triggerAnnotEvent(event))\r\n .on('mouseout', (event) => triggerAnnotEvent(event, ideo))\r\n .on('click', (event) => triggerAnnotEvent(event));\r\n}\r\n\r\nfunction removeAnnotLabel(annotName) {\r\n const ideo = this;\r\n const annot = getAnnotByName(annotName, ideo);\r\n const id = getAnnotDomLabelId(annot);\r\n document.querySelector('#' + id).remove();\r\n}\r\n\r\nfunction clearAnnotLabels() {\r\n const labels = document.querySelectorAll('._ideogramLabel');\r\n labels.forEach((label) => {label.remove();});\r\n}\r\n\r\nexport {\r\n addAnnotLabel, clearAnnotLabels, fillAnnotLabels, getAnnotLabelLayout,\r\n removeAnnotLabel\r\n};\r\n","/**\r\n * Get containers to group individual annotations into higher-level \"bar\"\r\n * annotations.\r\n */\r\nfunction getRawBars(chrModels, ideo) {\r\n var chr, chrModel, lastBand, numBins, bar, h, i, px,\r\n barWidth = ideo.config.barWidth,\r\n bars = [];\r\n\r\n for (h = 0; h < ideo.chromosomesArray.length; h++) {\r\n chr = ideo.chromosomesArray[h].name;\r\n chrModel = chrModels[chr];\r\n lastBand = chrModel.bands[chrModel.bands.length - 1];\r\n numBins = Math.round(lastBand.px.stop / barWidth); // chrPxStop / barWidth\r\n bar = {chr: chr, annots: []};\r\n\r\n for (i = 0; i < numBins; i++) {\r\n px = i * barWidth - ideo.bump;\r\n bar.annots.push({\r\n bp: ideo.convertPxToBp(chrModel, px + ideo.bump),\r\n px: px,\r\n count: 0,\r\n chrIndex: chrModel.chrIndex,\r\n chrName: chr,\r\n color: ideo.config.annotationsColor,\r\n annots: []\r\n });\r\n }\r\n bars.push(bar);\r\n }\r\n return bars;\r\n}\r\n\r\n/**\r\n * Assign how many, and which annotations each histogram bar contains\r\n */\r\nfunction assignAnnotsToBars(annots, bars, chrModels, ideo) {\r\n var chrAnnots, chrModel, barAnnots, h, i, annot, px, j, barPx, nextBarPx,\r\n barWidth = ideo.config.barWidth;\r\n\r\n for (h = 0; h < annots.length; h++) {\r\n chrAnnots = annots[h].annots;\r\n chrModel = chrModels[annots[h].chr]; // get chr by name\r\n barAnnots = bars[chrModel.chrIndex].annots;\r\n for (i = 0; i < chrAnnots.length; i++) {\r\n annot = chrAnnots[i];\r\n px = annot.px - ideo.bump;\r\n for (j = 0; j < barAnnots.length; j++) {\r\n barPx = barAnnots[j].px;\r\n nextBarPx = barPx + barWidth;\r\n if (j === barAnnots.length - 1) nextBarPx += barWidth;\r\n if (px >= barPx && px < nextBarPx) {\r\n bars[chrModel.chrIndex].annots[j].count += 1;\r\n bars[chrModel.chrIndex].annots[j].annots.push(annot);\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n return bars;\r\n}\r\n\r\nfunction setIdeoMaxAnnotsPerBar(bars, isFirstGet, ideo) {\r\n var maxAnnotsPerBarAllChrs, i, maxAnnotsPerBar, annots, chr, j, barCount;\r\n\r\n if (isFirstGet || ideo.config.histogramScaling === 'relative') {\r\n maxAnnotsPerBarAllChrs = 0;\r\n for (i = 0; i < bars.length; i++) {\r\n maxAnnotsPerBar = 0;\r\n annots = bars[i].annots;\r\n chr = bars[i].chr;\r\n for (j = 0; j < annots.length; j++) {\r\n barCount = annots[j].count;\r\n if (barCount > maxAnnotsPerBar) maxAnnotsPerBar = barCount;\r\n if (barCount > maxAnnotsPerBarAllChrs) {\r\n maxAnnotsPerBarAllChrs = barCount;\r\n }\r\n }\r\n ideo.maxAnnotsPerBar[chr] = maxAnnotsPerBar;\r\n }\r\n ideo.maxAnnotsPerBarAllChrs = maxAnnotsPerBarAllChrs;\r\n }\r\n}\r\n\r\n/**\r\n * Set each bar's height to be proportional to the height of the bar with the\r\n * most annotations\r\n */\r\nfunction setProportionalBarHeight(bars, ideo) {\r\n var i, annots, chr, j, barCount, barCountRatio, height,\r\n ideoIsRotated = ideo._layout._isRotated;\r\n\r\n for (i = 0; i < bars.length; i++) {\r\n annots = bars[i].annots;\r\n chr = bars[i].chr;\r\n for (j = 0; j < annots.length; j++) {\r\n barCount = annots[j].count;\r\n if (ideo.config.histogramScaling === 'relative') {\r\n barCountRatio = barCount / ideo.maxAnnotsPerBar[chr];\r\n } else {\r\n barCountRatio = barCount / ideo.maxAnnotsPerBarAllChrs;\r\n }\r\n if (ideoIsRotated === false) {\r\n height = barCountRatio * ideo.config.chrMargin;\r\n } else {\r\n height = barCountRatio * ideo.config.chrHeightOriginal * 3;\r\n }\r\n if (isNaN(height)) {\r\n height = 0;\r\n }\r\n bars[i].annots[j].height = height;\r\n }\r\n }\r\n return bars;\r\n}\r\n\r\nfunction reportGetHistogramBarPerformance(t0, ideo) {\r\n var t1 = new Date().getTime();\r\n if (ideo.config.debug) {\r\n console.log('Time spent in getHistogramBars: ' + (t1 - t0) + ' ms');\r\n }\r\n}\r\n\r\nfunction setIdeoHistogramScaling(ideo) {\r\n if ('histogramScaling' in ideo.config === false) {\r\n ideo.config.histogramScaling = 'absolute';\r\n }\r\n}\r\n\r\n/**\r\n * Returns and sets bars used for histogram\r\n */\r\nfunction getHistogramBars(annots) {\r\n var chrModels, bars,\r\n isFirstGet = false,\r\n t0 = new Date().getTime(),\r\n ideo = this;\r\n\r\n chrModels = ideo.chromosomes[ideo.config.taxid];\r\n\r\n setIdeoHistogramScaling(ideo);\r\n\r\n if (typeof ideo.maxAnnotsPerBar === 'undefined') {\r\n ideo.maxAnnotsPerBar = {};\r\n isFirstGet = true;\r\n }\r\n\r\n bars = getRawBars(chrModels, ideo);\r\n bars = assignAnnotsToBars(annots, bars, chrModels, ideo);\r\n\r\n setIdeoMaxAnnotsPerBar(bars, isFirstGet, ideo);\r\n bars = setProportionalBarHeight(bars, ideo);\r\n\r\n reportGetHistogramBarPerformance(t0, ideo);\r\n ideo.bars = bars;\r\n return bars;\r\n}\r\n\r\nfunction getHistogramPoints(d, chrWidth, chrWidths, ideo) {\r\n var x1, x2, y1, y2;\r\n\r\n x1 = d.px + ideo.bump;\r\n x2 = d.px + ideo.config.barWidth + ideo.bump;\r\n y1 = chrWidth;\r\n y2 = chrWidth + d.height;\r\n\r\n var thisChrWidth = chrWidths[d.chr];\r\n\r\n if (x2 > thisChrWidth) {\r\n x2 = thisChrWidth;\r\n }\r\n\r\n return (\r\n x1 + ',' + y1 + ' ' +\r\n x2 + ',' + y1 + ' ' +\r\n x2 + ',' + y2 + ' ' +\r\n x1 + ',' + y2\r\n );\r\n}\r\n\r\nfunction writeHistogramAnnots(chrAnnot, ideo) {\r\n var chrs, chr,\r\n chrWidths = {},\r\n chrWidth = ideo.config.chrWidth;\r\n\r\n chrs = ideo.chromosomes[ideo.config.taxid];\r\n for (chr in chrs) {\r\n chrWidths[chr] = chrs[chr];\r\n }\r\n\r\n chrAnnot.append('polygon')\r\n // .attr('id', function(d, i) { return d.id; })\r\n .attr('class', 'annot')\r\n .attr('points', function(d) {\r\n return getHistogramPoints(d, chrWidth, chrWidths, ideo);\r\n })\r\n .attr('fill', function(d) {return d.color;});\r\n}\r\n\r\nexport {getHistogramBars, writeHistogramAnnots};\r\n","/**\r\n * @fileoverview Functions for drawing a legend for genome annotations.\r\n * A legend consists of rows, each with a colored icon and a text label.\r\n * Icons may have different shapes. A legend may also have a name.\r\n */\r\n\r\nimport {d3, getTextSize, round} from '../lib';\r\n\r\nvar legendStyle =\r\n '#_ideogramLegend {font: 12px Arial; overflow: auto;} ' +\r\n '#_ideogramLegend svg {float: left;} ' +\r\n '#_ideogramLegend ul {' +\r\n 'position: relative; left: -14px; list-style: none; float: left; ' +\r\n 'padding-left: 10px; margin: 0 0 1em 0; width: auto; border: none;' +\r\n '} ' +\r\n '#_ideogramLegend li {float: none; margin: 0;}' +\r\n '#_ideogramLegend ul span {position: relative; left: -15px;} ';\r\n\r\nfunction getIcon(row, ideo) {\r\n var icon, triangleAttrs, circleAttrs, rectAttrs,\r\n fill = 'fill=\"' + row.color + '\" style=\"stroke: #AAA;\"',\r\n shape = row.shape;\r\n\r\n triangleAttrs = 'd=\"m7,3 l -5 9 l 9 0 z\"';\r\n circleAttrs = 'd=\"m2,9a 4.5,4.5 0 1,0 9,0a 4.5,4.5 0 1,0 -9,0\"';\r\n rectAttrs = 'height=\"10\" width=\"10\" y=\"3\"';\r\n\r\n if ('shape' in row && ['circle', 'triangle'].includes(shape)) {\r\n if (shape === 'circle') {\r\n icon = '';\r\n } else if (shape === 'triangle') {\r\n var transform = '';\r\n if (ideo.config.orientation === 'vertical') {\r\n // Orient arrows in legend as they are in annotations\r\n transform = ' transform=\"rotate(90, 7, 7)\"';\r\n }\r\n icon = '';\r\n }\r\n } else {\r\n icon = '';\r\n }\r\n\r\n return icon;\r\n}\r\n\r\nfunction getListItems(labels, svg, list, nameHeight, ideo) {\r\n var i, icon, y, row,\r\n lineHeight = getLineHeight(ideo);\r\n\r\n for (i = 0; i < list.rows.length; i++) {\r\n row = list.rows[i];\r\n labels += '
  • ' + row.name + '
  • ';\r\n y = lineHeight * (i - 1) + nameHeight + 1;\r\n if ('name' in list) y += lineHeight;\r\n icon = getIcon(row, ideo);\r\n const transform = 'translate(0, ' + y + ')';\r\n svg += '' + icon + '';\r\n }\r\n\r\n return [labels, svg];\r\n}\r\n\r\nfunction getLineHeight(ideo) {\r\n return round(getTextSize('A', ideo).height) * 2 + 0.5;\r\n}\r\n\r\n/**\r\n * Display a legend for genome annotations, using `legend` configuration option\r\n */\r\nfunction writeLegend(ideo) {\r\n var i, legend, svg, labels, list, content,\r\n config = ideo.config,\r\n lineHeight = getLineHeight(ideo);\r\n\r\n d3.select(config.container + ' #_ideogramLegend').remove();\r\n\r\n legend = config.legend;\r\n content = '';\r\n\r\n for (i = 0; i < legend.length; i++) {\r\n list = legend[i];\r\n let nameHeight = lineHeight;\r\n if (list.nameHeight) {\r\n nameHeight = list.nameHeight;\r\n }\r\n let nameStyle = '';\r\n if (nameHeight) {\r\n nameStyle =\r\n `style=\"height: ${nameHeight}px; ` +\r\n `position: relative; ` +\r\n `left: -${nameHeight - 5}px;\"`;\r\n }\r\n if ('name' in list) {\r\n labels = `
    ` + list.name + `
    `;\r\n }\r\n svg = '';\r\n [labels, svg] = getListItems(labels, svg, list, nameHeight, ideo);\r\n svg += '';\r\n content += svg + '
      ' + labels + '
    ';\r\n }\r\n\r\n var fontFamily = `font-family: ${config.fontFamily};`;\r\n var lineHeightCss = `line-height: ${getLineHeight(ideo)}px;`;\r\n legendStyle +=\r\n `#_ideogramLegend {${fontFamily} ${lineHeightCss}}`;\r\n\r\n var target = d3.select(config.container + ' #_ideogramOuterWrap');\r\n target.append('style').html(legendStyle);\r\n target.append('div').attr('id', '_ideogramLegend').html(content);\r\n}\r\n\r\nexport {writeLegend};\r\n","import {d3} from '../lib';\r\nimport {writeHistogramAnnots} from './histogram';\r\nimport {writeLegend} from './legend';\r\n\r\nfunction parseFriendlyAnnots(friendlyAnnots, rawAnnots) {\r\n var i, j, annot, rawAnnot;\r\n\r\n for (i = 0; i < friendlyAnnots.length; i++) {\r\n annot = friendlyAnnots[i];\r\n\r\n for (j = 0; j < rawAnnots.length; j++) {\r\n if (annot.chr === rawAnnots[j].chr) {\r\n rawAnnot = [\r\n annot.name,\r\n annot.start,\r\n annot.stop - annot.start\r\n ];\r\n if ('color' in annot) rawAnnot.push(annot.color);\r\n if ('shape' in annot) rawAnnot.push(annot.shape);\r\n rawAnnots[j].annots.push(rawAnnot);\r\n break;\r\n }\r\n }\r\n }\r\n\r\n return rawAnnots;\r\n}\r\n\r\nfunction parseFriendlyKeys(friendlyAnnots) {\r\n var keys = ['name', 'start', 'length'];\r\n if ('color' in friendlyAnnots[0]) {\r\n keys.push('color');\r\n }\r\n if ('shape' in friendlyAnnots[0]) {\r\n keys.push('shape');\r\n }\r\n return keys;\r\n}\r\n\r\n/**\r\n * Draws annotations defined by user\r\n */\r\nfunction drawAnnots(friendlyAnnots, layout, keep=false, isOtherLayout=false) {\r\n var keys, chr,\r\n rawAnnots = [],\r\n ideo = this,\r\n chrs = ideo.chromosomes[ideo.config.taxid]; // TODO: multiorganism\r\n\r\n if (\r\n 'annots' in friendlyAnnots[0] || // When filtering\r\n 'values' in friendlyAnnots[0] // When drawing cached expression matrices\r\n ) {\r\n return ideo.drawProcessedAnnots(friendlyAnnots, layout);\r\n }\r\n\r\n for (chr in chrs) {\r\n rawAnnots.push({chr: chr, annots: []});\r\n }\r\n rawAnnots = parseFriendlyAnnots(friendlyAnnots, rawAnnots);\r\n\r\n keys = parseFriendlyKeys(friendlyAnnots);\r\n\r\n ideo.rawAnnots = {keys: keys, annots: rawAnnots};\r\n\r\n const processedAnnots = ideo.processAnnotData(ideo.rawAnnots);\r\n if (!isOtherLayout) {\r\n ideo.annots = processedAnnots;\r\n } else {\r\n ideo.annotsOther = processedAnnots;\r\n }\r\n\r\n ideo.drawProcessedAnnots(processedAnnots, layout, keep);\r\n}\r\n\r\nfunction getShapes(annotHeight) {\r\n var triangle, circle, rectangle, r;\r\n\r\n triangle =\r\n 'm0,0 l -' + annotHeight + ' ' + (2 * annotHeight) +\r\n ' l ' + (2 * annotHeight) + ' 0 z';\r\n\r\n // From http://stackoverflow.com/a/10477334, with a minor change (\"m -r, r\")\r\n // Circles are supported natively via , but having it as a path\r\n // simplifies handling triangles, circles and other shapes in the same\r\n // D3 call\r\n r = annotHeight;\r\n circle =\r\n 'm -' + r + ', ' + r +\r\n 'a ' + r + ',' + r + ' 0 1,0 ' + (r * 2) + ',0' +\r\n 'a ' + r + ',' + r + ' 0 1,0 -' + (r * 2) + ',0';\r\n\r\n rectangle =\r\n 'm0,0 l 0 ' + (2 * annotHeight) +\r\n 'l ' + annotHeight + ' 0' +\r\n 'l 0 -' + (2 * annotHeight) + 'z';\r\n\r\n return {triangle: triangle, circle: circle, rectangle: rectangle};\r\n}\r\n\r\nfunction getChrAnnotNodes(filledAnnots, ideo) {\r\n return d3.selectAll(ideo.selector + ' .chromosome')\r\n .data(filledAnnots)\r\n .selectAll('path.annot')\r\n .data(function(d) {\r\n return d.annots;\r\n })\r\n .enter();\r\n}\r\n\r\nfunction determineShape(d, shapes) {\r\n if (!d.shape || d.shape === 'triangle') {\r\n return shapes.triangle;\r\n } else if (d.shape === 'circle') {\r\n return shapes.circle;\r\n } else if (d.shape === 'rectangle') {\r\n return shapes.rectangle;\r\n } else {\r\n return d.shape;\r\n }\r\n}\r\n\r\nfunction writeTrackAnnots(chrAnnot, ideo) {\r\n var shapes,\r\n annotHeight = ideo.config.annotationHeight;\r\n\r\n shapes = getShapes(annotHeight);\r\n\r\n chrAnnot.append('g')\r\n .attr('id', function(d) {return d.domId;})\r\n .attr('class', 'annot')\r\n .attr('transform', function(d) {\r\n var y = ideo.config.chrWidth + (d.trackIndex * annotHeight * 2);\r\n return 'translate(' + d.px + ',' + y + ')';\r\n })\r\n .append('path')\r\n .attr('d', function(d) {return determineShape(d, shapes);})\r\n .attr('fill', function(d) {return d.color;})\r\n .on('mouseover', function(event, d) {ideo.showAnnotTooltip(d, this);})\r\n .on('mouseout', function() {ideo.startHideAnnotTooltipTimeout();})\r\n .on('click', function(event, d) {ideo.onClickAnnot(d);});\r\n}\r\n\r\n/**\r\n * Overlaid annotations appear directly on chromosomes\r\n */\r\nfunction writeOverlayAnnots(chrAnnot, ideo) {\r\n chrAnnot.append('polygon')\r\n .attr('id', function(d) {return d.id;})\r\n .attr('class', 'annot')\r\n .attr('points', function(d) {\r\n var x1, x2,\r\n chrWidth = ideo.config.chrWidth;\r\n\r\n if (d.stopPx - d.startPx > 1) {\r\n x1 = d.startPx;\r\n x2 = d.stopPx;\r\n } else {\r\n x1 = d.px - 0.5;\r\n x2 = d.px + 0.5;\r\n }\r\n\r\n return (\r\n x1 + ',' + chrWidth + ' ' + x2 + ',' + chrWidth + ' ' +\r\n x2 + ',0 ' + x1 + ',0'\r\n );\r\n })\r\n .attr('fill', function(d) {return d.color;})\r\n .on('mouseover', function(event, d) {ideo.showAnnotTooltip(d, this);})\r\n .on('mouseout', function() {ideo.startHideAnnotTooltipTimeout();});\r\n}\r\n\r\nfunction warnIfTooManyAnnots(layout, annots) {\r\n var i, numAnnots;\r\n\r\n if (!/heatmap/.test(layout) && layout !== 'histogram') {\r\n numAnnots = 0;\r\n for (i = 0; i < annots.length; i++) {\r\n numAnnots += annots[i].annots.length;\r\n }\r\n if (numAnnots > 2000) {\r\n console.warn(\r\n 'Rendering more than 2000 annotations in Ideogram?\\n' +\r\n 'Try setting \"annotationsLayout\" to \"heatmap\" or \"histogram\" in your ' +\r\n 'Ideogram configuration object for better layout and performance.'\r\n );\r\n }\r\n }\r\n}\r\n\r\nfunction drawAnnotsByLayoutType(layout, annots, ideo) {\r\n var filledAnnots, chrAnnot;\r\n\r\n warnIfTooManyAnnots(layout, annots);\r\n\r\n if (layout === 'histogram') annots = ideo.getHistogramBars(annots);\r\n\r\n filledAnnots = ideo.fillAnnots(annots);\r\n\r\n chrAnnot = getChrAnnotNodes(filledAnnots, ideo);\r\n\r\n if (layout === 'tracks') {\r\n writeTrackAnnots(chrAnnot, ideo);\r\n } else if (layout === 'overlay') {\r\n writeOverlayAnnots(chrAnnot, ideo);\r\n } else if (layout === 'histogram') {\r\n writeHistogramAnnots(chrAnnot, ideo);\r\n }\r\n}\r\n\r\n/**\r\n * Draws genome annotations on chromosomes.\r\n * Annotations can be rendered as either overlaid directly\r\n * on a chromosome, or along one or more \"tracks\"\r\n * running parallel to each chromosome.\r\n */\r\nfunction drawProcessedAnnots(annots, layout, keep=false) {\r\n var ideo = this;\r\n\r\n if (!keep) {\r\n d3.selectAll(ideo.selector + ' .annot').remove();\r\n }\r\n\r\n if (layout === undefined) layout = 'tracks';\r\n if (ideo.config.annotationsLayout) layout = ideo.config.annotationsLayout;\r\n\r\n if ('legend' in ideo.config) writeLegend(ideo);\r\n\r\n if (/heatmap/.test(layout)) {\r\n ideo.drawHeatmaps(annots);\r\n return;\r\n }\r\n\r\n drawAnnotsByLayoutType(layout, annots, ideo);\r\n if (ideo.onDrawAnnotsCallback) ideo.onDrawAnnotsCallback();\r\n}\r\n\r\nexport {drawAnnots, drawProcessedAnnots, getShapes};\r\n","import {d3} from '../lib';\r\n\r\nexport function writeSyntenicRegion(syntenies, regionID, ideo) {\r\n return syntenies.append('g')\r\n .attr('class', 'syntenicRegion')\r\n .attr('id', regionID)\r\n .on('click', function() {\r\n var activeRegion = this;\r\n var others = d3.selectAll(ideo.selector + ' .syntenicRegion')\r\n .filter(function() {return (this !== activeRegion);});\r\n\r\n others.classed('hidden', !others.classed('hidden'));\r\n })\r\n .on('mouseover', function() {\r\n var activeRegion = this;\r\n d3.selectAll(ideo.selector + ' .syntenicRegion')\r\n .filter(function() {return (this !== activeRegion);})\r\n .classed('ghost', true);\r\n })\r\n .on('mouseout', function() {\r\n d3.selectAll(ideo.selector + ' .syntenicRegion')\r\n .classed('ghost', false);\r\n });\r\n}\r\n\r\nexport function writeSyntenicRegionPolygons(\r\n syntenicRegion, x1, x2, r1, r2, regions\r\n) {\r\n var color, opacity;\r\n\r\n color = ('color' in regions) ? regions.color : '#CFC';\r\n opacity = ('opacity' in regions) ? regions.opacity : 1;\r\n\r\n syntenicRegion.append('polygon')\r\n .attr('points',\r\n x1 + ', ' + r1.startPx + ' ' +\r\n x1 + ', ' + r1.stopPx + ' ' +\r\n x2 + ', ' + r2.stopPx + ' ' +\r\n x2 + ', ' + r2.startPx\r\n )\r\n .style('fill', color)\r\n .style('fill-opacity', opacity);\r\n}\r\n\r\nexport function writeSyntenicRegionPolygonsHorizontal(\r\n syntenicRegion, y1, y2, r1, r2, regions\r\n) {\r\n var color, opacity;\r\n\r\n color = ('color' in regions) ? regions.color : '#CFC';\r\n opacity = ('opacity' in regions) ? regions.opacity : 1;\r\n\r\n syntenicRegion.append('polygon')\r\n .attr('points',\r\n (r1.startPx - 15) + ', ' + y1 + ' ' +\r\n (r1.stopPx - 15) + ', ' + y1 + ' ' +\r\n (r2.stopPx - 15) + ', ' + y2 + ' ' +\r\n (r2.startPx - 15) + ', ' + y2\r\n )\r\n .style('fill', color)\r\n .style('fill-opacity', opacity);\r\n}\r\n\r\nexport function getRegionsR1AndR2(regions, ideo, xOffset = null) {\r\n var r1, r2,\r\n r1Offset, r2Offset;\r\n\r\n r1 = regions.r1;\r\n r2 = regions.r2;\r\n\r\n if (typeof r1.chr === 'string') {\r\n const taxids = ideo.config.taxids;\r\n if (ideo.config.multiorganism) {\r\n r1.chr = ideo.chromosomes[taxids[0]][r1.chr];\r\n r2.chr = ideo.chromosomes[taxids[1]][r2.chr];\r\n } else {\r\n r1.chr = ideo.chromosomes[taxids[0]][r1.chr];\r\n r2.chr = ideo.chromosomes[taxids[0]][r2.chr];\r\n }\r\n }\r\n\r\n var r1ChrDom = document.querySelector('#' + r1.chr.id + '-chromosome-set');\r\n var r1GenomeHorizontalXOffset = r1ChrDom.getCTM().e;\r\n var r1GenomeVerticalXOffset = r1ChrDom.getCTM().f;\r\n var r2ChrDom = document.querySelector('#' + r2.chr.id + '-chromosome-set');\r\n // var r2GenomeOffset = r2ChrDom.getBoundingClientRect().top;\r\n var r2GenomeHorizontalXOffset = r2ChrDom.getCTM().e;\r\n var r2GenomeVerticalXOffset = r2ChrDom.getCTM().f;\r\n\r\n if (xOffset === null) {\r\n if (ideo.config.orientation === 'vertical') {\r\n // When vertical collinear\r\n // http://localhost:8080/examples/vanilla/compare-whole-genomes?chromosome-scale=absolute&orientation=vertical\r\n r1Offset = r1GenomeVerticalXOffset - 12;\r\n r2Offset = r2GenomeVerticalXOffset - 12;\r\n } else {\r\n // When horizontal collinear, e.g.\r\n // http://localhost:8080/examples/vanilla/compare-whole-genomes?chromosome-scale=absolute&orientation=horizontal\r\n r1Offset = r1GenomeHorizontalXOffset;\r\n r2Offset = r2GenomeHorizontalXOffset;\r\n }\r\n } else {\r\n // When horizontal parallel\r\n r1Offset = xOffset;\r\n r2Offset = xOffset;\r\n }\r\n\r\n r1.startPx = ideo.convertBpToPx(r1.chr, r1.start) + r1Offset;\r\n r1.stopPx = ideo.convertBpToPx(r1.chr, r1.stop) + r1Offset;\r\n r2.startPx = ideo.convertBpToPx(r2.chr, r2.start) + r2Offset;\r\n r2.stopPx = ideo.convertBpToPx(r2.chr, r2.stop) + r2Offset;\r\n\r\n return [r1, r2];\r\n}\r\n","import {d3} from '../lib';\r\nimport {\r\n getRegionsR1AndR2, writeSyntenicRegionPolygons, writeSyntenicRegion\r\n} from './synteny-lib';\r\n\r\nfunction writeSyntenicRegionLines(syntenicRegion, x1, x2, r1, r2) {\r\n syntenicRegion.append('line')\r\n .attr('class', 'syntenyBorder')\r\n .attr('x1', x1)\r\n .attr('x2', x2)\r\n .attr('y1', r1.startPx)\r\n .attr('y2', r2.startPx);\r\n\r\n syntenicRegion.append('line')\r\n .attr('class', 'syntenyBorder')\r\n .attr('x1', x1)\r\n .attr('x2', x2)\r\n .attr('y1', r1.stopPx)\r\n .attr('y2', r2.stopPx);\r\n}\r\n\r\nfunction writeSyntenicRegions(syntenicRegions, syntenies, ideo) {\r\n var i, regions, r1, r2, regionID, syntenicRegion, chrWidth, x1, x2;\r\n\r\n for (i = 0; i < syntenicRegions.length; i++) {\r\n regions = syntenicRegions[i];\r\n\r\n [r1, r2] = getRegionsR1AndR2(regions, ideo);\r\n\r\n regionID = (\r\n r1.chr.id + '_' + r1.start + '_' + r1.stop + '_' +\r\n '__' +\r\n r2.chr.id + '_' + r2.start + '_' + r2.stop\r\n );\r\n\r\n syntenicRegion = writeSyntenicRegion(syntenies, regionID, ideo);\r\n\r\n chrWidth = ideo.config.chrWidth;\r\n x1 = chrWidth + 51;\r\n x2 = chrWidth + 245; // Genomes are spaced ~200 pixels apart\r\n\r\n writeSyntenicRegionPolygons(syntenicRegion, x1, x2, r1, r2, regions);\r\n writeSyntenicRegionLines(syntenicRegion, x1, x2, r1, r2);\r\n }\r\n}\r\n\r\nfunction reportPerformance(t0, ideo) {\r\n var t1 = new Date().getTime();\r\n if (ideo.config.debug) {\r\n console.log('Time in drawSyntenicRegions: ' + (t1 - t0) + ' ms');\r\n }\r\n}\r\n\r\n/**\r\n * Draws a trapezoid connecting a genomic range on\r\n * one chromosome to a genomic range on another chromosome;\r\n * a syntenic region.\r\n */\r\nfunction drawSyntenyCollinear(syntenicRegions, ideo) {\r\n var syntenies,\r\n t0 = new Date().getTime();\r\n\r\n syntenies = d3.select(ideo.selector)\r\n .insert('g', ':first-child')\r\n .attr('class', 'synteny');\r\n\r\n writeSyntenicRegions(syntenicRegions, syntenies, ideo);\r\n\r\n reportPerformance(t0, ideo);\r\n}\r\n\r\nexport {drawSyntenyCollinear};\r\n","import {d3} from '../lib';\r\nimport {\r\n getRegionsR1AndR2, writeSyntenicRegionPolygonsHorizontal, writeSyntenicRegion\r\n} from './synteny-lib';\r\n\r\nfunction writeSyntenicRegionLines(syntenicRegion, y1, y2, r1, r2) {\r\n syntenicRegion.append('line')\r\n .attr('class', 'syntenyBorder')\r\n .attr('x1', r1.startPx - 15)\r\n .attr('x2', r2.startPx - 15)\r\n .attr('y1', y1)\r\n .attr('y2', y2);\r\n\r\n syntenicRegion.append('line')\r\n .attr('class', 'syntenyBorder')\r\n .attr('x1', r1.stopPx - 15)\r\n .attr('x2', r2.stopPx - 15)\r\n .attr('y1', y1)\r\n .attr('y2', y2);\r\n}\r\n\r\nfunction writeSyntenicRegions(syntenicRegions, syntenies, ideo) {\r\n var i, regions, r1, r2, regionID, syntenicRegion, chrWidth, y1, y2;\r\n\r\n for (i = 0; i < syntenicRegions.length; i++) {\r\n regions = syntenicRegions[i];\r\n\r\n [r1, r2] = getRegionsR1AndR2(regions, ideo);\r\n\r\n regionID = (\r\n r1.chr.id + '_' + r1.start + '_' + r1.stop + '_' +\r\n '__' +\r\n r2.chr.id + '_' + r2.start + '_' + r2.stop\r\n );\r\n\r\n syntenicRegion = writeSyntenicRegion(syntenies, regionID, ideo);\r\n\r\n chrWidth = ideo.config.chrWidth;\r\n y1 = chrWidth + 31;\r\n y2 = chrWidth + 191; // Genomes are spaced ~200 pixels apart\r\n\r\n writeSyntenicRegionPolygonsHorizontal(\r\n syntenicRegion, y1, y2, r1, r2, regions\r\n );\r\n writeSyntenicRegionLines(syntenicRegion, y1, y2, r1, r2);\r\n }\r\n}\r\n\r\nfunction reportPerformance(t0, ideo) {\r\n var t1 = new Date().getTime();\r\n if (ideo.config.debug) {\r\n console.log('Time in drawSyntenicRegions: ' + (t1 - t0) + ' ms');\r\n }\r\n}\r\n\r\n/**\r\n * Draws a trapezoid connecting a genomic range on\r\n * one chromosome to a genomic range on another chromosome;\r\n * a syntenic region.\r\n */\r\nfunction drawSyntenyCollinearHorizontal(syntenicRegions, ideo) {\r\n var syntenies,\r\n t0 = new Date().getTime();\r\n\r\n syntenies = d3.select(ideo.selector)\r\n .insert('g', ':first-child')\r\n .attr('class', 'synteny');\r\n\r\n writeSyntenicRegions(syntenicRegions, syntenies, ideo);\r\n\r\n reportPerformance(t0, ideo);\r\n}\r\n\r\nexport {drawSyntenyCollinearHorizontal};\r\n","import {d3} from '../lib';\r\nimport {drawSyntenyCollinear} from './synteny-collinear';\r\nimport {drawSyntenyCollinearHorizontal} from './synteny-collinear-horizontal';\r\nimport {\r\n getRegionsR1AndR2, writeSyntenicRegionPolygons, writeSyntenicRegion\r\n} from './synteny-lib';\r\n\r\nfunction writeSyntenicRegionLines(syntenicRegion, x1, x2, r1, r2, regions) {\r\n\r\n var stroke, width;\r\n if (\r\n Math.abs(r1.startPx - r1.startPx) < 2 &&\r\n Math.abs(r1.stopPx - r1.stopPx) < 2\r\n ) {\r\n stroke = regions.color;\r\n width = regions.width;\r\n } else {\r\n stroke = '';\r\n width = '';\r\n }\r\n\r\n syntenicRegion.append('line')\r\n .attr('class', 'syntenyBorder')\r\n .attr('x1', x1)\r\n .attr('x2', x2)\r\n .attr('y1', r1.startPx)\r\n .attr('y2', r2.startPx)\r\n .style('stroke', stroke)\r\n .style('stroke-width', width);\r\n\r\n syntenicRegion.append('line')\r\n .attr('class', 'syntenyBorder')\r\n .attr('x1', x1)\r\n .attr('x2', x2)\r\n .attr('y1', r1.stopPx)\r\n .attr('y2', r2.stopPx)\r\n .style('stroke', stroke)\r\n .style('stroke-width', stroke);\r\n}\r\n\r\nfunction writeSyntenicRegionLabels(syntenicRegion, x1, x2, r1, r2, regionId) {\r\n var rangeIds = regionId.split('__').map(d => 'label_' + d);\r\n if ('name' in r1) {\r\n syntenicRegion.append('text')\r\n .attr('id', rangeIds[0])\r\n .attr('y', r1.startPx + 3)\r\n .text(r1.name);\r\n var r1Width =\r\n document.querySelector('#' + rangeIds[0]).getBoundingClientRect().width;\r\n d3.select('#' + rangeIds[0]).attr('x', x1 - 15 - r1Width);\r\n }\r\n if ('name' in r2) {\r\n syntenicRegion.append('text')\r\n .attr('id', rangeIds[1])\r\n .text(r2.name)\r\n .attr('x', x2 + 15)\r\n .attr('y', r2.startPx + 3)\r\n .text(r2.name);\r\n }\r\n}\r\n\r\nfunction writeSyntenicRegions(syntenicRegions, syntenies, xOffset, ideo) {\r\n var i, regions, r1, r2, regionID, syntenicRegion, chrWidth, x1, x2;\r\n\r\n for (i = 0; i < syntenicRegions.length; i++) {\r\n regions = syntenicRegions[i];\r\n\r\n [r1, r2] = getRegionsR1AndR2(regions, ideo, xOffset);\r\n\r\n regionID = (\r\n r1.chr.id + '_' + r1.start + '_' + r1.stop + '_' +\r\n '__' +\r\n r2.chr.id + '_' + r2.start + '_' + r2.stop\r\n );\r\n\r\n syntenicRegion = writeSyntenicRegion(syntenies, regionID, ideo);\r\n\r\n chrWidth = ideo.config.chrWidth;\r\n x1 = ideo._layout.getChromosomeSetYTranslate(0);\r\n x2 = ideo._layout.getChromosomeSetYTranslate(1) - chrWidth;\r\n\r\n writeSyntenicRegionPolygons(syntenicRegion, x1, x2, r1, r2, regions);\r\n writeSyntenicRegionLines(syntenicRegion, x1, x2, r1, r2, regions);\r\n writeSyntenicRegionLabels(syntenicRegion, x1, x2, r1, r2, regionID);\r\n }\r\n}\r\n\r\nfunction reportPerformance(t0, ideo) {\r\n var t1 = new Date().getTime();\r\n if (ideo.config.debug) {\r\n console.log('Time in drawSyntenicRegions: ' + (t1 - t0) + ' ms');\r\n }\r\n}\r\n\r\n/**\r\n * Draws a trapezoid connecting a genomic range on\r\n * one chromosome to a genomic range on another chromosome;\r\n * a syntenic region.\r\n */\r\nfunction drawSynteny(syntenicRegions) {\r\n var syntenies, xOffset,\r\n t0 = new Date().getTime(),\r\n ideo = this,\r\n config = ideo.config;\r\n\r\n // Make synteny / orthologs readable from client apps\r\n ideo.syntenicRegions = syntenicRegions;\r\n\r\n if (\r\n config.multiorganism &&\r\n config.geometry === 'collinear'\r\n ) {\r\n if (config.orientation === 'vertical') {\r\n return drawSyntenyCollinear(syntenicRegions, ideo);\r\n } else {\r\n return drawSyntenyCollinearHorizontal(syntenicRegions, ideo);\r\n }\r\n }\r\n\r\n syntenies = d3.select(ideo.selector)\r\n .insert('g', ':first-child')\r\n .attr('class', 'synteny');\r\n\r\n xOffset = ideo._layout.margin.left;\r\n\r\n writeSyntenicRegions(syntenicRegions, syntenies, xOffset, ideo);\r\n\r\n reportPerformance(t0, ideo);\r\n}\r\n\r\nexport {drawSynteny};\r\n","import {d3} from '../lib';\r\nimport collinearizeChromosomes from '../collinear';\r\n\r\n/**\r\n * Reset displayed tracks to those originally displayed\r\n */\r\nfunction restoreDefaultTracks() {\r\n var ideo = this;\r\n ideo.config.numAnnotTracks = ideo.config.annotationsNumTracks;\r\n d3.selectAll(ideo.selector + ' .annot').remove();\r\n ideo.drawAnnots(ideo.processAnnotData(ideo.rawAnnots));\r\n}\r\n\r\nfunction getDisplayedRawAnnotsByChr(annotsByChr, trackIndexes) {\r\n var annot, displayedRawAnnotsByChr, annots, i, displayedAnnots, j,\r\n trackIndex;\r\n\r\n displayedRawAnnotsByChr = [];\r\n\r\n // Filter displayed tracks by selected track indexes\r\n for (i = 0; i < annotsByChr.length; i++) {\r\n annots = annotsByChr[i];\r\n displayedAnnots = [];\r\n for (j = 0; j < annots.annots.length; j++) {\r\n annot = annots.annots[j].slice(); // copy array by value\r\n trackIndex = annot[3] + 1;\r\n if (trackIndexes.includes(trackIndex)) {\r\n annot[3] = trackIndexes.indexOf(trackIndex);\r\n displayedAnnots.push(annot);\r\n }\r\n }\r\n displayedRawAnnotsByChr.push({chr: annots.chr, annots: displayedAnnots});\r\n }\r\n\r\n return displayedRawAnnotsByChr;\r\n}\r\n\r\n/**\r\n * Adds or removes tracks from the displayed list of tracks.\r\n * Only works when raw annotations are dense.\r\n *\r\n * @param trackIndexes Array of indexes of tracks to display\r\n */\r\nfunction updateDisplayedTracks(trackIndexes) {\r\n var displayedRawAnnotsByChr, displayedAnnots, rawAnnots,\r\n ideo = this,\r\n annotsByChr = ideo.rawAnnots.annots;\r\n\r\n ideo.config.numAnnotTracks = trackIndexes.length;\r\n\r\n displayedRawAnnotsByChr =\r\n getDisplayedRawAnnotsByChr(annotsByChr, trackIndexes);\r\n rawAnnots = {keys: ideo.rawAnnots.keys, annots: displayedRawAnnotsByChr};\r\n\r\n if (ideo.config.geometry === 'collinear') {\r\n collinearizeChromosomes(ideo);\r\n }\r\n\r\n displayedAnnots = ideo.processAnnotData(rawAnnots);\r\n\r\n d3.selectAll(ideo.selector + ' .annot').remove();\r\n ideo.displayedTrackIndexes = trackIndexes;\r\n ideo.drawAnnots(displayedAnnots);\r\n\r\n return displayedAnnots;\r\n}\r\n\r\nfunction getSetAnnotsByChr(annotsByChr, ideo) {\r\n var i, j, annots, annot, setAnnots, trackIndexOriginal, numAvailTracks,\r\n setAnnotsByChr = [];\r\n\r\n numAvailTracks = 1;\r\n\r\n for (i = 0; i < annotsByChr.length; i++) {\r\n annots = annotsByChr[i];\r\n setAnnots = [];\r\n for (j = 0; j < annots.annots.length; j++) {\r\n annot = annots.annots[j].slice();\r\n trackIndexOriginal = annot[3];\r\n if (trackIndexOriginal + 1 > numAvailTracks) {\r\n numAvailTracks = trackIndexOriginal + 1;\r\n }\r\n annot.splice(4, 0, trackIndexOriginal);\r\n setAnnots.push(annot);\r\n }\r\n setAnnotsByChr.push({chr: annots.chr, annots: setAnnots});\r\n }\r\n\r\n ideo.numAvailTracks = numAvailTracks;\r\n\r\n return setAnnotsByChr;\r\n}\r\n\r\nfunction setOriginalTrackIndexes(rawAnnots) {\r\n var keys, annotsByChr, setAnnotsByChr,\r\n ideo = this;\r\n\r\n keys = rawAnnots.keys;\r\n\r\n // If this method is unnecessary, pass through\r\n if (\r\n keys.length < 4 ||\r\n keys[3] !== 'trackIndex' ||\r\n keys[4] === 'trackIndexOriginal'\r\n ) {\r\n return rawAnnots;\r\n }\r\n\r\n annotsByChr = rawAnnots.annots;\r\n setAnnotsByChr = getSetAnnotsByChr(annotsByChr, ideo);\r\n\r\n keys.splice(4, 0, 'trackIndexOriginal');\r\n rawAnnots = {keys: keys, annots: setAnnotsByChr};\r\n if (ideo.rawAnnots.metadata) rawAnnots.metadata = ideo.rawAnnots.metadata;\r\n\r\n return rawAnnots;\r\n}\r\n\r\nexport {restoreDefaultTracks, setOriginalTrackIndexes, updateDisplayedTracks};\r\n","import {add2dAnnotsForChr} from './heatmap-2d';\r\nimport {setAnnotRanks} from './annotations';\r\n\r\n// Default colors for tracks of annotations\r\nvar colorMap = [\r\n ['F00'], // If there is 1 track, then color it red.\r\n ['F00', '88F'], // If 2 tracks, color one red and one light blue.\r\n ['F00', 'CCC', '88F'], // If 3, color one red, one grey, one light blue.\r\n ['F00', 'FA0', '0AF', '88F'], // And so on.\r\n ['F00', 'FA0', 'CCC', '0AF', '88F'],\r\n ['F00', 'FA0', '875', '578', '0AF', '88F'],\r\n ['F00', 'FA0', '875', 'CCC', '578', '0AF', '88F'],\r\n ['F00', 'FA0', '7A0', '875', '0A7', '578', '0AF', '88F'],\r\n ['F00', 'FA0', '7A0', '875', 'CCC', '0A7', '578', '0AF', '88F'],\r\n ['F00', 'FA0', '7A0', '875', '552', '255', '0A7', '578', '0AF', '88F']\r\n];\r\n\r\n/**\r\n * Ensure annotation containers are ordered by chromosome.\r\n */\r\nfunction orderAnnotContainers(annots, ideo) {\r\n var unorderedAnnots, i, j, annot, chr, chrs;\r\n\r\n unorderedAnnots = annots;\r\n annots = [];\r\n chrs = ideo.chromosomesArray;\r\n for (i = 0; i < chrs.length; i++) {\r\n chr = chrs[i].name;\r\n for (j = 0; j < unorderedAnnots.length; j++) {\r\n annot = unorderedAnnots[j];\r\n if (annot.chr === chr) {\r\n annots.push(annot);\r\n }\r\n }\r\n }\r\n\r\n return annots;\r\n}\r\n\r\n/**\r\n * Add client annotations, as in annotations-tracks.html\r\n */\r\nfunction addClientAnnot(annots, annot, ra, m, ideo) {\r\n var annotTrack;\r\n\r\n annot.trackIndex = ra[3];\r\n annotTrack = ideo.config.annotationTracks[annot.trackIndex];\r\n if (annotTrack.color) {\r\n annot.color = annotTrack.color;\r\n }\r\n if (annotTrack.shape) {\r\n annot.shape = annotTrack.shape;\r\n }\r\n\r\n annots[m].annots.push(annot);\r\n\r\n return annots;\r\n}\r\n\r\n/**\r\n * Add sparse server annotations, as in annotations-track-filters.html\r\n */\r\nfunction addSparseServerAnnot(annot, ra, omittedAnnots, annots, m, ideo) {\r\n var colors = colorMap[ideo.numAvailTracks - 1];\r\n\r\n annot.trackIndex = ra[3];\r\n annot.trackIndexOriginal = ra[4];\r\n annot.color = '#' + colors[annot.trackIndexOriginal];\r\n\r\n // Catch annots that will be omitted from display\r\n if (annot.trackIndex > ideo.config.numTracks - 1) {\r\n if (annot.trackIndex in omittedAnnots) {\r\n omittedAnnots[annot.trackIndex].push(annot);\r\n } else {\r\n omittedAnnots[annot.trackIndex] = [annot];\r\n }\r\n return [annots, omittedAnnots];\r\n }\r\n annots[m].annots.push(annot);\r\n\r\n return [annots, omittedAnnots];\r\n}\r\n\r\n/**\r\n * Basic client annotations, as in annotations-basic.html\r\n * and annotations-external.html\r\n */\r\nfunction addBasicClientAnnot(annots, annot, m, ideo) {\r\n annot.trackIndex = 0;\r\n if (!annot.color) {\r\n annot.color = ideo.config.annotationsColor;\r\n }\r\n if (!annot.shape) {\r\n annot.shape = 'triangle';\r\n }\r\n annots[m].annots.push(annot);\r\n\r\n return annots;\r\n}\r\n\r\nfunction addAnnot(annot, keys, ra, omittedAnnots, annots, m, ideo) {\r\n\r\n if (ideo.config.annotationTracks) {\r\n annots = addClientAnnot(annots, annot, ra, m, ideo);\r\n } else if (keys[3] === 'trackIndex' && ideo.numAvailTracks !== 1) {\r\n [annots, omittedAnnots] =\r\n addSparseServerAnnot(annot, ra, omittedAnnots, annots, m, ideo);\r\n // } else if (\r\n // keys.length > 3 &&\r\n // keys[3] in {trackIndex: 1, color: 1, shape: 1} === false &&\r\n // keys[4] === 'trackIndexOriginal'\r\n // ) {\r\n // annots = addDenseServerAnnot(keys, annots, annot, m);\r\n } else {\r\n annots = addBasicClientAnnot(annots, annot, m, ideo);\r\n }\r\n\r\n return [annots, omittedAnnots];\r\n}\r\n\r\nfunction getAnnotDomId(chrIndex, annotIndex) {\r\n return '_c' + chrIndex + '_a' + annotIndex;\r\n}\r\n\r\nfunction addAnnotsForChr(annots, omittedAnnots, annotsByChr, chrModel,\r\n m, keys, ideo) {\r\n var j, k, annot, ra;\r\n\r\n // Assign DOM ID if annots are rendered as individual DOM elements\r\n const shouldAssignDomId = (\r\n !ideo.config.annotationsLayout ||\r\n ideo.config.annotationsLayout === 'tracks'\r\n );\r\n\r\n for (j = 0; j < annotsByChr.annots.length; j++) {\r\n ra = annotsByChr.annots[j];\r\n annot = {};\r\n\r\n for (k = 0; k < keys.length; k++) {\r\n annot[keys[k]] = ra[k];\r\n }\r\n\r\n annot.stop = annot.start + annot.length;\r\n\r\n annot.chr = annotsByChr.chr;\r\n annot.chrIndex = m;\r\n annot.startPx = ideo.convertBpToPx(chrModel, annot.start);\r\n annot.stopPx = ideo.convertBpToPx(chrModel, annot.stop);\r\n annot.px = Math.round((annot.startPx + annot.stopPx) / 2);\r\n if (shouldAssignDomId) annot.domId = getAnnotDomId(m, j);\r\n\r\n [annots, omittedAnnots] =\r\n addAnnot(annot, keys, ra, omittedAnnots, annots, m, ideo);\r\n }\r\n\r\n if (shouldAssignDomId) {\r\n if (ideo.annotSortFunction) {\r\n annots[m].annots = setAnnotRanks(annots[m].annots, ideo);\r\n annots[m].annots.sort((a, b) => {\r\n // Reverse-sort, so first annots are drawn last, and thus at top layer\r\n return -ideo.annotSortFunction(a, b);\r\n });\r\n } else {\r\n // Sort by genomic position, in ascending order\r\n annots[m].annots.sort((a, b) => a[1] - b[1]);\r\n }\r\n\r\n for (j = 0; j < annots[m].annots.length; j++) {\r\n annots[m].annots[j].domId = getAnnotDomId(m, j);\r\n }\r\n }\r\n\r\n return [annots, omittedAnnots];\r\n}\r\n\r\nfunction warnOfUndefinedChromosome(annotsByChr) {\r\n console.warn(\r\n 'Chromosome \"' + annotsByChr.chr + '\" undefined in ideogram; ' +\r\n annotsByChr.annots.length + ' annotations not shown'\r\n );\r\n}\r\n\r\nfunction addAnnots(rawAnnots, keys, ideo) {\r\n var m, i, annotsByChr, chrModel,\r\n annots = [],\r\n omittedAnnots = {};\r\n\r\n m = -1;\r\n for (i = 0; i < rawAnnots.length; i++) {\r\n annotsByChr = rawAnnots[i];\r\n chrModel = ideo.chromosomes[ideo.config.taxid][annotsByChr.chr];\r\n\r\n if (typeof chrModel === 'undefined') {\r\n warnOfUndefinedChromosome(annotsByChr);\r\n continue;\r\n }\r\n\r\n m++;\r\n annots.push({chr: annotsByChr.chr, annots: []});\r\n\r\n if (ideo.config.annotationsLayout !== 'heatmap-2d') {\r\n [annots, omittedAnnots] =\r\n addAnnotsForChr(annots, omittedAnnots, annotsByChr, chrModel, m,\r\n keys, ideo);\r\n } else {\r\n [annots, omittedAnnots] =\r\n add2dAnnotsForChr(annots, omittedAnnots, annotsByChr, chrModel, m,\r\n keys, ideo);\r\n }\r\n }\r\n return [annots, omittedAnnots];\r\n}\r\n\r\nfunction sendTrackAndAnnotWarnings(omittedAnnots, ideo) {\r\n var numOmittedTracks,\r\n layout = ideo.config.annotationsLayout,\r\n numTracks = ideo.config.numAnnotTracks;\r\n\r\n if (!/heatmap/.test(layout) && numTracks > 10) {\r\n console.error(\r\n 'Ideogram only displays up to 10 tracks at a time. ' +\r\n 'You specified ' + numTracks + ' tracks. ' +\r\n 'Perhaps consider a different way to visualize your data.'\r\n );\r\n }\r\n\r\n numOmittedTracks = Object.keys(omittedAnnots).length;\r\n if (numOmittedTracks) {\r\n console.warn(\r\n 'Ideogram configuration specified ' + numTracks + ' tracks, ' +\r\n 'but loaded annotations contain ' + numOmittedTracks + ' ' +\r\n 'extra tracks.'\r\n );\r\n }\r\n}\r\n\r\n/**\r\n * Proccesses genome annotation data.\r\n *\r\n * This method converts raw annotation data from server, which is structured as\r\n * an array of arrays, into a more verbose data structure consisting of an\r\n * array of objects. It also adds pixel offset information.\r\n */\r\nfunction processAnnotData(rawAnnots) {\r\n var keys, annots, omittedAnnots,\r\n ideo = this;\r\n\r\n keys = rawAnnots.keys;\r\n rawAnnots = rawAnnots.annots;\r\n\r\n [annots, omittedAnnots] = addAnnots(rawAnnots, keys, ideo);\r\n annots = orderAnnotContainers(annots, ideo);\r\n\r\n sendTrackAndAnnotWarnings(omittedAnnots, ideo);\r\n\r\n return annots;\r\n}\r\n\r\nexport {processAnnotData, getAnnotDomId};\r\n","/**\r\n * @fileoverview Parse raw Ideogram.js annotations from an expression matrix.\r\n * This module handles dense gene expression matrixes.\r\n * In gene expression expressions, rows are genes and columns are cells.\r\n */\r\n\r\nexport class ExpressionMatrixParser {\r\n\r\n /**\r\n * @param {String} matrix Tab-delimited gene expression matrix\r\n * @param {Object} coordinates Coordinates [chr, start, length] by gene name\r\n * @param {Object} ideo Ideogram object\r\n */\r\n constructor(matrix, ideo) {\r\n this.matrix = matrix;\r\n this.ideo = ideo;\r\n }\r\n\r\n /**\r\n * Initialize rawAnnots by fetching genomic coordinates, then merging them\r\n * with the gene expression matrix supplied in constructor.\r\n */\r\n setRawAnnots() {\r\n var parser, ideo, matrix;\r\n parser = this;\r\n ideo = this.ideo;\r\n matrix = this.matrix;\r\n\r\n return new Promise(function(resolve) {\r\n parser.rawAnnots = parser.fetchCoordinates(ideo)\r\n .then(function(coordinates) {\r\n parser.coordinates = coordinates;\r\n resolve(parser.parseExpressionMatrix(matrix, ideo));\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Get chromosome, start and stop coordinates from genome annotation file\r\n *\r\n * TODO: Support non-human organisms\r\n */\r\n fetchCoordinates(ideo) {\r\n var coordinates = {};\r\n\r\n if (ideo.config.organism === 'human') {\r\n var ensemblData =\r\n ideo.config.dataDir +\r\n '../../annotations/Homo_sapiens,_Ensembl_80.tsv';\r\n\r\n return new Promise(function(resolve) {\r\n ideo.fetch(ensemblData, 'text').then(function(data) {\r\n // eslint-disable-next-line no-unused-vars\r\n var tsvLines, i, start, stop, gene, chr, length;\r\n\r\n tsvLines = data.split(/\\r\\n|\\n/).slice(1);\r\n for (i = 0; i < tsvLines.length; i++) {\r\n [start, stop, gene, , chr] = tsvLines[i].split(/\\s/g);\r\n start = parseInt(start);\r\n stop = parseInt(stop);\r\n length = stop - start;\r\n coordinates[gene] = [chr, start, length];\r\n }\r\n resolve(coordinates);\r\n });\r\n });\r\n } else {\r\n throw Error('Expression matrix parsing is only supported for human');\r\n }\r\n }\r\n\r\n /**\r\n * Parses an annotation from a tab-separated line of a matrix file\r\n */\r\n parseAnnotFromTsvLine(tsvLine, chrs) {\r\n var annot, chrIndex, chr, start, gene, expressions,\r\n columns = tsvLine.split(/\\s/g);\r\n\r\n gene = columns[0];\r\n if (gene in this.coordinates === false) return [null, null];\r\n\r\n expressions = columns.slice(1).map(d => parseFloat(d));\r\n [chr, start, length] = this.coordinates[gene];\r\n\r\n chrIndex = chrs.indexOf(chr);\r\n if (chrIndex === -1) return [null, null];\r\n\r\n annot = [gene, start, length];\r\n annot = annot.concat(expressions);\r\n\r\n return [chrIndex, annot];\r\n }\r\n\r\n /**\r\n * Parses a gene expression matrix file, returns raw annotations\r\n */\r\n parseExpressionMatrix(matrix, ideo) {\r\n var i, chrs, rawAnnots, cells, line, chrIndex, annot, keys,\r\n annots = [],\r\n tsvLines = matrix.split(/\\r\\n|\\n/);\r\n\r\n chrs = Object.keys(ideo.chromosomes[ideo.config.taxid]);\r\n for (i = 0; i < chrs.length; i++) {\r\n annots.push({chr: chrs[i], annots: []});\r\n }\r\n\r\n for (i = 1; i < tsvLines.length; i++) {\r\n line = tsvLines[i];\r\n [chrIndex, annot] = this.parseAnnotFromTsvLine(line, chrs);\r\n if (chrIndex !== null) annots[chrIndex].annots.push(annot);\r\n }\r\n\r\n cells = tsvLines[0].split(/\\s/g);\r\n keys = ['name', 'start', 'length'].concat(cells);\r\n rawAnnots = {keys: keys, annots: annots};\r\n\r\n return rawAnnots;\r\n }\r\n\r\n}\r\n","function downloadAnnotations() {\r\n\r\n const ideo = this;\r\n const annots = {};\r\n\r\n ideo.annots.forEach(chrAnnots => {\r\n chrAnnots.annots.forEach(annot => {\r\n const desc = ideo.annotDescriptions.annots[annot.name];\r\n\r\n annots[annot.name] = [\r\n annot.name, desc.ensemblId,\r\n annot.chr, annot.start, annot.stop, annot.length,\r\n desc.type\r\n ];\r\n });\r\n });\r\n\r\n const header = [\r\n '# Gene name', 'Ensembl ID', 'Chromosome', 'Start', 'Stop', 'Length', 'Type'\r\n ];\r\n const rows = [header].concat(Object.values(annots));\r\n const annotsTsv =\r\n ideo.annotDescriptions.headers + '\\n#\\n' +\r\n rows.map(row => row.join('\\t')).join('\\n');\r\n\r\n const annotsHref =\r\n 'data:text/plain;charset=utf-8,' + encodeURIComponent(annotsTsv);\r\n\r\n var evt = new MouseEvent('click', {\r\n view: window,\r\n bubbles: false,\r\n cancelable: true\r\n });\r\n\r\n var a = document.createElement('a');\r\n a.setAttribute('download', 'ideogram.tsv');\r\n a.setAttribute('href', annotsHref);\r\n a.setAttribute('target', '_blank');\r\n\r\n // Enables easy testing\r\n a.setAttribute('id', '_ideo-undisplayed-dl-annots-link');\r\n a.setAttribute('style', 'display: none;');\r\n document.body.appendChild(a);\r\n\r\n a.dispatchEvent(evt);\r\n}\r\n\r\nexport {downloadAnnotations};\r\n","/**\r\n * @fileoverview Methods for ideogram annotations.\r\n * Annotations are graphical objects that represent features of interest\r\n * located on the chromosomes, e.g. genes or variations. They can\r\n * appear beside a chromosome, overlaid on top of it, or between multiple\r\n * chromosomes.\r\n */\r\n\r\nimport {BedParser} from '../parsers/bed-parser';\r\nimport {TsvParser} from '../parsers/tsv-parser';\r\nimport {drawHeatmaps, deserializeAnnotsForHeatmap} from './heatmap';\r\nimport {inflateThresholds} from './heatmap-lib';\r\nimport {inflateHeatmaps} from './heatmap-collinear';\r\nimport {\r\n onLoadAnnots, onDrawAnnots, startHideAnnotTooltipTimeout,\r\n onWillShowAnnotTooltip, showAnnotTooltip, onClickAnnot\r\n} from './events';\r\n\r\nimport {\r\n addAnnotLabel, removeAnnotLabel, fillAnnotLabels, clearAnnotLabels\r\n // fadeOutAnnotLabels\r\n} from './labels';\r\n\r\nimport {drawAnnots, drawProcessedAnnots} from './draw';\r\nimport {getHistogramBars} from './histogram';\r\nimport {drawSynteny} from './synteny';\r\nimport {\r\n restoreDefaultTracks, setOriginalTrackIndexes, updateDisplayedTracks\r\n} from './filter';\r\nimport {processAnnotData} from './process';\r\nimport {ExpressionMatrixParser} from '../parsers/expression-matrix-parser';\r\nimport {downloadAnnotations} from './download';\r\n\r\nfunction initNumTracksAndBarWidth(ideo, config) {\r\n\r\n if (config.annotationTracks) {\r\n ideo.config.numAnnotTracks = config.annotationTracks.length;\r\n } else if (config.annotationsNumTracks) {\r\n ideo.config.numAnnotTracks = config.annotationsNumTracks;\r\n } else {\r\n ideo.config.numAnnotTracks = 1;\r\n }\r\n ideo.config.annotTracksHeight =\r\n config.annotationHeight * config.numAnnotTracks;\r\n\r\n if (typeof config.barWidth === 'undefined') {\r\n ideo.config.barWidth = 3;\r\n }\r\n}\r\n\r\nfunction initTooltip(ideo, config) {\r\n if (config.showAnnotTooltip !== false) {\r\n ideo.config.showAnnotTooltip = true;\r\n }\r\n\r\n if (config.onWillShowAnnotTooltip) {\r\n ideo.onWillShowAnnotTooltipCallback = config.onWillShowAnnotTooltip;\r\n }\r\n}\r\n\r\nfunction initAnnotLabel(ideo, config) {\r\n if (config.addAnnotLabel !== false) {\r\n ideo.config.addAnnotLabel = true;\r\n }\r\n\r\n if (config.onWillAddAnnotLabel) {\r\n ideo.onWillAddAnnotLabelCallback = config.onWillAddAnnotLabel;\r\n }\r\n}\r\n\r\nfunction initAnnotHeight(ideo) {\r\n var config = ideo.config;\r\n var annotHeight;\r\n\r\n if (!config.annotationHeight) {\r\n if (config.annotationsLayout === 'heatmap') {\r\n annotHeight = config.chrWidth - 1;\r\n } else {\r\n annotHeight = Math.round(config.chrHeight / 100);\r\n if (annotHeight < 3) annotHeight = 3;\r\n }\r\n ideo.config.annotationHeight = annotHeight;\r\n }\r\n}\r\n\r\n/**\r\n * Initializes various annotation settings. Constructor help function.\r\n */\r\nfunction initAnnotSettings() {\r\n var ideo = this,\r\n config = ideo.config;\r\n\r\n initAnnotHeight(ideo);\r\n\r\n if (\r\n config.annotationsPath || config.localAnnotationsPath ||\r\n ideo.annots || config.annotations\r\n ) {\r\n initNumTracksAndBarWidth(ideo, config);\r\n } else {\r\n ideo.config.annotTracksHeight = 0;\r\n ideo.config.numAnnotTracks = 0;\r\n }\r\n\r\n if (typeof config.annotationsColor === 'undefined') {\r\n ideo.config.annotationsColor = '#F00';\r\n }\r\n\r\n if (config.onClickAnnot) {\r\n ideo.onClickAnnotCallback = config.onClickAnnot;\r\n }\r\n\r\n initTooltip(ideo, config);\r\n initAnnotLabel(ideo, config);\r\n}\r\n\r\nfunction validateAnnotsUrl(annotsUrl) {\r\n var tmp, extension;\r\n\r\n tmp = annotsUrl.split('?')[0].split('.');\r\n extension = tmp[tmp.length - 1];\r\n\r\n if (['bed', 'json', 'tsv'].includes(extension) === false) {\r\n extension = extension.toUpperCase();\r\n alert(\r\n 'Ideogram.js only supports BED and Ideogram JSON and TSV ' +\r\n 'at the moment. ' +\r\n 'Sorry, check back soon for ' + extension + ' support!'\r\n );\r\n return;\r\n }\r\n return extension;\r\n}\r\n\r\n/** Find redundant chromosomes in raw annotations */\r\nfunction detectDuplicateChrsInRawAnnots(ideo) {\r\n const seen = {};\r\n const duplicates = [];\r\n const chrs = ideo.rawAnnots.annots.map(annot => annot.chr);\r\n\r\n chrs.forEach((chr) => {\r\n if (chr in seen) duplicates.push(chr);\r\n seen[chr] = 1;\r\n });\r\n\r\n if (duplicates.length > 0) {\r\n const message =\r\n `Duplicate chromosomes detected.\\n` +\r\n `Chromosome list: ${chrs}. Duplicates: ${duplicates}.\\n` +\r\n `To fix this, edit your raw annotations JSON data to remove redundant ` +\r\n `chromosomes.`;\r\n throw Error(message);\r\n }\r\n}\r\n\r\nfunction afterRawAnnots() {\r\n var ideo = this,\r\n config = ideo.config;\r\n\r\n // Ensure annots are ordered by chromosome\r\n ideo.rawAnnots.annots = ideo.rawAnnots.annots.sort(Ideogram.sortChromosomes);\r\n\r\n if (ideo.onLoadAnnotsCallback) {\r\n ideo.onLoadAnnotsCallback();\r\n }\r\n\r\n if (\r\n 'heatmapThresholds' in config ||\r\n 'metadata' in ideo.rawAnnots &&\r\n 'heatmapThresholds' in ideo.rawAnnots.metadata\r\n ) {\r\n if (config.annotationsLayout === 'heatmap') {\r\n inflateHeatmaps(ideo);\r\n } else if (config.annotationsLayout === 'heatmap-2d') {\r\n ideo.config.heatmapThresholds = inflateThresholds(ideo);\r\n }\r\n }\r\n\r\n if (config.heatmaps) {\r\n ideo.deserializeAnnotsForHeatmap(ideo.rawAnnots);\r\n }\r\n\r\n detectDuplicateChrsInRawAnnots(ideo);\r\n}\r\n\r\n/**\r\n * Converts list of annotation-by-chromosome objects to list of annot objects\r\n */\r\nfunction flattenAnnots() {\r\n const ideo = this;\r\n return ideo.annots.reduce((accumulator, annots) => {\r\n return [...accumulator, ...annots.annots];\r\n }, []);\r\n}\r\n\r\n/**\r\n * Requests annotations URL via HTTP, sets ideo.rawAnnots for downstream\r\n * processing.\r\n *\r\n * @param annotsUrl Absolute or relative URL for native or BED annotations file\r\n */\r\nfunction fetchAnnots(annotsUrl) {\r\n var extension, is2dHeatmap,\r\n ideo = this,\r\n config = ideo.config;\r\n\r\n is2dHeatmap = config.annotationsLayout === 'heatmap-2d';\r\n\r\n var extension = validateAnnotsUrl(annotsUrl);\r\n\r\n if (annotsUrl.slice(0, 4) !== 'http' && !is2dHeatmap && extension !== 'tsv') {\r\n ideo.fetch(annotsUrl)\r\n .then(function(data) {\r\n ideo.rawAnnotsResponse = data; // Preserve truly raw response content\r\n ideo.rawAnnots = data; // Sometimes gets partially processed\r\n ideo.afterRawAnnots();\r\n });\r\n return;\r\n }\r\n\r\n extension = (is2dHeatmap ? '' : extension);\r\n\r\n ideo.fetch(annotsUrl, 'text')\r\n .then(function(text) {\r\n ideo.rawAnnotsResponse = text;\r\n if (is2dHeatmap) {\r\n var parser = new ExpressionMatrixParser(text, ideo);\r\n parser.setRawAnnots().then(function(d) {\r\n ideo.rawAnnots = d;\r\n ideo.afterRawAnnots();\r\n });\r\n } else {\r\n if (extension === 'tsv') {\r\n ideo.rawAnnots = new TsvParser(text, ideo).rawAnnots;\r\n } else if (extension === 'bed') {\r\n ideo.rawAnnots = new BedParser(text, ideo).rawAnnots;\r\n } else {\r\n ideo.rawAnnots = JSON.parse(text);\r\n }\r\n ideo.afterRawAnnots();\r\n }\r\n });\r\n}\r\n\r\n/**\r\n * Fills out annotations data structure such that its top-level list of arrays\r\n * matches that of this ideogram's chromosomes list in order and number\r\n * Fixes https://github.com/eweitz/ideogram/issues/66\r\n */\r\nfunction fillAnnots(annots) {\r\n var filledAnnots, chrs, chrArray, i, chr, annot, chrIndex;\r\n\r\n filledAnnots = [];\r\n chrs = [];\r\n chrArray = this.chromosomesArray;\r\n\r\n for (i = 0; i < chrArray.length; i++) {\r\n chr = chrArray[i].name;\r\n chrs.push(chr);\r\n filledAnnots.push({chr: chr, annots: []});\r\n }\r\n\r\n for (i = 0; i < annots.length; i++) {\r\n annot = annots[i];\r\n chrIndex = chrs.indexOf(annot.chr);\r\n if (chrIndex !== -1) {\r\n filledAnnots[chrIndex] = annot;\r\n }\r\n }\r\n\r\n return filledAnnots;\r\n}\r\n\r\nexport function applyRankCutoff(annots, cutoff, ideo) {\r\n const rankedAnnots = sortAnnotsByRank(annots, ideo);\r\n\r\n // Take the top N ranked genes, where N is `cutoff`\r\n annots = rankedAnnots.slice(0, cutoff);\r\n\r\n return annots;\r\n}\r\n\r\nexport function setAnnotRanks(annots, ideo) {\r\n if ('geneCache' in ideo === false) return annots;\r\n\r\n const ranks = ideo.geneCache.interestingNames;\r\n\r\n return annots.map(annot => {\r\n if (ranks.includes(annot.name)) {\r\n annot.rank = ranks.indexOf(annot.name) + 1;\r\n } else {\r\n annot.rank = 1E10;\r\n }\r\n return annot;\r\n });\r\n}\r\n\r\nexport function sortAnnotsByRank(annots, ideo) {\r\n\r\n if (ideo) {\r\n annots = setAnnotRanks(annots, ideo);\r\n }\r\n // Ranks annots by popularity\r\n return annots.sort((a, b) => {\r\n\r\n // // Search gene is most important, regardless of popularity\r\n // if (a.color === 'red') return -1;\r\n // if (b.color === 'red') return 1;\r\n\r\n // Rank 3 is more important than rank 30\r\n return a.rank - b.rank;\r\n });\r\n}\r\n\r\nexport {\r\n onLoadAnnots, onDrawAnnots, processAnnotData, restoreDefaultTracks,\r\n updateDisplayedTracks, initAnnotSettings, fetchAnnots, drawAnnots,\r\n getHistogramBars, drawHeatmaps, deserializeAnnotsForHeatmap, fillAnnots,\r\n drawProcessedAnnots, drawSynteny, startHideAnnotTooltipTimeout,\r\n showAnnotTooltip, onWillShowAnnotTooltip, setOriginalTrackIndexes,\r\n afterRawAnnots, onClickAnnot, downloadAnnotations, addAnnotLabel,\r\n removeAnnotLabel, fillAnnotLabels, clearAnnotLabels, flattenAnnots\r\n // fadeOutAnnotLabels\r\n};\r\n","/** Adds boxes behind a list of chromosomes; can indicate selection, etc. */\r\nfunction highlight(chrNames, color='red') {\r\n const ideo = this;\r\n const taxid = ideo.config.taxid;\r\n\r\n const highlightsHtml = chrNames.map(chrName => {\r\n const chrId = ideo.chromosomes[taxid][chrName].id;\r\n const chrSet = `${ideo.selector} #${chrId}-chromosome-set`;\r\n const chrDom = document.querySelector(chrSet);\r\n const rect = chrDom.getBoundingClientRect();\r\n\r\n const style = `style=\"\r\n stroke-width: 1px;\r\n stroke: ${color};\r\n fill: ${color};\r\n fill-opacity: 0.05;\r\n position: absolute;\r\n rx: 4;\r\n ry: 4;\r\n height: ${rect.width + 15}px;\r\n width: ${rect.height + 15}px\"`;\r\n\r\n const left = chrDom.transform.baseVal[1].matrix.f - 7.5;\r\n const transform = `transform=\"rotate(90) translate(10, ${left})\"`;\r\n const id = `id=\"ideo-highlight-${chrId}\"`;\r\n\r\n return ``;\r\n }).join();\r\n\r\n const ideoDom = document.querySelector(ideo.selector);\r\n ideoDom.insertAdjacentHTML('afterBegin', highlightsHtml);\r\n}\r\n\r\n/** Removes highlight from a list of chromosomes (or all chromosomes) */\r\nfunction unhighlight(chrNames) {\r\n const ideo = this;\r\n\r\n let highlightsSelector = `${ideo.selector} .ideo-highlight`;\r\n if (typeof chrNames !== 'undefined') {\r\n const taxid = ideo.config.taxid;\r\n highlightsSelector = chrNames.map(chrName => {\r\n const chrId = ideo.chromosomes[taxid][chrName].id;\r\n return `${ideo.selector} #ideo-highlight-${chrId}`;\r\n });\r\n }\r\n\r\n document.querySelectorAll(highlightsSelector).forEach((element) => {\r\n element.remove();\r\n });\r\n\r\n}\r\n\r\nexport {highlight, unhighlight};\r\n","import {d3, slug, fetchWithRetry} from '../lib';\r\n\r\n/**\r\n * Returns NCBI Taxonomy identifier (taxid) for organism name\r\n */\r\nfunction getTaxidFromEutils(orgName, ideo) {\r\n var taxonomySearch, taxid;\r\n\r\n taxonomySearch = ideo.esearch + '&db=taxonomy&term=' + orgName;\r\n\r\n return d3.json(taxonomySearch).then(function(data) {\r\n var idlist = data.esearchresult.idlist;\r\n if (idlist.length === 0) {\r\n var warning =\r\n 'Organism \"' + orgName + '\" is generally unknown; it was not found ' +\r\n 'in the NCBI Taxonomy database. If you did not intend to specify a ' +\r\n 'novel or custom taxon, then try using the organism\\'s ' +\r\n 'scientific name, e.g. Homo sapiens or Arabidopsis thaliana.';\r\n throw warning;\r\n } else {\r\n taxid = data.esearchresult.idlist[0];\r\n return [orgName, taxid];\r\n }\r\n });\r\n}\r\n\r\n/**\r\n * Returns organism common name given an NCBI Taxonomy ID\r\n *\r\n * @param taxid NCBI Taxonomy ID\r\n * @param callback Function to call upon completing ESearch request\r\n */\r\nfunction getOrganismFromEutils(taxid, callback) {\r\n var organism, taxonomySearch,\r\n ideo = this;\r\n\r\n taxid = ideo.config.organism;\r\n\r\n taxonomySearch = ideo.esummary + '&db=taxonomy&id=' + taxid;\r\n\r\n d3.json(taxonomySearch).then(function(data) {\r\n organism = data.result[String(taxid)].commonname;\r\n ideo.config.organism = organism;\r\n return callback(organism);\r\n });\r\n}\r\n\r\nfunction setTaxidData(taxid, ideo) {\r\n\r\n var dataDir, urlOrg, taxids;\r\n console.log('here')\r\n if (ideo.assemblyIsAccession()) {\r\n return new Promise(function(resolve) {\r\n ideo.coordinateSystem = 'bp';\r\n ideo.getAssemblyAndChromosomesFromEutils(taxid, resolve);\r\n });\r\n }\r\n console.log('here2')\r\n\r\n dataDir = ideo.config.dataDir;\r\n urlOrg = slug(ideo.organisms[taxid].scientificName);\r\n\r\n taxids = [taxid];\r\n\r\n var fullyBandedTaxids = ['9606', '10090', '10116'];\r\n if (fullyBandedTaxids.includes(taxid) && !ideo.config.showFullyBanded) {\r\n urlOrg += '-no-bands';\r\n }\r\n var chromosomesUrl = dataDir + urlOrg + '.json';\r\n\r\n var promise2 = new Promise((resolve, reject) => {\r\n return fetchWithRetry(chromosomesUrl)\r\n .then(response => {\r\n return response.json().then(function(json) {\r\n resolve(json);\r\n });\r\n })\r\n .catch((errorMessage) => {\r\n reject(errorMessage);\r\n });\r\n });\r\n\r\n return promise2\r\n .then(function(chrData) {\r\n // Check if chromosome data exists locally.\r\n // This is used for pre-processed centromere data,\r\n // which is not accessible via EUtils. See get_chromosomes.py.\r\n var chrBands = chrData.chrBands\r\n\r\n var asmAndChrTaxidsArray = [''],\r\n chromosomes = [],\r\n seenChrs = {},\r\n chr, maxLength, splitBand, length;\r\n\r\n ideo.bandData[chrData.taxid] = chrBands;\r\n\r\n for (var i = 0; i < chrBands.length; i++) {\r\n splitBand = chrBands[i].split(' ');\r\n chr = splitBand[0];\r\n length = splitBand.slice(-1)[0];\r\n if (chr in seenChrs) {\r\n continue;\r\n } else {\r\n chromosomes.push({name: chr, type: 'nuclear', length: length});\r\n seenChrs[chr] = 1;\r\n }\r\n }\r\n chromosomes = chromosomes.sort(Ideogram.sortChromosomes);\r\n console.log(chromosomes)\r\n console.log(taxids)\r\n maxLength = {bp: 0, iscn: 0};\r\n chromosomes.forEach(chr => {\r\n if (chr.length > maxLength.bp) maxLength.bp = chr.length;\r\n });\r\n ideo.maxLength[taxid] = maxLength;\r\n asmAndChrTaxidsArray.push(chromosomes);\r\n asmAndChrTaxidsArray.push(taxids);\r\n return asmAndChrTaxidsArray;\r\n },\r\n function() {\r\n // If request in `then` errs (404), fetch data from EUtils\r\n return new Promise(function(resolve) {\r\n ideo.coordinateSystem = 'bp';\r\n ideo.getAssemblyAndChromosomesFromEutils(taxid, resolve);\r\n });\r\n });\r\n}\r\n\r\nfunction setAssemblyAndChromosomes(taxid, resolve, ideo) {\r\n var assembly, chrs, originalChrs, orgName, filteredChrs,\r\n config = ideo.config;\r\n\r\n setTaxidData(taxid, ideo)\r\n .then(function(asmChrTaxidsArray) {\r\n assembly = asmChrTaxidsArray[0];\r\n chrs = asmChrTaxidsArray[1];\r\n\r\n if ('chromosomes' in config === false || config.chromosomes === null) {\r\n ideo.config.chromosomes = {};\r\n ideo.config.chromosomes[taxid] = chrs;\r\n } else {\r\n if (config.multiorganism) {\r\n if (taxid in config.chromosomes) {\r\n // Encountered when either organism has centromere data\r\n originalChrs = config.chromosomes[taxid];\r\n } else {\r\n // Encountered when neither organism has centromere data\r\n orgName = slug(ideo.getScientificName(taxid));\r\n ideo.config.chromosomes[taxid] =\r\n config.chromosomes[orgName].slice();\r\n originalChrs = ideo.config.chromosomes[taxid];\r\n // delete ideo.config.chromosomes[orgName];\r\n }\r\n } else {\r\n originalChrs = config.chromosomes;\r\n }\r\n\r\n filteredChrs = chrs.filter(d => originalChrs.includes(d.name));\r\n ideo.config.chromosomes[taxid] = filteredChrs;\r\n }\r\n ideo.chromosomes[taxid] = ideo.config.chromosomes[taxid].slice();\r\n ideo.organisms[taxid].assemblies = {\r\n default: assembly\r\n };\r\n resolve();\r\n });\r\n}\r\n\r\n/**\r\n * Determine if organism is natively supported, using its name.\r\n */\r\nfunction isOrganismSupported(org, ideo) {\r\n var taxid, ideoOrg;\r\n\r\n for (taxid in ideo.organisms) {\r\n ideoOrg = ideo.organisms[taxid];\r\n if (\r\n taxid === slug(org) ||\r\n slug(ideoOrg.commonName) === slug(org) ||\r\n slug(ideoOrg.scientificName) === slug(org)\r\n ) {\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n}\r\n\r\n/**\r\n * Augment \"organisms\" metadata with for any requested organism that is\r\n * not natively supported (i.e., not in organism-metadata.js).\r\n*/\r\nfunction populateNonNativeOrg(orgs, ideo) {\r\n var org, promise, i,\r\n getTaxidFromEutilsPromises = [],\r\n augmentedOrganismMetadata = {};\r\n\r\n for (i = 0; i < orgs.length; i++) {\r\n org = orgs[i];\r\n if (isOrganismSupported(org, ideo) === false) {\r\n promise = getTaxidFromEutils(org, ideo)\r\n .then(function(orgNameAndTaxid) {\r\n\r\n var taxid = orgNameAndTaxid[1],\r\n orgName = orgNameAndTaxid[0],\r\n name, scientificName;\r\n\r\n name = orgName.replace('-', ' ');\r\n scientificName = name[0].toUpperCase() + name.slice(1);\r\n\r\n augmentedOrganismMetadata[taxid] = {\r\n scientificName: scientificName,\r\n commonName: '',\r\n assemblies: {default: ''}\r\n };\r\n\r\n Object.assign(ideo.organisms, augmentedOrganismMetadata);\r\n }, function(warning) {\r\n console.warn(warning);\r\n var customMetadata = {\r\n scientificName: org,\r\n commonName: org,\r\n assemblies: {default: ''}\r\n };\r\n\r\n // Use a negative number as unofficial taxid for custom organism.\r\n // Use case: https://github.com/eweitz/ideogram/issues/265\r\n //\r\n // If support for *multiple* custom specifies is ever\r\n // needed, we can decrement from -1.\r\n ideo.organisms['-1'] = customMetadata;\r\n augmentedOrganismMetadata['-1'] = customMetadata;\r\n });\r\n } else {\r\n promise = new Promise(function(resolve) {\r\n var taxid = ideo.getTaxid(org);\r\n augmentedOrganismMetadata[taxid] = ideo.organisms[taxid];\r\n resolve();\r\n });\r\n }\r\n getTaxidFromEutilsPromises.push(promise);\r\n }\r\n\r\n return Promise.all(getTaxidFromEutilsPromises).then(function() {\r\n return augmentedOrganismMetadata;\r\n });\r\n}\r\n\r\nfunction prepareTmpChrsAndTaxids(ideo) {\r\n var orgs, taxids, tmpChrs, org, taxid, chrsOrgSlugs,\r\n config = ideo.config;\r\n\r\n taxids = [];\r\n tmpChrs = {};\r\n orgs = (config.multiorganism) ? config.organism : [config.organism];\r\n\r\n return populateNonNativeOrg(orgs, ideo).then(function(orgMetadata) {\r\n var orgFields = orgMetadata[taxid];\r\n\r\n for (taxid in orgMetadata) {\r\n orgFields = orgMetadata[taxid];\r\n taxids.push(taxid);\r\n if (config.multiorganism) {\r\n if (typeof config.chromosomes !== 'undefined') {\r\n chrsOrgSlugs = Object.keys(config.chromosomes).map(org => slug(org));\r\n // Adjusts 'chromosomes' configuration parameter to make object\r\n // keys use taxid instead of common organism name\r\n if (chrsOrgSlugs.includes(slug(orgFields.scientificName))) {\r\n org = orgFields.scientificName;\r\n } else if (chrsOrgSlugs.includes(slug(orgFields.commonName))) {\r\n org = orgFields.commonName;\r\n }\r\n if (slug(org) in config.chromosomes) {\r\n tmpChrs[taxid] = config.chromosomes[slug(org)];\r\n } else {\r\n tmpChrs[taxid] = config.chromosomes[org.toLowerCase()];\r\n }\r\n } else {\r\n tmpChrs = null;\r\n }\r\n }\r\n }\r\n return [tmpChrs, taxids];\r\n });\r\n}\r\n\r\n/**\r\n * Sort taxids by the \"organism\" configuration option\r\n *\r\n * TODO: Handle taxid being passed as organism\r\n */\r\nfunction sortTaxidsByOriginalOrganismOption(ideo) {\r\n var configOrganisms, sortedTaxids, i;\r\n configOrganisms = ideo.config.organism;\r\n sortedTaxids = [];\r\n if (Array.isArray(configOrganisms)) {\r\n // Handling multi-organism ideogram\r\n for (i = 0; i < configOrganisms.length; i++) {\r\n sortedTaxids.push(ideo.getTaxid(configOrganisms[i]));\r\n }\r\n } else {\r\n // Handling single-organism ideogram\r\n sortedTaxids.push(ideo.getTaxid(configOrganisms));\r\n }\r\n return sortedTaxids;\r\n}\r\n\r\nfunction getTaxidsForOrganismsInConfig(callback, ideo) {\r\n console.log('here')\r\n prepareTmpChrsAndTaxids(ideo).then(function([tmpChrs, taxids]) {\r\n var i, taxid, promise, assemblies, asmAccs,\r\n config = ideo.config,\r\n asmAndChrPromises = [];\r\n\r\n for (i = 0; i < taxids.length; i++) {\r\n taxid = taxids[i];\r\n assemblies = ideo.organisms[taxid].assemblies;\r\n asmAccs = Object.values(assemblies);\r\n if (\r\n assemblies.default === '' ||\r\n ideo.assemblyIsAccession() && !asmAccs.includes(config.assembly)\r\n ) {\r\n promise = new Promise(function(resolve) {\r\n setAssemblyAndChromosomes(taxid, resolve, ideo);\r\n });\r\n } else {\r\n ideo.config.taxids = taxids;\r\n if (ideo.config.multiorganism) {\r\n ideo.config.chromosomes = tmpChrs;\r\n }\r\n promise = new Promise(function(resolve) {\r\n resolve();\r\n });\r\n }\r\n\r\n asmAndChrPromises.push(promise);\r\n }\r\n\r\n Promise.all(asmAndChrPromises).then(function() {\r\n taxids = sortTaxidsByOriginalOrganismOption(ideo);\r\n ideo.config.taxids = taxids;\r\n return callback(taxids);\r\n });\r\n });\r\n}\r\n\r\nfunction getIsMultiorganism(taxidInit, ideo) {\r\n return (\r\n ('organism' in ideo.config && ideo.config.organism instanceof Array) ||\r\n (taxidInit && ideo.config.taxid instanceof Array)\r\n );\r\n}\r\n\r\n/**\r\n * Configure Ideogram taxids when 'organism' is not in ideo.config\r\n */\r\nfunction getTaxidsForOrganismsNotInConfig(taxidInit, callback, ideo) {\r\n var taxids;\r\n\r\n if (ideo.config.multiorganism) {\r\n if (taxidInit) {\r\n taxids = ideo.config.taxid;\r\n }\r\n } else {\r\n if (taxidInit) {\r\n taxids = [ideo.config.taxid];\r\n }\r\n ideo.config.taxids = taxids;\r\n }\r\n callback(taxids);\r\n}\r\n\r\n/**\r\n * Returns an array of taxids for the current ideogram\r\n * Also sets configuration parameters related to taxid(s), whether ideogram is\r\n * multiorganism, and adjusts chromosomes parameters as needed\r\n **/\r\nfunction getTaxids(callback) {\r\n var taxidInit,\r\n ideo = this;\r\n\r\n taxidInit = 'taxid' in ideo.config;\r\n\r\n ideo.config.multiorganism = getIsMultiorganism(taxidInit, ideo);\r\n\r\n if (ideo.config.multiorganism) ideo.coordinateSystem = 'bp';\r\n\r\n if ('organism' in ideo.config) {\r\n const org = ideo.config.organism;\r\n if (typeof org === 'string') {\r\n // Canonicalize e.g. \"Homo sapiens\" to \"homo-sapiens\"\r\n ideo.config.organism = slug(org.toLowerCase());\r\n }\r\n\r\n getTaxidsForOrganismsInConfig(callback, ideo);\r\n } else {\r\n getTaxidsForOrganismsNotInConfig(taxidInit, callback, ideo);\r\n }\r\n}\r\n\r\nexport {\r\n getTaxids, getOrganismFromEutils\r\n};\r\n","import {d3} from '../lib';\r\nimport {\r\n esearch, esummary, elink, getAssemblySearchUrl\r\n} from './eutils-config.js';\r\nimport {\r\n getTaxids, getOrganismFromEutils\r\n} from './organisms.js';\r\n\r\n/**\r\n * Get a URL to ESearch the NCBI Nucleotide DB for an Assembly UID\r\n */\r\nfunction getESearchUrlForChromosomes(asmUid, ideo) {\r\n var qs;\r\n\r\n // Get a list of IDs for the chromosomes in this genome.\r\n //\r\n // Query chromosomes sequences in Nucleotide DB (nuccore) via\r\n // Assembly DB E-Utils link.\r\n qs = ('&db=nuccore&dbfrom=assembly&linkname=assembly_nuccore&' +\r\n 'cmd=neighbor_history&from_uid=' + asmUid);\r\n\r\n return d3.json(ideo.elink + qs)\r\n .then(function(data) {\r\n var webenv = data.linksets[0].webenv;\r\n qs =\r\n '&db=nuccore' +\r\n '&term=%231+AND+%28' +\r\n 'sequence_from_chromosome[Properties]+OR+' +\r\n 'sequence_from_plastid[Properties]+OR+' +\r\n 'sequence_from_mitochondrion[Properties]%29' +\r\n '&WebEnv=' + webenv + '&usehistory=y&retmax=1000';\r\n return ideo.esearch + qs;\r\n });\r\n}\r\n\r\n/**\r\n * Request basic data on a list of chromosome IDs from ESearch\r\n */\r\nfunction fetchNucleotideSummary(data, ideo) {\r\n var ids, ntSummary;\r\n ids = data.esearchresult.idlist.join(',');\r\n ntSummary = ideo.esummary + '&db=nucleotide&id=' + ids;\r\n return d3.json(ntSummary);\r\n}\r\n\r\n/**\r\n * Get name and type for mitochondrial chromosome\r\n *\r\n * See example of \"MT\" in yeast:\r\n * https://eweitz.github.io/ideogram/eukaryotes?org=saccharomyces-cerevisiae\r\n */\r\nfunction parseMitochondrion(result, ideo) {\r\n var type, cnIndex, chrName;\r\n\r\n if (ideo.config.showNonNuclearChromosomes) {\r\n type = result.genome;\r\n cnIndex = result.subtype.split('|').indexOf('plasmid');\r\n if (cnIndex === -1) {\r\n chrName = 'MT';\r\n } else {\r\n // Seen in e.g. rice genome IRGSP-1.0 (GCF_001433935.1),\r\n // From https://eutils.ncbi.nlm.nih.gov/entrez/eutils/esummary.fcgi?retmode=json&db=nucleotide&id=996703432,996703431,996703430,996703429,996703428,996703427,996703426,996703425,996703424,996703423,996703422,996703421,194033210,11466763,7524755\r\n // genome: 'mitochondrion',\r\n // subtype: 'cell_line|plasmid',\r\n // subname: 'A-58 CMS|B1',\r\n chrName = result.subname.split('|')[cnIndex];\r\n }\r\n } else {\r\n return [null, null];\r\n }\r\n\r\n return [chrName, type];\r\n}\r\n\r\n/**\r\n * Get name and type for chloroplastic chromosome.\r\n *\r\n * Plants have chloroplasts. See e.g. green algae:\r\n * https://eweitz.github.io/ideogram/eukaryotes?org=micromonas-commoda\r\n */\r\nfunction parseChloroplastOrPlastid(ideo) {\r\n // Plastid encountered with rice genome IRGSP-1.0 (GCF_001433935.1)\r\n if (ideo.config.showNonNuclearChromosomes) {\r\n return ['CP', 'chloroplast'];\r\n }\r\n return [null, null];\r\n}\r\n\r\n/**\r\n * Get name and type for apicoplast chromosome\r\n *\r\n * Plasmodium falciparum (malaria parasite) has such a chromosome, see e.g.:\r\n * https://eweitz.github.io/ideogram/eukaryotes?org=plasmodium-falciparum\r\n */\r\nfunction parseApicoplast(ideo) {\r\n if (ideo.config.showNonNuclearChromosomes) {\r\n return ['AP', 'apicoplast'];\r\n }\r\n return [null, null];\r\n}\r\n\r\n/**\r\n * Get name and type for nuclear chromosome\r\n *\r\n * These are typical chromosomes, like chromosome 1.\r\n */\r\nfunction parseNuclear(result) {\r\n var type, cnIndex, chrName;\r\n\r\n type = 'nuclear';\r\n cnIndex = result.subtype.split('|').indexOf('chromosome');\r\n chrName = result.subname.split('|')[cnIndex];\r\n\r\n if (typeof chrName !== 'undefined' && chrName.substr(0, 3) === 'chr') {\r\n // Convert \"chr12\" to \"12\", e.g. for banana (GCF_000313855.2)\r\n chrName = chrName.substr(3);\r\n }\r\n\r\n return [chrName, type];\r\n}\r\n\r\n/**\r\n * Get name and type of any chromosome object from NCBI Nucleotide ESummary\r\n */\r\nfunction getChrNameAndType(result, ideo) {\r\n var genome = result.genome;\r\n if (genome === 'mitochondrion') {\r\n return parseMitochondrion(result, ideo);\r\n } else if (genome === 'chloroplast' || genome === 'plastid') {\r\n return parseChloroplastOrPlastid(ideo);\r\n } else if (genome === 'apicoplast') {\r\n return parseApicoplast(ideo);\r\n } else {\r\n return parseNuclear(result);\r\n }\r\n}\r\n\r\nfunction parseChromosome(result, ideo) {\r\n var chrName, type, chromosome;\r\n\r\n [chrName, type] = getChrNameAndType(result, ideo);\r\n\r\n chromosome = {\r\n name: chrName,\r\n length: result.slen,\r\n type: type\r\n };\r\n\r\n return chromosome;\r\n}\r\n\r\nfunction parseChromosomes(results, taxid, ideo) {\r\n var x, chromosome, seenChrId, maxLength,\r\n seenChrs = {},\r\n chromosomes = [];\r\n\r\n for (x in results) {\r\n // omit list of result uids\r\n if (x === 'uids') continue;\r\n\r\n chromosome = parseChromosome(results[x], ideo);\r\n seenChrId = chromosome.name + '_' + chromosome.length;\r\n if (chromosome.type !== null && seenChrId in seenChrs === false) {\r\n // seenChrs accounts for duplicate chromosomes seen with\r\n // pig (Sus scrofa), likely GenBank and RefSeq copies.\r\n chromosomes.push(chromosome);\r\n }\r\n\r\n seenChrs[seenChrId] = 1;\r\n }\r\n\r\n chromosomes = chromosomes.sort(Ideogram.sortChromosomes);\r\n\r\n maxLength = {bp: 0, iscn: 0};\r\n chromosomes.forEach(chr => {\r\n if (chr.length > maxLength.bp) maxLength.bp = chr.length;\r\n });\r\n if (maxLength.bp > ideo.maxLength.bp) ideo.maxLength.bp = maxLength.bp;\r\n ideo.maxLength[taxid] = maxLength;\r\n ideo.coordinateSystem = 'bp';\r\n\r\n return chromosomes;\r\n}\r\n\r\n/**\r\n * Request ESummary data from an ESearch on a genome assembly\r\n */\r\nfunction fetchAssemblySummary(data, ideo) {\r\n var asmUid, asmSummaryUrl;\r\n\r\n // NCBI Assembly database's internal identifier (uid) for this assembly\r\n asmUid = data.esearchresult.idlist[0];\r\n asmSummaryUrl = ideo.esummary + '&db=assembly&id=' + asmUid;\r\n\r\n return d3.json(asmSummaryUrl);\r\n}\r\n\r\n/**\r\n * Returns assembly accession, as well as names and lengths of chromosomes for\r\n * an organism's best-known genome assembly, or for a specified assembly.\r\n *\r\n * Gets data from NCBI EUtils web API.\r\n *\r\n * @param callback Function to call upon completion of this async method\r\n */\r\nfunction getAssemblyAndChromosomesFromEutils(taxid, callback) {\r\n var assemblyAccession,\r\n ideo = this;\r\n\r\n // Search for assembly, then\r\n // get summary of that assembly, then\r\n // get search URL for chromosomes in that assembly, then\r\n // get search results containing chromosome IDs, then\r\n // get summaries of each of those chromosome IDs, then\r\n // format the chromosome summaries and pass them into callback function.\r\n var asmSearchUrl = getAssemblySearchUrl(taxid, ideo);\r\n d3.json(asmSearchUrl)\r\n .then(function(data) {return fetchAssemblySummary(data, ideo);})\r\n .then(function(data) {\r\n var asmUid = data.result.uids[0];\r\n assemblyAccession = data.result[asmUid];\r\n return getESearchUrlForChromosomes(asmUid, ideo);\r\n }).then(function(esearchUrl) {return d3.json(esearchUrl);})\r\n .then(function(data) {return fetchNucleotideSummary(data, ideo);})\r\n .then(function(data) {\r\n var chromosomes = parseChromosomes(data.result, taxid, ideo);\r\n return callback([assemblyAccession, chromosomes]);\r\n }, function(rejectedReason) {\r\n console.warn(rejectedReason);\r\n });\r\n}\r\n\r\nexport {\r\n esearch, esummary, elink, getOrganismFromEutils,\r\n getTaxids, getAssemblyAndChromosomesFromEutils\r\n};\r\n","// The E-Utilies In Depth: Parameters, Syntax and More:\r\n// https://www.ncbi.nlm.nih.gov/books/NBK25499/\r\n\r\nvar apiKey = '&api_key=7e33ac6a08a6955ec3b83d214d22b21a2808';\r\n\r\nvar eutils = 'https://eutils.ncbi.nlm.nih.gov/entrez/eutils/';\r\nvar esearch = eutils + 'esearch.fcgi?retmode=json' + apiKey;\r\nvar esummary = eutils + 'esummary.fcgi?retmode=json' + apiKey;\r\nvar elink = eutils + 'elink.fcgi?retmode=json' + apiKey;\r\n\r\nfunction getAssemblySearchUrl(taxid, ideo) {\r\n var termStem, asmSearchUrl;\r\n\r\n if (ideo.assemblyIsAccession()) {\r\n termStem = ideo.config.assembly + '%22[Assembly%20Accession]';\r\n } else {\r\n termStem = (\r\n taxid + '%22[taxid]' +\r\n 'AND%20(%22latest%20refseq%22[filter])%20'\r\n );\r\n }\r\n\r\n asmSearchUrl =\r\n ideo.esearch +\r\n '&db=assembly' +\r\n '&term=%22' + termStem +\r\n 'AND%20(%22chromosome%20level%22[filter]%20' +\r\n 'OR%20%22complete%20genome%22[filter])';\r\n\r\n return asmSearchUrl;\r\n}\r\n\r\nexport {esearch, esummary, elink, getAssemblySearchUrl};\r\n","/**\r\n * @fileoverview Methods to show (or hide) cytogenetic banding data\r\n */\r\n\r\nimport {d3} from '../lib';\r\n\r\nfunction hideUnshownBandLabels() {\r\n var ideo = this;\r\n var bandsToShow = ideo.bandsToShow.join(',');\r\n\r\n // Handles edge-case when ideogram consists of one chromosome\r\n // that lacks bands in a genome that has bands (e.g. MT in human)\r\n if (ideo.bandsToShow.length === 0) return;\r\n\r\n // d3.selectAll resolves to querySelectorAll (QSA).\r\n // QSA takes a surprisingly long time to complete,\r\n // and scales with the number of selectors.\r\n // Most bands are hidden, so we can optimize by\r\n // Hiding all bands, then QSA'ing and displaying the\r\n // relatively few bands that are shown.\r\n d3.selectAll(ideo.selector + ' .bandLabel, .bandLabelStalk')\r\n .style('display', 'none');\r\n d3.selectAll(bandsToShow).style('display', '');\r\n}\r\n\r\nfunction getPrevRight(prevLabelXRight, prevHiddenBoxIndex, i,\r\n textOffsets, chrModel) {\r\n var prevTextBoxLeft, prevTextBoxWidth;\r\n\r\n if (prevHiddenBoxIndex !== i) {\r\n // This getBoundingClientRect() forces Chrome's\r\n // 'Recalculate Style' and 'Layout', which takes 30-40 ms on Chrome.\r\n // TODO: This forced synchronous layout would be nice to eliminate.\r\n // prevTextBox = texts[i].getBoundingClientRect();\r\n // prevLabelXRight = prevTextBox.left + prevTextBox.width;\r\n\r\n // TODO: Account for number of characters in prevTextBoxWidth,\r\n // maybe also zoom.\r\n prevTextBoxLeft = textOffsets[chrModel.id][i];\r\n prevTextBoxWidth = 36;\r\n\r\n prevLabelXRight = prevTextBoxLeft + prevTextBoxWidth;\r\n }\r\n\r\n return prevLabelXRight;\r\n}\r\n\r\nfunction updateShown(indexesToShow, overlapRight, left, pad, prevRight, i,\r\n isBefore) {\r\n var hiddenIndex, doSkip,\r\n thisRight = isBefore ? overlapRight : prevRight;\r\n\r\n if (left < pad + thisRight) {\r\n overlapRight = prevRight;\r\n hiddenIndex = i;\r\n doSkip = isBefore;\r\n } else {\r\n indexesToShow.push(i);\r\n }\r\n\r\n return [indexesToShow, overlapRight, hiddenIndex, doSkip];\r\n}\r\n\r\nfunction getIndexesToShow(offsets, chrModel) {\r\n var i, hiddenIndex, left, prevRight, doSkip,\r\n indexesToShow = [],\r\n textsLength = offsets[chrModel.id].length,\r\n overlapRight = 0, // Right X coordinate of overlapping label\r\n pad = 5; // text padding\r\n\r\n for (i = 0; i < textsLength; i++) {\r\n // Ensures band labels don't overlap\r\n left = offsets[chrModel.id][i];\r\n\r\n [indexesToShow, overlapRight, hiddenIndex, doSkip] =\r\n updateShown(indexesToShow, overlapRight, left, pad, prevRight, i, true);\r\n if (doSkip) continue;\r\n\r\n prevRight = getPrevRight(prevRight, hiddenIndex, i, offsets, chrModel);\r\n\r\n [indexesToShow, overlapRight, hiddenIndex, doSkip] =\r\n updateShown(indexesToShow, overlapRight, left, pad, prevRight, i, false);\r\n }\r\n\r\n return indexesToShow;\r\n}\r\n\r\n/**\r\n * Sets band labels to display on each chromosome, avoiding label overlap\r\n */\r\nfunction setBandsToShow(chrs, textOffsets) {\r\n var index, i, j, indexesToShow, chrModel, selectorsToShow, ithLength,\r\n ideo = this;\r\n\r\n ideo.bandsToShow = [];\r\n\r\n for (i = 0; i < chrs.length; i++) {\r\n\r\n chrModel = chrs[i];\r\n\r\n indexesToShow = getIndexesToShow(textOffsets, chrModel);\r\n\r\n selectorsToShow = [];\r\n ithLength = indexesToShow.length;\r\n\r\n for (j = 0; j < ithLength; j++) {\r\n index = indexesToShow[j];\r\n selectorsToShow.push('#' + chrModel.id + ' .bsbsl-' + index);\r\n }\r\n\r\n ideo.bandsToShow = ideo.bandsToShow.concat(selectorsToShow);\r\n }\r\n}\r\n\r\nexport {hideUnshownBandLabels, setBandsToShow};\r\n","/**\r\n * @fileoverview Methods to draw cytogenetic bands and their labels\r\n *\r\n */\r\n\r\nimport {d3} from '../lib';\r\nimport {hideUnshownBandLabels, setBandsToShow} from './show';\r\nimport {staticColors, staticGradients} from './styles';\r\nimport {configuredCss} from './../init/configure';\r\n\r\n/**\r\n * Draws text of cytoband label\r\n */\r\nfunction drawBandLabelText(chr, bandsToLabel, chrModel, textOffsets) {\r\n var ideo = this,\r\n layout = ideo._layout,\r\n chrIndex = chrModel.chrIndex;\r\n\r\n chr.selectAll('text')\r\n .data(bandsToLabel)\r\n .enter()\r\n .append('g')\r\n .attr('class', function(d, i) {\r\n return 'bandLabel bsbsl-' + i;\r\n })\r\n .attr('transform', function(d) {\r\n var transform = layout.getChromosomeBandLabelTranslate(d, chrIndex);\r\n\r\n if (ideo.config.orientation === 'horizontal') {\r\n textOffsets[chrModel.id].push(transform.x + 13);\r\n } else {\r\n textOffsets[chrModel.id].push(transform.y + 6);\r\n }\r\n\r\n return transform.translate;\r\n })\r\n .append('text')\r\n .attr('text-anchor', layout.getChromosomeBandLabelAnchor(chrIndex))\r\n .text(function(d) {return d.name;});\r\n\r\n return textOffsets;\r\n}\r\n\r\n/**\r\n * Draws line between cytoband and its text label\r\n */\r\nfunction drawBandLabelStalk(chr, bandsToLabel, chrModel, textOffsets) {\r\n var ideo = this;\r\n\r\n chr.selectAll('line.bandLabelStalk')\r\n .data(bandsToLabel)\r\n .enter()\r\n .append('g')\r\n .attr('class', function(d, i) {\r\n return 'bandLabelStalk bsbsl-' + i;\r\n })\r\n .attr('transform', function(d) {\r\n var x, y;\r\n\r\n x = ideo.round(d.px.start + d.px.width / 2);\r\n y = -10;\r\n\r\n textOffsets[chrModel.id].push(x + 13);\r\n\r\n return 'translate(' + x + ',' + y + ')';\r\n })\r\n .append('line')\r\n .attr('x1', 0)\r\n .attr('y1', ideo._layout.getChromosomeBandTickY1(chrModel.chrIndex))\r\n .attr('x2', 0)\r\n .attr('y2', ideo._layout.getChromosomeBandTickY2(chrModel.chrIndex));\r\n}\r\n\r\nfunction getChrModels(chromosomes) {\r\n var taxid, chr,\r\n chrModels = [];\r\n\r\n for (taxid in chromosomes) {\r\n for (chr in chromosomes[taxid]) {\r\n chrModels.push(chromosomes[taxid][chr]);\r\n }\r\n }\r\n\r\n return chrModels;\r\n}\r\n\r\n/**\r\n * Draws text and stalks for cytogenetic band labels.\r\n *\r\n * Band labels are text like \"p11.11\".\r\n * Stalks are small lines that visually connect labels to their bands.\r\n */\r\nfunction drawBandLabels(chromosomes) {\r\n var i, chr, chrModel, chrModels, bandsToLabel,\r\n ideo = this,\r\n textOffsets = {};\r\n\r\n chrModels = getChrModels(chromosomes);\r\n\r\n for (i = 0; i < chrModels.length; i++) {\r\n chrModel = chrModels[i];\r\n chr = d3.select(ideo.selector + ' #' + chrModel.id);\r\n textOffsets[chrModel.id] = [];\r\n\r\n // Don't show \"pter\" label for telocentric chromosomes, e.g. mouse\r\n bandsToLabel = chrModel.bands.filter(d => d.name !== 'pter');\r\n\r\n textOffsets =\r\n ideo.drawBandLabelText(chr, bandsToLabel, chrModel, textOffsets);\r\n\r\n ideo.drawBandLabelStalk(chr, bandsToLabel, chrModel, textOffsets);\r\n }\r\n\r\n ideo.setBandsToShow(chrModels, textOffsets);\r\n}\r\n\r\nfunction getStainAndColors(i, colors) {\r\n var stain, color1, color2, color3;\r\n\r\n stain = colors[i][0];\r\n color1 = colors[i][1];\r\n color2 = colors[i][2];\r\n color3 = colors[i][3];\r\n\r\n return [stain, color1, color2, color3];\r\n}\r\n\r\nfunction getGradients(colors) {\r\n var i, stain, color1, color2, color3,\r\n gradients = '';\r\n\r\n for (i = 0; i < colors.length; i++) {\r\n [stain, color1, color2, color3] = getStainAndColors(i, colors);\r\n gradients +=\r\n '';\r\n if (stain === 'gneg') {\r\n gradients +=\r\n '' +\r\n '' +\r\n '';\r\n } else {\r\n gradients +=\r\n '' +\r\n '' +\r\n '';\r\n }\r\n gradients +=\r\n '';\r\n }\r\n\r\n return gradients;\r\n}\r\n\r\n/**\r\n * Returns SVG gradients that give chromosomes a polished look\r\n */\r\nfunction getBandColorGradients() {\r\n var css,\r\n gradients = '';\r\n\r\n gradients = getGradients(staticColors);\r\n\r\n css = ``;\r\n\r\n gradients += staticGradients;\r\n gradients = '' + gradients + '';\r\n gradients = css + gradients;\r\n\r\n return gradients;\r\n}\r\n\r\nexport {\r\n drawBandLabels, getBandColorGradients, hideUnshownBandLabels, setBandsToShow,\r\n drawBandLabelText, drawBandLabelStalk\r\n};\r\n","\r\nfunction getDelimiterTsvLinesAndInit(source, content) {\r\n var delimiter, tsvLines, init;\r\n\r\n if (typeof chrBands === 'undefined' && source !== 'native') {\r\n delimiter = /\\t/;\r\n tsvLines = content.split(/\\r\\n|\\n/);\r\n init = 1;\r\n } else {\r\n delimiter = / /;\r\n tsvLines = content;\r\n init = 0;\r\n }\r\n\r\n return [delimiter, tsvLines, init];\r\n}\r\n\r\nfunction updateChromosomes(chromosomes) {\r\n var tmp, i;\r\n\r\n if (chromosomes instanceof Array && typeof chromosomes[0] === 'object') {\r\n tmp = [];\r\n for (i = 0; i < chromosomes.length; i++) {\r\n tmp.push(chromosomes[i].name);\r\n }\r\n chromosomes = tmp;\r\n }\r\n return chromosomes;\r\n}\r\n\r\nfunction getLineObject(chr, columns, stain, taxid) {\r\n return {\r\n chr: chr,\r\n bp: {\r\n start: parseInt(columns[5], 10),\r\n stop: parseInt(columns[6], 10)\r\n },\r\n iscn: {\r\n start: parseInt(columns[3], 10),\r\n stop: parseInt(columns[4], 10)\r\n },\r\n px: {\r\n start: -1,\r\n stop: -1,\r\n width: -1\r\n },\r\n name: columns[1] + columns[2],\r\n stain: stain,\r\n taxid: taxid\r\n };\r\n}\r\n\r\nfunction getStain(columns) {\r\n var stain = columns[7];\r\n // For e.g. acen and gvar, columns[8] (density) is undefined\r\n if (columns[8]) stain += columns[8];\r\n return stain;\r\n}\r\n\r\nfunction updateLines(lines, columns, taxid) {\r\n var chr, stain, line;\r\n\r\n chr = columns[0];\r\n if (chr in lines === false) lines[chr] = [];\r\n\r\n stain = getStain(columns);\r\n\r\n line = getLineObject(chr, columns, stain, taxid);\r\n lines[chr].push(line);\r\n\r\n return lines;\r\n}\r\n\r\n/**\r\n * Reports if a cytogenetic band should be included in parse results\r\n *\r\n * TODO:\r\n * Normalize ideogram.chromosomes upstream.\r\n *\r\n * This function is complex because ideogram.chromosomes is (likely\r\n * unnecessarily) complex. The \"ideogram.chromosomes\" object can\r\n * take many forms depending on the use case, and this results in\r\n * hard-to-reason-about functions like this.\r\n *\r\n * Normalizing ideogram.chromosomes to a common format somewhere upstream\r\n * would likely make this specific function and Ideogram in general much\r\n * more maintainable.\r\n */\r\nfunction shouldSkipBand(chrs, chr, taxid, ideo) {\r\n\r\n var hasChrs, chrsAreList, chrNotInList, chrsAreObject,\r\n innerChrsAreStrings, matchingChrObjs, chrNotInObject,\r\n multiorganism = ideo.config.multiorganism;\r\n\r\n hasChrs = typeof chrs !== 'undefined' && chrs !== null;\r\n if (!hasChrs) return false;\r\n\r\n chrsAreList = Array.isArray(chrs);\r\n chrNotInList = chrsAreList && chrs.indexOf(chr) === -1;\r\n chrsAreObject = typeof chrs === 'object';\r\n\r\n if (chrsAreList && !chrsAreObject && chrNotInList) return true;\r\n\r\n if (taxid in chrs === false && multiorganism) return false;\r\n\r\n if (!multiorganism) {\r\n // Encountered in single organism when showing subset of all chromosomes,\r\n // e.g. only human X and Y as in https://eweitz.github.io/ideogram/homology-basic\r\n matchingChrObjs = chrs.filter(thisChr => thisChr === chr);\r\n chrNotInObject = matchingChrObjs.length === 0;\r\n } else {\r\n innerChrsAreStrings = typeof chrs[taxid][0] === 'string';\r\n if (innerChrsAreStrings) {\r\n chrNotInObject = chrs[taxid].includes(chr) === false;\r\n } else {\r\n matchingChrObjs = chrs[taxid].filter(thisChr => thisChr.name === chr);\r\n chrNotInObject = matchingChrObjs.length === 0;\r\n }\r\n }\r\n return chrNotInObject;\r\n\r\n}\r\n\r\n/**\r\n * Parses cytogenetic band data from a TSV file, or, if band data is\r\n * prefetched, from an array\r\n *\r\n * NCBI:\r\n * #chromosome arm band iscn_start iscn_stop bp_start bp_stop stain density\r\n * ftp://ftp.ncbi.nlm.nih.gov/pub/gdp/ideogram_9606_GCF_000001305.14_550_V1\r\n */\r\nfunction parseBands(taxid, chromosomes, ideo) {\r\n var delimiter, tsvLines, columns, chr, i, init, source, content,\r\n lines = {};\r\n\r\n content = ideo.bandData[taxid];\r\n\r\n if (Array.isArray(content)) source = 'native';\r\n\r\n chromosomes = updateChromosomes(chromosomes);\r\n\r\n // Destructure assignment fails oddly when transpiled. 2019-05-23\r\n var result = getDelimiterTsvLinesAndInit(source, content);\r\n delimiter = result[0];\r\n tsvLines = result[1];\r\n init = result[2];\r\n\r\n for (i = init; i < tsvLines.length; i++) {\r\n columns = tsvLines[i].split(delimiter);\r\n\r\n chr = columns[0];\r\n if (shouldSkipBand(chromosomes, chr, taxid, ideo)) {\r\n // If specific chromosomes are configured, then skip processing all\r\n // other fetched chromosomes.\r\n continue;\r\n }\r\n\r\n lines = updateLines(lines, columns, taxid);\r\n }\r\n\r\n return lines;\r\n}\r\n\r\nexport {parseBands};\r\n","/**\r\n * @fileoverview Methods for processing chromosome length and banding data.\r\n *\r\n * Ideogram.js depicts chromosomes using data on their length, name, and\r\n * (if dealing with a very well-studied organism) cytogenetic banding data.\r\n * This file processes cytoband data that comes from biological research\r\n * institutions.\r\n *\r\n * For background on cytogenetic bands and how they are used in genomics, see:\r\n * https://ghr.nlm.nih.gov/primer/howgeneswork/genelocation\r\n *\r\n */\r\n\r\nimport {\r\n drawBandLabels, getBandColorGradients, hideUnshownBandLabels, setBandsToShow,\r\n drawBandLabelText, drawBandLabelStalk\r\n} from './draw';\r\nimport {parseBands} from './parse';\r\nimport {organismMetadata} from '../init/organism-metadata';\r\n\r\n/**\r\n * Gets bands array for given chromosomes, sets ideo.maxLength\r\n */\r\nfunction getBandsArray(chromosome, bandsByChr, taxid, ideo) {\r\n var bands, chrLength,\r\n bandsArray = [];\r\n\r\n bands = bandsByChr[chromosome];\r\n bandsArray.push(bands);\r\n\r\n chrLength = {\r\n iscn: bands[bands.length - 1].iscn.stop,\r\n bp: bands[bands.length - 1].bp.stop\r\n };\r\n\r\n if (taxid in ideo.maxLength === false) {\r\n ideo.maxLength[taxid] = {bp: 0, iscn: 0};\r\n }\r\n\r\n if (chrLength.iscn > ideo.maxLength[taxid].iscn) {\r\n ideo.maxLength[taxid].iscn = chrLength.iscn;\r\n if (chrLength.iscn > ideo.maxLength.iscn) {\r\n ideo.maxLength.iscn = chrLength.iscn;\r\n }\r\n }\r\n\r\n if (chrLength.bp > ideo.maxLength[taxid].bp) {\r\n ideo.maxLength[taxid].bp = chrLength.bp;\r\n if (chrLength.bp > ideo.maxLength.bp) {\r\n ideo.maxLength.bp = chrLength.bp;\r\n }\r\n }\r\n\r\n return bandsArray;\r\n}\r\n\r\n/**\r\n * Updates bandsArray, sets ideo.config.chromosomes and ideo.numChromosomes\r\n */\r\nfunction setChrsByTaxidsWithBands(taxid, chrs, bandsArray, ideo) {\r\n var bandsByChr, chromosome, k, chrBandsArray;\r\n\r\n bandsByChr = parseBands(taxid, chrs, ideo);\r\n\r\n chrs = Object.keys(bandsByChr).sort(Ideogram.sortChromosomes);\r\n\r\n if (\r\n 'chromosomes' in ideo.config === false ||\r\n ideo.config.chromosomes === null\r\n ) {\r\n ideo.config.chromosomes = {};\r\n }\r\n if (chrs.length > 0) {\r\n ideo.config.chromosomes[taxid] = chrs.slice();\r\n }\r\n ideo.numChromosomes += ideo.config.chromosomes[taxid].length;\r\n\r\n for (k = 0; k < chrs.length; k++) {\r\n chromosome = chrs[k];\r\n chrBandsArray = getBandsArray(chromosome, bandsByChr, taxid, ideo);\r\n bandsArray = bandsArray.concat(chrBandsArray);\r\n }\r\n\r\n return bandsArray;\r\n}\r\n\r\nfunction setChromosomesByTaxid(taxid, chrs, bandsArray, ideo) {\r\n var chr, i;\r\n\r\n if (\r\n taxid in ideo.bandData ||\r\n taxid in organismMetadata &&\r\n ideo.assemblyIsAccession() === false\r\n ) {\r\n bandsArray = setChrsByTaxidsWithBands(taxid, chrs, bandsArray, ideo);\r\n } else {\r\n // If lacking band-level data\r\n ideo.numChromosomes += chrs.length;\r\n\r\n for (i = 0; i < chrs.length; i++) {\r\n chr = chrs[i];\r\n if (chr.length > ideo.maxLength.bp) ideo.maxLength.bp = chr.length;\r\n }\r\n }\r\n\r\n return bandsArray;\r\n}\r\n\r\nfunction reportPerformance(t0, ideo) {\r\n var t1 = new Date().getTime();\r\n if (ideo.config.debug) {\r\n console.log('Time in processBandData: ' + (t1 - t0) + ' ms');\r\n }\r\n}\r\n\r\n/**\r\n * Completes default ideogram initialization by calling downstream functions\r\n * to process raw band data into full JSON objects, render chromosome and\r\n * cytoband figures and labels, apply initial graphical transformations,\r\n * hide overlapping band labels, and execute callbacks defined by client code\r\n */\r\nfunction processBandData(taxid) {\r\n console.log(taxid)\r\n var bandsArray, chrs,\r\n ideo = this,\r\n config = ideo.config,\r\n t0 = new Date().getTime();\r\n\r\n bandsArray = [];\r\n\r\n if ('chromosomes' in config) {\r\n if (config.multiorganism) {\r\n // Copy object\r\n chrs = config.chromosomes;\r\n } else if (taxid in config.chromosomes) {\r\n // Copy array by value\r\n chrs = config.chromosomes[taxid].slice();\r\n } else {\r\n // Copy array by value. Needed for e.g. \"Homology, basic\"\r\n chrs = config.chromosomes.slice();\r\n }\r\n }\r\n\r\n bandsArray = setChromosomesByTaxid(taxid, chrs, bandsArray, ideo);\r\n\r\n reportPerformance(t0, ideo);\r\n return [taxid, bandsArray];\r\n}\r\n\r\nexport {\r\n drawBandLabels, getBandColorGradients, processBandData,\r\n setBandsToShow, hideUnshownBandLabels, drawBandLabelText, drawBandLabelStalk\r\n};\r\n","/**\r\n * @fileoverview Methods to create and handle a brush on a chromosome.\r\n *\r\n * Ideogram.js enables users to display a box around part of a chromosome\r\n * that represents a \"currently selected\" region. The user can move this\r\n * box like a sliding window, e.g. by clicking and dragging the mouse.\r\n *\r\n * For background, see:\r\n * https://github.com/d3/d3-brush\r\n */\r\n\r\nimport {d3} from './lib';\r\n\r\n/**\r\n * Custom event handler, fired upon dragging sliding window on chromosome\r\n */\r\nfunction onBrushMove() {\r\n call(this.onBrushMoveCallback);\r\n}\r\n\r\nfunction onBrushEnd() {\r\n call(this.onBrushEndCallback);\r\n}\r\n\r\nfunction setBrush(bpDomain, pxRange, xOffset, width, ideo) {\r\n var xScale,\r\n length = ideo.config.chrHeight;\r\n\r\n xScale = d3.scaleLinear().domain(bpDomain).range(pxRange);\r\n\r\n ideo.brush = d3.brushX()\r\n .extent([[xOffset, 0], [length + xOffset, width]])\r\n .on('brush', _onBrushMove)\r\n .on('end', _onBrushEnd);\r\n\r\n function _onBrushMove({selection}) {\r\n var extent = selection.map(xScale.invert),\r\n from = Math.floor(extent[0]),\r\n to = Math.ceil(extent[1]);\r\n\r\n ideo.selectedRegion = {from: from, to: to, extent: (to - from)};\r\n\r\n if (ideo.onBrushMoveCallback) {\r\n ideo.onBrushMoveCallback();\r\n }\r\n }\r\n\r\n function _onBrushEnd({selection}) {\r\n if (ideo.onBrushEndCallback) {\r\n ideo.onBrushEndCallback();\r\n }\r\n }\r\n}\r\n\r\nfunction getBasePairDomainAndPixelRange(chrModel, xOffset) {\r\n var band, i,\r\n bpDomain = [1],\r\n pxRange = [1],\r\n lastBand = chrModel.bands.slice(-1)[0];\r\n\r\n for (i = 0; i < chrModel.bands.length; i++) {\r\n band = chrModel.bands[i];\r\n bpDomain.push(band.bp.start);\r\n pxRange.push(band.px.start + xOffset);\r\n }\r\n\r\n bpDomain.push(lastBand.bp.stop - 1);\r\n pxRange.push(lastBand.px.stop + xOffset);\r\n\r\n return [bpDomain, pxRange];\r\n}\r\n\r\n/**\r\n * Account for calls like createBrush('chr1:104325484-119977655')\r\n */\r\nfunction refineGenomicCoordinates(chr, from, to) {\r\n var nameSplit, fromToSplit;\r\n\r\n // Account for calls like createBrush('chr1:104325484-119977655')\r\n nameSplit = chr.split(':');\r\n fromToSplit = chr.split('-');\r\n if (nameSplit.length > 1 && fromToSplit.length > 1) {\r\n chr = nameSplit[0].replace('chr', '');\r\n fromToSplit = nameSplit[1].split('-');\r\n from = parseInt(fromToSplit[0]);\r\n to = parseInt(fromToSplit[1] - 1);\r\n }\r\n\r\n return [chr, from, to];\r\n}\r\n\r\nfunction getChrModel(chr, ideo) {\r\n var i, cm, chrModel;\r\n\r\n for (i = 0; i < ideo.chromosomesArray.length; i++) {\r\n cm = ideo.chromosomesArray[i];\r\n if (cm.name === chr) {\r\n chrModel = cm;\r\n return chrModel;\r\n }\r\n }\r\n}\r\n\r\nfunction writeBrush(chrModel, from, to, xOffset, width, ideo) {\r\n var x0, x1, yTranslate, yOffset;\r\n\r\n x0 = ideo.convertBpToPx(chrModel, from) + xOffset;\r\n x1 = ideo.convertBpToPx(chrModel, to) + xOffset;\r\n\r\n yTranslate = ideo._layout.getChromosomeSetYTranslate(0);\r\n yOffset = yTranslate + (ideo.config.chrWidth - width) / 2;\r\n\r\n d3.select(ideo.selector).append('g')\r\n .attr('class', 'brush')\r\n .attr('transform', 'translate(0, ' + yOffset + ')')\r\n .call(ideo.brush)\r\n .call(ideo.brush.move, [x0, x1]);\r\n}\r\n\r\nfunction setSelectedRegion(from, to, ideo) {\r\n // Genomics web UIs are 1-based, fully closed.\r\n // I.e. If start = 20 bp and stop = 10 bp, then extent = 11 bp.\r\n // Details:\r\n // http://genome.ucsc.edu/blog/the-ucsc-genome-browser-coordinate-counting-systems/\r\n // https://www.biostars.org/p/84686/\r\n var extent = to - from + 1;\r\n ideo.selectedRegion = {from: from, to: to, extent: extent};\r\n}\r\n\r\n/**\r\n * Creates a sliding window along a chromosome\r\n *\r\n * @param chr Chromosome name (e.g. 1) or range, e.g. chr1:104325484-119977655\r\n * @param from Genomic start coordinate in base pairs, e.g. 104325484\r\n * @param to Genomic end coordinate in base pairs, e.g. 119977655\r\n */\r\nfunction createBrush(chr, from, to) {\r\n var chrModel, chrLengthBp, bpDomain, pxRange, lastBand,\r\n ideo = this,\r\n width = ideo.config.chrWidth + 6.5,\r\n xOffset = ideo._layout.margin.left;\r\n\r\n [chr, from, to] = refineGenomicCoordinates(chr, from, to);\r\n\r\n chrModel = getChrModel(chr, ideo);\r\n\r\n [bpDomain, pxRange] = getBasePairDomainAndPixelRange(chrModel, xOffset);\r\n\r\n lastBand = chrModel.bands.slice(-1)[0];\r\n chrLengthBp = lastBand.bp.stop;\r\n\r\n if (typeof from === 'undefined') from = Math.floor(chrLengthBp / 10);\r\n if (typeof to === 'undefined') to = Math.ceil(from * 2);\r\n\r\n setBrush(bpDomain, pxRange, xOffset, width, ideo);\r\n\r\n setSelectedRegion(from, to, ideo);\r\n writeBrush(chrModel, from, to, xOffset, width, ideo);\r\n}\r\n\r\nexport {onBrushMove, onBrushEnd, createBrush};\r\n","/**\r\n * @fileoverview Allows a click event handler to be attached to the ideogram\r\n *\r\n * This works similar to the \"brush\" which allows a region to be selected.\r\n * The click handler does not allow a region, but a precise location.\r\n *\r\n */\r\n\r\nimport {d3} from './lib';\r\n\r\n/**\r\n * Custom event handler, fired upon clicks on the chromosome (to change\r\n * position)\r\n */\r\nfunction onCursorMove() {\r\n call(this.onCursorMoveCallback);\r\n}\r\n\r\nfunction setCursor(position, bpDomain, pxRange, xOffset, width, ideo) {\r\n var xScale;\r\n\r\n xScale = d3.scaleLinear().domain(bpDomain).range(pxRange);\r\n\r\n if (!('rotatable' in ideo.config && ideo.config.rotatable === false)) {\r\n console.warn('Using the cursor with rotate is not supported.');\r\n }\r\n\r\n var yTranslate = ideo._layout.getChromosomeSetYTranslate(0);\r\n var yOffset = yTranslate + (ideo.config.chrWidth - width) / 2;\r\n\r\n // TODO: check if newPosition is valid value (in range)\r\n\r\n var cursorBrush = d3.select(ideo.selector).append('g')\r\n .attr('class', 'brush')\r\n .attr('transform', 'translate(0, ' + yOffset + ')')\r\n .append('rect')\r\n .attr('class', 'cursor')\r\n .attr('x', xScale(position))\r\n .attr('y', 0)\r\n .attr('width', 1) // this could be a configuration param\r\n .attr('height', 30); // MAGIC NUMBER! need help with this one\r\n\r\n // call the callback for the first time (onLoad)\r\n if (ideo.onCursorMove) {\r\n ideo.onCursorMoveCallback(position);\r\n }\r\n\r\n if (!ideo.setCursorPosition) {\r\n ideo.setCursorPosition = function(newPosition) {\r\n // TODO: check if newPosition is valid value (in range)\r\n cursorBrush.attr('x', xScale(newPosition));\r\n if (ideo.onCursorMove) {\r\n ideo.onCursorMoveCallback(newPosition);\r\n }\r\n };\r\n }\r\n\r\n d3.selectAll(ideo.selector + ' .chromosome').on('click', function(event) {\r\n var x = event.offsetX; // minimum value seems to be 25\r\n\r\n // adjust for screen (6 is a magic number that seems to work)\r\n x -=6;\r\n\r\n // move the cursor\r\n cursorBrush.attr('x', x);\r\n\r\n // calculate the new position and perform callback\r\n var newPosition = Math.floor(xScale.invert(x));\r\n if (ideo.onCursorMove) {\r\n ideo.onCursorMoveCallback(newPosition);\r\n }\r\n });\r\n}\r\n\r\nfunction getBasePairDomainAndPixelRange(chrModel, xOffset) {\r\n var band, i,\r\n bpDomain = [1],\r\n pxRange = [1],\r\n lastBand = chrModel.bands.slice(-1)[0];\r\n\r\n for (i = 0; i < chrModel.bands.length; i++) {\r\n band = chrModel.bands[i];\r\n bpDomain.push(band.bp.start);\r\n pxRange.push(band.px.start + xOffset);\r\n }\r\n\r\n bpDomain.push(lastBand.bp.stop - 1);\r\n pxRange.push(lastBand.px.stop + xOffset);\r\n\r\n return [bpDomain, pxRange];\r\n}\r\n\r\nfunction getChrModel(chr, ideo) {\r\n var i, cm, chrModel;\r\n\r\n for (i = 0; i < ideo.chromosomesArray.length; i++) {\r\n cm = ideo.chromosomesArray[i];\r\n if (cm.name === chr) {\r\n chrModel = cm;\r\n return chrModel;\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Creates a clickable cursor along a chromosome.\r\n *\r\n * @param position Genomic start coordinate in base pairs, e.g. 104325484\r\n */\r\nfunction createClickCursor(position) {\r\n var chrModel, bpDomain,\r\n pxRange,\r\n ideo = this,\r\n width = ideo.config.chrWidth + 6.5, // 6.5 magic number?\r\n xOffset = ideo._layout.margin.left;\r\n\r\n if (typeof position === 'undefined') {\r\n return false;\r\n }\r\n\r\n chrModel = getChrModel(ideo.config.chromosome, ideo);\r\n [bpDomain, pxRange] = getBasePairDomainAndPixelRange(chrModel, xOffset);\r\n\r\n // call setCursor to complete the job.\r\n setCursor(position, bpDomain, pxRange, xOffset, width, ideo);\r\n}\r\n\r\nexport {onCursorMove, createClickCursor};\r\n","/**\r\n * @fileoverview Instance methods for sex chromosomes (allosomes).\r\n *\r\n * This module provides methods for drawing karyotypically normal\r\n * male and female mammalian genomes.\r\n */\r\n\r\n/**\r\n * Appends SVG elements depicting sex chromosomes to the document.\r\n */\r\nfunction drawSexChromosomes(container, chrIndex) {\r\n var bandsArray, taxid, chrs,\r\n sexChromosomeIndexes, sciLength,\r\n chromosome, bands, chrModel, sci, homologIndex;\r\n\r\n bandsArray = this.bandsArray;\r\n taxid = this.config.taxid;\r\n chrs = this.config.chromosomes[taxid];\r\n\r\n if (this.config.sex === 'male') {\r\n sexChromosomeIndexes = [1, 0];\r\n } else {\r\n sexChromosomeIndexes = [0, 0];\r\n }\r\n\r\n sciLength = sexChromosomeIndexes.length;\r\n\r\n for (homologIndex = 0; homologIndex < sciLength; homologIndex++) {\r\n sci = sexChromosomeIndexes[homologIndex] + chrIndex;\r\n chromosome = chrs[sci];\r\n bands = bandsArray[taxid][sci];\r\n chrModel = this.getChromosomeModel(bands, chromosome, taxid, sci);\r\n this.appendHomolog(chrModel, chrIndex, homologIndex, container);\r\n }\r\n}\r\n\r\n/**\r\n * Sets instance properties regarding sex chromosomes.\r\n * Currently only supported for mammals.\r\n * TODO: Support all sexually reproducing taxa\r\n * XY sex-determination (mammals):\r\n * - Male: XY <- heterogametic\r\n * - Female: XX\r\n * ZW sex-determination (birds):\r\n * - Male: ZZ\r\n * - Female: ZW <- heterogametic\r\n * X0 sex-determination (some insects):\r\n * - Male: X0, i.e. only X <- heterogametic?\r\n * - Female: XX\r\n * TODO: Support sex chromosome aneuploidies in mammals\r\n * - Turner syndrome: X0\r\n * - Klinefelter syndome: XXY\r\n * More types:\r\n * https://en.wikipedia.org/wiki/Category:Sex_chromosome_aneuploidies\r\n */\r\nfunction setSexChromosomes(chrs) {\r\n var chr, i,\r\n ideo = this,\r\n sexChrs = {X: 1, Y: 1};\r\n\r\n if (this.config.ploidy !== 2 || !this.config.sex) return;\r\n\r\n ideo.sexChromosomes.list = [];\r\n\r\n for (i = 0; i < chrs.length; i++) {\r\n chr = chrs[i];\r\n if (ideo.config.sex === 'male' && chr in sexChrs) {\r\n ideo.sexChromosomes.list.push(chr);\r\n if (!ideo.sexChromosomes.index) {\r\n ideo.sexChromosomes.index = i;\r\n }\r\n } else if (chr === 'X') {\r\n ideo.sexChromosomes.list.push(chr, chr);\r\n ideo.sexChromosomes.index = i;\r\n }\r\n }\r\n}\r\n\r\nexport {drawSexChromosomes, setSexChromosomes};\r\n","/**\r\n * @fileoverview Methods to convert to and from different types of coordinates.\r\n *\r\n * Ideogram.js uses multiple coordinate systems, e.g. base pairs (bp) and\r\n * pixels (px). These methods interconvert between those coordinate systems.\r\n *\r\n * TODO:\r\n * - Add methods to interconvert between ISCN coordinates and base pairs,\r\n * pixels.\r\n */\r\n\r\nfunction throwBpToPxError(bp, chr, band) {\r\n throw new Error(\r\n 'Base pair out of range. ' +\r\n 'bp: ' + bp + '; length of chr' + chr.name + ': ' + band.bp.stop\r\n );\r\n}\r\n\r\nfunction getPx(chr, bp) {\r\n var i, px, band, bpToIscnScale, iscn, iscnStart, iscnStop, iscnLength,\r\n bpStart, bpStop, bpLength, pxStart, pxLength;\r\n\r\n for (i = 0; i < chr.bands.length; i++) {\r\n band = chr.bands[i];\r\n bpStart = band.bp.start;\r\n bpStop = band.bp.stop;\r\n bpLength = bpStop - bpStart;\r\n iscnStart = band.iscn.start;\r\n iscnStop = band.iscn.stop;\r\n iscnLength = iscnStop - iscnStart;\r\n pxStart = band.px.start;\r\n pxLength = band.px.width;\r\n\r\n if (bp >= bpStart && bp <= bpStop) {\r\n bpToIscnScale = iscnLength / bpLength;\r\n iscn = iscnStart + (bp - bpStart) * bpToIscnScale;\r\n px = pxStart + (pxLength * (iscn - iscnStart) / (iscnLength));\r\n\r\n return [px, band];\r\n }\r\n }\r\n return [null, band];\r\n}\r\n\r\n/**\r\n * Converts base pair coordinates to pixel offsets.\r\n * Bp-to-pixel scales differ among cytogenetic bands.\r\n *\r\n * For example, if we want to depict a gene on a chromosome, then we need\r\n * to convert the gene's location in base pairs to a location in pixels offset\r\n * from the start of the chromosome.\r\n */\r\nfunction convertBpToPx(chr, bp) {\r\n var band, px;\r\n\r\n if (chr.bands.length > 1 || chr.name === 'MT') {\r\n [px, band] = getPx(chr, bp);\r\n if (px !== null) return px;\r\n } else if (bp >= 1 && bp <= chr.length) {\r\n px = chr.scale.bp * bp;\r\n return px;\r\n }\r\n\r\n throwBpToPxError(bp, chr, band);\r\n}\r\n\r\nfunction throwPxToBpError(px, chr, pxStop) {\r\n throw new Error(\r\n 'Pixel out of range. ' +\r\n 'px: ' + px + '; length of chr' + chr.name + ': ' + pxStop\r\n );\r\n}\r\n\r\nfunction getBp(iscnStop, iscnStart, px, pxStop, pxStart, band, iscnLength) {\r\n var pxLength, bpLength, pxToIscnScale, iscn, bp;\r\n\r\n iscnLength = iscnStop - iscnStart;\r\n pxLength = pxStop - pxStart;\r\n bpLength = band.bp.stop - band.bp.start;\r\n\r\n pxToIscnScale = iscnLength / pxLength;\r\n iscn = iscnStart + (px - pxStart) * pxToIscnScale;\r\n\r\n bp = band.bp.start + (bpLength * (iscn - iscnStart) / iscnLength);\r\n\r\n return Math.round(bp);\r\n}\r\n\r\n/**\r\n * Converts pixel offsets to base pair coordinates.\r\n * Pixel-to-bp scales differ among cytogenetic bands.\r\n *\r\n * For example, if we want to determine the genomic location a user clicked on\r\n * (e.g. when creating a brush / sliding window region), then we need to\r\n * convert pixels to base pairs.\r\n */\r\nfunction convertPxToBp(chr, px) {\r\n var i, band, bp, pxStart, pxStop, iscnStart, iscnStop, iscnLength;\r\n\r\n if (px === 0) {\r\n px = chr.bands[0].px.start;\r\n }\r\n\r\n for (i = 0; i < chr.bands.length; i++) {\r\n band = chr.bands[i];\r\n\r\n pxStart = band.px.start;\r\n pxStop = band.px.stop;\r\n iscnStart = band.iscn.start;\r\n iscnStop = band.iscn.stop;\r\n\r\n if (px >= pxStart && px <= pxStop) {\r\n bp = getBp(iscnStop, iscnStart, px, pxStop, pxStart, band, iscnLength);\r\n return bp;\r\n }\r\n }\r\n throwPxToBpError(px, chr, pxStop);\r\n}\r\n\r\nexport {convertBpToPx, convertPxToBp};\r\n","let array8 = arrayUntyped,\n array16 = arrayUntyped,\n array32 = arrayUntyped,\n arrayLengthen = arrayLengthenUntyped,\n arrayWiden = arrayWidenUntyped;\nif (typeof Uint8Array !== \"undefined\") {\n array8 = function(n) { return new Uint8Array(n); };\n array16 = function(n) { return new Uint16Array(n); };\n array32 = function(n) { return new Uint32Array(n); };\n\n arrayLengthen = function(array, length) {\n if (array.length >= length) return array;\n var copy = new array.constructor(length);\n copy.set(array);\n return copy;\n };\n\n arrayWiden = function(array, width) {\n var copy;\n switch (width) {\n case 16: copy = array16(array.length); break;\n case 32: copy = array32(array.length); break;\n default: throw new Error(\"invalid array width!\");\n }\n copy.set(array);\n return copy;\n };\n}\n\nfunction arrayUntyped(n) {\n var array = new Array(n), i = -1;\n while (++i < n) array[i] = 0;\n return array;\n}\n\nfunction arrayLengthenUntyped(array, length) {\n var n = array.length;\n while (n < length) array[n++] = 0;\n return array;\n}\n\nfunction arrayWidenUntyped(array, width) {\n if (width > 32) throw new Error(\"invalid array width!\");\n return array;\n}\n\n// An arbitrarily-wide array of bitmasks\nfunction bitarray(n) {\n this.length = n;\n this.subarrays = 1;\n this.width = 8;\n this.masks = {\n 0: 0\n }\n\n this[0] = array8(n);\n}\n\nbitarray.prototype.lengthen = function(n) {\n var i, len;\n for (i = 0, len = this.subarrays; i < len; ++i) {\n this[i] = arrayLengthen(this[i], n);\n }\n this.length = n;\n};\n\n// Reserve a new bit index in the array, returns {offset, one}\nbitarray.prototype.add = function() {\n var m, w, one, i, len;\n\n for (i = 0, len = this.subarrays; i < len; ++i) {\n m = this.masks[i];\n w = this.width - (32 * i);\n // isolate the rightmost zero bit and return it as an unsigned int of 32 bits, if NaN or -1, return a 0 \n one = (~m & (m + 1)) >>> 0;\n\n if (w >= 32 && !one) {\n continue;\n }\n\n if (w < 32 && (one & (1 << w))) {\n // widen this subarray\n this[i] = arrayWiden(this[i], w <<= 1);\n this.width = 32 * i + w;\n }\n\n this.masks[i] |= one;\n\n return {\n offset: i,\n one: one\n };\n }\n\n // add a new subarray\n this[this.subarrays] = array8(this.length);\n this.masks[this.subarrays] = 1;\n this.width += 8;\n return {\n offset: this.subarrays++,\n one: 1\n };\n};\n\n// Copy record from index src to index dest\nbitarray.prototype.copy = function(dest, src) {\n var i, len;\n for (i = 0, len = this.subarrays; i < len; ++i) {\n this[i][dest] = this[i][src];\n }\n};\n\n// Truncate the array to the given length\nbitarray.prototype.truncate = function(n) {\n var i, len;\n for (i = 0, len = this.subarrays; i < len; ++i) {\n for (var j = this.length - 1; j >= n; j--) {\n this[i][j] = 0;\n }\n }\n this.length = n;\n};\n\n// Checks that all bits for the given index are 0\nbitarray.prototype.zero = function(n) {\n var i, len;\n for (i = 0, len = this.subarrays; i < len; ++i) {\n if (this[i][n]) {\n return false;\n }\n }\n return true;\n};\n\n// Checks that all bits for the given index are 0 except for possibly one\nbitarray.prototype.zeroExcept = function(n, offset, zero) {\n var i, len;\n for (i = 0, len = this.subarrays; i < len; ++i) {\n if (i === offset ? this[i][n] & zero : this[i][n]) {\n return false;\n }\n }\n return true;\n};\n\n// Checks that all bits for the given index are 0 except for the specified mask.\n// The mask should be an array of the same size as the filter subarrays width.\nbitarray.prototype.zeroExceptMask = function(n, mask) {\n var i, len;\n for (i = 0, len = this.subarrays; i < len; ++i) {\n if (this[i][n] & mask[i]) {\n return false;\n }\n }\n return true;\n}\n\n// Checks that only the specified bit is set for the given index\nbitarray.prototype.only = function(n, offset, one) {\n var i, len;\n for (i = 0, len = this.subarrays; i < len; ++i) {\n if (this[i][n] != (i === offset ? one : 0)) {\n return false;\n }\n }\n return true;\n};\n\n// Checks that only the specified bit is set for the given index except for possibly one other\nbitarray.prototype.onlyExcept = function(n, offset, zero, onlyOffset, onlyOne) {\n var mask;\n var i, len;\n for (i = 0, len = this.subarrays; i < len; ++i) {\n mask = this[i][n];\n if (i === offset)\n mask &= zero;\n if (mask != (i === onlyOffset ? onlyOne : 0)) {\n return false;\n }\n }\n return true;\n};\n\nexport default {\n array8: arrayUntyped,\n array16: arrayUntyped,\n array32: arrayUntyped,\n arrayLengthen: arrayLengthenUntyped,\n arrayWiden: arrayWidenUntyped,\n bitarray: bitarray\n};\n","const filterExact = (bisect, value) => {\n return function(values) {\n var n = values.length;\n return [bisect.left(values, value, 0, n), bisect.right(values, value, 0, n)];\n };\n}\n\nconst filterRange = (bisect, range) => {\n var min = range[0],\n max = range[1];\n return function(values) {\n var n = values.length;\n return [bisect.left(values, min, 0, n), bisect.left(values, max, 0, n)];\n };\n}\n\nconst filterAll = values => {\n return [0, values.length];\n}\n\nexport default {\n filterExact,\n filterRange,\n filterAll\n};\n","export default d => {\n return d;\n};\n","export default () => {\n return null;\n}\n","export default () => {\n return 0;\n}\n","import identity from './identity';\n\nfunction heap_by(f) {\n\n // Builds a binary heap within the specified array a[lo:hi]. The heap has the\n // property such that the parent a[lo+i] is always less than or equal to its\n // two children: a[lo+2*i+1] and a[lo+2*i+2].\n function heap(a, lo, hi) {\n var n = hi - lo,\n i = (n >>> 1) + 1;\n while (--i > 0) sift(a, i, n, lo);\n return a;\n }\n\n // Sorts the specified array a[lo:hi] in descending order, assuming it is\n // already a heap.\n function sort(a, lo, hi) {\n var n = hi - lo,\n t;\n while (--n > 0) t = a[lo], a[lo] = a[lo + n], a[lo + n] = t, sift(a, 1, n, lo);\n return a;\n }\n\n // Sifts the element a[lo+i-1] down the heap, where the heap is the contiguous\n // slice of array a[lo:lo+n]. This method can also be used to update the heap\n // incrementally, without incurring the full cost of reconstructing the heap.\n function sift(a, i, n, lo) {\n var d = a[--lo + i],\n x = f(d),\n child;\n while ((child = i << 1) <= n) {\n if (child < n && f(a[lo + child]) > f(a[lo + child + 1])) child++;\n if (x <= f(a[lo + child])) break;\n a[lo + i] = a[lo + child];\n i = child;\n }\n a[lo + i] = d;\n }\n\n heap.sort = sort;\n return heap;\n}\n\nconst h = heap_by(identity);\nh.by = heap_by;\n\nexport default h;\n","import identity from './identity';\nimport xFilterHeap from './heap';\n\nfunction heapselect_by(f) {\n var heap = xFilterHeap.by(f);\n\n // Returns a new array containing the top k elements in the array a[lo:hi].\n // The returned array is not sorted, but maintains the heap property. If k is\n // greater than hi - lo, then fewer than k elements will be returned. The\n // order of elements in a is unchanged by this operation.\n function heapselect(a, lo, hi, k) {\n var queue = new Array(k = Math.min(hi - lo, k)),\n min,\n i,\n d;\n\n for (i = 0; i < k; ++i) queue[i] = a[lo++];\n heap(queue, 0, k);\n\n if (lo < hi) {\n min = f(queue[0]);\n do {\n if (f(d = a[lo]) > min) {\n queue[0] = d;\n min = f(heap(queue, 0, k)[0]);\n }\n } while (++lo < hi);\n }\n\n return queue;\n }\n\n return heapselect;\n}\n\n\nconst h = heapselect_by(identity);\nh.by = heapselect_by; // assign the raw function to the export as well\n\nexport default h;\n","import identity from './identity';\n\nfunction bisect_by(f) {\n\n // Locate the insertion point for x in a to maintain sorted order. The\n // arguments lo and hi may be used to specify a subset of the array which\n // should be considered; by default the entire array is used. If x is already\n // present in a, the insertion point will be before (to the left of) any\n // existing entries. The return value is suitable for use as the first\n // argument to `array.splice` assuming that a is already sorted.\n //\n // The returned insertion point i partitions the array a into two halves so\n // that all v < x for v in a[lo:i] for the left side and all v >= x for v in\n // a[i:hi] for the right side.\n function bisectLeft(a, x, lo, hi) {\n while (lo < hi) {\n var mid = lo + hi >>> 1;\n if (f(a[mid]) < x) lo = mid + 1;\n else hi = mid;\n }\n return lo;\n }\n\n // Similar to bisectLeft, but returns an insertion point which comes after (to\n // the right of) any existing entries of x in a.\n //\n // The returned insertion point i partitions the array into two halves so that\n // all v <= x for v in a[lo:i] for the left side and all v > x for v in\n // a[i:hi] for the right side.\n function bisectRight(a, x, lo, hi) {\n while (lo < hi) {\n var mid = lo + hi >>> 1;\n if (x < f(a[mid])) hi = mid;\n else lo = mid + 1;\n }\n return lo;\n }\n\n bisectRight.right = bisectRight;\n bisectRight.left = bisectLeft;\n return bisectRight;\n}\n\nconst bisect = bisect_by(identity);\nbisect.by = bisect_by; // assign the raw function to the export as well\n\nexport default bisect;\n\n","export default (array, index, deep) => {\n for (var i = 0, n = index.length, copy = deep ? JSON.parse(JSON.stringify(array)) : new Array(n); i < n; ++i) {\n copy[i] = array[index[i]];\n }\n return copy;\n}\n","const reduceIncrement = p => {\n return p + 1;\n}\n\nconst reduceDecrement = p => {\n return p - 1;\n}\n\nconst reduceAdd = f => {\n return function(p, v) {\n return p + +f(v);\n };\n}\n\nconst reduceSubtract = f => {\n return function(p, v) {\n return p - f(v);\n };\n}\n\nexport default {\n reduceIncrement,\n reduceDecrement,\n reduceAdd,\n reduceSubtract\n};\n","import deep from \"@ranfdev/deepobj\"\n// Note(cg): result was previsouly using lodash.result, not ESM compatible.\n \nconst get = (obj, prop) => {\n const value = obj[prop];\n return (typeof value === 'function') ? value.call(obj) : value;\n}\n\n/**\n * get value of object at a deep path.\n * if the resolved value is a function,\n * it's invoked with the `this` binding of \n * its parent object and its result is returned. \n * \n * @param {Object} obj the object (e.g. { 'a': [{ 'b': { 'c1': 3, 'c2': 4} }], 'd': {e:1} }; )\n * @param {String} path deep path (e.g. `d.e`` or `a[0].b.c1`. Dot notation (a.0.b)is also supported)\n * @return {Any} the resolved value\n */\nconst reg = /\\[([\\w\\d]+)\\]/g;\nexport default (obj, path) => {\n return deep(get, obj, path.replace(reg, '.$1'))\n}\n","export default function(t,e,i,n,r){for(r in n=(i=i.split(\".\")).splice(-1,1),i)e=e[i[r]]=e[i[r]]||{};return t(e,n)};\n//# sourceMappingURL=deepobj.m.js.map\n","import xfilterArray from './array';\nimport xfilterFilter from './filter';\nimport cr_identity from './identity';\nimport cr_null from './null';\nimport cr_zero from './zero';\nimport xfilterHeapselect from './heapselect';\nimport xfilterHeap from './heap';\nimport bisect from './bisect';\nimport permute from './permute';\nimport xfilterReduce from './reduce';\nimport result from './result';\n\n// constants\nvar REMOVED_INDEX = -1;\n\ncrossfilter.heap = xfilterHeap;\ncrossfilter.heapselect = xfilterHeapselect;\ncrossfilter.bisect = bisect;\ncrossfilter.permute = permute;\nexport default crossfilter;\n\nfunction crossfilter() {\n var crossfilter = {\n add: add,\n remove: removeData,\n dimension: dimension,\n groupAll: groupAll,\n size: size,\n all: all,\n allFiltered: allFiltered,\n onChange: onChange,\n isElementFiltered: isElementFiltered\n };\n\n var data = [], // the records\n n = 0, // the number of records; data.length\n filters, // 1 is filtered out\n filterListeners = [], // when the filters change\n dataListeners = [], // when data is added\n removeDataListeners = [], // when data is removed\n callbacks = [];\n\n filters = new xfilterArray.bitarray(0);\n\n // Adds the specified new records to this crossfilter.\n function add(newData) {\n var n0 = n,\n n1 = newData.length;\n\n // If there's actually new data to add…\n // Merge the new data into the existing data.\n // Lengthen the filter bitset to handle the new records.\n // Notify listeners (dimensions and groups) that new data is available.\n if (n1) {\n data = data.concat(newData);\n filters.lengthen(n += n1);\n dataListeners.forEach(function(l) { l(newData, n0, n1); });\n triggerOnChange('dataAdded');\n }\n\n return crossfilter;\n }\n\n // Removes all records that match the current filters, or if a predicate function is passed,\n // removes all records matching the predicate (ignoring filters).\n function removeData(predicate) {\n var // Mapping from old record indexes to new indexes (after records removed)\n newIndex = new Array(n),\n removed = [],\n usePred = typeof predicate === 'function',\n shouldRemove = function (i) {\n return usePred ? predicate(data[i], i) : filters.zero(i)\n };\n\n for (var index1 = 0, index2 = 0; index1 < n; ++index1) {\n if ( shouldRemove(index1) ) {\n removed.push(index1);\n newIndex[index1] = REMOVED_INDEX;\n } else {\n newIndex[index1] = index2++;\n }\n }\n\n // Remove all matching records from groups.\n filterListeners.forEach(function(l) { l(-1, -1, [], removed, true); });\n\n // Update indexes.\n removeDataListeners.forEach(function(l) { l(newIndex); });\n\n // Remove old filters and data by overwriting.\n for (var index3 = 0, index4 = 0; index3 < n; ++index3) {\n if ( newIndex[index3] !== REMOVED_INDEX ) {\n if (index3 !== index4) filters.copy(index4, index3), data[index4] = data[index3];\n ++index4;\n }\n }\n\n data.length = n = index4;\n filters.truncate(index4);\n triggerOnChange('dataRemoved');\n }\n\n function maskForDimensions(dimensions) {\n var n,\n d,\n len,\n id,\n mask = Array(filters.subarrays);\n for (n = 0; n < filters.subarrays; n++) { mask[n] = ~0; }\n for (d = 0, len = dimensions.length; d < len; d++) {\n // The top bits of the ID are the subarray offset and the lower bits are the bit\n // offset of the \"one\" mask.\n id = dimensions[d].id();\n mask[id >> 7] &= ~(0x1 << (id & 0x3f));\n }\n return mask;\n }\n\n // Return true if the data element at index i is filtered IN.\n // Optionally, ignore the filters of any dimensions in the ignore_dimensions list.\n function isElementFiltered(i, ignore_dimensions) {\n var mask = maskForDimensions(ignore_dimensions || []);\n return filters.zeroExceptMask(i,mask);\n }\n\n // Adds a new dimension with the specified value accessor function.\n function dimension(value, iterable) {\n\n if (typeof value === 'string') {\n var accessorPath = value;\n value = function(d) { return result(d, accessorPath); };\n }\n\n var dimension = {\n filter: filter,\n filterExact: filterExact,\n filterRange: filterRange,\n filterFunction: filterFunction,\n filterAll: filterAll,\n currentFilter: currentFilter,\n hasCurrentFilter: hasCurrentFilter,\n top: top,\n bottom: bottom,\n group: group,\n groupAll: groupAll,\n dispose: dispose,\n remove: dispose, // for backwards-compatibility\n accessor: value,\n id: function() { return id; }\n };\n\n var one, // lowest unset bit as mask, e.g., 00001000\n zero, // inverted one, e.g., 11110111\n offset, // offset into the filters arrays\n id, // unique ID for this dimension (reused when dimensions are disposed)\n values, // sorted, cached array\n index, // maps sorted value index -> record index (in data)\n newValues, // temporary array storing newly-added values\n newIndex, // temporary array storing newly-added index\n iterablesIndexCount,\n iterablesIndexFilterStatus,\n iterablesEmptyRows = [],\n sortRange = function(n) {\n return cr_range(n).sort(function(A, B) {\n var a = newValues[A], b = newValues[B];\n return a < b ? -1 : a > b ? 1 : A - B;\n });\n },\n refilter = xfilterFilter.filterAll, // for recomputing filter\n refilterFunction, // the custom filter function in use\n filterValue, // the value used for filtering (value, array, function or undefined)\n filterValuePresent, // true if filterValue contains something\n indexListeners = [], // when data is added\n dimensionGroups = [],\n lo0 = 0,\n hi0 = 0,\n t = 0,\n k;\n\n // Updating a dimension is a two-stage process. First, we must update the\n // associated filters for the newly-added records. Once all dimensions have\n // updated their filters, the groups are notified to update.\n dataListeners.unshift(preAdd);\n dataListeners.push(postAdd);\n\n removeDataListeners.push(removeData);\n\n // Add a new dimension in the filter bitmap and store the offset and bitmask.\n var tmp = filters.add();\n offset = tmp.offset;\n one = tmp.one;\n zero = ~one;\n\n // Create a unique ID for the dimension\n // IDs will be re-used if dimensions are disposed.\n // For internal use the ID is the subarray offset shifted left 7 bits or'd with the\n // bit offset of the set bit in the dimension's \"one\" mask.\n id = (offset << 7) | (Math.log(one) / Math.log(2));\n\n preAdd(data, 0, n);\n postAdd(data, 0, n);\n\n // Incorporates the specified new records into this dimension.\n // This function is responsible for updating filters, values, and index.\n function preAdd(newData, n0, n1) {\n var newIterablesIndexCount,\n newIterablesIndexFilterStatus;\n\n if (iterable){\n // Count all the values\n t = 0;\n j = 0;\n k = [];\n\n for (var i0 = 0; i0 < newData.length; i0++) {\n for(j = 0, k = value(newData[i0]); j < k.length; j++) {\n t++;\n }\n }\n\n newValues = [];\n newIterablesIndexCount = cr_range(newData.length);\n newIterablesIndexFilterStatus = cr_index(t,1);\n var unsortedIndex = cr_range(t);\n\n for (var l = 0, index1 = 0; index1 < newData.length; index1++) {\n k = value(newData[index1])\n //\n if(!k.length){\n newIterablesIndexCount[index1] = 0;\n iterablesEmptyRows.push(index1 + n0);\n continue;\n }\n newIterablesIndexCount[index1] = k.length\n for (j = 0; j < k.length; j++) {\n newValues.push(k[j]);\n unsortedIndex[l] = index1;\n l++;\n }\n }\n\n // Create the Sort map used to sort both the values and the valueToData indices\n var sortMap = sortRange(t);\n\n // Use the sortMap to sort the newValues\n newValues = permute(newValues, sortMap);\n\n\n // Use the sortMap to sort the unsortedIndex map\n // newIndex should be a map of sortedValue -> crossfilterData\n newIndex = permute(unsortedIndex, sortMap)\n\n } else{\n // Permute new values into natural order using a standard sorted index.\n newValues = newData.map(value);\n newIndex = sortRange(n1);\n newValues = permute(newValues, newIndex);\n }\n\n // Bisect newValues to determine which new records are selected.\n var bounds = refilter(newValues), lo1 = bounds[0], hi1 = bounds[1];\n\n var index2, index3, index4;\n if(iterable) {\n n1 = t;\n if (refilterFunction) {\n for (index2 = 0; index2 < n1; ++index2) {\n if (!refilterFunction(newValues[index2], index2)) {\n if(--newIterablesIndexCount[newIndex[index2]] === 0) {\n filters[offset][newIndex[index2] + n0] |= one;\n }\n newIterablesIndexFilterStatus[index2] = 1;\n }\n }\n } else {\n for (index3 = 0; index3 < lo1; ++index3) {\n if(--newIterablesIndexCount[newIndex[index3]] === 0) {\n filters[offset][newIndex[index3] + n0] |= one;\n }\n newIterablesIndexFilterStatus[index3] = 1;\n }\n for (index4 = hi1; index4 < n1; ++index4) {\n if(--newIterablesIndexCount[newIndex[index4]] === 0) {\n filters[offset][newIndex[index4] + n0] |= one;\n }\n newIterablesIndexFilterStatus[index4] = 1;\n }\n }\n } else {\n if (refilterFunction) {\n for (index2 = 0; index2 < n1; ++index2) {\n if (!refilterFunction(newValues[index2], index2)) {\n filters[offset][newIndex[index2] + n0] |= one;\n }\n }\n } else {\n for (index3 = 0; index3 < lo1; ++index3) {\n filters[offset][newIndex[index3] + n0] |= one;\n }\n for (index4 = hi1; index4 < n1; ++index4) {\n filters[offset][newIndex[index4] + n0] |= one;\n }\n }\n }\n\n // If this dimension previously had no data, then we don't need to do the\n // more expensive merge operation; use the new values and index as-is.\n if (!n0) {\n values = newValues;\n index = newIndex;\n iterablesIndexCount = newIterablesIndexCount;\n iterablesIndexFilterStatus = newIterablesIndexFilterStatus;\n lo0 = lo1;\n hi0 = hi1;\n return;\n }\n\n\n\n var oldValues = values,\n oldIndex = index,\n oldIterablesIndexFilterStatus = iterablesIndexFilterStatus,\n old_n0,\n i1 = 0;\n\n i0 = 0;\n\n if(iterable){\n old_n0 = n0\n n0 = oldValues.length;\n n1 = t\n }\n\n // Otherwise, create new arrays into which to merge new and old.\n values = iterable ? new Array(n0 + n1) : new Array(n);\n index = iterable ? new Array(n0 + n1) : cr_index(n, n);\n if(iterable) iterablesIndexFilterStatus = cr_index(n0 + n1, 1);\n\n // Concatenate the newIterablesIndexCount onto the old one.\n if(iterable) {\n var oldiiclength = iterablesIndexCount.length;\n iterablesIndexCount = xfilterArray.arrayLengthen(iterablesIndexCount, n);\n for(var j=0; j+oldiiclength < n; j++) {\n iterablesIndexCount[j+oldiiclength] = newIterablesIndexCount[j];\n }\n }\n\n // Merge the old and new sorted values, and old and new index.\n var index5 = 0;\n for (; i0 < n0 && i1 < n1; ++index5) {\n if (oldValues[i0] < newValues[i1]) {\n values[index5] = oldValues[i0];\n if(iterable) iterablesIndexFilterStatus[index5] = oldIterablesIndexFilterStatus[i0];\n index[index5] = oldIndex[i0++];\n } else {\n values[index5] = newValues[i1];\n if(iterable) iterablesIndexFilterStatus[index5] = newIterablesIndexFilterStatus[i1];\n index[index5] = newIndex[i1++] + (iterable ? old_n0 : n0);\n }\n }\n\n // Add any remaining old values.\n for (; i0 < n0; ++i0, ++index5) {\n values[index5] = oldValues[i0];\n if(iterable) iterablesIndexFilterStatus[index5] = oldIterablesIndexFilterStatus[i0];\n index[index5] = oldIndex[i0];\n }\n\n // Add any remaining new values.\n for (; i1 < n1; ++i1, ++index5) {\n values[index5] = newValues[i1];\n if(iterable) iterablesIndexFilterStatus[index5] = newIterablesIndexFilterStatus[i1];\n index[index5] = newIndex[i1] + (iterable ? old_n0 : n0);\n }\n\n // Bisect again to recompute lo0 and hi0.\n bounds = refilter(values), lo0 = bounds[0], hi0 = bounds[1];\n }\n\n // When all filters have updated, notify index listeners of the new values.\n function postAdd(newData, n0, n1) {\n indexListeners.forEach(function(l) { l(newValues, newIndex, n0, n1); });\n newValues = newIndex = null;\n }\n\n function removeData(reIndex) {\n if (iterable) {\n for (var i0 = 0, i1 = 0; i0 < iterablesEmptyRows.length; i0++) {\n if (reIndex[iterablesEmptyRows[i0]] !== REMOVED_INDEX) {\n iterablesEmptyRows[i1] = reIndex[iterablesEmptyRows[i0]];\n i1++;\n }\n }\n iterablesEmptyRows.length = i1;\n for (i0 = 0, i1 = 0; i0 < n; i0++) {\n if (reIndex[i0] !== REMOVED_INDEX) {\n if (i1 !== i0) iterablesIndexCount[i1] = iterablesIndexCount[i0];\n i1++;\n }\n }\n iterablesIndexCount = iterablesIndexCount.slice(0, i1);\n }\n // Rewrite our index, overwriting removed values\n var n0 = values.length;\n for (var i = 0, j = 0, oldDataIndex; i < n0; ++i) {\n oldDataIndex = index[i];\n if (reIndex[oldDataIndex] !== REMOVED_INDEX) {\n if (i !== j) values[j] = values[i];\n index[j] = reIndex[oldDataIndex];\n if (iterable) {\n iterablesIndexFilterStatus[j] = iterablesIndexFilterStatus[i];\n }\n ++j;\n }\n }\n values.length = j;\n if (iterable) iterablesIndexFilterStatus = iterablesIndexFilterStatus.slice(0, j);\n while (j < n0) index[j++] = 0;\n\n // Bisect again to recompute lo0 and hi0.\n var bounds = refilter(values);\n lo0 = bounds[0], hi0 = bounds[1];\n }\n\n // Updates the selected values based on the specified bounds [lo, hi].\n // This implementation is used by all the public filter methods.\n function filterIndexBounds(bounds) {\n\n var lo1 = bounds[0],\n hi1 = bounds[1];\n\n if (refilterFunction) {\n refilterFunction = null;\n filterIndexFunction(function(d, i) { return lo1 <= i && i < hi1; }, bounds[0] === 0 && bounds[1] === values.length);\n lo0 = lo1;\n hi0 = hi1;\n return dimension;\n }\n\n var i,\n j,\n k,\n added = [],\n removed = [],\n valueIndexAdded = [],\n valueIndexRemoved = [];\n\n\n // Fast incremental update based on previous lo index.\n if (lo1 < lo0) {\n for (i = lo1, j = Math.min(lo0, hi1); i < j; ++i) {\n added.push(index[i]);\n valueIndexAdded.push(i);\n }\n } else if (lo1 > lo0) {\n for (i = lo0, j = Math.min(lo1, hi0); i < j; ++i) {\n removed.push(index[i]);\n valueIndexRemoved.push(i);\n }\n }\n\n // Fast incremental update based on previous hi index.\n if (hi1 > hi0) {\n for (i = Math.max(lo1, hi0), j = hi1; i < j; ++i) {\n added.push(index[i]);\n valueIndexAdded.push(i);\n }\n } else if (hi1 < hi0) {\n for (i = Math.max(lo0, hi1), j = hi0; i < j; ++i) {\n removed.push(index[i]);\n valueIndexRemoved.push(i);\n }\n }\n\n if(!iterable) {\n // Flip filters normally.\n\n for(i=0; i 0) toSkip = top_offset;\n\n while (--i >= lo0 && k > 0) {\n if (filters.zero(j = index[i])) {\n if(toSkip > 0) {\n //skip matching row\n --toSkip;\n } else {\n array.push(data[j]);\n --k;\n }\n }\n }\n\n if(iterable){\n for(i = 0; i < iterablesEmptyRows.length && k > 0; i++) {\n // Add row with empty iterable column at the end\n if(filters.zero(j = iterablesEmptyRows[i])) {\n if(toSkip > 0) {\n //skip matching row\n --toSkip;\n } else {\n array.push(data[j]);\n --k;\n }\n }\n }\n }\n\n return array;\n }\n\n // Returns the bottom K selected records based on this dimension's order.\n // Note: observes this dimension's filter, unlike group and groupAll.\n function bottom(k, bottom_offset) {\n var array = [],\n i,\n j,\n toSkip = 0;\n\n if(bottom_offset && bottom_offset > 0) toSkip = bottom_offset;\n\n if(iterable) {\n // Add row with empty iterable column at the top\n for(i = 0; i < iterablesEmptyRows.length && k > 0; i++) {\n if(filters.zero(j = iterablesEmptyRows[i])) {\n if(toSkip > 0) {\n //skip matching row\n --toSkip;\n } else {\n array.push(data[j]);\n --k;\n }\n }\n }\n }\n\n i = lo0;\n\n while (i < hi0 && k > 0) {\n if (filters.zero(j = index[i])) {\n if(toSkip > 0) {\n //skip matching row\n --toSkip;\n } else {\n array.push(data[j]);\n --k;\n }\n }\n i++;\n }\n\n return array;\n }\n\n // Adds a new group to this dimension, using the specified key function.\n function group(key) {\n var group = {\n top: top,\n all: all,\n reduce: reduce,\n reduceCount: reduceCount,\n reduceSum: reduceSum,\n order: order,\n orderNatural: orderNatural,\n size: size,\n dispose: dispose,\n remove: dispose // for backwards-compatibility\n };\n\n // Ensure that this group will be removed when the dimension is removed.\n dimensionGroups.push(group);\n\n var groups, // array of {key, value}\n groupIndex, // object id ↦ group id\n groupWidth = 8,\n groupCapacity = capacity(groupWidth),\n k = 0, // cardinality\n select,\n heap,\n reduceAdd,\n reduceRemove,\n reduceInitial,\n update = cr_null,\n reset = cr_null,\n resetNeeded = true,\n groupAll = key === cr_null,\n n0old;\n\n if (arguments.length < 1) key = cr_identity;\n\n // The group listens to the crossfilter for when any dimension changes, so\n // that it can update the associated reduce values. It must also listen to\n // the parent dimension for when data is added, and compute new keys.\n filterListeners.push(update);\n indexListeners.push(add);\n removeDataListeners.push(removeData);\n\n // Incorporate any existing data into the grouping.\n add(values, index, 0, n);\n\n // Incorporates the specified new values into this group.\n // This function is responsible for updating groups and groupIndex.\n function add(newValues, newIndex, n0, n1) {\n\n if(iterable) {\n n0old = n0\n n0 = values.length - newValues.length\n n1 = newValues.length;\n }\n\n var oldGroups = groups,\n reIndex = iterable ? [] : cr_index(k, groupCapacity),\n add = reduceAdd,\n remove = reduceRemove,\n initial = reduceInitial,\n k0 = k, // old cardinality\n i0 = 0, // index of old group\n i1 = 0, // index of new record\n j, // object id\n g0, // old group\n x0, // old key\n x1, // new key\n g, // group to add\n x; // key of group to add\n\n // If a reset is needed, we don't need to update the reduce values.\n if (resetNeeded) add = initial = cr_null;\n if (resetNeeded) remove = initial = cr_null;\n\n // Reset the new groups (k is a lower bound).\n // Also, make sure that groupIndex exists and is long enough.\n groups = new Array(k), k = 0;\n if(iterable){\n groupIndex = k0 ? groupIndex : [];\n }\n else{\n groupIndex = k0 > 1 ? xfilterArray.arrayLengthen(groupIndex, n) : cr_index(n, groupCapacity);\n }\n\n\n // Get the first old key (x0 of g0), if it exists.\n if (k0) x0 = (g0 = oldGroups[0]).key;\n\n // Find the first new key (x1), skipping NaN keys.\n while (i1 < n1 && !((x1 = key(newValues[i1])) >= x1)) ++i1;\n\n // While new keys remain…\n while (i1 < n1) {\n\n // Determine the lesser of the two current keys; new and old.\n // If there are no old keys remaining, then always add the new key.\n if (g0 && x0 <= x1) {\n g = g0, x = x0;\n\n // Record the new index of the old group.\n reIndex[i0] = k;\n\n // Retrieve the next old key.\n g0 = oldGroups[++i0];\n if (g0) x0 = g0.key;\n } else {\n g = {key: x1, value: initial()}, x = x1;\n }\n\n // Add the lesser group.\n groups[k] = g;\n\n // Add any selected records belonging to the added group, while\n // advancing the new key and populating the associated group index.\n\n while (x1 <= x) {\n j = newIndex[i1] + (iterable ? n0old : n0)\n\n\n if(iterable){\n if(groupIndex[j]){\n groupIndex[j].push(k)\n }\n else{\n groupIndex[j] = [k]\n }\n }\n else{\n groupIndex[j] = k;\n }\n\n // Always add new values to groups. Only remove when not in filter.\n // This gives groups full information on data life-cycle.\n g.value = add(g.value, data[j], true);\n if (!filters.zeroExcept(j, offset, zero)) g.value = remove(g.value, data[j], false);\n if (++i1 >= n1) break;\n x1 = key(newValues[i1]);\n }\n\n groupIncrement();\n }\n\n // Add any remaining old groups that were greater th1an all new keys.\n // No incremental reduce is needed; these groups have no new records.\n // Also record the new index of the old group.\n while (i0 < k0) {\n groups[reIndex[i0] = k] = oldGroups[i0++];\n groupIncrement();\n }\n\n\n // Fill in gaps with empty arrays where there may have been rows with empty iterables\n if(iterable){\n for (var index1 = 0; index1 < n; index1++) {\n if(!groupIndex[index1]){\n groupIndex[index1] = [];\n }\n }\n }\n\n // If we added any new groups before any old groups,\n // update the group index of all the old records.\n if(k > i0){\n if(iterable){\n for (i0 = 0; i0 < n0old; ++i0) {\n for (index1 = 0; index1 < groupIndex[i0].length; index1++) {\n groupIndex[i0][index1] = reIndex[groupIndex[i0][index1]];\n }\n }\n }\n else{\n for (i0 = 0; i0 < n0; ++i0) {\n groupIndex[i0] = reIndex[groupIndex[i0]];\n }\n }\n }\n\n // Modify the update and reset behavior based on the cardinality.\n // If the cardinality is less than or equal to one, then the groupIndex\n // is not needed. If the cardinality is zero, then there are no records\n // and therefore no groups to update or reset. Note that we also must\n // change the registered listener to point to the new method.\n j = filterListeners.indexOf(update);\n if (k > 1 || iterable) {\n update = updateMany;\n reset = resetMany;\n } else {\n if (!k && groupAll) {\n k = 1;\n groups = [{key: null, value: initial()}];\n }\n if (k === 1) {\n update = updateOne;\n reset = resetOne;\n } else {\n update = cr_null;\n reset = cr_null;\n }\n groupIndex = null;\n }\n filterListeners[j] = update;\n\n // Count the number of added groups,\n // and widen the group index as needed.\n function groupIncrement() {\n if(iterable){\n k++\n return\n }\n if (++k === groupCapacity) {\n reIndex = xfilterArray.arrayWiden(reIndex, groupWidth <<= 1);\n groupIndex = xfilterArray.arrayWiden(groupIndex, groupWidth);\n groupCapacity = capacity(groupWidth);\n }\n }\n }\n\n function removeData(reIndex) {\n if (k > 1 || iterable) {\n var oldK = k,\n oldGroups = groups,\n seenGroups = cr_index(oldK, oldK),\n i,\n i0,\n j;\n\n // Filter out non-matches by copying matching group index entries to\n // the beginning of the array.\n if (!iterable) {\n for (i = 0, j = 0; i < n; ++i) {\n if (reIndex[i] !== REMOVED_INDEX) {\n seenGroups[groupIndex[j] = groupIndex[i]] = 1;\n ++j;\n }\n }\n } else {\n for (i = 0, j = 0; i < n; ++i) {\n if (reIndex[i] !== REMOVED_INDEX) {\n groupIndex[j] = groupIndex[i];\n for (i0 = 0; i0 < groupIndex[j].length; i0++) {\n seenGroups[groupIndex[j][i0]] = 1;\n }\n ++j;\n }\n }\n }\n\n // Reassemble groups including only those groups that were referred\n // to by matching group index entries. Note the new group index in\n // seenGroups.\n groups = [], k = 0;\n for (i = 0; i < oldK; ++i) {\n if (seenGroups[i]) {\n seenGroups[i] = k++;\n groups.push(oldGroups[i]);\n }\n }\n\n if (k > 1 || iterable) {\n // Reindex the group index using seenGroups to find the new index.\n if (!iterable) {\n for (i = 0; i < j; ++i) groupIndex[i] = seenGroups[groupIndex[i]];\n } else {\n for (i = 0; i < j; ++i) {\n for (i0 = 0; i0 < groupIndex[i].length; ++i0) {\n groupIndex[i][i0] = seenGroups[groupIndex[i][i0]];\n }\n }\n }\n } else {\n groupIndex = null;\n }\n filterListeners[filterListeners.indexOf(update)] = k > 1 || iterable\n ? (reset = resetMany, update = updateMany)\n : k === 1 ? (reset = resetOne, update = updateOne)\n : reset = update = cr_null;\n } else if (k === 1) {\n if (groupAll) return;\n for (var index3 = 0; index3 < n; ++index3) if (reIndex[index3] !== REMOVED_INDEX) return;\n groups = [], k = 0;\n filterListeners[filterListeners.indexOf(update)] =\n update = reset = cr_null;\n }\n }\n\n // Reduces the specified selected or deselected records.\n // This function is only used when the cardinality is greater than 1.\n // notFilter indicates a crossfilter.add/remove operation.\n function updateMany(filterOne, filterOffset, added, removed, notFilter) {\n\n if ((filterOne === one && filterOffset === offset) || resetNeeded) return;\n\n var i,\n j,\n k,\n n,\n g;\n\n if(iterable){\n // Add the added values.\n for (i = 0, n = added.length; i < n; ++i) {\n if (filters.zeroExcept(k = added[i], offset, zero)) {\n for (j = 0; j < groupIndex[k].length; j++) {\n g = groups[groupIndex[k][j]];\n g.value = reduceAdd(g.value, data[k], false, j);\n }\n }\n }\n\n // Remove the removed values.\n for (i = 0, n = removed.length; i < n; ++i) {\n if (filters.onlyExcept(k = removed[i], offset, zero, filterOffset, filterOne)) {\n for (j = 0; j < groupIndex[k].length; j++) {\n g = groups[groupIndex[k][j]];\n g.value = reduceRemove(g.value, data[k], notFilter, j);\n }\n }\n }\n return;\n }\n\n // Add the added values.\n for (i = 0, n = added.length; i < n; ++i) {\n if (filters.zeroExcept(k = added[i], offset, zero)) {\n g = groups[groupIndex[k]];\n g.value = reduceAdd(g.value, data[k], false);\n }\n }\n\n // Remove the removed values.\n for (i = 0, n = removed.length; i < n; ++i) {\n if (filters.onlyExcept(k = removed[i], offset, zero, filterOffset, filterOne)) {\n g = groups[groupIndex[k]];\n g.value = reduceRemove(g.value, data[k], notFilter);\n }\n }\n }\n\n // Reduces the specified selected or deselected records.\n // This function is only used when the cardinality is 1.\n // notFilter indicates a crossfilter.add/remove operation.\n function updateOne(filterOne, filterOffset, added, removed, notFilter) {\n if ((filterOne === one && filterOffset === offset) || resetNeeded) return;\n\n var i,\n k,\n n,\n g = groups[0];\n\n // Add the added values.\n for (i = 0, n = added.length; i < n; ++i) {\n if (filters.zeroExcept(k = added[i], offset, zero)) {\n g.value = reduceAdd(g.value, data[k], false);\n }\n }\n\n // Remove the removed values.\n for (i = 0, n = removed.length; i < n; ++i) {\n if (filters.onlyExcept(k = removed[i], offset, zero, filterOffset, filterOne)) {\n g.value = reduceRemove(g.value, data[k], notFilter);\n }\n }\n }\n\n // Recomputes the group reduce values from scratch.\n // This function is only used when the cardinality is greater than 1.\n function resetMany() {\n var i,\n j,\n g;\n\n // Reset all group values.\n for (i = 0; i < k; ++i) {\n groups[i].value = reduceInitial();\n }\n\n // We add all records and then remove filtered records so that reducers\n // can build an 'unfiltered' view even if there are already filters in\n // place on other dimensions.\n if(iterable){\n for (i = 0; i < n; ++i) {\n for (j = 0; j < groupIndex[i].length; j++) {\n g = groups[groupIndex[i][j]];\n g.value = reduceAdd(g.value, data[i], true, j);\n }\n }\n for (i = 0; i < n; ++i) {\n if (!filters.zeroExcept(i, offset, zero)) {\n for (j = 0; j < groupIndex[i].length; j++) {\n g = groups[groupIndex[i][j]];\n g.value = reduceRemove(g.value, data[i], false, j);\n }\n }\n }\n return;\n }\n\n for (i = 0; i < n; ++i) {\n g = groups[groupIndex[i]];\n g.value = reduceAdd(g.value, data[i], true);\n }\n for (i = 0; i < n; ++i) {\n if (!filters.zeroExcept(i, offset, zero)) {\n g = groups[groupIndex[i]];\n g.value = reduceRemove(g.value, data[i], false);\n }\n }\n }\n\n // Recomputes the group reduce values from scratch.\n // This function is only used when the cardinality is 1.\n function resetOne() {\n var i,\n g = groups[0];\n\n // Reset the singleton group values.\n g.value = reduceInitial();\n\n // We add all records and then remove filtered records so that reducers\n // can build an 'unfiltered' view even if there are already filters in\n // place on other dimensions.\n for (i = 0; i < n; ++i) {\n g.value = reduceAdd(g.value, data[i], true);\n }\n\n for (i = 0; i < n; ++i) {\n if (!filters.zeroExcept(i, offset, zero)) {\n g.value = reduceRemove(g.value, data[i], false);\n }\n }\n }\n\n // Returns the array of group values, in the dimension's natural order.\n function all() {\n if (resetNeeded) reset(), resetNeeded = false;\n return groups;\n }\n\n // Returns a new array containing the top K group values, in reduce order.\n function top(k) {\n var top = select(all(), 0, groups.length, k);\n return heap.sort(top, 0, top.length);\n }\n\n // Sets the reduce behavior for this group to use the specified functions.\n // This method lazily recomputes the reduce values, waiting until needed.\n function reduce(add, remove, initial) {\n reduceAdd = add;\n reduceRemove = remove;\n reduceInitial = initial;\n resetNeeded = true;\n return group;\n }\n\n // A convenience method for reducing by count.\n function reduceCount() {\n return reduce(xfilterReduce.reduceIncrement, xfilterReduce.reduceDecrement, cr_zero);\n }\n\n // A convenience method for reducing by sum(value).\n function reduceSum(value) {\n return reduce(xfilterReduce.reduceAdd(value), xfilterReduce.reduceSubtract(value), cr_zero);\n }\n\n // Sets the reduce order, using the specified accessor.\n function order(value) {\n select = xfilterHeapselect.by(valueOf);\n heap = xfilterHeap.by(valueOf);\n function valueOf(d) { return value(d.value); }\n return group;\n }\n\n // A convenience method for natural ordering by reduce value.\n function orderNatural() {\n return order(cr_identity);\n }\n\n // Returns the cardinality of this group, irrespective of any filters.\n function size() {\n return k;\n }\n\n // Removes this group and associated event listeners.\n function dispose() {\n var i = filterListeners.indexOf(update);\n if (i >= 0) filterListeners.splice(i, 1);\n i = indexListeners.indexOf(add);\n if (i >= 0) indexListeners.splice(i, 1);\n i = removeDataListeners.indexOf(removeData);\n if (i >= 0) removeDataListeners.splice(i, 1);\n i = dimensionGroups.indexOf(group);\n if (i >= 0) dimensionGroups.splice(i, 1);\n return group;\n }\n\n return reduceCount().orderNatural();\n }\n\n // A convenience function for generating a singleton group.\n function groupAll() {\n var g = group(cr_null), all = g.all;\n delete g.all;\n delete g.top;\n delete g.order;\n delete g.orderNatural;\n delete g.size;\n g.value = function() { return all()[0].value; };\n return g;\n }\n\n // Removes this dimension and associated groups and event listeners.\n function dispose() {\n dimensionGroups.forEach(function(group) { group.dispose(); });\n var i = dataListeners.indexOf(preAdd);\n if (i >= 0) dataListeners.splice(i, 1);\n i = dataListeners.indexOf(postAdd);\n if (i >= 0) dataListeners.splice(i, 1);\n i = removeDataListeners.indexOf(removeData);\n if (i >= 0) removeDataListeners.splice(i, 1);\n filters.masks[offset] &= zero;\n return filterAll();\n }\n\n return dimension;\n }\n\n // A convenience method for groupAll on a dummy dimension.\n // This implementation can be optimized since it always has cardinality 1.\n function groupAll() {\n var group = {\n reduce: reduce,\n reduceCount: reduceCount,\n reduceSum: reduceSum,\n value: value,\n dispose: dispose,\n remove: dispose // for backwards-compatibility\n };\n\n var reduceValue,\n reduceAdd,\n reduceRemove,\n reduceInitial,\n resetNeeded = true;\n\n // The group listens to the crossfilter for when any dimension changes, so\n // that it can update the reduce value. It must also listen to the parent\n // dimension for when data is added.\n filterListeners.push(update);\n dataListeners.push(add);\n\n // For consistency; actually a no-op since resetNeeded is true.\n add(data, 0, n);\n\n // Incorporates the specified new values into this group.\n function add(newData, n0) {\n var i;\n\n if (resetNeeded) return;\n\n // Cycle through all the values.\n for (i = n0; i < n; ++i) {\n\n // Add all values all the time.\n reduceValue = reduceAdd(reduceValue, data[i], true);\n\n // Remove the value if filtered.\n if (!filters.zero(i)) {\n reduceValue = reduceRemove(reduceValue, data[i], false);\n }\n }\n }\n\n // Reduces the specified selected or deselected records.\n function update(filterOne, filterOffset, added, removed, notFilter) {\n var i,\n k,\n n;\n\n if (resetNeeded) return;\n\n // Add the added values.\n for (i = 0, n = added.length; i < n; ++i) {\n if (filters.zero(k = added[i])) {\n reduceValue = reduceAdd(reduceValue, data[k], notFilter);\n }\n }\n\n // Remove the removed values.\n for (i = 0, n = removed.length; i < n; ++i) {\n if (filters.only(k = removed[i], filterOffset, filterOne)) {\n reduceValue = reduceRemove(reduceValue, data[k], notFilter);\n }\n }\n }\n\n // Recomputes the group reduce value from scratch.\n function reset() {\n var i;\n\n reduceValue = reduceInitial();\n\n // Cycle through all the values.\n for (i = 0; i < n; ++i) {\n\n // Add all values all the time.\n reduceValue = reduceAdd(reduceValue, data[i], true);\n\n // Remove the value if it is filtered.\n if (!filters.zero(i)) {\n reduceValue = reduceRemove(reduceValue, data[i], false);\n }\n }\n }\n\n // Sets the reduce behavior for this group to use the specified functions.\n // This method lazily recomputes the reduce value, waiting until needed.\n function reduce(add, remove, initial) {\n reduceAdd = add;\n reduceRemove = remove;\n reduceInitial = initial;\n resetNeeded = true;\n return group;\n }\n\n // A convenience method for reducing by count.\n function reduceCount() {\n return reduce(xfilterReduce.reduceIncrement, xfilterReduce.reduceDecrement, cr_zero);\n }\n\n // A convenience method for reducing by sum(value).\n function reduceSum(value) {\n return reduce(xfilterReduce.reduceAdd(value), xfilterReduce.reduceSubtract(value), cr_zero);\n }\n\n // Returns the computed reduce value.\n function value() {\n if (resetNeeded) reset(), resetNeeded = false;\n return reduceValue;\n }\n\n // Removes this group and associated event listeners.\n function dispose() {\n var i = filterListeners.indexOf(update);\n if (i >= 0) filterListeners.splice(i, 1);\n i = dataListeners.indexOf(add);\n if (i >= 0) dataListeners.splice(i, 1);\n return group;\n }\n\n return reduceCount();\n }\n\n // Returns the number of records in this crossfilter, irrespective of any filters.\n function size() {\n return n;\n }\n\n // Returns the raw row data contained in this crossfilter\n function all(){\n return data;\n }\n\n // Returns row data with all dimension filters applied, except for filters in ignore_dimensions\n function allFiltered(ignore_dimensions) {\n var array = [],\n i = 0,\n mask = maskForDimensions(ignore_dimensions || []);\n\n for (i = 0; i < n; i++) {\n if (filters.zeroExceptMask(i, mask)) {\n array.push(data[i]);\n }\n }\n\n return array;\n }\n\n function onChange(cb){\n if(typeof cb !== 'function'){\n /* eslint no-console: 0 */\n console.warn('onChange callback parameter must be a function!');\n return;\n }\n callbacks.push(cb);\n return function(){\n callbacks.splice(callbacks.indexOf(cb), 1);\n };\n }\n\n function triggerOnChange(eventName){\n for (var i = 0; i < callbacks.length; i++) {\n callbacks[i](eventName);\n }\n }\n\n return arguments.length\n ? add(arguments[0])\n : crossfilter;\n}\n\n// Returns an array of size n, big enough to store ids up to m.\nfunction cr_index(n, m) {\n return (m < 0x101\n ? xfilterArray.array8 : m < 0x10001\n ? xfilterArray.array16\n : xfilterArray.array32)(n);\n}\n\n// Constructs a new array of size n, with sequential values from 0 to n - 1.\nfunction cr_range(n) {\n var range = cr_index(n, n);\n for (var i = -1; ++i < n;) range[i] = i;\n return range;\n}\n\nfunction capacity(w) {\n return w === 8\n ? 0x100 : w === 16\n ? 0x10000\n : 0x100000000;\n}\n","import {d3} from './lib';\r\nimport crossfilter from 'crossfilter2';\r\n\r\n/* Decompresses ideogram's annotations for crossfilter initialization\r\nBy default, annotations are clustered by chromosome, e.g.\r\n[\r\n {\"chr\": \"1\", \"annots\": [{\"from\": 100, \"to\", 101, \"chr\": \"1\", ...}, ...]},\r\n {\"chr\": \"2\", \"annots\": [{\"from\": 500, \"to\", 501, \"chr\": \"2\", ...}, ...]},\r\n ...\r\n]\r\nThis method flattens that structure to e.g.\r\n[\r\n {\"from\": 100, \"to\": 101, \"chr\": \"1\", ...},\r\n ...\r\n {\"from\": 500, \"to\": 501, \"chr\": \"2\", ...},\r\n]\r\nSee also: packAnnots\r\n*/\r\nfunction unpackAnnots() {\r\n var chr, annots, i,\r\n unpackedAnnots = [],\r\n ideo = this,\r\n chrs = ideo.annots;\r\n\r\n for (i = 0; i < chrs.length; i++) {\r\n chr = chrs[i];\r\n annots = chr.annots;\r\n unpackedAnnots = unpackedAnnots.concat(annots);\r\n }\r\n\r\n return unpackedAnnots;\r\n}\r\n\r\n/*\r\n Compresses annots back to default state. Inverse of unpackAnnots.\r\n*/\r\nfunction packAnnots(unpackedAnnots) {\r\n var chr, annot, i,\r\n annots = [],\r\n ideo = this,\r\n chrs = ideo.annots;\r\n\r\n for (chr in chrs) {\r\n annots.push({chr: chrs[chr].chr, annots: []});\r\n }\r\n\r\n for (i = 0; i < unpackedAnnots.length; i++) {\r\n annot = unpackedAnnots[i];\r\n annots[annot.chrIndex].annots.push(annot);\r\n }\r\n\r\n return annots;\r\n}\r\n\r\n/*\r\n Initializes crossfilter. Needed for client-side filtering.\r\n More: https://github.com/square/crossfilter/wiki/API-Reference\r\n*/\r\nfunction initCrossFilter() {\r\n var i, facet,\r\n ideo = this,\r\n keys = ideo.rawAnnots.keys;\r\n\r\n ideo.unpackedAnnots = ideo.unpackAnnots();\r\n ideo.crossfilter = crossfilter(ideo.unpackedAnnots);\r\n\r\n ideo.annotsByFacet = {};\r\n ideo.facets = keys.slice(3, keys.length);\r\n\r\n for (i = 0; i < ideo.facets.length; i++) {\r\n facet = ideo.facets[i];\r\n ideo.annotsByFacet[facet] =\r\n ideo.crossfilter.dimension(function(d) {\r\n return d[facet];\r\n });\r\n }\r\n\r\n if ('filterSelections' in ideo) {\r\n ideo.filterAnnots(ideo.filterSelections);\r\n }\r\n\r\n ideo.filteredAnnots = ideo.annots;\r\n}\r\n\r\nfunction getFilteredResults(selections, ideo) {\r\n var fn, i, facet, results, filter,\r\n counts = {};\r\n\r\n if (Object.keys(selections).length === 0) {\r\n results = ideo.unpackedAnnots;\r\n } else {\r\n for (i = 0; i < ideo.facets.length; i++) {\r\n facet = ideo.facets[i];\r\n if (facet in selections) {\r\n filter = selections[facet];\r\n if (Array.isArray(filter)) {\r\n fn = function(d) {\r\n // Filter is numeric range\r\n if (filter.length === 2) {\r\n // [min, max]\r\n return filter[0] <= d && d < filter[1];\r\n } else if (filter.length === 4) {\r\n // [min1, max1, min2, max2]\r\n return (\r\n filter[0] <= d && d < filter[1] ||\r\n filter[2] <= d && d < filter[3]\r\n );\r\n }\r\n };\r\n } else {\r\n fn = function(d) {\r\n // Filter is set of categories\r\n return (d in filter);\r\n };\r\n }\r\n } else {\r\n fn = null;\r\n }\r\n ideo.annotsByFacet[facet].filter(fn);\r\n counts[facet] = ideo.annotsByFacet[facet].group().top(Infinity);\r\n }\r\n results = ideo.annotsByFacet[facet].top(Infinity);\r\n }\r\n\r\n return [results, counts];\r\n}\r\n\r\n/*\r\n Filters annotations based on the given selections.\r\n \"selections\" is an object of objects, e.g.\r\n\r\n {\r\n \"tissue-type\": { <-- a facet\r\n \"cerebral-cortex\": 1, <-- a filter; \"1\" means it is selected\r\n \"liver\": 1\r\n },\r\n \"gene-type\": {\r\n mirna\": 1\r\n }\r\n }\r\n\r\n Translation:\r\n select where:\r\n (tissue-type is cerebral-cortex OR liver) and (gene-type is mirna)\r\n\r\n TODO:\r\n * Filter counts\r\n * Integrate server-side filtering for very large datasets\r\n*/\r\nfunction filterAnnots(selections) {\r\n var i, facet, results, counts,\r\n t0 = Date.now(),\r\n ideo = this;\r\n\r\n ideo.filterSelections = selections;\r\n [results, counts] = getFilteredResults(selections, ideo);\r\n\r\n for (i < 0; i < ideo.facets.length; i++) {\r\n ideo.annotsByFacet[facet].filterAll(); // clear filters\r\n }\r\n\r\n results = ideo.packAnnots(results);\r\n\r\n delete ideo.maxAnnotsPerBar;\r\n delete ideo.maxAnnotsPerBarAllChrs;\r\n\r\n ideo.filteredAnnots = results;\r\n\r\n d3.selectAll(ideo.selector + ' polygon.annot').remove();\r\n ideo.drawAnnots(results);\r\n\r\n console.log('Time in filterAnnots: ' + (Date.now() - t0) + ' ms');\r\n\r\n return counts;\r\n}\r\n\r\nexport {unpackAnnots, packAnnots, initCrossFilter, filterAnnots};\r\n","function getPixelAndOtherData(bands, chr, hasBands, ideo) {\r\n var i, band, csLength, width, maxLength,\r\n pxStop = 0,\r\n taxid = chr.id.split('-')[1],\r\n cs = ideo.coordinateSystem,\r\n chrHeight = ideo.config.chrHeight;\r\n\r\n for (i = 0; i < bands.length; i++) {\r\n band = bands[i];\r\n csLength = band[cs].stop - band[cs].start;\r\n\r\n // If ideogram is rotated (and thus showing only one chromosome),\r\n // then set its width independent of the longest chromosome in this\r\n // genome.\r\n if (ideo._layout._isRotated) {\r\n width = chrHeight * csLength / chr.length;\r\n } else {\r\n if (ideo.config.chromosomeScale === 'relative') {\r\n maxLength = ideo.maxLength[taxid][cs];\r\n } else {\r\n maxLength = ideo.maxLength[cs];\r\n }\r\n width = chrHeight * chr.length / maxLength * csLength / chr.length;\r\n }\r\n bands[i].px = {start: pxStop, stop: pxStop + width, width: width};\r\n\r\n pxStop = bands[i].px.stop;\r\n\r\n if (hasBands && band.stain === 'acen' && band.name[0] === 'p') {\r\n chr.pcenIndex = i;\r\n }\r\n }\r\n return [bands, chr, pxStop];\r\n}\r\n\r\n/**\r\n * TODO:\r\n * A chromosome-level scale property is likely\r\n * nonsensical for any chromosomes that have cytogenetic band data.\r\n * Different bands tend to have ratios between number of base pairs\r\n * and physical length.\r\n *\r\n * However, a chromosome-level scale property is likely\r\n * necessary for chromosomes that do not have band data.\r\n *\r\n * This needs further review.\r\n */\r\nfunction getChrScale(chr, hasBands, ideo) {\r\n var chrHeight = ideo.config.chrHeight,\r\n chrLength = chr.length,\r\n maxLength = ideo.maxLength,\r\n taxid = chr.id.split('-')[1],\r\n scale = {};\r\n\r\n scale.bp = chrHeight / maxLength.bp;\r\n\r\n if (ideo.config.multiorganism === true) {\r\n // chr.scale.bp = band.iscn.stop / band.bp.stop;\r\n if (ideo.config.chromosomeScale === 'relative') {\r\n scale.iscn = chrHeight * chrLength / maxLength[taxid].bp;\r\n scale.bp = chrHeight / maxLength[taxid].bp;\r\n } else {\r\n scale.iscn = chrHeight * chrLength / maxLength.bp;\r\n }\r\n } else if (hasBands) {\r\n scale.iscn = chrHeight / maxLength.iscn;\r\n }\r\n\r\n return scale;\r\n}\r\n\r\nfunction getChromosomePixels(chr) {\r\n var bands, chrHeight, pxStop, hasBands, maxLength,\r\n taxid = chr.id.split('-')[1],\r\n ideo = this;\r\n\r\n bands = chr.bands;\r\n chrHeight = ideo.config.chrHeight;\r\n pxStop = 0;\r\n hasBands = (typeof bands !== 'undefined');\r\n\r\n if (hasBands) {\r\n [bands, chr, pxStop] = getPixelAndOtherData(bands, chr, hasBands, ideo);\r\n } else {\r\n if (ideo.config.chromosomeScale === 'relative') {\r\n maxLength = ideo.maxLength[taxid][ideo.coordinateSystem];\r\n } else {\r\n maxLength = ideo.maxLength[ideo.coordinateSystem];\r\n }\r\n pxStop = chrHeight * chr.length / maxLength;\r\n }\r\n\r\n chr.width = pxStop;\r\n chr.scale = getChrScale(chr, hasBands, ideo);\r\n chr.bands = bands;\r\n\r\n return chr;\r\n}\r\n\r\nfunction getChrModelScaffold(chr, bands, chrName, ideo) {\r\n var hasBands = (typeof bands !== 'undefined');\r\n\r\n if (hasBands) {\r\n const lastBand = bands[bands.length - 1];\r\n chr.name = chrName;\r\n chr.length = lastBand[ideo.coordinateSystem].stop;\r\n\r\n // Accounts for case where this chromosome\r\n chr.bpLength = lastBand.bp.stop;\r\n\r\n chr.type = 'nuclear';\r\n } else {\r\n chr = chrName;\r\n }\r\n\r\n return chr;\r\n}\r\n\r\n/**\r\n * Encountered when processing an assembly that has chromosomes with\r\n * centromere data, but this chromosome does not.\r\n * Example: chromosome F1 in Felis catus.\r\n */\r\nfunction deleteExtraneousBands(chr, hasBands) {\r\n if (hasBands && chr.bands.length === 1) {\r\n delete chr.bands;\r\n }\r\n return chr;\r\n}\r\n\r\nfunction getCentromerePosition(hasBands, bands) {\r\n\r\n if (hasBands === false) return '';\r\n\r\n // As with Macaca mulatta chromosome Y\r\n const firstBand = bands[0];\r\n const lastBand = bands.slice(-1)[0];\r\n const chrLength = lastBand.bp.stop - firstBand.bp.start;\r\n const smallLength = chrLength/20;\r\n\r\n if (\r\n // As with almost all mouse chromosome, chimpanzee chr22\r\n firstBand.name[0] === 'p' && bands[1].name[0] === 'q' &&\r\n firstBand.bp.stop - firstBand.bp.start < smallLength\r\n ) {\r\n return 'telocentric-p';\r\n }\r\n\r\n const penultimateBand = bands.slice(-2)[0];\r\n\r\n if (\r\n penultimateBand.name[0] === 'p' && lastBand.name[0] === 'q' &&\r\n lastBand.bp.stop - lastBand.bp.start < smallLength\r\n ) {\r\n // As with Macaca mulatta chromosome Y\r\n return 'telocentric-q';\r\n }\r\n\r\n return '';\r\n}\r\n\r\n/**\r\n * Generates a model object for each chromosome containing information on\r\n * its name, DOM ID, length in base pairs or ISCN coordinates, cytogenetic\r\n * bands, centromere position, etc.\r\n */\r\nfunction getChromosomeModel(bands, chrName, taxid, chrIndex) {\r\n var hasBands, org,\r\n chr = {},\r\n ideo = this;\r\n\r\n hasBands = (typeof bands !== 'undefined');\r\n\r\n console.log(chr, bands, chrName, ideo)\r\n chr = getChrModelScaffold(chr, bands, chrName, ideo);\r\n console.log(chr)\r\n chr.chrIndex = chrIndex;\r\n chr.id = 'chr' + chr.name + '-' + taxid;\r\n\r\n if (ideo.config.fullChromosomeLabels === true) {\r\n org = this.organisms[taxid];\r\n chr.name = org.scientificName + ' chr' + chr.name;\r\n }\r\n\r\n chr.bands = bands;\r\n chr = ideo.getChromosomePixels(chr);\r\n chr.centromerePosition = getCentromerePosition(hasBands, bands);\r\n\r\n chr = deleteExtraneousBands(chr, hasBands);\r\n\r\n return chr;\r\n}\r\n\r\nexport {getChromosomeModel, getChromosomePixels};\r\n","// import {getSettings, handleSettingsHeaderClick} from './settings-ui';\r\nimport version from '../version';\r\nimport {downloadPng} from '../lib';\r\n\r\nconst style = `\r\n `;\r\n\r\n// eslint-disable-next-line max-len\r\nconst gearIcon = '';\r\n// Font Awesome Free 5.2.0 by @fontawesome - https://fontawesome.com\r\n// License - https://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)\r\n\r\nfunction deactivate(items) {\r\n items.forEach(item => {item.classList.remove('active');});\r\n}\r\n\r\nfunction closeTools() {\r\n const toolHeaders = document.querySelectorAll('#tools > ul > li');\r\n deactivate(toolHeaders);\r\n const itemsToClose =\r\n document.querySelectorAll('.ideo-modal, .ideo-tool-panel');\r\n itemsToClose.forEach(item => {item.remove();});\r\n\r\n document.querySelector('#tools').style.display = 'none';\r\n}\r\n\r\n/**\r\n * As needed, hide tool panels that are triggered by hovering\r\n */\r\nfunction handleHideForHoverables(trigger, tool, toolHeader, toolHeaders) {\r\n if (trigger === 'mouseenter') {\r\n\r\n // Hide panel when hover leaves tool header, if new target element\r\n // is part of the tools UI (and not the panel itself)\r\n toolHeader.addEventListener('mouseleave', event => {\r\n const toElement = event.toElement;\r\n const toId = toElement.id;\r\n const panelElement = document.querySelector('.ideo-tool-panel');\r\n const toolsElement = document.querySelector('#tools');\r\n if (\r\n toolsElement.contains(toElement) &&\r\n panelElement && !panelElement.contains(toElement) &&\r\n toId !== tool\r\n ) {\r\n deactivate(toolHeaders);\r\n panelElement.remove();\r\n }\r\n });\r\n }\r\n}\r\n\r\n/** Determine action that should trigger a tool panel to display */\r\nfunction getTrigger(toolHeader) {\r\n const shouldHover =\r\n Array.from(toolHeader.classList).includes('ideo-tool-hover');\r\n const trigger = shouldHover ? 'mouseenter' : 'click';\r\n return trigger;\r\n}\r\n\r\n/** Shows clicked tool as active, displays resulting panel */\r\nfunction handleToolClick(ideo) {\r\n const toolHeaders = document.querySelectorAll('#tools > ul > li');\r\n\r\n toolHeaders.forEach(toolHeader => {\r\n const trigger = getTrigger(toolHeader);\r\n\r\n toolHeader.addEventListener(trigger, event => {\r\n\r\n // Show only clicked tool header as active\r\n deactivate(toolHeaders);\r\n toolHeader.classList += ' active';\r\n\r\n const tool = toolHeader.id.split('-')[0];\r\n const panel = getPanel(tool, ideo);\r\n\r\n if (trigger === 'mouseenter') {\r\n toolHeader.insertAdjacentHTML('beforeend', panel);\r\n handleHideForHoverables(trigger, tool, toolHeader, toolHeaders);\r\n\r\n if (tool === 'download') {\r\n document.querySelector('#download-image')\r\n .addEventListener('click', event => {\r\n closeTools();\r\n downloadPng(ideo);\r\n });\r\n\r\n document.querySelector('#download-annots')\r\n .addEventListener('click', event => {\r\n const element = document.querySelector('#download-annots');\r\n const classes = Array.from(element.classList);\r\n if (classes.includes('ideo-disabled') === false) {\r\n closeTools();\r\n ideo.downloadAnnotations();\r\n }\r\n });\r\n }\r\n } else {\r\n document.querySelector('#gear').insertAdjacentHTML('beforeend', panel);\r\n }\r\n });\r\n });\r\n\r\n // Upon clicking \"close\" (x), remove tools UI\r\n document.querySelectorAll('#close').forEach(closeButton => {\r\n closeButton.addEventListener('click', () => {closeTools();});\r\n });\r\n\r\n}\r\n\r\nfunction handleGearClick(ideo) {\r\n document.querySelector('#gear')\r\n .addEventListener('click', event => {\r\n var options = document.querySelector('#tools');\r\n if (options.style.display === 'none') {\r\n options.style.display = '';\r\n hideOnClickOutside();\r\n } else {\r\n options.style.display = 'none';\r\n closeTools();\r\n }\r\n });\r\n\r\n handleToolClick(ideo);\r\n\r\n // handleSettingsHeaderClick(ideo);\r\n}\r\n\r\nfunction showGearOnIdeogramHover(ideo) {\r\n const container = document.querySelector(ideo.selector);\r\n const gear = document.querySelector('#gear');\r\n const panel = document.querySelector('#tools');\r\n\r\n container.addEventListener('mouseover', () => gear.style.display = '');\r\n container.addEventListener('mouseout', () => {\r\n // Hide gear only if panel is not shown\r\n if (panel.style.display === 'none') {\r\n gear.style.display = 'none';\r\n }\r\n });\r\n\r\n gear.addEventListener('mouseover', () => gear.style.display = '');\r\n}\r\n\r\nfunction getPanel(tool, ideo) {\r\n var panel;\r\n // if (tool === 'settings') panel = getSettings();\r\n if (tool === 'download') panel = getDownload(ideo);\r\n if (tool === 'about') panel = getAbout();\r\n return panel.trim();\r\n}\r\n\r\nfunction getDownload(ideo) {\r\n\r\n const numAnnots = document.querySelectorAll('.annot').length;\r\n const annotsClass = (numAnnots > 0) ? '' : 'ideo-disabled';\r\n\r\n return `\r\n
    \r\n
  • Image
  • \r\n
  • Annotations
  • \r\n
    \r\n `;\r\n}\r\n\r\nfunction getAbout() {\r\n const ideogramLink = `\r\n \r\n Ideogram.js`;\r\n const closeButton = 'x';\r\n return `\r\n
    \r\n ${ideogramLink}, version ${version} ${closeButton}
    \r\n Chromosome visualization for the web\r\n
    `;\r\n}\r\n\r\nfunction hideOnClickOutside(selector) {\r\n const elements = document.querySelectorAll('#gear, #tools');\r\n const outsideClickListener = event => {\r\n let clickedOutsideCount = 0;\r\n elements.forEach((element) => {\r\n if (!element.contains(event.target)) {\r\n clickedOutsideCount += 1;\r\n }\r\n });\r\n if (clickedOutsideCount === elements.length) {\r\n closeTools();\r\n removeClickListener();\r\n }\r\n };\r\n\r\n const removeClickListener = () => {\r\n document.removeEventListener('click', outsideClickListener);\r\n };\r\n\r\n document.addEventListener('click', outsideClickListener);\r\n}\r\n\r\nfunction initTools(ideo) {\r\n\r\n const triangle = '';\r\n\r\n const toolsHtml = `\r\n ${style}\r\n
    ${gearIcon}
    \r\n
    \r\n
      \r\n
    • Download ${triangle}
    • \r\n
    • About
    • \r\n
    \r\n
    `;\r\n\r\n\r\n document.querySelector(ideo.selector)\r\n .insertAdjacentHTML('beforebegin', toolsHtml);\r\n\r\n handleGearClick(ideo);\r\n\r\n showGearOnIdeogramHover(ideo);\r\n}\r\n\r\nexport {initTools};\r\n\r\n","/* eslint-disable no-use-before-define */\r\n\r\nexport class ModelAdapter {\r\n\r\n constructor(model) {\r\n this._model = model;\r\n this._class = 'ModelAdapter';\r\n }\r\n\r\n static getInstance(model) {\r\n if (model.bands) {\r\n return new ModelAdapter(model);\r\n } else {\r\n return new ModelNoBandsAdapter(model);\r\n }\r\n }\r\n\r\n getModel() {\r\n return this._model;\r\n }\r\n\r\n getCssClass() {\r\n return '';\r\n }\r\n}\r\n\r\nexport class ModelNoBandsAdapter extends ModelAdapter {\r\n\r\n constructor(model) {\r\n super(model);\r\n this._class = 'ModelNoBandsAdapter';\r\n }\r\n\r\n getModel() {\r\n this._model.bands = [];\r\n\r\n const isMT = this._model.name === 'MT'; // Is mitochondrial chromosome\r\n const width = this._model.width;\r\n\r\n if (width > 1 || isMT) {\r\n // Add single band to bands array\r\n this._model.bands.push({\r\n name: 'q',\r\n px: {\r\n start: 0,\r\n stop: width,\r\n width: width\r\n },\r\n bp: {\r\n start: 1,\r\n stop: this._model.bpLength\r\n },\r\n iscn: {\r\n start: 1,\r\n stop: this._model.length\r\n }\r\n });\r\n }\r\n\r\n return this._model;\r\n }\r\n\r\n getCssClass() {\r\n return 'noBands';\r\n }\r\n\r\n}\r\n","import {Ploidy} from './ploidy';\r\n\r\nexport class Color {\r\n\r\n constructor(config) {\r\n // Ideogram config\r\n this._config = config;\r\n this._ploidy = new Ploidy(this._config);\r\n }\r\n\r\n getArmColor(chrSetIndex, chrIndex, armIndex) {\r\n if (this._config.armColors) {\r\n return this._config.armColors[armIndex];\r\n } else if (this._config.ancestors) {\r\n return this._getPolyploidArmColor(chrSetIndex, chrIndex, armIndex);\r\n } else {\r\n return null;\r\n }\r\n }\r\n\r\n getBorderColor(chrSetIndex, chrIndex, armIndex) {\r\n const config = this._config;\r\n const color = config.chrBorderColor ? config.chrBorderColor : '#000';\r\n if (chrIndex < config.ploidy) {\r\n return color;\r\n } else if (this._ploidy.exists(chrSetIndex, chrIndex, armIndex)) {\r\n return color;\r\n } else {\r\n return '#fff';\r\n }\r\n }\r\n\r\n getFillColor() {\r\n const config = this._config;\r\n if (!config.chrFillColor) return '#AAA';\r\n const color = config.chrFillColor;\r\n if (typeof color === 'string') {\r\n return {arm: color, centromere: ''};\r\n } else {\r\n return color;\r\n };\r\n }\r\n\r\n _getPolyploidArmColor(chrSetIndex, chrIndex, armIndex) {\r\n if (!this._ploidy.exists(chrSetIndex, chrIndex, armIndex)) {\r\n return 'transparent';\r\n } else {\r\n var ancestor =\r\n this._ploidy.getAncestor(chrSetIndex, chrIndex, armIndex);\r\n return this._config.ancestors[ancestor];\r\n }\r\n }\r\n\r\n}\r\n","export class Range {\r\n\r\n /**\r\n * Chromosome range.\r\n * @public\r\n * @class\r\n * @param {Object} data - range data.\r\n * @param {Integer} data.chr - chromosome index.\r\n * @param {Integer[]} [data.ploidy] - array which controls on which\r\n * chromosomes range should appear in case\r\n * of ploidy.\r\n * @param {Integer} data.start - range start.\r\n * @param {Integer} data.stop - range end.\r\n * @param {String} data.color - range color.\r\n */\r\n constructor(data) {\r\n this._data = data;\r\n this.start = data.start;\r\n this.stop = data.stop;\r\n this.length = this.stop - this.start;\r\n }\r\n\r\n getColor(chrIndex) {\r\n if (!('ploidy' in this._data)) {\r\n return this._getColor(chrIndex);\r\n } else if ('ploidy' in this._data && this._data.ploidy[chrIndex]) {\r\n return this._getColor(chrIndex);\r\n } else {\r\n return 'transparent';\r\n }\r\n }\r\n\r\n _getColor(chrIndex) {\r\n if (Array.isArray(this._data.color)) {\r\n return this._data.color[chrIndex];\r\n } else {\r\n return this._data.color;\r\n }\r\n }\r\n\r\n}\r\n","/* eslint-disable no-use-before-define */\r\nimport {Color} from './../color';\r\nimport {Range} from './../range';\r\n\r\nexport class Chromosome {\r\n\r\n constructor(adapter, config, ideo) {\r\n this._adapter = adapter;\r\n this._model = this._adapter.getModel();\r\n this._config = config;\r\n this._ideo = ideo;\r\n this._color = new Color(this._config);\r\n this._bumpCoefficient = 5;\r\n }\r\n\r\n /**\r\n * Factory method\r\n */\r\n static getInstance(adapter, config, ideo) {\r\n const centromerePosition = adapter.getModel().centromerePosition;\r\n if (centromerePosition === 'telocentric-p') {\r\n return new TelocentricPChromosome(adapter, config, ideo);\r\n } else if (centromerePosition === 'telocentric-q') {\r\n return new TelocentricQChromosome(adapter, config, ideo);\r\n } else {\r\n return new MetacentricChromosome(adapter, config, ideo);\r\n }\r\n }\r\n\r\n _addPArmShape(clipPath, isPArmRendered) {\r\n if (isPArmRendered) {\r\n return clipPath.concat(this._getPArmShape());\r\n } else {\r\n return clipPath;\r\n }\r\n }\r\n\r\n _addQArmShape(clipPath, isQArmRendered) {\r\n if (isQArmRendered) {\r\n return clipPath.concat(this._getQArmShape());\r\n } else {\r\n return clipPath;\r\n }\r\n }\r\n\r\n /**\r\n * Append bands container and apply clip-path to it\r\n */\r\n render(container, chrSetIndex, chrIndex) {\r\n\r\n var self, isPArmRendered, isQArmRendered, clipPath, opacity, fill,\r\n isFullyBanded;\r\n\r\n self = this;\r\n\r\n container = container.append('g')\r\n .attr('class', 'bands')\r\n .attr('clip-path',\r\n 'url(#' + this._model.id + '-chromosome-set-clippath)'\r\n );\r\n\r\n // Render chromosome arms\r\n isPArmRendered = this._renderArm(container, chrSetIndex, chrIndex, 'p');\r\n isQArmRendered = this._renderArm(container, chrSetIndex, chrIndex, 'q');\r\n\r\n // Render range set\r\n this._renderRangeSet(container, chrSetIndex, chrIndex);\r\n\r\n // Push arms shape string into clipPath array\r\n clipPath = [];\r\n clipPath = this._addPArmShape(clipPath, isPArmRendered);\r\n clipPath = this._addQArmShape(clipPath, isQArmRendered);\r\n\r\n opacity = '0';\r\n fill = '';\r\n isFullyBanded = this.isFullyBanded();\r\n if (\r\n 'ancestors' in this._ideo.config &&\r\n !('rangeSet' in this._ideo.config)\r\n ) {\r\n // E.g. diploid human genome (with translucent overlay)\r\n fill = self._color.getArmColor(chrSetIndex, chrIndex, 0);\r\n if (isFullyBanded) {\r\n opacity = '0.5';\r\n }\r\n } else if (isFullyBanded) {\r\n // E.g. mouse reference genome\r\n opacity = null;\r\n fill = 'transparent';\r\n } else if (!('ancestors' in this._ideo.config)) {\r\n // E.g. chimpanzee assembly Pan_tro 3.0\r\n opacity = '1';\r\n }\r\n\r\n let centromereFill;\r\n if (this._ideo.config.chrFillColor) {\r\n const fillColor = self._color.getFillColor();\r\n fill = fillColor.arm;\r\n centromereFill = fillColor.centromere;\r\n }\r\n\r\n // Render chromosome border\r\n container.append('g')\r\n .attr('class', 'chromosome-border')\r\n .selectAll('path')\r\n .data(clipPath)\r\n .enter()\r\n .append('path')\r\n .attr('fill', fill)\r\n .style('fill-opacity', opacity)\r\n .style('fill', function(d) {\r\n if (d.class === 'acen' && centromereFill) {\r\n return centromereFill;\r\n }\r\n })\r\n .attr('stroke', function(d, i) {\r\n return self._color.getBorderColor(chrSetIndex, chrIndex, i);\r\n })\r\n .attr('stroke-width', function(d) {\r\n return ('strokeWidth' in d ? d.strokeWidth : 1);\r\n })\r\n .attr('d', function(d) {\r\n return d.path;\r\n }).attr('class', function(d) {\r\n return d.class;\r\n });\r\n\r\n return clipPath;\r\n }\r\n\r\n _renderRangeSet(container, chrSetIndex, chrIndex) {\r\n\r\n var self, rangeSet, rangesContainer, ideo;\r\n\r\n if (!('rangeSet' in this._config)) {\r\n return;\r\n }\r\n\r\n rangeSet = this._config.rangeSet.filter(function(range) {\r\n return range.chr - 1 === chrSetIndex;\r\n }).map(function(range) {\r\n return new Range(range);\r\n });\r\n\r\n rangesContainer = container.append('g').attr('class', 'range-set');\r\n\r\n self = this;\r\n ideo = self._ideo;\r\n\r\n rangesContainer.selectAll('rect.range')\r\n .data(rangeSet)\r\n .enter()\r\n .append('rect')\r\n .attr('class', 'range')\r\n .attr('x', function(range) {\r\n return ideo.convertBpToPx(self._model, range.start);\r\n }).attr('y', 0)\r\n .attr('width', function(range) {\r\n return ideo.convertBpToPx(self._model, range.length);\r\n }).attr('height', this._config.chrWidth)\r\n .style('fill', function(range) {\r\n return range.getColor(chrIndex);\r\n });\r\n }\r\n\r\n /**\r\n * Get chromosome's shape main values\r\n */\r\n _getShapeData() {\r\n\r\n var firstQBand, i, lastBand, rightTerminalPosition;\r\n\r\n // First q band from bands sequence\r\n for (i = 0; i < this._model.bands.length; i++) {\r\n if (this._model.bands[i].name[0] === 'q') {\r\n firstQBand = this._model.bands[i];\r\n break;\r\n }\r\n }\r\n\r\n // Chromosome's right position\r\n lastBand = this._model.bands.length - 1;\r\n rightTerminalPosition = this._model.bands[lastBand].px.stop;\r\n\r\n // Properties description:\r\n // x1 - left terminal start position\r\n // x2 - centromere position\r\n // x3 - right terminal end position\r\n // w - chromosome width\r\n // b - bump size\r\n return {\r\n x1: 0,\r\n x2: firstQBand ? firstQBand.px.start : rightTerminalPosition,\r\n x3: rightTerminalPosition,\r\n w: this._config.chrWidth,\r\n b: this._config.chrWidth / this._bumpCoefficient\r\n };\r\n }\r\n\r\n _getPArmShape() {\r\n var d = this._getShapeData(),\r\n x = d.x2 - d.b;\r\n\r\n if (this.isFullyBanded() || 'ancestors' in this._ideo.config) {\r\n // Encountered when chromosome has any of:\r\n // - One placeholder \"band\", e.g. pig genome GCF_000003025.5\r\n // - Many (> 2) bands, e.g. human reference genome\r\n // - Ancestor colors in ploidy configuration, as in ploidy-basic.html\r\n return {\r\n class: '',\r\n path:\r\n 'M' + d.b + ',0 ' +\r\n 'L' + x + ',0 ' +\r\n 'Q' + (d.x2 + d.b) + ',' + (d.w / 2) + ',' + x + ',' + d.w + ' ' +\r\n 'L' + d.b + ',' + d.w + ' ' +\r\n 'Q-' + d.b + ',' + (d.w / 2) + ',' + d.b + ',0'\r\n };\r\n } else {\r\n // e.g. chimpanzee assembly Pan_tro 3.0\r\n return [{\r\n class: '',\r\n path:\r\n 'M' + d.b + ',0 ' +\r\n 'L' + (x - 2) + ',0 ' +\r\n 'L' + (x - 2) + ',' + d.w + ' ' +\r\n 'L' + d.b + ',' + d.w + ' ' +\r\n 'Q-' + d.b + ',' + (d.w / 2) + ',' + d.b + ',0'\r\n }, {\r\n class: 'acen',\r\n path:\r\n 'M' + x + ',0 ' +\r\n 'Q' + (d.x2 + d.b) + ',' + (d.w / 2) + ',' + x + ',' + d.w + ' ' +\r\n 'L' + x + ',' + d.w + ' ' +\r\n 'L' + (x - 2) + ',' + d.w + ' ' +\r\n 'L' + (x - 2) + ',0'\r\n }];\r\n }\r\n }\r\n\r\n _getQArmShape() {\r\n var d = this._getShapeData(),\r\n x = d.x3 - d.b,\r\n x2b = d.x2 + d.b;\r\n\r\n if (this.isFullyBanded() || 'ancestors' in this._ideo.config) {\r\n return {\r\n class: '',\r\n path:\r\n 'M' + x2b + ',0 ' +\r\n 'L' + x + ',0 ' +\r\n 'Q' + (d.x3 + d.b) + ',' + (d.w / 2) + ',' + x + ',' + d.w + ' ' +\r\n 'L' + x2b + ',' + d.w + ' ' +\r\n 'Q' + (d.x2 - d.b) + ',' + (d.w / 2) + ',' + x2b + ',0'\r\n };\r\n } else {\r\n // e.g. chimpanzee assembly Pan_tro 3.0\r\n return [{\r\n path:\r\n 'M' + x2b + ',0 ' +\r\n 'L' + x + ',0 ' +\r\n 'Q' + (d.x3 + d.b) + ',' + (d.w / 2) + ',' + x + ',' + d.w + ' ' +\r\n 'L' + x2b + ',' + d.w + ' ' +\r\n 'L' + x2b + ',0'\r\n }, {\r\n class: 'acen',\r\n path:\r\n 'M' + x2b + ',0' +\r\n 'Q' + (d.x2 - d.b) + ',' + (d.w / 2) + ',' + x2b + ',' + d.w + ' ' +\r\n 'L' + x2b + ',' + d.w +\r\n 'L' + (x2b + 2) + ',' + d.w +\r\n 'L' + (x2b + 2) + ',0'\r\n }];\r\n }\r\n }\r\n\r\n isFullyBanded() {\r\n return (\r\n this._model.bands &&\r\n (this._model.bands.length !== 2 || this._model.bands[0].name[0] === 'q')\r\n );\r\n }\r\n\r\n /**\r\n * Render arm bands\r\n */\r\n _renderBands(container, chrSetIndex, chrIndex, bands, arm) {\r\n\r\n var self, armIndex, fill;\r\n\r\n self = this;\r\n armIndex = arm === 'p' ? 0 : 1;\r\n fill = '';\r\n\r\n if ('ancestors' in self._ideo.config && !(self.isFullyBanded())) {\r\n fill = self._color.getArmColor(chrSetIndex, chrIndex, armIndex);\r\n }\r\n\r\n container.selectAll('path.band.' + arm)\r\n .data(bands)\r\n .enter()\r\n .append('path')\r\n .attr('id', function(d) {\r\n return self._model.id + '-' + d.name.replace('.', '-');\r\n })\r\n .attr('class', function(d) {\r\n return 'band ' + arm + '-band ' + d.stain;\r\n })\r\n .attr('d', function(d) {\r\n var start, length;\r\n\r\n start = self._ideo.round(d.px.start);\r\n length = self._ideo.round(d.px.width);\r\n\r\n return 'M ' + start + ', 0' +\r\n 'l ' + length + ' 0 ' +\r\n 'l 0 ' + self._config.chrWidth + ' ' +\r\n 'l -' + length + ' 0 z';\r\n })\r\n .style('fill', fill);\r\n }\r\n\r\n /**\r\n * Render a chromosome arm.\r\n * Returns boolean indicating if any bands were rendered.\r\n */\r\n _renderArm(container, chrSetIndex, chrIndex, arm) {\r\n var bands = this._model.bands.filter(function(band) {\r\n return band.name[0] === arm;\r\n });\r\n\r\n this._renderBands(container, chrSetIndex, chrIndex, bands, arm);\r\n\r\n return Boolean(bands.length);\r\n }\r\n}\r\n\r\nexport class MetacentricChromosome extends Chromosome {\r\n\r\n constructor(model, config, ideo) {\r\n super(model, config, ideo);\r\n this._class = 'MetacentricChromosome';\r\n }\r\n}\r\n\r\nexport class TelocentricPChromosome extends Chromosome {\r\n\r\n constructor(model, config, ideo) {\r\n // alert('p')\r\n super(model, config, ideo);\r\n this._class = 'TelocentricPChromosome';\r\n this._pArmOffset = 3;\r\n }\r\n\r\n _addPArmShape(clipPath) {\r\n return clipPath.concat(this._getPArmShape());\r\n }\r\n\r\n _getPArmShape() {\r\n // Properties description:\r\n // x1 - left terminal start position\r\n // x2 - centromere position\r\n // x3 - right terminal end position\r\n // w - chromosome width\r\n // b - bump size\r\n var d = this._getShapeData();\r\n d.o = this._pArmOffset;\r\n\r\n return [{\r\n class: 'acen',\r\n path: 'M' + (d.x2 + 2) + ',1' +\r\n 'L' + (d.x2 + d.o + 3.25) + ',1 ' +\r\n 'L' + (d.x2 + d.o + 3.25) + ',' + (d.w - 1) + ' ' +\r\n 'L' + (d.x2 + 2) + ',' + (d.w - 1)\r\n }, {\r\n class: 'gpos66',\r\n path: 'M' + (d.x2 - d.o + 5) + ',0' +\r\n 'L' + (d.x2 - d.o + 3) + ',0 ' +\r\n 'L' + (d.x2 - d.o + 3) + ',' + d.w + ' ' +\r\n 'L' + (d.x2 - d.o + 5) + ',' + d.w,\r\n strokeWidth: 0.5\r\n }];\r\n }\r\n\r\n _getQArmShape() {\r\n // Properties description:\r\n // x1 - left terminal start position\r\n // x2 - centromere position\r\n // x3 - right terminal end position\r\n // w - chromosome width\r\n // b - bump size\r\n var d = this._getShapeData(),\r\n x = d.x3 - d.b,\r\n o = this._pArmOffset + 3;\r\n\r\n return {\r\n class: '',\r\n path:\r\n 'M' + (d.x2 + o) + ',0 ' +\r\n 'L' + x + ',0 ' +\r\n 'Q' + (d.x3 + d.b) + ',' + (d.w / 2) + ',' + x + ',' + d.w + ' ' +\r\n 'L' + (d.x2 + o) + ',' + d.w\r\n };\r\n }\r\n}\r\n\r\nexport class TelocentricQChromosome extends Chromosome {\r\n\r\n constructor(model, config, ideo) {\r\n // alert('q')\r\n super(model, config, ideo);\r\n this._class = 'TelocentricQChromosome';\r\n this._qArmOffset = 3;\r\n }\r\n\r\n _getPArmShape() {\r\n // Properties description:\r\n // x1 - left terminal start position\r\n // x2 - centromere position\r\n // x3 - right terminal end position\r\n // w - chromosome width\r\n // b - bump size\r\n\r\n var d = this._getShapeData(),\r\n x = d.x3 - d.b,\r\n o = this._qArmOffset;\r\n\r\n return {\r\n class: '',\r\n path:\r\n // 'M1,0, ' +\r\n 'M' + (d.x2 + o) + ',0 ' +\r\n 'L' + (x + o) + ',0 ' +\r\n 'L' + (x + o) + ',' + d.w + ' ' +\r\n 'L' + d.b + ',' + d.w + ' ' +\r\n 'Q-' + d.b + ',' + (d.w / 2) + ',' + d.b + ',0'\r\n };\r\n }\r\n\r\n _addQArmShape(clipPath) {\r\n return clipPath.concat(this._getQArmShape());\r\n }\r\n\r\n _getQArmShape() {\r\n // Properties description:\r\n // x1 - left terminal start position\r\n // x2 - centromere position\r\n // x3 - right terminal end position\r\n // w - chromosome width\r\n // b - bump size\r\n var d = this._getShapeData();\r\n d.o = this._qArmOffset;\r\n\r\n return [{\r\n class: 'acen',\r\n path: 'M' + (d.x2 + 2) + ',1 ' +\r\n 'L' + (d.x2 + d.o + 3.25) + ',1 ' +\r\n 'L' + (d.x2 + d.o + 3.25) + ',' + (d.w - 1) + ' ' +\r\n 'L' + (d.x2 + 2) + ',' + (d.w - 1)\r\n }, {\r\n class: 'gpos66',\r\n path: 'M' + (d.x2 + d.o + 5) + ',0 ' +\r\n 'L' + (d.x2 + d.o + 3) + ',0 ' +\r\n 'L' + (d.x2 + d.o + 3) + ',' + d.w + ' ' +\r\n 'L' + (d.x2 + d.o + 5) + ',' + d.w,\r\n strokeWidth: 0.5\r\n }];\r\n }\r\n}\r\n","import {d3} from '../lib';\r\nimport {initTools} from '../tools/tools';\r\nimport {ModelAdapter} from '../model-adapter';\r\nimport {Chromosome} from './chromosome';\r\n\r\n/**\r\n * Adds a copy of a chromosome (i.e. a homologous chromosome, homolog) to DOM\r\n *\r\n * @param chrModel\r\n * @param chrIndex\r\n * @param homologIndex\r\n * @param container\r\n */\r\nfunction appendHomolog(chrModel, chrIndex, homologIndex, container) {\r\n\r\n var homologOffset, chromosome, shape, defs, adapter;\r\n\r\n defs = d3.select(this.selector + ' defs');\r\n // Get chromosome model adapter class\r\n adapter = ModelAdapter.getInstance(chrModel);\r\n\r\n // How far this copy of the chromosome is from another\r\n homologOffset = homologIndex * this.config.chrMargin;\r\n\r\n // Append chromosome's container\r\n chromosome = container\r\n .append('g')\r\n .attr('id', chrModel.id)\r\n .attr('class', 'chromosome ' + adapter.getCssClass())\r\n .attr('transform', 'translate(0, ' + homologOffset + ')');\r\n\r\n // Render chromosome\r\n shape = Chromosome.getInstance(adapter, this.config, this)\r\n .render(chromosome, chrIndex, homologIndex);\r\n\r\n d3.select('#' + chrModel.id + '-chromosome-set-clippath').remove();\r\n\r\n defs.append('clipPath')\r\n .attr('id', chrModel.id + '-chromosome-set-clippath')\r\n .selectAll('path')\r\n .data(shape)\r\n .enter()\r\n .append('path')\r\n .attr('d', function(d) {return d.path;})\r\n .attr('class', function(d) {return d.class;});\r\n\r\n\r\n if (chrModel.width < 1) {\r\n d3.select('#' + chrModel.id + ' .bands').style('opacity', 0);\r\n }\r\n}\r\n\r\n/**\r\n * Renders all the bands and outlining boundaries of a chromosome.\r\n */\r\nfunction drawChromosome(chrModel) {\r\n var chrIndex, container, numChrsInSet, transform, homologIndex,\r\n chrSetSelector;\r\n\r\n chrIndex = chrModel.chrIndex;\r\n\r\n transform = this._layout.getChromosomeSetTranslate(chrIndex);\r\n\r\n chrSetSelector = this.selector + ' #' + chrModel.id + '-chromosome-set';\r\n\r\n d3.selectAll(chrSetSelector + ' g').remove();\r\n\r\n container = d3.select(chrSetSelector);\r\n\r\n if (container.nodes().length === 0) {\r\n // Append chromosome set container\r\n container = d3.select(this.selector)\r\n .append('g')\r\n .attr('class', 'chromosome-set')\r\n .attr('transform', transform)\r\n .attr('id', chrModel.id + '-chromosome-set');\r\n }\r\n\r\n if (\r\n 'sex' in this.config &&\r\n this.config.ploidy === 2 &&\r\n this.sexChromosomes.index === chrIndex\r\n ) {\r\n this.drawSexChromosomes(container, chrIndex);\r\n return;\r\n }\r\n\r\n numChrsInSet = 1;\r\n if (this.config.ploidy > 1) {\r\n numChrsInSet = this._ploidy.getChromosomesNumber(chrIndex);\r\n }\r\n\r\n for (homologIndex = 0; homologIndex < numChrsInSet; homologIndex++) {\r\n this.appendHomolog(chrModel, chrIndex, homologIndex, container);\r\n }\r\n}\r\n\r\n/**\r\n * Rotates a chromosome 90 degrees and shows or hides all other chromosomes\r\n * Useful for focusing or defocusing a particular chromosome\r\n */\r\nfunction rotateAndToggleDisplay(chrElement) {\r\n var chrName, chrModel, chrIndex;\r\n\r\n this.unhighlight();\r\n\r\n // Do nothing if taxid not defined. But it should be defined.\r\n // To fix that bug we should have a way to find chromosome set number.\r\n if (!this.config.taxid) return;\r\n\r\n chrName = chrElement.id.split('-')[0].replace('chr', '');\r\n chrModel = this.chromosomes[this.config.taxid][chrName];\r\n chrIndex = chrModel.chrIndex;\r\n\r\n this._layout.rotate(chrIndex, chrIndex, chrElement);\r\n}\r\n\r\nfunction setOverflowScroll() {\r\n var ideo, config, ideoWidth, ideoInnerWrap, ideoMiddleWrap, ideoSvg,\r\n ploidy, ploidyPad;\r\n\r\n ideo = this;\r\n config = ideo.config;\r\n\r\n ideoSvg = d3.select(config.container + ' svg#_ideogram');\r\n ideoInnerWrap = d3.select(config.container + ' #_ideogramInnerWrap');\r\n ideoMiddleWrap = d3.select(config.container + ' #_ideogramMiddleWrap');\r\n\r\n ploidy = config.ploidy;\r\n if (ploidy === 1) {\r\n ploidyPad = ploidy;\r\n } else {\r\n ploidyPad = ploidy * 1.12;\r\n }\r\n\r\n let annotHeight = 0;\r\n if ('annotationsLayout' in config) {\r\n annotHeight = config.annotationHeight * config.numAnnotTracks;\r\n }\r\n\r\n if (\r\n config.orientation === 'vertical' &&\r\n config.perspective !== 'comparative' &&\r\n config.geometry !== 'collinear'\r\n ) {\r\n ideoWidth =\r\n (ideo.numChromosomes) *\r\n (config.chrWidth + config.chrMargin + annotHeight);\r\n } else {\r\n return;\r\n }\r\n\r\n if (config.annotationsLayout === 'heatmap-2d') {\r\n return;\r\n }\r\n\r\n ideoWidth = Math.ceil(ideoWidth * ploidyPad / config.rows);\r\n if (ideo._layout._class === 'SmallLayout') ideoWidth += 100;\r\n\r\n ideoWidth += 35; // Account for settings gear\r\n\r\n // Ensures absolutely-positioned elements, e.g. heatmap overlaps, display\r\n // properly if ideogram container also has position: absolute\r\n ideoMiddleWrap.style('height', ideo._layout.getHeight() + 'px');\r\n\r\n ideoInnerWrap\r\n .style('max-width', ideoWidth + 'px')\r\n .style('overflow-x', 'scroll')\r\n .style('position', 'absolute');\r\n\r\n ideoSvg.style('min-width', (ideoWidth - 5) + 'px');\r\n\r\n if (ideo.config.showTools) {\r\n initTools(ideo);\r\n }\r\n}\r\n\r\nexport {\r\n appendHomolog, drawChromosome, rotateAndToggleDisplay, setOverflowScroll\r\n};\r\n","import {d3} from '../lib';\r\n\r\nfunction getChrSetLabelLines(d, i, ideo) {\r\n var lines;\r\n if (d.name.indexOf(' ') === -1) {\r\n lines = [d.name];\r\n } else {\r\n lines = d.name.match(/^(.*)\\s+([^\\s]+)$/).slice(1).reverse();\r\n }\r\n\r\n if (\r\n 'sex' in ideo.config &&\r\n ideo.config.ploidy === 2 &&\r\n i === ideo.sexChromosomes.index\r\n ) {\r\n if (ideo.config.sex === 'male') {\r\n lines = ['XY'];\r\n } else {\r\n lines = ['XX'];\r\n }\r\n }\r\n\r\n return lines;\r\n}\r\n\r\nfunction renderChromosomeSetLabel(d, i, textElement, ideo) {\r\n // Get label lines\r\n var lines = getChrSetLabelLines(d, i, ideo);\r\n\r\n // Render label lines\r\n d3.select(textElement).selectAll('tspan')\r\n .data(lines)\r\n .enter()\r\n .append('tspan')\r\n .attr('dy', function(d, i) {\r\n return i * -1.2 + 'em';\r\n })\r\n .attr('x', ideo._layout.getChromosomeSetLabelXPosition())\r\n .attr('class', function(a, i) {\r\n var fullLabels = ideo.config.fullChromosomeLabels;\r\n return i === 1 && fullLabels ? 'italic' : null;\r\n })\r\n .text(String);\r\n}\r\n\r\nfunction appendChromosomeSetLabels(ideo) {\r\n var layout = ideo._layout;\r\n\r\n d3.selectAll(ideo.selector + ' .chromosome-set')\r\n .insert('text', ':first-child')\r\n .data(ideo.chromosomesArray)\r\n .attr('class', layout.getChromosomeLabelClass())\r\n .attr('transform', layout.getChromosomeSetLabelTranslate())\r\n .attr('x', layout.getChromosomeSetLabelXPosition())\r\n .attr('y', function(d, i) {\r\n return layout.getChromosomeSetLabelYPosition(i);\r\n })\r\n .attr('text-anchor', layout.getChromosomeSetLabelAnchor())\r\n .each(function(d, i) {\r\n renderChromosomeSetLabel(d, i, this, ideo);\r\n });\r\n}\r\n\r\nfunction appendChromosomeLabels(ideo) {\r\n var layout = ideo._layout;\r\n\r\n d3.selectAll(ideo.selector + ' .chromosome-set')\r\n .each(function(a, chrSetIndex) {\r\n d3.select(this).selectAll('.chromosome')\r\n .append('text')\r\n .attr('class', 'chrLabel')\r\n .attr('transform', layout.getChromosomeSetLabelTranslate())\r\n .attr('x', function(d, i) {\r\n return layout.getChromosomeLabelXPosition(i);\r\n })\r\n .attr('y', function(d, i) {\r\n return layout.getChromosomeLabelYPosition(i);\r\n })\r\n .text(function(d, chrIndex) {\r\n return ideo._ploidy.getAncestor(chrSetIndex, chrIndex);\r\n })\r\n .attr('text-anchor', 'middle');\r\n });\r\n}\r\n\r\n/**\r\n * Draws labels for each chromosome, e.g. \"1\", \"2\", \"X\".\r\n * If ideogram configuration has 'fullChromosomeLabels: True',\r\n * then labels includes name of taxon, which can help when\r\n * depicting orthologs.\r\n */\r\nfunction drawChromosomeLabels() {\r\n var ideo = this;\r\n appendChromosomeSetLabels(ideo);\r\n appendChromosomeLabels(ideo);\r\n}\r\n\r\nfunction getLabelPositionAttrs(scale) {\r\n var x, y, scaleSvg;\r\n\r\n if (\r\n typeof (scale) !== 'undefined' &&\r\n scale.hasOwnProperty('x') &&\r\n !(scale.x === 1 && scale.y === 1)\r\n ) {\r\n scaleSvg = 'scale(' + scale.x + ',' + scale.y + ')';\r\n x = -6;\r\n y = (scale === '' ? -16 : -14);\r\n } else {\r\n x = -8;\r\n y = -16;\r\n scale = {x: 1, y: 1};\r\n scaleSvg = '';\r\n }\r\n\r\n return {x: x, y: y, scaleSvg: scaleSvg, scale: scale};\r\n}\r\n\r\nfunction updateChrIndex(chrIndex, config) {\r\n if (config.numAnnotTracks > 1 || config.orientation === '') chrIndex -= 1;\r\n return chrIndex;\r\n}\r\n\r\nfunction rotateVerticalChromosomeLabels(chr, chrIndex, labelPosAttrs, ideo) {\r\n var chrMargin2, chrMargin, y,\r\n config = ideo.config;\r\n\r\n chrIndex = updateChrIndex(chrIndex, config);\r\n\r\n chrMargin2 = -4;\r\n if (config.showBandLabels === true) {\r\n chrMargin2 = config.chrMargin + config.chrWidth + 26;\r\n }\r\n\r\n chrMargin = config.chrMargin * chrIndex;\r\n if (config.numAnnotTracks > 1 === false) chrMargin += 1;\r\n\r\n y = chrMargin + chrMargin2;\r\n\r\n chr.selectAll('text.chrLabel')\r\n .attr('transform', labelPosAttrs.scaleSvg)\r\n .selectAll('tspan')\r\n .attr('x', labelPosAttrs.x)\r\n .attr('y', y);\r\n}\r\n\r\nfunction rotateHorizontalChromosomeLabels(chr, chrIndex, labelPosAttrs, ideo) {\r\n var chrMargin, chrMargin2, tracksHeight, x,\r\n config = ideo.config;\r\n\r\n chrMargin2 = -config.chrWidth - 2;\r\n if (config.showBandLabels === true) chrMargin2 = config.chrMargin + 8;\r\n\r\n tracksHeight = config.annotTracksHeight;\r\n if (config.annotationsLayout !== 'overlay') tracksHeight *= 2;\r\n\r\n chrMargin = config.chrMargin * chrIndex;\r\n x = -(chrMargin + chrMargin2) + 3 + tracksHeight;\r\n x /= labelPosAttrs.scale.x;\r\n\r\n chr.selectAll('text.chrLabel')\r\n .attr('transform', 'rotate(-90)' + labelPosAttrs.scaleSvg)\r\n .selectAll('tspan')\r\n .attr('x', x)\r\n .attr('y', labelPosAttrs.y);\r\n}\r\n\r\n/**\r\n * Rotates chromosome labels by 90 degrees, e.g. upon clicking a chromosome.\r\n */\r\nfunction rotateChromosomeLabels(chr, chrIndex, orientation, scale) {\r\n var labelPosAttrs,\r\n ideo = this;\r\n\r\n chrIndex -= 1;\r\n\r\n labelPosAttrs = getLabelPositionAttrs(scale);\r\n\r\n if (orientation === 'vertical' || orientation === '') {\r\n rotateVerticalChromosomeLabels(chr, chrIndex, labelPosAttrs, ideo);\r\n } else {\r\n rotateHorizontalChromosomeLabels(chr, chrIndex, labelPosAttrs, ideo);\r\n }\r\n}\r\n\r\nexport {drawChromosomeLabels, rotateChromosomeLabels};\r\n","// DEFLATE is a complex format; to read this code, you should probably check the RFC first:\n// https://tools.ietf.org/html/rfc1951\n// You may also wish to take a look at the guide I made about this program:\n// https://gist.github.com/101arrowz/253f31eb5abc3d9275ab943003ffecad\n// Some of the following code is similar to that of UZIP.js:\n// https://github.com/photopea/UZIP.js\n// However, the vast majority of the codebase has diverged from UZIP.js to increase performance and reduce bundle size.\n// Sometimes 0 will appear where -1 would be more appropriate. This is because using a uint\n// is better for memory in most engines (I *think*).\nvar ch2 = {};\nvar wk = (function (c, id, msg, transfer, cb) {\n var w = new Worker(ch2[id] || (ch2[id] = URL.createObjectURL(new Blob([\n c + ';addEventListener(\"error\",function(e){e=e.error;postMessage({$e$:[e.message,e.code,e.stack]})})'\n ], { type: 'text/javascript' }))));\n w.onmessage = function (e) {\n var d = e.data, ed = d.$e$;\n if (ed) {\n var err = new Error(ed[0]);\n err['code'] = ed[1];\n err.stack = ed[2];\n cb(err, null);\n }\n else\n cb(null, d);\n };\n w.postMessage(msg, transfer);\n return w;\n});\n\n// aliases for shorter compressed code (most minifers don't do this)\nvar u8 = Uint8Array, u16 = Uint16Array, u32 = Uint32Array;\n// fixed length extra bits\nvar fleb = new u8([0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, /* unused */ 0, 0, /* impossible */ 0]);\n// fixed distance extra bits\n// see fleb note\nvar fdeb = new u8([0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, /* unused */ 0, 0]);\n// code length index map\nvar clim = new u8([16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15]);\n// get base, reverse index map from extra bits\nvar freb = function (eb, start) {\n var b = new u16(31);\n for (var i = 0; i < 31; ++i) {\n b[i] = start += 1 << eb[i - 1];\n }\n // numbers here are at max 18 bits\n var r = new u32(b[30]);\n for (var i = 1; i < 30; ++i) {\n for (var j = b[i]; j < b[i + 1]; ++j) {\n r[j] = ((j - b[i]) << 5) | i;\n }\n }\n return [b, r];\n};\nvar _a = freb(fleb, 2), fl = _a[0], revfl = _a[1];\n// we can ignore the fact that the other numbers are wrong; they never happen anyway\nfl[28] = 258, revfl[258] = 28;\nvar _b = freb(fdeb, 0), fd = _b[0], revfd = _b[1];\n// map of value to reverse (assuming 16 bits)\nvar rev = new u16(32768);\nfor (var i = 0; i < 32768; ++i) {\n // reverse table algorithm from SO\n var x = ((i & 0xAAAA) >>> 1) | ((i & 0x5555) << 1);\n x = ((x & 0xCCCC) >>> 2) | ((x & 0x3333) << 2);\n x = ((x & 0xF0F0) >>> 4) | ((x & 0x0F0F) << 4);\n rev[i] = (((x & 0xFF00) >>> 8) | ((x & 0x00FF) << 8)) >>> 1;\n}\n// create huffman tree from u8 \"map\": index -> code length for code index\n// mb (max bits) must be at most 15\n// TODO: optimize/split up?\nvar hMap = (function (cd, mb, r) {\n var s = cd.length;\n // index\n var i = 0;\n // u16 \"map\": index -> # of codes with bit length = index\n var l = new u16(mb);\n // length of cd must be 288 (total # of codes)\n for (; i < s; ++i) {\n if (cd[i])\n ++l[cd[i] - 1];\n }\n // u16 \"map\": index -> minimum code for bit length = index\n var le = new u16(mb);\n for (i = 0; i < mb; ++i) {\n le[i] = (le[i - 1] + l[i - 1]) << 1;\n }\n var co;\n if (r) {\n // u16 \"map\": index -> number of actual bits, symbol for code\n co = new u16(1 << mb);\n // bits to remove for reverser\n var rvb = 15 - mb;\n for (i = 0; i < s; ++i) {\n // ignore 0 lengths\n if (cd[i]) {\n // num encoding both symbol and bits read\n var sv = (i << 4) | cd[i];\n // free bits\n var r_1 = mb - cd[i];\n // start value\n var v = le[cd[i] - 1]++ << r_1;\n // m is end value\n for (var m = v | ((1 << r_1) - 1); v <= m; ++v) {\n // every 16 bit value starting with the code yields the same result\n co[rev[v] >>> rvb] = sv;\n }\n }\n }\n }\n else {\n co = new u16(s);\n for (i = 0; i < s; ++i) {\n if (cd[i]) {\n co[i] = rev[le[cd[i] - 1]++] >>> (15 - cd[i]);\n }\n }\n }\n return co;\n});\n// fixed length tree\nvar flt = new u8(288);\nfor (var i = 0; i < 144; ++i)\n flt[i] = 8;\nfor (var i = 144; i < 256; ++i)\n flt[i] = 9;\nfor (var i = 256; i < 280; ++i)\n flt[i] = 7;\nfor (var i = 280; i < 288; ++i)\n flt[i] = 8;\n// fixed distance tree\nvar fdt = new u8(32);\nfor (var i = 0; i < 32; ++i)\n fdt[i] = 5;\n// fixed length map\nvar flm = /*#__PURE__*/ hMap(flt, 9, 0), flrm = /*#__PURE__*/ hMap(flt, 9, 1);\n// fixed distance map\nvar fdm = /*#__PURE__*/ hMap(fdt, 5, 0), fdrm = /*#__PURE__*/ hMap(fdt, 5, 1);\n// find max of array\nvar max = function (a) {\n var m = a[0];\n for (var i = 1; i < a.length; ++i) {\n if (a[i] > m)\n m = a[i];\n }\n return m;\n};\n// read d, starting at bit p and mask with m\nvar bits = function (d, p, m) {\n var o = (p / 8) | 0;\n return ((d[o] | (d[o + 1] << 8)) >> (p & 7)) & m;\n};\n// read d, starting at bit p continuing for at least 16 bits\nvar bits16 = function (d, p) {\n var o = (p / 8) | 0;\n return ((d[o] | (d[o + 1] << 8) | (d[o + 2] << 16)) >> (p & 7));\n};\n// get end of byte\nvar shft = function (p) { return ((p + 7) / 8) | 0; };\n// typed array slice - allows garbage collector to free original reference,\n// while being more compatible than .slice\nvar slc = function (v, s, e) {\n if (s == null || s < 0)\n s = 0;\n if (e == null || e > v.length)\n e = v.length;\n // can't use .constructor in case user-supplied\n var n = new (v.BYTES_PER_ELEMENT == 2 ? u16 : v.BYTES_PER_ELEMENT == 4 ? u32 : u8)(e - s);\n n.set(v.subarray(s, e));\n return n;\n};\n/**\n * Codes for errors generated within this library\n */\nexport var FlateErrorCode = {\n UnexpectedEOF: 0,\n InvalidBlockType: 1,\n InvalidLengthLiteral: 2,\n InvalidDistance: 3,\n StreamFinished: 4,\n NoStreamHandler: 5,\n InvalidHeader: 6,\n NoCallback: 7,\n InvalidUTF8: 8,\n ExtraFieldTooLong: 9,\n InvalidDate: 10,\n FilenameTooLong: 11,\n StreamFinishing: 12,\n InvalidZipData: 13,\n UnknownCompressionMethod: 14\n};\n// error codes\nvar ec = [\n 'unexpected EOF',\n 'invalid block type',\n 'invalid length/literal',\n 'invalid distance',\n 'stream finished',\n 'no stream handler',\n ,\n 'no callback',\n 'invalid UTF-8 data',\n 'extra field too long',\n 'date not in range 1980-2099',\n 'filename too long',\n 'stream finishing',\n 'invalid zip data'\n // determined by unknown compression method\n];\n;\nvar err = function (ind, msg, nt) {\n var e = new Error(msg || ec[ind]);\n e.code = ind;\n if (Error.captureStackTrace)\n Error.captureStackTrace(e, err);\n if (!nt)\n throw e;\n return e;\n};\n// expands raw DEFLATE data\nvar inflt = function (dat, buf, st) {\n // source length\n var sl = dat.length;\n if (!sl || (st && st.f && !st.l))\n return buf || new u8(0);\n // have to estimate size\n var noBuf = !buf || st;\n // no state\n var noSt = !st || st.i;\n if (!st)\n st = {};\n // Assumes roughly 33% compression ratio average\n if (!buf)\n buf = new u8(sl * 3);\n // ensure buffer can fit at least l elements\n var cbuf = function (l) {\n var bl = buf.length;\n // need to increase size to fit\n if (l > bl) {\n // Double or set to necessary, whichever is greater\n var nbuf = new u8(Math.max(bl * 2, l));\n nbuf.set(buf);\n buf = nbuf;\n }\n };\n // last chunk bitpos bytes\n var final = st.f || 0, pos = st.p || 0, bt = st.b || 0, lm = st.l, dm = st.d, lbt = st.m, dbt = st.n;\n // total bits\n var tbts = sl * 8;\n do {\n if (!lm) {\n // BFINAL - this is only 1 when last chunk is next\n final = bits(dat, pos, 1);\n // type: 0 = no compression, 1 = fixed huffman, 2 = dynamic huffman\n var type = bits(dat, pos + 1, 3);\n pos += 3;\n if (!type) {\n // go to end of byte boundary\n var s = shft(pos) + 4, l = dat[s - 4] | (dat[s - 3] << 8), t = s + l;\n if (t > sl) {\n if (noSt)\n err(0);\n break;\n }\n // ensure size\n if (noBuf)\n cbuf(bt + l);\n // Copy over uncompressed data\n buf.set(dat.subarray(s, t), bt);\n // Get new bitpos, update byte count\n st.b = bt += l, st.p = pos = t * 8, st.f = final;\n continue;\n }\n else if (type == 1)\n lm = flrm, dm = fdrm, lbt = 9, dbt = 5;\n else if (type == 2) {\n // literal lengths\n var hLit = bits(dat, pos, 31) + 257, hcLen = bits(dat, pos + 10, 15) + 4;\n var tl = hLit + bits(dat, pos + 5, 31) + 1;\n pos += 14;\n // length+distance tree\n var ldt = new u8(tl);\n // code length tree\n var clt = new u8(19);\n for (var i = 0; i < hcLen; ++i) {\n // use index map to get real code\n clt[clim[i]] = bits(dat, pos + i * 3, 7);\n }\n pos += hcLen * 3;\n // code lengths bits\n var clb = max(clt), clbmsk = (1 << clb) - 1;\n // code lengths map\n var clm = hMap(clt, clb, 1);\n for (var i = 0; i < tl;) {\n var r = clm[bits(dat, pos, clbmsk)];\n // bits read\n pos += r & 15;\n // symbol\n var s = r >>> 4;\n // code length to copy\n if (s < 16) {\n ldt[i++] = s;\n }\n else {\n // copy count\n var c = 0, n = 0;\n if (s == 16)\n n = 3 + bits(dat, pos, 3), pos += 2, c = ldt[i - 1];\n else if (s == 17)\n n = 3 + bits(dat, pos, 7), pos += 3;\n else if (s == 18)\n n = 11 + bits(dat, pos, 127), pos += 7;\n while (n--)\n ldt[i++] = c;\n }\n }\n // length tree distance tree\n var lt = ldt.subarray(0, hLit), dt = ldt.subarray(hLit);\n // max length bits\n lbt = max(lt);\n // max dist bits\n dbt = max(dt);\n lm = hMap(lt, lbt, 1);\n dm = hMap(dt, dbt, 1);\n }\n else\n err(1);\n if (pos > tbts) {\n if (noSt)\n err(0);\n break;\n }\n }\n // Make sure the buffer can hold this + the largest possible addition\n // Maximum chunk size (practically, theoretically infinite) is 2^17;\n if (noBuf)\n cbuf(bt + 131072);\n var lms = (1 << lbt) - 1, dms = (1 << dbt) - 1;\n var lpos = pos;\n for (;; lpos = pos) {\n // bits read, code\n var c = lm[bits16(dat, pos) & lms], sym = c >>> 4;\n pos += c & 15;\n if (pos > tbts) {\n if (noSt)\n err(0);\n break;\n }\n if (!c)\n err(2);\n if (sym < 256)\n buf[bt++] = sym;\n else if (sym == 256) {\n lpos = pos, lm = null;\n break;\n }\n else {\n var add = sym - 254;\n // no extra bits needed if less\n if (sym > 264) {\n // index\n var i = sym - 257, b = fleb[i];\n add = bits(dat, pos, (1 << b) - 1) + fl[i];\n pos += b;\n }\n // dist\n var d = dm[bits16(dat, pos) & dms], dsym = d >>> 4;\n if (!d)\n err(3);\n pos += d & 15;\n var dt = fd[dsym];\n if (dsym > 3) {\n var b = fdeb[dsym];\n dt += bits16(dat, pos) & ((1 << b) - 1), pos += b;\n }\n if (pos > tbts) {\n if (noSt)\n err(0);\n break;\n }\n if (noBuf)\n cbuf(bt + 131072);\n var end = bt + add;\n for (; bt < end; bt += 4) {\n buf[bt] = buf[bt - dt];\n buf[bt + 1] = buf[bt + 1 - dt];\n buf[bt + 2] = buf[bt + 2 - dt];\n buf[bt + 3] = buf[bt + 3 - dt];\n }\n bt = end;\n }\n }\n st.l = lm, st.p = lpos, st.b = bt, st.f = final;\n if (lm)\n final = 1, st.m = lbt, st.d = dm, st.n = dbt;\n } while (!final);\n return bt == buf.length ? buf : slc(buf, 0, bt);\n};\n// starting at p, write the minimum number of bits that can hold v to d\nvar wbits = function (d, p, v) {\n v <<= p & 7;\n var o = (p / 8) | 0;\n d[o] |= v;\n d[o + 1] |= v >>> 8;\n};\n// starting at p, write the minimum number of bits (>8) that can hold v to d\nvar wbits16 = function (d, p, v) {\n v <<= p & 7;\n var o = (p / 8) | 0;\n d[o] |= v;\n d[o + 1] |= v >>> 8;\n d[o + 2] |= v >>> 16;\n};\n// creates code lengths from a frequency table\nvar hTree = function (d, mb) {\n // Need extra info to make a tree\n var t = [];\n for (var i = 0; i < d.length; ++i) {\n if (d[i])\n t.push({ s: i, f: d[i] });\n }\n var s = t.length;\n var t2 = t.slice();\n if (!s)\n return [et, 0];\n if (s == 1) {\n var v = new u8(t[0].s + 1);\n v[t[0].s] = 1;\n return [v, 1];\n }\n t.sort(function (a, b) { return a.f - b.f; });\n // after i2 reaches last ind, will be stopped\n // freq must be greater than largest possible number of symbols\n t.push({ s: -1, f: 25001 });\n var l = t[0], r = t[1], i0 = 0, i1 = 1, i2 = 2;\n t[0] = { s: -1, f: l.f + r.f, l: l, r: r };\n // efficient algorithm from UZIP.js\n // i0 is lookbehind, i2 is lookahead - after processing two low-freq\n // symbols that combined have high freq, will start processing i2 (high-freq,\n // non-composite) symbols instead\n // see https://reddit.com/r/photopea/comments/ikekht/uzipjs_questions/\n while (i1 != s - 1) {\n l = t[t[i0].f < t[i2].f ? i0++ : i2++];\n r = t[i0 != i1 && t[i0].f < t[i2].f ? i0++ : i2++];\n t[i1++] = { s: -1, f: l.f + r.f, l: l, r: r };\n }\n var maxSym = t2[0].s;\n for (var i = 1; i < s; ++i) {\n if (t2[i].s > maxSym)\n maxSym = t2[i].s;\n }\n // code lengths\n var tr = new u16(maxSym + 1);\n // max bits in tree\n var mbt = ln(t[i1 - 1], tr, 0);\n if (mbt > mb) {\n // more algorithms from UZIP.js\n // TODO: find out how this code works (debt)\n // ind debt\n var i = 0, dt = 0;\n // left cost\n var lft = mbt - mb, cst = 1 << lft;\n t2.sort(function (a, b) { return tr[b.s] - tr[a.s] || a.f - b.f; });\n for (; i < s; ++i) {\n var i2_1 = t2[i].s;\n if (tr[i2_1] > mb) {\n dt += cst - (1 << (mbt - tr[i2_1]));\n tr[i2_1] = mb;\n }\n else\n break;\n }\n dt >>>= lft;\n while (dt > 0) {\n var i2_2 = t2[i].s;\n if (tr[i2_2] < mb)\n dt -= 1 << (mb - tr[i2_2]++ - 1);\n else\n ++i;\n }\n for (; i >= 0 && dt; --i) {\n var i2_3 = t2[i].s;\n if (tr[i2_3] == mb) {\n --tr[i2_3];\n ++dt;\n }\n }\n mbt = mb;\n }\n return [new u8(tr), mbt];\n};\n// get the max length and assign length codes\nvar ln = function (n, l, d) {\n return n.s == -1\n ? Math.max(ln(n.l, l, d + 1), ln(n.r, l, d + 1))\n : (l[n.s] = d);\n};\n// length codes generation\nvar lc = function (c) {\n var s = c.length;\n // Note that the semicolon was intentional\n while (s && !c[--s])\n ;\n var cl = new u16(++s);\n // ind num streak\n var cli = 0, cln = c[0], cls = 1;\n var w = function (v) { cl[cli++] = v; };\n for (var i = 1; i <= s; ++i) {\n if (c[i] == cln && i != s)\n ++cls;\n else {\n if (!cln && cls > 2) {\n for (; cls > 138; cls -= 138)\n w(32754);\n if (cls > 2) {\n w(cls > 10 ? ((cls - 11) << 5) | 28690 : ((cls - 3) << 5) | 12305);\n cls = 0;\n }\n }\n else if (cls > 3) {\n w(cln), --cls;\n for (; cls > 6; cls -= 6)\n w(8304);\n if (cls > 2)\n w(((cls - 3) << 5) | 8208), cls = 0;\n }\n while (cls--)\n w(cln);\n cls = 1;\n cln = c[i];\n }\n }\n return [cl.subarray(0, cli), s];\n};\n// calculate the length of output from tree, code lengths\nvar clen = function (cf, cl) {\n var l = 0;\n for (var i = 0; i < cl.length; ++i)\n l += cf[i] * cl[i];\n return l;\n};\n// writes a fixed block\n// returns the new bit pos\nvar wfblk = function (out, pos, dat) {\n // no need to write 00 as type: TypedArray defaults to 0\n var s = dat.length;\n var o = shft(pos + 2);\n out[o] = s & 255;\n out[o + 1] = s >>> 8;\n out[o + 2] = out[o] ^ 255;\n out[o + 3] = out[o + 1] ^ 255;\n for (var i = 0; i < s; ++i)\n out[o + i + 4] = dat[i];\n return (o + 4 + s) * 8;\n};\n// writes a block\nvar wblk = function (dat, out, final, syms, lf, df, eb, li, bs, bl, p) {\n wbits(out, p++, final);\n ++lf[256];\n var _a = hTree(lf, 15), dlt = _a[0], mlb = _a[1];\n var _b = hTree(df, 15), ddt = _b[0], mdb = _b[1];\n var _c = lc(dlt), lclt = _c[0], nlc = _c[1];\n var _d = lc(ddt), lcdt = _d[0], ndc = _d[1];\n var lcfreq = new u16(19);\n for (var i = 0; i < lclt.length; ++i)\n lcfreq[lclt[i] & 31]++;\n for (var i = 0; i < lcdt.length; ++i)\n lcfreq[lcdt[i] & 31]++;\n var _e = hTree(lcfreq, 7), lct = _e[0], mlcb = _e[1];\n var nlcc = 19;\n for (; nlcc > 4 && !lct[clim[nlcc - 1]]; --nlcc)\n ;\n var flen = (bl + 5) << 3;\n var ftlen = clen(lf, flt) + clen(df, fdt) + eb;\n var dtlen = clen(lf, dlt) + clen(df, ddt) + eb + 14 + 3 * nlcc + clen(lcfreq, lct) + (2 * lcfreq[16] + 3 * lcfreq[17] + 7 * lcfreq[18]);\n if (flen <= ftlen && flen <= dtlen)\n return wfblk(out, p, dat.subarray(bs, bs + bl));\n var lm, ll, dm, dl;\n wbits(out, p, 1 + (dtlen < ftlen)), p += 2;\n if (dtlen < ftlen) {\n lm = hMap(dlt, mlb, 0), ll = dlt, dm = hMap(ddt, mdb, 0), dl = ddt;\n var llm = hMap(lct, mlcb, 0);\n wbits(out, p, nlc - 257);\n wbits(out, p + 5, ndc - 1);\n wbits(out, p + 10, nlcc - 4);\n p += 14;\n for (var i = 0; i < nlcc; ++i)\n wbits(out, p + 3 * i, lct[clim[i]]);\n p += 3 * nlcc;\n var lcts = [lclt, lcdt];\n for (var it = 0; it < 2; ++it) {\n var clct = lcts[it];\n for (var i = 0; i < clct.length; ++i) {\n var len = clct[i] & 31;\n wbits(out, p, llm[len]), p += lct[len];\n if (len > 15)\n wbits(out, p, (clct[i] >>> 5) & 127), p += clct[i] >>> 12;\n }\n }\n }\n else {\n lm = flm, ll = flt, dm = fdm, dl = fdt;\n }\n for (var i = 0; i < li; ++i) {\n if (syms[i] > 255) {\n var len = (syms[i] >>> 18) & 31;\n wbits16(out, p, lm[len + 257]), p += ll[len + 257];\n if (len > 7)\n wbits(out, p, (syms[i] >>> 23) & 31), p += fleb[len];\n var dst = syms[i] & 31;\n wbits16(out, p, dm[dst]), p += dl[dst];\n if (dst > 3)\n wbits16(out, p, (syms[i] >>> 5) & 8191), p += fdeb[dst];\n }\n else {\n wbits16(out, p, lm[syms[i]]), p += ll[syms[i]];\n }\n }\n wbits16(out, p, lm[256]);\n return p + ll[256];\n};\n// deflate options (nice << 13) | chain\nvar deo = /*#__PURE__*/ new u32([65540, 131080, 131088, 131104, 262176, 1048704, 1048832, 2114560, 2117632]);\n// empty\nvar et = /*#__PURE__*/ new u8(0);\n// compresses data into a raw DEFLATE buffer\nvar dflt = function (dat, lvl, plvl, pre, post, lst) {\n var s = dat.length;\n var o = new u8(pre + s + 5 * (1 + Math.ceil(s / 7000)) + post);\n // writing to this writes to the output buffer\n var w = o.subarray(pre, o.length - post);\n var pos = 0;\n if (!lvl || s < 8) {\n for (var i = 0; i <= s; i += 65535) {\n // end\n var e = i + 65535;\n if (e >= s) {\n // write final block\n w[pos >> 3] = lst;\n }\n pos = wfblk(w, pos + 1, dat.subarray(i, e));\n }\n }\n else {\n var opt = deo[lvl - 1];\n var n = opt >>> 13, c = opt & 8191;\n var msk_1 = (1 << plvl) - 1;\n // prev 2-byte val map curr 2-byte val map\n var prev = new u16(32768), head = new u16(msk_1 + 1);\n var bs1_1 = Math.ceil(plvl / 3), bs2_1 = 2 * bs1_1;\n var hsh = function (i) { return (dat[i] ^ (dat[i + 1] << bs1_1) ^ (dat[i + 2] << bs2_1)) & msk_1; };\n // 24576 is an arbitrary number of maximum symbols per block\n // 424 buffer for last block\n var syms = new u32(25000);\n // length/literal freq distance freq\n var lf = new u16(288), df = new u16(32);\n // l/lcnt exbits index l/lind waitdx bitpos\n var lc_1 = 0, eb = 0, i = 0, li = 0, wi = 0, bs = 0;\n for (; i < s; ++i) {\n // hash value\n // deopt when i > s - 3 - at end, deopt acceptable\n var hv = hsh(i);\n // index mod 32768 previous index mod\n var imod = i & 32767, pimod = head[hv];\n prev[imod] = pimod;\n head[hv] = imod;\n // We always should modify head and prev, but only add symbols if\n // this data is not yet processed (\"wait\" for wait index)\n if (wi <= i) {\n // bytes remaining\n var rem = s - i;\n if ((lc_1 > 7000 || li > 24576) && rem > 423) {\n pos = wblk(dat, w, 0, syms, lf, df, eb, li, bs, i - bs, pos);\n li = lc_1 = eb = 0, bs = i;\n for (var j = 0; j < 286; ++j)\n lf[j] = 0;\n for (var j = 0; j < 30; ++j)\n df[j] = 0;\n }\n // len dist chain\n var l = 2, d = 0, ch_1 = c, dif = (imod - pimod) & 32767;\n if (rem > 2 && hv == hsh(i - dif)) {\n var maxn = Math.min(n, rem) - 1;\n var maxd = Math.min(32767, i);\n // max possible length\n // not capped at dif because decompressors implement \"rolling\" index population\n var ml = Math.min(258, rem);\n while (dif <= maxd && --ch_1 && imod != pimod) {\n if (dat[i + l] == dat[i + l - dif]) {\n var nl = 0;\n for (; nl < ml && dat[i + nl] == dat[i + nl - dif]; ++nl)\n ;\n if (nl > l) {\n l = nl, d = dif;\n // break out early when we reach \"nice\" (we are satisfied enough)\n if (nl > maxn)\n break;\n // now, find the rarest 2-byte sequence within this\n // length of literals and search for that instead.\n // Much faster than just using the start\n var mmd = Math.min(dif, nl - 2);\n var md = 0;\n for (var j = 0; j < mmd; ++j) {\n var ti = (i - dif + j + 32768) & 32767;\n var pti = prev[ti];\n var cd = (ti - pti + 32768) & 32767;\n if (cd > md)\n md = cd, pimod = ti;\n }\n }\n }\n // check the previous match\n imod = pimod, pimod = prev[imod];\n dif += (imod - pimod + 32768) & 32767;\n }\n }\n // d will be nonzero only when a match was found\n if (d) {\n // store both dist and len data in one Uint32\n // Make sure this is recognized as a len/dist with 28th bit (2^28)\n syms[li++] = 268435456 | (revfl[l] << 18) | revfd[d];\n var lin = revfl[l] & 31, din = revfd[d] & 31;\n eb += fleb[lin] + fdeb[din];\n ++lf[257 + lin];\n ++df[din];\n wi = i + l;\n ++lc_1;\n }\n else {\n syms[li++] = dat[i];\n ++lf[dat[i]];\n }\n }\n }\n pos = wblk(dat, w, lst, syms, lf, df, eb, li, bs, i - bs, pos);\n // this is the easiest way to avoid needing to maintain state\n if (!lst && pos & 7)\n pos = wfblk(w, pos + 1, et);\n }\n return slc(o, 0, pre + shft(pos) + post);\n};\n// CRC32 table\nvar crct = /*#__PURE__*/ (function () {\n var t = new Int32Array(256);\n for (var i = 0; i < 256; ++i) {\n var c = i, k = 9;\n while (--k)\n c = ((c & 1) && -306674912) ^ (c >>> 1);\n t[i] = c;\n }\n return t;\n})();\n// CRC32\nvar crc = function () {\n var c = -1;\n return {\n p: function (d) {\n // closures have awful performance\n var cr = c;\n for (var i = 0; i < d.length; ++i)\n cr = crct[(cr & 255) ^ d[i]] ^ (cr >>> 8);\n c = cr;\n },\n d: function () { return ~c; }\n };\n};\n// Alder32\nvar adler = function () {\n var a = 1, b = 0;\n return {\n p: function (d) {\n // closures have awful performance\n var n = a, m = b;\n var l = d.length | 0;\n for (var i = 0; i != l;) {\n var e = Math.min(i + 2655, l);\n for (; i < e; ++i)\n m += n += d[i];\n n = (n & 65535) + 15 * (n >> 16), m = (m & 65535) + 15 * (m >> 16);\n }\n a = n, b = m;\n },\n d: function () {\n a %= 65521, b %= 65521;\n return (a & 255) << 24 | (a >>> 8) << 16 | (b & 255) << 8 | (b >>> 8);\n }\n };\n};\n;\n// deflate with opts\nvar dopt = function (dat, opt, pre, post, st) {\n return dflt(dat, opt.level == null ? 6 : opt.level, opt.mem == null ? Math.ceil(Math.max(8, Math.min(13, Math.log(dat.length))) * 1.5) : (12 + opt.mem), pre, post, !st);\n};\n// Walmart object spread\nvar mrg = function (a, b) {\n var o = {};\n for (var k in a)\n o[k] = a[k];\n for (var k in b)\n o[k] = b[k];\n return o;\n};\n// worker clone\n// This is possibly the craziest part of the entire codebase, despite how simple it may seem.\n// The only parameter to this function is a closure that returns an array of variables outside of the function scope.\n// We're going to try to figure out the variable names used in the closure as strings because that is crucial for workerization.\n// We will return an object mapping of true variable name to value (basically, the current scope as a JS object).\n// The reason we can't just use the original variable names is minifiers mangling the toplevel scope.\n// This took me three weeks to figure out how to do.\nvar wcln = function (fn, fnStr, td) {\n var dt = fn();\n var st = fn.toString();\n var ks = st.slice(st.indexOf('[') + 1, st.lastIndexOf(']')).replace(/\\s+/g, '').split(',');\n for (var i = 0; i < dt.length; ++i) {\n var v = dt[i], k = ks[i];\n if (typeof v == 'function') {\n fnStr += ';' + k + '=';\n var st_1 = v.toString();\n if (v.prototype) {\n // for global objects\n if (st_1.indexOf('[native code]') != -1) {\n var spInd = st_1.indexOf(' ', 8) + 1;\n fnStr += st_1.slice(spInd, st_1.indexOf('(', spInd));\n }\n else {\n fnStr += st_1;\n for (var t in v.prototype)\n fnStr += ';' + k + '.prototype.' + t + '=' + v.prototype[t].toString();\n }\n }\n else\n fnStr += st_1;\n }\n else\n td[k] = v;\n }\n return [fnStr, td];\n};\nvar ch = [];\n// clone bufs\nvar cbfs = function (v) {\n var tl = [];\n for (var k in v) {\n if (v[k].buffer) {\n tl.push((v[k] = new v[k].constructor(v[k])).buffer);\n }\n }\n return tl;\n};\n// use a worker to execute code\nvar wrkr = function (fns, init, id, cb) {\n var _a;\n if (!ch[id]) {\n var fnStr = '', td_1 = {}, m = fns.length - 1;\n for (var i = 0; i < m; ++i)\n _a = wcln(fns[i], fnStr, td_1), fnStr = _a[0], td_1 = _a[1];\n ch[id] = wcln(fns[m], fnStr, td_1);\n }\n var td = mrg({}, ch[id][1]);\n return wk(ch[id][0] + ';onmessage=function(e){for(var k in e.data)self[k]=e.data[k];onmessage=' + init.toString() + '}', id, td, cbfs(td), cb);\n};\n// base async inflate fn\nvar bInflt = function () { return [u8, u16, u32, fleb, fdeb, clim, fl, fd, flrm, fdrm, rev, ec, hMap, max, bits, bits16, shft, slc, err, inflt, inflateSync, pbf, gu8]; };\nvar bDflt = function () { return [u8, u16, u32, fleb, fdeb, clim, revfl, revfd, flm, flt, fdm, fdt, rev, deo, et, hMap, wbits, wbits16, hTree, ln, lc, clen, wfblk, wblk, shft, slc, dflt, dopt, deflateSync, pbf]; };\n// gzip extra\nvar gze = function () { return [gzh, gzhl, wbytes, crc, crct]; };\n// gunzip extra\nvar guze = function () { return [gzs, gzl]; };\n// zlib extra\nvar zle = function () { return [zlh, wbytes, adler]; };\n// unzlib extra\nvar zule = function () { return [zlv]; };\n// post buf\nvar pbf = function (msg) { return postMessage(msg, [msg.buffer]); };\n// get u8\nvar gu8 = function (o) { return o && o.size && new u8(o.size); };\n// async helper\nvar cbify = function (dat, opts, fns, init, id, cb) {\n var w = wrkr(fns, init, id, function (err, dat) {\n w.terminate();\n cb(err, dat);\n });\n w.postMessage([dat, opts], opts.consume ? [dat.buffer] : []);\n return function () { w.terminate(); };\n};\n// auto stream\nvar astrm = function (strm) {\n strm.ondata = function (dat, final) { return postMessage([dat, final], [dat.buffer]); };\n return function (ev) { return strm.push(ev.data[0], ev.data[1]); };\n};\n// async stream attach\nvar astrmify = function (fns, strm, opts, init, id) {\n var t;\n var w = wrkr(fns, init, id, function (err, dat) {\n if (err)\n w.terminate(), strm.ondata.call(strm, err);\n else {\n if (dat[1])\n w.terminate();\n strm.ondata.call(strm, err, dat[0], dat[1]);\n }\n });\n w.postMessage(opts);\n strm.push = function (d, f) {\n if (!strm.ondata)\n err(5);\n if (t)\n strm.ondata(err(4, 0, 1), null, !!f);\n w.postMessage([d, t = f], [d.buffer]);\n };\n strm.terminate = function () { w.terminate(); };\n};\n// read 2 bytes\nvar b2 = function (d, b) { return d[b] | (d[b + 1] << 8); };\n// read 4 bytes\nvar b4 = function (d, b) { return (d[b] | (d[b + 1] << 8) | (d[b + 2] << 16) | (d[b + 3] << 24)) >>> 0; };\nvar b8 = function (d, b) { return b4(d, b) + (b4(d, b + 4) * 4294967296); };\n// write bytes\nvar wbytes = function (d, b, v) {\n for (; v; ++b)\n d[b] = v, v >>>= 8;\n};\n// gzip header\nvar gzh = function (c, o) {\n var fn = o.filename;\n c[0] = 31, c[1] = 139, c[2] = 8, c[8] = o.level < 2 ? 4 : o.level == 9 ? 2 : 0, c[9] = 3; // assume Unix\n if (o.mtime != 0)\n wbytes(c, 4, Math.floor(new Date(o.mtime || Date.now()) / 1000));\n if (fn) {\n c[3] = 8;\n for (var i = 0; i <= fn.length; ++i)\n c[i + 10] = fn.charCodeAt(i);\n }\n};\n// gzip footer: -8 to -4 = CRC, -4 to -0 is length\n// gzip start\nvar gzs = function (d) {\n if (d[0] != 31 || d[1] != 139 || d[2] != 8)\n err(6, 'invalid gzip data');\n var flg = d[3];\n var st = 10;\n if (flg & 4)\n st += d[10] | (d[11] << 8) + 2;\n for (var zs = (flg >> 3 & 1) + (flg >> 4 & 1); zs > 0; zs -= !d[st++])\n ;\n return st + (flg & 2);\n};\n// gzip length\nvar gzl = function (d) {\n var l = d.length;\n return ((d[l - 4] | d[l - 3] << 8 | d[l - 2] << 16) | (d[l - 1] << 24)) >>> 0;\n};\n// gzip header length\nvar gzhl = function (o) { return 10 + ((o.filename && (o.filename.length + 1)) || 0); };\n// zlib header\nvar zlh = function (c, o) {\n var lv = o.level, fl = lv == 0 ? 0 : lv < 6 ? 1 : lv == 9 ? 3 : 2;\n c[0] = 120, c[1] = (fl << 6) | (fl ? (32 - 2 * fl) : 1);\n};\n// zlib valid\nvar zlv = function (d) {\n if ((d[0] & 15) != 8 || (d[0] >>> 4) > 7 || ((d[0] << 8 | d[1]) % 31))\n err(6, 'invalid zlib data');\n if (d[1] & 32)\n err(6, 'invalid zlib data: preset dictionaries not supported');\n};\nfunction AsyncCmpStrm(opts, cb) {\n if (!cb && typeof opts == 'function')\n cb = opts, opts = {};\n this.ondata = cb;\n return opts;\n}\n// zlib footer: -4 to -0 is Adler32\n/**\n * Streaming DEFLATE compression\n */\nvar Deflate = /*#__PURE__*/ (function () {\n function Deflate(opts, cb) {\n if (!cb && typeof opts == 'function')\n cb = opts, opts = {};\n this.ondata = cb;\n this.o = opts || {};\n }\n Deflate.prototype.p = function (c, f) {\n this.ondata(dopt(c, this.o, 0, 0, !f), f);\n };\n /**\n * Pushes a chunk to be deflated\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Deflate.prototype.push = function (chunk, final) {\n if (!this.ondata)\n err(5);\n if (this.d)\n err(4);\n this.d = final;\n this.p(chunk, final || false);\n };\n return Deflate;\n}());\nexport { Deflate };\n/**\n * Asynchronous streaming DEFLATE compression\n */\nvar AsyncDeflate = /*#__PURE__*/ (function () {\n function AsyncDeflate(opts, cb) {\n astrmify([\n bDflt,\n function () { return [astrm, Deflate]; }\n ], this, AsyncCmpStrm.call(this, opts, cb), function (ev) {\n var strm = new Deflate(ev.data);\n onmessage = astrm(strm);\n }, 6);\n }\n return AsyncDeflate;\n}());\nexport { AsyncDeflate };\nexport function deflate(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n return cbify(data, opts, [\n bDflt,\n ], function (ev) { return pbf(deflateSync(ev.data[0], ev.data[1])); }, 0, cb);\n}\n/**\n * Compresses data with DEFLATE without any wrapper\n * @param data The data to compress\n * @param opts The compression options\n * @returns The deflated version of the data\n */\nexport function deflateSync(data, opts) {\n return dopt(data, opts || {}, 0, 0);\n}\n/**\n * Streaming DEFLATE decompression\n */\nvar Inflate = /*#__PURE__*/ (function () {\n /**\n * Creates an inflation stream\n * @param cb The callback to call whenever data is inflated\n */\n function Inflate(cb) {\n this.s = {};\n this.p = new u8(0);\n this.ondata = cb;\n }\n Inflate.prototype.e = function (c) {\n if (!this.ondata)\n err(5);\n if (this.d)\n err(4);\n var l = this.p.length;\n var n = new u8(l + c.length);\n n.set(this.p), n.set(c, l), this.p = n;\n };\n Inflate.prototype.c = function (final) {\n this.d = this.s.i = final || false;\n var bts = this.s.b;\n var dt = inflt(this.p, this.o, this.s);\n this.ondata(slc(dt, bts, this.s.b), this.d);\n this.o = slc(dt, this.s.b - 32768), this.s.b = this.o.length;\n this.p = slc(this.p, (this.s.p / 8) | 0), this.s.p &= 7;\n };\n /**\n * Pushes a chunk to be inflated\n * @param chunk The chunk to push\n * @param final Whether this is the final chunk\n */\n Inflate.prototype.push = function (chunk, final) {\n this.e(chunk), this.c(final);\n };\n return Inflate;\n}());\nexport { Inflate };\n/**\n * Asynchronous streaming DEFLATE decompression\n */\nvar AsyncInflate = /*#__PURE__*/ (function () {\n /**\n * Creates an asynchronous inflation stream\n * @param cb The callback to call whenever data is deflated\n */\n function AsyncInflate(cb) {\n this.ondata = cb;\n astrmify([\n bInflt,\n function () { return [astrm, Inflate]; }\n ], this, 0, function () {\n var strm = new Inflate();\n onmessage = astrm(strm);\n }, 7);\n }\n return AsyncInflate;\n}());\nexport { AsyncInflate };\nexport function inflate(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n return cbify(data, opts, [\n bInflt\n ], function (ev) { return pbf(inflateSync(ev.data[0], gu8(ev.data[1]))); }, 1, cb);\n}\n/**\n * Expands DEFLATE data with no wrapper\n * @param data The data to decompress\n * @param out Where to write the data. Saves memory if you know the decompressed size and provide an output buffer of that length.\n * @returns The decompressed version of the data\n */\nexport function inflateSync(data, out) {\n return inflt(data, out);\n}\n// before you yell at me for not just using extends, my reason is that TS inheritance is hard to workerize.\n/**\n * Streaming GZIP compression\n */\nvar Gzip = /*#__PURE__*/ (function () {\n function Gzip(opts, cb) {\n this.c = crc();\n this.l = 0;\n this.v = 1;\n Deflate.call(this, opts, cb);\n }\n /**\n * Pushes a chunk to be GZIPped\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Gzip.prototype.push = function (chunk, final) {\n Deflate.prototype.push.call(this, chunk, final);\n };\n Gzip.prototype.p = function (c, f) {\n this.c.p(c);\n this.l += c.length;\n var raw = dopt(c, this.o, this.v && gzhl(this.o), f && 8, !f);\n if (this.v)\n gzh(raw, this.o), this.v = 0;\n if (f)\n wbytes(raw, raw.length - 8, this.c.d()), wbytes(raw, raw.length - 4, this.l);\n this.ondata(raw, f);\n };\n return Gzip;\n}());\nexport { Gzip };\n/**\n * Asynchronous streaming GZIP compression\n */\nvar AsyncGzip = /*#__PURE__*/ (function () {\n function AsyncGzip(opts, cb) {\n astrmify([\n bDflt,\n gze,\n function () { return [astrm, Deflate, Gzip]; }\n ], this, AsyncCmpStrm.call(this, opts, cb), function (ev) {\n var strm = new Gzip(ev.data);\n onmessage = astrm(strm);\n }, 8);\n }\n return AsyncGzip;\n}());\nexport { AsyncGzip };\nexport function gzip(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n return cbify(data, opts, [\n bDflt,\n gze,\n function () { return [gzipSync]; }\n ], function (ev) { return pbf(gzipSync(ev.data[0], ev.data[1])); }, 2, cb);\n}\n/**\n * Compresses data with GZIP\n * @param data The data to compress\n * @param opts The compression options\n * @returns The gzipped version of the data\n */\nexport function gzipSync(data, opts) {\n if (!opts)\n opts = {};\n var c = crc(), l = data.length;\n c.p(data);\n var d = dopt(data, opts, gzhl(opts), 8), s = d.length;\n return gzh(d, opts), wbytes(d, s - 8, c.d()), wbytes(d, s - 4, l), d;\n}\n/**\n * Streaming GZIP decompression\n */\nvar Gunzip = /*#__PURE__*/ (function () {\n /**\n * Creates a GUNZIP stream\n * @param cb The callback to call whenever data is inflated\n */\n function Gunzip(cb) {\n this.v = 1;\n Inflate.call(this, cb);\n }\n /**\n * Pushes a chunk to be GUNZIPped\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Gunzip.prototype.push = function (chunk, final) {\n Inflate.prototype.e.call(this, chunk);\n if (this.v) {\n var s = this.p.length > 3 ? gzs(this.p) : 4;\n if (s >= this.p.length && !final)\n return;\n this.p = this.p.subarray(s), this.v = 0;\n }\n if (final) {\n if (this.p.length < 8)\n err(6, 'invalid gzip data');\n this.p = this.p.subarray(0, -8);\n }\n // necessary to prevent TS from using the closure value\n // This allows for workerization to function correctly\n Inflate.prototype.c.call(this, final);\n };\n return Gunzip;\n}());\nexport { Gunzip };\n/**\n * Asynchronous streaming GZIP decompression\n */\nvar AsyncGunzip = /*#__PURE__*/ (function () {\n /**\n * Creates an asynchronous GUNZIP stream\n * @param cb The callback to call whenever data is deflated\n */\n function AsyncGunzip(cb) {\n this.ondata = cb;\n astrmify([\n bInflt,\n guze,\n function () { return [astrm, Inflate, Gunzip]; }\n ], this, 0, function () {\n var strm = new Gunzip();\n onmessage = astrm(strm);\n }, 9);\n }\n return AsyncGunzip;\n}());\nexport { AsyncGunzip };\nexport function gunzip(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n return cbify(data, opts, [\n bInflt,\n guze,\n function () { return [gunzipSync]; }\n ], function (ev) { return pbf(gunzipSync(ev.data[0])); }, 3, cb);\n}\n/**\n * Expands GZIP data\n * @param data The data to decompress\n * @param out Where to write the data. GZIP already encodes the output size, so providing this doesn't save memory.\n * @returns The decompressed version of the data\n */\nexport function gunzipSync(data, out) {\n return inflt(data.subarray(gzs(data), -8), out || new u8(gzl(data)));\n}\n/**\n * Streaming Zlib compression\n */\nvar Zlib = /*#__PURE__*/ (function () {\n function Zlib(opts, cb) {\n this.c = adler();\n this.v = 1;\n Deflate.call(this, opts, cb);\n }\n /**\n * Pushes a chunk to be zlibbed\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Zlib.prototype.push = function (chunk, final) {\n Deflate.prototype.push.call(this, chunk, final);\n };\n Zlib.prototype.p = function (c, f) {\n this.c.p(c);\n var raw = dopt(c, this.o, this.v && 2, f && 4, !f);\n if (this.v)\n zlh(raw, this.o), this.v = 0;\n if (f)\n wbytes(raw, raw.length - 4, this.c.d());\n this.ondata(raw, f);\n };\n return Zlib;\n}());\nexport { Zlib };\n/**\n * Asynchronous streaming Zlib compression\n */\nvar AsyncZlib = /*#__PURE__*/ (function () {\n function AsyncZlib(opts, cb) {\n astrmify([\n bDflt,\n zle,\n function () { return [astrm, Deflate, Zlib]; }\n ], this, AsyncCmpStrm.call(this, opts, cb), function (ev) {\n var strm = new Zlib(ev.data);\n onmessage = astrm(strm);\n }, 10);\n }\n return AsyncZlib;\n}());\nexport { AsyncZlib };\nexport function zlib(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n return cbify(data, opts, [\n bDflt,\n zle,\n function () { return [zlibSync]; }\n ], function (ev) { return pbf(zlibSync(ev.data[0], ev.data[1])); }, 4, cb);\n}\n/**\n * Compress data with Zlib\n * @param data The data to compress\n * @param opts The compression options\n * @returns The zlib-compressed version of the data\n */\nexport function zlibSync(data, opts) {\n if (!opts)\n opts = {};\n var a = adler();\n a.p(data);\n var d = dopt(data, opts, 2, 4);\n return zlh(d, opts), wbytes(d, d.length - 4, a.d()), d;\n}\n/**\n * Streaming Zlib decompression\n */\nvar Unzlib = /*#__PURE__*/ (function () {\n /**\n * Creates a Zlib decompression stream\n * @param cb The callback to call whenever data is inflated\n */\n function Unzlib(cb) {\n this.v = 1;\n Inflate.call(this, cb);\n }\n /**\n * Pushes a chunk to be unzlibbed\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Unzlib.prototype.push = function (chunk, final) {\n Inflate.prototype.e.call(this, chunk);\n if (this.v) {\n if (this.p.length < 2 && !final)\n return;\n this.p = this.p.subarray(2), this.v = 0;\n }\n if (final) {\n if (this.p.length < 4)\n err(6, 'invalid zlib data');\n this.p = this.p.subarray(0, -4);\n }\n // necessary to prevent TS from using the closure value\n // This allows for workerization to function correctly\n Inflate.prototype.c.call(this, final);\n };\n return Unzlib;\n}());\nexport { Unzlib };\n/**\n * Asynchronous streaming Zlib decompression\n */\nvar AsyncUnzlib = /*#__PURE__*/ (function () {\n /**\n * Creates an asynchronous Zlib decompression stream\n * @param cb The callback to call whenever data is deflated\n */\n function AsyncUnzlib(cb) {\n this.ondata = cb;\n astrmify([\n bInflt,\n zule,\n function () { return [astrm, Inflate, Unzlib]; }\n ], this, 0, function () {\n var strm = new Unzlib();\n onmessage = astrm(strm);\n }, 11);\n }\n return AsyncUnzlib;\n}());\nexport { AsyncUnzlib };\nexport function unzlib(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n return cbify(data, opts, [\n bInflt,\n zule,\n function () { return [unzlibSync]; }\n ], function (ev) { return pbf(unzlibSync(ev.data[0], gu8(ev.data[1]))); }, 5, cb);\n}\n/**\n * Expands Zlib data\n * @param data The data to decompress\n * @param out Where to write the data. Saves memory if you know the decompressed size and provide an output buffer of that length.\n * @returns The decompressed version of the data\n */\nexport function unzlibSync(data, out) {\n return inflt((zlv(data), data.subarray(2, -4)), out);\n}\n// Default algorithm for compression (used because having a known output size allows faster decompression)\nexport { gzip as compress, AsyncGzip as AsyncCompress };\n// Default algorithm for compression (used because having a known output size allows faster decompression)\nexport { gzipSync as compressSync, Gzip as Compress };\n/**\n * Streaming GZIP, Zlib, or raw DEFLATE decompression\n */\nvar Decompress = /*#__PURE__*/ (function () {\n /**\n * Creates a decompression stream\n * @param cb The callback to call whenever data is decompressed\n */\n function Decompress(cb) {\n this.G = Gunzip;\n this.I = Inflate;\n this.Z = Unzlib;\n this.ondata = cb;\n }\n /**\n * Pushes a chunk to be decompressed\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Decompress.prototype.push = function (chunk, final) {\n if (!this.ondata)\n err(5);\n if (!this.s) {\n if (this.p && this.p.length) {\n var n = new u8(this.p.length + chunk.length);\n n.set(this.p), n.set(chunk, this.p.length);\n }\n else\n this.p = chunk;\n if (this.p.length > 2) {\n var _this_1 = this;\n var cb = function () { _this_1.ondata.apply(_this_1, arguments); };\n this.s = (this.p[0] == 31 && this.p[1] == 139 && this.p[2] == 8)\n ? new this.G(cb)\n : ((this.p[0] & 15) != 8 || (this.p[0] >> 4) > 7 || ((this.p[0] << 8 | this.p[1]) % 31))\n ? new this.I(cb)\n : new this.Z(cb);\n this.s.push(this.p, final);\n this.p = null;\n }\n }\n else\n this.s.push(chunk, final);\n };\n return Decompress;\n}());\nexport { Decompress };\n/**\n * Asynchronous streaming GZIP, Zlib, or raw DEFLATE decompression\n */\nvar AsyncDecompress = /*#__PURE__*/ (function () {\n /**\n * Creates an asynchronous decompression stream\n * @param cb The callback to call whenever data is decompressed\n */\n function AsyncDecompress(cb) {\n this.G = AsyncGunzip;\n this.I = AsyncInflate;\n this.Z = AsyncUnzlib;\n this.ondata = cb;\n }\n /**\n * Pushes a chunk to be decompressed\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n AsyncDecompress.prototype.push = function (chunk, final) {\n Decompress.prototype.push.call(this, chunk, final);\n };\n return AsyncDecompress;\n}());\nexport { AsyncDecompress };\nexport function decompress(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n return (data[0] == 31 && data[1] == 139 && data[2] == 8)\n ? gunzip(data, opts, cb)\n : ((data[0] & 15) != 8 || (data[0] >> 4) > 7 || ((data[0] << 8 | data[1]) % 31))\n ? inflate(data, opts, cb)\n : unzlib(data, opts, cb);\n}\n/**\n * Expands compressed GZIP, Zlib, or raw DEFLATE data, automatically detecting the format\n * @param data The data to decompress\n * @param out Where to write the data. Saves memory if you know the decompressed size and provide an output buffer of that length.\n * @returns The decompressed version of the data\n */\nexport function decompressSync(data, out) {\n return (data[0] == 31 && data[1] == 139 && data[2] == 8)\n ? gunzipSync(data, out)\n : ((data[0] & 15) != 8 || (data[0] >> 4) > 7 || ((data[0] << 8 | data[1]) % 31))\n ? inflateSync(data, out)\n : unzlibSync(data, out);\n}\n// flatten a directory structure\nvar fltn = function (d, p, t, o) {\n for (var k in d) {\n var val = d[k], n = p + k, op = o;\n if (Array.isArray(val))\n op = mrg(o, val[1]), val = val[0];\n if (val instanceof u8)\n t[n] = [val, op];\n else {\n t[n += '/'] = [new u8(0), op];\n fltn(val, n, t, o);\n }\n }\n};\n// text encoder\nvar te = typeof TextEncoder != 'undefined' && /*#__PURE__*/ new TextEncoder();\n// text decoder\nvar td = typeof TextDecoder != 'undefined' && /*#__PURE__*/ new TextDecoder();\n// text decoder stream\nvar tds = 0;\ntry {\n td.decode(et, { stream: true });\n tds = 1;\n}\ncatch (e) { }\n// decode UTF8\nvar dutf8 = function (d) {\n for (var r = '', i = 0;;) {\n var c = d[i++];\n var eb = (c > 127) + (c > 223) + (c > 239);\n if (i + eb > d.length)\n return [r, slc(d, i - 1)];\n if (!eb)\n r += String.fromCharCode(c);\n else if (eb == 3) {\n c = ((c & 15) << 18 | (d[i++] & 63) << 12 | (d[i++] & 63) << 6 | (d[i++] & 63)) - 65536,\n r += String.fromCharCode(55296 | (c >> 10), 56320 | (c & 1023));\n }\n else if (eb & 1)\n r += String.fromCharCode((c & 31) << 6 | (d[i++] & 63));\n else\n r += String.fromCharCode((c & 15) << 12 | (d[i++] & 63) << 6 | (d[i++] & 63));\n }\n};\n/**\n * Streaming UTF-8 decoding\n */\nvar DecodeUTF8 = /*#__PURE__*/ (function () {\n /**\n * Creates a UTF-8 decoding stream\n * @param cb The callback to call whenever data is decoded\n */\n function DecodeUTF8(cb) {\n this.ondata = cb;\n if (tds)\n this.t = new TextDecoder();\n else\n this.p = et;\n }\n /**\n * Pushes a chunk to be decoded from UTF-8 binary\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n DecodeUTF8.prototype.push = function (chunk, final) {\n if (!this.ondata)\n err(5);\n final = !!final;\n if (this.t) {\n this.ondata(this.t.decode(chunk, { stream: true }), final);\n if (final) {\n if (this.t.decode().length)\n err(8);\n this.t = null;\n }\n return;\n }\n if (!this.p)\n err(4);\n var dat = new u8(this.p.length + chunk.length);\n dat.set(this.p);\n dat.set(chunk, this.p.length);\n var _a = dutf8(dat), ch = _a[0], np = _a[1];\n if (final) {\n if (np.length)\n err(8);\n this.p = null;\n }\n else\n this.p = np;\n this.ondata(ch, final);\n };\n return DecodeUTF8;\n}());\nexport { DecodeUTF8 };\n/**\n * Streaming UTF-8 encoding\n */\nvar EncodeUTF8 = /*#__PURE__*/ (function () {\n /**\n * Creates a UTF-8 decoding stream\n * @param cb The callback to call whenever data is encoded\n */\n function EncodeUTF8(cb) {\n this.ondata = cb;\n }\n /**\n * Pushes a chunk to be encoded to UTF-8\n * @param chunk The string data to push\n * @param final Whether this is the last chunk\n */\n EncodeUTF8.prototype.push = function (chunk, final) {\n if (!this.ondata)\n err(5);\n if (this.d)\n err(4);\n this.ondata(strToU8(chunk), this.d = final || false);\n };\n return EncodeUTF8;\n}());\nexport { EncodeUTF8 };\n/**\n * Converts a string into a Uint8Array for use with compression/decompression methods\n * @param str The string to encode\n * @param latin1 Whether or not to interpret the data as Latin-1. This should\n * not need to be true unless decoding a binary string.\n * @returns The string encoded in UTF-8/Latin-1 binary\n */\nexport function strToU8(str, latin1) {\n if (latin1) {\n var ar_1 = new u8(str.length);\n for (var i = 0; i < str.length; ++i)\n ar_1[i] = str.charCodeAt(i);\n return ar_1;\n }\n if (te)\n return te.encode(str);\n var l = str.length;\n var ar = new u8(str.length + (str.length >> 1));\n var ai = 0;\n var w = function (v) { ar[ai++] = v; };\n for (var i = 0; i < l; ++i) {\n if (ai + 5 > ar.length) {\n var n = new u8(ai + 8 + ((l - i) << 1));\n n.set(ar);\n ar = n;\n }\n var c = str.charCodeAt(i);\n if (c < 128 || latin1)\n w(c);\n else if (c < 2048)\n w(192 | (c >> 6)), w(128 | (c & 63));\n else if (c > 55295 && c < 57344)\n c = 65536 + (c & 1023 << 10) | (str.charCodeAt(++i) & 1023),\n w(240 | (c >> 18)), w(128 | ((c >> 12) & 63)), w(128 | ((c >> 6) & 63)), w(128 | (c & 63));\n else\n w(224 | (c >> 12)), w(128 | ((c >> 6) & 63)), w(128 | (c & 63));\n }\n return slc(ar, 0, ai);\n}\n/**\n * Converts a Uint8Array to a string\n * @param dat The data to decode to string\n * @param latin1 Whether or not to interpret the data as Latin-1. This should\n * not need to be true unless encoding to binary string.\n * @returns The original UTF-8/Latin-1 string\n */\nexport function strFromU8(dat, latin1) {\n if (latin1) {\n var r = '';\n for (var i = 0; i < dat.length; i += 16384)\n r += String.fromCharCode.apply(null, dat.subarray(i, i + 16384));\n return r;\n }\n else if (td)\n return td.decode(dat);\n else {\n var _a = dutf8(dat), out = _a[0], ext = _a[1];\n if (ext.length)\n err(8);\n return out;\n }\n}\n;\n// deflate bit flag\nvar dbf = function (l) { return l == 1 ? 3 : l < 6 ? 2 : l == 9 ? 1 : 0; };\n// skip local zip header\nvar slzh = function (d, b) { return b + 30 + b2(d, b + 26) + b2(d, b + 28); };\n// read zip header\nvar zh = function (d, b, z) {\n var fnl = b2(d, b + 28), fn = strFromU8(d.subarray(b + 46, b + 46 + fnl), !(b2(d, b + 8) & 2048)), es = b + 46 + fnl, bs = b4(d, b + 20);\n var _a = z && bs == 4294967295 ? z64e(d, es) : [bs, b4(d, b + 24), b4(d, b + 42)], sc = _a[0], su = _a[1], off = _a[2];\n return [b2(d, b + 10), sc, su, fn, es + b2(d, b + 30) + b2(d, b + 32), off];\n};\n// read zip64 extra field\nvar z64e = function (d, b) {\n for (; b2(d, b) != 1; b += 4 + b2(d, b + 2))\n ;\n return [b8(d, b + 12), b8(d, b + 4), b8(d, b + 20)];\n};\n// extra field length\nvar exfl = function (ex) {\n var le = 0;\n if (ex) {\n for (var k in ex) {\n var l = ex[k].length;\n if (l > 65535)\n err(9);\n le += l + 4;\n }\n }\n return le;\n};\n// write zip header\nvar wzh = function (d, b, f, fn, u, c, ce, co) {\n var fl = fn.length, ex = f.extra, col = co && co.length;\n var exl = exfl(ex);\n wbytes(d, b, ce != null ? 0x2014B50 : 0x4034B50), b += 4;\n if (ce != null)\n d[b++] = 20, d[b++] = f.os;\n d[b] = 20, b += 2; // spec compliance? what's that?\n d[b++] = (f.flag << 1) | (c == null && 8), d[b++] = u && 8;\n d[b++] = f.compression & 255, d[b++] = f.compression >> 8;\n var dt = new Date(f.mtime == null ? Date.now() : f.mtime), y = dt.getFullYear() - 1980;\n if (y < 0 || y > 119)\n err(10);\n wbytes(d, b, (y << 25) | ((dt.getMonth() + 1) << 21) | (dt.getDate() << 16) | (dt.getHours() << 11) | (dt.getMinutes() << 5) | (dt.getSeconds() >>> 1)), b += 4;\n if (c != null) {\n wbytes(d, b, f.crc);\n wbytes(d, b + 4, c);\n wbytes(d, b + 8, f.size);\n }\n wbytes(d, b + 12, fl);\n wbytes(d, b + 14, exl), b += 16;\n if (ce != null) {\n wbytes(d, b, col);\n wbytes(d, b + 6, f.attrs);\n wbytes(d, b + 10, ce), b += 14;\n }\n d.set(fn, b);\n b += fl;\n if (exl) {\n for (var k in ex) {\n var exf = ex[k], l = exf.length;\n wbytes(d, b, +k);\n wbytes(d, b + 2, l);\n d.set(exf, b + 4), b += 4 + l;\n }\n }\n if (col)\n d.set(co, b), b += col;\n return b;\n};\n// write zip footer (end of central directory)\nvar wzf = function (o, b, c, d, e) {\n wbytes(o, b, 0x6054B50); // skip disk\n wbytes(o, b + 8, c);\n wbytes(o, b + 10, c);\n wbytes(o, b + 12, d);\n wbytes(o, b + 16, e);\n};\n/**\n * A pass-through stream to keep data uncompressed in a ZIP archive.\n */\nvar ZipPassThrough = /*#__PURE__*/ (function () {\n /**\n * Creates a pass-through stream that can be added to ZIP archives\n * @param filename The filename to associate with this data stream\n */\n function ZipPassThrough(filename) {\n this.filename = filename;\n this.c = crc();\n this.size = 0;\n this.compression = 0;\n }\n /**\n * Processes a chunk and pushes to the output stream. You can override this\n * method in a subclass for custom behavior, but by default this passes\n * the data through. You must call this.ondata(err, chunk, final) at some\n * point in this method.\n * @param chunk The chunk to process\n * @param final Whether this is the last chunk\n */\n ZipPassThrough.prototype.process = function (chunk, final) {\n this.ondata(null, chunk, final);\n };\n /**\n * Pushes a chunk to be added. If you are subclassing this with a custom\n * compression algorithm, note that you must push data from the source\n * file only, pre-compression.\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n ZipPassThrough.prototype.push = function (chunk, final) {\n if (!this.ondata)\n err(5);\n this.c.p(chunk);\n this.size += chunk.length;\n if (final)\n this.crc = this.c.d();\n this.process(chunk, final || false);\n };\n return ZipPassThrough;\n}());\nexport { ZipPassThrough };\n// I don't extend because TypeScript extension adds 1kB of runtime bloat\n/**\n * Streaming DEFLATE compression for ZIP archives. Prefer using AsyncZipDeflate\n * for better performance\n */\nvar ZipDeflate = /*#__PURE__*/ (function () {\n /**\n * Creates a DEFLATE stream that can be added to ZIP archives\n * @param filename The filename to associate with this data stream\n * @param opts The compression options\n */\n function ZipDeflate(filename, opts) {\n var _this_1 = this;\n if (!opts)\n opts = {};\n ZipPassThrough.call(this, filename);\n this.d = new Deflate(opts, function (dat, final) {\n _this_1.ondata(null, dat, final);\n });\n this.compression = 8;\n this.flag = dbf(opts.level);\n }\n ZipDeflate.prototype.process = function (chunk, final) {\n try {\n this.d.push(chunk, final);\n }\n catch (e) {\n this.ondata(e, null, final);\n }\n };\n /**\n * Pushes a chunk to be deflated\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n ZipDeflate.prototype.push = function (chunk, final) {\n ZipPassThrough.prototype.push.call(this, chunk, final);\n };\n return ZipDeflate;\n}());\nexport { ZipDeflate };\n/**\n * Asynchronous streaming DEFLATE compression for ZIP archives\n */\nvar AsyncZipDeflate = /*#__PURE__*/ (function () {\n /**\n * Creates a DEFLATE stream that can be added to ZIP archives\n * @param filename The filename to associate with this data stream\n * @param opts The compression options\n */\n function AsyncZipDeflate(filename, opts) {\n var _this_1 = this;\n if (!opts)\n opts = {};\n ZipPassThrough.call(this, filename);\n this.d = new AsyncDeflate(opts, function (err, dat, final) {\n _this_1.ondata(err, dat, final);\n });\n this.compression = 8;\n this.flag = dbf(opts.level);\n this.terminate = this.d.terminate;\n }\n AsyncZipDeflate.prototype.process = function (chunk, final) {\n this.d.push(chunk, final);\n };\n /**\n * Pushes a chunk to be deflated\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n AsyncZipDeflate.prototype.push = function (chunk, final) {\n ZipPassThrough.prototype.push.call(this, chunk, final);\n };\n return AsyncZipDeflate;\n}());\nexport { AsyncZipDeflate };\n// TODO: Better tree shaking\n/**\n * A zippable archive to which files can incrementally be added\n */\nvar Zip = /*#__PURE__*/ (function () {\n /**\n * Creates an empty ZIP archive to which files can be added\n * @param cb The callback to call whenever data for the generated ZIP archive\n * is available\n */\n function Zip(cb) {\n this.ondata = cb;\n this.u = [];\n this.d = 1;\n }\n /**\n * Adds a file to the ZIP archive\n * @param file The file stream to add\n */\n Zip.prototype.add = function (file) {\n var _this_1 = this;\n if (!this.ondata)\n err(5);\n // finishing or finished\n if (this.d & 2)\n this.ondata(err(4 + (this.d & 1) * 8, 0, 1), null, false);\n else {\n var f = strToU8(file.filename), fl_1 = f.length;\n var com = file.comment, o = com && strToU8(com);\n var u = fl_1 != file.filename.length || (o && (com.length != o.length));\n var hl_1 = fl_1 + exfl(file.extra) + 30;\n if (fl_1 > 65535)\n this.ondata(err(11, 0, 1), null, false);\n var header = new u8(hl_1);\n wzh(header, 0, file, f, u);\n var chks_1 = [header];\n var pAll_1 = function () {\n for (var _i = 0, chks_2 = chks_1; _i < chks_2.length; _i++) {\n var chk = chks_2[_i];\n _this_1.ondata(null, chk, false);\n }\n chks_1 = [];\n };\n var tr_1 = this.d;\n this.d = 0;\n var ind_1 = this.u.length;\n var uf_1 = mrg(file, {\n f: f,\n u: u,\n o: o,\n t: function () {\n if (file.terminate)\n file.terminate();\n },\n r: function () {\n pAll_1();\n if (tr_1) {\n var nxt = _this_1.u[ind_1 + 1];\n if (nxt)\n nxt.r();\n else\n _this_1.d = 1;\n }\n tr_1 = 1;\n }\n });\n var cl_1 = 0;\n file.ondata = function (err, dat, final) {\n if (err) {\n _this_1.ondata(err, dat, final);\n _this_1.terminate();\n }\n else {\n cl_1 += dat.length;\n chks_1.push(dat);\n if (final) {\n var dd = new u8(16);\n wbytes(dd, 0, 0x8074B50);\n wbytes(dd, 4, file.crc);\n wbytes(dd, 8, cl_1);\n wbytes(dd, 12, file.size);\n chks_1.push(dd);\n uf_1.c = cl_1, uf_1.b = hl_1 + cl_1 + 16, uf_1.crc = file.crc, uf_1.size = file.size;\n if (tr_1)\n uf_1.r();\n tr_1 = 1;\n }\n else if (tr_1)\n pAll_1();\n }\n };\n this.u.push(uf_1);\n }\n };\n /**\n * Ends the process of adding files and prepares to emit the final chunks.\n * This *must* be called after adding all desired files for the resulting\n * ZIP file to work properly.\n */\n Zip.prototype.end = function () {\n var _this_1 = this;\n if (this.d & 2) {\n this.ondata(err(4 + (this.d & 1) * 8, 0, 1), null, true);\n return;\n }\n if (this.d)\n this.e();\n else\n this.u.push({\n r: function () {\n if (!(_this_1.d & 1))\n return;\n _this_1.u.splice(-1, 1);\n _this_1.e();\n },\n t: function () { }\n });\n this.d = 3;\n };\n Zip.prototype.e = function () {\n var bt = 0, l = 0, tl = 0;\n for (var _i = 0, _a = this.u; _i < _a.length; _i++) {\n var f = _a[_i];\n tl += 46 + f.f.length + exfl(f.extra) + (f.o ? f.o.length : 0);\n }\n var out = new u8(tl + 22);\n for (var _b = 0, _c = this.u; _b < _c.length; _b++) {\n var f = _c[_b];\n wzh(out, bt, f, f.f, f.u, f.c, l, f.o);\n bt += 46 + f.f.length + exfl(f.extra) + (f.o ? f.o.length : 0), l += f.b;\n }\n wzf(out, bt, this.u.length, tl, l);\n this.ondata(null, out, true);\n this.d = 2;\n };\n /**\n * A method to terminate any internal workers used by the stream. Subsequent\n * calls to add() will fail.\n */\n Zip.prototype.terminate = function () {\n for (var _i = 0, _a = this.u; _i < _a.length; _i++) {\n var f = _a[_i];\n f.t();\n }\n this.d = 2;\n };\n return Zip;\n}());\nexport { Zip };\nexport function zip(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n var r = {};\n fltn(data, '', r, opts);\n var k = Object.keys(r);\n var lft = k.length, o = 0, tot = 0;\n var slft = lft, files = new Array(lft);\n var term = [];\n var tAll = function () {\n for (var i = 0; i < term.length; ++i)\n term[i]();\n };\n var cbd = function (a, b) {\n mt(function () { cb(a, b); });\n };\n mt(function () { cbd = cb; });\n var cbf = function () {\n var out = new u8(tot + 22), oe = o, cdl = tot - o;\n tot = 0;\n for (var i = 0; i < slft; ++i) {\n var f = files[i];\n try {\n var l = f.c.length;\n wzh(out, tot, f, f.f, f.u, l);\n var badd = 30 + f.f.length + exfl(f.extra);\n var loc = tot + badd;\n out.set(f.c, loc);\n wzh(out, o, f, f.f, f.u, l, tot, f.m), o += 16 + badd + (f.m ? f.m.length : 0), tot = loc + l;\n }\n catch (e) {\n return cbd(e, null);\n }\n }\n wzf(out, o, files.length, cdl, oe);\n cbd(null, out);\n };\n if (!lft)\n cbf();\n var _loop_1 = function (i) {\n var fn = k[i];\n var _a = r[fn], file = _a[0], p = _a[1];\n var c = crc(), size = file.length;\n c.p(file);\n var f = strToU8(fn), s = f.length;\n var com = p.comment, m = com && strToU8(com), ms = m && m.length;\n var exl = exfl(p.extra);\n var compression = p.level == 0 ? 0 : 8;\n var cbl = function (e, d) {\n if (e) {\n tAll();\n cbd(e, null);\n }\n else {\n var l = d.length;\n files[i] = mrg(p, {\n size: size,\n crc: c.d(),\n c: d,\n f: f,\n m: m,\n u: s != fn.length || (m && (com.length != ms)),\n compression: compression\n });\n o += 30 + s + exl + l;\n tot += 76 + 2 * (s + exl) + (ms || 0) + l;\n if (!--lft)\n cbf();\n }\n };\n if (s > 65535)\n cbl(err(11, 0, 1), null);\n if (!compression)\n cbl(null, file);\n else if (size < 160000) {\n try {\n cbl(null, deflateSync(file, p));\n }\n catch (e) {\n cbl(e, null);\n }\n }\n else\n term.push(deflate(file, p, cbl));\n };\n // Cannot use lft because it can decrease\n for (var i = 0; i < slft; ++i) {\n _loop_1(i);\n }\n return tAll;\n}\n/**\n * Synchronously creates a ZIP file. Prefer using `zip` for better performance\n * with more than one file.\n * @param data The directory structure for the ZIP archive\n * @param opts The main options, merged with per-file options\n * @returns The generated ZIP archive\n */\nexport function zipSync(data, opts) {\n if (!opts)\n opts = {};\n var r = {};\n var files = [];\n fltn(data, '', r, opts);\n var o = 0;\n var tot = 0;\n for (var fn in r) {\n var _a = r[fn], file = _a[0], p = _a[1];\n var compression = p.level == 0 ? 0 : 8;\n var f = strToU8(fn), s = f.length;\n var com = p.comment, m = com && strToU8(com), ms = m && m.length;\n var exl = exfl(p.extra);\n if (s > 65535)\n err(11);\n var d = compression ? deflateSync(file, p) : file, l = d.length;\n var c = crc();\n c.p(file);\n files.push(mrg(p, {\n size: file.length,\n crc: c.d(),\n c: d,\n f: f,\n m: m,\n u: s != fn.length || (m && (com.length != ms)),\n o: o,\n compression: compression\n }));\n o += 30 + s + exl + l;\n tot += 76 + 2 * (s + exl) + (ms || 0) + l;\n }\n var out = new u8(tot + 22), oe = o, cdl = tot - o;\n for (var i = 0; i < files.length; ++i) {\n var f = files[i];\n wzh(out, f.o, f, f.f, f.u, f.c.length);\n var badd = 30 + f.f.length + exfl(f.extra);\n out.set(f.c, f.o + badd);\n wzh(out, o, f, f.f, f.u, f.c.length, f.o, f.m), o += 16 + badd + (f.m ? f.m.length : 0);\n }\n wzf(out, o, files.length, cdl, oe);\n return out;\n}\n/**\n * Streaming pass-through decompression for ZIP archives\n */\nvar UnzipPassThrough = /*#__PURE__*/ (function () {\n function UnzipPassThrough() {\n }\n UnzipPassThrough.prototype.push = function (data, final) {\n this.ondata(null, data, final);\n };\n UnzipPassThrough.compression = 0;\n return UnzipPassThrough;\n}());\nexport { UnzipPassThrough };\n/**\n * Streaming DEFLATE decompression for ZIP archives. Prefer AsyncZipInflate for\n * better performance.\n */\nvar UnzipInflate = /*#__PURE__*/ (function () {\n /**\n * Creates a DEFLATE decompression that can be used in ZIP archives\n */\n function UnzipInflate() {\n var _this_1 = this;\n this.i = new Inflate(function (dat, final) {\n _this_1.ondata(null, dat, final);\n });\n }\n UnzipInflate.prototype.push = function (data, final) {\n try {\n this.i.push(data, final);\n }\n catch (e) {\n this.ondata(e, null, final);\n }\n };\n UnzipInflate.compression = 8;\n return UnzipInflate;\n}());\nexport { UnzipInflate };\n/**\n * Asynchronous streaming DEFLATE decompression for ZIP archives\n */\nvar AsyncUnzipInflate = /*#__PURE__*/ (function () {\n /**\n * Creates a DEFLATE decompression that can be used in ZIP archives\n */\n function AsyncUnzipInflate(_, sz) {\n var _this_1 = this;\n if (sz < 320000) {\n this.i = new Inflate(function (dat, final) {\n _this_1.ondata(null, dat, final);\n });\n }\n else {\n this.i = new AsyncInflate(function (err, dat, final) {\n _this_1.ondata(err, dat, final);\n });\n this.terminate = this.i.terminate;\n }\n }\n AsyncUnzipInflate.prototype.push = function (data, final) {\n if (this.i.terminate)\n data = slc(data, 0);\n this.i.push(data, final);\n };\n AsyncUnzipInflate.compression = 8;\n return AsyncUnzipInflate;\n}());\nexport { AsyncUnzipInflate };\n/**\n * A ZIP archive decompression stream that emits files as they are discovered\n */\nvar Unzip = /*#__PURE__*/ (function () {\n /**\n * Creates a ZIP decompression stream\n * @param cb The callback to call whenever a file in the ZIP archive is found\n */\n function Unzip(cb) {\n this.onfile = cb;\n this.k = [];\n this.o = {\n 0: UnzipPassThrough\n };\n this.p = et;\n }\n /**\n * Pushes a chunk to be unzipped\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Unzip.prototype.push = function (chunk, final) {\n var _this_1 = this;\n if (!this.onfile)\n err(5);\n if (!this.p)\n err(4);\n if (this.c > 0) {\n var len = Math.min(this.c, chunk.length);\n var toAdd = chunk.subarray(0, len);\n this.c -= len;\n if (this.d)\n this.d.push(toAdd, !this.c);\n else\n this.k[0].push(toAdd);\n chunk = chunk.subarray(len);\n if (chunk.length)\n return this.push(chunk, final);\n }\n else {\n var f = 0, i = 0, is = void 0, buf = void 0;\n if (!this.p.length)\n buf = chunk;\n else if (!chunk.length)\n buf = this.p;\n else {\n buf = new u8(this.p.length + chunk.length);\n buf.set(this.p), buf.set(chunk, this.p.length);\n }\n var l = buf.length, oc = this.c, add = oc && this.d;\n var _loop_2 = function () {\n var _a;\n var sig = b4(buf, i);\n if (sig == 0x4034B50) {\n f = 1, is = i;\n this_1.d = null;\n this_1.c = 0;\n var bf = b2(buf, i + 6), cmp_1 = b2(buf, i + 8), u = bf & 2048, dd = bf & 8, fnl = b2(buf, i + 26), es = b2(buf, i + 28);\n if (l > i + 30 + fnl + es) {\n var chks_3 = [];\n this_1.k.unshift(chks_3);\n f = 2;\n var sc_1 = b4(buf, i + 18), su_1 = b4(buf, i + 22);\n var fn_1 = strFromU8(buf.subarray(i + 30, i += 30 + fnl), !u);\n if (sc_1 == 4294967295) {\n _a = dd ? [-2] : z64e(buf, i), sc_1 = _a[0], su_1 = _a[1];\n }\n else if (dd)\n sc_1 = -1;\n i += es;\n this_1.c = sc_1;\n var d_1;\n var file_1 = {\n name: fn_1,\n compression: cmp_1,\n start: function () {\n if (!file_1.ondata)\n err(5);\n if (!sc_1)\n file_1.ondata(null, et, true);\n else {\n var ctr = _this_1.o[cmp_1];\n if (!ctr)\n file_1.ondata(err(14, 'unknown compression type ' + cmp_1, 1), null, false);\n d_1 = sc_1 < 0 ? new ctr(fn_1) : new ctr(fn_1, sc_1, su_1);\n d_1.ondata = function (err, dat, final) { file_1.ondata(err, dat, final); };\n for (var _i = 0, chks_4 = chks_3; _i < chks_4.length; _i++) {\n var dat = chks_4[_i];\n d_1.push(dat, false);\n }\n if (_this_1.k[0] == chks_3 && _this_1.c)\n _this_1.d = d_1;\n else\n d_1.push(et, true);\n }\n },\n terminate: function () {\n if (d_1 && d_1.terminate)\n d_1.terminate();\n }\n };\n if (sc_1 >= 0)\n file_1.size = sc_1, file_1.originalSize = su_1;\n this_1.onfile(file_1);\n }\n return \"break\";\n }\n else if (oc) {\n if (sig == 0x8074B50) {\n is = i += 12 + (oc == -2 && 8), f = 3, this_1.c = 0;\n return \"break\";\n }\n else if (sig == 0x2014B50) {\n is = i -= 4, f = 3, this_1.c = 0;\n return \"break\";\n }\n }\n };\n var this_1 = this;\n for (; i < l - 4; ++i) {\n var state_1 = _loop_2();\n if (state_1 === \"break\")\n break;\n }\n this.p = et;\n if (oc < 0) {\n var dat = f ? buf.subarray(0, is - 12 - (oc == -2 && 8) - (b4(buf, is - 16) == 0x8074B50 && 4)) : buf.subarray(0, i);\n if (add)\n add.push(dat, !!f);\n else\n this.k[+(f == 2)].push(dat);\n }\n if (f & 2)\n return this.push(buf.subarray(i), final);\n this.p = buf.subarray(i);\n }\n if (final) {\n if (this.c)\n err(13);\n this.p = null;\n }\n };\n /**\n * Registers a decoder with the stream, allowing for files compressed with\n * the compression type provided to be expanded correctly\n * @param decoder The decoder constructor\n */\n Unzip.prototype.register = function (decoder) {\n this.o[decoder.compression] = decoder;\n };\n return Unzip;\n}());\nexport { Unzip };\nvar mt = typeof queueMicrotask == 'function' ? queueMicrotask : typeof setTimeout == 'function' ? setTimeout : function (fn) { fn(); };\nexport function unzip(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n var term = [];\n var tAll = function () {\n for (var i = 0; i < term.length; ++i)\n term[i]();\n };\n var files = {};\n var cbd = function (a, b) {\n mt(function () { cb(a, b); });\n };\n mt(function () { cbd = cb; });\n var e = data.length - 22;\n for (; b4(data, e) != 0x6054B50; --e) {\n if (!e || data.length - e > 65558) {\n cbd(err(13, 0, 1), null);\n return tAll;\n }\n }\n ;\n var lft = b2(data, e + 8);\n if (lft) {\n var c = lft;\n var o = b4(data, e + 16);\n var z = o == 4294967295;\n if (z) {\n e = b4(data, e - 12);\n if (b4(data, e) != 0x6064B50) {\n cbd(err(13, 0, 1), null);\n return tAll;\n }\n c = lft = b4(data, e + 32);\n o = b4(data, e + 48);\n }\n var fltr = opts && opts.filter;\n var _loop_3 = function (i) {\n var _a = zh(data, o, z), c_1 = _a[0], sc = _a[1], su = _a[2], fn = _a[3], no = _a[4], off = _a[5], b = slzh(data, off);\n o = no;\n var cbl = function (e, d) {\n if (e) {\n tAll();\n cbd(e, null);\n }\n else {\n if (d)\n files[fn] = d;\n if (!--lft)\n cbd(null, files);\n }\n };\n if (!fltr || fltr({\n name: fn,\n size: sc,\n originalSize: su,\n compression: c_1\n })) {\n if (!c_1)\n cbl(null, slc(data, b, b + sc));\n else if (c_1 == 8) {\n var infl = data.subarray(b, b + sc);\n if (sc < 320000) {\n try {\n cbl(null, inflateSync(infl, new u8(su)));\n }\n catch (e) {\n cbl(e, null);\n }\n }\n else\n term.push(inflate(infl, { size: su }, cbl));\n }\n else\n cbl(err(14, 'unknown compression type ' + c_1, 1), null);\n }\n else\n cbl(null, null);\n };\n for (var i = 0; i < c; ++i) {\n _loop_3(i);\n }\n }\n else\n cbd(null, {});\n return tAll;\n}\n/**\n * Synchronously decompresses a ZIP archive. Prefer using `unzip` for better\n * performance with more than one file.\n * @param data The raw compressed ZIP file\n * @param opts The ZIP extraction options\n * @returns The decompressed files\n */\nexport function unzipSync(data, opts) {\n var files = {};\n var e = data.length - 22;\n for (; b4(data, e) != 0x6054B50; --e) {\n if (!e || data.length - e > 65558)\n err(13);\n }\n ;\n var c = b2(data, e + 8);\n if (!c)\n return {};\n var o = b4(data, e + 16);\n var z = o == 4294967295;\n if (z) {\n e = b4(data, e - 12);\n if (b4(data, e) != 0x6064B50)\n err(13);\n c = b4(data, e + 32);\n o = b4(data, e + 48);\n }\n var fltr = opts && opts.filter;\n for (var i = 0; i < c; ++i) {\n var _a = zh(data, o, z), c_2 = _a[0], sc = _a[1], su = _a[2], fn = _a[3], no = _a[4], off = _a[5], b = slzh(data, off);\n o = no;\n if (!fltr || fltr({\n name: fn,\n size: sc,\n originalSize: su,\n compression: c_2\n })) {\n if (!c_2)\n files[fn] = slc(data, b, b + sc);\n else if (c_2 == 8)\n files[fn] = inflateSync(data.subarray(b, b + sc), new u8(su));\n else\n err(14, 'unknown compression type ' + c_2);\n }\n }\n return files;\n}\n","/** Get time in milliseconds between a start time (t0) and now */\r\nfunction timeDiff(t0) {\r\n return Math.round(performance.now() - t0);\r\n}\r\n\r\n/** Initialize performance analysis settings */\r\nfunction initAnalyzeRelatedGenes(ideo) {\r\n ideo.time = {\r\n rg: { // times for related genes\r\n t0: performance.now()\r\n }\r\n };\r\n if ('_didRelatedGenesFirstPlot' in ideo) {\r\n delete ideo._didRelatedGenesFirstPlot;\r\n }\r\n}\r\n\r\nfunction getRelatedGenesByType() {\r\n const ideo = this;\r\n const relatedGenes = ideo.annotDescriptions.annots;\r\n\r\n const related = Object.values(relatedGenes).slice();\r\n\r\n const paralogous = related.filter(r => {\r\n return r.type && r.type.includes('paralogous');\r\n });\r\n const interacting = related.filter(r => {\r\n return r.type && r.type.includes('interacting gene');\r\n });\r\n const searched = Object.entries(relatedGenes).filter(entry => {\r\n return entry[1].type && entry[1].type.includes('searched gene');\r\n })[0][0];\r\n\r\n return {related, paralogous, interacting, searched};\r\n}\r\n\r\nfunction getRelatedGenesTooltipAnalytics(annot) {\r\n const ideo = this;\r\n\r\n const timeSincePrevTooltip = performance.now() - ideo.time.prevTooltipOff;\r\n const prevAnnotDomId = ideo.time.prevTooltipAnnotDomId;\r\n\r\n if (timeSincePrevTooltip < 300 && annot.domId === prevAnnotDomId) {\r\n return null;\r\n }\r\n\r\n const tooltipGene = annot.name;\r\n\r\n // e.g. \"interacting gene\" -> \"interacting\"\r\n const tooltipRelatedType =\r\n ideo.annotDescriptions.annots[annot.name].type.split(' ')[0];\r\n\r\n const countsByType = getCountsByType(ideo);\r\n\r\n const analytics = Object.assign(\r\n {tooltipGene, tooltipRelatedType}, countsByType\r\n );\r\n\r\n return analytics;\r\n}\r\n\r\n/** Compute granular related genes plotting analytics */\r\nfunction analyzePlotTimes(type, ideo) {\r\n // Paralogs and interacting genes:\r\n // http://localhost:8080/examples/vanilla/related-genes?q=RAD51\r\n //\r\n // No paralogs:\r\n // http://localhost:8080/examples/vanilla/related-genes?q=BRCA1&org=mus-musculus\r\n //\r\n // No interacting genes:\r\n // http://localhost:8080/examples/vanilla/related-genes?q=DMC1\r\n //\r\n // No paralogs, no interacting genes:\r\n // http://localhost:8080/examples/vanilla/related-genes?q=BRCA1&org=macaca-mulatta\r\n\r\n if (type === 'pathway') {\r\n return;\r\n }\r\n const otherTypes = {\r\n paralogous: 'interacting',\r\n interacting: 'paralogous'\r\n };\r\n const related = ideo.getRelatedGenesByType();\r\n const otherType = otherTypes[type];\r\n const numThisRelated = related[type].length;\r\n const numOtherRelated = related[otherType] ? related[otherType].length : 0;\r\n\r\n if (!ideo._didRelatedGenesFirstPlot) {\r\n // 1st of 2 attempted plot logs\r\n ideo._didRelatedGenesFirstPlot = true;\r\n\r\n ideo.time.rg.totalFirstPlot = timeDiff(ideo.time.rg.t0);\r\n\r\n if (numThisRelated > 0) {\r\n ideo.time.rg.timestampFirstPlot = performance.now();\r\n ideo._relatedGenesFirstPlotType = type;\r\n }\r\n } else {\r\n // 2nd of 2 attempted plot logs\r\n if (numThisRelated > 0 && numOtherRelated > 0) {\r\n // Paralogs and interacting genes were found, e.g. human RAD51\r\n const timestampFirstPlot = ideo.time.rg.timestampFirstPlot;\r\n ideo.time.rg.totalLastPlotDiff = timeDiff(timestampFirstPlot);\r\n } else if (numThisRelated > 0 && numOtherRelated === 0) {\r\n // Other attempt did not plot, and this did, so log this as 1st\r\n // Often seen when no interacting genes found, e.g. human DMC1\r\n ideo.time.rg.timestampFirstPlot = performance.now();\r\n ideo.time.rg.totalFirstPlot = timeDiff(ideo.time.rg.t0);\r\n ideo._relatedGenesFirstPlotType = type;\r\n ideo.time.rg.totalLastPlotDiff = 0;\r\n\r\n } else if (numThisRelated === 0 && numOtherRelated > 0) {\r\n // This attempt did not plot, the other did, so log 1st plot as also last\r\n // Often seen when no paralogs found, e.g. mouse BRCA1\r\n ideo.time.rg.totalLastPlotDiff = 0;\r\n } else {\r\n // No related genes found, so note only the searched gene is plotted\r\n // Example: Macaca mulatta BRCA1\r\n ideo._relatedGenesFirstPlotType = 'searched';\r\n ideo.time.rg.totalLastPlotDiff = 0;\r\n }\r\n }\r\n}\r\n\r\nfunction getCountsByType(ideo) {\r\n const related = ideo.getRelatedGenesByType();\r\n\r\n const numRelatedGenes = related['related'].length;\r\n const numParalogs = related['paralogous'].length;\r\n const numInteractingGenes = related['interacting'].length;\r\n const searchedGene = related['searched'];\r\n\r\n return {\r\n numRelatedGenes, numParalogs, numInteractingGenes, searchedGene\r\n };\r\n}\r\n\r\n/** Summarizes number and kind of related genes, performance, etc. */\r\nfunction analyzeRelatedGenes(ideo) {\r\n\r\n const countsByType = getCountsByType(ideo);\r\n\r\n const timeTotal = ideo.time.rg.total;\r\n const timeTotalFirstPlot = ideo.time.rg.totalFirstPlot;\r\n const timeTotalLastPlotDiff = ideo.time.rg.totalLastPlotDiff;\r\n const timeParalogs = ideo.time.rg.paralogs;\r\n const timeInteractingGenes = ideo.time.rg.interactions;\r\n const timeSearchedGene = ideo.time.rg.searchedGene;\r\n const firstPlotType = ideo._relatedGenesFirstPlotType;\r\n\r\n const analytics = Object.assign({\r\n firstPlotType,\r\n timeTotal, timeTotalFirstPlot, timeTotalLastPlotDiff,\r\n timeSearchedGene, timeInteractingGenes, timeParalogs\r\n }, countsByType);\r\n\r\n ideo.relatedGenesAnalytics = analytics;\r\n}\r\n\r\nexport {\r\n initAnalyzeRelatedGenes, analyzePlotTimes, analyzeRelatedGenes, timeDiff,\r\n getRelatedGenesByType, getRelatedGenesTooltipAnalytics\r\n};\r\n","/**\r\n * @fileoverview Fetch cached gene data: name, position, etc.\r\n *\r\n * Gene cache eliminates needing to fetch names and positions of genes from\r\n * third-party APIs at runtime. It achieves this by fetching a static file\r\n * containing gene data upon initializing Ideogram.\r\n *\r\n * Use cases:\r\n *\r\n * - test if a given string is a gene name, e.g. for gene search\r\n * - find genomic position of a given gene (or all genes)\r\n */\r\nimport {decompressSync, strFromU8} from 'fflate';\r\n\r\nimport {slug, getEarlyTaxid, getDir} from './lib';\r\nimport {organismMetadata} from './init/organism-metadata';\r\nimport version from './version';\r\n\r\nlet perfTimes;\r\n\r\n/** Get URL for gene cache file */\r\nfunction getCacheUrl(orgName, cacheDir) {\r\n const organism = slug(orgName);\r\n if (!cacheDir) {\r\n cacheDir = getDir('cache/');\r\n }\r\n\r\n const cacheUrl = cacheDir + organism + '-genes.tsv.gz';\r\n\r\n return cacheUrl;\r\n}\r\n\r\n/**\r\n * Convert pre-annotation arrays to annotation objects\r\n * sorted by genomic position.\r\n */\r\nfunction parseAnnots(preAnnots) {\r\n const chromosomes = {};\r\n\r\n for (let i = 0; i < preAnnots.length; i++) {\r\n const [chromosome, start, stop, ensemblId, gene] = preAnnots[i];\r\n\r\n if (!(chromosome in chromosomes)) {\r\n chromosomes[chromosome] = {chr: chromosome, annots: []};\r\n } else {\r\n const annot = {name: gene, start, stop, ensemblId};\r\n chromosomes[chromosome].annots.push(annot);\r\n }\r\n }\r\n\r\n const annotsSortedByPosition = {};\r\n\r\n Object.entries(chromosomes).forEach(([chr, annotsByChr]) => {\r\n annotsSortedByPosition[chr] = {\r\n chr,\r\n annots: annotsByChr.annots.sort((a, b) => a.start - b.start)\r\n };\r\n });\r\n\r\n return annotsSortedByPosition;\r\n}\r\n\r\n/**\r\n * Build full Ensembl ID from prefix (e.g. ENSG) and slim ID (e.g. 223972)\r\n *\r\n * Example output ID: ENSG00000223972\r\n * */\r\nexport function getEnsemblId(ensemblPrefix, slimEnsemblId) {\r\n\r\n // C. elegans (prefix: WBGene) has special IDs, e.g. WBGene00197333\r\n const padLength = ensemblPrefix === 'WBGene' ? 8 : 11;\r\n\r\n // Zero-pad the slim ID, e.g. 223972 -> 00000223972\r\n const zeroPaddedId = slimEnsemblId.padStart(padLength, '0');\r\n\r\n return ensemblPrefix + zeroPaddedId;\r\n}\r\n\r\n/** Parse a gene cache TSV file, return array of useful transforms */\r\nfunction parseCache(rawTsv, orgName) {\r\n const names = [];\r\n const nameCaseMap = {};\r\n const namesById = {};\r\n const fullNamesById = {};\r\n const idsByName = {};\r\n const idsByFullName = {};\r\n const lociByName = {};\r\n const lociById = {};\r\n const preAnnots = [];\r\n let ensemblPrefix;\r\n\r\n let t0 = performance.now();\r\n const lines = rawTsv.split(/\\r\\n|\\n/);\r\n perfTimes.rawTsvSplit = Math.round(performance.now() - t0);\r\n\r\n t0 = performance.now();\r\n for (let i = 0; i < lines.length; i++) {\r\n const line = lines[i];\r\n if (line === '') continue; // Skip empty lines\r\n if (line[0] === '#') {\r\n if (line.slice(0, 9) === '## prefix') {\r\n ensemblPrefix = line.split('prefix: ')[1];\r\n }\r\n continue;\r\n }\r\n const [\r\n chromosome, rawStart, rawLength, slimEnsemblId, gene, rawFullName\r\n ] = line.trim().split(/\\t/);\r\n const fullName = decodeURIComponent(rawFullName);\r\n const start = parseInt(rawStart);\r\n const stop = start + parseInt(rawLength);\r\n const ensemblId = getEnsemblId(ensemblPrefix, slimEnsemblId);\r\n preAnnots.push([chromosome, start, stop, ensemblId, gene, fullName]);\r\n const locus = [chromosome, start, stop];\r\n\r\n names.push(gene);\r\n nameCaseMap[gene.toLowerCase()] = gene;\r\n namesById[ensemblId] = gene;\r\n fullNamesById[ensemblId] = fullName;\r\n idsByName[gene] = ensemblId;\r\n idsByFullName[fullName] = ensemblId;\r\n lociByName[gene] = locus;\r\n lociById[ensemblId] = locus;\r\n };\r\n const t1 = performance.now();\r\n perfTimes.parseCacheLoop = Math.round(t1 - t0);\r\n\r\n const sortedAnnots = parseAnnots(preAnnots);\r\n perfTimes.parseAnnots = Math.round(performance.now() - t1);\r\n\r\n return [\r\n names, nameCaseMap, namesById, fullNamesById,\r\n idsByName, idsByFullName, lociByName, lociById,\r\n sortedAnnots\r\n ];\r\n}\r\n\r\n/** Get organism's metadata fields */\r\nfunction parseOrgMetadata(orgName) {\r\n const taxid = getEarlyTaxid(orgName);\r\n return organismMetadata[taxid] || {};\r\n}\r\n\r\n/** Reports if current organism has a gene cache */\r\nfunction hasGeneCache(orgName) {\r\n const metadata = parseOrgMetadata(orgName);\r\n return (metadata.hasGeneCache && metadata.hasGeneCache === true);\r\n}\r\n\r\nexport async function cacheFetch(url) {\r\n\r\n const decompressedUrl = url.replace('.gz', '');\r\n const response = await Ideogram.cache.match(decompressedUrl);\r\n if (typeof response === 'undefined') {\r\n // If cache miss, then fetch and add response to cache\r\n // await Ideogram.cache.add(url);\r\n const rawResponse = await fetch(url);\r\n const blob = await rawResponse.blob();\r\n const uint8Array = new Uint8Array(await blob.arrayBuffer());\r\n const data = strFromU8(decompressSync(uint8Array));\r\n const decompressedResponse = new Response(\r\n new Blob([data], {type: 'text/tab-separated-values'}),\r\n rawResponse.init\r\n );\r\n await Ideogram.cache.put(decompressedUrl, decompressedResponse);\r\n return await Ideogram.cache.match(decompressedUrl);\r\n }\r\n return await Ideogram.cache.match(decompressedUrl);\r\n}\r\n\r\n/**\r\n * Fetch cached gene data, transform it usefully, and set it as ideo prop\r\n */\r\nexport default async function initGeneCache(orgName, ideo, cacheDir=null) {\r\n\r\n const startTime = performance.now();\r\n perfTimes = {};\r\n\r\n // Skip initialization if files needed to make cache don't exist\r\n if (!hasGeneCache(orgName)) return;\r\n\r\n // Skip initialization if cache is already populated\r\n if (Ideogram.geneCache && Ideogram.geneCache[orgName]) {\r\n // Simplify chief use case, i.e. for single organism\r\n ideo.geneCache = Ideogram.geneCache[orgName];\r\n return;\r\n }\r\n\r\n if (!Ideogram.geneCache) {\r\n Ideogram.geneCache = {};\r\n }\r\n\r\n Ideogram.cache = await caches.open(`ideogram-${version}`);\r\n\r\n const cacheUrl = getCacheUrl(orgName, cacheDir, ideo);\r\n\r\n const fetchStartTime = performance.now();\r\n const response = await cacheFetch(cacheUrl);\r\n\r\n const data = await response.text();\r\n const fetchEndTime = performance.now();\r\n perfTimes.fetch = Math.round(fetchEndTime - fetchStartTime);\r\n\r\n const [\r\n interestingNames, nameCaseMap, namesById, fullNamesById,\r\n idsByName, idsByFullName, lociByName, lociById, sortedAnnots\r\n ] = parseCache(data, orgName);\r\n perfTimes.parseCache = Math.round(performance.now() - fetchEndTime);\r\n\r\n ideo.geneCache = {\r\n interestingNames, // Array ordered by general or scholarly interest\r\n nameCaseMap, // Maps of lowercase gene names to proper gene names\r\n namesById,\r\n fullNamesById,\r\n idsByName,\r\n idsByFullName,\r\n lociByName, // Object of gene positions, keyed by gene name\r\n lociById,\r\n sortedAnnots // Ideogram annotations sorted by genomic position\r\n };\r\n Ideogram.geneCache[orgName] = ideo.geneCache;\r\n\r\n if (ideo.config.debug) {\r\n perfTimes.total = Math.round(performance.now() - startTime);\r\n console.log('perfTimes in initGeneCache:', perfTimes);\r\n }\r\n}\r\n","/**\r\n * @fileoverview Fetch cached paralogs: Ensembl IDs of <= 20 paralogs per genes\r\n *\r\n * Paralog cache eliminates needing to fetch IDs of paralogs for a given gene\r\n * from third-party APIs at runtime. It achieves this by fetching a static\r\n * file containing gene data upon initializing Ideogram.\r\n */\r\n\r\nimport {cacheFetch} from './gene-cache';\r\nimport {slug, getEarlyTaxid, getDir} from './lib';\r\nimport {organismMetadata} from './init/organism-metadata';\r\nimport version from './version';\r\n\r\nlet perfTimes;\r\n\r\n/** Get URL for gene cache file */\r\nfunction getCacheUrl(orgName, cacheDir) {\r\n const organism = slug(orgName);\r\n if (!cacheDir) {\r\n cacheDir = getDir('cache/paralogs/');\r\n } else {\r\n cacheDir += 'paralogs/';\r\n }\r\n\r\n const cacheUrl = cacheDir + organism + '-paralogs.tsv.gz';\r\n\r\n return cacheUrl;\r\n}\r\n\r\n/**\r\n * Build full Ensembl ID from prefix (e.g. ENSG) and slim ID (e.g. 223972)\r\n *\r\n * Example output ID: ENSG00000223972\r\n * */\r\nfunction getEnsemblId(ensemblPrefix, slimEnsemblId) {\r\n\r\n // C. elegans (prefix: WBGene) has special IDs, e.g. WBGene00197333\r\n const padLength = ensemblPrefix === 'WBGene' ? 8 : 11;\r\n\r\n // Zero-pad the slim ID, e.g. 223972 -> 00000223972\r\n const zeroPaddedId = slimEnsemblId.padStart(padLength, '0');\r\n\r\n return ensemblPrefix + zeroPaddedId;\r\n}\r\n\r\n/** Parse a gene cache TSV file, return array of useful transforms */\r\nfunction parseCache(rawTsv) {\r\n const nameCaseMap = {};\r\n const paralogsByName = {};\r\n let ensemblPrefix;\r\n\r\n let t0 = performance.now();\r\n const lines = rawTsv.split(/\\r\\n|\\n/);\r\n perfTimes.rawTsvSplit = Math.round(performance.now() - t0);\r\n\r\n t0 = performance.now();\r\n for (let i = 0; i < lines.length; i++) {\r\n const line = lines[i];\r\n if (line === '') continue; // Skip empty lines\r\n if (line[0] === '#') {\r\n if (line.slice(0, 9) === '## prefix') {\r\n ensemblPrefix = line.split('prefix: ')[1];\r\n }\r\n continue;\r\n }\r\n const columns = line.trim().split(/\\t/);\r\n const gene = columns[0];\r\n const geneSlimId = columns[1];\r\n\r\n const paralogs = [];\r\n if (columns[2][0] === '_') {\r\n const pointer = columns[2].slice(1).toUpperCase();\r\n const paralogSuperList = paralogsByName[pointer];\r\n const geneId = getEnsemblId(ensemblPrefix, geneSlimId);\r\n for (let j = 0; j < paralogSuperList.length; j++) {\r\n const id = paralogSuperList[j];\r\n if (id !== geneId) {\r\n paralogs.push(id);\r\n }\r\n }\r\n paralogs.unshift(getEnsemblId(ensemblPrefix, columns[3]));\r\n } else {\r\n const slimEnsemblIds = columns.slice(2);\r\n for (let i = 0; i < slimEnsemblIds.length; i++) {\r\n const slimId = slimEnsemblIds[i];\r\n if (slimId !== geneSlimId) {\r\n paralogs.push(getEnsemblId(ensemblPrefix, slimId));\r\n }\r\n }\r\n }\r\n\r\n paralogsByName[gene.toUpperCase()] = paralogs;\r\n };\r\n const t1 = performance.now();\r\n perfTimes.parseCacheLoop = Math.round(t1 - t0);\r\n\r\n return paralogsByName;\r\n}\r\n\r\n/** Get organism's metadata fields */\r\nfunction parseOrgMetadata(orgName) {\r\n const taxid = getEarlyTaxid(orgName);\r\n return organismMetadata[taxid] || {};\r\n}\r\n\r\n/** Reports if current organism has a gene cache */\r\nexport function hasParalogCache(orgName) {\r\n const metadata = parseOrgMetadata(orgName);\r\n return (metadata.hasParalogCache && metadata.hasParalogCache === true);\r\n}\r\n\r\n/**\r\n * Fetch cached paralog data, transform it usefully, and set it as ideo prop\r\n */\r\nexport default async function initParalogCache(orgName, ideo, cacheDir=null) {\r\n\r\n const startTime = performance.now();\r\n perfTimes = {};\r\n\r\n // Skip initialization if files needed to make cache don't exist\r\n if (!hasParalogCache(orgName)) return;\r\n\r\n\r\n // Skip initialization if cache is already populated\r\n if (Ideogram.paralogCache && Ideogram.paralogCache[orgName]) {\r\n // Simplify chief use case, i.e. for single organism\r\n ideo.paralogCache = Ideogram.paralogCache[orgName];\r\n return;\r\n }\r\n\r\n if (!Ideogram.paralogCache) {\r\n Ideogram.paralogCache = {};\r\n }\r\n\r\n Ideogram.cache = await caches.open(`ideogram-${version}`);\r\n\r\n const cacheUrl = getCacheUrl(orgName, cacheDir, ideo);\r\n\r\n const fetchStartTime = performance.now();\r\n const response = await cacheFetch(cacheUrl);\r\n const data = await response.text();\r\n const fetchEndTime = performance.now();\r\n perfTimes.fetch = Math.round(fetchEndTime - fetchStartTime);\r\n\r\n const paralogsByName = parseCache(data, orgName);\r\n perfTimes.parseCache = Math.round(performance.now() - fetchEndTime);\r\n\r\n ideo.paralogCache = {\r\n paralogsByName // Array of paralog Ensembl IDs by (uppercase) gene name\r\n };\r\n Ideogram.paralogCache[orgName] = ideo.paralogCache;\r\n\r\n if (ideo.config.debug) {\r\n perfTimes.total = Math.round(performance.now() - startTime);\r\n console.log('perfTimes in initParalogCache:', perfTimes);\r\n }\r\n}\r\n\r\n\r\n// idsMissingLocations = []\r\n// // ideogram.geneCache.interestingNames.slice(0, 50).forEach(iGene => {\r\n// seekGene = 'CDK1'\r\n// // seekGene = iGene;\r\n// // pIndex = 12600\r\n// console.log(seekGene)\r\n// let pgenes = Object.entries(ideogram.paralogCache.paralogsByName).map(([k, v]) => [k, v]).sort((a, b) => b[1].length - a[1].length)\r\n// pgenes = pgenes.filter(pg => pg[0].slice(0, 3) !== 'RNU');\r\n// pgenenames = pgenes.map(pg => pg[0])\r\n// pIndex = pgenenames.indexOf(seekGene)\r\n// // if (pIndex === -1) return;\r\n// pids = pgenes[pIndex][1];\r\n// pnames = pids.map(id => ideogram.geneCache.namesById[id]);\r\n// console.log('pids', pids)\r\n// const indicesMissingLocations = []\r\n// plocs = pids.filter((id, i) => {\r\n// const hasLoc = id in ideogram.geneCache.lociById\r\n// if (!hasLoc) {\r\n// idsMissingLocations.push(id)\r\n// indicesMissingLocations.push(i)\r\n// }\r\n// return hasLoc\r\n// }).map(id => ideogram.geneCache.lociById[id].join(':'));\r\n// pnl = pnames.filter((_, i) => i in indicesMissingLocations === false).map((n, i) => n + ': ' + plocs[i]);\r\n// gene = pgenenames[pIndex]\r\n// // console.log('pnl before')\r\n// // console.log(pnl)\r\n// pnl.sort((a, b) => {\r\n// const [aChr, aStart] = a.split(':').slice(1).map(p => p.trim())\r\n// const [bChr, bStart] = b.split(':').slice(1).map(p => p.trim())\r\n// chrSort = Ideogram.sortChromosomes(aChr, bChr)\r\n// // console.log(aChr, bChr, chrSort)\r\n// if (chrSort !== 0) return chrSort\r\n// return aStart.localeCompare(bStart, 'en', {numeric: true});\r\n// })\r\n// console.log(seekGene, pnl.length)\r\n// console.log('numParalogs: ' + pgenes.length)\r\n// ideogram.plotRelatedGenes(gene)\r\n// console.log(pnl)\r\n// // })\r\n","/**\r\n * @fileoverview Fetch cached interactions from WikiPathways\r\n *\r\n * Interactions cache eliminates needing to fetch interactions for a given gene\r\n * from third-party APIs at runtime. It achieves this by fetching a static\r\n * file containing gene data upon initializing Ideogram.\r\n */\r\n\r\nimport {cacheFetch} from './gene-cache';\r\nimport {slug, getEarlyTaxid, getDir} from './lib';\r\nimport {organismMetadata} from './init/organism-metadata';\r\nimport version from './version';\r\n\r\nlet perfTimes;\r\n\r\n/** Get URL for gene cache file */\r\nfunction getCacheUrl(orgName, cacheDir) {\r\n const organism = slug(orgName);\r\n if (!cacheDir) {\r\n cacheDir = getDir('cache/');\r\n }\r\n cacheDir += 'interactions/';\r\n const cacheUrl = cacheDir + organism + '-interactions.json.gz';\r\n\r\n return cacheUrl;\r\n}\r\n\r\n/**\r\n * Build full Ensembl ID from prefix (e.g. ENSG) and slim ID (e.g. 223972)\r\n *\r\n * Example output ID: ENSG00000223972\r\n * */\r\nfunction getEnsemblId(ensemblPrefix, slimEnsemblId) {\r\n\r\n // C. elegans (prefix: WBGene) has special IDs, e.g. WBGene00197333\r\n const padLength = ensemblPrefix === 'WBGene' ? 8 : 11;\r\n\r\n // Zero-pad the slim ID, e.g. 223972 -> 00000223972\r\n const zeroPaddedId = slimEnsemblId.padStart(padLength, '0');\r\n\r\n return ensemblPrefix + zeroPaddedId;\r\n}\r\n\r\n/** Parse a gene cache TSV file, return array of useful transforms */\r\nfunction parseCache(rawJson, organism) {\r\n let t0 = performance.now();\r\n const interactionsByName = {};\r\n const tmp = organism.replace('-', ' ');\r\n const desluggedOrg = tmp[0].toUpperCase() + tmp.slice(1);\r\n\r\n t0 = performance.now();\r\n for (const gene in rawJson['interactions']) {\r\n const ixnLists = rawJson['interactions'][gene];\r\n interactionsByName[gene] = {result: []};\r\n for (let i = 0; i < ixnLists.length; i++) {\r\n const compressedIxn = ixnLists[i];\r\n const slimPwId = compressedIxn[0];\r\n interactionsByName[gene].result.push({\r\n fields: {\r\n left: {values: compressedIxn[1]},\r\n right: {values: compressedIxn[2]}\r\n },\r\n id: 'WP' + slimPwId,\r\n name: rawJson['pathwayNamesById'][slimPwId],\r\n species: desluggedOrg\r\n });\r\n }\r\n }\r\n const t1 = performance.now();\r\n perfTimes.parseCacheLoop = Math.round(t1 - t0);\r\n\r\n return interactionsByName;\r\n}\r\n\r\n/** Get organism's metadata fields */\r\nfunction parseOrgMetadata(orgName) {\r\n const taxid = getEarlyTaxid(orgName);\r\n return organismMetadata[taxid] || {};\r\n}\r\n\r\n/** Reports if current organism has a gene cache */\r\nexport function hasinteractionCache(orgName) {\r\n const metadata = parseOrgMetadata(orgName);\r\n return (\r\n metadata.hasInteractionCache && metadata.hasInteractionCache === true\r\n );\r\n}\r\n\r\n/**\r\n * Fetch cached paralog data, transform it usefully, and set it as ideo prop\r\n */\r\nexport default async function initInteractionCache(\r\n orgName, ideo, cacheDir=null\r\n) {\r\n\r\n const startTime = performance.now();\r\n perfTimes = {};\r\n\r\n // Skip initialization if files needed to make cache don't exist\r\n if (!hasinteractionCache(orgName)) return;\r\n\r\n // Skip initialization if cache is already populated\r\n if (Ideogram.interactionCache && Ideogram.interactionCache[orgName]) {\r\n // Simplify chief use case, i.e. for single organism\r\n ideo.interactionCache = Ideogram.interactionCache[orgName];\r\n return;\r\n }\r\n\r\n if (!Ideogram.interactionCache) {\r\n Ideogram.interactionCache = {};\r\n }\r\n\r\n Ideogram.cache = await caches.open(`ideogram-${version}`);\r\n\r\n const cacheUrl = getCacheUrl(orgName, cacheDir, ideo);\r\n\r\n const fetchStartTime = performance.now();\r\n const response = await cacheFetch(cacheUrl);\r\n const data = await response.json();\r\n const fetchEndTime = performance.now();\r\n perfTimes.fetch = Math.round(fetchEndTime - fetchStartTime);\r\n\r\n const interactionsByName = parseCache(data, orgName);\r\n perfTimes.parseCache = Math.round(performance.now() - fetchEndTime);\r\n\r\n ideo.interactionCache = interactionsByName;\r\n Ideogram.interactionCache[orgName] = ideo.interactionCache;\r\n\r\n if (ideo.config.debug) {\r\n perfTimes.total = Math.round(performance.now() - startTime);\r\n console.log('perfTimes in initInteractionCache:', perfTimes);\r\n }\r\n}\r\n","import {decompressSync, strFromU8} from 'fflate';\r\nimport { sortAnnotsByRank } from '../annotations/annotations';\r\n\r\n// Definitions for ArrowHead values in WikiPathways GPML\r\n//\r\n// See also: https://discover.nci.nih.gov/mim/formal_mim_spec.pdf\r\nconst interactionArrowMap = {\r\n 'Arrow': ['acts on', 'acted on by'],\r\n 'TBar': ['inhibits', 'inhibited by'],\r\n 'mim-binding': ['binds', 'binds'],\r\n 'mim-catalysis': ['catalyzes', 'catalyzed by'],\r\n 'mim-cleavage': ['cleaves', 'cleaved by'],\r\n 'mim-conversion': ['converts', 'converted by'],\r\n // 'mim-covalent-bond': ['covalently binds',\r\n // 'mim-gap': 'MimGap',\r\n 'mim-inhibition': ['inhibits', 'inhibited by'],\r\n 'mim-modification': ['modifies', 'modified by'],\r\n 'mim-necessary-stimulation':\r\n ['necessarily stimulates', 'necessarily stimulated by'],\r\n 'mim-stimulation': ['stimulates', 'stimulated by'],\r\n 'mim-transcription-translation':\r\n ['transcribes / translates', 'transcribed / translated by']\r\n};\r\n\r\n// Which interactions types to show first, if showing multiple\r\nconst rankedInteractionTypes = [\r\n 'transcribe',\r\n 'cleave',\r\n 'convert',\r\n 'bind',\r\n 'modifie',\r\n 'catalyze',\r\n 'necessarily stimulate',\r\n 'inhibit',\r\n 'stimulate',\r\n 'act'\r\n];\r\n\r\nexport function sortInteractionTypes(a, b) {\r\n const ranks = {};\r\n for (let i = 0; i < rankedInteractionTypes.length; i++) {\r\n const rankedIxnType = rankedInteractionTypes[i];\r\n if (rankedIxnType.includes(a)) ranks.a = i;\r\n if (rankedIxnType.includes(b)) ranks.b = i;\r\n }\r\n return ranks.b - ranks.a;\r\n}\r\n\r\n/** Determine if all given interactions in *one* pathway are same */\r\nfunction determineIxnsInPathwayAreSame(ixns, ixnTypeReference) {\r\n let isRefMatch = true;\r\n let thisIsSame = true;\r\n\r\n if (ixns.length === 0) return {isRefMatch, thisIsSame};\r\n\r\n const thisIxnTypeReference = ixns[0].ixnType.toLowerCase();\r\n ixns.forEach(ixn => {\r\n const ixnType = ixn.ixnType.toLowerCase();\r\n if (ixnType !== ixnTypeReference) {\r\n isRefMatch = false;\r\n }\r\n if (ixnType !== thisIxnTypeReference) {\r\n thisIsSame = false;\r\n }\r\n });\r\n return {isRefMatch, thisIsSame};\r\n}\r\n\r\n/**\r\n * Return first valid interaction type from interactions-by-pathway object\r\n */\r\nfunction getIxnTypeReference(ixnsByPwid) {\r\n const ixnTypeReference = Object.values(ixnsByPwid).find(ixns => {\r\n return ixns.length > 0 && 'ixnType' in ixns[0];\r\n })[0].ixnType.toLowerCase();\r\n\r\n return ixnTypeReference;\r\n}\r\n\r\n/**\r\n * Determine whether all given interactions in all given pathways are the same\r\n */\r\nfunction setIsSame(enrichedIxns) {\r\n let isSame = true;\r\n const ixnsByPwid = enrichedIxns.ixnsByPwid;\r\n\r\n const ixnTypeReference = getIxnTypeReference(ixnsByPwid);\r\n\r\n Object.entries(ixnsByPwid).map(([pwid, ixns]) => {\r\n const {isRefMatch, thisIsSame} =\r\n determineIxnsInPathwayAreSame(ixns, ixnTypeReference);\r\n if (!thisIsSame || !isRefMatch) {\r\n isSame = false;\r\n }\r\n enrichedIxns.isSameByPwid[pwid] = thisIsSame;\r\n });\r\n enrichedIxns.isSame = isSame;\r\n\r\n return enrichedIxns;\r\n}\r\n\r\n/**\r\n * If interactions aren't all exactly the same, then they are often still\r\n * directionally equivalent.\r\n *\r\n * E.g. if gene A both \"modifies\" and \"converts\" gene B, then we can summarize\r\n * that as gene A \"acts on\" gene B, rather than completely reverting to saying\r\n * gene A \"interacts with\" gene B.\r\n *\r\n */\r\nfunction summarizeByDirection(enrichedIxns) {\r\n\r\n let isDirectionSame = true;\r\n\r\n const leftTypes = []; // \"Acts on\" types\r\n const rightTypes = []; // \"Acted on by\" types\r\n Object.values(interactionArrowMap).forEach(directedTypes => {\r\n rightTypes.push(directedTypes[0]);\r\n leftTypes.push(directedTypes[1]);\r\n });\r\n\r\n const right = 'Acts on';\r\n const left = 'Acted on by';\r\n\r\n const ixnsByPwid = enrichedIxns.ixnsByPwid;\r\n const firstIxnType = getIxnTypeReference(ixnsByPwid);\r\n const isRight = rightTypes.includes(firstIxnType);\r\n const directionReference = isRight ? right : left;\r\n\r\n Object.entries(ixnsByPwid).map(([pwid, ixns]) => {\r\n let isPwDirectionSame = true;\r\n if (ixns.length > 0) {\r\n const pwFirstIxnType = ixns[0].ixnType.toLowerCase();\r\n const pwIsRight = rightTypes.includes(pwFirstIxnType);\r\n const pwDirectionReference = pwIsRight ? right : left;\r\n ixns.forEach(ixn => {\r\n const ixnType = ixn.ixnType.toLowerCase();\r\n const thisIsRight = rightTypes.includes(ixnType);\r\n const direction = thisIsRight ? right : left;\r\n enrichedIxns.directionsByPwid[pwid] = direction;\r\n if (direction !== directionReference) {\r\n isDirectionSame = false;\r\n }\r\n if (direction !== pwDirectionReference) {\r\n isPwDirectionSame = false;\r\n }\r\n });\r\n }\r\n enrichedIxns.isDirectionSameByPwid[pwid] = isPwDirectionSame;\r\n\r\n });\r\n\r\n enrichedIxns.isDirectionSame = isDirectionSame;\r\n if (isDirectionSame === true) {\r\n enrichedIxns.direction = directionReference;\r\n }\r\n\r\n return enrichedIxns;\r\n}\r\n\r\n/**\r\n * Summarize interactions by direction\r\n *\r\n * @param {String} gene Interacting gene\r\n * @param {String} searchedGene Searched gene\r\n * @param {Array} pathwayIds List of WikiPathways IDs\r\n * @param {Object} gpmls Object of parsed GPML XMLs values, by pathway ID key\r\n * @returns\r\n */\r\nexport function summarizeInteractions(gene, searchedGene, pathwayIds, gpmls) {\r\n let summary = null;\r\n\r\n const ixnsByPwid =\r\n detailAllInteractions(gene, searchedGene, pathwayIds, gpmls);\r\n\r\n const ixns = ixnsByPwid[pathwayIds[0]];\r\n\r\n if (ixns.length > 0) {\r\n let enrichedIxns = {\r\n ixnsByPwid,\r\n isSameByPwid: {}, // If pathway has all same interaction types\r\n isSame: null, // If above is true for all pathways\r\n isDirectionSameByPwid: {}, // If pathway has same ixn direction\r\n isDirectionSame: null, // If above is true for all pathways\r\n directionsByPwid: {}\r\n };\r\n enrichedIxns = setIsSame(enrichedIxns);\r\n\r\n if (enrichedIxns.isSame) {\r\n const ixnType = ixns[0].ixnType;\r\n const newIxn = ixnType;\r\n summary = newIxn;\r\n } else {\r\n\r\n enrichedIxns = summarizeByDirection(enrichedIxns);\r\n\r\n if (enrichedIxns.isDirectionSame) {\r\n summary = enrichedIxns.direction;\r\n } else {\r\n summary = 'Interacts with';\r\n }\r\n }\r\n }\r\n\r\n\r\n // if (direction !== null) {\r\n // summary = direction;\r\n // }\r\n // const pwidsByIxnType = {};\r\n // Object.entries(ixns).map(([k, v]) => {\r\n // if (!pwidsByIxnType[v.ixnType]) {\r\n // pwidsByIxnType[v.ixnType] = [v.pathwayId];\r\n // } else {\r\n // pwidsByIxnType[v.ixnType].push([v.pathwayId]);\r\n // }\r\n // });\r\n\r\n // console.log('pwidsByIxnType')\r\n // console.log(pwidsByIxnType)\r\n // const tpArray = Object.entries(pwidsByIxnType);\r\n // const sortedIndices = sortInteractionTypes(tpArray.map(tp => tp[0]));\r\n // const sortedTpArray =\r\n // sortedIndices.map(sortedIndex => tpArray[sortedIndex]);\r\n\r\n // console.log('sortedTpArray')\r\n // console.log(sortedTpArray)\r\n return summary;\r\n}\r\n\r\n/**\r\n * Get detailInteractions results for multiple pathways\r\n *\r\n * @param gene Interacting gene\r\n * @param pathwayIds List of WikiPathways IDs\r\n * @ideo ideo Ideogram instance object\r\n */\r\nexport function detailAllInteractions(gene, searchedGene, pathwayIds, gpmls) {\r\n const ixnsByPwid = {};\r\n\r\n pathwayIds.map(pathwayId => {\r\n const gpml = gpmls[pathwayId];\r\n const ixns = detailInteractions(gene, searchedGene, gpml);\r\n\r\n ixnsByPwid[pathwayId] = ixns;\r\n });\r\n return ixnsByPwid;\r\n}\r\n\r\n/** Get IDs and data element objects for searched or interacting gene */\r\nfunction getMatches(gpml, label) {\r\n\r\n const nodes = Array.from(gpml.querySelectorAll(\r\n `DataNode[TextLabel=\"${label}\"]`\r\n ));\r\n\r\n const genes = nodes.map(node => {\r\n return {\r\n type: 'node',\r\n matchedLabel: label,\r\n textLabel: node.getAttribute('TextLabel'),\r\n graphId: node.getAttribute('GraphId'),\r\n groupRef: node.getAttribute('GroupRef')\r\n };\r\n });\r\n\r\n // Get group identifiers\r\n const geneGraphIds = genes.map(g => g.graphId);\r\n const geneGroupRefs = genes.map(g => g.groupRef);\r\n const groupSelectors =\r\n geneGroupRefs.map(ggr => `Group[GroupId=\"${ggr}\"]`).join(',');\r\n\r\n let geneGroups = [];\r\n if (groupSelectors !== '') {\r\n const groups = gpml.querySelectorAll(groupSelectors);\r\n geneGroups = Array.from(groups).map(group => {\r\n return {\r\n type: 'group',\r\n matchedLabel: label,\r\n graphId: group.getAttribute('GraphId'),\r\n groupId: group.getAttribute('GroupId')\r\n };\r\n });\r\n }\r\n\r\n const geneGroupGraphIds = geneGroups.map(g => g.graphId);\r\n const matchingGraphIds = geneGraphIds.concat(geneGroupGraphIds);\r\n\r\n const elements = genes.concat(geneGroups);\r\n\r\n return [matchingGraphIds, elements];\r\n}\r\n\r\nasync function fetchGpml(pathwayId) {\r\n const pathwayFile = `${pathwayId}.xml.gz`;\r\n const gpmlUrl = `https://cdn.jsdelivr.net/npm/ixn2/${pathwayFile}`;\r\n const response = await fetch(gpmlUrl);\r\n const blob = await response.blob();\r\n const uint8Array = new Uint8Array(await blob.arrayBuffer());\r\n const rawGpml = strFromU8(decompressSync(uint8Array));\r\n\r\n const gpml = new DOMParser().parseFromString(rawGpml, 'text/xml');\r\n\r\n // console.log('gpml:')\r\n // console.log(gpml)\r\n\r\n return gpml;\r\n}\r\n\r\n/**\r\n * Request compressed GPML files, which contain detailed interaction data, e.g.\r\n * https://cdn.jsdelivr.net/npm/ixn/WP3982.xml.gz\r\n *\r\n * For more easily readable versions, see also:\r\n * - https://www.wikipathways.org/index.php?title=Pathway:WP3982&action=edit\r\n * - https://www.wikipathways.org//wpi/wpi.php?action=downloadFile&type=gpml&pwTitle=Pathway:WP3982\r\n *\r\n * GPML (Graphical Pathway Markup Language) data encodes detailed interaction\r\n * data for biochemical pathways.\r\n */\r\nexport function fetchGpmls(ideo) {\r\n\r\n const pathwayIdsByInteractingGene = {};\r\n Object.entries(ideo.annotDescriptions.annots)\r\n .forEach(([annotName, descObj]) => {\r\n if ('type' in descObj && descObj.type.includes('interacting gene')) {\r\n pathwayIdsByInteractingGene[annotName] = descObj.pathwayIds;\r\n }\r\n });\r\n\r\n const gpmlsByInteractingGene = {};\r\n Object.entries(pathwayIdsByInteractingGene)\r\n .forEach(([ixnGene, pathwayIds]) => {\r\n gpmlsByInteractingGene[ixnGene] = {};\r\n pathwayIds.map(async pathwayId => {\r\n const gpml = await fetchGpml(pathwayId);\r\n gpmlsByInteractingGene[ixnGene][pathwayId] = gpml;\r\n });\r\n });\r\n\r\n ideo.gpmlsByInteractingGene = gpmlsByInteractingGene;\r\n}\r\n\r\n/**\r\n * Get interaction object from a GPML graphics XML element\r\n *\r\n * This interaction object connects the searched gene and interacting gene.\r\n */\r\nfunction parseInteractionGraphic(graphic, graphIds) {\r\n let interaction = null;\r\n\r\n const {searchedGeneGraphIds, matchingGraphIds} = graphIds;\r\n\r\n const endGraphRefs = [];\r\n let numMatchingPoints = 0;\r\n let isConnectedToSourceGene = false;\r\n let ixnType = null;\r\n let searchedGeneIndex = null;\r\n\r\n Array.from(graphic.children).forEach(child => {\r\n if (child.nodeName !== 'Point') return;\r\n const point = child;\r\n const graphRef = point.getAttribute('GraphRef');\r\n if (graphRef === null) return;\r\n\r\n if (matchingGraphIds.includes(graphRef)) {\r\n numMatchingPoints += 1;\r\n endGraphRefs.push(graphRef);\r\n\r\n if (searchedGeneGraphIds.includes(graphRef)) {\r\n isConnectedToSourceGene = true;\r\n }\r\n\r\n if (point.getAttribute('ArrowHead')) {\r\n const arrowHead = point.getAttribute('ArrowHead');\r\n const isStart = searchedGeneGraphIds.includes(graphRef);\r\n if (searchedGeneIndex === null) {\r\n searchedGeneIndex = isStart ? 0 : 1;\r\n }\r\n ixnType = interactionArrowMap[arrowHead][isStart ? 0 : 1];\r\n }\r\n }\r\n });\r\n\r\n if (numMatchingPoints >= 2 && isConnectedToSourceGene) {\r\n if (searchedGeneIndex === null) {\r\n ixnType = 'interacts with';\r\n }\r\n ixnType = ixnType[0].toUpperCase() + ixnType.slice(1);\r\n const interactionGraphId = graphic.parentNode.getAttribute('GraphId');\r\n interaction = {\r\n 'interactionId': interactionGraphId,\r\n 'endIds': endGraphRefs,\r\n ixnType\r\n };\r\n }\r\n\r\n return interaction;\r\n}\r\n\r\n/**\r\n * Get all genes in the given pathway GPML\r\n */\r\nexport async function fetchPathwayInteractions(searchedGene, pathwayId, ideo) {\r\n const gpml = await fetchGpml(pathwayId);\r\n // Gets IDs and elements for searched gene and interacting gene, and,\r\n // if they're in any groups, the IDs of those groups\r\n const genes = {};\r\n\r\n const nodes = Array.from(gpml.querySelectorAll('DataNode'));\r\n nodes.forEach(node => {\r\n const label = node.getAttribute('TextLabel');\r\n const normLabel = label.toLowerCase();\r\n const isKnownGene = normLabel in ideo.geneCache.nameCaseMap;\r\n if (isKnownGene) {\r\n genes[label] = 1;\r\n }\r\n });\r\n\r\n const pathwayGenes = Object.keys(genes);\r\n const pathwayIxns = {};\r\n pathwayGenes.map(gene => {\r\n if (gene === searchedGene) return;\r\n const gpmls = {};\r\n gpmls[pathwayId] = gpml;\r\n const summary = summarizeInteractions(\r\n gene, searchedGene, [pathwayId], gpmls\r\n );\r\n pathwayIxns[gene] = (summary ? summary : 'Shares pathway with');\r\n });\r\n\r\n return pathwayIxns;\r\n}\r\n\r\n/**\r\n * Fetch GPML for pathway and find ID of Interaction between two genes,\r\n * and the ID of the two DataNodes for each of those interactions.\r\n *\r\n * WikiPathways SVG isn't detailed enough to reliably determine the specific\r\n * interaction elements relating two genes, given only the gene symbols. This\r\n * fetches augmented GPML data for the pathway, and queries it to get only\r\n * interactions between the two genes.\r\n */\r\nfunction detailInteractions(interactingGene, searchedGene, gpml) {\r\n\r\n // Gets IDs and elements for searched gene and interacting gene, and,\r\n // if they're in any groups, the IDs of those groups\r\n const [searchedGeneGraphIds, se] = getMatches(gpml, searchedGene);\r\n const [interactingGeneGraphIds, ie] = getMatches(gpml, interactingGene);\r\n\r\n const elements = {\r\n searchedGene: se,\r\n interactingGene: ie\r\n };\r\n\r\n const matchingGraphIds =\r\n searchedGeneGraphIds.concat(interactingGeneGraphIds);\r\n const graphIds = {searchedGeneGraphIds, matchingGraphIds};\r\n\r\n // Get interaction objects that connect the searched and interacting genes\r\n const interactions = [];\r\n const graphicsXml = gpml.querySelectorAll('Interaction Graphics');\r\n Array.from(graphicsXml).forEach(graphic => {\r\n const interaction = parseInteractionGraphic(graphic, graphIds);\r\n if (interaction !== null) {\r\n interaction.elements = elements;\r\n interactions.push(interaction);\r\n }\r\n });\r\n\r\n return interactions;\r\n}\r\n\r\n// export async function fetchInteractionDiagram(annot, descObj, ideo) {\r\n// // Fetch raw SVG for pathway diagram\r\n// const pathwayId = descObj.pathwayIds[0];\r\n// // const baseUrl = 'https://eweitz.github.io/cachome/wikipathways/';\r\n// const baseUrl = 'https://cachome.github.io/wikipathways/';\r\n// // const baseUrl = 'http://localhost/wikipathways/data/';\r\n// const diagramUrl = baseUrl + pathwayId + '.svg';\r\n// const response = await fetch(diagramUrl);\r\n// if (response.ok) {\r\n\r\n// // console.log('searchedGene', searchedGene)\r\n\r\n// const ixns = await detailInteractions(annot.name, pathwayId, ideo);\r\n\r\n// let selectors = `[name=${annot.name}]`;\r\n// let searchedGeneIndex = 0;\r\n// let interactingGeneIndex;\r\n// if (ixns.length > 0) {\r\n// selectors = ixns[0].endIds.map(id => '#' + id).join(',');\r\n// searchedGeneIndex = ixns[0].searchedGeneIndex;\r\n// interactingGeneIndex = (searchedGeneIndex === 0) ? 1 : 0;\r\n// }\r\n// // https://webservice.wikipathways.org/findInteractions?query=ACE2&format=json\r\n\r\n// const rawDiagram = await response.text();\r\n\r\n// const pathwayDiagram =\r\n// `
    ${rawDiagram}
    `;\r\n\r\n// annot.displayName += pathwayDiagram;\r\n\r\n// document.querySelector('#_ideogramTooltip').innerHTML =\r\n// annot.displayName;\r\n\r\n// Ideogram.d3.select('svg.Diagram')\r\n// .attr('width', 350)\r\n// .attr('height', 300);\r\n\r\n// const viewport = document.querySelector('.svg-pan-zoom_viewport');\r\n// viewport.removeAttribute('style');\r\n// viewport.removeAttribute('transform');\r\n\r\n// const matches = document.querySelectorAll(selectors);\r\n// console.log('matches', matches)\r\n// const match0 = matches[searchedGeneIndex]\r\n// const m0 = match0.getCTM();\r\n// const m0Rect = match0.getBoundingClientRect();\r\n// const m0Box = match0.getBBox();\r\n// const m0MinX = m0.e/m0.a;\r\n// const m0MinY = m0.f/m0.d;\r\n\r\n// let minX = m0MinX;\r\n// let minY = m0MinY;\r\n// let width;\r\n// let height;\r\n\r\n// width = 350;\r\n// height = 300;\r\n\r\n// // matches[0].children[0].setAttribute('fill', '#F55');\r\n// match0.children[0].style.fill = '#f55';\r\n\r\n// if (matches.length > 1) {\r\n// // console.log('matches.length > 1')\r\n// // matches[1].children[0].setAttribute('fill', '#C4C');\r\n// const match1 = matches[interactingGeneIndex];\r\n// // console.log('match1')\r\n// // console.log(match1)\r\n// match1.children[0].style.fill = '#c4c';\r\n// const m1 = matches[1].getCTM();\r\n// const m1Rect = matches[1].getBoundingClientRect();\r\n// const m1Box = matches[1].getBBox();\r\n// console.log('m0', m0)\r\n// console.log('m1', m1)\r\n// const m1MinX = m1.e/m1.a;\r\n// const m1MinY = m1.f/m1.d;\r\n// // const m1MinX = m1.e/m1.a + m1Rect.width;\r\n// // const m1MinY = m1.f/m1.d - m1Rect.height;\r\n// if (m1MinX < m0MinX) minX = m1MinX;\r\n// if (m1MinY < m0MinY) minY = m1MinY;\r\n\r\n// let pairWidth = 0;\r\n// if (m0Rect.left < m1Rect.left) {\r\n// // pairWidth = m1Rect.right - m0Rect.left;\r\n// width += m1Box.width + 40;\r\n// }\r\n\r\n// // width += pairWidth;\r\n\r\n// // console.log('m0Rect', m0Rect)\r\n// // console.log('m1Rect', m1Rect)\r\n// // console.log('m1MinX', m1MinX)\r\n// // console.log('m0MinX', m0MinX)\r\n// // console.log('m1MinY', m1MinY)\r\n// // console.log('m0MinY', m0MinY)\r\n// // console.log('pairWidth', pairWidth)\r\n// // console.log('width', width)\r\n// // width += Math.abs(m1MinX - m0MinX);\r\n// // height += Math.abs(m1MinY - m0MinY);\r\n\r\n// // minX -= 100;\r\n// // minY -= 100;\r\n\r\n// // minX -= 150;\r\n// // minY -= 150;\r\n// } else {\r\n// minX -= 150;\r\n// minY -= 150;\r\n// }\r\n\r\n// minX = Math.round(minX);\r\n// minY = Math.round(minY);\r\n// width = Math.round(width);\r\n// height = Math.round(height);\r\n\r\n// const viewBox = `${minX} ${minY} ${width} ${height}`;\r\n// console.log('viewBox', viewBox);\r\n// document.querySelector('svg.Diagram').setAttribute('viewBox', viewBox);\r\n\r\n// }\r\n// }\r\n","/**\r\n * @fileoverview Kit used in \"Related genes\" example\r\n *\r\n * This file simplifies client code for reusing a \"related genes\" ideogram --\r\n * which finds and displays related genes for a searched gene.\r\n *\r\n * Related genes here are either \"interacting genes\" or \"paralogs\".\r\n * Interacting genes are genes immediately upstream or downstream of the\r\n * searched gene in a biochemical pathway. Paralogs are evolutionarily\r\n * similar genes in the same species.\r\n *\r\n * Data sources:\r\n * - Interacting genes: WikiPathways\r\n * - Paralogs: Ensembl\r\n * - Genomic coordinates: Ensembl, via MyGene.info\r\n *\r\n * Features provided by this module help users discover and explore genes\r\n * related to their gene of interest.\r\n *\r\n * The reference implementation is available at:\r\n * https://eweitz.github.io/ideogram/related-genes\r\n */\r\n\r\nimport {decompressSync, strFromU8} from 'fflate';\r\n\r\nimport {\r\n initAnalyzeRelatedGenes, analyzePlotTimes, analyzeRelatedGenes, timeDiff,\r\n getRelatedGenesByType, getRelatedGenesTooltipAnalytics\r\n} from './analyze-related-genes';\r\n\r\nimport {\r\n sortAnnotsByRank, applyRankCutoff, setAnnotRanks\r\n} from '../annotations/annotations';\r\nimport {writeLegend} from '../annotations/legend';\r\nimport {getAnnotDomId} from '../annotations/process';\r\nimport {getDir, deepCopy} from '../lib';\r\nimport initGeneCache, {getEnsemblId} from '../gene-cache';\r\nimport initParalogCache, {hasParalogCache} from '../paralog-cache';\r\nimport initInteractionCache from '../interaction-cache';\r\nimport {\r\n fetchGpmls, summarizeInteractions, fetchPathwayInteractions\r\n} from './wikipathways';\r\n// import {drawAnnotsByLayoutType} from '../annotations/draw';\r\n// import {organismMetadata} from '../init/organism-metadata';\r\n\r\n/** Sets DOM IDs for ideo.relatedAnnots; needed to associate labels */\r\nfunction setRelatedAnnotDomIds(ideo) {\r\n const updated = [];\r\n\r\n const sortedChrNames = ideo.chromosomesArray.map((chr) => {\r\n return chr.name;\r\n });\r\n\r\n // Count two related annots for same gene as one.\r\n // E.g. gene Foo can both interact with and be paralog of gene Bar\r\n // Instead of count Foo interacting annot and Foo paralog annot as two,\r\n // only count it as one as they are merged in downstream UI.\r\n //\r\n // Searching STAT3 without this block shows the problem this fixes.\r\n const seenNames = {};\r\n ideo.relatedAnnots = ideo.relatedAnnots.filter(annot => {\r\n if (annot.name in seenNames) {\r\n return false;\r\n }\r\n seenNames[annot.name] = 1;\r\n return true;\r\n });\r\n\r\n // Arrange related annots by chromosome\r\n const annotsByChr = {};\r\n ideo.relatedAnnots.forEach((annot) => {\r\n if (annot.chr in annotsByChr) {\r\n annotsByChr[annot.chr].push(annot);\r\n } else {\r\n annotsByChr[annot.chr] = [annot];\r\n }\r\n });\r\n\r\n // Sort related annots by relevance within each chromosome\r\n const relevanceSortedAnnotsNamesByChr = {};\r\n Object.entries(annotsByChr).map(([chr, annots]) => {\r\n\r\n annots = setAnnotRanks(annots, ideo);\r\n\r\n // Sort so first annots are drawn last, and thus at top layer\r\n annots.sort((a, b) => -ideo.annotSortFunction(a, b));\r\n\r\n const annotNames = annots.map((annot) => annot.name);\r\n relevanceSortedAnnotsNamesByChr[chr] = annotNames;\r\n });\r\n\r\n // annotsByChr.annots.sort((a, b) => {\r\n // // Reverse-sort, so first annots are drawn last, and thus at top layer\r\n // return -ideo.annotSortFunction(a, b);\r\n // });\r\n\r\n ideo.relatedAnnots.forEach((annot) => {\r\n\r\n const chr = annot.chr;\r\n\r\n // Annots have DOM IDs keyed by chromosome index and annotation index.\r\n // We reconstruct those here using structures built in two blocks above.\r\n const chrIndex = sortedChrNames.indexOf(chr);\r\n const annotIndex =\r\n relevanceSortedAnnotsNamesByChr[chr].indexOf(annot.name);\r\n\r\n annot.domId = getAnnotDomId(chrIndex, annotIndex);\r\n updated.push(annot);\r\n });\r\n\r\n ideo.relatedAnnots = updated;\r\n}\r\n\r\n/**\r\n * Determines if interaction node might be a gene\r\n *\r\n * Some interaction nodes are biological processes; this filters out many.\r\n * Filtering these out makes downstream queries faster.\r\n *\r\n * ixn {Object} Interaction from WikiPathways\r\n * gene {Object} Gene from MyGene.info\r\n */\r\nfunction maybeGeneSymbol(ixn, gene) {\r\n return (\r\n ixn !== '' &&\r\n !ixn.includes(' ') &&\r\n !ixn.includes('/') && // e.g. Akt/PKB\r\n ixn.toLowerCase() !== gene.name.toLowerCase()\r\n );\r\n}\r\n\r\n// /** Helpful for debugging race conditions caused by concurrency */\r\n// const sleep = (delay) => {\r\n// new Promise((resolve) => setTimeout(resolve, delay));\r\n// }\r\n\r\n/** Reports if interaction node is a gene and not previously seen */\r\nfunction isInteractionRelevant(rawIxn, gene, nameId, seenNameIds, ideo) {\r\n let isGeneSymbol;\r\n if ('geneCache' in ideo && gene.name) {\r\n isGeneSymbol = rawIxn.toLowerCase() in ideo.geneCache.nameCaseMap;\r\n } else {\r\n isGeneSymbol = maybeGeneSymbol(rawIxn, gene);\r\n }\r\n\r\n return isGeneSymbol && !(nameId in seenNameIds);\r\n}\r\n\r\n/**\r\n * Retrieves interacting genes from WikiPathways API\r\n *\r\n * Docs:\r\n * https://webservice.wikipathways.org/ui/\r\n * https://www.wikipathways.org/index.php/Help:WikiPathways_Webservice/API\r\n *\r\n * Examples:\r\n * https://webservice.wikipathways.org/findInteractions?query=ACE2&format=json\r\n * https://webservice.wikipathways.org/findInteractions?query=RAD51&format=json\r\n */\r\nasync function fetchInteractions(gene, ideo) {\r\n const ixns = {};\r\n const seenNameIds = {};\r\n const orgNameSimple = ideo.config.organism.replace(/-/g, ' ');\r\n const upperGene = gene.name.toUpperCase();\r\n\r\n let data = {result: []};\r\n\r\n if (ideo.interactionCache) {\r\n if (upperGene in ideo.interactionCache) {\r\n data = ideo.interactionCache[upperGene];\r\n }\r\n } else {\r\n\r\n // const queryString = `?query=${gene.name}&format=json`;\r\n // const url =\r\n // `https://webservice.wikipathways.org/findInteractions${queryString}`;\r\n // const url = `http://localhost:8080/dist/data/cache/${gene.name}.json.gz`;\r\n const url = `https://cdn.jsdelivr.net/npm/ixn2/${upperGene}.json.gz`;\r\n\r\n // await sleep(3000);\r\n\r\n const response = await fetch(url);\r\n // const data = await response.json();\r\n\r\n if (response.ok) {\r\n const blob = await response.blob();\r\n const uint8Array = new Uint8Array(await blob.arrayBuffer());\r\n data = JSON.parse(strFromU8(decompressSync(uint8Array)));\r\n }\r\n }\r\n\r\n // For each interaction, get nodes immediately upstream and downstream.\r\n // Filter out pathway nodes that are definitely not gene symbols, then\r\n // group pathways by gene symbol. Each interacting gene can have\r\n // multiple pathways.\r\n data.result.forEach(interaction => {\r\n if (interaction.species.toLowerCase() === orgNameSimple) {\r\n const right = interaction.fields.right.values;\r\n const left = interaction.fields.left.values;\r\n // let mediator = [];\r\n // if ('mediator' in interaction.fields) {\r\n // mediator = interaction.fields.mediator.values;\r\n // console.log('mediator', mediator)\r\n // }\r\n // const rawIxns = right.concat(left, mediator);\r\n const rawIxns = right.concat(left);\r\n const name = interaction.name;\r\n const id = interaction.id;\r\n\r\n // rawIxns can contain multiple genes, e.g. when\r\n // a group (i.e. a complex or a set of paralogs)\r\n // interacts with the searched gene\r\n const wrappedRawIxns = rawIxns.map(rawIxn => {\r\n return {name: rawIxn, color: ''};\r\n });\r\n const sortedRawIxns =\r\n sortAnnotsByRank(wrappedRawIxns, ideo).map(i => i.name);\r\n\r\n sortedRawIxns.forEach(rawIxn => {\r\n\r\n const normRawIxn = rawIxn.toLowerCase();\r\n\r\n // Prevent overwriting searched gene. Occurs with e.g. human CD4\r\n if (normRawIxn.includes(gene.name.toLowerCase())) return;\r\n\r\n // if (rawIxn === '') return; // Avoid oddly blank placeholders\r\n\r\n const nameId = name + id;\r\n\r\n const isRelevant =\r\n isInteractionRelevant(normRawIxn, gene, nameId, seenNameIds, ideo);\r\n\r\n if (isRelevant) {\r\n seenNameIds[nameId] = 1;\r\n const ixn = {name, pathwayId: id};\r\n if (normRawIxn in ixns) {\r\n ixns[normRawIxn].push(ixn);\r\n } else {\r\n ixns[normRawIxn] = [ixn];\r\n }\r\n }\r\n });\r\n }\r\n });\r\n\r\n return ixns;\r\n}\r\n\r\n/**\r\n * Queries MyGene.info API, returns parsed JSON\r\n *\r\n * Docs:\r\n * https://docs.mygene.info/en/v3/\r\n *\r\n * Example:\r\n * https://mygene.info/v3/query?q=symbol:cdk2%20OR%20symbol:brca1&species=9606&fields=symbol,genomic_pos,name\r\n */\r\nasync function fetchMyGeneInfo(queryString) {\r\n const myGeneBase = 'https://mygene.info/v3/query';\r\n const response = await fetch(myGeneBase + queryString + '&size=400');\r\n const data = await response.json();\r\n return data;\r\n}\r\n\r\nfunction parseNameAndEnsemblIdFromMgiGene(gene) {\r\n const name = gene.name;\r\n const id = gene.genomic_pos.ensemblgene;\r\n let ensemblId = id;\r\n if (typeof id === 'undefined') {\r\n // Encountered in AKT3, when querying related genes for MTOR\r\n // A 'chr'omosome value containing _ indicates an alt loci scaffold,\r\n // so ignore that and take the Ensembl ID associated with the\r\n // first position of a primary chromosome.\r\n ensemblId =\r\n gene.genomic_pos.filter(pos => !pos.chr.includes('_'))[0].ensemblgene;\r\n }\r\n return {name, ensemblId};\r\n}\r\n\r\n/**\r\n * Summarizes genes in a pathway\r\n *\r\n * This comprises most of the content for tooltips for pathway genes.\r\n */\r\n function describePathwayGene(pathwayGene, searchedGene, pathway, summary) {\r\n let ixnsDescription = '';\r\n\r\n const pathwaysBase = 'https://www.wikipathways.org/index.php/Pathway:';\r\n const url = `${pathwaysBase}${pathway.id}`;\r\n const attrs =\r\n `href=\"${url}\" ` +\r\n `target=\"_blank\" ` +\r\n `title=\"See pathway diagram in WikiPathways\"`;\r\n ixnsDescription =\r\n `${summary} ${searchedGene.name} in:
    ` +\r\n `${pathway.name}`;\r\n\r\n const {name, ensemblId} = parseNameAndEnsemblIdFromMgiGene(pathwayGene);\r\n const type = 'pathway gene';\r\n const descriptionObj = {\r\n description: ixnsDescription,\r\n ixnsDescription, ensemblId, name, type\r\n };\r\n return descriptionObj;\r\n}\r\n\r\n/**\r\n * Summarizes interactions for a gene\r\n *\r\n * This comprises most of the content for tooltips for interacting genes.\r\n */\r\nfunction describeInteractions(gene, ixns, searchedGene) {\r\n const pathwayIds = [];\r\n const pathwayNames = [];\r\n let ixnsDescription = '';\r\n\r\n if (typeof ixns !== 'undefined') {\r\n // ixns is undefined when querying e.g. CDKN1B in human\r\n const links = ixns.map(ixn => {\r\n // pathwayIds.push(ixn.pathwayId);\r\n // pathwayNames.push(ixn.name);\r\n // const attrs =\r\n // `class=\"ideo-pathway-link\" ` +\r\n // `title=\"Click to search for other genes in this pathway\" ` +\r\n // `style=\"cursor: pointer\" ` +\r\n // `data-pathway-id=\"${ixn.pathwayId}\" ` +\r\n // `data-pathway-name=\"${ixn.name}\"`;\r\n // return `${ixn.name}`;\r\n\r\n const pathwaysBase = 'https://www.wikipathways.org/index.php/Pathway:';\r\n const url = `${pathwaysBase}${ixn.pathwayId}`;\r\n pathwayIds.push(ixn.pathwayId);\r\n pathwayNames.push(ixn.name);\r\n const attrs =\r\n `class=\"ideo-pathway-link\" ` +\r\n `title=\"View in WikiPathways\" ` +\r\n `data-pathway-id=\"${ixn.pathwayId}\" ` +\r\n `target=\"_blank\" ` +\r\n `href=\"${url}\"`;\r\n return `${ixn.name}`;\r\n }).join('
    ');\r\n\r\n ixnsDescription =\r\n `Interacts with ${searchedGene.name} in:
    ${links}`;\r\n }\r\n\r\n const {name, ensemblId} = parseNameAndEnsemblIdFromMgiGene(gene);\r\n const type = 'interacting gene';\r\n const descriptionObj = {\r\n description: ixnsDescription,\r\n ixnsDescription, ensemblId, name, type, pathwayIds, pathwayNames\r\n };\r\n return descriptionObj;\r\n}\r\n\r\n/** Throw error when searched gene (e.g. \"Foo\") isn't found */\r\nfunction throwGeneNotFound(geneSymbol, ideo) {\r\n const organism = ideo.organismScientificName;\r\n throw Error(`\"${geneSymbol}\" is not a known gene in ${organism}`);\r\n}\r\n\r\n/**\r\n * Fetch genes from cache\r\n * Construct objects that match format of MyGene.info API response\r\n */\r\nfunction fetchGenesFromCache(names, type, ideo) {\r\n const cache = ideo.geneCache;\r\n const isSymbol = (type === 'symbol');\r\n const locusMap = isSymbol ? cache.lociByName : cache.lociById;\r\n const nameMap = isSymbol ? cache.idsByName : cache.namesById;\r\n\r\n const hits = names.map(name => {\r\n\r\n const nameLc = name.toLowerCase();\r\n\r\n if (!locusMap[name] && !cache.nameCaseMap[nameLc]) {\r\n if (isSymbol) {\r\n throwGeneNotFound(name, ideo);\r\n } else {\r\n return;\r\n }\r\n }\r\n\r\n // Canonicalize name if it is mistaken in upstream data source.\r\n // This can sometimes happen in WikiPathways, e.g. when searching\r\n // interactions for rat Pten, it includes a result for \"PIK3CA\".\r\n // In that case, this would correct PIK3CA to be Pik3ca.\r\n if (isSymbol && !locusMap[name] && cache.nameCaseMap[nameLc]) {\r\n name = cache.nameCaseMap[nameLc];\r\n }\r\n\r\n const locus = locusMap[name];\r\n const symbol = isSymbol ? name : nameMap[name];\r\n const ensemblId = isSymbol ? nameMap[name] : name;\r\n const fullName = cache.fullNamesById[ensemblId];\r\n\r\n const hit = {\r\n symbol,\r\n name: fullName,\r\n source: 'cache',\r\n genomic_pos: {\r\n chr: locus[0],\r\n start: locus[1],\r\n end: locus[2],\r\n ensemblgene: ensemblId\r\n }\r\n };\r\n\r\n return hit;\r\n });\r\n\r\n const hitsWithGenomicPos = hits.filter(hit => hit !== undefined);\r\n\r\n return hitsWithGenomicPos;\r\n}\r\n\r\n/** Fetch genes from cache, or, if needed, from MyGene.info API */\r\nasync function fetchGenes(names, type, ideo) {\r\n\r\n let data;\r\n\r\n // Account for single-gene fetch\r\n if (typeof names === 'string') names = [names];\r\n\r\n // Query parameter for MyGene.info API\r\n const qParam = names.map(name => `${type}:${name.trim()}`).join(' OR ');\r\n const taxid = ideo.config.taxid;\r\n\r\n const queryStringBase = `?q=${qParam}&species=${taxid}&fields=`;\r\n\r\n if (ideo.geneCache) {\r\n const hits = fetchGenesFromCache(names, type, ideo);\r\n\r\n // Asynchronously fetch full name, but don't await the response, because\r\n // full names are only shown upon hovering over an annotation.\r\n // const queryString = `${queryStringBase}symbol,name`;\r\n // data = fetchMyGeneInfo(queryString).then(data => {\r\n // data.hits.forEach((hit) => {\r\n hits.forEach((hit) => {\r\n const symbol = hit.symbol;\r\n const fullName = hit.name;\r\n if (symbol in ideo.annotDescriptions.annots) {\r\n ideo.annotDescriptions.annots[symbol].name = fullName;\r\n } else {\r\n ideo.annotDescriptions.annots[symbol] = {name: fullName};\r\n }\r\n });\r\n // });\r\n\r\n data = {hits, fromGeneCache: true};\r\n } else {\r\n // Fetch gene data from MyGene.info\r\n const queryString = `${queryStringBase}symbol,genomic_pos,name`;\r\n data = await fetchMyGeneInfo(queryString);\r\n }\r\n\r\n return data;\r\n}\r\n\r\n/**\r\n * Retrieves position and other data on interacting genes from MyGene.info\r\n */\r\nasync function fetchInteractionAnnots(interactions, searchedGene, ideo) {\r\n\r\n const annots = [];\r\n const symbols = Object.keys(interactions);\r\n\r\n if (symbols.length === 0) return annots;\r\n\r\n const data = await fetchGenes(symbols, 'symbol', ideo);\r\n\r\n data.hits.forEach(gene => {\r\n // If hit lacks position\r\n // or is same as searched gene (e.g. search for human SRC),\r\n // then skip processing\r\n if (\r\n 'genomic_pos' in gene === false ||\r\n gene.symbol === searchedGene.name\r\n ) {\r\n return;\r\n }\r\n\r\n const annot = parseAnnotFromMgiGene(gene, ideo, 'purple');\r\n annots.push(annot);\r\n\r\n const ixns = interactions[gene.symbol.toLowerCase()];\r\n\r\n const descriptionObj = describeInteractions(gene, ixns, searchedGene);\r\n\r\n mergeDescriptions(annot, descriptionObj, ideo);\r\n });\r\n\r\n // Fetch GPML files to use when updating interaction descriptions with\r\n // refined direction.\r\n fetchGpmls(ideo);\r\n\r\n return annots;\r\n}\r\n\r\n/** Fetch paralog positions from MyGeneInfo */\r\nasync function fetchParalogPositionsFromMyGeneInfo(\r\n homologs, searchedGene, ideo\r\n) {\r\n const annots = [];\r\n\r\n const cached = homologs.length && typeof homologs[0] === 'string';\r\n const ensemblIds = cached ? homologs : homologs.map(homolog => homolog.id);\r\n const data = await fetchGenes(ensemblIds, 'ensemblgene', ideo);\r\n\r\n data.hits.forEach(gene => {\r\n\r\n // If hit lacks position, skip processing\r\n if ('genomic_pos' in gene === false) return;\r\n if ('name' in gene === false) return;\r\n\r\n const annot = parseAnnotFromMgiGene(gene, ideo, 'pink');\r\n annots.push(annot);\r\n\r\n const description = `Paralog of ${searchedGene.name}`;\r\n const {name, ensemblId} = parseNameAndEnsemblIdFromMgiGene(gene);\r\n const type = 'paralogous gene';\r\n const descriptionObj = {description, ensemblId, name, type};\r\n mergeDescriptions(annot, descriptionObj, ideo);\r\n });\r\n\r\n return annots;\r\n}\r\n\r\nfunction overplotParalogs(annots, ideo) {\r\n if (!ideo.config.showParalogNeighborhoods) return;\r\n\r\n if (annots.length < 2) return;\r\n\r\n // Arrays of paralogs within 10 Mbp of each other\r\n const neighborhoods = {};\r\n\r\n neighborhoods[annots[0].chr] = {};\r\n neighborhoods[annots[0].chr][annots[0].start] = [annots[0]];\r\n\r\n const windowInt = 2_000_000;\r\n const windowProse = '2 Mbp';\r\n\r\n for (let i = 1; i < annots.length; i++) {\r\n const annot = annots[i];\r\n const chr = annot.chr;\r\n const start = annot.start;\r\n if (chr in neighborhoods) {\r\n const starts = Object.keys(neighborhoods[chr]);\r\n for (let j = 0; j < starts.length; j++) {\r\n const startJInt = parseInt(starts[j]);\r\n if (Math.abs(start - startJInt) < windowInt) {\r\n neighborhoods[chr][startJInt].push(annot);\r\n } else {\r\n neighborhoods[chr][start] = [annot];\r\n }\r\n }\r\n } else {\r\n neighborhoods[chr] = {};\r\n neighborhoods[chr][start] = [annot];\r\n }\r\n }\r\n\r\n // Big enough to see and hover\r\n const overlayAnnotLength = 15_000_000;\r\n\r\n const searchedGene = getSearchedFromDescriptions(ideo);\r\n\r\n const neighborhoodAnnots =\r\n Object.entries(neighborhoods).map(([chr, neighborhood], index) => {\r\n const start = parseInt(Object.keys(neighborhood)[0]);\r\n let paralogs = Object.values(neighborhood)[0];\r\n\r\n if (paralogs.length < 2) {\r\n return {paralogs};\r\n }\r\n\r\n // paralogs.map(paralog => {\r\n // console.log(paralog);\r\n // })\r\n\r\n const description =\r\n `${paralogs.length} nearby paralogs of ${searchedGene}`;\r\n\r\n const chrLength = ideo.chromosomes[ideo.config.taxid][chr].bpLength;\r\n let annotStart = start - overlayAnnotLength/2;\r\n let annotStop = start + overlayAnnotLength/2;\r\n if (annotStop > chrLength) {\r\n annotStart = start - overlayAnnotLength;\r\n annotStop = chrLength;\r\n } else if (annotStart < 1) {\r\n annotStart = 1;\r\n annotStop = overlayAnnotLength;\r\n };\r\n\r\n if ('geneCache' in ideo) {\r\n paralogs = paralogs.map(paralog => {\r\n paralog.fullName = ideo.geneCache.fullNamesById[paralog.id];\r\n return paralog;\r\n });\r\n }\r\n\r\n const key = 'paralogNeighborhood-' + index;\r\n const fStart = start.toLocaleString(); // Format for readability\r\n const displayCoordinates = `chr${chr}:${fStart} ± ${windowProse}`;\r\n\r\n const annot = {\r\n name: key,\r\n chr,\r\n start: annotStart,\r\n stop: annotStop,\r\n color: 'pink',\r\n description,\r\n paralogs,\r\n type: 'paralog neighborhood',\r\n displayCoordinates\r\n };\r\n\r\n ideo.annotDescriptions.annots[annot.name] = annot;\r\n return annot;\r\n }).filter(n => n.paralogs.length > 1);\r\n\r\n if (neighborhoodAnnots.length > 0) {\r\n // console.log('neighborhoodAnnots')\r\n // console.log(neighborhoodAnnots.map(na => na));\r\n ideo.drawAnnots(neighborhoodAnnots, 'overlay', true, true);\r\n moveLegend();\r\n }\r\n}\r\n\r\n/**\r\n * Fetch paralogs of searched gene\r\n */\r\nasync function fetchParalogs(annot, ideo) {\r\n const taxid = ideo.config.taxid;\r\n\r\n let homologs;\r\n // Fetch paralogs\r\n if (ideo.paralogCache) {\r\n // const baseUrl = 'http://localhost:8080/dist/data/cache/paralogs/';\r\n // const url = `${baseUrl}homo-sapiens/${annot.name}.tsv`;\r\n // const response = await fetch(url);\r\n // const oneRowTsv = await response.text();\r\n // const rawHomologEnsemblIds = oneRowTsv.split('\\t');\r\n // homologs = rawHomologEnsemblIds.map(r => getEnsemblId('ENSG', r));\r\n const paralogsByName = ideo.paralogCache.paralogsByName;\r\n const nameUc = annot.name.toUpperCase();\r\n const hasParalogs = nameUc in paralogsByName;\r\n homologs = hasParalogs ? paralogsByName[nameUc] : [];\r\n } else {\r\n const params = `&format=condensed&type=paralogues&target_taxon=${taxid}`;\r\n const path = `/homology/id/${annot.id}?${params}`;\r\n const ensemblHomologs = await Ideogram.fetchEnsembl(path);\r\n homologs = ensemblHomologs.data[0].homologies;\r\n }\r\n\r\n\r\n // Fetch positions of paralogs\r\n let annots =\r\n await fetchParalogPositionsFromMyGeneInfo(homologs, annot, ideo);\r\n\r\n // Omit genes named like \"AC113554.1\", which is an \"accession.version\".\r\n // Such accVers are raw and poorly suited here.\r\n annots = annots.filter(annot => {\r\n const isAccVer = annot.name.match(/^AC[0-9.]+$/);\r\n return !isAccVer;\r\n });\r\n\r\n return annots;\r\n}\r\n\r\n/**\r\n * Filters out placements on alternative loci scaffolds, an advanced\r\n * genome assembly feature we are not concerned with in ideograms.\r\n *\r\n * Example:\r\n * https://mygene.info/v3/query?q=symbol:PTPRC&species=9606&fields=symbol,genomic_pos,name\r\n */\r\nfunction getGenomicPos(gene, ideo) {\r\n let genomicPos = null;\r\n if (Array.isArray(gene.genomic_pos)) {\r\n genomicPos = gene.genomic_pos.filter(pos => {\r\n return pos.chr in ideo.chromosomes[ideo.config.taxid];\r\n })[0];\r\n } else {\r\n genomicPos = gene.genomic_pos;\r\n }\r\n return genomicPos;\r\n}\r\n\r\n/**\r\n * Transforms MyGene.info (MGI) gene into Ideogram annotation\r\n */\r\nfunction parseAnnotFromMgiGene(gene, ideo, color='red') {\r\n const genomicPos = getGenomicPos(gene, ideo);\r\n\r\n const annot = {\r\n name: gene.symbol,\r\n chr: genomicPos.chr,\r\n start: genomicPos.start,\r\n stop: genomicPos.end,\r\n id: genomicPos.ensemblgene,\r\n color\r\n };\r\n\r\n return annot;\r\n}\r\n\r\nfunction moveLegend() {\r\n const ideoInnerDom = document.querySelector('#_ideogramInnerWrap');\r\n const decorPad = setRelatedDecorPad({}).legendPad;\r\n const left = decorPad + 20;\r\n const legendStyle = `position: absolute; top: 15px; left: ${left}px`;\r\n const legend = document.querySelector('#_ideogramLegend');\r\n ideoInnerDom.prepend(legend);\r\n legend.style = legendStyle;\r\n}\r\n\r\n/** Filter annotations to only include those in configured list */\r\nfunction applyAnnotsIncludeList(annots, ideo) {\r\n\r\n if (ideo.config.annotsInList === 'all') return annots;\r\n\r\n const includedAnnots = [];\r\n annots.forEach(annot => {\r\n if (ideo.config.annotsInList.includes(annot.name.toLowerCase())) {\r\n includedAnnots.push(annot);\r\n }\r\n });\r\n return includedAnnots;\r\n}\r\n\r\n/** Fetch and draw interacting genes, return Promise for annots */\r\nfunction processInteractions(annot, ideo) {\r\n return new Promise(async (resolve) => {\r\n const t0 = performance.now();\r\n\r\n const interactions = await fetchInteractions(annot, ideo);\r\n const annots = await fetchInteractionAnnots(interactions, annot, ideo);\r\n\r\n ideo.relatedAnnots.push(...annots);\r\n finishPlotRelatedGenes('interacting', ideo);\r\n\r\n ideo.time.rg.interactions = timeDiff(t0);\r\n\r\n resolve();\r\n });\r\n}\r\n\r\n/** Find and draw paralogs, return Promise for annots */\r\nfunction processParalogs(annot, ideo) {\r\n return new Promise(async (resolve) => {\r\n const t0 = performance.now();\r\n\r\n const annots = await fetchParalogs(annot, ideo);\r\n ideo.relatedAnnots.push(...annots);\r\n finishPlotRelatedGenes('paralogous', ideo);\r\n overplotParalogs(annots, ideo);\r\n\r\n ideo.time.rg.paralogs = timeDiff(t0);\r\n\r\n resolve();\r\n });\r\n}\r\n\r\n// /**\r\n// * Sorts gene names consistently.\r\n// *\r\n// * Might also loosely rank by first-discovered or most prominent\r\n// */\r\n// function sortGeneNames(aName, bName) {\r\n// // Rank shorter names above longer names\r\n// if (bName.length !== aName.length) return bName.length - aName.length;\r\n\r\n// // Rank names of equal length alphabetically\r\n// return [aName, bName].sort().indexOf(aName) === 0 ? 1 : -1;\r\n// }\r\n\r\n/** Sorts by relevance of related type, then rank */\r\nexport function sortByRelatedType(a, b) {\r\n var aName, bName, aColor, bColor;\r\n if ('name' in a) {\r\n // Locally processed annotations\r\n aName = a.name;\r\n bName = b.name;\r\n aColor = a.color;\r\n bColor = b.color;\r\n } else {\r\n // Raw annotations\r\n [aName, aColor] = [a[0], a[3]];\r\n [bName, bColor] = [b[0], b[3]];\r\n }\r\n\r\n // Rank red (searched gene) highest\r\n if (aColor === 'red') return -1;\r\n if (bColor === 'red') return 1;\r\n\r\n // Rank purple (interacting gene) above pink (paralogous gene)\r\n if (aColor === 'purple' && bColor === 'pink') return -1;\r\n if (bColor === 'purple' && aColor === 'pink') return 1;\r\n\r\n return a.rank - b.rank;\r\n\r\n // return sortGeneNames(aName, bName);\r\n}\r\n\r\nfunction mergeDescriptions(annot, desc, ideo) {\r\n let mergedDesc;\r\n const descriptions = ideo.annotDescriptions.annots;\r\n\r\n if (annot.name in descriptions) {\r\n const otherDesc = descriptions[annot.name];\r\n mergedDesc = desc;\r\n if (desc.type === otherDesc.type) return;\r\n Object.keys(otherDesc).forEach(function(key) {\r\n if (key in mergedDesc === false) {\r\n mergedDesc[key] = otherDesc[key];\r\n }\r\n });\r\n // Object.assign({}, descriptions[annot.name]);\r\n if ('type' in otherDesc) {\r\n mergedDesc.type += ', ' + otherDesc.type;\r\n mergedDesc.description += `

    ${otherDesc.description}`;\r\n }\r\n } else {\r\n mergedDesc = desc;\r\n }\r\n\r\n ideo.annotDescriptions.annots[annot.name] = mergedDesc;\r\n}\r\n\r\nfunction mergeAnnots(unmergedAnnots) {\r\n\r\n const seenAnnots = {};\r\n let mergedAnnots = [];\r\n\r\n unmergedAnnots.forEach((annot) => {\r\n if (annot.name in seenAnnots === false) {\r\n mergedAnnots.push(annot);\r\n seenAnnots[annot.name] = 1;\r\n } else {\r\n if (annot.color === 'purple') {\r\n mergedAnnots = mergedAnnots.map((mergedAnnot) => {\r\n return (annot.name === mergedAnnot.name) ? annot : mergedAnnot;\r\n });\r\n }\r\n }\r\n });\r\n\r\n return mergedAnnots;\r\n}\r\n\r\n/** Filter, sort, draw annots. Move legend. */\r\nfunction finishPlotRelatedGenes(type, ideo) {\r\n setRelatedAnnotDomIds(ideo);\r\n\r\n let annots = deepCopy(ideo.relatedAnnots);\r\n\r\n annots = applyAnnotsIncludeList(annots, ideo);\r\n annots = mergeAnnots(annots);\r\n\r\n // annots = applyRankCutoff(annots, 40, ideo);\r\n ideo.relatedAnnots = mergeAnnots(annots);\r\n // ideo.relatedAnnots = applyRankCutoff(annots, 40, ideo);\r\n // annots.sort(sortByRelatedType);\r\n ideo.relatedAnnots.sort(ideo.annotSortFunction);\r\n\r\n // ideo.relatedAnnots = ideo.relatedAnnots.slice(0, 40);\r\n\r\n if (annots.length > 1 && ideo.onFindRelatedGenesCallback) {\r\n ideo.onFindRelatedGenesCallback();\r\n }\r\n\r\n ideo.drawAnnots(annots);\r\n // const idsToRemove = annots.slice(40).map(a => a.domId);\r\n // if (idsToRemove.length > 0) {\r\n // const selector = '#' + idsToRemove.join(',#')\r\n // document.querySelectorAll(selector).forEach(el => el.remove());\r\n // }\r\n\r\n if (ideo.config.showAnnotLabels) {\r\n ideo.fillAnnotLabels(ideo.relatedAnnots);\r\n }\r\n\r\n moveLegend();\r\n\r\n analyzePlotTimes(type, ideo);\r\n}\r\n\r\n/** Fetch position of searched gene, return corresponding annotation */\r\nasync function processSearchedGene(geneSymbol, ideo) {\r\n const t0 = performance.now();\r\n\r\n const data = await fetchGenes(geneSymbol, 'symbol', ideo);\r\n\r\n if (data.hits.length === 0) {\r\n return;\r\n }\r\n const gene = data.hits.find(hit => {\r\n const genomicPos = getGenomicPos(hit, ideo); // omits alt loci\r\n return genomicPos && genomicPos.ensemblgene;\r\n });\r\n const ensemblId = gene.genomic_pos.ensemblgene;\r\n\r\n // Assign tooltip content. Much of the content is often retrieved from\r\n // the gene cache. In that case, all fields except `name` are fetched\r\n // from cache. Occasionally, e.g. often upon the very first search, no\r\n // content is yet available from cache.\r\n let desc = {description: '', ensemblId, type: 'searched gene'};\r\n if (gene.symbol in ideo.annotDescriptions.annots) {\r\n // Most content already set via cache.\r\n // `name` will be set via non-blocking part of `fetchGenes`.\r\n const oldDesc = ideo.annotDescriptions.annots[gene.symbol];\r\n desc = Object.assign(oldDesc, desc);\r\n } else {\r\n // No content has been set yet via cache. In this case, `gene` already\r\n // has all the data needed for the searched gene's tooltip content.\r\n desc.name = gene.name;\r\n }\r\n\r\n ideo.annotDescriptions.annots[gene.symbol] = desc;\r\n\r\n const annot = parseAnnotFromMgiGene(gene, ideo);\r\n\r\n ideo.relatedAnnots.push(annot);\r\n\r\n ideo.time.rg.searchedGene = timeDiff(t0);\r\n\r\n return annot;\r\n}\r\n\r\nfunction adjustPlaceAndVisibility(ideo) {\r\n var ideoContainerDom = document.querySelector(ideo.config.container);\r\n\r\n ideoContainerDom.style.visibility = '';\r\n ideoContainerDom.style.position = 'absolute';\r\n ideoContainerDom.style.width = '100%';\r\n\r\n var ideoInnerDom = document.querySelector('#_ideogramInnerWrap');\r\n ideoInnerDom.style.position = 'relative';\r\n ideoInnerDom.style.marginLeft = 'auto';\r\n ideoInnerDom.style.marginRight = 'auto';\r\n ideoInnerDom.style.overflowY = 'hidden';\r\n document.querySelector('#_ideogramMiddleWrap').style.overflowY = 'hidden';\r\n\r\n const legendPad = ideo.config.legendPad;\r\n\r\n if (typeof ideo.didAdjustIdeogramLegend === 'undefined') {\r\n // Accounts for moving legend when external content at left or right\r\n // is variable upon first rendering plotted genes\r\n\r\n var ideoDom = document.querySelector('#_ideogram');\r\n const legendWidth = 160;\r\n ideoInnerDom.style.maxWidth =\r\n (\r\n parseInt(ideoInnerDom.style.maxWidth) +\r\n legendWidth +\r\n legendPad\r\n ) + 'px';\r\n\r\n ideoDom.style.minWidth =\r\n (parseInt(ideoDom.style.minWidth) + legendPad) + 'px';\r\n ideoDom.style.maxWidth =\r\n (parseInt(ideoDom.style.minWidth) + legendPad) + 'px';\r\n ideoDom.style.position = 'relative';\r\n ideoDom.style.left = legendWidth + 'px';\r\n\r\n ideo.didAdjustIdeogramLegend = true;\r\n }\r\n}\r\n\r\nfunction sortByPathwayIxn(a, b) {\r\n const aColor = a.color;\r\n const bColor = b.color;\r\n\r\n // Rank red (searched gene) highest\r\n if (aColor === 'red') return -1;\r\n if (bColor === 'red') return 1;\r\n\r\n // Rank not grey above grey\r\n if (aColor === 'grey' && bColor !== 'grey') return 1;\r\n if (bColor === 'grey' && aColor !== 'grey') return -1;\r\n\r\n return a.rank - b.rank;\r\n}\r\n\r\n// async function fetchPathwayGeneAnnots(searchedGene, pathway, ideo) {\r\n// const annots = [];\r\n\r\n// const pathwayIxns =\r\n// await fetchPathwayInteractions(searchedGene.name, pathway.id, ideo);\r\n\r\n// const pathwayGenes = Object.keys(pathwayIxns);\r\n// const data = await fetchGenes(pathwayGenes, 'symbol', ideo);\r\n\r\n// const ixnColors = {\r\n// 'Stimulates': 'green',\r\n// 'Stimulated by': 'green',\r\n// 'Necessarily stimulates': 'green',\r\n// 'Necessarily stimulated by': 'green',\r\n// 'Transcribes / translates': 'brown',\r\n// 'Transcribed / translated by': 'brown',\r\n// 'Inhibits': 'red',\r\n// 'Inhibited by': 'red',\r\n// 'Modifies': 'blue',\r\n// 'Modified by': 'blue',\r\n// 'Acts on': 'blue',\r\n// 'Acted on by': 'blue',\r\n// 'Catalyzes': 'orange',\r\n// 'Catalyzed by': 'orange',\r\n// 'Converts': 'orange',\r\n// 'Converted by': 'orange',\r\n// 'Binds': 'black',\r\n// 'Shares pathway with': 'grey'\r\n// };\r\n\r\n// data.hits.forEach(gene => {\r\n// // If hit lacks position\r\n// // or is same as searched gene (e.g. search for human SRC),\r\n// // then skip processing\r\n// if (\r\n// 'genomic_pos' in gene === false ||\r\n// gene.symbol === searchedGene.name\r\n// ) {\r\n// return;\r\n// }\r\n\r\n// // Account for edge case: cyclic AMP (cAMP) is not \"CAMP\" gene\r\n// if (gene.symbol === 'cAMP') return;\r\n\r\n// const summary = pathwayIxns[gene.symbol];\r\n// const color = ixnColors[summary];\r\n// // if (color !== 'blue') console.log(gene);\r\n\r\n// const annot = parseAnnotFromMgiGene(gene, ideo, color);\r\n// annots.push(annot);\r\n\r\n// const descriptionObj =\r\n// describePathwayGene(gene, searchedGene, pathway, summary);\r\n\r\n// mergeDescriptions(annot, descriptionObj, ideo);\r\n// });\r\n\r\n// ideo.annotSortFunction = sortByPathwayIxn;\r\n\r\n// const sortedAnnots = annots.sort(sortByPathwayIxn).slice(0, 40);\r\n\r\n// return sortedAnnots;\r\n// }\r\n\r\n// /**\r\n// *\r\n// */\r\n// async function plotPathwayGenes(searchedGene, pathway, ideo) {\r\n// const headerTitle = 'Genes in pathway';\r\n// initAnnotDescriptions(ideo, headerTitle);\r\n\r\n// legendPathwayName = pathway.name;\r\n// ideo.config.legend = pathwayLegend;\r\n// writeLegend(ideo);\r\n// moveLegend();\r\n\r\n// ideo.relatedAnnots = [];\r\n\r\n// await processSearchedGene(searchedGene.name, ideo);\r\n\r\n// const annots = await fetchPathwayGeneAnnots(searchedGene, pathway, ideo);\r\n// ideo.relatedAnnots.push(...annots);\r\n// finishPlotRelatedGenes('pathway', ideo);\r\n// }\r\n\r\nfunction initAnnotDescriptions(ideo, headerTitle) {\r\n const organism = ideo.getScientificName(ideo.config.taxid);\r\n const version = Ideogram.version;\r\n const headers = [\r\n `# ${headerTitle}`,\r\n `# Organism: ${organism}`,\r\n `# Generated by Ideogram.js version ${version}, https://github.com/eweitz/ideogram`,\r\n `# Generated at ${window.location.href}`\r\n ].join('\\n');\r\n\r\n delete ideo.annotDescriptions;\r\n ideo.annotDescriptions = {headers, annots: {}};\r\n\r\n}\r\n\r\n/**\r\n * For given gene, finds and draws interacting genes and paralogs\r\n *\r\n * @param geneSymbol {String} Gene symbol, e.g. RAD51\r\n */\r\nasync function plotRelatedGenes(geneSymbol=null) {\r\n\r\n const ideo = this;\r\n\r\n ideo.clearAnnotLabels();\r\n const legend = document.querySelector('#_ideogramLegend');\r\n if (legend) legend.remove();\r\n\r\n if (!geneSymbol) {\r\n return plotGeneHints(ideo);\r\n }\r\n\r\n ideo.config = setRelatedDecorPad(ideo.config);\r\n\r\n initAnnotDescriptions(ideo, `Related genes for ${geneSymbol}`);\r\n\r\n const ideoSel = ideo.selector;\r\n const annotSel = ideoSel + ' .annot';\r\n document.querySelectorAll(annotSel).forEach(el => el.remove());\r\n\r\n ideo.startHideAnnotTooltipTimeout();\r\n\r\n // Refine style\r\n document.querySelectorAll('.chromosome').forEach(chromosome => {\r\n chromosome.style.cursor = '';\r\n });\r\n\r\n adjustPlaceAndVisibility(ideo);\r\n\r\n ideo.relatedAnnots = [];\r\n\r\n // Fetch positon of searched gene\r\n const annot = await processSearchedGene(geneSymbol, ideo);\r\n\r\n if (typeof annot === 'undefined') throwGeneNotFound(geneSymbol, ideo);\r\n\r\n ideo.config.legend = relatedLegend;\r\n writeLegend(ideo);\r\n moveLegend();\r\n\r\n await Promise.all([\r\n processInteractions(annot, ideo),\r\n processParalogs(annot, ideo)\r\n ]);\r\n\r\n ideo.time.rg.total = timeDiff(ideo.time.rg.t0);\r\n\r\n analyzeRelatedGenes(ideo);\r\n\r\n if (ideo.onPlotRelatedGenesCallback) ideo.onPlotRelatedGenesCallback();\r\n}\r\n\r\nfunction getAnnotByName(annotName, ideo) {\r\n var annotByName;\r\n ideo.annots.forEach(annotsByChr => {\r\n annotsByChr.annots.forEach(annot => {\r\n if (annotName === annot.name) {\r\n annotByName = annot;\r\n }\r\n });\r\n });\r\n\r\n if (annotByName === null) {\r\n annotByName = ideo.annotDescriptions.annots[annotName];\r\n }\r\n return annotByName;\r\n}\r\n\r\n// /**\r\n// * Manage click on pathway links in annotation tooltips\r\n// */\r\n// function managePathwayClickHandlers(searchedGene, ideo) {\r\n// setTimeout(function() {\r\n// const pathways = document.querySelectorAll('.ideo-pathway-link');\r\n// if (pathways.length > 0 && !ideo.addedPathwayClickHandler) {\r\n// pathways.forEach(pathway => {\r\n// // pathway.removeEventListener('click', handlePathwayClick);\r\n// pathway.addEventListener('click', function(event) {\r\n// const target = event.target;\r\n// const pathwayId = target.getAttribute('data-pathway-id');\r\n// const pathwayName = target.getAttribute('data-pathway-name');\r\n// const pathway = {id: pathwayId, name: pathwayName};\r\n// plotPathwayGenes(searchedGene, pathway, ideo);\r\n// });\r\n// });\r\n\r\n// // Ensures handler isn't added redundantly. This is used because\r\n// // addEventListener options like {once: true} don't suffice\r\n// // ideo.addedPathwayClickHandler = true;\r\n// }\r\n// }, 100);\r\n// }\r\n\r\n/**\r\n * Handles click within annotation tooltip\r\n *\r\n * Makes clicking link in tooltip behave same as clicking annotation\r\n */\r\nfunction handleTooltipClick(ideo) {\r\n // const tooltip = document.querySelector('._ideogramTooltip');\r\n // if (!ideo.addedTooltipClickHandler) {\r\n // tooltip.addEventListener('click', () => {\r\n // const geneDom = document.querySelector('#ideo-related-gene');\r\n // const annotName = geneDom.textContent;\r\n // const annot = getAnnotByName(annotName, ideo);\r\n // ideo.onClickAnnot(annot);\r\n // });\r\n\r\n // // Ensures handler isn't added redundantly. This is used because\r\n // // addEventListener options like {once: true} don't suffice\r\n // ideo.addedTooltipClickHandler = true;\r\n // }\r\n\r\n const tooltip = document.querySelector('._ideogramTooltip');\r\n if (!ideo.addedTooltipClickHandler) {\r\n tooltip.addEventListener('click', (event) => {\r\n let geneDom = document.querySelector('#ideo-related-gene');\r\n if (!geneDom) {\r\n geneDom = event.target;\r\n }\r\n const annotName = geneDom.textContent;\r\n const annot = getAnnotByName(annotName, ideo);\r\n ideo.onClickAnnot(annot);\r\n });\r\n\r\n // Ensures handler isn't added redundantly. This is used because\r\n // addEventListener options like {once: true} don't suffice\r\n ideo.addedTooltipClickHandler = true;\r\n }\r\n}\r\n\r\n/** Return searched gene from annotation descriptions in Ideogram object */\r\nfunction getSearchedFromDescriptions(ideo) {\r\n return (\r\n Object.entries(ideo.annotDescriptions.annots)\r\n .find(([k, v]) => v.type === 'searched gene')[0]\r\n );\r\n}\r\n\r\n/**\r\n * Enhance tooltip shown on hovering over gene annotation\r\n */\r\nfunction decorateRelatedGene(annot) {\r\n const ideo = this;\r\n if (\r\n annot.name === ideo.prevClickedAnnot?.name &&\r\n ideo.isTooltipCooling\r\n ) {\r\n // Cancels showing tooltip immediately after clicking gene\r\n return null;\r\n }\r\n\r\n const descObj = ideo.annotDescriptions.annots[annot.name];\r\n\r\n if ('type' in descObj && descObj.type.includes('interacting gene')) {\r\n const pathwayIds = descObj.pathwayIds;\r\n // Get symbol of the searched gene, e.g. \"PTEN\"\r\n const searchedGene = getSearchedFromDescriptions(ideo);\r\n\r\n const gpmls = ideo.gpmlsByInteractingGene[annot.name];\r\n\r\n const summary =\r\n summarizeInteractions(annot.name, searchedGene, pathwayIds, gpmls);\r\n if (summary !== null) {\r\n const oldSummary = 'Interacts with';\r\n descObj.description =\r\n descObj.description.replace(oldSummary, summary);\r\n }\r\n }\r\n\r\n const description =\r\n descObj.description.length > 0 ? `
    ${descObj.description}` : '';\r\n const fullName = descObj.name;\r\n const style = 'style=\"color: #0366d6; cursor: pointer;\"';\r\n\r\n let fullNameAndRank = fullName;\r\n if ('rank' in annot) {\r\n const rank = 'Ranked ' + annot.rank + ' in general or scholarly interest';\r\n fullNameAndRank = `${fullName}`;\r\n }\r\n\r\n let originalDisplay =\r\n `${annot.name}
    ` +\r\n `${fullNameAndRank}
    ` +\r\n `${description}` +\r\n `
    `;\r\n\r\n if (annot.name.includes('paralogNeighborhood')) {\r\n\r\n // Rank 1st highest, then put it last as it already has a triangle\r\n // annotation, and is often also labeled.\r\n const sortedParalogs =\r\n descObj.paralogs.sort((a, b) => a.rank - b.rank);\r\n const firstRanked = sortedParalogs.shift(); // Take off first\r\n sortedParalogs.push(firstRanked); // Make it last\r\n\r\n originalDisplay =\r\n 'Paralog neighborhood
    ' +\r\n '
    ' +\r\n descObj.description + ':
    ' +\r\n `${sortedParalogs\r\n .map(paralog => {\r\n let title = '';\r\n if (paralog.fullName) title = paralog.fullName;\r\n if (paralog.rank) {\r\n const rank = paralog.rank;\r\n title += ` Ranked ${rank} in general or scholarly interest`;\r\n }\r\n if (title !== '') title = `title=\"${title}\"`;\r\n return (\r\n `${\r\n paralog.name\r\n }`\r\n );\r\n }).join('
    ')}` +\r\n '
    ';\r\n annot.displayCoordinates = descObj.displayCoordinates;\r\n }\r\n\r\n annot.displayName = originalDisplay;\r\n\r\n handleTooltipClick(ideo);\r\n\r\n // managePathwayClickHandlers(annot, ideo);\r\n\r\n return annot;\r\n}\r\n\r\nconst shape = 'triangle';\r\n\r\nconst legendHeaderStyle =\r\n `font-size: 14px; font-weight: bold; font-color: #333;`;\r\n\r\nconst relatedLegend = [{\r\n name: `\r\n
    \r\n
    Related genes
    \r\n Click gene to search\r\n
    \r\n `,\r\n nameHeight: 50,\r\n rows: [\r\n {name: 'Interacting gene', color: 'purple', shape: shape},\r\n {name: 'Paralogous gene', color: 'pink', shape: shape},\r\n {name: 'Searched gene', color: 'red', shape: shape}\r\n ]\r\n}];\r\n\r\nlet legendPathwayName = '';\r\n\r\nconst pathwayLegend = [{\r\n name: `\r\n
    \r\n
    Related genes
    \r\n Click gene to search\r\n
    \r\n `,\r\n nameHeight: 50,\r\n rows: [\r\n {name: 'Pathway gene', color: 'blue', shape: shape},\r\n {name: 'Searched gene', color: 'red', shape: shape}\r\n ]\r\n}];\r\n\r\nconst citedLegend = [{\r\n name: `\r\n
    \r\n
    Highly cited genes
    \r\n Click gene to search\r\n
    \r\n `,\r\n nameHeight: 30,\r\n rows: []\r\n}];\r\n\r\n/** Sets legendPad for related genes view */\r\nfunction setRelatedDecorPad(kitConfig) {\r\n if (kitConfig.showAnnotLabels) {\r\n kitConfig.legendPad = 70;\r\n } else {\r\n kitConfig.legendPad = 30;\r\n }\r\n return kitConfig;\r\n}\r\n\r\n/**\r\n * Wrapper for Ideogram constructor, with generic \"Related genes\" options\r\n *\r\n * This function is made available as a static method on Ideogram.\r\n *\r\n * @param {Object} config Ideogram configuration object\r\n */\r\nfunction _initRelatedGenes(config, annotsInList) {\r\n\r\n if (annotsInList !== 'all') {\r\n annotsInList = annotsInList.map(name => name.toLowerCase());\r\n }\r\n\r\n const kitDefaults = {\r\n showFullyBanded: false,\r\n rotatable: false,\r\n legend: relatedLegend,\r\n chrBorderColor: '#333',\r\n chrLabelColor: '#333',\r\n onWillShowAnnotTooltip: decorateRelatedGene,\r\n annotsInList: annotsInList,\r\n showTools: true,\r\n showAnnotLabels: true,\r\n showParalogNeighborhoods: true,\r\n chrFillColor: {centromere: '#DAAAAA'},\r\n relatedGenesMode: 'related'\r\n };\r\n\r\n if ('onWillShowAnnotTooltip' in config) {\r\n const key = 'onWillShowAnnotTooltip';\r\n const clientFn = config[key];\r\n const defaultFunction = kitDefaults[key];\r\n const newFunction = function(annot) {\r\n annot = defaultFunction.bind(this)(annot);\r\n annot = clientFn.bind(this)(annot);\r\n return annot;\r\n };\r\n kitDefaults[key] = newFunction;\r\n delete config[key];\r\n }\r\n\r\n // Override kit defaults if client specifies otherwise\r\n let kitConfig = Object.assign(kitDefaults, config);\r\n\r\n kitConfig = setRelatedDecorPad(kitConfig);\r\n\r\n const ideogram = new Ideogram(kitConfig);\r\n\r\n // Called upon completing last plot, including all related genes\r\n if (config.onPlotRelatedGenes) {\r\n ideogram.onPlotRelatedGenesCallback = config.onPlotRelatedGenes;\r\n }\r\n\r\n // Called upon 1) finding paralogs, and 2) finding interacting genes\r\n if (config.onFindRelatedGenes) {\r\n ideogram.onFindRelatedGenesCallback = config.onFindRelatedGenes;\r\n }\r\n\r\n ideogram.getTooltipAnalytics = getRelatedGenesTooltipAnalytics;\r\n\r\n ideogram.annotSortFunction = sortByRelatedType;\r\n\r\n initAnalyzeRelatedGenes(ideogram);\r\n\r\n let cacheDir = null;\r\n if (config.cacheDir) cacheDir = config.cacheDir;\r\n initGeneCache(ideogram.config.organism, ideogram, cacheDir);\r\n initParalogCache(ideogram.config.organism, ideogram, cacheDir);\r\n initInteractionCache(ideogram.config.organism, ideogram, cacheDir);\r\n\r\n return ideogram;\r\n}\r\n\r\nfunction plotGeneHints() {\r\n const ideo = this;\r\n\r\n if (!ideo || 'annotDescriptions' in ideo) return;\r\n\r\n ideo.annotDescriptions = {annots: {}};\r\n\r\n ideo.flattenAnnots().map((annot) => {\r\n let description = [];\r\n if ('significance' in annot && annot.significance !== 'n/a') {\r\n description.push(annot.significance);\r\n }\r\n if ('citations' in annot && annot.citations !== undefined) {\r\n description.push(annot.citations);\r\n }\r\n description = description.join('

    ');\r\n ideo.annotDescriptions.annots[annot.name] = {\r\n description,\r\n name: annot.fullName\r\n };\r\n });\r\n\r\n adjustPlaceAndVisibility(ideo);\r\n moveLegend();\r\n ideo.fillAnnotLabels([]);\r\n const container = ideo.config.container;\r\n document.querySelector(container).style.visibility = '';\r\n}\r\n\r\n/**\r\n * Wrapper for Ideogram constructor, with generic \"Related genes\" options\r\n *\r\n * This function is made available as a static method on Ideogram.\r\n *\r\n * @param {Object} config Ideogram configuration object\r\n */\r\nfunction _initGeneHints(config, annotsInList) {\r\n\r\n delete config.onPlotRelatedGenes;\r\n\r\n if (annotsInList !== 'all') {\r\n annotsInList = annotsInList.map(name => name.toLowerCase());\r\n }\r\n\r\n const annotsPath =\r\n getDir('cache/homo-sapiens-top-genes.tsv');\r\n\r\n const kitDefaults = {\r\n showFullyBanded: false,\r\n rotatable: false,\r\n legend: citedLegend,\r\n chrMargin: -4,\r\n chrBorderColor: '#333',\r\n chrLabelColor: '#333',\r\n onWillShowAnnotTooltip: decorateRelatedGene,\r\n annotsInList: annotsInList,\r\n showTools: true,\r\n showAnnotLabels: true,\r\n showParalogNeighborhoods: true,\r\n onDrawAnnots: plotGeneHints,\r\n annotationsPath: annotsPath,\r\n relatedGenesMode: 'hints'\r\n };\r\n\r\n if ('onWillShowAnnotTooltip' in config) {\r\n const key = 'onWillShowAnnotTooltip';\r\n const clientFn = config[key];\r\n const defaultFunction = kitDefaults[key];\r\n const newFunction = function(annot) {\r\n annot = defaultFunction.bind(this)(annot);\r\n annot = clientFn.bind(this)(annot);\r\n return annot;\r\n };\r\n kitDefaults[key] = newFunction;\r\n delete config[key];\r\n }\r\n\r\n if ('onDrawAnnots' in config) {\r\n const key = 'onDrawAnnots';\r\n const clientFn = config[key];\r\n const defaultFunction = kitDefaults[key];\r\n const newFunction = function() {\r\n defaultFunction.bind(this)();\r\n clientFn.bind(this)();\r\n };\r\n kitDefaults[key] = newFunction;\r\n delete config[key];\r\n }\r\n\r\n // Override kit defaults if client specifies otherwise\r\n const kitConfig = Object.assign(kitDefaults, config);\r\n\r\n if (kitConfig.showAnnotLabels) {\r\n kitConfig.legendPad = 80;\r\n } else {\r\n kitConfig.legendPad = 30;\r\n }\r\n\r\n const ideogram = new Ideogram(kitConfig);\r\n\r\n // Called upon completing last plot, including all related genes\r\n if (config.onPlotRelatedGenes) {\r\n ideogram.onPlotRelatedGenesCallback = config.onPlotRelatedGenes;\r\n }\r\n\r\n // Called upon 1) finding paralogs, and 2) finding interacting genes\r\n if (config.onFindRelatedGenes) {\r\n ideogram.onFindRelatedGenesCallback = config.onFindRelatedGenes;\r\n }\r\n\r\n ideogram.getTooltipAnalytics = getRelatedGenesTooltipAnalytics;\r\n\r\n ideogram.annotSortFunction = sortByRelatedType;\r\n\r\n initAnalyzeRelatedGenes(ideogram);\r\n\r\n let cacheDir = null;\r\n if (config.cacheDir) cacheDir = config.cacheDir;\r\n initGeneCache(ideogram.config.organism, ideogram, cacheDir);\r\n initParalogCache(ideogram.config.organism, ideogram, cacheDir);\r\n initInteractionCache(ideogram.config.organism, ideogram, cacheDir);\r\n\r\n return ideogram;\r\n}\r\n\r\nexport {\r\n _initGeneHints, _initRelatedGenes, plotRelatedGenes, getRelatedGenesByType\r\n};\r\n","/**\r\n * @fileoverview Core module of Ideogram.js, links all other modules\r\n * This file defines the Ideogram class, its constructor method, and its\r\n * static methods. All instance methods are defined in other modules.\r\n *\r\n */\r\n\r\nimport version from './version';\r\n\r\nimport {\r\n configure, initDrawChromosomes, handleRotateOnClick, onLoad,\r\n init, finishInit, writeContainer\r\n} from './init/init';\r\n\r\nimport {\r\n onLoadAnnots, onDrawAnnots, processAnnotData, restoreDefaultTracks,\r\n updateDisplayedTracks, initAnnotSettings, fetchAnnots, drawAnnots,\r\n getHistogramBars, drawHeatmaps, deserializeAnnotsForHeatmap, fillAnnots,\r\n drawProcessedAnnots, drawSynteny, startHideAnnotTooltipTimeout,\r\n showAnnotTooltip, onWillShowAnnotTooltip, setOriginalTrackIndexes,\r\n afterRawAnnots, onClickAnnot, downloadAnnotations, addAnnotLabel,\r\n removeAnnotLabel, fillAnnotLabels, clearAnnotLabels, flattenAnnots\r\n // fadeOutAnnotLabels\r\n} from './annotations/annotations';\r\n\r\nimport {highlight, unhighlight} from './annotations/highlight';\r\n\r\nimport {\r\n esearch, esummary, elink,\r\n getOrganismFromEutils, getTaxids,\r\n getAssemblyAndChromosomesFromEutils\r\n} from './services/services';\r\n\r\nimport {\r\n drawBandLabels, getBandColorGradients, processBandData,\r\n setBandsToShow, hideUnshownBandLabels, drawBandLabelText, drawBandLabelStalk\r\n} from './bands/bands';\r\n\r\nimport {onBrushMove, onBrushEnd, createBrush} from './brush';\r\nimport {onCursorMove, createClickCursor} from './cursor';\r\nimport {drawSexChromosomes, setSexChromosomes} from './sex-chromosomes';\r\nimport {convertBpToPx, convertPxToBp} from './coordinate-converters';\r\nimport {\r\n unpackAnnots, packAnnots, initCrossFilter, filterAnnots\r\n} from './filter';\r\n\r\nimport {\r\n assemblyIsAccession, getDataDir, round, onDidRotate, getSvg, d3,\r\n getTaxid, getCommonName, getScientificName, fetch as _fetch,\r\n isRoman, parseRoman\r\n} from './lib';\r\n\r\nimport {\r\n getChromosomeModel, getChromosomePixels\r\n} from './views/chromosome-model';\r\n\r\nimport {\r\n appendHomolog, drawChromosome, rotateAndToggleDisplay, setOverflowScroll\r\n} from './views/draw-chromosomes';\r\n\r\nimport {\r\n drawChromosomeLabels, rotateChromosomeLabels\r\n} from './views/chromosome-labels.js';\r\n\r\nimport {\r\n _initGeneHints, _initRelatedGenes, plotRelatedGenes, getRelatedGenesByType\r\n} from './kit/related-genes';\r\n\r\nexport default class Ideogram {\r\n constructor(config) {\r\n\r\n // Functions from init.js\r\n this.configure = configure;\r\n this.initDrawChromosomes = initDrawChromosomes;\r\n this.onLoad = onLoad;\r\n this.handleRotateOnClick = handleRotateOnClick;\r\n this.init = init;\r\n this.finishInit = finishInit;\r\n this.writeContainer = writeContainer;\r\n\r\n // Functions from annotations.js\r\n this.onLoadAnnots = onLoadAnnots;\r\n this.onDrawAnnots = onDrawAnnots;\r\n this.processAnnotData = processAnnotData;\r\n this.restoreDefaultTracks = restoreDefaultTracks;\r\n this.updateDisplayedTracks = updateDisplayedTracks;\r\n this.initAnnotSettings = initAnnotSettings;\r\n this.fetchAnnots = fetchAnnots;\r\n this.drawAnnots = drawAnnots;\r\n this.getHistogramBars = getHistogramBars;\r\n this.drawHeatmaps = drawHeatmaps;\r\n this.deserializeAnnotsForHeatmap = deserializeAnnotsForHeatmap;\r\n this.fillAnnots = fillAnnots;\r\n this.drawProcessedAnnots = drawProcessedAnnots;\r\n this.drawSynteny = drawSynteny;\r\n this.startHideAnnotTooltipTimeout = startHideAnnotTooltipTimeout;\r\n this.showAnnotTooltip = showAnnotTooltip;\r\n this.onWillShowAnnotTooltip = onWillShowAnnotTooltip;\r\n this.onClickAnnot = onClickAnnot;\r\n this.setOriginalTrackIndexes = setOriginalTrackIndexes;\r\n this.afterRawAnnots = afterRawAnnots;\r\n this.downloadAnnotations = downloadAnnotations;\r\n this.addAnnotLabel = addAnnotLabel;\r\n this.removeAnnotLabel = removeAnnotLabel;\r\n // this.fadeOutAnnotLabels = fadeOutAnnotLabels;\r\n this.fillAnnotLabels = fillAnnotLabels;\r\n this.clearAnnotLabels = clearAnnotLabels;\r\n this.flattenAnnots = flattenAnnots;\r\n\r\n this.highlight = highlight;\r\n this.unhighlight = unhighlight;\r\n\r\n // Variables and functions from services.js\r\n this.esearch = esearch;\r\n this.esummary = esummary;\r\n this.elink = elink;\r\n this.getOrganismFromEutils = getOrganismFromEutils;\r\n this.getTaxids = getTaxids;\r\n this.getAssemblyAndChromosomesFromEutils =\r\n getAssemblyAndChromosomesFromEutils;\r\n\r\n // Functions from bands.js\r\n this.drawBandLabels = drawBandLabels;\r\n this.getBandColorGradients = getBandColorGradients;\r\n this.processBandData = processBandData;\r\n this.setBandsToShow = setBandsToShow;\r\n this.hideUnshownBandLabels = hideUnshownBandLabels;\r\n this.drawBandLabelText = drawBandLabelText;\r\n this.drawBandLabelStalk = drawBandLabelStalk;\r\n\r\n // Functions from brush.js\r\n this.onBrushMove = onBrushMove;\r\n this.onBrushEnd = onBrushEnd;\r\n this.createBrush = createBrush;\r\n\r\n // Functions from cursor.js\r\n this.createClickCursor = createClickCursor;\r\n this.onCursorMove = onCursorMove;\r\n\r\n // Functions from sex-chromosomes.js\r\n this.drawSexChromosomes = drawSexChromosomes;\r\n this.setSexChromosomes = setSexChromosomes;\r\n\r\n // Functions from coordinate-converters.js\r\n this.convertBpToPx = convertBpToPx;\r\n this.convertPxToBp = convertPxToBp;\r\n\r\n // Functions from filter.js\r\n this.unpackAnnots = unpackAnnots;\r\n this.packAnnots = packAnnots;\r\n this.initCrossFilter = initCrossFilter;\r\n this.filterAnnots = filterAnnots;\r\n\r\n // Functions from lib\r\n this.assemblyIsAccession = assemblyIsAccession;\r\n this.getDataDir = getDataDir;\r\n this.round = round;\r\n this.onDidRotate = onDidRotate;\r\n this.getSvg = getSvg;\r\n this.fetch = _fetch;\r\n this.getTaxid = getTaxid;\r\n this.getCommonName = getCommonName;\r\n this.getScientificName = getScientificName;\r\n\r\n // Functions from views/chromosome-model.js\r\n this.getChromosomeModel = getChromosomeModel;\r\n this.getChromosomePixels = getChromosomePixels;\r\n\r\n // Functions from views/chromosome-labels.js\r\n this.drawChromosomeLabels = drawChromosomeLabels;\r\n this.rotateChromosomeLabels = rotateChromosomeLabels;\r\n\r\n // Functions from views/draw-chromosomes.js\r\n this.appendHomolog = appendHomolog;\r\n this.drawChromosome = drawChromosome;\r\n this.rotateAndToggleDisplay = rotateAndToggleDisplay;\r\n this.setOverflowScroll = setOverflowScroll;\r\n\r\n this.plotRelatedGenes = plotRelatedGenes;\r\n this.getRelatedGenesByType = getRelatedGenesByType;\r\n\r\n this.configure(config);\r\n }\r\n\r\n /**\r\n * Get the current version of Ideogram.js\r\n */\r\n static get version() {\r\n return version;\r\n }\r\n\r\n /**\r\n * Enable use of D3 in client apps, via \"d3 = Ideogram.d3\"\r\n */\r\n static get d3() {\r\n return d3;\r\n }\r\n\r\n /**\r\n * Request data from Ensembl REST API\r\n * Docs: https://rest.ensembl.org/\r\n *\r\n * @param {String} path URL path\r\n * @param {Object} body POST body\r\n * @param {String} method HTTP method; 'GET' (default) or 'POST'\r\n */\r\n static async fetchEnsembl(path, body = null, method = 'GET') {\r\n const init = {\r\n method: method\r\n };\r\n if (body !== null) init.body = JSON.stringify(body);\r\n if (method === 'GET') {\r\n // Use HTTP parameter, not header, to avoid needless OPTIONS request\r\n const delimiter = path.includes('&') ? '&' : '?';\r\n path += delimiter + 'content-type=application/json';\r\n } else {\r\n // Method is POST, so content-type must be defined in header\r\n init.headers = {'Content-Type': 'application/json'};\r\n }\r\n\r\n // const random = Math.random();\r\n // console.log(random)\r\n // if (random < 0.5) {\r\n const response = await fetch(`https://rest.ensembl.org${path}`, init);\r\n const json = await response.json();\r\n return json;\r\n // } else {\r\n // // Mock error\r\n // init.headers = {'Content-Type': 'application/json'};\r\n // const response = await fetch('https://httpstat.us/500/cors', init);\r\n // const json = await response.json();\r\n // return json;\r\n // }\r\n }\r\n\r\n /**\r\n * Helper for sortChromosomes().\r\n * Gets names and biological types for diverse chromosome variables\r\n */\r\n static getChrSortNamesAndTypes(a, b) {\r\n var chrAName, chrBName,\r\n aIsCP, bIsCP, aIsMT, bIsMT, aIsAP, bIsAP, aIsNuclear, bIsNuclear;\r\n\r\n if (typeof a === 'string' || 'chr' in a && 'annots' in a) {\r\n // Chromosome data is from either:\r\n // - Ideogram static file cache (e.g. homo-sapiens.json)\r\n // - Ideogram raw annotations\r\n chrAName = (typeof a === 'string') ? a : a.chr;\r\n chrBName = (typeof b === 'string') ? b : b.chr;\r\n\r\n aIsCP = chrAName === 'CP';\r\n bIsCP = chrBName === 'CP';\r\n aIsMT = chrAName === 'MT';\r\n bIsMT = chrBName === 'MT';\r\n aIsAP = chrAName === 'AP';\r\n bIsAP = chrBName === 'AP';\r\n aIsNuclear = (!aIsCP && !aIsMT && !aIsAP);\r\n bIsNuclear = (!bIsCP && !bIsMT && !bIsAP);\r\n } else {\r\n // Chromosome data is from NCBI E-Utils web API\r\n chrAName = a.name;\r\n chrBName = b.name;\r\n\r\n aIsCP = a.type === 'chloroplast';\r\n bIsCP = b.type === 'chloroplast';\r\n aIsMT = a.type === 'mitochondrion';\r\n bIsMT = b.type === 'mitochondrion';\r\n aIsAP = a.type === 'apicoplast';\r\n bIsAP = b.type === 'apicoplast';\r\n aIsNuclear = a.type === 'nuclear';\r\n bIsNuclear = b.type === 'nuclear';\r\n }\r\n\r\n const chrTypes = {\r\n aIsNuclear, bIsNuclear, aIsCP, bIsCP, aIsMT, bIsMT, aIsAP, bIsAP\r\n };\r\n\r\n return [chrAName, chrBName, chrTypes];\r\n }\r\n\r\n /**\r\n * Sorts two chromosome objects by type and name\r\n * - Nuclear chromosomes come before non-nuclear chromosomes.\r\n * - Among nuclear chromosomes, use \"natural sorting\", e.g.\r\n * numbers come before letters\r\n * - Among non-nuclear chromosomes, i.e. \"MT\" (mitochondrial DNA) and\r\n * \"CP\" (chromoplast DNA), MT comes first\r\n *\r\n * @param a Chromosome string or object \"A\"\r\n * @param b Chromosome string or object \"B\"\r\n * @returns {Number} JavaScript sort order indicator\r\n */\r\n static sortChromosomes(a, b) {\r\n\r\n let [chrAName, chrBName, chrTypes] =\r\n Ideogram.getChrSortNamesAndTypes(a, b);\r\n\r\n const {\r\n aIsNuclear, bIsNuclear, aIsCP, bIsCP, aIsMT, bIsMT, aIsAP, bIsAP\r\n } = chrTypes;\r\n\r\n if (aIsNuclear && bIsNuclear) {\r\n\r\n if (isRoman(chrAName) && isRoman(chrBName)) {\r\n // As in yeast genome\r\n chrAName = parseRoman(chrAName).toString();\r\n chrBName = parseRoman(chrBName).toString();\r\n }\r\n\r\n return chrAName.localeCompare(chrBName, 'en', {numeric: true});\r\n } else if (!aIsNuclear && bIsNuclear) {\r\n return 1;\r\n } else if (aIsMT && bIsCP) {\r\n return 1;\r\n } else if (aIsCP && bIsMT) {\r\n return -1;\r\n } else if (!aIsAP && !aIsMT && !aIsCP && (bIsMT || bIsCP || bIsAP)) {\r\n return -1;\r\n }\r\n }\r\n\r\n /**\r\n * Wrapper for Ideogram constructor, with generic \"Related genes\" options\r\n *\r\n * @param {Object} config Ideogram configuration object\r\n */\r\n static initRelatedGenes(config, annotsInList='all') {\r\n return _initRelatedGenes(config, annotsInList);\r\n }\r\n\r\n /**\r\n * Wrapper for Ideogram constructor, with generic \"Related genes\" options\r\n *\r\n * @param {Object} config Ideogram configuration object\r\n */\r\n static initGeneHints(config, annotsInList='all') {\r\n return _initGeneHints(config, annotsInList);\r\n }\r\n}\r\n","var version = '1.37.0';\r\nexport default version;\r\n","import Ideogram from './ideogram';\r\n\r\n// Enable references to Ideogram when loaded via traditional script tag\r\nwindow.Ideogram = Ideogram;\r\n\r\n// Enable references to Ideogram when imported as an ES6 module\r\nexport default Ideogram;\r\n"],"names":["root","factory","exports","module","define","amd","a","i","self","__webpack_require__","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","Symbol","toStringTag","value","none","selector","this","querySelector","x","Array","from","empty","querySelectorAll","matches","childMatcher","node","find","childFirst","firstElementChild","filter","children","update","length","EnterNode","parent","datum","ownerDocument","namespaceURI","_next","_parent","__data__","bindIndex","group","enter","exit","data","groupLength","dataLength","bindKey","keyValue","nodeByKeyValue","Map","keyValues","has","set","delete","ascending","b","NaN","constructor","appendChild","child","insertBefore","next","xhtml","svg","xlink","xml","xmlns","name","prefix","indexOf","slice","namespaces","space","local","attrRemove","removeAttribute","attrRemoveNS","fullname","removeAttributeNS","attrConstant","setAttribute","attrConstantNS","setAttributeNS","attrFunction","v","apply","arguments","attrFunctionNS","defaultView","document","styleRemove","style","removeProperty","styleConstant","priority","setProperty","styleFunction","styleValue","getPropertyValue","getComputedStyle","propertyRemove","propertyConstant","propertyFunction","classArray","string","trim","split","classList","ClassList","_node","_names","getAttribute","classedAdd","names","list","n","add","classedRemove","remove","classedTrue","classedFalse","classedFunction","textRemove","textContent","textConstant","textFunction","htmlRemove","innerHTML","htmlConstant","htmlFunction","raise","nextSibling","parentNode","lower","previousSibling","firstChild","creatorInherit","uri","documentElement","createElement","createElementNS","creatorFixed","namespace","constantNull","removeChild","selection_cloneShallow","clone","cloneNode","selection_cloneDeep","parseTypenames","typenames","map","t","type","onRemove","typename","on","__on","j","m","removeEventListener","listener","options","onAdd","event","contextListener","addEventListener","push","dispatchEvent","params","window","CustomEvent","createEvent","initEvent","bubbles","cancelable","detail","dispatchConstant","dispatchFunction","join","splice","contains","Selection","groups","parents","_groups","_parents","selection","select","subgroups","subnode","subgroup","selectAll","array","arrayAll","selectorAll","selectChild","match","childFind","selectChildren","childrenFilter","matcher","bind","enterGroup","updateGroup","exitGroup","previous","i0","i1","_enter","_exit","sparse","onenter","onupdate","onexit","append","merge","order","Error","groups0","groups1","m0","m1","Math","min","merges","group0","group1","compareDocumentPosition","sort","compare","compareNode","sortgroups","sortgroup","callback","nodes","size","each","attr","getAttributeNS","property","classed","text","html","create","creator","insert","before","deep","dispatch","iterator","responseBlob","response","ok","status","statusText","blob","input","init","fetch","then","responseArrayBuffer","arrayBuffer","EOL","EOF","objectConverter","columns","Function","JSON","stringify","inferColumns","rows","columnSet","forEach","row","column","pad","width","s","delimiter","reFormat","RegExp","DELIMITER","charCodeAt","parseRows","f","N","I","eof","eol","token","c","replace","preformatBody","formatValue","formatRow","Date","date","year","hours","getUTCHours","minutes","getUTCMinutes","seconds","getUTCSeconds","milliseconds","getUTCMilliseconds","isNaN","getUTCFullYear","getUTCMonth","getUTCDate","formatDate","test","parse","convert","object","customConverter","format","concat","formatBody","formatRows","csv","dsv","csvParse","tsv","tsvParse","responseText","dsvParse","undefined","Promise","resolve","reject","image","Image","onerror","onload","src","responseJson","json","parser","DOMParser","parseFromString","noop","_","Dispatch","types","T","copy","that","args","preventDefault","stopImmediatePropagation","view","noevent","__noselect","MozUserSelect","yesdrag","noclick","setTimeout","extend","Color","darker","brighter","reI","reN","reP","reHex","reRgbInteger","reRgbPercent","reRgbaInteger","reRgbaPercent","reHslPercent","reHslaPercent","named","aliceblue","antiquewhite","aqua","aquamarine","azure","beige","bisque","black","blanchedalmond","blue","blueviolet","brown","burlywood","cadetblue","chartreuse","chocolate","coral","cornflowerblue","cornsilk","crimson","cyan","darkblue","darkcyan","darkgoldenrod","darkgray","darkgreen","darkgrey","darkkhaki","darkmagenta","darkolivegreen","darkorange","darkorchid","darkred","darksalmon","darkseagreen","darkslateblue","darkslategray","darkslategrey","darkturquoise","darkviolet","deeppink","deepskyblue","dimgray","dimgrey","dodgerblue","firebrick","floralwhite","forestgreen","fuchsia","gainsboro","ghostwhite","gold","goldenrod","gray","green","greenyellow","grey","honeydew","hotpink","indianred","indigo","ivory","khaki","lavender","lavenderblush","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrodyellow","lightgray","lightgreen","lightgrey","lightpink","lightsalmon","lightseagreen","lightskyblue","lightslategray","lightslategrey","lightsteelblue","lightyellow","lime","limegreen","linen","magenta","maroon","mediumaquamarine","mediumblue","mediumorchid","mediumpurple","mediumseagreen","mediumslateblue","mediumspringgreen","mediumturquoise","mediumvioletred","midnightblue","mintcream","mistyrose","moccasin","navajowhite","navy","oldlace","olive","olivedrab","orange","orangered","orchid","palegoldenrod","palegreen","paleturquoise","palevioletred","papayawhip","peachpuff","peru","pink","plum","powderblue","purple","rebeccapurple","red","rosybrown","royalblue","saddlebrown","salmon","sandybrown","seagreen","seashell","sienna","silver","skyblue","slateblue","slategray","slategrey","snow","springgreen","steelblue","tan","teal","thistle","tomato","turquoise","violet","wheat","white","whitesmoke","yellow","yellowgreen","color_formatHex","rgb","formatHex","color_formatRgb","formatRgb","color","l","toLowerCase","exec","parseInt","rgbn","Rgb","rgba","hsla","r","g","rgbConvert","opacity","rgb_formatHex","hex","rgb_formatRgb","max","round","toString","h","Hsl","hslConvert","hsl2rgb","m2","basis","t1","v0","v1","v2","v3","t2","t3","channels","assign","displayable","formatHsl","k","pow","nogamma","d","linear","rgbGamma","y","exponential","gamma","start","end","rgbSpline","spline","colors","genericArray","nb","na","setTime","values","floor","reA","reB","source","am","bm","bs","bi","lastIndex","q","index","number","one","zero","ArrayBuffer","isView","DataView","isArray","valueOf","sourceEvent","currentTarget","ownerSVGElement","createSVGPoint","point","clientX","clientY","matrixTransform","getScreenCTM","inverse","getBoundingClientRect","rect","left","clientLeft","top","clientTop","pageX","pageY","taskHead","taskTail","timeout","interval","clockLast","clockNow","clockSkew","clock","performance","now","setFrame","requestAnimationFrame","clearNow","Timer","_call","_time","timer","delay","time","restart","wake","e","timerFlush","t0","Infinity","sleep","nap","poke","clearTimeout","clearInterval","setInterval","elapsed","stop","TypeError","emptyOn","emptyTween","id","timing","schedules","__transition","tween","state","tick","duration","ease","schedule","active","svgNode","degrees","PI","identity","translateX","translateY","rotate","skewX","scaleX","scaleY","sqrt","atan2","atan","interpolateTransform","pxComma","pxParen","degParen","pop","xa","ya","xb","yb","translate","scale","interpolateTransformCss","DOMMatrix","WebKitCSSMatrix","isIdentity","decompose","interpolateTransformSvg","transform","baseVal","consolidate","matrix","tweenRemove","tween0","tween1","tweenFunction","tweenValue","transition","_id","interpolate","value1","string00","interpolate0","string1","string0","string10","attrInterpolate","attrInterpolateNS","attrTweenNS","_value","attrTween","delayFunction","delayConstant","durationFunction","durationConstant","easeConstant","onFunction","on0","on1","sit","every","styleInterpolate","styleTween","textInterpolate","textTween","_name","newId","selection_prototype","inherit","id0","id1","styleNull","listener0","styleMaybeRemove","removeFunction","easeVarying","cancel","interrupt","defaultTiming","BrushEvent","target","mode","defineProperties","configurable","MODE_DRAG","MODE_SPACE","MODE_HANDLE","MODE_CENTER","abs","number1","number2","X","handles","output","xy","Y","XY","cursors","overlay","w","nw","ne","se","sw","flipX","flipY","signsX","signsY","defaultFilter","ctrlKey","button","defaultExtent","hasAttribute","viewBox","height","defaultTouchable","navigator","maxTouchPoints","__brush","extent","brushSelection","dim","brushX","brushY","touchending","touchable","keys","listeners","handleSize","brush","initialize","handle","redraw","started","touchmoved","touchended","emitter","clean","emit","Emitter","touches","w0","w1","n0","n1","e0","e1","s0","s1","moving","lockX","lockY","metaKey","altKey","signX","signY","W","E","S","dx","dy","shifting","shiftKey","points","identifier","pointer","point0","pts","move","beforestart","moved","ended","keydowned","keyupped","p","changedTouches","cur","keyCode","selection0","selection1","clear","starting","keyModifiers","formatDecimalParts","toExponential","coefficient","prefixExponent","re","formatSpecifier","specifier","FormatSpecifier","fill","align","sign","symbol","comma","precision","exponent","toFixed","toLocaleString","toPrecision","formatRounded","toUpperCase","formatPrefix","prefixes","locale","grouping","thousands","Number","substring","reverse","currencyPrefix","currency","currencySuffix","decimal","numerals","formatNumerals","String","percent","minus","nan","newFormat","formatTypes","suffix","formatType","maybeSuffix","valuePrefix","valueSuffix","valueNegative","out","formatTrim","padding","defaultLocale","step","e10","e5","e2","tickIncrement","count","power","log","LN10","error","delta","lo","hi","mid","ascendingComparator","center","right","ascendingBisect","bisector","bisectRight","unit","normalize","bimap","domain","range","d0","d1","r0","r1","polymap","bisect","clamp","unknown","continuous","untransform","piecewise","rescale","invert","rangeRound","u","transformer","initRange","linearish","ticks","isFinite","ceil","tickFormat","step0","step1","tickStep","precisionPrefix","precisionRound","precisionFixed","nice","prestep","maxIter","staticColors","organismMetadata","commonName","scientificName","assemblies","default","GRCh38","GRCh37","NCBI36","hasGeneCache","hasParalogCache","hasInteractionCache","GRCm38","MGSCv37","TAIR10","R64","GCA_000002765","d3","d3fetch","d3brush","d3dispatch","d3format","assemblyIsAccession","config","assembly","getDir","dir","script","tmp","ideogramInLeaf","scripts","version","Ideogram","location","pathname","includes","fetchWithRetry","url","isRetry","getDataDir","coord","onDidRotate","chrModel","onDidRotateCallback","getSvg","fetchWithAuth","contentType","headers","Headers","accessToken","Authorization","getEarlyTaxid","slug","taxid","organism","getTaxid","organisms","getCommonName","getScientificName","isRoman","parseRoman","val","M","D","C","L","V","reduce","aa","getFont","ideo","family","fontFamily","annotLabelSize","getTextSize","font","context","canvas","getContext","metrics","measureText","actualBoundingBoxRight","actualBoundingBoxLeft","actualBoundingBoxAscent","actualBoundingBoxDescent","deepCopy","scaleLinear","valueof","configuredCss","configure","chromosomesArray","coordinateSystem","maxLength","bp","iscn","chromosomes","numChromosomes","debug","dataDir","container","resolution","orientation","showChromosomeLabels","showNonNuclearChromosomes","chromosomeScale","showTools","ploidy","sexChromosomes","sex","ancestors","P","ploidyDesc","configurePloidy","showBandLabels","showFullyBanded","bandsToShow","bandData","configureBands","chrHeight","configureHeight","chrWidth","configureWidth","geometry","chrMargin","configureMargin","onLoad","onLoadCallback","onLoadAnnots","onLoadAnnotsCallback","onDrawAnnots","onDrawAnnotsCallback","onBrushMove","onBrushMoveCallback","onBrushEnd","onBrushEndCallback","onCursorMove","onCursorMoveCallback","onWillShowAnnotTooltip","onWillShowAnnotTooltipCallback","onClickAnnot","onClickAnnotCallback","configureCallbacks","organismsWithBands","configureOrganisms","bump","adjustedBump","configureBump","chromosome","rotatable","configureSingleChromosome","chrLabelSize","chrLabelColor","configureTextStyle","initAnnotSettings","annotationsLayout","annotTracksHeight","chrSets","yOffsets","annotLabelHeight","demarcateCollinearChromosomes","prevChr","prevWidth","seenTaxids","getYOffsets","chrSet","chrLabelX","adjustedX","orgIndex","taxids","labelSpan","labelGenomes","rearrangeChromosomes","multiorganism","maxHeight","xOffsets","annotHeight","annotationHeight","numAnnotTracks","getXOffsets","adjustedY","chrLabelY","org","maxWidth","collinearizeVerticalChromosomes","processAnnots","rawAnnots","setOriginalTrackIndexes","annotationsDisplayedTracks","annots","updateDisplayedTracks","processAnnotData","filterable","initCrossFilter","drawProcessedAnnots","finishInit","t0A","getTime","confAnnots","annotations","initDrawChromosomes","annotationsPath","checkAnnotData","waitForAndProcessAnnots","chrID","t0C","t1C","hideUnshownBandLabels","console","rotateChromosomeLabels","drawChromosomeLabels","processLabels","createBrush","cursorPosition","createClickCursor","drawAnnots","afterRawAnnots","t1A","reportDebugTimings","setOverflowScroll","collinearizeChromosomes","Ploidy","_config","_description","_normalize","getChromosomesNumber","setIndex","chrSetCode","description","descValue","normalized","existence","_getexistenceArray","getSetSize","chrSetIndex","getAncestor","chrIndex","exists","armIndex","desc","ChromosomeUtil","getLabel","getSetLabel","_ideo","_ploidy","_translate","chrSetMargin","_tickSize","_isRotated","_getLeftMargin","margin","_getYScale","getChromosomeLabels","chrElement","util","labels","getChromosomeBandLabelTranslate","band","tickSize","px","didRotate","chrName","bands","oldWidth","chrSetElement","getChromosomeModel","drawChromosome","handleRotateOnClick","displayedTrackIndexes","drawBandLabels","otherChrs","ideoBounds","labelSelectors","chrHeightOriginal","chrWidthOriginal","annotationHeightOriginal","rotateBack","_layout","rotateForward","elementLength","windowLength","_class","innerWidth","innerHeight","getChromosomeLabelClass","_getAdditionalOffset","numTracks","annotationsNumTracks","_getChromosomeSetSize","getChromosomeSetLabelAnchor","getChromosomeLabelYPosition","getChromosomeSetLabelYPosition","Layout","super","getChromosomeScale","getChromosomeScaleBack","getChromosomeSetTranslate","getHeight","getWidth","getChromosomeBandTickY1","getChromosomeBandTickY2","getChromosomeSetLabelTranslate","getChromosomeBandLabelAnchor","ideoBox","chrBox","getChromosomeSetYTranslate","barWidth","legendPad","prevTranslate","getChromosomeSetLabelXPosition","getChromosomeLabelXPosition","xOffset","lastSetOffset","setSize","chromosomeSetYTranslate","chrs","numChrs","chrsPerRow","yOffset","additionalPadding","writeContainer","fetchAnnots","setPloidy","perspective","PairedLayout","SmallLayout","VerticalLayout","HorizontalLayout","getLayout","svgClass","getContainerSvgClass","getBandColorGradients","writeContainerDom","isOnlyIdeogram","writeTooltipContainer","lastBandDataUrl","getBandUrl","bandDataFileNames","isHeterogameticChromosome","prepareChromosomes","bandsArray","setCoordinateSystem","chrBands","chr","setSexChromosomes","_gotChrModels","element","rotateAndToggleDisplay","getBandFileName","accession","bandFileName","getBandFileNames","bandFileNames","isCustomOrganism","prepareContainer","bandDataUrl","hasNonGenBankAssembly","shouldFetchBands","numBandDataResponses","rawBands","fileNames","fetchedTaxid","fileName","setBandData","fetchBands","processBandData","ideoNext","ideoQueued","ideoWait","containerId","getOrganismFromEutils","getTaxids","initializeTaxids","organismScientificName","promises","all","taxidsAndBandsArrays","taxidAndBandsArray","getBandsAndPrepareContainer","BedParser","bed","parseBed","componentToHex","parseGenomicCoordinates","ucscStyle","parseAnnotFromTsvLine","tsvLine","annot","label","rgbToHex","parseRawAnnots","bedStartIndex","tsvLines","line","TsvParser","parseTsv","getValueColumnIndex","headerLine","header","fullName","significance","citations","tsvStartIndex","citeIndex","fromTo","annotsByChr","reservedTrackKeys","defaultHeatmapColors","getLabels","heatmaps","metadata","trackLabels","inflateThresholds","thresholds","heatmapThresholds","shouldUseThresholdColor","numThresholds","prevThreshold","threshold","getHeatmapAnnotColor","thresholdList","tvNum","thresholdColor","parseFloat","writeCanvases","chrLeft","trackLeft","trackWidth","contextArray","fillCanvasAnnots","demarcateChrs","trackIndex","fillStyle","startPx","fillRect","fillCanvasAnnotValues","ideoMarginTop","add2dAnnotsForChr","omittedAnnots","ra","stopPx","convertBpToPx","shift","startHideTrackLabelTimeout","showTrackLabel","hideTrackLabelTimeout","ideoHeight","drawHeatmaps","annotContainers","prevX","xBump","showChromosomesLabels","labelContainer","markBump","renderTrackLabels","writeTrackLabels","drawHeatmapsCollinear","writeCanvas","drawHeatmaps2d","writeTrackLabelContainer","trackCanvas","firstTrackId","trackBox","labelBox","getTrackLabelOffsets","getNewRawAnnots","heatmapKeyIndexes","newRa","newRas","deserializeAnnotsForHeatmap","rawAnnotsContainer","newRaContainers","heatmapKey","rawAnnotBoxes","raContainer","getNewRawAnnotContainers","reportPerformance","hideAnnotTooltip","startHideAnnotTooltipTimeout","showAnnotTooltip","hideAnnotTooltipTimeout","isTooltipCooling","hideAnnotTooltipCounter","prevClickedAnnot","content","tooltip","cx","cy","prevTooltipAnnotName","displayCoordinates","displayName","getContentAndYOffset","renderTooltip","getAnnotDomLabelId","domId","changeAnnotState","labelId","annotId","triggerAnnotEvent","annotElement","parentElement","prevTooltipOff","prevTooltipAnnotDomId","_ideoActiveTimeout","getAnnotByName","annotName","found","thisAnnot","getAnnotLabelLayout","annotDom","annotRect","ideoRect","bottom","addAnnotLabel","backgroundColor","borderColor","layout","didSetLabelStyle","insertAdjacentHTML","renderLabel","fillAnnotLabels","sortedAnnots","clearAnnotLabels","spacedAnnots","spacedLayouts","flattenAnnots","some","sl","xOverlap","oLeft","nLeft","oRight","nRight","getIsXOverlap","yOverlap","oTop","nTop","oBottom","nBottom","getIsYOverlap","numLabels","relatedGenesMode","annotSortFunction","removeAnnotLabel","getHistogramBars","chrModels","bars","isFirstGet","histogramScaling","setIdeoHistogramScaling","maxAnnotsPerBar","lastBand","numBins","bar","convertPxToBp","annotationsColor","getRawBars","chrAnnots","barAnnots","barPx","nextBarPx","assignAnnotsToBars","maxAnnotsPerBarAllChrs","barCount","setIdeoMaxAnnotsPerBar","barCountRatio","ideoIsRotated","setProportionalBarHeight","reportGetHistogramBarPerformance","legendStyle","getIcon","icon","shape","getListItems","nameHeight","lineHeight","getLineHeight","writeLegend","legend","nameStyle","lineHeightCss","friendlyAnnots","keep","isOtherLayout","rawAnnot","parseFriendlyAnnots","parseFriendlyKeys","processedAnnots","annotsOther","chrAnnot","numAnnots","warn","warnIfTooManyAnnots","filledAnnots","getChrAnnotNodes","fillAnnots","shapes","triangle","circle","rectangle","getShapes","determineShape","writeTrackAnnots","x1","x2","writeOverlayAnnots","chrWidths","y1","y2","thisChrWidth","getHistogramPoints","writeHistogramAnnots","drawAnnotsByLayoutType","writeSyntenicRegion","syntenies","regionID","activeRegion","others","writeSyntenicRegionPolygons","syntenicRegion","r2","regions","writeSyntenicRegionPolygonsHorizontal","getRegionsR1AndR2","r1Offset","r2Offset","r1ChrDom","r1GenomeHorizontalXOffset","getCTM","r1GenomeVerticalXOffset","r2ChrDom","r2GenomeHorizontalXOffset","r2GenomeVerticalXOffset","writeSyntenicRegionLines","stroke","writeSyntenicRegionLabels","regionId","rangeIds","r1Width","drawSynteny","syntenicRegions","writeSyntenicRegions","drawSyntenyCollinear","drawSyntenyCollinearHorizontal","restoreDefaultTracks","trackIndexes","displayedRawAnnotsByChr","displayedAnnots","getDisplayedRawAnnotsByChr","setAnnotsByChr","setAnnots","trackIndexOriginal","numAvailTracks","getSetAnnotsByChr","colorMap","addAnnot","annotationTracks","annotTrack","addClientAnnot","addSparseServerAnnot","addBasicClientAnnot","getAnnotDomId","annotIndex","addAnnotsForChr","shouldAssignDomId","setAnnotRanks","warnOfUndefinedChromosome","addAnnots","unorderedAnnots","orderAnnotContainers","numOmittedTracks","sendTrackAndAnnotWarnings","ExpressionMatrixParser","setRawAnnots","fetchCoordinates","coordinates","parseExpressionMatrix","ensemblData","gene","expressions","cells","downloadAnnotations","annotDescriptions","ensemblId","annotsTsv","annotsHref","encodeURIComponent","evt","MouseEvent","body","initAnnotHeight","localAnnotationsPath","initNumTracksAndBarWidth","initTooltip","onWillAddAnnotLabel","onWillAddAnnotLabelCallback","initAnnotLabel","sortChromosomes","displayedTracks","inflateHeatmaps","seen","duplicates","detectDuplicateChrsInRawAnnots","accumulator","annotsUrl","is2dHeatmap","extension","alert","validateAnnotsUrl","rawAnnotsResponse","chrArray","ranks","geneCache","interestingNames","rank","highlight","chrNames","highlightsHtml","chrId","chrDom","unhighlight","highlightsSelector","getTaxidFromEutils","orgName","taxonomySearch","esearch","esearchresult","idlist","esummary","result","commonname","setAssemblyAndChromosomes","originalChrs","filteredChrs","urlOrg","getAssemblyAndChromosomesFromEutils","chromosomesUrl","promise2","catch","errorMessage","chrData","splitBand","asmAndChrTaxidsArray","seenChrs","setTaxidData","asmChrTaxidsArray","isOrganismSupported","ideoOrg","getTaxidsForOrganismsInConfig","tmpChrs","chrsOrgSlugs","orgs","promise","getTaxidFromEutilsPromises","augmentedOrganismMetadata","orgNameAndTaxid","warning","customMetadata","populateNonNativeOrg","orgMetadata","orgFields","prepareTmpChrsAndTaxids","asmAccs","asmAndChrPromises","configOrganisms","sortedTaxids","sortTaxidsByOriginalOrganismOption","taxidInit","getIsMultiorganism","getTaxidsForOrganismsNotInConfig","parseChromosome","genome","cnIndex","subtype","subname","parseMitochondrion","parseChloroplastOrPlastid","parseApicoplast","substr","parseNuclear","getChrNameAndType","slen","assemblyAccession","asmSearchUrl","termStem","getAssemblySearchUrl","asmUid","asmSummaryUrl","fetchAssemblySummary","uids","qs","elink","webenv","linksets","getESearchUrlForChromosomes","esearchUrl","ids","ntSummary","fetchNucleotideSummary","results","seenChrId","parseChromosomes","rejectedReason","getPrevRight","prevLabelXRight","prevHiddenBoxIndex","textOffsets","updateShown","indexesToShow","overlapRight","prevRight","isBefore","hiddenIndex","doSkip","getIndexesToShow","offsets","textsLength","setBandsToShow","selectorsToShow","ithLength","drawBandLabelText","bandsToLabel","drawBandLabelStalk","getChrModels","getStainAndColors","gradients","stain","color1","color2","color3","getGradients","updateLines","lines","getStain","getLineObject","shouldSkipBand","chrsAreList","chrNotInList","thisChr","getBandsArray","bandsByChr","chrLength","setChromosomesByTaxid","chrBandsArray","updateChromosomes","getDelimiterTsvLinesAndInit","parseBands","setChrsByTaxidsWithBands","to","chrLengthBp","bpDomain","pxRange","nameSplit","fromToSplit","refineGenomicCoordinates","cm","getChrModel","getBasePairDomainAndPixelRange","xScale","selectedRegion","setBrush","setSelectedRegion","x0","writeBrush","position","cursorBrush","setCursorPosition","newPosition","offsetX","setCursor","drawSexChromosomes","sexChromosomeIndexes","sciLength","sci","homologIndex","appendHomolog","sexChrs","iscnStart","iscnLength","bpStart","bpStop","bpLength","pxStart","pxLength","getPx","throwBpToPxError","getBp","iscnStop","pxStop","throwPxToBpError","array8","arrayUntyped","array16","array32","arrayLengthen","arrayLengthenUntyped","arrayWiden","arrayWidenUntyped","bitarray","subarrays","masks","Uint8Array","Uint16Array","Uint32Array","lengthen","len","offset","dest","truncate","zeroExcept","zeroExceptMask","mask","only","onlyExcept","onlyOffset","onlyOne","heap_by","heap","sift","by","heapselect_by","queue","bisect_by","reg","path","REMOVED_INDEX","crossfilter","heapselect","permute","filters","removeData","dimension","groupAll","allFiltered","onChange","isElementFiltered","filterListeners","dataListeners","removeDataListeners","callbacks","newData","triggerOnChange","predicate","newIndex","removed","usePred","shouldRemove","index1","index2","index3","index4","maskForDimensions","dimensions","ignore_dimensions","iterable","accessorPath","newValues","iterablesIndexCount","iterablesIndexFilterStatus","refilterFunction","filterValue","filterValuePresent","filterAll","filterRange","filterFunction","filterExact","currentFilter","hasCurrentFilter","top_offset","hi0","toSkip","lo0","iterablesEmptyRows","bottom_offset","orderNatural","dispose","accessor","sortRange","cr_range","A","B","refilter","indexListeners","dimensionGroups","unshift","preAdd","postAdd","newIterablesIndexCount","newIterablesIndexFilterStatus","cr_index","unsortedIndex","sortMap","bounds","lo1","hi1","old_n0","oldValues","oldIndex","oldIterablesIndexFilterStatus","oldiiclength","index5","reIndex","oldDataIndex","filterIndexBounds","filterIndexFunction","added","valueIndexAdded","valueIndexRemoved","newAdded","newRemoved","indexLength","reduceCount","reduceSum","groupIndex","reduceAdd","reduceRemove","reduceInitial","n0old","groupWidth","groupCapacity","capacity","reset","resetNeeded","g0","oldGroups","initial","k0","groupIncrement","updateMany","resetMany","updateOne","resetOne","oldK","seenGroups","filterOne","filterOffset","notFilter","reduceValue","cb","eventName","unpackAnnots","unpackedAnnots","packAnnots","facet","annotsByFacet","facets","filterAnnots","filterSelections","filteredAnnots","selections","counts","fn","getFilteredResults","getChromosomePixels","hasBands","csLength","cs","pcenIndex","getPixelAndOtherData","getChrScale","getChrModelScaffold","fullChromosomeLabels","centromerePosition","firstBand","smallLength","getCentromerePosition","deleteExtraneousBands","deactivate","items","item","closeTools","display","handleToolClick","toolHeaders","toolHeader","trigger","getTrigger","tool","panel","getPanel","toElement","toId","panelElement","handleHideForHoverables","ideoSvg","canvasId","ideoSvgClone","getElementById","ctx","setTransform","imageSmoothingEnabled","XMLSerializer","serializeToString","domUrl","URL","webkitURL","img","svgBlob","Blob","createObjectURL","imgUrl","drawImage","revokeObjectURL","toDataURL","downloadPng","closeButton","initTools","elements","outsideClickListener","clickedOutsideCount","removeClickListener","hideOnClickOutside","handleGearClick","gear","showGearOnIdeogramHover","ModelAdapter","model","_model","ModelNoBandsAdapter","getModel","getCssClass","isMT","getArmColor","armColors","_getPolyploidArmColor","getBorderColor","chrBorderColor","getFillColor","chrFillColor","arm","centromere","ancestor","Range","_data","getColor","_getColor","Chromosome","adapter","_adapter","_color","_bumpCoefficient","TelocentricPChromosome","TelocentricQChromosome","MetacentricChromosome","_addPArmShape","clipPath","isPArmRendered","_getPArmShape","_addQArmShape","isQArmRendered","_getQArmShape","render","isFullyBanded","centromereFill","_renderArm","_renderRangeSet","fillColor","class","strokeWidth","rangeSet","rangesContainer","_getShapeData","firstQBand","rightTerminalPosition","x3","x2b","_renderBands","Boolean","_pArmOffset","_qArmOffset","homologOffset","defs","getInstance","numChrsInSet","chrSetSelector","ideoWidth","ideoInnerWrap","ideoMiddleWrap","ploidyPad","textElement","getChrSetLabelLines","fullLabels","renderChromosomeSetLabel","appendChromosomeSetLabels","appendChromosomeLabels","labelPosAttrs","scaleSvg","getLabelPositionAttrs","chrMargin2","updateChrIndex","rotateVerticalChromosomeLabels","tracksHeight","rotateHorizontalChromosomeLabels","u8","u16","u32","fleb","fdeb","clim","freb","eb","_a","fl","revfl","_b","fd","rev","hMap","cd","mb","co","le","rvb","sv","r_1","flt","fdt","bits","bits16","slc","BYTES_PER_ELEMENT","subarray","ec","err","ind","msg","nt","code","captureStackTrace","inflt","dat","buf","st","noBuf","noSt","cbuf","bl","nbuf","final","pos","bt","lm","dm","lbt","dbt","tbts","flrm","fdrm","hLit","hcLen","tl","ldt","clt","clb","clbmsk","clm","lt","dt","lms","dms","lpos","sym","dsym","et","gunzipSync","flg","zs","gzs","unzlibSync","decompressSync","inflateSync","td","TextDecoder","decode","stream","strFromU8","latin1","fromCharCode","dutf8","timeDiff","initAnalyzeRelatedGenes","rg","_didRelatedGenesFirstPlot","getRelatedGenesByType","relatedGenes","related","paralogous","interacting","searched","entries","entry","getRelatedGenesTooltipAnalytics","timeSincePrevTooltip","prevAnnotDomId","tooltipGene","tooltipRelatedType","countsByType","getCountsByType","numRelatedGenes","numParalogs","numInteractingGenes","searchedGene","perfTimes","getEnsemblId","ensemblPrefix","slimEnsemblId","padLength","padStart","async","cacheFetch","decompressedUrl","cache","rawResponse","decompressedResponse","Response","put","initGeneCache","cacheDir","startTime","parseOrgMetadata","caches","open","cacheUrl","getCacheUrl","fetchStartTime","fetchEndTime","nameCaseMap","namesById","fullNamesById","idsByName","idsByFullName","lociByName","lociById","rawTsv","preAnnots","rawTsvSplit","rawStart","rawLength","rawFullName","decodeURIComponent","locus","parseCacheLoop","annotsSortedByPosition","parseAnnots","parseCache","total","initParalogCache","paralogCache","paralogsByName","geneSlimId","paralogs","paralogSuperList","geneId","slimEnsemblIds","slimId","initInteractionCache","hasinteractionCache","interactionCache","interactionsByName","rawJson","desluggedOrg","ixnLists","compressedIxn","slimPwId","fields","species","queueMicrotask","interactionArrowMap","getIxnTypeReference","ixnsByPwid","ixns","ixnType","getMatches","gpml","genes","matchedLabel","textLabel","graphId","groupRef","geneGraphIds","groupSelectors","ggr","geneGroups","groupId","geneGroupGraphIds","parseNameAndEnsemblIdFromMgiGene","genomic_pos","ensemblgene","throwGeneNotFound","geneSymbol","fetchGenes","queryStringBase","hits","isSymbol","locusMap","nameMap","nameLc","hit","fetchGenesFromCache","fromGeneCache","queryString","fetchMyGeneInfo","fetchInteractionAnnots","interactions","symbols","parseAnnotFromMgiGene","descriptionObj","pathwayIds","pathwayNames","ixnsDescription","links","ixn","pathwayId","describeInteractions","mergeDescriptions","pathwayIdsByInteractingGene","descObj","gpmlsByInteractingGene","ixnGene","gpmlUrl","rawGpml","fetchGpml","fetchGpmls","getGenomicPos","genomicPos","moveLegend","ideoInnerDom","setRelatedDecorPad","prepend","processInteractions","seenNameIds","orgNameSimple","upperGene","uint8Array","interaction","rawIxns","sortedRawIxns","sortAnnotsByRank","rawIxn","normRawIxn","nameId","isRelevant","isGeneSymbol","maybeGeneSymbol","isInteractionRelevant","fetchInteractions","relatedAnnots","finishPlotRelatedGenes","processParalogs","homologs","nameUc","fetchEnsembl","homologies","ensemblIds","homolog","fetchParalogPositionsFromMyGeneInfo","fetchParalogs","showParalogNeighborhoods","neighborhoods","starts","startJInt","overlayAnnotLength","getSearchedFromDescriptions","neighborhoodAnnots","neighborhood","annotStart","annotStop","paralog","overplotParalogs","sortByRelatedType","aName","bName","aColor","bColor","mergedDesc","descriptions","otherDesc","mergeAnnots","unmergedAnnots","seenAnnots","mergedAnnots","mergedAnnot","updated","sortedChrNames","seenNames","relevanceSortedAnnotsNamesByChr","annotNames","setRelatedAnnotDomIds","annotsInList","includedAnnots","applyAnnotsIncludeList","onFindRelatedGenesCallback","showAnnotLabels","otherType","numThisRelated","numOtherRelated","timestampFirstPlot","totalLastPlotDiff","totalFirstPlot","_relatedGenesFirstPlotType","analyzePlotTimes","adjustPlaceAndVisibility","ideoContainerDom","visibility","marginLeft","marginRight","overflowY","didAdjustIdeogramLegend","ideoDom","legendWidth","minWidth","plotRelatedGenes","plotGeneHints","headerTitle","href","initAnnotDescriptions","annotSel","el","cursor","oldDesc","processSearchedGene","relatedLegend","timeTotal","timeTotalFirstPlot","timeTotalLastPlotDiff","timeParalogs","timeInteractingGenes","timeSearchedGene","firstPlotType","analytics","relatedGenesAnalytics","analyzeRelatedGenes","onPlotRelatedGenesCallback","decorateRelatedGene","gpmls","summary","interactingGene","searchedGeneGraphIds","interactingGeneGraphIds","ie","matchingGraphIds","graphIds","graphicsXml","graphic","endGraphRefs","numMatchingPoints","isConnectedToSourceGene","searchedGeneIndex","nodeName","graphRef","arrowHead","isStart","parseInteractionGraphic","detailInteractions","detailAllInteractions","enrichedIxns","isSameByPwid","isSame","isDirectionSameByPwid","isDirectionSame","directionsByPwid","ixnTypeReference","pwid","isRefMatch","thisIsSame","thisIxnTypeReference","determineIxnsInPathwayAreSame","setIsSame","leftTypes","rightTypes","directedTypes","firstIxnType","directionReference","isPwDirectionSame","pwFirstIxnType","pwDirectionReference","direction","summarizeByDirection","summarizeInteractions","oldSummary","fullNameAndRank","originalDisplay","sortedParalogs","firstRanked","title","addedTooltipClickHandler","geneDom","annotByName","handleTooltipClick","legendHeaderStyle","citedLegend","kitConfig","eutils","_fetch","method","chrAName","chrBName","aIsCP","bIsCP","aIsMT","bIsMT","aIsAP","bIsAP","aIsNuclear","bIsNuclear","chrTypes","getChrSortNamesAndTypes","localeCompare","numeric","kitDefaults","clientFn","defaultFunction","newFunction","ideogram","onPlotRelatedGenes","onFindRelatedGenes","getTooltipAnalytics","_initRelatedGenes","annotsPath","_initGeneHints"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"ideogram.min.js","mappings":"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","sources":["webpack://ideogram/webpack/universalModuleDefinition","webpack://ideogram/webpack/bootstrap","webpack://ideogram/webpack/runtime/define property getters","webpack://ideogram/webpack/runtime/hasOwnProperty shorthand","webpack://ideogram/webpack/runtime/make namespace object","webpack://ideogram/./node_modules/d3-selection/src/selector.js","webpack://ideogram/./node_modules/d3-selection/src/array.js","webpack://ideogram/./node_modules/d3-selection/src/selectorAll.js","webpack://ideogram/./node_modules/d3-selection/src/matcher.js","webpack://ideogram/./node_modules/d3-selection/src/selection/selectChild.js","webpack://ideogram/./node_modules/d3-selection/src/selection/selectChildren.js","webpack://ideogram/./node_modules/d3-selection/src/selection/sparse.js","webpack://ideogram/./node_modules/d3-selection/src/selection/enter.js","webpack://ideogram/./node_modules/d3-selection/src/constant.js","webpack://ideogram/./node_modules/d3-selection/src/selection/data.js","webpack://ideogram/./node_modules/d3-selection/src/selection/sort.js","webpack://ideogram/./node_modules/d3-selection/src/namespaces.js","webpack://ideogram/./node_modules/d3-selection/src/namespace.js","webpack://ideogram/./node_modules/d3-selection/src/selection/attr.js","webpack://ideogram/./node_modules/d3-selection/src/window.js","webpack://ideogram/./node_modules/d3-selection/src/selection/style.js","webpack://ideogram/./node_modules/d3-selection/src/selection/property.js","webpack://ideogram/./node_modules/d3-selection/src/selection/classed.js","webpack://ideogram/./node_modules/d3-selection/src/selection/text.js","webpack://ideogram/./node_modules/d3-selection/src/selection/html.js","webpack://ideogram/./node_modules/d3-selection/src/selection/raise.js","webpack://ideogram/./node_modules/d3-selection/src/selection/lower.js","webpack://ideogram/./node_modules/d3-selection/src/creator.js","webpack://ideogram/./node_modules/d3-selection/src/selection/insert.js","webpack://ideogram/./node_modules/d3-selection/src/selection/remove.js","webpack://ideogram/./node_modules/d3-selection/src/selection/clone.js","webpack://ideogram/./node_modules/d3-selection/src/selection/on.js","webpack://ideogram/./node_modules/d3-selection/src/selection/dispatch.js","webpack://ideogram/./node_modules/d3-selection/src/selection/index.js","webpack://ideogram/./node_modules/d3-selection/src/selection/select.js","webpack://ideogram/./node_modules/d3-selection/src/selection/selectAll.js","webpack://ideogram/./node_modules/d3-selection/src/selection/filter.js","webpack://ideogram/./node_modules/d3-selection/src/selection/exit.js","webpack://ideogram/./node_modules/d3-selection/src/selection/join.js","webpack://ideogram/./node_modules/d3-selection/src/selection/merge.js","webpack://ideogram/./node_modules/d3-selection/src/selection/order.js","webpack://ideogram/./node_modules/d3-selection/src/selection/call.js","webpack://ideogram/./node_modules/d3-selection/src/selection/nodes.js","webpack://ideogram/./node_modules/d3-selection/src/selection/node.js","webpack://ideogram/./node_modules/d3-selection/src/selection/size.js","webpack://ideogram/./node_modules/d3-selection/src/selection/empty.js","webpack://ideogram/./node_modules/d3-selection/src/selection/each.js","webpack://ideogram/./node_modules/d3-selection/src/selection/append.js","webpack://ideogram/./node_modules/d3-selection/src/selection/datum.js","webpack://ideogram/./node_modules/d3-selection/src/selection/iterator.js","webpack://ideogram/./node_modules/d3-selection/src/select.js","webpack://ideogram/./node_modules/d3-fetch/src/blob.js","webpack://ideogram/./node_modules/d3-fetch/src/buffer.js","webpack://ideogram/./node_modules/d3-dsv/src/dsv.js","webpack://ideogram/./node_modules/d3-dsv/src/csv.js","webpack://ideogram/./node_modules/d3-dsv/src/tsv.js","webpack://ideogram/./node_modules/d3-fetch/src/text.js","webpack://ideogram/./node_modules/d3-fetch/src/dsv.js","webpack://ideogram/./node_modules/d3-fetch/src/image.js","webpack://ideogram/./node_modules/d3-fetch/src/json.js","webpack://ideogram/./node_modules/d3-fetch/src/xml.js","webpack://ideogram/./node_modules/d3-dispatch/src/dispatch.js","webpack://ideogram/./node_modules/d3-drag/src/noevent.js","webpack://ideogram/./node_modules/d3-drag/src/nodrag.js","webpack://ideogram/./node_modules/d3-color/src/define.js","webpack://ideogram/./node_modules/d3-color/src/color.js","webpack://ideogram/./node_modules/d3-interpolate/src/basis.js","webpack://ideogram/./node_modules/d3-interpolate/src/constant.js","webpack://ideogram/./node_modules/d3-interpolate/src/color.js","webpack://ideogram/./node_modules/d3-interpolate/src/rgb.js","webpack://ideogram/./node_modules/d3-interpolate/src/array.js","webpack://ideogram/./node_modules/d3-interpolate/src/date.js","webpack://ideogram/./node_modules/d3-interpolate/src/number.js","webpack://ideogram/./node_modules/d3-interpolate/src/object.js","webpack://ideogram/./node_modules/d3-interpolate/src/basisClosed.js","webpack://ideogram/./node_modules/d3-interpolate/src/string.js","webpack://ideogram/./node_modules/d3-interpolate/src/numberArray.js","webpack://ideogram/./node_modules/d3-interpolate/src/value.js","webpack://ideogram/./node_modules/d3-selection/src/pointer.js","webpack://ideogram/./node_modules/d3-selection/src/sourceEvent.js","webpack://ideogram/./node_modules/d3-timer/src/timer.js","webpack://ideogram/./node_modules/d3-timer/src/timeout.js","webpack://ideogram/./node_modules/d3-transition/src/transition/schedule.js","webpack://ideogram/./node_modules/d3-transition/src/interrupt.js","webpack://ideogram/./node_modules/d3-interpolate/src/transform/decompose.js","webpack://ideogram/./node_modules/d3-interpolate/src/transform/parse.js","webpack://ideogram/./node_modules/d3-interpolate/src/transform/index.js","webpack://ideogram/./node_modules/d3-transition/src/transition/tween.js","webpack://ideogram/./node_modules/d3-transition/src/transition/interpolate.js","webpack://ideogram/./node_modules/d3-transition/src/transition/attr.js","webpack://ideogram/./node_modules/d3-transition/src/transition/attrTween.js","webpack://ideogram/./node_modules/d3-transition/src/transition/delay.js","webpack://ideogram/./node_modules/d3-transition/src/transition/duration.js","webpack://ideogram/./node_modules/d3-transition/src/transition/ease.js","webpack://ideogram/./node_modules/d3-transition/src/transition/on.js","webpack://ideogram/./node_modules/d3-transition/src/transition/selection.js","webpack://ideogram/./node_modules/d3-transition/src/transition/style.js","webpack://ideogram/./node_modules/d3-transition/src/transition/styleTween.js","webpack://ideogram/./node_modules/d3-transition/src/transition/textTween.js","webpack://ideogram/./node_modules/d3-transition/src/transition/index.js","webpack://ideogram/./node_modules/d3-transition/src/transition/select.js","webpack://ideogram/./node_modules/d3-transition/src/transition/selectAll.js","webpack://ideogram/./node_modules/d3-transition/src/transition/filter.js","webpack://ideogram/./node_modules/d3-transition/src/transition/merge.js","webpack://ideogram/./node_modules/d3-transition/src/transition/transition.js","webpack://ideogram/./node_modules/d3-transition/src/transition/text.js","webpack://ideogram/./node_modules/d3-transition/src/transition/remove.js","webpack://ideogram/./node_modules/d3-transition/src/transition/easeVarying.js","webpack://ideogram/./node_modules/d3-transition/src/transition/end.js","webpack://ideogram/./node_modules/d3-transition/src/selection/transition.js","webpack://ideogram/./node_modules/d3-ease/src/cubic.js","webpack://ideogram/./node_modules/d3-transition/src/selection/index.js","webpack://ideogram/./node_modules/d3-transition/src/selection/interrupt.js","webpack://ideogram/./node_modules/d3-brush/src/constant.js","webpack://ideogram/./node_modules/d3-brush/src/event.js","webpack://ideogram/./node_modules/d3-brush/src/noevent.js","webpack://ideogram/./node_modules/d3-brush/src/brush.js","webpack://ideogram/./node_modules/d3-format/src/formatDecimal.js","webpack://ideogram/./node_modules/d3-format/src/exponent.js","webpack://ideogram/./node_modules/d3-format/src/formatSpecifier.js","webpack://ideogram/./node_modules/d3-format/src/formatPrefixAuto.js","webpack://ideogram/./node_modules/d3-format/src/formatRounded.js","webpack://ideogram/./node_modules/d3-format/src/formatTypes.js","webpack://ideogram/./node_modules/d3-format/src/identity.js","webpack://ideogram/./node_modules/d3-format/src/locale.js","webpack://ideogram/./node_modules/d3-format/src/defaultLocale.js","webpack://ideogram/./node_modules/d3-format/src/formatGroup.js","webpack://ideogram/./node_modules/d3-format/src/formatNumerals.js","webpack://ideogram/./node_modules/d3-format/src/formatTrim.js","webpack://ideogram/./node_modules/d3-format/src/precisionFixed.js","webpack://ideogram/./node_modules/d3-format/src/precisionPrefix.js","webpack://ideogram/./node_modules/d3-format/src/precisionRound.js","webpack://ideogram/./node_modules/d3-array/src/ticks.js","webpack://ideogram/./node_modules/d3-array/src/ascending.js","webpack://ideogram/./node_modules/d3-array/src/bisector.js","webpack://ideogram/./node_modules/d3-array/src/bisect.js","webpack://ideogram/./node_modules/d3-array/src/number.js","webpack://ideogram/./node_modules/d3-interpolate/src/round.js","webpack://ideogram/./node_modules/d3-scale/src/number.js","webpack://ideogram/./node_modules/d3-scale/src/continuous.js","webpack://ideogram/./node_modules/d3-scale/src/constant.js","webpack://ideogram/./node_modules/d3-scale/src/init.js","webpack://ideogram/./node_modules/d3-scale/src/linear.js","webpack://ideogram/./node_modules/d3-scale/src/tickFormat.js","webpack://ideogram/./src/js/init/organism-metadata.js","webpack://ideogram/./src/js/bands/styles.js","webpack://ideogram/./src/js/lib.js","webpack://ideogram/./node_modules/d3-selection/src/selectAll.js","webpack://ideogram/./node_modules/d3-array/src/max.js","webpack://ideogram/./src/js/init/configure.js","webpack://ideogram/./src/js/collinear-vertical.js","webpack://ideogram/./src/js/collinear.js","webpack://ideogram/./src/js/init/finish-init.js","webpack://ideogram/./src/js/ploidy.js","webpack://ideogram/./src/js/views/chromosome-util.js","webpack://ideogram/./src/js/layouts/layout.js","webpack://ideogram/./src/js/layouts/vertical-layout.js","webpack://ideogram/./src/js/layouts/horizontal-layout.js","webpack://ideogram/./src/js/layouts/paired-layout.js","webpack://ideogram/./src/js/layouts/small-layout.js","webpack://ideogram/./src/js/init/write-container.js","webpack://ideogram/./src/js/layouts/layout-adapter.js","webpack://ideogram/./src/js/bands/fetch.js","webpack://ideogram/./src/js/init/init.js","webpack://ideogram/./src/js/parsers/bed-parser.js","webpack://ideogram/./src/js/parsers/tsv-parser.js","webpack://ideogram/./src/js/annotations/heatmap-lib.js","webpack://ideogram/./src/js/annotations/heatmap-collinear.js","webpack://ideogram/./src/js/annotations/heatmap-2d.js","webpack://ideogram/./src/js/annotations/track-labels.js","webpack://ideogram/./src/js/annotations/heatmap.js","webpack://ideogram/./src/js/annotations/track-labels-collinear.js","webpack://ideogram/./src/js/annotations/events.js","webpack://ideogram/./src/js/annotations/labels.js","webpack://ideogram/./src/js/annotations/histogram.js","webpack://ideogram/./src/js/annotations/legend.js","webpack://ideogram/./src/js/annotations/draw.js","webpack://ideogram/./src/js/annotations/synteny-lib.js","webpack://ideogram/./src/js/annotations/synteny-collinear.js","webpack://ideogram/./src/js/annotations/synteny-collinear-horizontal.js","webpack://ideogram/./src/js/annotations/synteny.js","webpack://ideogram/./src/js/annotations/filter.js","webpack://ideogram/./src/js/annotations/process.js","webpack://ideogram/./src/js/parsers/expression-matrix-parser.js","webpack://ideogram/./src/js/annotations/download.js","webpack://ideogram/./src/js/annotations/annotations.js","webpack://ideogram/./src/js/annotations/highlight.js","webpack://ideogram/./src/js/services/organisms.js","webpack://ideogram/./src/js/services/services.js","webpack://ideogram/./src/js/services/eutils-config.js","webpack://ideogram/./src/js/bands/show.js","webpack://ideogram/./src/js/bands/draw.js","webpack://ideogram/./src/js/bands/parse.js","webpack://ideogram/./src/js/bands/bands.js","webpack://ideogram/./src/js/brush.js","webpack://ideogram/./src/js/cursor.js","webpack://ideogram/./src/js/sex-chromosomes.js","webpack://ideogram/./src/js/coordinate-converters.js","webpack://ideogram/./node_modules/crossfilter2/src/array.js","webpack://ideogram/./node_modules/crossfilter2/src/filter.js","webpack://ideogram/./node_modules/crossfilter2/src/identity.js","webpack://ideogram/./node_modules/crossfilter2/src/null.js","webpack://ideogram/./node_modules/crossfilter2/src/zero.js","webpack://ideogram/./node_modules/crossfilter2/src/heap.js","webpack://ideogram/./node_modules/crossfilter2/src/heapselect.js","webpack://ideogram/./node_modules/crossfilter2/src/bisect.js","webpack://ideogram/./node_modules/crossfilter2/src/permute.js","webpack://ideogram/./node_modules/crossfilter2/src/reduce.js","webpack://ideogram/./node_modules/crossfilter2/src/result.js","webpack://ideogram/./node_modules/@ranfdev/deepobj/dist/deepobj.m.js","webpack://ideogram/./node_modules/crossfilter2/src/index.js","webpack://ideogram/./src/js/filter.js","webpack://ideogram/./src/js/views/chromosome-model.js","webpack://ideogram/./src/js/tools/tools.js","webpack://ideogram/./src/js/model-adapter.js","webpack://ideogram/./src/js/color.js","webpack://ideogram/./src/js/range.js","webpack://ideogram/./src/js/views/chromosome.js","webpack://ideogram/./src/js/views/draw-chromosomes.js","webpack://ideogram/./src/js/views/chromosome-labels.js","webpack://ideogram/./node_modules/fflate/esm/browser.js","webpack://ideogram/./src/js/kit/analyze-related-genes.js","webpack://ideogram/./src/js/gene-cache.js","webpack://ideogram/./src/js/paralog-cache.js","webpack://ideogram/./src/js/interaction-cache.js","webpack://ideogram/./src/js/kit/wikipathways.js","webpack://ideogram/./src/js/kit/related-genes.js","webpack://ideogram/./src/js/ideogram.js","webpack://ideogram/./src/js/version.js","webpack://ideogram/./src/js/index.js"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse {\n\t\tvar a = factory();\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(self, function() {\nreturn ","// The require scope\nvar __webpack_require__ = {};\n\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__.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};","function none() {}\n\nexport default function(selector) {\n return selector == null ? none : function() {\n return this.querySelector(selector);\n };\n}\n","export default function(x) {\n return typeof x === \"object\" && \"length\" in x\n ? x // Array, TypedArray, NodeList, array-like\n : Array.from(x); // Map, Set, iterable, string, or anything else\n}\n","function empty() {\n return [];\n}\n\nexport default function(selector) {\n return selector == null ? empty : function() {\n return this.querySelectorAll(selector);\n };\n}\n","export default function(selector) {\n return function() {\n return this.matches(selector);\n };\n}\n\nexport function childMatcher(selector) {\n return function(node) {\n return node.matches(selector);\n };\n}\n\n","import {childMatcher} from \"../matcher.js\";\n\nvar find = Array.prototype.find;\n\nfunction childFind(match) {\n return function() {\n return find.call(this.children, match);\n };\n}\n\nfunction childFirst() {\n return this.firstElementChild;\n}\n\nexport default function(match) {\n return this.select(match == null ? childFirst\n : childFind(typeof match === \"function\" ? match : childMatcher(match)));\n}\n","import {childMatcher} from \"../matcher.js\";\n\nvar filter = Array.prototype.filter;\n\nfunction children() {\n return this.children;\n}\n\nfunction childrenFilter(match) {\n return function() {\n return filter.call(this.children, match);\n };\n}\n\nexport default function(match) {\n return this.selectAll(match == null ? children\n : childrenFilter(typeof match === \"function\" ? match : childMatcher(match)));\n}\n","export default function(update) {\n return new Array(update.length);\n}\n","import sparse from \"./sparse.js\";\nimport {Selection} from \"./index.js\";\n\nexport default function() {\n return new Selection(this._enter || this._groups.map(sparse), this._parents);\n}\n\nexport function EnterNode(parent, datum) {\n this.ownerDocument = parent.ownerDocument;\n this.namespaceURI = parent.namespaceURI;\n this._next = null;\n this._parent = parent;\n this.__data__ = datum;\n}\n\nEnterNode.prototype = {\n constructor: EnterNode,\n appendChild: function(child) { return this._parent.insertBefore(child, this._next); },\n insertBefore: function(child, next) { return this._parent.insertBefore(child, next); },\n querySelector: function(selector) { return this._parent.querySelector(selector); },\n querySelectorAll: function(selector) { return this._parent.querySelectorAll(selector); }\n};\n","export default function(x) {\n return function() {\n return x;\n };\n}\n","import {Selection} from \"./index.js\";\nimport {EnterNode} from \"./enter.js\";\nimport array from \"../array.js\";\nimport constant from \"../constant.js\";\n\nfunction bindIndex(parent, group, enter, update, exit, data) {\n var i = 0,\n node,\n groupLength = group.length,\n dataLength = data.length;\n\n // Put any non-null nodes that fit into update.\n // Put any null nodes into enter.\n // Put any remaining data into enter.\n for (; i < dataLength; ++i) {\n if (node = group[i]) {\n node.__data__ = data[i];\n update[i] = node;\n } else {\n enter[i] = new EnterNode(parent, data[i]);\n }\n }\n\n // Put any non-null nodes that don’t fit into exit.\n for (; i < groupLength; ++i) {\n if (node = group[i]) {\n exit[i] = node;\n }\n }\n}\n\nfunction bindKey(parent, group, enter, update, exit, data, key) {\n var i,\n node,\n nodeByKeyValue = new Map,\n groupLength = group.length,\n dataLength = data.length,\n keyValues = new Array(groupLength),\n keyValue;\n\n // Compute the key for each node.\n // If multiple nodes have the same key, the duplicates are added to exit.\n for (i = 0; i < groupLength; ++i) {\n if (node = group[i]) {\n keyValues[i] = keyValue = key.call(node, node.__data__, i, group) + \"\";\n if (nodeByKeyValue.has(keyValue)) {\n exit[i] = node;\n } else {\n nodeByKeyValue.set(keyValue, node);\n }\n }\n }\n\n // Compute the key for each datum.\n // If there a node associated with this key, join and add it to update.\n // If there is not (or the key is a duplicate), add it to enter.\n for (i = 0; i < dataLength; ++i) {\n keyValue = key.call(parent, data[i], i, data) + \"\";\n if (node = nodeByKeyValue.get(keyValue)) {\n update[i] = node;\n node.__data__ = data[i];\n nodeByKeyValue.delete(keyValue);\n } else {\n enter[i] = new EnterNode(parent, data[i]);\n }\n }\n\n // Add any remaining nodes that were not bound to data to exit.\n for (i = 0; i < groupLength; ++i) {\n if ((node = group[i]) && (nodeByKeyValue.get(keyValues[i]) === node)) {\n exit[i] = node;\n }\n }\n}\n\nfunction datum(node) {\n return node.__data__;\n}\n\nexport default function(value, key) {\n if (!arguments.length) return Array.from(this, datum);\n\n var bind = key ? bindKey : bindIndex,\n parents = this._parents,\n groups = this._groups;\n\n if (typeof value !== \"function\") value = constant(value);\n\n for (var m = groups.length, update = new Array(m), enter = new Array(m), exit = new Array(m), j = 0; j < m; ++j) {\n var parent = parents[j],\n group = groups[j],\n groupLength = group.length,\n data = array(value.call(parent, parent && parent.__data__, j, parents)),\n dataLength = data.length,\n enterGroup = enter[j] = new Array(dataLength),\n updateGroup = update[j] = new Array(dataLength),\n exitGroup = exit[j] = new Array(groupLength);\n\n bind(parent, group, enterGroup, updateGroup, exitGroup, data, key);\n\n // Now connect the enter nodes to their following update node, such that\n // appendChild can insert the materialized enter node before this node,\n // rather than at the end of the parent node.\n for (var i0 = 0, i1 = 0, previous, next; i0 < dataLength; ++i0) {\n if (previous = enterGroup[i0]) {\n if (i0 >= i1) i1 = i0 + 1;\n while (!(next = updateGroup[i1]) && ++i1 < dataLength);\n previous._next = next || null;\n }\n }\n }\n\n update = new Selection(update, parents);\n update._enter = enter;\n update._exit = exit;\n return update;\n}\n","import {Selection} from \"./index.js\";\n\nexport default function(compare) {\n if (!compare) compare = ascending;\n\n function compareNode(a, b) {\n return a && b ? compare(a.__data__, b.__data__) : !a - !b;\n }\n\n for (var groups = this._groups, m = groups.length, sortgroups = new Array(m), j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, sortgroup = sortgroups[j] = new Array(n), node, i = 0; i < n; ++i) {\n if (node = group[i]) {\n sortgroup[i] = node;\n }\n }\n sortgroup.sort(compareNode);\n }\n\n return new Selection(sortgroups, this._parents).order();\n}\n\nfunction ascending(a, b) {\n return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;\n}\n","export var xhtml = \"http://www.w3.org/1999/xhtml\";\n\nexport default {\n svg: \"http://www.w3.org/2000/svg\",\n xhtml: xhtml,\n xlink: \"http://www.w3.org/1999/xlink\",\n xml: \"http://www.w3.org/XML/1998/namespace\",\n xmlns: \"http://www.w3.org/2000/xmlns/\"\n};\n","import namespaces from \"./namespaces.js\";\n\nexport default function(name) {\n var prefix = name += \"\", i = prefix.indexOf(\":\");\n if (i >= 0 && (prefix = name.slice(0, i)) !== \"xmlns\") name = name.slice(i + 1);\n return namespaces.hasOwnProperty(prefix) ? {space: namespaces[prefix], local: name} : name; // eslint-disable-line no-prototype-builtins\n}\n","import namespace from \"../namespace.js\";\n\nfunction attrRemove(name) {\n return function() {\n this.removeAttribute(name);\n };\n}\n\nfunction attrRemoveNS(fullname) {\n return function() {\n this.removeAttributeNS(fullname.space, fullname.local);\n };\n}\n\nfunction attrConstant(name, value) {\n return function() {\n this.setAttribute(name, value);\n };\n}\n\nfunction attrConstantNS(fullname, value) {\n return function() {\n this.setAttributeNS(fullname.space, fullname.local, value);\n };\n}\n\nfunction attrFunction(name, value) {\n return function() {\n var v = value.apply(this, arguments);\n if (v == null) this.removeAttribute(name);\n else this.setAttribute(name, v);\n };\n}\n\nfunction attrFunctionNS(fullname, value) {\n return function() {\n var v = value.apply(this, arguments);\n if (v == null) this.removeAttributeNS(fullname.space, fullname.local);\n else this.setAttributeNS(fullname.space, fullname.local, v);\n };\n}\n\nexport default function(name, value) {\n var fullname = namespace(name);\n\n if (arguments.length < 2) {\n var node = this.node();\n return fullname.local\n ? node.getAttributeNS(fullname.space, fullname.local)\n : node.getAttribute(fullname);\n }\n\n return this.each((value == null\n ? (fullname.local ? attrRemoveNS : attrRemove) : (typeof value === \"function\"\n ? (fullname.local ? attrFunctionNS : attrFunction)\n : (fullname.local ? attrConstantNS : attrConstant)))(fullname, value));\n}\n","export default function(node) {\n return (node.ownerDocument && node.ownerDocument.defaultView) // node is a Node\n || (node.document && node) // node is a Window\n || node.defaultView; // node is a Document\n}\n","import defaultView from \"../window.js\";\n\nfunction styleRemove(name) {\n return function() {\n this.style.removeProperty(name);\n };\n}\n\nfunction styleConstant(name, value, priority) {\n return function() {\n this.style.setProperty(name, value, priority);\n };\n}\n\nfunction styleFunction(name, value, priority) {\n return function() {\n var v = value.apply(this, arguments);\n if (v == null) this.style.removeProperty(name);\n else this.style.setProperty(name, v, priority);\n };\n}\n\nexport default function(name, value, priority) {\n return arguments.length > 1\n ? this.each((value == null\n ? styleRemove : typeof value === \"function\"\n ? styleFunction\n : styleConstant)(name, value, priority == null ? \"\" : priority))\n : styleValue(this.node(), name);\n}\n\nexport function styleValue(node, name) {\n return node.style.getPropertyValue(name)\n || defaultView(node).getComputedStyle(node, null).getPropertyValue(name);\n}\n","function propertyRemove(name) {\n return function() {\n delete this[name];\n };\n}\n\nfunction propertyConstant(name, value) {\n return function() {\n this[name] = value;\n };\n}\n\nfunction propertyFunction(name, value) {\n return function() {\n var v = value.apply(this, arguments);\n if (v == null) delete this[name];\n else this[name] = v;\n };\n}\n\nexport default function(name, value) {\n return arguments.length > 1\n ? this.each((value == null\n ? propertyRemove : typeof value === \"function\"\n ? propertyFunction\n : propertyConstant)(name, value))\n : this.node()[name];\n}\n","function classArray(string) {\n return string.trim().split(/^|\\s+/);\n}\n\nfunction classList(node) {\n return node.classList || new ClassList(node);\n}\n\nfunction ClassList(node) {\n this._node = node;\n this._names = classArray(node.getAttribute(\"class\") || \"\");\n}\n\nClassList.prototype = {\n add: function(name) {\n var i = this._names.indexOf(name);\n if (i < 0) {\n this._names.push(name);\n this._node.setAttribute(\"class\", this._names.join(\" \"));\n }\n },\n remove: function(name) {\n var i = this._names.indexOf(name);\n if (i >= 0) {\n this._names.splice(i, 1);\n this._node.setAttribute(\"class\", this._names.join(\" \"));\n }\n },\n contains: function(name) {\n return this._names.indexOf(name) >= 0;\n }\n};\n\nfunction classedAdd(node, names) {\n var list = classList(node), i = -1, n = names.length;\n while (++i < n) list.add(names[i]);\n}\n\nfunction classedRemove(node, names) {\n var list = classList(node), i = -1, n = names.length;\n while (++i < n) list.remove(names[i]);\n}\n\nfunction classedTrue(names) {\n return function() {\n classedAdd(this, names);\n };\n}\n\nfunction classedFalse(names) {\n return function() {\n classedRemove(this, names);\n };\n}\n\nfunction classedFunction(names, value) {\n return function() {\n (value.apply(this, arguments) ? classedAdd : classedRemove)(this, names);\n };\n}\n\nexport default function(name, value) {\n var names = classArray(name + \"\");\n\n if (arguments.length < 2) {\n var list = classList(this.node()), i = -1, n = names.length;\n while (++i < n) if (!list.contains(names[i])) return false;\n return true;\n }\n\n return this.each((typeof value === \"function\"\n ? classedFunction : value\n ? classedTrue\n : classedFalse)(names, value));\n}\n","function textRemove() {\n this.textContent = \"\";\n}\n\nfunction textConstant(value) {\n return function() {\n this.textContent = value;\n };\n}\n\nfunction textFunction(value) {\n return function() {\n var v = value.apply(this, arguments);\n this.textContent = v == null ? \"\" : v;\n };\n}\n\nexport default function(value) {\n return arguments.length\n ? this.each(value == null\n ? textRemove : (typeof value === \"function\"\n ? textFunction\n : textConstant)(value))\n : this.node().textContent;\n}\n","function htmlRemove() {\n this.innerHTML = \"\";\n}\n\nfunction htmlConstant(value) {\n return function() {\n this.innerHTML = value;\n };\n}\n\nfunction htmlFunction(value) {\n return function() {\n var v = value.apply(this, arguments);\n this.innerHTML = v == null ? \"\" : v;\n };\n}\n\nexport default function(value) {\n return arguments.length\n ? this.each(value == null\n ? htmlRemove : (typeof value === \"function\"\n ? htmlFunction\n : htmlConstant)(value))\n : this.node().innerHTML;\n}\n","function raise() {\n if (this.nextSibling) this.parentNode.appendChild(this);\n}\n\nexport default function() {\n return this.each(raise);\n}\n","function lower() {\n if (this.previousSibling) this.parentNode.insertBefore(this, this.parentNode.firstChild);\n}\n\nexport default function() {\n return this.each(lower);\n}\n","import namespace from \"./namespace.js\";\nimport {xhtml} from \"./namespaces.js\";\n\nfunction creatorInherit(name) {\n return function() {\n var document = this.ownerDocument,\n uri = this.namespaceURI;\n return uri === xhtml && document.documentElement.namespaceURI === xhtml\n ? document.createElement(name)\n : document.createElementNS(uri, name);\n };\n}\n\nfunction creatorFixed(fullname) {\n return function() {\n return this.ownerDocument.createElementNS(fullname.space, fullname.local);\n };\n}\n\nexport default function(name) {\n var fullname = namespace(name);\n return (fullname.local\n ? creatorFixed\n : creatorInherit)(fullname);\n}\n","import creator from \"../creator.js\";\nimport selector from \"../selector.js\";\n\nfunction constantNull() {\n return null;\n}\n\nexport default function(name, before) {\n var create = typeof name === \"function\" ? name : creator(name),\n select = before == null ? constantNull : typeof before === \"function\" ? before : selector(before);\n return this.select(function() {\n return this.insertBefore(create.apply(this, arguments), select.apply(this, arguments) || null);\n });\n}\n","function remove() {\n var parent = this.parentNode;\n if (parent) parent.removeChild(this);\n}\n\nexport default function() {\n return this.each(remove);\n}\n","function selection_cloneShallow() {\n var clone = this.cloneNode(false), parent = this.parentNode;\n return parent ? parent.insertBefore(clone, this.nextSibling) : clone;\n}\n\nfunction selection_cloneDeep() {\n var clone = this.cloneNode(true), parent = this.parentNode;\n return parent ? parent.insertBefore(clone, this.nextSibling) : clone;\n}\n\nexport default function(deep) {\n return this.select(deep ? selection_cloneDeep : selection_cloneShallow);\n}\n","function contextListener(listener) {\n return function(event) {\n listener.call(this, event, this.__data__);\n };\n}\n\nfunction parseTypenames(typenames) {\n return typenames.trim().split(/^|\\s+/).map(function(t) {\n var name = \"\", i = t.indexOf(\".\");\n if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i);\n return {type: t, name: name};\n });\n}\n\nfunction onRemove(typename) {\n return function() {\n var on = this.__on;\n if (!on) return;\n for (var j = 0, i = -1, m = on.length, o; j < m; ++j) {\n if (o = on[j], (!typename.type || o.type === typename.type) && o.name === typename.name) {\n this.removeEventListener(o.type, o.listener, o.options);\n } else {\n on[++i] = o;\n }\n }\n if (++i) on.length = i;\n else delete this.__on;\n };\n}\n\nfunction onAdd(typename, value, options) {\n return function() {\n var on = this.__on, o, listener = contextListener(value);\n if (on) for (var j = 0, m = on.length; j < m; ++j) {\n if ((o = on[j]).type === typename.type && o.name === typename.name) {\n this.removeEventListener(o.type, o.listener, o.options);\n this.addEventListener(o.type, o.listener = listener, o.options = options);\n o.value = value;\n return;\n }\n }\n this.addEventListener(typename.type, listener, options);\n o = {type: typename.type, name: typename.name, value: value, listener: listener, options: options};\n if (!on) this.__on = [o];\n else on.push(o);\n };\n}\n\nexport default function(typename, value, options) {\n var typenames = parseTypenames(typename + \"\"), i, n = typenames.length, t;\n\n if (arguments.length < 2) {\n var on = this.node().__on;\n if (on) for (var j = 0, m = on.length, o; j < m; ++j) {\n for (i = 0, o = on[j]; i < n; ++i) {\n if ((t = typenames[i]).type === o.type && t.name === o.name) {\n return o.value;\n }\n }\n }\n return;\n }\n\n on = value ? onAdd : onRemove;\n for (i = 0; i < n; ++i) this.each(on(typenames[i], value, options));\n return this;\n}\n","import defaultView from \"../window.js\";\n\nfunction dispatchEvent(node, type, params) {\n var window = defaultView(node),\n event = window.CustomEvent;\n\n if (typeof event === \"function\") {\n event = new event(type, params);\n } else {\n event = window.document.createEvent(\"Event\");\n if (params) event.initEvent(type, params.bubbles, params.cancelable), event.detail = params.detail;\n else event.initEvent(type, false, false);\n }\n\n node.dispatchEvent(event);\n}\n\nfunction dispatchConstant(type, params) {\n return function() {\n return dispatchEvent(this, type, params);\n };\n}\n\nfunction dispatchFunction(type, params) {\n return function() {\n return dispatchEvent(this, type, params.apply(this, arguments));\n };\n}\n\nexport default function(type, params) {\n return this.each((typeof params === \"function\"\n ? dispatchFunction\n : dispatchConstant)(type, params));\n}\n","import selection_select from \"./select.js\";\nimport selection_selectAll from \"./selectAll.js\";\nimport selection_selectChild from \"./selectChild.js\";\nimport selection_selectChildren from \"./selectChildren.js\";\nimport selection_filter from \"./filter.js\";\nimport selection_data from \"./data.js\";\nimport selection_enter from \"./enter.js\";\nimport selection_exit from \"./exit.js\";\nimport selection_join from \"./join.js\";\nimport selection_merge from \"./merge.js\";\nimport selection_order from \"./order.js\";\nimport selection_sort from \"./sort.js\";\nimport selection_call from \"./call.js\";\nimport selection_nodes from \"./nodes.js\";\nimport selection_node from \"./node.js\";\nimport selection_size from \"./size.js\";\nimport selection_empty from \"./empty.js\";\nimport selection_each from \"./each.js\";\nimport selection_attr from \"./attr.js\";\nimport selection_style from \"./style.js\";\nimport selection_property from \"./property.js\";\nimport selection_classed from \"./classed.js\";\nimport selection_text from \"./text.js\";\nimport selection_html from \"./html.js\";\nimport selection_raise from \"./raise.js\";\nimport selection_lower from \"./lower.js\";\nimport selection_append from \"./append.js\";\nimport selection_insert from \"./insert.js\";\nimport selection_remove from \"./remove.js\";\nimport selection_clone from \"./clone.js\";\nimport selection_datum from \"./datum.js\";\nimport selection_on from \"./on.js\";\nimport selection_dispatch from \"./dispatch.js\";\nimport selection_iterator from \"./iterator.js\";\n\nexport var root = [null];\n\nexport function Selection(groups, parents) {\n this._groups = groups;\n this._parents = parents;\n}\n\nfunction selection() {\n return new Selection([[document.documentElement]], root);\n}\n\nfunction selection_selection() {\n return this;\n}\n\nSelection.prototype = selection.prototype = {\n constructor: Selection,\n select: selection_select,\n selectAll: selection_selectAll,\n selectChild: selection_selectChild,\n selectChildren: selection_selectChildren,\n filter: selection_filter,\n data: selection_data,\n enter: selection_enter,\n exit: selection_exit,\n join: selection_join,\n merge: selection_merge,\n selection: selection_selection,\n order: selection_order,\n sort: selection_sort,\n call: selection_call,\n nodes: selection_nodes,\n node: selection_node,\n size: selection_size,\n empty: selection_empty,\n each: selection_each,\n attr: selection_attr,\n style: selection_style,\n property: selection_property,\n classed: selection_classed,\n text: selection_text,\n html: selection_html,\n raise: selection_raise,\n lower: selection_lower,\n append: selection_append,\n insert: selection_insert,\n remove: selection_remove,\n clone: selection_clone,\n datum: selection_datum,\n on: selection_on,\n dispatch: selection_dispatch,\n [Symbol.iterator]: selection_iterator\n};\n\nexport default selection;\n","import {Selection} from \"./index.js\";\nimport selector from \"../selector.js\";\n\nexport default function(select) {\n if (typeof select !== \"function\") select = selector(select);\n\n for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) {\n if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) {\n if (\"__data__\" in node) subnode.__data__ = node.__data__;\n subgroup[i] = subnode;\n }\n }\n }\n\n return new Selection(subgroups, this._parents);\n}\n","import {Selection} from \"./index.js\";\nimport array from \"../array.js\";\nimport selectorAll from \"../selectorAll.js\";\n\nfunction arrayAll(select) {\n return function() {\n var group = select.apply(this, arguments);\n return group == null ? [] : array(group);\n };\n}\n\nexport default function(select) {\n if (typeof select === \"function\") select = arrayAll(select);\n else select = selectorAll(select);\n\n for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {\n if (node = group[i]) {\n subgroups.push(select.call(node, node.__data__, i, group));\n parents.push(node);\n }\n }\n }\n\n return new Selection(subgroups, parents);\n}\n","import {Selection} from \"./index.js\";\nimport matcher from \"../matcher.js\";\n\nexport default function(match) {\n if (typeof match !== \"function\") match = matcher(match);\n\n for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) {\n if ((node = group[i]) && match.call(node, node.__data__, i, group)) {\n subgroup.push(node);\n }\n }\n }\n\n return new Selection(subgroups, this._parents);\n}\n","import sparse from \"./sparse.js\";\nimport {Selection} from \"./index.js\";\n\nexport default function() {\n return new Selection(this._exit || this._groups.map(sparse), this._parents);\n}\n","export default function(onenter, onupdate, onexit) {\n var enter = this.enter(), update = this, exit = this.exit();\n enter = typeof onenter === \"function\" ? onenter(enter) : enter.append(onenter + \"\");\n if (onupdate != null) update = onupdate(update);\n if (onexit == null) exit.remove(); else onexit(exit);\n return enter && update ? enter.merge(update).order() : update;\n}\n","import {Selection} from \"./index.js\";\n\nexport default function(selection) {\n if (!(selection instanceof Selection)) throw new Error(\"invalid merge\");\n\n for (var groups0 = this._groups, groups1 = selection._groups, m0 = groups0.length, m1 = groups1.length, m = Math.min(m0, m1), merges = new Array(m0), j = 0; j < m; ++j) {\n for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) {\n if (node = group0[i] || group1[i]) {\n merge[i] = node;\n }\n }\n }\n\n for (; j < m0; ++j) {\n merges[j] = groups0[j];\n }\n\n return new Selection(merges, this._parents);\n}\n","export default function() {\n\n for (var groups = this._groups, j = -1, m = groups.length; ++j < m;) {\n for (var group = groups[j], i = group.length - 1, next = group[i], node; --i >= 0;) {\n if (node = group[i]) {\n if (next && node.compareDocumentPosition(next) ^ 4) next.parentNode.insertBefore(node, next);\n next = node;\n }\n }\n }\n\n return this;\n}\n","export default function() {\n var callback = arguments[0];\n arguments[0] = this;\n callback.apply(null, arguments);\n return this;\n}\n","export default function() {\n return Array.from(this);\n}\n","export default function() {\n\n for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) {\n for (var group = groups[j], i = 0, n = group.length; i < n; ++i) {\n var node = group[i];\n if (node) return node;\n }\n }\n\n return null;\n}\n","export default function() {\n let size = 0;\n for (const node of this) ++size; // eslint-disable-line no-unused-vars\n return size;\n}\n","export default function() {\n return !this.node();\n}\n","export default function(callback) {\n\n for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) {\n for (var group = groups[j], i = 0, n = group.length, node; i < n; ++i) {\n if (node = group[i]) callback.call(node, node.__data__, i, group);\n }\n }\n\n return this;\n}\n","import creator from \"../creator.js\";\n\nexport default function(name) {\n var create = typeof name === \"function\" ? name : creator(name);\n return this.select(function() {\n return this.appendChild(create.apply(this, arguments));\n });\n}\n","export default function(value) {\n return arguments.length\n ? this.property(\"__data__\", value)\n : this.node().__data__;\n}\n","export default function*() {\n for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) {\n for (var group = groups[j], i = 0, n = group.length, node; i < n; ++i) {\n if (node = group[i]) yield node;\n }\n }\n}\n","import {Selection, root} from \"./selection/index.js\";\n\nexport default function(selector) {\n return typeof selector === \"string\"\n ? new Selection([[document.querySelector(selector)]], [document.documentElement])\n : new Selection([[selector]], root);\n}\n","function responseBlob(response) {\n if (!response.ok) throw new Error(response.status + \" \" + response.statusText);\n return response.blob();\n}\n\nexport default function(input, init) {\n return fetch(input, init).then(responseBlob);\n}\n","function responseArrayBuffer(response) {\n if (!response.ok) throw new Error(response.status + \" \" + response.statusText);\n return response.arrayBuffer();\n}\n\nexport default function(input, init) {\n return fetch(input, init).then(responseArrayBuffer);\n}\n","var EOL = {},\n EOF = {},\n QUOTE = 34,\n NEWLINE = 10,\n RETURN = 13;\n\nfunction objectConverter(columns) {\n return new Function(\"d\", \"return {\" + columns.map(function(name, i) {\n return JSON.stringify(name) + \": d[\" + i + \"] || \\\"\\\"\";\n }).join(\",\") + \"}\");\n}\n\nfunction customConverter(columns, f) {\n var object = objectConverter(columns);\n return function(row, i) {\n return f(object(row), i, columns);\n };\n}\n\n// Compute unique columns in order of discovery.\nfunction inferColumns(rows) {\n var columnSet = Object.create(null),\n columns = [];\n\n rows.forEach(function(row) {\n for (var column in row) {\n if (!(column in columnSet)) {\n columns.push(columnSet[column] = column);\n }\n }\n });\n\n return columns;\n}\n\nfunction pad(value, width) {\n var s = value + \"\", length = s.length;\n return length < width ? new Array(width - length + 1).join(0) + s : s;\n}\n\nfunction formatYear(year) {\n return year < 0 ? \"-\" + pad(-year, 6)\n : year > 9999 ? \"+\" + pad(year, 6)\n : pad(year, 4);\n}\n\nfunction formatDate(date) {\n var hours = date.getUTCHours(),\n minutes = date.getUTCMinutes(),\n seconds = date.getUTCSeconds(),\n milliseconds = date.getUTCMilliseconds();\n return isNaN(date) ? \"Invalid Date\"\n : formatYear(date.getUTCFullYear(), 4) + \"-\" + pad(date.getUTCMonth() + 1, 2) + \"-\" + pad(date.getUTCDate(), 2)\n + (milliseconds ? \"T\" + pad(hours, 2) + \":\" + pad(minutes, 2) + \":\" + pad(seconds, 2) + \".\" + pad(milliseconds, 3) + \"Z\"\n : seconds ? \"T\" + pad(hours, 2) + \":\" + pad(minutes, 2) + \":\" + pad(seconds, 2) + \"Z\"\n : minutes || hours ? \"T\" + pad(hours, 2) + \":\" + pad(minutes, 2) + \"Z\"\n : \"\");\n}\n\nexport default function(delimiter) {\n var reFormat = new RegExp(\"[\\\"\" + delimiter + \"\\n\\r]\"),\n DELIMITER = delimiter.charCodeAt(0);\n\n function parse(text, f) {\n var convert, columns, rows = parseRows(text, function(row, i) {\n if (convert) return convert(row, i - 1);\n columns = row, convert = f ? customConverter(row, f) : objectConverter(row);\n });\n rows.columns = columns || [];\n return rows;\n }\n\n function parseRows(text, f) {\n var rows = [], // output rows\n N = text.length,\n I = 0, // current character index\n n = 0, // current line number\n t, // current token\n eof = N <= 0, // current token followed by EOF?\n eol = false; // current token followed by EOL?\n\n // Strip the trailing newline.\n if (text.charCodeAt(N - 1) === NEWLINE) --N;\n if (text.charCodeAt(N - 1) === RETURN) --N;\n\n function token() {\n if (eof) return EOF;\n if (eol) return eol = false, EOL;\n\n // Unescape quotes.\n var i, j = I, c;\n if (text.charCodeAt(j) === QUOTE) {\n while (I++ < N && text.charCodeAt(I) !== QUOTE || text.charCodeAt(++I) === QUOTE);\n if ((i = I) >= N) eof = true;\n else if ((c = text.charCodeAt(I++)) === NEWLINE) eol = true;\n else if (c === RETURN) { eol = true; if (text.charCodeAt(I) === NEWLINE) ++I; }\n return text.slice(j + 1, i - 1).replace(/\"\"/g, \"\\\"\");\n }\n\n // Find next delimiter or newline.\n while (I < N) {\n if ((c = text.charCodeAt(i = I++)) === NEWLINE) eol = true;\n else if (c === RETURN) { eol = true; if (text.charCodeAt(I) === NEWLINE) ++I; }\n else if (c !== DELIMITER) continue;\n return text.slice(j, i);\n }\n\n // Return last token before EOF.\n return eof = true, text.slice(j, N);\n }\n\n while ((t = token()) !== EOF) {\n var row = [];\n while (t !== EOL && t !== EOF) row.push(t), t = token();\n if (f && (row = f(row, n++)) == null) continue;\n rows.push(row);\n }\n\n return rows;\n }\n\n function preformatBody(rows, columns) {\n return rows.map(function(row) {\n return columns.map(function(column) {\n return formatValue(row[column]);\n }).join(delimiter);\n });\n }\n\n function format(rows, columns) {\n if (columns == null) columns = inferColumns(rows);\n return [columns.map(formatValue).join(delimiter)].concat(preformatBody(rows, columns)).join(\"\\n\");\n }\n\n function formatBody(rows, columns) {\n if (columns == null) columns = inferColumns(rows);\n return preformatBody(rows, columns).join(\"\\n\");\n }\n\n function formatRows(rows) {\n return rows.map(formatRow).join(\"\\n\");\n }\n\n function formatRow(row) {\n return row.map(formatValue).join(delimiter);\n }\n\n function formatValue(value) {\n return value == null ? \"\"\n : value instanceof Date ? formatDate(value)\n : reFormat.test(value += \"\") ? \"\\\"\" + value.replace(/\"/g, \"\\\"\\\"\") + \"\\\"\"\n : value;\n }\n\n return {\n parse: parse,\n parseRows: parseRows,\n format: format,\n formatBody: formatBody,\n formatRows: formatRows,\n formatRow: formatRow,\n formatValue: formatValue\n };\n}\n","import dsv from \"./dsv.js\";\n\nvar csv = dsv(\",\");\n\nexport var csvParse = csv.parse;\nexport var csvParseRows = csv.parseRows;\nexport var csvFormat = csv.format;\nexport var csvFormatBody = csv.formatBody;\nexport var csvFormatRows = csv.formatRows;\nexport var csvFormatRow = csv.formatRow;\nexport var csvFormatValue = csv.formatValue;\n","import dsv from \"./dsv.js\";\n\nvar tsv = dsv(\"\\t\");\n\nexport var tsvParse = tsv.parse;\nexport var tsvParseRows = tsv.parseRows;\nexport var tsvFormat = tsv.format;\nexport var tsvFormatBody = tsv.formatBody;\nexport var tsvFormatRows = tsv.formatRows;\nexport var tsvFormatRow = tsv.formatRow;\nexport var tsvFormatValue = tsv.formatValue;\n","function responseText(response) {\n if (!response.ok) throw new Error(response.status + \" \" + response.statusText);\n return response.text();\n}\n\nexport default function(input, init) {\n return fetch(input, init).then(responseText);\n}\n","import {csvParse, dsvFormat, tsvParse} from \"d3-dsv\";\nimport text from \"./text.js\";\n\nfunction dsvParse(parse) {\n return function(input, init, row) {\n if (arguments.length === 2 && typeof init === \"function\") row = init, init = undefined;\n return text(input, init).then(function(response) {\n return parse(response, row);\n });\n };\n}\n\nexport default function dsv(delimiter, input, init, row) {\n if (arguments.length === 3 && typeof init === \"function\") row = init, init = undefined;\n var format = dsvFormat(delimiter);\n return text(input, init).then(function(response) {\n return format.parse(response, row);\n });\n}\n\nexport var csv = dsvParse(csvParse);\nexport var tsv = dsvParse(tsvParse);\n","export default function(input, init) {\n return new Promise(function(resolve, reject) {\n var image = new Image;\n for (var key in init) image[key] = init[key];\n image.onerror = reject;\n image.onload = function() { resolve(image); };\n image.src = input;\n });\n}\n","function responseJson(response) {\n if (!response.ok) throw new Error(response.status + \" \" + response.statusText);\n if (response.status === 204 || response.status === 205) return;\n return response.json();\n}\n\nexport default function(input, init) {\n return fetch(input, init).then(responseJson);\n}\n","import text from \"./text.js\";\n\nfunction parser(type) {\n return (input, init) => text(input, init)\n .then(text => (new DOMParser).parseFromString(text, type));\n}\n\nexport default parser(\"application/xml\");\n\nexport var html = parser(\"text/html\");\n\nexport var svg = parser(\"image/svg+xml\");\n","var noop = {value: () => {}};\n\nfunction dispatch() {\n for (var i = 0, n = arguments.length, _ = {}, t; i < n; ++i) {\n if (!(t = arguments[i] + \"\") || (t in _) || /[\\s.]/.test(t)) throw new Error(\"illegal type: \" + t);\n _[t] = [];\n }\n return new Dispatch(_);\n}\n\nfunction Dispatch(_) {\n this._ = _;\n}\n\nfunction parseTypenames(typenames, types) {\n return typenames.trim().split(/^|\\s+/).map(function(t) {\n var name = \"\", i = t.indexOf(\".\");\n if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i);\n if (t && !types.hasOwnProperty(t)) throw new Error(\"unknown type: \" + t);\n return {type: t, name: name};\n });\n}\n\nDispatch.prototype = dispatch.prototype = {\n constructor: Dispatch,\n on: function(typename, callback) {\n var _ = this._,\n T = parseTypenames(typename + \"\", _),\n t,\n i = -1,\n n = T.length;\n\n // If no callback was specified, return the callback of the given type and name.\n if (arguments.length < 2) {\n while (++i < n) if ((t = (typename = T[i]).type) && (t = get(_[t], typename.name))) return t;\n return;\n }\n\n // If a type was specified, set the callback for the given type and name.\n // Otherwise, if a null callback was specified, remove callbacks of the given name.\n if (callback != null && typeof callback !== \"function\") throw new Error(\"invalid callback: \" + callback);\n while (++i < n) {\n if (t = (typename = T[i]).type) _[t] = set(_[t], typename.name, callback);\n else if (callback == null) for (t in _) _[t] = set(_[t], typename.name, null);\n }\n\n return this;\n },\n copy: function() {\n var copy = {}, _ = this._;\n for (var t in _) copy[t] = _[t].slice();\n return new Dispatch(copy);\n },\n call: function(type, that) {\n if ((n = arguments.length - 2) > 0) for (var args = new Array(n), i = 0, n, t; i < n; ++i) args[i] = arguments[i + 2];\n if (!this._.hasOwnProperty(type)) throw new Error(\"unknown type: \" + type);\n for (t = this._[type], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args);\n },\n apply: function(type, that, args) {\n if (!this._.hasOwnProperty(type)) throw new Error(\"unknown type: \" + type);\n for (var t = this._[type], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args);\n }\n};\n\nfunction get(type, name) {\n for (var i = 0, n = type.length, c; i < n; ++i) {\n if ((c = type[i]).name === name) {\n return c.value;\n }\n }\n}\n\nfunction set(type, name, callback) {\n for (var i = 0, n = type.length; i < n; ++i) {\n if (type[i].name === name) {\n type[i] = noop, type = type.slice(0, i).concat(type.slice(i + 1));\n break;\n }\n }\n if (callback != null) type.push({name: name, value: callback});\n return type;\n}\n\nexport default dispatch;\n","export function nopropagation(event) {\n event.stopImmediatePropagation();\n}\n\nexport default function(event) {\n event.preventDefault();\n event.stopImmediatePropagation();\n}\n","import {select} from \"d3-selection\";\nimport noevent from \"./noevent.js\";\n\nexport default function(view) {\n var root = view.document.documentElement,\n selection = select(view).on(\"dragstart.drag\", noevent, true);\n if (\"onselectstart\" in root) {\n selection.on(\"selectstart.drag\", noevent, true);\n } else {\n root.__noselect = root.style.MozUserSelect;\n root.style.MozUserSelect = \"none\";\n }\n}\n\nexport function yesdrag(view, noclick) {\n var root = view.document.documentElement,\n selection = select(view).on(\"dragstart.drag\", null);\n if (noclick) {\n selection.on(\"click.drag\", noevent, true);\n setTimeout(function() { selection.on(\"click.drag\", null); }, 0);\n }\n if (\"onselectstart\" in root) {\n selection.on(\"selectstart.drag\", null);\n } else {\n root.style.MozUserSelect = root.__noselect;\n delete root.__noselect;\n }\n}\n","export default function(constructor, factory, prototype) {\n constructor.prototype = factory.prototype = prototype;\n prototype.constructor = constructor;\n}\n\nexport function extend(parent, definition) {\n var prototype = Object.create(parent.prototype);\n for (var key in definition) prototype[key] = definition[key];\n return prototype;\n}\n","import define, {extend} from \"./define.js\";\n\nexport function Color() {}\n\nexport var darker = 0.7;\nexport var brighter = 1 / darker;\n\nvar reI = \"\\\\s*([+-]?\\\\d+)\\\\s*\",\n reN = \"\\\\s*([+-]?\\\\d*\\\\.?\\\\d+(?:[eE][+-]?\\\\d+)?)\\\\s*\",\n reP = \"\\\\s*([+-]?\\\\d*\\\\.?\\\\d+(?:[eE][+-]?\\\\d+)?)%\\\\s*\",\n reHex = /^#([0-9a-f]{3,8})$/,\n reRgbInteger = new RegExp(\"^rgb\\\\(\" + [reI, reI, reI] + \"\\\\)$\"),\n reRgbPercent = new RegExp(\"^rgb\\\\(\" + [reP, reP, reP] + \"\\\\)$\"),\n reRgbaInteger = new RegExp(\"^rgba\\\\(\" + [reI, reI, reI, reN] + \"\\\\)$\"),\n reRgbaPercent = new RegExp(\"^rgba\\\\(\" + [reP, reP, reP, reN] + \"\\\\)$\"),\n reHslPercent = new RegExp(\"^hsl\\\\(\" + [reN, reP, reP] + \"\\\\)$\"),\n reHslaPercent = new RegExp(\"^hsla\\\\(\" + [reN, reP, reP, reN] + \"\\\\)$\");\n\nvar named = {\n aliceblue: 0xf0f8ff,\n antiquewhite: 0xfaebd7,\n aqua: 0x00ffff,\n aquamarine: 0x7fffd4,\n azure: 0xf0ffff,\n beige: 0xf5f5dc,\n bisque: 0xffe4c4,\n black: 0x000000,\n blanchedalmond: 0xffebcd,\n blue: 0x0000ff,\n blueviolet: 0x8a2be2,\n brown: 0xa52a2a,\n burlywood: 0xdeb887,\n cadetblue: 0x5f9ea0,\n chartreuse: 0x7fff00,\n chocolate: 0xd2691e,\n coral: 0xff7f50,\n cornflowerblue: 0x6495ed,\n cornsilk: 0xfff8dc,\n crimson: 0xdc143c,\n cyan: 0x00ffff,\n darkblue: 0x00008b,\n darkcyan: 0x008b8b,\n darkgoldenrod: 0xb8860b,\n darkgray: 0xa9a9a9,\n darkgreen: 0x006400,\n darkgrey: 0xa9a9a9,\n darkkhaki: 0xbdb76b,\n darkmagenta: 0x8b008b,\n darkolivegreen: 0x556b2f,\n darkorange: 0xff8c00,\n darkorchid: 0x9932cc,\n darkred: 0x8b0000,\n darksalmon: 0xe9967a,\n darkseagreen: 0x8fbc8f,\n darkslateblue: 0x483d8b,\n darkslategray: 0x2f4f4f,\n darkslategrey: 0x2f4f4f,\n darkturquoise: 0x00ced1,\n darkviolet: 0x9400d3,\n deeppink: 0xff1493,\n deepskyblue: 0x00bfff,\n dimgray: 0x696969,\n dimgrey: 0x696969,\n dodgerblue: 0x1e90ff,\n firebrick: 0xb22222,\n floralwhite: 0xfffaf0,\n forestgreen: 0x228b22,\n fuchsia: 0xff00ff,\n gainsboro: 0xdcdcdc,\n ghostwhite: 0xf8f8ff,\n gold: 0xffd700,\n goldenrod: 0xdaa520,\n gray: 0x808080,\n green: 0x008000,\n greenyellow: 0xadff2f,\n grey: 0x808080,\n honeydew: 0xf0fff0,\n hotpink: 0xff69b4,\n indianred: 0xcd5c5c,\n indigo: 0x4b0082,\n ivory: 0xfffff0,\n khaki: 0xf0e68c,\n lavender: 0xe6e6fa,\n lavenderblush: 0xfff0f5,\n lawngreen: 0x7cfc00,\n lemonchiffon: 0xfffacd,\n lightblue: 0xadd8e6,\n lightcoral: 0xf08080,\n lightcyan: 0xe0ffff,\n lightgoldenrodyellow: 0xfafad2,\n lightgray: 0xd3d3d3,\n lightgreen: 0x90ee90,\n lightgrey: 0xd3d3d3,\n lightpink: 0xffb6c1,\n lightsalmon: 0xffa07a,\n lightseagreen: 0x20b2aa,\n lightskyblue: 0x87cefa,\n lightslategray: 0x778899,\n lightslategrey: 0x778899,\n lightsteelblue: 0xb0c4de,\n lightyellow: 0xffffe0,\n lime: 0x00ff00,\n limegreen: 0x32cd32,\n linen: 0xfaf0e6,\n magenta: 0xff00ff,\n maroon: 0x800000,\n mediumaquamarine: 0x66cdaa,\n mediumblue: 0x0000cd,\n mediumorchid: 0xba55d3,\n mediumpurple: 0x9370db,\n mediumseagreen: 0x3cb371,\n mediumslateblue: 0x7b68ee,\n mediumspringgreen: 0x00fa9a,\n mediumturquoise: 0x48d1cc,\n mediumvioletred: 0xc71585,\n midnightblue: 0x191970,\n mintcream: 0xf5fffa,\n mistyrose: 0xffe4e1,\n moccasin: 0xffe4b5,\n navajowhite: 0xffdead,\n navy: 0x000080,\n oldlace: 0xfdf5e6,\n olive: 0x808000,\n olivedrab: 0x6b8e23,\n orange: 0xffa500,\n orangered: 0xff4500,\n orchid: 0xda70d6,\n palegoldenrod: 0xeee8aa,\n palegreen: 0x98fb98,\n paleturquoise: 0xafeeee,\n palevioletred: 0xdb7093,\n papayawhip: 0xffefd5,\n peachpuff: 0xffdab9,\n peru: 0xcd853f,\n pink: 0xffc0cb,\n plum: 0xdda0dd,\n powderblue: 0xb0e0e6,\n purple: 0x800080,\n rebeccapurple: 0x663399,\n red: 0xff0000,\n rosybrown: 0xbc8f8f,\n royalblue: 0x4169e1,\n saddlebrown: 0x8b4513,\n salmon: 0xfa8072,\n sandybrown: 0xf4a460,\n seagreen: 0x2e8b57,\n seashell: 0xfff5ee,\n sienna: 0xa0522d,\n silver: 0xc0c0c0,\n skyblue: 0x87ceeb,\n slateblue: 0x6a5acd,\n slategray: 0x708090,\n slategrey: 0x708090,\n snow: 0xfffafa,\n springgreen: 0x00ff7f,\n steelblue: 0x4682b4,\n tan: 0xd2b48c,\n teal: 0x008080,\n thistle: 0xd8bfd8,\n tomato: 0xff6347,\n turquoise: 0x40e0d0,\n violet: 0xee82ee,\n wheat: 0xf5deb3,\n white: 0xffffff,\n whitesmoke: 0xf5f5f5,\n yellow: 0xffff00,\n yellowgreen: 0x9acd32\n};\n\ndefine(Color, color, {\n copy: function(channels) {\n return Object.assign(new this.constructor, this, channels);\n },\n displayable: function() {\n return this.rgb().displayable();\n },\n hex: color_formatHex, // Deprecated! Use color.formatHex.\n formatHex: color_formatHex,\n formatHsl: color_formatHsl,\n formatRgb: color_formatRgb,\n toString: color_formatRgb\n});\n\nfunction color_formatHex() {\n return this.rgb().formatHex();\n}\n\nfunction color_formatHsl() {\n return hslConvert(this).formatHsl();\n}\n\nfunction color_formatRgb() {\n return this.rgb().formatRgb();\n}\n\nexport default function color(format) {\n var m, l;\n format = (format + \"\").trim().toLowerCase();\n return (m = reHex.exec(format)) ? (l = m[1].length, m = parseInt(m[1], 16), l === 6 ? rgbn(m) // #ff0000\n : l === 3 ? new Rgb((m >> 8 & 0xf) | (m >> 4 & 0xf0), (m >> 4 & 0xf) | (m & 0xf0), ((m & 0xf) << 4) | (m & 0xf), 1) // #f00\n : l === 8 ? rgba(m >> 24 & 0xff, m >> 16 & 0xff, m >> 8 & 0xff, (m & 0xff) / 0xff) // #ff000000\n : l === 4 ? rgba((m >> 12 & 0xf) | (m >> 8 & 0xf0), (m >> 8 & 0xf) | (m >> 4 & 0xf0), (m >> 4 & 0xf) | (m & 0xf0), (((m & 0xf) << 4) | (m & 0xf)) / 0xff) // #f000\n : null) // invalid hex\n : (m = reRgbInteger.exec(format)) ? new Rgb(m[1], m[2], m[3], 1) // rgb(255, 0, 0)\n : (m = reRgbPercent.exec(format)) ? new Rgb(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, 1) // rgb(100%, 0%, 0%)\n : (m = reRgbaInteger.exec(format)) ? rgba(m[1], m[2], m[3], m[4]) // rgba(255, 0, 0, 1)\n : (m = reRgbaPercent.exec(format)) ? rgba(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, m[4]) // rgb(100%, 0%, 0%, 1)\n : (m = reHslPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, 1) // hsl(120, 50%, 50%)\n : (m = reHslaPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, m[4]) // hsla(120, 50%, 50%, 1)\n : named.hasOwnProperty(format) ? rgbn(named[format]) // eslint-disable-line no-prototype-builtins\n : format === \"transparent\" ? new Rgb(NaN, NaN, NaN, 0)\n : null;\n}\n\nfunction rgbn(n) {\n return new Rgb(n >> 16 & 0xff, n >> 8 & 0xff, n & 0xff, 1);\n}\n\nfunction rgba(r, g, b, a) {\n if (a <= 0) r = g = b = NaN;\n return new Rgb(r, g, b, a);\n}\n\nexport function rgbConvert(o) {\n if (!(o instanceof Color)) o = color(o);\n if (!o) return new Rgb;\n o = o.rgb();\n return new Rgb(o.r, o.g, o.b, o.opacity);\n}\n\nexport function rgb(r, g, b, opacity) {\n return arguments.length === 1 ? rgbConvert(r) : new Rgb(r, g, b, opacity == null ? 1 : opacity);\n}\n\nexport function Rgb(r, g, b, opacity) {\n this.r = +r;\n this.g = +g;\n this.b = +b;\n this.opacity = +opacity;\n}\n\ndefine(Rgb, rgb, extend(Color, {\n brighter: function(k) {\n k = k == null ? brighter : Math.pow(brighter, k);\n return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);\n },\n darker: function(k) {\n k = k == null ? darker : Math.pow(darker, k);\n return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);\n },\n rgb: function() {\n return this;\n },\n displayable: function() {\n return (-0.5 <= this.r && this.r < 255.5)\n && (-0.5 <= this.g && this.g < 255.5)\n && (-0.5 <= this.b && this.b < 255.5)\n && (0 <= this.opacity && this.opacity <= 1);\n },\n hex: rgb_formatHex, // Deprecated! Use color.formatHex.\n formatHex: rgb_formatHex,\n formatRgb: rgb_formatRgb,\n toString: rgb_formatRgb\n}));\n\nfunction rgb_formatHex() {\n return \"#\" + hex(this.r) + hex(this.g) + hex(this.b);\n}\n\nfunction rgb_formatRgb() {\n var a = this.opacity; a = isNaN(a) ? 1 : Math.max(0, Math.min(1, a));\n return (a === 1 ? \"rgb(\" : \"rgba(\")\n + Math.max(0, Math.min(255, Math.round(this.r) || 0)) + \", \"\n + Math.max(0, Math.min(255, Math.round(this.g) || 0)) + \", \"\n + Math.max(0, Math.min(255, Math.round(this.b) || 0))\n + (a === 1 ? \")\" : \", \" + a + \")\");\n}\n\nfunction hex(value) {\n value = Math.max(0, Math.min(255, Math.round(value) || 0));\n return (value < 16 ? \"0\" : \"\") + value.toString(16);\n}\n\nfunction hsla(h, s, l, a) {\n if (a <= 0) h = s = l = NaN;\n else if (l <= 0 || l >= 1) h = s = NaN;\n else if (s <= 0) h = NaN;\n return new Hsl(h, s, l, a);\n}\n\nexport function hslConvert(o) {\n if (o instanceof Hsl) return new Hsl(o.h, o.s, o.l, o.opacity);\n if (!(o instanceof Color)) o = color(o);\n if (!o) return new Hsl;\n if (o instanceof Hsl) return o;\n o = o.rgb();\n var r = o.r / 255,\n g = o.g / 255,\n b = o.b / 255,\n min = Math.min(r, g, b),\n max = Math.max(r, g, b),\n h = NaN,\n s = max - min,\n l = (max + min) / 2;\n if (s) {\n if (r === max) h = (g - b) / s + (g < b) * 6;\n else if (g === max) h = (b - r) / s + 2;\n else h = (r - g) / s + 4;\n s /= l < 0.5 ? max + min : 2 - max - min;\n h *= 60;\n } else {\n s = l > 0 && l < 1 ? 0 : h;\n }\n return new Hsl(h, s, l, o.opacity);\n}\n\nexport function hsl(h, s, l, opacity) {\n return arguments.length === 1 ? hslConvert(h) : new Hsl(h, s, l, opacity == null ? 1 : opacity);\n}\n\nfunction Hsl(h, s, l, opacity) {\n this.h = +h;\n this.s = +s;\n this.l = +l;\n this.opacity = +opacity;\n}\n\ndefine(Hsl, hsl, extend(Color, {\n brighter: function(k) {\n k = k == null ? brighter : Math.pow(brighter, k);\n return new Hsl(this.h, this.s, this.l * k, this.opacity);\n },\n darker: function(k) {\n k = k == null ? darker : Math.pow(darker, k);\n return new Hsl(this.h, this.s, this.l * k, this.opacity);\n },\n rgb: function() {\n var h = this.h % 360 + (this.h < 0) * 360,\n s = isNaN(h) || isNaN(this.s) ? 0 : this.s,\n l = this.l,\n m2 = l + (l < 0.5 ? l : 1 - l) * s,\n m1 = 2 * l - m2;\n return new Rgb(\n hsl2rgb(h >= 240 ? h - 240 : h + 120, m1, m2),\n hsl2rgb(h, m1, m2),\n hsl2rgb(h < 120 ? h + 240 : h - 120, m1, m2),\n this.opacity\n );\n },\n displayable: function() {\n return (0 <= this.s && this.s <= 1 || isNaN(this.s))\n && (0 <= this.l && this.l <= 1)\n && (0 <= this.opacity && this.opacity <= 1);\n },\n formatHsl: function() {\n var a = this.opacity; a = isNaN(a) ? 1 : Math.max(0, Math.min(1, a));\n return (a === 1 ? \"hsl(\" : \"hsla(\")\n + (this.h || 0) + \", \"\n + (this.s || 0) * 100 + \"%, \"\n + (this.l || 0) * 100 + \"%\"\n + (a === 1 ? \")\" : \", \" + a + \")\");\n }\n}));\n\n/* From FvD 13.37, CSS Color Module Level 3 */\nfunction hsl2rgb(h, m1, m2) {\n return (h < 60 ? m1 + (m2 - m1) * h / 60\n : h < 180 ? m2\n : h < 240 ? m1 + (m2 - m1) * (240 - h) / 60\n : m1) * 255;\n}\n","export function basis(t1, v0, v1, v2, v3) {\n var t2 = t1 * t1, t3 = t2 * t1;\n return ((1 - 3 * t1 + 3 * t2 - t3) * v0\n + (4 - 6 * t2 + 3 * t3) * v1\n + (1 + 3 * t1 + 3 * t2 - 3 * t3) * v2\n + t3 * v3) / 6;\n}\n\nexport default function(values) {\n var n = values.length - 1;\n return function(t) {\n var i = t <= 0 ? (t = 0) : t >= 1 ? (t = 1, n - 1) : Math.floor(t * n),\n v1 = values[i],\n v2 = values[i + 1],\n v0 = i > 0 ? values[i - 1] : 2 * v1 - v2,\n v3 = i < n - 1 ? values[i + 2] : 2 * v2 - v1;\n return basis((t - i / n) * n, v0, v1, v2, v3);\n };\n}\n","export default x => () => x;\n","import constant from \"./constant.js\";\n\nfunction linear(a, d) {\n return function(t) {\n return a + t * d;\n };\n}\n\nfunction exponential(a, b, y) {\n return a = Math.pow(a, y), b = Math.pow(b, y) - a, y = 1 / y, function(t) {\n return Math.pow(a + t * b, y);\n };\n}\n\nexport function hue(a, b) {\n var d = b - a;\n return d ? linear(a, d > 180 || d < -180 ? d - 360 * Math.round(d / 360) : d) : constant(isNaN(a) ? b : a);\n}\n\nexport function gamma(y) {\n return (y = +y) === 1 ? nogamma : function(a, b) {\n return b - a ? exponential(a, b, y) : constant(isNaN(a) ? b : a);\n };\n}\n\nexport default function nogamma(a, b) {\n var d = b - a;\n return d ? linear(a, d) : constant(isNaN(a) ? b : a);\n}\n","import {rgb as colorRgb} from \"d3-color\";\nimport basis from \"./basis.js\";\nimport basisClosed from \"./basisClosed.js\";\nimport nogamma, {gamma} from \"./color.js\";\n\nexport default (function rgbGamma(y) {\n var color = gamma(y);\n\n function rgb(start, end) {\n var r = color((start = colorRgb(start)).r, (end = colorRgb(end)).r),\n g = color(start.g, end.g),\n b = color(start.b, end.b),\n opacity = nogamma(start.opacity, end.opacity);\n return function(t) {\n start.r = r(t);\n start.g = g(t);\n start.b = b(t);\n start.opacity = opacity(t);\n return start + \"\";\n };\n }\n\n rgb.gamma = rgbGamma;\n\n return rgb;\n})(1);\n\nfunction rgbSpline(spline) {\n return function(colors) {\n var n = colors.length,\n r = new Array(n),\n g = new Array(n),\n b = new Array(n),\n i, color;\n for (i = 0; i < n; ++i) {\n color = colorRgb(colors[i]);\n r[i] = color.r || 0;\n g[i] = color.g || 0;\n b[i] = color.b || 0;\n }\n r = spline(r);\n g = spline(g);\n b = spline(b);\n color.opacity = 1;\n return function(t) {\n color.r = r(t);\n color.g = g(t);\n color.b = b(t);\n return color + \"\";\n };\n };\n}\n\nexport var rgbBasis = rgbSpline(basis);\nexport var rgbBasisClosed = rgbSpline(basisClosed);\n","import value from \"./value.js\";\nimport numberArray, {isNumberArray} from \"./numberArray.js\";\n\nexport default function(a, b) {\n return (isNumberArray(b) ? numberArray : genericArray)(a, b);\n}\n\nexport function genericArray(a, b) {\n var nb = b ? b.length : 0,\n na = a ? Math.min(nb, a.length) : 0,\n x = new Array(na),\n c = new Array(nb),\n i;\n\n for (i = 0; i < na; ++i) x[i] = value(a[i], b[i]);\n for (; i < nb; ++i) c[i] = b[i];\n\n return function(t) {\n for (i = 0; i < na; ++i) c[i] = x[i](t);\n return c;\n };\n}\n","export default function(a, b) {\n var d = new Date;\n return a = +a, b = +b, function(t) {\n return d.setTime(a * (1 - t) + b * t), d;\n };\n}\n","export default function(a, b) {\n return a = +a, b = +b, function(t) {\n return a * (1 - t) + b * t;\n };\n}\n","import value from \"./value.js\";\n\nexport default function(a, b) {\n var i = {},\n c = {},\n k;\n\n if (a === null || typeof a !== \"object\") a = {};\n if (b === null || typeof b !== \"object\") b = {};\n\n for (k in b) {\n if (k in a) {\n i[k] = value(a[k], b[k]);\n } else {\n c[k] = b[k];\n }\n }\n\n return function(t) {\n for (k in i) c[k] = i[k](t);\n return c;\n };\n}\n","import {basis} from \"./basis.js\";\n\nexport default function(values) {\n var n = values.length;\n return function(t) {\n var i = Math.floor(((t %= 1) < 0 ? ++t : t) * n),\n v0 = values[(i + n - 1) % n],\n v1 = values[i % n],\n v2 = values[(i + 1) % n],\n v3 = values[(i + 2) % n];\n return basis((t - i / n) * n, v0, v1, v2, v3);\n };\n}\n","import number from \"./number.js\";\n\nvar reA = /[-+]?(?:\\d+\\.?\\d*|\\.?\\d+)(?:[eE][-+]?\\d+)?/g,\n reB = new RegExp(reA.source, \"g\");\n\nfunction zero(b) {\n return function() {\n return b;\n };\n}\n\nfunction one(b) {\n return function(t) {\n return b(t) + \"\";\n };\n}\n\nexport default function(a, b) {\n var bi = reA.lastIndex = reB.lastIndex = 0, // scan index for next number in b\n am, // current match in a\n bm, // current match in b\n bs, // string preceding current number in b, if any\n i = -1, // index in s\n s = [], // string constants and placeholders\n q = []; // number interpolators\n\n // Coerce inputs to strings.\n a = a + \"\", b = b + \"\";\n\n // Interpolate pairs of numbers in a & b.\n while ((am = reA.exec(a))\n && (bm = reB.exec(b))) {\n if ((bs = bm.index) > bi) { // a string precedes the next number in b\n bs = b.slice(bi, bs);\n if (s[i]) s[i] += bs; // coalesce with previous string\n else s[++i] = bs;\n }\n if ((am = am[0]) === (bm = bm[0])) { // numbers in a & b match\n if (s[i]) s[i] += bm; // coalesce with previous string\n else s[++i] = bm;\n } else { // interpolate non-matching numbers\n s[++i] = null;\n q.push({i: i, x: number(am, bm)});\n }\n bi = reB.lastIndex;\n }\n\n // Add remains of b.\n if (bi < b.length) {\n bs = b.slice(bi);\n if (s[i]) s[i] += bs; // coalesce with previous string\n else s[++i] = bs;\n }\n\n // Special optimization for only a single match.\n // Otherwise, interpolate each of the numbers and rejoin the string.\n return s.length < 2 ? (q[0]\n ? one(q[0].x)\n : zero(b))\n : (b = q.length, function(t) {\n for (var i = 0, o; i < b; ++i) s[(o = q[i]).i] = o.x(t);\n return s.join(\"\");\n });\n}\n","export default function(a, b) {\n if (!b) b = [];\n var n = a ? Math.min(b.length, a.length) : 0,\n c = b.slice(),\n i;\n return function(t) {\n for (i = 0; i < n; ++i) c[i] = a[i] * (1 - t) + b[i] * t;\n return c;\n };\n}\n\nexport function isNumberArray(x) {\n return ArrayBuffer.isView(x) && !(x instanceof DataView);\n}\n","import {color} from \"d3-color\";\nimport rgb from \"./rgb.js\";\nimport {genericArray} from \"./array.js\";\nimport date from \"./date.js\";\nimport number from \"./number.js\";\nimport object from \"./object.js\";\nimport string from \"./string.js\";\nimport constant from \"./constant.js\";\nimport numberArray, {isNumberArray} from \"./numberArray.js\";\n\nexport default function(a, b) {\n var t = typeof b, c;\n return b == null || t === \"boolean\" ? constant(b)\n : (t === \"number\" ? number\n : t === \"string\" ? ((c = color(b)) ? (b = c, rgb) : string)\n : b instanceof color ? rgb\n : b instanceof Date ? date\n : isNumberArray(b) ? numberArray\n : Array.isArray(b) ? genericArray\n : typeof b.valueOf !== \"function\" && typeof b.toString !== \"function\" || isNaN(b) ? object\n : number)(a, b);\n}\n","import sourceEvent from \"./sourceEvent.js\";\n\nexport default function(event, node) {\n event = sourceEvent(event);\n if (node === undefined) node = event.currentTarget;\n if (node) {\n var svg = node.ownerSVGElement || node;\n if (svg.createSVGPoint) {\n var point = svg.createSVGPoint();\n point.x = event.clientX, point.y = event.clientY;\n point = point.matrixTransform(node.getScreenCTM().inverse());\n return [point.x, point.y];\n }\n if (node.getBoundingClientRect) {\n var rect = node.getBoundingClientRect();\n return [event.clientX - rect.left - node.clientLeft, event.clientY - rect.top - node.clientTop];\n }\n }\n return [event.pageX, event.pageY];\n}\n","export default function(event) {\n let sourceEvent;\n while (sourceEvent = event.sourceEvent) event = sourceEvent;\n return event;\n}\n","var frame = 0, // is an animation frame pending?\n timeout = 0, // is a timeout pending?\n interval = 0, // are any timers active?\n pokeDelay = 1000, // how frequently we check for clock skew\n taskHead,\n taskTail,\n clockLast = 0,\n clockNow = 0,\n clockSkew = 0,\n clock = typeof performance === \"object\" && performance.now ? performance : Date,\n setFrame = typeof window === \"object\" && window.requestAnimationFrame ? window.requestAnimationFrame.bind(window) : function(f) { setTimeout(f, 17); };\n\nexport function now() {\n return clockNow || (setFrame(clearNow), clockNow = clock.now() + clockSkew);\n}\n\nfunction clearNow() {\n clockNow = 0;\n}\n\nexport function Timer() {\n this._call =\n this._time =\n this._next = null;\n}\n\nTimer.prototype = timer.prototype = {\n constructor: Timer,\n restart: function(callback, delay, time) {\n if (typeof callback !== \"function\") throw new TypeError(\"callback is not a function\");\n time = (time == null ? now() : +time) + (delay == null ? 0 : +delay);\n if (!this._next && taskTail !== this) {\n if (taskTail) taskTail._next = this;\n else taskHead = this;\n taskTail = this;\n }\n this._call = callback;\n this._time = time;\n sleep();\n },\n stop: function() {\n if (this._call) {\n this._call = null;\n this._time = Infinity;\n sleep();\n }\n }\n};\n\nexport function timer(callback, delay, time) {\n var t = new Timer;\n t.restart(callback, delay, time);\n return t;\n}\n\nexport function timerFlush() {\n now(); // Get the current time, if not already set.\n ++frame; // Pretend we’ve set an alarm, if we haven’t already.\n var t = taskHead, e;\n while (t) {\n if ((e = clockNow - t._time) >= 0) t._call.call(null, e);\n t = t._next;\n }\n --frame;\n}\n\nfunction wake() {\n clockNow = (clockLast = clock.now()) + clockSkew;\n frame = timeout = 0;\n try {\n timerFlush();\n } finally {\n frame = 0;\n nap();\n clockNow = 0;\n }\n}\n\nfunction poke() {\n var now = clock.now(), delay = now - clockLast;\n if (delay > pokeDelay) clockSkew -= delay, clockLast = now;\n}\n\nfunction nap() {\n var t0, t1 = taskHead, t2, time = Infinity;\n while (t1) {\n if (t1._call) {\n if (time > t1._time) time = t1._time;\n t0 = t1, t1 = t1._next;\n } else {\n t2 = t1._next, t1._next = null;\n t1 = t0 ? t0._next = t2 : taskHead = t2;\n }\n }\n taskTail = t0;\n sleep(time);\n}\n\nfunction sleep(time) {\n if (frame) return; // Soonest alarm already set, or will be.\n if (timeout) timeout = clearTimeout(timeout);\n var delay = time - clockNow; // Strictly less than if we recomputed clockNow.\n if (delay > 24) {\n if (time < Infinity) timeout = setTimeout(wake, time - clock.now() - clockSkew);\n if (interval) interval = clearInterval(interval);\n } else {\n if (!interval) clockLast = clock.now(), interval = setInterval(poke, pokeDelay);\n frame = 1, setFrame(wake);\n }\n}\n","import {Timer} from \"./timer.js\";\n\nexport default function(callback, delay, time) {\n var t = new Timer;\n delay = delay == null ? 0 : +delay;\n t.restart(elapsed => {\n t.stop();\n callback(elapsed + delay);\n }, delay, time);\n return t;\n}\n","import {dispatch} from \"d3-dispatch\";\nimport {timer, timeout} from \"d3-timer\";\n\nvar emptyOn = dispatch(\"start\", \"end\", \"cancel\", \"interrupt\");\nvar emptyTween = [];\n\nexport var CREATED = 0;\nexport var SCHEDULED = 1;\nexport var STARTING = 2;\nexport var STARTED = 3;\nexport var RUNNING = 4;\nexport var ENDING = 5;\nexport var ENDED = 6;\n\nexport default function(node, name, id, index, group, timing) {\n var schedules = node.__transition;\n if (!schedules) node.__transition = {};\n else if (id in schedules) return;\n create(node, id, {\n name: name,\n index: index, // For context during callback.\n group: group, // For context during callback.\n on: emptyOn,\n tween: emptyTween,\n time: timing.time,\n delay: timing.delay,\n duration: timing.duration,\n ease: timing.ease,\n timer: null,\n state: CREATED\n });\n}\n\nexport function init(node, id) {\n var schedule = get(node, id);\n if (schedule.state > CREATED) throw new Error(\"too late; already scheduled\");\n return schedule;\n}\n\nexport function set(node, id) {\n var schedule = get(node, id);\n if (schedule.state > STARTED) throw new Error(\"too late; already running\");\n return schedule;\n}\n\nexport function get(node, id) {\n var schedule = node.__transition;\n if (!schedule || !(schedule = schedule[id])) throw new Error(\"transition not found\");\n return schedule;\n}\n\nfunction create(node, id, self) {\n var schedules = node.__transition,\n tween;\n\n // Initialize the self timer when the transition is created.\n // Note the actual delay is not known until the first callback!\n schedules[id] = self;\n self.timer = timer(schedule, 0, self.time);\n\n function schedule(elapsed) {\n self.state = SCHEDULED;\n self.timer.restart(start, self.delay, self.time);\n\n // If the elapsed delay is less than our first sleep, start immediately.\n if (self.delay <= elapsed) start(elapsed - self.delay);\n }\n\n function start(elapsed) {\n var i, j, n, o;\n\n // If the state is not SCHEDULED, then we previously errored on start.\n if (self.state !== SCHEDULED) return stop();\n\n for (i in schedules) {\n o = schedules[i];\n if (o.name !== self.name) continue;\n\n // While this element already has a starting transition during this frame,\n // defer starting an interrupting transition until that transition has a\n // chance to tick (and possibly end); see d3/d3-transition#54!\n if (o.state === STARTED) return timeout(start);\n\n // Interrupt the active transition, if any.\n if (o.state === RUNNING) {\n o.state = ENDED;\n o.timer.stop();\n o.on.call(\"interrupt\", node, node.__data__, o.index, o.group);\n delete schedules[i];\n }\n\n // Cancel any pre-empted transitions.\n else if (+i < id) {\n o.state = ENDED;\n o.timer.stop();\n o.on.call(\"cancel\", node, node.__data__, o.index, o.group);\n delete schedules[i];\n }\n }\n\n // Defer the first tick to end of the current frame; see d3/d3#1576.\n // Note the transition may be canceled after start and before the first tick!\n // Note this must be scheduled before the start event; see d3/d3-transition#16!\n // Assuming this is successful, subsequent callbacks go straight to tick.\n timeout(function() {\n if (self.state === STARTED) {\n self.state = RUNNING;\n self.timer.restart(tick, self.delay, self.time);\n tick(elapsed);\n }\n });\n\n // Dispatch the start event.\n // Note this must be done before the tween are initialized.\n self.state = STARTING;\n self.on.call(\"start\", node, node.__data__, self.index, self.group);\n if (self.state !== STARTING) return; // interrupted\n self.state = STARTED;\n\n // Initialize the tween, deleting null tween.\n tween = new Array(n = self.tween.length);\n for (i = 0, j = -1; i < n; ++i) {\n if (o = self.tween[i].value.call(node, node.__data__, self.index, self.group)) {\n tween[++j] = o;\n }\n }\n tween.length = j + 1;\n }\n\n function tick(elapsed) {\n var t = elapsed < self.duration ? self.ease.call(null, elapsed / self.duration) : (self.timer.restart(stop), self.state = ENDING, 1),\n i = -1,\n n = tween.length;\n\n while (++i < n) {\n tween[i].call(node, t);\n }\n\n // Dispatch the end event.\n if (self.state === ENDING) {\n self.on.call(\"end\", node, node.__data__, self.index, self.group);\n stop();\n }\n }\n\n function stop() {\n self.state = ENDED;\n self.timer.stop();\n delete schedules[id];\n for (var i in schedules) return; // eslint-disable-line no-unused-vars\n delete node.__transition;\n }\n}\n","import {STARTING, ENDING, ENDED} from \"./transition/schedule.js\";\n\nexport default function(node, name) {\n var schedules = node.__transition,\n schedule,\n active,\n empty = true,\n i;\n\n if (!schedules) return;\n\n name = name == null ? null : name + \"\";\n\n for (i in schedules) {\n if ((schedule = schedules[i]).name !== name) { empty = false; continue; }\n active = schedule.state > STARTING && schedule.state < ENDING;\n schedule.state = ENDED;\n schedule.timer.stop();\n schedule.on.call(active ? \"interrupt\" : \"cancel\", node, node.__data__, schedule.index, schedule.group);\n delete schedules[i];\n }\n\n if (empty) delete node.__transition;\n}\n","var degrees = 180 / Math.PI;\n\nexport var identity = {\n translateX: 0,\n translateY: 0,\n rotate: 0,\n skewX: 0,\n scaleX: 1,\n scaleY: 1\n};\n\nexport default function(a, b, c, d, e, f) {\n var scaleX, scaleY, skewX;\n if (scaleX = Math.sqrt(a * a + b * b)) a /= scaleX, b /= scaleX;\n if (skewX = a * c + b * d) c -= a * skewX, d -= b * skewX;\n if (scaleY = Math.sqrt(c * c + d * d)) c /= scaleY, d /= scaleY, skewX /= scaleY;\n if (a * d < b * c) a = -a, b = -b, skewX = -skewX, scaleX = -scaleX;\n return {\n translateX: e,\n translateY: f,\n rotate: Math.atan2(b, a) * degrees,\n skewX: Math.atan(skewX) * degrees,\n scaleX: scaleX,\n scaleY: scaleY\n };\n}\n","import decompose, {identity} from \"./decompose.js\";\n\nvar svgNode;\n\n/* eslint-disable no-undef */\nexport function parseCss(value) {\n const m = new (typeof DOMMatrix === \"function\" ? DOMMatrix : WebKitCSSMatrix)(value + \"\");\n return m.isIdentity ? identity : decompose(m.a, m.b, m.c, m.d, m.e, m.f);\n}\n\nexport function parseSvg(value) {\n if (value == null) return identity;\n if (!svgNode) svgNode = document.createElementNS(\"http://www.w3.org/2000/svg\", \"g\");\n svgNode.setAttribute(\"transform\", value);\n if (!(value = svgNode.transform.baseVal.consolidate())) return identity;\n value = value.matrix;\n return decompose(value.a, value.b, value.c, value.d, value.e, value.f);\n}\n","import number from \"../number.js\";\nimport {parseCss, parseSvg} from \"./parse.js\";\n\nfunction interpolateTransform(parse, pxComma, pxParen, degParen) {\n\n function pop(s) {\n return s.length ? s.pop() + \" \" : \"\";\n }\n\n function translate(xa, ya, xb, yb, s, q) {\n if (xa !== xb || ya !== yb) {\n var i = s.push(\"translate(\", null, pxComma, null, pxParen);\n q.push({i: i - 4, x: number(xa, xb)}, {i: i - 2, x: number(ya, yb)});\n } else if (xb || yb) {\n s.push(\"translate(\" + xb + pxComma + yb + pxParen);\n }\n }\n\n function rotate(a, b, s, q) {\n if (a !== b) {\n if (a - b > 180) b += 360; else if (b - a > 180) a += 360; // shortest path\n q.push({i: s.push(pop(s) + \"rotate(\", null, degParen) - 2, x: number(a, b)});\n } else if (b) {\n s.push(pop(s) + \"rotate(\" + b + degParen);\n }\n }\n\n function skewX(a, b, s, q) {\n if (a !== b) {\n q.push({i: s.push(pop(s) + \"skewX(\", null, degParen) - 2, x: number(a, b)});\n } else if (b) {\n s.push(pop(s) + \"skewX(\" + b + degParen);\n }\n }\n\n function scale(xa, ya, xb, yb, s, q) {\n if (xa !== xb || ya !== yb) {\n var i = s.push(pop(s) + \"scale(\", null, \",\", null, \")\");\n q.push({i: i - 4, x: number(xa, xb)}, {i: i - 2, x: number(ya, yb)});\n } else if (xb !== 1 || yb !== 1) {\n s.push(pop(s) + \"scale(\" + xb + \",\" + yb + \")\");\n }\n }\n\n return function(a, b) {\n var s = [], // string constants and placeholders\n q = []; // number interpolators\n a = parse(a), b = parse(b);\n translate(a.translateX, a.translateY, b.translateX, b.translateY, s, q);\n rotate(a.rotate, b.rotate, s, q);\n skewX(a.skewX, b.skewX, s, q);\n scale(a.scaleX, a.scaleY, b.scaleX, b.scaleY, s, q);\n a = b = null; // gc\n return function(t) {\n var i = -1, n = q.length, o;\n while (++i < n) s[(o = q[i]).i] = o.x(t);\n return s.join(\"\");\n };\n };\n}\n\nexport var interpolateTransformCss = interpolateTransform(parseCss, \"px, \", \"px)\", \"deg)\");\nexport var interpolateTransformSvg = interpolateTransform(parseSvg, \", \", \")\", \")\");\n","import {get, set} from \"./schedule.js\";\n\nfunction tweenRemove(id, name) {\n var tween0, tween1;\n return function() {\n var schedule = set(this, id),\n tween = schedule.tween;\n\n // If this node shared tween with the previous node,\n // just assign the updated shared tween and we’re done!\n // Otherwise, copy-on-write.\n if (tween !== tween0) {\n tween1 = tween0 = tween;\n for (var i = 0, n = tween1.length; i < n; ++i) {\n if (tween1[i].name === name) {\n tween1 = tween1.slice();\n tween1.splice(i, 1);\n break;\n }\n }\n }\n\n schedule.tween = tween1;\n };\n}\n\nfunction tweenFunction(id, name, value) {\n var tween0, tween1;\n if (typeof value !== \"function\") throw new Error;\n return function() {\n var schedule = set(this, id),\n tween = schedule.tween;\n\n // If this node shared tween with the previous node,\n // just assign the updated shared tween and we’re done!\n // Otherwise, copy-on-write.\n if (tween !== tween0) {\n tween1 = (tween0 = tween).slice();\n for (var t = {name: name, value: value}, i = 0, n = tween1.length; i < n; ++i) {\n if (tween1[i].name === name) {\n tween1[i] = t;\n break;\n }\n }\n if (i === n) tween1.push(t);\n }\n\n schedule.tween = tween1;\n };\n}\n\nexport default function(name, value) {\n var id = this._id;\n\n name += \"\";\n\n if (arguments.length < 2) {\n var tween = get(this.node(), id).tween;\n for (var i = 0, n = tween.length, t; i < n; ++i) {\n if ((t = tween[i]).name === name) {\n return t.value;\n }\n }\n return null;\n }\n\n return this.each((value == null ? tweenRemove : tweenFunction)(id, name, value));\n}\n\nexport function tweenValue(transition, name, value) {\n var id = transition._id;\n\n transition.each(function() {\n var schedule = set(this, id);\n (schedule.value || (schedule.value = {}))[name] = value.apply(this, arguments);\n });\n\n return function(node) {\n return get(node, id).value[name];\n };\n}\n","import {color} from \"d3-color\";\nimport {interpolateNumber, interpolateRgb, interpolateString} from \"d3-interpolate\";\n\nexport default function(a, b) {\n var c;\n return (typeof b === \"number\" ? interpolateNumber\n : b instanceof color ? interpolateRgb\n : (c = color(b)) ? (b = c, interpolateRgb)\n : interpolateString)(a, b);\n}\n","import {interpolateTransformSvg as interpolateTransform} from \"d3-interpolate\";\nimport {namespace} from \"d3-selection\";\nimport {tweenValue} from \"./tween.js\";\nimport interpolate from \"./interpolate.js\";\n\nfunction attrRemove(name) {\n return function() {\n this.removeAttribute(name);\n };\n}\n\nfunction attrRemoveNS(fullname) {\n return function() {\n this.removeAttributeNS(fullname.space, fullname.local);\n };\n}\n\nfunction attrConstant(name, interpolate, value1) {\n var string00,\n string1 = value1 + \"\",\n interpolate0;\n return function() {\n var string0 = this.getAttribute(name);\n return string0 === string1 ? null\n : string0 === string00 ? interpolate0\n : interpolate0 = interpolate(string00 = string0, value1);\n };\n}\n\nfunction attrConstantNS(fullname, interpolate, value1) {\n var string00,\n string1 = value1 + \"\",\n interpolate0;\n return function() {\n var string0 = this.getAttributeNS(fullname.space, fullname.local);\n return string0 === string1 ? null\n : string0 === string00 ? interpolate0\n : interpolate0 = interpolate(string00 = string0, value1);\n };\n}\n\nfunction attrFunction(name, interpolate, value) {\n var string00,\n string10,\n interpolate0;\n return function() {\n var string0, value1 = value(this), string1;\n if (value1 == null) return void this.removeAttribute(name);\n string0 = this.getAttribute(name);\n string1 = value1 + \"\";\n return string0 === string1 ? null\n : string0 === string00 && string1 === string10 ? interpolate0\n : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1));\n };\n}\n\nfunction attrFunctionNS(fullname, interpolate, value) {\n var string00,\n string10,\n interpolate0;\n return function() {\n var string0, value1 = value(this), string1;\n if (value1 == null) return void this.removeAttributeNS(fullname.space, fullname.local);\n string0 = this.getAttributeNS(fullname.space, fullname.local);\n string1 = value1 + \"\";\n return string0 === string1 ? null\n : string0 === string00 && string1 === string10 ? interpolate0\n : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1));\n };\n}\n\nexport default function(name, value) {\n var fullname = namespace(name), i = fullname === \"transform\" ? interpolateTransform : interpolate;\n return this.attrTween(name, typeof value === \"function\"\n ? (fullname.local ? attrFunctionNS : attrFunction)(fullname, i, tweenValue(this, \"attr.\" + name, value))\n : value == null ? (fullname.local ? attrRemoveNS : attrRemove)(fullname)\n : (fullname.local ? attrConstantNS : attrConstant)(fullname, i, value));\n}\n","import {namespace} from \"d3-selection\";\n\nfunction attrInterpolate(name, i) {\n return function(t) {\n this.setAttribute(name, i.call(this, t));\n };\n}\n\nfunction attrInterpolateNS(fullname, i) {\n return function(t) {\n this.setAttributeNS(fullname.space, fullname.local, i.call(this, t));\n };\n}\n\nfunction attrTweenNS(fullname, value) {\n var t0, i0;\n function tween() {\n var i = value.apply(this, arguments);\n if (i !== i0) t0 = (i0 = i) && attrInterpolateNS(fullname, i);\n return t0;\n }\n tween._value = value;\n return tween;\n}\n\nfunction attrTween(name, value) {\n var t0, i0;\n function tween() {\n var i = value.apply(this, arguments);\n if (i !== i0) t0 = (i0 = i) && attrInterpolate(name, i);\n return t0;\n }\n tween._value = value;\n return tween;\n}\n\nexport default function(name, value) {\n var key = \"attr.\" + name;\n if (arguments.length < 2) return (key = this.tween(key)) && key._value;\n if (value == null) return this.tween(key, null);\n if (typeof value !== \"function\") throw new Error;\n var fullname = namespace(name);\n return this.tween(key, (fullname.local ? attrTweenNS : attrTween)(fullname, value));\n}\n","import {get, init} from \"./schedule.js\";\n\nfunction delayFunction(id, value) {\n return function() {\n init(this, id).delay = +value.apply(this, arguments);\n };\n}\n\nfunction delayConstant(id, value) {\n return value = +value, function() {\n init(this, id).delay = value;\n };\n}\n\nexport default function(value) {\n var id = this._id;\n\n return arguments.length\n ? this.each((typeof value === \"function\"\n ? delayFunction\n : delayConstant)(id, value))\n : get(this.node(), id).delay;\n}\n","import {get, set} from \"./schedule.js\";\n\nfunction durationFunction(id, value) {\n return function() {\n set(this, id).duration = +value.apply(this, arguments);\n };\n}\n\nfunction durationConstant(id, value) {\n return value = +value, function() {\n set(this, id).duration = value;\n };\n}\n\nexport default function(value) {\n var id = this._id;\n\n return arguments.length\n ? this.each((typeof value === \"function\"\n ? durationFunction\n : durationConstant)(id, value))\n : get(this.node(), id).duration;\n}\n","import {get, set} from \"./schedule.js\";\n\nfunction easeConstant(id, value) {\n if (typeof value !== \"function\") throw new Error;\n return function() {\n set(this, id).ease = value;\n };\n}\n\nexport default function(value) {\n var id = this._id;\n\n return arguments.length\n ? this.each(easeConstant(id, value))\n : get(this.node(), id).ease;\n}\n","import {get, set, init} from \"./schedule.js\";\n\nfunction start(name) {\n return (name + \"\").trim().split(/^|\\s+/).every(function(t) {\n var i = t.indexOf(\".\");\n if (i >= 0) t = t.slice(0, i);\n return !t || t === \"start\";\n });\n}\n\nfunction onFunction(id, name, listener) {\n var on0, on1, sit = start(name) ? init : set;\n return function() {\n var schedule = sit(this, id),\n on = schedule.on;\n\n // If this node shared a dispatch with the previous node,\n // just assign the updated shared dispatch and we’re done!\n // Otherwise, copy-on-write.\n if (on !== on0) (on1 = (on0 = on).copy()).on(name, listener);\n\n schedule.on = on1;\n };\n}\n\nexport default function(name, listener) {\n var id = this._id;\n\n return arguments.length < 2\n ? get(this.node(), id).on.on(name)\n : this.each(onFunction(id, name, listener));\n}\n","import {selection} from \"d3-selection\";\n\nvar Selection = selection.prototype.constructor;\n\nexport default function() {\n return new Selection(this._groups, this._parents);\n}\n","import {interpolateTransformCss as interpolateTransform} from \"d3-interpolate\";\nimport {style} from \"d3-selection\";\nimport {set} from \"./schedule.js\";\nimport {tweenValue} from \"./tween.js\";\nimport interpolate from \"./interpolate.js\";\n\nfunction styleNull(name, interpolate) {\n var string00,\n string10,\n interpolate0;\n return function() {\n var string0 = style(this, name),\n string1 = (this.style.removeProperty(name), style(this, name));\n return string0 === string1 ? null\n : string0 === string00 && string1 === string10 ? interpolate0\n : interpolate0 = interpolate(string00 = string0, string10 = string1);\n };\n}\n\nfunction styleRemove(name) {\n return function() {\n this.style.removeProperty(name);\n };\n}\n\nfunction styleConstant(name, interpolate, value1) {\n var string00,\n string1 = value1 + \"\",\n interpolate0;\n return function() {\n var string0 = style(this, name);\n return string0 === string1 ? null\n : string0 === string00 ? interpolate0\n : interpolate0 = interpolate(string00 = string0, value1);\n };\n}\n\nfunction styleFunction(name, interpolate, value) {\n var string00,\n string10,\n interpolate0;\n return function() {\n var string0 = style(this, name),\n value1 = value(this),\n string1 = value1 + \"\";\n if (value1 == null) string1 = value1 = (this.style.removeProperty(name), style(this, name));\n return string0 === string1 ? null\n : string0 === string00 && string1 === string10 ? interpolate0\n : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1));\n };\n}\n\nfunction styleMaybeRemove(id, name) {\n var on0, on1, listener0, key = \"style.\" + name, event = \"end.\" + key, remove;\n return function() {\n var schedule = set(this, id),\n on = schedule.on,\n listener = schedule.value[key] == null ? remove || (remove = styleRemove(name)) : undefined;\n\n // If this node shared a dispatch with the previous node,\n // just assign the updated shared dispatch and we’re done!\n // Otherwise, copy-on-write.\n if (on !== on0 || listener0 !== listener) (on1 = (on0 = on).copy()).on(event, listener0 = listener);\n\n schedule.on = on1;\n };\n}\n\nexport default function(name, value, priority) {\n var i = (name += \"\") === \"transform\" ? interpolateTransform : interpolate;\n return value == null ? this\n .styleTween(name, styleNull(name, i))\n .on(\"end.style.\" + name, styleRemove(name))\n : typeof value === \"function\" ? this\n .styleTween(name, styleFunction(name, i, tweenValue(this, \"style.\" + name, value)))\n .each(styleMaybeRemove(this._id, name))\n : this\n .styleTween(name, styleConstant(name, i, value), priority)\n .on(\"end.style.\" + name, null);\n}\n","function styleInterpolate(name, i, priority) {\n return function(t) {\n this.style.setProperty(name, i.call(this, t), priority);\n };\n}\n\nfunction styleTween(name, value, priority) {\n var t, i0;\n function tween() {\n var i = value.apply(this, arguments);\n if (i !== i0) t = (i0 = i) && styleInterpolate(name, i, priority);\n return t;\n }\n tween._value = value;\n return tween;\n}\n\nexport default function(name, value, priority) {\n var key = \"style.\" + (name += \"\");\n if (arguments.length < 2) return (key = this.tween(key)) && key._value;\n if (value == null) return this.tween(key, null);\n if (typeof value !== \"function\") throw new Error;\n return this.tween(key, styleTween(name, value, priority == null ? \"\" : priority));\n}\n","function textInterpolate(i) {\n return function(t) {\n this.textContent = i.call(this, t);\n };\n}\n\nfunction textTween(value) {\n var t0, i0;\n function tween() {\n var i = value.apply(this, arguments);\n if (i !== i0) t0 = (i0 = i) && textInterpolate(i);\n return t0;\n }\n tween._value = value;\n return tween;\n}\n\nexport default function(value) {\n var key = \"text\";\n if (arguments.length < 1) return (key = this.tween(key)) && key._value;\n if (value == null) return this.tween(key, null);\n if (typeof value !== \"function\") throw new Error;\n return this.tween(key, textTween(value));\n}\n","import {selection} from \"d3-selection\";\nimport transition_attr from \"./attr.js\";\nimport transition_attrTween from \"./attrTween.js\";\nimport transition_delay from \"./delay.js\";\nimport transition_duration from \"./duration.js\";\nimport transition_ease from \"./ease.js\";\nimport transition_easeVarying from \"./easeVarying.js\";\nimport transition_filter from \"./filter.js\";\nimport transition_merge from \"./merge.js\";\nimport transition_on from \"./on.js\";\nimport transition_remove from \"./remove.js\";\nimport transition_select from \"./select.js\";\nimport transition_selectAll from \"./selectAll.js\";\nimport transition_selection from \"./selection.js\";\nimport transition_style from \"./style.js\";\nimport transition_styleTween from \"./styleTween.js\";\nimport transition_text from \"./text.js\";\nimport transition_textTween from \"./textTween.js\";\nimport transition_transition from \"./transition.js\";\nimport transition_tween from \"./tween.js\";\nimport transition_end from \"./end.js\";\n\nvar id = 0;\n\nexport function Transition(groups, parents, name, id) {\n this._groups = groups;\n this._parents = parents;\n this._name = name;\n this._id = id;\n}\n\nexport default function transition(name) {\n return selection().transition(name);\n}\n\nexport function newId() {\n return ++id;\n}\n\nvar selection_prototype = selection.prototype;\n\nTransition.prototype = transition.prototype = {\n constructor: Transition,\n select: transition_select,\n selectAll: transition_selectAll,\n filter: transition_filter,\n merge: transition_merge,\n selection: transition_selection,\n transition: transition_transition,\n call: selection_prototype.call,\n nodes: selection_prototype.nodes,\n node: selection_prototype.node,\n size: selection_prototype.size,\n empty: selection_prototype.empty,\n each: selection_prototype.each,\n on: transition_on,\n attr: transition_attr,\n attrTween: transition_attrTween,\n style: transition_style,\n styleTween: transition_styleTween,\n text: transition_text,\n textTween: transition_textTween,\n remove: transition_remove,\n tween: transition_tween,\n delay: transition_delay,\n duration: transition_duration,\n ease: transition_ease,\n easeVarying: transition_easeVarying,\n end: transition_end,\n [Symbol.iterator]: selection_prototype[Symbol.iterator]\n};\n","import {selector} from \"d3-selection\";\nimport {Transition} from \"./index.js\";\nimport schedule, {get} from \"./schedule.js\";\n\nexport default function(select) {\n var name = this._name,\n id = this._id;\n\n if (typeof select !== \"function\") select = selector(select);\n\n for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) {\n if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) {\n if (\"__data__\" in node) subnode.__data__ = node.__data__;\n subgroup[i] = subnode;\n schedule(subgroup[i], name, id, i, subgroup, get(node, id));\n }\n }\n }\n\n return new Transition(subgroups, this._parents, name, id);\n}\n","import {selectorAll} from \"d3-selection\";\nimport {Transition} from \"./index.js\";\nimport schedule, {get} from \"./schedule.js\";\n\nexport default function(select) {\n var name = this._name,\n id = this._id;\n\n if (typeof select !== \"function\") select = selectorAll(select);\n\n for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {\n if (node = group[i]) {\n for (var children = select.call(node, node.__data__, i, group), child, inherit = get(node, id), k = 0, l = children.length; k < l; ++k) {\n if (child = children[k]) {\n schedule(child, name, id, k, children, inherit);\n }\n }\n subgroups.push(children);\n parents.push(node);\n }\n }\n }\n\n return new Transition(subgroups, parents, name, id);\n}\n","import {matcher} from \"d3-selection\";\nimport {Transition} from \"./index.js\";\n\nexport default function(match) {\n if (typeof match !== \"function\") match = matcher(match);\n\n for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) {\n if ((node = group[i]) && match.call(node, node.__data__, i, group)) {\n subgroup.push(node);\n }\n }\n }\n\n return new Transition(subgroups, this._parents, this._name, this._id);\n}\n","import {Transition} from \"./index.js\";\n\nexport default function(transition) {\n if (transition._id !== this._id) throw new Error;\n\n for (var groups0 = this._groups, groups1 = transition._groups, m0 = groups0.length, m1 = groups1.length, m = Math.min(m0, m1), merges = new Array(m0), j = 0; j < m; ++j) {\n for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) {\n if (node = group0[i] || group1[i]) {\n merge[i] = node;\n }\n }\n }\n\n for (; j < m0; ++j) {\n merges[j] = groups0[j];\n }\n\n return new Transition(merges, this._parents, this._name, this._id);\n}\n","import {Transition, newId} from \"./index.js\";\nimport schedule, {get} from \"./schedule.js\";\n\nexport default function() {\n var name = this._name,\n id0 = this._id,\n id1 = newId();\n\n for (var groups = this._groups, m = groups.length, j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {\n if (node = group[i]) {\n var inherit = get(node, id0);\n schedule(node, name, id1, i, group, {\n time: inherit.time + inherit.delay + inherit.duration,\n delay: 0,\n duration: inherit.duration,\n ease: inherit.ease\n });\n }\n }\n }\n\n return new Transition(groups, this._parents, name, id1);\n}\n","import {tweenValue} from \"./tween.js\";\n\nfunction textConstant(value) {\n return function() {\n this.textContent = value;\n };\n}\n\nfunction textFunction(value) {\n return function() {\n var value1 = value(this);\n this.textContent = value1 == null ? \"\" : value1;\n };\n}\n\nexport default function(value) {\n return this.tween(\"text\", typeof value === \"function\"\n ? textFunction(tweenValue(this, \"text\", value))\n : textConstant(value == null ? \"\" : value + \"\"));\n}\n","function removeFunction(id) {\n return function() {\n var parent = this.parentNode;\n for (var i in this.__transition) if (+i !== id) return;\n if (parent) parent.removeChild(this);\n };\n}\n\nexport default function() {\n return this.on(\"end.remove\", removeFunction(this._id));\n}\n","import {set} from \"./schedule.js\";\n\nfunction easeVarying(id, value) {\n return function() {\n var v = value.apply(this, arguments);\n if (typeof v !== \"function\") throw new Error;\n set(this, id).ease = v;\n };\n}\n\nexport default function(value) {\n if (typeof value !== \"function\") throw new Error;\n return this.each(easeVarying(this._id, value));\n}\n","import {set} from \"./schedule.js\";\n\nexport default function() {\n var on0, on1, that = this, id = that._id, size = that.size();\n return new Promise(function(resolve, reject) {\n var cancel = {value: reject},\n end = {value: function() { if (--size === 0) resolve(); }};\n\n that.each(function() {\n var schedule = set(this, id),\n on = schedule.on;\n\n // If this node shared a dispatch with the previous node,\n // just assign the updated shared dispatch and we’re done!\n // Otherwise, copy-on-write.\n if (on !== on0) {\n on1 = (on0 = on).copy();\n on1._.cancel.push(cancel);\n on1._.interrupt.push(cancel);\n on1._.end.push(end);\n }\n\n schedule.on = on1;\n });\n\n // The selection was empty, resolve end immediately\n if (size === 0) resolve();\n });\n}\n","import {Transition, newId} from \"../transition/index.js\";\nimport schedule from \"../transition/schedule.js\";\nimport {easeCubicInOut} from \"d3-ease\";\nimport {now} from \"d3-timer\";\n\nvar defaultTiming = {\n time: null, // Set on use.\n delay: 0,\n duration: 250,\n ease: easeCubicInOut\n};\n\nfunction inherit(node, id) {\n var timing;\n while (!(timing = node.__transition) || !(timing = timing[id])) {\n if (!(node = node.parentNode)) {\n throw new Error(`transition ${id} not found`);\n }\n }\n return timing;\n}\n\nexport default function(name) {\n var id,\n timing;\n\n if (name instanceof Transition) {\n id = name._id, name = name._name;\n } else {\n id = newId(), (timing = defaultTiming).time = now(), name = name == null ? null : name + \"\";\n }\n\n for (var groups = this._groups, m = groups.length, j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {\n if (node = group[i]) {\n schedule(node, name, id, i, group, timing || inherit(node, id));\n }\n }\n }\n\n return new Transition(groups, this._parents, name, id);\n}\n","export function cubicIn(t) {\n return t * t * t;\n}\n\nexport function cubicOut(t) {\n return --t * t * t + 1;\n}\n\nexport function cubicInOut(t) {\n return ((t *= 2) <= 1 ? t * t * t : (t -= 2) * t * t + 2) / 2;\n}\n","import {selection} from \"d3-selection\";\nimport selection_interrupt from \"./interrupt.js\";\nimport selection_transition from \"./transition.js\";\n\nselection.prototype.interrupt = selection_interrupt;\nselection.prototype.transition = selection_transition;\n","import interrupt from \"../interrupt.js\";\n\nexport default function(name) {\n return this.each(function() {\n interrupt(this, name);\n });\n}\n","export default x => () => x;\n","export default function BrushEvent(type, {\n sourceEvent,\n target,\n selection,\n mode,\n dispatch\n}) {\n Object.defineProperties(this, {\n type: {value: type, enumerable: true, configurable: true},\n sourceEvent: {value: sourceEvent, enumerable: true, configurable: true},\n target: {value: target, enumerable: true, configurable: true},\n selection: {value: selection, enumerable: true, configurable: true},\n mode: {value: mode, enumerable: true, configurable: true},\n _: {value: dispatch}\n });\n}\n","export function nopropagation(event) {\n event.stopImmediatePropagation();\n}\n\nexport default function(event) {\n event.preventDefault();\n event.stopImmediatePropagation();\n}\n","import {dispatch} from \"d3-dispatch\";\nimport {dragDisable, dragEnable} from \"d3-drag\";\nimport {interpolate} from \"d3-interpolate\";\nimport {pointer, select} from \"d3-selection\";\nimport {interrupt} from \"d3-transition\";\nimport constant from \"./constant.js\";\nimport BrushEvent from \"./event.js\";\nimport noevent, {nopropagation} from \"./noevent.js\";\n\nvar MODE_DRAG = {name: \"drag\"},\n MODE_SPACE = {name: \"space\"},\n MODE_HANDLE = {name: \"handle\"},\n MODE_CENTER = {name: \"center\"};\n\nconst {abs, max, min} = Math;\n\nfunction number1(e) {\n return [+e[0], +e[1]];\n}\n\nfunction number2(e) {\n return [number1(e[0]), number1(e[1])];\n}\n\nvar X = {\n name: \"x\",\n handles: [\"w\", \"e\"].map(type),\n input: function(x, e) { return x == null ? null : [[+x[0], e[0][1]], [+x[1], e[1][1]]]; },\n output: function(xy) { return xy && [xy[0][0], xy[1][0]]; }\n};\n\nvar Y = {\n name: \"y\",\n handles: [\"n\", \"s\"].map(type),\n input: function(y, e) { return y == null ? null : [[e[0][0], +y[0]], [e[1][0], +y[1]]]; },\n output: function(xy) { return xy && [xy[0][1], xy[1][1]]; }\n};\n\nvar XY = {\n name: \"xy\",\n handles: [\"n\", \"w\", \"e\", \"s\", \"nw\", \"ne\", \"sw\", \"se\"].map(type),\n input: function(xy) { return xy == null ? null : number2(xy); },\n output: function(xy) { return xy; }\n};\n\nvar cursors = {\n overlay: \"crosshair\",\n selection: \"move\",\n n: \"ns-resize\",\n e: \"ew-resize\",\n s: \"ns-resize\",\n w: \"ew-resize\",\n nw: \"nwse-resize\",\n ne: \"nesw-resize\",\n se: \"nwse-resize\",\n sw: \"nesw-resize\"\n};\n\nvar flipX = {\n e: \"w\",\n w: \"e\",\n nw: \"ne\",\n ne: \"nw\",\n se: \"sw\",\n sw: \"se\"\n};\n\nvar flipY = {\n n: \"s\",\n s: \"n\",\n nw: \"sw\",\n ne: \"se\",\n se: \"ne\",\n sw: \"nw\"\n};\n\nvar signsX = {\n overlay: +1,\n selection: +1,\n n: null,\n e: +1,\n s: null,\n w: -1,\n nw: -1,\n ne: +1,\n se: +1,\n sw: -1\n};\n\nvar signsY = {\n overlay: +1,\n selection: +1,\n n: -1,\n e: null,\n s: +1,\n w: null,\n nw: -1,\n ne: -1,\n se: +1,\n sw: +1\n};\n\nfunction type(t) {\n return {type: t};\n}\n\n// Ignore right-click, since that should open the context menu.\nfunction defaultFilter(event) {\n return !event.ctrlKey && !event.button;\n}\n\nfunction defaultExtent() {\n var svg = this.ownerSVGElement || this;\n if (svg.hasAttribute(\"viewBox\")) {\n svg = svg.viewBox.baseVal;\n return [[svg.x, svg.y], [svg.x + svg.width, svg.y + svg.height]];\n }\n return [[0, 0], [svg.width.baseVal.value, svg.height.baseVal.value]];\n}\n\nfunction defaultTouchable() {\n return navigator.maxTouchPoints || (\"ontouchstart\" in this);\n}\n\n// Like d3.local, but with the name “__brush” rather than auto-generated.\nfunction local(node) {\n while (!node.__brush) if (!(node = node.parentNode)) return;\n return node.__brush;\n}\n\nfunction empty(extent) {\n return extent[0][0] === extent[1][0]\n || extent[0][1] === extent[1][1];\n}\n\nexport function brushSelection(node) {\n var state = node.__brush;\n return state ? state.dim.output(state.selection) : null;\n}\n\nexport function brushX() {\n return brush(X);\n}\n\nexport function brushY() {\n return brush(Y);\n}\n\nexport default function() {\n return brush(XY);\n}\n\nfunction brush(dim) {\n var extent = defaultExtent,\n filter = defaultFilter,\n touchable = defaultTouchable,\n keys = true,\n listeners = dispatch(\"start\", \"brush\", \"end\"),\n handleSize = 6,\n touchending;\n\n function brush(group) {\n var overlay = group\n .property(\"__brush\", initialize)\n .selectAll(\".overlay\")\n .data([type(\"overlay\")]);\n\n overlay.enter().append(\"rect\")\n .attr(\"class\", \"overlay\")\n .attr(\"pointer-events\", \"all\")\n .attr(\"cursor\", cursors.overlay)\n .merge(overlay)\n .each(function() {\n var extent = local(this).extent;\n select(this)\n .attr(\"x\", extent[0][0])\n .attr(\"y\", extent[0][1])\n .attr(\"width\", extent[1][0] - extent[0][0])\n .attr(\"height\", extent[1][1] - extent[0][1]);\n });\n\n group.selectAll(\".selection\")\n .data([type(\"selection\")])\n .enter().append(\"rect\")\n .attr(\"class\", \"selection\")\n .attr(\"cursor\", cursors.selection)\n .attr(\"fill\", \"#777\")\n .attr(\"fill-opacity\", 0.3)\n .attr(\"stroke\", \"#fff\")\n .attr(\"shape-rendering\", \"crispEdges\");\n\n var handle = group.selectAll(\".handle\")\n .data(dim.handles, function(d) { return d.type; });\n\n handle.exit().remove();\n\n handle.enter().append(\"rect\")\n .attr(\"class\", function(d) { return \"handle handle--\" + d.type; })\n .attr(\"cursor\", function(d) { return cursors[d.type]; });\n\n group\n .each(redraw)\n .attr(\"fill\", \"none\")\n .attr(\"pointer-events\", \"all\")\n .on(\"mousedown.brush\", started)\n .filter(touchable)\n .on(\"touchstart.brush\", started)\n .on(\"touchmove.brush\", touchmoved)\n .on(\"touchend.brush touchcancel.brush\", touchended)\n .style(\"touch-action\", \"none\")\n .style(\"-webkit-tap-highlight-color\", \"rgba(0,0,0,0)\");\n }\n\n brush.move = function(group, selection) {\n if (group.tween) {\n group\n .on(\"start.brush\", function(event) { emitter(this, arguments).beforestart().start(event); })\n .on(\"interrupt.brush end.brush\", function(event) { emitter(this, arguments).end(event); })\n .tween(\"brush\", function() {\n var that = this,\n state = that.__brush,\n emit = emitter(that, arguments),\n selection0 = state.selection,\n selection1 = dim.input(typeof selection === \"function\" ? selection.apply(this, arguments) : selection, state.extent),\n i = interpolate(selection0, selection1);\n\n function tween(t) {\n state.selection = t === 1 && selection1 === null ? null : i(t);\n redraw.call(that);\n emit.brush();\n }\n\n return selection0 !== null && selection1 !== null ? tween : tween(1);\n });\n } else {\n group\n .each(function() {\n var that = this,\n args = arguments,\n state = that.__brush,\n selection1 = dim.input(typeof selection === \"function\" ? selection.apply(that, args) : selection, state.extent),\n emit = emitter(that, args).beforestart();\n\n interrupt(that);\n state.selection = selection1 === null ? null : selection1;\n redraw.call(that);\n emit.start().brush().end();\n });\n }\n };\n\n brush.clear = function(group) {\n brush.move(group, null);\n };\n\n function redraw() {\n var group = select(this),\n selection = local(this).selection;\n\n if (selection) {\n group.selectAll(\".selection\")\n .style(\"display\", null)\n .attr(\"x\", selection[0][0])\n .attr(\"y\", selection[0][1])\n .attr(\"width\", selection[1][0] - selection[0][0])\n .attr(\"height\", selection[1][1] - selection[0][1]);\n\n group.selectAll(\".handle\")\n .style(\"display\", null)\n .attr(\"x\", function(d) { return d.type[d.type.length - 1] === \"e\" ? selection[1][0] - handleSize / 2 : selection[0][0] - handleSize / 2; })\n .attr(\"y\", function(d) { return d.type[0] === \"s\" ? selection[1][1] - handleSize / 2 : selection[0][1] - handleSize / 2; })\n .attr(\"width\", function(d) { return d.type === \"n\" || d.type === \"s\" ? selection[1][0] - selection[0][0] + handleSize : handleSize; })\n .attr(\"height\", function(d) { return d.type === \"e\" || d.type === \"w\" ? selection[1][1] - selection[0][1] + handleSize : handleSize; });\n }\n\n else {\n group.selectAll(\".selection,.handle\")\n .style(\"display\", \"none\")\n .attr(\"x\", null)\n .attr(\"y\", null)\n .attr(\"width\", null)\n .attr(\"height\", null);\n }\n }\n\n function emitter(that, args, clean) {\n var emit = that.__brush.emitter;\n return emit && (!clean || !emit.clean) ? emit : new Emitter(that, args, clean);\n }\n\n function Emitter(that, args, clean) {\n this.that = that;\n this.args = args;\n this.state = that.__brush;\n this.active = 0;\n this.clean = clean;\n }\n\n Emitter.prototype = {\n beforestart: function() {\n if (++this.active === 1) this.state.emitter = this, this.starting = true;\n return this;\n },\n start: function(event, mode) {\n if (this.starting) this.starting = false, this.emit(\"start\", event, mode);\n else this.emit(\"brush\", event);\n return this;\n },\n brush: function(event, mode) {\n this.emit(\"brush\", event, mode);\n return this;\n },\n end: function(event, mode) {\n if (--this.active === 0) delete this.state.emitter, this.emit(\"end\", event, mode);\n return this;\n },\n emit: function(type, event, mode) {\n var d = select(this.that).datum();\n listeners.call(\n type,\n this.that,\n new BrushEvent(type, {\n sourceEvent: event,\n target: brush,\n selection: dim.output(this.state.selection),\n mode,\n dispatch: listeners\n }),\n d\n );\n }\n };\n\n function started(event) {\n if (touchending && !event.touches) return;\n if (!filter.apply(this, arguments)) return;\n\n var that = this,\n type = event.target.__data__.type,\n mode = (keys && event.metaKey ? type = \"overlay\" : type) === \"selection\" ? MODE_DRAG : (keys && event.altKey ? MODE_CENTER : MODE_HANDLE),\n signX = dim === Y ? null : signsX[type],\n signY = dim === X ? null : signsY[type],\n state = local(that),\n extent = state.extent,\n selection = state.selection,\n W = extent[0][0], w0, w1,\n N = extent[0][1], n0, n1,\n E = extent[1][0], e0, e1,\n S = extent[1][1], s0, s1,\n dx = 0,\n dy = 0,\n moving,\n shifting = signX && signY && keys && event.shiftKey,\n lockX,\n lockY,\n points = Array.from(event.touches || [event], t => {\n const i = t.identifier;\n t = pointer(t, that);\n t.point0 = t.slice();\n t.identifier = i;\n return t;\n });\n\n if (type === \"overlay\") {\n if (selection) moving = true;\n const pts = [points[0], points[1] || points[0]];\n state.selection = selection = [[\n w0 = dim === Y ? W : min(pts[0][0], pts[1][0]),\n n0 = dim === X ? N : min(pts[0][1], pts[1][1])\n ], [\n e0 = dim === Y ? E : max(pts[0][0], pts[1][0]),\n s0 = dim === X ? S : max(pts[0][1], pts[1][1])\n ]];\n if (points.length > 1) move();\n } else {\n w0 = selection[0][0];\n n0 = selection[0][1];\n e0 = selection[1][0];\n s0 = selection[1][1];\n }\n\n w1 = w0;\n n1 = n0;\n e1 = e0;\n s1 = s0;\n\n var group = select(that)\n .attr(\"pointer-events\", \"none\");\n\n var overlay = group.selectAll(\".overlay\")\n .attr(\"cursor\", cursors[type]);\n\n interrupt(that);\n var emit = emitter(that, arguments, true).beforestart();\n\n if (event.touches) {\n emit.moved = moved;\n emit.ended = ended;\n } else {\n var view = select(event.view)\n .on(\"mousemove.brush\", moved, true)\n .on(\"mouseup.brush\", ended, true);\n if (keys) view\n .on(\"keydown.brush\", keydowned, true)\n .on(\"keyup.brush\", keyupped, true)\n\n dragDisable(event.view);\n }\n\n redraw.call(that);\n emit.start(event, mode.name);\n\n function moved(event) {\n for (const p of event.changedTouches || [event]) {\n for (const d of points)\n if (d.identifier === p.identifier) d.cur = pointer(p, that);\n }\n if (shifting && !lockX && !lockY && points.length === 1) {\n const point = points[0];\n if (abs(point.cur[0] - point[0]) > abs(point.cur[1] - point[1]))\n lockY = true;\n else\n lockX = true;\n }\n for (const point of points)\n if (point.cur) point[0] = point.cur[0], point[1] = point.cur[1];\n moving = true;\n noevent(event);\n move(event);\n }\n\n function move(event) {\n const point = points[0], point0 = point.point0;\n var t;\n\n dx = point[0] - point0[0];\n dy = point[1] - point0[1];\n\n switch (mode) {\n case MODE_SPACE:\n case MODE_DRAG: {\n if (signX) dx = max(W - w0, min(E - e0, dx)), w1 = w0 + dx, e1 = e0 + dx;\n if (signY) dy = max(N - n0, min(S - s0, dy)), n1 = n0 + dy, s1 = s0 + dy;\n break;\n }\n case MODE_HANDLE: {\n if (points[1]) {\n if (signX) w1 = max(W, min(E, points[0][0])), e1 = max(W, min(E, points[1][0])), signX = 1;\n if (signY) n1 = max(N, min(S, points[0][1])), s1 = max(N, min(S, points[1][1])), signY = 1;\n } else {\n if (signX < 0) dx = max(W - w0, min(E - w0, dx)), w1 = w0 + dx, e1 = e0;\n else if (signX > 0) dx = max(W - e0, min(E - e0, dx)), w1 = w0, e1 = e0 + dx;\n if (signY < 0) dy = max(N - n0, min(S - n0, dy)), n1 = n0 + dy, s1 = s0;\n else if (signY > 0) dy = max(N - s0, min(S - s0, dy)), n1 = n0, s1 = s0 + dy;\n }\n break;\n }\n case MODE_CENTER: {\n if (signX) w1 = max(W, min(E, w0 - dx * signX)), e1 = max(W, min(E, e0 + dx * signX));\n if (signY) n1 = max(N, min(S, n0 - dy * signY)), s1 = max(N, min(S, s0 + dy * signY));\n break;\n }\n }\n\n if (e1 < w1) {\n signX *= -1;\n t = w0, w0 = e0, e0 = t;\n t = w1, w1 = e1, e1 = t;\n if (type in flipX) overlay.attr(\"cursor\", cursors[type = flipX[type]]);\n }\n\n if (s1 < n1) {\n signY *= -1;\n t = n0, n0 = s0, s0 = t;\n t = n1, n1 = s1, s1 = t;\n if (type in flipY) overlay.attr(\"cursor\", cursors[type = flipY[type]]);\n }\n\n if (state.selection) selection = state.selection; // May be set by brush.move!\n if (lockX) w1 = selection[0][0], e1 = selection[1][0];\n if (lockY) n1 = selection[0][1], s1 = selection[1][1];\n\n if (selection[0][0] !== w1\n || selection[0][1] !== n1\n || selection[1][0] !== e1\n || selection[1][1] !== s1) {\n state.selection = [[w1, n1], [e1, s1]];\n redraw.call(that);\n emit.brush(event, mode.name);\n }\n }\n\n function ended(event) {\n nopropagation(event);\n if (event.touches) {\n if (event.touches.length) return;\n if (touchending) clearTimeout(touchending);\n touchending = setTimeout(function() { touchending = null; }, 500); // Ghost clicks are delayed!\n } else {\n dragEnable(event.view, moving);\n view.on(\"keydown.brush keyup.brush mousemove.brush mouseup.brush\", null);\n }\n group.attr(\"pointer-events\", \"all\");\n overlay.attr(\"cursor\", cursors.overlay);\n if (state.selection) selection = state.selection; // May be set by brush.move (on start)!\n if (empty(selection)) state.selection = null, redraw.call(that);\n emit.end(event, mode.name);\n }\n\n function keydowned(event) {\n switch (event.keyCode) {\n case 16: { // SHIFT\n shifting = signX && signY;\n break;\n }\n case 18: { // ALT\n if (mode === MODE_HANDLE) {\n if (signX) e0 = e1 - dx * signX, w0 = w1 + dx * signX;\n if (signY) s0 = s1 - dy * signY, n0 = n1 + dy * signY;\n mode = MODE_CENTER;\n move();\n }\n break;\n }\n case 32: { // SPACE; takes priority over ALT\n if (mode === MODE_HANDLE || mode === MODE_CENTER) {\n if (signX < 0) e0 = e1 - dx; else if (signX > 0) w0 = w1 - dx;\n if (signY < 0) s0 = s1 - dy; else if (signY > 0) n0 = n1 - dy;\n mode = MODE_SPACE;\n overlay.attr(\"cursor\", cursors.selection);\n move();\n }\n break;\n }\n default: return;\n }\n noevent(event);\n }\n\n function keyupped(event) {\n switch (event.keyCode) {\n case 16: { // SHIFT\n if (shifting) {\n lockX = lockY = shifting = false;\n move();\n }\n break;\n }\n case 18: { // ALT\n if (mode === MODE_CENTER) {\n if (signX < 0) e0 = e1; else if (signX > 0) w0 = w1;\n if (signY < 0) s0 = s1; else if (signY > 0) n0 = n1;\n mode = MODE_HANDLE;\n move();\n }\n break;\n }\n case 32: { // SPACE\n if (mode === MODE_SPACE) {\n if (event.altKey) {\n if (signX) e0 = e1 - dx * signX, w0 = w1 + dx * signX;\n if (signY) s0 = s1 - dy * signY, n0 = n1 + dy * signY;\n mode = MODE_CENTER;\n } else {\n if (signX < 0) e0 = e1; else if (signX > 0) w0 = w1;\n if (signY < 0) s0 = s1; else if (signY > 0) n0 = n1;\n mode = MODE_HANDLE;\n }\n overlay.attr(\"cursor\", cursors[type]);\n move();\n }\n break;\n }\n default: return;\n }\n noevent(event);\n }\n }\n\n function touchmoved(event) {\n emitter(this, arguments).moved(event);\n }\n\n function touchended(event) {\n emitter(this, arguments).ended(event);\n }\n\n function initialize() {\n var state = this.__brush || {selection: null};\n state.extent = number2(extent.apply(this, arguments));\n state.dim = dim;\n return state;\n }\n\n brush.extent = function(_) {\n return arguments.length ? (extent = typeof _ === \"function\" ? _ : constant(number2(_)), brush) : extent;\n };\n\n brush.filter = function(_) {\n return arguments.length ? (filter = typeof _ === \"function\" ? _ : constant(!!_), brush) : filter;\n };\n\n brush.touchable = function(_) {\n return arguments.length ? (touchable = typeof _ === \"function\" ? _ : constant(!!_), brush) : touchable;\n };\n\n brush.handleSize = function(_) {\n return arguments.length ? (handleSize = +_, brush) : handleSize;\n };\n\n brush.keyModifiers = function(_) {\n return arguments.length ? (keys = !!_, brush) : keys;\n };\n\n brush.on = function() {\n var value = listeners.on.apply(listeners, arguments);\n return value === listeners ? brush : value;\n };\n\n return brush;\n}\n","export default function(x) {\n return Math.abs(x = Math.round(x)) >= 1e21\n ? x.toLocaleString(\"en\").replace(/,/g, \"\")\n : x.toString(10);\n}\n\n// Computes the decimal coefficient and exponent of the specified number x with\n// significant digits p, where x is positive and p is in [1, 21] or undefined.\n// For example, formatDecimalParts(1.23) returns [\"123\", 0].\nexport function formatDecimalParts(x, p) {\n if ((i = (x = p ? x.toExponential(p - 1) : x.toExponential()).indexOf(\"e\")) < 0) return null; // NaN, ±Infinity\n var i, coefficient = x.slice(0, i);\n\n // The string returned by toExponential either has the form \\d\\.\\d+e[-+]\\d+\n // (e.g., 1.2e+3) or the form \\de[-+]\\d+ (e.g., 1e+3).\n return [\n coefficient.length > 1 ? coefficient[0] + coefficient.slice(2) : coefficient,\n +x.slice(i + 1)\n ];\n}\n","import {formatDecimalParts} from \"./formatDecimal.js\";\n\nexport default function(x) {\n return x = formatDecimalParts(Math.abs(x)), x ? x[1] : NaN;\n}\n","// [[fill]align][sign][symbol][0][width][,][.precision][~][type]\nvar re = /^(?:(.)?([<>=^]))?([+\\-( ])?([$#])?(0)?(\\d+)?(,)?(\\.\\d+)?(~)?([a-z%])?$/i;\n\nexport default function formatSpecifier(specifier) {\n if (!(match = re.exec(specifier))) throw new Error(\"invalid format: \" + specifier);\n var match;\n return new FormatSpecifier({\n fill: match[1],\n align: match[2],\n sign: match[3],\n symbol: match[4],\n zero: match[5],\n width: match[6],\n comma: match[7],\n precision: match[8] && match[8].slice(1),\n trim: match[9],\n type: match[10]\n });\n}\n\nformatSpecifier.prototype = FormatSpecifier.prototype; // instanceof\n\nexport function FormatSpecifier(specifier) {\n this.fill = specifier.fill === undefined ? \" \" : specifier.fill + \"\";\n this.align = specifier.align === undefined ? \">\" : specifier.align + \"\";\n this.sign = specifier.sign === undefined ? \"-\" : specifier.sign + \"\";\n this.symbol = specifier.symbol === undefined ? \"\" : specifier.symbol + \"\";\n this.zero = !!specifier.zero;\n this.width = specifier.width === undefined ? undefined : +specifier.width;\n this.comma = !!specifier.comma;\n this.precision = specifier.precision === undefined ? undefined : +specifier.precision;\n this.trim = !!specifier.trim;\n this.type = specifier.type === undefined ? \"\" : specifier.type + \"\";\n}\n\nFormatSpecifier.prototype.toString = function() {\n return this.fill\n + this.align\n + this.sign\n + this.symbol\n + (this.zero ? \"0\" : \"\")\n + (this.width === undefined ? \"\" : Math.max(1, this.width | 0))\n + (this.comma ? \",\" : \"\")\n + (this.precision === undefined ? \"\" : \".\" + Math.max(0, this.precision | 0))\n + (this.trim ? \"~\" : \"\")\n + this.type;\n};\n","import {formatDecimalParts} from \"./formatDecimal.js\";\n\nexport var prefixExponent;\n\nexport default function(x, p) {\n var d = formatDecimalParts(x, p);\n if (!d) return x + \"\";\n var coefficient = d[0],\n exponent = d[1],\n i = exponent - (prefixExponent = Math.max(-8, Math.min(8, Math.floor(exponent / 3))) * 3) + 1,\n n = coefficient.length;\n return i === n ? coefficient\n : i > n ? coefficient + new Array(i - n + 1).join(\"0\")\n : i > 0 ? coefficient.slice(0, i) + \".\" + coefficient.slice(i)\n : \"0.\" + new Array(1 - i).join(\"0\") + formatDecimalParts(x, Math.max(0, p + i - 1))[0]; // less than 1y!\n}\n","import {formatDecimalParts} from \"./formatDecimal.js\";\n\nexport default function(x, p) {\n var d = formatDecimalParts(x, p);\n if (!d) return x + \"\";\n var coefficient = d[0],\n exponent = d[1];\n return exponent < 0 ? \"0.\" + new Array(-exponent).join(\"0\") + coefficient\n : coefficient.length > exponent + 1 ? coefficient.slice(0, exponent + 1) + \".\" + coefficient.slice(exponent + 1)\n : coefficient + new Array(exponent - coefficient.length + 2).join(\"0\");\n}\n","import formatDecimal from \"./formatDecimal.js\";\nimport formatPrefixAuto from \"./formatPrefixAuto.js\";\nimport formatRounded from \"./formatRounded.js\";\n\nexport default {\n \"%\": (x, p) => (x * 100).toFixed(p),\n \"b\": (x) => Math.round(x).toString(2),\n \"c\": (x) => x + \"\",\n \"d\": formatDecimal,\n \"e\": (x, p) => x.toExponential(p),\n \"f\": (x, p) => x.toFixed(p),\n \"g\": (x, p) => x.toPrecision(p),\n \"o\": (x) => Math.round(x).toString(8),\n \"p\": (x, p) => formatRounded(x * 100, p),\n \"r\": formatRounded,\n \"s\": formatPrefixAuto,\n \"X\": (x) => Math.round(x).toString(16).toUpperCase(),\n \"x\": (x) => Math.round(x).toString(16)\n};\n","export default function(x) {\n return x;\n}\n","import exponent from \"./exponent.js\";\nimport formatGroup from \"./formatGroup.js\";\nimport formatNumerals from \"./formatNumerals.js\";\nimport formatSpecifier from \"./formatSpecifier.js\";\nimport formatTrim from \"./formatTrim.js\";\nimport formatTypes from \"./formatTypes.js\";\nimport {prefixExponent} from \"./formatPrefixAuto.js\";\nimport identity from \"./identity.js\";\n\nvar map = Array.prototype.map,\n prefixes = [\"y\",\"z\",\"a\",\"f\",\"p\",\"n\",\"µ\",\"m\",\"\",\"k\",\"M\",\"G\",\"T\",\"P\",\"E\",\"Z\",\"Y\"];\n\nexport default function(locale) {\n var group = locale.grouping === undefined || locale.thousands === undefined ? identity : formatGroup(map.call(locale.grouping, Number), locale.thousands + \"\"),\n currencyPrefix = locale.currency === undefined ? \"\" : locale.currency[0] + \"\",\n currencySuffix = locale.currency === undefined ? \"\" : locale.currency[1] + \"\",\n decimal = locale.decimal === undefined ? \".\" : locale.decimal + \"\",\n numerals = locale.numerals === undefined ? identity : formatNumerals(map.call(locale.numerals, String)),\n percent = locale.percent === undefined ? \"%\" : locale.percent + \"\",\n minus = locale.minus === undefined ? \"−\" : locale.minus + \"\",\n nan = locale.nan === undefined ? \"NaN\" : locale.nan + \"\";\n\n function newFormat(specifier) {\n specifier = formatSpecifier(specifier);\n\n var fill = specifier.fill,\n align = specifier.align,\n sign = specifier.sign,\n symbol = specifier.symbol,\n zero = specifier.zero,\n width = specifier.width,\n comma = specifier.comma,\n precision = specifier.precision,\n trim = specifier.trim,\n type = specifier.type;\n\n // The \"n\" type is an alias for \",g\".\n if (type === \"n\") comma = true, type = \"g\";\n\n // The \"\" type, and any invalid type, is an alias for \".12~g\".\n else if (!formatTypes[type]) precision === undefined && (precision = 12), trim = true, type = \"g\";\n\n // If zero fill is specified, padding goes after sign and before digits.\n if (zero || (fill === \"0\" && align === \"=\")) zero = true, fill = \"0\", align = \"=\";\n\n // Compute the prefix and suffix.\n // For SI-prefix, the suffix is lazily computed.\n var prefix = symbol === \"$\" ? currencyPrefix : symbol === \"#\" && /[boxX]/.test(type) ? \"0\" + type.toLowerCase() : \"\",\n suffix = symbol === \"$\" ? currencySuffix : /[%p]/.test(type) ? percent : \"\";\n\n // What format function should we use?\n // Is this an integer type?\n // Can this type generate exponential notation?\n var formatType = formatTypes[type],\n maybeSuffix = /[defgprs%]/.test(type);\n\n // Set the default precision if not specified,\n // or clamp the specified precision to the supported range.\n // For significant precision, it must be in [1, 21].\n // For fixed precision, it must be in [0, 20].\n precision = precision === undefined ? 6\n : /[gprs]/.test(type) ? Math.max(1, Math.min(21, precision))\n : Math.max(0, Math.min(20, precision));\n\n function format(value) {\n var valuePrefix = prefix,\n valueSuffix = suffix,\n i, n, c;\n\n if (type === \"c\") {\n valueSuffix = formatType(value) + valueSuffix;\n value = \"\";\n } else {\n value = +value;\n\n // Determine the sign. -0 is not less than 0, but 1 / -0 is!\n var valueNegative = value < 0 || 1 / value < 0;\n\n // Perform the initial formatting.\n value = isNaN(value) ? nan : formatType(Math.abs(value), precision);\n\n // Trim insignificant zeros.\n if (trim) value = formatTrim(value);\n\n // If a negative value rounds to zero after formatting, and no explicit positive sign is requested, hide the sign.\n if (valueNegative && +value === 0 && sign !== \"+\") valueNegative = false;\n\n // Compute the prefix and suffix.\n valuePrefix = (valueNegative ? (sign === \"(\" ? sign : minus) : sign === \"-\" || sign === \"(\" ? \"\" : sign) + valuePrefix;\n valueSuffix = (type === \"s\" ? prefixes[8 + prefixExponent / 3] : \"\") + valueSuffix + (valueNegative && sign === \"(\" ? \")\" : \"\");\n\n // Break the formatted value into the integer “value” part that can be\n // grouped, and fractional or exponential “suffix” part that is not.\n if (maybeSuffix) {\n i = -1, n = value.length;\n while (++i < n) {\n if (c = value.charCodeAt(i), 48 > c || c > 57) {\n valueSuffix = (c === 46 ? decimal + value.slice(i + 1) : value.slice(i)) + valueSuffix;\n value = value.slice(0, i);\n break;\n }\n }\n }\n }\n\n // If the fill character is not \"0\", grouping is applied before padding.\n if (comma && !zero) value = group(value, Infinity);\n\n // Compute the padding.\n var length = valuePrefix.length + value.length + valueSuffix.length,\n padding = length < width ? new Array(width - length + 1).join(fill) : \"\";\n\n // If the fill character is \"0\", grouping is applied after padding.\n if (comma && zero) value = group(padding + value, padding.length ? width - valueSuffix.length : Infinity), padding = \"\";\n\n // Reconstruct the final output based on the desired alignment.\n switch (align) {\n case \"<\": value = valuePrefix + value + valueSuffix + padding; break;\n case \"=\": value = valuePrefix + padding + value + valueSuffix; break;\n case \"^\": value = padding.slice(0, length = padding.length >> 1) + valuePrefix + value + valueSuffix + padding.slice(length); break;\n default: value = padding + valuePrefix + value + valueSuffix; break;\n }\n\n return numerals(value);\n }\n\n format.toString = function() {\n return specifier + \"\";\n };\n\n return format;\n }\n\n function formatPrefix(specifier, value) {\n var f = newFormat((specifier = formatSpecifier(specifier), specifier.type = \"f\", specifier)),\n e = Math.max(-8, Math.min(8, Math.floor(exponent(value) / 3))) * 3,\n k = Math.pow(10, -e),\n prefix = prefixes[8 + e / 3];\n return function(value) {\n return f(k * value) + prefix;\n };\n }\n\n return {\n format: newFormat,\n formatPrefix: formatPrefix\n };\n}\n","import formatLocale from \"./locale.js\";\n\nvar locale;\nexport var format;\nexport var formatPrefix;\n\ndefaultLocale({\n thousands: \",\",\n grouping: [3],\n currency: [\"$\", \"\"]\n});\n\nexport default function defaultLocale(definition) {\n locale = formatLocale(definition);\n format = locale.format;\n formatPrefix = locale.formatPrefix;\n return locale;\n}\n","export default function(grouping, thousands) {\n return function(value, width) {\n var i = value.length,\n t = [],\n j = 0,\n g = grouping[0],\n length = 0;\n\n while (i > 0 && g > 0) {\n if (length + g + 1 > width) g = Math.max(1, width - length);\n t.push(value.substring(i -= g, i + g));\n if ((length += g + 1) > width) break;\n g = grouping[j = (j + 1) % grouping.length];\n }\n\n return t.reverse().join(thousands);\n };\n}\n","export default function(numerals) {\n return function(value) {\n return value.replace(/[0-9]/g, function(i) {\n return numerals[+i];\n });\n };\n}\n","// Trims insignificant zeros, e.g., replaces 1.2000k with 1.2k.\nexport default function(s) {\n out: for (var n = s.length, i = 1, i0 = -1, i1; i < n; ++i) {\n switch (s[i]) {\n case \".\": i0 = i1 = i; break;\n case \"0\": if (i0 === 0) i0 = i; i1 = i; break;\n default: if (!+s[i]) break out; if (i0 > 0) i0 = 0; break;\n }\n }\n return i0 > 0 ? s.slice(0, i0) + s.slice(i1 + 1) : s;\n}\n","import exponent from \"./exponent.js\";\n\nexport default function(step) {\n return Math.max(0, -exponent(Math.abs(step)));\n}\n","import exponent from \"./exponent.js\";\n\nexport default function(step, value) {\n return Math.max(0, Math.max(-8, Math.min(8, Math.floor(exponent(value) / 3))) * 3 - exponent(Math.abs(step)));\n}\n","import exponent from \"./exponent.js\";\n\nexport default function(step, max) {\n step = Math.abs(step), max = Math.abs(max) - step;\n return Math.max(0, exponent(max) - exponent(step)) + 1;\n}\n","var e10 = Math.sqrt(50),\n e5 = Math.sqrt(10),\n e2 = Math.sqrt(2);\n\nexport default function(start, stop, count) {\n var reverse,\n i = -1,\n n,\n ticks,\n step;\n\n stop = +stop, start = +start, count = +count;\n if (start === stop && count > 0) return [start];\n if (reverse = stop < start) n = start, start = stop, stop = n;\n if ((step = tickIncrement(start, stop, count)) === 0 || !isFinite(step)) return [];\n\n if (step > 0) {\n start = Math.ceil(start / step);\n stop = Math.floor(stop / step);\n ticks = new Array(n = Math.ceil(stop - start + 1));\n while (++i < n) ticks[i] = (start + i) * step;\n } else {\n step = -step;\n start = Math.ceil(start * step);\n stop = Math.floor(stop * step);\n ticks = new Array(n = Math.ceil(stop - start + 1));\n while (++i < n) ticks[i] = (start + i) / step;\n }\n\n if (reverse) ticks.reverse();\n\n return ticks;\n}\n\nexport function tickIncrement(start, stop, count) {\n var step = (stop - start) / Math.max(0, count),\n power = Math.floor(Math.log(step) / Math.LN10),\n error = step / Math.pow(10, power);\n return power >= 0\n ? (error >= e10 ? 10 : error >= e5 ? 5 : error >= e2 ? 2 : 1) * Math.pow(10, power)\n : -Math.pow(10, -power) / (error >= e10 ? 10 : error >= e5 ? 5 : error >= e2 ? 2 : 1);\n}\n\nexport function tickStep(start, stop, count) {\n var step0 = Math.abs(stop - start) / Math.max(0, count),\n step1 = Math.pow(10, Math.floor(Math.log(step0) / Math.LN10)),\n error = step0 / step1;\n if (error >= e10) step1 *= 10;\n else if (error >= e5) step1 *= 5;\n else if (error >= e2) step1 *= 2;\n return stop < start ? -step1 : step1;\n}\n","export default function(a, b) {\n return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;\n}\n","import ascending from \"./ascending.js\";\n\nexport default function(f) {\n let delta = f;\n let compare = f;\n\n if (f.length === 1) {\n delta = (d, x) => f(d) - x;\n compare = ascendingComparator(f);\n }\n\n function left(a, x, lo, hi) {\n if (lo == null) lo = 0;\n if (hi == null) hi = a.length;\n while (lo < hi) {\n const mid = (lo + hi) >>> 1;\n if (compare(a[mid], x) < 0) lo = mid + 1;\n else hi = mid;\n }\n return lo;\n }\n\n function right(a, x, lo, hi) {\n if (lo == null) lo = 0;\n if (hi == null) hi = a.length;\n while (lo < hi) {\n const mid = (lo + hi) >>> 1;\n if (compare(a[mid], x) > 0) hi = mid;\n else lo = mid + 1;\n }\n return lo;\n }\n\n function center(a, x, lo, hi) {\n if (lo == null) lo = 0;\n if (hi == null) hi = a.length;\n const i = left(a, x, lo, hi - 1);\n return i > lo && delta(a[i - 1], x) > -delta(a[i], x) ? i - 1 : i;\n }\n\n return {left, center, right};\n}\n\nfunction ascendingComparator(f) {\n return (d, x) => ascending(f(d), x);\n}\n","import ascending from \"./ascending.js\";\nimport bisector from \"./bisector.js\";\nimport number from \"./number.js\";\n\nconst ascendingBisect = bisector(ascending);\nexport const bisectRight = ascendingBisect.right;\nexport const bisectLeft = ascendingBisect.left;\nexport const bisectCenter = bisector(number).center;\nexport default bisectRight;\n","export default function(x) {\n return x === null ? NaN : +x;\n}\n\nexport function* numbers(values, valueof) {\n if (valueof === undefined) {\n for (let value of values) {\n if (value != null && (value = +value) >= value) {\n yield value;\n }\n }\n } else {\n let index = -1;\n for (let value of values) {\n if ((value = valueof(value, ++index, values)) != null && (value = +value) >= value) {\n yield value;\n }\n }\n }\n}\n","export default function(a, b) {\n return a = +a, b = +b, function(t) {\n return Math.round(a * (1 - t) + b * t);\n };\n}\n","export default function number(x) {\n return +x;\n}\n","import {bisect} from \"d3-array\";\nimport {interpolate as interpolateValue, interpolateNumber, interpolateRound} from \"d3-interpolate\";\nimport constant from \"./constant.js\";\nimport number from \"./number.js\";\n\nvar unit = [0, 1];\n\nexport function identity(x) {\n return x;\n}\n\nfunction normalize(a, b) {\n return (b -= (a = +a))\n ? function(x) { return (x - a) / b; }\n : constant(isNaN(b) ? NaN : 0.5);\n}\n\nfunction clamper(a, b) {\n var t;\n if (a > b) t = a, a = b, b = t;\n return function(x) { return Math.max(a, Math.min(b, x)); };\n}\n\n// normalize(a, b)(x) takes a domain value x in [a,b] and returns the corresponding parameter t in [0,1].\n// interpolate(a, b)(t) takes a parameter t in [0,1] and returns the corresponding range value x in [a,b].\nfunction bimap(domain, range, interpolate) {\n var d0 = domain[0], d1 = domain[1], r0 = range[0], r1 = range[1];\n if (d1 < d0) d0 = normalize(d1, d0), r0 = interpolate(r1, r0);\n else d0 = normalize(d0, d1), r0 = interpolate(r0, r1);\n return function(x) { return r0(d0(x)); };\n}\n\nfunction polymap(domain, range, interpolate) {\n var j = Math.min(domain.length, range.length) - 1,\n d = new Array(j),\n r = new Array(j),\n i = -1;\n\n // Reverse descending domains.\n if (domain[j] < domain[0]) {\n domain = domain.slice().reverse();\n range = range.slice().reverse();\n }\n\n while (++i < j) {\n d[i] = normalize(domain[i], domain[i + 1]);\n r[i] = interpolate(range[i], range[i + 1]);\n }\n\n return function(x) {\n var i = bisect(domain, x, 1, j) - 1;\n return r[i](d[i](x));\n };\n}\n\nexport function copy(source, target) {\n return target\n .domain(source.domain())\n .range(source.range())\n .interpolate(source.interpolate())\n .clamp(source.clamp())\n .unknown(source.unknown());\n}\n\nexport function transformer() {\n var domain = unit,\n range = unit,\n interpolate = interpolateValue,\n transform,\n untransform,\n unknown,\n clamp = identity,\n piecewise,\n output,\n input;\n\n function rescale() {\n var n = Math.min(domain.length, range.length);\n if (clamp !== identity) clamp = clamper(domain[0], domain[n - 1]);\n piecewise = n > 2 ? polymap : bimap;\n output = input = null;\n return scale;\n }\n\n function scale(x) {\n return isNaN(x = +x) ? unknown : (output || (output = piecewise(domain.map(transform), range, interpolate)))(transform(clamp(x)));\n }\n\n scale.invert = function(y) {\n return clamp(untransform((input || (input = piecewise(range, domain.map(transform), interpolateNumber)))(y)));\n };\n\n scale.domain = function(_) {\n return arguments.length ? (domain = Array.from(_, number), rescale()) : domain.slice();\n };\n\n scale.range = function(_) {\n return arguments.length ? (range = Array.from(_), rescale()) : range.slice();\n };\n\n scale.rangeRound = function(_) {\n return range = Array.from(_), interpolate = interpolateRound, rescale();\n };\n\n scale.clamp = function(_) {\n return arguments.length ? (clamp = _ ? true : identity, rescale()) : clamp !== identity;\n };\n\n scale.interpolate = function(_) {\n return arguments.length ? (interpolate = _, rescale()) : interpolate;\n };\n\n scale.unknown = function(_) {\n return arguments.length ? (unknown = _, scale) : unknown;\n };\n\n return function(t, u) {\n transform = t, untransform = u;\n return rescale();\n };\n}\n\nexport default function continuous() {\n return transformer()(identity, identity);\n}\n","export default function constants(x) {\n return function() {\n return x;\n };\n}\n","export function initRange(domain, range) {\n switch (arguments.length) {\n case 0: break;\n case 1: this.range(domain); break;\n default: this.range(range).domain(domain); break;\n }\n return this;\n}\n\nexport function initInterpolator(domain, interpolator) {\n switch (arguments.length) {\n case 0: break;\n case 1: {\n if (typeof domain === \"function\") this.interpolator(domain);\n else this.range(domain);\n break;\n }\n default: {\n this.domain(domain);\n if (typeof interpolator === \"function\") this.interpolator(interpolator);\n else this.range(interpolator);\n break;\n }\n }\n return this;\n}\n","import {ticks, tickIncrement} from \"d3-array\";\nimport continuous, {copy} from \"./continuous.js\";\nimport {initRange} from \"./init.js\";\nimport tickFormat from \"./tickFormat.js\";\n\nexport function linearish(scale) {\n var domain = scale.domain;\n\n scale.ticks = function(count) {\n var d = domain();\n return ticks(d[0], d[d.length - 1], count == null ? 10 : count);\n };\n\n scale.tickFormat = function(count, specifier) {\n var d = domain();\n return tickFormat(d[0], d[d.length - 1], count == null ? 10 : count, specifier);\n };\n\n scale.nice = function(count) {\n if (count == null) count = 10;\n\n var d = domain();\n var i0 = 0;\n var i1 = d.length - 1;\n var start = d[i0];\n var stop = d[i1];\n var prestep;\n var step;\n var maxIter = 10;\n\n if (stop < start) {\n step = start, start = stop, stop = step;\n step = i0, i0 = i1, i1 = step;\n }\n \n while (maxIter-- > 0) {\n step = tickIncrement(start, stop, count);\n if (step === prestep) {\n d[i0] = start\n d[i1] = stop\n return domain(d);\n } else if (step > 0) {\n start = Math.floor(start / step) * step;\n stop = Math.ceil(stop / step) * step;\n } else if (step < 0) {\n start = Math.ceil(start * step) / step;\n stop = Math.floor(stop * step) / step;\n } else {\n break;\n }\n prestep = step;\n }\n\n return scale;\n };\n\n return scale;\n}\n\nexport default function linear() {\n var scale = continuous();\n\n scale.copy = function() {\n return copy(scale, linear());\n };\n\n initRange.apply(scale, arguments);\n\n return linearish(scale);\n}\n","import {tickStep} from \"d3-array\";\nimport {format, formatPrefix, formatSpecifier, precisionFixed, precisionPrefix, precisionRound} from \"d3-format\";\n\nexport default function tickFormat(start, stop, count, specifier) {\n var step = tickStep(start, stop, count),\n precision;\n specifier = formatSpecifier(specifier == null ? \",f\" : specifier);\n switch (specifier.type) {\n case \"s\": {\n var value = Math.max(Math.abs(start), Math.abs(stop));\n if (specifier.precision == null && !isNaN(precision = precisionPrefix(step, value))) specifier.precision = precision;\n return formatPrefix(specifier, value);\n }\n case \"\":\n case \"e\":\n case \"g\":\n case \"p\":\n case \"r\": {\n if (specifier.precision == null && !isNaN(precision = precisionRound(step, Math.max(Math.abs(start), Math.abs(stop))))) specifier.precision = precision - (specifier.type === \"e\");\n break;\n }\n case \"f\":\n case \"%\": {\n if (specifier.precision == null && !isNaN(precision = precisionFixed(step))) specifier.precision = precision - (specifier.type === \"%\") * 2;\n break;\n }\n }\n return format(specifier);\n}\n","var organismMetadata = {\r\n 9606: {\r\n commonName: 'Human',\r\n scientificName: 'Homo sapiens',\r\n assemblies: {\r\n default: 'GCF_000001405.26', // GRCh38\r\n GRCh38: 'GCF_000001405.26',\r\n GRCh37: 'GCF_000001405.13',\r\n NCBI36: 'GCF_000001405.12'\r\n },\r\n hasGeneCache: true,\r\n hasParalogCache: true,\r\n hasInteractionCache: true\r\n },\r\n 10090: {\r\n commonName: 'Mouse',\r\n scientificName: 'Mus musculus',\r\n assemblies: {\r\n default: 'GCF_000001635.20', // GRCm38\r\n GRCm38: 'GCF_000001635.20',\r\n MGSCv37: 'GCF_000001635.18'\r\n },\r\n hasGeneCache: true,\r\n hasParalogCache: true,\r\n hasInteractionCache: true\r\n },\r\n 9598: {\r\n commonName: 'Chimpanzee',\r\n scientificName: 'Pan troglodytes',\r\n assemblies: {\r\n 'default': 'GCF_000001515.7',\r\n 'Pan_tro 3.0': 'GCF_000001515.7'\r\n },\r\n hasGeneCache: true,\r\n hasParalogCache: true\r\n },\r\n 10116: {\r\n commonName: 'Rat',\r\n scientificName: 'Rattus norvegicus',\r\n assemblies: {\r\n 'default': 'GCF_000001895.5',\r\n 'Rnor_6.0': 'GCF_000001895.5'\r\n },\r\n hasGeneCache: true,\r\n hasParalogCache: true\r\n },\r\n 3702: {\r\n commonName: 'Thale cress',\r\n scientificName: 'Arabidopsis thaliana',\r\n assemblies: {\r\n default: 'GCF_000001735.3', // TAIR10\r\n TAIR10: 'GCF_000001735.3'\r\n }\r\n },\r\n 4530: {\r\n commonName: 'Rice',\r\n scientificName: 'Oryza sativa',\r\n assemblies: {\r\n 'default': 'GCA_001433935.1',\r\n 'IRGSP-1.0': 'GCA_001433935.1'\r\n }\r\n },\r\n 4577: {\r\n commonName: 'Maize',\r\n scientificName: 'Zea mays',\r\n assemblies: {\r\n 'default': 'GCA_000005005.5',\r\n 'IRGSP-1.0': 'GCA_001433935.1'\r\n }\r\n },\r\n 4641: {\r\n commonName: 'Banana',\r\n scientificName: 'Musa acuminata',\r\n assemblies: {\r\n default: 'mock'\r\n }\r\n },\r\n 7227: {\r\n commonName: 'Fly',\r\n scientificName: 'Drosophila melanogaster',\r\n assemblies: {\r\n 'default': 'GCA_000001215.4',\r\n 'Release 6 plus ISO1 MT': 'GCA_000001215.4'\r\n }\r\n },\r\n 7165: {\r\n commonName: 'Mosquito',\r\n scientificName: 'Anopheles gambiae',\r\n assemblies: {\r\n default: 'GCF_000005575.2'\r\n }\r\n },\r\n 746128: {\r\n commonName: 'Aspergillis fumigatus',\r\n scientificName: 'Aspergillis fumigatus',\r\n assemblies: {\r\n default: 'GCF_000002655.1'\r\n }\r\n },\r\n 227321: {\r\n scientificName: 'Aspergillus nidulans',\r\n assemblies: {\r\n default: 'GCF_000149205.2'\r\n }\r\n },\r\n 5061: {\r\n commonName: 'black mold',\r\n scientificName: 'Aspergillus niger',\r\n assemblies: {\r\n default: 'GCF_003184595.1'\r\n }\r\n },\r\n 5062: {\r\n commonName: 'koji',\r\n scientificName: 'Aspergillus oryzae',\r\n assemblies: {\r\n default: 'GCF_000184455.2'\r\n }\r\n },\r\n 15368: {\r\n commonName: 'stiff brome',\r\n scientificName: 'Brachypodium distachyon',\r\n assemblies: {\r\n default: 'GCF_000005505.3'\r\n }\r\n },\r\n 60711: {\r\n commonName: 'green monkey',\r\n scientificName: 'Chlorocebus sabaeus',\r\n assemblies: {\r\n default: 'GCF_015252025.1'\r\n }\r\n },\r\n 7719: {\r\n commonName: 'Vase tunicate',\r\n scientificName: 'Ciona intestinalis',\r\n assemblies: {\r\n default: 'GCF_000224145.3'\r\n }\r\n },\r\n 9685: {\r\n commonName: 'Cat',\r\n scientificName: 'Felis catus',\r\n assemblies: {\r\n default: 'GCF_000181335.3'\r\n },\r\n hasGeneCache: true\r\n },\r\n 9031: {\r\n commonName: 'Chicken',\r\n scientificName: 'Gallus gallus',\r\n assemblies: {\r\n default: 'GCF_000002315.6'\r\n },\r\n hasGeneCache: true,\r\n hasParalogCache: true\r\n },\r\n 9593: {\r\n commonName: 'Gorilla',\r\n scientificName: 'Gorilla gorilla',\r\n assemblies: {\r\n default: 'GCF_008122165.1'\r\n }\r\n },\r\n 4513: {\r\n commonName: 'Barley',\r\n scientificName: 'Hordeum vulgare',\r\n assemblies: {\r\n default: 'GCA_901482405.1'\r\n }\r\n },\r\n 9541: {\r\n commonName: 'Crab-eating macaque',\r\n scientificName: 'Macaca fascicularis',\r\n assemblies: {\r\n default: 'GCF_000364345.1'\r\n },\r\n hasGeneCache: true,\r\n hasParalogCache: true\r\n },\r\n 9544: {\r\n commonName: 'Rhesus macaque',\r\n scientificName: 'Macaca mulatta',\r\n assemblies: {\r\n default: 'GCF_003339765.1'\r\n },\r\n hasGeneCache: true,\r\n hasParalogCache: true\r\n },\r\n 9597: {\r\n commonName: 'Bonobo',\r\n scientificName: 'Pan paniscus',\r\n assemblies: {\r\n default: 'GCF_013052645.1'\r\n }\r\n },\r\n 9615: {\r\n commonName: 'Dog',\r\n scientificName: 'Canis lupus familiaris',\r\n assemblies: {\r\n default: 'GCF_014441545.1'\r\n },\r\n hasGeneCache: true,\r\n hasParalogCache: true\r\n },\r\n 4932: {\r\n commonName: 'Yeast',\r\n scientificName: 'Saccharomyces cerevisiae',\r\n assemblies: {\r\n default: 'GCA_000146045.2',\r\n R64: 'GCA_000146045.2'\r\n }\r\n },\r\n 5833: {\r\n commonName: 'malaria parasite',\r\n scientificName: 'Plasmodium falciparum',\r\n assemblies: {\r\n default: 'GCA_000002765.3',\r\n GCA_000002765: 'GCA_000002765.3'\r\n }\r\n },\r\n 6239: {\r\n commonName: 'worm',\r\n scientificName: 'Caenorhabditis elegans',\r\n assemblies: {\r\n default: 'GCF_000002985.6'\r\n },\r\n hasGeneCache: true,\r\n hasParalogCache: true\r\n },\r\n 4081: {\r\n commonName: 'tomato',\r\n scientificName: 'Solanum lycopersicum',\r\n assemblies: {\r\n default: 'GCF_000188115.4'\r\n }\r\n },\r\n 4072: {\r\n commonName: 'pepper',\r\n scientificName: 'Capsicum annuum',\r\n assemblies: {\r\n default: 'GCF_000710875.1'\r\n }\r\n }\r\n};\r\n\r\nexport {organismMetadata};\r\n","var staticColors, staticCss, staticGradients;\r\n\r\n// Gradient colors for each class, for polished rendering\r\nstaticColors = [\r\n ['gneg', '#FFF', '#FFF', '#DDD'],\r\n ['gpos25', '#C8C8C8', '#DDD', '#BBB'],\r\n ['gpos33', '#BBB', '#BBB', '#AAA'],\r\n ['gpos50', '#999', '#AAA', '#888'],\r\n ['gpos66', '#888', '#888', '#666'],\r\n ['gpos75', '#777', '#777', '#444'],\r\n ['gpos100', '#444', '#666', '#000'],\r\n ['acen', '#FEE', '#FEE', '#FDD'],\r\n ['noBands', '#BBB', '#BBB', '#AAA']\r\n];\r\n\r\nstaticCss =\r\n '#_ideogram {padding-left: 5px;} ' +\r\n '#_ideogram .labeled {padding-left: 15px;} ' +\r\n '#_ideogram.labeledLeft {padding-left: 15px; padding-top: 15px;} ' +\r\n // Tahoma has great readability and space utilization at small sizes\r\n // More: http://ux.stackexchange.com/a/3334\r\n '#_ideogram text {font: 9px Tahoma; fill: #000;} ' +\r\n '#_ideogram .italic {font-style: italic;} ' +\r\n '#_ideogram .chromosome {cursor: pointer; fill: #AAA;}' +\r\n '#_ideogram.no-rotate .chromosome {cursor: default;} ' +\r\n '#_ideogram .chrLabel, #_ideogram .annot {cursor: pointer;}' +\r\n '#_ideogram .chrSetLabel {font-weight: bolder;}' +\r\n '#_ideogram .ghost {opacity: 0.2;}' +\r\n '#_ideogram .hidden {display: none;}' +\r\n '#_ideogram .bandLabelStalk line {stroke: #AAA; stroke-width: 1;}' +\r\n '#_ideogram .syntenyBorder {stroke:#AAA;stroke-width:1;}' +\r\n '#_ideogram rect.cursor {' +\r\n ' fill: #F00;' +\r\n ' stroke: #F00;' +\r\n ' fill-opacity: .3;' +\r\n ' shape-rendering: crispEdges;' +\r\n '}' +\r\n '#_ideogram .brush .selection {' +\r\n ' fill: #F00;' +\r\n ' stroke: #F00;' +\r\n ' fill-opacity: .3;' +\r\n ' shape-rendering: crispEdges;' +\r\n '}' +\r\n '#_ideogram .noBands {fill: #AAA;}' +\r\n // NCBI stain density colors\r\n '#_ideogram .gneg {fill: #FFF}' +\r\n '#_ideogram .gpos25 {fill: #BBB}' +\r\n '#_ideogram .gpos33 {fill: #AAA}' +\r\n '#_ideogram .gpos50 {fill: #888}' +\r\n '#_ideogram .gpos66 {fill: #666}' +\r\n '#_ideogram .gpos75 {fill: #444}' +\r\n '#_ideogram .gpos100 {fill: #000}' +\r\n '#_ideogram .gpos {fill: #000}' +\r\n '#_ideogram .acen {fill: #FDD}' +\r\n '#_ideogram .stalk {fill: #CCE;}' +\r\n '#_ideogram .gvar {fill: #DDF}' +\r\n // Used when overlaid with annotations\r\n '#_ideogram.faint .gneg {fill: #FFF}' +\r\n '#_ideogram.faint .gpos25 {fill: #EEE}' +\r\n '#_ideogram.faint .gpos33 {fill: #EEE}' +\r\n '#_ideogram.faint .gpos50 {fill: #EEE}' +\r\n '#_ideogram.faint .gpos66 {fill: #EEE}' +\r\n '#_ideogram.faint .gpos75 {fill: #EEE}' +\r\n '#_ideogram.faint .gpos100 {fill: #DDD}' +\r\n '#_ideogram.faint .gpos {fill: #DDD}' +\r\n '#_ideogram.faint .acen {fill: #FEE}' +\r\n '#_ideogram.faint .stalk {fill: #EEF;}' +\r\n '#_ideogram.faint .gvar {fill: #EEF}' +\r\n // For sheen, i.e. the soft shine in chromosomes\r\n '#_ideogram .gneg {fill: url(\"#gneg\")} ' +\r\n '#_ideogram .gpos25 {fill: url(\"#gpos25\")} ' +\r\n '#_ideogram .gpos33 {fill: url(\"#gpos33\")} ' +\r\n '#_ideogram .gpos50 {fill: url(\"#gpos50\")} ' +\r\n '#_ideogram .gpos66 {fill: url(\"#gpos66\")} ' +\r\n '#_ideogram .gpos75 {fill: url(\"#gpos75\")} ' +\r\n '#_ideogram .gpos100 {fill: url(\"#gpos100\")} ' +\r\n '#_ideogram .gpos {fill: url(\"#gpos100\")} ' +\r\n '#_ideogram .acen {fill: url(\"#acen\")} ' +\r\n '#_ideogram .stalk {fill: url(\"#stalk\")} ' +\r\n '#_ideogram .gvar {fill: url(\"#gvar\")} ' +\r\n '#_ideogram .noBands {fill: url(\"#noBands\")} ' +\r\n '#_ideogram .chromosome {fill: url(\"#noBands\")} ';\r\n\r\nstaticGradients =\r\n '' +\r\n ' ' +\r\n '' +\r\n '' +\r\n '' +\r\n ' ' +\r\n '' +\r\n '';\r\n\r\nexport {staticColors, staticCss, staticGradients};\r\n","/**\r\n * @fileoverview A collection of Ideogram methods that don't fit elsewhere.\r\n */\r\n\r\nimport {select, selectAll} from 'd3-selection';\r\nimport * as d3fetch from 'd3-fetch';\r\nimport * as d3brush from 'd3-brush';\r\nimport * as d3dispatch from 'd3-dispatch';\r\nimport * as d3format from 'd3-format';\r\nimport {scaleLinear} from 'd3-scale';\r\nimport {max} from 'd3-array';\r\n\r\nimport {organismMetadata} from './init/organism-metadata';\r\n\r\nvar d3 = Object.assign(\r\n {}, d3fetch, d3brush, d3dispatch, d3format\r\n);\r\n\r\nd3.select = select;\r\nd3.selectAll = selectAll;\r\nd3.scaleLinear = scaleLinear;\r\nd3.max = max;\r\n\r\n/**\r\n * Is the assembly in this.config an NCBI Assembly accession?\r\n *\r\n * @returns {boolean}\r\n */\r\nfunction assemblyIsAccession() {\r\n return (\r\n 'assembly' in this.config &&\r\n /(GCF_|GCA_)/.test(this.config.assembly)\r\n );\r\n}\r\n\r\n/**\r\n * Is the assembly in this.config not from GenBank?\r\n *\r\n * @returns {boolean}\r\n */\r\nfunction hasNonGenBankAssembly(ideo) {\r\n return (\r\n 'assembly' in ideo.config &&\r\n /(GCA_)/.test(ideo.config.assembly) === false\r\n );\r\n}\r\n\r\n/**\r\n * Is the assembly in this.config from GenBank?\r\n *\r\n * @returns {boolean}\r\n */\r\nfunction hasGenBankAssembly(ideo) {\r\n return (\r\n 'assembly' in ideo.config &&\r\n /(GCA_)/.test(ideo.config.assembly)\r\n );\r\n}\r\n\r\nfunction getDir(dir) {\r\n var script, tmp, protocol, dataDir, ideogramInLeaf,\r\n scripts = document.scripts,\r\n version = Ideogram.version;\r\n\r\n if (location.pathname.includes('/examples/vanilla/') === false) {\r\n return (\r\n `https://cdn.jsdelivr.net/npm/ideogram@${version}/dist/data/${dir}`\r\n );\r\n }\r\n\r\n for (var i = 0; i < scripts.length; i++) {\r\n script = scripts[i];\r\n ideogramInLeaf = /ideogram/.test(script.src.split('/').slice(-1));\r\n if ('src' in script && ideogramInLeaf) {\r\n tmp = script.src.split('//');\r\n protocol = tmp[0];\r\n tmp = '/' + tmp[1].split('/').slice(0, -2).join('/');\r\n dataDir = protocol + '//' + tmp + '/data/' + dir;\r\n return dataDir;\r\n }\r\n }\r\n\r\n return '../data/' + dir;\r\n}\r\n\r\n/** Try request, and if failed then retry with URL lacking extension */\r\nfunction fetchWithRetry(url, isRetry=false) {\r\n return fetch(url)\r\n .then((response) => {\r\n if (response.ok) {\r\n return response;\r\n } else {\r\n if (isRetry === false) {\r\n var urlWithoutExtension = url.replace('.json', '');\r\n return fetchWithRetry(urlWithoutExtension, true);\r\n } else {\r\n throw Error('Fetch failed for ' + url);\r\n }\r\n }\r\n });\r\n}\r\n\r\n/**\r\n * Returns directory used to fetch data for bands and annotations\r\n *\r\n * This simplifies ideogram configuration. By default, the dataDir is\r\n * set to an external CDN unless we're serving from the local Ideogram\r\n * working directory\r\n *\r\n * @returns {String}\r\n */\r\nfunction getDataDir() {\r\n return getDir('bands/native/');\r\n}\r\n\r\n/**\r\n * Rounds a float (e.g. SVG coordinate) to two decimal places\r\n *\r\n * @param coord Floating-point number, e.g. 42.1234567890\r\n * @returns {number} Rounded value, e.g. 42.12\r\n */\r\nfunction round(coord) {\r\n // Per http://stackoverflow.com/a/9453447, below method is fastest\r\n return Math.round(coord * 100) / 100;\r\n}\r\n\r\nfunction onDidRotate(chrModel) {\r\n call(this.onDidRotateCallback, chrModel);\r\n}\r\n\r\n/**\r\n * Get ideogram SVG container\r\n */\r\nfunction getSvg() {\r\n return d3.select(this.selector).node();\r\n}\r\n\r\n/** Request data with Ideogram's authorization bearer token */\r\nfunction fetchWithAuth(url, contentType) {\r\n var ideo = this,\r\n config = ideo.config,\r\n headers = new Headers();\r\n\r\n if (config.accessToken) {\r\n headers = new Headers({Authorization: 'Bearer ' + config.accessToken});\r\n }\r\n\r\n if (contentType === 'text') {\r\n return d3.text(url, {headers: headers});\r\n } else {\r\n return d3.json(url, {headers: headers});\r\n }\r\n}\r\n\r\n/** getTaxid(), but without need to initialize ideogram */\r\nfunction getEarlyTaxid(name) {\r\n name = slug(name);\r\n for (const taxid in organismMetadata) {\r\n const organism = organismMetadata[taxid];\r\n const commonName = slug(organism.commonName);\r\n const scientificName = slug(organism.scientificName);\r\n if (commonName === name || scientificName === name) {\r\n return taxid;\r\n }\r\n }\r\n\r\n return null;\r\n}\r\n\r\n/**\r\n * Get organism's taxid (NCBI Taxonomy ID) given its common or scientific name\r\n */\r\nfunction getTaxid(name) {\r\n var organism, taxid, commonName, scientificName,\r\n ideo = this,\r\n organisms = ideo.organisms;\r\n\r\n name = slug(name);\r\n\r\n for (taxid in organisms) {\r\n organism = organisms[taxid];\r\n commonName = slug(organism.commonName);\r\n scientificName = slug(organism.scientificName);\r\n if (commonName === name || scientificName === name) {\r\n return taxid;\r\n }\r\n }\r\n\r\n return null;\r\n}\r\n\r\n/**\r\n * Get organism's common name given its taxid\r\n */\r\nfunction getCommonName(taxid) {\r\n var ideo = this;\r\n if (taxid in ideo.organisms) {\r\n return ideo.organisms[taxid].commonName;\r\n }\r\n return null;\r\n}\r\n\r\n/**\r\n * Get organism's scientific name given its taxid\r\n */\r\nfunction getScientificName(taxid) {\r\n var ideo = this;\r\n if (taxid in ideo.organisms) {\r\n return ideo.organisms[taxid].scientificName;\r\n }\r\n return null;\r\n}\r\n\r\n/**\r\n* Examples:\r\n* \"Homo sapiens\" -> \"homo-sapiens\"\r\n* \"Canis lupus familiaris\" -> \"canis-lupus-familiaris\"\r\n*/\r\nfunction slug(value) {\r\n if (typeof value === 'undefined') return '';\r\n return value.toLowerCase().replace(/ /g, '-');\r\n}\r\n\r\n// Determine if a string is a Roman numeral\r\n// From https://stackoverflow.com/a/48601418\r\nfunction isRoman(s) {\r\n // http://stackoverflow.com/a/267405/1447675\r\n return /^M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})$/i.test(s);\r\n}\r\n\r\n// Convert Roman numeral to integer\r\n// From https://stackoverflow.com/a/48601418\r\nfunction parseRoman(s) {\r\n var val = {M: 1000, D: 500, C: 100, L: 50, X: 10, V: 5, I: 1};\r\n return s.toUpperCase().split('').reduce(function(r, a, i, aa) {\r\n return val[a] < val[aa[i + 1]] ? r - val[a] : r + val[a];\r\n }, 0);\r\n}\r\n\r\n/**\r\n* Download a PNG image of the ideogram\r\n*\r\n* Includes any annotations, but not legend.\r\n*/\r\nfunction downloadPng(ideo) {\r\n var ideoSvg = document.querySelector(ideo.selector);\r\n\r\n // Create a hidden canvas. This will contain the raster image to download.\r\n var canvas = document.createElement('canvas');\r\n var canvasId = '_ideo-undisplayed-dl-canvas';\r\n canvas.setAttribute('style', 'display: none');\r\n canvas.setAttribute('id', canvasId);\r\n var width = ideoSvg.width.baseVal.value + 30;\r\n var ideoSvgClone = ideoSvg.cloneNode(true);\r\n ideoSvgClone.style.left = '';\r\n canvas.setAttribute('width', width);\r\n document.body.appendChild(canvas);\r\n\r\n // Called after PNG image is created from data URL\r\n function triggerDownload(imgUrl) {\r\n var evt = new MouseEvent('click', {\r\n view: window,\r\n bubbles: false,\r\n cancelable: true\r\n });\r\n\r\n var a = document.createElement('a');\r\n a.setAttribute('download', 'ideogram.png');\r\n a.setAttribute('href', imgUrl);\r\n a.setAttribute('target', '_blank');\r\n\r\n // Enables easy testing\r\n a.setAttribute('id', '_ideo-undisplayed-dl-image-link');\r\n a.setAttribute('style', 'display: none;');\r\n document.body.appendChild(a);\r\n\r\n a.dispatchEvent(evt);\r\n canvas.remove();\r\n }\r\n\r\n var canvas = document.getElementById(canvasId);\r\n\r\n // Enlarge canvas and disable smoothing, for higher resolution PNG\r\n canvas.width *= 2;\r\n canvas.height *= 2;\r\n var ctx = canvas.getContext('2d');\r\n ctx.setTransform(2, 0, 0, 2, 0, 0);\r\n ctx.imageSmoothingEnabled = false;\r\n\r\n var data = (new XMLSerializer()).serializeToString(ideoSvgClone);\r\n var domUrl = window.URL || window.webkitURL || window;\r\n\r\n var img = new Image();\r\n var svgBlob = new Blob([data], {type: 'image/svg+xml;charset=utf-8'});\r\n var url = domUrl.createObjectURL(svgBlob);\r\n\r\n img.onload = function() {\r\n ctx.drawImage(img, 0, 0);\r\n domUrl.revokeObjectURL(url);\r\n\r\n var imgUrl = canvas\r\n .toDataURL('image/png')\r\n .replace('image/png', 'image/octet-stream');\r\n\r\n triggerDownload(imgUrl);\r\n };\r\n\r\n img.src = url;\r\n}\r\n\r\n\r\nfunction getFont(ideo) {\r\n const config = ideo.config;\r\n\r\n let family = 'sans-serif';\r\n if (config.fontFamily) {\r\n family = config.fontFamily;\r\n }\r\n\r\n const labelSize = config.annotLabelSize ? config.annotLabelSize : 13;\r\n const font = '600 ' + labelSize + 'px ' + family;\r\n\r\n return font;\r\n}\r\n\r\n/**\r\n * Get width and height of given text in pixels.\r\n *\r\n * Background: https://erikonarheim.com/posts/canvas-text-metrics/\r\n */\r\nfunction getTextSize(text, ideo) {\r\n var font = getFont(ideo);\r\n\r\n // re-use canvas object for better performance\r\n var canvas =\r\n getTextSize.canvas ||\r\n (getTextSize.canvas = document.createElement('canvas'));\r\n var context = canvas.getContext('2d');\r\n context.font = font;\r\n var metrics = context.measureText(text);\r\n\r\n // metrics.width is less precise than technique below\r\n var right = metrics.actualBoundingBoxRight;\r\n var left = metrics.actualBoundingBoxLeft;\r\n var width = Math.abs(left) + Math.abs(right);\r\n\r\n const height =\r\n Math.abs(metrics.actualBoundingBoxAscent) +\r\n Math.abs(metrics.actualBoundingBoxDescent);\r\n\r\n return {width, height};\r\n}\r\n\r\n/** Clone a nested array */\r\nfunction deepCopy(array) {\r\n return JSON.parse(JSON.stringify(array));\r\n}\r\n\r\nexport {\r\n assemblyIsAccession, hasNonGenBankAssembly, hasGenBankAssembly, getDataDir,\r\n getDir, round, onDidRotate, getSvg, d3, getEarlyTaxid, getTaxid,\r\n getCommonName, getScientificName, slug, isRoman, parseRoman, downloadPng,\r\n fetchWithRetry, getTextSize, getFont, deepCopy,\r\n fetchWithAuth as fetch\r\n};\r\n","import array from \"./array.js\";\nimport {Selection, root} from \"./selection/index.js\";\n\nexport default function(selector) {\n return typeof selector === \"string\"\n ? new Selection([document.querySelectorAll(selector)], [document.documentElement])\n : new Selection([selector == null ? [] : array(selector)], root);\n}\n","export default function max(values, valueof) {\n let max;\n if (valueof === undefined) {\n for (const value of values) {\n if (value != null\n && (max < value || (max === undefined && value >= value))) {\n max = value;\n }\n }\n } else {\n let index = -1;\n for (let value of values) {\n if ((value = valueof(value, ++index, values)) != null\n && (max < value || (max === undefined && value >= value))) {\n max = value;\n }\n }\n }\n return max;\n}\n","import {organismMetadata} from './organism-metadata';\r\nimport {staticCss} from './../bands/styles';\r\n\r\nfunction configurePloidy(ideo) {\r\n if (!ideo.config.ploidy) ideo.config.ploidy = 1;\r\n\r\n if (ideo.config.ploidy > 1) {\r\n ideo.sexChromosomes = {};\r\n if (!ideo.config.sex) {\r\n // Default to 'male' per human, mouse reference genomes.\r\n // TODO: The default sex value should probably be the heterogametic sex,\r\n // i.e. whichever sex has allosomes that differ in morphology.\r\n // In mammals and most insects that is the male.\r\n // However, in birds and reptiles, that is female.\r\n ideo.config.sex = 'male';\r\n }\r\n if (ideo.config.ploidy === 2 && !ideo.config.ancestors) {\r\n ideo.config.ancestors = {M: '#ffb6c1', P: '#add8e6'};\r\n ideo.config.ploidyDesc = 'MP';\r\n }\r\n }\r\n}\r\n\r\nfunction configureHeight(ideo) {\r\n var container, rect, chrHeight;\r\n\r\n if (!ideo.config.chrHeight) {\r\n container = ideo.config.container;\r\n rect = document.querySelector(container).getBoundingClientRect();\r\n\r\n if (ideo.config.orientation === 'vertical') {\r\n chrHeight = rect.height;\r\n } else {\r\n chrHeight = rect.width;\r\n }\r\n\r\n if (container === 'body' || chrHeight === 0) chrHeight = 400;\r\n ideo.config.chrHeight = chrHeight;\r\n }\r\n}\r\n\r\nfunction configureWidth(ideo) {\r\n var chrWidth, chrHeight;\r\n\r\n if (!ideo.config.chrWidth) {\r\n chrWidth = 10;\r\n chrHeight = ideo.config.chrHeight;\r\n\r\n if (chrHeight < 900 && chrHeight > 500) {\r\n chrWidth = Math.round(chrHeight / 40);\r\n } else if (chrHeight >= 900) {\r\n chrWidth = Math.round(chrHeight / 45);\r\n }\r\n ideo.config.chrWidth = chrWidth;\r\n }\r\n}\r\n\r\nfunction configureMargin(ideo) {\r\n if (ideo.config.geometry && ideo.config.geometry === 'collinear') {\r\n if ('chrMargin' in ideo.config === false) {\r\n ideo.config.chrMargin = 0;\r\n }\r\n return;\r\n }\r\n if (!ideo.config.chrMargin) {\r\n if (ideo.config.ploidy === 1) {\r\n ideo.config.chrMargin = 10;\r\n } else {\r\n // Defaults polyploid chromosomes to relatively small interchromatid gap\r\n ideo.config.chrMargin = Math.round(ideo.config.chrWidth / 4);\r\n }\r\n }\r\n if (ideo.config.showBandLabels) ideo.config.chrMargin += 20;\r\n}\r\n\r\nfunction configureBump(ideo) {\r\n ideo.bump = Math.round(ideo.config.chrHeight / 125);\r\n ideo.adjustedBump = false;\r\n if (ideo.config.chrHeight < 200) {\r\n ideo.adjustedBump = true;\r\n ideo.bump = 4;\r\n }\r\n}\r\n\r\nfunction configureSingleChromosome(config, ideo) {\r\n if (config.chromosome) {\r\n ideo.config.chromosomes = [config.chromosome];\r\n if ('showBandLabels' in config === false) {\r\n ideo.config.showBandLabels = true;\r\n }\r\n if ('rotatable' in config === false) ideo.config.rotatable = false;\r\n }\r\n}\r\n\r\nfunction configureOrganisms(config, ideo) {\r\n ideo.organisms = Object.assign({}, organismMetadata);\r\n if (config.taxid && config.organismMetadata) ideo.organisms[config.taxid] = config.organismMetadata\r\n ideo.organismsWithBands = Object.assign({}, ideo.organisms);\r\n}\r\n\r\nfunction configureCallbacks(config, ideo) {\r\n if (config.onLoad) ideo.onLoadCallback = config.onLoad;\r\n if (config.onLoadAnnots) ideo.onLoadAnnotsCallback = config.onLoadAnnots;\r\n if (config.onDrawAnnots) ideo.onDrawAnnotsCallback = config.onDrawAnnots;\r\n if (config.onBrushMove) ideo.onBrushMoveCallback = config.onBrushMove;\r\n if (config.onBrushEnd) ideo.onBrushEndCallback = config.onBrushEnd;\r\n if (config.onCursorMove) ideo.onCursorMoveCallback = config.onCursorMove;\r\n if (config.onDidRotate) ideo.onDidRotateCallback = config.onDidRotate;\r\n if (config.onWillShowAnnotTooltip) {\r\n ideo.onWillShowAnnotTooltipCallback = config.onWillShowAnnotTooltip;\r\n }\r\n if (config.onClickAnnot) {\r\n ideo.onClickAnnotCallback = config.onClickAnnot;\r\n }\r\n}\r\n\r\nfunction configureMiscellaneous(ideo) {\r\n ideo.chromosomesArray = [];\r\n ideo.coordinateSystem = 'iscn';\r\n ideo.maxLength = {bp: 0, iscn: 0};\r\n ideo.chromosomes = {};\r\n ideo.numChromosomes = 0;\r\n if (!ideo.config.debug) ideo.config.debug = false;\r\n if (!ideo.config.dataDir) ideo.config.dataDir = ideo.getDataDir();\r\n if (!ideo.config.container) ideo.config.container = 'body';\r\n ideo.selector = ideo.config.container + ' #_ideogram';\r\n if (!ideo.config.resolution) ideo.config.resolution = '';\r\n if (!ideo.config.orientation) ideo.config.orientation = 'vertical';\r\n if (!ideo.config.brush) ideo.config.brush = null;\r\n if (!ideo.config.rows) ideo.config.rows = 1;\r\n if ('showChromosomeLabels' in ideo.config === false) {\r\n ideo.config.showChromosomeLabels = true;\r\n }\r\n if (!ideo.config.showNonNuclearChromosomes) {\r\n ideo.config.showNonNuclearChromosomes = false;\r\n }\r\n if (!ideo.config.chromosomeScale) {\r\n ideo.config.chromosomeScale = 'absolute';\r\n }\r\n if (!ideo.config.showTools) ideo.config.showTools = false;\r\n}\r\n\r\nfunction configureBands(ideo) {\r\n if (!ideo.config.showBandLabels) ideo.config.showBandLabels = false;\r\n\r\n if ('showFullyBanded' in ideo.config === false) {\r\n ideo.config.showFullyBanded = true;\r\n }\r\n\r\n ideo.bandsToShow = [];\r\n ideo.bandData = {};\r\n}\r\n\r\nlet configuredCss = staticCss;\r\nfunction configureTextStyle(ideo) {\r\n const config = ideo.config;\r\n if (!config.chrLabelSize) ideo.config.chrLabelSize = 9;\r\n if (!config.chrLabelColor) ideo.config.chrLabelColor = '#000';\r\n if (!config.fontFamily) ideo.config.fontFamily = '';\r\n\r\n const size = `font-size: ${config.chrLabelSize}px`;\r\n const color = `fill: ${config.chrLabelColor}`;\r\n const fontFamily = `font-family: ${config.fontFamily}`;\r\n configuredCss += `#_ideogram text {${fontFamily}; ${size}; ${color};}`;\r\n configuredCss += `#_ideogramLabel text {${fontFamily};}`;\r\n}\r\n\r\n/**\r\n * High-level helper method for Ideogram constructor.\r\n *\r\n * @param config Configuration object. Enables setting Ideogram properties.\r\n *\r\n * Docs: https://github.com/eweitz/ideogram/blob/master/api.md\r\n */\r\nfunction configure(config) {\r\n // Clone the config object, to allow multiple instantiations\r\n // without picking up prior ideogram's settings\r\n this.config = JSON.parse(JSON.stringify(config));\r\n\r\n configureMiscellaneous(this);\r\n configurePloidy(this);\r\n configureBands(this);\r\n configureHeight(this);\r\n configureWidth(this);\r\n configureMargin(this);\r\n configureCallbacks(config, this);\r\n configureOrganisms(config, this);\r\n configureBump(this);\r\n configureSingleChromosome(config, this);\r\n configureTextStyle(this);\r\n this.initAnnotSettings();\r\n if (!this.config.geometry || this.config.geometry === 'parallel') {\r\n this.config.chrMargin += this.config.chrWidth;\r\n if (this.config.annotationsLayout === 'heatmap') {\r\n this.config.chrMargin += this.config.annotTracksHeight;\r\n } else {\r\n this.config.chrMargin += this.config.annotTracksHeight * 2;\r\n }\r\n }\r\n this.init();\r\n}\r\n\r\nexport {configure, configuredCss};\r\n","/**\r\n * @fileoverview Functions for collinear chromosomes.\r\n * Collinear chromosomes form a line together, unlike the default parallel\r\n * geometry.\r\n */\r\n\r\nimport {d3} from './lib';\r\n\r\nfunction labelGenomes(ideo) {\r\n\r\n ideo.config.taxids.forEach((taxid, i) => {\r\n var org = ideo.organisms[taxid];\r\n // var commonName = slug(org.commonName);\r\n var scientificName = org.scientificName;\r\n d3.select(ideo.selector)\r\n .append('text')\r\n .attr('class', 'genomeLabel italic')\r\n .attr('x', 55 + 200 * i)\r\n .attr('y', 10)\r\n .text(scientificName)\r\n .attr('text-anchor', 'middle');\r\n });\r\n}\r\n\r\n/**\r\n* Rearrange chromosomes from parallel vertical to collinear vertical\r\n*\r\n* Parallel vertical (as in https://eweitz.github.io/ideogram/human)\r\n* | | |\r\n*\r\n* Collinear vertical (as in https://eweitz.github.io/ideogram/orthologs?loci=2:150000000,5:20000000;3:100000000,10:80000000&org=homo-sapiens&org2=mus-musculus)\r\n* |\r\n* |\r\n* |\r\n*/\r\nfunction rearrangeChromosomes(chrSets, yOffsets, x, ideo) {\r\n var i, chrSet, y, chrLabelX, adjustedX, chr, taxid, orgIndex,\r\n config = ideo.config,\r\n chrLabelSize = config.chrLabelSize;\r\n\r\n for (i = 0; i < chrSets.length; i++) {\r\n chrSet = chrSets[i];\r\n y = yOffsets[i] + 23 - chrLabelSize;\r\n\r\n chr = ideo.chromosomesArray[i];\r\n taxid = chr.id.split('-')[1];\r\n orgIndex = ideo.config.taxids.indexOf(taxid);\r\n adjustedX = x - orgIndex * 200 - 30 - 5;\r\n if (orgIndex === 0) {\r\n chrLabelX = -34;\r\n adjustedX += ideo.config.chrWidth * 2 - 16;\r\n } else {\r\n chrLabelX = ideo.config.chrWidth * 2 - 24;\r\n }\r\n\r\n if (config.showChromosomeLabels) {\r\n const labelSpan = chrSet.querySelector('.chrLabel > tspan');\r\n labelSpan.setAttribute('x', chrLabelX);\r\n labelSpan.setAttribute('dy', chrLabelSize - 8);\r\n chrSet.querySelector('.chrLabel').setAttribute('text-anchor', 'start');\r\n }\r\n chrSet.setAttribute(\r\n 'transform', 'rotate(90) translate(' + y + ',' + adjustedX + ')'\r\n );\r\n chrSet.querySelector('.chromosome').setAttribute(\r\n 'transform', 'translate(-13, 10)'\r\n );\r\n }\r\n\r\n labelGenomes(ideo);\r\n}\r\n\r\n/**\r\n* Get pixel coordinates to use for rearrangement\r\n*/\r\nfunction getYOffsets(chrSets, ideo) {\r\n var yOffsets, i, index, chr, prevChr, y, prevWidth, prevY, yBump, taxid,\r\n seenTaxids = {};\r\n\r\n yOffsets = [];\r\n for (i = 0; i < chrSets.length; i++) {\r\n chr = ideo.chromosomesArray[i];\r\n taxid = chr.id.split('-')[1];\r\n index = (i === 0) ? i : i - 1;\r\n prevChr = ideo.chromosomesArray[index];\r\n if (i === 0 || taxid in seenTaxids === false) {\r\n y = 20;\r\n seenTaxids[taxid] = 1;\r\n } else {\r\n prevWidth = prevChr.width;\r\n prevY = yOffsets[index];\r\n yBump = (ideo.config.showChromosomeLabels ? 0 : 2);\r\n y = prevY + prevWidth + yBump + ideo.config.chrMargin;\r\n }\r\n yOffsets.push(y);\r\n }\r\n\r\n return yOffsets;\r\n}\r\n\r\nfunction collinearizeVerticalChromosomes(ideo) {\r\n var chrSets, yOffsets, x, height, width,\r\n config = ideo.config;\r\n\r\n ideo.config.annotLabelHeight = 12;\r\n // var annotLabelHeight = ideo.config.annotLabelHeight;\r\n\r\n if ('demarcateCollinearChromosomes' in ideo.config === false) {\r\n ideo.config.demarcateCollinearChromosomes = true;\r\n }\r\n\r\n chrSets = document.querySelectorAll('.chromosome-set');\r\n\r\n x = -40;\r\n\r\n yOffsets = getYOffsets(chrSets, ideo);\r\n rearrangeChromosomes(chrSets, yOffsets, x, ideo);\r\n\r\n width = Math.round(yOffsets.slice(-1)[0] + 70);\r\n\r\n if (config.multiorganism) {\r\n height *= 8;\r\n var maxHeight = 0;\r\n yOffsets.forEach(d => {\r\n if (d > maxHeight) maxHeight = d;\r\n });\r\n height = maxHeight + 30;\r\n } else {\r\n height = xOffsets.slice(-1)[0] + 30;\r\n }\r\n\r\n d3.select(ideo.selector)\r\n .attr('height', height)\r\n .attr('width', width);\r\n\r\n d3.select('#_ideogramTrackLabelContainer').remove();\r\n d3.select('#_ideogramInnerWrap')\r\n .insert('div', ':first-child')\r\n .attr('id', '_ideogramTrackLabelContainer')\r\n .style('position', 'absolute');\r\n}\r\n\r\nexport default collinearizeVerticalChromosomes;\r\n","/**\r\n * @fileoverview Functions for collinear chromosomes.\r\n * Collinear chromosomes form a line together, unlike the default parallel\r\n * geometry.\r\n */\r\n\r\nimport {d3} from './lib';\r\nimport collinearizeVerticalChromosomes from './collinear-vertical';\r\n\r\nfunction labelGenomes(ideo) {\r\n\r\n ideo.config.taxids.forEach((taxid, i) => {\r\n var org = ideo.organisms[taxid];\r\n var config = ideo.config;\r\n // var commonName = slug(org.commonName);\r\n var scientificName = org.scientificName;\r\n d3.select(ideo.selector)\r\n .append('text')\r\n .attr('class', 'genomeLabel italic')\r\n .attr('x', 5)\r\n .attr('y', config.chrLabelSize + (200 + (3 * config.chrWidth)) * i)\r\n .text(scientificName);\r\n });\r\n}\r\n\r\n/**\r\n* Rearrange chromosomes from parallel horizontal to collinear horizontal\r\n*\r\n* Parallel horizontal (as in https://eweitz.github.io/ideogram/mouse)\r\n* ---\r\n* ---\r\n* ---\r\n*\r\n* Collinear horizontal (as in https://eweitz.github.io/ideogram/geometry-collinear):\r\n* --- --- ---\r\n*/\r\nfunction rearrangeChromosomes(chrSets, xOffsets, y, ideo) {\r\n var i, chr, chrSet, taxid, x, adjustedY, orgIndex, chrLabelY,\r\n config = ideo.config,\r\n chrWidth = config.chrWidth,\r\n chrLabelSize = config.chrLabelSize;\r\n\r\n for (i = 0; i < chrSets.length; i++) {\r\n chrSet = chrSets[i];\r\n x = xOffsets[i];\r\n\r\n chr = ideo.chromosomesArray[i];\r\n taxid = chr.id.split('-')[1];\r\n orgIndex = config.taxids.indexOf(taxid);\r\n adjustedY = y + orgIndex * 200;\r\n if (orgIndex === 0 && ideo.config.multiorganism) {\r\n chrLabelY = chrLabelSize - 4;\r\n adjustedY += chrWidth * 2 + chrLabelSize;\r\n } else {\r\n chrLabelY = chrWidth * 2 + chrLabelSize + 2;\r\n }\r\n\r\n if (ideo.config.showChromosomeLabels) {\r\n chrSet.querySelector('.chrLabel').setAttribute('y', chrLabelY);\r\n chrSet.querySelector('.chrLabel').setAttribute('text-anchor', 'middle');\r\n }\r\n chrSet.setAttribute('transform', 'translate(' + x + ',' + adjustedY + ')');\r\n chrSet.querySelector('.chromosome').setAttribute(\r\n 'transform', 'translate(-13, 10)'\r\n );\r\n }\r\n\r\n if (config.multiorganism) {\r\n labelGenomes(ideo);\r\n }\r\n}\r\n\r\n/**\r\n* Get pixel coordinates to use for rearrangement\r\n*/\r\nfunction getXOffsets(chrSets, ideo) {\r\n var xOffsets, i, index, chr, prevChr, x, prevWidth, prevX, xBump, taxid,\r\n seenTaxids = {};\r\n\r\n xOffsets = [];\r\n for (i = 0; i < chrSets.length; i++) {\r\n chr = ideo.chromosomesArray[i];\r\n taxid = chr.id.split('-')[1];\r\n index = (i === 0) ? i : i - 1;\r\n prevChr = ideo.chromosomesArray[index];\r\n if (i === 0 || taxid in seenTaxids === false) {\r\n x = 20;\r\n seenTaxids[taxid] = 1;\r\n } else {\r\n prevWidth = prevChr.width;\r\n prevX = xOffsets[index];\r\n xBump = (ideo.config.showChromosomeLabels ? 0 : 2);\r\n x = prevX + prevWidth + xBump + ideo.config.chrMargin;\r\n }\r\n xOffsets.push(x);\r\n }\r\n\r\n return xOffsets;\r\n}\r\n\r\n// /**\r\n// * Track number of chromosomes in preceding organisms.\r\n// * Adds an instance variable to the ideogram object to offset\r\n// * chromosome indices. Needed for multiorganism collinear ideograms.\r\n// */\r\n// function setTaxidChrOffsets(ideo) {\r\n// var taxidChrOffsets, taxidChrOffset;\r\n\r\n// taxidChrOffsets = {};\r\n\r\n// taxidChrOffset = 0;\r\n// ideo.config.organism.forEach((org) => {\r\n// var taxid, numChrs;\r\n// taxid = ideo.getTaxid(org);\r\n// taxidChrOffsets[taxid] = taxidChrOffset;\r\n// numChrs = Object.keys(ideo.chromosomes[taxid]).length;\r\n// taxidChrOffset += numChrs;\r\n// });\r\n\r\n// ideo.taxidChrOffsets = taxidChrOffsets;\r\n// }\r\n\r\n// /**\r\n// * Change chromosome indices for multiorganism collinear ideograms\r\n// * This is needed to account for x-offsets.\r\n// */\r\n// function adjustChrIndex(ideo) {\r\n// setTaxidChrOffsets(ideo);\r\n\r\n// ideo.chromosomesArray.map((chr) => {\r\n// var taxid = chr.id.split('-')[1];\r\n// var taxidChrOffset = ideo.taxidChrOffsets[taxid];\r\n// chr.chrIndex -= taxidChrOffset;\r\n// ideo.chromosomes[taxid][chr.name].chrIndex = chr.chrIndex;\r\n// });\r\n// }\r\n\r\nfunction collinearizeChromosomes(ideo) {\r\n var chrSets, xOffsets, y, height, width,\r\n config = ideo.config,\r\n annotHeight = config.annotationHeight || 0;\r\n\r\n if (config.orientation === 'vertical') {\r\n collinearizeVerticalChromosomes(ideo);\r\n return;\r\n }\r\n\r\n // if (config.multiorganism) adjustChrIndex(ideo);\r\n\r\n ideo.config.annotLabelHeight = 12;\r\n var annotLabelHeight = ideo.config.annotLabelHeight;\r\n\r\n if ('demarcateCollinearChromosomes' in ideo.config === false) {\r\n ideo.config.demarcateCollinearChromosomes = true;\r\n }\r\n\r\n chrSets = document.querySelectorAll('.chromosome-set');\r\n\r\n y = (\r\n (config.numAnnotTracks * (annotHeight + annotLabelHeight + 4)) -\r\n config.chrWidth + 1\r\n );\r\n\r\n xOffsets = getXOffsets(chrSets, ideo);\r\n rearrangeChromosomes(chrSets, xOffsets, y, ideo);\r\n\r\n height = y + config.chrWidth * 2 + 20;\r\n\r\n if (config.multiorganism) {\r\n height *= 8;\r\n var maxWidth = 0;\r\n xOffsets.forEach(d => {\r\n if (d > maxWidth) maxWidth = d;\r\n });\r\n width = maxWidth + 20;\r\n } else {\r\n width = xOffsets.slice(-1)[0] + 20;\r\n }\r\n\r\n d3.select(ideo.selector)\r\n .attr('width', width)\r\n .attr('height', height);\r\n\r\n d3.select('#_ideogramTrackLabelContainer').remove();\r\n d3.select('#_ideogramInnerWrap')\r\n .insert('div', ':first-child')\r\n .attr('id', '_ideogramTrackLabelContainer')\r\n .style('position', 'absolute');\r\n}\r\n\r\nexport default collinearizeChromosomes;\r\n","import {d3} from '../lib';\r\nimport collinearizeChromosomes from '../collinear';\r\n\r\nfunction processLabels(config, ideo) {\r\n var i, chrID, t0C, t1C;\r\n\r\n if (config.showBandLabels === true) {\r\n t0C = new Date().getTime();\r\n ideo.hideUnshownBandLabels();\r\n t1C = new Date().getTime();\r\n if (config.debug) {\r\n console.log('Time in showing bands: ' + (t1C - t0C) + ' ms');\r\n }\r\n\r\n if (config.orientation === 'vertical') {\r\n for (i = 0; i < ideo.chromosomesArray.length; i++) {\r\n chrID = '#' + ideo.chromosomesArray[i].id;\r\n ideo.rotateChromosomeLabels(d3.select(chrID), i);\r\n }\r\n }\r\n }\r\n\r\n if (config.showChromosomeLabels === true) {\r\n ideo.drawChromosomeLabels(ideo.chromosomes);\r\n }\r\n}\r\n\r\nfunction processAnnots(ideo) {\r\n if (typeof ideo.timeout !== 'undefined') window.clearTimeout(ideo.timeout);\r\n\r\n ideo.rawAnnots = ideo.setOriginalTrackIndexes(ideo.rawAnnots);\r\n\r\n if (ideo.config.annotationsDisplayedTracks) {\r\n ideo.annots =\r\n ideo.updateDisplayedTracks(ideo.config.annotationsDisplayedTracks);\r\n } else {\r\n ideo.annots = ideo.processAnnotData(ideo.rawAnnots);\r\n if (ideo.config.filterable) ideo.initCrossFilter();\r\n ideo.drawProcessedAnnots(ideo.annots);\r\n }\r\n}\r\n\r\n/**\r\n * Load (potentially large) annotation dataset, then process it.\r\n */\r\nfunction waitForAndProcessAnnots(ideo) {\r\n if (ideo.rawAnnots) {\r\n processAnnots(ideo);\r\n } else {\r\n (function checkAnnotData() {\r\n ideo.timeout = setTimeout(function() {\r\n if (\r\n !ideo.rawAnnots ||\r\n (ideo.rawAnnots && typeof ideo.rawAnnots.then !== 'undefined')\r\n ) {\r\n // Ensure rawAnnots is defined and not a Promise (not \"then\"-able)\r\n checkAnnotData();\r\n } else {\r\n processAnnots(ideo);\r\n }\r\n }, 50);\r\n })();\r\n }\r\n}\r\n\r\nfunction reportDebugTimings(config, t0, t0A) {\r\n\r\n var t1A = new Date().getTime();\r\n if (config.debug) {\r\n console.log('Time in drawChromosome: ' + (t1A - t0A) + ' ms');\r\n }\r\n\r\n var t1 = new Date().getTime();\r\n if (config.debug) {\r\n console.log('Time constructing ideogram: ' + (t1 - t0) + ' ms');\r\n }\r\n}\r\n\r\n/**\r\n * Completes high-level initialization.\r\n * Draws chromosomes and band labels, rotating as needed;\r\n * processes and draws annotations;\r\n * creates brush, emits notification of load completion, etc.\r\n */\r\nfunction finishInit(t0) {\r\n var t0A = new Date().getTime(),\r\n ideo = this,\r\n config = ideo.config,\r\n confAnnots = config.annotations;\r\n\r\n ideo.initDrawChromosomes();\r\n\r\n if (config.annotationsPath) waitForAndProcessAnnots(ideo);\r\n\r\n processLabels(config, ideo);\r\n\r\n // Create a brush or a click cursor if specified\r\n if (config.brush) ideo.createBrush(config.brush);\r\n else if (config.cursorPosition) ideo.createClickCursor(config.cursorPosition);\r\n\r\n if (confAnnots) {\r\n if (Array.isArray(confAnnots)) {\r\n ideo.drawAnnots(confAnnots);\r\n } else {\r\n // Enable client-side-defined annotations to be formatted\r\n // like the wider variety of server-side-defined annotations.\r\n // Supports https://github.com/eweitz/ideogram/issues/137\r\n ideo.rawAnnots = confAnnots;\r\n ideo.afterRawAnnots();\r\n processAnnots(ideo);\r\n }\r\n }\r\n\r\n reportDebugTimings(config, t0, t0A);\r\n\r\n ideo.setOverflowScroll();\r\n\r\n if (config.geometry === 'collinear') collinearizeChromosomes(ideo);\r\n\r\n if (ideo.onLoadCallback) ideo.onLoadCallback();\r\n}\r\n\r\nexport {finishInit};\r\n","export class Ploidy {\r\n\r\n constructor(config) {\r\n this._config = config;\r\n this._description = this._normalize(this._config.ploidyDesc);\r\n }\r\n\r\n // Get number of chromosomes in a chromosome set\r\n getChromosomesNumber(setIndex) {\r\n if (this._config.ploidyDesc) {\r\n var chrSetCode = this._config.ploidyDesc[setIndex];\r\n if (chrSetCode instanceof Object) {\r\n return Object.keys(chrSetCode)[0].length;\r\n } else {\r\n return chrSetCode.length;\r\n }\r\n } else {\r\n return this._config.ploidy || 1;\r\n }\r\n }\r\n\r\n // Normalize use defined description\r\n _normalize(description) {\r\n var key, descValue,\r\n normalized = [];\r\n\r\n if (!description) return description;\r\n\r\n // Loop through description and normalize\r\n for (key in description) {\r\n descValue = description[key];\r\n if (typeof descValue === 'string') {\r\n if (this._config.orientation === 'vertical') {\r\n descValue = descValue.split('').reverse();\r\n }\r\n normalized.push({\r\n ancestors: descValue,\r\n existence: this._getexistenceArray(descValue.length)\r\n });\r\n } else {\r\n normalized.push({\r\n ancestors: Object.keys(descValue)[0],\r\n existence: descValue[Object.keys(descValue)[0]]\r\n });\r\n }\r\n }\r\n\r\n return normalized;\r\n }\r\n\r\n // Get array filled by '11' elements\r\n _getexistenceArray(length) {\r\n var array = [];\r\n\r\n for (var i = 0; i < length; i++) {\r\n array.push('11');\r\n }\r\n\r\n return array;\r\n }\r\n\r\n getSetSize(chrSetIndex) {\r\n if (this._description) {\r\n return this._description[chrSetIndex].ancestors.length;\r\n } else {\r\n return 1;\r\n }\r\n }\r\n\r\n // Get ancestor letter\r\n getAncestor(chrSetIndex, chrIndex) {\r\n if (this._description) {\r\n return this._description[chrSetIndex].ancestors[chrIndex];\r\n } else {\r\n return '';\r\n }\r\n }\r\n\r\n // Check if chromosome's arm should be rendered.\r\n // If no description was provided, method returns true and\r\n // something another depending on user provided description.\r\n exists(chrSetIndex, chrIndex, armIndex) {\r\n if (this._description) {\r\n var desc =\r\n this._description[chrSetIndex].existence[chrIndex][armIndex];\r\n return Number(desc) > 0;\r\n } else {\r\n return true;\r\n }\r\n }\r\n\r\n}\r\n","import {d3} from '../lib';\r\n\r\n/**\r\n * Chromosome's view utility class\r\n */\r\nexport class ChromosomeUtil {\r\n\r\n constructor(node) {\r\n this._node = node;\r\n }\r\n\r\n getLabel() {\r\n var label =\r\n d3\r\n .select(this._node.parentNode)\r\n .select('text.chrLabel')\r\n .text();\r\n return label;\r\n }\r\n\r\n /**\r\n * Get chromosome set label\r\n */\r\n getSetLabel() {\r\n var setLabel =\r\n d3\r\n .select(this._node.parentNode)\r\n .select('text.chrSetLabel')\r\n .text();\r\n return setLabel;\r\n }\r\n}\r\n","import {d3} from '../lib';\r\nimport {ChromosomeUtil} from './../views/chromosome-util';\r\n\r\nclass Layout {\r\n\r\n constructor(config, ideo) {\r\n this._config = config;\r\n this._ideo = ideo;\r\n this._ploidy = this._ideo._ploidy;\r\n this._translate = undefined;\r\n\r\n if ('chrSetMargin' in config) {\r\n this.chrSetMargin = config.chrSetMargin;\r\n } else {\r\n var chrMargin = this._config.chrMargin;\r\n this.chrSetMargin = (this._config.ploidy > 1 ? chrMargin : 0);\r\n }\r\n\r\n // Chromosome band's size.\r\n this._tickSize = 8;\r\n\r\n // Chromosome rotation state.\r\n this._isRotated = false;\r\n }\r\n\r\n // Get chart left margin\r\n _getLeftMargin() {\r\n return this.margin.left;\r\n }\r\n\r\n // Get rotated chromosome y scale\r\n _getYScale() {\r\n // 20 is width of rotated chromosome.\r\n return 20 / this._config.chrWidth;\r\n }\r\n\r\n // Get chromosome labels\r\n getChromosomeLabels(chrElement) {\r\n var util = new ChromosomeUtil(chrElement),\r\n labels = [];\r\n\r\n if (this._ideo.config.ploidy > 1) {\r\n labels.push(util.getSetLabel());\r\n }\r\n labels.push(util.getLabel());\r\n\r\n return labels.filter(function(d) {\r\n return d.length > 0;\r\n });\r\n }\r\n\r\n getChromosomeBandLabelTranslate(band) {\r\n var x, y, translate,\r\n ideo = this._ideo,\r\n tickSize = this._tickSize,\r\n orientation = ideo.config.orientation;\r\n\r\n if (orientation === 'vertical') {\r\n x = tickSize;\r\n y = ideo.round(2 + band.px.start + band.px.width / 2);\r\n translate = 'rotate(-90)translate(' + x + ',' + y + ')';\r\n } else if (orientation === 'horizontal') {\r\n x = ideo.round(-tickSize + band.px.start + band.px.width / 2);\r\n y = -10;\r\n translate = 'translate(' + x + ',' + y + ')';\r\n }\r\n\r\n return {\r\n x: x,\r\n y: y,\r\n translate: translate\r\n };\r\n }\r\n\r\n didRotate(chrIndex, chrElement) {\r\n var ideo, taxid, chrName, bands, chrModel, oldWidth,\r\n chrSetElement, transform, scale, scaleRE;\r\n\r\n ideo = this._ideo;\r\n taxid = ideo.config.taxid;\r\n chrName = chrElement.id.split('-')[0].replace('chr', '');\r\n chrModel = ideo.chromosomes[taxid][chrName];\r\n bands = chrModel.bands;\r\n\r\n chrSetElement = d3.select(chrElement.parentNode);\r\n transform = chrSetElement.attr('transform');\r\n scaleRE = /scale\\(.*\\)/;\r\n scale = scaleRE.exec(transform);\r\n transform = transform.replace(scale, '');\r\n chrSetElement.attr('transform', transform);\r\n\r\n oldWidth = chrModel.width;\r\n\r\n chrModel = ideo.getChromosomeModel(bands, chrName, taxid, chrIndex);\r\n\r\n chrModel.oldWidth = oldWidth;\r\n\r\n ideo.chromosomes[taxid][chrName] = chrModel;\r\n ideo.drawChromosome(chrModel);\r\n\r\n ideo.handleRotateOnClick();\r\n\r\n if (ideo.rawAnnots) {\r\n if (ideo.displayedTrackIndexes) {\r\n ideo.updateDisplayedTracks(ideo.displayedTrackIndexes);\r\n } else {\r\n ideo.annots = ideo.processAnnotData(ideo.rawAnnots);\r\n ideo.drawProcessedAnnots(ideo.annots);\r\n\r\n if (ideo.config.filterable) {\r\n ideo.initCrossFilter();\r\n }\r\n }\r\n }\r\n\r\n if (ideo.config.showBandLabels === true) {\r\n ideo.drawBandLabels(ideo.chromosomes);\r\n ideo.hideUnshownBandLabels();\r\n }\r\n\r\n if (ideo.onDidRotateCallback) {\r\n ideo.onDidRotateCallback(chrModel);\r\n }\r\n }\r\n\r\n rotate(chrSetIndex, chrIndex, chrElement) {\r\n var ideo, otherChrs, ideoBounds, labelSelectors;\r\n ideo = this._ideo;\r\n\r\n labelSelectors = (\r\n ideo.selector + ' .chrSetLabel, ' + ideo.selector + ' .chrLabel'\r\n );\r\n\r\n ideoBounds = document.querySelector(ideo.selector).getBoundingClientRect();\r\n\r\n // Find chromosomes which should be hidden\r\n otherChrs = d3.selectAll(ideo.selector + ' g.chromosome')\r\n .filter(function() {return this !== chrElement;});\r\n\r\n if (this._isRotated) {\r\n\r\n this._isRotated = false;\r\n\r\n ideo.config.chrHeight = ideo.config.chrHeightOriginal;\r\n ideo.config.chrWidth = ideo.config.chrWidthOriginal;\r\n ideo.config.annotationHeight = ideo.config.annotationHeightOriginal;\r\n\r\n // Rotate chromosome back\r\n this.rotateBack(chrSetIndex, chrIndex, chrElement, function() {\r\n // Show all other chromosomes and chromosome labels\r\n otherChrs.style('display', null);\r\n d3.selectAll(labelSelectors).style('display', null);\r\n ideo._layout.didRotate(chrIndex, chrElement);\r\n });\r\n\r\n } else {\r\n\r\n this._isRotated = true;\r\n\r\n // Hide all other chromosomes and chromosome labels\r\n otherChrs.style('display', 'none');\r\n d3.selectAll(labelSelectors).style('display', 'none');\r\n\r\n // Rotate chromosome\r\n this.rotateForward(chrSetIndex, chrIndex, chrElement, function() {\r\n\r\n var chrHeight, elementLength, windowLength;\r\n\r\n ideo.config.chrHeightOriginal = ideo.config.chrHeight;\r\n ideo.config.chrWidthOriginal = ideo.config.chrWidth;\r\n ideo.config.annotationHeightOriginal = ideo.config.annotationHeight;\r\n\r\n const settingsGearWidth = 20;\r\n\r\n if (ideo._layout._class === 'VerticalLayout') {\r\n elementLength = ideoBounds.width - settingsGearWidth;\r\n windowLength = window.innerWidth - settingsGearWidth;\r\n } else {\r\n elementLength = ideoBounds.height - 10;\r\n windowLength = window.innerHeight - 10;\r\n }\r\n\r\n // Set chromosome height to window length or ideogram element length,\r\n // whichever is smaller. This keeps whole chromosome viewable, while\r\n // also ensuring the height doesn't exceed what the user specified.\r\n if (windowLength < elementLength) {\r\n chrHeight = windowLength;\r\n } else {\r\n chrHeight = elementLength;\r\n }\r\n chrHeight -= ideo.config.chrMargin * 2;\r\n ideo.config.chrHeight = chrHeight;\r\n\r\n // Account for chromosome label\r\n // TODO: Make this dynamic, not hard-coded\r\n ideo.config.chrWidth *= 2.3;\r\n\r\n ideo.config.annotationHeight *= 1.7;\r\n\r\n ideo._layout.didRotate(chrIndex, chrElement);\r\n });\r\n }\r\n }\r\n\r\n getChromosomeLabelClass() {\r\n if (this._config.ploidy === 1) {\r\n return 'chrLabel';\r\n } else {\r\n return 'chrSetLabel';\r\n }\r\n }\r\n\r\n _getAdditionalOffset() {\r\n var config = this._config;\r\n var numTracks = config.annotationsNumTracks || config.numAnnotTracks || 1;\r\n return (config.annotationHeight || 0) * numTracks;\r\n }\r\n\r\n _getChromosomeSetSize(chrSetIndex) {\r\n // Get last chromosome set size.\r\n var setSize = this._ploidy.getSetSize(chrSetIndex);\r\n\r\n // Increase offset by last chromosome set size\r\n return (\r\n setSize * this._config.chrWidth * 2 + (this.chrSetMargin)\r\n );\r\n }\r\n\r\n // Get chromosome set label anchor property\r\n getChromosomeSetLabelAnchor() {\r\n return 'middle';\r\n }\r\n\r\n // Get chromosome label y position.\r\n getChromosomeLabelYPosition() {\r\n return -5.5;\r\n }\r\n\r\n getChromosomeSetLabelYPosition(chrIndex) {\r\n if (this._config.ploidy === 1) {\r\n return this.getChromosomeLabelYPosition(chrIndex);\r\n } else {\r\n return -2 * this._config.chrWidth;\r\n }\r\n }\r\n\r\n}\r\n\r\nexport default Layout;\r\n","/**\r\n* @fileoverview Vertical layout class\r\n* Ideogram instances with vertical layout are oriented with each chromosome\r\n* starting at top and ending at bottom, and aligned as columns.\r\n*/\r\n\r\nimport {d3} from '../lib';\r\nimport Layout from './layout';\r\n\r\nclass VerticalLayout extends Layout {\r\n\r\n constructor(config, ideo) {\r\n super(config, ideo);\r\n this._class = 'VerticalLayout';\r\n // Layout margins\r\n this.margin = {\r\n top: 30,\r\n left: 15\r\n };\r\n }\r\n\r\n rotateForward(chrSetIndex, chrIndex, chrElement, callback) {\r\n // TODO: Integrate chrSetIndex and chrIndex to support polyploid rotation.\r\n\r\n var self = this;\r\n\r\n var xOffset = 20;\r\n\r\n var scale = this.getChromosomeScale(chrElement);\r\n\r\n var transform =\r\n 'translate(' + xOffset + ', 25) ' + scale;\r\n\r\n d3.select(chrElement.parentNode)\r\n .transition()\r\n .attr('transform', transform)\r\n .on('end', callback);\r\n\r\n // Append new chromosome labels\r\n var labels = this.getChromosomeLabels(chrElement);\r\n var y = (xOffset + self._config.chrWidth) * 1.3;\r\n d3.select(this._ideo.getSvg())\r\n .append('g')\r\n .attr('class', 'tmp')\r\n .selectAll('text')\r\n .data(labels)\r\n .enter()\r\n .append('text')\r\n .attr('class', function(d, i) {\r\n return i === 0 && labels.length === 2 ? 'chrSetLabel' : null;\r\n })\r\n .attr('x', 0)\r\n .attr('y', y).style('opacity', 0)\r\n .text(String)\r\n .transition()\r\n .style('opacity', 1);\r\n\r\n this._ideo.config.orientation = 'horizontal';\r\n }\r\n\r\n rotateBack(setIndex, chrIndex, chrElement, callback) {\r\n\r\n var scale = this.getChromosomeScaleBack(chrElement);\r\n var translate = this.getChromosomeSetTranslate(setIndex);\r\n\r\n d3.select(chrElement.parentNode)\r\n .transition()\r\n .attr('transform', translate + ' ' + scale)\r\n .on('end', callback);\r\n\r\n d3.selectAll(this._ideo.selector + ' g.tmp')\r\n .style('opacity', 0)\r\n .remove();\r\n\r\n this._ideo.config.orientation = 'vertical';\r\n }\r\n\r\n getHeight() {\r\n return this._config.chrHeight + this.margin.top * 1.5;\r\n }\r\n\r\n getWidth() {\r\n return '97%';\r\n }\r\n\r\n getChromosomeBandTickY1() {\r\n return 2;\r\n }\r\n\r\n getChromosomeBandTickY2() {\r\n return 10;\r\n }\r\n\r\n getChromosomeSetLabelTranslate() {\r\n return 'rotate(-90)';\r\n }\r\n\r\n getChromosomeBandLabelAnchor() {\r\n return null;\r\n }\r\n\r\n getChromosomeScale(chrElement) {\r\n var ideoBox, chrBox, scaleX, scaleY;\r\n\r\n ideoBox = d3.select(this._ideo.selector).node().getBoundingClientRect();\r\n chrBox = chrElement.getBoundingClientRect();\r\n\r\n scaleX = (ideoBox.width / chrBox.height) * 0.97;\r\n scaleY = this._getYScale();\r\n\r\n return 'scale(' + scaleX + ', ' + scaleY + ')';\r\n }\r\n\r\n getChromosomeScaleBack(chrElement) {\r\n var scale, scaleX, scaleY, chrName, chrModel, taxid, ideo, config;\r\n\r\n ideo = this._ideo;\r\n config = ideo.config;\r\n taxid = config.taxid;\r\n\r\n chrName = chrElement.id.split('-')[0].replace('chr', '');\r\n chrModel = this._ideo.chromosomes[taxid][chrName];\r\n scaleX = (chrModel.oldWidth / (config.chrHeight * 3)) * 0.97;\r\n scaleY = 1 / this._getYScale();\r\n scale = 'scale(' + scaleX + ', ' + scaleY + ')';\r\n return scale;\r\n }\r\n\r\n getChromosomeSetTranslate(setIndex) {\r\n var marginTop = this.margin.top;\r\n var chromosomeSetYTranslate = this.getChromosomeSetYTranslate(setIndex);\r\n return (\r\n 'rotate(90) ' +\r\n 'translate(' + marginTop + ', -' + chromosomeSetYTranslate + ')'\r\n );\r\n }\r\n\r\n getChromosomeSetYTranslate(setIndex) {\r\n // Get additional padding caused by annotation/histogram tracks\r\n var pad = this._getAdditionalOffset(),\r\n config = this._config,\r\n margin = config.chrMargin,\r\n width = config.chrWidth,\r\n translate;\r\n\r\n // If no detailed description provided just use one formula for all cases\r\n if (!config.ploidyDesc) {\r\n // TODO:\r\n // This part of code contains a lot magic numbers and if\r\n // statements for exactly corresponing to original ideogram examples.\r\n // But all this stuff should be removed. Calculation of translate\r\n // should be a simple formula applied for all cases listed below.\r\n // Now they are diffirent because of Layout:_getAdditionalOffset do\r\n // not meet for cases when no annotation, when annotation exists and\r\n // when histogram used\r\n\r\n if (config.annotationsLayout === 'histogram') {\r\n var barWidth = config.barWidth;\r\n return margin + setIndex * (margin + width + 3) + barWidth * 2;\r\n } else {\r\n const decorPad =\r\n 'legendPad' in config ? config.legendPad : 0;\r\n translate = width + setIndex * (margin + width) + pad * 2 + decorPad;\r\n if (pad > 0) {\r\n return translate;\r\n } else {\r\n return translate + 4 + (2 * setIndex);\r\n }\r\n }\r\n }\r\n\r\n // If detailed description provided start to calculate offsets\r\n // for each chromosome set separately. This should be done only once\r\n if (!this._translate) {\r\n // First offset equals to zero\r\n this._translate = [this._ploidy.getSetSize(0) * width * 2];\r\n var prevTranslate;\r\n // Loop through description set\r\n for (var i = 1; i < this._config.ploidyDesc.length; i++) {\r\n prevTranslate = this._translate[i - 1];\r\n this._translate[i] = prevTranslate + this._getChromosomeSetSize(i - 1);\r\n }\r\n }\r\n\r\n return this._translate[setIndex];\r\n }\r\n\r\n getChromosomeSetLabelXPosition() {\r\n return (this._config.chrWidth * this._config.ploidy) / -2;\r\n }\r\n\r\n getChromosomeLabelXPosition() {\r\n return this._config.chrWidth / -2;\r\n }\r\n}\r\n\r\nexport default VerticalLayout;\r\n","/**\r\n* @fileoverview Horizontal layout class\r\n* Ideogram instances with horizontal layout are oriented with each chromosome\r\n* starting at left and ending at right, and aligned as rows.\r\n*/\r\n\r\nimport {d3} from '../lib';\r\nimport Layout from './layout';\r\n\r\nclass HorizontalLayout extends Layout {\r\n\r\n constructor(config, ideo) {\r\n super(config, ideo);\r\n this._class = 'HorizontalLayout';\r\n this.margin = {\r\n left: 20,\r\n top: 30\r\n };\r\n }\r\n\r\n _getLeftMargin() {\r\n var margin = Layout.prototype._getLeftMargin.call(this);\r\n if (this._config.ploidy > 1) {\r\n margin *= 1.8;\r\n }\r\n\r\n return margin;\r\n }\r\n\r\n rotateForward(setIndex, chrIndex, chrElement, callback) {\r\n\r\n var xOffset, yOffset, transform, labels;\r\n\r\n xOffset = 30;\r\n\r\n yOffset = xOffset + 7.5;\r\n\r\n transform = (\r\n 'rotate(90) ' +\r\n 'translate(' + xOffset + ', -' + yOffset + ') '\r\n );\r\n\r\n d3.select(chrElement.parentNode)\r\n .transition()\r\n .attr('transform', transform)\r\n .on('end', callback);\r\n\r\n // Append new chromosome labels\r\n labels = this.getChromosomeLabels(chrElement);\r\n d3.select(this._ideo.getSvg())\r\n .append('g')\r\n .attr('class', 'tmp')\r\n .selectAll('text')\r\n .data(labels)\r\n .enter()\r\n .append('text')\r\n .attr('class', function(d, i) {\r\n return i === 0 && labels.length === 2 ? 'chrSetLabel' : null;\r\n })\r\n .attr('x', xOffset - 4)\r\n .attr('y', function(d, i) {\r\n return (i + 1 + labels.length % 2) * 12;\r\n })\r\n .style('text-anchor', 'middle')\r\n .style('opacity', 0)\r\n .text(String)\r\n .transition()\r\n .style('opacity', 1);\r\n\r\n this._ideo.config.orientation = 'vertical';\r\n }\r\n\r\n rotateBack(setIndex, chrIndex, chrElement, callback) {\r\n var translate = this.getChromosomeSetTranslate(setIndex);\r\n\r\n d3.select(chrElement.parentNode)\r\n .transition()\r\n .attr('transform', translate)\r\n .on('end', callback);\r\n\r\n d3.selectAll(this._ideo.selector + ' g.tmp')\r\n .style('opacity', 0)\r\n .remove();\r\n\r\n this._ideo.config.orientation = 'horizontal';\r\n }\r\n\r\n getHeight(taxid) {\r\n if (typeof taxid === 'undefined') taxid = this._config.taxids[0];\r\n // Get last chromosome set offset.\r\n var numChromosomes = this._config.chromosomes[taxid].length;\r\n var lastSetOffset = this.getChromosomeSetYTranslate(numChromosomes - 1);\r\n\r\n // Get last chromosome set size.\r\n var lastSetSize = this._getChromosomeSetSize(numChromosomes - 1);\r\n\r\n // Increase offset by last chromosome set size\r\n lastSetOffset += lastSetSize;\r\n\r\n return lastSetOffset + this._getAdditionalOffset() * 2;\r\n }\r\n\r\n getWidth() {\r\n return this._config.chrHeight + this.margin.top * 1.5;\r\n }\r\n\r\n getChromosomeSetLabelAnchor() {\r\n return 'end';\r\n }\r\n\r\n getChromosomeBandLabelAnchor() {\r\n return null;\r\n }\r\n\r\n getChromosomeBandTickY1() {\r\n return 2;\r\n }\r\n\r\n getChromosomeBandTickY2() {\r\n return 10;\r\n }\r\n\r\n getChromosomeSetLabelTranslate() {\r\n return null;\r\n }\r\n\r\n getChromosomeSetTranslate(setIndex) {\r\n var leftMargin = this._getLeftMargin();\r\n var yTranslate = this.getChromosomeSetYTranslate(setIndex);\r\n return 'translate(' + leftMargin + ', ' + yTranslate + ')';\r\n }\r\n\r\n getChromosomeSetYTranslate(setIndex) {\r\n // If no detailed description provided just use one formula for all cases.\r\n if (!this._config.ploidyDesc) {\r\n return this._config.chrMargin * (setIndex + 1);\r\n }\r\n\r\n // Id detailed description provided start to calculate offsets\r\n // for each chromosome set separately. This should be done only once.\r\n if (!this._translate) {\r\n // First offset equals to zero.\r\n this._translate = [1];\r\n\r\n // Loop through description set\r\n for (var i = 1; i < this._config.ploidyDesc.length; i++) {\r\n this._translate[i] =\r\n this._translate[i - 1] + this._getChromosomeSetSize(i - 1);\r\n }\r\n }\r\n\r\n return this._translate[setIndex];\r\n }\r\n\r\n getChromosomeSetLabelXPosition(i) {\r\n if (this._config.ploidy === 1) {\r\n return this.getChromosomeLabelXPosition(i);\r\n } else {\r\n return -20;\r\n }\r\n }\r\n\r\n getChromosomeSetLabelYPosition(i) {\r\n var setSize = this._ploidy.getSetSize(i),\r\n config = this._config,\r\n chrMargin = config.chrMargin,\r\n chrWidth = config.chrWidth,\r\n y;\r\n\r\n if (config.ploidy === 1) {\r\n y = chrWidth / 2 + 3;\r\n } else {\r\n y = (setSize * chrMargin) / 2;\r\n }\r\n\r\n return y;\r\n }\r\n\r\n getChromosomeLabelXPosition() {\r\n return -8;\r\n }\r\n\r\n getChromosomeLabelYPosition() {\r\n return this._config.chrWidth;\r\n }\r\n\r\n}\r\n\r\nexport default HorizontalLayout;\r\n","/**\r\n* @fileoverview Paired layout class\r\n* Ideograms with paired layout group each chromosome in a chromosome set.\r\n* This enables ploidy support beyond the default haploid; e.g. diploid genomes.\r\n*/\r\n\r\nimport Layout from './layout';\r\n\r\nclass PairedLayout extends Layout {\r\n\r\n constructor(config, ideo) {\r\n super(config, ideo);\r\n\r\n this._class = 'PairedLayout';\r\n\r\n this.margin = {\r\n left: 30\r\n };\r\n }\r\n\r\n getHeight() {\r\n return this._config.chrHeight + this.margin.left * 1.5;\r\n }\r\n\r\n getWidth() {\r\n return '97%';\r\n }\r\n\r\n getChromosomeBandTickY1(chrIndex) {\r\n return chrIndex % 2 ? this._config.chrWidth : this._config.chrWidth * 2;\r\n }\r\n\r\n getChromosomeBandTickY2(chrIndex) {\r\n var width = this._config.chrWidth;\r\n return chrIndex % 2 ? width - this._tickSize : width * 2 + this._tickSize;\r\n }\r\n\r\n getChromosomeBandLabelAnchor(chrIndex) {\r\n return chrIndex % 2 ? null : 'end';\r\n }\r\n\r\n getChromosomeBandLabelTranslate(band, chrIndex) {\r\n var x = chrIndex % 2 ? 10 : -this._config.chrWidth - 10;\r\n var y = this._ideo.round(band.px.start + band.px.width / 2) + 3;\r\n\r\n return {\r\n x: y,\r\n y: y,\r\n translate: 'rotate(-90) translate(' + x + ', ' + y + ')'\r\n };\r\n }\r\n\r\n getChromosomeLabelXPosition() {\r\n return -this._tickSize;\r\n }\r\n\r\n getChromosomeSetLabelXPosition() {\r\n return this._config.chrWidth / -2;\r\n }\r\n\r\n getChromosomeSetLabelTranslate() {\r\n return 'rotate(-90)';\r\n }\r\n\r\n getChromosomeSetTranslate(setIndex) {\r\n var chromosomeSetYTranslate = this.getChromosomeSetYTranslate(setIndex);\r\n return (\r\n 'rotate(90) ' +\r\n 'translate(' + this.margin.left + ', -' + chromosomeSetYTranslate + ')'\r\n );\r\n }\r\n\r\n getChromosomeSetYTranslate(setIndex) {\r\n return 200 * (setIndex + 1);\r\n }\r\n\r\n}\r\n\r\nexport default PairedLayout;\r\n","import Layout from './layout';\r\n\r\nclass SmallLayout extends Layout {\r\n\r\n constructor(config, ideo) {\r\n super(config, ideo);\r\n\r\n this._class = 'SmallLayout';\r\n\r\n this.margin = {\r\n left: 36.5,\r\n top: 10\r\n };\r\n\r\n var taxid = this._ideo.getTaxid(this._ideo.config.organism);\r\n\r\n this.chrs = config.chromosomes[taxid];\r\n var numChrs = this.chrs.length;\r\n\r\n // Number of chromosomes per row\r\n this.chrsPerRow = Math.ceil(numChrs / config.rows);\r\n }\r\n\r\n // rotateForward(setIndex, chrIndex, chrElement, callback) {\r\n // var ideoBox =\r\n // d3.select(this._ideo.selector).node().getBoundingClientRect();\r\n // var chrBox = chrElement.getBoundingClientRect();\r\n //\r\n // var scaleX = (ideoBox.width / chrBox.height) * 0.97;\r\n // var scaleY = this._getYScale();\r\n //\r\n // transform = 'translate(5, 25) scale(' + scaleX + ', ' + scaleY + ')';\r\n //\r\n // d3.select(chrElement.parentNode)\r\n // .transition()\r\n // .attr('transform', transform)\r\n // .on('end', callback);\r\n // }\r\n //\r\n // rotateBack(setIndex, chrIndex, chrElement, callback) {\r\n // var translate = this.getChromosomeSetTranslate(setIndex);\r\n //\r\n // d3.select(chrElement.parentNode)\r\n // .transition()\r\n // .attr('transform', translate)\r\n // .on('end', callback);\r\n // }\r\n\r\n /**\r\n * eweitz 2020-04-13:\r\n * This height metric is crude because it is calculated before\r\n * the height (\"width\") of each chromosome is calculated.\r\n *\r\n * It calculates height by multiplying the max height of all chromosomes\r\n * (specified in the Ideogram configuration object) by the number of rows.\r\n * This ensures the ideogram height doesn't truncate in cases like dog\r\n * (where chrX on the second row is longer than chr1 on the first), but it\r\n * often leaves too much space on the second row, e.g. for human.\r\n *\r\n * Ideally, ideogram height would be cumulative height per row, plus top\r\n * margin. This would require calling getHeight _after_ all chromosomes\r\n * have had their height (technically, chr.width) assigned. See draft new\r\n * getHeight method below this getHeight method.\r\n */\r\n getHeight() {\r\n var config = this._config;\r\n var chrHeight = config.chrHeight * 1.25;\r\n return this._config.rows * (chrHeight + this.margin.top);\r\n }\r\n\r\n /**\r\n * eweitz 2020-04-13:\r\n * Draft refinement of getHeight. See note in classic version above.\r\n *\r\n * Total height is cumulative height per row, plus top margin\r\n */\r\n // getHeight() {\r\n // let height = 0;\r\n // const rows = this._config.rows;\r\n // const chrEntries = Object.entries(this.chrs);\r\n\r\n // for (let i = 0; i < rows; i++) {\r\n // let rowHeight = 0;\r\n // // Starting and ending indexes of chromosomes of this row\r\n // const startIndex = this.chrsPerRow * i;\r\n // const endIndex = this.chrsPerRow * (i + 1) - 1;\r\n\r\n // for (let j = startIndex; j < endIndex; j++) {\r\n // const thisChrHeight = chrEntries[j][1].width;\r\n // if (thisChrHeight > rowHeight) {\r\n // rowHeight = thisChrHeight;\r\n // }\r\n // }\r\n // height += rowHeight + this.margin.top;\r\n // }\r\n\r\n // return height;\r\n // }\r\n\r\n getWidth() {\r\n return '97%';\r\n }\r\n\r\n getChromosomeBandLabelTranslate() {\r\n\r\n }\r\n\r\n getChromosomeSetLabelTranslate() {\r\n return 'rotate(-90)';\r\n }\r\n\r\n getChromosomeSetTranslate(setIndex) {\r\n var xOffset, yOffset;\r\n\r\n if (setIndex > this.chrsPerRow - 1) {\r\n xOffset = this.margin.left + this._config.chrHeight * 1.3;\r\n yOffset = this.getChromosomeSetYTranslate(setIndex - this.chrsPerRow);\r\n } else {\r\n xOffset = this.margin.left;\r\n yOffset = this.getChromosomeSetYTranslate(setIndex);\r\n }\r\n\r\n return 'rotate(90) translate(' + xOffset + ', -' + yOffset + ')';\r\n }\r\n\r\n getChromosomeSetYTranslate(setIndex) {\r\n // Get additional padding caused by annotation tracks\r\n var additionalPadding = this._getAdditionalOffset() * 0.3;\r\n // If no detailed description provided just use one formula for all cases\r\n return (\r\n this.margin.left * (setIndex) + this._config.chrWidth +\r\n additionalPadding * 2 + additionalPadding * setIndex\r\n );\r\n }\r\n\r\n getChromosomeSetLabelXPosition(setIndex) {\r\n return (\r\n ((this._ploidy.getSetSize(setIndex) * this._config.chrWidth + 20) / -2) +\r\n (this._config.ploidy > 1 ? 0 : this._config.chrWidth)\r\n );\r\n }\r\n\r\n getChromosomeLabelXPosition() {\r\n return this._config.chrWidth / -2;\r\n }\r\n\r\n}\r\n\r\nexport default SmallLayout;\r\n","import {d3} from '../lib';\r\nimport {Ploidy} from '../ploidy';\r\nimport {getLayout} from '../layouts/layout-adapter';\r\n\r\n/**\r\n * If ploidy description is a string, then convert it to the canonical\r\n * array format. String ploidyDesc is used when depicting e.g. parental\r\n * origin each member of chromosome pair in a human genome.\r\n * See ploidy-basic.html for usage example.\r\n */\r\nfunction setPloidy(ideo) {\r\n if (\r\n 'ploidyDesc' in ideo.config &&\r\n typeof ideo.config.ploidyDesc === 'string'\r\n ) {\r\n var tmp = [];\r\n for (var i = 0; i < ideo.numChromosomes; i++) {\r\n tmp.push(ideo.config.ploidyDesc);\r\n }\r\n ideo.config.ploidyDesc = tmp;\r\n }\r\n // Organism ploidy description\r\n ideo._ploidy = new Ploidy(ideo.config);\r\n}\r\n\r\nfunction getContainerSvgClass(ideo) {\r\n var svgClass = '';\r\n if (ideo.config.showChromosomeLabels) {\r\n if (ideo.config.orientation === 'horizontal') {\r\n svgClass += 'labeledLeft ';\r\n } else {\r\n svgClass += 'labeled ';\r\n }\r\n }\r\n\r\n if (ideo.config.rotatable === false) {\r\n svgClass += 'no-rotate ';\r\n }\r\n\r\n if (\r\n ideo.config.annotationsLayout &&\r\n ideo.config.annotationsLayout === 'overlay'\r\n ) {\r\n svgClass += 'faint';\r\n }\r\n\r\n return svgClass;\r\n}\r\n\r\n/**\r\n * Write tooltip div setup with default styling.\r\n */\r\nfunction writeTooltipContainer(ideo) {\r\n d3.select(ideo.config.container + ' #_ideogramOuterWrap').append('div')\r\n .attr('class', '_ideogramTooltip')\r\n .attr('id', '_ideogramTooltip')\r\n .style('opacity', 0)\r\n .style('position', 'fixed')\r\n .style('text-align', 'center')\r\n .style('padding', '4px')\r\n .style('font', '12px sans-serif')\r\n .style('background', 'white')\r\n .style('border', '1px solid black')\r\n .style('border-radius', '5px')\r\n .style('z-index', '1000');\r\n}\r\n\r\nfunction writeContainerDom(ideo) {\r\n\r\n // Remove any previous container content\r\n d3.selectAll(ideo.config.container + ' #_ideogramOuterWrap').remove();\r\n\r\n d3.select(ideo.config.container)\r\n .append('div')\r\n .attr('id', '_ideogramOuterWrap')\r\n .append('div')\r\n .attr('id', '_ideogramTrackLabelContainer')\r\n .style('position', 'absolute');\r\n\r\n d3.select(ideo.config.container + ' #_ideogramOuterWrap').append('div')\r\n .attr('id', '_ideogramMiddleWrap') // needed for overflow and scrolling\r\n .style('position', 'relative')\r\n .style('overflow-x', 'auto')\r\n .style('transform', 'translateZ(0)') // add compositing layer for ideogram\r\n .append('div')\r\n .attr('id', '_ideogramInnerWrap') // needed for overflow and scrolling\r\n .append('svg')\r\n .attr('id', '_ideogram')\r\n .attr('class', getContainerSvgClass(ideo))\r\n .attr('width', ideo._layout.getWidth())\r\n .attr('height', ideo._layout.getHeight())\r\n .html(ideo.getBandColorGradients());\r\n}\r\n\r\n/**\r\n * Writes the HTML elements that contain this ideogram instance.\r\n */\r\nfunction writeContainer(t0) {\r\n var ideo = this;\r\n\r\n if (ideo.config.annotationsPath) {\r\n ideo.fetchAnnots(ideo.config.annotationsPath);\r\n }\r\n\r\n setPloidy(ideo);\r\n\r\n ideo._layout = getLayout(ideo);\r\n\r\n writeContainerDom(ideo);\r\n\r\n ideo.isOnlyIdeogram = document.querySelectorAll('#_ideogram').length === 1;\r\n writeTooltipContainer(ideo);\r\n ideo.finishInit(t0);\r\n}\r\n\r\nexport {writeContainer};\r\n","import VerticalLayout from './vertical-layout';\r\nimport HorizontalLayout from './horizontal-layout';\r\nimport PairedLayout from './paired-layout';\r\nimport SmallLayout from './small-layout';\r\n\r\nfunction getLayout(ideo) {\r\n var config = ideo.config;\r\n\r\n if ('perspective' in config && config.perspective === 'comparative') {\r\n return new PairedLayout(config, ideo);\r\n } else if ('rows' in config && config.rows > 1) {\r\n return new SmallLayout(config, ideo);\r\n } else if (config.orientation === 'vertical') {\r\n return new VerticalLayout(config, ideo);\r\n } else if (config.orientation === 'horizontal') {\r\n return new HorizontalLayout(config, ideo);\r\n } else {\r\n return new VerticalLayout(config, ideo);\r\n }\r\n}\r\n\r\nexport {getLayout};\r\n","import {hasNonGenBankAssembly, fetchWithRetry} from '../lib';\r\n\r\nvar lastBandDataUrl = '';\r\n\r\nfunction getBandUrl(bandDataFileNames, taxid, ideo) {\r\n return ideo.config.dataDir + bandDataFileNames[taxid];\r\n}\r\n\r\nfunction shouldFetchBands(bandDataFileNames, taxid, ideo) {\r\n var bandDataUrl = getBandUrl(bandDataFileNames, taxid, ideo);\r\n return (\r\n !(typeof window.chrBands !== 'undefined' && lastBandDataUrl === '') ||\r\n lastBandDataUrl !== bandDataUrl\r\n ) &&\r\n hasNonGenBankAssembly(ideo) &&\r\n taxid in bandDataFileNames;\r\n}\r\n\r\nfunction setBandData(url, fileNames, chrBands, ideo) {\r\n var taxid, fetchedTaxid, fileName;\r\n\r\n // Ensures correct taxid is processed in response callback;\r\n // using simply upstream 'taxid' variable gives the last\r\n // *requested* taxid, which fails when dealing with multiple taxa.\r\n for (taxid in fileNames) {\r\n fileName = fileNames[taxid];\r\n if (url.includes(fileName) && fileName !== '') {\r\n fetchedTaxid = taxid;\r\n }\r\n }\r\n\r\n ideo.bandData[fetchedTaxid] = chrBands;\r\n}\r\n\r\nfunction fetchBands(bandDataFileNames, taxid, t0, ideo) {\r\n var bandDataUrl = getBandUrl(bandDataFileNames, taxid, ideo);\r\n\r\n if (!ideo.numBandDataResponses) ideo.numBandDataResponses = 0;\r\n\r\n return fetchWithRetry(bandDataUrl)\r\n .then(function(response) {\r\n return response.json().then(function(rawBands) {\r\n lastBandDataUrl = bandDataUrl;\r\n\r\n delete window.chrBands; // Remove any previous chrBands variable\r\n window.chrBands = rawBands.chrBands;\r\n\r\n setBandData(response.url, bandDataFileNames, chrBands, ideo);\r\n });\r\n });\r\n}\r\n\r\nexport {shouldFetchBands, fetchBands};\r\n","/**\r\n * @fileoveriew Methods for initialization\r\n */\r\n\r\nimport {d3, slug} from '../lib';\r\nimport {configure} from './configure';\r\nimport {finishInit} from './finish-init';\r\nimport {writeContainer} from './write-container';\r\nimport {shouldFetchBands, fetchBands} from '../bands/fetch';\r\nimport {organismMetadata} from './organism-metadata';\r\n\r\nfunction isHeterogameticChromosome(chrModel, chrIndex, ideo) {\r\n var ploidy = ideo.config.ploidy;\r\n return (\r\n 'sex' in ideo.config &&\r\n (\r\n ploidy === 2 && ideo.sexChromosomes.index + 1 === chrIndex ||\r\n ideo.config.sex === 'female' && chrModel.name === 'Y'\r\n )\r\n );\r\n}\r\n\r\nfunction prepareChromosomes(bandsArray, chrs, taxid, ideo) {\r\n var j, bands, chromosome, chrModel, chrIndex;\r\n\r\n for (j = 0; j < chrs.length; j++) {\r\n chromosome = chrs[j];\r\n if (typeof bandsArray !== 'undefined') bands = bandsArray[j];\r\n\r\n chrIndex = j + ideo.config.taxids.indexOf(taxid);\r\n chrModel = ideo.getChromosomeModel(bands, chromosome, taxid, chrIndex);\r\n\r\n if (typeof chromosome !== 'string') {\r\n chromosome = chromosome.name.split(' ').slice(-1)[0].replace('chr', '');\r\n }\r\n\r\n ideo.chromosomes[taxid][chromosome] = chrModel;\r\n ideo.chromosomesArray.push(chrModel);\r\n\r\n if (isHeterogameticChromosome(chrModel, j, ideo)) continue;\r\n\r\n ideo.drawChromosome(chrModel);\r\n }\r\n}\r\n\r\nfunction setCoordinateSystem(chrs, ideo) {\r\n if (\r\n typeof chrBands !== 'undefined' &&\r\n chrs.length >= chrBands.length / 2\r\n ) {\r\n ideo.coordinateSystem = 'bp';\r\n }\r\n}\r\n\r\n/**\r\n * Configures chromosome data and calls downstream chromosome drawing functions\r\n */\r\nfunction initDrawChromosomes() {\r\n var taxid, i, chrs, bandsArray,\r\n ideo = this,\r\n taxids = ideo.config.taxids;\r\n\r\n for (i = 0; i < taxids.length; i++) {\r\n taxid = taxids[i];\r\n chrs = ideo.config.chromosomes[taxid];\r\n\r\n bandsArray = ideo.bandsArray[taxid];\r\n\r\n if (!ideo.config.showNonNuclearChromosomes) {\r\n // Remove MT\r\n // TODO: Handle other non-nuclear chromosomes, e.g. CP, AP\r\n chrs = chrs.filter(chr => chr !== 'MT');\r\n if (typeof bandsArray !== 'undefined') {\r\n bandsArray = bandsArray.filter(bands => {\r\n return bands[0].chr !== 'MT';\r\n });\r\n }\r\n }\r\n\r\n setCoordinateSystem(chrs, ideo);\r\n\r\n ideo.chromosomes[taxid] = {};\r\n ideo.setSexChromosomes(chrs);\r\n\r\n prepareChromosomes(bandsArray, chrs, taxid, ideo);\r\n\r\n if (ideo.config.showBandLabels) ideo.drawBandLabels(ideo.chromosomes);\r\n ideo.handleRotateOnClick();\r\n ideo._gotChrModels = true; // Prevent issue with errant rat centromeres\r\n }\r\n}\r\n\r\n/**\r\n * Attach any click handlers to rotate and toggle chromosomes\r\n */\r\nfunction handleRotateOnClick() {\r\n var ideo = this;\r\n\r\n if (!('rotatable' in ideo.config && ideo.config.rotatable === false)) {\r\n d3.selectAll(ideo.selector + ' .chromosome-set').on('click', function() {\r\n // Handles click on chromosome graphic or label.\r\n // Label click needed to toggle e.g. human MT\r\n const element = this.children[1];\r\n\r\n ideo.rotateAndToggleDisplay(element);\r\n });\r\n } else {\r\n d3.selectAll(ideo.selector).style('cursor', 'default');\r\n }\r\n}\r\n\r\n/**\r\n * Called when Ideogram has finished initializing.\r\n * Accounts for certain ideogram properties not being set until\r\n * asynchronous requests succeed, etc.\r\n */\r\nfunction onLoad() {\r\n call(this.onLoadCallback);\r\n}\r\n\r\nfunction getBandFileName(taxid, accession, ideo) {\r\n var organism = ideo.organisms[taxid];\r\n var bandFileName = [slug(organism.scientificName)];\r\n var assemblies = organism.assemblies;\r\n var resolution = ideo.config.resolution;\r\n\r\n if (accession !== assemblies.default) {\r\n bandFileName.push(accession);\r\n }\r\n if (\r\n taxid === '9606' &&\r\n (accession in assemblies === 'false' &&\r\n Object.values(assemblies).includes(config.assembly) ||\r\n (resolution !== '' && resolution !== 850))\r\n ) {\r\n bandFileName.push(resolution);\r\n }\r\n\r\n bandFileName = bandFileName.join('-');\r\n\r\n var fullyBandedTaxids = ['9606', '10090', '10116'];\r\n if (fullyBandedTaxids.includes(taxid) && !ideo.config.showFullyBanded) {\r\n bandFileName += '-no-bands';\r\n }\r\n\r\n bandFileName += '.json';\r\n\r\n return bandFileName;\r\n}\r\n\r\nfunction getBandFileNames(taxid, bandFileNames, ideo) {\r\n var organism, assemblies, accession, bandFileName,\r\n config = ideo.config;\r\n\r\n organism = ideo.organisms[taxid];\r\n\r\n if (!config.assembly) ideo.config.assembly = 'default';\r\n\r\n assemblies = organism.assemblies;\r\n\r\n if (ideo.assemblyIsAccession()) {\r\n accession = config.assembly;\r\n } else {\r\n accession = assemblies[config.assembly];\r\n }\r\n\r\n bandFileName = getBandFileName(taxid, accession, ideo);\r\n var isCustomOrganism = taxid === '-1';\r\n\r\n if (taxid in ideo.organismsWithBands || isCustomOrganism) {\r\n bandFileNames[taxid] = bandFileName;\r\n }\r\n return bandFileNames;\r\n}\r\n\r\nfunction prepareContainer(taxid, bandFileNames, t0, ideo) {\r\n\r\n if (shouldFetchBands(bandFileNames, taxid, ideo)) {\r\n return fetchBands(bandFileNames, taxid, t0, ideo).then(function() {\r\n return ideo.processBandData(taxid);\r\n });\r\n } else {\r\n return new Promise(function(resolve) {\r\n ideo.processBandData(taxid);\r\n resolve([taxid, undefined]);\r\n });\r\n }\r\n}\r\n\r\nfunction initializeTaxids(ideo) {\r\n return new Promise(function(resolve) {\r\n var organism = ideo.config.organism;\r\n if (typeof organism === 'number') {\r\n // 'organism' is a taxid, e.g. 9606\r\n ideo.getOrganismFromEutils(organism, function() {\r\n ideo.getTaxids(resolve);\r\n });\r\n } else {\r\n ideo.getTaxids(resolve);\r\n }\r\n\r\n });\r\n}\r\n\r\nfunction getBandsAndPrepareContainer(taxids, t0, ideo) {\r\n var bandFileNames, i, taxid,\r\n promises = [];\r\n\r\n bandFileNames = {};\r\n for (taxid in organismMetadata) {\r\n bandFileNames[taxid] = '';\r\n }\r\n\r\n for (i = 0; i < taxids.length; i++) {\r\n taxid = String(taxids[i]);\r\n bandFileNames = getBandFileNames(taxid, bandFileNames, ideo);\r\n promises.push(prepareContainer(taxid, bandFileNames, t0, ideo));\r\n }\r\n\r\n Promise.all(promises).then(function(taxidsAndBandsArrays) {\r\n var taxidAndBandsArray, taxid, bandsArray;\r\n\r\n for (i = 0; i < taxidsAndBandsArrays.length; i++) {\r\n taxidAndBandsArray = taxidsAndBandsArrays[i];\r\n taxid = taxidAndBandsArray[0];\r\n bandsArray = taxidAndBandsArray[1];\r\n\r\n if ('bandsArray' in ideo === false) {\r\n ideo.bandsArray = {};\r\n }\r\n\r\n ideo.bandsArray[taxid] = bandsArray;\r\n }\r\n ideo.writeContainer(t0);\r\n });\r\n}\r\n\r\n/**\r\n * Initializes an ideogram.\r\n * Sets some high-level properties based on instance configuration,\r\n * fetches band and annotation data if needed, and\r\n * writes an SVG element to the document to contain the ideogram\r\n */\r\n// Prevents race condition when init is called multiple times in\r\n// quick succession.\r\n// See https://github.com/eweitz/ideogram/pull/154.\r\nvar ideoNext = {};\r\nvar ideoQueued = {};\r\nvar ideoWait = {};\r\n\r\nfunction init(ideo) {\r\n ideo = ideo || this;\r\n var containerId = ideo.config.container;\r\n\r\n if (ideoWait[containerId]) {\r\n ideoQueued[containerId] = true;\r\n ideoNext[containerId] = ideo;\r\n } else {\r\n ideoWait[containerId] = true;\r\n initializeTaxids(ideo)\r\n .then(function(taxids) {\r\n\r\n var taxid = taxids[0];\r\n ideo.config.taxid = taxid;\r\n ideo.config.taxids = taxids;\r\n\r\n ideo.organismScientificName =\r\n ideo.getScientificName(ideo.config.taxid);\r\n\r\n var t0 = new Date().getTime();\r\n getBandsAndPrepareContainer(taxids, t0, ideo);\r\n\r\n ideoWait[containerId] = false;\r\n if (ideoQueued[containerId]) {\r\n ideoQueued[containerId] = false;\r\n init(ideoNext[containerId]);\r\n }\r\n });\r\n }\r\n}\r\n\r\nexport {\r\n configure, initDrawChromosomes, handleRotateOnClick,\r\n onLoad, init, finishInit, writeContainer\r\n};\r\n","/**\r\n * @fileoverview Parse raw Ideogram.js annotations from a BED file\r\n * BED documentation: https://genome.ucsc.edu/FAQ/FAQformat#format1\r\n */\r\n\r\nexport class BedParser {\r\n\r\n constructor(bed, ideo) {\r\n this.rawAnnots = this.parseBed(bed, ideo);\r\n }\r\n\r\n // http://stackoverflow.com/a/5624139\r\n static componentToHex(c) {\r\n var hex = parseInt(c, 10).toString(16);\r\n return hex.length === 1 ? '0' + hex : hex;\r\n }\r\n\r\n static rgbToHex(r, g, b) {\r\n return (\r\n '#' +\r\n BedParser.componentToHex(r) +\r\n BedParser.componentToHex(g) +\r\n BedParser.componentToHex(b)\r\n );\r\n }\r\n\r\n parseGenomicCoordinates(columns, ucscStyle) {\r\n var chr, start, stop, length;\r\n\r\n // These three columns (i.e. fields) are required\r\n chr = columns[0];\r\n start = parseInt(columns[1], 10);\r\n stop = parseInt(columns[2], 10);\r\n\r\n length = stop - start;\r\n\r\n if (ucscStyle) {\r\n chr = chr.slice(3);\r\n }\r\n\r\n return [chr, start, stop, length];\r\n }\r\n\r\n /**\r\n * Parses an annotation from a tab-separated line of a BED file\r\n */\r\n parseAnnotFromTsvLine(tsvLine, chrs, ucscStyle) {\r\n var annot, chrIndex, chr, start, rgb, color, label,\r\n columns = tsvLine.split(/\\s/g);\r\n\r\n [chr, start, stop, length] =\r\n this.parseGenomicCoordinates(columns, ucscStyle);\r\n\r\n chrIndex = chrs.indexOf(chr);\r\n if (chrIndex === -1) return [null, null];\r\n\r\n annot = ['', start, length, 0];\r\n\r\n if (columns.length >= 4) {\r\n label = columns[3];\r\n annot[0] = label;\r\n }\r\n\r\n if (columns.length >= 8) {\r\n rgb = columns[8].split(',');\r\n color = BedParser.rgbToHex(rgb[0], rgb[1], rgb[2]);\r\n annot.push(color);\r\n }\r\n\r\n return [chrIndex, annot];\r\n }\r\n\r\n parseRawAnnots(annots, bedStartIndex, tsvLines, chrs) {\r\n var i, line, chrIndex, annot, keys, rawAnnots, ucscStyle;\r\n\r\n ucscStyle = true;\r\n if (isNaN(parseInt(tsvLines[bedStartIndex], 10)) === false) {\r\n ucscStyle = false;\r\n }\r\n\r\n for (i = bedStartIndex; i < tsvLines.length; i++) {\r\n line = tsvLines[i];\r\n [chrIndex, annot] = this.parseAnnotFromTsvLine(line, chrs, ucscStyle);\r\n if (chrIndex !== null) annots[chrIndex].annots.push(annot);\r\n }\r\n\r\n keys = ['name', 'start', 'length', 'trackIndex'];\r\n if (tsvLines[bedStartIndex].length >= 8) keys.push('color');\r\n\r\n rawAnnots = {keys: keys, annots: annots};\r\n\r\n return rawAnnots;\r\n }\r\n\r\n /**\r\n * Parses a BED file, returns raw annotations\r\n */\r\n parseBed(bed, ideo) {\r\n var i, chrs, chr, bedStartIndex, rawAnnots,\r\n annots = [],\r\n tsvLines = bed.split(/\\r\\n|\\n/);\r\n\r\n chrs = Object.keys(ideo.chromosomes[ideo.config.taxid]);\r\n\r\n for (i = 0; i < chrs.length; i++) {\r\n chr = chrs[i];\r\n annots.push({chr: chr, annots: []});\r\n }\r\n\r\n bedStartIndex = 0; // 1 if BED has header (i.e. track line), 0 otherwise\r\n if (tsvLines[0].slice(0, 3) === 'chr' || isNaN(parseInt(tsvLines[0], 10))) {\r\n bedStartIndex = 1;\r\n }\r\n\r\n rawAnnots = this.parseRawAnnots(annots, bedStartIndex, tsvLines, chrs);\r\n return rawAnnots;\r\n }\r\n\r\n}\r\n","/**\r\n * @fileoverview Parse raw Ideogram.js annotations from a TSV file\r\n */\r\n\r\nexport class TsvParser {\r\n\r\n constructor(tsv, ideo) {\r\n this.rawAnnots = this.parseTsv(tsv, ideo);\r\n }\r\n\r\n parseGenomicCoordinates(columns) {\r\n var chr, start, stop, length;\r\n\r\n // These three columns (i.e. fields) are required\r\n chr = columns[1];\r\n start = parseInt(columns[2], 10);\r\n length = parseInt(columns[3], 10);\r\n\r\n stop = start + length;\r\n\r\n return [chr, start, stop, length];\r\n }\r\n\r\n /** If value has substring match in headers, return column index */\r\n getValueColumnIndex(value, headerLine) {\r\n let index;\r\n headerLine.split(/\\t/g).forEach((header, i) => {\r\n if (header.includes(value)) index = i;\r\n });\r\n return index;\r\n }\r\n\r\n /**\r\n * Parses an annotation from a tab-separated line of a TSV file\r\n */\r\n parseAnnotFromTsvLine(tsvLine, headerLine, chrs) {\r\n var annot, chrIndex, chr, start, color, fullName, significance, citations,\r\n name, index,\r\n columns = tsvLine.split(/\\t/g);\r\n\r\n [chr, start, stop, length] =\r\n this.parseGenomicCoordinates(columns);\r\n chrIndex = chrs.indexOf(chr);\r\n if (chrIndex === -1) return [null, null];\r\n\r\n name = columns[0];\r\n annot = [name, start, length, 0];\r\n\r\n if (headerLine.includes('color')) {\r\n index = this.getValueColumnIndex('color', headerLine);\r\n color = columns[index];\r\n annot.push(color);\r\n }\r\n if (headerLine.includes('full_name')) {\r\n index = this.getValueColumnIndex('full_name', headerLine);\r\n fullName = columns[index];\r\n annot.push(fullName);\r\n }\r\n if (headerLine.includes('citations')) {\r\n index = this.getValueColumnIndex('citations', headerLine);\r\n citations = columns[index];\r\n annot.push(citations);\r\n }\r\n if (headerLine.includes('significance')) {\r\n index = this.getValueColumnIndex('significance', headerLine);\r\n significance = columns[index];\r\n annot.push(significance);\r\n }\r\n\r\n return [chrIndex, annot];\r\n }\r\n\r\n parseRawAnnots(annots, tsvStartIndex, tsvLines, chrs) {\r\n var i, line, chrIndex, annot, keys, rawAnnots;\r\n\r\n const headerLine = tsvLines[0];\r\n\r\n for (i = tsvStartIndex; i < tsvLines.length; i++) {\r\n line = tsvLines[i];\r\n if (line.length === 0) continue; // Skip blank lines\r\n [chrIndex, annot] = this.parseAnnotFromTsvLine(line, headerLine, chrs);\r\n if (chrIndex !== null) annots[chrIndex].annots.push(annot);\r\n }\r\n\r\n keys = ['name', 'start', 'length', 'trackIndex'];\r\n if (headerLine.includes('color')) keys.push('color');\r\n if (headerLine.includes('full_name')) keys.push('fullName');\r\n if (headerLine.includes('citations')) keys.push('citations');\r\n if (headerLine.includes('significance')) keys.push('significance');\r\n\r\n rawAnnots = {keys: keys, annots: annots};\r\n\r\n return rawAnnots;\r\n }\r\n\r\n /**\r\n * Parses a TSV file, returns raw annotations\r\n */\r\n parseTsv(tsv, ideo) {\r\n var i, chrs, chr, tsvStartIndex, rawAnnots,\r\n annots = [],\r\n tsvLines = tsv.split(/\\r\\n|\\n/);\r\n\r\n chrs = Object.keys(ideo.chromosomes[ideo.config.taxid]);\r\n\r\n for (i = 0; i < chrs.length; i++) {\r\n chr = chrs[i];\r\n annots.push({chr: chr, annots: []});\r\n }\r\n\r\n tsvStartIndex = 0; // 1 if TSV has header (i.e. track line), 0 otherwise\r\n if (tsvLines[0].slice(0, 3) === 'chr' || isNaN(parseInt(tsvLines[0], 10))) {\r\n tsvStartIndex = 1;\r\n }\r\n\r\n rawAnnots = this.parseRawAnnots(annots, tsvStartIndex, tsvLines, chrs);\r\n\r\n if (tsvStartIndex === 1 && tsvLines[0].includes('citations')) {\r\n // TSV has a header, so parse citation_from__to_\r\n const headers = tsvLines[0].split('\\t');\r\n const citeIndex = 6;\r\n const citeHeader = headers[citeIndex];\r\n const fromTo = citeHeader.split('citations_')[1];\r\n rawAnnots.annots = rawAnnots.annots.map((annotsByChr) => {\r\n annotsByChr.annots = annotsByChr.annots.map((annot) => {\r\n annot[citeIndex] =\r\n annot[citeIndex] + ' citations ' + fromTo.replace(/_/g, ' ');\r\n return annot;\r\n });\r\n return annotsByChr;\r\n });\r\n }\r\n\r\n return rawAnnots;\r\n }\r\n\r\n}\r\n","/**\r\n * @fileoverview Functions used by parallel and collinear heatmaps.\r\n */\r\n\r\nvar reservedTrackKeys = [\r\n 'name', 'start', 'length', 'trackIndex', 'trackIndexOriginal', 'color'\r\n];\r\n\r\nvar defaultHeatmapColors = {\r\n 3: ['00B', 'DDD', 'F00'],\r\n 5: ['00D', '66D', 'DDD', 'F88', 'F00'],\r\n 17: [\r\n '00D', '00D', '00D', '00D', '00D', '44D', '44D', 'DDD', 'DDD',\r\n 'DDD', 'DDD', 'F88', 'F66', 'F22', 'F22', 'F00', 'F00', 'F00'\r\n ]\r\n};\r\n\r\n/**\r\n * Get label text for displayed tracks from annotation container metadata,\r\n * heatmap keys, or annotation container keys\r\n */\r\nfunction getLabels(ideo) {\r\n var annotKeys, labels, heatmaps, i;\r\n\r\n if (ideo.rawAnnots.metadata && ideo.rawAnnots.metadata.trackLabels) {\r\n labels = ideo.rawAnnots.metadata.trackLabels;\r\n } else if (ideo.config.heatmaps) {\r\n labels = [];\r\n heatmaps = ideo.config.heatmaps;\r\n for (i = 0; i < heatmaps.length; i++) {\r\n labels.push(heatmaps[i].key);\r\n }\r\n } else {\r\n annotKeys = ideo.rawAnnots.keys.slice(0);\r\n labels = annotKeys.filter(d => !reservedTrackKeys.includes(d));\r\n }\r\n\r\n if (ideo.displayedTrackIndexes) {\r\n labels = labels.filter(function(d, i) {\r\n return ideo.displayedTrackIndexes.includes(i + 1);\r\n });\r\n }\r\n\r\n return labels;\r\n}\r\n\r\n/**\r\n * Apply heatmap thresholds that are passed in as annotation metadata\r\n */\r\nfunction inflateThresholds(ideo) {\r\n var thresholds, colors,\r\n rawAnnots = ideo.rawAnnots;\r\n\r\n if (\r\n rawAnnots.metadata && !rawAnnots.metadata.heatmapThresholds &&\r\n !ideo.config.heatmapThresholds\r\n ) {\r\n return;\r\n }\r\n\r\n if (ideo.config.heatmapThresholds) {\r\n thresholds = ideo.config.heatmapThresholds;\r\n } else {\r\n thresholds = ideo.rawAnnots.metadata.heatmapThresholds;\r\n }\r\n\r\n colors = defaultHeatmapColors[thresholds.length + 1];\r\n thresholds = thresholds.map((d, i) => {\r\n return [d, '#' + colors[i]];\r\n });\r\n\r\n thresholds.push(['+', '#' + colors.slice(-1)[0]]);\r\n\r\n return thresholds;\r\n}\r\n\r\n/**\r\n * Set needed configuration options from raw annotation data.\r\n * Simplifies heatmap API by inferring reasonable defaults.\r\n */\r\nfunction inflateHeatmaps(ideo) {\r\n var i, labels, heatmaps, annotationTracks, rawAnnots, displayedTracks,\r\n thresholds = ideo.config.heatmapThresholds;\r\n\r\n heatmaps = [];\r\n rawAnnots = ideo.rawAnnots;\r\n labels = rawAnnots.keys.slice(3);\r\n\r\n annotationTracks = [];\r\n displayedTracks = [];\r\n if (rawAnnots.metadata || !isNaN(thresholds[0])) {\r\n thresholds = inflateThresholds(ideo);\r\n }\r\n\r\n for (i = 0; i < labels.length; i++) {\r\n heatmaps.push({key: labels[i], thresholds: thresholds});\r\n annotationTracks.push({id: labels[i]});\r\n displayedTracks.push(i + 1);\r\n }\r\n ideo.config.annotationsNumTracks = labels.length;\r\n ideo.config.annotationsDisplayedTracks = displayedTracks;\r\n ideo.config.heatmaps = heatmaps;\r\n ideo.config.annotationTracks = annotationTracks;\r\n}\r\n\r\n/**\r\n * Given annotation value (m), should it use the color in this threshold?\r\n */\r\nfunction shouldUseThresholdColor(m, numThresholds, value, prevThreshold,\r\n threshold) {\r\n\r\n return (\r\n // If this is the last threshold, and\r\n // its value is \"+\" and the value is above the previous threshold...\r\n m === numThresholds && (\r\n threshold === '+' && value > prevThreshold\r\n ) ||\r\n\r\n // ... or if the value matches the threshold...\r\n value === threshold ||\r\n\r\n // ... or if this isn't the first or last threshold, and\r\n // the value is between this threshold and the previous one...\r\n m !== 0 && m !== numThresholds && (\r\n value <= threshold &&\r\n value > prevThreshold\r\n ) ||\r\n\r\n // ... or if this is the first threshold and the value is\r\n // at or below the threshold\r\n m === 0 && value <= threshold\r\n );\r\n}\r\n\r\n/**\r\n * Determine the color of the heatmap annotation.\r\n */\r\nfunction getHeatmapAnnotColor(thresholds, value) {\r\n var m, numThresholds, thresholdList, threshold, tvNum, thresholdColor,\r\n prevThreshold, useThresholdColor, color;\r\n\r\n for (m = 0; m < thresholds.length; m++) {\r\n numThresholds = thresholds.length - 1;\r\n thresholdList = thresholds[m];\r\n threshold = thresholdList[0];\r\n\r\n // The threshold value is usually a number,\r\n // but can also be a \"+\" character indicating that\r\n // this threshold is anything greater than the previous threshold.\r\n tvNum = parseFloat(threshold);\r\n if (isNaN(tvNum) === false) threshold = tvNum;\r\n if (m !== 0) prevThreshold = parseFloat(thresholds[m - 1][0]);\r\n thresholdColor = thresholdList[1];\r\n\r\n useThresholdColor = shouldUseThresholdColor(m, numThresholds, value,\r\n prevThreshold, threshold);\r\n\r\n if (useThresholdColor) color = thresholdColor;\r\n }\r\n\r\n return color;\r\n}\r\n\r\nexport {\r\n getLabels, inflateHeatmaps, inflateThresholds, defaultHeatmapColors,\r\n getHeatmapAnnotColor\r\n};\r\n","/**\r\n * @fileoverview Functions for collinear heatmaps of genome annotations.\r\n * See heatmap.js for more.\r\n */\r\n\r\nimport {d3} from '../lib';\r\nimport {writeTrackLabels} from './track-labels-collinear';\r\nimport {inflateHeatmaps} from './heatmap-lib';\r\n\r\n/**\r\n * Add canvases that will contain annotations. One canvas per track.\r\n */\r\nfunction writeCanvases(chr, chrLeft, ideo) {\r\n var j, trackLeft, trackWidth, canvas, context, id,\r\n chrWidth = chr.width,\r\n contextArray = [],\r\n annotLabelHeight = ideo.config.annotLabelHeight,\r\n numAnnotTracks = ideo.config.numAnnotTracks;\r\n\r\n // Create a canvas for each annotation track on this chromosome\r\n for (j = 0; j < numAnnotTracks; j++) {\r\n trackWidth = ideo.config.annotationHeight + annotLabelHeight + 4;\r\n id = chr.id + '-canvas-' + j; // e.g. chr1-9606-canvas-0\r\n trackLeft = chrLeft;\r\n if (chr.chrIndex > 0) {\r\n trackLeft += (ideo.config.chrMargin * chr.chrIndex) - 1;\r\n }\r\n canvas = d3.select(ideo.config.container + ' #_ideogramInnerWrap')\r\n .append('canvas')\r\n .attr('id', id)\r\n .attr('width', chrWidth + 1)\r\n .attr('height', trackWidth)\r\n .style('position', 'absolute')\r\n .style('left', trackLeft + 'px')\r\n .style('top', (trackWidth * j + 1) + 'px');\r\n context = canvas.nodes()[0].getContext('2d');\r\n contextArray.push([context, chr]);\r\n }\r\n\r\n return contextArray;\r\n}\r\n\r\n/**\r\n * Render annotations on the canvas\r\n */\r\nfunction fillCanvasAnnots(annots, contextArray, ideo) {\r\n var j, annot, context, chr,\r\n annotLabelHeight = ideo.config.annotLabelHeight,\r\n annotHeight = ideo.config.annotationHeight,\r\n demarcateChrs = ideo.config.demarcateCollinearChromosomes;\r\n\r\n var trackWidth = annotHeight + annotLabelHeight + 4;\r\n\r\n // Fill in the canvas(es) with annotation colors to draw a heatmap\r\n for (j = 0; j < annots.length; j++) {\r\n annot = annots[j];\r\n context = contextArray[annot.trackIndex][0];\r\n chr = contextArray[annot.trackIndex][1];\r\n context.fillStyle = annot.color;\r\n if (demarcateChrs) {\r\n if (annot.startPx < 1 || annot.startPx > chr.width - 1) continue;\r\n context.fillRect(annot.startPx, 1, 0.5, trackWidth);\r\n } else {\r\n context.fillRect(annot.startPx, annotLabelHeight + 1, 0.5, annotHeight);\r\n }\r\n }\r\n\r\n if (demarcateChrs) {\r\n for (j = 0; j < contextArray.length; j++) {\r\n context = contextArray[j][0];\r\n chr = contextArray[j][1];\r\n context.fillStyle = '#555';\r\n if (chr.chrIndex === 0) context.fillRect(0, 0, 1, trackWidth);\r\n context.fillRect(chr.width - 1, 0, 1.1, trackWidth);\r\n context.fillRect(0, 0, chr.width + 1, 1);\r\n if (ideo.config.chrMargin) context.fillRect(0, 0, 1.1, trackWidth);\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Draw a 1D heatmap of annotations along each chromosome.\r\n * Ideal for representing very dense annotation sets in a granular manner\r\n * without subsampling.\r\n *\r\n * TODO:\r\n * - Support in 'vertical' orientation\r\n * - Support after rotating chromosome on click\r\n */\r\nfunction drawHeatmapsCollinear(annotContainers, ideo) {\r\n var annots, chrLeft, contextArray, i, chr,\r\n prevX = 0,\r\n xBump = (ideo.config.showChromosomesLabels) ? 2 : -0.1;\r\n\r\n d3.select(ideo.selector).classed('labeledLeft', false);\r\n d3.selectAll(ideo.config.container + ' canvas').remove();\r\n\r\n // Each \"annotationContainer\" represents annotations for a chromosome\r\n for (i = 0; i < annotContainers.length; i++) {\r\n annots = annotContainers[i].annots;\r\n chr = ideo.chromosomesArray[i];\r\n if (i === 0) {\r\n chrLeft = 12;\r\n } else {\r\n chrLeft = prevX + ideo.chromosomesArray[i - 1].width + 14;\r\n prevX += ideo.chromosomesArray[i - 1].width + xBump;\r\n }\r\n contextArray = writeCanvases(chr, chrLeft, ideo);\r\n fillCanvasAnnots(annots, contextArray, ideo);\r\n }\r\n\r\n writeTrackLabels(ideo);\r\n\r\n if (ideo.onDrawAnnotsCallback) ideo.onDrawAnnotsCallback();\r\n}\r\n\r\nexport {drawHeatmapsCollinear, inflateHeatmaps};\r\n","/**\r\n * @fileoverview Functions for 2D heatmaps of genome annotations.\r\n * 2D heatmaps enable showing many (100+) tracks of data in one dimension,\r\n * for features (e.g. genes) along a dimension of genomic coordinates in\r\n * chromosome context.\r\n *\r\n * TO DO:\r\n * - Horizontal orientation\r\n * - Multiple chromosomes\r\n * - Non-human organisms\r\n */\r\n\r\nimport {d3} from '../lib';\r\nimport {getHeatmapAnnotColor} from './heatmap-lib';\r\n\r\n/**\r\n * Add one canvas that will contain all annotations. One canvas per chromosome.\r\n */\r\nfunction writeCanvas(chr, ideoHeight, width, ideo) {\r\n var left, canvas, context, id;\r\n\r\n id = chr.id + '-canvas'; // e.g. chr1-9606-canvas\r\n left = (ideo.config.chrWidth * 2) + ideo.config.annotationHeight - 0.5;\r\n canvas = d3.select(ideo.config.container + ' #_ideogramInnerWrap')\r\n .append('canvas')\r\n .attr('id', id)\r\n .attr('width', width)\r\n .attr('height', ideoHeight)\r\n .style('position', 'absolute')\r\n .style('left', left + 'px')\r\n .style('top', '0px');\r\n context = canvas.nodes()[0].getContext('2d');\r\n\r\n return context;\r\n}\r\n\r\n/**\r\n * Render annotations on the canvas.\r\n *\r\n * These annotations are 2D; each annotation has many values, each on a track.\r\n */\r\nfunction fillCanvasAnnotValues(annot, context, ideo) {\r\n var i, x, values,\r\n annotHeight = ideo.config.annotationHeight,\r\n ideoMarginTop = ideo._layout.margin.top;\r\n\r\n values = annot.values;\r\n\r\n // Fill canvas with annotation colors to draw the heatmap\r\n for (i = 0; i < values.length; i++) {\r\n context.fillStyle = values[i];\r\n x = (i - 1) * annotHeight;\r\n context.fillRect(x, annot.startPx + ideoMarginTop, annotHeight, 2);\r\n }\r\n}\r\n\r\n/**\r\n * Draw a 2D heatmap of annotations along one chromosome.\r\n *\r\n * TODO:\r\n * - Support in 'horizontal' orientation\r\n * - Support after rotating chromosome on click\r\n */\r\nfunction drawHeatmaps2d(annotContainers, ideo) {\r\n var annot, context, i, chr,\r\n container = ideo.config.container,\r\n ideoMarginTop = ideo._layout.margin.top,\r\n ideoHeight = ideo.config.chrHeight + ideoMarginTop,\r\n width = ideo.config.annotationHeight * annotContainers[0].values.length;\r\n\r\n d3.selectAll(container + ' canvas').remove();\r\n\r\n d3.select(container + ' #_ideogramInnerWrap')\r\n .style('max-width', width + 'px');\r\n d3.select(container + ' #_ideogram').attr('width', width);\r\n\r\n chr = ideo.chromosomesArray[0];\r\n\r\n context = writeCanvas(chr, ideoHeight, width, ideo);\r\n\r\n // Each \"annotationContainer\" represents annotations for a chromosome\r\n for (i = 0; i < annotContainers.length; i++) {\r\n annot = annotContainers[i];\r\n fillCanvasAnnotValues(annot, context, ideo);\r\n }\r\n\r\n if (ideo.onDrawAnnotsCallback) {\r\n ideo.onDrawAnnotsCallback();\r\n }\r\n}\r\n\r\nfunction add2dAnnotsForChr(annots, omittedAnnots, annotsByChr, chrModel,\r\n m, keys, ideo) {\r\n var j, k, annot, ra, stop, stopPx, color,\r\n thresholds = ideo.config.heatmapThresholds;\r\n\r\n for (j = 0; j < annotsByChr.annots.length; j++) {\r\n ra = annotsByChr.annots[j];\r\n annot = {};\r\n\r\n annot.values = []; // one value per track\r\n\r\n for (k = 0; k < 3; k++) {\r\n annot[keys[k]] = ra[k];\r\n }\r\n\r\n for (k = 3; k < keys.length; k++) {\r\n color = getHeatmapAnnotColor(thresholds, ra[k]);\r\n annot.values.push(color);\r\n }\r\n\r\n stop = annot.start + annot.length;\r\n\r\n annot.chr = annotsByChr.chr;\r\n annot.chrIndex = m;\r\n annot.startPx = ideo.convertBpToPx(chrModel, annot.start);\r\n stopPx = ideo.convertBpToPx(chrModel, stop);\r\n annot.px = Math.round((annot.startPx + stopPx) / 2);\r\n\r\n annots.push(annot);\r\n }\r\n\r\n annots.shift();\r\n\r\n return [annots, omittedAnnots];\r\n}\r\n\r\nexport {drawHeatmaps2d, add2dAnnotsForChr};\r\n","/**\r\n * @fileoverview Functions for labeling tracks of genome annotations.\r\n * Tracks are columns of annotations that run beside a chromosome.\r\n * Labeling tracks with descriptive names makes them easier to understand.\r\n */\r\n\r\nimport {d3} from '../lib';\r\nimport {getLabels} from './heatmap-lib';\r\n\r\n/**\r\n * Start a timer that, upon expiring, hides the track label.\r\n *\r\n * To enable users to copy label content to their clipboard, a timer is\r\n * used to control when the label disappears. It starts when the user's\r\n * cursor leaves the track or the label. If the user moves the cursor\r\n * back over the annot or label after the timer starts and before it expires,\r\n * then the timer is cleared.\r\n */\r\nfunction startHideTrackLabelTimeout(ideo) {\r\n if (ideo.config.showTrackLabel === false) return;\r\n\r\n ideo.hideTrackLabelTimeout = window.setTimeout(function() {\r\n d3.select(ideo.config.container + ' #_ideogramTrackLabel').transition()\r\n .duration(500)\r\n .style('opacity', 0);\r\n }, 250);\r\n}\r\n\r\n/**\r\n * Write label div setup with default styling.\r\n */\r\nfunction writeTrackLabelContainer(ideo) {\r\n d3.select(ideo.config.container + ' #_ideogramTrackLabelContainer')\r\n .append('div')\r\n .attr('id', '_ideogramTrackLabel')\r\n .style('opacity', 0)\r\n .style('position', 'absolute')\r\n .style('text-align', 'center')\r\n .style('padding', '1px')\r\n .style('font', '11px sans-serif')\r\n .style('background', 'white')\r\n .style('line-height', '10px')\r\n .style('z-index', '9000');\r\n}\r\n\r\n/**\r\n * Display track labels on the page\r\n */\r\nfunction renderTrackLabels(top, left, ideo) {\r\n d3.select(ideo.config.container + ' #_ideogramTrackLabel')\r\n .style('opacity', 1) // Make label visible\r\n .style('left', left + 'px')\r\n .style('top', top + 'px')\r\n .style('width', 'max-content')\r\n .style('transform-origin', 'bottom left')\r\n .style('text-align', 'left')\r\n .on('mouseover', function() {\r\n clearTimeout(ideo.hideTrackLabelTimeout);\r\n })\r\n .on('mouseout', function() {\r\n startHideTrackLabelTimeout(ideo);\r\n });\r\n}\r\n\r\n/**\r\n * Get left and top (x and y) offset for track label text\r\n */\r\nfunction getTrackLabelOffsets(labels, trackCanvas, ideo) {\r\n var firstTrackId, firstTrack, trackBox, labelBox, ideoBox, left, top,\r\n marginHack = 7; // TODO: Make this dynamic\r\n\r\n firstTrackId = trackCanvas.id.split('-').slice(0, -1).join('-') + '-0';\r\n firstTrack = d3.select(ideo.config.container + ' #' + firstTrackId)\r\n .nodes()[0];\r\n trackBox = firstTrack.getBoundingClientRect();\r\n\r\n labelBox = d3.select(ideo.config.container + ' #_ideogramTrackLabel')\r\n .nodes()[0].getBoundingClientRect();\r\n ideoBox = d3.select(ideo.config.container).nodes()[0]\r\n .getBoundingClientRect();\r\n\r\n left = Math.round(trackBox.left + labelBox.width) - trackBox.width - 1;\r\n left -= ideoBox.left - marginHack;\r\n top = -(labels.split('
    ').length - 2) * trackBox.width + 2;\r\n\r\n return [left, top];\r\n}\r\n\r\n/**\r\n * Show the label for this track\r\n */\r\nfunction showTrackLabel(trackCanvas, ideo) {\r\n var labels, left, top;\r\n\r\n clearTimeout(ideo.hideTrackLabelTimeout);\r\n\r\n labels = getLabels(ideo);\r\n labels = labels.join('
    ');\r\n\r\n // Clear any previous positioning, write track label text to DOM\r\n d3.select(ideo.config.container + ' #_ideogramTrackLabel')\r\n .interrupt() // Stop any in-progress disapperance\r\n .style('top', '')\r\n .style('left', '')\r\n .style('transform', null)\r\n .style('transform', 'rotate(-90deg)')\r\n .html(labels);\r\n\r\n [left, top] = getTrackLabelOffsets(labels, trackCanvas, ideo);\r\n\r\n renderTrackLabels(top, left, ideo);\r\n}\r\n\r\nexport {\r\n startHideTrackLabelTimeout, writeTrackLabelContainer, showTrackLabel\r\n};\r\n","/**\r\n * @fileoverview Functions for 2D heatmaps of genome annotations.\r\n * Heatmaps provide an easy way to visualize very dense annotation data.\r\n * Unlike the rest of Ideogram's graphics, which use SVG, heatmaps are\r\n * rendered using the Canvas element.\r\n */\r\n\r\nimport {d3} from '../lib';\r\nimport {drawHeatmapsCollinear} from './heatmap-collinear';\r\nimport {drawHeatmaps2d} from './heatmap-2d';\r\nimport {getHeatmapAnnotColor} from './heatmap-lib';\r\n\r\nimport {\r\n startHideTrackLabelTimeout, writeTrackLabelContainer, showTrackLabel\r\n} from './track-labels';\r\n\r\n/**\r\n * Add canvases that will contain annotations. One canvas per track.\r\n */\r\nfunction writeCanvases(chr, chrLeft, ideoHeight, ideo) {\r\n var j, trackLeft, trackWidth, canvas, context, id,\r\n contextArray = [],\r\n numAnnotTracks = ideo.config.numAnnotTracks;\r\n\r\n var marginHack = 7; // TODO: Make this dynamic\r\n\r\n // Create a canvas for each annotation track on this chromosome\r\n for (j = 0; j < numAnnotTracks; j++) {\r\n trackWidth = ideo.config.annotationHeight;\r\n id = chr.id + '-canvas-' + j; // e.g. chr1-9606-canvas-0\r\n trackLeft = chrLeft - trackWidth * (numAnnotTracks - j) - marginHack;\r\n canvas = d3.select(ideo.config.container + ' #_ideogramInnerWrap')\r\n .append('canvas')\r\n .attr('id', id)\r\n .attr('width', trackWidth)\r\n .attr('height', ideoHeight)\r\n .style('position', 'absolute')\r\n .style('left', trackLeft + 'px');\r\n context = canvas.nodes()[0].getContext('2d');\r\n contextArray.push(context);\r\n }\r\n\r\n return contextArray;\r\n}\r\n\r\n/**\r\n * Render annotations on the canvas\r\n */\r\nfunction fillCanvasAnnots(annots, contextArray, chrWidth, ideoMarginTop) {\r\n var j, annot, context, x;\r\n\r\n // Fill in the canvas(es) with annotation colors to draw a heatmap\r\n for (j = 0; j < annots.length; j++) {\r\n annot = annots[j];\r\n context = contextArray[annot.trackIndex];\r\n context.fillStyle = annot.color;\r\n x = annot.trackIndex - 1;\r\n context.fillRect(x, annot.startPx + ideoMarginTop, chrWidth, 0.5);\r\n }\r\n}\r\n\r\n/**\r\n * Draw a 1D heatmap of annotations along each chromosome.\r\n * Ideal for representing very dense annotation sets in a granular manner\r\n * without subsampling.\r\n *\r\n * TODO:\r\n * - Support in 'horizontal' orientation\r\n * - Support after rotating chromosome on click\r\n */\r\nfunction drawHeatmaps(annotContainers) {\r\n var annots, chrLeft, contextArray, chrWidth, i, chr,\r\n ideo = this,\r\n config = ideo.config,\r\n ideoMarginTop = ideo._layout.margin.top,\r\n ideoHeight = config.chrHeight + ideoMarginTop;\r\n\r\n if (config.geometry === 'collinear') {\r\n return drawHeatmapsCollinear(annotContainers, ideo);\r\n } else if (config.annotationsLayout === 'heatmap-2d') {\r\n return drawHeatmaps2d(annotContainers, ideo);\r\n }\r\n\r\n d3.selectAll(ideo.config.container + ' canvas').remove();\r\n\r\n writeTrackLabelContainer(ideo);\r\n\r\n // Each \"annotationContainer\" represents annotations for a chromosome\r\n for (i = 0; i < annotContainers.length; i++) {\r\n\r\n annots = annotContainers[i].annots;\r\n chr = ideo.chromosomesArray[i];\r\n chrWidth = ideo.config.chrWidth;\r\n chrLeft = ideo._layout.getChromosomeSetYTranslate(i);\r\n\r\n contextArray = writeCanvases(chr, chrLeft, ideoHeight, ideo);\r\n fillCanvasAnnots(annots, contextArray, chrWidth, ideoMarginTop);\r\n }\r\n\r\n d3.selectAll(ideo.config.container + ' canvas')\r\n .on('mouseover', function() {showTrackLabel(this, ideo);})\r\n .on('mouseout', function() {startHideTrackLabelTimeout(ideo);});\r\n\r\n if (ideo.onDrawAnnotsCallback) {\r\n ideo.onDrawAnnotsCallback();\r\n }\r\n}\r\n\r\n/**\r\n * Set color and track index for raw annotation objects.\r\n */\r\nfunction getNewRawAnnots(heatmapKeyIndexes, rawAnnots, ideo) {\r\n var j, k, ra, newRa, value, thresholds, color, trackIndex,\r\n newRas = [];\r\n\r\n for (j = 0; j < rawAnnots.length; j++) {\r\n ra = rawAnnots[j];\r\n for (k = 0; k < heatmapKeyIndexes.length; k++) {\r\n newRa = ra.slice(0, 3); // name, start, length\r\n\r\n value = ra[heatmapKeyIndexes[k]];\r\n thresholds = ideo.config.heatmaps[k].thresholds;\r\n color = getHeatmapAnnotColor(thresholds, value);\r\n\r\n trackIndex = k;\r\n newRa.push(trackIndex, color, value);\r\n newRas.push(newRa);\r\n }\r\n }\r\n\r\n return newRas;\r\n}\r\n\r\nfunction getNewRawAnnotContainers(heatmapKeyIndexes, rawAnnotBoxes, ideo) {\r\n var raContainer, chr, rawAnnots, newRas, i,\r\n newRaContainers = [];\r\n\r\n for (i = 0; i < rawAnnotBoxes.length; i++) {\r\n raContainer = rawAnnotBoxes[i];\r\n chr = raContainer.chr;\r\n\r\n rawAnnots = raContainer.annots;\r\n newRas = getNewRawAnnots(heatmapKeyIndexes, rawAnnots, ideo);\r\n\r\n newRaContainers.push({chr: chr, annots: newRas});\r\n }\r\n return newRaContainers;\r\n}\r\n\r\nfunction reportPerformance(t0, ideo) {\r\n var t1 = new Date().getTime();\r\n if (ideo.config.debug) {\r\n console.log('Time in deserializeAnnotsForHeatmap: ' + (t1 - t0) + ' ms');\r\n }\r\n}\r\n\r\n/**\r\n * Deserialize compressed annotation data into a format suited for heatmaps.\r\n *\r\n * This enables the annotations to be downloaded from a server without the\r\n * requested annotations JSON needing to explicitly specify track index or\r\n * color. The track index and color are inferred from the \"heatmaps\" Ideogram\r\n * configuration option defined before ideogram initialization.\r\n *\r\n * This saves time for the user.\r\n *\r\n * @param rawAnnotsContainer {Object} Raw annotations as passed from server\r\n */\r\nfunction deserializeAnnotsForHeatmap(rawAnnotsContainer) {\r\n var newRaContainers, heatmapKey, heatmapKeyIndexes, i,\r\n t0 = new Date().getTime(),\r\n keys = rawAnnotsContainer.keys,\r\n rawAnnotBoxes = rawAnnotsContainer.annots,\r\n ideo = this;\r\n\r\n heatmapKeyIndexes = [];\r\n for (i = 0; i < ideo.config.heatmaps.length; i++) {\r\n heatmapKey = ideo.config.heatmaps[i].key;\r\n heatmapKeyIndexes.push(keys.indexOf(heatmapKey));\r\n }\r\n\r\n newRaContainers =\r\n getNewRawAnnotContainers(heatmapKeyIndexes, rawAnnotBoxes, ideo);\r\n\r\n keys.splice(3, 0, 'trackIndex');\r\n keys.splice(4, 0, 'color');\r\n\r\n ideo.rawAnnots.keys = keys;\r\n ideo.rawAnnots.annots = newRaContainers;\r\n\r\n reportPerformance(t0, ideo);\r\n}\r\n\r\nexport {drawHeatmaps, deserializeAnnotsForHeatmap};\r\n","/**\r\n * @fileoverview Functions for labeling collinear tracks of genome annotations.\r\n * See track-labels.js for more.\r\n */\r\n\r\nimport {d3} from '../lib';\r\nimport {getLabels} from './heatmap-lib';\r\n\r\nfunction renderTrackLabels(labels, ideo) {\r\n var i, x, y, labelContainer, markBump,\r\n annotLabelHeight = ideo.config.annotLabelHeight,\r\n demarcateChrs = ideo.config.demarcateCollinearChromosomes;\r\n\r\n x = 11; // Close to chrLeft in heatmap-collinear.js. For tabs.\r\n markBump = (demarcateChrs ? 2 : 0); // Make labels flush with demarcations\r\n\r\n labelContainer =\r\n d3.select(ideo.config.container + ' #_ideogramTrackLabelContainer');\r\n labelContainer.html('');\r\n\r\n y = ideo.config.annotationHeight + annotLabelHeight + 4;\r\n\r\n for (i = 0; i < labels.length; i++) {\r\n labelContainer\r\n .style('position', 'absolute')\r\n .append('div')\r\n .attr('class', '_ideogramTrackLabel')\r\n .style('opacity', 1)\r\n .style('position', 'absolute')\r\n .style('text-align', 'center')\r\n .style('padding', '1px')\r\n .style('font', '11px sans-serif')\r\n .style('background', 'white')\r\n .style('line-height', '10px')\r\n .style('z-index', '5')\r\n .style('left', (x + markBump) + 'px')\r\n .style('top', (y * i + markBump) + 'px')\r\n .style('width', 'max-content')\r\n .style('transform-origin', 'bottom left')\r\n .style('text-align', 'left')\r\n .html(labels[i]);\r\n }\r\n\r\n}\r\n\r\n/**\r\n * Show the label for this track\r\n */\r\nfunction writeTrackLabels(ideo) {\r\n var labels = getLabels(ideo);\r\n renderTrackLabels(labels, ideo);\r\n}\r\n\r\nexport {writeTrackLabels};\r\n","import {d3} from '../lib';\r\n// import {getShapes} from './draw';\r\n\r\n/**\r\n * Optional callback, invoked when annotations are drawn\r\n */\r\nfunction onLoadAnnots() {\r\n call(this.onLoadAnnotsCallback);\r\n}\r\n\r\n/**\r\n * Optional callback, invoked when annotations are drawn\r\n */\r\nfunction onDrawAnnots() {\r\n call(this.onDrawAnnotsCallback);\r\n}\r\n\r\nfunction hideAnnotTooltip() {\r\n d3.select('._ideogramTooltip').transition()\r\n .duration(500) // fade out for half second\r\n .style('opacity', 0)\r\n .style('pointer-events', 'none');\r\n}\r\n\r\n/**\r\n * Starts a timer that, upon expiring, hides the annotation tooltip.\r\n *\r\n * To enable users to copy tooltip content to their clipboard, a timer is\r\n * used to control when the tooltip disappears. It starts when the user's\r\n * cursor leaves the annotation or the tooltip. If the user moves the cursor\r\n * back over the annot or tooltip after the timer starts and before it expires,\r\n * then the timer is cleared.\r\n */\r\nfunction startHideAnnotTooltipTimeout() {\r\n const ideo = this;\r\n\r\n if (ideo.config.showAnnotTooltip === false) {\r\n return;\r\n }\r\n\r\n ideo.hideAnnotTooltipTimeout = window.setTimeout(function() {\r\n hideAnnotTooltip();\r\n }, 250);\r\n\r\n ideo.isTooltipCooling = true;\r\n ideo.hideAnnotTooltipCounter = window.setTimeout(function() {\r\n ideo.isTooltipCooling = false;\r\n }, 500);\r\n}\r\n\r\nfunction renderTooltip(tooltip, content, matrix, yOffset, ideo) {\r\n tooltip.html(content)\r\n .style('opacity', 1) // Make tooltip visible\r\n .style('left', matrix.e + 'px')\r\n .style('top', (matrix.f - yOffset) + 'px')\r\n .style('font-family', ideo.config.fontFamily)\r\n .style('pointer-events', null) // Prevent bug in clicking chromosome\r\n .on('mouseover', function() {\r\n clearTimeout(ideo.hideAnnotTooltipTimeout);\r\n })\r\n .on('mouseout', function() {\r\n ideo.startHideAnnotTooltipTimeout();\r\n });\r\n}\r\n\r\nfunction getContentAndYOffset(annot) {\r\n var content, yOffset, range, displayName;\r\n\r\n range = 'chr' + annot.chr + ':' + annot.start.toLocaleString();\r\n if (annot.displayCoordinates) {\r\n range = annot.displayCoordinates;\r\n } else if (annot.length > 0) {\r\n // Only show range if stop differs from start\r\n range += '-' + annot.stop.toLocaleString();\r\n }\r\n content = range;\r\n yOffset = 24;\r\n\r\n if (annot.name) {\r\n displayName = annot.displayName ? annot.displayName : annot.name;\r\n content = displayName + '
    ' + content;\r\n yOffset += 8;\r\n }\r\n\r\n return [content, yOffset];\r\n}\r\n\r\n/**\r\n * Optional callback, invoked before showing annotation tooltip\r\n */\r\nfunction onWillShowAnnotTooltip(annot) {\r\n call(this.onWillShowAnnotTooltipCallback, annot);\r\n}\r\n\r\n/**\r\n * Optional callback, invoked on clicking annotation\r\n */\r\nfunction onClickAnnot(annot) {\r\n this.prevClickedAnnot = annot;\r\n this.onClickAnnotCallback(annot);\r\n}\r\n\r\n// /** Get list of annotation objects by names, e.g. [\"BRCA1\", \"APOE\"] */\r\n// function getAnnotsByName(annotNames, ideo) {\r\n// return annotNames.map(name => getAnnotByName(name, ideo));\r\n// }\r\n\r\n// /** Briefly show a circle around specified annotations */\r\n// function pulseAnnots(annotNames, ideo, duration=2000) {\r\n// const annots = getAnnotsByName(annotNames, ideo);\r\n// const circle = getShapes(ideo.config.annotationHeight + 2).circle;\r\n// const ids = annots.map(annot => annot.domId);\r\n\r\n// d3.selectAll(ids).each(function() {\r\n// d3.select('#' + this)\r\n// .insert('path', ':first-child')\r\n// .attr('class', '_ideogramAnnotPulse')\r\n// .attr('d', circle)\r\n// .attr('fill-opacity', 0.5)\r\n// .attr('fill', 'yellow')\r\n// .attr('stroke', 'orange');\r\n// });\r\n\r\n// const annotPulses = d3.selectAll('._ideogramAnnotPulse');\r\n// annotPulses.transition()\r\n// .duration(duration) // fade out for `duration` milliseconds\r\n// .style('opacity', 0)\r\n// .style('pointer-events', 'none')\r\n// .on('end', function(d, i) {\r\n// if (i === annotPulses.size() - 1) {\r\n// annotPulses.remove();\r\n// }\r\n// });\r\n// }\r\n\r\n/**\r\n * Shows a tooltip for the given annotation.\r\n *\r\n * See notes in startHideAnnotTooltipTimeout about show/hide logic.\r\n *\r\n * @param annot {Object} Processed annotation object\r\n * @param context {Object} \"This\" of the caller -- an SVG path DOM object\r\n */\r\nfunction showAnnotTooltip(annot, context) {\r\n var matrix, content, yOffset, tooltip,\r\n cx = Number(context.getAttribute('cx')),\r\n cy = Number(context.getAttribute('cy')),\r\n ideo = this;\r\n\r\n if (ideo.config.showAnnotTooltip === false) return;\r\n\r\n clearTimeout(ideo.hideAnnotTooltipTimeout);\r\n\r\n if (ideo.onWillShowAnnotTooltipCallback) {\r\n annot = ideo.onWillShowAnnotTooltipCallback(annot);\r\n }\r\n\r\n // Enable onWillShowAnnotTooltipCallback to cancel showing tooltip\r\n if (annot === null) {\r\n hideAnnotTooltip();\r\n return;\r\n }\r\n\r\n ideo.prevTooltipAnnotName = annot.name;\r\n\r\n tooltip = d3.select('._ideogramTooltip');\r\n tooltip.interrupt(); // Stop any in-progress disapperance\r\n\r\n matrix = context.getScreenCTM().translate(cx, cy);\r\n\r\n [content, yOffset] = getContentAndYOffset(annot);\r\n\r\n renderTooltip(tooltip, content, matrix, yOffset, ideo);\r\n}\r\n\r\nexport {\r\n onLoadAnnots, onDrawAnnots, startHideAnnotTooltipTimeout,\r\n onWillShowAnnotTooltip, showAnnotTooltip, onClickAnnot\r\n};\r\n","import {d3, getFont, getTextSize, deepCopy} from '../lib';\r\n\r\nimport {sortAnnotsByRank} from './annotations';\r\n\r\nconst allLabelStyle = `\r\n \r\n `;\r\n\r\n/** Return DOM ID of annotation object */\r\nfunction getAnnotDomLabelId(annot) {\r\n return 'ideogramLabel_' + annot.domId;\r\n}\r\n\r\nfunction changeAnnotState(state, labelId, annotId) {\r\n d3.selectAll('._ideoActive').classed('_ideoActive', false);\r\n d3.select('#' + labelId).attr('class', '_ideogramLabel ' + state);\r\n d3.select('#' + annotId + ' > path').attr('class', state);\r\n}\r\n\r\nfunction triggerAnnotEvent(event, ideo) {\r\n let labelId, annotId;\r\n const target = event.target;\r\n const type = event.type;\r\n\r\n const targetClasses = Array.from(target.classList);\r\n if (targetClasses.includes('_ideogramLabel')) {\r\n labelId = target.id;\r\n annotId = target.id.split('ideogramLabel_')[1];\r\n d3.select('#' + annotId + ' path').dispatch(type);\r\n } else {\r\n const annotElement = target.parentElement;\r\n labelId = 'ideogramLabel_' + annotElement.id;\r\n annotId = annotElement.id;\r\n }\r\n\r\n if (type === 'mouseout') {\r\n ideo.time.prevTooltipOff = performance.now();\r\n ideo.time.prevTooltipAnnotDomId = annotId;\r\n }\r\n\r\n // On mouseover, activate immediately\r\n // Otherwise, wait a moment (250 ms), then deactivate.\r\n // Delayed deactivation mitigates flicker when moving from\r\n // annot label to annot triangle.\r\n if (type === 'mouseover') {\r\n clearTimeout(window._ideoActiveTimeout);\r\n changeAnnotState('_ideoActive', labelId, annotId);\r\n } else {\r\n window._ideoActiveTimeout = window.setTimeout(function() {\r\n changeAnnotState('', labelId, annotId);\r\n }, 250);\r\n }\r\n}\r\n\r\nfunction renderLabel(annot, style, ideo) {\r\n\r\n if (!ideo.didSetLabelStyle) {\r\n document.querySelector('#_ideogramInnerWrap')\r\n .insertAdjacentHTML('afterbegin', allLabelStyle);\r\n ideo.didSetLabelStyle = true;\r\n }\r\n\r\n const id = getAnnotDomLabelId(annot);\r\n\r\n const font = getFont(ideo);\r\n\r\n const fill = annot.color === 'pink' ? '#CF406B' : annot.color;\r\n\r\n d3.select('#_ideogram').append('text')\r\n .attr('id', id)\r\n .attr('class', '_ideogramLabel')\r\n .attr('x', style.left)\r\n .attr('y', style.top)\r\n .style('font', font)\r\n .style('fill', fill)\r\n .style('pointer-events', null) // Prevent bug in clicking chromosome\r\n .html(annot.name);\r\n}\r\n\r\n/** Get annotation object by name, e.g. \"BRCA1\" */\r\nfunction getAnnotByName(annotName, ideo) {\r\n var annot;\r\n var found = false;\r\n ideo.annots.forEach((annotsByChr) => {\r\n if (found) return;\r\n annotsByChr.annots.forEach((thisAnnot) => {\r\n if (found) return;\r\n if (thisAnnot.name === annotName) {\r\n annot = thisAnnot;\r\n found = true;\r\n }\r\n });\r\n });\r\n\r\n return annot;\r\n}\r\n\r\n/** Get label's top and left offsets relative to chromosome, and width */\r\nfunction getAnnotLabelLayout(annot, ideo) {\r\n var annotDom, annotRect, ideoRect, width, height, top, bottom, left, right,\r\n config = ideo.config;\r\n\r\n annotDom = document.querySelector('#' + annot.domId);\r\n\r\n // Handles cases when annotation is not yet in DOM\r\n if (annotDom === null) return null;\r\n\r\n annotRect = annotDom.getBoundingClientRect();\r\n\r\n ideoRect =\r\n document.querySelector('#_ideogram').getBoundingClientRect();\r\n\r\n const textSize = getTextSize(annot.name, ideo);\r\n width = textSize.width;\r\n\r\n // `pad` is a heuristic that accounts for:\r\n // 1px left pad, 1px right pad, 1px right border, 1px left border\r\n // as set in renderLabel\r\n const pad = (config.fontFamily) ? 9 : 7;\r\n width += pad;\r\n\r\n const labelSize = config.annotLabelSize ? config.annotLabelSize : 13;\r\n\r\n // Accounts for 1px top border, 1px bottom border as set in renderLabel\r\n height = labelSize;\r\n\r\n top = annotRect.top - ideoRect.top + height - 1;\r\n bottom = top + height;\r\n left = annotRect.left - ideoRect.left - width;\r\n right = left + width;\r\n name = annot.name;\r\n\r\n return {top, bottom, right, left, width, height, name};\r\n}\r\n\r\n/**\r\n * Label an annotation.\r\n *\r\n * @param annotName {String} Name of annotation, e.g. \"BRCA1\"\r\n * @param backgroundColor {String} Background color. Default: white.\r\n * @param backgroundColor {String} Border color. Default: black.\r\n */\r\nfunction addAnnotLabel(annotName, backgroundColor, borderColor) {\r\n var annot,\r\n ideo = this;\r\n\r\n annot = getAnnotByName(annotName, ideo);\r\n\r\n const layout = getAnnotLabelLayout(annot, ideo);\r\n if (layout === null) return;\r\n\r\n const style = Object.assign(layout, {backgroundColor, borderColor});\r\n\r\n renderLabel(annot, style, ideo);\r\n}\r\n\r\nfunction getIsXOverlap(o, n, p) {\r\n const oLeft = o.left - p;\r\n const nLeft = n.left - p;\r\n const oRight = o.right + p;\r\n const nRight = n.right + p;\r\n // A) oLeft < nLeft && oLeft < nRight && oRight < nRight && oRight > nLeft\r\n // o o\r\n // o o\r\n // o o\r\n //\r\n // n n\r\n // n n\r\n // n n\r\n //\r\n // B) oLeft > nLeft && oLeft < nRight && oRight > nRight && oRight > nLeft\r\n // o o\r\n // o o\r\n // o o\r\n //\r\n // n n\r\n // n n\r\n // n n\r\n //\r\n // C) oLeft < nLeft && oLeft < nRight && oRight > nRight && oRight > nLeft\r\n // o o\r\n // o o\r\n // o o\r\n //\r\n // n n\r\n // n n\r\n //\r\n // D) oLeft > nLeft && oLeft < nRight && oRight > nLeft && oRight < nRight\r\n // o o\r\n // o o\r\n // o o\r\n //\r\n // n n\r\n // n n\r\n // n n\r\n return (\r\n (oLeft <= nLeft && oLeft <= nRight && oRight <= nRight && oRight >= nLeft) ||\r\n (oLeft >= nLeft && oLeft <= nRight && oRight >= nRight && oRight >= nLeft) ||\r\n (oLeft <= nLeft && oLeft <= nRight && oRight >= nRight && oRight >= nLeft) ||\r\n (oLeft >= nLeft && oLeft <= nRight && oRight >= nLeft && oRight <= nRight)\r\n )\r\n}\r\n\r\nfunction getIsYOverlap(o, n, p) {\r\n const oTop = o.top - p;\r\n const nTop = n.top - p;\r\n const oBottom = o.bottom + p;\r\n const nBottom = n.bottom + p;\r\n // Top of old annot (o) is above bottom of new annot (n),\r\n // and bottom of old annot is below top of new annot\r\n //\r\n // A) yOverlap = true\r\n // o.top < n.top && o.top < n.bottom && o.bottom < n.bottom && o.bottom > n.top\r\n // ooooo\r\n // nnnnn\r\n //\r\n // ooooo\r\n // nnnnn\r\n //\r\n // A.2)\r\n //\r\n // ppppp\r\n // ppppp\r\n // ooooo\r\n //\r\n // ppppp\r\n // ooooo ppppp\r\n // ppppp nnnnn\r\n // ppppp\r\n //\r\n // nnnnn\r\n // ppppp\r\n // ppppp\r\n //\r\n // B) yOverlap = true\r\n // o.top > n.top && o.top < n.bottom && o.bottom > n.bottom && o.bottom > n.top\r\n // nnnnn\r\n // ooooo\r\n //\r\n // nnnnn\r\n // ooooo\r\n //\r\n // B.2)\r\n //\r\n // ppppp\r\n // ppppp ppppp\r\n // ppppp nnnnn\r\n // ooooo\r\n //\r\n // nnnnn\r\n // ooooo ppppp\r\n // ppppp ppppp\r\n // ppppp\r\n //\r\n //\r\n // C) yOverlap = false\r\n // old.top < new.top && old.bottom < new.top\r\n // ooooo\r\n //\r\n //\r\n // ooooo\r\n //\r\n // nnnnn\r\n //\r\n //\r\n // nnnnn\r\n //\r\n // D) yOverlap = false\r\n // nnnnn\r\n //\r\n //\r\n // nnnnn\r\n //\r\n // ooooo\r\n //\r\n //\r\n // ooooo\r\n // sl.top - p < layout.bottom && sl.bottom > layout.top - p ||\r\n // layout.top - p < sl.bottom && layout.bottom > sl.bottom\r\n\r\n // XY overlap\r\n // A)\r\n //\r\n // ooooooo\r\n // o o\r\n // o nonnnnn\r\n // ooooooo n\r\n // n n\r\n // nnnnnnn\r\n //\r\n //\r\n // B)\r\n // ooooooo\r\n // o o\r\n // nnnnnnn o\r\n // n onooooo\r\n // n n\r\n // nnnnnnn\r\n //\r\n // C)\r\n //\r\n // ooooooo nnnnnnn\r\n // o o n n\r\n // o o n n\r\n // ooooooo nnnnnnn\r\n //\r\n // D)\r\n //\r\n // ooooooo\r\n // o o\r\n // o o\r\n // ooooooo\r\n //\r\n // nnnnnnn\r\n // n n\r\n // n n\r\n // nnnnnnn\r\n return (\r\n // false\r\n (oTop <= nTop && oTop <= nBottom && oBottom <= nBottom && oBottom >= nTop) ||\r\n (oTop >= nTop && oTop <= nBottom && oBottom >= nBottom && oBottom >= nTop)\r\n );\r\n\r\n // (sl.top - p < layout.bottom || sl.bottom > layout.top - p) &&\r\n // (layout.top - p < sl.bottom || layout.bottom > sl.bottom)\r\n}\r\n\r\n/** Label as many annotations as possible, without overlap */\r\nfunction fillAnnotLabels(sortedAnnots=[]) {\r\n const ideo = this;\r\n\r\n sortedAnnots = deepCopy(sortedAnnots); // copy by value\r\n\r\n // Remove any pre-existing annotation labels, to avoid duplicates\r\n ideo.clearAnnotLabels();\r\n\r\n let spacedAnnots = [];\r\n const spacedLayouts = [];\r\n\r\n // sortedAnnots = applyRankCutoff(sortedAnnots, 100, ideo);\r\n\r\n // sortedAnnots = sortedAnnots.sort(ideo.annotSortFunction);\r\n\r\n if (sortedAnnots.length === 0) {\r\n sortedAnnots = ideo.flattenAnnots();\r\n }\r\n\r\n const strokeWidth = 0; // like padding\r\n\r\n sortedAnnots.forEach((annot, i) => {\r\n const layout = getAnnotLabelLayout(annot, ideo);\r\n\r\n if (layout === null) {\r\n console.log(annot.name + ' has null layout')\r\n return;\r\n }\r\n\r\n const hasOverlap =\r\n spacedLayouts.length > 0 && spacedLayouts.some((sl, j) => {\r\n const xOverlap = getIsXOverlap(sl, layout, strokeWidth);\r\n const yOverlap = getIsYOverlap(sl, layout, strokeWidth);\r\n\r\n // if (annot.name === 'AKT1' || annot.name === 'XRCC3') {\r\n // const spacedAnnot = spacedAnnots[j].name;\r\n // if (spacedAnnot === 'HIF1A' || spacedAnnot === 'RAD51') {\r\n // // if (xOverlap && yOverlap) {\r\n // // console.log('sl.top - strokeWidth', sl.top - strokeWidth)\r\n // // console.log('sl.top - strokeWidth < layout.bottom')\r\n // // console.log(sl.top - strokeWidth < layout.bottom)\r\n // // console.log('sl.bottom > layout.top - strokeWidth')\r\n // // console.log(sl.bottom > layout.top - strokeWidth)\r\n // // console.log('layout.top - strokeWidth < sl.bottom')\r\n // // console.log(layout.top - strokeWidth < sl.bottom)\r\n // // console.log('layout.bottom > sl.bottom')\r\n // // console.log(layout.bottom > sl.bottom)\r\n // console.log(\r\n // 'xOverlap, yOverlap, spacedAnnot, sl, annot.name, layout'\r\n // );\r\n // console.log(\r\n // xOverlap, yOverlap, spacedAnnot, sl, annot.name, layout\r\n // );\r\n // }\r\n // }\r\n\r\n // if (xOverlap && yOverlap) {\r\n // console.log('overlap! annot');\r\n // console.log(annot.name, annot.chr, annot.color);\r\n // }\r\n return xOverlap && yOverlap;\r\n });\r\n\r\n if (hasOverlap) return;\r\n\r\n spacedAnnots.push(annot);\r\n spacedLayouts.push(layout);\r\n });\r\n\r\n let numLabels = 10;\r\n const config = ideo.config;\r\n if ('relatedGenesMode' in config && config.relatedGenesMode === 'hints') {\r\n numLabels = 20;\r\n }\r\n // spacedAnnots = applyRankCutoff(spacedAnnots, numLabels, ideo);\r\n spacedAnnots = spacedAnnots.sort(ideo.annotSortFunction).slice(0, numLabels)\r\n\r\n\r\n // Ensure highest-ranked annots are ordered last in SVG,\r\n // to ensure the are written before lower-ranked annots\r\n // (which, due to SVG z-index being tied to layering)\r\n spacedAnnots.reverse();\r\n\r\n spacedAnnots.forEach((annot) => {\r\n ideo.addAnnotLabel(annot.name);\r\n });\r\n\r\n d3.selectAll('._ideogramLabel, .annot')\r\n .on('mouseover', (event) => triggerAnnotEvent(event))\r\n .on('mouseout', (event) => triggerAnnotEvent(event, ideo))\r\n .on('click', (event) => triggerAnnotEvent(event));\r\n}\r\n\r\nfunction removeAnnotLabel(annotName) {\r\n const ideo = this;\r\n const annot = getAnnotByName(annotName, ideo);\r\n const id = getAnnotDomLabelId(annot);\r\n document.querySelector('#' + id).remove();\r\n}\r\n\r\nfunction clearAnnotLabels() {\r\n const labels = document.querySelectorAll('._ideogramLabel');\r\n labels.forEach((label) => {label.remove();});\r\n}\r\n\r\nexport {\r\n addAnnotLabel, clearAnnotLabels, fillAnnotLabels, getAnnotLabelLayout,\r\n removeAnnotLabel\r\n};\r\n","/**\r\n * Get containers to group individual annotations into higher-level \"bar\"\r\n * annotations.\r\n */\r\nfunction getRawBars(chrModels, ideo) {\r\n var chr, chrModel, lastBand, numBins, bar, h, i, px,\r\n barWidth = ideo.config.barWidth,\r\n bars = [];\r\n\r\n for (h = 0; h < ideo.chromosomesArray.length; h++) {\r\n chr = ideo.chromosomesArray[h].name;\r\n chrModel = chrModels[chr];\r\n lastBand = chrModel.bands[chrModel.bands.length - 1];\r\n numBins = Math.round(lastBand.px.stop / barWidth); // chrPxStop / barWidth\r\n bar = {chr: chr, annots: []};\r\n\r\n for (i = 0; i < numBins; i++) {\r\n px = i * barWidth - ideo.bump;\r\n bar.annots.push({\r\n bp: ideo.convertPxToBp(chrModel, px + ideo.bump),\r\n px: px,\r\n count: 0,\r\n chrIndex: chrModel.chrIndex,\r\n chrName: chr,\r\n color: ideo.config.annotationsColor,\r\n annots: []\r\n });\r\n }\r\n bars.push(bar);\r\n }\r\n return bars;\r\n}\r\n\r\n/**\r\n * Assign how many, and which annotations each histogram bar contains\r\n */\r\nfunction assignAnnotsToBars(annots, bars, chrModels, ideo) {\r\n var chrAnnots, chrModel, barAnnots, h, i, annot, px, j, barPx, nextBarPx,\r\n barWidth = ideo.config.barWidth;\r\n\r\n for (h = 0; h < annots.length; h++) {\r\n chrAnnots = annots[h].annots;\r\n chrModel = chrModels[annots[h].chr]; // get chr by name\r\n barAnnots = bars[chrModel.chrIndex].annots;\r\n for (i = 0; i < chrAnnots.length; i++) {\r\n annot = chrAnnots[i];\r\n px = annot.px - ideo.bump;\r\n for (j = 0; j < barAnnots.length; j++) {\r\n barPx = barAnnots[j].px;\r\n nextBarPx = barPx + barWidth;\r\n if (j === barAnnots.length - 1) nextBarPx += barWidth;\r\n if (px >= barPx && px < nextBarPx) {\r\n bars[chrModel.chrIndex].annots[j].count += 1;\r\n bars[chrModel.chrIndex].annots[j].annots.push(annot);\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n return bars;\r\n}\r\n\r\nfunction setIdeoMaxAnnotsPerBar(bars, isFirstGet, ideo) {\r\n var maxAnnotsPerBarAllChrs, i, maxAnnotsPerBar, annots, chr, j, barCount;\r\n\r\n if (isFirstGet || ideo.config.histogramScaling === 'relative') {\r\n maxAnnotsPerBarAllChrs = 0;\r\n for (i = 0; i < bars.length; i++) {\r\n maxAnnotsPerBar = 0;\r\n annots = bars[i].annots;\r\n chr = bars[i].chr;\r\n for (j = 0; j < annots.length; j++) {\r\n barCount = annots[j].count;\r\n if (barCount > maxAnnotsPerBar) maxAnnotsPerBar = barCount;\r\n if (barCount > maxAnnotsPerBarAllChrs) {\r\n maxAnnotsPerBarAllChrs = barCount;\r\n }\r\n }\r\n ideo.maxAnnotsPerBar[chr] = maxAnnotsPerBar;\r\n }\r\n ideo.maxAnnotsPerBarAllChrs = maxAnnotsPerBarAllChrs;\r\n }\r\n}\r\n\r\n/**\r\n * Set each bar's height to be proportional to the height of the bar with the\r\n * most annotations\r\n */\r\nfunction setProportionalBarHeight(bars, ideo) {\r\n var i, annots, chr, j, barCount, barCountRatio, height,\r\n ideoIsRotated = ideo._layout._isRotated;\r\n\r\n for (i = 0; i < bars.length; i++) {\r\n annots = bars[i].annots;\r\n chr = bars[i].chr;\r\n for (j = 0; j < annots.length; j++) {\r\n barCount = annots[j].count;\r\n if (ideo.config.histogramScaling === 'relative') {\r\n barCountRatio = barCount / ideo.maxAnnotsPerBar[chr];\r\n } else {\r\n barCountRatio = barCount / ideo.maxAnnotsPerBarAllChrs;\r\n }\r\n if (ideoIsRotated === false) {\r\n height = barCountRatio * ideo.config.chrMargin;\r\n } else {\r\n height = barCountRatio * ideo.config.chrHeightOriginal * 3;\r\n }\r\n if (isNaN(height)) {\r\n height = 0;\r\n }\r\n bars[i].annots[j].height = height;\r\n }\r\n }\r\n return bars;\r\n}\r\n\r\nfunction reportGetHistogramBarPerformance(t0, ideo) {\r\n var t1 = new Date().getTime();\r\n if (ideo.config.debug) {\r\n console.log('Time spent in getHistogramBars: ' + (t1 - t0) + ' ms');\r\n }\r\n}\r\n\r\nfunction setIdeoHistogramScaling(ideo) {\r\n if ('histogramScaling' in ideo.config === false) {\r\n ideo.config.histogramScaling = 'absolute';\r\n }\r\n}\r\n\r\n/**\r\n * Returns and sets bars used for histogram\r\n */\r\nfunction getHistogramBars(annots) {\r\n var chrModels, bars,\r\n isFirstGet = false,\r\n t0 = new Date().getTime(),\r\n ideo = this;\r\n\r\n chrModels = ideo.chromosomes[ideo.config.taxid];\r\n\r\n setIdeoHistogramScaling(ideo);\r\n\r\n if (typeof ideo.maxAnnotsPerBar === 'undefined') {\r\n ideo.maxAnnotsPerBar = {};\r\n isFirstGet = true;\r\n }\r\n\r\n bars = getRawBars(chrModels, ideo);\r\n bars = assignAnnotsToBars(annots, bars, chrModels, ideo);\r\n\r\n setIdeoMaxAnnotsPerBar(bars, isFirstGet, ideo);\r\n bars = setProportionalBarHeight(bars, ideo);\r\n\r\n reportGetHistogramBarPerformance(t0, ideo);\r\n ideo.bars = bars;\r\n return bars;\r\n}\r\n\r\nfunction getHistogramPoints(d, chrWidth, chrWidths, ideo) {\r\n var x1, x2, y1, y2;\r\n\r\n x1 = d.px + ideo.bump;\r\n x2 = d.px + ideo.config.barWidth + ideo.bump;\r\n y1 = chrWidth;\r\n y2 = chrWidth + d.height;\r\n\r\n var thisChrWidth = chrWidths[d.chr];\r\n\r\n if (x2 > thisChrWidth) {\r\n x2 = thisChrWidth;\r\n }\r\n\r\n return (\r\n x1 + ',' + y1 + ' ' +\r\n x2 + ',' + y1 + ' ' +\r\n x2 + ',' + y2 + ' ' +\r\n x1 + ',' + y2\r\n );\r\n}\r\n\r\nfunction writeHistogramAnnots(chrAnnot, ideo) {\r\n var chrs, chr,\r\n chrWidths = {},\r\n chrWidth = ideo.config.chrWidth;\r\n\r\n chrs = ideo.chromosomes[ideo.config.taxid];\r\n for (chr in chrs) {\r\n chrWidths[chr] = chrs[chr];\r\n }\r\n\r\n chrAnnot.append('polygon')\r\n // .attr('id', function(d, i) { return d.id; })\r\n .attr('class', 'annot')\r\n .attr('points', function(d) {\r\n return getHistogramPoints(d, chrWidth, chrWidths, ideo);\r\n })\r\n .attr('fill', function(d) {return d.color;});\r\n}\r\n\r\nexport {getHistogramBars, writeHistogramAnnots};\r\n","/**\r\n * @fileoverview Functions for drawing a legend for genome annotations.\r\n * A legend consists of rows, each with a colored icon and a text label.\r\n * Icons may have different shapes. A legend may also have a name.\r\n */\r\n\r\nimport {d3, getTextSize, round} from '../lib';\r\n\r\nvar legendStyle =\r\n '#_ideogramLegend {font: 12px Arial; overflow: auto;} ' +\r\n '#_ideogramLegend svg {float: left;} ' +\r\n '#_ideogramLegend ul {' +\r\n 'position: relative; left: -14px; list-style: none; float: left; ' +\r\n 'padding-left: 10px; margin: 0 0 1em 0; width: auto; border: none;' +\r\n '} ' +\r\n '#_ideogramLegend li {float: none; margin: 0;}' +\r\n '#_ideogramLegend ul span {position: relative; left: -15px;} ';\r\n\r\nfunction getIcon(row, ideo) {\r\n var icon, triangleAttrs, circleAttrs, rectAttrs,\r\n fill = 'fill=\"' + row.color + '\" style=\"stroke: #AAA;\"',\r\n shape = row.shape;\r\n\r\n triangleAttrs = 'd=\"m7,3 l -5 9 l 9 0 z\"';\r\n circleAttrs = 'd=\"m2,9a 4.5,4.5 0 1,0 9,0a 4.5,4.5 0 1,0 -9,0\"';\r\n rectAttrs = 'height=\"10\" width=\"10\" y=\"3\"';\r\n\r\n if ('shape' in row && ['circle', 'triangle'].includes(shape)) {\r\n if (shape === 'circle') {\r\n icon = '';\r\n } else if (shape === 'triangle') {\r\n var transform = '';\r\n if (ideo.config.orientation === 'vertical') {\r\n // Orient arrows in legend as they are in annotations\r\n transform = ' transform=\"rotate(90, 7, 7)\"';\r\n }\r\n icon = '';\r\n }\r\n } else {\r\n icon = '';\r\n }\r\n\r\n return icon;\r\n}\r\n\r\nfunction getListItems(labels, svg, list, nameHeight, ideo) {\r\n var i, icon, y, row,\r\n lineHeight = getLineHeight(ideo);\r\n\r\n for (i = 0; i < list.rows.length; i++) {\r\n row = list.rows[i];\r\n labels += '
  • ' + row.name + '
  • ';\r\n y = lineHeight * (i - 1) + nameHeight + 1;\r\n if ('name' in list) y += lineHeight;\r\n icon = getIcon(row, ideo);\r\n const transform = 'translate(0, ' + y + ')';\r\n svg += '' + icon + '';\r\n }\r\n\r\n return [labels, svg];\r\n}\r\n\r\nfunction getLineHeight(ideo) {\r\n return round(getTextSize('A', ideo).height) * 2 + 0.5;\r\n}\r\n\r\n/**\r\n * Display a legend for genome annotations, using `legend` configuration option\r\n */\r\nfunction writeLegend(ideo) {\r\n var i, legend, svg, labels, list, content,\r\n config = ideo.config,\r\n lineHeight = getLineHeight(ideo);\r\n\r\n d3.select(config.container + ' #_ideogramLegend').remove();\r\n\r\n legend = config.legend;\r\n content = '';\r\n\r\n for (i = 0; i < legend.length; i++) {\r\n list = legend[i];\r\n let nameHeight = lineHeight;\r\n if (list.nameHeight) {\r\n nameHeight = list.nameHeight;\r\n }\r\n let nameStyle = '';\r\n if (nameHeight) {\r\n nameStyle =\r\n `style=\"height: ${nameHeight}px; ` +\r\n `position: relative; ` +\r\n `left: -${nameHeight - 5}px;\"`;\r\n }\r\n if ('name' in list) {\r\n labels = `
    ` + list.name + `
    `;\r\n }\r\n svg = '';\r\n [labels, svg] = getListItems(labels, svg, list, nameHeight, ideo);\r\n svg += '';\r\n content += svg + '
      ' + labels + '
    ';\r\n }\r\n\r\n var fontFamily = `font-family: ${config.fontFamily};`;\r\n var lineHeightCss = `line-height: ${getLineHeight(ideo)}px;`;\r\n legendStyle +=\r\n `#_ideogramLegend {${fontFamily} ${lineHeightCss}}`;\r\n\r\n var target = d3.select(config.container + ' #_ideogramOuterWrap');\r\n target.append('style').html(legendStyle);\r\n target.append('div').attr('id', '_ideogramLegend').html(content);\r\n}\r\n\r\nexport {writeLegend};\r\n","import {d3} from '../lib';\r\nimport {writeHistogramAnnots} from './histogram';\r\nimport {writeLegend} from './legend';\r\n\r\nfunction parseFriendlyAnnots(friendlyAnnots, rawAnnots) {\r\n var i, j, annot, rawAnnot;\r\n\r\n for (i = 0; i < friendlyAnnots.length; i++) {\r\n annot = friendlyAnnots[i];\r\n\r\n for (j = 0; j < rawAnnots.length; j++) {\r\n if (annot.chr === rawAnnots[j].chr) {\r\n rawAnnot = [\r\n annot.name,\r\n annot.start,\r\n annot.stop - annot.start\r\n ];\r\n if ('color' in annot) rawAnnot.push(annot.color);\r\n if ('shape' in annot) rawAnnot.push(annot.shape);\r\n rawAnnots[j].annots.push(rawAnnot);\r\n break;\r\n }\r\n }\r\n }\r\n\r\n return rawAnnots;\r\n}\r\n\r\nfunction parseFriendlyKeys(friendlyAnnots) {\r\n var keys = ['name', 'start', 'length'];\r\n if ('color' in friendlyAnnots[0]) {\r\n keys.push('color');\r\n }\r\n if ('shape' in friendlyAnnots[0]) {\r\n keys.push('shape');\r\n }\r\n return keys;\r\n}\r\n\r\n/**\r\n * Draws annotations defined by user\r\n */\r\nfunction drawAnnots(friendlyAnnots, layout, keep=false, isOtherLayout=false) {\r\n var keys, chr,\r\n rawAnnots = [],\r\n ideo = this,\r\n chrs = ideo.chromosomes[ideo.config.taxid]; // TODO: multiorganism\r\n\r\n if (\r\n 'annots' in friendlyAnnots[0] || // When filtering\r\n 'values' in friendlyAnnots[0] // When drawing cached expression matrices\r\n ) {\r\n return ideo.drawProcessedAnnots(friendlyAnnots, layout);\r\n }\r\n\r\n for (chr in chrs) {\r\n rawAnnots.push({chr: chr, annots: []});\r\n }\r\n rawAnnots = parseFriendlyAnnots(friendlyAnnots, rawAnnots);\r\n\r\n keys = parseFriendlyKeys(friendlyAnnots);\r\n\r\n ideo.rawAnnots = {keys: keys, annots: rawAnnots};\r\n\r\n const processedAnnots = ideo.processAnnotData(ideo.rawAnnots);\r\n if (!isOtherLayout) {\r\n ideo.annots = processedAnnots;\r\n } else {\r\n ideo.annotsOther = processedAnnots;\r\n }\r\n\r\n ideo.drawProcessedAnnots(processedAnnots, layout, keep);\r\n}\r\n\r\nfunction getShapes(annotHeight) {\r\n var triangle, circle, rectangle, r;\r\n\r\n triangle =\r\n 'm0,0 l -' + annotHeight + ' ' + (2 * annotHeight) +\r\n ' l ' + (2 * annotHeight) + ' 0 z';\r\n\r\n // From http://stackoverflow.com/a/10477334, with a minor change (\"m -r, r\")\r\n // Circles are supported natively via , but having it as a path\r\n // simplifies handling triangles, circles and other shapes in the same\r\n // D3 call\r\n r = annotHeight;\r\n circle =\r\n 'm -' + r + ', ' + r +\r\n 'a ' + r + ',' + r + ' 0 1,0 ' + (r * 2) + ',0' +\r\n 'a ' + r + ',' + r + ' 0 1,0 -' + (r * 2) + ',0';\r\n\r\n rectangle =\r\n 'm0,0 l 0 ' + (2 * annotHeight) +\r\n 'l ' + annotHeight + ' 0' +\r\n 'l 0 -' + (2 * annotHeight) + 'z';\r\n\r\n return {triangle: triangle, circle: circle, rectangle: rectangle};\r\n}\r\n\r\nfunction getChrAnnotNodes(filledAnnots, ideo) {\r\n return d3.selectAll(ideo.selector + ' .chromosome')\r\n .data(filledAnnots)\r\n .selectAll('path.annot')\r\n .data(function(d) {\r\n return d.annots;\r\n })\r\n .enter();\r\n}\r\n\r\nfunction determineShape(d, shapes) {\r\n if (!d.shape || d.shape === 'triangle') {\r\n return shapes.triangle;\r\n } else if (d.shape === 'circle') {\r\n return shapes.circle;\r\n } else if (d.shape === 'rectangle') {\r\n return shapes.rectangle;\r\n } else {\r\n return d.shape;\r\n }\r\n}\r\n\r\nfunction writeTrackAnnots(chrAnnot, ideo) {\r\n var shapes,\r\n annotHeight = ideo.config.annotationHeight;\r\n\r\n shapes = getShapes(annotHeight);\r\n\r\n chrAnnot.append('g')\r\n .attr('id', function(d) {return d.domId;})\r\n .attr('class', 'annot')\r\n .attr('transform', function(d) {\r\n var y = ideo.config.chrWidth + (d.trackIndex * annotHeight * 2);\r\n return 'translate(' + d.px + ',' + y + ')';\r\n })\r\n .append('path')\r\n .attr('d', function(d) {return determineShape(d, shapes);})\r\n .attr('fill', function(d) {return d.color;})\r\n .on('mouseover', function(event, d) {ideo.showAnnotTooltip(d, this);})\r\n .on('mouseout', function() {ideo.startHideAnnotTooltipTimeout();})\r\n .on('click', function(event, d) {ideo.onClickAnnot(d);});\r\n}\r\n\r\n/**\r\n * Overlaid annotations appear directly on chromosomes\r\n */\r\nfunction writeOverlayAnnots(chrAnnot, ideo) {\r\n chrAnnot.append('polygon')\r\n .attr('id', function(d) {return d.id;})\r\n .attr('class', 'annot')\r\n .attr('points', function(d) {\r\n var x1, x2,\r\n chrWidth = ideo.config.chrWidth;\r\n\r\n if (d.stopPx - d.startPx > 1) {\r\n x1 = d.startPx;\r\n x2 = d.stopPx;\r\n } else {\r\n x1 = d.px - 0.5;\r\n x2 = d.px + 0.5;\r\n }\r\n\r\n return (\r\n x1 + ',' + chrWidth + ' ' + x2 + ',' + chrWidth + ' ' +\r\n x2 + ',0 ' + x1 + ',0'\r\n );\r\n })\r\n .attr('fill', function(d) {return d.color;})\r\n .on('mouseover', function(event, d) {ideo.showAnnotTooltip(d, this);})\r\n .on('mouseout', function() {ideo.startHideAnnotTooltipTimeout();});\r\n}\r\n\r\nfunction warnIfTooManyAnnots(layout, annots) {\r\n var i, numAnnots;\r\n\r\n if (!/heatmap/.test(layout) && layout !== 'histogram') {\r\n numAnnots = 0;\r\n for (i = 0; i < annots.length; i++) {\r\n numAnnots += annots[i].annots.length;\r\n }\r\n if (numAnnots > 2000) {\r\n console.warn(\r\n 'Rendering more than 2000 annotations in Ideogram?\\n' +\r\n 'Try setting \"annotationsLayout\" to \"heatmap\" or \"histogram\" in your ' +\r\n 'Ideogram configuration object for better layout and performance.'\r\n );\r\n }\r\n }\r\n}\r\n\r\nfunction drawAnnotsByLayoutType(layout, annots, ideo) {\r\n var filledAnnots, chrAnnot;\r\n\r\n warnIfTooManyAnnots(layout, annots);\r\n\r\n if (layout === 'histogram') annots = ideo.getHistogramBars(annots);\r\n\r\n filledAnnots = ideo.fillAnnots(annots);\r\n\r\n chrAnnot = getChrAnnotNodes(filledAnnots, ideo);\r\n\r\n if (layout === 'tracks') {\r\n writeTrackAnnots(chrAnnot, ideo);\r\n } else if (layout === 'overlay') {\r\n writeOverlayAnnots(chrAnnot, ideo);\r\n } else if (layout === 'histogram') {\r\n writeHistogramAnnots(chrAnnot, ideo);\r\n }\r\n}\r\n\r\n/**\r\n * Draws genome annotations on chromosomes.\r\n * Annotations can be rendered as either overlaid directly\r\n * on a chromosome, or along one or more \"tracks\"\r\n * running parallel to each chromosome.\r\n */\r\nfunction drawProcessedAnnots(annots, layout, keep=false) {\r\n var ideo = this;\r\n\r\n if (!keep) {\r\n d3.selectAll(ideo.selector + ' .annot').remove();\r\n }\r\n\r\n if (layout === undefined) layout = 'tracks';\r\n if (ideo.config.annotationsLayout) layout = ideo.config.annotationsLayout;\r\n\r\n if ('legend' in ideo.config) writeLegend(ideo);\r\n\r\n if (/heatmap/.test(layout)) {\r\n ideo.drawHeatmaps(annots);\r\n return;\r\n }\r\n\r\n drawAnnotsByLayoutType(layout, annots, ideo);\r\n if (ideo.onDrawAnnotsCallback) ideo.onDrawAnnotsCallback();\r\n}\r\n\r\nexport {drawAnnots, drawProcessedAnnots, getShapes};\r\n","import {d3} from '../lib';\r\n\r\nexport function writeSyntenicRegion(syntenies, regionID, ideo) {\r\n return syntenies.append('g')\r\n .attr('class', 'syntenicRegion')\r\n .attr('id', regionID)\r\n .on('click', function() {\r\n var activeRegion = this;\r\n var others = d3.selectAll(ideo.selector + ' .syntenicRegion')\r\n .filter(function() {return (this !== activeRegion);});\r\n\r\n others.classed('hidden', !others.classed('hidden'));\r\n })\r\n .on('mouseover', function() {\r\n var activeRegion = this;\r\n d3.selectAll(ideo.selector + ' .syntenicRegion')\r\n .filter(function() {return (this !== activeRegion);})\r\n .classed('ghost', true);\r\n })\r\n .on('mouseout', function() {\r\n d3.selectAll(ideo.selector + ' .syntenicRegion')\r\n .classed('ghost', false);\r\n });\r\n}\r\n\r\nexport function writeSyntenicRegionPolygons(\r\n syntenicRegion, x1, x2, r1, r2, regions\r\n) {\r\n var color, opacity;\r\n\r\n color = ('color' in regions) ? regions.color : '#CFC';\r\n opacity = ('opacity' in regions) ? regions.opacity : 1;\r\n\r\n syntenicRegion.append('polygon')\r\n .attr('points',\r\n x1 + ', ' + r1.startPx + ' ' +\r\n x1 + ', ' + r1.stopPx + ' ' +\r\n x2 + ', ' + r2.stopPx + ' ' +\r\n x2 + ', ' + r2.startPx\r\n )\r\n .style('fill', color)\r\n .style('fill-opacity', opacity);\r\n}\r\n\r\nexport function writeSyntenicRegionPolygonsHorizontal(\r\n syntenicRegion, y1, y2, r1, r2, regions\r\n) {\r\n var color, opacity;\r\n\r\n color = ('color' in regions) ? regions.color : '#CFC';\r\n opacity = ('opacity' in regions) ? regions.opacity : 1;\r\n\r\n syntenicRegion.append('polygon')\r\n .attr('points',\r\n (r1.startPx - 15) + ', ' + y1 + ' ' +\r\n (r1.stopPx - 15) + ', ' + y1 + ' ' +\r\n (r2.stopPx - 15) + ', ' + y2 + ' ' +\r\n (r2.startPx - 15) + ', ' + y2\r\n )\r\n .style('fill', color)\r\n .style('fill-opacity', opacity);\r\n}\r\n\r\nexport function getRegionsR1AndR2(regions, ideo, xOffset = null) {\r\n var r1, r2,\r\n r1Offset, r2Offset;\r\n\r\n r1 = regions.r1;\r\n r2 = regions.r2;\r\n\r\n if (typeof r1.chr === 'string') {\r\n const taxids = ideo.config.taxids;\r\n if (ideo.config.multiorganism) {\r\n r1.chr = ideo.chromosomes[taxids[0]][r1.chr];\r\n r2.chr = ideo.chromosomes[taxids[1]][r2.chr];\r\n } else {\r\n r1.chr = ideo.chromosomes[taxids[0]][r1.chr];\r\n r2.chr = ideo.chromosomes[taxids[0]][r2.chr];\r\n }\r\n }\r\n\r\n var r1ChrDom = document.querySelector('#' + r1.chr.id + '-chromosome-set');\r\n var r1GenomeHorizontalXOffset = r1ChrDom.getCTM().e;\r\n var r1GenomeVerticalXOffset = r1ChrDom.getCTM().f;\r\n var r2ChrDom = document.querySelector('#' + r2.chr.id + '-chromosome-set');\r\n // var r2GenomeOffset = r2ChrDom.getBoundingClientRect().top;\r\n var r2GenomeHorizontalXOffset = r2ChrDom.getCTM().e;\r\n var r2GenomeVerticalXOffset = r2ChrDom.getCTM().f;\r\n\r\n if (xOffset === null) {\r\n if (ideo.config.orientation === 'vertical') {\r\n // When vertical collinear\r\n // http://localhost:8080/examples/vanilla/compare-whole-genomes?chromosome-scale=absolute&orientation=vertical\r\n r1Offset = r1GenomeVerticalXOffset - 12;\r\n r2Offset = r2GenomeVerticalXOffset - 12;\r\n } else {\r\n // When horizontal collinear, e.g.\r\n // http://localhost:8080/examples/vanilla/compare-whole-genomes?chromosome-scale=absolute&orientation=horizontal\r\n r1Offset = r1GenomeHorizontalXOffset;\r\n r2Offset = r2GenomeHorizontalXOffset;\r\n }\r\n } else {\r\n // When horizontal parallel\r\n r1Offset = xOffset;\r\n r2Offset = xOffset;\r\n }\r\n\r\n r1.startPx = ideo.convertBpToPx(r1.chr, r1.start) + r1Offset;\r\n r1.stopPx = ideo.convertBpToPx(r1.chr, r1.stop) + r1Offset;\r\n r2.startPx = ideo.convertBpToPx(r2.chr, r2.start) + r2Offset;\r\n r2.stopPx = ideo.convertBpToPx(r2.chr, r2.stop) + r2Offset;\r\n\r\n return [r1, r2];\r\n}\r\n","import {d3} from '../lib';\r\nimport {\r\n getRegionsR1AndR2, writeSyntenicRegionPolygons, writeSyntenicRegion\r\n} from './synteny-lib';\r\n\r\nfunction writeSyntenicRegionLines(syntenicRegion, x1, x2, r1, r2) {\r\n syntenicRegion.append('line')\r\n .attr('class', 'syntenyBorder')\r\n .attr('x1', x1)\r\n .attr('x2', x2)\r\n .attr('y1', r1.startPx)\r\n .attr('y2', r2.startPx);\r\n\r\n syntenicRegion.append('line')\r\n .attr('class', 'syntenyBorder')\r\n .attr('x1', x1)\r\n .attr('x2', x2)\r\n .attr('y1', r1.stopPx)\r\n .attr('y2', r2.stopPx);\r\n}\r\n\r\nfunction writeSyntenicRegions(syntenicRegions, syntenies, ideo) {\r\n var i, regions, r1, r2, regionID, syntenicRegion, chrWidth, x1, x2;\r\n\r\n for (i = 0; i < syntenicRegions.length; i++) {\r\n regions = syntenicRegions[i];\r\n\r\n [r1, r2] = getRegionsR1AndR2(regions, ideo);\r\n\r\n regionID = (\r\n r1.chr.id + '_' + r1.start + '_' + r1.stop + '_' +\r\n '__' +\r\n r2.chr.id + '_' + r2.start + '_' + r2.stop\r\n );\r\n\r\n syntenicRegion = writeSyntenicRegion(syntenies, regionID, ideo);\r\n\r\n chrWidth = ideo.config.chrWidth;\r\n x1 = chrWidth + 51;\r\n x2 = chrWidth + 245; // Genomes are spaced ~200 pixels apart\r\n\r\n writeSyntenicRegionPolygons(syntenicRegion, x1, x2, r1, r2, regions);\r\n writeSyntenicRegionLines(syntenicRegion, x1, x2, r1, r2);\r\n }\r\n}\r\n\r\nfunction reportPerformance(t0, ideo) {\r\n var t1 = new Date().getTime();\r\n if (ideo.config.debug) {\r\n console.log('Time in drawSyntenicRegions: ' + (t1 - t0) + ' ms');\r\n }\r\n}\r\n\r\n/**\r\n * Draws a trapezoid connecting a genomic range on\r\n * one chromosome to a genomic range on another chromosome;\r\n * a syntenic region.\r\n */\r\nfunction drawSyntenyCollinear(syntenicRegions, ideo) {\r\n var syntenies,\r\n t0 = new Date().getTime();\r\n\r\n syntenies = d3.select(ideo.selector)\r\n .insert('g', ':first-child')\r\n .attr('class', 'synteny');\r\n\r\n writeSyntenicRegions(syntenicRegions, syntenies, ideo);\r\n\r\n reportPerformance(t0, ideo);\r\n}\r\n\r\nexport {drawSyntenyCollinear};\r\n","import {d3} from '../lib';\r\nimport {\r\n getRegionsR1AndR2, writeSyntenicRegionPolygonsHorizontal, writeSyntenicRegion\r\n} from './synteny-lib';\r\n\r\nfunction writeSyntenicRegionLines(syntenicRegion, y1, y2, r1, r2) {\r\n syntenicRegion.append('line')\r\n .attr('class', 'syntenyBorder')\r\n .attr('x1', r1.startPx - 15)\r\n .attr('x2', r2.startPx - 15)\r\n .attr('y1', y1)\r\n .attr('y2', y2);\r\n\r\n syntenicRegion.append('line')\r\n .attr('class', 'syntenyBorder')\r\n .attr('x1', r1.stopPx - 15)\r\n .attr('x2', r2.stopPx - 15)\r\n .attr('y1', y1)\r\n .attr('y2', y2);\r\n}\r\n\r\nfunction writeSyntenicRegions(syntenicRegions, syntenies, ideo) {\r\n var i, regions, r1, r2, regionID, syntenicRegion, chrWidth, y1, y2;\r\n\r\n for (i = 0; i < syntenicRegions.length; i++) {\r\n regions = syntenicRegions[i];\r\n\r\n [r1, r2] = getRegionsR1AndR2(regions, ideo);\r\n\r\n regionID = (\r\n r1.chr.id + '_' + r1.start + '_' + r1.stop + '_' +\r\n '__' +\r\n r2.chr.id + '_' + r2.start + '_' + r2.stop\r\n );\r\n\r\n syntenicRegion = writeSyntenicRegion(syntenies, regionID, ideo);\r\n\r\n chrWidth = ideo.config.chrWidth;\r\n y1 = chrWidth + 31;\r\n y2 = chrWidth + 191; // Genomes are spaced ~200 pixels apart\r\n\r\n writeSyntenicRegionPolygonsHorizontal(\r\n syntenicRegion, y1, y2, r1, r2, regions\r\n );\r\n writeSyntenicRegionLines(syntenicRegion, y1, y2, r1, r2);\r\n }\r\n}\r\n\r\nfunction reportPerformance(t0, ideo) {\r\n var t1 = new Date().getTime();\r\n if (ideo.config.debug) {\r\n console.log('Time in drawSyntenicRegions: ' + (t1 - t0) + ' ms');\r\n }\r\n}\r\n\r\n/**\r\n * Draws a trapezoid connecting a genomic range on\r\n * one chromosome to a genomic range on another chromosome;\r\n * a syntenic region.\r\n */\r\nfunction drawSyntenyCollinearHorizontal(syntenicRegions, ideo) {\r\n var syntenies,\r\n t0 = new Date().getTime();\r\n\r\n syntenies = d3.select(ideo.selector)\r\n .insert('g', ':first-child')\r\n .attr('class', 'synteny');\r\n\r\n writeSyntenicRegions(syntenicRegions, syntenies, ideo);\r\n\r\n reportPerformance(t0, ideo);\r\n}\r\n\r\nexport {drawSyntenyCollinearHorizontal};\r\n","import {d3} from '../lib';\r\nimport {drawSyntenyCollinear} from './synteny-collinear';\r\nimport {drawSyntenyCollinearHorizontal} from './synteny-collinear-horizontal';\r\nimport {\r\n getRegionsR1AndR2, writeSyntenicRegionPolygons, writeSyntenicRegion\r\n} from './synteny-lib';\r\n\r\nfunction writeSyntenicRegionLines(syntenicRegion, x1, x2, r1, r2, regions) {\r\n\r\n var stroke, width;\r\n if (\r\n Math.abs(r1.startPx - r1.startPx) < 2 &&\r\n Math.abs(r1.stopPx - r1.stopPx) < 2\r\n ) {\r\n stroke = regions.color;\r\n width = regions.width;\r\n } else {\r\n stroke = '';\r\n width = '';\r\n }\r\n\r\n syntenicRegion.append('line')\r\n .attr('class', 'syntenyBorder')\r\n .attr('x1', x1)\r\n .attr('x2', x2)\r\n .attr('y1', r1.startPx)\r\n .attr('y2', r2.startPx)\r\n .style('stroke', stroke)\r\n .style('stroke-width', width);\r\n\r\n syntenicRegion.append('line')\r\n .attr('class', 'syntenyBorder')\r\n .attr('x1', x1)\r\n .attr('x2', x2)\r\n .attr('y1', r1.stopPx)\r\n .attr('y2', r2.stopPx)\r\n .style('stroke', stroke)\r\n .style('stroke-width', stroke);\r\n}\r\n\r\nfunction writeSyntenicRegionLabels(syntenicRegion, x1, x2, r1, r2, regionId) {\r\n var rangeIds = regionId.split('__').map(d => 'label_' + d);\r\n if ('name' in r1) {\r\n syntenicRegion.append('text')\r\n .attr('id', rangeIds[0])\r\n .attr('y', r1.startPx + 3)\r\n .text(r1.name);\r\n var r1Width =\r\n document.querySelector('#' + rangeIds[0]).getBoundingClientRect().width;\r\n d3.select('#' + rangeIds[0]).attr('x', x1 - 15 - r1Width);\r\n }\r\n if ('name' in r2) {\r\n syntenicRegion.append('text')\r\n .attr('id', rangeIds[1])\r\n .text(r2.name)\r\n .attr('x', x2 + 15)\r\n .attr('y', r2.startPx + 3)\r\n .text(r2.name);\r\n }\r\n}\r\n\r\nfunction writeSyntenicRegions(syntenicRegions, syntenies, xOffset, ideo) {\r\n var i, regions, r1, r2, regionID, syntenicRegion, chrWidth, x1, x2;\r\n\r\n for (i = 0; i < syntenicRegions.length; i++) {\r\n regions = syntenicRegions[i];\r\n\r\n [r1, r2] = getRegionsR1AndR2(regions, ideo, xOffset);\r\n\r\n regionID = (\r\n r1.chr.id + '_' + r1.start + '_' + r1.stop + '_' +\r\n '__' +\r\n r2.chr.id + '_' + r2.start + '_' + r2.stop\r\n );\r\n\r\n syntenicRegion = writeSyntenicRegion(syntenies, regionID, ideo);\r\n\r\n chrWidth = ideo.config.chrWidth;\r\n x1 = ideo._layout.getChromosomeSetYTranslate(0);\r\n x2 = ideo._layout.getChromosomeSetYTranslate(1) - chrWidth;\r\n\r\n writeSyntenicRegionPolygons(syntenicRegion, x1, x2, r1, r2, regions);\r\n writeSyntenicRegionLines(syntenicRegion, x1, x2, r1, r2, regions);\r\n writeSyntenicRegionLabels(syntenicRegion, x1, x2, r1, r2, regionID);\r\n }\r\n}\r\n\r\nfunction reportPerformance(t0, ideo) {\r\n var t1 = new Date().getTime();\r\n if (ideo.config.debug) {\r\n console.log('Time in drawSyntenicRegions: ' + (t1 - t0) + ' ms');\r\n }\r\n}\r\n\r\n/**\r\n * Draws a trapezoid connecting a genomic range on\r\n * one chromosome to a genomic range on another chromosome;\r\n * a syntenic region.\r\n */\r\nfunction drawSynteny(syntenicRegions) {\r\n var syntenies, xOffset,\r\n t0 = new Date().getTime(),\r\n ideo = this,\r\n config = ideo.config;\r\n\r\n // Make synteny / orthologs readable from client apps\r\n ideo.syntenicRegions = syntenicRegions;\r\n\r\n if (\r\n config.multiorganism &&\r\n config.geometry === 'collinear'\r\n ) {\r\n if (config.orientation === 'vertical') {\r\n return drawSyntenyCollinear(syntenicRegions, ideo);\r\n } else {\r\n return drawSyntenyCollinearHorizontal(syntenicRegions, ideo);\r\n }\r\n }\r\n\r\n syntenies = d3.select(ideo.selector)\r\n .insert('g', ':first-child')\r\n .attr('class', 'synteny');\r\n\r\n xOffset = ideo._layout.margin.left;\r\n\r\n writeSyntenicRegions(syntenicRegions, syntenies, xOffset, ideo);\r\n\r\n reportPerformance(t0, ideo);\r\n}\r\n\r\nexport {drawSynteny};\r\n","import {d3} from '../lib';\r\nimport collinearizeChromosomes from '../collinear';\r\n\r\n/**\r\n * Reset displayed tracks to those originally displayed\r\n */\r\nfunction restoreDefaultTracks() {\r\n var ideo = this;\r\n ideo.config.numAnnotTracks = ideo.config.annotationsNumTracks;\r\n d3.selectAll(ideo.selector + ' .annot').remove();\r\n ideo.drawAnnots(ideo.processAnnotData(ideo.rawAnnots));\r\n}\r\n\r\nfunction getDisplayedRawAnnotsByChr(annotsByChr, trackIndexes) {\r\n var annot, displayedRawAnnotsByChr, annots, i, displayedAnnots, j,\r\n trackIndex;\r\n\r\n displayedRawAnnotsByChr = [];\r\n\r\n // Filter displayed tracks by selected track indexes\r\n for (i = 0; i < annotsByChr.length; i++) {\r\n annots = annotsByChr[i];\r\n displayedAnnots = [];\r\n for (j = 0; j < annots.annots.length; j++) {\r\n annot = annots.annots[j].slice(); // copy array by value\r\n trackIndex = annot[3] + 1;\r\n if (trackIndexes.includes(trackIndex)) {\r\n annot[3] = trackIndexes.indexOf(trackIndex);\r\n displayedAnnots.push(annot);\r\n }\r\n }\r\n displayedRawAnnotsByChr.push({chr: annots.chr, annots: displayedAnnots});\r\n }\r\n\r\n return displayedRawAnnotsByChr;\r\n}\r\n\r\n/**\r\n * Adds or removes tracks from the displayed list of tracks.\r\n * Only works when raw annotations are dense.\r\n *\r\n * @param trackIndexes Array of indexes of tracks to display\r\n */\r\nfunction updateDisplayedTracks(trackIndexes) {\r\n var displayedRawAnnotsByChr, displayedAnnots, rawAnnots,\r\n ideo = this,\r\n annotsByChr = ideo.rawAnnots.annots;\r\n\r\n ideo.config.numAnnotTracks = trackIndexes.length;\r\n\r\n displayedRawAnnotsByChr =\r\n getDisplayedRawAnnotsByChr(annotsByChr, trackIndexes);\r\n rawAnnots = {keys: ideo.rawAnnots.keys, annots: displayedRawAnnotsByChr};\r\n\r\n if (ideo.config.geometry === 'collinear') {\r\n collinearizeChromosomes(ideo);\r\n }\r\n\r\n displayedAnnots = ideo.processAnnotData(rawAnnots);\r\n\r\n d3.selectAll(ideo.selector + ' .annot').remove();\r\n ideo.displayedTrackIndexes = trackIndexes;\r\n ideo.drawAnnots(displayedAnnots);\r\n\r\n return displayedAnnots;\r\n}\r\n\r\nfunction getSetAnnotsByChr(annotsByChr, ideo) {\r\n var i, j, annots, annot, setAnnots, trackIndexOriginal, numAvailTracks,\r\n setAnnotsByChr = [];\r\n\r\n numAvailTracks = 1;\r\n\r\n for (i = 0; i < annotsByChr.length; i++) {\r\n annots = annotsByChr[i];\r\n setAnnots = [];\r\n for (j = 0; j < annots.annots.length; j++) {\r\n annot = annots.annots[j].slice();\r\n trackIndexOriginal = annot[3];\r\n if (trackIndexOriginal + 1 > numAvailTracks) {\r\n numAvailTracks = trackIndexOriginal + 1;\r\n }\r\n annot.splice(4, 0, trackIndexOriginal);\r\n setAnnots.push(annot);\r\n }\r\n setAnnotsByChr.push({chr: annots.chr, annots: setAnnots});\r\n }\r\n\r\n ideo.numAvailTracks = numAvailTracks;\r\n\r\n return setAnnotsByChr;\r\n}\r\n\r\nfunction setOriginalTrackIndexes(rawAnnots) {\r\n var keys, annotsByChr, setAnnotsByChr,\r\n ideo = this;\r\n\r\n keys = rawAnnots.keys;\r\n\r\n // If this method is unnecessary, pass through\r\n if (\r\n keys.length < 4 ||\r\n keys[3] !== 'trackIndex' ||\r\n keys[4] === 'trackIndexOriginal'\r\n ) {\r\n return rawAnnots;\r\n }\r\n\r\n annotsByChr = rawAnnots.annots;\r\n setAnnotsByChr = getSetAnnotsByChr(annotsByChr, ideo);\r\n\r\n keys.splice(4, 0, 'trackIndexOriginal');\r\n rawAnnots = {keys: keys, annots: setAnnotsByChr};\r\n if (ideo.rawAnnots.metadata) rawAnnots.metadata = ideo.rawAnnots.metadata;\r\n\r\n return rawAnnots;\r\n}\r\n\r\nexport {restoreDefaultTracks, setOriginalTrackIndexes, updateDisplayedTracks};\r\n","import {add2dAnnotsForChr} from './heatmap-2d';\r\nimport {setAnnotRanks} from './annotations';\r\n\r\n// Default colors for tracks of annotations\r\nvar colorMap = [\r\n ['F00'], // If there is 1 track, then color it red.\r\n ['F00', '88F'], // If 2 tracks, color one red and one light blue.\r\n ['F00', 'CCC', '88F'], // If 3, color one red, one grey, one light blue.\r\n ['F00', 'FA0', '0AF', '88F'], // And so on.\r\n ['F00', 'FA0', 'CCC', '0AF', '88F'],\r\n ['F00', 'FA0', '875', '578', '0AF', '88F'],\r\n ['F00', 'FA0', '875', 'CCC', '578', '0AF', '88F'],\r\n ['F00', 'FA0', '7A0', '875', '0A7', '578', '0AF', '88F'],\r\n ['F00', 'FA0', '7A0', '875', 'CCC', '0A7', '578', '0AF', '88F'],\r\n ['F00', 'FA0', '7A0', '875', '552', '255', '0A7', '578', '0AF', '88F']\r\n];\r\n\r\n/**\r\n * Ensure annotation containers are ordered by chromosome.\r\n */\r\nfunction orderAnnotContainers(annots, ideo) {\r\n var unorderedAnnots, i, j, annot, chr, chrs;\r\n\r\n unorderedAnnots = annots;\r\n annots = [];\r\n chrs = ideo.chromosomesArray;\r\n for (i = 0; i < chrs.length; i++) {\r\n chr = chrs[i].name;\r\n for (j = 0; j < unorderedAnnots.length; j++) {\r\n annot = unorderedAnnots[j];\r\n if (annot.chr === chr) {\r\n annots.push(annot);\r\n }\r\n }\r\n }\r\n\r\n return annots;\r\n}\r\n\r\n/**\r\n * Add client annotations, as in annotations-tracks.html\r\n */\r\nfunction addClientAnnot(annots, annot, ra, m, ideo) {\r\n var annotTrack;\r\n\r\n annot.trackIndex = ra[3];\r\n annotTrack = ideo.config.annotationTracks[annot.trackIndex];\r\n if (annotTrack.color) {\r\n annot.color = annotTrack.color;\r\n }\r\n if (annotTrack.shape) {\r\n annot.shape = annotTrack.shape;\r\n }\r\n\r\n annots[m].annots.push(annot);\r\n\r\n return annots;\r\n}\r\n\r\n/**\r\n * Add sparse server annotations, as in annotations-track-filters.html\r\n */\r\nfunction addSparseServerAnnot(annot, ra, omittedAnnots, annots, m, ideo) {\r\n var colors = colorMap[ideo.numAvailTracks - 1];\r\n\r\n annot.trackIndex = ra[3];\r\n annot.trackIndexOriginal = ra[4];\r\n annot.color = '#' + colors[annot.trackIndexOriginal];\r\n\r\n // Catch annots that will be omitted from display\r\n if (annot.trackIndex > ideo.config.numTracks - 1) {\r\n if (annot.trackIndex in omittedAnnots) {\r\n omittedAnnots[annot.trackIndex].push(annot);\r\n } else {\r\n omittedAnnots[annot.trackIndex] = [annot];\r\n }\r\n return [annots, omittedAnnots];\r\n }\r\n annots[m].annots.push(annot);\r\n\r\n return [annots, omittedAnnots];\r\n}\r\n\r\n/**\r\n * Basic client annotations, as in annotations-basic.html\r\n * and annotations-external.html\r\n */\r\nfunction addBasicClientAnnot(annots, annot, m, ideo) {\r\n annot.trackIndex = 0;\r\n if (!annot.color) {\r\n annot.color = ideo.config.annotationsColor;\r\n }\r\n if (!annot.shape) {\r\n annot.shape = 'triangle';\r\n }\r\n annots[m].annots.push(annot);\r\n\r\n return annots;\r\n}\r\n\r\nfunction addAnnot(annot, keys, ra, omittedAnnots, annots, m, ideo) {\r\n\r\n if (ideo.config.annotationTracks) {\r\n annots = addClientAnnot(annots, annot, ra, m, ideo);\r\n } else if (keys[3] === 'trackIndex' && ideo.numAvailTracks !== 1) {\r\n [annots, omittedAnnots] =\r\n addSparseServerAnnot(annot, ra, omittedAnnots, annots, m, ideo);\r\n // } else if (\r\n // keys.length > 3 &&\r\n // keys[3] in {trackIndex: 1, color: 1, shape: 1} === false &&\r\n // keys[4] === 'trackIndexOriginal'\r\n // ) {\r\n // annots = addDenseServerAnnot(keys, annots, annot, m);\r\n } else {\r\n annots = addBasicClientAnnot(annots, annot, m, ideo);\r\n }\r\n\r\n return [annots, omittedAnnots];\r\n}\r\n\r\nfunction getAnnotDomId(chrIndex, annotIndex) {\r\n return '_c' + chrIndex + '_a' + annotIndex;\r\n}\r\n\r\nfunction addAnnotsForChr(annots, omittedAnnots, annotsByChr, chrModel,\r\n m, keys, ideo) {\r\n var j, k, annot, ra;\r\n\r\n // Assign DOM ID if annots are rendered as individual DOM elements\r\n const shouldAssignDomId = (\r\n !ideo.config.annotationsLayout ||\r\n ideo.config.annotationsLayout === 'tracks'\r\n );\r\n\r\n for (j = 0; j < annotsByChr.annots.length; j++) {\r\n ra = annotsByChr.annots[j];\r\n annot = {};\r\n\r\n for (k = 0; k < keys.length; k++) {\r\n annot[keys[k]] = ra[k];\r\n }\r\n\r\n annot.stop = annot.start + annot.length;\r\n\r\n annot.chr = annotsByChr.chr;\r\n annot.chrIndex = m;\r\n annot.startPx = ideo.convertBpToPx(chrModel, annot.start);\r\n annot.stopPx = ideo.convertBpToPx(chrModel, annot.stop);\r\n annot.px = Math.round((annot.startPx + annot.stopPx) / 2);\r\n if (shouldAssignDomId) annot.domId = getAnnotDomId(m, j);\r\n\r\n [annots, omittedAnnots] =\r\n addAnnot(annot, keys, ra, omittedAnnots, annots, m, ideo);\r\n }\r\n\r\n if (shouldAssignDomId) {\r\n if (ideo.annotSortFunction) {\r\n annots[m].annots = setAnnotRanks(annots[m].annots, ideo);\r\n annots[m].annots.sort((a, b) => {\r\n // Reverse-sort, so first annots are drawn last, and thus at top layer\r\n return -ideo.annotSortFunction(a, b);\r\n });\r\n } else {\r\n // Sort by genomic position, in ascending order\r\n annots[m].annots.sort((a, b) => a[1] - b[1]);\r\n }\r\n\r\n for (j = 0; j < annots[m].annots.length; j++) {\r\n annots[m].annots[j].domId = getAnnotDomId(m, j);\r\n }\r\n }\r\n\r\n return [annots, omittedAnnots];\r\n}\r\n\r\nfunction warnOfUndefinedChromosome(annotsByChr) {\r\n console.warn(\r\n 'Chromosome \"' + annotsByChr.chr + '\" undefined in ideogram; ' +\r\n annotsByChr.annots.length + ' annotations not shown'\r\n );\r\n}\r\n\r\nfunction addAnnots(rawAnnots, keys, ideo) {\r\n var m, i, annotsByChr, chrModel,\r\n annots = [],\r\n omittedAnnots = {};\r\n\r\n m = -1;\r\n for (i = 0; i < rawAnnots.length; i++) {\r\n annotsByChr = rawAnnots[i];\r\n chrModel = ideo.chromosomes[ideo.config.taxid][annotsByChr.chr];\r\n\r\n if (typeof chrModel === 'undefined') {\r\n warnOfUndefinedChromosome(annotsByChr);\r\n continue;\r\n }\r\n\r\n m++;\r\n annots.push({chr: annotsByChr.chr, annots: []});\r\n\r\n if (ideo.config.annotationsLayout !== 'heatmap-2d') {\r\n [annots, omittedAnnots] =\r\n addAnnotsForChr(annots, omittedAnnots, annotsByChr, chrModel, m,\r\n keys, ideo);\r\n } else {\r\n [annots, omittedAnnots] =\r\n add2dAnnotsForChr(annots, omittedAnnots, annotsByChr, chrModel, m,\r\n keys, ideo);\r\n }\r\n }\r\n return [annots, omittedAnnots];\r\n}\r\n\r\nfunction sendTrackAndAnnotWarnings(omittedAnnots, ideo) {\r\n var numOmittedTracks,\r\n layout = ideo.config.annotationsLayout,\r\n numTracks = ideo.config.numAnnotTracks;\r\n\r\n if (!/heatmap/.test(layout) && numTracks > 10) {\r\n console.error(\r\n 'Ideogram only displays up to 10 tracks at a time. ' +\r\n 'You specified ' + numTracks + ' tracks. ' +\r\n 'Perhaps consider a different way to visualize your data.'\r\n );\r\n }\r\n\r\n numOmittedTracks = Object.keys(omittedAnnots).length;\r\n if (numOmittedTracks) {\r\n console.warn(\r\n 'Ideogram configuration specified ' + numTracks + ' tracks, ' +\r\n 'but loaded annotations contain ' + numOmittedTracks + ' ' +\r\n 'extra tracks.'\r\n );\r\n }\r\n}\r\n\r\n/**\r\n * Proccesses genome annotation data.\r\n *\r\n * This method converts raw annotation data from server, which is structured as\r\n * an array of arrays, into a more verbose data structure consisting of an\r\n * array of objects. It also adds pixel offset information.\r\n */\r\nfunction processAnnotData(rawAnnots) {\r\n var keys, annots, omittedAnnots,\r\n ideo = this;\r\n\r\n keys = rawAnnots.keys;\r\n rawAnnots = rawAnnots.annots;\r\n\r\n [annots, omittedAnnots] = addAnnots(rawAnnots, keys, ideo);\r\n annots = orderAnnotContainers(annots, ideo);\r\n\r\n sendTrackAndAnnotWarnings(omittedAnnots, ideo);\r\n\r\n return annots;\r\n}\r\n\r\nexport {processAnnotData, getAnnotDomId};\r\n","/**\r\n * @fileoverview Parse raw Ideogram.js annotations from an expression matrix.\r\n * This module handles dense gene expression matrixes.\r\n * In gene expression expressions, rows are genes and columns are cells.\r\n */\r\n\r\nexport class ExpressionMatrixParser {\r\n\r\n /**\r\n * @param {String} matrix Tab-delimited gene expression matrix\r\n * @param {Object} coordinates Coordinates [chr, start, length] by gene name\r\n * @param {Object} ideo Ideogram object\r\n */\r\n constructor(matrix, ideo) {\r\n this.matrix = matrix;\r\n this.ideo = ideo;\r\n }\r\n\r\n /**\r\n * Initialize rawAnnots by fetching genomic coordinates, then merging them\r\n * with the gene expression matrix supplied in constructor.\r\n */\r\n setRawAnnots() {\r\n var parser, ideo, matrix;\r\n parser = this;\r\n ideo = this.ideo;\r\n matrix = this.matrix;\r\n\r\n return new Promise(function(resolve) {\r\n parser.rawAnnots = parser.fetchCoordinates(ideo)\r\n .then(function(coordinates) {\r\n parser.coordinates = coordinates;\r\n resolve(parser.parseExpressionMatrix(matrix, ideo));\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Get chromosome, start and stop coordinates from genome annotation file\r\n *\r\n * TODO: Support non-human organisms\r\n */\r\n fetchCoordinates(ideo) {\r\n var coordinates = {};\r\n\r\n if (ideo.config.organism === 'human') {\r\n var ensemblData =\r\n ideo.config.dataDir +\r\n '../../annotations/Homo_sapiens,_Ensembl_80.tsv';\r\n\r\n return new Promise(function(resolve) {\r\n ideo.fetch(ensemblData, 'text').then(function(data) {\r\n // eslint-disable-next-line no-unused-vars\r\n var tsvLines, i, start, stop, gene, chr, length;\r\n\r\n tsvLines = data.split(/\\r\\n|\\n/).slice(1);\r\n for (i = 0; i < tsvLines.length; i++) {\r\n [start, stop, gene, , chr] = tsvLines[i].split(/\\s/g);\r\n start = parseInt(start);\r\n stop = parseInt(stop);\r\n length = stop - start;\r\n coordinates[gene] = [chr, start, length];\r\n }\r\n resolve(coordinates);\r\n });\r\n });\r\n } else {\r\n throw Error('Expression matrix parsing is only supported for human');\r\n }\r\n }\r\n\r\n /**\r\n * Parses an annotation from a tab-separated line of a matrix file\r\n */\r\n parseAnnotFromTsvLine(tsvLine, chrs) {\r\n var annot, chrIndex, chr, start, gene, expressions,\r\n columns = tsvLine.split(/\\s/g);\r\n\r\n gene = columns[0];\r\n if (gene in this.coordinates === false) return [null, null];\r\n\r\n expressions = columns.slice(1).map(d => parseFloat(d));\r\n [chr, start, length] = this.coordinates[gene];\r\n\r\n chrIndex = chrs.indexOf(chr);\r\n if (chrIndex === -1) return [null, null];\r\n\r\n annot = [gene, start, length];\r\n annot = annot.concat(expressions);\r\n\r\n return [chrIndex, annot];\r\n }\r\n\r\n /**\r\n * Parses a gene expression matrix file, returns raw annotations\r\n */\r\n parseExpressionMatrix(matrix, ideo) {\r\n var i, chrs, rawAnnots, cells, line, chrIndex, annot, keys,\r\n annots = [],\r\n tsvLines = matrix.split(/\\r\\n|\\n/);\r\n\r\n chrs = Object.keys(ideo.chromosomes[ideo.config.taxid]);\r\n for (i = 0; i < chrs.length; i++) {\r\n annots.push({chr: chrs[i], annots: []});\r\n }\r\n\r\n for (i = 1; i < tsvLines.length; i++) {\r\n line = tsvLines[i];\r\n [chrIndex, annot] = this.parseAnnotFromTsvLine(line, chrs);\r\n if (chrIndex !== null) annots[chrIndex].annots.push(annot);\r\n }\r\n\r\n cells = tsvLines[0].split(/\\s/g);\r\n keys = ['name', 'start', 'length'].concat(cells);\r\n rawAnnots = {keys: keys, annots: annots};\r\n\r\n return rawAnnots;\r\n }\r\n\r\n}\r\n","function downloadAnnotations() {\r\n\r\n const ideo = this;\r\n const annots = {};\r\n\r\n ideo.annots.forEach(chrAnnots => {\r\n chrAnnots.annots.forEach(annot => {\r\n const desc = ideo.annotDescriptions.annots[annot.name];\r\n\r\n annots[annot.name] = [\r\n annot.name, desc.ensemblId,\r\n annot.chr, annot.start, annot.stop, annot.length,\r\n desc.type\r\n ];\r\n });\r\n });\r\n\r\n const header = [\r\n '# Gene name', 'Ensembl ID', 'Chromosome', 'Start', 'Stop', 'Length', 'Type'\r\n ];\r\n const rows = [header].concat(Object.values(annots));\r\n const annotsTsv =\r\n ideo.annotDescriptions.headers + '\\n#\\n' +\r\n rows.map(row => row.join('\\t')).join('\\n');\r\n\r\n const annotsHref =\r\n 'data:text/plain;charset=utf-8,' + encodeURIComponent(annotsTsv);\r\n\r\n var evt = new MouseEvent('click', {\r\n view: window,\r\n bubbles: false,\r\n cancelable: true\r\n });\r\n\r\n var a = document.createElement('a');\r\n a.setAttribute('download', 'ideogram.tsv');\r\n a.setAttribute('href', annotsHref);\r\n a.setAttribute('target', '_blank');\r\n\r\n // Enables easy testing\r\n a.setAttribute('id', '_ideo-undisplayed-dl-annots-link');\r\n a.setAttribute('style', 'display: none;');\r\n document.body.appendChild(a);\r\n\r\n a.dispatchEvent(evt);\r\n}\r\n\r\nexport {downloadAnnotations};\r\n","/**\r\n * @fileoverview Methods for ideogram annotations.\r\n * Annotations are graphical objects that represent features of interest\r\n * located on the chromosomes, e.g. genes or variations. They can\r\n * appear beside a chromosome, overlaid on top of it, or between multiple\r\n * chromosomes.\r\n */\r\n\r\nimport {BedParser} from '../parsers/bed-parser';\r\nimport {TsvParser} from '../parsers/tsv-parser';\r\nimport {drawHeatmaps, deserializeAnnotsForHeatmap} from './heatmap';\r\nimport {inflateThresholds} from './heatmap-lib';\r\nimport {inflateHeatmaps} from './heatmap-collinear';\r\nimport {\r\n onLoadAnnots, onDrawAnnots, startHideAnnotTooltipTimeout,\r\n onWillShowAnnotTooltip, showAnnotTooltip, onClickAnnot\r\n} from './events';\r\n\r\nimport {\r\n addAnnotLabel, removeAnnotLabel, fillAnnotLabels, clearAnnotLabels\r\n // fadeOutAnnotLabels\r\n} from './labels';\r\n\r\nimport {drawAnnots, drawProcessedAnnots} from './draw';\r\nimport {getHistogramBars} from './histogram';\r\nimport {drawSynteny} from './synteny';\r\nimport {\r\n restoreDefaultTracks, setOriginalTrackIndexes, updateDisplayedTracks\r\n} from './filter';\r\nimport {processAnnotData} from './process';\r\nimport {ExpressionMatrixParser} from '../parsers/expression-matrix-parser';\r\nimport {downloadAnnotations} from './download';\r\n\r\nfunction initNumTracksAndBarWidth(ideo, config) {\r\n\r\n if (config.annotationTracks) {\r\n ideo.config.numAnnotTracks = config.annotationTracks.length;\r\n } else if (config.annotationsNumTracks) {\r\n ideo.config.numAnnotTracks = config.annotationsNumTracks;\r\n } else {\r\n ideo.config.numAnnotTracks = 1;\r\n }\r\n ideo.config.annotTracksHeight =\r\n config.annotationHeight * config.numAnnotTracks;\r\n\r\n if (typeof config.barWidth === 'undefined') {\r\n ideo.config.barWidth = 3;\r\n }\r\n}\r\n\r\nfunction initTooltip(ideo, config) {\r\n if (config.showAnnotTooltip !== false) {\r\n ideo.config.showAnnotTooltip = true;\r\n }\r\n\r\n if (config.onWillShowAnnotTooltip) {\r\n ideo.onWillShowAnnotTooltipCallback = config.onWillShowAnnotTooltip;\r\n }\r\n}\r\n\r\nfunction initAnnotLabel(ideo, config) {\r\n if (config.addAnnotLabel !== false) {\r\n ideo.config.addAnnotLabel = true;\r\n }\r\n\r\n if (config.onWillAddAnnotLabel) {\r\n ideo.onWillAddAnnotLabelCallback = config.onWillAddAnnotLabel;\r\n }\r\n}\r\n\r\nfunction initAnnotHeight(ideo) {\r\n var config = ideo.config;\r\n var annotHeight;\r\n\r\n if (!config.annotationHeight) {\r\n if (config.annotationsLayout === 'heatmap') {\r\n annotHeight = config.chrWidth - 1;\r\n } else {\r\n annotHeight = Math.round(config.chrHeight / 100);\r\n if (annotHeight < 3) annotHeight = 3;\r\n }\r\n ideo.config.annotationHeight = annotHeight;\r\n }\r\n}\r\n\r\n/**\r\n * Initializes various annotation settings. Constructor help function.\r\n */\r\nfunction initAnnotSettings() {\r\n var ideo = this,\r\n config = ideo.config;\r\n\r\n initAnnotHeight(ideo);\r\n\r\n if (\r\n config.annotationsPath || config.localAnnotationsPath ||\r\n ideo.annots || config.annotations\r\n ) {\r\n initNumTracksAndBarWidth(ideo, config);\r\n } else {\r\n ideo.config.annotTracksHeight = 0;\r\n ideo.config.numAnnotTracks = 0;\r\n }\r\n\r\n if (typeof config.annotationsColor === 'undefined') {\r\n ideo.config.annotationsColor = '#F00';\r\n }\r\n\r\n if (config.onClickAnnot) {\r\n ideo.onClickAnnotCallback = config.onClickAnnot;\r\n }\r\n\r\n initTooltip(ideo, config);\r\n initAnnotLabel(ideo, config);\r\n}\r\n\r\nfunction validateAnnotsUrl(annotsUrl) {\r\n var tmp, extension;\r\n\r\n tmp = annotsUrl.split('?')[0].split('.');\r\n extension = tmp[tmp.length - 1];\r\n\r\n if (['bed', 'json', 'tsv'].includes(extension) === false) {\r\n extension = extension.toUpperCase();\r\n alert(\r\n 'Ideogram.js only supports BED and Ideogram JSON and TSV ' +\r\n 'at the moment. ' +\r\n 'Sorry, check back soon for ' + extension + ' support!'\r\n );\r\n return;\r\n }\r\n return extension;\r\n}\r\n\r\n/** Find redundant chromosomes in raw annotations */\r\nfunction detectDuplicateChrsInRawAnnots(ideo) {\r\n const seen = {};\r\n const duplicates = [];\r\n const chrs = ideo.rawAnnots.annots.map(annot => annot.chr);\r\n\r\n chrs.forEach((chr) => {\r\n if (chr in seen) duplicates.push(chr);\r\n seen[chr] = 1;\r\n });\r\n\r\n if (duplicates.length > 0) {\r\n const message =\r\n `Duplicate chromosomes detected.\\n` +\r\n `Chromosome list: ${chrs}. Duplicates: ${duplicates}.\\n` +\r\n `To fix this, edit your raw annotations JSON data to remove redundant ` +\r\n `chromosomes.`;\r\n throw Error(message);\r\n }\r\n}\r\n\r\nfunction afterRawAnnots() {\r\n var ideo = this,\r\n config = ideo.config;\r\n\r\n // Ensure annots are ordered by chromosome\r\n ideo.rawAnnots.annots = ideo.rawAnnots.annots.sort(Ideogram.sortChromosomes);\r\n\r\n if (ideo.onLoadAnnotsCallback) {\r\n ideo.onLoadAnnotsCallback();\r\n }\r\n\r\n if (\r\n 'heatmapThresholds' in config ||\r\n 'metadata' in ideo.rawAnnots &&\r\n 'heatmapThresholds' in ideo.rawAnnots.metadata\r\n ) {\r\n if (config.annotationsLayout === 'heatmap') {\r\n inflateHeatmaps(ideo);\r\n } else if (config.annotationsLayout === 'heatmap-2d') {\r\n ideo.config.heatmapThresholds = inflateThresholds(ideo);\r\n }\r\n }\r\n\r\n if (config.heatmaps) {\r\n ideo.deserializeAnnotsForHeatmap(ideo.rawAnnots);\r\n }\r\n\r\n detectDuplicateChrsInRawAnnots(ideo);\r\n}\r\n\r\n/**\r\n * Converts list of annotation-by-chromosome objects to list of annot objects\r\n */\r\nfunction flattenAnnots() {\r\n const ideo = this;\r\n return ideo.annots.reduce((accumulator, annots) => {\r\n return [...accumulator, ...annots.annots];\r\n }, []);\r\n}\r\n\r\n/**\r\n * Requests annotations URL via HTTP, sets ideo.rawAnnots for downstream\r\n * processing.\r\n *\r\n * @param annotsUrl Absolute or relative URL for native or BED annotations file\r\n */\r\nfunction fetchAnnots(annotsUrl) {\r\n var extension, is2dHeatmap,\r\n ideo = this,\r\n config = ideo.config;\r\n\r\n is2dHeatmap = config.annotationsLayout === 'heatmap-2d';\r\n\r\n var extension = validateAnnotsUrl(annotsUrl);\r\n\r\n if (annotsUrl.slice(0, 4) !== 'http' && !is2dHeatmap && extension !== 'tsv') {\r\n ideo.fetch(annotsUrl)\r\n .then(function(data) {\r\n ideo.rawAnnotsResponse = data; // Preserve truly raw response content\r\n ideo.rawAnnots = data; // Sometimes gets partially processed\r\n ideo.afterRawAnnots();\r\n });\r\n return;\r\n }\r\n\r\n extension = (is2dHeatmap ? '' : extension);\r\n\r\n ideo.fetch(annotsUrl, 'text')\r\n .then(function(text) {\r\n ideo.rawAnnotsResponse = text;\r\n if (is2dHeatmap) {\r\n var parser = new ExpressionMatrixParser(text, ideo);\r\n parser.setRawAnnots().then(function(d) {\r\n ideo.rawAnnots = d;\r\n ideo.afterRawAnnots();\r\n });\r\n } else {\r\n if (extension === 'tsv') {\r\n ideo.rawAnnots = new TsvParser(text, ideo).rawAnnots;\r\n } else if (extension === 'bed') {\r\n ideo.rawAnnots = new BedParser(text, ideo).rawAnnots;\r\n } else {\r\n ideo.rawAnnots = JSON.parse(text);\r\n }\r\n ideo.afterRawAnnots();\r\n }\r\n });\r\n}\r\n\r\n/**\r\n * Fills out annotations data structure such that its top-level list of arrays\r\n * matches that of this ideogram's chromosomes list in order and number\r\n * Fixes https://github.com/eweitz/ideogram/issues/66\r\n */\r\nfunction fillAnnots(annots) {\r\n var filledAnnots, chrs, chrArray, i, chr, annot, chrIndex;\r\n\r\n filledAnnots = [];\r\n chrs = [];\r\n chrArray = this.chromosomesArray;\r\n\r\n for (i = 0; i < chrArray.length; i++) {\r\n chr = chrArray[i].name;\r\n chrs.push(chr);\r\n filledAnnots.push({chr: chr, annots: []});\r\n }\r\n\r\n for (i = 0; i < annots.length; i++) {\r\n annot = annots[i];\r\n chrIndex = chrs.indexOf(annot.chr);\r\n if (chrIndex !== -1) {\r\n filledAnnots[chrIndex] = annot;\r\n }\r\n }\r\n\r\n return filledAnnots;\r\n}\r\n\r\nexport function applyRankCutoff(annots, cutoff, ideo) {\r\n const rankedAnnots = sortAnnotsByRank(annots, ideo);\r\n\r\n // Take the top N ranked genes, where N is `cutoff`\r\n annots = rankedAnnots.slice(0, cutoff);\r\n\r\n return annots;\r\n}\r\n\r\nexport function setAnnotRanks(annots, ideo) {\r\n if ('geneCache' in ideo === false) return annots;\r\n\r\n const ranks = ideo.geneCache.interestingNames;\r\n\r\n return annots.map(annot => {\r\n if (ranks.includes(annot.name)) {\r\n annot.rank = ranks.indexOf(annot.name) + 1;\r\n } else {\r\n annot.rank = 1E10;\r\n }\r\n return annot;\r\n });\r\n}\r\n\r\nexport function sortAnnotsByRank(annots, ideo) {\r\n\r\n if (ideo) {\r\n annots = setAnnotRanks(annots, ideo);\r\n }\r\n // Ranks annots by popularity\r\n return annots.sort((a, b) => {\r\n\r\n // // Search gene is most important, regardless of popularity\r\n // if (a.color === 'red') return -1;\r\n // if (b.color === 'red') return 1;\r\n\r\n // Rank 3 is more important than rank 30\r\n return a.rank - b.rank;\r\n });\r\n}\r\n\r\nexport {\r\n onLoadAnnots, onDrawAnnots, processAnnotData, restoreDefaultTracks,\r\n updateDisplayedTracks, initAnnotSettings, fetchAnnots, drawAnnots,\r\n getHistogramBars, drawHeatmaps, deserializeAnnotsForHeatmap, fillAnnots,\r\n drawProcessedAnnots, drawSynteny, startHideAnnotTooltipTimeout,\r\n showAnnotTooltip, onWillShowAnnotTooltip, setOriginalTrackIndexes,\r\n afterRawAnnots, onClickAnnot, downloadAnnotations, addAnnotLabel,\r\n removeAnnotLabel, fillAnnotLabels, clearAnnotLabels, flattenAnnots\r\n // fadeOutAnnotLabels\r\n};\r\n","/** Adds boxes behind a list of chromosomes; can indicate selection, etc. */\r\nfunction highlight(chrNames, color='red') {\r\n const ideo = this;\r\n const taxid = ideo.config.taxid;\r\n\r\n const highlightsHtml = chrNames.map(chrName => {\r\n const chrId = ideo.chromosomes[taxid][chrName].id;\r\n const chrSet = `${ideo.selector} #${chrId}-chromosome-set`;\r\n const chrDom = document.querySelector(chrSet);\r\n const rect = chrDom.getBoundingClientRect();\r\n\r\n const style = `style=\"\r\n stroke-width: 1px;\r\n stroke: ${color};\r\n fill: ${color};\r\n fill-opacity: 0.05;\r\n position: absolute;\r\n rx: 4;\r\n ry: 4;\r\n height: ${rect.width + 15}px;\r\n width: ${rect.height + 15}px\"`;\r\n\r\n const left = chrDom.transform.baseVal[1].matrix.f - 7.5;\r\n const transform = `transform=\"rotate(90) translate(10, ${left})\"`;\r\n const id = `id=\"ideo-highlight-${chrId}\"`;\r\n\r\n return ``;\r\n }).join();\r\n\r\n const ideoDom = document.querySelector(ideo.selector);\r\n ideoDom.insertAdjacentHTML('afterBegin', highlightsHtml);\r\n}\r\n\r\n/** Removes highlight from a list of chromosomes (or all chromosomes) */\r\nfunction unhighlight(chrNames) {\r\n const ideo = this;\r\n\r\n let highlightsSelector = `${ideo.selector} .ideo-highlight`;\r\n if (typeof chrNames !== 'undefined') {\r\n const taxid = ideo.config.taxid;\r\n highlightsSelector = chrNames.map(chrName => {\r\n const chrId = ideo.chromosomes[taxid][chrName].id;\r\n return `${ideo.selector} #ideo-highlight-${chrId}`;\r\n });\r\n }\r\n\r\n document.querySelectorAll(highlightsSelector).forEach((element) => {\r\n element.remove();\r\n });\r\n\r\n}\r\n\r\nexport {highlight, unhighlight};\r\n","import {d3, slug, fetchWithRetry} from '../lib';\r\n\r\n/**\r\n * Returns NCBI Taxonomy identifier (taxid) for organism name\r\n */\r\nfunction getTaxidFromEutils(orgName, ideo) {\r\n var taxonomySearch, taxid;\r\n\r\n taxonomySearch = ideo.esearch + '&db=taxonomy&term=' + orgName;\r\n\r\n return d3.json(taxonomySearch).then(function(data) {\r\n var idlist = data.esearchresult.idlist;\r\n if (idlist.length === 0) {\r\n var warning =\r\n 'Organism \"' + orgName + '\" is generally unknown; it was not found ' +\r\n 'in the NCBI Taxonomy database. If you did not intend to specify a ' +\r\n 'novel or custom taxon, then try using the organism\\'s ' +\r\n 'scientific name, e.g. Homo sapiens or Arabidopsis thaliana.';\r\n throw warning;\r\n } else {\r\n taxid = data.esearchresult.idlist[0];\r\n return [orgName, taxid];\r\n }\r\n });\r\n}\r\n\r\n/**\r\n * Returns organism common name given an NCBI Taxonomy ID\r\n *\r\n * @param taxid NCBI Taxonomy ID\r\n * @param callback Function to call upon completing ESearch request\r\n */\r\nfunction getOrganismFromEutils(taxid, callback) {\r\n var organism, taxonomySearch,\r\n ideo = this;\r\n\r\n taxid = ideo.config.organism;\r\n\r\n taxonomySearch = ideo.esummary + '&db=taxonomy&id=' + taxid;\r\n\r\n d3.json(taxonomySearch).then(function(data) {\r\n organism = data.result[String(taxid)].commonname;\r\n ideo.config.organism = organism;\r\n return callback(organism);\r\n });\r\n}\r\n\r\nfunction setTaxidData(taxid, ideo) {\r\n\r\n var dataDir, urlOrg, taxids;\r\n\r\n if (ideo.assemblyIsAccession()) {\r\n return new Promise(function(resolve) {\r\n ideo.coordinateSystem = 'bp';\r\n ideo.getAssemblyAndChromosomesFromEutils(taxid, resolve);\r\n });\r\n }\r\n\r\n dataDir = ideo.config.dataDir;\r\n urlOrg = slug(ideo.organisms[taxid].scientificName);\r\n\r\n taxids = [taxid];\r\n\r\n var fullyBandedTaxids = ['9606', '10090', '10116'];\r\n if (fullyBandedTaxids.includes(taxid) && !ideo.config.showFullyBanded) {\r\n urlOrg += '-no-bands';\r\n }\r\n var chromosomesUrl = dataDir + urlOrg + '.json';\r\n\r\n var promise2 = new Promise((resolve, reject) => {\r\n return fetchWithRetry(chromosomesUrl)\r\n .then(response => {\r\n return response.json().then(function(json) {\r\n resolve(json);\r\n });\r\n })\r\n .catch((errorMessage) => {\r\n reject(errorMessage);\r\n });\r\n });\r\n\r\n return promise2\r\n .then(function(chrData) {\r\n // Check if chromosome data exists locally.\r\n // This is used for pre-processed centromere data,\r\n // which is not accessible via EUtils. See get_chromosomes.py.\r\n var chrBands = chrData.chrBands\r\n\r\n var asmAndChrTaxidsArray = [''],\r\n chromosomes = [],\r\n seenChrs = {},\r\n chr, maxLength, splitBand, length;\r\n\r\n ideo.bandData[chrData.taxid] = chrBands;\r\n\r\n for (var i = 0; i < chrBands.length; i++) {\r\n splitBand = chrBands[i].split(' ');\r\n chr = splitBand[0];\r\n length = splitBand.slice(-1)[0];\r\n if (chr in seenChrs) {\r\n continue;\r\n } else {\r\n chromosomes.push({name: chr, type: 'nuclear', length: length});\r\n seenChrs[chr] = 1;\r\n }\r\n }\r\n chromosomes = chromosomes.sort(Ideogram.sortChromosomes);\r\n maxLength = {bp: 0, iscn: 0};\r\n chromosomes.forEach(chr => {\r\n if (chr.length > maxLength.bp) maxLength.bp = chr.length;\r\n });\r\n ideo.maxLength[taxid] = maxLength;\r\n asmAndChrTaxidsArray.push(chromosomes);\r\n asmAndChrTaxidsArray.push(taxids);\r\n return asmAndChrTaxidsArray;\r\n },\r\n function() {\r\n // If request in `then` errs (404), fetch data from EUtils\r\n return new Promise(function(resolve) {\r\n ideo.coordinateSystem = 'bp';\r\n ideo.getAssemblyAndChromosomesFromEutils(taxid, resolve);\r\n });\r\n });\r\n}\r\n\r\nfunction setAssemblyAndChromosomes(taxid, resolve, ideo) {\r\n var assembly, chrs, originalChrs, orgName, filteredChrs,\r\n config = ideo.config;\r\n\r\n setTaxidData(taxid, ideo)\r\n .then(function(asmChrTaxidsArray) {\r\n assembly = asmChrTaxidsArray[0];\r\n chrs = asmChrTaxidsArray[1];\r\n\r\n if ('chromosomes' in config === false || config.chromosomes === null) {\r\n ideo.config.chromosomes = {};\r\n ideo.config.chromosomes[taxid] = chrs;\r\n } else {\r\n if (config.multiorganism) {\r\n if (taxid in config.chromosomes) {\r\n // Encountered when either organism has centromere data\r\n originalChrs = config.chromosomes[taxid];\r\n } else {\r\n // Encountered when neither organism has centromere data\r\n orgName = slug(ideo.getScientificName(taxid));\r\n ideo.config.chromosomes[taxid] =\r\n config.chromosomes[orgName].slice();\r\n originalChrs = ideo.config.chromosomes[taxid];\r\n // delete ideo.config.chromosomes[orgName];\r\n }\r\n } else {\r\n originalChrs = config.chromosomes;\r\n }\r\n\r\n filteredChrs = chrs.filter(d => originalChrs.includes(d.name));\r\n ideo.config.chromosomes[taxid] = filteredChrs;\r\n }\r\n ideo.chromosomes[taxid] = ideo.config.chromosomes[taxid].slice();\r\n ideo.organisms[taxid].assemblies = {\r\n default: assembly\r\n };\r\n resolve();\r\n });\r\n}\r\n\r\n/**\r\n * Determine if organism is natively supported, using its name.\r\n */\r\nfunction isOrganismSupported(org, ideo) {\r\n var taxid, ideoOrg;\r\n\r\n for (taxid in ideo.organisms) {\r\n ideoOrg = ideo.organisms[taxid];\r\n if (\r\n taxid === slug(org) ||\r\n slug(ideoOrg.commonName) === slug(org) ||\r\n slug(ideoOrg.scientificName) === slug(org)\r\n ) {\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n}\r\n\r\n/**\r\n * Augment \"organisms\" metadata with for any requested organism that is\r\n * not natively supported (i.e., not in organism-metadata.js).\r\n*/\r\nfunction populateNonNativeOrg(orgs, ideo) {\r\n var org, promise, i,\r\n getTaxidFromEutilsPromises = [],\r\n augmentedOrganismMetadata = {};\r\n\r\n for (i = 0; i < orgs.length; i++) {\r\n org = orgs[i];\r\n if (isOrganismSupported(org, ideo) === false) {\r\n promise = getTaxidFromEutils(org, ideo)\r\n .then(function(orgNameAndTaxid) {\r\n\r\n var taxid = orgNameAndTaxid[1],\r\n orgName = orgNameAndTaxid[0],\r\n name, scientificName;\r\n\r\n name = orgName.replace('-', ' ');\r\n scientificName = name[0].toUpperCase() + name.slice(1);\r\n\r\n augmentedOrganismMetadata[taxid] = {\r\n scientificName: scientificName,\r\n commonName: '',\r\n assemblies: {default: ''}\r\n };\r\n\r\n Object.assign(ideo.organisms, augmentedOrganismMetadata);\r\n }, function(warning) {\r\n console.warn(warning);\r\n var customMetadata = {\r\n scientificName: org,\r\n commonName: org,\r\n assemblies: {default: ''}\r\n };\r\n\r\n // Use a negative number as unofficial taxid for custom organism.\r\n // Use case: https://github.com/eweitz/ideogram/issues/265\r\n //\r\n // If support for *multiple* custom specifies is ever\r\n // needed, we can decrement from -1.\r\n ideo.organisms['-1'] = customMetadata;\r\n augmentedOrganismMetadata['-1'] = customMetadata;\r\n });\r\n } else {\r\n promise = new Promise(function(resolve) {\r\n var taxid = ideo.getTaxid(org);\r\n augmentedOrganismMetadata[taxid] = ideo.organisms[taxid];\r\n resolve();\r\n });\r\n }\r\n getTaxidFromEutilsPromises.push(promise);\r\n }\r\n\r\n return Promise.all(getTaxidFromEutilsPromises).then(function() {\r\n return augmentedOrganismMetadata;\r\n });\r\n}\r\n\r\nfunction prepareTmpChrsAndTaxids(ideo) {\r\n var orgs, taxids, tmpChrs, org, taxid, chrsOrgSlugs,\r\n config = ideo.config;\r\n\r\n taxids = [];\r\n tmpChrs = {};\r\n orgs = (config.multiorganism) ? config.organism : [config.organism];\r\n\r\n return populateNonNativeOrg(orgs, ideo).then(function(orgMetadata) {\r\n var orgFields = orgMetadata[taxid];\r\n\r\n for (taxid in orgMetadata) {\r\n orgFields = orgMetadata[taxid];\r\n taxids.push(taxid);\r\n if (config.multiorganism) {\r\n if (typeof config.chromosomes !== 'undefined') {\r\n chrsOrgSlugs = Object.keys(config.chromosomes).map(org => slug(org));\r\n // Adjusts 'chromosomes' configuration parameter to make object\r\n // keys use taxid instead of common organism name\r\n if (chrsOrgSlugs.includes(slug(orgFields.scientificName))) {\r\n org = orgFields.scientificName;\r\n } else if (chrsOrgSlugs.includes(slug(orgFields.commonName))) {\r\n org = orgFields.commonName;\r\n }\r\n if (slug(org) in config.chromosomes) {\r\n tmpChrs[taxid] = config.chromosomes[slug(org)];\r\n } else {\r\n tmpChrs[taxid] = config.chromosomes[org.toLowerCase()];\r\n }\r\n } else {\r\n tmpChrs = null;\r\n }\r\n }\r\n }\r\n return [tmpChrs, taxids];\r\n });\r\n}\r\n\r\n/**\r\n * Sort taxids by the \"organism\" configuration option\r\n *\r\n * TODO: Handle taxid being passed as organism\r\n */\r\nfunction sortTaxidsByOriginalOrganismOption(ideo) {\r\n var configOrganisms, sortedTaxids, i;\r\n configOrganisms = ideo.config.organism;\r\n sortedTaxids = [];\r\n if (Array.isArray(configOrganisms)) {\r\n // Handling multi-organism ideogram\r\n for (i = 0; i < configOrganisms.length; i++) {\r\n sortedTaxids.push(ideo.getTaxid(configOrganisms[i]));\r\n }\r\n } else {\r\n // Handling single-organism ideogram\r\n sortedTaxids.push(ideo.getTaxid(configOrganisms));\r\n }\r\n return sortedTaxids;\r\n}\r\n\r\nfunction getTaxidsForOrganismsInConfig(callback, ideo) {\r\n\r\n prepareTmpChrsAndTaxids(ideo).then(function([tmpChrs, taxids]) {\r\n var i, taxid, promise, assemblies, asmAccs,\r\n config = ideo.config,\r\n asmAndChrPromises = [];\r\n\r\n for (i = 0; i < taxids.length; i++) {\r\n taxid = taxids[i];\r\n assemblies = ideo.organisms[taxid].assemblies;\r\n asmAccs = Object.values(assemblies);\r\n if (\r\n assemblies.default === '' ||\r\n ideo.assemblyIsAccession() && !asmAccs.includes(config.assembly)\r\n ) {\r\n promise = new Promise(function(resolve) {\r\n setAssemblyAndChromosomes(taxid, resolve, ideo);\r\n });\r\n } else {\r\n ideo.config.taxids = taxids;\r\n if (ideo.config.multiorganism) {\r\n ideo.config.chromosomes = tmpChrs;\r\n }\r\n promise = new Promise(function(resolve) {\r\n resolve();\r\n });\r\n }\r\n\r\n asmAndChrPromises.push(promise);\r\n }\r\n\r\n Promise.all(asmAndChrPromises).then(function() {\r\n taxids = sortTaxidsByOriginalOrganismOption(ideo);\r\n ideo.config.taxids = taxids;\r\n return callback(taxids);\r\n });\r\n });\r\n}\r\n\r\nfunction getIsMultiorganism(taxidInit, ideo) {\r\n return (\r\n ('organism' in ideo.config && ideo.config.organism instanceof Array) ||\r\n (taxidInit && ideo.config.taxid instanceof Array)\r\n );\r\n}\r\n\r\n/**\r\n * Configure Ideogram taxids when 'organism' is not in ideo.config\r\n */\r\nfunction getTaxidsForOrganismsNotInConfig(taxidInit, callback, ideo) {\r\n var taxids;\r\n\r\n if (ideo.config.multiorganism) {\r\n if (taxidInit) {\r\n taxids = ideo.config.taxid;\r\n }\r\n } else {\r\n if (taxidInit) {\r\n taxids = [ideo.config.taxid];\r\n }\r\n ideo.config.taxids = taxids;\r\n }\r\n callback(taxids);\r\n}\r\n\r\n/**\r\n * Returns an array of taxids for the current ideogram\r\n * Also sets configuration parameters related to taxid(s), whether ideogram is\r\n * multiorganism, and adjusts chromosomes parameters as needed\r\n **/\r\nfunction getTaxids(callback) {\r\n var taxidInit,\r\n ideo = this;\r\n\r\n taxidInit = 'taxid' in ideo.config;\r\n\r\n ideo.config.multiorganism = getIsMultiorganism(taxidInit, ideo);\r\n\r\n if (ideo.config.multiorganism) ideo.coordinateSystem = 'bp';\r\n\r\n if ('organism' in ideo.config) {\r\n const org = ideo.config.organism;\r\n if (typeof org === 'string') {\r\n // Canonicalize e.g. \"Homo sapiens\" to \"homo-sapiens\"\r\n ideo.config.organism = slug(org.toLowerCase());\r\n }\r\n\r\n getTaxidsForOrganismsInConfig(callback, ideo);\r\n } else {\r\n getTaxidsForOrganismsNotInConfig(taxidInit, callback, ideo);\r\n }\r\n}\r\n\r\nexport {\r\n getTaxids, getOrganismFromEutils\r\n};\r\n","import {d3} from '../lib';\r\nimport {\r\n esearch, esummary, elink, getAssemblySearchUrl\r\n} from './eutils-config.js';\r\nimport {\r\n getTaxids, getOrganismFromEutils\r\n} from './organisms.js';\r\n\r\n/**\r\n * Get a URL to ESearch the NCBI Nucleotide DB for an Assembly UID\r\n */\r\nfunction getESearchUrlForChromosomes(asmUid, ideo) {\r\n var qs;\r\n\r\n // Get a list of IDs for the chromosomes in this genome.\r\n //\r\n // Query chromosomes sequences in Nucleotide DB (nuccore) via\r\n // Assembly DB E-Utils link.\r\n qs = ('&db=nuccore&dbfrom=assembly&linkname=assembly_nuccore&' +\r\n 'cmd=neighbor_history&from_uid=' + asmUid);\r\n\r\n return d3.json(ideo.elink + qs)\r\n .then(function(data) {\r\n var webenv = data.linksets[0].webenv;\r\n qs =\r\n '&db=nuccore' +\r\n '&term=%231+AND+%28' +\r\n 'sequence_from_chromosome[Properties]+OR+' +\r\n 'sequence_from_plastid[Properties]+OR+' +\r\n 'sequence_from_mitochondrion[Properties]%29' +\r\n '&WebEnv=' + webenv + '&usehistory=y&retmax=1000';\r\n return ideo.esearch + qs;\r\n });\r\n}\r\n\r\n/**\r\n * Request basic data on a list of chromosome IDs from ESearch\r\n */\r\nfunction fetchNucleotideSummary(data, ideo) {\r\n var ids, ntSummary;\r\n ids = data.esearchresult.idlist.join(',');\r\n ntSummary = ideo.esummary + '&db=nucleotide&id=' + ids;\r\n return d3.json(ntSummary);\r\n}\r\n\r\n/**\r\n * Get name and type for mitochondrial chromosome\r\n *\r\n * See example of \"MT\" in yeast:\r\n * https://eweitz.github.io/ideogram/eukaryotes?org=saccharomyces-cerevisiae\r\n */\r\nfunction parseMitochondrion(result, ideo) {\r\n var type, cnIndex, chrName;\r\n\r\n if (ideo.config.showNonNuclearChromosomes) {\r\n type = result.genome;\r\n cnIndex = result.subtype.split('|').indexOf('plasmid');\r\n if (cnIndex === -1) {\r\n chrName = 'MT';\r\n } else {\r\n // Seen in e.g. rice genome IRGSP-1.0 (GCF_001433935.1),\r\n // From https://eutils.ncbi.nlm.nih.gov/entrez/eutils/esummary.fcgi?retmode=json&db=nucleotide&id=996703432,996703431,996703430,996703429,996703428,996703427,996703426,996703425,996703424,996703423,996703422,996703421,194033210,11466763,7524755\r\n // genome: 'mitochondrion',\r\n // subtype: 'cell_line|plasmid',\r\n // subname: 'A-58 CMS|B1',\r\n chrName = result.subname.split('|')[cnIndex];\r\n }\r\n } else {\r\n return [null, null];\r\n }\r\n\r\n return [chrName, type];\r\n}\r\n\r\n/**\r\n * Get name and type for chloroplastic chromosome.\r\n *\r\n * Plants have chloroplasts. See e.g. green algae:\r\n * https://eweitz.github.io/ideogram/eukaryotes?org=micromonas-commoda\r\n */\r\nfunction parseChloroplastOrPlastid(ideo) {\r\n // Plastid encountered with rice genome IRGSP-1.0 (GCF_001433935.1)\r\n if (ideo.config.showNonNuclearChromosomes) {\r\n return ['CP', 'chloroplast'];\r\n }\r\n return [null, null];\r\n}\r\n\r\n/**\r\n * Get name and type for apicoplast chromosome\r\n *\r\n * Plasmodium falciparum (malaria parasite) has such a chromosome, see e.g.:\r\n * https://eweitz.github.io/ideogram/eukaryotes?org=plasmodium-falciparum\r\n */\r\nfunction parseApicoplast(ideo) {\r\n if (ideo.config.showNonNuclearChromosomes) {\r\n return ['AP', 'apicoplast'];\r\n }\r\n return [null, null];\r\n}\r\n\r\n/**\r\n * Get name and type for nuclear chromosome\r\n *\r\n * These are typical chromosomes, like chromosome 1.\r\n */\r\nfunction parseNuclear(result) {\r\n var type, cnIndex, chrName;\r\n\r\n type = 'nuclear';\r\n cnIndex = result.subtype.split('|').indexOf('chromosome');\r\n chrName = result.subname.split('|')[cnIndex];\r\n\r\n if (typeof chrName !== 'undefined' && chrName.substr(0, 3) === 'chr') {\r\n // Convert \"chr12\" to \"12\", e.g. for banana (GCF_000313855.2)\r\n chrName = chrName.substr(3);\r\n }\r\n\r\n return [chrName, type];\r\n}\r\n\r\n/**\r\n * Get name and type of any chromosome object from NCBI Nucleotide ESummary\r\n */\r\nfunction getChrNameAndType(result, ideo) {\r\n var genome = result.genome;\r\n if (genome === 'mitochondrion') {\r\n return parseMitochondrion(result, ideo);\r\n } else if (genome === 'chloroplast' || genome === 'plastid') {\r\n return parseChloroplastOrPlastid(ideo);\r\n } else if (genome === 'apicoplast') {\r\n return parseApicoplast(ideo);\r\n } else {\r\n return parseNuclear(result);\r\n }\r\n}\r\n\r\nfunction parseChromosome(result, ideo) {\r\n var chrName, type, chromosome;\r\n\r\n [chrName, type] = getChrNameAndType(result, ideo);\r\n\r\n chromosome = {\r\n name: chrName,\r\n length: result.slen,\r\n type: type\r\n };\r\n\r\n return chromosome;\r\n}\r\n\r\nfunction parseChromosomes(results, taxid, ideo) {\r\n var x, chromosome, seenChrId, maxLength,\r\n seenChrs = {},\r\n chromosomes = [];\r\n\r\n for (x in results) {\r\n // omit list of result uids\r\n if (x === 'uids') continue;\r\n\r\n chromosome = parseChromosome(results[x], ideo);\r\n seenChrId = chromosome.name + '_' + chromosome.length;\r\n if (chromosome.type !== null && seenChrId in seenChrs === false) {\r\n // seenChrs accounts for duplicate chromosomes seen with\r\n // pig (Sus scrofa), likely GenBank and RefSeq copies.\r\n chromosomes.push(chromosome);\r\n }\r\n\r\n seenChrs[seenChrId] = 1;\r\n }\r\n\r\n chromosomes = chromosomes.sort(Ideogram.sortChromosomes);\r\n\r\n maxLength = {bp: 0, iscn: 0};\r\n chromosomes.forEach(chr => {\r\n if (chr.length > maxLength.bp) maxLength.bp = chr.length;\r\n });\r\n if (maxLength.bp > ideo.maxLength.bp) ideo.maxLength.bp = maxLength.bp;\r\n ideo.maxLength[taxid] = maxLength;\r\n ideo.coordinateSystem = 'bp';\r\n\r\n return chromosomes;\r\n}\r\n\r\n/**\r\n * Request ESummary data from an ESearch on a genome assembly\r\n */\r\nfunction fetchAssemblySummary(data, ideo) {\r\n var asmUid, asmSummaryUrl;\r\n\r\n // NCBI Assembly database's internal identifier (uid) for this assembly\r\n asmUid = data.esearchresult.idlist[0];\r\n asmSummaryUrl = ideo.esummary + '&db=assembly&id=' + asmUid;\r\n\r\n return d3.json(asmSummaryUrl);\r\n}\r\n\r\n/**\r\n * Returns assembly accession, as well as names and lengths of chromosomes for\r\n * an organism's best-known genome assembly, or for a specified assembly.\r\n *\r\n * Gets data from NCBI EUtils web API.\r\n *\r\n * @param callback Function to call upon completion of this async method\r\n */\r\nfunction getAssemblyAndChromosomesFromEutils(taxid, callback) {\r\n var assemblyAccession,\r\n ideo = this;\r\n\r\n // Search for assembly, then\r\n // get summary of that assembly, then\r\n // get search URL for chromosomes in that assembly, then\r\n // get search results containing chromosome IDs, then\r\n // get summaries of each of those chromosome IDs, then\r\n // format the chromosome summaries and pass them into callback function.\r\n var asmSearchUrl = getAssemblySearchUrl(taxid, ideo);\r\n d3.json(asmSearchUrl)\r\n .then(function(data) {return fetchAssemblySummary(data, ideo);})\r\n .then(function(data) {\r\n var asmUid = data.result.uids[0];\r\n assemblyAccession = data.result[asmUid];\r\n return getESearchUrlForChromosomes(asmUid, ideo);\r\n }).then(function(esearchUrl) {return d3.json(esearchUrl);})\r\n .then(function(data) {return fetchNucleotideSummary(data, ideo);})\r\n .then(function(data) {\r\n var chromosomes = parseChromosomes(data.result, taxid, ideo);\r\n return callback([assemblyAccession, chromosomes]);\r\n }, function(rejectedReason) {\r\n console.warn(rejectedReason);\r\n });\r\n}\r\n\r\nexport {\r\n esearch, esummary, elink, getOrganismFromEutils,\r\n getTaxids, getAssemblyAndChromosomesFromEutils\r\n};\r\n","// The E-Utilies In Depth: Parameters, Syntax and More:\r\n// https://www.ncbi.nlm.nih.gov/books/NBK25499/\r\n\r\nvar apiKey = '&api_key=7e33ac6a08a6955ec3b83d214d22b21a2808';\r\n\r\nvar eutils = 'https://eutils.ncbi.nlm.nih.gov/entrez/eutils/';\r\nvar esearch = eutils + 'esearch.fcgi?retmode=json' + apiKey;\r\nvar esummary = eutils + 'esummary.fcgi?retmode=json' + apiKey;\r\nvar elink = eutils + 'elink.fcgi?retmode=json' + apiKey;\r\n\r\nfunction getAssemblySearchUrl(taxid, ideo) {\r\n var termStem, asmSearchUrl;\r\n\r\n if (ideo.assemblyIsAccession()) {\r\n termStem = ideo.config.assembly + '%22[Assembly%20Accession]';\r\n } else {\r\n termStem = (\r\n taxid + '%22[taxid]' +\r\n 'AND%20(%22latest%20refseq%22[filter])%20'\r\n );\r\n }\r\n\r\n asmSearchUrl =\r\n ideo.esearch +\r\n '&db=assembly' +\r\n '&term=%22' + termStem +\r\n 'AND%20(%22chromosome%20level%22[filter]%20' +\r\n 'OR%20%22complete%20genome%22[filter])';\r\n\r\n return asmSearchUrl;\r\n}\r\n\r\nexport {esearch, esummary, elink, getAssemblySearchUrl};\r\n","/**\r\n * @fileoverview Methods to show (or hide) cytogenetic banding data\r\n */\r\n\r\nimport {d3} from '../lib';\r\n\r\nfunction hideUnshownBandLabels() {\r\n var ideo = this;\r\n var bandsToShow = ideo.bandsToShow.join(',');\r\n\r\n // Handles edge-case when ideogram consists of one chromosome\r\n // that lacks bands in a genome that has bands (e.g. MT in human)\r\n if (ideo.bandsToShow.length === 0) return;\r\n\r\n // d3.selectAll resolves to querySelectorAll (QSA).\r\n // QSA takes a surprisingly long time to complete,\r\n // and scales with the number of selectors.\r\n // Most bands are hidden, so we can optimize by\r\n // Hiding all bands, then QSA'ing and displaying the\r\n // relatively few bands that are shown.\r\n d3.selectAll(ideo.selector + ' .bandLabel, .bandLabelStalk')\r\n .style('display', 'none');\r\n d3.selectAll(bandsToShow).style('display', '');\r\n}\r\n\r\nfunction getPrevRight(prevLabelXRight, prevHiddenBoxIndex, i,\r\n textOffsets, chrModel) {\r\n var prevTextBoxLeft, prevTextBoxWidth;\r\n\r\n if (prevHiddenBoxIndex !== i) {\r\n // This getBoundingClientRect() forces Chrome's\r\n // 'Recalculate Style' and 'Layout', which takes 30-40 ms on Chrome.\r\n // TODO: This forced synchronous layout would be nice to eliminate.\r\n // prevTextBox = texts[i].getBoundingClientRect();\r\n // prevLabelXRight = prevTextBox.left + prevTextBox.width;\r\n\r\n // TODO: Account for number of characters in prevTextBoxWidth,\r\n // maybe also zoom.\r\n prevTextBoxLeft = textOffsets[chrModel.id][i];\r\n prevTextBoxWidth = 36;\r\n\r\n prevLabelXRight = prevTextBoxLeft + prevTextBoxWidth;\r\n }\r\n\r\n return prevLabelXRight;\r\n}\r\n\r\nfunction updateShown(indexesToShow, overlapRight, left, pad, prevRight, i,\r\n isBefore) {\r\n var hiddenIndex, doSkip,\r\n thisRight = isBefore ? overlapRight : prevRight;\r\n\r\n if (left < pad + thisRight) {\r\n overlapRight = prevRight;\r\n hiddenIndex = i;\r\n doSkip = isBefore;\r\n } else {\r\n indexesToShow.push(i);\r\n }\r\n\r\n return [indexesToShow, overlapRight, hiddenIndex, doSkip];\r\n}\r\n\r\nfunction getIndexesToShow(offsets, chrModel) {\r\n var i, hiddenIndex, left, prevRight, doSkip,\r\n indexesToShow = [],\r\n textsLength = offsets[chrModel.id].length,\r\n overlapRight = 0, // Right X coordinate of overlapping label\r\n pad = 5; // text padding\r\n\r\n for (i = 0; i < textsLength; i++) {\r\n // Ensures band labels don't overlap\r\n left = offsets[chrModel.id][i];\r\n\r\n [indexesToShow, overlapRight, hiddenIndex, doSkip] =\r\n updateShown(indexesToShow, overlapRight, left, pad, prevRight, i, true);\r\n if (doSkip) continue;\r\n\r\n prevRight = getPrevRight(prevRight, hiddenIndex, i, offsets, chrModel);\r\n\r\n [indexesToShow, overlapRight, hiddenIndex, doSkip] =\r\n updateShown(indexesToShow, overlapRight, left, pad, prevRight, i, false);\r\n }\r\n\r\n return indexesToShow;\r\n}\r\n\r\n/**\r\n * Sets band labels to display on each chromosome, avoiding label overlap\r\n */\r\nfunction setBandsToShow(chrs, textOffsets) {\r\n var index, i, j, indexesToShow, chrModel, selectorsToShow, ithLength,\r\n ideo = this;\r\n\r\n ideo.bandsToShow = [];\r\n\r\n for (i = 0; i < chrs.length; i++) {\r\n\r\n chrModel = chrs[i];\r\n\r\n indexesToShow = getIndexesToShow(textOffsets, chrModel);\r\n\r\n selectorsToShow = [];\r\n ithLength = indexesToShow.length;\r\n\r\n for (j = 0; j < ithLength; j++) {\r\n index = indexesToShow[j];\r\n selectorsToShow.push('#' + chrModel.id + ' .bsbsl-' + index);\r\n }\r\n\r\n ideo.bandsToShow = ideo.bandsToShow.concat(selectorsToShow);\r\n }\r\n}\r\n\r\nexport {hideUnshownBandLabels, setBandsToShow};\r\n","/**\r\n * @fileoverview Methods to draw cytogenetic bands and their labels\r\n *\r\n */\r\n\r\nimport {d3} from '../lib';\r\nimport {hideUnshownBandLabels, setBandsToShow} from './show';\r\nimport {staticColors, staticGradients} from './styles';\r\nimport {configuredCss} from './../init/configure';\r\n\r\n/**\r\n * Draws text of cytoband label\r\n */\r\nfunction drawBandLabelText(chr, bandsToLabel, chrModel, textOffsets) {\r\n var ideo = this,\r\n layout = ideo._layout,\r\n chrIndex = chrModel.chrIndex;\r\n\r\n chr.selectAll('text')\r\n .data(bandsToLabel)\r\n .enter()\r\n .append('g')\r\n .attr('class', function(d, i) {\r\n return 'bandLabel bsbsl-' + i;\r\n })\r\n .attr('transform', function(d) {\r\n var transform = layout.getChromosomeBandLabelTranslate(d, chrIndex);\r\n\r\n if (ideo.config.orientation === 'horizontal') {\r\n textOffsets[chrModel.id].push(transform.x + 13);\r\n } else {\r\n textOffsets[chrModel.id].push(transform.y + 6);\r\n }\r\n\r\n return transform.translate;\r\n })\r\n .append('text')\r\n .attr('text-anchor', layout.getChromosomeBandLabelAnchor(chrIndex))\r\n .text(function(d) {return d.name;});\r\n\r\n return textOffsets;\r\n}\r\n\r\n/**\r\n * Draws line between cytoband and its text label\r\n */\r\nfunction drawBandLabelStalk(chr, bandsToLabel, chrModel, textOffsets) {\r\n var ideo = this;\r\n\r\n chr.selectAll('line.bandLabelStalk')\r\n .data(bandsToLabel)\r\n .enter()\r\n .append('g')\r\n .attr('class', function(d, i) {\r\n return 'bandLabelStalk bsbsl-' + i;\r\n })\r\n .attr('transform', function(d) {\r\n var x, y;\r\n\r\n x = ideo.round(d.px.start + d.px.width / 2);\r\n y = -10;\r\n\r\n textOffsets[chrModel.id].push(x + 13);\r\n\r\n return 'translate(' + x + ',' + y + ')';\r\n })\r\n .append('line')\r\n .attr('x1', 0)\r\n .attr('y1', ideo._layout.getChromosomeBandTickY1(chrModel.chrIndex))\r\n .attr('x2', 0)\r\n .attr('y2', ideo._layout.getChromosomeBandTickY2(chrModel.chrIndex));\r\n}\r\n\r\nfunction getChrModels(chromosomes) {\r\n var taxid, chr,\r\n chrModels = [];\r\n\r\n for (taxid in chromosomes) {\r\n for (chr in chromosomes[taxid]) {\r\n chrModels.push(chromosomes[taxid][chr]);\r\n }\r\n }\r\n\r\n return chrModels;\r\n}\r\n\r\n/**\r\n * Draws text and stalks for cytogenetic band labels.\r\n *\r\n * Band labels are text like \"p11.11\".\r\n * Stalks are small lines that visually connect labels to their bands.\r\n */\r\nfunction drawBandLabels(chromosomes) {\r\n var i, chr, chrModel, chrModels, bandsToLabel,\r\n ideo = this,\r\n textOffsets = {};\r\n\r\n chrModels = getChrModels(chromosomes);\r\n\r\n for (i = 0; i < chrModels.length; i++) {\r\n chrModel = chrModels[i];\r\n chr = d3.select(ideo.selector + ' #' + chrModel.id);\r\n textOffsets[chrModel.id] = [];\r\n\r\n // Don't show \"pter\" label for telocentric chromosomes, e.g. mouse\r\n bandsToLabel = chrModel.bands.filter(d => d.name !== 'pter');\r\n\r\n textOffsets =\r\n ideo.drawBandLabelText(chr, bandsToLabel, chrModel, textOffsets);\r\n\r\n ideo.drawBandLabelStalk(chr, bandsToLabel, chrModel, textOffsets);\r\n }\r\n\r\n ideo.setBandsToShow(chrModels, textOffsets);\r\n}\r\n\r\nfunction getStainAndColors(i, colors) {\r\n var stain, color1, color2, color3;\r\n\r\n stain = colors[i][0];\r\n color1 = colors[i][1];\r\n color2 = colors[i][2];\r\n color3 = colors[i][3];\r\n\r\n return [stain, color1, color2, color3];\r\n}\r\n\r\nfunction getGradients(colors) {\r\n var i, stain, color1, color2, color3,\r\n gradients = '';\r\n\r\n for (i = 0; i < colors.length; i++) {\r\n [stain, color1, color2, color3] = getStainAndColors(i, colors);\r\n gradients +=\r\n '';\r\n if (stain === 'gneg') {\r\n gradients +=\r\n '' +\r\n '' +\r\n '';\r\n } else {\r\n gradients +=\r\n '' +\r\n '' +\r\n '';\r\n }\r\n gradients +=\r\n '';\r\n }\r\n\r\n return gradients;\r\n}\r\n\r\n/**\r\n * Returns SVG gradients that give chromosomes a polished look\r\n */\r\nfunction getBandColorGradients() {\r\n var css,\r\n gradients = '';\r\n\r\n gradients = getGradients(staticColors);\r\n\r\n css = ``;\r\n\r\n gradients += staticGradients;\r\n gradients = '' + gradients + '';\r\n gradients = css + gradients;\r\n\r\n return gradients;\r\n}\r\n\r\nexport {\r\n drawBandLabels, getBandColorGradients, hideUnshownBandLabels, setBandsToShow,\r\n drawBandLabelText, drawBandLabelStalk\r\n};\r\n","\r\nfunction getDelimiterTsvLinesAndInit(source, content) {\r\n var delimiter, tsvLines, init;\r\n\r\n if (typeof chrBands === 'undefined' && source !== 'native') {\r\n delimiter = /\\t/;\r\n tsvLines = content.split(/\\r\\n|\\n/);\r\n init = 1;\r\n } else {\r\n delimiter = / /;\r\n tsvLines = content;\r\n init = 0;\r\n }\r\n\r\n return [delimiter, tsvLines, init];\r\n}\r\n\r\nfunction updateChromosomes(chromosomes) {\r\n var tmp, i;\r\n\r\n if (chromosomes instanceof Array && typeof chromosomes[0] === 'object') {\r\n tmp = [];\r\n for (i = 0; i < chromosomes.length; i++) {\r\n tmp.push(chromosomes[i].name);\r\n }\r\n chromosomes = tmp;\r\n }\r\n return chromosomes;\r\n}\r\n\r\nfunction getLineObject(chr, columns, stain, taxid) {\r\n return {\r\n chr: chr,\r\n bp: {\r\n start: parseInt(columns[5], 10),\r\n stop: parseInt(columns[6], 10)\r\n },\r\n iscn: {\r\n start: parseInt(columns[3], 10),\r\n stop: parseInt(columns[4], 10)\r\n },\r\n px: {\r\n start: -1,\r\n stop: -1,\r\n width: -1\r\n },\r\n name: columns[1] + columns[2],\r\n stain: stain,\r\n taxid: taxid\r\n };\r\n}\r\n\r\nfunction getStain(columns) {\r\n var stain = columns[7];\r\n // For e.g. acen and gvar, columns[8] (density) is undefined\r\n if (columns[8]) stain += columns[8];\r\n return stain;\r\n}\r\n\r\nfunction updateLines(lines, columns, taxid) {\r\n var chr, stain, line;\r\n\r\n chr = columns[0];\r\n if (chr in lines === false) lines[chr] = [];\r\n\r\n stain = getStain(columns);\r\n\r\n line = getLineObject(chr, columns, stain, taxid);\r\n lines[chr].push(line);\r\n\r\n return lines;\r\n}\r\n\r\n/**\r\n * Reports if a cytogenetic band should be included in parse results\r\n *\r\n * TODO:\r\n * Normalize ideogram.chromosomes upstream.\r\n *\r\n * This function is complex because ideogram.chromosomes is (likely\r\n * unnecessarily) complex. The \"ideogram.chromosomes\" object can\r\n * take many forms depending on the use case, and this results in\r\n * hard-to-reason-about functions like this.\r\n *\r\n * Normalizing ideogram.chromosomes to a common format somewhere upstream\r\n * would likely make this specific function and Ideogram in general much\r\n * more maintainable.\r\n */\r\nfunction shouldSkipBand(chrs, chr, taxid, ideo) {\r\n\r\n var hasChrs, chrsAreList, chrNotInList, chrsAreObject,\r\n innerChrsAreStrings, matchingChrObjs, chrNotInObject,\r\n multiorganism = ideo.config.multiorganism;\r\n\r\n hasChrs = typeof chrs !== 'undefined' && chrs !== null;\r\n if (!hasChrs) return false;\r\n\r\n chrsAreList = Array.isArray(chrs);\r\n chrNotInList = chrsAreList && chrs.indexOf(chr) === -1;\r\n chrsAreObject = typeof chrs === 'object';\r\n\r\n if (chrsAreList && !chrsAreObject && chrNotInList) return true;\r\n\r\n if (taxid in chrs === false && multiorganism) return false;\r\n\r\n if (!multiorganism) {\r\n // Encountered in single organism when showing subset of all chromosomes,\r\n // e.g. only human X and Y as in https://eweitz.github.io/ideogram/homology-basic\r\n matchingChrObjs = chrs.filter(thisChr => thisChr === chr);\r\n chrNotInObject = matchingChrObjs.length === 0;\r\n } else {\r\n innerChrsAreStrings = typeof chrs[taxid][0] === 'string';\r\n if (innerChrsAreStrings) {\r\n chrNotInObject = chrs[taxid].includes(chr) === false;\r\n } else {\r\n matchingChrObjs = chrs[taxid].filter(thisChr => thisChr.name === chr);\r\n chrNotInObject = matchingChrObjs.length === 0;\r\n }\r\n }\r\n return chrNotInObject;\r\n\r\n}\r\n\r\n/**\r\n * Parses cytogenetic band data from a TSV file, or, if band data is\r\n * prefetched, from an array\r\n *\r\n * NCBI:\r\n * #chromosome arm band iscn_start iscn_stop bp_start bp_stop stain density\r\n * ftp://ftp.ncbi.nlm.nih.gov/pub/gdp/ideogram_9606_GCF_000001305.14_550_V1\r\n */\r\nfunction parseBands(taxid, chromosomes, ideo) {\r\n var delimiter, tsvLines, columns, chr, i, init, source, content,\r\n lines = {};\r\n\r\n content = ideo.bandData[taxid];\r\n\r\n if (Array.isArray(content)) source = 'native';\r\n\r\n chromosomes = updateChromosomes(chromosomes);\r\n\r\n // Destructure assignment fails oddly when transpiled. 2019-05-23\r\n var result = getDelimiterTsvLinesAndInit(source, content);\r\n delimiter = result[0];\r\n tsvLines = result[1];\r\n init = result[2];\r\n\r\n for (i = init; i < tsvLines.length; i++) {\r\n columns = tsvLines[i].split(delimiter);\r\n\r\n chr = columns[0];\r\n if (shouldSkipBand(chromosomes, chr, taxid, ideo)) {\r\n // If specific chromosomes are configured, then skip processing all\r\n // other fetched chromosomes.\r\n continue;\r\n }\r\n\r\n lines = updateLines(lines, columns, taxid);\r\n }\r\n\r\n return lines;\r\n}\r\n\r\nexport {parseBands};\r\n","/**\r\n * @fileoverview Methods for processing chromosome length and banding data.\r\n *\r\n * Ideogram.js depicts chromosomes using data on their length, name, and\r\n * (if dealing with a very well-studied organism) cytogenetic banding data.\r\n * This file processes cytoband data that comes from biological research\r\n * institutions.\r\n *\r\n * For background on cytogenetic bands and how they are used in genomics, see:\r\n * https://ghr.nlm.nih.gov/primer/howgeneswork/genelocation\r\n *\r\n */\r\n\r\nimport {\r\n drawBandLabels, getBandColorGradients, hideUnshownBandLabels, setBandsToShow,\r\n drawBandLabelText, drawBandLabelStalk\r\n} from './draw';\r\nimport {parseBands} from './parse';\r\nimport {organismMetadata} from '../init/organism-metadata';\r\n\r\n/**\r\n * Gets bands array for given chromosomes, sets ideo.maxLength\r\n */\r\nfunction getBandsArray(chromosome, bandsByChr, taxid, ideo) {\r\n var bands, chrLength,\r\n bandsArray = [];\r\n\r\n bands = bandsByChr[chromosome];\r\n bandsArray.push(bands);\r\n\r\n chrLength = {\r\n iscn: bands[bands.length - 1].iscn.stop,\r\n bp: bands[bands.length - 1].bp.stop\r\n };\r\n\r\n if (taxid in ideo.maxLength === false) {\r\n ideo.maxLength[taxid] = {bp: 0, iscn: 0};\r\n }\r\n\r\n if (chrLength.iscn > ideo.maxLength[taxid].iscn) {\r\n ideo.maxLength[taxid].iscn = chrLength.iscn;\r\n if (chrLength.iscn > ideo.maxLength.iscn) {\r\n ideo.maxLength.iscn = chrLength.iscn;\r\n }\r\n }\r\n\r\n if (chrLength.bp > ideo.maxLength[taxid].bp) {\r\n ideo.maxLength[taxid].bp = chrLength.bp;\r\n if (chrLength.bp > ideo.maxLength.bp) {\r\n ideo.maxLength.bp = chrLength.bp;\r\n }\r\n }\r\n\r\n return bandsArray;\r\n}\r\n\r\n/**\r\n * Updates bandsArray, sets ideo.config.chromosomes and ideo.numChromosomes\r\n */\r\nfunction setChrsByTaxidsWithBands(taxid, chrs, bandsArray, ideo) {\r\n var bandsByChr, chromosome, k, chrBandsArray;\r\n\r\n bandsByChr = parseBands(taxid, chrs, ideo);\r\n\r\n chrs = Object.keys(bandsByChr).sort(Ideogram.sortChromosomes);\r\n\r\n if (\r\n 'chromosomes' in ideo.config === false ||\r\n ideo.config.chromosomes === null\r\n ) {\r\n ideo.config.chromosomes = {};\r\n }\r\n if (chrs.length > 0) {\r\n ideo.config.chromosomes[taxid] = chrs.slice();\r\n }\r\n ideo.numChromosomes += ideo.config.chromosomes[taxid].length;\r\n\r\n for (k = 0; k < chrs.length; k++) {\r\n chromosome = chrs[k];\r\n chrBandsArray = getBandsArray(chromosome, bandsByChr, taxid, ideo);\r\n bandsArray = bandsArray.concat(chrBandsArray);\r\n }\r\n\r\n return bandsArray;\r\n}\r\n\r\nfunction setChromosomesByTaxid(taxid, chrs, bandsArray, ideo) {\r\n var chr, i;\r\n\r\n if (\r\n taxid in ideo.bandData ||\r\n taxid in organismMetadata &&\r\n ideo.assemblyIsAccession() === false\r\n ) {\r\n bandsArray = setChrsByTaxidsWithBands(taxid, chrs, bandsArray, ideo);\r\n } else {\r\n // If lacking band-level data\r\n ideo.numChromosomes += chrs.length;\r\n\r\n for (i = 0; i < chrs.length; i++) {\r\n chr = chrs[i];\r\n if (chr.length > ideo.maxLength.bp) ideo.maxLength.bp = chr.length;\r\n }\r\n }\r\n\r\n return bandsArray;\r\n}\r\n\r\nfunction reportPerformance(t0, ideo) {\r\n var t1 = new Date().getTime();\r\n if (ideo.config.debug) {\r\n console.log('Time in processBandData: ' + (t1 - t0) + ' ms');\r\n }\r\n}\r\n\r\n/**\r\n * Completes default ideogram initialization by calling downstream functions\r\n * to process raw band data into full JSON objects, render chromosome and\r\n * cytoband figures and labels, apply initial graphical transformations,\r\n * hide overlapping band labels, and execute callbacks defined by client code\r\n */\r\nfunction processBandData(taxid) {\r\n var bandsArray, chrs,\r\n ideo = this,\r\n config = ideo.config,\r\n t0 = new Date().getTime();\r\n\r\n bandsArray = [];\r\n\r\n if ('chromosomes' in config) {\r\n if (config.multiorganism) {\r\n // Copy object\r\n chrs = config.chromosomes;\r\n } else if (taxid in config.chromosomes) {\r\n // Copy array by value\r\n chrs = config.chromosomes[taxid].slice();\r\n } else {\r\n // Copy array by value. Needed for e.g. \"Homology, basic\"\r\n chrs = config.chromosomes.slice();\r\n }\r\n }\r\n\r\n bandsArray = setChromosomesByTaxid(taxid, chrs, bandsArray, ideo);\r\n\r\n reportPerformance(t0, ideo);\r\n return [taxid, bandsArray];\r\n}\r\n\r\nexport {\r\n drawBandLabels, getBandColorGradients, processBandData,\r\n setBandsToShow, hideUnshownBandLabels, drawBandLabelText, drawBandLabelStalk\r\n};\r\n","/**\r\n * @fileoverview Methods to create and handle a brush on a chromosome.\r\n *\r\n * Ideogram.js enables users to display a box around part of a chromosome\r\n * that represents a \"currently selected\" region. The user can move this\r\n * box like a sliding window, e.g. by clicking and dragging the mouse.\r\n *\r\n * For background, see:\r\n * https://github.com/d3/d3-brush\r\n */\r\n\r\nimport {d3} from './lib';\r\n\r\n/**\r\n * Custom event handler, fired upon dragging sliding window on chromosome\r\n */\r\nfunction onBrushMove() {\r\n call(this.onBrushMoveCallback);\r\n}\r\n\r\nfunction onBrushEnd() {\r\n call(this.onBrushEndCallback);\r\n}\r\n\r\nfunction setBrush(bpDomain, pxRange, xOffset, width, ideo) {\r\n var xScale,\r\n length = ideo.config.chrHeight;\r\n\r\n xScale = d3.scaleLinear().domain(bpDomain).range(pxRange);\r\n\r\n ideo.brush = d3.brushX()\r\n .extent([[xOffset, 0], [length + xOffset, width]])\r\n .on('brush', _onBrushMove)\r\n .on('end', _onBrushEnd);\r\n\r\n function _onBrushMove({selection}) {\r\n var extent = selection.map(xScale.invert),\r\n from = Math.floor(extent[0]),\r\n to = Math.ceil(extent[1]);\r\n\r\n ideo.selectedRegion = {from: from, to: to, extent: (to - from)};\r\n\r\n if (ideo.onBrushMoveCallback) {\r\n ideo.onBrushMoveCallback();\r\n }\r\n }\r\n\r\n function _onBrushEnd({selection}) {\r\n if (ideo.onBrushEndCallback) {\r\n ideo.onBrushEndCallback();\r\n }\r\n }\r\n}\r\n\r\nfunction getBasePairDomainAndPixelRange(chrModel, xOffset) {\r\n var band, i,\r\n bpDomain = [1],\r\n pxRange = [1],\r\n lastBand = chrModel.bands.slice(-1)[0];\r\n\r\n for (i = 0; i < chrModel.bands.length; i++) {\r\n band = chrModel.bands[i];\r\n bpDomain.push(band.bp.start);\r\n pxRange.push(band.px.start + xOffset);\r\n }\r\n\r\n bpDomain.push(lastBand.bp.stop - 1);\r\n pxRange.push(lastBand.px.stop + xOffset);\r\n\r\n return [bpDomain, pxRange];\r\n}\r\n\r\n/**\r\n * Account for calls like createBrush('chr1:104325484-119977655')\r\n */\r\nfunction refineGenomicCoordinates(chr, from, to) {\r\n var nameSplit, fromToSplit;\r\n\r\n // Account for calls like createBrush('chr1:104325484-119977655')\r\n nameSplit = chr.split(':');\r\n fromToSplit = chr.split('-');\r\n if (nameSplit.length > 1 && fromToSplit.length > 1) {\r\n chr = nameSplit[0].replace('chr', '');\r\n fromToSplit = nameSplit[1].split('-');\r\n from = parseInt(fromToSplit[0]);\r\n to = parseInt(fromToSplit[1] - 1);\r\n }\r\n\r\n return [chr, from, to];\r\n}\r\n\r\nfunction getChrModel(chr, ideo) {\r\n var i, cm, chrModel;\r\n\r\n for (i = 0; i < ideo.chromosomesArray.length; i++) {\r\n cm = ideo.chromosomesArray[i];\r\n if (cm.name === chr) {\r\n chrModel = cm;\r\n return chrModel;\r\n }\r\n }\r\n}\r\n\r\nfunction writeBrush(chrModel, from, to, xOffset, width, ideo) {\r\n var x0, x1, yTranslate, yOffset;\r\n\r\n x0 = ideo.convertBpToPx(chrModel, from) + xOffset;\r\n x1 = ideo.convertBpToPx(chrModel, to) + xOffset;\r\n\r\n yTranslate = ideo._layout.getChromosomeSetYTranslate(0);\r\n yOffset = yTranslate + (ideo.config.chrWidth - width) / 2;\r\n\r\n d3.select(ideo.selector).append('g')\r\n .attr('class', 'brush')\r\n .attr('transform', 'translate(0, ' + yOffset + ')')\r\n .call(ideo.brush)\r\n .call(ideo.brush.move, [x0, x1]);\r\n}\r\n\r\nfunction setSelectedRegion(from, to, ideo) {\r\n // Genomics web UIs are 1-based, fully closed.\r\n // I.e. If start = 20 bp and stop = 10 bp, then extent = 11 bp.\r\n // Details:\r\n // http://genome.ucsc.edu/blog/the-ucsc-genome-browser-coordinate-counting-systems/\r\n // https://www.biostars.org/p/84686/\r\n var extent = to - from + 1;\r\n ideo.selectedRegion = {from: from, to: to, extent: extent};\r\n}\r\n\r\n/**\r\n * Creates a sliding window along a chromosome\r\n *\r\n * @param chr Chromosome name (e.g. 1) or range, e.g. chr1:104325484-119977655\r\n * @param from Genomic start coordinate in base pairs, e.g. 104325484\r\n * @param to Genomic end coordinate in base pairs, e.g. 119977655\r\n */\r\nfunction createBrush(chr, from, to) {\r\n var chrModel, chrLengthBp, bpDomain, pxRange, lastBand,\r\n ideo = this,\r\n width = ideo.config.chrWidth + 6.5,\r\n xOffset = ideo._layout.margin.left;\r\n\r\n [chr, from, to] = refineGenomicCoordinates(chr, from, to);\r\n\r\n chrModel = getChrModel(chr, ideo);\r\n\r\n [bpDomain, pxRange] = getBasePairDomainAndPixelRange(chrModel, xOffset);\r\n\r\n lastBand = chrModel.bands.slice(-1)[0];\r\n chrLengthBp = lastBand.bp.stop;\r\n\r\n if (typeof from === 'undefined') from = Math.floor(chrLengthBp / 10);\r\n if (typeof to === 'undefined') to = Math.ceil(from * 2);\r\n\r\n setBrush(bpDomain, pxRange, xOffset, width, ideo);\r\n\r\n setSelectedRegion(from, to, ideo);\r\n writeBrush(chrModel, from, to, xOffset, width, ideo);\r\n}\r\n\r\nexport {onBrushMove, onBrushEnd, createBrush};\r\n","/**\r\n * @fileoverview Allows a click event handler to be attached to the ideogram\r\n *\r\n * This works similar to the \"brush\" which allows a region to be selected.\r\n * The click handler does not allow a region, but a precise location.\r\n *\r\n */\r\n\r\nimport {d3} from './lib';\r\n\r\n/**\r\n * Custom event handler, fired upon clicks on the chromosome (to change\r\n * position)\r\n */\r\nfunction onCursorMove() {\r\n call(this.onCursorMoveCallback);\r\n}\r\n\r\nfunction setCursor(position, bpDomain, pxRange, xOffset, width, ideo) {\r\n var xScale;\r\n\r\n xScale = d3.scaleLinear().domain(bpDomain).range(pxRange);\r\n\r\n if (!('rotatable' in ideo.config && ideo.config.rotatable === false)) {\r\n console.warn('Using the cursor with rotate is not supported.');\r\n }\r\n\r\n var yTranslate = ideo._layout.getChromosomeSetYTranslate(0);\r\n var yOffset = yTranslate + (ideo.config.chrWidth - width) / 2;\r\n\r\n // TODO: check if newPosition is valid value (in range)\r\n\r\n var cursorBrush = d3.select(ideo.selector).append('g')\r\n .attr('class', 'brush')\r\n .attr('transform', 'translate(0, ' + yOffset + ')')\r\n .append('rect')\r\n .attr('class', 'cursor')\r\n .attr('x', xScale(position))\r\n .attr('y', 0)\r\n .attr('width', 1) // this could be a configuration param\r\n .attr('height', 30); // MAGIC NUMBER! need help with this one\r\n\r\n // call the callback for the first time (onLoad)\r\n if (ideo.onCursorMove) {\r\n ideo.onCursorMoveCallback(position);\r\n }\r\n\r\n if (!ideo.setCursorPosition) {\r\n ideo.setCursorPosition = function(newPosition) {\r\n // TODO: check if newPosition is valid value (in range)\r\n cursorBrush.attr('x', xScale(newPosition));\r\n if (ideo.onCursorMove) {\r\n ideo.onCursorMoveCallback(newPosition);\r\n }\r\n };\r\n }\r\n\r\n d3.selectAll(ideo.selector + ' .chromosome').on('click', function(event) {\r\n var x = event.offsetX; // minimum value seems to be 25\r\n\r\n // adjust for screen (6 is a magic number that seems to work)\r\n x -=6;\r\n\r\n // move the cursor\r\n cursorBrush.attr('x', x);\r\n\r\n // calculate the new position and perform callback\r\n var newPosition = Math.floor(xScale.invert(x));\r\n if (ideo.onCursorMove) {\r\n ideo.onCursorMoveCallback(newPosition);\r\n }\r\n });\r\n}\r\n\r\nfunction getBasePairDomainAndPixelRange(chrModel, xOffset) {\r\n var band, i,\r\n bpDomain = [1],\r\n pxRange = [1],\r\n lastBand = chrModel.bands.slice(-1)[0];\r\n\r\n for (i = 0; i < chrModel.bands.length; i++) {\r\n band = chrModel.bands[i];\r\n bpDomain.push(band.bp.start);\r\n pxRange.push(band.px.start + xOffset);\r\n }\r\n\r\n bpDomain.push(lastBand.bp.stop - 1);\r\n pxRange.push(lastBand.px.stop + xOffset);\r\n\r\n return [bpDomain, pxRange];\r\n}\r\n\r\nfunction getChrModel(chr, ideo) {\r\n var i, cm, chrModel;\r\n\r\n for (i = 0; i < ideo.chromosomesArray.length; i++) {\r\n cm = ideo.chromosomesArray[i];\r\n if (cm.name === chr) {\r\n chrModel = cm;\r\n return chrModel;\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Creates a clickable cursor along a chromosome.\r\n *\r\n * @param position Genomic start coordinate in base pairs, e.g. 104325484\r\n */\r\nfunction createClickCursor(position) {\r\n var chrModel, bpDomain,\r\n pxRange,\r\n ideo = this,\r\n width = ideo.config.chrWidth + 6.5, // 6.5 magic number?\r\n xOffset = ideo._layout.margin.left;\r\n\r\n if (typeof position === 'undefined') {\r\n return false;\r\n }\r\n\r\n chrModel = getChrModel(ideo.config.chromosome, ideo);\r\n [bpDomain, pxRange] = getBasePairDomainAndPixelRange(chrModel, xOffset);\r\n\r\n // call setCursor to complete the job.\r\n setCursor(position, bpDomain, pxRange, xOffset, width, ideo);\r\n}\r\n\r\nexport {onCursorMove, createClickCursor};\r\n","/**\r\n * @fileoverview Instance methods for sex chromosomes (allosomes).\r\n *\r\n * This module provides methods for drawing karyotypically normal\r\n * male and female mammalian genomes.\r\n */\r\n\r\n/**\r\n * Appends SVG elements depicting sex chromosomes to the document.\r\n */\r\nfunction drawSexChromosomes(container, chrIndex) {\r\n var bandsArray, taxid, chrs,\r\n sexChromosomeIndexes, sciLength,\r\n chromosome, bands, chrModel, sci, homologIndex;\r\n\r\n bandsArray = this.bandsArray;\r\n taxid = this.config.taxid;\r\n chrs = this.config.chromosomes[taxid];\r\n\r\n if (this.config.sex === 'male') {\r\n sexChromosomeIndexes = [1, 0];\r\n } else {\r\n sexChromosomeIndexes = [0, 0];\r\n }\r\n\r\n sciLength = sexChromosomeIndexes.length;\r\n\r\n for (homologIndex = 0; homologIndex < sciLength; homologIndex++) {\r\n sci = sexChromosomeIndexes[homologIndex] + chrIndex;\r\n chromosome = chrs[sci];\r\n bands = bandsArray[taxid][sci];\r\n chrModel = this.getChromosomeModel(bands, chromosome, taxid, sci);\r\n this.appendHomolog(chrModel, chrIndex, homologIndex, container);\r\n }\r\n}\r\n\r\n/**\r\n * Sets instance properties regarding sex chromosomes.\r\n * Currently only supported for mammals.\r\n * TODO: Support all sexually reproducing taxa\r\n * XY sex-determination (mammals):\r\n * - Male: XY <- heterogametic\r\n * - Female: XX\r\n * ZW sex-determination (birds):\r\n * - Male: ZZ\r\n * - Female: ZW <- heterogametic\r\n * X0 sex-determination (some insects):\r\n * - Male: X0, i.e. only X <- heterogametic?\r\n * - Female: XX\r\n * TODO: Support sex chromosome aneuploidies in mammals\r\n * - Turner syndrome: X0\r\n * - Klinefelter syndome: XXY\r\n * More types:\r\n * https://en.wikipedia.org/wiki/Category:Sex_chromosome_aneuploidies\r\n */\r\nfunction setSexChromosomes(chrs) {\r\n var chr, i,\r\n ideo = this,\r\n sexChrs = {X: 1, Y: 1};\r\n\r\n if (this.config.ploidy !== 2 || !this.config.sex) return;\r\n\r\n ideo.sexChromosomes.list = [];\r\n\r\n for (i = 0; i < chrs.length; i++) {\r\n chr = chrs[i];\r\n if (ideo.config.sex === 'male' && chr in sexChrs) {\r\n ideo.sexChromosomes.list.push(chr);\r\n if (!ideo.sexChromosomes.index) {\r\n ideo.sexChromosomes.index = i;\r\n }\r\n } else if (chr === 'X') {\r\n ideo.sexChromosomes.list.push(chr, chr);\r\n ideo.sexChromosomes.index = i;\r\n }\r\n }\r\n}\r\n\r\nexport {drawSexChromosomes, setSexChromosomes};\r\n","/**\r\n * @fileoverview Methods to convert to and from different types of coordinates.\r\n *\r\n * Ideogram.js uses multiple coordinate systems, e.g. base pairs (bp) and\r\n * pixels (px). These methods interconvert between those coordinate systems.\r\n *\r\n * TODO:\r\n * - Add methods to interconvert between ISCN coordinates and base pairs,\r\n * pixels.\r\n */\r\n\r\nfunction throwBpToPxError(bp, chr, band) {\r\n throw new Error(\r\n 'Base pair out of range. ' +\r\n 'bp: ' + bp + '; length of chr' + chr.name + ': ' + band.bp.stop\r\n );\r\n}\r\n\r\nfunction getPx(chr, bp) {\r\n var i, px, band, bpToIscnScale, iscn, iscnStart, iscnStop, iscnLength,\r\n bpStart, bpStop, bpLength, pxStart, pxLength;\r\n\r\n for (i = 0; i < chr.bands.length; i++) {\r\n band = chr.bands[i];\r\n bpStart = band.bp.start;\r\n bpStop = band.bp.stop;\r\n bpLength = bpStop - bpStart;\r\n iscnStart = band.iscn.start;\r\n iscnStop = band.iscn.stop;\r\n iscnLength = iscnStop - iscnStart;\r\n pxStart = band.px.start;\r\n pxLength = band.px.width;\r\n\r\n if (bp >= bpStart && bp <= bpStop) {\r\n bpToIscnScale = iscnLength / bpLength;\r\n iscn = iscnStart + (bp - bpStart) * bpToIscnScale;\r\n px = pxStart + (pxLength * (iscn - iscnStart) / (iscnLength));\r\n\r\n return [px, band];\r\n }\r\n }\r\n return [null, band];\r\n}\r\n\r\n/**\r\n * Converts base pair coordinates to pixel offsets.\r\n * Bp-to-pixel scales differ among cytogenetic bands.\r\n *\r\n * For example, if we want to depict a gene on a chromosome, then we need\r\n * to convert the gene's location in base pairs to a location in pixels offset\r\n * from the start of the chromosome.\r\n */\r\nfunction convertBpToPx(chr, bp) {\r\n var band, px;\r\n\r\n if (chr.bands.length > 1 || chr.name === 'MT') {\r\n [px, band] = getPx(chr, bp);\r\n if (px !== null) return px;\r\n } else if (bp >= 1 && bp <= chr.length) {\r\n px = chr.scale.bp * bp;\r\n return px;\r\n }\r\n\r\n throwBpToPxError(bp, chr, band);\r\n}\r\n\r\nfunction throwPxToBpError(px, chr, pxStop) {\r\n throw new Error(\r\n 'Pixel out of range. ' +\r\n 'px: ' + px + '; length of chr' + chr.name + ': ' + pxStop\r\n );\r\n}\r\n\r\nfunction getBp(iscnStop, iscnStart, px, pxStop, pxStart, band, iscnLength) {\r\n var pxLength, bpLength, pxToIscnScale, iscn, bp;\r\n\r\n iscnLength = iscnStop - iscnStart;\r\n pxLength = pxStop - pxStart;\r\n bpLength = band.bp.stop - band.bp.start;\r\n\r\n pxToIscnScale = iscnLength / pxLength;\r\n iscn = iscnStart + (px - pxStart) * pxToIscnScale;\r\n\r\n bp = band.bp.start + (bpLength * (iscn - iscnStart) / iscnLength);\r\n\r\n return Math.round(bp);\r\n}\r\n\r\n/**\r\n * Converts pixel offsets to base pair coordinates.\r\n * Pixel-to-bp scales differ among cytogenetic bands.\r\n *\r\n * For example, if we want to determine the genomic location a user clicked on\r\n * (e.g. when creating a brush / sliding window region), then we need to\r\n * convert pixels to base pairs.\r\n */\r\nfunction convertPxToBp(chr, px) {\r\n var i, band, bp, pxStart, pxStop, iscnStart, iscnStop, iscnLength;\r\n\r\n if (px === 0) {\r\n px = chr.bands[0].px.start;\r\n }\r\n\r\n for (i = 0; i < chr.bands.length; i++) {\r\n band = chr.bands[i];\r\n\r\n pxStart = band.px.start;\r\n pxStop = band.px.stop;\r\n iscnStart = band.iscn.start;\r\n iscnStop = band.iscn.stop;\r\n\r\n if (px >= pxStart && px <= pxStop) {\r\n bp = getBp(iscnStop, iscnStart, px, pxStop, pxStart, band, iscnLength);\r\n return bp;\r\n }\r\n }\r\n throwPxToBpError(px, chr, pxStop);\r\n}\r\n\r\nexport {convertBpToPx, convertPxToBp};\r\n","let array8 = arrayUntyped,\n array16 = arrayUntyped,\n array32 = arrayUntyped,\n arrayLengthen = arrayLengthenUntyped,\n arrayWiden = arrayWidenUntyped;\nif (typeof Uint8Array !== \"undefined\") {\n array8 = function(n) { return new Uint8Array(n); };\n array16 = function(n) { return new Uint16Array(n); };\n array32 = function(n) { return new Uint32Array(n); };\n\n arrayLengthen = function(array, length) {\n if (array.length >= length) return array;\n var copy = new array.constructor(length);\n copy.set(array);\n return copy;\n };\n\n arrayWiden = function(array, width) {\n var copy;\n switch (width) {\n case 16: copy = array16(array.length); break;\n case 32: copy = array32(array.length); break;\n default: throw new Error(\"invalid array width!\");\n }\n copy.set(array);\n return copy;\n };\n}\n\nfunction arrayUntyped(n) {\n var array = new Array(n), i = -1;\n while (++i < n) array[i] = 0;\n return array;\n}\n\nfunction arrayLengthenUntyped(array, length) {\n var n = array.length;\n while (n < length) array[n++] = 0;\n return array;\n}\n\nfunction arrayWidenUntyped(array, width) {\n if (width > 32) throw new Error(\"invalid array width!\");\n return array;\n}\n\n// An arbitrarily-wide array of bitmasks\nfunction bitarray(n) {\n this.length = n;\n this.subarrays = 1;\n this.width = 8;\n this.masks = {\n 0: 0\n }\n\n this[0] = array8(n);\n}\n\nbitarray.prototype.lengthen = function(n) {\n var i, len;\n for (i = 0, len = this.subarrays; i < len; ++i) {\n this[i] = arrayLengthen(this[i], n);\n }\n this.length = n;\n};\n\n// Reserve a new bit index in the array, returns {offset, one}\nbitarray.prototype.add = function() {\n var m, w, one, i, len;\n\n for (i = 0, len = this.subarrays; i < len; ++i) {\n m = this.masks[i];\n w = this.width - (32 * i);\n // isolate the rightmost zero bit and return it as an unsigned int of 32 bits, if NaN or -1, return a 0 \n one = (~m & (m + 1)) >>> 0;\n\n if (w >= 32 && !one) {\n continue;\n }\n\n if (w < 32 && (one & (1 << w))) {\n // widen this subarray\n this[i] = arrayWiden(this[i], w <<= 1);\n this.width = 32 * i + w;\n }\n\n this.masks[i] |= one;\n\n return {\n offset: i,\n one: one\n };\n }\n\n // add a new subarray\n this[this.subarrays] = array8(this.length);\n this.masks[this.subarrays] = 1;\n this.width += 8;\n return {\n offset: this.subarrays++,\n one: 1\n };\n};\n\n// Copy record from index src to index dest\nbitarray.prototype.copy = function(dest, src) {\n var i, len;\n for (i = 0, len = this.subarrays; i < len; ++i) {\n this[i][dest] = this[i][src];\n }\n};\n\n// Truncate the array to the given length\nbitarray.prototype.truncate = function(n) {\n var i, len;\n for (i = 0, len = this.subarrays; i < len; ++i) {\n for (var j = this.length - 1; j >= n; j--) {\n this[i][j] = 0;\n }\n }\n this.length = n;\n};\n\n// Checks that all bits for the given index are 0\nbitarray.prototype.zero = function(n) {\n var i, len;\n for (i = 0, len = this.subarrays; i < len; ++i) {\n if (this[i][n]) {\n return false;\n }\n }\n return true;\n};\n\n// Checks that all bits for the given index are 0 except for possibly one\nbitarray.prototype.zeroExcept = function(n, offset, zero) {\n var i, len;\n for (i = 0, len = this.subarrays; i < len; ++i) {\n if (i === offset ? this[i][n] & zero : this[i][n]) {\n return false;\n }\n }\n return true;\n};\n\n// Checks that all bits for the given index are 0 except for the specified mask.\n// The mask should be an array of the same size as the filter subarrays width.\nbitarray.prototype.zeroExceptMask = function(n, mask) {\n var i, len;\n for (i = 0, len = this.subarrays; i < len; ++i) {\n if (this[i][n] & mask[i]) {\n return false;\n }\n }\n return true;\n}\n\n// Checks that only the specified bit is set for the given index\nbitarray.prototype.only = function(n, offset, one) {\n var i, len;\n for (i = 0, len = this.subarrays; i < len; ++i) {\n if (this[i][n] != (i === offset ? one : 0)) {\n return false;\n }\n }\n return true;\n};\n\n// Checks that only the specified bit is set for the given index except for possibly one other\nbitarray.prototype.onlyExcept = function(n, offset, zero, onlyOffset, onlyOne) {\n var mask;\n var i, len;\n for (i = 0, len = this.subarrays; i < len; ++i) {\n mask = this[i][n];\n if (i === offset)\n mask &= zero;\n if (mask != (i === onlyOffset ? onlyOne : 0)) {\n return false;\n }\n }\n return true;\n};\n\nexport default {\n array8: arrayUntyped,\n array16: arrayUntyped,\n array32: arrayUntyped,\n arrayLengthen: arrayLengthenUntyped,\n arrayWiden: arrayWidenUntyped,\n bitarray: bitarray\n};\n","const filterExact = (bisect, value) => {\n return function(values) {\n var n = values.length;\n return [bisect.left(values, value, 0, n), bisect.right(values, value, 0, n)];\n };\n}\n\nconst filterRange = (bisect, range) => {\n var min = range[0],\n max = range[1];\n return function(values) {\n var n = values.length;\n return [bisect.left(values, min, 0, n), bisect.left(values, max, 0, n)];\n };\n}\n\nconst filterAll = values => {\n return [0, values.length];\n}\n\nexport default {\n filterExact,\n filterRange,\n filterAll\n};\n","export default d => {\n return d;\n};\n","export default () => {\n return null;\n}\n","export default () => {\n return 0;\n}\n","import identity from './identity';\n\nfunction heap_by(f) {\n\n // Builds a binary heap within the specified array a[lo:hi]. The heap has the\n // property such that the parent a[lo+i] is always less than or equal to its\n // two children: a[lo+2*i+1] and a[lo+2*i+2].\n function heap(a, lo, hi) {\n var n = hi - lo,\n i = (n >>> 1) + 1;\n while (--i > 0) sift(a, i, n, lo);\n return a;\n }\n\n // Sorts the specified array a[lo:hi] in descending order, assuming it is\n // already a heap.\n function sort(a, lo, hi) {\n var n = hi - lo,\n t;\n while (--n > 0) t = a[lo], a[lo] = a[lo + n], a[lo + n] = t, sift(a, 1, n, lo);\n return a;\n }\n\n // Sifts the element a[lo+i-1] down the heap, where the heap is the contiguous\n // slice of array a[lo:lo+n]. This method can also be used to update the heap\n // incrementally, without incurring the full cost of reconstructing the heap.\n function sift(a, i, n, lo) {\n var d = a[--lo + i],\n x = f(d),\n child;\n while ((child = i << 1) <= n) {\n if (child < n && f(a[lo + child]) > f(a[lo + child + 1])) child++;\n if (x <= f(a[lo + child])) break;\n a[lo + i] = a[lo + child];\n i = child;\n }\n a[lo + i] = d;\n }\n\n heap.sort = sort;\n return heap;\n}\n\nconst h = heap_by(identity);\nh.by = heap_by;\n\nexport default h;\n","import identity from './identity';\nimport xFilterHeap from './heap';\n\nfunction heapselect_by(f) {\n var heap = xFilterHeap.by(f);\n\n // Returns a new array containing the top k elements in the array a[lo:hi].\n // The returned array is not sorted, but maintains the heap property. If k is\n // greater than hi - lo, then fewer than k elements will be returned. The\n // order of elements in a is unchanged by this operation.\n function heapselect(a, lo, hi, k) {\n var queue = new Array(k = Math.min(hi - lo, k)),\n min,\n i,\n d;\n\n for (i = 0; i < k; ++i) queue[i] = a[lo++];\n heap(queue, 0, k);\n\n if (lo < hi) {\n min = f(queue[0]);\n do {\n if (f(d = a[lo]) > min) {\n queue[0] = d;\n min = f(heap(queue, 0, k)[0]);\n }\n } while (++lo < hi);\n }\n\n return queue;\n }\n\n return heapselect;\n}\n\n\nconst h = heapselect_by(identity);\nh.by = heapselect_by; // assign the raw function to the export as well\n\nexport default h;\n","import identity from './identity';\n\nfunction bisect_by(f) {\n\n // Locate the insertion point for x in a to maintain sorted order. The\n // arguments lo and hi may be used to specify a subset of the array which\n // should be considered; by default the entire array is used. If x is already\n // present in a, the insertion point will be before (to the left of) any\n // existing entries. The return value is suitable for use as the first\n // argument to `array.splice` assuming that a is already sorted.\n //\n // The returned insertion point i partitions the array a into two halves so\n // that all v < x for v in a[lo:i] for the left side and all v >= x for v in\n // a[i:hi] for the right side.\n function bisectLeft(a, x, lo, hi) {\n while (lo < hi) {\n var mid = lo + hi >>> 1;\n if (f(a[mid]) < x) lo = mid + 1;\n else hi = mid;\n }\n return lo;\n }\n\n // Similar to bisectLeft, but returns an insertion point which comes after (to\n // the right of) any existing entries of x in a.\n //\n // The returned insertion point i partitions the array into two halves so that\n // all v <= x for v in a[lo:i] for the left side and all v > x for v in\n // a[i:hi] for the right side.\n function bisectRight(a, x, lo, hi) {\n while (lo < hi) {\n var mid = lo + hi >>> 1;\n if (x < f(a[mid])) hi = mid;\n else lo = mid + 1;\n }\n return lo;\n }\n\n bisectRight.right = bisectRight;\n bisectRight.left = bisectLeft;\n return bisectRight;\n}\n\nconst bisect = bisect_by(identity);\nbisect.by = bisect_by; // assign the raw function to the export as well\n\nexport default bisect;\n\n","export default (array, index, deep) => {\n for (var i = 0, n = index.length, copy = deep ? JSON.parse(JSON.stringify(array)) : new Array(n); i < n; ++i) {\n copy[i] = array[index[i]];\n }\n return copy;\n}\n","const reduceIncrement = p => {\n return p + 1;\n}\n\nconst reduceDecrement = p => {\n return p - 1;\n}\n\nconst reduceAdd = f => {\n return function(p, v) {\n return p + +f(v);\n };\n}\n\nconst reduceSubtract = f => {\n return function(p, v) {\n return p - f(v);\n };\n}\n\nexport default {\n reduceIncrement,\n reduceDecrement,\n reduceAdd,\n reduceSubtract\n};\n","import deep from \"@ranfdev/deepobj\"\n// Note(cg): result was previsouly using lodash.result, not ESM compatible.\n \nconst get = (obj, prop) => {\n const value = obj[prop];\n return (typeof value === 'function') ? value.call(obj) : value;\n}\n\n/**\n * get value of object at a deep path.\n * if the resolved value is a function,\n * it's invoked with the `this` binding of \n * its parent object and its result is returned. \n * \n * @param {Object} obj the object (e.g. { 'a': [{ 'b': { 'c1': 3, 'c2': 4} }], 'd': {e:1} }; )\n * @param {String} path deep path (e.g. `d.e`` or `a[0].b.c1`. Dot notation (a.0.b)is also supported)\n * @return {Any} the resolved value\n */\nconst reg = /\\[([\\w\\d]+)\\]/g;\nexport default (obj, path) => {\n return deep(get, obj, path.replace(reg, '.$1'))\n}\n","export default function(t,e,i,n,r){for(r in n=(i=i.split(\".\")).splice(-1,1),i)e=e[i[r]]=e[i[r]]||{};return t(e,n)};\n//# sourceMappingURL=deepobj.m.js.map\n","import xfilterArray from './array';\nimport xfilterFilter from './filter';\nimport cr_identity from './identity';\nimport cr_null from './null';\nimport cr_zero from './zero';\nimport xfilterHeapselect from './heapselect';\nimport xfilterHeap from './heap';\nimport bisect from './bisect';\nimport permute from './permute';\nimport xfilterReduce from './reduce';\nimport result from './result';\n\n// constants\nvar REMOVED_INDEX = -1;\n\ncrossfilter.heap = xfilterHeap;\ncrossfilter.heapselect = xfilterHeapselect;\ncrossfilter.bisect = bisect;\ncrossfilter.permute = permute;\nexport default crossfilter;\n\nfunction crossfilter() {\n var crossfilter = {\n add: add,\n remove: removeData,\n dimension: dimension,\n groupAll: groupAll,\n size: size,\n all: all,\n allFiltered: allFiltered,\n onChange: onChange,\n isElementFiltered: isElementFiltered\n };\n\n var data = [], // the records\n n = 0, // the number of records; data.length\n filters, // 1 is filtered out\n filterListeners = [], // when the filters change\n dataListeners = [], // when data is added\n removeDataListeners = [], // when data is removed\n callbacks = [];\n\n filters = new xfilterArray.bitarray(0);\n\n // Adds the specified new records to this crossfilter.\n function add(newData) {\n var n0 = n,\n n1 = newData.length;\n\n // If there's actually new data to add…\n // Merge the new data into the existing data.\n // Lengthen the filter bitset to handle the new records.\n // Notify listeners (dimensions and groups) that new data is available.\n if (n1) {\n data = data.concat(newData);\n filters.lengthen(n += n1);\n dataListeners.forEach(function(l) { l(newData, n0, n1); });\n triggerOnChange('dataAdded');\n }\n\n return crossfilter;\n }\n\n // Removes all records that match the current filters, or if a predicate function is passed,\n // removes all records matching the predicate (ignoring filters).\n function removeData(predicate) {\n var // Mapping from old record indexes to new indexes (after records removed)\n newIndex = new Array(n),\n removed = [],\n usePred = typeof predicate === 'function',\n shouldRemove = function (i) {\n return usePred ? predicate(data[i], i) : filters.zero(i)\n };\n\n for (var index1 = 0, index2 = 0; index1 < n; ++index1) {\n if ( shouldRemove(index1) ) {\n removed.push(index1);\n newIndex[index1] = REMOVED_INDEX;\n } else {\n newIndex[index1] = index2++;\n }\n }\n\n // Remove all matching records from groups.\n filterListeners.forEach(function(l) { l(-1, -1, [], removed, true); });\n\n // Update indexes.\n removeDataListeners.forEach(function(l) { l(newIndex); });\n\n // Remove old filters and data by overwriting.\n for (var index3 = 0, index4 = 0; index3 < n; ++index3) {\n if ( newIndex[index3] !== REMOVED_INDEX ) {\n if (index3 !== index4) filters.copy(index4, index3), data[index4] = data[index3];\n ++index4;\n }\n }\n\n data.length = n = index4;\n filters.truncate(index4);\n triggerOnChange('dataRemoved');\n }\n\n function maskForDimensions(dimensions) {\n var n,\n d,\n len,\n id,\n mask = Array(filters.subarrays);\n for (n = 0; n < filters.subarrays; n++) { mask[n] = ~0; }\n for (d = 0, len = dimensions.length; d < len; d++) {\n // The top bits of the ID are the subarray offset and the lower bits are the bit\n // offset of the \"one\" mask.\n id = dimensions[d].id();\n mask[id >> 7] &= ~(0x1 << (id & 0x3f));\n }\n return mask;\n }\n\n // Return true if the data element at index i is filtered IN.\n // Optionally, ignore the filters of any dimensions in the ignore_dimensions list.\n function isElementFiltered(i, ignore_dimensions) {\n var mask = maskForDimensions(ignore_dimensions || []);\n return filters.zeroExceptMask(i,mask);\n }\n\n // Adds a new dimension with the specified value accessor function.\n function dimension(value, iterable) {\n\n if (typeof value === 'string') {\n var accessorPath = value;\n value = function(d) { return result(d, accessorPath); };\n }\n\n var dimension = {\n filter: filter,\n filterExact: filterExact,\n filterRange: filterRange,\n filterFunction: filterFunction,\n filterAll: filterAll,\n currentFilter: currentFilter,\n hasCurrentFilter: hasCurrentFilter,\n top: top,\n bottom: bottom,\n group: group,\n groupAll: groupAll,\n dispose: dispose,\n remove: dispose, // for backwards-compatibility\n accessor: value,\n id: function() { return id; }\n };\n\n var one, // lowest unset bit as mask, e.g., 00001000\n zero, // inverted one, e.g., 11110111\n offset, // offset into the filters arrays\n id, // unique ID for this dimension (reused when dimensions are disposed)\n values, // sorted, cached array\n index, // maps sorted value index -> record index (in data)\n newValues, // temporary array storing newly-added values\n newIndex, // temporary array storing newly-added index\n iterablesIndexCount,\n iterablesIndexFilterStatus,\n iterablesEmptyRows = [],\n sortRange = function(n) {\n return cr_range(n).sort(function(A, B) {\n var a = newValues[A], b = newValues[B];\n return a < b ? -1 : a > b ? 1 : A - B;\n });\n },\n refilter = xfilterFilter.filterAll, // for recomputing filter\n refilterFunction, // the custom filter function in use\n filterValue, // the value used for filtering (value, array, function or undefined)\n filterValuePresent, // true if filterValue contains something\n indexListeners = [], // when data is added\n dimensionGroups = [],\n lo0 = 0,\n hi0 = 0,\n t = 0,\n k;\n\n // Updating a dimension is a two-stage process. First, we must update the\n // associated filters for the newly-added records. Once all dimensions have\n // updated their filters, the groups are notified to update.\n dataListeners.unshift(preAdd);\n dataListeners.push(postAdd);\n\n removeDataListeners.push(removeData);\n\n // Add a new dimension in the filter bitmap and store the offset and bitmask.\n var tmp = filters.add();\n offset = tmp.offset;\n one = tmp.one;\n zero = ~one;\n\n // Create a unique ID for the dimension\n // IDs will be re-used if dimensions are disposed.\n // For internal use the ID is the subarray offset shifted left 7 bits or'd with the\n // bit offset of the set bit in the dimension's \"one\" mask.\n id = (offset << 7) | (Math.log(one) / Math.log(2));\n\n preAdd(data, 0, n);\n postAdd(data, 0, n);\n\n // Incorporates the specified new records into this dimension.\n // This function is responsible for updating filters, values, and index.\n function preAdd(newData, n0, n1) {\n var newIterablesIndexCount,\n newIterablesIndexFilterStatus;\n\n if (iterable){\n // Count all the values\n t = 0;\n j = 0;\n k = [];\n\n for (var i0 = 0; i0 < newData.length; i0++) {\n for(j = 0, k = value(newData[i0]); j < k.length; j++) {\n t++;\n }\n }\n\n newValues = [];\n newIterablesIndexCount = cr_range(newData.length);\n newIterablesIndexFilterStatus = cr_index(t,1);\n var unsortedIndex = cr_range(t);\n\n for (var l = 0, index1 = 0; index1 < newData.length; index1++) {\n k = value(newData[index1])\n //\n if(!k.length){\n newIterablesIndexCount[index1] = 0;\n iterablesEmptyRows.push(index1 + n0);\n continue;\n }\n newIterablesIndexCount[index1] = k.length\n for (j = 0; j < k.length; j++) {\n newValues.push(k[j]);\n unsortedIndex[l] = index1;\n l++;\n }\n }\n\n // Create the Sort map used to sort both the values and the valueToData indices\n var sortMap = sortRange(t);\n\n // Use the sortMap to sort the newValues\n newValues = permute(newValues, sortMap);\n\n\n // Use the sortMap to sort the unsortedIndex map\n // newIndex should be a map of sortedValue -> crossfilterData\n newIndex = permute(unsortedIndex, sortMap)\n\n } else{\n // Permute new values into natural order using a standard sorted index.\n newValues = newData.map(value);\n newIndex = sortRange(n1);\n newValues = permute(newValues, newIndex);\n }\n\n // Bisect newValues to determine which new records are selected.\n var bounds = refilter(newValues), lo1 = bounds[0], hi1 = bounds[1];\n\n var index2, index3, index4;\n if(iterable) {\n n1 = t;\n if (refilterFunction) {\n for (index2 = 0; index2 < n1; ++index2) {\n if (!refilterFunction(newValues[index2], index2)) {\n if(--newIterablesIndexCount[newIndex[index2]] === 0) {\n filters[offset][newIndex[index2] + n0] |= one;\n }\n newIterablesIndexFilterStatus[index2] = 1;\n }\n }\n } else {\n for (index3 = 0; index3 < lo1; ++index3) {\n if(--newIterablesIndexCount[newIndex[index3]] === 0) {\n filters[offset][newIndex[index3] + n0] |= one;\n }\n newIterablesIndexFilterStatus[index3] = 1;\n }\n for (index4 = hi1; index4 < n1; ++index4) {\n if(--newIterablesIndexCount[newIndex[index4]] === 0) {\n filters[offset][newIndex[index4] + n0] |= one;\n }\n newIterablesIndexFilterStatus[index4] = 1;\n }\n }\n } else {\n if (refilterFunction) {\n for (index2 = 0; index2 < n1; ++index2) {\n if (!refilterFunction(newValues[index2], index2)) {\n filters[offset][newIndex[index2] + n0] |= one;\n }\n }\n } else {\n for (index3 = 0; index3 < lo1; ++index3) {\n filters[offset][newIndex[index3] + n0] |= one;\n }\n for (index4 = hi1; index4 < n1; ++index4) {\n filters[offset][newIndex[index4] + n0] |= one;\n }\n }\n }\n\n // If this dimension previously had no data, then we don't need to do the\n // more expensive merge operation; use the new values and index as-is.\n if (!n0) {\n values = newValues;\n index = newIndex;\n iterablesIndexCount = newIterablesIndexCount;\n iterablesIndexFilterStatus = newIterablesIndexFilterStatus;\n lo0 = lo1;\n hi0 = hi1;\n return;\n }\n\n\n\n var oldValues = values,\n oldIndex = index,\n oldIterablesIndexFilterStatus = iterablesIndexFilterStatus,\n old_n0,\n i1 = 0;\n\n i0 = 0;\n\n if(iterable){\n old_n0 = n0\n n0 = oldValues.length;\n n1 = t\n }\n\n // Otherwise, create new arrays into which to merge new and old.\n values = iterable ? new Array(n0 + n1) : new Array(n);\n index = iterable ? new Array(n0 + n1) : cr_index(n, n);\n if(iterable) iterablesIndexFilterStatus = cr_index(n0 + n1, 1);\n\n // Concatenate the newIterablesIndexCount onto the old one.\n if(iterable) {\n var oldiiclength = iterablesIndexCount.length;\n iterablesIndexCount = xfilterArray.arrayLengthen(iterablesIndexCount, n);\n for(var j=0; j+oldiiclength < n; j++) {\n iterablesIndexCount[j+oldiiclength] = newIterablesIndexCount[j];\n }\n }\n\n // Merge the old and new sorted values, and old and new index.\n var index5 = 0;\n for (; i0 < n0 && i1 < n1; ++index5) {\n if (oldValues[i0] < newValues[i1]) {\n values[index5] = oldValues[i0];\n if(iterable) iterablesIndexFilterStatus[index5] = oldIterablesIndexFilterStatus[i0];\n index[index5] = oldIndex[i0++];\n } else {\n values[index5] = newValues[i1];\n if(iterable) iterablesIndexFilterStatus[index5] = newIterablesIndexFilterStatus[i1];\n index[index5] = newIndex[i1++] + (iterable ? old_n0 : n0);\n }\n }\n\n // Add any remaining old values.\n for (; i0 < n0; ++i0, ++index5) {\n values[index5] = oldValues[i0];\n if(iterable) iterablesIndexFilterStatus[index5] = oldIterablesIndexFilterStatus[i0];\n index[index5] = oldIndex[i0];\n }\n\n // Add any remaining new values.\n for (; i1 < n1; ++i1, ++index5) {\n values[index5] = newValues[i1];\n if(iterable) iterablesIndexFilterStatus[index5] = newIterablesIndexFilterStatus[i1];\n index[index5] = newIndex[i1] + (iterable ? old_n0 : n0);\n }\n\n // Bisect again to recompute lo0 and hi0.\n bounds = refilter(values), lo0 = bounds[0], hi0 = bounds[1];\n }\n\n // When all filters have updated, notify index listeners of the new values.\n function postAdd(newData, n0, n1) {\n indexListeners.forEach(function(l) { l(newValues, newIndex, n0, n1); });\n newValues = newIndex = null;\n }\n\n function removeData(reIndex) {\n if (iterable) {\n for (var i0 = 0, i1 = 0; i0 < iterablesEmptyRows.length; i0++) {\n if (reIndex[iterablesEmptyRows[i0]] !== REMOVED_INDEX) {\n iterablesEmptyRows[i1] = reIndex[iterablesEmptyRows[i0]];\n i1++;\n }\n }\n iterablesEmptyRows.length = i1;\n for (i0 = 0, i1 = 0; i0 < n; i0++) {\n if (reIndex[i0] !== REMOVED_INDEX) {\n if (i1 !== i0) iterablesIndexCount[i1] = iterablesIndexCount[i0];\n i1++;\n }\n }\n iterablesIndexCount = iterablesIndexCount.slice(0, i1);\n }\n // Rewrite our index, overwriting removed values\n var n0 = values.length;\n for (var i = 0, j = 0, oldDataIndex; i < n0; ++i) {\n oldDataIndex = index[i];\n if (reIndex[oldDataIndex] !== REMOVED_INDEX) {\n if (i !== j) values[j] = values[i];\n index[j] = reIndex[oldDataIndex];\n if (iterable) {\n iterablesIndexFilterStatus[j] = iterablesIndexFilterStatus[i];\n }\n ++j;\n }\n }\n values.length = j;\n if (iterable) iterablesIndexFilterStatus = iterablesIndexFilterStatus.slice(0, j);\n while (j < n0) index[j++] = 0;\n\n // Bisect again to recompute lo0 and hi0.\n var bounds = refilter(values);\n lo0 = bounds[0], hi0 = bounds[1];\n }\n\n // Updates the selected values based on the specified bounds [lo, hi].\n // This implementation is used by all the public filter methods.\n function filterIndexBounds(bounds) {\n\n var lo1 = bounds[0],\n hi1 = bounds[1];\n\n if (refilterFunction) {\n refilterFunction = null;\n filterIndexFunction(function(d, i) { return lo1 <= i && i < hi1; }, bounds[0] === 0 && bounds[1] === values.length);\n lo0 = lo1;\n hi0 = hi1;\n return dimension;\n }\n\n var i,\n j,\n k,\n added = [],\n removed = [],\n valueIndexAdded = [],\n valueIndexRemoved = [];\n\n\n // Fast incremental update based on previous lo index.\n if (lo1 < lo0) {\n for (i = lo1, j = Math.min(lo0, hi1); i < j; ++i) {\n added.push(index[i]);\n valueIndexAdded.push(i);\n }\n } else if (lo1 > lo0) {\n for (i = lo0, j = Math.min(lo1, hi0); i < j; ++i) {\n removed.push(index[i]);\n valueIndexRemoved.push(i);\n }\n }\n\n // Fast incremental update based on previous hi index.\n if (hi1 > hi0) {\n for (i = Math.max(lo1, hi0), j = hi1; i < j; ++i) {\n added.push(index[i]);\n valueIndexAdded.push(i);\n }\n } else if (hi1 < hi0) {\n for (i = Math.max(lo0, hi1), j = hi0; i < j; ++i) {\n removed.push(index[i]);\n valueIndexRemoved.push(i);\n }\n }\n\n if(!iterable) {\n // Flip filters normally.\n\n for(i=0; i 0) toSkip = top_offset;\n\n while (--i >= lo0 && k > 0) {\n if (filters.zero(j = index[i])) {\n if(toSkip > 0) {\n //skip matching row\n --toSkip;\n } else {\n array.push(data[j]);\n --k;\n }\n }\n }\n\n if(iterable){\n for(i = 0; i < iterablesEmptyRows.length && k > 0; i++) {\n // Add row with empty iterable column at the end\n if(filters.zero(j = iterablesEmptyRows[i])) {\n if(toSkip > 0) {\n //skip matching row\n --toSkip;\n } else {\n array.push(data[j]);\n --k;\n }\n }\n }\n }\n\n return array;\n }\n\n // Returns the bottom K selected records based on this dimension's order.\n // Note: observes this dimension's filter, unlike group and groupAll.\n function bottom(k, bottom_offset) {\n var array = [],\n i,\n j,\n toSkip = 0;\n\n if(bottom_offset && bottom_offset > 0) toSkip = bottom_offset;\n\n if(iterable) {\n // Add row with empty iterable column at the top\n for(i = 0; i < iterablesEmptyRows.length && k > 0; i++) {\n if(filters.zero(j = iterablesEmptyRows[i])) {\n if(toSkip > 0) {\n //skip matching row\n --toSkip;\n } else {\n array.push(data[j]);\n --k;\n }\n }\n }\n }\n\n i = lo0;\n\n while (i < hi0 && k > 0) {\n if (filters.zero(j = index[i])) {\n if(toSkip > 0) {\n //skip matching row\n --toSkip;\n } else {\n array.push(data[j]);\n --k;\n }\n }\n i++;\n }\n\n return array;\n }\n\n // Adds a new group to this dimension, using the specified key function.\n function group(key) {\n var group = {\n top: top,\n all: all,\n reduce: reduce,\n reduceCount: reduceCount,\n reduceSum: reduceSum,\n order: order,\n orderNatural: orderNatural,\n size: size,\n dispose: dispose,\n remove: dispose // for backwards-compatibility\n };\n\n // Ensure that this group will be removed when the dimension is removed.\n dimensionGroups.push(group);\n\n var groups, // array of {key, value}\n groupIndex, // object id ↦ group id\n groupWidth = 8,\n groupCapacity = capacity(groupWidth),\n k = 0, // cardinality\n select,\n heap,\n reduceAdd,\n reduceRemove,\n reduceInitial,\n update = cr_null,\n reset = cr_null,\n resetNeeded = true,\n groupAll = key === cr_null,\n n0old;\n\n if (arguments.length < 1) key = cr_identity;\n\n // The group listens to the crossfilter for when any dimension changes, so\n // that it can update the associated reduce values. It must also listen to\n // the parent dimension for when data is added, and compute new keys.\n filterListeners.push(update);\n indexListeners.push(add);\n removeDataListeners.push(removeData);\n\n // Incorporate any existing data into the grouping.\n add(values, index, 0, n);\n\n // Incorporates the specified new values into this group.\n // This function is responsible for updating groups and groupIndex.\n function add(newValues, newIndex, n0, n1) {\n\n if(iterable) {\n n0old = n0\n n0 = values.length - newValues.length\n n1 = newValues.length;\n }\n\n var oldGroups = groups,\n reIndex = iterable ? [] : cr_index(k, groupCapacity),\n add = reduceAdd,\n remove = reduceRemove,\n initial = reduceInitial,\n k0 = k, // old cardinality\n i0 = 0, // index of old group\n i1 = 0, // index of new record\n j, // object id\n g0, // old group\n x0, // old key\n x1, // new key\n g, // group to add\n x; // key of group to add\n\n // If a reset is needed, we don't need to update the reduce values.\n if (resetNeeded) add = initial = cr_null;\n if (resetNeeded) remove = initial = cr_null;\n\n // Reset the new groups (k is a lower bound).\n // Also, make sure that groupIndex exists and is long enough.\n groups = new Array(k), k = 0;\n if(iterable){\n groupIndex = k0 ? groupIndex : [];\n }\n else{\n groupIndex = k0 > 1 ? xfilterArray.arrayLengthen(groupIndex, n) : cr_index(n, groupCapacity);\n }\n\n\n // Get the first old key (x0 of g0), if it exists.\n if (k0) x0 = (g0 = oldGroups[0]).key;\n\n // Find the first new key (x1), skipping NaN keys.\n while (i1 < n1 && !((x1 = key(newValues[i1])) >= x1)) ++i1;\n\n // While new keys remain…\n while (i1 < n1) {\n\n // Determine the lesser of the two current keys; new and old.\n // If there are no old keys remaining, then always add the new key.\n if (g0 && x0 <= x1) {\n g = g0, x = x0;\n\n // Record the new index of the old group.\n reIndex[i0] = k;\n\n // Retrieve the next old key.\n g0 = oldGroups[++i0];\n if (g0) x0 = g0.key;\n } else {\n g = {key: x1, value: initial()}, x = x1;\n }\n\n // Add the lesser group.\n groups[k] = g;\n\n // Add any selected records belonging to the added group, while\n // advancing the new key and populating the associated group index.\n\n while (x1 <= x) {\n j = newIndex[i1] + (iterable ? n0old : n0)\n\n\n if(iterable){\n if(groupIndex[j]){\n groupIndex[j].push(k)\n }\n else{\n groupIndex[j] = [k]\n }\n }\n else{\n groupIndex[j] = k;\n }\n\n // Always add new values to groups. Only remove when not in filter.\n // This gives groups full information on data life-cycle.\n g.value = add(g.value, data[j], true);\n if (!filters.zeroExcept(j, offset, zero)) g.value = remove(g.value, data[j], false);\n if (++i1 >= n1) break;\n x1 = key(newValues[i1]);\n }\n\n groupIncrement();\n }\n\n // Add any remaining old groups that were greater th1an all new keys.\n // No incremental reduce is needed; these groups have no new records.\n // Also record the new index of the old group.\n while (i0 < k0) {\n groups[reIndex[i0] = k] = oldGroups[i0++];\n groupIncrement();\n }\n\n\n // Fill in gaps with empty arrays where there may have been rows with empty iterables\n if(iterable){\n for (var index1 = 0; index1 < n; index1++) {\n if(!groupIndex[index1]){\n groupIndex[index1] = [];\n }\n }\n }\n\n // If we added any new groups before any old groups,\n // update the group index of all the old records.\n if(k > i0){\n if(iterable){\n for (i0 = 0; i0 < n0old; ++i0) {\n for (index1 = 0; index1 < groupIndex[i0].length; index1++) {\n groupIndex[i0][index1] = reIndex[groupIndex[i0][index1]];\n }\n }\n }\n else{\n for (i0 = 0; i0 < n0; ++i0) {\n groupIndex[i0] = reIndex[groupIndex[i0]];\n }\n }\n }\n\n // Modify the update and reset behavior based on the cardinality.\n // If the cardinality is less than or equal to one, then the groupIndex\n // is not needed. If the cardinality is zero, then there are no records\n // and therefore no groups to update or reset. Note that we also must\n // change the registered listener to point to the new method.\n j = filterListeners.indexOf(update);\n if (k > 1 || iterable) {\n update = updateMany;\n reset = resetMany;\n } else {\n if (!k && groupAll) {\n k = 1;\n groups = [{key: null, value: initial()}];\n }\n if (k === 1) {\n update = updateOne;\n reset = resetOne;\n } else {\n update = cr_null;\n reset = cr_null;\n }\n groupIndex = null;\n }\n filterListeners[j] = update;\n\n // Count the number of added groups,\n // and widen the group index as needed.\n function groupIncrement() {\n if(iterable){\n k++\n return\n }\n if (++k === groupCapacity) {\n reIndex = xfilterArray.arrayWiden(reIndex, groupWidth <<= 1);\n groupIndex = xfilterArray.arrayWiden(groupIndex, groupWidth);\n groupCapacity = capacity(groupWidth);\n }\n }\n }\n\n function removeData(reIndex) {\n if (k > 1 || iterable) {\n var oldK = k,\n oldGroups = groups,\n seenGroups = cr_index(oldK, oldK),\n i,\n i0,\n j;\n\n // Filter out non-matches by copying matching group index entries to\n // the beginning of the array.\n if (!iterable) {\n for (i = 0, j = 0; i < n; ++i) {\n if (reIndex[i] !== REMOVED_INDEX) {\n seenGroups[groupIndex[j] = groupIndex[i]] = 1;\n ++j;\n }\n }\n } else {\n for (i = 0, j = 0; i < n; ++i) {\n if (reIndex[i] !== REMOVED_INDEX) {\n groupIndex[j] = groupIndex[i];\n for (i0 = 0; i0 < groupIndex[j].length; i0++) {\n seenGroups[groupIndex[j][i0]] = 1;\n }\n ++j;\n }\n }\n }\n\n // Reassemble groups including only those groups that were referred\n // to by matching group index entries. Note the new group index in\n // seenGroups.\n groups = [], k = 0;\n for (i = 0; i < oldK; ++i) {\n if (seenGroups[i]) {\n seenGroups[i] = k++;\n groups.push(oldGroups[i]);\n }\n }\n\n if (k > 1 || iterable) {\n // Reindex the group index using seenGroups to find the new index.\n if (!iterable) {\n for (i = 0; i < j; ++i) groupIndex[i] = seenGroups[groupIndex[i]];\n } else {\n for (i = 0; i < j; ++i) {\n for (i0 = 0; i0 < groupIndex[i].length; ++i0) {\n groupIndex[i][i0] = seenGroups[groupIndex[i][i0]];\n }\n }\n }\n } else {\n groupIndex = null;\n }\n filterListeners[filterListeners.indexOf(update)] = k > 1 || iterable\n ? (reset = resetMany, update = updateMany)\n : k === 1 ? (reset = resetOne, update = updateOne)\n : reset = update = cr_null;\n } else if (k === 1) {\n if (groupAll) return;\n for (var index3 = 0; index3 < n; ++index3) if (reIndex[index3] !== REMOVED_INDEX) return;\n groups = [], k = 0;\n filterListeners[filterListeners.indexOf(update)] =\n update = reset = cr_null;\n }\n }\n\n // Reduces the specified selected or deselected records.\n // This function is only used when the cardinality is greater than 1.\n // notFilter indicates a crossfilter.add/remove operation.\n function updateMany(filterOne, filterOffset, added, removed, notFilter) {\n\n if ((filterOne === one && filterOffset === offset) || resetNeeded) return;\n\n var i,\n j,\n k,\n n,\n g;\n\n if(iterable){\n // Add the added values.\n for (i = 0, n = added.length; i < n; ++i) {\n if (filters.zeroExcept(k = added[i], offset, zero)) {\n for (j = 0; j < groupIndex[k].length; j++) {\n g = groups[groupIndex[k][j]];\n g.value = reduceAdd(g.value, data[k], false, j);\n }\n }\n }\n\n // Remove the removed values.\n for (i = 0, n = removed.length; i < n; ++i) {\n if (filters.onlyExcept(k = removed[i], offset, zero, filterOffset, filterOne)) {\n for (j = 0; j < groupIndex[k].length; j++) {\n g = groups[groupIndex[k][j]];\n g.value = reduceRemove(g.value, data[k], notFilter, j);\n }\n }\n }\n return;\n }\n\n // Add the added values.\n for (i = 0, n = added.length; i < n; ++i) {\n if (filters.zeroExcept(k = added[i], offset, zero)) {\n g = groups[groupIndex[k]];\n g.value = reduceAdd(g.value, data[k], false);\n }\n }\n\n // Remove the removed values.\n for (i = 0, n = removed.length; i < n; ++i) {\n if (filters.onlyExcept(k = removed[i], offset, zero, filterOffset, filterOne)) {\n g = groups[groupIndex[k]];\n g.value = reduceRemove(g.value, data[k], notFilter);\n }\n }\n }\n\n // Reduces the specified selected or deselected records.\n // This function is only used when the cardinality is 1.\n // notFilter indicates a crossfilter.add/remove operation.\n function updateOne(filterOne, filterOffset, added, removed, notFilter) {\n if ((filterOne === one && filterOffset === offset) || resetNeeded) return;\n\n var i,\n k,\n n,\n g = groups[0];\n\n // Add the added values.\n for (i = 0, n = added.length; i < n; ++i) {\n if (filters.zeroExcept(k = added[i], offset, zero)) {\n g.value = reduceAdd(g.value, data[k], false);\n }\n }\n\n // Remove the removed values.\n for (i = 0, n = removed.length; i < n; ++i) {\n if (filters.onlyExcept(k = removed[i], offset, zero, filterOffset, filterOne)) {\n g.value = reduceRemove(g.value, data[k], notFilter);\n }\n }\n }\n\n // Recomputes the group reduce values from scratch.\n // This function is only used when the cardinality is greater than 1.\n function resetMany() {\n var i,\n j,\n g;\n\n // Reset all group values.\n for (i = 0; i < k; ++i) {\n groups[i].value = reduceInitial();\n }\n\n // We add all records and then remove filtered records so that reducers\n // can build an 'unfiltered' view even if there are already filters in\n // place on other dimensions.\n if(iterable){\n for (i = 0; i < n; ++i) {\n for (j = 0; j < groupIndex[i].length; j++) {\n g = groups[groupIndex[i][j]];\n g.value = reduceAdd(g.value, data[i], true, j);\n }\n }\n for (i = 0; i < n; ++i) {\n if (!filters.zeroExcept(i, offset, zero)) {\n for (j = 0; j < groupIndex[i].length; j++) {\n g = groups[groupIndex[i][j]];\n g.value = reduceRemove(g.value, data[i], false, j);\n }\n }\n }\n return;\n }\n\n for (i = 0; i < n; ++i) {\n g = groups[groupIndex[i]];\n g.value = reduceAdd(g.value, data[i], true);\n }\n for (i = 0; i < n; ++i) {\n if (!filters.zeroExcept(i, offset, zero)) {\n g = groups[groupIndex[i]];\n g.value = reduceRemove(g.value, data[i], false);\n }\n }\n }\n\n // Recomputes the group reduce values from scratch.\n // This function is only used when the cardinality is 1.\n function resetOne() {\n var i,\n g = groups[0];\n\n // Reset the singleton group values.\n g.value = reduceInitial();\n\n // We add all records and then remove filtered records so that reducers\n // can build an 'unfiltered' view even if there are already filters in\n // place on other dimensions.\n for (i = 0; i < n; ++i) {\n g.value = reduceAdd(g.value, data[i], true);\n }\n\n for (i = 0; i < n; ++i) {\n if (!filters.zeroExcept(i, offset, zero)) {\n g.value = reduceRemove(g.value, data[i], false);\n }\n }\n }\n\n // Returns the array of group values, in the dimension's natural order.\n function all() {\n if (resetNeeded) reset(), resetNeeded = false;\n return groups;\n }\n\n // Returns a new array containing the top K group values, in reduce order.\n function top(k) {\n var top = select(all(), 0, groups.length, k);\n return heap.sort(top, 0, top.length);\n }\n\n // Sets the reduce behavior for this group to use the specified functions.\n // This method lazily recomputes the reduce values, waiting until needed.\n function reduce(add, remove, initial) {\n reduceAdd = add;\n reduceRemove = remove;\n reduceInitial = initial;\n resetNeeded = true;\n return group;\n }\n\n // A convenience method for reducing by count.\n function reduceCount() {\n return reduce(xfilterReduce.reduceIncrement, xfilterReduce.reduceDecrement, cr_zero);\n }\n\n // A convenience method for reducing by sum(value).\n function reduceSum(value) {\n return reduce(xfilterReduce.reduceAdd(value), xfilterReduce.reduceSubtract(value), cr_zero);\n }\n\n // Sets the reduce order, using the specified accessor.\n function order(value) {\n select = xfilterHeapselect.by(valueOf);\n heap = xfilterHeap.by(valueOf);\n function valueOf(d) { return value(d.value); }\n return group;\n }\n\n // A convenience method for natural ordering by reduce value.\n function orderNatural() {\n return order(cr_identity);\n }\n\n // Returns the cardinality of this group, irrespective of any filters.\n function size() {\n return k;\n }\n\n // Removes this group and associated event listeners.\n function dispose() {\n var i = filterListeners.indexOf(update);\n if (i >= 0) filterListeners.splice(i, 1);\n i = indexListeners.indexOf(add);\n if (i >= 0) indexListeners.splice(i, 1);\n i = removeDataListeners.indexOf(removeData);\n if (i >= 0) removeDataListeners.splice(i, 1);\n i = dimensionGroups.indexOf(group);\n if (i >= 0) dimensionGroups.splice(i, 1);\n return group;\n }\n\n return reduceCount().orderNatural();\n }\n\n // A convenience function for generating a singleton group.\n function groupAll() {\n var g = group(cr_null), all = g.all;\n delete g.all;\n delete g.top;\n delete g.order;\n delete g.orderNatural;\n delete g.size;\n g.value = function() { return all()[0].value; };\n return g;\n }\n\n // Removes this dimension and associated groups and event listeners.\n function dispose() {\n dimensionGroups.forEach(function(group) { group.dispose(); });\n var i = dataListeners.indexOf(preAdd);\n if (i >= 0) dataListeners.splice(i, 1);\n i = dataListeners.indexOf(postAdd);\n if (i >= 0) dataListeners.splice(i, 1);\n i = removeDataListeners.indexOf(removeData);\n if (i >= 0) removeDataListeners.splice(i, 1);\n filters.masks[offset] &= zero;\n return filterAll();\n }\n\n return dimension;\n }\n\n // A convenience method for groupAll on a dummy dimension.\n // This implementation can be optimized since it always has cardinality 1.\n function groupAll() {\n var group = {\n reduce: reduce,\n reduceCount: reduceCount,\n reduceSum: reduceSum,\n value: value,\n dispose: dispose,\n remove: dispose // for backwards-compatibility\n };\n\n var reduceValue,\n reduceAdd,\n reduceRemove,\n reduceInitial,\n resetNeeded = true;\n\n // The group listens to the crossfilter for when any dimension changes, so\n // that it can update the reduce value. It must also listen to the parent\n // dimension for when data is added.\n filterListeners.push(update);\n dataListeners.push(add);\n\n // For consistency; actually a no-op since resetNeeded is true.\n add(data, 0, n);\n\n // Incorporates the specified new values into this group.\n function add(newData, n0) {\n var i;\n\n if (resetNeeded) return;\n\n // Cycle through all the values.\n for (i = n0; i < n; ++i) {\n\n // Add all values all the time.\n reduceValue = reduceAdd(reduceValue, data[i], true);\n\n // Remove the value if filtered.\n if (!filters.zero(i)) {\n reduceValue = reduceRemove(reduceValue, data[i], false);\n }\n }\n }\n\n // Reduces the specified selected or deselected records.\n function update(filterOne, filterOffset, added, removed, notFilter) {\n var i,\n k,\n n;\n\n if (resetNeeded) return;\n\n // Add the added values.\n for (i = 0, n = added.length; i < n; ++i) {\n if (filters.zero(k = added[i])) {\n reduceValue = reduceAdd(reduceValue, data[k], notFilter);\n }\n }\n\n // Remove the removed values.\n for (i = 0, n = removed.length; i < n; ++i) {\n if (filters.only(k = removed[i], filterOffset, filterOne)) {\n reduceValue = reduceRemove(reduceValue, data[k], notFilter);\n }\n }\n }\n\n // Recomputes the group reduce value from scratch.\n function reset() {\n var i;\n\n reduceValue = reduceInitial();\n\n // Cycle through all the values.\n for (i = 0; i < n; ++i) {\n\n // Add all values all the time.\n reduceValue = reduceAdd(reduceValue, data[i], true);\n\n // Remove the value if it is filtered.\n if (!filters.zero(i)) {\n reduceValue = reduceRemove(reduceValue, data[i], false);\n }\n }\n }\n\n // Sets the reduce behavior for this group to use the specified functions.\n // This method lazily recomputes the reduce value, waiting until needed.\n function reduce(add, remove, initial) {\n reduceAdd = add;\n reduceRemove = remove;\n reduceInitial = initial;\n resetNeeded = true;\n return group;\n }\n\n // A convenience method for reducing by count.\n function reduceCount() {\n return reduce(xfilterReduce.reduceIncrement, xfilterReduce.reduceDecrement, cr_zero);\n }\n\n // A convenience method for reducing by sum(value).\n function reduceSum(value) {\n return reduce(xfilterReduce.reduceAdd(value), xfilterReduce.reduceSubtract(value), cr_zero);\n }\n\n // Returns the computed reduce value.\n function value() {\n if (resetNeeded) reset(), resetNeeded = false;\n return reduceValue;\n }\n\n // Removes this group and associated event listeners.\n function dispose() {\n var i = filterListeners.indexOf(update);\n if (i >= 0) filterListeners.splice(i, 1);\n i = dataListeners.indexOf(add);\n if (i >= 0) dataListeners.splice(i, 1);\n return group;\n }\n\n return reduceCount();\n }\n\n // Returns the number of records in this crossfilter, irrespective of any filters.\n function size() {\n return n;\n }\n\n // Returns the raw row data contained in this crossfilter\n function all(){\n return data;\n }\n\n // Returns row data with all dimension filters applied, except for filters in ignore_dimensions\n function allFiltered(ignore_dimensions) {\n var array = [],\n i = 0,\n mask = maskForDimensions(ignore_dimensions || []);\n\n for (i = 0; i < n; i++) {\n if (filters.zeroExceptMask(i, mask)) {\n array.push(data[i]);\n }\n }\n\n return array;\n }\n\n function onChange(cb){\n if(typeof cb !== 'function'){\n /* eslint no-console: 0 */\n console.warn('onChange callback parameter must be a function!');\n return;\n }\n callbacks.push(cb);\n return function(){\n callbacks.splice(callbacks.indexOf(cb), 1);\n };\n }\n\n function triggerOnChange(eventName){\n for (var i = 0; i < callbacks.length; i++) {\n callbacks[i](eventName);\n }\n }\n\n return arguments.length\n ? add(arguments[0])\n : crossfilter;\n}\n\n// Returns an array of size n, big enough to store ids up to m.\nfunction cr_index(n, m) {\n return (m < 0x101\n ? xfilterArray.array8 : m < 0x10001\n ? xfilterArray.array16\n : xfilterArray.array32)(n);\n}\n\n// Constructs a new array of size n, with sequential values from 0 to n - 1.\nfunction cr_range(n) {\n var range = cr_index(n, n);\n for (var i = -1; ++i < n;) range[i] = i;\n return range;\n}\n\nfunction capacity(w) {\n return w === 8\n ? 0x100 : w === 16\n ? 0x10000\n : 0x100000000;\n}\n","import {d3} from './lib';\r\nimport crossfilter from 'crossfilter2';\r\n\r\n/* Decompresses ideogram's annotations for crossfilter initialization\r\nBy default, annotations are clustered by chromosome, e.g.\r\n[\r\n {\"chr\": \"1\", \"annots\": [{\"from\": 100, \"to\", 101, \"chr\": \"1\", ...}, ...]},\r\n {\"chr\": \"2\", \"annots\": [{\"from\": 500, \"to\", 501, \"chr\": \"2\", ...}, ...]},\r\n ...\r\n]\r\nThis method flattens that structure to e.g.\r\n[\r\n {\"from\": 100, \"to\": 101, \"chr\": \"1\", ...},\r\n ...\r\n {\"from\": 500, \"to\": 501, \"chr\": \"2\", ...},\r\n]\r\nSee also: packAnnots\r\n*/\r\nfunction unpackAnnots() {\r\n var chr, annots, i,\r\n unpackedAnnots = [],\r\n ideo = this,\r\n chrs = ideo.annots;\r\n\r\n for (i = 0; i < chrs.length; i++) {\r\n chr = chrs[i];\r\n annots = chr.annots;\r\n unpackedAnnots = unpackedAnnots.concat(annots);\r\n }\r\n\r\n return unpackedAnnots;\r\n}\r\n\r\n/*\r\n Compresses annots back to default state. Inverse of unpackAnnots.\r\n*/\r\nfunction packAnnots(unpackedAnnots) {\r\n var chr, annot, i,\r\n annots = [],\r\n ideo = this,\r\n chrs = ideo.annots;\r\n\r\n for (chr in chrs) {\r\n annots.push({chr: chrs[chr].chr, annots: []});\r\n }\r\n\r\n for (i = 0; i < unpackedAnnots.length; i++) {\r\n annot = unpackedAnnots[i];\r\n annots[annot.chrIndex].annots.push(annot);\r\n }\r\n\r\n return annots;\r\n}\r\n\r\n/*\r\n Initializes crossfilter. Needed for client-side filtering.\r\n More: https://github.com/square/crossfilter/wiki/API-Reference\r\n*/\r\nfunction initCrossFilter() {\r\n var i, facet,\r\n ideo = this,\r\n keys = ideo.rawAnnots.keys;\r\n\r\n ideo.unpackedAnnots = ideo.unpackAnnots();\r\n ideo.crossfilter = crossfilter(ideo.unpackedAnnots);\r\n\r\n ideo.annotsByFacet = {};\r\n ideo.facets = keys.slice(3, keys.length);\r\n\r\n for (i = 0; i < ideo.facets.length; i++) {\r\n facet = ideo.facets[i];\r\n ideo.annotsByFacet[facet] =\r\n ideo.crossfilter.dimension(function(d) {\r\n return d[facet];\r\n });\r\n }\r\n\r\n if ('filterSelections' in ideo) {\r\n ideo.filterAnnots(ideo.filterSelections);\r\n }\r\n\r\n ideo.filteredAnnots = ideo.annots;\r\n}\r\n\r\nfunction getFilteredResults(selections, ideo) {\r\n var fn, i, facet, results, filter,\r\n counts = {};\r\n\r\n if (Object.keys(selections).length === 0) {\r\n results = ideo.unpackedAnnots;\r\n } else {\r\n for (i = 0; i < ideo.facets.length; i++) {\r\n facet = ideo.facets[i];\r\n if (facet in selections) {\r\n filter = selections[facet];\r\n if (Array.isArray(filter)) {\r\n fn = function(d) {\r\n // Filter is numeric range\r\n if (filter.length === 2) {\r\n // [min, max]\r\n return filter[0] <= d && d < filter[1];\r\n } else if (filter.length === 4) {\r\n // [min1, max1, min2, max2]\r\n return (\r\n filter[0] <= d && d < filter[1] ||\r\n filter[2] <= d && d < filter[3]\r\n );\r\n }\r\n };\r\n } else {\r\n fn = function(d) {\r\n // Filter is set of categories\r\n return (d in filter);\r\n };\r\n }\r\n } else {\r\n fn = null;\r\n }\r\n ideo.annotsByFacet[facet].filter(fn);\r\n counts[facet] = ideo.annotsByFacet[facet].group().top(Infinity);\r\n }\r\n results = ideo.annotsByFacet[facet].top(Infinity);\r\n }\r\n\r\n return [results, counts];\r\n}\r\n\r\n/*\r\n Filters annotations based on the given selections.\r\n \"selections\" is an object of objects, e.g.\r\n\r\n {\r\n \"tissue-type\": { <-- a facet\r\n \"cerebral-cortex\": 1, <-- a filter; \"1\" means it is selected\r\n \"liver\": 1\r\n },\r\n \"gene-type\": {\r\n mirna\": 1\r\n }\r\n }\r\n\r\n Translation:\r\n select where:\r\n (tissue-type is cerebral-cortex OR liver) and (gene-type is mirna)\r\n\r\n TODO:\r\n * Filter counts\r\n * Integrate server-side filtering for very large datasets\r\n*/\r\nfunction filterAnnots(selections) {\r\n var i, facet, results, counts,\r\n t0 = Date.now(),\r\n ideo = this;\r\n\r\n ideo.filterSelections = selections;\r\n [results, counts] = getFilteredResults(selections, ideo);\r\n\r\n for (i < 0; i < ideo.facets.length; i++) {\r\n ideo.annotsByFacet[facet].filterAll(); // clear filters\r\n }\r\n\r\n results = ideo.packAnnots(results);\r\n\r\n delete ideo.maxAnnotsPerBar;\r\n delete ideo.maxAnnotsPerBarAllChrs;\r\n\r\n ideo.filteredAnnots = results;\r\n\r\n d3.selectAll(ideo.selector + ' polygon.annot').remove();\r\n ideo.drawAnnots(results);\r\n\r\n console.log('Time in filterAnnots: ' + (Date.now() - t0) + ' ms');\r\n\r\n return counts;\r\n}\r\n\r\nexport {unpackAnnots, packAnnots, initCrossFilter, filterAnnots};\r\n","function getPixelAndOtherData(bands, chr, hasBands, ideo) {\r\n var i, band, csLength, width, maxLength,\r\n pxStop = 0,\r\n taxid = chr.id.split('-')[1],\r\n cs = ideo.coordinateSystem,\r\n chrHeight = ideo.config.chrHeight;\r\n\r\n for (i = 0; i < bands.length; i++) {\r\n band = bands[i];\r\n csLength = band[cs].stop - band[cs].start;\r\n\r\n // If ideogram is rotated (and thus showing only one chromosome),\r\n // then set its width independent of the longest chromosome in this\r\n // genome.\r\n if (ideo._layout._isRotated) {\r\n width = chrHeight * csLength / chr.length;\r\n } else {\r\n if (ideo.config.chromosomeScale === 'relative') {\r\n maxLength = ideo.maxLength[taxid][cs];\r\n } else {\r\n maxLength = ideo.maxLength[cs];\r\n }\r\n width = chrHeight * chr.length / maxLength * csLength / chr.length;\r\n }\r\n bands[i].px = {start: pxStop, stop: pxStop + width, width: width};\r\n\r\n pxStop = bands[i].px.stop;\r\n\r\n if (hasBands && band.stain === 'acen' && band.name[0] === 'p') {\r\n chr.pcenIndex = i;\r\n }\r\n }\r\n return [bands, chr, pxStop];\r\n}\r\n\r\n/**\r\n * TODO:\r\n * A chromosome-level scale property is likely\r\n * nonsensical for any chromosomes that have cytogenetic band data.\r\n * Different bands tend to have ratios between number of base pairs\r\n * and physical length.\r\n *\r\n * However, a chromosome-level scale property is likely\r\n * necessary for chromosomes that do not have band data.\r\n *\r\n * This needs further review.\r\n */\r\nfunction getChrScale(chr, hasBands, ideo) {\r\n var chrHeight = ideo.config.chrHeight,\r\n chrLength = chr.length,\r\n maxLength = ideo.maxLength,\r\n taxid = chr.id.split('-')[1],\r\n scale = {};\r\n\r\n scale.bp = chrHeight / maxLength.bp;\r\n\r\n if (ideo.config.multiorganism === true) {\r\n // chr.scale.bp = band.iscn.stop / band.bp.stop;\r\n if (ideo.config.chromosomeScale === 'relative') {\r\n scale.iscn = chrHeight * chrLength / maxLength[taxid].bp;\r\n scale.bp = chrHeight / maxLength[taxid].bp;\r\n } else {\r\n scale.iscn = chrHeight * chrLength / maxLength.bp;\r\n }\r\n } else if (hasBands) {\r\n scale.iscn = chrHeight / maxLength.iscn;\r\n }\r\n\r\n return scale;\r\n}\r\n\r\nfunction getChromosomePixels(chr) {\r\n var bands, chrHeight, pxStop, hasBands, maxLength,\r\n taxid = chr.id.split('-')[1],\r\n ideo = this;\r\n\r\n bands = chr.bands;\r\n chrHeight = ideo.config.chrHeight;\r\n pxStop = 0;\r\n hasBands = (typeof bands !== 'undefined');\r\n\r\n if (hasBands) {\r\n [bands, chr, pxStop] = getPixelAndOtherData(bands, chr, hasBands, ideo);\r\n } else {\r\n if (ideo.config.chromosomeScale === 'relative') {\r\n maxLength = ideo.maxLength[taxid][ideo.coordinateSystem];\r\n } else {\r\n maxLength = ideo.maxLength[ideo.coordinateSystem];\r\n }\r\n pxStop = chrHeight * chr.length / maxLength;\r\n }\r\n\r\n chr.width = pxStop;\r\n chr.scale = getChrScale(chr, hasBands, ideo);\r\n chr.bands = bands;\r\n\r\n return chr;\r\n}\r\n\r\nfunction getChrModelScaffold(chr, bands, chrName, ideo) {\r\n var hasBands = (typeof bands !== 'undefined');\r\n\r\n if (hasBands) {\r\n const lastBand = bands[bands.length - 1];\r\n chr.name = chrName;\r\n chr.length = lastBand[ideo.coordinateSystem].stop;\r\n\r\n // Accounts for case where this chromosome\r\n chr.bpLength = lastBand.bp.stop;\r\n\r\n chr.type = 'nuclear';\r\n } else {\r\n chr = chrName;\r\n }\r\n\r\n return chr;\r\n}\r\n\r\n/**\r\n * Encountered when processing an assembly that has chromosomes with\r\n * centromere data, but this chromosome does not.\r\n * Example: chromosome F1 in Felis catus.\r\n */\r\nfunction deleteExtraneousBands(chr, hasBands) {\r\n if (hasBands && chr.bands.length === 1) {\r\n delete chr.bands;\r\n }\r\n return chr;\r\n}\r\n\r\nfunction getCentromerePosition(hasBands, bands) {\r\n\r\n if (hasBands === false) return '';\r\n\r\n // As with Macaca mulatta chromosome Y\r\n const firstBand = bands[0];\r\n const lastBand = bands.slice(-1)[0];\r\n const chrLength = lastBand.bp.stop - firstBand.bp.start;\r\n const smallLength = chrLength/20;\r\n\r\n if (\r\n // As with almost all mouse chromosome, chimpanzee chr22\r\n firstBand.name[0] === 'p' && bands[1].name[0] === 'q' &&\r\n firstBand.bp.stop - firstBand.bp.start < smallLength\r\n ) {\r\n return 'telocentric-p';\r\n }\r\n\r\n const penultimateBand = bands.slice(-2)[0];\r\n\r\n if (\r\n penultimateBand.name[0] === 'p' && lastBand.name[0] === 'q' &&\r\n lastBand.bp.stop - lastBand.bp.start < smallLength\r\n ) {\r\n // As with Macaca mulatta chromosome Y\r\n return 'telocentric-q';\r\n }\r\n\r\n return '';\r\n}\r\n\r\n/**\r\n * Generates a model object for each chromosome containing information on\r\n * its name, DOM ID, length in base pairs or ISCN coordinates, cytogenetic\r\n * bands, centromere position, etc.\r\n */\r\nfunction getChromosomeModel(bands, chrName, taxid, chrIndex) {\r\n var hasBands, org,\r\n chr = {},\r\n ideo = this;\r\n\r\n hasBands = (typeof bands !== 'undefined');\r\n\r\n chr = getChrModelScaffold(chr, bands, chrName, ideo);\r\n\r\n chr.chrIndex = chrIndex;\r\n chr.id = 'chr' + chr.name + '-' + taxid;\r\n\r\n if (ideo.config.fullChromosomeLabels === true) {\r\n org = this.organisms[taxid];\r\n chr.name = org.scientificName + ' chr' + chr.name;\r\n }\r\n\r\n chr.bands = bands;\r\n chr = ideo.getChromosomePixels(chr);\r\n chr.centromerePosition = getCentromerePosition(hasBands, bands);\r\n\r\n chr = deleteExtraneousBands(chr, hasBands);\r\n\r\n return chr;\r\n}\r\n\r\nexport {getChromosomeModel, getChromosomePixels};\r\n","// import {getSettings, handleSettingsHeaderClick} from './settings-ui';\r\nimport version from '../version';\r\nimport {downloadPng} from '../lib';\r\n\r\nconst style = `\r\n `;\r\n\r\n// eslint-disable-next-line max-len\r\nconst gearIcon = '';\r\n// Font Awesome Free 5.2.0 by @fontawesome - https://fontawesome.com\r\n// License - https://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)\r\n\r\nfunction deactivate(items) {\r\n items.forEach(item => {item.classList.remove('active');});\r\n}\r\n\r\nfunction closeTools() {\r\n const toolHeaders = document.querySelectorAll('#tools > ul > li');\r\n deactivate(toolHeaders);\r\n const itemsToClose =\r\n document.querySelectorAll('.ideo-modal, .ideo-tool-panel');\r\n itemsToClose.forEach(item => {item.remove();});\r\n\r\n document.querySelector('#tools').style.display = 'none';\r\n}\r\n\r\n/**\r\n * As needed, hide tool panels that are triggered by hovering\r\n */\r\nfunction handleHideForHoverables(trigger, tool, toolHeader, toolHeaders) {\r\n if (trigger === 'mouseenter') {\r\n\r\n // Hide panel when hover leaves tool header, if new target element\r\n // is part of the tools UI (and not the panel itself)\r\n toolHeader.addEventListener('mouseleave', event => {\r\n const toElement = event.toElement;\r\n const toId = toElement.id;\r\n const panelElement = document.querySelector('.ideo-tool-panel');\r\n const toolsElement = document.querySelector('#tools');\r\n if (\r\n toolsElement.contains(toElement) &&\r\n panelElement && !panelElement.contains(toElement) &&\r\n toId !== tool\r\n ) {\r\n deactivate(toolHeaders);\r\n panelElement.remove();\r\n }\r\n });\r\n }\r\n}\r\n\r\n/** Determine action that should trigger a tool panel to display */\r\nfunction getTrigger(toolHeader) {\r\n const shouldHover =\r\n Array.from(toolHeader.classList).includes('ideo-tool-hover');\r\n const trigger = shouldHover ? 'mouseenter' : 'click';\r\n return trigger;\r\n}\r\n\r\n/** Shows clicked tool as active, displays resulting panel */\r\nfunction handleToolClick(ideo) {\r\n const toolHeaders = document.querySelectorAll('#tools > ul > li');\r\n\r\n toolHeaders.forEach(toolHeader => {\r\n const trigger = getTrigger(toolHeader);\r\n\r\n toolHeader.addEventListener(trigger, event => {\r\n\r\n // Show only clicked tool header as active\r\n deactivate(toolHeaders);\r\n toolHeader.classList += ' active';\r\n\r\n const tool = toolHeader.id.split('-')[0];\r\n const panel = getPanel(tool, ideo);\r\n\r\n if (trigger === 'mouseenter') {\r\n toolHeader.insertAdjacentHTML('beforeend', panel);\r\n handleHideForHoverables(trigger, tool, toolHeader, toolHeaders);\r\n\r\n if (tool === 'download') {\r\n document.querySelector('#download-image')\r\n .addEventListener('click', event => {\r\n closeTools();\r\n downloadPng(ideo);\r\n });\r\n\r\n document.querySelector('#download-annots')\r\n .addEventListener('click', event => {\r\n const element = document.querySelector('#download-annots');\r\n const classes = Array.from(element.classList);\r\n if (classes.includes('ideo-disabled') === false) {\r\n closeTools();\r\n ideo.downloadAnnotations();\r\n }\r\n });\r\n }\r\n } else {\r\n document.querySelector('#gear').insertAdjacentHTML('beforeend', panel);\r\n }\r\n });\r\n });\r\n\r\n // Upon clicking \"close\" (x), remove tools UI\r\n document.querySelectorAll('#close').forEach(closeButton => {\r\n closeButton.addEventListener('click', () => {closeTools();});\r\n });\r\n\r\n}\r\n\r\nfunction handleGearClick(ideo) {\r\n document.querySelector('#gear')\r\n .addEventListener('click', event => {\r\n var options = document.querySelector('#tools');\r\n if (options.style.display === 'none') {\r\n options.style.display = '';\r\n hideOnClickOutside();\r\n } else {\r\n options.style.display = 'none';\r\n closeTools();\r\n }\r\n });\r\n\r\n handleToolClick(ideo);\r\n\r\n // handleSettingsHeaderClick(ideo);\r\n}\r\n\r\nfunction showGearOnIdeogramHover(ideo) {\r\n const container = document.querySelector(ideo.selector);\r\n const gear = document.querySelector('#gear');\r\n const panel = document.querySelector('#tools');\r\n\r\n container.addEventListener('mouseover', () => gear.style.display = '');\r\n container.addEventListener('mouseout', () => {\r\n // Hide gear only if panel is not shown\r\n if (panel.style.display === 'none') {\r\n gear.style.display = 'none';\r\n }\r\n });\r\n\r\n gear.addEventListener('mouseover', () => gear.style.display = '');\r\n}\r\n\r\nfunction getPanel(tool, ideo) {\r\n var panel;\r\n // if (tool === 'settings') panel = getSettings();\r\n if (tool === 'download') panel = getDownload(ideo);\r\n if (tool === 'about') panel = getAbout();\r\n return panel.trim();\r\n}\r\n\r\nfunction getDownload(ideo) {\r\n\r\n const numAnnots = document.querySelectorAll('.annot').length;\r\n const annotsClass = (numAnnots > 0) ? '' : 'ideo-disabled';\r\n\r\n return `\r\n
    \r\n
  • Image
  • \r\n
  • Annotations
  • \r\n
    \r\n `;\r\n}\r\n\r\nfunction getAbout() {\r\n const ideogramLink = `\r\n \r\n Ideogram.js`;\r\n const closeButton = 'x';\r\n return `\r\n
    \r\n ${ideogramLink}, version ${version} ${closeButton}
    \r\n Chromosome visualization for the web\r\n
    `;\r\n}\r\n\r\nfunction hideOnClickOutside(selector) {\r\n const elements = document.querySelectorAll('#gear, #tools');\r\n const outsideClickListener = event => {\r\n let clickedOutsideCount = 0;\r\n elements.forEach((element) => {\r\n if (!element.contains(event.target)) {\r\n clickedOutsideCount += 1;\r\n }\r\n });\r\n if (clickedOutsideCount === elements.length) {\r\n closeTools();\r\n removeClickListener();\r\n }\r\n };\r\n\r\n const removeClickListener = () => {\r\n document.removeEventListener('click', outsideClickListener);\r\n };\r\n\r\n document.addEventListener('click', outsideClickListener);\r\n}\r\n\r\nfunction initTools(ideo) {\r\n\r\n const triangle = '';\r\n\r\n const toolsHtml = `\r\n ${style}\r\n
    ${gearIcon}
    \r\n
    \r\n
      \r\n
    • Download ${triangle}
    • \r\n
    • About
    • \r\n
    \r\n
    `;\r\n\r\n\r\n document.querySelector(ideo.selector)\r\n .insertAdjacentHTML('beforebegin', toolsHtml);\r\n\r\n handleGearClick(ideo);\r\n\r\n showGearOnIdeogramHover(ideo);\r\n}\r\n\r\nexport {initTools};\r\n\r\n","/* eslint-disable no-use-before-define */\r\n\r\nexport class ModelAdapter {\r\n\r\n constructor(model) {\r\n this._model = model;\r\n this._class = 'ModelAdapter';\r\n }\r\n\r\n static getInstance(model) {\r\n if (model.bands) {\r\n return new ModelAdapter(model);\r\n } else {\r\n return new ModelNoBandsAdapter(model);\r\n }\r\n }\r\n\r\n getModel() {\r\n return this._model;\r\n }\r\n\r\n getCssClass() {\r\n return '';\r\n }\r\n}\r\n\r\nexport class ModelNoBandsAdapter extends ModelAdapter {\r\n\r\n constructor(model) {\r\n super(model);\r\n this._class = 'ModelNoBandsAdapter';\r\n }\r\n\r\n getModel() {\r\n this._model.bands = [];\r\n\r\n const isMT = this._model.name === 'MT'; // Is mitochondrial chromosome\r\n const width = this._model.width;\r\n\r\n if (width > 1 || isMT) {\r\n // Add single band to bands array\r\n this._model.bands.push({\r\n name: 'q',\r\n px: {\r\n start: 0,\r\n stop: width,\r\n width: width\r\n },\r\n bp: {\r\n start: 1,\r\n stop: this._model.bpLength\r\n },\r\n iscn: {\r\n start: 1,\r\n stop: this._model.length\r\n }\r\n });\r\n }\r\n\r\n return this._model;\r\n }\r\n\r\n getCssClass() {\r\n return 'noBands';\r\n }\r\n\r\n}\r\n","import {Ploidy} from './ploidy';\r\n\r\nexport class Color {\r\n\r\n constructor(config) {\r\n // Ideogram config\r\n this._config = config;\r\n this._ploidy = new Ploidy(this._config);\r\n }\r\n\r\n getArmColor(chrSetIndex, chrIndex, armIndex) {\r\n if (this._config.armColors) {\r\n return this._config.armColors[armIndex];\r\n } else if (this._config.ancestors) {\r\n return this._getPolyploidArmColor(chrSetIndex, chrIndex, armIndex);\r\n } else {\r\n return null;\r\n }\r\n }\r\n\r\n getBorderColor(chrSetIndex, chrIndex, armIndex) {\r\n const config = this._config;\r\n const color = config.chrBorderColor ? config.chrBorderColor : '#000';\r\n if (chrIndex < config.ploidy) {\r\n return color;\r\n } else if (this._ploidy.exists(chrSetIndex, chrIndex, armIndex)) {\r\n return color;\r\n } else {\r\n return '#fff';\r\n }\r\n }\r\n\r\n getFillColor() {\r\n const config = this._config;\r\n if (!config.chrFillColor) return '#AAA';\r\n const color = config.chrFillColor;\r\n if (typeof color === 'string') {\r\n return {arm: color, centromere: ''};\r\n } else {\r\n return color;\r\n };\r\n }\r\n\r\n _getPolyploidArmColor(chrSetIndex, chrIndex, armIndex) {\r\n if (!this._ploidy.exists(chrSetIndex, chrIndex, armIndex)) {\r\n return 'transparent';\r\n } else {\r\n var ancestor =\r\n this._ploidy.getAncestor(chrSetIndex, chrIndex, armIndex);\r\n return this._config.ancestors[ancestor];\r\n }\r\n }\r\n\r\n}\r\n","export class Range {\r\n\r\n /**\r\n * Chromosome range.\r\n * @public\r\n * @class\r\n * @param {Object} data - range data.\r\n * @param {Integer} data.chr - chromosome index.\r\n * @param {Integer[]} [data.ploidy] - array which controls on which\r\n * chromosomes range should appear in case\r\n * of ploidy.\r\n * @param {Integer} data.start - range start.\r\n * @param {Integer} data.stop - range end.\r\n * @param {String} data.color - range color.\r\n */\r\n constructor(data) {\r\n this._data = data;\r\n this.start = data.start;\r\n this.stop = data.stop;\r\n this.length = this.stop - this.start;\r\n }\r\n\r\n getColor(chrIndex) {\r\n if (!('ploidy' in this._data)) {\r\n return this._getColor(chrIndex);\r\n } else if ('ploidy' in this._data && this._data.ploidy[chrIndex]) {\r\n return this._getColor(chrIndex);\r\n } else {\r\n return 'transparent';\r\n }\r\n }\r\n\r\n _getColor(chrIndex) {\r\n if (Array.isArray(this._data.color)) {\r\n return this._data.color[chrIndex];\r\n } else {\r\n return this._data.color;\r\n }\r\n }\r\n\r\n}\r\n","/* eslint-disable no-use-before-define */\r\nimport {Color} from './../color';\r\nimport {Range} from './../range';\r\n\r\nexport class Chromosome {\r\n\r\n constructor(adapter, config, ideo) {\r\n this._adapter = adapter;\r\n this._model = this._adapter.getModel();\r\n this._config = config;\r\n this._ideo = ideo;\r\n this._color = new Color(this._config);\r\n this._bumpCoefficient = 5;\r\n }\r\n\r\n /**\r\n * Factory method\r\n */\r\n static getInstance(adapter, config, ideo) {\r\n const centromerePosition = adapter.getModel().centromerePosition;\r\n if (centromerePosition === 'telocentric-p') {\r\n return new TelocentricPChromosome(adapter, config, ideo);\r\n } else if (centromerePosition === 'telocentric-q') {\r\n return new TelocentricQChromosome(adapter, config, ideo);\r\n } else {\r\n return new MetacentricChromosome(adapter, config, ideo);\r\n }\r\n }\r\n\r\n _addPArmShape(clipPath, isPArmRendered) {\r\n if (isPArmRendered) {\r\n return clipPath.concat(this._getPArmShape());\r\n } else {\r\n return clipPath;\r\n }\r\n }\r\n\r\n _addQArmShape(clipPath, isQArmRendered) {\r\n if (isQArmRendered) {\r\n return clipPath.concat(this._getQArmShape());\r\n } else {\r\n return clipPath;\r\n }\r\n }\r\n\r\n /**\r\n * Append bands container and apply clip-path to it\r\n */\r\n render(container, chrSetIndex, chrIndex) {\r\n\r\n var self, isPArmRendered, isQArmRendered, clipPath, opacity, fill,\r\n isFullyBanded;\r\n\r\n self = this;\r\n\r\n container = container.append('g')\r\n .attr('class', 'bands')\r\n .attr('clip-path',\r\n 'url(#' + this._model.id + '-chromosome-set-clippath)'\r\n );\r\n\r\n // Render chromosome arms\r\n isPArmRendered = this._renderArm(container, chrSetIndex, chrIndex, 'p');\r\n isQArmRendered = this._renderArm(container, chrSetIndex, chrIndex, 'q');\r\n\r\n // Render range set\r\n this._renderRangeSet(container, chrSetIndex, chrIndex);\r\n\r\n // Push arms shape string into clipPath array\r\n clipPath = [];\r\n clipPath = this._addPArmShape(clipPath, isPArmRendered);\r\n clipPath = this._addQArmShape(clipPath, isQArmRendered);\r\n\r\n opacity = '0';\r\n fill = '';\r\n isFullyBanded = this.isFullyBanded();\r\n if (\r\n 'ancestors' in this._ideo.config &&\r\n !('rangeSet' in this._ideo.config)\r\n ) {\r\n // E.g. diploid human genome (with translucent overlay)\r\n fill = self._color.getArmColor(chrSetIndex, chrIndex, 0);\r\n if (isFullyBanded) {\r\n opacity = '0.5';\r\n }\r\n } else if (isFullyBanded) {\r\n // E.g. mouse reference genome\r\n opacity = null;\r\n fill = 'transparent';\r\n } else if (!('ancestors' in this._ideo.config)) {\r\n // E.g. chimpanzee assembly Pan_tro 3.0\r\n opacity = '1';\r\n }\r\n\r\n let centromereFill;\r\n if (this._ideo.config.chrFillColor) {\r\n const fillColor = self._color.getFillColor();\r\n fill = fillColor.arm;\r\n centromereFill = fillColor.centromere;\r\n }\r\n\r\n // Render chromosome border\r\n container.append('g')\r\n .attr('class', 'chromosome-border')\r\n .selectAll('path')\r\n .data(clipPath)\r\n .enter()\r\n .append('path')\r\n .attr('fill', fill)\r\n .style('fill-opacity', opacity)\r\n .style('fill', function(d) {\r\n if (d.class === 'acen' && centromereFill) {\r\n return centromereFill;\r\n }\r\n })\r\n .attr('stroke', function(d, i) {\r\n return self._color.getBorderColor(chrSetIndex, chrIndex, i);\r\n })\r\n .attr('stroke-width', function(d) {\r\n return ('strokeWidth' in d ? d.strokeWidth : 1);\r\n })\r\n .attr('d', function(d) {\r\n return d.path;\r\n }).attr('class', function(d) {\r\n return d.class;\r\n });\r\n\r\n return clipPath;\r\n }\r\n\r\n _renderRangeSet(container, chrSetIndex, chrIndex) {\r\n\r\n var self, rangeSet, rangesContainer, ideo;\r\n\r\n if (!('rangeSet' in this._config)) {\r\n return;\r\n }\r\n\r\n rangeSet = this._config.rangeSet.filter(function(range) {\r\n return range.chr - 1 === chrSetIndex;\r\n }).map(function(range) {\r\n return new Range(range);\r\n });\r\n\r\n rangesContainer = container.append('g').attr('class', 'range-set');\r\n\r\n self = this;\r\n ideo = self._ideo;\r\n\r\n rangesContainer.selectAll('rect.range')\r\n .data(rangeSet)\r\n .enter()\r\n .append('rect')\r\n .attr('class', 'range')\r\n .attr('x', function(range) {\r\n return ideo.convertBpToPx(self._model, range.start);\r\n }).attr('y', 0)\r\n .attr('width', function(range) {\r\n return ideo.convertBpToPx(self._model, range.length);\r\n }).attr('height', this._config.chrWidth)\r\n .style('fill', function(range) {\r\n return range.getColor(chrIndex);\r\n });\r\n }\r\n\r\n /**\r\n * Get chromosome's shape main values\r\n */\r\n _getShapeData() {\r\n\r\n var firstQBand, i, lastBand, rightTerminalPosition;\r\n\r\n // First q band from bands sequence\r\n for (i = 0; i < this._model.bands.length; i++) {\r\n if (this._model.bands[i].name[0] === 'q') {\r\n firstQBand = this._model.bands[i];\r\n break;\r\n }\r\n }\r\n\r\n // Chromosome's right position\r\n lastBand = this._model.bands.length - 1;\r\n rightTerminalPosition = this._model.bands[lastBand].px.stop;\r\n\r\n // Properties description:\r\n // x1 - left terminal start position\r\n // x2 - centromere position\r\n // x3 - right terminal end position\r\n // w - chromosome width\r\n // b - bump size\r\n return {\r\n x1: 0,\r\n x2: firstQBand ? firstQBand.px.start : rightTerminalPosition,\r\n x3: rightTerminalPosition,\r\n w: this._config.chrWidth,\r\n b: this._config.chrWidth / this._bumpCoefficient\r\n };\r\n }\r\n\r\n _getPArmShape() {\r\n var d = this._getShapeData(),\r\n x = d.x2 - d.b;\r\n\r\n if (this.isFullyBanded() || 'ancestors' in this._ideo.config) {\r\n // Encountered when chromosome has any of:\r\n // - One placeholder \"band\", e.g. pig genome GCF_000003025.5\r\n // - Many (> 2) bands, e.g. human reference genome\r\n // - Ancestor colors in ploidy configuration, as in ploidy-basic.html\r\n return {\r\n class: '',\r\n path:\r\n 'M' + d.b + ',0 ' +\r\n 'L' + x + ',0 ' +\r\n 'Q' + (d.x2 + d.b) + ',' + (d.w / 2) + ',' + x + ',' + d.w + ' ' +\r\n 'L' + d.b + ',' + d.w + ' ' +\r\n 'Q-' + d.b + ',' + (d.w / 2) + ',' + d.b + ',0'\r\n };\r\n } else {\r\n // e.g. chimpanzee assembly Pan_tro 3.0\r\n return [{\r\n class: '',\r\n path:\r\n 'M' + d.b + ',0 ' +\r\n 'L' + (x - 2) + ',0 ' +\r\n 'L' + (x - 2) + ',' + d.w + ' ' +\r\n 'L' + d.b + ',' + d.w + ' ' +\r\n 'Q-' + d.b + ',' + (d.w / 2) + ',' + d.b + ',0'\r\n }, {\r\n class: 'acen',\r\n path:\r\n 'M' + x + ',0 ' +\r\n 'Q' + (d.x2 + d.b) + ',' + (d.w / 2) + ',' + x + ',' + d.w + ' ' +\r\n 'L' + x + ',' + d.w + ' ' +\r\n 'L' + (x - 2) + ',' + d.w + ' ' +\r\n 'L' + (x - 2) + ',0'\r\n }];\r\n }\r\n }\r\n\r\n _getQArmShape() {\r\n var d = this._getShapeData(),\r\n x = d.x3 - d.b,\r\n x2b = d.x2 + d.b;\r\n\r\n if (this.isFullyBanded() || 'ancestors' in this._ideo.config) {\r\n return {\r\n class: '',\r\n path:\r\n 'M' + x2b + ',0 ' +\r\n 'L' + x + ',0 ' +\r\n 'Q' + (d.x3 + d.b) + ',' + (d.w / 2) + ',' + x + ',' + d.w + ' ' +\r\n 'L' + x2b + ',' + d.w + ' ' +\r\n 'Q' + (d.x2 - d.b) + ',' + (d.w / 2) + ',' + x2b + ',0'\r\n };\r\n } else {\r\n // e.g. chimpanzee assembly Pan_tro 3.0\r\n return [{\r\n path:\r\n 'M' + x2b + ',0 ' +\r\n 'L' + x + ',0 ' +\r\n 'Q' + (d.x3 + d.b) + ',' + (d.w / 2) + ',' + x + ',' + d.w + ' ' +\r\n 'L' + x2b + ',' + d.w + ' ' +\r\n 'L' + x2b + ',0'\r\n }, {\r\n class: 'acen',\r\n path:\r\n 'M' + x2b + ',0' +\r\n 'Q' + (d.x2 - d.b) + ',' + (d.w / 2) + ',' + x2b + ',' + d.w + ' ' +\r\n 'L' + x2b + ',' + d.w +\r\n 'L' + (x2b + 2) + ',' + d.w +\r\n 'L' + (x2b + 2) + ',0'\r\n }];\r\n }\r\n }\r\n\r\n isFullyBanded() {\r\n return (\r\n this._model.bands &&\r\n (this._model.bands.length !== 2 || this._model.bands[0].name[0] === 'q')\r\n );\r\n }\r\n\r\n /**\r\n * Render arm bands\r\n */\r\n _renderBands(container, chrSetIndex, chrIndex, bands, arm) {\r\n\r\n var self, armIndex, fill;\r\n\r\n self = this;\r\n armIndex = arm === 'p' ? 0 : 1;\r\n fill = '';\r\n\r\n if ('ancestors' in self._ideo.config && !(self.isFullyBanded())) {\r\n fill = self._color.getArmColor(chrSetIndex, chrIndex, armIndex);\r\n }\r\n\r\n container.selectAll('path.band.' + arm)\r\n .data(bands)\r\n .enter()\r\n .append('path')\r\n .attr('id', function(d) {\r\n return self._model.id + '-' + d.name.replace('.', '-');\r\n })\r\n .attr('class', function(d) {\r\n return 'band ' + arm + '-band ' + d.stain;\r\n })\r\n .attr('d', function(d) {\r\n var start, length;\r\n\r\n start = self._ideo.round(d.px.start);\r\n length = self._ideo.round(d.px.width);\r\n\r\n return 'M ' + start + ', 0' +\r\n 'l ' + length + ' 0 ' +\r\n 'l 0 ' + self._config.chrWidth + ' ' +\r\n 'l -' + length + ' 0 z';\r\n })\r\n .style('fill', fill);\r\n }\r\n\r\n /**\r\n * Render a chromosome arm.\r\n * Returns boolean indicating if any bands were rendered.\r\n */\r\n _renderArm(container, chrSetIndex, chrIndex, arm) {\r\n var bands = this._model.bands.filter(function(band) {\r\n return band.name[0] === arm;\r\n });\r\n\r\n this._renderBands(container, chrSetIndex, chrIndex, bands, arm);\r\n\r\n return Boolean(bands.length);\r\n }\r\n}\r\n\r\nexport class MetacentricChromosome extends Chromosome {\r\n\r\n constructor(model, config, ideo) {\r\n super(model, config, ideo);\r\n this._class = 'MetacentricChromosome';\r\n }\r\n}\r\n\r\nexport class TelocentricPChromosome extends Chromosome {\r\n\r\n constructor(model, config, ideo) {\r\n // alert('p')\r\n super(model, config, ideo);\r\n this._class = 'TelocentricPChromosome';\r\n this._pArmOffset = 3;\r\n }\r\n\r\n _addPArmShape(clipPath) {\r\n return clipPath.concat(this._getPArmShape());\r\n }\r\n\r\n _getPArmShape() {\r\n // Properties description:\r\n // x1 - left terminal start position\r\n // x2 - centromere position\r\n // x3 - right terminal end position\r\n // w - chromosome width\r\n // b - bump size\r\n var d = this._getShapeData();\r\n d.o = this._pArmOffset;\r\n\r\n return [{\r\n class: 'acen',\r\n path: 'M' + (d.x2 + 2) + ',1' +\r\n 'L' + (d.x2 + d.o + 3.25) + ',1 ' +\r\n 'L' + (d.x2 + d.o + 3.25) + ',' + (d.w - 1) + ' ' +\r\n 'L' + (d.x2 + 2) + ',' + (d.w - 1)\r\n }, {\r\n class: 'gpos66',\r\n path: 'M' + (d.x2 - d.o + 5) + ',0' +\r\n 'L' + (d.x2 - d.o + 3) + ',0 ' +\r\n 'L' + (d.x2 - d.o + 3) + ',' + d.w + ' ' +\r\n 'L' + (d.x2 - d.o + 5) + ',' + d.w,\r\n strokeWidth: 0.5\r\n }];\r\n }\r\n\r\n _getQArmShape() {\r\n // Properties description:\r\n // x1 - left terminal start position\r\n // x2 - centromere position\r\n // x3 - right terminal end position\r\n // w - chromosome width\r\n // b - bump size\r\n var d = this._getShapeData(),\r\n x = d.x3 - d.b,\r\n o = this._pArmOffset + 3;\r\n\r\n return {\r\n class: '',\r\n path:\r\n 'M' + (d.x2 + o) + ',0 ' +\r\n 'L' + x + ',0 ' +\r\n 'Q' + (d.x3 + d.b) + ',' + (d.w / 2) + ',' + x + ',' + d.w + ' ' +\r\n 'L' + (d.x2 + o) + ',' + d.w\r\n };\r\n }\r\n}\r\n\r\nexport class TelocentricQChromosome extends Chromosome {\r\n\r\n constructor(model, config, ideo) {\r\n // alert('q')\r\n super(model, config, ideo);\r\n this._class = 'TelocentricQChromosome';\r\n this._qArmOffset = 3;\r\n }\r\n\r\n _getPArmShape() {\r\n // Properties description:\r\n // x1 - left terminal start position\r\n // x2 - centromere position\r\n // x3 - right terminal end position\r\n // w - chromosome width\r\n // b - bump size\r\n\r\n var d = this._getShapeData(),\r\n x = d.x3 - d.b,\r\n o = this._qArmOffset;\r\n\r\n return {\r\n class: '',\r\n path:\r\n // 'M1,0, ' +\r\n 'M' + (d.x2 + o) + ',0 ' +\r\n 'L' + (x + o) + ',0 ' +\r\n 'L' + (x + o) + ',' + d.w + ' ' +\r\n 'L' + d.b + ',' + d.w + ' ' +\r\n 'Q-' + d.b + ',' + (d.w / 2) + ',' + d.b + ',0'\r\n };\r\n }\r\n\r\n _addQArmShape(clipPath) {\r\n return clipPath.concat(this._getQArmShape());\r\n }\r\n\r\n _getQArmShape() {\r\n // Properties description:\r\n // x1 - left terminal start position\r\n // x2 - centromere position\r\n // x3 - right terminal end position\r\n // w - chromosome width\r\n // b - bump size\r\n var d = this._getShapeData();\r\n d.o = this._qArmOffset;\r\n\r\n return [{\r\n class: 'acen',\r\n path: 'M' + (d.x2 + 2) + ',1 ' +\r\n 'L' + (d.x2 + d.o + 3.25) + ',1 ' +\r\n 'L' + (d.x2 + d.o + 3.25) + ',' + (d.w - 1) + ' ' +\r\n 'L' + (d.x2 + 2) + ',' + (d.w - 1)\r\n }, {\r\n class: 'gpos66',\r\n path: 'M' + (d.x2 + d.o + 5) + ',0 ' +\r\n 'L' + (d.x2 + d.o + 3) + ',0 ' +\r\n 'L' + (d.x2 + d.o + 3) + ',' + d.w + ' ' +\r\n 'L' + (d.x2 + d.o + 5) + ',' + d.w,\r\n strokeWidth: 0.5\r\n }];\r\n }\r\n}\r\n","import {d3} from '../lib';\r\nimport {initTools} from '../tools/tools';\r\nimport {ModelAdapter} from '../model-adapter';\r\nimport {Chromosome} from './chromosome';\r\n\r\n/**\r\n * Adds a copy of a chromosome (i.e. a homologous chromosome, homolog) to DOM\r\n *\r\n * @param chrModel\r\n * @param chrIndex\r\n * @param homologIndex\r\n * @param container\r\n */\r\nfunction appendHomolog(chrModel, chrIndex, homologIndex, container) {\r\n\r\n var homologOffset, chromosome, shape, defs, adapter;\r\n\r\n defs = d3.select(this.selector + ' defs');\r\n // Get chromosome model adapter class\r\n adapter = ModelAdapter.getInstance(chrModel);\r\n\r\n // How far this copy of the chromosome is from another\r\n homologOffset = homologIndex * this.config.chrMargin;\r\n\r\n // Append chromosome's container\r\n chromosome = container\r\n .append('g')\r\n .attr('id', chrModel.id)\r\n .attr('class', 'chromosome ' + adapter.getCssClass())\r\n .attr('transform', 'translate(0, ' + homologOffset + ')');\r\n\r\n // Render chromosome\r\n shape = Chromosome.getInstance(adapter, this.config, this)\r\n .render(chromosome, chrIndex, homologIndex);\r\n\r\n d3.select('#' + chrModel.id + '-chromosome-set-clippath').remove();\r\n\r\n defs.append('clipPath')\r\n .attr('id', chrModel.id + '-chromosome-set-clippath')\r\n .selectAll('path')\r\n .data(shape)\r\n .enter()\r\n .append('path')\r\n .attr('d', function(d) {return d.path;})\r\n .attr('class', function(d) {return d.class;});\r\n\r\n\r\n if (chrModel.width < 1) {\r\n d3.select('#' + chrModel.id + ' .bands').style('opacity', 0);\r\n }\r\n}\r\n\r\n/**\r\n * Renders all the bands and outlining boundaries of a chromosome.\r\n */\r\nfunction drawChromosome(chrModel) {\r\n var chrIndex, container, numChrsInSet, transform, homologIndex,\r\n chrSetSelector;\r\n\r\n chrIndex = chrModel.chrIndex;\r\n\r\n transform = this._layout.getChromosomeSetTranslate(chrIndex);\r\n\r\n chrSetSelector = this.selector + ' #' + chrModel.id + '-chromosome-set';\r\n\r\n d3.selectAll(chrSetSelector + ' g').remove();\r\n\r\n container = d3.select(chrSetSelector);\r\n\r\n if (container.nodes().length === 0) {\r\n // Append chromosome set container\r\n container = d3.select(this.selector)\r\n .append('g')\r\n .attr('class', 'chromosome-set')\r\n .attr('transform', transform)\r\n .attr('id', chrModel.id + '-chromosome-set');\r\n }\r\n\r\n if (\r\n 'sex' in this.config &&\r\n this.config.ploidy === 2 &&\r\n this.sexChromosomes.index === chrIndex\r\n ) {\r\n this.drawSexChromosomes(container, chrIndex);\r\n return;\r\n }\r\n\r\n numChrsInSet = 1;\r\n if (this.config.ploidy > 1) {\r\n numChrsInSet = this._ploidy.getChromosomesNumber(chrIndex);\r\n }\r\n\r\n for (homologIndex = 0; homologIndex < numChrsInSet; homologIndex++) {\r\n this.appendHomolog(chrModel, chrIndex, homologIndex, container);\r\n }\r\n}\r\n\r\n/**\r\n * Rotates a chromosome 90 degrees and shows or hides all other chromosomes\r\n * Useful for focusing or defocusing a particular chromosome\r\n */\r\nfunction rotateAndToggleDisplay(chrElement) {\r\n var chrName, chrModel, chrIndex;\r\n\r\n this.unhighlight();\r\n\r\n // Do nothing if taxid not defined. But it should be defined.\r\n // To fix that bug we should have a way to find chromosome set number.\r\n if (!this.config.taxid) return;\r\n\r\n chrName = chrElement.id.split('-')[0].replace('chr', '');\r\n chrModel = this.chromosomes[this.config.taxid][chrName];\r\n chrIndex = chrModel.chrIndex;\r\n\r\n this._layout.rotate(chrIndex, chrIndex, chrElement);\r\n}\r\n\r\nfunction setOverflowScroll() {\r\n var ideo, config, ideoWidth, ideoInnerWrap, ideoMiddleWrap, ideoSvg,\r\n ploidy, ploidyPad;\r\n\r\n ideo = this;\r\n config = ideo.config;\r\n\r\n ideoSvg = d3.select(config.container + ' svg#_ideogram');\r\n ideoInnerWrap = d3.select(config.container + ' #_ideogramInnerWrap');\r\n ideoMiddleWrap = d3.select(config.container + ' #_ideogramMiddleWrap');\r\n\r\n ploidy = config.ploidy;\r\n if (ploidy === 1) {\r\n ploidyPad = ploidy;\r\n } else {\r\n ploidyPad = ploidy * 1.12;\r\n }\r\n\r\n let annotHeight = 0;\r\n if ('annotationsLayout' in config) {\r\n annotHeight = config.annotationHeight * config.numAnnotTracks;\r\n }\r\n\r\n if (\r\n config.orientation === 'vertical' &&\r\n config.perspective !== 'comparative' &&\r\n config.geometry !== 'collinear'\r\n ) {\r\n ideoWidth =\r\n (ideo.numChromosomes) *\r\n (config.chrWidth + config.chrMargin + annotHeight);\r\n } else {\r\n return;\r\n }\r\n\r\n if (config.annotationsLayout === 'heatmap-2d') {\r\n return;\r\n }\r\n\r\n ideoWidth = Math.ceil(ideoWidth * ploidyPad / config.rows);\r\n if (ideo._layout._class === 'SmallLayout') ideoWidth += 100;\r\n\r\n ideoWidth += 35; // Account for settings gear\r\n\r\n // Ensures absolutely-positioned elements, e.g. heatmap overlaps, display\r\n // properly if ideogram container also has position: absolute\r\n ideoMiddleWrap.style('height', ideo._layout.getHeight() + 'px');\r\n\r\n ideoInnerWrap\r\n .style('max-width', ideoWidth + 'px')\r\n .style('overflow-x', 'scroll')\r\n .style('position', 'absolute');\r\n\r\n ideoSvg.style('min-width', (ideoWidth - 5) + 'px');\r\n\r\n if (ideo.config.showTools) {\r\n initTools(ideo);\r\n }\r\n}\r\n\r\nexport {\r\n appendHomolog, drawChromosome, rotateAndToggleDisplay, setOverflowScroll\r\n};\r\n","import {d3} from '../lib';\r\n\r\nfunction getChrSetLabelLines(d, i, ideo) {\r\n var lines;\r\n if (d.name.indexOf(' ') === -1) {\r\n lines = [d.name];\r\n } else {\r\n lines = d.name.match(/^(.*)\\s+([^\\s]+)$/).slice(1).reverse();\r\n }\r\n\r\n if (\r\n 'sex' in ideo.config &&\r\n ideo.config.ploidy === 2 &&\r\n i === ideo.sexChromosomes.index\r\n ) {\r\n if (ideo.config.sex === 'male') {\r\n lines = ['XY'];\r\n } else {\r\n lines = ['XX'];\r\n }\r\n }\r\n\r\n return lines;\r\n}\r\n\r\nfunction renderChromosomeSetLabel(d, i, textElement, ideo) {\r\n // Get label lines\r\n var lines = getChrSetLabelLines(d, i, ideo);\r\n\r\n // Render label lines\r\n d3.select(textElement).selectAll('tspan')\r\n .data(lines)\r\n .enter()\r\n .append('tspan')\r\n .attr('dy', function(d, i) {\r\n return i * -1.2 + 'em';\r\n })\r\n .attr('x', ideo._layout.getChromosomeSetLabelXPosition())\r\n .attr('class', function(a, i) {\r\n var fullLabels = ideo.config.fullChromosomeLabels;\r\n return i === 1 && fullLabels ? 'italic' : null;\r\n })\r\n .text(String);\r\n}\r\n\r\nfunction appendChromosomeSetLabels(ideo) {\r\n var layout = ideo._layout;\r\n\r\n d3.selectAll(ideo.selector + ' .chromosome-set')\r\n .insert('text', ':first-child')\r\n .data(ideo.chromosomesArray)\r\n .attr('class', layout.getChromosomeLabelClass())\r\n .attr('transform', layout.getChromosomeSetLabelTranslate())\r\n .attr('x', layout.getChromosomeSetLabelXPosition())\r\n .attr('y', function(d, i) {\r\n return layout.getChromosomeSetLabelYPosition(i);\r\n })\r\n .attr('text-anchor', layout.getChromosomeSetLabelAnchor())\r\n .each(function(d, i) {\r\n renderChromosomeSetLabel(d, i, this, ideo);\r\n });\r\n}\r\n\r\nfunction appendChromosomeLabels(ideo) {\r\n var layout = ideo._layout;\r\n\r\n d3.selectAll(ideo.selector + ' .chromosome-set')\r\n .each(function(a, chrSetIndex) {\r\n d3.select(this).selectAll('.chromosome')\r\n .append('text')\r\n .attr('class', 'chrLabel')\r\n .attr('transform', layout.getChromosomeSetLabelTranslate())\r\n .attr('x', function(d, i) {\r\n return layout.getChromosomeLabelXPosition(i);\r\n })\r\n .attr('y', function(d, i) {\r\n return layout.getChromosomeLabelYPosition(i);\r\n })\r\n .text(function(d, chrIndex) {\r\n return ideo._ploidy.getAncestor(chrSetIndex, chrIndex);\r\n })\r\n .attr('text-anchor', 'middle');\r\n });\r\n}\r\n\r\n/**\r\n * Draws labels for each chromosome, e.g. \"1\", \"2\", \"X\".\r\n * If ideogram configuration has 'fullChromosomeLabels: True',\r\n * then labels includes name of taxon, which can help when\r\n * depicting orthologs.\r\n */\r\nfunction drawChromosomeLabels() {\r\n var ideo = this;\r\n appendChromosomeSetLabels(ideo);\r\n appendChromosomeLabels(ideo);\r\n}\r\n\r\nfunction getLabelPositionAttrs(scale) {\r\n var x, y, scaleSvg;\r\n\r\n if (\r\n typeof (scale) !== 'undefined' &&\r\n scale.hasOwnProperty('x') &&\r\n !(scale.x === 1 && scale.y === 1)\r\n ) {\r\n scaleSvg = 'scale(' + scale.x + ',' + scale.y + ')';\r\n x = -6;\r\n y = (scale === '' ? -16 : -14);\r\n } else {\r\n x = -8;\r\n y = -16;\r\n scale = {x: 1, y: 1};\r\n scaleSvg = '';\r\n }\r\n\r\n return {x: x, y: y, scaleSvg: scaleSvg, scale: scale};\r\n}\r\n\r\nfunction updateChrIndex(chrIndex, config) {\r\n if (config.numAnnotTracks > 1 || config.orientation === '') chrIndex -= 1;\r\n return chrIndex;\r\n}\r\n\r\nfunction rotateVerticalChromosomeLabels(chr, chrIndex, labelPosAttrs, ideo) {\r\n var chrMargin2, chrMargin, y,\r\n config = ideo.config;\r\n\r\n chrIndex = updateChrIndex(chrIndex, config);\r\n\r\n chrMargin2 = -4;\r\n if (config.showBandLabels === true) {\r\n chrMargin2 = config.chrMargin + config.chrWidth + 26;\r\n }\r\n\r\n chrMargin = config.chrMargin * chrIndex;\r\n if (config.numAnnotTracks > 1 === false) chrMargin += 1;\r\n\r\n y = chrMargin + chrMargin2;\r\n\r\n chr.selectAll('text.chrLabel')\r\n .attr('transform', labelPosAttrs.scaleSvg)\r\n .selectAll('tspan')\r\n .attr('x', labelPosAttrs.x)\r\n .attr('y', y);\r\n}\r\n\r\nfunction rotateHorizontalChromosomeLabels(chr, chrIndex, labelPosAttrs, ideo) {\r\n var chrMargin, chrMargin2, tracksHeight, x,\r\n config = ideo.config;\r\n\r\n chrMargin2 = -config.chrWidth - 2;\r\n if (config.showBandLabels === true) chrMargin2 = config.chrMargin + 8;\r\n\r\n tracksHeight = config.annotTracksHeight;\r\n if (config.annotationsLayout !== 'overlay') tracksHeight *= 2;\r\n\r\n chrMargin = config.chrMargin * chrIndex;\r\n x = -(chrMargin + chrMargin2) + 3 + tracksHeight;\r\n x /= labelPosAttrs.scale.x;\r\n\r\n chr.selectAll('text.chrLabel')\r\n .attr('transform', 'rotate(-90)' + labelPosAttrs.scaleSvg)\r\n .selectAll('tspan')\r\n .attr('x', x)\r\n .attr('y', labelPosAttrs.y);\r\n}\r\n\r\n/**\r\n * Rotates chromosome labels by 90 degrees, e.g. upon clicking a chromosome.\r\n */\r\nfunction rotateChromosomeLabels(chr, chrIndex, orientation, scale) {\r\n var labelPosAttrs,\r\n ideo = this;\r\n\r\n chrIndex -= 1;\r\n\r\n labelPosAttrs = getLabelPositionAttrs(scale);\r\n\r\n if (orientation === 'vertical' || orientation === '') {\r\n rotateVerticalChromosomeLabels(chr, chrIndex, labelPosAttrs, ideo);\r\n } else {\r\n rotateHorizontalChromosomeLabels(chr, chrIndex, labelPosAttrs, ideo);\r\n }\r\n}\r\n\r\nexport {drawChromosomeLabels, rotateChromosomeLabels};\r\n","// DEFLATE is a complex format; to read this code, you should probably check the RFC first:\n// https://tools.ietf.org/html/rfc1951\n// You may also wish to take a look at the guide I made about this program:\n// https://gist.github.com/101arrowz/253f31eb5abc3d9275ab943003ffecad\n// Some of the following code is similar to that of UZIP.js:\n// https://github.com/photopea/UZIP.js\n// However, the vast majority of the codebase has diverged from UZIP.js to increase performance and reduce bundle size.\n// Sometimes 0 will appear where -1 would be more appropriate. This is because using a uint\n// is better for memory in most engines (I *think*).\nvar ch2 = {};\nvar wk = (function (c, id, msg, transfer, cb) {\n var w = new Worker(ch2[id] || (ch2[id] = URL.createObjectURL(new Blob([\n c + ';addEventListener(\"error\",function(e){e=e.error;postMessage({$e$:[e.message,e.code,e.stack]})})'\n ], { type: 'text/javascript' }))));\n w.onmessage = function (e) {\n var d = e.data, ed = d.$e$;\n if (ed) {\n var err = new Error(ed[0]);\n err['code'] = ed[1];\n err.stack = ed[2];\n cb(err, null);\n }\n else\n cb(null, d);\n };\n w.postMessage(msg, transfer);\n return w;\n});\n\n// aliases for shorter compressed code (most minifers don't do this)\nvar u8 = Uint8Array, u16 = Uint16Array, u32 = Uint32Array;\n// fixed length extra bits\nvar fleb = new u8([0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, /* unused */ 0, 0, /* impossible */ 0]);\n// fixed distance extra bits\n// see fleb note\nvar fdeb = new u8([0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, /* unused */ 0, 0]);\n// code length index map\nvar clim = new u8([16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15]);\n// get base, reverse index map from extra bits\nvar freb = function (eb, start) {\n var b = new u16(31);\n for (var i = 0; i < 31; ++i) {\n b[i] = start += 1 << eb[i - 1];\n }\n // numbers here are at max 18 bits\n var r = new u32(b[30]);\n for (var i = 1; i < 30; ++i) {\n for (var j = b[i]; j < b[i + 1]; ++j) {\n r[j] = ((j - b[i]) << 5) | i;\n }\n }\n return [b, r];\n};\nvar _a = freb(fleb, 2), fl = _a[0], revfl = _a[1];\n// we can ignore the fact that the other numbers are wrong; they never happen anyway\nfl[28] = 258, revfl[258] = 28;\nvar _b = freb(fdeb, 0), fd = _b[0], revfd = _b[1];\n// map of value to reverse (assuming 16 bits)\nvar rev = new u16(32768);\nfor (var i = 0; i < 32768; ++i) {\n // reverse table algorithm from SO\n var x = ((i & 0xAAAA) >>> 1) | ((i & 0x5555) << 1);\n x = ((x & 0xCCCC) >>> 2) | ((x & 0x3333) << 2);\n x = ((x & 0xF0F0) >>> 4) | ((x & 0x0F0F) << 4);\n rev[i] = (((x & 0xFF00) >>> 8) | ((x & 0x00FF) << 8)) >>> 1;\n}\n// create huffman tree from u8 \"map\": index -> code length for code index\n// mb (max bits) must be at most 15\n// TODO: optimize/split up?\nvar hMap = (function (cd, mb, r) {\n var s = cd.length;\n // index\n var i = 0;\n // u16 \"map\": index -> # of codes with bit length = index\n var l = new u16(mb);\n // length of cd must be 288 (total # of codes)\n for (; i < s; ++i) {\n if (cd[i])\n ++l[cd[i] - 1];\n }\n // u16 \"map\": index -> minimum code for bit length = index\n var le = new u16(mb);\n for (i = 0; i < mb; ++i) {\n le[i] = (le[i - 1] + l[i - 1]) << 1;\n }\n var co;\n if (r) {\n // u16 \"map\": index -> number of actual bits, symbol for code\n co = new u16(1 << mb);\n // bits to remove for reverser\n var rvb = 15 - mb;\n for (i = 0; i < s; ++i) {\n // ignore 0 lengths\n if (cd[i]) {\n // num encoding both symbol and bits read\n var sv = (i << 4) | cd[i];\n // free bits\n var r_1 = mb - cd[i];\n // start value\n var v = le[cd[i] - 1]++ << r_1;\n // m is end value\n for (var m = v | ((1 << r_1) - 1); v <= m; ++v) {\n // every 16 bit value starting with the code yields the same result\n co[rev[v] >>> rvb] = sv;\n }\n }\n }\n }\n else {\n co = new u16(s);\n for (i = 0; i < s; ++i) {\n if (cd[i]) {\n co[i] = rev[le[cd[i] - 1]++] >>> (15 - cd[i]);\n }\n }\n }\n return co;\n});\n// fixed length tree\nvar flt = new u8(288);\nfor (var i = 0; i < 144; ++i)\n flt[i] = 8;\nfor (var i = 144; i < 256; ++i)\n flt[i] = 9;\nfor (var i = 256; i < 280; ++i)\n flt[i] = 7;\nfor (var i = 280; i < 288; ++i)\n flt[i] = 8;\n// fixed distance tree\nvar fdt = new u8(32);\nfor (var i = 0; i < 32; ++i)\n fdt[i] = 5;\n// fixed length map\nvar flm = /*#__PURE__*/ hMap(flt, 9, 0), flrm = /*#__PURE__*/ hMap(flt, 9, 1);\n// fixed distance map\nvar fdm = /*#__PURE__*/ hMap(fdt, 5, 0), fdrm = /*#__PURE__*/ hMap(fdt, 5, 1);\n// find max of array\nvar max = function (a) {\n var m = a[0];\n for (var i = 1; i < a.length; ++i) {\n if (a[i] > m)\n m = a[i];\n }\n return m;\n};\n// read d, starting at bit p and mask with m\nvar bits = function (d, p, m) {\n var o = (p / 8) | 0;\n return ((d[o] | (d[o + 1] << 8)) >> (p & 7)) & m;\n};\n// read d, starting at bit p continuing for at least 16 bits\nvar bits16 = function (d, p) {\n var o = (p / 8) | 0;\n return ((d[o] | (d[o + 1] << 8) | (d[o + 2] << 16)) >> (p & 7));\n};\n// get end of byte\nvar shft = function (p) { return ((p + 7) / 8) | 0; };\n// typed array slice - allows garbage collector to free original reference,\n// while being more compatible than .slice\nvar slc = function (v, s, e) {\n if (s == null || s < 0)\n s = 0;\n if (e == null || e > v.length)\n e = v.length;\n // can't use .constructor in case user-supplied\n var n = new (v.BYTES_PER_ELEMENT == 2 ? u16 : v.BYTES_PER_ELEMENT == 4 ? u32 : u8)(e - s);\n n.set(v.subarray(s, e));\n return n;\n};\n/**\n * Codes for errors generated within this library\n */\nexport var FlateErrorCode = {\n UnexpectedEOF: 0,\n InvalidBlockType: 1,\n InvalidLengthLiteral: 2,\n InvalidDistance: 3,\n StreamFinished: 4,\n NoStreamHandler: 5,\n InvalidHeader: 6,\n NoCallback: 7,\n InvalidUTF8: 8,\n ExtraFieldTooLong: 9,\n InvalidDate: 10,\n FilenameTooLong: 11,\n StreamFinishing: 12,\n InvalidZipData: 13,\n UnknownCompressionMethod: 14\n};\n// error codes\nvar ec = [\n 'unexpected EOF',\n 'invalid block type',\n 'invalid length/literal',\n 'invalid distance',\n 'stream finished',\n 'no stream handler',\n ,\n 'no callback',\n 'invalid UTF-8 data',\n 'extra field too long',\n 'date not in range 1980-2099',\n 'filename too long',\n 'stream finishing',\n 'invalid zip data'\n // determined by unknown compression method\n];\n;\nvar err = function (ind, msg, nt) {\n var e = new Error(msg || ec[ind]);\n e.code = ind;\n if (Error.captureStackTrace)\n Error.captureStackTrace(e, err);\n if (!nt)\n throw e;\n return e;\n};\n// expands raw DEFLATE data\nvar inflt = function (dat, buf, st) {\n // source length\n var sl = dat.length;\n if (!sl || (st && st.f && !st.l))\n return buf || new u8(0);\n // have to estimate size\n var noBuf = !buf || st;\n // no state\n var noSt = !st || st.i;\n if (!st)\n st = {};\n // Assumes roughly 33% compression ratio average\n if (!buf)\n buf = new u8(sl * 3);\n // ensure buffer can fit at least l elements\n var cbuf = function (l) {\n var bl = buf.length;\n // need to increase size to fit\n if (l > bl) {\n // Double or set to necessary, whichever is greater\n var nbuf = new u8(Math.max(bl * 2, l));\n nbuf.set(buf);\n buf = nbuf;\n }\n };\n // last chunk bitpos bytes\n var final = st.f || 0, pos = st.p || 0, bt = st.b || 0, lm = st.l, dm = st.d, lbt = st.m, dbt = st.n;\n // total bits\n var tbts = sl * 8;\n do {\n if (!lm) {\n // BFINAL - this is only 1 when last chunk is next\n final = bits(dat, pos, 1);\n // type: 0 = no compression, 1 = fixed huffman, 2 = dynamic huffman\n var type = bits(dat, pos + 1, 3);\n pos += 3;\n if (!type) {\n // go to end of byte boundary\n var s = shft(pos) + 4, l = dat[s - 4] | (dat[s - 3] << 8), t = s + l;\n if (t > sl) {\n if (noSt)\n err(0);\n break;\n }\n // ensure size\n if (noBuf)\n cbuf(bt + l);\n // Copy over uncompressed data\n buf.set(dat.subarray(s, t), bt);\n // Get new bitpos, update byte count\n st.b = bt += l, st.p = pos = t * 8, st.f = final;\n continue;\n }\n else if (type == 1)\n lm = flrm, dm = fdrm, lbt = 9, dbt = 5;\n else if (type == 2) {\n // literal lengths\n var hLit = bits(dat, pos, 31) + 257, hcLen = bits(dat, pos + 10, 15) + 4;\n var tl = hLit + bits(dat, pos + 5, 31) + 1;\n pos += 14;\n // length+distance tree\n var ldt = new u8(tl);\n // code length tree\n var clt = new u8(19);\n for (var i = 0; i < hcLen; ++i) {\n // use index map to get real code\n clt[clim[i]] = bits(dat, pos + i * 3, 7);\n }\n pos += hcLen * 3;\n // code lengths bits\n var clb = max(clt), clbmsk = (1 << clb) - 1;\n // code lengths map\n var clm = hMap(clt, clb, 1);\n for (var i = 0; i < tl;) {\n var r = clm[bits(dat, pos, clbmsk)];\n // bits read\n pos += r & 15;\n // symbol\n var s = r >>> 4;\n // code length to copy\n if (s < 16) {\n ldt[i++] = s;\n }\n else {\n // copy count\n var c = 0, n = 0;\n if (s == 16)\n n = 3 + bits(dat, pos, 3), pos += 2, c = ldt[i - 1];\n else if (s == 17)\n n = 3 + bits(dat, pos, 7), pos += 3;\n else if (s == 18)\n n = 11 + bits(dat, pos, 127), pos += 7;\n while (n--)\n ldt[i++] = c;\n }\n }\n // length tree distance tree\n var lt = ldt.subarray(0, hLit), dt = ldt.subarray(hLit);\n // max length bits\n lbt = max(lt);\n // max dist bits\n dbt = max(dt);\n lm = hMap(lt, lbt, 1);\n dm = hMap(dt, dbt, 1);\n }\n else\n err(1);\n if (pos > tbts) {\n if (noSt)\n err(0);\n break;\n }\n }\n // Make sure the buffer can hold this + the largest possible addition\n // Maximum chunk size (practically, theoretically infinite) is 2^17;\n if (noBuf)\n cbuf(bt + 131072);\n var lms = (1 << lbt) - 1, dms = (1 << dbt) - 1;\n var lpos = pos;\n for (;; lpos = pos) {\n // bits read, code\n var c = lm[bits16(dat, pos) & lms], sym = c >>> 4;\n pos += c & 15;\n if (pos > tbts) {\n if (noSt)\n err(0);\n break;\n }\n if (!c)\n err(2);\n if (sym < 256)\n buf[bt++] = sym;\n else if (sym == 256) {\n lpos = pos, lm = null;\n break;\n }\n else {\n var add = sym - 254;\n // no extra bits needed if less\n if (sym > 264) {\n // index\n var i = sym - 257, b = fleb[i];\n add = bits(dat, pos, (1 << b) - 1) + fl[i];\n pos += b;\n }\n // dist\n var d = dm[bits16(dat, pos) & dms], dsym = d >>> 4;\n if (!d)\n err(3);\n pos += d & 15;\n var dt = fd[dsym];\n if (dsym > 3) {\n var b = fdeb[dsym];\n dt += bits16(dat, pos) & ((1 << b) - 1), pos += b;\n }\n if (pos > tbts) {\n if (noSt)\n err(0);\n break;\n }\n if (noBuf)\n cbuf(bt + 131072);\n var end = bt + add;\n for (; bt < end; bt += 4) {\n buf[bt] = buf[bt - dt];\n buf[bt + 1] = buf[bt + 1 - dt];\n buf[bt + 2] = buf[bt + 2 - dt];\n buf[bt + 3] = buf[bt + 3 - dt];\n }\n bt = end;\n }\n }\n st.l = lm, st.p = lpos, st.b = bt, st.f = final;\n if (lm)\n final = 1, st.m = lbt, st.d = dm, st.n = dbt;\n } while (!final);\n return bt == buf.length ? buf : slc(buf, 0, bt);\n};\n// starting at p, write the minimum number of bits that can hold v to d\nvar wbits = function (d, p, v) {\n v <<= p & 7;\n var o = (p / 8) | 0;\n d[o] |= v;\n d[o + 1] |= v >>> 8;\n};\n// starting at p, write the minimum number of bits (>8) that can hold v to d\nvar wbits16 = function (d, p, v) {\n v <<= p & 7;\n var o = (p / 8) | 0;\n d[o] |= v;\n d[o + 1] |= v >>> 8;\n d[o + 2] |= v >>> 16;\n};\n// creates code lengths from a frequency table\nvar hTree = function (d, mb) {\n // Need extra info to make a tree\n var t = [];\n for (var i = 0; i < d.length; ++i) {\n if (d[i])\n t.push({ s: i, f: d[i] });\n }\n var s = t.length;\n var t2 = t.slice();\n if (!s)\n return [et, 0];\n if (s == 1) {\n var v = new u8(t[0].s + 1);\n v[t[0].s] = 1;\n return [v, 1];\n }\n t.sort(function (a, b) { return a.f - b.f; });\n // after i2 reaches last ind, will be stopped\n // freq must be greater than largest possible number of symbols\n t.push({ s: -1, f: 25001 });\n var l = t[0], r = t[1], i0 = 0, i1 = 1, i2 = 2;\n t[0] = { s: -1, f: l.f + r.f, l: l, r: r };\n // efficient algorithm from UZIP.js\n // i0 is lookbehind, i2 is lookahead - after processing two low-freq\n // symbols that combined have high freq, will start processing i2 (high-freq,\n // non-composite) symbols instead\n // see https://reddit.com/r/photopea/comments/ikekht/uzipjs_questions/\n while (i1 != s - 1) {\n l = t[t[i0].f < t[i2].f ? i0++ : i2++];\n r = t[i0 != i1 && t[i0].f < t[i2].f ? i0++ : i2++];\n t[i1++] = { s: -1, f: l.f + r.f, l: l, r: r };\n }\n var maxSym = t2[0].s;\n for (var i = 1; i < s; ++i) {\n if (t2[i].s > maxSym)\n maxSym = t2[i].s;\n }\n // code lengths\n var tr = new u16(maxSym + 1);\n // max bits in tree\n var mbt = ln(t[i1 - 1], tr, 0);\n if (mbt > mb) {\n // more algorithms from UZIP.js\n // TODO: find out how this code works (debt)\n // ind debt\n var i = 0, dt = 0;\n // left cost\n var lft = mbt - mb, cst = 1 << lft;\n t2.sort(function (a, b) { return tr[b.s] - tr[a.s] || a.f - b.f; });\n for (; i < s; ++i) {\n var i2_1 = t2[i].s;\n if (tr[i2_1] > mb) {\n dt += cst - (1 << (mbt - tr[i2_1]));\n tr[i2_1] = mb;\n }\n else\n break;\n }\n dt >>>= lft;\n while (dt > 0) {\n var i2_2 = t2[i].s;\n if (tr[i2_2] < mb)\n dt -= 1 << (mb - tr[i2_2]++ - 1);\n else\n ++i;\n }\n for (; i >= 0 && dt; --i) {\n var i2_3 = t2[i].s;\n if (tr[i2_3] == mb) {\n --tr[i2_3];\n ++dt;\n }\n }\n mbt = mb;\n }\n return [new u8(tr), mbt];\n};\n// get the max length and assign length codes\nvar ln = function (n, l, d) {\n return n.s == -1\n ? Math.max(ln(n.l, l, d + 1), ln(n.r, l, d + 1))\n : (l[n.s] = d);\n};\n// length codes generation\nvar lc = function (c) {\n var s = c.length;\n // Note that the semicolon was intentional\n while (s && !c[--s])\n ;\n var cl = new u16(++s);\n // ind num streak\n var cli = 0, cln = c[0], cls = 1;\n var w = function (v) { cl[cli++] = v; };\n for (var i = 1; i <= s; ++i) {\n if (c[i] == cln && i != s)\n ++cls;\n else {\n if (!cln && cls > 2) {\n for (; cls > 138; cls -= 138)\n w(32754);\n if (cls > 2) {\n w(cls > 10 ? ((cls - 11) << 5) | 28690 : ((cls - 3) << 5) | 12305);\n cls = 0;\n }\n }\n else if (cls > 3) {\n w(cln), --cls;\n for (; cls > 6; cls -= 6)\n w(8304);\n if (cls > 2)\n w(((cls - 3) << 5) | 8208), cls = 0;\n }\n while (cls--)\n w(cln);\n cls = 1;\n cln = c[i];\n }\n }\n return [cl.subarray(0, cli), s];\n};\n// calculate the length of output from tree, code lengths\nvar clen = function (cf, cl) {\n var l = 0;\n for (var i = 0; i < cl.length; ++i)\n l += cf[i] * cl[i];\n return l;\n};\n// writes a fixed block\n// returns the new bit pos\nvar wfblk = function (out, pos, dat) {\n // no need to write 00 as type: TypedArray defaults to 0\n var s = dat.length;\n var o = shft(pos + 2);\n out[o] = s & 255;\n out[o + 1] = s >>> 8;\n out[o + 2] = out[o] ^ 255;\n out[o + 3] = out[o + 1] ^ 255;\n for (var i = 0; i < s; ++i)\n out[o + i + 4] = dat[i];\n return (o + 4 + s) * 8;\n};\n// writes a block\nvar wblk = function (dat, out, final, syms, lf, df, eb, li, bs, bl, p) {\n wbits(out, p++, final);\n ++lf[256];\n var _a = hTree(lf, 15), dlt = _a[0], mlb = _a[1];\n var _b = hTree(df, 15), ddt = _b[0], mdb = _b[1];\n var _c = lc(dlt), lclt = _c[0], nlc = _c[1];\n var _d = lc(ddt), lcdt = _d[0], ndc = _d[1];\n var lcfreq = new u16(19);\n for (var i = 0; i < lclt.length; ++i)\n lcfreq[lclt[i] & 31]++;\n for (var i = 0; i < lcdt.length; ++i)\n lcfreq[lcdt[i] & 31]++;\n var _e = hTree(lcfreq, 7), lct = _e[0], mlcb = _e[1];\n var nlcc = 19;\n for (; nlcc > 4 && !lct[clim[nlcc - 1]]; --nlcc)\n ;\n var flen = (bl + 5) << 3;\n var ftlen = clen(lf, flt) + clen(df, fdt) + eb;\n var dtlen = clen(lf, dlt) + clen(df, ddt) + eb + 14 + 3 * nlcc + clen(lcfreq, lct) + (2 * lcfreq[16] + 3 * lcfreq[17] + 7 * lcfreq[18]);\n if (flen <= ftlen && flen <= dtlen)\n return wfblk(out, p, dat.subarray(bs, bs + bl));\n var lm, ll, dm, dl;\n wbits(out, p, 1 + (dtlen < ftlen)), p += 2;\n if (dtlen < ftlen) {\n lm = hMap(dlt, mlb, 0), ll = dlt, dm = hMap(ddt, mdb, 0), dl = ddt;\n var llm = hMap(lct, mlcb, 0);\n wbits(out, p, nlc - 257);\n wbits(out, p + 5, ndc - 1);\n wbits(out, p + 10, nlcc - 4);\n p += 14;\n for (var i = 0; i < nlcc; ++i)\n wbits(out, p + 3 * i, lct[clim[i]]);\n p += 3 * nlcc;\n var lcts = [lclt, lcdt];\n for (var it = 0; it < 2; ++it) {\n var clct = lcts[it];\n for (var i = 0; i < clct.length; ++i) {\n var len = clct[i] & 31;\n wbits(out, p, llm[len]), p += lct[len];\n if (len > 15)\n wbits(out, p, (clct[i] >>> 5) & 127), p += clct[i] >>> 12;\n }\n }\n }\n else {\n lm = flm, ll = flt, dm = fdm, dl = fdt;\n }\n for (var i = 0; i < li; ++i) {\n if (syms[i] > 255) {\n var len = (syms[i] >>> 18) & 31;\n wbits16(out, p, lm[len + 257]), p += ll[len + 257];\n if (len > 7)\n wbits(out, p, (syms[i] >>> 23) & 31), p += fleb[len];\n var dst = syms[i] & 31;\n wbits16(out, p, dm[dst]), p += dl[dst];\n if (dst > 3)\n wbits16(out, p, (syms[i] >>> 5) & 8191), p += fdeb[dst];\n }\n else {\n wbits16(out, p, lm[syms[i]]), p += ll[syms[i]];\n }\n }\n wbits16(out, p, lm[256]);\n return p + ll[256];\n};\n// deflate options (nice << 13) | chain\nvar deo = /*#__PURE__*/ new u32([65540, 131080, 131088, 131104, 262176, 1048704, 1048832, 2114560, 2117632]);\n// empty\nvar et = /*#__PURE__*/ new u8(0);\n// compresses data into a raw DEFLATE buffer\nvar dflt = function (dat, lvl, plvl, pre, post, lst) {\n var s = dat.length;\n var o = new u8(pre + s + 5 * (1 + Math.ceil(s / 7000)) + post);\n // writing to this writes to the output buffer\n var w = o.subarray(pre, o.length - post);\n var pos = 0;\n if (!lvl || s < 8) {\n for (var i = 0; i <= s; i += 65535) {\n // end\n var e = i + 65535;\n if (e >= s) {\n // write final block\n w[pos >> 3] = lst;\n }\n pos = wfblk(w, pos + 1, dat.subarray(i, e));\n }\n }\n else {\n var opt = deo[lvl - 1];\n var n = opt >>> 13, c = opt & 8191;\n var msk_1 = (1 << plvl) - 1;\n // prev 2-byte val map curr 2-byte val map\n var prev = new u16(32768), head = new u16(msk_1 + 1);\n var bs1_1 = Math.ceil(plvl / 3), bs2_1 = 2 * bs1_1;\n var hsh = function (i) { return (dat[i] ^ (dat[i + 1] << bs1_1) ^ (dat[i + 2] << bs2_1)) & msk_1; };\n // 24576 is an arbitrary number of maximum symbols per block\n // 424 buffer for last block\n var syms = new u32(25000);\n // length/literal freq distance freq\n var lf = new u16(288), df = new u16(32);\n // l/lcnt exbits index l/lind waitdx bitpos\n var lc_1 = 0, eb = 0, i = 0, li = 0, wi = 0, bs = 0;\n for (; i < s; ++i) {\n // hash value\n // deopt when i > s - 3 - at end, deopt acceptable\n var hv = hsh(i);\n // index mod 32768 previous index mod\n var imod = i & 32767, pimod = head[hv];\n prev[imod] = pimod;\n head[hv] = imod;\n // We always should modify head and prev, but only add symbols if\n // this data is not yet processed (\"wait\" for wait index)\n if (wi <= i) {\n // bytes remaining\n var rem = s - i;\n if ((lc_1 > 7000 || li > 24576) && rem > 423) {\n pos = wblk(dat, w, 0, syms, lf, df, eb, li, bs, i - bs, pos);\n li = lc_1 = eb = 0, bs = i;\n for (var j = 0; j < 286; ++j)\n lf[j] = 0;\n for (var j = 0; j < 30; ++j)\n df[j] = 0;\n }\n // len dist chain\n var l = 2, d = 0, ch_1 = c, dif = (imod - pimod) & 32767;\n if (rem > 2 && hv == hsh(i - dif)) {\n var maxn = Math.min(n, rem) - 1;\n var maxd = Math.min(32767, i);\n // max possible length\n // not capped at dif because decompressors implement \"rolling\" index population\n var ml = Math.min(258, rem);\n while (dif <= maxd && --ch_1 && imod != pimod) {\n if (dat[i + l] == dat[i + l - dif]) {\n var nl = 0;\n for (; nl < ml && dat[i + nl] == dat[i + nl - dif]; ++nl)\n ;\n if (nl > l) {\n l = nl, d = dif;\n // break out early when we reach \"nice\" (we are satisfied enough)\n if (nl > maxn)\n break;\n // now, find the rarest 2-byte sequence within this\n // length of literals and search for that instead.\n // Much faster than just using the start\n var mmd = Math.min(dif, nl - 2);\n var md = 0;\n for (var j = 0; j < mmd; ++j) {\n var ti = (i - dif + j + 32768) & 32767;\n var pti = prev[ti];\n var cd = (ti - pti + 32768) & 32767;\n if (cd > md)\n md = cd, pimod = ti;\n }\n }\n }\n // check the previous match\n imod = pimod, pimod = prev[imod];\n dif += (imod - pimod + 32768) & 32767;\n }\n }\n // d will be nonzero only when a match was found\n if (d) {\n // store both dist and len data in one Uint32\n // Make sure this is recognized as a len/dist with 28th bit (2^28)\n syms[li++] = 268435456 | (revfl[l] << 18) | revfd[d];\n var lin = revfl[l] & 31, din = revfd[d] & 31;\n eb += fleb[lin] + fdeb[din];\n ++lf[257 + lin];\n ++df[din];\n wi = i + l;\n ++lc_1;\n }\n else {\n syms[li++] = dat[i];\n ++lf[dat[i]];\n }\n }\n }\n pos = wblk(dat, w, lst, syms, lf, df, eb, li, bs, i - bs, pos);\n // this is the easiest way to avoid needing to maintain state\n if (!lst && pos & 7)\n pos = wfblk(w, pos + 1, et);\n }\n return slc(o, 0, pre + shft(pos) + post);\n};\n// CRC32 table\nvar crct = /*#__PURE__*/ (function () {\n var t = new Int32Array(256);\n for (var i = 0; i < 256; ++i) {\n var c = i, k = 9;\n while (--k)\n c = ((c & 1) && -306674912) ^ (c >>> 1);\n t[i] = c;\n }\n return t;\n})();\n// CRC32\nvar crc = function () {\n var c = -1;\n return {\n p: function (d) {\n // closures have awful performance\n var cr = c;\n for (var i = 0; i < d.length; ++i)\n cr = crct[(cr & 255) ^ d[i]] ^ (cr >>> 8);\n c = cr;\n },\n d: function () { return ~c; }\n };\n};\n// Alder32\nvar adler = function () {\n var a = 1, b = 0;\n return {\n p: function (d) {\n // closures have awful performance\n var n = a, m = b;\n var l = d.length | 0;\n for (var i = 0; i != l;) {\n var e = Math.min(i + 2655, l);\n for (; i < e; ++i)\n m += n += d[i];\n n = (n & 65535) + 15 * (n >> 16), m = (m & 65535) + 15 * (m >> 16);\n }\n a = n, b = m;\n },\n d: function () {\n a %= 65521, b %= 65521;\n return (a & 255) << 24 | (a >>> 8) << 16 | (b & 255) << 8 | (b >>> 8);\n }\n };\n};\n;\n// deflate with opts\nvar dopt = function (dat, opt, pre, post, st) {\n return dflt(dat, opt.level == null ? 6 : opt.level, opt.mem == null ? Math.ceil(Math.max(8, Math.min(13, Math.log(dat.length))) * 1.5) : (12 + opt.mem), pre, post, !st);\n};\n// Walmart object spread\nvar mrg = function (a, b) {\n var o = {};\n for (var k in a)\n o[k] = a[k];\n for (var k in b)\n o[k] = b[k];\n return o;\n};\n// worker clone\n// This is possibly the craziest part of the entire codebase, despite how simple it may seem.\n// The only parameter to this function is a closure that returns an array of variables outside of the function scope.\n// We're going to try to figure out the variable names used in the closure as strings because that is crucial for workerization.\n// We will return an object mapping of true variable name to value (basically, the current scope as a JS object).\n// The reason we can't just use the original variable names is minifiers mangling the toplevel scope.\n// This took me three weeks to figure out how to do.\nvar wcln = function (fn, fnStr, td) {\n var dt = fn();\n var st = fn.toString();\n var ks = st.slice(st.indexOf('[') + 1, st.lastIndexOf(']')).replace(/\\s+/g, '').split(',');\n for (var i = 0; i < dt.length; ++i) {\n var v = dt[i], k = ks[i];\n if (typeof v == 'function') {\n fnStr += ';' + k + '=';\n var st_1 = v.toString();\n if (v.prototype) {\n // for global objects\n if (st_1.indexOf('[native code]') != -1) {\n var spInd = st_1.indexOf(' ', 8) + 1;\n fnStr += st_1.slice(spInd, st_1.indexOf('(', spInd));\n }\n else {\n fnStr += st_1;\n for (var t in v.prototype)\n fnStr += ';' + k + '.prototype.' + t + '=' + v.prototype[t].toString();\n }\n }\n else\n fnStr += st_1;\n }\n else\n td[k] = v;\n }\n return [fnStr, td];\n};\nvar ch = [];\n// clone bufs\nvar cbfs = function (v) {\n var tl = [];\n for (var k in v) {\n if (v[k].buffer) {\n tl.push((v[k] = new v[k].constructor(v[k])).buffer);\n }\n }\n return tl;\n};\n// use a worker to execute code\nvar wrkr = function (fns, init, id, cb) {\n var _a;\n if (!ch[id]) {\n var fnStr = '', td_1 = {}, m = fns.length - 1;\n for (var i = 0; i < m; ++i)\n _a = wcln(fns[i], fnStr, td_1), fnStr = _a[0], td_1 = _a[1];\n ch[id] = wcln(fns[m], fnStr, td_1);\n }\n var td = mrg({}, ch[id][1]);\n return wk(ch[id][0] + ';onmessage=function(e){for(var k in e.data)self[k]=e.data[k];onmessage=' + init.toString() + '}', id, td, cbfs(td), cb);\n};\n// base async inflate fn\nvar bInflt = function () { return [u8, u16, u32, fleb, fdeb, clim, fl, fd, flrm, fdrm, rev, ec, hMap, max, bits, bits16, shft, slc, err, inflt, inflateSync, pbf, gu8]; };\nvar bDflt = function () { return [u8, u16, u32, fleb, fdeb, clim, revfl, revfd, flm, flt, fdm, fdt, rev, deo, et, hMap, wbits, wbits16, hTree, ln, lc, clen, wfblk, wblk, shft, slc, dflt, dopt, deflateSync, pbf]; };\n// gzip extra\nvar gze = function () { return [gzh, gzhl, wbytes, crc, crct]; };\n// gunzip extra\nvar guze = function () { return [gzs, gzl]; };\n// zlib extra\nvar zle = function () { return [zlh, wbytes, adler]; };\n// unzlib extra\nvar zule = function () { return [zlv]; };\n// post buf\nvar pbf = function (msg) { return postMessage(msg, [msg.buffer]); };\n// get u8\nvar gu8 = function (o) { return o && o.size && new u8(o.size); };\n// async helper\nvar cbify = function (dat, opts, fns, init, id, cb) {\n var w = wrkr(fns, init, id, function (err, dat) {\n w.terminate();\n cb(err, dat);\n });\n w.postMessage([dat, opts], opts.consume ? [dat.buffer] : []);\n return function () { w.terminate(); };\n};\n// auto stream\nvar astrm = function (strm) {\n strm.ondata = function (dat, final) { return postMessage([dat, final], [dat.buffer]); };\n return function (ev) { return strm.push(ev.data[0], ev.data[1]); };\n};\n// async stream attach\nvar astrmify = function (fns, strm, opts, init, id) {\n var t;\n var w = wrkr(fns, init, id, function (err, dat) {\n if (err)\n w.terminate(), strm.ondata.call(strm, err);\n else {\n if (dat[1])\n w.terminate();\n strm.ondata.call(strm, err, dat[0], dat[1]);\n }\n });\n w.postMessage(opts);\n strm.push = function (d, f) {\n if (!strm.ondata)\n err(5);\n if (t)\n strm.ondata(err(4, 0, 1), null, !!f);\n w.postMessage([d, t = f], [d.buffer]);\n };\n strm.terminate = function () { w.terminate(); };\n};\n// read 2 bytes\nvar b2 = function (d, b) { return d[b] | (d[b + 1] << 8); };\n// read 4 bytes\nvar b4 = function (d, b) { return (d[b] | (d[b + 1] << 8) | (d[b + 2] << 16) | (d[b + 3] << 24)) >>> 0; };\nvar b8 = function (d, b) { return b4(d, b) + (b4(d, b + 4) * 4294967296); };\n// write bytes\nvar wbytes = function (d, b, v) {\n for (; v; ++b)\n d[b] = v, v >>>= 8;\n};\n// gzip header\nvar gzh = function (c, o) {\n var fn = o.filename;\n c[0] = 31, c[1] = 139, c[2] = 8, c[8] = o.level < 2 ? 4 : o.level == 9 ? 2 : 0, c[9] = 3; // assume Unix\n if (o.mtime != 0)\n wbytes(c, 4, Math.floor(new Date(o.mtime || Date.now()) / 1000));\n if (fn) {\n c[3] = 8;\n for (var i = 0; i <= fn.length; ++i)\n c[i + 10] = fn.charCodeAt(i);\n }\n};\n// gzip footer: -8 to -4 = CRC, -4 to -0 is length\n// gzip start\nvar gzs = function (d) {\n if (d[0] != 31 || d[1] != 139 || d[2] != 8)\n err(6, 'invalid gzip data');\n var flg = d[3];\n var st = 10;\n if (flg & 4)\n st += d[10] | (d[11] << 8) + 2;\n for (var zs = (flg >> 3 & 1) + (flg >> 4 & 1); zs > 0; zs -= !d[st++])\n ;\n return st + (flg & 2);\n};\n// gzip length\nvar gzl = function (d) {\n var l = d.length;\n return ((d[l - 4] | d[l - 3] << 8 | d[l - 2] << 16) | (d[l - 1] << 24)) >>> 0;\n};\n// gzip header length\nvar gzhl = function (o) { return 10 + ((o.filename && (o.filename.length + 1)) || 0); };\n// zlib header\nvar zlh = function (c, o) {\n var lv = o.level, fl = lv == 0 ? 0 : lv < 6 ? 1 : lv == 9 ? 3 : 2;\n c[0] = 120, c[1] = (fl << 6) | (fl ? (32 - 2 * fl) : 1);\n};\n// zlib valid\nvar zlv = function (d) {\n if ((d[0] & 15) != 8 || (d[0] >>> 4) > 7 || ((d[0] << 8 | d[1]) % 31))\n err(6, 'invalid zlib data');\n if (d[1] & 32)\n err(6, 'invalid zlib data: preset dictionaries not supported');\n};\nfunction AsyncCmpStrm(opts, cb) {\n if (!cb && typeof opts == 'function')\n cb = opts, opts = {};\n this.ondata = cb;\n return opts;\n}\n// zlib footer: -4 to -0 is Adler32\n/**\n * Streaming DEFLATE compression\n */\nvar Deflate = /*#__PURE__*/ (function () {\n function Deflate(opts, cb) {\n if (!cb && typeof opts == 'function')\n cb = opts, opts = {};\n this.ondata = cb;\n this.o = opts || {};\n }\n Deflate.prototype.p = function (c, f) {\n this.ondata(dopt(c, this.o, 0, 0, !f), f);\n };\n /**\n * Pushes a chunk to be deflated\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Deflate.prototype.push = function (chunk, final) {\n if (!this.ondata)\n err(5);\n if (this.d)\n err(4);\n this.d = final;\n this.p(chunk, final || false);\n };\n return Deflate;\n}());\nexport { Deflate };\n/**\n * Asynchronous streaming DEFLATE compression\n */\nvar AsyncDeflate = /*#__PURE__*/ (function () {\n function AsyncDeflate(opts, cb) {\n astrmify([\n bDflt,\n function () { return [astrm, Deflate]; }\n ], this, AsyncCmpStrm.call(this, opts, cb), function (ev) {\n var strm = new Deflate(ev.data);\n onmessage = astrm(strm);\n }, 6);\n }\n return AsyncDeflate;\n}());\nexport { AsyncDeflate };\nexport function deflate(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n return cbify(data, opts, [\n bDflt,\n ], function (ev) { return pbf(deflateSync(ev.data[0], ev.data[1])); }, 0, cb);\n}\n/**\n * Compresses data with DEFLATE without any wrapper\n * @param data The data to compress\n * @param opts The compression options\n * @returns The deflated version of the data\n */\nexport function deflateSync(data, opts) {\n return dopt(data, opts || {}, 0, 0);\n}\n/**\n * Streaming DEFLATE decompression\n */\nvar Inflate = /*#__PURE__*/ (function () {\n /**\n * Creates an inflation stream\n * @param cb The callback to call whenever data is inflated\n */\n function Inflate(cb) {\n this.s = {};\n this.p = new u8(0);\n this.ondata = cb;\n }\n Inflate.prototype.e = function (c) {\n if (!this.ondata)\n err(5);\n if (this.d)\n err(4);\n var l = this.p.length;\n var n = new u8(l + c.length);\n n.set(this.p), n.set(c, l), this.p = n;\n };\n Inflate.prototype.c = function (final) {\n this.d = this.s.i = final || false;\n var bts = this.s.b;\n var dt = inflt(this.p, this.o, this.s);\n this.ondata(slc(dt, bts, this.s.b), this.d);\n this.o = slc(dt, this.s.b - 32768), this.s.b = this.o.length;\n this.p = slc(this.p, (this.s.p / 8) | 0), this.s.p &= 7;\n };\n /**\n * Pushes a chunk to be inflated\n * @param chunk The chunk to push\n * @param final Whether this is the final chunk\n */\n Inflate.prototype.push = function (chunk, final) {\n this.e(chunk), this.c(final);\n };\n return Inflate;\n}());\nexport { Inflate };\n/**\n * Asynchronous streaming DEFLATE decompression\n */\nvar AsyncInflate = /*#__PURE__*/ (function () {\n /**\n * Creates an asynchronous inflation stream\n * @param cb The callback to call whenever data is deflated\n */\n function AsyncInflate(cb) {\n this.ondata = cb;\n astrmify([\n bInflt,\n function () { return [astrm, Inflate]; }\n ], this, 0, function () {\n var strm = new Inflate();\n onmessage = astrm(strm);\n }, 7);\n }\n return AsyncInflate;\n}());\nexport { AsyncInflate };\nexport function inflate(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n return cbify(data, opts, [\n bInflt\n ], function (ev) { return pbf(inflateSync(ev.data[0], gu8(ev.data[1]))); }, 1, cb);\n}\n/**\n * Expands DEFLATE data with no wrapper\n * @param data The data to decompress\n * @param out Where to write the data. Saves memory if you know the decompressed size and provide an output buffer of that length.\n * @returns The decompressed version of the data\n */\nexport function inflateSync(data, out) {\n return inflt(data, out);\n}\n// before you yell at me for not just using extends, my reason is that TS inheritance is hard to workerize.\n/**\n * Streaming GZIP compression\n */\nvar Gzip = /*#__PURE__*/ (function () {\n function Gzip(opts, cb) {\n this.c = crc();\n this.l = 0;\n this.v = 1;\n Deflate.call(this, opts, cb);\n }\n /**\n * Pushes a chunk to be GZIPped\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Gzip.prototype.push = function (chunk, final) {\n Deflate.prototype.push.call(this, chunk, final);\n };\n Gzip.prototype.p = function (c, f) {\n this.c.p(c);\n this.l += c.length;\n var raw = dopt(c, this.o, this.v && gzhl(this.o), f && 8, !f);\n if (this.v)\n gzh(raw, this.o), this.v = 0;\n if (f)\n wbytes(raw, raw.length - 8, this.c.d()), wbytes(raw, raw.length - 4, this.l);\n this.ondata(raw, f);\n };\n return Gzip;\n}());\nexport { Gzip };\n/**\n * Asynchronous streaming GZIP compression\n */\nvar AsyncGzip = /*#__PURE__*/ (function () {\n function AsyncGzip(opts, cb) {\n astrmify([\n bDflt,\n gze,\n function () { return [astrm, Deflate, Gzip]; }\n ], this, AsyncCmpStrm.call(this, opts, cb), function (ev) {\n var strm = new Gzip(ev.data);\n onmessage = astrm(strm);\n }, 8);\n }\n return AsyncGzip;\n}());\nexport { AsyncGzip };\nexport function gzip(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n return cbify(data, opts, [\n bDflt,\n gze,\n function () { return [gzipSync]; }\n ], function (ev) { return pbf(gzipSync(ev.data[0], ev.data[1])); }, 2, cb);\n}\n/**\n * Compresses data with GZIP\n * @param data The data to compress\n * @param opts The compression options\n * @returns The gzipped version of the data\n */\nexport function gzipSync(data, opts) {\n if (!opts)\n opts = {};\n var c = crc(), l = data.length;\n c.p(data);\n var d = dopt(data, opts, gzhl(opts), 8), s = d.length;\n return gzh(d, opts), wbytes(d, s - 8, c.d()), wbytes(d, s - 4, l), d;\n}\n/**\n * Streaming GZIP decompression\n */\nvar Gunzip = /*#__PURE__*/ (function () {\n /**\n * Creates a GUNZIP stream\n * @param cb The callback to call whenever data is inflated\n */\n function Gunzip(cb) {\n this.v = 1;\n Inflate.call(this, cb);\n }\n /**\n * Pushes a chunk to be GUNZIPped\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Gunzip.prototype.push = function (chunk, final) {\n Inflate.prototype.e.call(this, chunk);\n if (this.v) {\n var s = this.p.length > 3 ? gzs(this.p) : 4;\n if (s >= this.p.length && !final)\n return;\n this.p = this.p.subarray(s), this.v = 0;\n }\n if (final) {\n if (this.p.length < 8)\n err(6, 'invalid gzip data');\n this.p = this.p.subarray(0, -8);\n }\n // necessary to prevent TS from using the closure value\n // This allows for workerization to function correctly\n Inflate.prototype.c.call(this, final);\n };\n return Gunzip;\n}());\nexport { Gunzip };\n/**\n * Asynchronous streaming GZIP decompression\n */\nvar AsyncGunzip = /*#__PURE__*/ (function () {\n /**\n * Creates an asynchronous GUNZIP stream\n * @param cb The callback to call whenever data is deflated\n */\n function AsyncGunzip(cb) {\n this.ondata = cb;\n astrmify([\n bInflt,\n guze,\n function () { return [astrm, Inflate, Gunzip]; }\n ], this, 0, function () {\n var strm = new Gunzip();\n onmessage = astrm(strm);\n }, 9);\n }\n return AsyncGunzip;\n}());\nexport { AsyncGunzip };\nexport function gunzip(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n return cbify(data, opts, [\n bInflt,\n guze,\n function () { return [gunzipSync]; }\n ], function (ev) { return pbf(gunzipSync(ev.data[0])); }, 3, cb);\n}\n/**\n * Expands GZIP data\n * @param data The data to decompress\n * @param out Where to write the data. GZIP already encodes the output size, so providing this doesn't save memory.\n * @returns The decompressed version of the data\n */\nexport function gunzipSync(data, out) {\n return inflt(data.subarray(gzs(data), -8), out || new u8(gzl(data)));\n}\n/**\n * Streaming Zlib compression\n */\nvar Zlib = /*#__PURE__*/ (function () {\n function Zlib(opts, cb) {\n this.c = adler();\n this.v = 1;\n Deflate.call(this, opts, cb);\n }\n /**\n * Pushes a chunk to be zlibbed\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Zlib.prototype.push = function (chunk, final) {\n Deflate.prototype.push.call(this, chunk, final);\n };\n Zlib.prototype.p = function (c, f) {\n this.c.p(c);\n var raw = dopt(c, this.o, this.v && 2, f && 4, !f);\n if (this.v)\n zlh(raw, this.o), this.v = 0;\n if (f)\n wbytes(raw, raw.length - 4, this.c.d());\n this.ondata(raw, f);\n };\n return Zlib;\n}());\nexport { Zlib };\n/**\n * Asynchronous streaming Zlib compression\n */\nvar AsyncZlib = /*#__PURE__*/ (function () {\n function AsyncZlib(opts, cb) {\n astrmify([\n bDflt,\n zle,\n function () { return [astrm, Deflate, Zlib]; }\n ], this, AsyncCmpStrm.call(this, opts, cb), function (ev) {\n var strm = new Zlib(ev.data);\n onmessage = astrm(strm);\n }, 10);\n }\n return AsyncZlib;\n}());\nexport { AsyncZlib };\nexport function zlib(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n return cbify(data, opts, [\n bDflt,\n zle,\n function () { return [zlibSync]; }\n ], function (ev) { return pbf(zlibSync(ev.data[0], ev.data[1])); }, 4, cb);\n}\n/**\n * Compress data with Zlib\n * @param data The data to compress\n * @param opts The compression options\n * @returns The zlib-compressed version of the data\n */\nexport function zlibSync(data, opts) {\n if (!opts)\n opts = {};\n var a = adler();\n a.p(data);\n var d = dopt(data, opts, 2, 4);\n return zlh(d, opts), wbytes(d, d.length - 4, a.d()), d;\n}\n/**\n * Streaming Zlib decompression\n */\nvar Unzlib = /*#__PURE__*/ (function () {\n /**\n * Creates a Zlib decompression stream\n * @param cb The callback to call whenever data is inflated\n */\n function Unzlib(cb) {\n this.v = 1;\n Inflate.call(this, cb);\n }\n /**\n * Pushes a chunk to be unzlibbed\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Unzlib.prototype.push = function (chunk, final) {\n Inflate.prototype.e.call(this, chunk);\n if (this.v) {\n if (this.p.length < 2 && !final)\n return;\n this.p = this.p.subarray(2), this.v = 0;\n }\n if (final) {\n if (this.p.length < 4)\n err(6, 'invalid zlib data');\n this.p = this.p.subarray(0, -4);\n }\n // necessary to prevent TS from using the closure value\n // This allows for workerization to function correctly\n Inflate.prototype.c.call(this, final);\n };\n return Unzlib;\n}());\nexport { Unzlib };\n/**\n * Asynchronous streaming Zlib decompression\n */\nvar AsyncUnzlib = /*#__PURE__*/ (function () {\n /**\n * Creates an asynchronous Zlib decompression stream\n * @param cb The callback to call whenever data is deflated\n */\n function AsyncUnzlib(cb) {\n this.ondata = cb;\n astrmify([\n bInflt,\n zule,\n function () { return [astrm, Inflate, Unzlib]; }\n ], this, 0, function () {\n var strm = new Unzlib();\n onmessage = astrm(strm);\n }, 11);\n }\n return AsyncUnzlib;\n}());\nexport { AsyncUnzlib };\nexport function unzlib(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n return cbify(data, opts, [\n bInflt,\n zule,\n function () { return [unzlibSync]; }\n ], function (ev) { return pbf(unzlibSync(ev.data[0], gu8(ev.data[1]))); }, 5, cb);\n}\n/**\n * Expands Zlib data\n * @param data The data to decompress\n * @param out Where to write the data. Saves memory if you know the decompressed size and provide an output buffer of that length.\n * @returns The decompressed version of the data\n */\nexport function unzlibSync(data, out) {\n return inflt((zlv(data), data.subarray(2, -4)), out);\n}\n// Default algorithm for compression (used because having a known output size allows faster decompression)\nexport { gzip as compress, AsyncGzip as AsyncCompress };\n// Default algorithm for compression (used because having a known output size allows faster decompression)\nexport { gzipSync as compressSync, Gzip as Compress };\n/**\n * Streaming GZIP, Zlib, or raw DEFLATE decompression\n */\nvar Decompress = /*#__PURE__*/ (function () {\n /**\n * Creates a decompression stream\n * @param cb The callback to call whenever data is decompressed\n */\n function Decompress(cb) {\n this.G = Gunzip;\n this.I = Inflate;\n this.Z = Unzlib;\n this.ondata = cb;\n }\n /**\n * Pushes a chunk to be decompressed\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Decompress.prototype.push = function (chunk, final) {\n if (!this.ondata)\n err(5);\n if (!this.s) {\n if (this.p && this.p.length) {\n var n = new u8(this.p.length + chunk.length);\n n.set(this.p), n.set(chunk, this.p.length);\n }\n else\n this.p = chunk;\n if (this.p.length > 2) {\n var _this_1 = this;\n var cb = function () { _this_1.ondata.apply(_this_1, arguments); };\n this.s = (this.p[0] == 31 && this.p[1] == 139 && this.p[2] == 8)\n ? new this.G(cb)\n : ((this.p[0] & 15) != 8 || (this.p[0] >> 4) > 7 || ((this.p[0] << 8 | this.p[1]) % 31))\n ? new this.I(cb)\n : new this.Z(cb);\n this.s.push(this.p, final);\n this.p = null;\n }\n }\n else\n this.s.push(chunk, final);\n };\n return Decompress;\n}());\nexport { Decompress };\n/**\n * Asynchronous streaming GZIP, Zlib, or raw DEFLATE decompression\n */\nvar AsyncDecompress = /*#__PURE__*/ (function () {\n /**\n * Creates an asynchronous decompression stream\n * @param cb The callback to call whenever data is decompressed\n */\n function AsyncDecompress(cb) {\n this.G = AsyncGunzip;\n this.I = AsyncInflate;\n this.Z = AsyncUnzlib;\n this.ondata = cb;\n }\n /**\n * Pushes a chunk to be decompressed\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n AsyncDecompress.prototype.push = function (chunk, final) {\n Decompress.prototype.push.call(this, chunk, final);\n };\n return AsyncDecompress;\n}());\nexport { AsyncDecompress };\nexport function decompress(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n return (data[0] == 31 && data[1] == 139 && data[2] == 8)\n ? gunzip(data, opts, cb)\n : ((data[0] & 15) != 8 || (data[0] >> 4) > 7 || ((data[0] << 8 | data[1]) % 31))\n ? inflate(data, opts, cb)\n : unzlib(data, opts, cb);\n}\n/**\n * Expands compressed GZIP, Zlib, or raw DEFLATE data, automatically detecting the format\n * @param data The data to decompress\n * @param out Where to write the data. Saves memory if you know the decompressed size and provide an output buffer of that length.\n * @returns The decompressed version of the data\n */\nexport function decompressSync(data, out) {\n return (data[0] == 31 && data[1] == 139 && data[2] == 8)\n ? gunzipSync(data, out)\n : ((data[0] & 15) != 8 || (data[0] >> 4) > 7 || ((data[0] << 8 | data[1]) % 31))\n ? inflateSync(data, out)\n : unzlibSync(data, out);\n}\n// flatten a directory structure\nvar fltn = function (d, p, t, o) {\n for (var k in d) {\n var val = d[k], n = p + k, op = o;\n if (Array.isArray(val))\n op = mrg(o, val[1]), val = val[0];\n if (val instanceof u8)\n t[n] = [val, op];\n else {\n t[n += '/'] = [new u8(0), op];\n fltn(val, n, t, o);\n }\n }\n};\n// text encoder\nvar te = typeof TextEncoder != 'undefined' && /*#__PURE__*/ new TextEncoder();\n// text decoder\nvar td = typeof TextDecoder != 'undefined' && /*#__PURE__*/ new TextDecoder();\n// text decoder stream\nvar tds = 0;\ntry {\n td.decode(et, { stream: true });\n tds = 1;\n}\ncatch (e) { }\n// decode UTF8\nvar dutf8 = function (d) {\n for (var r = '', i = 0;;) {\n var c = d[i++];\n var eb = (c > 127) + (c > 223) + (c > 239);\n if (i + eb > d.length)\n return [r, slc(d, i - 1)];\n if (!eb)\n r += String.fromCharCode(c);\n else if (eb == 3) {\n c = ((c & 15) << 18 | (d[i++] & 63) << 12 | (d[i++] & 63) << 6 | (d[i++] & 63)) - 65536,\n r += String.fromCharCode(55296 | (c >> 10), 56320 | (c & 1023));\n }\n else if (eb & 1)\n r += String.fromCharCode((c & 31) << 6 | (d[i++] & 63));\n else\n r += String.fromCharCode((c & 15) << 12 | (d[i++] & 63) << 6 | (d[i++] & 63));\n }\n};\n/**\n * Streaming UTF-8 decoding\n */\nvar DecodeUTF8 = /*#__PURE__*/ (function () {\n /**\n * Creates a UTF-8 decoding stream\n * @param cb The callback to call whenever data is decoded\n */\n function DecodeUTF8(cb) {\n this.ondata = cb;\n if (tds)\n this.t = new TextDecoder();\n else\n this.p = et;\n }\n /**\n * Pushes a chunk to be decoded from UTF-8 binary\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n DecodeUTF8.prototype.push = function (chunk, final) {\n if (!this.ondata)\n err(5);\n final = !!final;\n if (this.t) {\n this.ondata(this.t.decode(chunk, { stream: true }), final);\n if (final) {\n if (this.t.decode().length)\n err(8);\n this.t = null;\n }\n return;\n }\n if (!this.p)\n err(4);\n var dat = new u8(this.p.length + chunk.length);\n dat.set(this.p);\n dat.set(chunk, this.p.length);\n var _a = dutf8(dat), ch = _a[0], np = _a[1];\n if (final) {\n if (np.length)\n err(8);\n this.p = null;\n }\n else\n this.p = np;\n this.ondata(ch, final);\n };\n return DecodeUTF8;\n}());\nexport { DecodeUTF8 };\n/**\n * Streaming UTF-8 encoding\n */\nvar EncodeUTF8 = /*#__PURE__*/ (function () {\n /**\n * Creates a UTF-8 decoding stream\n * @param cb The callback to call whenever data is encoded\n */\n function EncodeUTF8(cb) {\n this.ondata = cb;\n }\n /**\n * Pushes a chunk to be encoded to UTF-8\n * @param chunk The string data to push\n * @param final Whether this is the last chunk\n */\n EncodeUTF8.prototype.push = function (chunk, final) {\n if (!this.ondata)\n err(5);\n if (this.d)\n err(4);\n this.ondata(strToU8(chunk), this.d = final || false);\n };\n return EncodeUTF8;\n}());\nexport { EncodeUTF8 };\n/**\n * Converts a string into a Uint8Array for use with compression/decompression methods\n * @param str The string to encode\n * @param latin1 Whether or not to interpret the data as Latin-1. This should\n * not need to be true unless decoding a binary string.\n * @returns The string encoded in UTF-8/Latin-1 binary\n */\nexport function strToU8(str, latin1) {\n if (latin1) {\n var ar_1 = new u8(str.length);\n for (var i = 0; i < str.length; ++i)\n ar_1[i] = str.charCodeAt(i);\n return ar_1;\n }\n if (te)\n return te.encode(str);\n var l = str.length;\n var ar = new u8(str.length + (str.length >> 1));\n var ai = 0;\n var w = function (v) { ar[ai++] = v; };\n for (var i = 0; i < l; ++i) {\n if (ai + 5 > ar.length) {\n var n = new u8(ai + 8 + ((l - i) << 1));\n n.set(ar);\n ar = n;\n }\n var c = str.charCodeAt(i);\n if (c < 128 || latin1)\n w(c);\n else if (c < 2048)\n w(192 | (c >> 6)), w(128 | (c & 63));\n else if (c > 55295 && c < 57344)\n c = 65536 + (c & 1023 << 10) | (str.charCodeAt(++i) & 1023),\n w(240 | (c >> 18)), w(128 | ((c >> 12) & 63)), w(128 | ((c >> 6) & 63)), w(128 | (c & 63));\n else\n w(224 | (c >> 12)), w(128 | ((c >> 6) & 63)), w(128 | (c & 63));\n }\n return slc(ar, 0, ai);\n}\n/**\n * Converts a Uint8Array to a string\n * @param dat The data to decode to string\n * @param latin1 Whether or not to interpret the data as Latin-1. This should\n * not need to be true unless encoding to binary string.\n * @returns The original UTF-8/Latin-1 string\n */\nexport function strFromU8(dat, latin1) {\n if (latin1) {\n var r = '';\n for (var i = 0; i < dat.length; i += 16384)\n r += String.fromCharCode.apply(null, dat.subarray(i, i + 16384));\n return r;\n }\n else if (td)\n return td.decode(dat);\n else {\n var _a = dutf8(dat), out = _a[0], ext = _a[1];\n if (ext.length)\n err(8);\n return out;\n }\n}\n;\n// deflate bit flag\nvar dbf = function (l) { return l == 1 ? 3 : l < 6 ? 2 : l == 9 ? 1 : 0; };\n// skip local zip header\nvar slzh = function (d, b) { return b + 30 + b2(d, b + 26) + b2(d, b + 28); };\n// read zip header\nvar zh = function (d, b, z) {\n var fnl = b2(d, b + 28), fn = strFromU8(d.subarray(b + 46, b + 46 + fnl), !(b2(d, b + 8) & 2048)), es = b + 46 + fnl, bs = b4(d, b + 20);\n var _a = z && bs == 4294967295 ? z64e(d, es) : [bs, b4(d, b + 24), b4(d, b + 42)], sc = _a[0], su = _a[1], off = _a[2];\n return [b2(d, b + 10), sc, su, fn, es + b2(d, b + 30) + b2(d, b + 32), off];\n};\n// read zip64 extra field\nvar z64e = function (d, b) {\n for (; b2(d, b) != 1; b += 4 + b2(d, b + 2))\n ;\n return [b8(d, b + 12), b8(d, b + 4), b8(d, b + 20)];\n};\n// extra field length\nvar exfl = function (ex) {\n var le = 0;\n if (ex) {\n for (var k in ex) {\n var l = ex[k].length;\n if (l > 65535)\n err(9);\n le += l + 4;\n }\n }\n return le;\n};\n// write zip header\nvar wzh = function (d, b, f, fn, u, c, ce, co) {\n var fl = fn.length, ex = f.extra, col = co && co.length;\n var exl = exfl(ex);\n wbytes(d, b, ce != null ? 0x2014B50 : 0x4034B50), b += 4;\n if (ce != null)\n d[b++] = 20, d[b++] = f.os;\n d[b] = 20, b += 2; // spec compliance? what's that?\n d[b++] = (f.flag << 1) | (c == null && 8), d[b++] = u && 8;\n d[b++] = f.compression & 255, d[b++] = f.compression >> 8;\n var dt = new Date(f.mtime == null ? Date.now() : f.mtime), y = dt.getFullYear() - 1980;\n if (y < 0 || y > 119)\n err(10);\n wbytes(d, b, (y << 25) | ((dt.getMonth() + 1) << 21) | (dt.getDate() << 16) | (dt.getHours() << 11) | (dt.getMinutes() << 5) | (dt.getSeconds() >>> 1)), b += 4;\n if (c != null) {\n wbytes(d, b, f.crc);\n wbytes(d, b + 4, c);\n wbytes(d, b + 8, f.size);\n }\n wbytes(d, b + 12, fl);\n wbytes(d, b + 14, exl), b += 16;\n if (ce != null) {\n wbytes(d, b, col);\n wbytes(d, b + 6, f.attrs);\n wbytes(d, b + 10, ce), b += 14;\n }\n d.set(fn, b);\n b += fl;\n if (exl) {\n for (var k in ex) {\n var exf = ex[k], l = exf.length;\n wbytes(d, b, +k);\n wbytes(d, b + 2, l);\n d.set(exf, b + 4), b += 4 + l;\n }\n }\n if (col)\n d.set(co, b), b += col;\n return b;\n};\n// write zip footer (end of central directory)\nvar wzf = function (o, b, c, d, e) {\n wbytes(o, b, 0x6054B50); // skip disk\n wbytes(o, b + 8, c);\n wbytes(o, b + 10, c);\n wbytes(o, b + 12, d);\n wbytes(o, b + 16, e);\n};\n/**\n * A pass-through stream to keep data uncompressed in a ZIP archive.\n */\nvar ZipPassThrough = /*#__PURE__*/ (function () {\n /**\n * Creates a pass-through stream that can be added to ZIP archives\n * @param filename The filename to associate with this data stream\n */\n function ZipPassThrough(filename) {\n this.filename = filename;\n this.c = crc();\n this.size = 0;\n this.compression = 0;\n }\n /**\n * Processes a chunk and pushes to the output stream. You can override this\n * method in a subclass for custom behavior, but by default this passes\n * the data through. You must call this.ondata(err, chunk, final) at some\n * point in this method.\n * @param chunk The chunk to process\n * @param final Whether this is the last chunk\n */\n ZipPassThrough.prototype.process = function (chunk, final) {\n this.ondata(null, chunk, final);\n };\n /**\n * Pushes a chunk to be added. If you are subclassing this with a custom\n * compression algorithm, note that you must push data from the source\n * file only, pre-compression.\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n ZipPassThrough.prototype.push = function (chunk, final) {\n if (!this.ondata)\n err(5);\n this.c.p(chunk);\n this.size += chunk.length;\n if (final)\n this.crc = this.c.d();\n this.process(chunk, final || false);\n };\n return ZipPassThrough;\n}());\nexport { ZipPassThrough };\n// I don't extend because TypeScript extension adds 1kB of runtime bloat\n/**\n * Streaming DEFLATE compression for ZIP archives. Prefer using AsyncZipDeflate\n * for better performance\n */\nvar ZipDeflate = /*#__PURE__*/ (function () {\n /**\n * Creates a DEFLATE stream that can be added to ZIP archives\n * @param filename The filename to associate with this data stream\n * @param opts The compression options\n */\n function ZipDeflate(filename, opts) {\n var _this_1 = this;\n if (!opts)\n opts = {};\n ZipPassThrough.call(this, filename);\n this.d = new Deflate(opts, function (dat, final) {\n _this_1.ondata(null, dat, final);\n });\n this.compression = 8;\n this.flag = dbf(opts.level);\n }\n ZipDeflate.prototype.process = function (chunk, final) {\n try {\n this.d.push(chunk, final);\n }\n catch (e) {\n this.ondata(e, null, final);\n }\n };\n /**\n * Pushes a chunk to be deflated\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n ZipDeflate.prototype.push = function (chunk, final) {\n ZipPassThrough.prototype.push.call(this, chunk, final);\n };\n return ZipDeflate;\n}());\nexport { ZipDeflate };\n/**\n * Asynchronous streaming DEFLATE compression for ZIP archives\n */\nvar AsyncZipDeflate = /*#__PURE__*/ (function () {\n /**\n * Creates a DEFLATE stream that can be added to ZIP archives\n * @param filename The filename to associate with this data stream\n * @param opts The compression options\n */\n function AsyncZipDeflate(filename, opts) {\n var _this_1 = this;\n if (!opts)\n opts = {};\n ZipPassThrough.call(this, filename);\n this.d = new AsyncDeflate(opts, function (err, dat, final) {\n _this_1.ondata(err, dat, final);\n });\n this.compression = 8;\n this.flag = dbf(opts.level);\n this.terminate = this.d.terminate;\n }\n AsyncZipDeflate.prototype.process = function (chunk, final) {\n this.d.push(chunk, final);\n };\n /**\n * Pushes a chunk to be deflated\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n AsyncZipDeflate.prototype.push = function (chunk, final) {\n ZipPassThrough.prototype.push.call(this, chunk, final);\n };\n return AsyncZipDeflate;\n}());\nexport { AsyncZipDeflate };\n// TODO: Better tree shaking\n/**\n * A zippable archive to which files can incrementally be added\n */\nvar Zip = /*#__PURE__*/ (function () {\n /**\n * Creates an empty ZIP archive to which files can be added\n * @param cb The callback to call whenever data for the generated ZIP archive\n * is available\n */\n function Zip(cb) {\n this.ondata = cb;\n this.u = [];\n this.d = 1;\n }\n /**\n * Adds a file to the ZIP archive\n * @param file The file stream to add\n */\n Zip.prototype.add = function (file) {\n var _this_1 = this;\n if (!this.ondata)\n err(5);\n // finishing or finished\n if (this.d & 2)\n this.ondata(err(4 + (this.d & 1) * 8, 0, 1), null, false);\n else {\n var f = strToU8(file.filename), fl_1 = f.length;\n var com = file.comment, o = com && strToU8(com);\n var u = fl_1 != file.filename.length || (o && (com.length != o.length));\n var hl_1 = fl_1 + exfl(file.extra) + 30;\n if (fl_1 > 65535)\n this.ondata(err(11, 0, 1), null, false);\n var header = new u8(hl_1);\n wzh(header, 0, file, f, u);\n var chks_1 = [header];\n var pAll_1 = function () {\n for (var _i = 0, chks_2 = chks_1; _i < chks_2.length; _i++) {\n var chk = chks_2[_i];\n _this_1.ondata(null, chk, false);\n }\n chks_1 = [];\n };\n var tr_1 = this.d;\n this.d = 0;\n var ind_1 = this.u.length;\n var uf_1 = mrg(file, {\n f: f,\n u: u,\n o: o,\n t: function () {\n if (file.terminate)\n file.terminate();\n },\n r: function () {\n pAll_1();\n if (tr_1) {\n var nxt = _this_1.u[ind_1 + 1];\n if (nxt)\n nxt.r();\n else\n _this_1.d = 1;\n }\n tr_1 = 1;\n }\n });\n var cl_1 = 0;\n file.ondata = function (err, dat, final) {\n if (err) {\n _this_1.ondata(err, dat, final);\n _this_1.terminate();\n }\n else {\n cl_1 += dat.length;\n chks_1.push(dat);\n if (final) {\n var dd = new u8(16);\n wbytes(dd, 0, 0x8074B50);\n wbytes(dd, 4, file.crc);\n wbytes(dd, 8, cl_1);\n wbytes(dd, 12, file.size);\n chks_1.push(dd);\n uf_1.c = cl_1, uf_1.b = hl_1 + cl_1 + 16, uf_1.crc = file.crc, uf_1.size = file.size;\n if (tr_1)\n uf_1.r();\n tr_1 = 1;\n }\n else if (tr_1)\n pAll_1();\n }\n };\n this.u.push(uf_1);\n }\n };\n /**\n * Ends the process of adding files and prepares to emit the final chunks.\n * This *must* be called after adding all desired files for the resulting\n * ZIP file to work properly.\n */\n Zip.prototype.end = function () {\n var _this_1 = this;\n if (this.d & 2) {\n this.ondata(err(4 + (this.d & 1) * 8, 0, 1), null, true);\n return;\n }\n if (this.d)\n this.e();\n else\n this.u.push({\n r: function () {\n if (!(_this_1.d & 1))\n return;\n _this_1.u.splice(-1, 1);\n _this_1.e();\n },\n t: function () { }\n });\n this.d = 3;\n };\n Zip.prototype.e = function () {\n var bt = 0, l = 0, tl = 0;\n for (var _i = 0, _a = this.u; _i < _a.length; _i++) {\n var f = _a[_i];\n tl += 46 + f.f.length + exfl(f.extra) + (f.o ? f.o.length : 0);\n }\n var out = new u8(tl + 22);\n for (var _b = 0, _c = this.u; _b < _c.length; _b++) {\n var f = _c[_b];\n wzh(out, bt, f, f.f, f.u, f.c, l, f.o);\n bt += 46 + f.f.length + exfl(f.extra) + (f.o ? f.o.length : 0), l += f.b;\n }\n wzf(out, bt, this.u.length, tl, l);\n this.ondata(null, out, true);\n this.d = 2;\n };\n /**\n * A method to terminate any internal workers used by the stream. Subsequent\n * calls to add() will fail.\n */\n Zip.prototype.terminate = function () {\n for (var _i = 0, _a = this.u; _i < _a.length; _i++) {\n var f = _a[_i];\n f.t();\n }\n this.d = 2;\n };\n return Zip;\n}());\nexport { Zip };\nexport function zip(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n var r = {};\n fltn(data, '', r, opts);\n var k = Object.keys(r);\n var lft = k.length, o = 0, tot = 0;\n var slft = lft, files = new Array(lft);\n var term = [];\n var tAll = function () {\n for (var i = 0; i < term.length; ++i)\n term[i]();\n };\n var cbd = function (a, b) {\n mt(function () { cb(a, b); });\n };\n mt(function () { cbd = cb; });\n var cbf = function () {\n var out = new u8(tot + 22), oe = o, cdl = tot - o;\n tot = 0;\n for (var i = 0; i < slft; ++i) {\n var f = files[i];\n try {\n var l = f.c.length;\n wzh(out, tot, f, f.f, f.u, l);\n var badd = 30 + f.f.length + exfl(f.extra);\n var loc = tot + badd;\n out.set(f.c, loc);\n wzh(out, o, f, f.f, f.u, l, tot, f.m), o += 16 + badd + (f.m ? f.m.length : 0), tot = loc + l;\n }\n catch (e) {\n return cbd(e, null);\n }\n }\n wzf(out, o, files.length, cdl, oe);\n cbd(null, out);\n };\n if (!lft)\n cbf();\n var _loop_1 = function (i) {\n var fn = k[i];\n var _a = r[fn], file = _a[0], p = _a[1];\n var c = crc(), size = file.length;\n c.p(file);\n var f = strToU8(fn), s = f.length;\n var com = p.comment, m = com && strToU8(com), ms = m && m.length;\n var exl = exfl(p.extra);\n var compression = p.level == 0 ? 0 : 8;\n var cbl = function (e, d) {\n if (e) {\n tAll();\n cbd(e, null);\n }\n else {\n var l = d.length;\n files[i] = mrg(p, {\n size: size,\n crc: c.d(),\n c: d,\n f: f,\n m: m,\n u: s != fn.length || (m && (com.length != ms)),\n compression: compression\n });\n o += 30 + s + exl + l;\n tot += 76 + 2 * (s + exl) + (ms || 0) + l;\n if (!--lft)\n cbf();\n }\n };\n if (s > 65535)\n cbl(err(11, 0, 1), null);\n if (!compression)\n cbl(null, file);\n else if (size < 160000) {\n try {\n cbl(null, deflateSync(file, p));\n }\n catch (e) {\n cbl(e, null);\n }\n }\n else\n term.push(deflate(file, p, cbl));\n };\n // Cannot use lft because it can decrease\n for (var i = 0; i < slft; ++i) {\n _loop_1(i);\n }\n return tAll;\n}\n/**\n * Synchronously creates a ZIP file. Prefer using `zip` for better performance\n * with more than one file.\n * @param data The directory structure for the ZIP archive\n * @param opts The main options, merged with per-file options\n * @returns The generated ZIP archive\n */\nexport function zipSync(data, opts) {\n if (!opts)\n opts = {};\n var r = {};\n var files = [];\n fltn(data, '', r, opts);\n var o = 0;\n var tot = 0;\n for (var fn in r) {\n var _a = r[fn], file = _a[0], p = _a[1];\n var compression = p.level == 0 ? 0 : 8;\n var f = strToU8(fn), s = f.length;\n var com = p.comment, m = com && strToU8(com), ms = m && m.length;\n var exl = exfl(p.extra);\n if (s > 65535)\n err(11);\n var d = compression ? deflateSync(file, p) : file, l = d.length;\n var c = crc();\n c.p(file);\n files.push(mrg(p, {\n size: file.length,\n crc: c.d(),\n c: d,\n f: f,\n m: m,\n u: s != fn.length || (m && (com.length != ms)),\n o: o,\n compression: compression\n }));\n o += 30 + s + exl + l;\n tot += 76 + 2 * (s + exl) + (ms || 0) + l;\n }\n var out = new u8(tot + 22), oe = o, cdl = tot - o;\n for (var i = 0; i < files.length; ++i) {\n var f = files[i];\n wzh(out, f.o, f, f.f, f.u, f.c.length);\n var badd = 30 + f.f.length + exfl(f.extra);\n out.set(f.c, f.o + badd);\n wzh(out, o, f, f.f, f.u, f.c.length, f.o, f.m), o += 16 + badd + (f.m ? f.m.length : 0);\n }\n wzf(out, o, files.length, cdl, oe);\n return out;\n}\n/**\n * Streaming pass-through decompression for ZIP archives\n */\nvar UnzipPassThrough = /*#__PURE__*/ (function () {\n function UnzipPassThrough() {\n }\n UnzipPassThrough.prototype.push = function (data, final) {\n this.ondata(null, data, final);\n };\n UnzipPassThrough.compression = 0;\n return UnzipPassThrough;\n}());\nexport { UnzipPassThrough };\n/**\n * Streaming DEFLATE decompression for ZIP archives. Prefer AsyncZipInflate for\n * better performance.\n */\nvar UnzipInflate = /*#__PURE__*/ (function () {\n /**\n * Creates a DEFLATE decompression that can be used in ZIP archives\n */\n function UnzipInflate() {\n var _this_1 = this;\n this.i = new Inflate(function (dat, final) {\n _this_1.ondata(null, dat, final);\n });\n }\n UnzipInflate.prototype.push = function (data, final) {\n try {\n this.i.push(data, final);\n }\n catch (e) {\n this.ondata(e, null, final);\n }\n };\n UnzipInflate.compression = 8;\n return UnzipInflate;\n}());\nexport { UnzipInflate };\n/**\n * Asynchronous streaming DEFLATE decompression for ZIP archives\n */\nvar AsyncUnzipInflate = /*#__PURE__*/ (function () {\n /**\n * Creates a DEFLATE decompression that can be used in ZIP archives\n */\n function AsyncUnzipInflate(_, sz) {\n var _this_1 = this;\n if (sz < 320000) {\n this.i = new Inflate(function (dat, final) {\n _this_1.ondata(null, dat, final);\n });\n }\n else {\n this.i = new AsyncInflate(function (err, dat, final) {\n _this_1.ondata(err, dat, final);\n });\n this.terminate = this.i.terminate;\n }\n }\n AsyncUnzipInflate.prototype.push = function (data, final) {\n if (this.i.terminate)\n data = slc(data, 0);\n this.i.push(data, final);\n };\n AsyncUnzipInflate.compression = 8;\n return AsyncUnzipInflate;\n}());\nexport { AsyncUnzipInflate };\n/**\n * A ZIP archive decompression stream that emits files as they are discovered\n */\nvar Unzip = /*#__PURE__*/ (function () {\n /**\n * Creates a ZIP decompression stream\n * @param cb The callback to call whenever a file in the ZIP archive is found\n */\n function Unzip(cb) {\n this.onfile = cb;\n this.k = [];\n this.o = {\n 0: UnzipPassThrough\n };\n this.p = et;\n }\n /**\n * Pushes a chunk to be unzipped\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Unzip.prototype.push = function (chunk, final) {\n var _this_1 = this;\n if (!this.onfile)\n err(5);\n if (!this.p)\n err(4);\n if (this.c > 0) {\n var len = Math.min(this.c, chunk.length);\n var toAdd = chunk.subarray(0, len);\n this.c -= len;\n if (this.d)\n this.d.push(toAdd, !this.c);\n else\n this.k[0].push(toAdd);\n chunk = chunk.subarray(len);\n if (chunk.length)\n return this.push(chunk, final);\n }\n else {\n var f = 0, i = 0, is = void 0, buf = void 0;\n if (!this.p.length)\n buf = chunk;\n else if (!chunk.length)\n buf = this.p;\n else {\n buf = new u8(this.p.length + chunk.length);\n buf.set(this.p), buf.set(chunk, this.p.length);\n }\n var l = buf.length, oc = this.c, add = oc && this.d;\n var _loop_2 = function () {\n var _a;\n var sig = b4(buf, i);\n if (sig == 0x4034B50) {\n f = 1, is = i;\n this_1.d = null;\n this_1.c = 0;\n var bf = b2(buf, i + 6), cmp_1 = b2(buf, i + 8), u = bf & 2048, dd = bf & 8, fnl = b2(buf, i + 26), es = b2(buf, i + 28);\n if (l > i + 30 + fnl + es) {\n var chks_3 = [];\n this_1.k.unshift(chks_3);\n f = 2;\n var sc_1 = b4(buf, i + 18), su_1 = b4(buf, i + 22);\n var fn_1 = strFromU8(buf.subarray(i + 30, i += 30 + fnl), !u);\n if (sc_1 == 4294967295) {\n _a = dd ? [-2] : z64e(buf, i), sc_1 = _a[0], su_1 = _a[1];\n }\n else if (dd)\n sc_1 = -1;\n i += es;\n this_1.c = sc_1;\n var d_1;\n var file_1 = {\n name: fn_1,\n compression: cmp_1,\n start: function () {\n if (!file_1.ondata)\n err(5);\n if (!sc_1)\n file_1.ondata(null, et, true);\n else {\n var ctr = _this_1.o[cmp_1];\n if (!ctr)\n file_1.ondata(err(14, 'unknown compression type ' + cmp_1, 1), null, false);\n d_1 = sc_1 < 0 ? new ctr(fn_1) : new ctr(fn_1, sc_1, su_1);\n d_1.ondata = function (err, dat, final) { file_1.ondata(err, dat, final); };\n for (var _i = 0, chks_4 = chks_3; _i < chks_4.length; _i++) {\n var dat = chks_4[_i];\n d_1.push(dat, false);\n }\n if (_this_1.k[0] == chks_3 && _this_1.c)\n _this_1.d = d_1;\n else\n d_1.push(et, true);\n }\n },\n terminate: function () {\n if (d_1 && d_1.terminate)\n d_1.terminate();\n }\n };\n if (sc_1 >= 0)\n file_1.size = sc_1, file_1.originalSize = su_1;\n this_1.onfile(file_1);\n }\n return \"break\";\n }\n else if (oc) {\n if (sig == 0x8074B50) {\n is = i += 12 + (oc == -2 && 8), f = 3, this_1.c = 0;\n return \"break\";\n }\n else if (sig == 0x2014B50) {\n is = i -= 4, f = 3, this_1.c = 0;\n return \"break\";\n }\n }\n };\n var this_1 = this;\n for (; i < l - 4; ++i) {\n var state_1 = _loop_2();\n if (state_1 === \"break\")\n break;\n }\n this.p = et;\n if (oc < 0) {\n var dat = f ? buf.subarray(0, is - 12 - (oc == -2 && 8) - (b4(buf, is - 16) == 0x8074B50 && 4)) : buf.subarray(0, i);\n if (add)\n add.push(dat, !!f);\n else\n this.k[+(f == 2)].push(dat);\n }\n if (f & 2)\n return this.push(buf.subarray(i), final);\n this.p = buf.subarray(i);\n }\n if (final) {\n if (this.c)\n err(13);\n this.p = null;\n }\n };\n /**\n * Registers a decoder with the stream, allowing for files compressed with\n * the compression type provided to be expanded correctly\n * @param decoder The decoder constructor\n */\n Unzip.prototype.register = function (decoder) {\n this.o[decoder.compression] = decoder;\n };\n return Unzip;\n}());\nexport { Unzip };\nvar mt = typeof queueMicrotask == 'function' ? queueMicrotask : typeof setTimeout == 'function' ? setTimeout : function (fn) { fn(); };\nexport function unzip(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n var term = [];\n var tAll = function () {\n for (var i = 0; i < term.length; ++i)\n term[i]();\n };\n var files = {};\n var cbd = function (a, b) {\n mt(function () { cb(a, b); });\n };\n mt(function () { cbd = cb; });\n var e = data.length - 22;\n for (; b4(data, e) != 0x6054B50; --e) {\n if (!e || data.length - e > 65558) {\n cbd(err(13, 0, 1), null);\n return tAll;\n }\n }\n ;\n var lft = b2(data, e + 8);\n if (lft) {\n var c = lft;\n var o = b4(data, e + 16);\n var z = o == 4294967295;\n if (z) {\n e = b4(data, e - 12);\n if (b4(data, e) != 0x6064B50) {\n cbd(err(13, 0, 1), null);\n return tAll;\n }\n c = lft = b4(data, e + 32);\n o = b4(data, e + 48);\n }\n var fltr = opts && opts.filter;\n var _loop_3 = function (i) {\n var _a = zh(data, o, z), c_1 = _a[0], sc = _a[1], su = _a[2], fn = _a[3], no = _a[4], off = _a[5], b = slzh(data, off);\n o = no;\n var cbl = function (e, d) {\n if (e) {\n tAll();\n cbd(e, null);\n }\n else {\n if (d)\n files[fn] = d;\n if (!--lft)\n cbd(null, files);\n }\n };\n if (!fltr || fltr({\n name: fn,\n size: sc,\n originalSize: su,\n compression: c_1\n })) {\n if (!c_1)\n cbl(null, slc(data, b, b + sc));\n else if (c_1 == 8) {\n var infl = data.subarray(b, b + sc);\n if (sc < 320000) {\n try {\n cbl(null, inflateSync(infl, new u8(su)));\n }\n catch (e) {\n cbl(e, null);\n }\n }\n else\n term.push(inflate(infl, { size: su }, cbl));\n }\n else\n cbl(err(14, 'unknown compression type ' + c_1, 1), null);\n }\n else\n cbl(null, null);\n };\n for (var i = 0; i < c; ++i) {\n _loop_3(i);\n }\n }\n else\n cbd(null, {});\n return tAll;\n}\n/**\n * Synchronously decompresses a ZIP archive. Prefer using `unzip` for better\n * performance with more than one file.\n * @param data The raw compressed ZIP file\n * @param opts The ZIP extraction options\n * @returns The decompressed files\n */\nexport function unzipSync(data, opts) {\n var files = {};\n var e = data.length - 22;\n for (; b4(data, e) != 0x6054B50; --e) {\n if (!e || data.length - e > 65558)\n err(13);\n }\n ;\n var c = b2(data, e + 8);\n if (!c)\n return {};\n var o = b4(data, e + 16);\n var z = o == 4294967295;\n if (z) {\n e = b4(data, e - 12);\n if (b4(data, e) != 0x6064B50)\n err(13);\n c = b4(data, e + 32);\n o = b4(data, e + 48);\n }\n var fltr = opts && opts.filter;\n for (var i = 0; i < c; ++i) {\n var _a = zh(data, o, z), c_2 = _a[0], sc = _a[1], su = _a[2], fn = _a[3], no = _a[4], off = _a[5], b = slzh(data, off);\n o = no;\n if (!fltr || fltr({\n name: fn,\n size: sc,\n originalSize: su,\n compression: c_2\n })) {\n if (!c_2)\n files[fn] = slc(data, b, b + sc);\n else if (c_2 == 8)\n files[fn] = inflateSync(data.subarray(b, b + sc), new u8(su));\n else\n err(14, 'unknown compression type ' + c_2);\n }\n }\n return files;\n}\n","/** Get time in milliseconds between a start time (t0) and now */\r\nfunction timeDiff(t0) {\r\n return Math.round(performance.now() - t0);\r\n}\r\n\r\n/** Initialize performance analysis settings */\r\nfunction initAnalyzeRelatedGenes(ideo) {\r\n ideo.time = {\r\n rg: { // times for related genes\r\n t0: performance.now()\r\n }\r\n };\r\n if ('_didRelatedGenesFirstPlot' in ideo) {\r\n delete ideo._didRelatedGenesFirstPlot;\r\n }\r\n}\r\n\r\nfunction getRelatedGenesByType() {\r\n const ideo = this;\r\n const relatedGenes = ideo.annotDescriptions.annots;\r\n\r\n const related = Object.values(relatedGenes).slice();\r\n\r\n const paralogous = related.filter(r => {\r\n return r.type && r.type.includes('paralogous');\r\n });\r\n const interacting = related.filter(r => {\r\n return r.type && r.type.includes('interacting gene');\r\n });\r\n const searched = Object.entries(relatedGenes).filter(entry => {\r\n return entry[1].type && entry[1].type.includes('searched gene');\r\n })[0][0];\r\n\r\n return {related, paralogous, interacting, searched};\r\n}\r\n\r\nfunction getRelatedGenesTooltipAnalytics(annot) {\r\n const ideo = this;\r\n\r\n const timeSincePrevTooltip = performance.now() - ideo.time.prevTooltipOff;\r\n const prevAnnotDomId = ideo.time.prevTooltipAnnotDomId;\r\n\r\n if (timeSincePrevTooltip < 300 && annot.domId === prevAnnotDomId) {\r\n return null;\r\n }\r\n\r\n const tooltipGene = annot.name;\r\n\r\n // e.g. \"interacting gene\" -> \"interacting\"\r\n const tooltipRelatedType =\r\n ideo.annotDescriptions.annots[annot.name].type.split(' ')[0];\r\n\r\n const countsByType = getCountsByType(ideo);\r\n\r\n const analytics = Object.assign(\r\n {tooltipGene, tooltipRelatedType}, countsByType\r\n );\r\n\r\n return analytics;\r\n}\r\n\r\n/** Compute granular related genes plotting analytics */\r\nfunction analyzePlotTimes(type, ideo) {\r\n // Paralogs and interacting genes:\r\n // http://localhost:8080/examples/vanilla/related-genes?q=RAD51\r\n //\r\n // No paralogs:\r\n // http://localhost:8080/examples/vanilla/related-genes?q=BRCA1&org=mus-musculus\r\n //\r\n // No interacting genes:\r\n // http://localhost:8080/examples/vanilla/related-genes?q=DMC1\r\n //\r\n // No paralogs, no interacting genes:\r\n // http://localhost:8080/examples/vanilla/related-genes?q=BRCA1&org=macaca-mulatta\r\n\r\n if (type === 'pathway') {\r\n return;\r\n }\r\n const otherTypes = {\r\n paralogous: 'interacting',\r\n interacting: 'paralogous'\r\n };\r\n const related = ideo.getRelatedGenesByType();\r\n const otherType = otherTypes[type];\r\n const numThisRelated = related[type].length;\r\n const numOtherRelated = related[otherType] ? related[otherType].length : 0;\r\n\r\n if (!ideo._didRelatedGenesFirstPlot) {\r\n // 1st of 2 attempted plot logs\r\n ideo._didRelatedGenesFirstPlot = true;\r\n\r\n ideo.time.rg.totalFirstPlot = timeDiff(ideo.time.rg.t0);\r\n\r\n if (numThisRelated > 0) {\r\n ideo.time.rg.timestampFirstPlot = performance.now();\r\n ideo._relatedGenesFirstPlotType = type;\r\n }\r\n } else {\r\n // 2nd of 2 attempted plot logs\r\n if (numThisRelated > 0 && numOtherRelated > 0) {\r\n // Paralogs and interacting genes were found, e.g. human RAD51\r\n const timestampFirstPlot = ideo.time.rg.timestampFirstPlot;\r\n ideo.time.rg.totalLastPlotDiff = timeDiff(timestampFirstPlot);\r\n } else if (numThisRelated > 0 && numOtherRelated === 0) {\r\n // Other attempt did not plot, and this did, so log this as 1st\r\n // Often seen when no interacting genes found, e.g. human DMC1\r\n ideo.time.rg.timestampFirstPlot = performance.now();\r\n ideo.time.rg.totalFirstPlot = timeDiff(ideo.time.rg.t0);\r\n ideo._relatedGenesFirstPlotType = type;\r\n ideo.time.rg.totalLastPlotDiff = 0;\r\n\r\n } else if (numThisRelated === 0 && numOtherRelated > 0) {\r\n // This attempt did not plot, the other did, so log 1st plot as also last\r\n // Often seen when no paralogs found, e.g. mouse BRCA1\r\n ideo.time.rg.totalLastPlotDiff = 0;\r\n } else {\r\n // No related genes found, so note only the searched gene is plotted\r\n // Example: Macaca mulatta BRCA1\r\n ideo._relatedGenesFirstPlotType = 'searched';\r\n ideo.time.rg.totalLastPlotDiff = 0;\r\n }\r\n }\r\n}\r\n\r\nfunction getCountsByType(ideo) {\r\n const related = ideo.getRelatedGenesByType();\r\n\r\n const numRelatedGenes = related['related'].length;\r\n const numParalogs = related['paralogous'].length;\r\n const numInteractingGenes = related['interacting'].length;\r\n const searchedGene = related['searched'];\r\n\r\n return {\r\n numRelatedGenes, numParalogs, numInteractingGenes, searchedGene\r\n };\r\n}\r\n\r\n/** Summarizes number and kind of related genes, performance, etc. */\r\nfunction analyzeRelatedGenes(ideo) {\r\n\r\n const countsByType = getCountsByType(ideo);\r\n\r\n const timeTotal = ideo.time.rg.total;\r\n const timeTotalFirstPlot = ideo.time.rg.totalFirstPlot;\r\n const timeTotalLastPlotDiff = ideo.time.rg.totalLastPlotDiff;\r\n const timeParalogs = ideo.time.rg.paralogs;\r\n const timeInteractingGenes = ideo.time.rg.interactions;\r\n const timeSearchedGene = ideo.time.rg.searchedGene;\r\n const firstPlotType = ideo._relatedGenesFirstPlotType;\r\n\r\n const analytics = Object.assign({\r\n firstPlotType,\r\n timeTotal, timeTotalFirstPlot, timeTotalLastPlotDiff,\r\n timeSearchedGene, timeInteractingGenes, timeParalogs\r\n }, countsByType);\r\n\r\n ideo.relatedGenesAnalytics = analytics;\r\n}\r\n\r\nexport {\r\n initAnalyzeRelatedGenes, analyzePlotTimes, analyzeRelatedGenes, timeDiff,\r\n getRelatedGenesByType, getRelatedGenesTooltipAnalytics\r\n};\r\n","/**\r\n * @fileoverview Fetch cached gene data: name, position, etc.\r\n *\r\n * Gene cache eliminates needing to fetch names and positions of genes from\r\n * third-party APIs at runtime. It achieves this by fetching a static file\r\n * containing gene data upon initializing Ideogram.\r\n *\r\n * Use cases:\r\n *\r\n * - test if a given string is a gene name, e.g. for gene search\r\n * - find genomic position of a given gene (or all genes)\r\n */\r\nimport {decompressSync, strFromU8} from 'fflate';\r\n\r\nimport {slug, getEarlyTaxid, getDir} from './lib';\r\nimport {organismMetadata} from './init/organism-metadata';\r\nimport version from './version';\r\n\r\nlet perfTimes;\r\n\r\n/** Get URL for gene cache file */\r\nfunction getCacheUrl(orgName, cacheDir) {\r\n const organism = slug(orgName);\r\n if (!cacheDir) {\r\n cacheDir = getDir('cache/');\r\n }\r\n\r\n const cacheUrl = cacheDir + organism + '-genes.tsv.gz';\r\n\r\n return cacheUrl;\r\n}\r\n\r\n/**\r\n * Convert pre-annotation arrays to annotation objects\r\n * sorted by genomic position.\r\n */\r\nfunction parseAnnots(preAnnots) {\r\n const chromosomes = {};\r\n\r\n for (let i = 0; i < preAnnots.length; i++) {\r\n const [chromosome, start, stop, ensemblId, gene] = preAnnots[i];\r\n\r\n if (!(chromosome in chromosomes)) {\r\n chromosomes[chromosome] = {chr: chromosome, annots: []};\r\n } else {\r\n const annot = {name: gene, start, stop, ensemblId};\r\n chromosomes[chromosome].annots.push(annot);\r\n }\r\n }\r\n\r\n const annotsSortedByPosition = {};\r\n\r\n Object.entries(chromosomes).forEach(([chr, annotsByChr]) => {\r\n annotsSortedByPosition[chr] = {\r\n chr,\r\n annots: annotsByChr.annots.sort((a, b) => a.start - b.start)\r\n };\r\n });\r\n\r\n return annotsSortedByPosition;\r\n}\r\n\r\n/**\r\n * Build full Ensembl ID from prefix (e.g. ENSG) and slim ID (e.g. 223972)\r\n *\r\n * Example output ID: ENSG00000223972\r\n * */\r\nexport function getEnsemblId(ensemblPrefix, slimEnsemblId) {\r\n\r\n // C. elegans (prefix: WBGene) has special IDs, e.g. WBGene00197333\r\n const padLength = ensemblPrefix === 'WBGene' ? 8 : 11;\r\n\r\n // Zero-pad the slim ID, e.g. 223972 -> 00000223972\r\n const zeroPaddedId = slimEnsemblId.padStart(padLength, '0');\r\n\r\n return ensemblPrefix + zeroPaddedId;\r\n}\r\n\r\n/** Parse a gene cache TSV file, return array of useful transforms */\r\nfunction parseCache(rawTsv, orgName) {\r\n const names = [];\r\n const nameCaseMap = {};\r\n const namesById = {};\r\n const fullNamesById = {};\r\n const idsByName = {};\r\n const idsByFullName = {};\r\n const lociByName = {};\r\n const lociById = {};\r\n const preAnnots = [];\r\n let ensemblPrefix;\r\n\r\n let t0 = performance.now();\r\n const lines = rawTsv.split(/\\r\\n|\\n/);\r\n perfTimes.rawTsvSplit = Math.round(performance.now() - t0);\r\n\r\n t0 = performance.now();\r\n for (let i = 0; i < lines.length; i++) {\r\n const line = lines[i];\r\n if (line === '') continue; // Skip empty lines\r\n if (line[0] === '#') {\r\n if (line.slice(0, 9) === '## prefix') {\r\n ensemblPrefix = line.split('prefix: ')[1];\r\n }\r\n continue;\r\n }\r\n const [\r\n chromosome, rawStart, rawLength, slimEnsemblId, gene, rawFullName\r\n ] = line.trim().split(/\\t/);\r\n const fullName = decodeURIComponent(rawFullName);\r\n const start = parseInt(rawStart);\r\n const stop = start + parseInt(rawLength);\r\n const ensemblId = getEnsemblId(ensemblPrefix, slimEnsemblId);\r\n preAnnots.push([chromosome, start, stop, ensemblId, gene, fullName]);\r\n const locus = [chromosome, start, stop];\r\n\r\n names.push(gene);\r\n nameCaseMap[gene.toLowerCase()] = gene;\r\n namesById[ensemblId] = gene;\r\n fullNamesById[ensemblId] = fullName;\r\n idsByName[gene] = ensemblId;\r\n idsByFullName[fullName] = ensemblId;\r\n lociByName[gene] = locus;\r\n lociById[ensemblId] = locus;\r\n };\r\n const t1 = performance.now();\r\n perfTimes.parseCacheLoop = Math.round(t1 - t0);\r\n\r\n const sortedAnnots = parseAnnots(preAnnots);\r\n perfTimes.parseAnnots = Math.round(performance.now() - t1);\r\n\r\n return [\r\n names, nameCaseMap, namesById, fullNamesById,\r\n idsByName, idsByFullName, lociByName, lociById,\r\n sortedAnnots\r\n ];\r\n}\r\n\r\n/** Get organism's metadata fields */\r\nfunction parseOrgMetadata(orgName) {\r\n const taxid = getEarlyTaxid(orgName);\r\n return organismMetadata[taxid] || {};\r\n}\r\n\r\n/** Reports if current organism has a gene cache */\r\nfunction hasGeneCache(orgName) {\r\n const metadata = parseOrgMetadata(orgName);\r\n return (metadata.hasGeneCache && metadata.hasGeneCache === true);\r\n}\r\n\r\nexport async function cacheFetch(url) {\r\n\r\n const decompressedUrl = url.replace('.gz', '');\r\n const response = await Ideogram.cache.match(decompressedUrl);\r\n if (typeof response === 'undefined') {\r\n // If cache miss, then fetch and add response to cache\r\n // await Ideogram.cache.add(url);\r\n const rawResponse = await fetch(url);\r\n const blob = await rawResponse.blob();\r\n const uint8Array = new Uint8Array(await blob.arrayBuffer());\r\n const data = strFromU8(decompressSync(uint8Array));\r\n const decompressedResponse = new Response(\r\n new Blob([data], {type: 'text/tab-separated-values'}),\r\n rawResponse.init\r\n );\r\n await Ideogram.cache.put(decompressedUrl, decompressedResponse);\r\n return await Ideogram.cache.match(decompressedUrl);\r\n }\r\n return await Ideogram.cache.match(decompressedUrl);\r\n}\r\n\r\n/**\r\n * Fetch cached gene data, transform it usefully, and set it as ideo prop\r\n */\r\nexport default async function initGeneCache(orgName, ideo, cacheDir=null) {\r\n\r\n const startTime = performance.now();\r\n perfTimes = {};\r\n\r\n // Skip initialization if files needed to make cache don't exist\r\n if (!hasGeneCache(orgName)) return;\r\n\r\n // Skip initialization if cache is already populated\r\n if (Ideogram.geneCache && Ideogram.geneCache[orgName]) {\r\n // Simplify chief use case, i.e. for single organism\r\n ideo.geneCache = Ideogram.geneCache[orgName];\r\n return;\r\n }\r\n\r\n if (!Ideogram.geneCache) {\r\n Ideogram.geneCache = {};\r\n }\r\n\r\n Ideogram.cache = await caches.open(`ideogram-${version}`);\r\n\r\n const cacheUrl = getCacheUrl(orgName, cacheDir, ideo);\r\n\r\n const fetchStartTime = performance.now();\r\n const response = await cacheFetch(cacheUrl);\r\n\r\n const data = await response.text();\r\n const fetchEndTime = performance.now();\r\n perfTimes.fetch = Math.round(fetchEndTime - fetchStartTime);\r\n\r\n const [\r\n interestingNames, nameCaseMap, namesById, fullNamesById,\r\n idsByName, idsByFullName, lociByName, lociById, sortedAnnots\r\n ] = parseCache(data, orgName);\r\n perfTimes.parseCache = Math.round(performance.now() - fetchEndTime);\r\n\r\n ideo.geneCache = {\r\n interestingNames, // Array ordered by general or scholarly interest\r\n nameCaseMap, // Maps of lowercase gene names to proper gene names\r\n namesById,\r\n fullNamesById,\r\n idsByName,\r\n idsByFullName,\r\n lociByName, // Object of gene positions, keyed by gene name\r\n lociById,\r\n sortedAnnots // Ideogram annotations sorted by genomic position\r\n };\r\n Ideogram.geneCache[orgName] = ideo.geneCache;\r\n\r\n if (ideo.config.debug) {\r\n perfTimes.total = Math.round(performance.now() - startTime);\r\n console.log('perfTimes in initGeneCache:', perfTimes);\r\n }\r\n}\r\n","/**\r\n * @fileoverview Fetch cached paralogs: Ensembl IDs of <= 20 paralogs per genes\r\n *\r\n * Paralog cache eliminates needing to fetch IDs of paralogs for a given gene\r\n * from third-party APIs at runtime. It achieves this by fetching a static\r\n * file containing gene data upon initializing Ideogram.\r\n */\r\n\r\nimport {cacheFetch} from './gene-cache';\r\nimport {slug, getEarlyTaxid, getDir} from './lib';\r\nimport {organismMetadata} from './init/organism-metadata';\r\nimport version from './version';\r\n\r\nlet perfTimes;\r\n\r\n/** Get URL for gene cache file */\r\nfunction getCacheUrl(orgName, cacheDir) {\r\n const organism = slug(orgName);\r\n if (!cacheDir) {\r\n cacheDir = getDir('cache/paralogs/');\r\n } else {\r\n cacheDir += 'paralogs/';\r\n }\r\n\r\n const cacheUrl = cacheDir + organism + '-paralogs.tsv.gz';\r\n\r\n return cacheUrl;\r\n}\r\n\r\n/**\r\n * Build full Ensembl ID from prefix (e.g. ENSG) and slim ID (e.g. 223972)\r\n *\r\n * Example output ID: ENSG00000223972\r\n * */\r\nfunction getEnsemblId(ensemblPrefix, slimEnsemblId) {\r\n\r\n // C. elegans (prefix: WBGene) has special IDs, e.g. WBGene00197333\r\n const padLength = ensemblPrefix === 'WBGene' ? 8 : 11;\r\n\r\n // Zero-pad the slim ID, e.g. 223972 -> 00000223972\r\n const zeroPaddedId = slimEnsemblId.padStart(padLength, '0');\r\n\r\n return ensemblPrefix + zeroPaddedId;\r\n}\r\n\r\n/** Parse a gene cache TSV file, return array of useful transforms */\r\nfunction parseCache(rawTsv) {\r\n const nameCaseMap = {};\r\n const paralogsByName = {};\r\n let ensemblPrefix;\r\n\r\n let t0 = performance.now();\r\n const lines = rawTsv.split(/\\r\\n|\\n/);\r\n perfTimes.rawTsvSplit = Math.round(performance.now() - t0);\r\n\r\n t0 = performance.now();\r\n for (let i = 0; i < lines.length; i++) {\r\n const line = lines[i];\r\n if (line === '') continue; // Skip empty lines\r\n if (line[0] === '#') {\r\n if (line.slice(0, 9) === '## prefix') {\r\n ensemblPrefix = line.split('prefix: ')[1];\r\n }\r\n continue;\r\n }\r\n const columns = line.trim().split(/\\t/);\r\n const gene = columns[0];\r\n const geneSlimId = columns[1];\r\n\r\n const paralogs = [];\r\n if (columns[2][0] === '_') {\r\n const pointer = columns[2].slice(1).toUpperCase();\r\n const paralogSuperList = paralogsByName[pointer];\r\n const geneId = getEnsemblId(ensemblPrefix, geneSlimId);\r\n for (let j = 0; j < paralogSuperList.length; j++) {\r\n const id = paralogSuperList[j];\r\n if (id !== geneId) {\r\n paralogs.push(id);\r\n }\r\n }\r\n paralogs.unshift(getEnsemblId(ensemblPrefix, columns[3]));\r\n } else {\r\n const slimEnsemblIds = columns.slice(2);\r\n for (let i = 0; i < slimEnsemblIds.length; i++) {\r\n const slimId = slimEnsemblIds[i];\r\n if (slimId !== geneSlimId) {\r\n paralogs.push(getEnsemblId(ensemblPrefix, slimId));\r\n }\r\n }\r\n }\r\n\r\n paralogsByName[gene.toUpperCase()] = paralogs;\r\n };\r\n const t1 = performance.now();\r\n perfTimes.parseCacheLoop = Math.round(t1 - t0);\r\n\r\n return paralogsByName;\r\n}\r\n\r\n/** Get organism's metadata fields */\r\nfunction parseOrgMetadata(orgName) {\r\n const taxid = getEarlyTaxid(orgName);\r\n return organismMetadata[taxid] || {};\r\n}\r\n\r\n/** Reports if current organism has a gene cache */\r\nexport function hasParalogCache(orgName) {\r\n const metadata = parseOrgMetadata(orgName);\r\n return (metadata.hasParalogCache && metadata.hasParalogCache === true);\r\n}\r\n\r\n/**\r\n * Fetch cached paralog data, transform it usefully, and set it as ideo prop\r\n */\r\nexport default async function initParalogCache(orgName, ideo, cacheDir=null) {\r\n\r\n const startTime = performance.now();\r\n perfTimes = {};\r\n\r\n // Skip initialization if files needed to make cache don't exist\r\n if (!hasParalogCache(orgName)) return;\r\n\r\n\r\n // Skip initialization if cache is already populated\r\n if (Ideogram.paralogCache && Ideogram.paralogCache[orgName]) {\r\n // Simplify chief use case, i.e. for single organism\r\n ideo.paralogCache = Ideogram.paralogCache[orgName];\r\n return;\r\n }\r\n\r\n if (!Ideogram.paralogCache) {\r\n Ideogram.paralogCache = {};\r\n }\r\n\r\n Ideogram.cache = await caches.open(`ideogram-${version}`);\r\n\r\n const cacheUrl = getCacheUrl(orgName, cacheDir, ideo);\r\n\r\n const fetchStartTime = performance.now();\r\n const response = await cacheFetch(cacheUrl);\r\n const data = await response.text();\r\n const fetchEndTime = performance.now();\r\n perfTimes.fetch = Math.round(fetchEndTime - fetchStartTime);\r\n\r\n const paralogsByName = parseCache(data, orgName);\r\n perfTimes.parseCache = Math.round(performance.now() - fetchEndTime);\r\n\r\n ideo.paralogCache = {\r\n paralogsByName // Array of paralog Ensembl IDs by (uppercase) gene name\r\n };\r\n Ideogram.paralogCache[orgName] = ideo.paralogCache;\r\n\r\n if (ideo.config.debug) {\r\n perfTimes.total = Math.round(performance.now() - startTime);\r\n console.log('perfTimes in initParalogCache:', perfTimes);\r\n }\r\n}\r\n\r\n\r\n// idsMissingLocations = []\r\n// // ideogram.geneCache.interestingNames.slice(0, 50).forEach(iGene => {\r\n// seekGene = 'CDK1'\r\n// // seekGene = iGene;\r\n// // pIndex = 12600\r\n// console.log(seekGene)\r\n// let pgenes = Object.entries(ideogram.paralogCache.paralogsByName).map(([k, v]) => [k, v]).sort((a, b) => b[1].length - a[1].length)\r\n// pgenes = pgenes.filter(pg => pg[0].slice(0, 3) !== 'RNU');\r\n// pgenenames = pgenes.map(pg => pg[0])\r\n// pIndex = pgenenames.indexOf(seekGene)\r\n// // if (pIndex === -1) return;\r\n// pids = pgenes[pIndex][1];\r\n// pnames = pids.map(id => ideogram.geneCache.namesById[id]);\r\n// console.log('pids', pids)\r\n// const indicesMissingLocations = []\r\n// plocs = pids.filter((id, i) => {\r\n// const hasLoc = id in ideogram.geneCache.lociById\r\n// if (!hasLoc) {\r\n// idsMissingLocations.push(id)\r\n// indicesMissingLocations.push(i)\r\n// }\r\n// return hasLoc\r\n// }).map(id => ideogram.geneCache.lociById[id].join(':'));\r\n// pnl = pnames.filter((_, i) => i in indicesMissingLocations === false).map((n, i) => n + ': ' + plocs[i]);\r\n// gene = pgenenames[pIndex]\r\n// // console.log('pnl before')\r\n// // console.log(pnl)\r\n// pnl.sort((a, b) => {\r\n// const [aChr, aStart] = a.split(':').slice(1).map(p => p.trim())\r\n// const [bChr, bStart] = b.split(':').slice(1).map(p => p.trim())\r\n// chrSort = Ideogram.sortChromosomes(aChr, bChr)\r\n// // console.log(aChr, bChr, chrSort)\r\n// if (chrSort !== 0) return chrSort\r\n// return aStart.localeCompare(bStart, 'en', {numeric: true});\r\n// })\r\n// console.log(seekGene, pnl.length)\r\n// console.log('numParalogs: ' + pgenes.length)\r\n// ideogram.plotRelatedGenes(gene)\r\n// console.log(pnl)\r\n// // })\r\n","/**\r\n * @fileoverview Fetch cached interactions from WikiPathways\r\n *\r\n * Interactions cache eliminates needing to fetch interactions for a given gene\r\n * from third-party APIs at runtime. It achieves this by fetching a static\r\n * file containing gene data upon initializing Ideogram.\r\n */\r\n\r\nimport {cacheFetch} from './gene-cache';\r\nimport {slug, getEarlyTaxid, getDir} from './lib';\r\nimport {organismMetadata} from './init/organism-metadata';\r\nimport version from './version';\r\n\r\nlet perfTimes;\r\n\r\n/** Get URL for gene cache file */\r\nfunction getCacheUrl(orgName, cacheDir) {\r\n const organism = slug(orgName);\r\n if (!cacheDir) {\r\n cacheDir = getDir('cache/');\r\n }\r\n cacheDir += 'interactions/';\r\n const cacheUrl = cacheDir + organism + '-interactions.json.gz';\r\n\r\n return cacheUrl;\r\n}\r\n\r\n/**\r\n * Build full Ensembl ID from prefix (e.g. ENSG) and slim ID (e.g. 223972)\r\n *\r\n * Example output ID: ENSG00000223972\r\n * */\r\nfunction getEnsemblId(ensemblPrefix, slimEnsemblId) {\r\n\r\n // C. elegans (prefix: WBGene) has special IDs, e.g. WBGene00197333\r\n const padLength = ensemblPrefix === 'WBGene' ? 8 : 11;\r\n\r\n // Zero-pad the slim ID, e.g. 223972 -> 00000223972\r\n const zeroPaddedId = slimEnsemblId.padStart(padLength, '0');\r\n\r\n return ensemblPrefix + zeroPaddedId;\r\n}\r\n\r\n/** Parse a gene cache TSV file, return array of useful transforms */\r\nfunction parseCache(rawJson, organism) {\r\n let t0 = performance.now();\r\n const interactionsByName = {};\r\n const tmp = organism.replace('-', ' ');\r\n const desluggedOrg = tmp[0].toUpperCase() + tmp.slice(1);\r\n\r\n t0 = performance.now();\r\n for (const gene in rawJson['interactions']) {\r\n const ixnLists = rawJson['interactions'][gene];\r\n interactionsByName[gene] = {result: []};\r\n for (let i = 0; i < ixnLists.length; i++) {\r\n const compressedIxn = ixnLists[i];\r\n const slimPwId = compressedIxn[0];\r\n interactionsByName[gene].result.push({\r\n fields: {\r\n left: {values: compressedIxn[1]},\r\n right: {values: compressedIxn[2]}\r\n },\r\n id: 'WP' + slimPwId,\r\n name: rawJson['pathwayNamesById'][slimPwId],\r\n species: desluggedOrg\r\n });\r\n }\r\n }\r\n const t1 = performance.now();\r\n perfTimes.parseCacheLoop = Math.round(t1 - t0);\r\n\r\n return interactionsByName;\r\n}\r\n\r\n/** Get organism's metadata fields */\r\nfunction parseOrgMetadata(orgName) {\r\n const taxid = getEarlyTaxid(orgName);\r\n return organismMetadata[taxid] || {};\r\n}\r\n\r\n/** Reports if current organism has a gene cache */\r\nexport function hasinteractionCache(orgName) {\r\n const metadata = parseOrgMetadata(orgName);\r\n return (\r\n metadata.hasInteractionCache && metadata.hasInteractionCache === true\r\n );\r\n}\r\n\r\n/**\r\n * Fetch cached paralog data, transform it usefully, and set it as ideo prop\r\n */\r\nexport default async function initInteractionCache(\r\n orgName, ideo, cacheDir=null\r\n) {\r\n\r\n const startTime = performance.now();\r\n perfTimes = {};\r\n\r\n // Skip initialization if files needed to make cache don't exist\r\n if (!hasinteractionCache(orgName)) return;\r\n\r\n // Skip initialization if cache is already populated\r\n if (Ideogram.interactionCache && Ideogram.interactionCache[orgName]) {\r\n // Simplify chief use case, i.e. for single organism\r\n ideo.interactionCache = Ideogram.interactionCache[orgName];\r\n return;\r\n }\r\n\r\n if (!Ideogram.interactionCache) {\r\n Ideogram.interactionCache = {};\r\n }\r\n\r\n Ideogram.cache = await caches.open(`ideogram-${version}`);\r\n\r\n const cacheUrl = getCacheUrl(orgName, cacheDir, ideo);\r\n\r\n const fetchStartTime = performance.now();\r\n const response = await cacheFetch(cacheUrl);\r\n const data = await response.json();\r\n const fetchEndTime = performance.now();\r\n perfTimes.fetch = Math.round(fetchEndTime - fetchStartTime);\r\n\r\n const interactionsByName = parseCache(data, orgName);\r\n perfTimes.parseCache = Math.round(performance.now() - fetchEndTime);\r\n\r\n ideo.interactionCache = interactionsByName;\r\n Ideogram.interactionCache[orgName] = ideo.interactionCache;\r\n\r\n if (ideo.config.debug) {\r\n perfTimes.total = Math.round(performance.now() - startTime);\r\n console.log('perfTimes in initInteractionCache:', perfTimes);\r\n }\r\n}\r\n","import {decompressSync, strFromU8} from 'fflate';\r\nimport { sortAnnotsByRank } from '../annotations/annotations';\r\n\r\n// Definitions for ArrowHead values in WikiPathways GPML\r\n//\r\n// See also: https://discover.nci.nih.gov/mim/formal_mim_spec.pdf\r\nconst interactionArrowMap = {\r\n 'Arrow': ['acts on', 'acted on by'],\r\n 'TBar': ['inhibits', 'inhibited by'],\r\n 'mim-binding': ['binds', 'binds'],\r\n 'mim-catalysis': ['catalyzes', 'catalyzed by'],\r\n 'mim-cleavage': ['cleaves', 'cleaved by'],\r\n 'mim-conversion': ['converts', 'converted by'],\r\n // 'mim-covalent-bond': ['covalently binds',\r\n // 'mim-gap': 'MimGap',\r\n 'mim-inhibition': ['inhibits', 'inhibited by'],\r\n 'mim-modification': ['modifies', 'modified by'],\r\n 'mim-necessary-stimulation':\r\n ['necessarily stimulates', 'necessarily stimulated by'],\r\n 'mim-stimulation': ['stimulates', 'stimulated by'],\r\n 'mim-transcription-translation':\r\n ['transcribes / translates', 'transcribed / translated by']\r\n};\r\n\r\n// Which interactions types to show first, if showing multiple\r\nconst rankedInteractionTypes = [\r\n 'transcribe',\r\n 'cleave',\r\n 'convert',\r\n 'bind',\r\n 'modifie',\r\n 'catalyze',\r\n 'necessarily stimulate',\r\n 'inhibit',\r\n 'stimulate',\r\n 'act'\r\n];\r\n\r\nexport function sortInteractionTypes(a, b) {\r\n const ranks = {};\r\n for (let i = 0; i < rankedInteractionTypes.length; i++) {\r\n const rankedIxnType = rankedInteractionTypes[i];\r\n if (rankedIxnType.includes(a)) ranks.a = i;\r\n if (rankedIxnType.includes(b)) ranks.b = i;\r\n }\r\n return ranks.b - ranks.a;\r\n}\r\n\r\n/** Determine if all given interactions in *one* pathway are same */\r\nfunction determineIxnsInPathwayAreSame(ixns, ixnTypeReference) {\r\n let isRefMatch = true;\r\n let thisIsSame = true;\r\n\r\n if (ixns.length === 0) return {isRefMatch, thisIsSame};\r\n\r\n const thisIxnTypeReference = ixns[0].ixnType.toLowerCase();\r\n ixns.forEach(ixn => {\r\n const ixnType = ixn.ixnType.toLowerCase();\r\n if (ixnType !== ixnTypeReference) {\r\n isRefMatch = false;\r\n }\r\n if (ixnType !== thisIxnTypeReference) {\r\n thisIsSame = false;\r\n }\r\n });\r\n return {isRefMatch, thisIsSame};\r\n}\r\n\r\n/**\r\n * Return first valid interaction type from interactions-by-pathway object\r\n */\r\nfunction getIxnTypeReference(ixnsByPwid) {\r\n const ixnTypeReference = Object.values(ixnsByPwid).find(ixns => {\r\n return ixns.length > 0 && 'ixnType' in ixns[0];\r\n })[0].ixnType.toLowerCase();\r\n\r\n return ixnTypeReference;\r\n}\r\n\r\n/**\r\n * Determine whether all given interactions in all given pathways are the same\r\n */\r\nfunction setIsSame(enrichedIxns) {\r\n let isSame = true;\r\n const ixnsByPwid = enrichedIxns.ixnsByPwid;\r\n\r\n const ixnTypeReference = getIxnTypeReference(ixnsByPwid);\r\n\r\n Object.entries(ixnsByPwid).map(([pwid, ixns]) => {\r\n const {isRefMatch, thisIsSame} =\r\n determineIxnsInPathwayAreSame(ixns, ixnTypeReference);\r\n if (!thisIsSame || !isRefMatch) {\r\n isSame = false;\r\n }\r\n enrichedIxns.isSameByPwid[pwid] = thisIsSame;\r\n });\r\n enrichedIxns.isSame = isSame;\r\n\r\n return enrichedIxns;\r\n}\r\n\r\n/**\r\n * If interactions aren't all exactly the same, then they are often still\r\n * directionally equivalent.\r\n *\r\n * E.g. if gene A both \"modifies\" and \"converts\" gene B, then we can summarize\r\n * that as gene A \"acts on\" gene B, rather than completely reverting to saying\r\n * gene A \"interacts with\" gene B.\r\n *\r\n */\r\nfunction summarizeByDirection(enrichedIxns) {\r\n\r\n let isDirectionSame = true;\r\n\r\n const leftTypes = []; // \"Acts on\" types\r\n const rightTypes = []; // \"Acted on by\" types\r\n Object.values(interactionArrowMap).forEach(directedTypes => {\r\n rightTypes.push(directedTypes[0]);\r\n leftTypes.push(directedTypes[1]);\r\n });\r\n\r\n const right = 'Acts on';\r\n const left = 'Acted on by';\r\n\r\n const ixnsByPwid = enrichedIxns.ixnsByPwid;\r\n const firstIxnType = getIxnTypeReference(ixnsByPwid);\r\n const isRight = rightTypes.includes(firstIxnType);\r\n const directionReference = isRight ? right : left;\r\n\r\n Object.entries(ixnsByPwid).map(([pwid, ixns]) => {\r\n let isPwDirectionSame = true;\r\n if (ixns.length > 0) {\r\n const pwFirstIxnType = ixns[0].ixnType.toLowerCase();\r\n const pwIsRight = rightTypes.includes(pwFirstIxnType);\r\n const pwDirectionReference = pwIsRight ? right : left;\r\n ixns.forEach(ixn => {\r\n const ixnType = ixn.ixnType.toLowerCase();\r\n const thisIsRight = rightTypes.includes(ixnType);\r\n const direction = thisIsRight ? right : left;\r\n enrichedIxns.directionsByPwid[pwid] = direction;\r\n if (direction !== directionReference) {\r\n isDirectionSame = false;\r\n }\r\n if (direction !== pwDirectionReference) {\r\n isPwDirectionSame = false;\r\n }\r\n });\r\n }\r\n enrichedIxns.isDirectionSameByPwid[pwid] = isPwDirectionSame;\r\n\r\n });\r\n\r\n enrichedIxns.isDirectionSame = isDirectionSame;\r\n if (isDirectionSame === true) {\r\n enrichedIxns.direction = directionReference;\r\n }\r\n\r\n return enrichedIxns;\r\n}\r\n\r\n/**\r\n * Summarize interactions by direction\r\n *\r\n * @param {String} gene Interacting gene\r\n * @param {String} searchedGene Searched gene\r\n * @param {Array} pathwayIds List of WikiPathways IDs\r\n * @param {Object} gpmls Object of parsed GPML XMLs values, by pathway ID key\r\n * @returns\r\n */\r\nexport function summarizeInteractions(gene, searchedGene, pathwayIds, gpmls) {\r\n let summary = null;\r\n\r\n const ixnsByPwid =\r\n detailAllInteractions(gene, searchedGene, pathwayIds, gpmls);\r\n\r\n const ixns = ixnsByPwid[pathwayIds[0]];\r\n\r\n if (ixns.length > 0) {\r\n let enrichedIxns = {\r\n ixnsByPwid,\r\n isSameByPwid: {}, // If pathway has all same interaction types\r\n isSame: null, // If above is true for all pathways\r\n isDirectionSameByPwid: {}, // If pathway has same ixn direction\r\n isDirectionSame: null, // If above is true for all pathways\r\n directionsByPwid: {}\r\n };\r\n enrichedIxns = setIsSame(enrichedIxns);\r\n\r\n if (enrichedIxns.isSame) {\r\n const ixnType = ixns[0].ixnType;\r\n const newIxn = ixnType;\r\n summary = newIxn;\r\n } else {\r\n\r\n enrichedIxns = summarizeByDirection(enrichedIxns);\r\n\r\n if (enrichedIxns.isDirectionSame) {\r\n summary = enrichedIxns.direction;\r\n } else {\r\n summary = 'Interacts with';\r\n }\r\n }\r\n }\r\n\r\n\r\n // if (direction !== null) {\r\n // summary = direction;\r\n // }\r\n // const pwidsByIxnType = {};\r\n // Object.entries(ixns).map(([k, v]) => {\r\n // if (!pwidsByIxnType[v.ixnType]) {\r\n // pwidsByIxnType[v.ixnType] = [v.pathwayId];\r\n // } else {\r\n // pwidsByIxnType[v.ixnType].push([v.pathwayId]);\r\n // }\r\n // });\r\n\r\n // console.log('pwidsByIxnType')\r\n // console.log(pwidsByIxnType)\r\n // const tpArray = Object.entries(pwidsByIxnType);\r\n // const sortedIndices = sortInteractionTypes(tpArray.map(tp => tp[0]));\r\n // const sortedTpArray =\r\n // sortedIndices.map(sortedIndex => tpArray[sortedIndex]);\r\n\r\n // console.log('sortedTpArray')\r\n // console.log(sortedTpArray)\r\n return summary;\r\n}\r\n\r\n/**\r\n * Get detailInteractions results for multiple pathways\r\n *\r\n * @param gene Interacting gene\r\n * @param pathwayIds List of WikiPathways IDs\r\n * @ideo ideo Ideogram instance object\r\n */\r\nexport function detailAllInteractions(gene, searchedGene, pathwayIds, gpmls) {\r\n const ixnsByPwid = {};\r\n\r\n pathwayIds.map(pathwayId => {\r\n const gpml = gpmls[pathwayId];\r\n const ixns = detailInteractions(gene, searchedGene, gpml);\r\n\r\n ixnsByPwid[pathwayId] = ixns;\r\n });\r\n return ixnsByPwid;\r\n}\r\n\r\n/** Get IDs and data element objects for searched or interacting gene */\r\nfunction getMatches(gpml, label) {\r\n\r\n const nodes = Array.from(gpml.querySelectorAll(\r\n `DataNode[TextLabel=\"${label}\"]`\r\n ));\r\n\r\n const genes = nodes.map(node => {\r\n return {\r\n type: 'node',\r\n matchedLabel: label,\r\n textLabel: node.getAttribute('TextLabel'),\r\n graphId: node.getAttribute('GraphId'),\r\n groupRef: node.getAttribute('GroupRef')\r\n };\r\n });\r\n\r\n // Get group identifiers\r\n const geneGraphIds = genes.map(g => g.graphId);\r\n const geneGroupRefs = genes.map(g => g.groupRef);\r\n const groupSelectors =\r\n geneGroupRefs.map(ggr => `Group[GroupId=\"${ggr}\"]`).join(',');\r\n\r\n let geneGroups = [];\r\n if (groupSelectors !== '') {\r\n const groups = gpml.querySelectorAll(groupSelectors);\r\n geneGroups = Array.from(groups).map(group => {\r\n return {\r\n type: 'group',\r\n matchedLabel: label,\r\n graphId: group.getAttribute('GraphId'),\r\n groupId: group.getAttribute('GroupId')\r\n };\r\n });\r\n }\r\n\r\n const geneGroupGraphIds = geneGroups.map(g => g.graphId);\r\n const matchingGraphIds = geneGraphIds.concat(geneGroupGraphIds);\r\n\r\n const elements = genes.concat(geneGroups);\r\n\r\n return [matchingGraphIds, elements];\r\n}\r\n\r\nasync function fetchGpml(pathwayId) {\r\n const pathwayFile = `${pathwayId}.xml.gz`;\r\n const gpmlUrl = `https://cdn.jsdelivr.net/npm/ixn2/${pathwayFile}`;\r\n const response = await fetch(gpmlUrl);\r\n const blob = await response.blob();\r\n const uint8Array = new Uint8Array(await blob.arrayBuffer());\r\n const rawGpml = strFromU8(decompressSync(uint8Array));\r\n\r\n const gpml = new DOMParser().parseFromString(rawGpml, 'text/xml');\r\n\r\n // console.log('gpml:')\r\n // console.log(gpml)\r\n\r\n return gpml;\r\n}\r\n\r\n/**\r\n * Request compressed GPML files, which contain detailed interaction data, e.g.\r\n * https://cdn.jsdelivr.net/npm/ixn/WP3982.xml.gz\r\n *\r\n * For more easily readable versions, see also:\r\n * - https://www.wikipathways.org/index.php?title=Pathway:WP3982&action=edit\r\n * - https://www.wikipathways.org//wpi/wpi.php?action=downloadFile&type=gpml&pwTitle=Pathway:WP3982\r\n *\r\n * GPML (Graphical Pathway Markup Language) data encodes detailed interaction\r\n * data for biochemical pathways.\r\n */\r\nexport function fetchGpmls(ideo) {\r\n\r\n const pathwayIdsByInteractingGene = {};\r\n Object.entries(ideo.annotDescriptions.annots)\r\n .forEach(([annotName, descObj]) => {\r\n if ('type' in descObj && descObj.type.includes('interacting gene')) {\r\n pathwayIdsByInteractingGene[annotName] = descObj.pathwayIds;\r\n }\r\n });\r\n\r\n const gpmlsByInteractingGene = {};\r\n Object.entries(pathwayIdsByInteractingGene)\r\n .forEach(([ixnGene, pathwayIds]) => {\r\n gpmlsByInteractingGene[ixnGene] = {};\r\n pathwayIds.map(async pathwayId => {\r\n const gpml = await fetchGpml(pathwayId);\r\n gpmlsByInteractingGene[ixnGene][pathwayId] = gpml;\r\n });\r\n });\r\n\r\n ideo.gpmlsByInteractingGene = gpmlsByInteractingGene;\r\n}\r\n\r\n/**\r\n * Get interaction object from a GPML graphics XML element\r\n *\r\n * This interaction object connects the searched gene and interacting gene.\r\n */\r\nfunction parseInteractionGraphic(graphic, graphIds) {\r\n let interaction = null;\r\n\r\n const {searchedGeneGraphIds, matchingGraphIds} = graphIds;\r\n\r\n const endGraphRefs = [];\r\n let numMatchingPoints = 0;\r\n let isConnectedToSourceGene = false;\r\n let ixnType = null;\r\n let searchedGeneIndex = null;\r\n\r\n Array.from(graphic.children).forEach(child => {\r\n if (child.nodeName !== 'Point') return;\r\n const point = child;\r\n const graphRef = point.getAttribute('GraphRef');\r\n if (graphRef === null) return;\r\n\r\n if (matchingGraphIds.includes(graphRef)) {\r\n numMatchingPoints += 1;\r\n endGraphRefs.push(graphRef);\r\n\r\n if (searchedGeneGraphIds.includes(graphRef)) {\r\n isConnectedToSourceGene = true;\r\n }\r\n\r\n if (point.getAttribute('ArrowHead')) {\r\n const arrowHead = point.getAttribute('ArrowHead');\r\n const isStart = searchedGeneGraphIds.includes(graphRef);\r\n if (searchedGeneIndex === null) {\r\n searchedGeneIndex = isStart ? 0 : 1;\r\n }\r\n ixnType = interactionArrowMap[arrowHead][isStart ? 0 : 1];\r\n }\r\n }\r\n });\r\n\r\n if (numMatchingPoints >= 2 && isConnectedToSourceGene) {\r\n if (searchedGeneIndex === null) {\r\n ixnType = 'interacts with';\r\n }\r\n ixnType = ixnType[0].toUpperCase() + ixnType.slice(1);\r\n const interactionGraphId = graphic.parentNode.getAttribute('GraphId');\r\n interaction = {\r\n 'interactionId': interactionGraphId,\r\n 'endIds': endGraphRefs,\r\n ixnType\r\n };\r\n }\r\n\r\n return interaction;\r\n}\r\n\r\n/**\r\n * Get all genes in the given pathway GPML\r\n */\r\nexport async function fetchPathwayInteractions(searchedGene, pathwayId, ideo) {\r\n const gpml = await fetchGpml(pathwayId);\r\n // Gets IDs and elements for searched gene and interacting gene, and,\r\n // if they're in any groups, the IDs of those groups\r\n const genes = {};\r\n\r\n const nodes = Array.from(gpml.querySelectorAll('DataNode'));\r\n nodes.forEach(node => {\r\n const label = node.getAttribute('TextLabel');\r\n const normLabel = label.toLowerCase();\r\n const isKnownGene = normLabel in ideo.geneCache.nameCaseMap;\r\n if (isKnownGene) {\r\n genes[label] = 1;\r\n }\r\n });\r\n\r\n const pathwayGenes = Object.keys(genes);\r\n const pathwayIxns = {};\r\n pathwayGenes.map(gene => {\r\n if (gene === searchedGene) return;\r\n const gpmls = {};\r\n gpmls[pathwayId] = gpml;\r\n const summary = summarizeInteractions(\r\n gene, searchedGene, [pathwayId], gpmls\r\n );\r\n pathwayIxns[gene] = (summary ? summary : 'Shares pathway with');\r\n });\r\n\r\n return pathwayIxns;\r\n}\r\n\r\n/**\r\n * Fetch GPML for pathway and find ID of Interaction between two genes,\r\n * and the ID of the two DataNodes for each of those interactions.\r\n *\r\n * WikiPathways SVG isn't detailed enough to reliably determine the specific\r\n * interaction elements relating two genes, given only the gene symbols. This\r\n * fetches augmented GPML data for the pathway, and queries it to get only\r\n * interactions between the two genes.\r\n */\r\nfunction detailInteractions(interactingGene, searchedGene, gpml) {\r\n\r\n // Gets IDs and elements for searched gene and interacting gene, and,\r\n // if they're in any groups, the IDs of those groups\r\n const [searchedGeneGraphIds, se] = getMatches(gpml, searchedGene);\r\n const [interactingGeneGraphIds, ie] = getMatches(gpml, interactingGene);\r\n\r\n const elements = {\r\n searchedGene: se,\r\n interactingGene: ie\r\n };\r\n\r\n const matchingGraphIds =\r\n searchedGeneGraphIds.concat(interactingGeneGraphIds);\r\n const graphIds = {searchedGeneGraphIds, matchingGraphIds};\r\n\r\n // Get interaction objects that connect the searched and interacting genes\r\n const interactions = [];\r\n const graphicsXml = gpml.querySelectorAll('Interaction Graphics');\r\n Array.from(graphicsXml).forEach(graphic => {\r\n const interaction = parseInteractionGraphic(graphic, graphIds);\r\n if (interaction !== null) {\r\n interaction.elements = elements;\r\n interactions.push(interaction);\r\n }\r\n });\r\n\r\n return interactions;\r\n}\r\n\r\n// export async function fetchInteractionDiagram(annot, descObj, ideo) {\r\n// // Fetch raw SVG for pathway diagram\r\n// const pathwayId = descObj.pathwayIds[0];\r\n// // const baseUrl = 'https://eweitz.github.io/cachome/wikipathways/';\r\n// const baseUrl = 'https://cachome.github.io/wikipathways/';\r\n// // const baseUrl = 'http://localhost/wikipathways/data/';\r\n// const diagramUrl = baseUrl + pathwayId + '.svg';\r\n// const response = await fetch(diagramUrl);\r\n// if (response.ok) {\r\n\r\n// // console.log('searchedGene', searchedGene)\r\n\r\n// const ixns = await detailInteractions(annot.name, pathwayId, ideo);\r\n\r\n// let selectors = `[name=${annot.name}]`;\r\n// let searchedGeneIndex = 0;\r\n// let interactingGeneIndex;\r\n// if (ixns.length > 0) {\r\n// selectors = ixns[0].endIds.map(id => '#' + id).join(',');\r\n// searchedGeneIndex = ixns[0].searchedGeneIndex;\r\n// interactingGeneIndex = (searchedGeneIndex === 0) ? 1 : 0;\r\n// }\r\n// // https://webservice.wikipathways.org/findInteractions?query=ACE2&format=json\r\n\r\n// const rawDiagram = await response.text();\r\n\r\n// const pathwayDiagram =\r\n// `
    ${rawDiagram}
    `;\r\n\r\n// annot.displayName += pathwayDiagram;\r\n\r\n// document.querySelector('#_ideogramTooltip').innerHTML =\r\n// annot.displayName;\r\n\r\n// Ideogram.d3.select('svg.Diagram')\r\n// .attr('width', 350)\r\n// .attr('height', 300);\r\n\r\n// const viewport = document.querySelector('.svg-pan-zoom_viewport');\r\n// viewport.removeAttribute('style');\r\n// viewport.removeAttribute('transform');\r\n\r\n// const matches = document.querySelectorAll(selectors);\r\n// console.log('matches', matches)\r\n// const match0 = matches[searchedGeneIndex]\r\n// const m0 = match0.getCTM();\r\n// const m0Rect = match0.getBoundingClientRect();\r\n// const m0Box = match0.getBBox();\r\n// const m0MinX = m0.e/m0.a;\r\n// const m0MinY = m0.f/m0.d;\r\n\r\n// let minX = m0MinX;\r\n// let minY = m0MinY;\r\n// let width;\r\n// let height;\r\n\r\n// width = 350;\r\n// height = 300;\r\n\r\n// // matches[0].children[0].setAttribute('fill', '#F55');\r\n// match0.children[0].style.fill = '#f55';\r\n\r\n// if (matches.length > 1) {\r\n// // console.log('matches.length > 1')\r\n// // matches[1].children[0].setAttribute('fill', '#C4C');\r\n// const match1 = matches[interactingGeneIndex];\r\n// // console.log('match1')\r\n// // console.log(match1)\r\n// match1.children[0].style.fill = '#c4c';\r\n// const m1 = matches[1].getCTM();\r\n// const m1Rect = matches[1].getBoundingClientRect();\r\n// const m1Box = matches[1].getBBox();\r\n// console.log('m0', m0)\r\n// console.log('m1', m1)\r\n// const m1MinX = m1.e/m1.a;\r\n// const m1MinY = m1.f/m1.d;\r\n// // const m1MinX = m1.e/m1.a + m1Rect.width;\r\n// // const m1MinY = m1.f/m1.d - m1Rect.height;\r\n// if (m1MinX < m0MinX) minX = m1MinX;\r\n// if (m1MinY < m0MinY) minY = m1MinY;\r\n\r\n// let pairWidth = 0;\r\n// if (m0Rect.left < m1Rect.left) {\r\n// // pairWidth = m1Rect.right - m0Rect.left;\r\n// width += m1Box.width + 40;\r\n// }\r\n\r\n// // width += pairWidth;\r\n\r\n// // console.log('m0Rect', m0Rect)\r\n// // console.log('m1Rect', m1Rect)\r\n// // console.log('m1MinX', m1MinX)\r\n// // console.log('m0MinX', m0MinX)\r\n// // console.log('m1MinY', m1MinY)\r\n// // console.log('m0MinY', m0MinY)\r\n// // console.log('pairWidth', pairWidth)\r\n// // console.log('width', width)\r\n// // width += Math.abs(m1MinX - m0MinX);\r\n// // height += Math.abs(m1MinY - m0MinY);\r\n\r\n// // minX -= 100;\r\n// // minY -= 100;\r\n\r\n// // minX -= 150;\r\n// // minY -= 150;\r\n// } else {\r\n// minX -= 150;\r\n// minY -= 150;\r\n// }\r\n\r\n// minX = Math.round(minX);\r\n// minY = Math.round(minY);\r\n// width = Math.round(width);\r\n// height = Math.round(height);\r\n\r\n// const viewBox = `${minX} ${minY} ${width} ${height}`;\r\n// console.log('viewBox', viewBox);\r\n// document.querySelector('svg.Diagram').setAttribute('viewBox', viewBox);\r\n\r\n// }\r\n// }\r\n","/**\r\n * @fileoverview Kit used in \"Related genes\" example\r\n *\r\n * This file simplifies client code for reusing a \"related genes\" ideogram --\r\n * which finds and displays related genes for a searched gene.\r\n *\r\n * Related genes here are either \"interacting genes\" or \"paralogs\".\r\n * Interacting genes are genes immediately upstream or downstream of the\r\n * searched gene in a biochemical pathway. Paralogs are evolutionarily\r\n * similar genes in the same species.\r\n *\r\n * Data sources:\r\n * - Interacting genes: WikiPathways\r\n * - Paralogs: Ensembl\r\n * - Genomic coordinates: Ensembl, via MyGene.info\r\n *\r\n * Features provided by this module help users discover and explore genes\r\n * related to their gene of interest.\r\n *\r\n * The reference implementation is available at:\r\n * https://eweitz.github.io/ideogram/related-genes\r\n */\r\n\r\nimport {decompressSync, strFromU8} from 'fflate';\r\n\r\nimport {\r\n initAnalyzeRelatedGenes, analyzePlotTimes, analyzeRelatedGenes, timeDiff,\r\n getRelatedGenesByType, getRelatedGenesTooltipAnalytics\r\n} from './analyze-related-genes';\r\n\r\nimport {\r\n sortAnnotsByRank, applyRankCutoff, setAnnotRanks\r\n} from '../annotations/annotations';\r\nimport {writeLegend} from '../annotations/legend';\r\nimport {getAnnotDomId} from '../annotations/process';\r\nimport {getDir, deepCopy} from '../lib';\r\nimport initGeneCache, {getEnsemblId} from '../gene-cache';\r\nimport initParalogCache, {hasParalogCache} from '../paralog-cache';\r\nimport initInteractionCache from '../interaction-cache';\r\nimport {\r\n fetchGpmls, summarizeInteractions, fetchPathwayInteractions\r\n} from './wikipathways';\r\n// import {drawAnnotsByLayoutType} from '../annotations/draw';\r\n// import {organismMetadata} from '../init/organism-metadata';\r\n\r\n/** Sets DOM IDs for ideo.relatedAnnots; needed to associate labels */\r\nfunction setRelatedAnnotDomIds(ideo) {\r\n const updated = [];\r\n\r\n const sortedChrNames = ideo.chromosomesArray.map((chr) => {\r\n return chr.name;\r\n });\r\n\r\n // Count two related annots for same gene as one.\r\n // E.g. gene Foo can both interact with and be paralog of gene Bar\r\n // Instead of count Foo interacting annot and Foo paralog annot as two,\r\n // only count it as one as they are merged in downstream UI.\r\n //\r\n // Searching STAT3 without this block shows the problem this fixes.\r\n const seenNames = {};\r\n ideo.relatedAnnots = ideo.relatedAnnots.filter(annot => {\r\n if (annot.name in seenNames) {\r\n return false;\r\n }\r\n seenNames[annot.name] = 1;\r\n return true;\r\n });\r\n\r\n // Arrange related annots by chromosome\r\n const annotsByChr = {};\r\n ideo.relatedAnnots.forEach((annot) => {\r\n if (annot.chr in annotsByChr) {\r\n annotsByChr[annot.chr].push(annot);\r\n } else {\r\n annotsByChr[annot.chr] = [annot];\r\n }\r\n });\r\n\r\n // Sort related annots by relevance within each chromosome\r\n const relevanceSortedAnnotsNamesByChr = {};\r\n Object.entries(annotsByChr).map(([chr, annots]) => {\r\n\r\n annots = setAnnotRanks(annots, ideo);\r\n\r\n // Sort so first annots are drawn last, and thus at top layer\r\n annots.sort((a, b) => -ideo.annotSortFunction(a, b));\r\n\r\n const annotNames = annots.map((annot) => annot.name);\r\n relevanceSortedAnnotsNamesByChr[chr] = annotNames;\r\n });\r\n\r\n // annotsByChr.annots.sort((a, b) => {\r\n // // Reverse-sort, so first annots are drawn last, and thus at top layer\r\n // return -ideo.annotSortFunction(a, b);\r\n // });\r\n\r\n ideo.relatedAnnots.forEach((annot) => {\r\n\r\n const chr = annot.chr;\r\n\r\n // Annots have DOM IDs keyed by chromosome index and annotation index.\r\n // We reconstruct those here using structures built in two blocks above.\r\n const chrIndex = sortedChrNames.indexOf(chr);\r\n const annotIndex =\r\n relevanceSortedAnnotsNamesByChr[chr].indexOf(annot.name);\r\n\r\n annot.domId = getAnnotDomId(chrIndex, annotIndex);\r\n updated.push(annot);\r\n });\r\n\r\n ideo.relatedAnnots = updated;\r\n}\r\n\r\n/**\r\n * Determines if interaction node might be a gene\r\n *\r\n * Some interaction nodes are biological processes; this filters out many.\r\n * Filtering these out makes downstream queries faster.\r\n *\r\n * ixn {Object} Interaction from WikiPathways\r\n * gene {Object} Gene from MyGene.info\r\n */\r\nfunction maybeGeneSymbol(ixn, gene) {\r\n return (\r\n ixn !== '' &&\r\n !ixn.includes(' ') &&\r\n !ixn.includes('/') && // e.g. Akt/PKB\r\n ixn.toLowerCase() !== gene.name.toLowerCase()\r\n );\r\n}\r\n\r\n// /** Helpful for debugging race conditions caused by concurrency */\r\n// const sleep = (delay) => {\r\n// new Promise((resolve) => setTimeout(resolve, delay));\r\n// }\r\n\r\n/** Reports if interaction node is a gene and not previously seen */\r\nfunction isInteractionRelevant(rawIxn, gene, nameId, seenNameIds, ideo) {\r\n let isGeneSymbol;\r\n if ('geneCache' in ideo && gene.name) {\r\n isGeneSymbol = rawIxn.toLowerCase() in ideo.geneCache.nameCaseMap;\r\n } else {\r\n isGeneSymbol = maybeGeneSymbol(rawIxn, gene);\r\n }\r\n\r\n return isGeneSymbol && !(nameId in seenNameIds);\r\n}\r\n\r\n/**\r\n * Retrieves interacting genes from WikiPathways API\r\n *\r\n * Docs:\r\n * https://webservice.wikipathways.org/ui/\r\n * https://www.wikipathways.org/index.php/Help:WikiPathways_Webservice/API\r\n *\r\n * Examples:\r\n * https://webservice.wikipathways.org/findInteractions?query=ACE2&format=json\r\n * https://webservice.wikipathways.org/findInteractions?query=RAD51&format=json\r\n */\r\nasync function fetchInteractions(gene, ideo) {\r\n const ixns = {};\r\n const seenNameIds = {};\r\n const orgNameSimple = ideo.config.organism.replace(/-/g, ' ');\r\n const upperGene = gene.name.toUpperCase();\r\n\r\n let data = {result: []};\r\n\r\n if (ideo.interactionCache) {\r\n if (upperGene in ideo.interactionCache) {\r\n data = ideo.interactionCache[upperGene];\r\n }\r\n } else {\r\n\r\n // const queryString = `?query=${gene.name}&format=json`;\r\n // const url =\r\n // `https://webservice.wikipathways.org/findInteractions${queryString}`;\r\n // const url = `http://localhost:8080/dist/data/cache/${gene.name}.json.gz`;\r\n const url = `https://cdn.jsdelivr.net/npm/ixn2/${upperGene}.json.gz`;\r\n\r\n // await sleep(3000);\r\n\r\n const response = await fetch(url);\r\n // const data = await response.json();\r\n\r\n if (response.ok) {\r\n const blob = await response.blob();\r\n const uint8Array = new Uint8Array(await blob.arrayBuffer());\r\n data = JSON.parse(strFromU8(decompressSync(uint8Array)));\r\n }\r\n }\r\n\r\n // For each interaction, get nodes immediately upstream and downstream.\r\n // Filter out pathway nodes that are definitely not gene symbols, then\r\n // group pathways by gene symbol. Each interacting gene can have\r\n // multiple pathways.\r\n data.result.forEach(interaction => {\r\n if (interaction.species.toLowerCase() === orgNameSimple) {\r\n const right = interaction.fields.right.values;\r\n const left = interaction.fields.left.values;\r\n // let mediator = [];\r\n // if ('mediator' in interaction.fields) {\r\n // mediator = interaction.fields.mediator.values;\r\n // console.log('mediator', mediator)\r\n // }\r\n // const rawIxns = right.concat(left, mediator);\r\n const rawIxns = right.concat(left);\r\n const name = interaction.name;\r\n const id = interaction.id;\r\n\r\n // rawIxns can contain multiple genes, e.g. when\r\n // a group (i.e. a complex or a set of paralogs)\r\n // interacts with the searched gene\r\n const wrappedRawIxns = rawIxns.map(rawIxn => {\r\n return {name: rawIxn, color: ''};\r\n });\r\n const sortedRawIxns =\r\n sortAnnotsByRank(wrappedRawIxns, ideo).map(i => i.name);\r\n\r\n sortedRawIxns.forEach(rawIxn => {\r\n\r\n const normRawIxn = rawIxn.toLowerCase();\r\n\r\n // Prevent overwriting searched gene. Occurs with e.g. human CD4\r\n if (normRawIxn.includes(gene.name.toLowerCase())) return;\r\n\r\n // if (rawIxn === '') return; // Avoid oddly blank placeholders\r\n\r\n const nameId = name + id;\r\n\r\n const isRelevant =\r\n isInteractionRelevant(normRawIxn, gene, nameId, seenNameIds, ideo);\r\n\r\n if (isRelevant) {\r\n seenNameIds[nameId] = 1;\r\n const ixn = {name, pathwayId: id};\r\n if (normRawIxn in ixns) {\r\n ixns[normRawIxn].push(ixn);\r\n } else {\r\n ixns[normRawIxn] = [ixn];\r\n }\r\n }\r\n });\r\n }\r\n });\r\n\r\n return ixns;\r\n}\r\n\r\n/**\r\n * Queries MyGene.info API, returns parsed JSON\r\n *\r\n * Docs:\r\n * https://docs.mygene.info/en/v3/\r\n *\r\n * Example:\r\n * https://mygene.info/v3/query?q=symbol:cdk2%20OR%20symbol:brca1&species=9606&fields=symbol,genomic_pos,name\r\n */\r\nasync function fetchMyGeneInfo(queryString) {\r\n const myGeneBase = 'https://mygene.info/v3/query';\r\n const response = await fetch(myGeneBase + queryString + '&size=400');\r\n const data = await response.json();\r\n return data;\r\n}\r\n\r\nfunction parseNameAndEnsemblIdFromMgiGene(gene) {\r\n const name = gene.name;\r\n const id = gene.genomic_pos.ensemblgene;\r\n let ensemblId = id;\r\n if (typeof id === 'undefined') {\r\n // Encountered in AKT3, when querying related genes for MTOR\r\n // A 'chr'omosome value containing _ indicates an alt loci scaffold,\r\n // so ignore that and take the Ensembl ID associated with the\r\n // first position of a primary chromosome.\r\n ensemblId =\r\n gene.genomic_pos.filter(pos => !pos.chr.includes('_'))[0].ensemblgene;\r\n }\r\n return {name, ensemblId};\r\n}\r\n\r\n/**\r\n * Summarizes genes in a pathway\r\n *\r\n * This comprises most of the content for tooltips for pathway genes.\r\n */\r\n function describePathwayGene(pathwayGene, searchedGene, pathway, summary) {\r\n let ixnsDescription = '';\r\n\r\n const pathwaysBase = 'https://www.wikipathways.org/index.php/Pathway:';\r\n const url = `${pathwaysBase}${pathway.id}`;\r\n const attrs =\r\n `href=\"${url}\" ` +\r\n `target=\"_blank\" ` +\r\n `title=\"See pathway diagram in WikiPathways\"`;\r\n ixnsDescription =\r\n `${summary} ${searchedGene.name} in:
    ` +\r\n `${pathway.name}`;\r\n\r\n const {name, ensemblId} = parseNameAndEnsemblIdFromMgiGene(pathwayGene);\r\n const type = 'pathway gene';\r\n const descriptionObj = {\r\n description: ixnsDescription,\r\n ixnsDescription, ensemblId, name, type\r\n };\r\n return descriptionObj;\r\n}\r\n\r\n/**\r\n * Summarizes interactions for a gene\r\n *\r\n * This comprises most of the content for tooltips for interacting genes.\r\n */\r\nfunction describeInteractions(gene, ixns, searchedGene) {\r\n const pathwayIds = [];\r\n const pathwayNames = [];\r\n let ixnsDescription = '';\r\n\r\n if (typeof ixns !== 'undefined') {\r\n // ixns is undefined when querying e.g. CDKN1B in human\r\n const links = ixns.map(ixn => {\r\n // pathwayIds.push(ixn.pathwayId);\r\n // pathwayNames.push(ixn.name);\r\n // const attrs =\r\n // `class=\"ideo-pathway-link\" ` +\r\n // `title=\"Click to search for other genes in this pathway\" ` +\r\n // `style=\"cursor: pointer\" ` +\r\n // `data-pathway-id=\"${ixn.pathwayId}\" ` +\r\n // `data-pathway-name=\"${ixn.name}\"`;\r\n // return `${ixn.name}`;\r\n\r\n const pathwaysBase = 'https://www.wikipathways.org/index.php/Pathway:';\r\n const url = `${pathwaysBase}${ixn.pathwayId}`;\r\n pathwayIds.push(ixn.pathwayId);\r\n pathwayNames.push(ixn.name);\r\n const attrs =\r\n `class=\"ideo-pathway-link\" ` +\r\n `title=\"View in WikiPathways\" ` +\r\n `data-pathway-id=\"${ixn.pathwayId}\" ` +\r\n `target=\"_blank\" ` +\r\n `href=\"${url}\"`;\r\n return `${ixn.name}`;\r\n }).join('
    ');\r\n\r\n ixnsDescription =\r\n `Interacts with ${searchedGene.name} in:
    ${links}`;\r\n }\r\n\r\n const {name, ensemblId} = parseNameAndEnsemblIdFromMgiGene(gene);\r\n const type = 'interacting gene';\r\n const descriptionObj = {\r\n description: ixnsDescription,\r\n ixnsDescription, ensemblId, name, type, pathwayIds, pathwayNames\r\n };\r\n return descriptionObj;\r\n}\r\n\r\n/** Throw error when searched gene (e.g. \"Foo\") isn't found */\r\nfunction throwGeneNotFound(geneSymbol, ideo) {\r\n const organism = ideo.organismScientificName;\r\n throw Error(`\"${geneSymbol}\" is not a known gene in ${organism}`);\r\n}\r\n\r\n/**\r\n * Fetch genes from cache\r\n * Construct objects that match format of MyGene.info API response\r\n */\r\nfunction fetchGenesFromCache(names, type, ideo) {\r\n const cache = ideo.geneCache;\r\n const isSymbol = (type === 'symbol');\r\n const locusMap = isSymbol ? cache.lociByName : cache.lociById;\r\n const nameMap = isSymbol ? cache.idsByName : cache.namesById;\r\n\r\n const hits = names.map(name => {\r\n\r\n const nameLc = name.toLowerCase();\r\n\r\n if (!locusMap[name] && !cache.nameCaseMap[nameLc]) {\r\n if (isSymbol) {\r\n throwGeneNotFound(name, ideo);\r\n } else {\r\n return;\r\n }\r\n }\r\n\r\n // Canonicalize name if it is mistaken in upstream data source.\r\n // This can sometimes happen in WikiPathways, e.g. when searching\r\n // interactions for rat Pten, it includes a result for \"PIK3CA\".\r\n // In that case, this would correct PIK3CA to be Pik3ca.\r\n if (isSymbol && !locusMap[name] && cache.nameCaseMap[nameLc]) {\r\n name = cache.nameCaseMap[nameLc];\r\n }\r\n\r\n const locus = locusMap[name];\r\n const symbol = isSymbol ? name : nameMap[name];\r\n const ensemblId = isSymbol ? nameMap[name] : name;\r\n const fullName = cache.fullNamesById[ensemblId];\r\n\r\n const hit = {\r\n symbol,\r\n name: fullName,\r\n source: 'cache',\r\n genomic_pos: {\r\n chr: locus[0],\r\n start: locus[1],\r\n end: locus[2],\r\n ensemblgene: ensemblId\r\n }\r\n };\r\n\r\n return hit;\r\n });\r\n\r\n const hitsWithGenomicPos = hits.filter(hit => hit !== undefined);\r\n\r\n return hitsWithGenomicPos;\r\n}\r\n\r\n/** Fetch genes from cache, or, if needed, from MyGene.info API */\r\nasync function fetchGenes(names, type, ideo) {\r\n\r\n let data;\r\n\r\n // Account for single-gene fetch\r\n if (typeof names === 'string') names = [names];\r\n\r\n // Query parameter for MyGene.info API\r\n const qParam = names.map(name => `${type}:${name.trim()}`).join(' OR ');\r\n const taxid = ideo.config.taxid;\r\n\r\n const queryStringBase = `?q=${qParam}&species=${taxid}&fields=`;\r\n\r\n if (ideo.geneCache) {\r\n const hits = fetchGenesFromCache(names, type, ideo);\r\n\r\n // Asynchronously fetch full name, but don't await the response, because\r\n // full names are only shown upon hovering over an annotation.\r\n // const queryString = `${queryStringBase}symbol,name`;\r\n // data = fetchMyGeneInfo(queryString).then(data => {\r\n // data.hits.forEach((hit) => {\r\n hits.forEach((hit) => {\r\n const symbol = hit.symbol;\r\n const fullName = hit.name;\r\n if (symbol in ideo.annotDescriptions.annots) {\r\n ideo.annotDescriptions.annots[symbol].name = fullName;\r\n } else {\r\n ideo.annotDescriptions.annots[symbol] = {name: fullName};\r\n }\r\n });\r\n // });\r\n\r\n data = {hits, fromGeneCache: true};\r\n } else {\r\n // Fetch gene data from MyGene.info\r\n const queryString = `${queryStringBase}symbol,genomic_pos,name`;\r\n data = await fetchMyGeneInfo(queryString);\r\n }\r\n\r\n return data;\r\n}\r\n\r\n/**\r\n * Retrieves position and other data on interacting genes from MyGene.info\r\n */\r\nasync function fetchInteractionAnnots(interactions, searchedGene, ideo) {\r\n\r\n const annots = [];\r\n const symbols = Object.keys(interactions);\r\n\r\n if (symbols.length === 0) return annots;\r\n\r\n const data = await fetchGenes(symbols, 'symbol', ideo);\r\n\r\n data.hits.forEach(gene => {\r\n // If hit lacks position\r\n // or is same as searched gene (e.g. search for human SRC),\r\n // then skip processing\r\n if (\r\n 'genomic_pos' in gene === false ||\r\n gene.symbol === searchedGene.name\r\n ) {\r\n return;\r\n }\r\n\r\n const annot = parseAnnotFromMgiGene(gene, ideo, 'purple');\r\n annots.push(annot);\r\n\r\n const ixns = interactions[gene.symbol.toLowerCase()];\r\n\r\n const descriptionObj = describeInteractions(gene, ixns, searchedGene);\r\n\r\n mergeDescriptions(annot, descriptionObj, ideo);\r\n });\r\n\r\n // Fetch GPML files to use when updating interaction descriptions with\r\n // refined direction.\r\n fetchGpmls(ideo);\r\n\r\n return annots;\r\n}\r\n\r\n/** Fetch paralog positions from MyGeneInfo */\r\nasync function fetchParalogPositionsFromMyGeneInfo(\r\n homologs, searchedGene, ideo\r\n) {\r\n const annots = [];\r\n\r\n const cached = homologs.length && typeof homologs[0] === 'string';\r\n const ensemblIds = cached ? homologs : homologs.map(homolog => homolog.id);\r\n const data = await fetchGenes(ensemblIds, 'ensemblgene', ideo);\r\n\r\n data.hits.forEach(gene => {\r\n\r\n // If hit lacks position, skip processing\r\n if ('genomic_pos' in gene === false) return;\r\n if ('name' in gene === false) return;\r\n\r\n const annot = parseAnnotFromMgiGene(gene, ideo, 'pink');\r\n annots.push(annot);\r\n\r\n const description = `Paralog of ${searchedGene.name}`;\r\n const {name, ensemblId} = parseNameAndEnsemblIdFromMgiGene(gene);\r\n const type = 'paralogous gene';\r\n const descriptionObj = {description, ensemblId, name, type};\r\n mergeDescriptions(annot, descriptionObj, ideo);\r\n });\r\n\r\n return annots;\r\n}\r\n\r\nfunction overplotParalogs(annots, ideo) {\r\n if (!ideo.config.showParalogNeighborhoods) return;\r\n\r\n if (annots.length < 2) return;\r\n\r\n // Arrays of paralogs within 10 Mbp of each other\r\n const neighborhoods = {};\r\n\r\n neighborhoods[annots[0].chr] = {};\r\n neighborhoods[annots[0].chr][annots[0].start] = [annots[0]];\r\n\r\n const windowInt = 2_000_000;\r\n const windowProse = '2 Mbp';\r\n\r\n for (let i = 1; i < annots.length; i++) {\r\n const annot = annots[i];\r\n const chr = annot.chr;\r\n const start = annot.start;\r\n if (chr in neighborhoods) {\r\n const starts = Object.keys(neighborhoods[chr]);\r\n for (let j = 0; j < starts.length; j++) {\r\n const startJInt = parseInt(starts[j]);\r\n if (Math.abs(start - startJInt) < windowInt) {\r\n neighborhoods[chr][startJInt].push(annot);\r\n } else {\r\n neighborhoods[chr][start] = [annot];\r\n }\r\n }\r\n } else {\r\n neighborhoods[chr] = {};\r\n neighborhoods[chr][start] = [annot];\r\n }\r\n }\r\n\r\n // Big enough to see and hover\r\n const overlayAnnotLength = 15_000_000;\r\n\r\n const searchedGene = getSearchedFromDescriptions(ideo);\r\n\r\n const neighborhoodAnnots =\r\n Object.entries(neighborhoods).map(([chr, neighborhood], index) => {\r\n const start = parseInt(Object.keys(neighborhood)[0]);\r\n let paralogs = Object.values(neighborhood)[0];\r\n\r\n if (paralogs.length < 2) {\r\n return {paralogs};\r\n }\r\n\r\n // paralogs.map(paralog => {\r\n // console.log(paralog);\r\n // })\r\n\r\n const description =\r\n `${paralogs.length} nearby paralogs of ${searchedGene}`;\r\n\r\n const chrLength = ideo.chromosomes[ideo.config.taxid][chr].bpLength;\r\n let annotStart = start - overlayAnnotLength/2;\r\n let annotStop = start + overlayAnnotLength/2;\r\n if (annotStop > chrLength) {\r\n annotStart = start - overlayAnnotLength;\r\n annotStop = chrLength;\r\n } else if (annotStart < 1) {\r\n annotStart = 1;\r\n annotStop = overlayAnnotLength;\r\n };\r\n\r\n if ('geneCache' in ideo) {\r\n paralogs = paralogs.map(paralog => {\r\n paralog.fullName = ideo.geneCache.fullNamesById[paralog.id];\r\n return paralog;\r\n });\r\n }\r\n\r\n const key = 'paralogNeighborhood-' + index;\r\n const fStart = start.toLocaleString(); // Format for readability\r\n const displayCoordinates = `chr${chr}:${fStart} ± ${windowProse}`;\r\n\r\n const annot = {\r\n name: key,\r\n chr,\r\n start: annotStart,\r\n stop: annotStop,\r\n color: 'pink',\r\n description,\r\n paralogs,\r\n type: 'paralog neighborhood',\r\n displayCoordinates\r\n };\r\n\r\n ideo.annotDescriptions.annots[annot.name] = annot;\r\n return annot;\r\n }).filter(n => n.paralogs.length > 1);\r\n\r\n if (neighborhoodAnnots.length > 0) {\r\n // console.log('neighborhoodAnnots')\r\n // console.log(neighborhoodAnnots.map(na => na));\r\n ideo.drawAnnots(neighborhoodAnnots, 'overlay', true, true);\r\n moveLegend();\r\n }\r\n}\r\n\r\n/**\r\n * Fetch paralogs of searched gene\r\n */\r\nasync function fetchParalogs(annot, ideo) {\r\n const taxid = ideo.config.taxid;\r\n\r\n let homologs;\r\n // Fetch paralogs\r\n if (ideo.paralogCache) {\r\n // const baseUrl = 'http://localhost:8080/dist/data/cache/paralogs/';\r\n // const url = `${baseUrl}homo-sapiens/${annot.name}.tsv`;\r\n // const response = await fetch(url);\r\n // const oneRowTsv = await response.text();\r\n // const rawHomologEnsemblIds = oneRowTsv.split('\\t');\r\n // homologs = rawHomologEnsemblIds.map(r => getEnsemblId('ENSG', r));\r\n const paralogsByName = ideo.paralogCache.paralogsByName;\r\n const nameUc = annot.name.toUpperCase();\r\n const hasParalogs = nameUc in paralogsByName;\r\n homologs = hasParalogs ? paralogsByName[nameUc] : [];\r\n } else {\r\n const params = `&format=condensed&type=paralogues&target_taxon=${taxid}`;\r\n const path = `/homology/id/${annot.id}?${params}`;\r\n const ensemblHomologs = await Ideogram.fetchEnsembl(path);\r\n homologs = ensemblHomologs.data[0].homologies;\r\n }\r\n\r\n\r\n // Fetch positions of paralogs\r\n let annots =\r\n await fetchParalogPositionsFromMyGeneInfo(homologs, annot, ideo);\r\n\r\n // Omit genes named like \"AC113554.1\", which is an \"accession.version\".\r\n // Such accVers are raw and poorly suited here.\r\n annots = annots.filter(annot => {\r\n const isAccVer = annot.name.match(/^AC[0-9.]+$/);\r\n return !isAccVer;\r\n });\r\n\r\n return annots;\r\n}\r\n\r\n/**\r\n * Filters out placements on alternative loci scaffolds, an advanced\r\n * genome assembly feature we are not concerned with in ideograms.\r\n *\r\n * Example:\r\n * https://mygene.info/v3/query?q=symbol:PTPRC&species=9606&fields=symbol,genomic_pos,name\r\n */\r\nfunction getGenomicPos(gene, ideo) {\r\n let genomicPos = null;\r\n if (Array.isArray(gene.genomic_pos)) {\r\n genomicPos = gene.genomic_pos.filter(pos => {\r\n return pos.chr in ideo.chromosomes[ideo.config.taxid];\r\n })[0];\r\n } else {\r\n genomicPos = gene.genomic_pos;\r\n }\r\n return genomicPos;\r\n}\r\n\r\n/**\r\n * Transforms MyGene.info (MGI) gene into Ideogram annotation\r\n */\r\nfunction parseAnnotFromMgiGene(gene, ideo, color='red') {\r\n const genomicPos = getGenomicPos(gene, ideo);\r\n\r\n const annot = {\r\n name: gene.symbol,\r\n chr: genomicPos.chr,\r\n start: genomicPos.start,\r\n stop: genomicPos.end,\r\n id: genomicPos.ensemblgene,\r\n color\r\n };\r\n\r\n return annot;\r\n}\r\n\r\nfunction moveLegend() {\r\n const ideoInnerDom = document.querySelector('#_ideogramInnerWrap');\r\n const decorPad = setRelatedDecorPad({}).legendPad;\r\n const left = decorPad + 20;\r\n const legendStyle = `position: absolute; top: 15px; left: ${left}px`;\r\n const legend = document.querySelector('#_ideogramLegend');\r\n ideoInnerDom.prepend(legend);\r\n legend.style = legendStyle;\r\n}\r\n\r\n/** Filter annotations to only include those in configured list */\r\nfunction applyAnnotsIncludeList(annots, ideo) {\r\n\r\n if (ideo.config.annotsInList === 'all') return annots;\r\n\r\n const includedAnnots = [];\r\n annots.forEach(annot => {\r\n if (ideo.config.annotsInList.includes(annot.name.toLowerCase())) {\r\n includedAnnots.push(annot);\r\n }\r\n });\r\n return includedAnnots;\r\n}\r\n\r\n/** Fetch and draw interacting genes, return Promise for annots */\r\nfunction processInteractions(annot, ideo) {\r\n return new Promise(async (resolve) => {\r\n const t0 = performance.now();\r\n\r\n const interactions = await fetchInteractions(annot, ideo);\r\n const annots = await fetchInteractionAnnots(interactions, annot, ideo);\r\n\r\n ideo.relatedAnnots.push(...annots);\r\n finishPlotRelatedGenes('interacting', ideo);\r\n\r\n ideo.time.rg.interactions = timeDiff(t0);\r\n\r\n resolve();\r\n });\r\n}\r\n\r\n/** Find and draw paralogs, return Promise for annots */\r\nfunction processParalogs(annot, ideo) {\r\n return new Promise(async (resolve) => {\r\n const t0 = performance.now();\r\n\r\n const annots = await fetchParalogs(annot, ideo);\r\n ideo.relatedAnnots.push(...annots);\r\n finishPlotRelatedGenes('paralogous', ideo);\r\n overplotParalogs(annots, ideo);\r\n\r\n ideo.time.rg.paralogs = timeDiff(t0);\r\n\r\n resolve();\r\n });\r\n}\r\n\r\n// /**\r\n// * Sorts gene names consistently.\r\n// *\r\n// * Might also loosely rank by first-discovered or most prominent\r\n// */\r\n// function sortGeneNames(aName, bName) {\r\n// // Rank shorter names above longer names\r\n// if (bName.length !== aName.length) return bName.length - aName.length;\r\n\r\n// // Rank names of equal length alphabetically\r\n// return [aName, bName].sort().indexOf(aName) === 0 ? 1 : -1;\r\n// }\r\n\r\n/** Sorts by relevance of related type, then rank */\r\nexport function sortByRelatedType(a, b) {\r\n var aName, bName, aColor, bColor;\r\n if ('name' in a) {\r\n // Locally processed annotations\r\n aName = a.name;\r\n bName = b.name;\r\n aColor = a.color;\r\n bColor = b.color;\r\n } else {\r\n // Raw annotations\r\n [aName, aColor] = [a[0], a[3]];\r\n [bName, bColor] = [b[0], b[3]];\r\n }\r\n\r\n // Rank red (searched gene) highest\r\n if (aColor === 'red') return -1;\r\n if (bColor === 'red') return 1;\r\n\r\n // Rank purple (interacting gene) above pink (paralogous gene)\r\n if (aColor === 'purple' && bColor === 'pink') return -1;\r\n if (bColor === 'purple' && aColor === 'pink') return 1;\r\n\r\n return a.rank - b.rank;\r\n\r\n // return sortGeneNames(aName, bName);\r\n}\r\n\r\nfunction mergeDescriptions(annot, desc, ideo) {\r\n let mergedDesc;\r\n const descriptions = ideo.annotDescriptions.annots;\r\n\r\n if (annot.name in descriptions) {\r\n const otherDesc = descriptions[annot.name];\r\n mergedDesc = desc;\r\n if (desc.type === otherDesc.type) return;\r\n Object.keys(otherDesc).forEach(function(key) {\r\n if (key in mergedDesc === false) {\r\n mergedDesc[key] = otherDesc[key];\r\n }\r\n });\r\n // Object.assign({}, descriptions[annot.name]);\r\n if ('type' in otherDesc) {\r\n mergedDesc.type += ', ' + otherDesc.type;\r\n mergedDesc.description += `

    ${otherDesc.description}`;\r\n }\r\n } else {\r\n mergedDesc = desc;\r\n }\r\n\r\n ideo.annotDescriptions.annots[annot.name] = mergedDesc;\r\n}\r\n\r\nfunction mergeAnnots(unmergedAnnots) {\r\n\r\n const seenAnnots = {};\r\n let mergedAnnots = [];\r\n\r\n unmergedAnnots.forEach((annot) => {\r\n if (annot.name in seenAnnots === false) {\r\n mergedAnnots.push(annot);\r\n seenAnnots[annot.name] = 1;\r\n } else {\r\n if (annot.color === 'purple') {\r\n mergedAnnots = mergedAnnots.map((mergedAnnot) => {\r\n return (annot.name === mergedAnnot.name) ? annot : mergedAnnot;\r\n });\r\n }\r\n }\r\n });\r\n\r\n return mergedAnnots;\r\n}\r\n\r\n/** Filter, sort, draw annots. Move legend. */\r\nfunction finishPlotRelatedGenes(type, ideo) {\r\n setRelatedAnnotDomIds(ideo);\r\n\r\n let annots = deepCopy(ideo.relatedAnnots);\r\n\r\n annots = applyAnnotsIncludeList(annots, ideo);\r\n annots = mergeAnnots(annots);\r\n\r\n // annots = applyRankCutoff(annots, 40, ideo);\r\n ideo.relatedAnnots = mergeAnnots(annots);\r\n // ideo.relatedAnnots = applyRankCutoff(annots, 40, ideo);\r\n // annots.sort(sortByRelatedType);\r\n ideo.relatedAnnots.sort(ideo.annotSortFunction);\r\n\r\n // ideo.relatedAnnots = ideo.relatedAnnots.slice(0, 40);\r\n\r\n if (annots.length > 1 && ideo.onFindRelatedGenesCallback) {\r\n ideo.onFindRelatedGenesCallback();\r\n }\r\n\r\n ideo.drawAnnots(annots);\r\n // const idsToRemove = annots.slice(40).map(a => a.domId);\r\n // if (idsToRemove.length > 0) {\r\n // const selector = '#' + idsToRemove.join(',#')\r\n // document.querySelectorAll(selector).forEach(el => el.remove());\r\n // }\r\n\r\n if (ideo.config.showAnnotLabels) {\r\n ideo.fillAnnotLabels(ideo.relatedAnnots);\r\n }\r\n\r\n moveLegend();\r\n\r\n analyzePlotTimes(type, ideo);\r\n}\r\n\r\n/** Fetch position of searched gene, return corresponding annotation */\r\nasync function processSearchedGene(geneSymbol, ideo) {\r\n const t0 = performance.now();\r\n\r\n const data = await fetchGenes(geneSymbol, 'symbol', ideo);\r\n\r\n if (data.hits.length === 0) {\r\n return;\r\n }\r\n const gene = data.hits.find(hit => {\r\n const genomicPos = getGenomicPos(hit, ideo); // omits alt loci\r\n return genomicPos && genomicPos.ensemblgene;\r\n });\r\n const ensemblId = gene.genomic_pos.ensemblgene;\r\n\r\n // Assign tooltip content. Much of the content is often retrieved from\r\n // the gene cache. In that case, all fields except `name` are fetched\r\n // from cache. Occasionally, e.g. often upon the very first search, no\r\n // content is yet available from cache.\r\n let desc = {description: '', ensemblId, type: 'searched gene'};\r\n if (gene.symbol in ideo.annotDescriptions.annots) {\r\n // Most content already set via cache.\r\n // `name` will be set via non-blocking part of `fetchGenes`.\r\n const oldDesc = ideo.annotDescriptions.annots[gene.symbol];\r\n desc = Object.assign(oldDesc, desc);\r\n } else {\r\n // No content has been set yet via cache. In this case, `gene` already\r\n // has all the data needed for the searched gene's tooltip content.\r\n desc.name = gene.name;\r\n }\r\n\r\n ideo.annotDescriptions.annots[gene.symbol] = desc;\r\n\r\n const annot = parseAnnotFromMgiGene(gene, ideo);\r\n\r\n ideo.relatedAnnots.push(annot);\r\n\r\n ideo.time.rg.searchedGene = timeDiff(t0);\r\n\r\n return annot;\r\n}\r\n\r\nfunction adjustPlaceAndVisibility(ideo) {\r\n var ideoContainerDom = document.querySelector(ideo.config.container);\r\n\r\n ideoContainerDom.style.visibility = '';\r\n ideoContainerDom.style.position = 'absolute';\r\n ideoContainerDom.style.width = '100%';\r\n\r\n var ideoInnerDom = document.querySelector('#_ideogramInnerWrap');\r\n ideoInnerDom.style.position = 'relative';\r\n ideoInnerDom.style.marginLeft = 'auto';\r\n ideoInnerDom.style.marginRight = 'auto';\r\n ideoInnerDom.style.overflowY = 'hidden';\r\n document.querySelector('#_ideogramMiddleWrap').style.overflowY = 'hidden';\r\n\r\n const legendPad = ideo.config.legendPad;\r\n\r\n if (typeof ideo.didAdjustIdeogramLegend === 'undefined') {\r\n // Accounts for moving legend when external content at left or right\r\n // is variable upon first rendering plotted genes\r\n\r\n var ideoDom = document.querySelector('#_ideogram');\r\n const legendWidth = 160;\r\n ideoInnerDom.style.maxWidth =\r\n (\r\n parseInt(ideoInnerDom.style.maxWidth) +\r\n legendWidth +\r\n legendPad\r\n ) + 'px';\r\n\r\n ideoDom.style.minWidth =\r\n (parseInt(ideoDom.style.minWidth) + legendPad) + 'px';\r\n ideoDom.style.maxWidth =\r\n (parseInt(ideoDom.style.minWidth) + legendPad) + 'px';\r\n ideoDom.style.position = 'relative';\r\n ideoDom.style.left = legendWidth + 'px';\r\n\r\n ideo.didAdjustIdeogramLegend = true;\r\n }\r\n}\r\n\r\nfunction sortByPathwayIxn(a, b) {\r\n const aColor = a.color;\r\n const bColor = b.color;\r\n\r\n // Rank red (searched gene) highest\r\n if (aColor === 'red') return -1;\r\n if (bColor === 'red') return 1;\r\n\r\n // Rank not grey above grey\r\n if (aColor === 'grey' && bColor !== 'grey') return 1;\r\n if (bColor === 'grey' && aColor !== 'grey') return -1;\r\n\r\n return a.rank - b.rank;\r\n}\r\n\r\n// async function fetchPathwayGeneAnnots(searchedGene, pathway, ideo) {\r\n// const annots = [];\r\n\r\n// const pathwayIxns =\r\n// await fetchPathwayInteractions(searchedGene.name, pathway.id, ideo);\r\n\r\n// const pathwayGenes = Object.keys(pathwayIxns);\r\n// const data = await fetchGenes(pathwayGenes, 'symbol', ideo);\r\n\r\n// const ixnColors = {\r\n// 'Stimulates': 'green',\r\n// 'Stimulated by': 'green',\r\n// 'Necessarily stimulates': 'green',\r\n// 'Necessarily stimulated by': 'green',\r\n// 'Transcribes / translates': 'brown',\r\n// 'Transcribed / translated by': 'brown',\r\n// 'Inhibits': 'red',\r\n// 'Inhibited by': 'red',\r\n// 'Modifies': 'blue',\r\n// 'Modified by': 'blue',\r\n// 'Acts on': 'blue',\r\n// 'Acted on by': 'blue',\r\n// 'Catalyzes': 'orange',\r\n// 'Catalyzed by': 'orange',\r\n// 'Converts': 'orange',\r\n// 'Converted by': 'orange',\r\n// 'Binds': 'black',\r\n// 'Shares pathway with': 'grey'\r\n// };\r\n\r\n// data.hits.forEach(gene => {\r\n// // If hit lacks position\r\n// // or is same as searched gene (e.g. search for human SRC),\r\n// // then skip processing\r\n// if (\r\n// 'genomic_pos' in gene === false ||\r\n// gene.symbol === searchedGene.name\r\n// ) {\r\n// return;\r\n// }\r\n\r\n// // Account for edge case: cyclic AMP (cAMP) is not \"CAMP\" gene\r\n// if (gene.symbol === 'cAMP') return;\r\n\r\n// const summary = pathwayIxns[gene.symbol];\r\n// const color = ixnColors[summary];\r\n// // if (color !== 'blue') console.log(gene);\r\n\r\n// const annot = parseAnnotFromMgiGene(gene, ideo, color);\r\n// annots.push(annot);\r\n\r\n// const descriptionObj =\r\n// describePathwayGene(gene, searchedGene, pathway, summary);\r\n\r\n// mergeDescriptions(annot, descriptionObj, ideo);\r\n// });\r\n\r\n// ideo.annotSortFunction = sortByPathwayIxn;\r\n\r\n// const sortedAnnots = annots.sort(sortByPathwayIxn).slice(0, 40);\r\n\r\n// return sortedAnnots;\r\n// }\r\n\r\n// /**\r\n// *\r\n// */\r\n// async function plotPathwayGenes(searchedGene, pathway, ideo) {\r\n// const headerTitle = 'Genes in pathway';\r\n// initAnnotDescriptions(ideo, headerTitle);\r\n\r\n// legendPathwayName = pathway.name;\r\n// ideo.config.legend = pathwayLegend;\r\n// writeLegend(ideo);\r\n// moveLegend();\r\n\r\n// ideo.relatedAnnots = [];\r\n\r\n// await processSearchedGene(searchedGene.name, ideo);\r\n\r\n// const annots = await fetchPathwayGeneAnnots(searchedGene, pathway, ideo);\r\n// ideo.relatedAnnots.push(...annots);\r\n// finishPlotRelatedGenes('pathway', ideo);\r\n// }\r\n\r\nfunction initAnnotDescriptions(ideo, headerTitle) {\r\n const organism = ideo.getScientificName(ideo.config.taxid);\r\n const version = Ideogram.version;\r\n const headers = [\r\n `# ${headerTitle}`,\r\n `# Organism: ${organism}`,\r\n `# Generated by Ideogram.js version ${version}, https://github.com/eweitz/ideogram`,\r\n `# Generated at ${window.location.href}`\r\n ].join('\\n');\r\n\r\n delete ideo.annotDescriptions;\r\n ideo.annotDescriptions = {headers, annots: {}};\r\n\r\n}\r\n\r\n/**\r\n * For given gene, finds and draws interacting genes and paralogs\r\n *\r\n * @param geneSymbol {String} Gene symbol, e.g. RAD51\r\n */\r\nasync function plotRelatedGenes(geneSymbol=null) {\r\n\r\n const ideo = this;\r\n\r\n ideo.clearAnnotLabels();\r\n const legend = document.querySelector('#_ideogramLegend');\r\n if (legend) legend.remove();\r\n\r\n if (!geneSymbol) {\r\n return plotGeneHints(ideo);\r\n }\r\n\r\n ideo.config = setRelatedDecorPad(ideo.config);\r\n\r\n initAnnotDescriptions(ideo, `Related genes for ${geneSymbol}`);\r\n\r\n const ideoSel = ideo.selector;\r\n const annotSel = ideoSel + ' .annot';\r\n document.querySelectorAll(annotSel).forEach(el => el.remove());\r\n\r\n ideo.startHideAnnotTooltipTimeout();\r\n\r\n // Refine style\r\n document.querySelectorAll('.chromosome').forEach(chromosome => {\r\n chromosome.style.cursor = '';\r\n });\r\n\r\n adjustPlaceAndVisibility(ideo);\r\n\r\n ideo.relatedAnnots = [];\r\n\r\n // Fetch positon of searched gene\r\n const annot = await processSearchedGene(geneSymbol, ideo);\r\n\r\n if (typeof annot === 'undefined') throwGeneNotFound(geneSymbol, ideo);\r\n\r\n ideo.config.legend = relatedLegend;\r\n writeLegend(ideo);\r\n moveLegend();\r\n\r\n await Promise.all([\r\n processInteractions(annot, ideo),\r\n processParalogs(annot, ideo)\r\n ]);\r\n\r\n ideo.time.rg.total = timeDiff(ideo.time.rg.t0);\r\n\r\n analyzeRelatedGenes(ideo);\r\n\r\n if (ideo.onPlotRelatedGenesCallback) ideo.onPlotRelatedGenesCallback();\r\n}\r\n\r\nfunction getAnnotByName(annotName, ideo) {\r\n var annotByName;\r\n ideo.annots.forEach(annotsByChr => {\r\n annotsByChr.annots.forEach(annot => {\r\n if (annotName === annot.name) {\r\n annotByName = annot;\r\n }\r\n });\r\n });\r\n\r\n if (annotByName === null) {\r\n annotByName = ideo.annotDescriptions.annots[annotName];\r\n }\r\n return annotByName;\r\n}\r\n\r\n// /**\r\n// * Manage click on pathway links in annotation tooltips\r\n// */\r\n// function managePathwayClickHandlers(searchedGene, ideo) {\r\n// setTimeout(function() {\r\n// const pathways = document.querySelectorAll('.ideo-pathway-link');\r\n// if (pathways.length > 0 && !ideo.addedPathwayClickHandler) {\r\n// pathways.forEach(pathway => {\r\n// // pathway.removeEventListener('click', handlePathwayClick);\r\n// pathway.addEventListener('click', function(event) {\r\n// const target = event.target;\r\n// const pathwayId = target.getAttribute('data-pathway-id');\r\n// const pathwayName = target.getAttribute('data-pathway-name');\r\n// const pathway = {id: pathwayId, name: pathwayName};\r\n// plotPathwayGenes(searchedGene, pathway, ideo);\r\n// });\r\n// });\r\n\r\n// // Ensures handler isn't added redundantly. This is used because\r\n// // addEventListener options like {once: true} don't suffice\r\n// // ideo.addedPathwayClickHandler = true;\r\n// }\r\n// }, 100);\r\n// }\r\n\r\n/**\r\n * Handles click within annotation tooltip\r\n *\r\n * Makes clicking link in tooltip behave same as clicking annotation\r\n */\r\nfunction handleTooltipClick(ideo) {\r\n // const tooltip = document.querySelector('._ideogramTooltip');\r\n // if (!ideo.addedTooltipClickHandler) {\r\n // tooltip.addEventListener('click', () => {\r\n // const geneDom = document.querySelector('#ideo-related-gene');\r\n // const annotName = geneDom.textContent;\r\n // const annot = getAnnotByName(annotName, ideo);\r\n // ideo.onClickAnnot(annot);\r\n // });\r\n\r\n // // Ensures handler isn't added redundantly. This is used because\r\n // // addEventListener options like {once: true} don't suffice\r\n // ideo.addedTooltipClickHandler = true;\r\n // }\r\n\r\n const tooltip = document.querySelector('._ideogramTooltip');\r\n if (!ideo.addedTooltipClickHandler) {\r\n tooltip.addEventListener('click', (event) => {\r\n let geneDom = document.querySelector('#ideo-related-gene');\r\n if (!geneDom) {\r\n geneDom = event.target;\r\n }\r\n const annotName = geneDom.textContent;\r\n const annot = getAnnotByName(annotName, ideo);\r\n ideo.onClickAnnot(annot);\r\n });\r\n\r\n // Ensures handler isn't added redundantly. This is used because\r\n // addEventListener options like {once: true} don't suffice\r\n ideo.addedTooltipClickHandler = true;\r\n }\r\n}\r\n\r\n/** Return searched gene from annotation descriptions in Ideogram object */\r\nfunction getSearchedFromDescriptions(ideo) {\r\n return (\r\n Object.entries(ideo.annotDescriptions.annots)\r\n .find(([k, v]) => v.type === 'searched gene')[0]\r\n );\r\n}\r\n\r\n/**\r\n * Enhance tooltip shown on hovering over gene annotation\r\n */\r\nfunction decorateRelatedGene(annot) {\r\n const ideo = this;\r\n if (\r\n annot.name === ideo.prevClickedAnnot?.name &&\r\n ideo.isTooltipCooling\r\n ) {\r\n // Cancels showing tooltip immediately after clicking gene\r\n return null;\r\n }\r\n\r\n const descObj = ideo.annotDescriptions.annots[annot.name];\r\n\r\n if ('type' in descObj && descObj.type.includes('interacting gene')) {\r\n const pathwayIds = descObj.pathwayIds;\r\n // Get symbol of the searched gene, e.g. \"PTEN\"\r\n const searchedGene = getSearchedFromDescriptions(ideo);\r\n\r\n const gpmls = ideo.gpmlsByInteractingGene[annot.name];\r\n\r\n const summary =\r\n summarizeInteractions(annot.name, searchedGene, pathwayIds, gpmls);\r\n if (summary !== null) {\r\n const oldSummary = 'Interacts with';\r\n descObj.description =\r\n descObj.description.replace(oldSummary, summary);\r\n }\r\n }\r\n\r\n const description =\r\n descObj.description.length > 0 ? `
    ${descObj.description}` : '';\r\n const fullName = descObj.name;\r\n const style = 'style=\"color: #0366d6; cursor: pointer;\"';\r\n\r\n let fullNameAndRank = fullName;\r\n if ('rank' in annot) {\r\n const rank = 'Ranked ' + annot.rank + ' in general or scholarly interest';\r\n fullNameAndRank = `${fullName}`;\r\n }\r\n\r\n let originalDisplay =\r\n `${annot.name}
    ` +\r\n `${fullNameAndRank}
    ` +\r\n `${description}` +\r\n `
    `;\r\n\r\n if (annot.name.includes('paralogNeighborhood')) {\r\n\r\n // Rank 1st highest, then put it last as it already has a triangle\r\n // annotation, and is often also labeled.\r\n const sortedParalogs =\r\n descObj.paralogs.sort((a, b) => a.rank - b.rank);\r\n const firstRanked = sortedParalogs.shift(); // Take off first\r\n sortedParalogs.push(firstRanked); // Make it last\r\n\r\n originalDisplay =\r\n 'Paralog neighborhood
    ' +\r\n '
    ' +\r\n descObj.description + ':
    ' +\r\n `${sortedParalogs\r\n .map(paralog => {\r\n let title = '';\r\n if (paralog.fullName) title = paralog.fullName;\r\n if (paralog.rank) {\r\n const rank = paralog.rank;\r\n title += ` Ranked ${rank} in general or scholarly interest`;\r\n }\r\n if (title !== '') title = `title=\"${title}\"`;\r\n return (\r\n `${\r\n paralog.name\r\n }`\r\n );\r\n }).join('
    ')}` +\r\n '
    ';\r\n annot.displayCoordinates = descObj.displayCoordinates;\r\n }\r\n\r\n annot.displayName = originalDisplay;\r\n\r\n handleTooltipClick(ideo);\r\n\r\n // managePathwayClickHandlers(annot, ideo);\r\n\r\n return annot;\r\n}\r\n\r\nconst shape = 'triangle';\r\n\r\nconst legendHeaderStyle =\r\n `font-size: 14px; font-weight: bold; font-color: #333;`;\r\n\r\nconst relatedLegend = [{\r\n name: `\r\n
    \r\n
    Related genes
    \r\n Click gene to search\r\n
    \r\n `,\r\n nameHeight: 50,\r\n rows: [\r\n {name: 'Interacting gene', color: 'purple', shape: shape},\r\n {name: 'Paralogous gene', color: 'pink', shape: shape},\r\n {name: 'Searched gene', color: 'red', shape: shape}\r\n ]\r\n}];\r\n\r\nlet legendPathwayName = '';\r\n\r\nconst pathwayLegend = [{\r\n name: `\r\n
    \r\n
    Related genes
    \r\n Click gene to search\r\n
    \r\n `,\r\n nameHeight: 50,\r\n rows: [\r\n {name: 'Pathway gene', color: 'blue', shape: shape},\r\n {name: 'Searched gene', color: 'red', shape: shape}\r\n ]\r\n}];\r\n\r\nconst citedLegend = [{\r\n name: `\r\n
    \r\n
    Highly cited genes
    \r\n Click gene to search\r\n
    \r\n `,\r\n nameHeight: 30,\r\n rows: []\r\n}];\r\n\r\n/** Sets legendPad for related genes view */\r\nfunction setRelatedDecorPad(kitConfig) {\r\n if (kitConfig.showAnnotLabels) {\r\n kitConfig.legendPad = 70;\r\n } else {\r\n kitConfig.legendPad = 30;\r\n }\r\n return kitConfig;\r\n}\r\n\r\n/**\r\n * Wrapper for Ideogram constructor, with generic \"Related genes\" options\r\n *\r\n * This function is made available as a static method on Ideogram.\r\n *\r\n * @param {Object} config Ideogram configuration object\r\n */\r\nfunction _initRelatedGenes(config, annotsInList) {\r\n\r\n if (annotsInList !== 'all') {\r\n annotsInList = annotsInList.map(name => name.toLowerCase());\r\n }\r\n\r\n const kitDefaults = {\r\n showFullyBanded: false,\r\n rotatable: false,\r\n legend: relatedLegend,\r\n chrBorderColor: '#333',\r\n chrLabelColor: '#333',\r\n onWillShowAnnotTooltip: decorateRelatedGene,\r\n annotsInList: annotsInList,\r\n showTools: true,\r\n showAnnotLabels: true,\r\n showParalogNeighborhoods: true,\r\n chrFillColor: {centromere: '#DAAAAA'},\r\n relatedGenesMode: 'related'\r\n };\r\n\r\n if ('onWillShowAnnotTooltip' in config) {\r\n const key = 'onWillShowAnnotTooltip';\r\n const clientFn = config[key];\r\n const defaultFunction = kitDefaults[key];\r\n const newFunction = function(annot) {\r\n annot = defaultFunction.bind(this)(annot);\r\n annot = clientFn.bind(this)(annot);\r\n return annot;\r\n };\r\n kitDefaults[key] = newFunction;\r\n delete config[key];\r\n }\r\n\r\n // Override kit defaults if client specifies otherwise\r\n let kitConfig = Object.assign(kitDefaults, config);\r\n\r\n kitConfig = setRelatedDecorPad(kitConfig);\r\n\r\n const ideogram = new Ideogram(kitConfig);\r\n\r\n // Called upon completing last plot, including all related genes\r\n if (config.onPlotRelatedGenes) {\r\n ideogram.onPlotRelatedGenesCallback = config.onPlotRelatedGenes;\r\n }\r\n\r\n // Called upon 1) finding paralogs, and 2) finding interacting genes\r\n if (config.onFindRelatedGenes) {\r\n ideogram.onFindRelatedGenesCallback = config.onFindRelatedGenes;\r\n }\r\n\r\n ideogram.getTooltipAnalytics = getRelatedGenesTooltipAnalytics;\r\n\r\n ideogram.annotSortFunction = sortByRelatedType;\r\n\r\n initAnalyzeRelatedGenes(ideogram);\r\n\r\n let cacheDir = null;\r\n if (config.cacheDir) cacheDir = config.cacheDir;\r\n initGeneCache(ideogram.config.organism, ideogram, cacheDir);\r\n initParalogCache(ideogram.config.organism, ideogram, cacheDir);\r\n initInteractionCache(ideogram.config.organism, ideogram, cacheDir);\r\n\r\n return ideogram;\r\n}\r\n\r\nfunction plotGeneHints() {\r\n const ideo = this;\r\n\r\n if (!ideo || 'annotDescriptions' in ideo) return;\r\n\r\n ideo.annotDescriptions = {annots: {}};\r\n\r\n ideo.flattenAnnots().map((annot) => {\r\n let description = [];\r\n if ('significance' in annot && annot.significance !== 'n/a') {\r\n description.push(annot.significance);\r\n }\r\n if ('citations' in annot && annot.citations !== undefined) {\r\n description.push(annot.citations);\r\n }\r\n description = description.join('

    ');\r\n ideo.annotDescriptions.annots[annot.name] = {\r\n description,\r\n name: annot.fullName\r\n };\r\n });\r\n\r\n adjustPlaceAndVisibility(ideo);\r\n moveLegend();\r\n ideo.fillAnnotLabels([]);\r\n const container = ideo.config.container;\r\n document.querySelector(container).style.visibility = '';\r\n}\r\n\r\n/**\r\n * Wrapper for Ideogram constructor, with generic \"Related genes\" options\r\n *\r\n * This function is made available as a static method on Ideogram.\r\n *\r\n * @param {Object} config Ideogram configuration object\r\n */\r\nfunction _initGeneHints(config, annotsInList) {\r\n\r\n delete config.onPlotRelatedGenes;\r\n\r\n if (annotsInList !== 'all') {\r\n annotsInList = annotsInList.map(name => name.toLowerCase());\r\n }\r\n\r\n const annotsPath =\r\n getDir('cache/homo-sapiens-top-genes.tsv');\r\n\r\n const kitDefaults = {\r\n showFullyBanded: false,\r\n rotatable: false,\r\n legend: citedLegend,\r\n chrMargin: -4,\r\n chrBorderColor: '#333',\r\n chrLabelColor: '#333',\r\n onWillShowAnnotTooltip: decorateRelatedGene,\r\n annotsInList: annotsInList,\r\n showTools: true,\r\n showAnnotLabels: true,\r\n showParalogNeighborhoods: true,\r\n onDrawAnnots: plotGeneHints,\r\n annotationsPath: annotsPath,\r\n relatedGenesMode: 'hints'\r\n };\r\n\r\n if ('onWillShowAnnotTooltip' in config) {\r\n const key = 'onWillShowAnnotTooltip';\r\n const clientFn = config[key];\r\n const defaultFunction = kitDefaults[key];\r\n const newFunction = function(annot) {\r\n annot = defaultFunction.bind(this)(annot);\r\n annot = clientFn.bind(this)(annot);\r\n return annot;\r\n };\r\n kitDefaults[key] = newFunction;\r\n delete config[key];\r\n }\r\n\r\n if ('onDrawAnnots' in config) {\r\n const key = 'onDrawAnnots';\r\n const clientFn = config[key];\r\n const defaultFunction = kitDefaults[key];\r\n const newFunction = function() {\r\n defaultFunction.bind(this)();\r\n clientFn.bind(this)();\r\n };\r\n kitDefaults[key] = newFunction;\r\n delete config[key];\r\n }\r\n\r\n // Override kit defaults if client specifies otherwise\r\n const kitConfig = Object.assign(kitDefaults, config);\r\n\r\n if (kitConfig.showAnnotLabels) {\r\n kitConfig.legendPad = 80;\r\n } else {\r\n kitConfig.legendPad = 30;\r\n }\r\n\r\n const ideogram = new Ideogram(kitConfig);\r\n\r\n // Called upon completing last plot, including all related genes\r\n if (config.onPlotRelatedGenes) {\r\n ideogram.onPlotRelatedGenesCallback = config.onPlotRelatedGenes;\r\n }\r\n\r\n // Called upon 1) finding paralogs, and 2) finding interacting genes\r\n if (config.onFindRelatedGenes) {\r\n ideogram.onFindRelatedGenesCallback = config.onFindRelatedGenes;\r\n }\r\n\r\n ideogram.getTooltipAnalytics = getRelatedGenesTooltipAnalytics;\r\n\r\n ideogram.annotSortFunction = sortByRelatedType;\r\n\r\n initAnalyzeRelatedGenes(ideogram);\r\n\r\n let cacheDir = null;\r\n if (config.cacheDir) cacheDir = config.cacheDir;\r\n initGeneCache(ideogram.config.organism, ideogram, cacheDir);\r\n initParalogCache(ideogram.config.organism, ideogram, cacheDir);\r\n initInteractionCache(ideogram.config.organism, ideogram, cacheDir);\r\n\r\n return ideogram;\r\n}\r\n\r\nexport {\r\n _initGeneHints, _initRelatedGenes, plotRelatedGenes, getRelatedGenesByType\r\n};\r\n","/**\r\n * @fileoverview Core module of Ideogram.js, links all other modules\r\n * This file defines the Ideogram class, its constructor method, and its\r\n * static methods. All instance methods are defined in other modules.\r\n *\r\n */\r\n\r\nimport version from './version';\r\n\r\nimport {\r\n configure, initDrawChromosomes, handleRotateOnClick, onLoad,\r\n init, finishInit, writeContainer\r\n} from './init/init';\r\n\r\nimport {\r\n onLoadAnnots, onDrawAnnots, processAnnotData, restoreDefaultTracks,\r\n updateDisplayedTracks, initAnnotSettings, fetchAnnots, drawAnnots,\r\n getHistogramBars, drawHeatmaps, deserializeAnnotsForHeatmap, fillAnnots,\r\n drawProcessedAnnots, drawSynteny, startHideAnnotTooltipTimeout,\r\n showAnnotTooltip, onWillShowAnnotTooltip, setOriginalTrackIndexes,\r\n afterRawAnnots, onClickAnnot, downloadAnnotations, addAnnotLabel,\r\n removeAnnotLabel, fillAnnotLabels, clearAnnotLabels, flattenAnnots\r\n // fadeOutAnnotLabels\r\n} from './annotations/annotations';\r\n\r\nimport {highlight, unhighlight} from './annotations/highlight';\r\n\r\nimport {\r\n esearch, esummary, elink,\r\n getOrganismFromEutils, getTaxids,\r\n getAssemblyAndChromosomesFromEutils\r\n} from './services/services';\r\n\r\nimport {\r\n drawBandLabels, getBandColorGradients, processBandData,\r\n setBandsToShow, hideUnshownBandLabels, drawBandLabelText, drawBandLabelStalk\r\n} from './bands/bands';\r\n\r\nimport {onBrushMove, onBrushEnd, createBrush} from './brush';\r\nimport {onCursorMove, createClickCursor} from './cursor';\r\nimport {drawSexChromosomes, setSexChromosomes} from './sex-chromosomes';\r\nimport {convertBpToPx, convertPxToBp} from './coordinate-converters';\r\nimport {\r\n unpackAnnots, packAnnots, initCrossFilter, filterAnnots\r\n} from './filter';\r\n\r\nimport {\r\n assemblyIsAccession, getDataDir, round, onDidRotate, getSvg, d3,\r\n getTaxid, getCommonName, getScientificName, fetch as _fetch,\r\n isRoman, parseRoman, fetchWithRetry\r\n} from './lib';\r\n\r\nimport {\r\n getChromosomeModel, getChromosomePixels\r\n} from './views/chromosome-model';\r\n\r\nimport {\r\n appendHomolog, drawChromosome, rotateAndToggleDisplay, setOverflowScroll\r\n} from './views/draw-chromosomes';\r\n\r\nimport {\r\n drawChromosomeLabels, rotateChromosomeLabels\r\n} from './views/chromosome-labels.js';\r\n\r\nimport {\r\n _initGeneHints, _initRelatedGenes, plotRelatedGenes, getRelatedGenesByType\r\n} from './kit/related-genes';\r\n\r\nexport default class Ideogram {\r\n constructor(config) {\r\n\r\n // Functions from init.js\r\n this.configure = configure;\r\n this.initDrawChromosomes = initDrawChromosomes;\r\n this.onLoad = onLoad;\r\n this.handleRotateOnClick = handleRotateOnClick;\r\n this.init = init;\r\n this.finishInit = finishInit;\r\n this.writeContainer = writeContainer;\r\n\r\n // Functions from annotations.js\r\n this.onLoadAnnots = onLoadAnnots;\r\n this.onDrawAnnots = onDrawAnnots;\r\n this.processAnnotData = processAnnotData;\r\n this.restoreDefaultTracks = restoreDefaultTracks;\r\n this.updateDisplayedTracks = updateDisplayedTracks;\r\n this.initAnnotSettings = initAnnotSettings;\r\n this.fetchAnnots = fetchAnnots;\r\n this.drawAnnots = drawAnnots;\r\n this.getHistogramBars = getHistogramBars;\r\n this.drawHeatmaps = drawHeatmaps;\r\n this.deserializeAnnotsForHeatmap = deserializeAnnotsForHeatmap;\r\n this.fillAnnots = fillAnnots;\r\n this.drawProcessedAnnots = drawProcessedAnnots;\r\n this.drawSynteny = drawSynteny;\r\n this.startHideAnnotTooltipTimeout = startHideAnnotTooltipTimeout;\r\n this.showAnnotTooltip = showAnnotTooltip;\r\n this.onWillShowAnnotTooltip = onWillShowAnnotTooltip;\r\n this.onClickAnnot = onClickAnnot;\r\n this.setOriginalTrackIndexes = setOriginalTrackIndexes;\r\n this.afterRawAnnots = afterRawAnnots;\r\n this.downloadAnnotations = downloadAnnotations;\r\n this.addAnnotLabel = addAnnotLabel;\r\n this.removeAnnotLabel = removeAnnotLabel;\r\n // this.fadeOutAnnotLabels = fadeOutAnnotLabels;\r\n this.fillAnnotLabels = fillAnnotLabels;\r\n this.clearAnnotLabels = clearAnnotLabels;\r\n this.flattenAnnots = flattenAnnots;\r\n\r\n this.highlight = highlight;\r\n this.unhighlight = unhighlight;\r\n\r\n // Variables and functions from services.js\r\n this.esearch = esearch;\r\n this.esummary = esummary;\r\n this.elink = elink;\r\n this.getOrganismFromEutils = getOrganismFromEutils;\r\n this.getTaxids = getTaxids;\r\n this.getAssemblyAndChromosomesFromEutils =\r\n getAssemblyAndChromosomesFromEutils;\r\n\r\n // Functions from bands.js\r\n this.drawBandLabels = drawBandLabels;\r\n this.getBandColorGradients = getBandColorGradients;\r\n this.processBandData = processBandData;\r\n this.setBandsToShow = setBandsToShow;\r\n this.hideUnshownBandLabels = hideUnshownBandLabels;\r\n this.drawBandLabelText = drawBandLabelText;\r\n this.drawBandLabelStalk = drawBandLabelStalk;\r\n\r\n // Functions from brush.js\r\n this.onBrushMove = onBrushMove;\r\n this.onBrushEnd = onBrushEnd;\r\n this.createBrush = createBrush;\r\n\r\n // Functions from cursor.js\r\n this.createClickCursor = createClickCursor;\r\n this.onCursorMove = onCursorMove;\r\n\r\n // Functions from sex-chromosomes.js\r\n this.drawSexChromosomes = drawSexChromosomes;\r\n this.setSexChromosomes = setSexChromosomes;\r\n\r\n // Functions from coordinate-converters.js\r\n this.convertBpToPx = convertBpToPx;\r\n this.convertPxToBp = convertPxToBp;\r\n\r\n // Functions from filter.js\r\n this.unpackAnnots = unpackAnnots;\r\n this.packAnnots = packAnnots;\r\n this.initCrossFilter = initCrossFilter;\r\n this.filterAnnots = filterAnnots;\r\n\r\n // Functions from lib\r\n this.assemblyIsAccession = assemblyIsAccession;\r\n this.getDataDir = getDataDir;\r\n this.round = round;\r\n this.onDidRotate = onDidRotate;\r\n this.getSvg = getSvg;\r\n this.fetch = _fetch;\r\n this.fetchWithRetry = fetchWithRetry\r\n this.getTaxid = getTaxid;\r\n this.getCommonName = getCommonName;\r\n this.getScientificName = getScientificName;\r\n\r\n // Functions from views/chromosome-model.js\r\n this.getChromosomeModel = getChromosomeModel;\r\n this.getChromosomePixels = getChromosomePixels;\r\n\r\n // Functions from views/chromosome-labels.js\r\n this.drawChromosomeLabels = drawChromosomeLabels;\r\n this.rotateChromosomeLabels = rotateChromosomeLabels;\r\n\r\n // Functions from views/draw-chromosomes.js\r\n this.appendHomolog = appendHomolog;\r\n this.drawChromosome = drawChromosome;\r\n this.rotateAndToggleDisplay = rotateAndToggleDisplay;\r\n this.setOverflowScroll = setOverflowScroll;\r\n\r\n this.plotRelatedGenes = plotRelatedGenes;\r\n this.getRelatedGenesByType = getRelatedGenesByType;\r\n\r\n this.configure(config);\r\n }\r\n\r\n /**\r\n * Get the current version of Ideogram.js\r\n */\r\n static get version() {\r\n return version;\r\n }\r\n\r\n /**\r\n * Enable use of D3 in client apps, via \"d3 = Ideogram.d3\"\r\n */\r\n static get d3() {\r\n return d3;\r\n }\r\n\r\n /**\r\n * Request data from Ensembl REST API\r\n * Docs: https://rest.ensembl.org/\r\n *\r\n * @param {String} path URL path\r\n * @param {Object} body POST body\r\n * @param {String} method HTTP method; 'GET' (default) or 'POST'\r\n */\r\n static async fetchEnsembl(path, body = null, method = 'GET') {\r\n const init = {\r\n method: method\r\n };\r\n if (body !== null) init.body = JSON.stringify(body);\r\n if (method === 'GET') {\r\n // Use HTTP parameter, not header, to avoid needless OPTIONS request\r\n const delimiter = path.includes('&') ? '&' : '?';\r\n path += delimiter + 'content-type=application/json';\r\n } else {\r\n // Method is POST, so content-type must be defined in header\r\n init.headers = {'Content-Type': 'application/json'};\r\n }\r\n\r\n // const random = Math.random();\r\n // console.log(random)\r\n // if (random < 0.5) {\r\n const response = await fetch(`https://rest.ensembl.org${path}`, init);\r\n const json = await response.json();\r\n return json;\r\n // } else {\r\n // // Mock error\r\n // init.headers = {'Content-Type': 'application/json'};\r\n // const response = await fetch('https://httpstat.us/500/cors', init);\r\n // const json = await response.json();\r\n // return json;\r\n // }\r\n }\r\n\r\n /**\r\n * Helper for sortChromosomes().\r\n * Gets names and biological types for diverse chromosome variables\r\n */\r\n static getChrSortNamesAndTypes(a, b) {\r\n var chrAName, chrBName,\r\n aIsCP, bIsCP, aIsMT, bIsMT, aIsAP, bIsAP, aIsNuclear, bIsNuclear;\r\n\r\n if (typeof a === 'string' || 'chr' in a && 'annots' in a) {\r\n // Chromosome data is from either:\r\n // - Ideogram static file cache (e.g. homo-sapiens.json)\r\n // - Ideogram raw annotations\r\n chrAName = (typeof a === 'string') ? a : a.chr;\r\n chrBName = (typeof b === 'string') ? b : b.chr;\r\n\r\n aIsCP = chrAName === 'CP';\r\n bIsCP = chrBName === 'CP';\r\n aIsMT = chrAName === 'MT';\r\n bIsMT = chrBName === 'MT';\r\n aIsAP = chrAName === 'AP';\r\n bIsAP = chrBName === 'AP';\r\n aIsNuclear = (!aIsCP && !aIsMT && !aIsAP);\r\n bIsNuclear = (!bIsCP && !bIsMT && !bIsAP);\r\n } else {\r\n // Chromosome data is from NCBI E-Utils web API\r\n chrAName = a.name;\r\n chrBName = b.name;\r\n\r\n aIsCP = a.type === 'chloroplast';\r\n bIsCP = b.type === 'chloroplast';\r\n aIsMT = a.type === 'mitochondrion';\r\n bIsMT = b.type === 'mitochondrion';\r\n aIsAP = a.type === 'apicoplast';\r\n bIsAP = b.type === 'apicoplast';\r\n aIsNuclear = a.type === 'nuclear';\r\n bIsNuclear = b.type === 'nuclear';\r\n }\r\n\r\n const chrTypes = {\r\n aIsNuclear, bIsNuclear, aIsCP, bIsCP, aIsMT, bIsMT, aIsAP, bIsAP\r\n };\r\n\r\n return [chrAName, chrBName, chrTypes];\r\n }\r\n\r\n /**\r\n * Sorts two chromosome objects by type and name\r\n * - Nuclear chromosomes come before non-nuclear chromosomes.\r\n * - Among nuclear chromosomes, use \"natural sorting\", e.g.\r\n * numbers come before letters\r\n * - Among non-nuclear chromosomes, i.e. \"MT\" (mitochondrial DNA) and\r\n * \"CP\" (chromoplast DNA), MT comes first\r\n *\r\n * @param a Chromosome string or object \"A\"\r\n * @param b Chromosome string or object \"B\"\r\n * @returns {Number} JavaScript sort order indicator\r\n */\r\n static sortChromosomes(a, b) {\r\n\r\n let [chrAName, chrBName, chrTypes] =\r\n Ideogram.getChrSortNamesAndTypes(a, b);\r\n\r\n const {\r\n aIsNuclear, bIsNuclear, aIsCP, bIsCP, aIsMT, bIsMT, aIsAP, bIsAP\r\n } = chrTypes;\r\n\r\n if (aIsNuclear && bIsNuclear) {\r\n\r\n if (isRoman(chrAName) && isRoman(chrBName)) {\r\n // As in yeast genome\r\n chrAName = parseRoman(chrAName).toString();\r\n chrBName = parseRoman(chrBName).toString();\r\n }\r\n\r\n return chrAName.localeCompare(chrBName, 'en', {numeric: true});\r\n } else if (!aIsNuclear && bIsNuclear) {\r\n return 1;\r\n } else if (aIsMT && bIsCP) {\r\n return 1;\r\n } else if (aIsCP && bIsMT) {\r\n return -1;\r\n } else if (!aIsAP && !aIsMT && !aIsCP && (bIsMT || bIsCP || bIsAP)) {\r\n return -1;\r\n }\r\n }\r\n\r\n /**\r\n * Wrapper for Ideogram constructor, with generic \"Related genes\" options\r\n *\r\n * @param {Object} config Ideogram configuration object\r\n */\r\n static initRelatedGenes(config, annotsInList='all') {\r\n return _initRelatedGenes(config, annotsInList);\r\n }\r\n\r\n /**\r\n * Wrapper for Ideogram constructor, with generic \"Related genes\" options\r\n *\r\n * @param {Object} config Ideogram configuration object\r\n */\r\n static initGeneHints(config, annotsInList='all') {\r\n return _initGeneHints(config, annotsInList);\r\n }\r\n}\r\n","var version = '1.37.0';\r\nexport default version;\r\n","import Ideogram from './ideogram';\r\n\r\n// Enable references to Ideogram when loaded via traditional script tag\r\nwindow.Ideogram = Ideogram;\r\n\r\n// Enable references to Ideogram when imported as an ES6 module\r\nexport default Ideogram;\r\n"],"names":["root","factory","exports","module","define","amd","a","i","self","__webpack_require__","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","Symbol","toStringTag","value","none","selector","this","querySelector","x","Array","from","empty","querySelectorAll","matches","childMatcher","node","find","childFirst","firstElementChild","filter","children","update","length","EnterNode","parent","datum","ownerDocument","namespaceURI","_next","_parent","__data__","bindIndex","group","enter","exit","data","groupLength","dataLength","bindKey","keyValue","nodeByKeyValue","Map","keyValues","has","set","delete","ascending","b","NaN","constructor","appendChild","child","insertBefore","next","xhtml","svg","xlink","xml","xmlns","name","prefix","indexOf","slice","namespaces","space","local","attrRemove","removeAttribute","attrRemoveNS","fullname","removeAttributeNS","attrConstant","setAttribute","attrConstantNS","setAttributeNS","attrFunction","v","apply","arguments","attrFunctionNS","defaultView","document","styleRemove","style","removeProperty","styleConstant","priority","setProperty","styleFunction","styleValue","getPropertyValue","getComputedStyle","propertyRemove","propertyConstant","propertyFunction","classArray","string","trim","split","classList","ClassList","_node","_names","getAttribute","classedAdd","names","list","n","add","classedRemove","remove","classedTrue","classedFalse","classedFunction","textRemove","textContent","textConstant","textFunction","htmlRemove","innerHTML","htmlConstant","htmlFunction","raise","nextSibling","parentNode","lower","previousSibling","firstChild","creatorInherit","uri","documentElement","createElement","createElementNS","creatorFixed","namespace","constantNull","removeChild","selection_cloneShallow","clone","cloneNode","selection_cloneDeep","parseTypenames","typenames","map","t","type","onRemove","typename","on","__on","j","m","removeEventListener","listener","options","onAdd","event","contextListener","addEventListener","push","dispatchEvent","params","window","CustomEvent","createEvent","initEvent","bubbles","cancelable","detail","dispatchConstant","dispatchFunction","join","splice","contains","Selection","groups","parents","_groups","_parents","selection","select","subgroups","subnode","subgroup","selectAll","array","arrayAll","selectorAll","selectChild","match","childFind","selectChildren","childrenFilter","matcher","bind","enterGroup","updateGroup","exitGroup","previous","i0","i1","_enter","_exit","sparse","onenter","onupdate","onexit","append","merge","order","Error","groups0","groups1","m0","m1","Math","min","merges","group0","group1","compareDocumentPosition","sort","compare","compareNode","sortgroups","sortgroup","callback","nodes","size","each","attr","getAttributeNS","property","classed","text","html","create","creator","insert","before","deep","dispatch","iterator","responseBlob","response","ok","status","statusText","blob","input","init","fetch","then","responseArrayBuffer","arrayBuffer","EOL","EOF","objectConverter","columns","Function","JSON","stringify","inferColumns","rows","columnSet","forEach","row","column","pad","width","s","delimiter","reFormat","RegExp","DELIMITER","charCodeAt","parseRows","f","N","I","eof","eol","token","c","replace","preformatBody","formatValue","formatRow","Date","date","year","hours","getUTCHours","minutes","getUTCMinutes","seconds","getUTCSeconds","milliseconds","getUTCMilliseconds","isNaN","getUTCFullYear","getUTCMonth","getUTCDate","formatDate","test","parse","convert","object","customConverter","format","concat","formatBody","formatRows","csv","dsv","csvParse","tsv","tsvParse","responseText","dsvParse","undefined","Promise","resolve","reject","image","Image","onerror","onload","src","responseJson","json","parser","DOMParser","parseFromString","noop","_","Dispatch","types","T","copy","that","args","preventDefault","stopImmediatePropagation","view","noevent","__noselect","MozUserSelect","yesdrag","noclick","setTimeout","extend","Color","darker","brighter","reI","reN","reP","reHex","reRgbInteger","reRgbPercent","reRgbaInteger","reRgbaPercent","reHslPercent","reHslaPercent","named","aliceblue","antiquewhite","aqua","aquamarine","azure","beige","bisque","black","blanchedalmond","blue","blueviolet","brown","burlywood","cadetblue","chartreuse","chocolate","coral","cornflowerblue","cornsilk","crimson","cyan","darkblue","darkcyan","darkgoldenrod","darkgray","darkgreen","darkgrey","darkkhaki","darkmagenta","darkolivegreen","darkorange","darkorchid","darkred","darksalmon","darkseagreen","darkslateblue","darkslategray","darkslategrey","darkturquoise","darkviolet","deeppink","deepskyblue","dimgray","dimgrey","dodgerblue","firebrick","floralwhite","forestgreen","fuchsia","gainsboro","ghostwhite","gold","goldenrod","gray","green","greenyellow","grey","honeydew","hotpink","indianred","indigo","ivory","khaki","lavender","lavenderblush","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrodyellow","lightgray","lightgreen","lightgrey","lightpink","lightsalmon","lightseagreen","lightskyblue","lightslategray","lightslategrey","lightsteelblue","lightyellow","lime","limegreen","linen","magenta","maroon","mediumaquamarine","mediumblue","mediumorchid","mediumpurple","mediumseagreen","mediumslateblue","mediumspringgreen","mediumturquoise","mediumvioletred","midnightblue","mintcream","mistyrose","moccasin","navajowhite","navy","oldlace","olive","olivedrab","orange","orangered","orchid","palegoldenrod","palegreen","paleturquoise","palevioletred","papayawhip","peachpuff","peru","pink","plum","powderblue","purple","rebeccapurple","red","rosybrown","royalblue","saddlebrown","salmon","sandybrown","seagreen","seashell","sienna","silver","skyblue","slateblue","slategray","slategrey","snow","springgreen","steelblue","tan","teal","thistle","tomato","turquoise","violet","wheat","white","whitesmoke","yellow","yellowgreen","color_formatHex","rgb","formatHex","color_formatRgb","formatRgb","color","l","toLowerCase","exec","parseInt","rgbn","Rgb","rgba","hsla","r","g","rgbConvert","opacity","rgb_formatHex","hex","rgb_formatRgb","max","round","toString","h","Hsl","hslConvert","hsl2rgb","m2","basis","t1","v0","v1","v2","v3","t2","t3","channels","assign","displayable","formatHsl","k","pow","nogamma","d","linear","rgbGamma","y","exponential","gamma","start","end","rgbSpline","spline","colors","genericArray","nb","na","setTime","values","floor","reA","reB","source","am","bm","bs","bi","lastIndex","q","index","number","one","zero","ArrayBuffer","isView","DataView","isArray","valueOf","sourceEvent","currentTarget","ownerSVGElement","createSVGPoint","point","clientX","clientY","matrixTransform","getScreenCTM","inverse","getBoundingClientRect","rect","left","clientLeft","top","clientTop","pageX","pageY","taskHead","taskTail","timeout","interval","clockLast","clockNow","clockSkew","clock","performance","now","setFrame","requestAnimationFrame","clearNow","Timer","_call","_time","timer","delay","time","restart","wake","e","timerFlush","t0","Infinity","sleep","nap","poke","clearTimeout","clearInterval","setInterval","elapsed","stop","TypeError","emptyOn","emptyTween","id","timing","schedules","__transition","tween","state","tick","duration","ease","schedule","active","svgNode","degrees","PI","identity","translateX","translateY","rotate","skewX","scaleX","scaleY","sqrt","atan2","atan","interpolateTransform","pxComma","pxParen","degParen","pop","xa","ya","xb","yb","translate","scale","interpolateTransformCss","DOMMatrix","WebKitCSSMatrix","isIdentity","decompose","interpolateTransformSvg","transform","baseVal","consolidate","matrix","tweenRemove","tween0","tween1","tweenFunction","tweenValue","transition","_id","interpolate","value1","string00","interpolate0","string1","string0","string10","attrInterpolate","attrInterpolateNS","attrTweenNS","_value","attrTween","delayFunction","delayConstant","durationFunction","durationConstant","easeConstant","onFunction","on0","on1","sit","every","styleInterpolate","styleTween","textInterpolate","textTween","_name","newId","selection_prototype","inherit","id0","id1","styleNull","listener0","styleMaybeRemove","removeFunction","easeVarying","cancel","interrupt","defaultTiming","BrushEvent","target","mode","defineProperties","configurable","MODE_DRAG","MODE_SPACE","MODE_HANDLE","MODE_CENTER","abs","number1","number2","X","handles","output","xy","Y","XY","cursors","overlay","w","nw","ne","se","sw","flipX","flipY","signsX","signsY","defaultFilter","ctrlKey","button","defaultExtent","hasAttribute","viewBox","height","defaultTouchable","navigator","maxTouchPoints","__brush","extent","brushSelection","dim","brushX","brushY","touchending","touchable","keys","listeners","handleSize","brush","initialize","handle","redraw","started","touchmoved","touchended","emitter","clean","emit","Emitter","touches","w0","w1","n0","n1","e0","e1","s0","s1","moving","lockX","lockY","metaKey","altKey","signX","signY","W","E","S","dx","dy","shifting","shiftKey","points","identifier","pointer","point0","pts","move","beforestart","moved","ended","keydowned","keyupped","p","changedTouches","cur","keyCode","selection0","selection1","clear","starting","keyModifiers","formatDecimalParts","toExponential","coefficient","prefixExponent","re","formatSpecifier","specifier","FormatSpecifier","fill","align","sign","symbol","comma","precision","exponent","toFixed","toLocaleString","toPrecision","formatRounded","toUpperCase","formatPrefix","prefixes","locale","grouping","thousands","Number","substring","reverse","currencyPrefix","currency","currencySuffix","decimal","numerals","formatNumerals","String","percent","minus","nan","newFormat","formatTypes","suffix","formatType","maybeSuffix","valuePrefix","valueSuffix","valueNegative","out","formatTrim","padding","defaultLocale","step","e10","e5","e2","tickIncrement","count","power","log","LN10","error","delta","lo","hi","mid","ascendingComparator","center","right","ascendingBisect","bisector","bisectRight","unit","normalize","bimap","domain","range","d0","d1","r0","r1","polymap","bisect","clamp","unknown","continuous","untransform","piecewise","rescale","invert","rangeRound","u","transformer","initRange","linearish","ticks","isFinite","ceil","tickFormat","step0","step1","tickStep","precisionPrefix","precisionRound","precisionFixed","nice","prestep","maxIter","staticColors","organismMetadata","commonName","scientificName","assemblies","default","GRCh38","GRCh37","NCBI36","hasGeneCache","hasParalogCache","hasInteractionCache","GRCm38","MGSCv37","TAIR10","R64","GCA_000002765","d3","d3fetch","d3brush","d3dispatch","d3format","assemblyIsAccession","config","assembly","getDir","dir","script","tmp","ideogramInLeaf","scripts","version","Ideogram","location","pathname","includes","fetchWithRetry","url","isRetry","getDataDir","coord","onDidRotate","chrModel","onDidRotateCallback","getSvg","fetchWithAuth","contentType","headers","Headers","accessToken","Authorization","getEarlyTaxid","slug","taxid","organism","getTaxid","organisms","getCommonName","getScientificName","isRoman","parseRoman","val","M","D","C","L","V","reduce","aa","getFont","ideo","family","fontFamily","annotLabelSize","getTextSize","font","context","canvas","getContext","metrics","measureText","actualBoundingBoxRight","actualBoundingBoxLeft","actualBoundingBoxAscent","actualBoundingBoxDescent","deepCopy","scaleLinear","valueof","configuredCss","configure","chromosomesArray","coordinateSystem","maxLength","bp","iscn","chromosomes","numChromosomes","debug","dataDir","container","resolution","orientation","showChromosomeLabels","showNonNuclearChromosomes","chromosomeScale","showTools","ploidy","sexChromosomes","sex","ancestors","P","ploidyDesc","configurePloidy","showBandLabels","showFullyBanded","bandsToShow","bandData","configureBands","chrHeight","configureHeight","chrWidth","configureWidth","geometry","chrMargin","configureMargin","onLoad","onLoadCallback","onLoadAnnots","onLoadAnnotsCallback","onDrawAnnots","onDrawAnnotsCallback","onBrushMove","onBrushMoveCallback","onBrushEnd","onBrushEndCallback","onCursorMove","onCursorMoveCallback","onWillShowAnnotTooltip","onWillShowAnnotTooltipCallback","onClickAnnot","onClickAnnotCallback","configureCallbacks","organismsWithBands","configureOrganisms","bump","adjustedBump","configureBump","chromosome","rotatable","configureSingleChromosome","chrLabelSize","chrLabelColor","configureTextStyle","initAnnotSettings","annotationsLayout","annotTracksHeight","chrSets","yOffsets","annotLabelHeight","demarcateCollinearChromosomes","prevChr","prevWidth","seenTaxids","getYOffsets","chrSet","chrLabelX","adjustedX","orgIndex","taxids","labelSpan","labelGenomes","rearrangeChromosomes","multiorganism","maxHeight","xOffsets","annotHeight","annotationHeight","numAnnotTracks","getXOffsets","adjustedY","chrLabelY","org","maxWidth","collinearizeVerticalChromosomes","processAnnots","rawAnnots","setOriginalTrackIndexes","annotationsDisplayedTracks","annots","updateDisplayedTracks","processAnnotData","filterable","initCrossFilter","drawProcessedAnnots","finishInit","t0A","getTime","confAnnots","annotations","initDrawChromosomes","annotationsPath","checkAnnotData","waitForAndProcessAnnots","chrID","t0C","t1C","hideUnshownBandLabels","console","rotateChromosomeLabels","drawChromosomeLabels","processLabels","createBrush","cursorPosition","createClickCursor","drawAnnots","afterRawAnnots","t1A","reportDebugTimings","setOverflowScroll","collinearizeChromosomes","Ploidy","_config","_description","_normalize","getChromosomesNumber","setIndex","chrSetCode","description","descValue","normalized","existence","_getexistenceArray","getSetSize","chrSetIndex","getAncestor","chrIndex","exists","armIndex","desc","ChromosomeUtil","getLabel","getSetLabel","_ideo","_ploidy","_translate","chrSetMargin","_tickSize","_isRotated","_getLeftMargin","margin","_getYScale","getChromosomeLabels","chrElement","util","labels","getChromosomeBandLabelTranslate","band","tickSize","px","didRotate","chrName","bands","oldWidth","chrSetElement","getChromosomeModel","drawChromosome","handleRotateOnClick","displayedTrackIndexes","drawBandLabels","otherChrs","ideoBounds","labelSelectors","chrHeightOriginal","chrWidthOriginal","annotationHeightOriginal","rotateBack","_layout","rotateForward","elementLength","windowLength","_class","innerWidth","innerHeight","getChromosomeLabelClass","_getAdditionalOffset","numTracks","annotationsNumTracks","_getChromosomeSetSize","getChromosomeSetLabelAnchor","getChromosomeLabelYPosition","getChromosomeSetLabelYPosition","Layout","super","getChromosomeScale","getChromosomeScaleBack","getChromosomeSetTranslate","getHeight","getWidth","getChromosomeBandTickY1","getChromosomeBandTickY2","getChromosomeSetLabelTranslate","getChromosomeBandLabelAnchor","ideoBox","chrBox","getChromosomeSetYTranslate","barWidth","legendPad","prevTranslate","getChromosomeSetLabelXPosition","getChromosomeLabelXPosition","xOffset","lastSetOffset","setSize","chromosomeSetYTranslate","chrs","numChrs","chrsPerRow","yOffset","additionalPadding","writeContainer","fetchAnnots","setPloidy","perspective","PairedLayout","SmallLayout","VerticalLayout","HorizontalLayout","getLayout","svgClass","getContainerSvgClass","getBandColorGradients","writeContainerDom","isOnlyIdeogram","writeTooltipContainer","lastBandDataUrl","getBandUrl","bandDataFileNames","isHeterogameticChromosome","prepareChromosomes","bandsArray","setCoordinateSystem","chrBands","chr","setSexChromosomes","_gotChrModels","element","rotateAndToggleDisplay","getBandFileName","accession","bandFileName","getBandFileNames","bandFileNames","isCustomOrganism","prepareContainer","bandDataUrl","hasNonGenBankAssembly","shouldFetchBands","numBandDataResponses","rawBands","fileNames","fetchedTaxid","fileName","setBandData","fetchBands","processBandData","ideoNext","ideoQueued","ideoWait","containerId","getOrganismFromEutils","getTaxids","initializeTaxids","organismScientificName","promises","all","taxidsAndBandsArrays","taxidAndBandsArray","getBandsAndPrepareContainer","BedParser","bed","parseBed","componentToHex","parseGenomicCoordinates","ucscStyle","parseAnnotFromTsvLine","tsvLine","annot","label","rgbToHex","parseRawAnnots","bedStartIndex","tsvLines","line","TsvParser","parseTsv","getValueColumnIndex","headerLine","header","fullName","significance","citations","tsvStartIndex","citeIndex","fromTo","annotsByChr","reservedTrackKeys","defaultHeatmapColors","getLabels","heatmaps","metadata","trackLabels","inflateThresholds","thresholds","heatmapThresholds","shouldUseThresholdColor","numThresholds","prevThreshold","threshold","getHeatmapAnnotColor","thresholdList","tvNum","thresholdColor","parseFloat","writeCanvases","chrLeft","trackLeft","trackWidth","contextArray","fillCanvasAnnots","demarcateChrs","trackIndex","fillStyle","startPx","fillRect","fillCanvasAnnotValues","ideoMarginTop","add2dAnnotsForChr","omittedAnnots","ra","stopPx","convertBpToPx","shift","startHideTrackLabelTimeout","showTrackLabel","hideTrackLabelTimeout","ideoHeight","drawHeatmaps","annotContainers","prevX","xBump","showChromosomesLabels","labelContainer","markBump","renderTrackLabels","writeTrackLabels","drawHeatmapsCollinear","writeCanvas","drawHeatmaps2d","writeTrackLabelContainer","trackCanvas","firstTrackId","trackBox","labelBox","getTrackLabelOffsets","getNewRawAnnots","heatmapKeyIndexes","newRa","newRas","deserializeAnnotsForHeatmap","rawAnnotsContainer","newRaContainers","heatmapKey","rawAnnotBoxes","raContainer","getNewRawAnnotContainers","reportPerformance","hideAnnotTooltip","startHideAnnotTooltipTimeout","showAnnotTooltip","hideAnnotTooltipTimeout","isTooltipCooling","hideAnnotTooltipCounter","prevClickedAnnot","content","tooltip","cx","cy","prevTooltipAnnotName","displayCoordinates","displayName","getContentAndYOffset","renderTooltip","getAnnotDomLabelId","domId","changeAnnotState","labelId","annotId","triggerAnnotEvent","annotElement","parentElement","prevTooltipOff","prevTooltipAnnotDomId","_ideoActiveTimeout","getAnnotByName","annotName","found","thisAnnot","getAnnotLabelLayout","annotDom","annotRect","ideoRect","bottom","addAnnotLabel","backgroundColor","borderColor","layout","didSetLabelStyle","insertAdjacentHTML","renderLabel","fillAnnotLabels","sortedAnnots","clearAnnotLabels","spacedAnnots","spacedLayouts","flattenAnnots","some","sl","xOverlap","oLeft","nLeft","oRight","nRight","getIsXOverlap","yOverlap","oTop","nTop","oBottom","nBottom","getIsYOverlap","numLabels","relatedGenesMode","annotSortFunction","removeAnnotLabel","getHistogramBars","chrModels","bars","isFirstGet","histogramScaling","setIdeoHistogramScaling","maxAnnotsPerBar","lastBand","numBins","bar","convertPxToBp","annotationsColor","getRawBars","chrAnnots","barAnnots","barPx","nextBarPx","assignAnnotsToBars","maxAnnotsPerBarAllChrs","barCount","setIdeoMaxAnnotsPerBar","barCountRatio","ideoIsRotated","setProportionalBarHeight","reportGetHistogramBarPerformance","legendStyle","getIcon","icon","shape","getListItems","nameHeight","lineHeight","getLineHeight","writeLegend","legend","nameStyle","lineHeightCss","friendlyAnnots","keep","isOtherLayout","rawAnnot","parseFriendlyAnnots","parseFriendlyKeys","processedAnnots","annotsOther","chrAnnot","numAnnots","warn","warnIfTooManyAnnots","filledAnnots","getChrAnnotNodes","fillAnnots","shapes","triangle","circle","rectangle","getShapes","determineShape","writeTrackAnnots","x1","x2","writeOverlayAnnots","chrWidths","y1","y2","thisChrWidth","getHistogramPoints","writeHistogramAnnots","drawAnnotsByLayoutType","writeSyntenicRegion","syntenies","regionID","activeRegion","others","writeSyntenicRegionPolygons","syntenicRegion","r2","regions","writeSyntenicRegionPolygonsHorizontal","getRegionsR1AndR2","r1Offset","r2Offset","r1ChrDom","r1GenomeHorizontalXOffset","getCTM","r1GenomeVerticalXOffset","r2ChrDom","r2GenomeHorizontalXOffset","r2GenomeVerticalXOffset","writeSyntenicRegionLines","stroke","writeSyntenicRegionLabels","regionId","rangeIds","r1Width","drawSynteny","syntenicRegions","writeSyntenicRegions","drawSyntenyCollinear","drawSyntenyCollinearHorizontal","restoreDefaultTracks","trackIndexes","displayedRawAnnotsByChr","displayedAnnots","getDisplayedRawAnnotsByChr","setAnnotsByChr","setAnnots","trackIndexOriginal","numAvailTracks","getSetAnnotsByChr","colorMap","addAnnot","annotationTracks","annotTrack","addClientAnnot","addSparseServerAnnot","addBasicClientAnnot","getAnnotDomId","annotIndex","addAnnotsForChr","shouldAssignDomId","setAnnotRanks","warnOfUndefinedChromosome","addAnnots","unorderedAnnots","orderAnnotContainers","numOmittedTracks","sendTrackAndAnnotWarnings","ExpressionMatrixParser","setRawAnnots","fetchCoordinates","coordinates","parseExpressionMatrix","ensemblData","gene","expressions","cells","downloadAnnotations","annotDescriptions","ensemblId","annotsTsv","annotsHref","encodeURIComponent","evt","MouseEvent","body","initAnnotHeight","localAnnotationsPath","initNumTracksAndBarWidth","initTooltip","onWillAddAnnotLabel","onWillAddAnnotLabelCallback","initAnnotLabel","sortChromosomes","displayedTracks","inflateHeatmaps","seen","duplicates","detectDuplicateChrsInRawAnnots","accumulator","annotsUrl","is2dHeatmap","extension","alert","validateAnnotsUrl","rawAnnotsResponse","chrArray","ranks","geneCache","interestingNames","rank","highlight","chrNames","highlightsHtml","chrId","chrDom","unhighlight","highlightsSelector","getTaxidFromEutils","orgName","taxonomySearch","esearch","esearchresult","idlist","esummary","result","commonname","setAssemblyAndChromosomes","originalChrs","filteredChrs","urlOrg","getAssemblyAndChromosomesFromEutils","chromosomesUrl","promise2","catch","errorMessage","chrData","splitBand","asmAndChrTaxidsArray","seenChrs","setTaxidData","asmChrTaxidsArray","isOrganismSupported","ideoOrg","getTaxidsForOrganismsInConfig","tmpChrs","chrsOrgSlugs","orgs","promise","getTaxidFromEutilsPromises","augmentedOrganismMetadata","orgNameAndTaxid","warning","customMetadata","populateNonNativeOrg","orgMetadata","orgFields","prepareTmpChrsAndTaxids","asmAccs","asmAndChrPromises","configOrganisms","sortedTaxids","sortTaxidsByOriginalOrganismOption","taxidInit","getIsMultiorganism","getTaxidsForOrganismsNotInConfig","parseChromosome","genome","cnIndex","subtype","subname","parseMitochondrion","parseChloroplastOrPlastid","parseApicoplast","substr","parseNuclear","getChrNameAndType","slen","assemblyAccession","asmSearchUrl","termStem","getAssemblySearchUrl","asmUid","asmSummaryUrl","fetchAssemblySummary","uids","qs","elink","webenv","linksets","getESearchUrlForChromosomes","esearchUrl","ids","ntSummary","fetchNucleotideSummary","results","seenChrId","parseChromosomes","rejectedReason","getPrevRight","prevLabelXRight","prevHiddenBoxIndex","textOffsets","updateShown","indexesToShow","overlapRight","prevRight","isBefore","hiddenIndex","doSkip","getIndexesToShow","offsets","textsLength","setBandsToShow","selectorsToShow","ithLength","drawBandLabelText","bandsToLabel","drawBandLabelStalk","getChrModels","getStainAndColors","gradients","stain","color1","color2","color3","getGradients","updateLines","lines","getStain","getLineObject","shouldSkipBand","chrsAreList","chrNotInList","thisChr","getBandsArray","bandsByChr","chrLength","setChromosomesByTaxid","chrBandsArray","updateChromosomes","getDelimiterTsvLinesAndInit","parseBands","setChrsByTaxidsWithBands","to","chrLengthBp","bpDomain","pxRange","nameSplit","fromToSplit","refineGenomicCoordinates","cm","getChrModel","getBasePairDomainAndPixelRange","xScale","selectedRegion","setBrush","setSelectedRegion","x0","writeBrush","position","cursorBrush","setCursorPosition","newPosition","offsetX","setCursor","drawSexChromosomes","sexChromosomeIndexes","sciLength","sci","homologIndex","appendHomolog","sexChrs","iscnStart","iscnLength","bpStart","bpStop","bpLength","pxStart","pxLength","getPx","throwBpToPxError","getBp","iscnStop","pxStop","throwPxToBpError","array8","arrayUntyped","array16","array32","arrayLengthen","arrayLengthenUntyped","arrayWiden","arrayWidenUntyped","bitarray","subarrays","masks","Uint8Array","Uint16Array","Uint32Array","lengthen","len","offset","dest","truncate","zeroExcept","zeroExceptMask","mask","only","onlyExcept","onlyOffset","onlyOne","heap_by","heap","sift","by","heapselect_by","queue","bisect_by","reg","path","REMOVED_INDEX","crossfilter","heapselect","permute","filters","removeData","dimension","groupAll","allFiltered","onChange","isElementFiltered","filterListeners","dataListeners","removeDataListeners","callbacks","newData","triggerOnChange","predicate","newIndex","removed","usePred","shouldRemove","index1","index2","index3","index4","maskForDimensions","dimensions","ignore_dimensions","iterable","accessorPath","newValues","iterablesIndexCount","iterablesIndexFilterStatus","refilterFunction","filterValue","filterValuePresent","filterAll","filterRange","filterFunction","filterExact","currentFilter","hasCurrentFilter","top_offset","hi0","toSkip","lo0","iterablesEmptyRows","bottom_offset","orderNatural","dispose","accessor","sortRange","cr_range","A","B","refilter","indexListeners","dimensionGroups","unshift","preAdd","postAdd","newIterablesIndexCount","newIterablesIndexFilterStatus","cr_index","unsortedIndex","sortMap","bounds","lo1","hi1","old_n0","oldValues","oldIndex","oldIterablesIndexFilterStatus","oldiiclength","index5","reIndex","oldDataIndex","filterIndexBounds","filterIndexFunction","added","valueIndexAdded","valueIndexRemoved","newAdded","newRemoved","indexLength","reduceCount","reduceSum","groupIndex","reduceAdd","reduceRemove","reduceInitial","n0old","groupWidth","groupCapacity","capacity","reset","resetNeeded","g0","oldGroups","initial","k0","groupIncrement","updateMany","resetMany","updateOne","resetOne","oldK","seenGroups","filterOne","filterOffset","notFilter","reduceValue","cb","eventName","unpackAnnots","unpackedAnnots","packAnnots","facet","annotsByFacet","facets","filterAnnots","filterSelections","filteredAnnots","selections","counts","fn","getFilteredResults","getChromosomePixels","hasBands","csLength","cs","pcenIndex","getPixelAndOtherData","getChrScale","getChrModelScaffold","fullChromosomeLabels","centromerePosition","firstBand","smallLength","getCentromerePosition","deleteExtraneousBands","deactivate","items","item","closeTools","display","handleToolClick","toolHeaders","toolHeader","trigger","getTrigger","tool","panel","getPanel","toElement","toId","panelElement","handleHideForHoverables","ideoSvg","canvasId","ideoSvgClone","getElementById","ctx","setTransform","imageSmoothingEnabled","XMLSerializer","serializeToString","domUrl","URL","webkitURL","img","svgBlob","Blob","createObjectURL","imgUrl","drawImage","revokeObjectURL","toDataURL","downloadPng","closeButton","initTools","elements","outsideClickListener","clickedOutsideCount","removeClickListener","hideOnClickOutside","handleGearClick","gear","showGearOnIdeogramHover","ModelAdapter","model","_model","ModelNoBandsAdapter","getModel","getCssClass","isMT","getArmColor","armColors","_getPolyploidArmColor","getBorderColor","chrBorderColor","getFillColor","chrFillColor","arm","centromere","ancestor","Range","_data","getColor","_getColor","Chromosome","adapter","_adapter","_color","_bumpCoefficient","TelocentricPChromosome","TelocentricQChromosome","MetacentricChromosome","_addPArmShape","clipPath","isPArmRendered","_getPArmShape","_addQArmShape","isQArmRendered","_getQArmShape","render","isFullyBanded","centromereFill","_renderArm","_renderRangeSet","fillColor","class","strokeWidth","rangeSet","rangesContainer","_getShapeData","firstQBand","rightTerminalPosition","x3","x2b","_renderBands","Boolean","_pArmOffset","_qArmOffset","homologOffset","defs","getInstance","numChrsInSet","chrSetSelector","ideoWidth","ideoInnerWrap","ideoMiddleWrap","ploidyPad","textElement","getChrSetLabelLines","fullLabels","renderChromosomeSetLabel","appendChromosomeSetLabels","appendChromosomeLabels","labelPosAttrs","scaleSvg","getLabelPositionAttrs","chrMargin2","updateChrIndex","rotateVerticalChromosomeLabels","tracksHeight","rotateHorizontalChromosomeLabels","u8","u16","u32","fleb","fdeb","clim","freb","eb","_a","fl","revfl","_b","fd","rev","hMap","cd","mb","co","le","rvb","sv","r_1","flt","fdt","bits","bits16","slc","BYTES_PER_ELEMENT","subarray","ec","err","ind","msg","nt","code","captureStackTrace","inflt","dat","buf","st","noBuf","noSt","cbuf","bl","nbuf","final","pos","bt","lm","dm","lbt","dbt","tbts","flrm","fdrm","hLit","hcLen","tl","ldt","clt","clb","clbmsk","clm","lt","dt","lms","dms","lpos","sym","dsym","et","gunzipSync","flg","zs","gzs","unzlibSync","decompressSync","inflateSync","td","TextDecoder","decode","stream","strFromU8","latin1","fromCharCode","dutf8","timeDiff","initAnalyzeRelatedGenes","rg","_didRelatedGenesFirstPlot","getRelatedGenesByType","relatedGenes","related","paralogous","interacting","searched","entries","entry","getRelatedGenesTooltipAnalytics","timeSincePrevTooltip","prevAnnotDomId","tooltipGene","tooltipRelatedType","countsByType","getCountsByType","numRelatedGenes","numParalogs","numInteractingGenes","searchedGene","perfTimes","getEnsemblId","ensemblPrefix","slimEnsemblId","padLength","padStart","async","cacheFetch","decompressedUrl","cache","rawResponse","decompressedResponse","Response","put","initGeneCache","cacheDir","startTime","parseOrgMetadata","caches","open","cacheUrl","getCacheUrl","fetchStartTime","fetchEndTime","nameCaseMap","namesById","fullNamesById","idsByName","idsByFullName","lociByName","lociById","rawTsv","preAnnots","rawTsvSplit","rawStart","rawLength","rawFullName","decodeURIComponent","locus","parseCacheLoop","annotsSortedByPosition","parseAnnots","parseCache","total","initParalogCache","paralogCache","paralogsByName","geneSlimId","paralogs","paralogSuperList","geneId","slimEnsemblIds","slimId","initInteractionCache","hasinteractionCache","interactionCache","interactionsByName","rawJson","desluggedOrg","ixnLists","compressedIxn","slimPwId","fields","species","queueMicrotask","interactionArrowMap","getIxnTypeReference","ixnsByPwid","ixns","ixnType","getMatches","gpml","genes","matchedLabel","textLabel","graphId","groupRef","geneGraphIds","groupSelectors","ggr","geneGroups","groupId","geneGroupGraphIds","parseNameAndEnsemblIdFromMgiGene","genomic_pos","ensemblgene","throwGeneNotFound","geneSymbol","fetchGenes","queryStringBase","hits","isSymbol","locusMap","nameMap","nameLc","hit","fetchGenesFromCache","fromGeneCache","queryString","fetchMyGeneInfo","fetchInteractionAnnots","interactions","symbols","parseAnnotFromMgiGene","descriptionObj","pathwayIds","pathwayNames","ixnsDescription","links","ixn","pathwayId","describeInteractions","mergeDescriptions","pathwayIdsByInteractingGene","descObj","gpmlsByInteractingGene","ixnGene","gpmlUrl","rawGpml","fetchGpml","fetchGpmls","getGenomicPos","genomicPos","moveLegend","ideoInnerDom","setRelatedDecorPad","prepend","processInteractions","seenNameIds","orgNameSimple","upperGene","uint8Array","interaction","rawIxns","sortedRawIxns","sortAnnotsByRank","rawIxn","normRawIxn","nameId","isRelevant","isGeneSymbol","maybeGeneSymbol","isInteractionRelevant","fetchInteractions","relatedAnnots","finishPlotRelatedGenes","processParalogs","homologs","nameUc","fetchEnsembl","homologies","ensemblIds","homolog","fetchParalogPositionsFromMyGeneInfo","fetchParalogs","showParalogNeighborhoods","neighborhoods","starts","startJInt","overlayAnnotLength","getSearchedFromDescriptions","neighborhoodAnnots","neighborhood","annotStart","annotStop","paralog","overplotParalogs","sortByRelatedType","aName","bName","aColor","bColor","mergedDesc","descriptions","otherDesc","mergeAnnots","unmergedAnnots","seenAnnots","mergedAnnots","mergedAnnot","updated","sortedChrNames","seenNames","relevanceSortedAnnotsNamesByChr","annotNames","setRelatedAnnotDomIds","annotsInList","includedAnnots","applyAnnotsIncludeList","onFindRelatedGenesCallback","showAnnotLabels","otherType","numThisRelated","numOtherRelated","timestampFirstPlot","totalLastPlotDiff","totalFirstPlot","_relatedGenesFirstPlotType","analyzePlotTimes","adjustPlaceAndVisibility","ideoContainerDom","visibility","marginLeft","marginRight","overflowY","didAdjustIdeogramLegend","ideoDom","legendWidth","minWidth","plotRelatedGenes","plotGeneHints","headerTitle","href","initAnnotDescriptions","annotSel","el","cursor","oldDesc","processSearchedGene","relatedLegend","timeTotal","timeTotalFirstPlot","timeTotalLastPlotDiff","timeParalogs","timeInteractingGenes","timeSearchedGene","firstPlotType","analytics","relatedGenesAnalytics","analyzeRelatedGenes","onPlotRelatedGenesCallback","decorateRelatedGene","gpmls","summary","interactingGene","searchedGeneGraphIds","interactingGeneGraphIds","ie","matchingGraphIds","graphIds","graphicsXml","graphic","endGraphRefs","numMatchingPoints","isConnectedToSourceGene","searchedGeneIndex","nodeName","graphRef","arrowHead","isStart","parseInteractionGraphic","detailInteractions","detailAllInteractions","enrichedIxns","isSameByPwid","isSame","isDirectionSameByPwid","isDirectionSame","directionsByPwid","ixnTypeReference","pwid","isRefMatch","thisIsSame","thisIxnTypeReference","determineIxnsInPathwayAreSame","setIsSame","leftTypes","rightTypes","directedTypes","firstIxnType","directionReference","isPwDirectionSame","pwFirstIxnType","pwDirectionReference","direction","summarizeByDirection","summarizeInteractions","oldSummary","fullNameAndRank","originalDisplay","sortedParalogs","firstRanked","title","addedTooltipClickHandler","geneDom","annotByName","handleTooltipClick","legendHeaderStyle","citedLegend","kitConfig","eutils","_fetch","method","chrAName","chrBName","aIsCP","bIsCP","aIsMT","bIsMT","aIsAP","bIsAP","aIsNuclear","bIsNuclear","chrTypes","getChrSortNamesAndTypes","localeCompare","numeric","kitDefaults","clientFn","defaultFunction","newFunction","ideogram","onPlotRelatedGenes","onFindRelatedGenes","getTooltipAnalytics","_initRelatedGenes","annotsPath","_initGeneHints"],"sourceRoot":""} \ No newline at end of file diff --git a/src/js/init/configure.js b/src/js/init/configure.js index d1372339..2f63169a 100644 --- a/src/js/init/configure.js +++ b/src/js/init/configure.js @@ -95,7 +95,7 @@ function configureSingleChromosome(config, ideo) { function configureOrganisms(config, ideo) { ideo.organisms = Object.assign({}, organismMetadata); if (config.taxid && config.organismMetadata) ideo.organisms[config.taxid] = config.organismMetadata - ideo.organismsWithBands = Object.assign({}, organismMetadata); + ideo.organismsWithBands = Object.assign({}, ideo.organisms); } function configureCallbacks(config, ideo) { diff --git a/src/js/services/organisms.js b/src/js/services/organisms.js index 1377eb2c..7fa38b4d 100644 --- a/src/js/services/organisms.js +++ b/src/js/services/organisms.js @@ -71,7 +71,7 @@ function setTaxidData(taxid, ideo) { return fetchWithRetry(chromosomesUrl) .then(response => { return response.json().then(function(json) { - resolve(json.chrBands); + resolve(json); }); }) .catch((errorMessage) => { @@ -80,17 +80,18 @@ function setTaxidData(taxid, ideo) { }); return promise2 - .then(function(chrBands) { + .then(function(chrData) { // Check if chromosome data exists locally. // This is used for pre-processed centromere data, // which is not accessible via EUtils. See get_chromosomes.py. + var chrBands = chrData.chrBands var asmAndChrTaxidsArray = [''], chromosomes = [], seenChrs = {}, chr, maxLength, splitBand, length; - ideo.bandData[taxid] = chrBands; + ideo.bandData[chrData.taxid] = chrBands; for (var i = 0; i < chrBands.length; i++) { splitBand = chrBands[i].split(' ');