jbrowse-plugin-graphgenomeviewer 6.0.2 → 6.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunks/{GbzBaseSyntenyAdapter-MB7NQPOZ.js → GbzBaseSyntenyAdapter-WDWGGJLA.js} +2 -2
- package/dist/chunks/{GbzBaseSyntenyAdapter-MB7NQPOZ.js.map → GbzBaseSyntenyAdapter-WDWGGJLA.js.map} +1 -1
- package/dist/chunks/{GraphGenomeView-QAJUST4R.js → GraphGenomeView-PTYYXWL7.js} +2 -2
- package/dist/chunks/{GraphTrackSettingsDialog-CLI6V424.js → GraphTrackSettingsDialog-DCV2WZXB.js} +2 -2
- package/dist/chunks/{LinearGraphDisplay-2ZCJVTOZ.js → LinearGraphDisplay-GQPROPEZ.js} +2 -2
- package/dist/chunks/{MinigraphBubbleAdapter-5AQXW2NH.js → MinigraphBubbleAdapter-JKMI26BD.js} +2 -2
- package/dist/chunks/{RgfaTabixAdapter-P3RQBV2A.js → RgfaTabixAdapter-CNC5EQ2T.js} +2 -2
- package/dist/chunks/{bandage-layout-3AR6BCUD-7PXT4PRO.js → bandage-layout-3AR6BCUD-U43ZCEP3.js} +1 -1
- package/dist/chunks/{bandage-layout-3AR6BCUD-7PXT4PRO.js.map → bandage-layout-3AR6BCUD-U43ZCEP3.js.map} +1 -1
- package/dist/chunks/{chunk-6YAGPYAT.js → chunk-2YL4SV2L.js} +1 -1
- package/dist/chunks/{chunk-6YAGPYAT.js.map → chunk-2YL4SV2L.js.map} +1 -1
- package/dist/chunks/{chunk-XYYKXQ73.js → chunk-5UJF6DC5.js} +2 -2
- package/dist/chunks/{chunk-XYYKXQ73.js.map → chunk-5UJF6DC5.js.map} +1 -1
- package/dist/chunks/{chunk-NRYLVZMG.js → chunk-7LS5K57B.js} +2 -2
- package/dist/chunks/{chunk-NRYLVZMG.js.map → chunk-7LS5K57B.js.map} +1 -1
- package/dist/chunks/{chunk-X7R52TDL.js → chunk-AILRF3IW.js} +1 -1
- package/dist/chunks/{chunk-X7R52TDL.js.map → chunk-AILRF3IW.js.map} +1 -1
- package/dist/chunks/{chunk-TIMQMQZE.js → chunk-IJ6KQTLA.js} +1 -1
- package/dist/chunks/{chunk-TIMQMQZE.js.map → chunk-IJ6KQTLA.js.map} +1 -1
- package/dist/chunks/{chunk-5TCH4S5W.js → chunk-MRFLLKCN.js} +2 -2
- package/dist/chunks/{chunk-5TCH4S5W.js.map → chunk-MRFLLKCN.js.map} +1 -1
- package/dist/chunks/{chunk-3TODQETZ.js → chunk-TIUPQO6O.js} +2 -2
- package/dist/chunks/{chunk-KTZHBWBF.js → chunk-TZOITL4Y.js} +2 -2
- package/dist/chunks/{chunk-KTZHBWBF.js.map → chunk-TZOITL4Y.js.map} +1 -1
- package/dist/chunks/{chunk-XEY4OTQ5.js → chunk-VKCLNLCM.js} +1 -1
- package/dist/chunks/{chunk-XEY4OTQ5.js.map → chunk-VKCLNLCM.js.map} +1 -1
- package/dist/chunks/{chunk-Y5WX5MAD.js → chunk-Z2Z4MO5P.js} +2 -2
- package/dist/jbrowse-plugin-graphgenomeviewer.esm.js +5 -5
- package/dist/jbrowse-plugin-graphgenomeviewer.esm.js.map +4 -4
- package/package.json +2 -2
- package/src/version.ts +1 -1
- /package/dist/chunks/{GraphGenomeView-QAJUST4R.js.map → GraphGenomeView-PTYYXWL7.js.map} +0 -0
- /package/dist/chunks/{GraphTrackSettingsDialog-CLI6V424.js.map → GraphTrackSettingsDialog-DCV2WZXB.js.map} +0 -0
- /package/dist/chunks/{LinearGraphDisplay-2ZCJVTOZ.js.map → LinearGraphDisplay-GQPROPEZ.js.map} +0 -0
- /package/dist/chunks/{MinigraphBubbleAdapter-5AQXW2NH.js.map → MinigraphBubbleAdapter-JKMI26BD.js.map} +0 -0
- /package/dist/chunks/{RgfaTabixAdapter-P3RQBV2A.js.map → RgfaTabixAdapter-CNC5EQ2T.js.map} +0 -0
- /package/dist/chunks/{chunk-3TODQETZ.js.map → chunk-TIUPQO6O.js.map} +0 -0
- /package/dist/chunks/{chunk-Y5WX5MAD.js.map → chunk-Z2Z4MO5P.js.map} +0 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import{a as dn,b as pn,c as un,d as mn,e as ln,n as ft}from"./chunks/chunk-
|
|
2
|
-
`)){let r=n.endsWith("\r")?n.slice(0,-1):n;if(r.startsWith("H")){let[,...o]=r.split(" ");t.header.push(Je(o))}else if(r.startsWith("S")){let[,o,...a]=r.split(" "),i,s,c,d=!1,m=a[0]??"*";/^\d+$/.test(m)?(i=+m,s=a[1]??"*",c=a.slice(2)):(d=!0,s=m,i=s==="*"?0:s.length,c=a.slice(1));let g=Je(c);d&&"LN"in g&&(i=+g.LN),t.nodes.push({id:o,length:i,sequence:s,tags:g})}else if(r.startsWith("E")){let[,,o,a,,,,,i,...s]=r.split(" ");o&&a&&t.links.push({source:o.slice(0,-1),target:a.slice(0,-1),strand1:o.at(-1),strand2:a.at(-1),cigar:i??"*",tags:Je(s)})}else if(r.startsWith("L")){let[,o,a,i,s,c,...d]=r.split(" ");o&&i&&s&&t.links.push({source:o,target:i,strand1:a,strand2:s,cigar:c??"*",tags:Je(d)})}else if(r.startsWith("W")){let[,o,a,i,s,c,d,...m]=r.split(" ");o&&a&&i&&s&&c&&d&&t.walks.push({sample:o,haplotype:+a,contig:i,start:s==="*"?-1:+s,end:c==="*"?-1:+c,segments:Tc(d),tags:Je(m)})}else if(r.startsWith("P")){let[,o,a,...i]=r.split(" ");o&&a&&t.paths.push({name:o,path:a,rest:i})}}return t}function vc(e){let t=new Map,n=new Map;function r(a,i){t.has(a)||t.set(a,i)}function o(a,i){r(a,i),n.set(a,(n.get(a)??0)+1)}for(let a of e.links)r(a.source,a.strand1==="-"?"-":"+"),r(a.target,a.strand2==="-"?"-":"+");for(let a of e.paths)for(let i of a.path.split(","))o(i.slice(0,-1),i.endsWith("-")?"-":"+");for(let a of e.walks)for(let i of a.segments)o(i.id,i.strand==="-"?"-":"+");return{canonical:t,traversals:n}}var Va=e=>e.start===-1?0:e.start;function Ac(e){return[...e.paths.map(t=>({...K(t.name),steps:t.path.split(",").map(n=>({id:n.slice(0,-1),strand:n.endsWith("-")?"-":"+"}))})),...e.walks.map(t=>({name:`${t.sample}#${t.haplotype}#${t.contig}`,start:Va(t),steps:t.segments.map(n=>({id:n.id,strand:n.strand==="-"?"-":"+"}))}))]}function Nc(e){let t=e.tags.SM;if(typeof t!="string")return;let n=t.split(",").map(r=>r.trim()).filter(Boolean);return n.length>0?n:void 0}var Ze=e=>typeof e=="number"&&e>0?e:void 0;function Pc({tags:e,length:t}){let n=Ze(e.RC)??Ze(e.FC)??Ze(e.KC);return Ze(e.dp)??Ze(e.DP)??(n!==void 0&&t>0?n/t:void 0)}function Gc(e,t,n){return{id:`${e.id}${t}`,name:e.id,length:e.length,depth:n,stable:Fa(e),samples:Nc(e)}}function _a(e,t="Imported GFA"){let n=[],r=[],{canonical:o,traversals:a}=vc(e),i=u=>`${u}${o.get(u)??"+"}`;for(let u of e.nodes){let y=Pc(u)??Math.max(a.get(u.id)??1,1);n.push(Gc(u,o.get(u.id)??"+",y))}for(let u of e.links)r.push({from:i(u.source),to:i(u.target),fromStrand:u.strand1==="-"?"-":"+",toStrand:u.strand2==="-"?"-":"+"});let s=[],c=new Map,d=(u,y)=>[u,y].sort().join("--");function m(u,y){for(let x=0;x<u.length-1;x++){let k=d(u[x],u[x+1]);c.has(k)||c.set(k,new Set),c.get(k).add(y)}}for(let u of e.paths){let y=u.path.split(",").map(x=>i(x.slice(0,-1)));s.push({name:u.name,nodeIds:y,start:K(u.name).start}),m(y,u.name)}for(let u of e.walks){let y=u.segments.map(k=>i(k.id)),x=`${u.sample}#${u.haplotype}#${u.contig}`;s.push({name:x,nodeIds:y,start:Va(u),sample:u.sample,haplotype:u.haplotype,contig:u.contig}),m(y,x)}for(let u of r){let y=c.get(d(u.from,u.to));y&&y.size>0&&(u.pathIds=[...y])}let g=new Map(e.nodes.map(u=>[u.id,u.length])),p=e.paths.length>0||e.walks.length>0?gn(Ac(e),u=>g.get(u)??0):void 0;return{name:t,nodes:n,edges:r,paths:s.length>0?s:void 0,anchorPaths:p?.anchorPaths,pathVisits:p?.pathVisits,anchoredBy:n.some(u=>u.stable)?"tags":void 0}}var Cc="\0deletion:",Ic=.5;function Da(e,t){let n=new Map(t.map(o=>[o.edgeIndex,`${Cc}${o.edgeIndex}`])),r=[];return e.edges.forEach((o,a)=>{let i=n.get(a);if(i===void 0)r.push(o);else{let{fromStrand:s,toStrand:c}=o;r.push({from:o.from,to:i,...s?{fromStrand:s}:{}},{from:i,to:o.to,...c?{toStrand:c}:{}})}}),{graph:{...e,nodes:[...e.nodes,...[...n.values()].map(o=>({id:o,name:o,length:0,depth:0}))],edges:r},routes:n,ids:new Set(n.values())}}function Oa(e,t,n,r,o){let a=new Map(e.nodes.map(i=>[i.id,i.length]));return t.map(i=>{let s=i.bypassed.reduce((m,g)=>m+(a.get(g)??0),0),c=Math.max(o.minimumNodeLength,r(s)*Ic),d=n.get(i.edgeIndex);return{id:d,name:d,length:Math.round(c*1e6/o.nodeLengthPerMegabase),depth:0}})}function Wa(e,t){let n={...e},r={};for(let[o,a]of t){let i=n[a];delete n[a],i?.length&&(r[o]=i)}return{nodePositions:n,deletionRoutes:r}}function Fn(e,t,n={}){let r=fn(_a($a(e),t),n.referencePath);if(r.nodes.length===0)throw new Error(`No graph segments in ${t}`);if(n.maxNodes!==void 0&&r.nodes.length>n.maxNodes)throw new Error(`Graph too large to draw: ${r.nodes.length.toLocaleString()} nodes (limit ${n.maxNodes.toLocaleString()}). Zoom in to a smaller region, or raise maxGraphNodes on this view.`);return r}var Ec=15;function Ha(e,t,n){let r=e.nodes.some(V),o={...t,opts:{...t.opts,edgeLength:t.opts.edgeLength*(n.spacing??1)}};return{graph:{nodes:r?Ea(e,o):o.nodes,edges:e.edges},options:{quality:n.quality,linearLayout:n.linearLayout,...o.opts,componentSeparation:Ec*(n.componentSeparation??1),...r?{rotateComponents:!1}:{}}}}function $n(e,t){let n=e.nodes.some(V);return`${t.quality}|${t.linearLayout}|${t.bubbleSpread}|${t.spacing??1}|${t.componentSeparation??1}|${n}|${e.referencePath??""}`}async function Vn(e,t,n){let r=xo(t.bubbleSpread),o=be(e),a=Da(e,o),i=eo(a.graph,a.ids),s={...i.graph,nodes:i.graph.nodes.filter(k=>!a.ids.has(k.id))},c=Sn(s,r),{result:d,duration:m}=await n(Ha(i.graph,{...c,nodes:[...c.nodes,...Oa(e,o,a.routes,wo(s,r),c.opts)]},t)),g=Sn(e,r),p=new Map(g.nodes.map(k=>[k.id,Tt(g.opts,k.length)])),u=to(d.nodePositions,i.runs,k=>p.get(k)??0),{nodePositions:y,deletionRoutes:x}=Wa(e.nodes.some(V)?Ca(e,u):u,a.routes);return{result:{...d,nodePositions:y,stranded:!0,...o.length?{deletionRoutes:x,extent:_n(x)}:{}},duration:m}}function _n(e){let t=1/0,n=1/0,r=-1/0,o=-1/0;for(let a of Object.values(e))for(let i of a)t=Math.min(t,i.x),n=Math.min(n,i.y),r=Math.max(r,i.x),o=Math.max(o,i.y);return{minX:t,minY:n,maxX:r,maxY:o}}var $=40,Bc=1e-6,Fc=100;function Pe(e){return Math.max(Bc,Math.min(Fc,e))}function _t(e,t,n,r=$){let o=t-e.h*n;return r-e.minY*n+Math.max(0,o)/2}function Ge(e,t,n,r,{minScale:o=0,padLeft:a=$,padTop:i=$,padRight:s=$,padBottom:c=$}={}){let d=t-a-s,m=n-i-c;if(d<=0||m<=0||!(e.w>0||!r&&e.h>0))return;let g=e.w>0?d/e.w:1/0,p=e.h>0?m/e.h:1/0,u=Pe(Math.max(o,r?g:Math.min(g,p))),y=d-e.w*u;return{scale:u,translateX:a-e.minX*u+Math.max(0,y)/2,translateY:_t(e,m,r?1:u,i)}}function Qe(e,t={}){let{minX:n,minY:r,maxX:o,maxY:a}=_n(e.nodePositions),{region:i}=t;e.referenceAxis&&i&&i.end>i.start&&(n=i.start,o=i.end);let s=t.extent??e.extent;return s&&(n=Math.min(n,s.minX??n),r=Math.min(r,s.minY??r),o=Math.max(o,s.maxX??o),a=Math.max(a,s.maxY??a)),{minX:n,minY:r,w:o-n,h:a-r}}function ke(e,t){return{scaleX:e,scaleY:t?1:e,pixelRows:t}}function Dn(e,t,n,r){return{minX:-e.translateX/t.scaleX,minY:-e.translateY/t.scaleY,maxX:(n-e.translateX)/t.scaleX,maxY:(r-e.translateY)/t.scaleY}}function On(e,t){let n=(e.maxX-e.minX)*t,r=(e.maxY-e.minY)*t;return{minX:e.minX-n,minY:e.minY-r,maxX:e.maxX+n,maxY:e.maxY+r}}function Wn(e,t){return t.minX>=e.minX&&t.maxX<=e.maxX&&t.minY>=e.minY&&t.maxY<=e.maxY}function Hn(e,t,n,r,o){let a=Pe(e.scale*t),i=a/e.scale;return{scale:a,translateX:n-(n-e.translateX)*i,translateY:o?e.translateY:r-(r-e.translateY)*i}}var M=w(re(),1),Ka=w(Xa(),1);var xe=w(re(),1);function za(e){return t=>e.includes(t)?t:void 0}function jn(e){return xe.types.snapshotProcessor(xe.types.maybe(xe.types.enumeration(e)),{preProcessor:za(e)})}function Xn(e,t){return xe.types.snapshotProcessor(xe.types.optional(xe.types.enumeration(e),t),{preProcessor:za(e)})}var qa=600,Ot=160,Wt=[1,1,1,1],Ht=[.12,.12,.12,1],Ja=([e,t,n])=>`rgb(${[e,t,n].map(r=>Math.round(r*255)).join(", ")})`,Za=5,Ce=new Set(["tubemap","tubemapref"]),Qa=(0,Ua.lazy)(()=>import("./chunks/ChooseWalksDialog-GVQLSGHX.js")),zn=12,ei=[{value:"",label:"Off"},{value:"walk",label:"A panel per walk"},{value:"sample",label:"A row per sample, a column per haplotype"}],$c=M.types.snapshotProcessor(M.types.model("GraphFacet",{field:M.types.optional(M.types.enumeration(["","walk","sample"]),""),domain:M.types.optional(M.types.frozen(),[]),columns:M.types.maybe(M.types.number)}),{preProcessor:e=>Nt(e)}),ti=[{bp:0,label:"None"},{bp:3,label:"Under 3 bp"},{bp:10,label:"Under 10 bp"},{bp:50,label:"Under 50 bp, leaving structural variants"},{bp:1e3,label:"Under 1 kb"}],Ya=".segs.bed.gz";function ni(e){if(typeof e.uri=="string")return e.uri;let n=e.segmentsLocation?.uri;return typeof n=="string"&&n.endsWith(Ya)?n.slice(0,-Ya.length):void 0}var Yn=1.4,ri=1.6,oi=150,ai=1,Un=40,Kn={nodeStrokes:[],nodeStrokeRuns:new Map,arrows:[],arrowRuns:new Map,edgeCurves:[],edgeCurveRuns:new Map};function ue(...e){}var et=5e6;function Se(e){return e>=1e6?`${+(e/1e6).toFixed(1)} Mb`:`${Math.round(e/1e3)} kb`}var ii=2e4;function Ie(e){return e&&"uri"in e&&e.uri?new URL(e.uri,e.baseUri??window.location.href).href:void 0}function qn(e){return e.builtViewport!==void 0&&e.paintedViewport===e.builtViewport&&e.builtViewport.viewportDirty===e.viewportDirty&&!e.viewportRebuildPending}function tt(e){let{width:t,height:n}=e.viewBox;return Dn(e,e.axisScale,t,n)}var Dt=new WeakMap,Vc=4;function si(e){let t=Dt.get(e);return t||(t=new Map,Dt.set(e,t)),t}function ci(e,t){let n=Dt.get(e);n&&e!==t&&Dt.set(t,n)}function di(e,t,n){e.size>=Vc&&e.delete(e.keys().next().value),e.set(t,n)}var pi=M.types.compose("GraphPane",(0,Ka.RenderLifecycleMixin)(),M.types.model({layoutQuality:M.types.optional(M.types.number,2),linearLayout:M.types.optional(M.types.boolean,!1),layoutMode:jn(xt),colorScheme:jn(St),bubbleSpread:Xn(ko,"auto"),nodeWidth:Xn(uo,"depth"),showBubbles:M.types.optional(M.types.boolean,!1),showDeletionEdges:M.types.optional(M.types.boolean,!0),showGenes:M.types.optional(M.types.boolean,!0),showReferenceStrip:M.types.optional(M.types.boolean,!0),tubeMapFold:M.types.optional(M.types.number,0),geneTrackId:M.types.optional(M.types.string,""),repeatTrackId:M.types.optional(M.types.string,""),repeatKey:M.types.optional(M.types.string,""),walkRowSamples:M.types.maybe(M.types.frozen()),walkStrip:M.types.optional(M.types.boolean,!1),walkLayers:M.types.optional(M.types.frozen(),[]),facet:M.types.optional($c,{}),referencePath:M.types.optional(M.types.string,""),showPerf:M.types.optional(M.types.boolean,!1),contigThickness:M.types.optional(M.types.number,6),connectorThickness:M.types.optional(M.types.number,2),darkMode:M.types.optional(M.types.boolean,!1),scale:M.types.optional(M.types.number,1),translateX:M.types.optional(M.types.number,0),translateY:M.types.optional(M.types.number,0),drawPaths:M.types.optional(M.types.boolean,!1),paneHeight:M.types.maybe(M.types.number),maxGraphNodes:M.types.optional(M.types.number,ii),colorDomain:M.types.maybe(M.types.frozen()),connectedViewId:M.types.maybe(M.types.string)})).volatile(()=>({graph:void 0,graphRegion:void 0,loadedReferencePath:void 0,layoutResult:void 0,legendSize:{width:0,height:0},indexBubbles:void 0,geneTrackFeatures:void 0,walkGeneFeatures:void 0,repeatArrays:void 0,popStack:[],error:void 0,isLoading:!1,loadCanceled:!1,statusMessage:"",hoveredNode:null,hoveredRowWalks:[],hoveredBubble:null,pointerInPane:!1,stripHover:null,hoveredEdge:null,selectedNode:null,viewportDirty:0,positionsVersion:0,geometryVersion:0,builtViewport:void 0,paintedViewport:void 0,draggingNode:null,isPanning:!1,viewportOwner:"fit",viewportDirtyTimer:void 0,positionsDirtyFrame:0,lastFetchMs:void 0,readsShown:void 0,lastLayoutMs:void 0,lastGeometryMs:void 0,lastGeometryStrokeCount:void 0,viewportRebuildPending:!1}));var is=w(ae(),1),me=w(re(),1),O=w(bt(),1);function Jn(e,t){let n=new Set(t),r=e.nodes.filter(c=>n.has(c.name)),o=new Set(r.map(c=>c.id)),a=new Map(e.nodes.map(c=>[c.id,c.length])),i=new Map,s=e.paths?.flatMap(c=>{let d=c.nodeIds.findIndex(p=>o.has(p));if(d<0)return[];let m=c.nodeIds.filter(p=>o.has(p));i.set(c.name,{first:d,nodeIds:m});let g=c.nodeIds.slice(0,d).reduce((p,u)=>p+(a.get(u)??0),0);return[{...c,nodeIds:m,...c.start===void 0?{}:{start:c.start+g}}]});return{name:e.name,nodes:r,edges:e.edges.filter(c=>o.has(c.from)&&o.has(c.to)),...s?.length?{paths:s}:{},anchorPaths:_e(e,i),pathVisits:e.pathVisits,anchoredBy:e.anchoredBy,referencePath:e.referencePath}}function ui(e,t){let n=new Set(e.nodes.filter(c=>V(c)&&jr(c,t)).map(c=>c.id)),r=e.paths??[];if(n.size===0||r.length===0)return e;let o=r.map(c=>{let d=-1,m=-1;return c.nodeIds.forEach((g,p)=>{n.has(g)&&(d<0&&(d=p),m=p)}),d<0?void 0:{first:d,last:m}});if(o.every((c,d)=>c?.first===0&&c.last===r[d].nodeIds.length-1))return e;let a=new Set,i=[],s=new Map;return r.forEach((c,d)=>{let m=o[d];if(m){let g=c.nodeIds.slice(m.first,m.last+1);for(let p of g)a.add(p);i.push({...c,nodeIds:g}),s.set(c.name,{first:m.first,nodeIds:g})}}),{...e,nodes:e.nodes.filter(c=>a.has(c.id)),edges:e.edges.filter(c=>a.has(c.from)&&a.has(c.to)),paths:i,pathVisits:e.pathVisits&&_c(e.pathVisits,r,o,new Map(e.nodes.map(c=>[c.id,c.name]))),anchorPaths:_e(e,s)}}function _c(e,t,n,r){let o=new Map,a=new Map;return t.forEach((i,s)=>{let c=K(i.name).name,d=n[s];i.nodeIds.forEach((m,g)=>{let p=r.get(m)??m,u=e.get(p);if(!u)return;let y=`${c} ${p}`,x=o.get(y)??0;for(;x<u.length&&u[x].path!==c;)x++;let k=u[x];if(o.set(y,x+1),k&&d&&g>=d.first&&g<=d.last){let h=a.get(p);h?h.push(k):a.set(p,[k])}})}),a}function Dc(e,t,n){let r=K(e.name).name,o=new Map,a=[],i=()=>({a:-1/0,b:1/0,detour:[],bp:0}),s=[i()];for(let c of e.nodeIds){let d=t.get(c);if(!d)continue;let m=o.get(d.name)??0;o.set(d.name,m+1);let g=n.get(`${r} ${d.name}`)?.[m]??Jr(d),p=s.at(-1),u=a.at(-1);if(V(d)){let y=d.stable.start,x=y+d.length,k=g!==(d.stable.strand??"+"),h=u!==void 0&&p.detour.length===0;h&&!u.inverted&&!k&&u.end===y?u.end=x:h&&u.inverted&&k&&u.start===x?u.start=y:(a.push({start:y,end:x,inverted:k}),s.push(i()))}else p.detour.push({node:d,strand:g}),p.bp+=d.length}return a.forEach((c,d)=>{s[d].b=c.start,s[d+1].a=c.end}),{path:e,runs:a,gaps:s}}function Zn(e,t){return Number.isFinite(e.a)&&Number.isFinite(e.b)&&e.b>=e.a&&Math.max(e.b-e.a,e.bp)<t}function mi(e,t,n){let r=0,o=e.length;for(;r<o;){let a=r+o>>1;e[a]<=t?r=a+1:o=a}return r<e.length&&e[r]<n}function Oc(e){let t=new Map;for(let n=1;n<e.length;n++){let r=e[n-1],o=e[n],a=r.stable.start+r.length;a!==o.stable.start&&(t.set(a,"reference-gap"),t.set(o.stable.start,"reference-gap"))}return t}function Wc(e,t,n){let r=(o,a)=>{Number.isFinite(o)&&!n.has(o)&&n.set(o,a)};for(let{runs:o,gaps:a}of e){let i=o[0],s=o.at(-1);i&&s&&(r(i.start,"walk-end"),r(s.end,"walk-end"));for(let c of o)c.inverted&&c.end-c.start>=t&&(r(c.start,"inversion"),r(c.end,"inversion"));for(let c of a)c.b<c.a?(r(c.a,"backward"),r(c.b,"backward")):Zn(c,t)||(r(c.a,"variant"),r(c.b,"variant"))}for(let o=!0;o;){o=!1;let a=[...n.keys()].sort((s,c)=>s-c),i=e.flatMap(({runs:s,gaps:c})=>[...c.filter(d=>Zn(d,t)).map(d=>[d.a,d.b]),...s.filter(d=>d.inverted&&d.end-d.start<t).map(d=>[d.start,d.end])]);for(let[s,c]of i)mi(a,s,c)&&(o||=!n.has(s)||!n.has(c),r(s,"overlap"),r(c,"overlap"))}return n}function Hc(e,t){let n=[],r=[],o=()=>{let a=r[0],i=r.at(-1);if(a&&i){let s=a.stable.start,c=i.stable.start+i.length,d=`${s}-${c}`;n.push({node:{id:`${d}+`,name:d,length:c-s,depth:0,stable:{refName:a.stable.refName,start:s,rank:0,strand:"+"}},members:r})}r=[]};for(let a of e)t.has(a.stable.start)&&o(),r.push(a);return o(),n}function li(e,t){let n=e.nodes.filter(V).sort((f,T)=>f.stable.start-T.stable.start),r=e.paths??[];if(n.length===0||r.length===0)return;let o=new Map(e.nodes.map(f=>[f.id,f])),a=oo(e),i=r.map(f=>Dc(f,o,a)),s=Wc(i,t,Oc(n)),c=[...s.keys()].sort((f,T)=>f-T),d=Hc(n,s),m=d.map(f=>f.node.stable.start),g=f=>{let T=0,S=m.length-1;for(;T<S;){let N=T+S+1>>1;m[N]<=f?T=N:S=N-1}return T},p=new Map,u=new Map;for(let f of d){p.set(f.node.id,f.members.map(T=>T.id));for(let T of f.members)u.set(T.id,f.node.id)}let y=new Map,x=f=>{let T=`${f.a} ${f.b} ${f.detour.map(N=>N.node.id+N.strand).join(",")}`,S=y.get(T);if(!S){let N=`r${y.size}`;S={id:`${N}+`,name:N,length:f.bp,depth:0,stable:{refName:n[0].stable.refName,start:Number.isFinite(f.a)?f.a:f.b,rank:1,strand:"+"}},y.set(T,S),p.set(S.id,f.detour.map(G=>G.node.id));for(let G of f.detour)u.has(G.node.id)||u.set(G.node.id,S.id)}return S},k=new Map,h=[],R=new Map,l=new Map,b=new Map;for(let{path:f,runs:T,gaps:S}of i){let N=[],G=[],C=!1,W=(v,z)=>{let A=N.at(-1);C&&A?.node===v&&A.strand===z||N.push({node:v,strand:z}),C=!0},B=v=>{C=!1,v.detour.length>0&&(W(x(v),"+"),C=!1)},J=v=>{(v.bp>0||v.b>v.a)&&G.push({start:v.a,end:v.b,bp:v.bp});let z=d[g(v.b>v.a?v.a:v.a-1)];for(let A of v.detour)u.has(A.node.id)||(u.set(A.node.id,z.node.id),p.get(z.node.id).push(A.node.id))};T.forEach((v,z)=>{let A=S[z];Zn(A,t)&&!mi(c,A.a,A.b)?J(A):B(A);let P=g(v.start),E=g(v.end-1),_=v.end-v.start<t;if(v.inverted&&!_){C=!1;for(let F=E;F>=P;F--)W(d[F].node,"-");C=!1}else{v.inverted&&G.push({start:v.start,end:v.end,bp:v.end-v.start,inverted:!0});for(let F=P;F<=E;F++)W(d[F].node,"+")}}),B(S.at(-1));let Z=K(f.name).name,te=0;N.forEach(({node:v,strand:z},A)=>{b.set(v.id,(b.get(v.id)??0)+1);let P=R.get(v.name)??[];P.push({path:Z,sample:f.sample??Z,start:te,strand:z}),R.set(v.name,P),te+=v.length;let E=N[A+1];if(E){let _=`${v.id}${z} ${E.node.id}${E.strand}`,F=l.get(_);F?F.pathIds.push(f.name):l.set(_,{from:v.id,to:E.node.id,fromStrand:z,toStrand:E.strand,pathIds:[f.name]})}}),h.push({...f,nodeIds:N.map(v=>v.node.id)}),k.set(f.name,G)}let L=[...d.map(f=>f.node),...y.values()].filter(f=>b.has(f.id)).map(f=>({...f,depth:b.get(f.id)}));return{graph:{...e,nodes:L,edges:[...l.values()],paths:h,pathVisits:R,reads:void 0},members:p,coarseOf:u,deviations:k,cuts:s}}var Qi=w(U(),1),ee=w(ae(),1),es=w(lc(),1),q=w(re(),1);var mt=w(ae(),1),wr=w(re(),1);var j=e=>+e.toFixed(1);function jc(e){let t=/^rgba?\(([^,]+),([^,]+),([^,)]+)(?:,([^)]+))?\)$/.exec(e.replaceAll(" ",""));if(!t)return{color:e,opacity:1};let n=t[4]===void 0?1:Number(t[4]);return{color:`rgb(${t[1]},${t[2]},${t[3]})`,opacity:n}}function Qn(e,t){let{color:n,opacity:r}=jc(t);return`${e}="${n}"${r<1?` ${e}-opacity="${j(r)}"`:""}`}var gi=.5,hi=.25;function fi(e,t){let n=[],r=[],o=(d,m)=>{let g={d:`M${j(d)} ${j(m)}`,segments:0,x0:d,x1:d,y0:m,y1:m};return r.push(g),g},a=d=>{let m=r.at(-1)??o(d[0],d[1]);for(let g=0;g<d.length;g+=2)m.x0=Math.min(m.x0,d[g]),m.x1=Math.max(m.x1,d[g]),m.y0=Math.min(m.y0,d[g+1]),m.y1=Math.max(m.y1,d[g+1]);return m.segments++,m},i=d=>{let m=new Set;return r.map(g=>{if(!d||g.x1-g.x0>=gi||g.y1-g.y0>=gi)return g.d;let p=(g.x0+g.x1)/2,u=(g.y0+g.y1)/2,y=`${Math.round(p/hi)} ${Math.round(u/hi)}`;return g.segments===0||m.has(y)?"":(m.add(y),`M${j(p)} ${j(u)}h0`)}).join("")},s={canvas:void 0,fillStyle:"#000",strokeStyle:"#000",lineWidth:1,lineCap:"butt",lineJoin:"miter",beginPath(){r=[]},moveTo(d,m){o(d,m)},lineTo(d,m){a([d,m]).d+=`L${j(d)} ${j(m)}`},bezierCurveTo(d,m,g,p,u,y){a([d,m,g,p,u,y]).d+=`C${j(d)} ${j(m)} ${j(g)} ${j(p)} ${j(u)} ${j(y)}`},closePath(){let d=r.at(-1);d&&(d.d+="Z")},stroke(){let d=i(s.lineCap!=="butt");d&&n.push(`<path d="${d}" fill="none" ${Qn("stroke",s.strokeStyle)} stroke-width="${j(s.lineWidth)}" stroke-linecap="${s.lineCap}" stroke-linejoin="${s.lineJoin}"/>`)},fill(){let d=i(!1);d&&n.push(`<path d="${d}" ${Qn("fill",s.fillStyle)}/>`)},fillRect(d,m,g,p){n.push(`<rect x="${j(d)}" y="${j(m)}" width="${j(g)}" height="${j(p)}" ${Qn("fill",s.fillStyle)}/>`)}},c={width:e,height:t,style:{},getContext:()=>s};return s.canvas=c,{canvas:c,markup:()=>n.join("")}}function nt(e,t,n){let r=new Map;for(let a of e.nodes)if(Wr(a)){let{refName:i}=a.stable;if(n[a.id]?.length){let s=r.get(i)??r.set(i,{nodes:[],reach:0}).get(i);s.nodes.push(a),s.reach=Math.max(s.reach,a.length)}}for(let{nodes:a}of r.values())a.sort((i,s)=>i.stable.start-s.stable.start);let o=[];for(let a of t){let i=r.get(a.refName);if(!i)continue;let s=[],c=[],d=new Set,m,g=1/0,p=0,u=(a.start+a.end)/2,{nodes:y,reach:x}=i;for(let k=Xr(y,a.start-x);k<y.length&&y[k].stable.start<a.end;k++){let h=y[k],R=h.stable.start,l=R+h.length;if(l<=a.start)continue;let b=n[h.id];d.add(h.id),p+=Math.min(l,a.end)-Math.max(R,a.start);let L=[];for(let S of a.exons){let N=Math.max(S.start,R),G=Math.min(S.end,l);if(G<=N)continue;let C=yn(b,(N-R)/h.length,(G-R)/h.length);C.length===1&&C.push({...C[0]}),L.push(wt(C))}L.length>0&&(s.push(...L),c.push({nodeId:h.id,d:L.join("")}));let f=Math.min(Math.max(u,R),l),T=Math.abs(f-u);if(T<g){g=T;let[S]=yn(b,(f-R)/h.length,(f-R)/h.length);m=S}}m&&o.push({gene:a,exons:s.join(""),exonsByNode:c,nodeIds:d,at:m,covered:p/(a.end-a.start)})}return o}var bi="6.0.4";var yi=(e,t)=>!!e.referencePath&&K(t).name===e.referencePath;function Xc(e,t){return(e.paths??[]).filter(n=>n.name===t).sort((n,r)=>(n.start??0)-(r.start??0))}function wi(e,t){let n=Xc(e,t),r=n[0];if(!r)return;let o=new Map(e.nodes.map(h=>[h.id,h])),a=new Map;e.edges.forEach((h,R)=>{a.set(`${h.from}>${h.to}`,R)});let i=h=>o.get(h)?.length??0,s=h=>h.nodeIds.reduce((R,l)=>R+i(l),0),c=n.reduce((h,R)=>h+s(R),0),d=r.start===void 0?void 0:{contig:r.contig??Or(K(t).name),start:r.start,end:Math.max(...n.map(h=>(h.start??0)+s(h)))},m=d?d.end-d.start:c,g=new Set,p=new Set,u=new Map,y=0;for(let h of n)d&&(y=Math.max(y,(h.start??0)-d.start)),h.nodeIds.forEach((R,l)=>{if(g.add(R),l>0){let L=h.nodeIds[l-1],f=a.get(`${L}>${R}`)??a.get(`${R}>${L}`);f!==void 0&&p.add(f)}let b=i(R);u.has(R)||u.set(R,m>0?(y+b/2)/m:0),y+=b});let x=yi(e,t),k=x?[]:(e.paths??[]).filter(h=>yi(e,h.name));return{name:t,reference:x,range:d,nodeIds:g,edgeIndexes:p,progress:u,steps:n.reduce((h,R)=>h+R.nodeIds.length,0),bp:c,referenceBp:k.length>0?k.reduce((h,R)=>h+s(R),0):void 0}}function ki(e,t,n,r){let o=new Map(e.nodes.map(i=>[i.id,i])),a=new Map;for(let[i,s]of t.progress){let c=o.get(i),d=r?.midpoints.get(i),m=n.field==="progress"?s:r&&d!==void 0&&!(c?.stable&&c.stable.rank>0)?(d-r.start)/r.span:void 0;a.set(i,bo(n,m))}return a}function zc(e,t){let n=new Set,r=0,o=e.referencePath;if(!o||t.reference)return{reversed:n,bp:r};let a=K(t.name).name,i=new Map(e.nodes.map(s=>[s.id,s]));for(let s of t.progress.keys()){let c=i.get(s),d=c?e.pathVisits?.get(c.name):void 0,m=d?.find(p=>p.path===a)?.strand,g=d?.find(p=>p.path===o)?.strand;m&&g&&m!==g&&(n.add(s),r+=c.length)}return{reversed:n,bp:r}}function rt(e,t,n){let r=new Set,o=t.filter(s=>!r.has(s.walk)&&r.add(s.walk)).flatMap(s=>{let c=wi(e,s.walk);return c?[{walk:c,layer:s}]:[]}).sort((s,c)=>Number(c.walk.reference)-Number(s.walk.reference));if(o.length===0)return;let a=0,i=o.map(({walk:s,layer:c})=>{let d=kn(c,s.reference,s.reference?0:a++,o.length===1),{reversed:m,bp:g}=zc(e,s);return{...s,encoding:d,colors:ki(e,s,d,n),reversed:m,reversedBp:g}});return xi(i,n)}var Yc={field:"progress",scheme:"red"};function ot(e,t,n,r){return t.walks.map(o=>{let a=n.find(s=>s.walk===o.name)?.color,i=kn({walk:o.name,color:{...Yc,...a}},o.reference,0);return xi([{...o,encoding:i,colors:ki(e,o,i,r)}],r)})}function xi(e,t){return{walks:e,referenceDomain:t?{start:t.start,end:t.start+t.span}:void 0,nodeIds:new Set(e.flatMap(n=>[...n.nodeIds])),edgeIndexes:new Set(e.flatMap(n=>[...n.edgeIndexes])),names:new Set(e.map(n=>n.name))}}var tr='font-family="Helvetica, Arial, sans-serif" font-size="11"',Uc=48,jt=18,Kc=16,qc=22,Jc="rgb(160,160,160)",Ri="#1c1c22";function Re(e){return e.replaceAll("&","&").replaceAll("<","<").replaceAll(">",">").replaceAll('"',""")}function er(e,t,n,r,o,a,i,s=1){let c=r.length>1?Uc:jt,d=r.length>1?`fill="url(#${e})"`:`fill="${r[0].color}"${s<1?` fill-opacity="${s}"`:""}`,m=r.length>1?`<linearGradient id="${e}">${r.map(p=>`<stop offset="${p.offset}" stop-color="${p.color}"/>`).join("")}</linearGradient>`:"";return{width:Math.max(c+5+(o.length+a.length)*yt,(i?.length??0)*yt),markup:`${m}<g transform="translate(${t} ${n})" ${tr}><rect y="5" width="${c}" height="8" rx="2" ${d}/><text x="${c+5}" y="13"><tspan font-weight="bold">${Re(o)}</tspan>${Re(a)}</text>${i?`<text y="28">${Re(i)}</text>`:""}</g>`}}function Zc(e,t){return{width:jt+5+4*yt,markup:`<g transform="translate(${e} ${t})" ${tr}><rect x="1" y="4" width="${jt-2}" height="10" rx="4" fill="none" stroke="${An}" stroke-width="2"/><text x="${jt+5}" y="13">exon</text></g>`}}function Si(e,t,n,r,o,a){let i=$o(r,a);return er(e,t,n,xn(r.encoding),o,i.delta+i.outside+i.reversed,i.scale)}function Qc(e,t){return e.replaceAll(/([ML])(-?[\d.e-]+),(-?[\d.e-]+)/g,(n,r,o,a)=>`${r}${+(Number(o)*t.scaleX+t.translateX).toFixed(1)},${+(Number(a)*t.scaleY+t.translateY).toFixed(1)}`)}function ed(e,t,n,r,o){return`<rect x="${e-n/2}" y="${t-De-bn+2}" width="${n}" height="${De+bn*2-2}" rx="3" fill="#fff" fill-opacity="0.85" stroke="${An}"/><text x="${e}" y="${t}" font-family="Helvetica, Arial, sans-serif" font-size="${De}" fill="${Ri}" text-anchor="middle"><tspan font-style="italic" font-weight="600">${Re(r)}</tspan>${o?Re(o):""}</text>`}function nr(e,t,n={}){let r=n.width??1200,o=n.height??800,a=n.region,i=n.colorDomain??a,s=n.walkRows,c=Qe(t,{region:n.fitToDrawing?void 0:a,extent:s&&t.extent?je(s):void 0}),d=t.pixelRows??!1,m=new Map(e.nodes.map(A=>[A.id,A])),g=Rt(n.colorScheme??"auto",e),p=g==="reference-position"&&!t.tubeMap?Ae(e,i):void 0,u=p&&{start:p.start,end:p.start+p.span},y=t.tubeMap?[]:be(e),x=n.walks??[],k=x.some(A=>A.color?.field==="reference")?p??Ae(e,i):void 0,h=x.length>0&&!t.tubeMap?rt(e,x,k):void 0,R=Nt(n.facet),l=R.field&&h&&h.walks.length>1?ot(e,h,x,k):void 0,b=new Map((e.paths?.length?Oe(e.paths):[]).map(A=>[A.name,A.label])),L=A=>b.get(A)??A,f=n.referenceName??pn(e,a),T=h?.referenceDomain&&{...h.referenceDomain,name:f},S=n.contigThickness??6,N=n.nodeWidth??"depth",G=n.genes?.length&&!t.tubeMap&&!s?nt(e,n.genes,t.nodePositions):[],C=Mt(e,m,S,N),W=0;function B(A,P,E,_){let F=[],se=Bo(Eo(G,C.halfWidthPx,A,Y=>Qc(Y,P)),{id:`exons${W++}`,width:E,height:_});se&&F.push(we(se));let H=Y=>({x:Y.x*P.scaleX+P.translateX,y:Y.y*P.scaleY+P.translateY}),ce={width:E,height:_};for(let{item:Y,x:fe,y:ve,w:pc,text:uc}of Qr(Do(G,H,S,_o(t.nodePositions,P)),ce,Zr(ce))){let mc=H(Y.at).y+S/2;F.push(`<line x1="${fe}" x2="${fe}" y1="${ve-De-2}" y2="${mc}" stroke="${Ri}" stroke-width="0.8" stroke-opacity="0.6"/>`,ed(fe,ve,pc,Y.gene.name,uc.slice(Y.gene.name.length)))}s&&F.push(we(vn(s,{...P,width:E,height:_},{ramp:u,rowGenes:n.rowGenes})));let ht=s?[s.reference,...s.rows].map((Y,fe)=>({label:Y.label,y:fe*le})):t.rowLabels??[];for(let{label:Y,y:fe}of ht){let ve=fe*P.scaleY+P.translateY;ve>=0&&ve<=_&&F.push(`<text x="6" y="${ve+4}" ${tr} stroke="#fff" stroke-width="3" paint-order="stroke">${Re(Y)}</text>`)}return F.join("")}function J(A,P,E){let _=Ge(c,P,E,d,l?{padLeft:oe,padTop:oe,padRight:oe,padBottom:oe}:{});if(!_)return"";let F=ke(_.scale,d),{canvas:se,markup:H}=fi(P,E),ce=new Io(se);ce.uploadGeometry(Lt({nodePositions:s?{}:t.nodePositions,graph:e,nodeById:m,colorScheme:g,contigThickness:S,connectorThickness:n.connectorThickness??2,drawPaths:!1,nodeWidth:N,highlight:A,axis:F,referenceRamp:p,deletions:new Map(y.map(Y=>[Y.edgeIndex,Y.bypassed])),deletionRoutes:t.deletionRoutes,stranded:t.stranded,hiddenEdges:new Set(n.showDeletionEdges?[]:y.map(Y=>Y.edgeIndex))}));let ht={scaleX:F.scaleX,scaleY:F.scaleY,translateX:_.translateX,translateY:_.translateY};return ce.updateTransform({...ht,dpr:1}),ce.render([1,1,1,1]),H()+B(A,ht,P,E)}let Z=[],te;if(l){let A=Pt(l.map(E=>E.walks[0].name),R.field||"walk",R.domain),P=At({count:A.count,bounds:c,pixelRows:d,width:r,room:o,columns:A.columns??R.columns});l.forEach((E,_)=>{let F=A.cells[_],se=F%P.columns*(P.width+Rn),H=Math.floor(F/P.columns)*(P.height+vt+Rn),ce=E.walks[0];Z.push(Si(`key${_}`,se+6,H+2,ce,L(ce.name),T).markup,`<svg x="${se}" y="${H+vt}" width="${P.width}" height="${P.height}">${J(E,P.width,P.height)}</svg>`)}),te=P.total}else{let A=6,P=H=>{Z.push(H.markup),A+=H.width+Kc};if(h&&(h.walks.forEach((H,ce)=>{P(Si(`key${ce}`,A,2,H,L(H.name),T))}),P(er("faded",A,2,[{offset:0,color:Jc}],"",`not on ${h.walks.length===1?L(h.walks[0].name):"these walks"}`,void 0,.3))),s){let H=Tn(Ln(s,{ramp:u,genes:n.rowGenes?.size?n.rowGeneGaps:void 0}),A,2,"rows-key");P({width:H.width,markup:we(H.tree)})}else!h&&p&&P(er("ramp",A,2,xn({field:"reference",scheme:"rainbow"}),f?`${f} position`:"Reference position","",Fo(f,p.start,p.start+p.span)));G.some(H=>H.exonsByNode.length>0)&&P(Zc(A,2));let E=Z.length>0?vt:0,_=r-2*$,F=d||!(c.w>0)?c.h:c.h*_/c.w,se=Math.max(160,Math.min(o-E,Math.ceil(F+2*$)));Z.push(`<svg y="${E}" width="${r}" height="${se}">${J(h,r,se)}</svg>`),te=E+se}let v=n.walkStrip;if(v&&!s&&!t.tubeMap){let A=It(v.rows,{width:r}),P=Tn(Ln(v.rows,{ramp:u,genes:Go(A,v.rowGenes,v.rowGeneGaps)}),6,te+A.height,"strip-key");Z.push(`<line x1="0" x2="${r}" y1="${te+.5}" y2="${te+.5}" stroke="#ddd"/>`,`<svg y="${te}" width="${r}" height="${A.height}">${we(vn(v.rows,A,{ramp:u,rowGenes:v.rowGenes,idPrefix:"strip"}))}${we(Po(v.rows,A,new Set(x.map(E=>E.walk))))}</svg>`,we(P.tree)),te+=A.height+qc}let z=JSON.stringify({generator:`@jbrowse/bandage-core@${bi}`,...n.spec===void 0?{}:{spec:n.spec}});return`<svg xmlns="http://www.w3.org/2000/svg" width="${r}" height="${te}" viewBox="0 0 ${r} ${te}"><metadata>${Re(z)}</metadata><rect width="${r}" height="${te}" fill="#fff"/>${Z.join("")}</svg>
|
|
3
|
-
`}var td=24,nd=e=>e.bp1>e.bp0;function Mi(e,t){let n=e.filter(nd);if(n.length===0){let a=e[0];return a?[{tx:a.x0,sx:t(a.bp0)}]:[]}let r=n.map(a=>({c:a,s0:t(a.bp0),s1:t(a.bp1),trimLeft:0,trimRight:0}));for(let a=0;a+1<r.length;a++){let i=r[a],s=r[a+1],d=Math.min(s.c.x0-i.c.x1,td)-(s.s0-i.s1);if(d>0){let m=(i.s1-i.s0)/2,g=(s.s1-s.s0)/2,p=Math.min(d/2,m),u=Math.min(d-p,g);p=Math.min(d-u,m),i.trimRight=p,s.trimLeft=u}}let o=[];for(let{c:a,s0:i,s1:s,trimLeft:c,trimRight:d}of r)o.push({tx:a.x0,sx:i+c},{tx:a.x1,sx:s-d});return o}function Li(e,t){let n=e.length;if(n===0)return t;let r=e[0],o=e[n-1];if(t<=r.tx)return r.sx+(t-r.tx);if(t>=o.tx)return o.sx+(t-o.tx);let a=0,i=n-1;for(;i-a>1;){let m=a+i>>1;e[m].tx<=t?a=m:i=m}let s=e[a],c=e[i],d=c.tx-s.tx;return d>0?s.sx+(t-s.tx)/d*(c.sx-s.sx):s.sx}var rd=.05,Xt=9;function od(e,t){let{minY:n,maxY:r}=e.layout.bounds,o=r-n;return e.columns&&o>0?Math.max(rd,Math.min(1,t/o)):1}function rr(e,t){let{scaleX:n,translateX:r,translateY:o}=t,a=t.scaleY*od(e,t.usableHeight),i=c=>(c-e.yOffset)*a+o,{columns:s}=e;if(s){let c=Mi(s,d=>d*n+r);return{x:d=>Li(c,d),y:i,yScale:a}}return{x:c=>c*n+r,y:i,yScale:a}}function or(e,{x:t,y:n},r,o){let a=null;return e.layout.nodes.forEach(i=>{i.order>=0&&t(i.x-Xt)<=r&&r<=t(i.x+i.pixelWidth+Xt)&&n(i.y-Xt)<=o&&o<=n(i.y+i.contentHeight+Xt)&&(a=i.name)}),a}var Zt=w(U(),1),qi=w(ae(),1),yr=w(bt(),1);function Ti(e){if(typeof e!="object"||e===null)return!1;let t=e;return typeof t.horizontalScroll=="function"&&typeof t.zoomTo=="function"&&"coarseDynamicBlocks"in t&&"dynamicBlocks"in t}function vi(e){return e.reduce((t,n)=>t&&t.end-t.start>=n.end-n.start?t:n,void 0)}function at(e,t){let n=vi(e.dynamicBlocks.contentBlocks.filter(a=>a.refName===t.refName&&a.assemblyName===t.assemblyName)),{bpPerPx:r}=e;if(!n||!(r>0))return;let o=n.offsetPx-e.offsetPx;return n.reversed?{scale:-1/r,translateX:o+n.end/r}:{scale:1/r,translateX:o-n.start/r}}function zt(e){let t=vi(e.dynamicBlocks.contentBlocks),n=t?.displayedRegionIndex===void 0?void 0:e.displayedRegions[t.displayedRegionIndex];return t&&e.bpPerPx>0?{refName:t.refName,assemblyName:t.assemblyName,start:t.start,end:t.end,bpPerPx:e.bpPerPx,span:e.bpPerPx*e.width,regionStart:n?.start??t.start,regionEnd:n?.end??t.end}:void 0}function ar(e,t,n=!0){let r=e.end-e.start,o=n?Math.max(0,Math.min(e.span,(t-r)/2)):0,a=Math.max(e.regionStart,Math.floor(e.start-o)),i=Math.min(e.regionEnd,Math.ceil(e.end+o)),s=i-a-t;return s>0&&(a+=Math.floor(s/2),i-=Math.ceil(s/2)),{refName:e.refName,assemblyName:e.assemblyName,start:a,end:i}}function Ai(e,t,n=!0){if(e?.refName!==t.refName||e.assemblyName!==t.assemblyName)return!1;if(n)return e.start<=t.start+1&&t.end<=e.end+1;let r=ar(t,1/0,!1);return Math.abs(e.start-r.start)<1&&Math.abs(e.end-r.end)<1}var Jt=w(U(),1),Le=w(ae(),1);var ad=.9,ir=2,id=1e3;function sr(e,t,n,r=a=>a,o=[]){let a=new Map(e.nodes.map(s=>[s.name,s])),i=[];for(let s of t){let c=[],d=1/0,m=-1/0,g=1/0,p=[],u=[];for(let R of Ct(s)){let l=a.get(R),b=l&&n[l.id];if(!(!l||!b?.length)){if(V(l)&&(l.stable.start<s.start||l.stable.start>=s.end)){u.push(b[Math.floor(b.length/2)]);continue}p.push(l.id),c.push(wt(b.length===1?[b[0],b[0]]:b));for(let L of b)d=Math.min(d,L.x),m=Math.max(m,L.x),g=Math.min(g,L.y)}}if(p.length===0)continue;let y={x:(d+m)/2,y:g},x=u.length?{x:u.reduce((R,l)=>R+l.x,0)/u.length,y:u.reduce((R,l)=>R+l.y,0)/u.length}:y,k=new Map;for(let R of s.routes??[])for(let l of new Set(R.steps))k.set(l,(k.get(l)??0)+1);let h=[];for(let R of s.routes??[]){if(s.longestAlleleLength<id)break;if(R.steps.length===0)continue;let l=Math.min(...R.steps.map(f=>k.get(f))),b,L=-1;for(let f of R.steps)if(k.get(f)===l)for(let T of n[f]??[]){let S=Math.hypot(T.x-x.x,T.y-x.y);S>L&&(L=S,b=T)}b&&h.push({route:R,at:b,text:sd(R,r)})}i.push({bubble:s,...Gt(s,o),path:c.join(""),labelAt:y,members:p.length,nodeIds:p,whole:p.length>=ad*e.nodes.length,routes:h})}return i}function sd(e,t){let n=[...new Set(e.walks.map(t))].sort(),r=n.slice(0,ir).join(", "),o=n.length>ir?` +${n.length-ir}`:"";return`${r}${o} \xB7 ${Mo(e.bp)}`}function cr(e){if(!e.nodes.some(V))return[];let t=new Map(e.nodes.map(p=>[p.id,p])),n=ao(e),r=new Map(n.map((p,u)=>[p,u])),o=new Int32Array(n.length+1),a=new Map,i=new Set;for(let p of e.edges){let u=r.get(p.from),y=r.get(p.to);if(u===void 0||y===void 0||u===y)continue;i.add(`${p.from}>${p.to}`).add(`${p.to}>${p.from}`);let[x,k]=u<y?[u,y]:[y,u];o[x+1]++,o[k]--;let[h,R]=u<y?[p.from,p.to]:[p.to,p.from];(a.get(h)??a.set(h,new Set).get(h)).add(R)}for(let p=1;p<o.length;p++)o[p]+=o[p-1];let s=e.nodes.filter(V).sort((p,u)=>p.stable.start-u.stable.start),c=new Set([s[0].id,s.at(-1).id]),d=s.map(p=>[p,r.get(p.id)]).filter(([p,u])=>c.has(p.id)||o[u]===0).sort(([p,u],[y,x])=>u-x||p.stable.start-y.stable.start),m=e.paths?.map(p=>{let u=new Map;return p.nodeIds.forEach((y,x)=>{u.has(y)||u.set(y,x)}),u}),g=[];for(let p=0;p+1<d.length;p++){let[u,y]=d[p],[x,k]=d[p+1],h=n.slice(y+1,k);if(h.length===0)continue;let R=new Map([[u.id,{min:0,max:0,n:1}]]);for(let B of[u.id,...h]){let J=R.get(B);if(J)for(let Z of a.get(B)??[]){if(r.get(Z)>k)continue;let v=Z===x.id?0:t.get(Z).length,z=R.get(Z);R.set(Z,{min:Math.min(z?.min??1/0,J.min+v),max:Math.max(z?.max??-1/0,J.max+v),n:Math.min(Ro,J.n+(z?.n??0))})}}let l=m&&cd(e,t,m,u.id,x.id),b=l?.n?l:void 0,L=b??R.get(x.id)??{min:0,max:0,n:0},f=l!==void 0&&l.left>0,T=u.stable.start+u.length,S=x.stable.start,N=[u.id,...h.filter(B=>V(t.get(B))),x.id],G=N.some((B,J)=>J>0&&!i.has(`${N[J-1]}>${B}`)),C=G||f,W=G&&!b;g.push({refName:u.stable.refName,start:T,end:S,segmentCount:h.length+2,pathCount:L.n,inversion:!1,shortestAlleleLength:W?S-T:L.min,longestAlleleLength:W?S-T:L.max,segments:[u,...h.map(B=>t.get(B)),x].map(B=>B.name).join(","),shortestAllele:void 0,longestAllele:void 0,partial:C,routes:b?.routes})}return g}function cd(e,t,n,r,o){let a=new Map,i=1/0,s=-1/0,c=0;return e.paths.forEach((d,m)=>{let g=n[m].get(r),p=n[m].get(o);if(g===void 0||p===void 0){(g!==void 0||p!==void 0)&&c++;return}let u=d.nodeIds.slice(Math.min(g,p)+1,Math.max(g,p));p<g&&u.reverse();let y=0;for(let h of u)y+=t.get(h)?.length??0;let x=u.join(","),k=a.get(x)??{steps:u,bp:y,walks:[]};k.walks.push(d.name),a.set(x,k),i=Math.min(i,y),s=Math.max(s,y)}),a.size||c?{min:i,max:s,n:a.size,left:c,routes:[...a.values()]}:void 0}function dr(e,t,n){if(t==="uniform"||t==="grey")return;let r={...lo(e),referenceRamp:n};return new Map(e.nodes.map((o,a)=>[o.id,po(go(o,a,t,r))]))}var ct=w(U(),1),_i=w(Pi(),1),pe=w(ae(),1);var Yt=w(U(),1),Gi=w(ae(),1),dd=/^[^#]+#\d+$/;function pd(e,t){let n=e.assemblyNameToPanSN??{},r=new Set(Object.values(n)),o={};for(let{name:a,aliases:i}of t){let s=i.find(c=>dd.test(c));s!==void 0&&!r.has(s)&&(o[a]=s)}return Object.keys(o).length===0?e:{...e,assemblyNameToPanSN:{...o,...n}}}function he(e,t){let n=(0,Yt.readConfObject)(t,"adapter");return n.type==="GbzBaseSyntenyAdapter"?pd(n,(0,Gi.getSession)(e).assemblyManager.assemblyList.map(r=>({name:(0,Yt.readConfObject)(r,"name"),aliases:(0,Yt.readConfObject)(r,"aliases")??[]}))):n}function pr(e){let t=[];for(let n of[...e].sort((r,o)=>r.start-o.start)){let r=t.at(-1);r&&n.start<=r.end?r.end=Math.max(r.end,n.end):t.push({...n})}return t}function ur(e){let t=[],n=new Map;for(let r of[...e].sort((o,a)=>o.start-a.start)){let o=`${r.refName} ${r.strand} ${r.name}`,a=n.get(o);if(a&&r.start<a.end)a.end=Math.max(a.end,r.end),a.exons=pr([...a.exons,...r.exons]);else{let i={...r,exons:pr(r.exons)};t.push(i),n.set(o,i)}}return t}var mr=w(U(),1),it=new Set(["Gff3TabixAdapter","Gff3Adapter","BedTabixAdapter","BedAdapter","GtfTabixAdapter","GtfAdapter","BigBedAdapter","NCListAdapter"]),ud=/gene|refseq|gencode|ensembl|annotation/i,md=new Set(["BedTabixAdapter","BedAdapter"]);function Ut(e,t){if(t)return e.find(r=>r.trackId===t);let n=e.filter(r=>it.has(r.adapterType));return n.find(r=>ud.test(`${r.trackId} ${r.name??""}`))??n.find(r=>!md.has(r.adapterType))}function Ci(e,t){let n=e.tracks?.find(r=>(0,mr.readConfObject)(r.configuration,"trackId")===t)?.displays[0];return n?(0,mr.readConfObject)(n.configuration,"filter")??[]:[]}var ld=new Set(["chromosome","region","contig","supercontig","scaffold"]);function ie(e,t){return typeof e.get=="function"?e.get(t):e[t]}var gd=new Set(["exon","CDS","five_prime_UTR","three_prime_UTR","UTR"]);function Ii(e,t){let n=ie(e,"type");typeof n=="string"&&gd.has(n)&&t.push({start:ie(e,"start"),end:ie(e,"end")});let r=ie(e,"subfeatures");for(let o of r??[])Ii(o,t)}function hd(e){let t=[...e].sort((r,o)=>r.start-o.start),n=[];for(let r of t){let o=n.at(-1);o&&r.start<=o.end?o.end=Math.max(o.end,r.end):n.push({...r})}return n}function Kt(e){let t=[];for(let n of e){let r=ie(n,"gene_name")??ie(n,"name")??ie(n,"gene"),o=ie(n,"start"),a=ie(n,"end");if(!r||!(a>o)||ld.has(ie(n,"type")))continue;let i=[];Ii(n,i),t.push({name:r,refName:ie(n,"refName"),start:o,end:a,strand:ie(n,"strand")??0,exons:i.length?hd(i):[{start:o,end:a}]})}return ur(t)}var hr=new Set(["BedAdapter","BedTabixAdapter","BigBedAdapter","VcfAdapter","VcfTabixAdapter"]),fd=/repeat|tandem|\bstr\b|vntr|trf|trgt|vamos|expansion|microsat/i;function Ei(e,t){return t?e.find(r=>r.trackId===t):e.filter(r=>hr.has(r.adapterType)).find(r=>fd.test(`${r.trackId} ${r.name??""}`))}function st(e,t){return typeof e.get=="function"?e.get(t):e[t]}var Bi=/^\w+=[^;]*(;\w+=[^;]*)*$/;function bd(e){let t=st(e,"name");if(!(typeof t!="string"||!Bi.test(t)))return Object.fromEntries(t.split(";").map(n=>{let r=n.indexOf("=");return[n.slice(0,r),n.slice(r+1)]}))}function de(e,t){let n=st(e,t);return n!==void 0?n:st(e,"INFO")?.[t]??bd(e)?.[t]}var Fi=["RUS","MOTIFS","RU","motifs","motif","sequence","consensus"],yd=["RUL","period","PERIOD","consensusSize","unit","unitLength"],wd=["TRID","REPID","VARID","ID","name","id"];function qt(e,t){for(let n of t){let r=de(e,n),o=String((Array.isArray(r)?r[0]:r)??"").split(",")[0].trim();if(o!==""&&o!==".")return o}}var $i=/^[ACGTURYSWKMBDHVN]+$/i;function kd(e){let t=Number(qt(e,yd));if(Number.isFinite(t)&&t>0)return Math.round(t);let n=qt(e,Fi);return n&&$i.test(n)?n.length:void 0}function Me(e){return(Array.isArray(e)?e:String(e??"").split(",")).map(n=>{let r=n===""||n===null||n===void 0?NaN:Number(n);return Number.isFinite(r)?r:void 0})}function gr(e){return(Array.isArray(e)?e:String(e??"").split(",")).map(n=>{let r=String(n??"").trim();return r===""||r==="."?void 0:r})}var lr="<CNV:TR>";function xd(e){let t=gr(st(e,"ALT"));if(!t.includes(lr))return;let n=Me(de(e,"RN")),r=gr(de(e,"RUS")),o=Me(de(e,"RUL")),a=Me(de(e,"RUC")),i=Me(de(e,"RB")),s=0;return t.map((c,d)=>{let m=n[d]??(c===lr?1:0),g=0,p=0;for(let u=0;u<m;u++,s++){let y=r[s],x=o[s]??(y&&$i.test(y)?y.length:void 0),k=a[s],h=i[s]??(x&&k!==void 0?Math.round(x*k):void 0);h!==void 0&&(g+=h,p++)}return c===lr&&m>0&&p===m?g:void 0})}function Sd(e,t,n){let r=e?.includes("|");return(e??"").split(/[/|]/).flatMap((o,a)=>{let i=Number(o),s=i>0?t[i-1]:n;return!Number.isInteger(i)||s===void 0?[]:[{bp:s,...r?{haplotype:a+1}:{}}]})}function Rd(e,t,n){let r=st(e,"samples"),o={};for(let[a,i]of Object.entries(r??{})){let s=Me(i.SD),c=Me(i.AL).flatMap((m,g)=>m!==void 0&&m>0?[s[g]===void 0?{bp:m}:{bp:m,spanningReads:s[g]}]:[]),d=c.length>0||!t?c:Sd(gr(i.GT)[0],t,n);d.length>0&&(o[a]=d)}return Object.keys(o).length>0?o:void 0}function Md(e,t){let n=de(e,"start"),r=de(e,"end"),o=Me(de(e,"SVLEN"))[0];return t&&o!==void 0?{start:n+1,end:n+1+o}:{start:n,end:r}}function Vi(e){let t=[];for(let n of e){let r=xd(n),{start:o,end:a}=Md(n,r!==void 0),i=kd(n);if(!(a>o)||i===void 0)continue;let s=de(n,"refName"),c=qt(n,Fi),d=qt(n,wd);t.push({key:`${s}:${o}-${a}`,name:(d&&!Bi.test(d)?d:void 0)??(c&&c.length<=12?`(${c})n`:`${s}:${(o+1).toLocaleString()}-${a.toLocaleString()}`),refName:s,start:o,end:a,unit:i,motif:c,calls:Rd(n,r,a-o)})}return t.sort((n,r)=>n.start-r.start)}var Di=pi.views(e=>({get defaultLayoutMode(){return"force"},get defaultColorScheme(){return"auto"},get hasPendingSource(){return!1},get canRetryLoad(){return!1},get sourceTrack(){try{return(0,pe.getContainingTrack)(e).configuration}catch{return}}})).views(e=>({get chosenLayoutMode(){return e.layoutMode??e.defaultLayoutMode},get chosenColorScheme(){return e.colorScheme??e.defaultColorScheme}})).views(e=>({get paneWidth(){return(0,pe.getContainingView)(e).width},get drawnGraph(){return e.layoutResult?.tubeMap?.coarse?.graph??e.graph}})).views(e=>({get nodeById(){if(e.drawnGraph){let t=new Map;for(let n of e.drawnGraph.nodes)t.set(n.id,n);return t}},get nodeLengths(){let t=new Map;for(let n of e.drawnGraph?.nodes??[])t.set(n.id,n.length);return t},get nodeCount(){return e.graph?.nodes.length??0},get edgeCount(){return e.graph?.edges.length??0},get pathCount(){return e.graph?.paths?.length??0},get hasGraph(){return e.graph!==void 0},get geometryPainted(){return qn(e)},get showLoading(){return e.error===void 0&&(e.isLoading||e.hasPendingSource||e.graph!==void 0&&!qn(e))},get canCancelLoad(){return e.isLoading&&!e.layoutResult},get usesLayoutEngine(){return e.graph?so(e.chosenLayoutMode,e.graph):!1},get canAnchorLayout(){return e.graph?.nodes.some(t=>t.stable?.rank===0)??!1},get anchorPaths(){return e.graph?.anchorPaths??[]},get walkChoices(){let t=e.graph?.paths;return t?.length?Oe(t):[]},get effectiveDrawPaths(){return e.drawPaths&&wn(e.graph?.paths?.length??0)},get activeReferencePath(){return e.graph?.referencePath},get rampDomain(){return e.colorDomain??e.graphRegion},get walkRamp(){let{graph:t}=e;return t&&e.walkLayers.some(n=>n.color?.field==="reference")?Ae(t,this.rampDomain):void 0},get modeDrawsNodes(){return D(e.chosenLayoutMode).drawsNodes},get liftedWalkLayers(){return e.walkLayers.length>0||!this.modeDrawsNodes?e.walkLayers:e.hoveredRowWalks.map(t=>({walk:t}))},get walkLift(){let{graph:t}=e,n=this.liftedWalkLayers;return t&&n.length>0&&!e.layoutResult?.tubeMap?rt(t,n,this.walkRamp):void 0},get facetPanels(){let{graph:t}=e,n=this.walkLift;return e.facet.field!==""&&this.modeDrawsNodes&&t&&n&&e.walkLayers.length>1&&n.walks.length>1?ot(t,n,e.walkLayers,this.walkRamp):void 0},get drawnWalks(){return this.facetPanels?.map(t=>t.walks[0])??this.walkLift?.walks??[]},get liftsWalks(){return!Ce.has(e.chosenLayoutMode)},get walkReference(){let t=this.walkLift?.referenceDomain;return t&&{...t,name:e.graphRegion?.refName}},walkLabel(t){return this.walkChoices.find(n=>n.name===t)?.label??t},get liftPaintsOffReference(){for(let t of this.walkLift?.walks??[])if(t.encoding.field!=="walk"){for(let n of t.colors.values())if(n===yo)return!0}return!1},get liftedWalksLabel(){let t=this.walkLift?.walks??[];return t.length===1?this.walkLabel(t[0].name):"these walks"},get effectiveColorScheme(){return e.layoutResult?.tubeMap&&(this.tubeMapReads||e.chosenColorScheme==="auto")?"uniform":Rt(e.chosenColorScheme,e.graph)},get tubeMapReads(){return(e.layoutResult?.tubeMap?.layout.reads.length??0)>0},get colorSchemeLock(){return this.walkLift?{value:"By walk",why:"Each lifted walk colours its own lane: set it under the menu, Walk, Colour"}:this.tubeMapReads?{value:"By strand",why:"Reads take the reds and blues, so the tube map leaves its nodes clear"}:void 0},get nodePositions(){return e.layoutResult?.nodePositions},get labelsNodeSizes(){return!e.layoutResult?.tubeMap&&!this.walkLift},get rowLabels(){return e.layoutResult?.rowLabels??[]},get alleleDeletions(){return e.layoutResult?.alleleDeletions??[]},get deletionRoutes(){return e.layoutResult?.deletionRoutes},get stranded(){return e.layoutResult?.stranded},get pixelRows(){return e.layoutResult?.pixelRows??!1},get zoomPercent(){return`${(e.scale*100).toFixed(1)}%`},get isDefaultViewport(){return e.scale===1&&e.translateX===0&&e.translateY===0}})).views(e=>({get poppedFrom(){return e.popStack.at(-1)},get derivedBubbles(){return e.graph?cr(e.graph):[]}})).views(e=>({get bubbles(){return e.indexBubbles?.length?e.indexBubbles:e.derivedBubbles}})).views(e=>({get cutHaplotypes(){},get sourceGfaLocation(){},get sourceAdapter(){let t=e.sourceTrack;return t?he(e,t):void 0},get sourceTrackId(){let t=e.sourceTrack;return t?(0,ct.readConfObject)(t,"trackId"):void 0},get assemblyTrackChoices(){let t=e.graphRegion;return t?(0,pe.getSession)(e).tracks.filter(n=>(0,ct.readConfObject)(n,"assemblyNames").includes(t.assemblyName)).map(n=>({trackId:n.trackId,name:(0,ct.readConfObject)(n,"name"),adapterType:(0,ct.readConfObject)(n,"adapter").type})):[]}})).views(e=>({get geneTrackChoices(){return e.assemblyTrackChoices.filter(t=>it.has(t.adapterType))},get repeatTrackChoices(){return e.assemblyTrackChoices.filter(t=>hr.has(t.adapterType))},get repeatChoices(){return e.repeatArrays??[]}})).views(e=>({get repeatTrack(){return Ei(e.repeatTrackChoices,e.repeatTrackId)},get geneTrack(){return Ut(e.geneTrackChoices,e.geneTrackId)},get selectedRepeat(){return e.repeatChoices.find(t=>t.key===e.repeatKey)},get backbone(){return e.graph?dn(e.graph):void 0},get cutWalkRows(){return e.graph?kt(e.graph,e.graphRegion):void 0},assemblySpellings(t){let{assemblyManager:n}=(0,pe.getSession)(e),r=n.has(t)?n.get(t):void 0,o=e.sourceAdapter?.assemblyNameToPanSN??{},a=[t,...r?[r.name,...r.aliases]:[]];return{name:t,aliases:[...a,...a.flatMap(i=>o[i]??[])]}},get drawsLoadedReference(){let t=e.graph;return t?.anchoredBy==="tags"||t?.referencePath!==void 0&&t.referencePath===e.loadedReferencePath}})).views(e=>({get geneAssembly(){let t=e.graphRegion;return t?e.assemblySpellings(t.assemblyName):void 0},get geneLaneFilter(){let t;try{t=(0,pe.getContainingView)(e)}catch{return}let n=Ci(t,e.geneTrack?.trackId);return n.length?new _i.default({filters:n,jexl:(0,pe.getEnv)(e).pluginManager.jexl}):void 0},get geneFeatures(){let t=e.geneTrackFeatures,n=this.geneLaneFilter;return t?Kt(n?t.filter(r=>n.passes(r)):t):void 0}})).views(e=>({get backboneGenes(){let{backbone:t,geneAssembly:n,geneFeatures:r}=e,o=e.drawsLoadedReference||n!==void 0&&un(t,[n])!==void 0;return t&&r&&o?ln(r,t):void 0}})).views(e=>({get nodeNeighbors(){return e.drawnGraph?We(e.drawnGraph):void 0},get nodeInk(){return Mt(e.drawnGraph,e.nodeById,e.contigThickness,e.nodeWidth)},get deletions(){return e.graph&&this.drawsNodes?be(e.graph):[]},get walkRowBars(){if(e.chosenLayoutMode!=="walkrows"||!e.graph)return;let t=e.selectedRepeat,n=t?kt(e.graph,t,t.unit):e.cutWalkRows;if(!n)return;let r=He(n.rows,e.walkRowSamples),[o,...a]=oa([n.reference,...r],t?.calls);return{...n,reference:o,rows:a}},get drawsNodes(){return!e.layoutResult?.tubeMap&&!this.walkRowBars},get drawnRowLabels(){let t=this.walkRowBars;return t?[t.reference,...t.rows].map((n,r)=>({label:n.label,y:r*le})):e.rowLabels},get fitPadLeft(){return Math.max($,...this.drawnRowLabels.map(t=>no(t.label,0).x1+6))},get genePins(){ue(e.positionsVersion);let t=e.layoutResult?.nodePositions;return e.showGenes&&this.drawsNodes&&e.graph&&e.backboneGenes&&t?nt(e.graph,e.backboneGenes,t):[]},get bubbleHalos(){ue(e.positionsVersion);let t=e.layoutResult?.nodePositions;if(!e.showBubbles||!this.drawsNodes||!e.graph||!t)return[];let n=new Map(e.walkChoices.map(r=>[r.name,r.label]));return sr(e.graph,e.bubbles,t,r=>n.get(r)??r,e.repeatArrays)},get referenceRamp(){return e.effectiveColorScheme==="reference-position"&&e.drawnGraph?Ae(e.drawnGraph,e.rampDomain):void 0},get assemblyNames(){let t=e.graphRegion;return t?[t.assemblyName]:[]},get scaleX(){return ke(e.scale,e.pixelRows).scaleX},get scaleY(){return ke(e.scale,e.pixelRows).scaleY},get axisScale(){return ke(e.scale,e.pixelRows)},get layoutBounds(){let t=e.layoutResult,n=this.walkRowBars;return t?Qe(t,{region:e.popStack.length===0?e.graphRegion:void 0,extent:n&&t.extent?je(n):void 0}):void 0}})).views(e=>({get deletionEdgeIndexes(){return new Map(e.deletions.map(t=>[t.edgeIndex,t.bypassed]))},get hiddenEdgeIndexes(){return new Set(e.showDeletionEdges?[]:e.deletions.map(t=>t.edgeIndex))},get referenceRampDomain(){let t=e.referenceRamp;return t?{start:t.start,end:t.start+t.span}:void 0},get referenceRampOffKeys(){let t=e.referenceRamp,n=e.layoutResult,r=n?.tubeMap?n.nodePositions:void 0,o=!1,a=!1;if(t&&e.drawnGraph)for(let i of e.drawnGraph.nodes)r&&!r[i.id]||(t.midpoints.has(i.id)?i.stable&&i.stable.rank>0&&(o=!0):a=!0);return{offReference:o,unplaced:a}},get tubeMapNodeColors(){let t=e.drawnGraph;return e.layoutResult?.tubeMap&&t?dr(t,e.effectiveColorScheme,e.referenceRamp):void 0},get tubeMapTubeColors(){let t=e.layoutResult?.tubeMap?.pathColors,n=t&&this.tubeMapNodeColors?t.map((a,i)=>ro(i,t.length)):t,r=new Set(e.hoveredRowWalks),o=e.drawnGraph?.paths;return n&&o&&r.size>0?n.map((a,i)=>r.has(o[i]?.name??"")?a:mo):n},nodeSpan(t){let{nodeById:n,nodeNeighbors:r}=e;return n&&r?ye({nodeId:t,nodeById:n,neighbors:r}):void 0}})).views(e=>({get pathLegend(){let t=e.graph?.paths,n=e.layoutResult?.tubeMap;return(e.drawPaths||n)&&t&&wn(t.length)?Oe(t,e.tubeMapTubeColors):[]},get hoveredSpan(){let t=e.hoveredNode,n=e.hoveredBubble;return t!==null?e.nodeSpan(t):n?{start:n.start,end:n.end}:void 0}})).views(e=>({get hoverHighlight(){let t=e.graphRegion,n=e.hoveredSpan;return t&&n?{refName:t.refName,assemblyName:t.assemblyName,...n}:void 0}}));var fr=w(U(),1);function Q(e){return typeof e=="object"&&e!==null}function Ld(e){return Q(e)&&e.type==="LinearGenomeView"&&typeof e.id=="string"&&typeof e.navToLocString=="function"&&Array.isArray(e.assemblyNames)}function dt(e){return e.flatMap(t=>Q(t)&&Array.isArray(t.views)?[t,...t.views]:[t])}function pt({views:e,connectedViewId:t,assemblyName:n}){let r=dt(e).filter(a=>Ld(a)).filter(a=>a.assemblyNames.includes(n));return r.find(a=>a.id===t)??(r.length===1?r[0]:void 0)}function ut(e,t){let n=e.assemblyManager;return n?.has(t)?n.get(t)?.name??t:t}function Wi(e,t,n){n.catch(r=>{console.error(`[GraphGenomeView] ${t}`,r),e.notifyError?.(`${t}: ${r}`,r)})}var Td=1e3;function br(e,t=Td){let n=Math.max(0,Math.ceil((t-(e.end-e.start))/2));return{...e,start:Math.max(0,e.start-n),end:e.end+n}}function Hi(e,t){return t?e.map(n=>n.rank===0?{...n,sample:t.assemblyName,haplotype:void 0,refName:t.refName,start:t.start,end:t.end}:n):e}function ji({session:e,location:t,assembly:n,connectedViewId:r,tracks:o=[]}){let a=pt({views:e.views,connectedViewId:r,assemblyName:n}),i;return a?(Wi(e,`Could not show ${n} ${Ye(t)}`,Promise.resolve(a.navToLocString(Bt(t),n))),i=a.id):i=e.addView("LinearGenomeView",{displayName:`${n} \u2014 ${Ye(t)}`,init:{assembly:n,loc:Bt(t),tracks:o}}).id,i}function Xi({session:e,location:t,assembly:n,connectedViewId:r}){let o=pt({views:e.views,connectedViewId:r,assemblyName:n});return o&&e.addHighlight?.({refName:t.refName,start:t.start,end:t.end,assemblyName:n}),o!==void 0}function Oi(e,t){if(t===void 0)return[];let n=e.tracks.find(o=>(0,fr.readConfObject)(o,"trackId")===t),r=n?(0,fr.readConfObject)(n,"assemblyNames"):[];return Array.isArray(r)?r.filter(o=>typeof o=="string").map(o=>ut(e,o)):[]}function zi({session:e,contributors:t,trackId:n,graphTrackId:r}){let o=Oi(e,r),a=Oi(e,n),i=t.filter(d=>a.includes(d.sample)),s=i.length>=2?i:t,c={init:{views:s.map(d=>({assembly:d.sample,loc:Bt(d),...r!==void 0&&o.includes(d.sample)?{tracks:[r]}:{}})),tracks:n?s.slice(1).map(()=>[n]):[],collapseEmptyRows:!0}};e.launchView?Wi(e,"Could not open the synteny view",e.launchView("LinearSyntenyView",c)):e.addView("LinearSyntenyView",c)}var Yi=Di.views(e=>({get contributingAssemblies(){let t=e.graph,n=t?Hr(t):[];return t?aa(t,{maxGap:n.length>0?zr(n):1/0}):[]}})).views(e=>({get assemblyResolver(){let{assemblyManager:t}=(0,Le.getSession)(e),n=e.sourceAdapter?.assemblyNameToPanSN,r=new Map(Object.entries(n??{}).map(([a,i])=>[i,a])),o=a=>a!==void 0&&t.has(a)?t.get(a)?.name??a:void 0;return a=>o(r.get(a))??o(a)},get geneTracksByAssembly(){let t=new Map;for(let n of(0,Le.getSession)(e).tracks){let r=(0,Jt.readConfObject)(n,"adapter").type;if(!it.has(r))continue;let o={trackId:n.trackId,name:(0,Jt.readConfObject)(n,"name"),adapterType:r};for(let a of(0,Jt.readConfObject)(n,"assemblyNames")){let i=ut((0,Le.getSession)(e),a);t.set(i,[...t.get(i)??[],o])}}return new Map([...t].flatMap(([n,r])=>{let o=Ut(r,"");return o?[[n,o]]:[]}))}})).views(e=>({get launchableAssemblies(){return ia(Hi(e.contributingAssemblies,e.graphRegion),e.assemblyResolver)},get canHighlightInLinearView(){let t=e.graphRegion;return t!==void 0&&pt({views:[...(0,Le.getSession)(e).views],connectedViewId:e.connectedViewId,assemblyName:t.assemblyName})!==void 0},nodeLaunchTargets(t){let n=e.nodeById?.get(t),r=n?Xe(n):void 0,o=r?ze(e.assemblyResolver,r):void 0,a=e.graphRegion,i=e.nodeById,s=e.nodeNeighbors,c=a&&i&&s?ye({nodeId:t,nodeById:i,neighbors:s}):void 0,d=a&&c?{sample:a.assemblyName,haplotype:void 0,refName:a.refName,...c}:void 0;return{own:r&&o?{location:br(r),assembly:o}:void 0,reference:a&&d?{location:br(d),assembly:a.assemblyName}:void 0,highlight:a&&d?{location:d,assembly:a.assemblyName}:void 0}}})).views(e=>({get host(){let t;try{t=(0,Le.getContainingView)(e)}catch{return}return Ti(t)?t:void 0}}));var Ui=Yi.views(e=>({get walkStripShown(){return e.walkStrip&&!e.host&&e.modeDrawsNodes&&!e.layoutResult?.tubeMap&&!e.walkRowBars&&e.popStack.length===0&&(e.graph?.paths?.length??0)>1},get walkStripRows(){let t=this.walkStripShown?e.cutWalkRows:void 0;return t?{...t,rows:He(t.rows,e.walkRowSamples)}:void 0},get walkStripFrame(){let t=this.walkStripRows;if(t)return It(t,{width:e.paneWidth})},get cutsWholeWalks(){return D(e.chosenLayoutMode).wholeWalks||e.walkStrip&&!e.host},get walkStripMarks(){let t=this.walkStripRows,n=e.hoveredNode??e.selectedNode,r=n===null?void 0:e.nodeById?.get(n);return t&&r&&e.graph?Ao(e.graph,[t.reference,...t.rows],r):[]},get walkStripLocator(){let t=e.stripHover?e.hoveredNode:null;return t===null?void 0:Et(e.nodePositions?.[t],n=>({x:n.x*e.scaleX+e.translateX,y:n.y*e.scaleY+e.translateY}))}})).views(e=>({get walkGeneReads(){let t=e.walkRowBars??e.walkStripRows;if(!t||!e.showGenes)return;let n=[],r=0,o=0;for(let a of t.rows){if(!a.axis){o++;continue}let i=ze(e.assemblyResolver,{sample:a.sample,haplotype:a.haplotype===void 0?void 0:`${a.sample}#${a.haplotype}`}),s=i?e.geneTracksByAssembly.get(i):void 0;if(!i||!s){r++;continue}n.push({row:a.name,trackId:s.trackId,region:{assemblyName:i,refName:a.axis.contig,...Mn(a.axis,a.bp)}})}return{reads:n.slice(0,Un),gaps:{untracked:r,unplaced:o,unread:Math.max(0,n.length-Un)}}},get walkRowGeneGaps(){return this.walkGeneReads?.gaps},walkRowAt(t,n){let r=e.walkRowBars;if(!r)return;let o=Math.round((n-e.translateY)/(le*e.scaleY)),a=[r.reference,...r.rows][o],i=o*le*e.scaleY+e.translateY,s=(t-e.translateX)/e.scaleX-r.origin;return a&&Math.abs(n-i)<=To/2+2&&s>=0&&s<=a.bp?o:void 0},walkRowLaunchTarget(t,n=e.walkRowBars){let r=n?[n.reference,...n.rows][t]:void 0;if(!r?.axis)return;let o=r.haplotype===void 0?void 0:`${r.sample}#${r.haplotype}`,a=t===0?e.graphRegion?.assemblyName:ze(e.assemblyResolver,{sample:r.sample,haplotype:o});return{label:r.label,assembly:a,location:{sample:r.sample,haplotype:o,refName:r.axis.contig,...Mn(r.axis,r.bp)}}},get walkRowGenes(){let t=e.walkRowBars??e.walkStripRows;if(!t||!e.showGenes)return;let n=new Map(e.walkGeneFeatures??[]);return e.geneFeatures&&n.set(t.reference.name,e.geneFeatures),n.size?vo([t.reference,...t.rows],n):void 0}}));var Ki=Ui.views(e=>({get xIsReferenceBp(){return e.layoutResult?.referenceAxis===!0&&D(e.chosenLayoutMode).cutMargins}})).views(e=>({get hostPlacesX(){let{host:t,graphRegion:n}=e;return t!==void 0&&t.initialized&&n!==void 0&&e.xIsReferenceBp&&e.popStack.length===0&&!t.dynamicBlocks.contentBlocks.some(r=>r.refName===n.refName&&r.reversed)}})).views(e=>({get hostFrame(){let{host:t,graphRegion:n}=e;return e.hostPlacesX&&t&&n?at(t,n):void 0},get tubeMapPicture(){let t=e.layoutResult?.tubeMap;return t?Yo(t.layout):void 0},get tubeMapReference(){let t=e.layoutResult?.tubeMap;return t&&e.drawnGraph?Wo(e.drawnGraph,t.layout):void 0},get tubeMapDeviations(){let t=e.layoutResult?.tubeMap?.coarse,n=e.layoutResult?.tubeMap?.layout;return t&&n?ra(t.graph,n,t.deviations):[]},get tubeMapReferenceNodes(){let t=e.layoutResult;return t?.tubeMap&&!t.referenceAxis&&e.drawnGraph?jo(e.drawnGraph,t.tubeMap.layout):void 0}})).views(e=>({get tubeMapGenes(){let t=e.tubeMapReference;return e.showGenes&&!e.host&&t&&e.backboneGenes?qo(t,e.backboneGenes):[]},get referenceStripApplies(){return!!e.host?.initialized&&!!e.layoutResult&&e.drawsNodes&&!e.hostPlacesX&&!e.facetPanels}})).views(e=>({get referenceStripBlocks(){let{graph:t}=e;return e.showReferenceStrip&&e.referenceStripApplies&&t?ea(t,{colorScheme:e.effectiveColorScheme,referenceRamp:e.referenceRamp,walks:e.walkLift?.walks}):[]},get referenceStripFrame(){let{host:t,graphRegion:n}=e;return t?.initialized&&n?at(t,n):void 0}})).views(e=>({get referenceStripShown(){return e.referenceStripBlocks.length>0&&e.referenceStripFrame!==void 0},get referenceStripOverhangs(){let t=e.referenceStripFrame;if(!t||e.referenceStripBlocks.length===0)return!1;let{left:n,right:r}=ta(e.referenceStripBlocks,t,e.paneWidth);return n>0||r>0},get referenceStripFaded(){return e.referenceStripBlocks.some(t=>t.faded)}})).views(e=>({get referenceStripLit(){if(!e.referenceStripShown)return;let t=a=>({x:a.x*e.scaleX+e.translateX,y:a.y*e.scaleY+e.translateY}),n=e.hoveredNode===null?e.hoveredBubble:null;if(n){let a=e.bubbleHalos.find(i=>So(i.bubble,n));return{start:n.start,end:n.end,anchor:a?t(a.labelAt):void 0}}let r=e.hoveredNode??e.selectedNode,o=r===null?void 0:e.nodeSpan(r);return o&&r!==null?{...o,anchor:Et(e.nodePositions?.[r],t)}:void 0},referenceStripNodeAt(t,n){let r=e.referenceStripFrame;return e.referenceStripShown&&r?na(e.referenceStripBlocks,r,t,n):void 0},get paperCss(){return Ja(e.darkMode?Ht:Wt)},get referenceStripZonePx(){return e.referenceStripShown?Qo:0}}));var Ji=Ki.views(e=>({get paneCeiling(){return Math.max(Ot,e.paneHeight??qa)},get fitPadTopBase(){let t=Zo(e.tubeMapGenes);return $+Math.max(0,t-1)*Jo+e.referenceStripZonePx},get legendRoom(){let t=e.layoutBounds,{width:n,height:r}=e.legendSize;if(!t||t.w<=0||n===0||e.facetPanels||e.tubeMapReads)return;if(e.hostPlacesX)return"top";let o=this.fitPadTopBase,a=e.host?this.canvasHeight:this.paneCeiling,i=m=>(e.paneWidth-e.fitPadLeft-m)/t.w,s=m=>e.pixelRows?t.h+m+$<=a?1/0:0:(a-m-$)/t.h,c=Math.min(i(n+2*Ne),s(o));return Math.min(i($),s(o+r+Ne))>=c?"top":"right"},get fitPadTop(){return this.fitPadTopBase+(this.legendRoom==="top"?e.legendSize.height+Ne:0)},get fitPadRight(){return this.legendRoom==="right"?Math.max($,e.legendSize.width+2*Ne):$},get minFitScale(){let t=e.layoutBounds,n=e.layoutResult,r=n?.tubeMap?.layout.tracks[0]?.width;return t&&t.h>0&&r&&!n.referenceAxis?Math.min(Za/r,(this.paneCeiling-this.fitPadTop-$)/t.h):0},get facetSpec(){let{field:t,domain:n,columns:r}=e.facet;return t===""?void 0:n.length===0&&r===void 0?t:{field:t,domain:[...n],...r===void 0?{}:{columns:r}}},get facetPlacement(){let t=e.facetPanels,{field:n,domain:r}=e.facet;return t?Pt(t.map(o=>o.walks[0].name),e.hostPlacesX||n===""?"walk":n,r):void 0},facetGridIn(t){let n=this.facetPlacement,r=e.layoutBounds;return n&&r&&r.w>0?At({count:n.count,bounds:r,pixelRows:e.pixelRows,width:e.paneWidth,room:t,columns:e.hostPlacesX?1:n.columns??e.facet.columns}):void 0},get facetGrid(){return this.facetGridIn(e.host?this.canvasHeight:this.paneCeiling)},get canvasHeight(){let t=e.layoutBounds,n=e.paneWidth-$-this.fitPadRight,r=this.paneCeiling;if(!t)return r;let o=this.facetGrid;if(o)return Math.max(Ot,o.total);let a=Math.max(Ot,e.legendSize.height+2*Ne+e.referenceStripZonePx);return e.pixelRows?Math.min(r,Math.max(a,t.h+this.fitPadTop+$)):t.w>0&&n>0?Math.min(r,Math.max(a,t.h*Math.max(n/t.w,this.minFitScale)+this.fitPadTop+$)):r},get viewBox(){let t=this.facetGrid;return t?{width:t.width,height:t.height}:{width:e.paneWidth,height:this.canvasHeight}},get fittedTransform(){let t=e.layoutBounds,n=this.facetGrid;return t?n?Ge(t,n.width,n.height,e.pixelRows,{padLeft:oe,padTop:oe,padRight:oe,padBottom:oe}):Ge(t,e.paneWidth,this.canvasHeight,e.pixelRows,{minScale:this.minFitScale,padLeft:e.fitPadLeft,padTop:this.fitPadTop,padRight:this.fitPadRight}):void 0}})).views(e=>({viewportToBuild(){return On(tt(e),ai)},applyHighlights(t){let{hoveredNode:n,hoveredEdge:r,selectedNode:o}=e,a=new Map;o!==null&&a.set(o,ri),n!==null&&n!==o&&a.set(n,Yn),t.setNodeHighlights(a),t.setEdgeHighlight(r,Yn)},paint(t){let n=Co();t.updateTransform({scaleX:e.scaleX*n,scaleY:e.scaleY*n,translateX:e.translateX*n,translateY:e.translateY*n,dpr:n}),t.render(e.referenceStripShown?[0,0,0,0]:e.darkMode?Ht:Wt)}})).views(e=>({buildDrawing(t,n){let{nodePositions:r,graph:o,nodeById:a}=e;if(!r||!o||!a)return;ue(e.viewportDirty,e.positionsVersion);let i=(0,yr.untracked)(()=>e.viewportToBuild());return{batch:Lt({nodePositions:e.walkRowBars?{}:r,graph:o,nodeById:a,colorScheme:e.effectiveColorScheme,contigThickness:e.contigThickness,connectorThickness:e.connectorThickness,drawPaths:n,nodeWidth:e.nodeWidth,highlight:t,axis:(0,yr.untracked)(()=>e.axisScale),linearLayout:e.linearLayout,viewportBounds:i,referenceRamp:e.referenceRamp,deletions:e.deletionEdgeIndexes,deletionRoutes:e.deletionRoutes,stranded:e.stranded,hiddenEdges:e.hiddenEdgeIndexes,version:e.positionsVersion}),viewportBounds:i}},get overlayLabels(){return Oo(e)},hoveredOn(t){let n=e.hoveredNode,r=n?e.nodeById?.get(n):void 0;return r?Vo(t,r.id,r.length)??"not on this walk":void 0},figureSpec(){let t=e.graphRegion,n=e.sourceAdapter,r=n?.assemblyNameToPanSN,o=t&&`${t.refName}:${t.start}-${t.end}`,a=Ie(e.sourceGfaLocation),i=n?.type==="GbzBaseSyntenyAdapter"?Ie(n.gbzDbLocation):void 0,s=a?{gfa:a,region:o}:i&&t&&o?{gbz:{db:i,index:Ie(n.haplotypeIndexLocation),region:o,haplotypes:e.cutHaplotypes?.map(p=>r?.[p]??p),referenceSample:n.referenceSample||r?.[t.assemblyName]||t.assemblyName,context:n.context,snarls:e.cutsWholeWalks?"overlapping":n.subgraphSnarls}}:void 0;if(!s)return;let c=e.showGenes?e.geneTrack:void 0,d=c?(0,qi.getSession)(e).tracks.find(p=>p.trackId===c.trackId):void 0,m=d?(0,Zt.expandTabixShorthand)((0,Zt.readConfObject)(d,"adapter"),"gffGzLocation"):void 0,g=m?.type==="Gff3TabixAdapter"?{file:Ie(m.gffGzLocation),index:Ie(m.index?.location),format:"gff3"}:void 0;return JSON.parse(JSON.stringify({...s,genes:g?.file&&g.index?g:void 0,referencePath:e.referencePath||void 0,layout:e.chosenLayoutMode,quality:e.layoutQuality,bubbleSpread:e.bubbleSpread,walks:e.walkLayers.length?e.walkLayers.map(p=>p.color?p:p.walk):void 0,facet:e.walkLayers.length>1?e.facetSpec:void 0,walkStrip:e.walkStripShown||void 0,walkRowSamples:e.walkStripShown?e.walkRowSamples:void 0,width:e.paneWidth,height:e.paneCeiling,colorScheme:e.chosenColorScheme,nodeWidth:e.nodeWidth,showDeletionEdges:e.showDeletionEdges||void 0}))},get figureUnavailable(){return e.layoutResult?e.drawsNodes||e.walkRowBars?void 0:`${D(e.chosenLayoutMode).label} draws a picture of its own, which the SVG export does not`:"Nothing is drawn yet"},get figureSpecUnavailable(){return e.drawsNodes?this.figureSpec()?void 0:"bandage-figure reads a graph cut from a gbz-base track or a GFA url":`bandage-figure draws no ${D(e.chosenLayoutMode).label} layout`},figure(){let{graph:t,layoutResult:n}=e;return t&&n&&!this.figureUnavailable?nr(t,n,{width:e.paneWidth,height:e.paneCeiling,walks:e.walkLayers,facet:e.facetSpec,colorScheme:e.effectiveColorScheme,nodeWidth:e.nodeWidth,showDeletionEdges:e.showDeletionEdges,contigThickness:e.contigThickness,connectorThickness:e.connectorThickness,region:e.graphRegion,colorDomain:e.colorDomain,fitToDrawing:e.popStack.length>0,genes:e.showGenes?e.backboneGenes:void 0,walkRows:e.walkRowBars,rowGenes:e.walkRowGenes,rowGeneGaps:e.walkRowGeneGaps,walkStrip:e.walkStripRows&&{rows:e.walkStripRows,rowGenes:e.walkRowGenes,rowGeneGaps:e.walkRowGeneGaps},spec:this.figureSpec()}):void 0},get tubeMapFrame(){let t=e.layoutResult?.tubeMap;return t?rr(t,{scaleX:e.scaleX,translateX:e.translateX,scaleY:e.scaleY,translateY:e.translateY,usableHeight:e.canvasHeight-e.fitPadTop-$}):void 0}})).views(e=>({get tubeMapRulerBoxes(){let t=e.tubeMapReference;return t&&!e.hostPlacesX?Ho(t):void 0},get connectorZoneBottom(){let t=e.tubeMapPicture,n=e.tubeMapFrame;return t&&n?n.y(t.bounds.minY)-2:0},get tubeMapConnectors(){let t=e.tubeMapReferenceNodes,n=e.tubeMapFrame,{host:r,graphRegion:o}=e,a=t&&n&&r?.initialized&&o?at(r,o):void 0;return t&&n&&a?Xo(t,i=>i*a.scale+a.translateX,n.x,e.paneWidth):[]}})).views(e=>({get tubeMapKeys(){let t=e.layoutResult,n=t?.tubeMap?.layout.reads??[],r=e.tubeMapPicture,o=e.tubeMapFrame,a=r&&o&&Uo(o.yScale)?r.mismatches.filter(i=>Ko(i,{x:o.x,width:e.paneWidth})):[];return{logWidths:t?.tubeMap!==void 0&&!t.referenceAxis,foldBp:e.tubeMapDeviations.length>0?e.tubeMapFold:void 0,forwardReads:n.some(i=>!i.is_reverse),reverseReads:n.some(i=>i.is_reverse),mismatches:new Set(a.map(i=>i.kind))}},tubeMapNodeAt(t,n){let r=e.layoutResult?.tubeMap,o=e.tubeMapFrame;return(r&&o?or(r,o,t,n):null)??zo(e.tubeMapConnectors,e.connectorZoneBottom,t,n)??null}}));var Zi=Ji.actions(e=>({setError(t){e.error=t,e.isLoading=!1,e.statusMessage=""},finishLoading(){e.isLoading=!1,e.statusMessage=""},setStatusMessage(t){e.statusMessage=t},setFetchMs(t){e.lastFetchMs=t},setLayoutMs(t){e.lastLayoutMs=t},setGeometryMetrics(t,n,r){e.lastGeometryMs=t,e.lastGeometryStrokeCount=n,e.builtViewport={...r,viewportDirty:e.viewportDirty},e.geometryVersion++},markPainted(){e.paintedViewport=e.builtViewport},setLayoutQuality(t){e.layoutQuality=t},setLinearLayout(t){e.linearLayout=t},setLayoutMode(t){e.layoutMode=t},setReferencePath(t){e.referencePath=t;let n=e.graph;if(n?.anchoredBy==="paths"){let r=Ve(n,t);ci(n,r),e.graph=r}},setDrawPaths(t){e.drawPaths=t},setShowPerf(t){e.showPerf=t},setColorScheme(t){e.colorScheme=t},setBubbleSpread(t){e.bubbleSpread=t},setNodeWidth(t){e.nodeWidth=t},setShowBubbles(t){e.showBubbles=t},setShowDeletionEdges(t){e.showDeletionEdges=t},setShowGenes(t){e.showGenes=t},setShowReferenceStrip(t){e.showReferenceStrip=t},setTubeMapFold(t){e.tubeMapFold=t},setGeneTrackId(t){e.geneTrackId=t},setRepeatTrackId(t){e.repeatTrackId=t},setRepeatKey(t){e.repeatKey=t},setWalkLayers(t){e.walkLayers=t},liftWalks(t){let n=new Map(e.walkLayers.map(r=>[r.walk,r]));e.walkLayers=t.map(r=>n.get(r)??{walk:r})},setFacet(t){t!==e.facet.field&&(e.facet.domain=[]),e.facet.field=t},setFacetColumns(t){e.facet.columns=t},toggleWalk(t){let n=e.walkLayers;e.walkLayers=n.some(r=>r.walk===t)?n.filter(r=>r.walk!==t):[...n,{walk:t}]},setWalkColor(t,n){e.walkLayers=e.walkLayers.map(r=>r.walk===t?{...r,color:{...r.color,...n}}:r)},setPaneHeight(t){e.paneHeight=t},setWalkRowSamples(t){e.walkRowSamples=t},pairWithLinearView(t){let n=e.connectedViewId;n!==void 0&&dt([...(0,mt.getSession)(e).views]).some(o=>o.id===n)||(e.connectedViewId=t)},setHoveredNode(t){e.hoveredNode=t},setHoveredRowWalks(t){t.join(`
|
|
1
|
+
import{a as dn,b as pn,c as un,d as mn,e as ln,n as ft}from"./chunks/chunk-TZOITL4Y.js";import{a as gc}from"./chunks/chunk-KWAXLUPQ.js";import{a as hc,d as Yr,g as Ur,h as Kr}from"./chunks/chunk-4T7DPQTR.js";import{a as ae}from"./chunks/chunk-J4OLMLS5.js";import{$ as Ao,$a as Ye,A as bo,Aa as jo,B as yo,Ba as Xo,C as xn,Ca as zo,E as Rn,Ea as Yo,F as vt,G as oe,Ga as Uo,H as At,Ha as Ko,I as Nt,Ia as qo,J as Pt,Ja as Jo,K as Mo,Ka as Zo,L as Gt,Ma as Qo,N as Lo,Na as ea,O as It,Oa as ta,Pa as na,Q as we,Qa as Et,S as To,Sa as ra,V as Mn,Va as oa,W as vo,Wa as Xe,X as Ln,Xa as aa,Ya as ze,Z as Tn,Za as ia,_ as vn,_a as Bt,a as Vr,aa as No,b as bt,ba as Ct,bb as sa,c as Jr,db as ca,ea as Po,f as oo,fa as Go,g as We,ga as Io,h as ye,ha as Co,i as ao,ia as An,j as He,ja as Eo,k as kt,ka as Bo,l as je,la as Fo,m as io,ma as $o,n as xt,na as Do,o as so,p as _,pa as Vo,q as po,r as mo,sa as Ne,t as Ae,u as lo,ua as _o,v as go,va as Oo,w as Lt,wa as Wo,x as ho,xa as Ho,y as fo,z as kn}from"./chunks/chunk-5UJF6DC5.js";import{A as be,B as no,M as wn,O as ro,P as Oe,Q as co,R as St,S as Rt,U as uo,X as Mt,Y as Tt,Z as Sn,_ as wo,a as K,aa as ko,b as gn,ba as xo,c as hn,ca as yc,d as De,e as fn,f as Ve,g as _e,h as yt,i as bn,j as Zr,k as Qr,l as le,m as wt,w as eo,x as to,y as yn}from"./chunks/chunk-MRFLLKCN.js";import{b as So,d as Ro}from"./chunks/chunk-IJ6KQTLA.js";import"./chunks/chunk-2YL4SV2L.js";import{b as Wr,c as D,e as Hr,f as jr,h as Xr,i as zr}from"./chunks/chunk-VKCLNLCM.js";import"./chunks/chunk-YBLNN5FU.js";import{a as _r,d as Or}from"./chunks/chunk-AILRF3IW.js";import{a as re}from"./chunks/chunk-FCWXYIFC.js";import{a as $e}from"./chunks/chunk-J6KYLXRD.js";import{a as Fe,b as qr,c as fc,d as bc}from"./chunks/chunk-TYJTJGPO.js";import{a as ne,b as w}from"./chunks/chunk-FY3BTKY4.js";var pa=ne((np,da)=>{da.exports=JBrowseExports["@jbrowse/core/Plugin"]});var Dt=ne((ap,ua)=>{ua.exports=JBrowseExports["@jbrowse/core/pluggableElementTypes/AdapterType"]});var U=ne((ip,ma)=>{ma.exports=JBrowseExports["@jbrowse/core/configuration"]});var In=ne((up,ha)=>{ha.exports=JBrowseExports["@jbrowse/core/data_adapters/dataAdapterCache"]});var ge=ne((mp,fa)=>{fa.exports=JBrowseExports["@jbrowse/core/pluggableElementTypes"]});var va=ne((xp,Ta)=>{Ta.exports=JBrowseExports["@jbrowse/core/pluggableElementTypes/ViewType"]});var Na=ne((Sp,Aa)=>{Aa.exports=JBrowseExports["@jbrowse/core/util/withLaunchInput"]});var Ga=ne((Rp,Pa)=>{Pa.exports=JBrowseExports["@jbrowse/core/pluggableElementTypes/models"]});var za=ne((gu,Xa)=>{Xa.exports=JBrowseExports["@jbrowse/render-core/RenderLifecycleMixin"]});var Gi=ne((Hh,Pi)=>{Pi.exports=JBrowseExports["@jbrowse/core/pluggableElementTypes/renderers/util/serializableFilterChain"]});var Ls=ne((_y,Ms)=>{Ms.exports=JBrowseExports["@jbrowse/core/pluggableElementTypes/DisplayType"]});var vs=ne((Oy,Ts)=>{Ts.exports=JBrowseExports["@jbrowse/display-kit/trackHeightConfigSchemaFields"]});var Is=ne((Xy,Gs)=>{Gs.exports=JBrowseExports["@jbrowse/display-kit/TrackHeightMixin"]});var Es=ne((zy,Cs)=>{Cs.exports=JBrowseExports["@jbrowse/render-core/displayPhase"]});var dc=w(pa(),1),pc=w(ae(),1);var Ft=w(Fe(),1),$t=(0,Vr.createSvgIcon)([(0,Ft.jsx)("circle",{cx:"7.2",cy:"14.4",r:"3.2"},"0"),(0,Ft.jsx)("circle",{cx:"14.8",cy:"18",r:"2"},"1"),(0,Ft.jsx)("circle",{cx:"15.2",cy:"8.8",r:"4.8"},"2")],"BubbleChart");var ga=w(Dt(),1);var Nn=w(U(),1),Pn=w(re(),1),wc=(0,Nn.ConfigurationSchema)("GbzBaseSyntenyAdapter",{assemblyNames:{type:"stringArray",defaultValue:[]},gbzDbLocation:{type:"fileLocation",defaultValue:{uri:"/path/to/graph.gbz.db",locationType:"UriLocation"}},haplotypeIndexLocation:{type:"fileLocation",defaultValue:{uri:"",locationType:"UriLocation"}},readsLocation:{type:"fileLocation",defaultValue:{uri:"",locationType:"UriLocation"}},readsIndex:(0,Nn.ConfigurationSchema)("GbzBaseReadsIndex",{indexType:{model:Pn.types.enumeration("IndexType",["TBI","CSI"]),type:"stringEnum",defaultValue:"TBI"},location:{type:"fileLocation",defaultValue:{uri:"",locationType:"UriLocation"}}}),subgraphSnarls:{type:"stringEnum",model:Pn.types.enumeration("SnarlOutput",["none","contained","overlapping"]),defaultValue:ft.snarls},referenceSample:{type:"string",defaultValue:""},assemblyNameToPanSN:{type:"frozen",defaultValue:{}},context:{type:"number",defaultValue:ft.context,advanced:!0},nodeLimit:{type:"number",defaultValue:ft.limit,advanced:!0}},{explicitlyTyped:!0,preProcessSnapshot:e=>{let{uri:t,baseUri:n,reads:r}=e;return{...e,...t?{gbzDbLocation:{uri:t,baseUri:n}}:{},...typeof r=="string"?{readsLocation:{uri:r,baseUri:n},...r.endsWith(".gz")?{readsIndex:{location:{uri:`${r}.tbi`,baseUri:n}}}:{}}:{}}}}),la=wc;function Gn(e){e.addAdapterType(()=>new ga.default({name:"GbzBaseSyntenyAdapter",displayName:"gbz-base pangenome adapter",configSchema:la,adapterCapabilities:["getSubgraph","headerLanes","lanePairsOnAnchor"],adapterMetadata:{category:"Synteny adapters"},getAdapterClass:()=>import("./chunks/GbzBaseSyntenyAdapter-WDWGGJLA.js").then(t=>t.default)}))}var ba=w(In(),1),ya=w(ge(),1);function kc(e){return"getReads"in e&&typeof e.getReads=="function"}var xc=e=>typeof e=="object"&&e!==null&&Object.entries(e).some(([t,n])=>["uri","localPath","blobId"].includes(t)&&typeof n=="string"&&n!=="");function wa(e){return typeof e.reads=="string"&&e.reads!==""||xc(e.readsLocation)}var Ue=class extends ya.RpcMethodType{constructor(){super(...arguments);this.name="GetGraphReads"}async execute(n){let{adapterConfig:r,nodeNames:o,sessionId:a,signal:i}=n,{dataAdapter:s}=await(0,ba.getAdapter)(this.pluginManager,a,r);return kc(s)?s.getReads(o,{signal:i}):{records:[],total:0}}};var ka=w(In(),1),xa=w(ge(),1);function Sc(e){return"getSubgraph"in e&&typeof e.getSubgraph=="function"}var Ke=class extends xa.RpcMethodTypeWithRenameRegion{constructor(){super(...arguments);this.name="GetSubgraph"}async execute(n){let{adapterConfig:r,region:o,sessionId:a,opts:i,signal:s}=n,{dataAdapter:c}=await(0,ka.getAdapter)(this.pluginManager,a,r);return Sc(c)?c.getSubgraph(o,{...i,signal:s}):(console.warn(`[GetSubgraph] ${c.constructor.name} does not implement getSubgraph`),"")}};var Sa=w($e(),1),Ra=w(ge(),1),Ma=w(re(),1),Rc=(0,Sa.lazy)(()=>import("./chunks/AddTrackWorkflow-U3UNCVXJ.js"));function Cn(e){e.addAddTrackWorkflowType(()=>new Ra.AddTrackWorkflowType({name:"Pangenome graph track",displayName:"Add pangenome graph track",ReactComponent:Rc,stateModel:Ma.types.model({})}))}var En;function Bn(){return En??=import("./chunks/bandage-layout-3AR6BCUD-U43ZCEP3.js").then(e=>e.default()).catch(e=>{throw En=void 0,e}),En}var La=w(ge(),1),qe=class extends La.RpcMethodType{constructor(){super(...arguments);this.name="GraphComputeLayout"}async execute(n){let{graph:r,options:o,statusCallback:a}=n;a?.("Loading layout engine");let i=await Bn();a?.("Computing layout");let s=performance.now(),c=i.computeLayout(r,o),d=performance.now()-s;return{result:c,duration:d}}};var ks=w($e(),1),xs=w(va(),1),Ss=w(Na(),1);var bs=w(Ga(),1),ys=w(ae(),1),X=w(re(),1),ws=w(bt(),1);var ls=w(qr(),1),Te=w(ae(),1);var Ka=w($e(),1);function Ia(e,t){let n=e.nodes.filter(k=>D(k)&&(t[k.id]?.length??0)>0);if(n.length<2)return t;let r=n.map(k=>{let h=t[k.id],x=h[Math.floor(h.length/2)];return{x:x.x,y:x.y,r:k.stable.start+k.length/2,w:k.length}}),o=r.reduce((k,h)=>k+h.w,0),a=r.reduce((k,h)=>k+h.x*h.w,0)/o,i=r.reduce((k,h)=>k+h.y*h.w,0)/o,s=r.reduce((k,h)=>k+h.r*h.w,0)/o,c=0,d=0;for(let k of r)c+=k.w*(k.x-a)*(k.r-s),d+=k.w*(k.y-i)*(k.r-s);let m=-Math.atan2(d,c),g=Math.cos(m),p=Math.sin(m),u={};for(let[k,h]of Object.entries(t))u[k]=h.map(x=>{let l=x.x-a,b=x.y-i;return{x:a+g*l-p*b,y:i+p*l+g*b}});let y=0,S=0;for(let k of e.nodes)if(!D(k))for(let h of u[k.id]??[])h.y>i?y++:S++;if(S>y)for(let k of Object.values(u))for(let h of k)h.y=2*i-h.y;return u}var Ca=30;function Mc(e,t){let{opts:n}=t,r=new Map(t.nodes.map(p=>[p.id,Tt(n,p.length)])),o=p=>r.get(p)??n.minimumNodeLength,a=e.nodes.filter(D).sort((p,u)=>p.stable.start-u.stable.start),i=new Map,s=0;for(let p of a)i.set(p.id,{x:s,y:0}),s+=o(p.id)+n.edgeLength;let c=We(e),d=new Map(a.map(p=>[p.id,0])),m=a.map(p=>p.id);for(let p of m){let u=i.get(p),y=d.get(p)+1;for(let S of c.get(p)??[])d.has(S)||(d.set(S,y),i.set(S,{x:u.x+o(p)/2,y:Ca*y}),m.push(S))}let g=0;for(let p of e.nodes)i.has(p.id)||i.set(p.id,{x:g++*s/e.nodes.length,y:Ca*3});return i}function Ea(e,t){let n=Mc(e,t);return t.nodes.map(r=>({...r,...n.get(r.id)}))}function Lc(e,t){let n=e.indexOf(":"),r=e.indexOf(":",n+1);if(n!==-1&&r!==-1){let o=e.slice(0,n),a=e.slice(n+1,r),i=e.slice(r+1);a==="i"||a==="f"?t[o]=+i:a==="Z"&&(t[o]=i)}}function Je(e){let t={};for(let n of e)Lc(n,t);return t}function Fa(e){let{SN:t,SO:n,SR:r}=e.tags;return typeof t=="string"&&typeof n=="number"&&typeof r=="number"?{refName:t,start:n,rank:r}:void 0}var Ba=62,Tc=60;function vc(e){let t=[],n="+",r=0;function o(a){a>r&&t.push({id:e.slice(r,a),strand:n})}for(let a=0;a<e.length;a++){let i=e.charCodeAt(a);(i===Ba||i===Tc)&&(o(a),n=i===Ba?"+":"-",r=a+1)}return o(e.length),t}function $a(e){let t={nodes:[],links:[],paths:[],walks:[],header:[],id:""};for(let n of e.split(`
|
|
2
|
+
`)){let r=n.endsWith("\r")?n.slice(0,-1):n;if(r.startsWith("H")){let[,...o]=r.split(" ");t.header.push(Je(o))}else if(r.startsWith("S")){let[,o,...a]=r.split(" "),i,s,c,d=!1,m=a[0]??"*";/^\d+$/.test(m)?(i=+m,s=a[1]??"*",c=a.slice(2)):(d=!0,s=m,i=s==="*"?0:s.length,c=a.slice(1));let g=Je(c);d&&"LN"in g&&(i=+g.LN),t.nodes.push({id:o,length:i,sequence:s,tags:g})}else if(r.startsWith("E")){let[,,o,a,,,,,i,...s]=r.split(" ");o&&a&&t.links.push({source:o.slice(0,-1),target:a.slice(0,-1),strand1:o.at(-1),strand2:a.at(-1),cigar:i??"*",tags:Je(s)})}else if(r.startsWith("L")){let[,o,a,i,s,c,...d]=r.split(" ");o&&i&&s&&t.links.push({source:o,target:i,strand1:a,strand2:s,cigar:c??"*",tags:Je(d)})}else if(r.startsWith("W")){let[,o,a,i,s,c,d,...m]=r.split(" ");o&&a&&i&&s&&c&&d&&t.walks.push({sample:o,haplotype:+a,contig:i,start:s==="*"?-1:+s,end:c==="*"?-1:+c,segments:vc(d),tags:Je(m)})}else if(r.startsWith("P")){let[,o,a,...i]=r.split(" ");o&&a&&t.paths.push({name:o,path:a,rest:i})}}return t}function Ac(e){let t=new Map,n=new Map;function r(a,i){t.has(a)||t.set(a,i)}function o(a,i){r(a,i),n.set(a,(n.get(a)??0)+1)}for(let a of e.links)r(a.source,a.strand1==="-"?"-":"+"),r(a.target,a.strand2==="-"?"-":"+");for(let a of e.paths)for(let i of a.path.split(","))o(i.slice(0,-1),i.endsWith("-")?"-":"+");for(let a of e.walks)for(let i of a.segments)o(i.id,i.strand==="-"?"-":"+");return{canonical:t,traversals:n}}var Da=e=>e.start===-1?0:e.start;function Nc(e){return[...e.paths.map(t=>({...K(t.name),steps:t.path.split(",").map(n=>({id:n.slice(0,-1),strand:n.endsWith("-")?"-":"+"}))})),...e.walks.map(t=>({name:`${t.sample}#${t.haplotype}#${t.contig}`,start:Da(t),steps:t.segments.map(n=>({id:n.id,strand:n.strand==="-"?"-":"+"}))}))]}function Pc(e){let t=e.tags.SM;if(typeof t!="string")return;let n=t.split(",").map(r=>r.trim()).filter(Boolean);return n.length>0?n:void 0}var Ze=e=>typeof e=="number"&&e>0?e:void 0;function Gc({tags:e,length:t}){let n=Ze(e.RC)??Ze(e.FC)??Ze(e.KC);return Ze(e.dp)??Ze(e.DP)??(n!==void 0&&t>0?n/t:void 0)}function Ic(e,t,n){return{id:`${e.id}${t}`,name:e.id,length:e.length,depth:n,stable:Fa(e),samples:Pc(e)}}function Va(e,t="Imported GFA"){let n=[],r=[],{canonical:o,traversals:a}=Ac(e),i=u=>`${u}${o.get(u)??"+"}`;for(let u of e.nodes){let y=Gc(u)??Math.max(a.get(u.id)??1,1);n.push(Ic(u,o.get(u.id)??"+",y))}for(let u of e.links)r.push({from:i(u.source),to:i(u.target),fromStrand:u.strand1==="-"?"-":"+",toStrand:u.strand2==="-"?"-":"+"});let s=[],c=new Map,d=(u,y)=>[u,y].sort().join("--");function m(u,y){for(let S=0;S<u.length-1;S++){let k=d(u[S],u[S+1]);c.has(k)||c.set(k,new Set),c.get(k).add(y)}}for(let u of e.paths){let y=u.path.split(",").map(S=>i(S.slice(0,-1)));s.push({name:u.name,nodeIds:y,start:K(u.name).start}),m(y,u.name)}for(let u of e.walks){let y=u.segments.map(k=>i(k.id)),S=`${u.sample}#${u.haplotype}#${u.contig}`;s.push({name:S,nodeIds:y,start:Da(u),sample:u.sample,haplotype:u.haplotype,contig:u.contig}),m(y,S)}for(let u of r){let y=c.get(d(u.from,u.to));y&&y.size>0&&(u.pathIds=[...y])}let g=new Map(e.nodes.map(u=>[u.id,u.length])),p=e.paths.length>0||e.walks.length>0?gn(Nc(e),u=>g.get(u)??0):void 0;return{name:t,nodes:n,edges:r,paths:s.length>0?s:void 0,anchorPaths:p?.anchorPaths,pathVisits:p?.pathVisits,anchoredBy:n.some(u=>u.stable)?"tags":void 0}}var Cc="\0deletion:",Ec=.5;function _a(e,t,n=new Set){let r=new Map(t.map(a=>[a.edgeIndex,`${Cc}${a.edgeIndex}`])),o=[];return e.edges.forEach((a,i)=>{let s=r.get(i);if(!n.has(i))if(s===void 0)o.push(a);else{let{fromStrand:c,toStrand:d}=a;o.push({from:a.from,to:s,...c?{fromStrand:c}:{}},{from:s,to:a.to,...d?{toStrand:d}:{}})}}),{graph:{...e,nodes:[...e.nodes,...[...r.values()].map(a=>({id:a,name:a,length:0,depth:0}))],edges:o},routes:r,ids:new Set(r.values())}}function Oa(e,t){let n=new Map(e.nodes.map(r=>[r.id,r.length]));return new Set(t.filter(r=>r.bypassed.reduce((o,a)=>o+(n.get(a)??0),0)>=r.bp).map(r=>r.edgeIndex))}function Wa(e,t,n,r,o){let a=new Map(e.nodes.map(i=>[i.id,i.length]));return t.map(i=>{let s=i.bypassed.reduce((m,g)=>m+(a.get(g)??0),0),c=Math.max(o.minimumNodeLength,r(s)*Ec),d=n.get(i.edgeIndex);return{id:d,name:d,length:Math.round(c*1e6/o.nodeLengthPerMegabase),depth:0}})}function Ha(e,t){let n={...e},r={};for(let[o,a]of t){let i=n[a];delete n[a],i?.length&&(r[o]=i)}return{nodePositions:n,deletionRoutes:r}}function Fn(e,t,n={}){let r=fn(Va($a(e),t),n.referencePath);if(r.nodes.length===0)throw new Error(`No graph segments in ${t}`);if(n.maxNodes!==void 0&&r.nodes.length>n.maxNodes)throw new Error(`Graph too large to draw: ${r.nodes.length.toLocaleString()} nodes (limit ${n.maxNodes.toLocaleString()}). Zoom in to a smaller region, or raise maxGraphNodes on this view.`);return r}var Bc=15;function ja(e,t,n){let r=e.nodes.some(D),o={...t,opts:{...t.opts,edgeLength:t.opts.edgeLength*(n.spacing??1)}};return{graph:{nodes:r?Ea(e,o):o.nodes,edges:e.edges},options:{quality:n.quality,linearLayout:n.linearLayout,...o.opts,componentSeparation:Bc*(n.componentSeparation??1),...r?{rotateComponents:!1}:{}}}}function $n(e,t){let n=e.nodes.some(D);return`${t.quality}|${t.linearLayout}|${t.bubbleSpread}|${t.spacing??1}|${t.componentSeparation??1}|${t.showDeletionEdges!==!1}|${n}|${e.referencePath??""}`}async function Dn(e,t,n){let r=xo(t.bubbleSpread),o=be(e),a=t.showDeletionEdges===!1?Oa(e,o):new Set,i=o.filter(x=>!a.has(x.edgeIndex)),s=_a(e,i,a),c=eo(s.graph,s.ids),d={...c.graph,nodes:c.graph.nodes.filter(x=>!s.ids.has(x.id))},m=Sn(d,r),{result:g,duration:p}=await n(ja(c.graph,{...m,nodes:[...m.nodes,...Wa(e,i,s.routes,wo(d,r),m.opts)]},t)),u=Sn(e,r),y=new Map(u.nodes.map(x=>[x.id,Tt(u.opts,x.length)])),S=to(g.nodePositions,c.runs,x=>y.get(x)??0),{nodePositions:k,deletionRoutes:h}=Ha(e.nodes.some(D)?Ia(e,S):S,s.routes);return{result:{...g,nodePositions:k,stranded:!0,...i.length?{deletionRoutes:h,extent:Vn(h)}:{}},duration:p}}function Vn(e){let t=1/0,n=1/0,r=-1/0,o=-1/0;for(let a of Object.values(e))for(let i of a)t=Math.min(t,i.x),n=Math.min(n,i.y),r=Math.max(r,i.x),o=Math.max(o,i.y);return{minX:t,minY:n,maxX:r,maxY:o}}var $=40,Fc=1e-6,$c=100;function Pe(e){return Math.max(Fc,Math.min($c,e))}function Vt(e,t,n,r=$){let o=t-e.h*n;return r-e.minY*n+Math.max(0,o)/2}function Ge(e,t,n,r,{minScale:o=0,padLeft:a=$,padTop:i=$,padRight:s=$,padBottom:c=$}={}){let d=t-a-s,m=n-i-c;if(d<=0||m<=0||!(e.w>0||!r&&e.h>0))return;let g=e.w>0?d/e.w:1/0,p=e.h>0?m/e.h:1/0,u=Pe(Math.max(o,r?g:Math.min(g,p))),y=d-e.w*u;return{scale:u,translateX:a-e.minX*u+Math.max(0,y)/2,translateY:Vt(e,m,r?1:u,i)}}function Qe(e,t={}){let{minX:n,minY:r,maxX:o,maxY:a}=Vn(e.nodePositions),{region:i}=t;e.referenceAxis&&i&&i.end>i.start&&(n=i.start,o=i.end);let s=t.extent??e.extent;return s&&(n=Math.min(n,s.minX??n),r=Math.min(r,s.minY??r),o=Math.max(o,s.maxX??o),a=Math.max(a,s.maxY??a)),{minX:n,minY:r,w:o-n,h:a-r}}function ke(e,t){return{scaleX:e,scaleY:t?1:e,pixelRows:t}}function _n(e,t,n,r){return{minX:-e.translateX/t.scaleX,minY:-e.translateY/t.scaleY,maxX:(n-e.translateX)/t.scaleX,maxY:(r-e.translateY)/t.scaleY}}function On(e,t){let n=(e.maxX-e.minX)*t,r=(e.maxY-e.minY)*t;return{minX:e.minX-n,minY:e.minY-r,maxX:e.maxX+n,maxY:e.maxY+r}}function Wn(e,t){return t.minX>=e.minX&&t.maxX<=e.maxX&&t.minY>=e.minY&&t.maxY<=e.maxY}function Hn(e,t,n,r,o){let a=Pe(e.scale*t),i=a/e.scale;return{scale:a,translateX:n-(n-e.translateX)*i,translateY:o?e.translateY:r-(r-e.translateY)*i}}var M=w(re(),1),qa=w(za(),1);var xe=w(re(),1);function Ya(e){return t=>e.includes(t)?t:void 0}function jn(e){return xe.types.snapshotProcessor(xe.types.maybe(xe.types.enumeration(e)),{preProcessor:Ya(e)})}function Xn(e,t){return xe.types.snapshotProcessor(xe.types.optional(xe.types.enumeration(e),t),{preProcessor:Ya(e)})}var Ja=600,Ot=160,Wt=[1,1,1,1],Ht=[.12,.12,.12,1],Za=([e,t,n])=>`rgb(${[e,t,n].map(r=>Math.round(r*255)).join(", ")})`,Qa=5,Ie=new Set(["tubemap","tubemapref"]),ei=(0,Ka.lazy)(()=>import("./chunks/ChooseWalksDialog-GVQLSGHX.js")),zn=12,ti=[{value:"",label:"Off"},{value:"walk",label:"A panel per walk"},{value:"sample",label:"A row per sample, a column per haplotype"}],Dc=M.types.snapshotProcessor(M.types.model("GraphFacet",{field:M.types.optional(M.types.enumeration(["","walk","sample"]),""),domain:M.types.optional(M.types.frozen(),[]),columns:M.types.maybe(M.types.number)}),{preProcessor:e=>Nt(e)}),ni=[{bp:0,label:"None"},{bp:3,label:"Under 3 bp"},{bp:10,label:"Under 10 bp"},{bp:50,label:"Under 50 bp, leaving structural variants"},{bp:1e3,label:"Under 1 kb"}],Ua=".segs.bed.gz";function ri(e){if(typeof e.uri=="string")return e.uri;let n=e.segmentsLocation?.uri;return typeof n=="string"&&n.endsWith(Ua)?n.slice(0,-Ua.length):void 0}var Yn=1.4,oi=1.6,ai=150,ii=1,Un=40,Kn={nodeStrokes:[],nodeStrokeRuns:new Map,arrows:[],arrowRuns:new Map,edgeCurves:[],edgeCurveRuns:new Map};function ue(...e){}var et=5e6;function Se(e){return e>=1e6?`${+(e/1e6).toFixed(1)} Mb`:`${Math.round(e/1e3)} kb`}var si=2e4;function Ce(e){return e&&"uri"in e&&e.uri?new URL(e.uri,e.baseUri??window.location.href).href:void 0}function qn(e){return e.builtViewport!==void 0&&e.paintedViewport===e.builtViewport&&e.builtViewport.viewportDirty===e.viewportDirty&&!e.viewportRebuildPending}function tt(e){let{width:t,height:n}=e.viewBox;return _n(e,e.axisScale,t,n)}var _t=new WeakMap,Vc=4;function ci(e){let t=_t.get(e);return t||(t=new Map,_t.set(e,t)),t}function di(e,t){let n=_t.get(e);n&&e!==t&&_t.set(t,n)}function pi(e,t,n){e.size>=Vc&&e.delete(e.keys().next().value),e.set(t,n)}var ui=M.types.compose("GraphPane",(0,qa.RenderLifecycleMixin)(),M.types.model({layoutQuality:M.types.optional(M.types.number,2),linearLayout:M.types.optional(M.types.boolean,!1),layoutMode:jn(xt),colorScheme:jn(St),bubbleSpread:Xn(ko,"auto"),nodeWidth:Xn(uo,"depth"),showBubbles:M.types.optional(M.types.boolean,!1),showDeletionEdges:M.types.optional(M.types.boolean,!0),showGenes:M.types.optional(M.types.boolean,!0),showReferenceStrip:M.types.optional(M.types.boolean,!0),tubeMapFold:M.types.optional(M.types.number,0),geneTrackId:M.types.optional(M.types.string,""),repeatTrackId:M.types.optional(M.types.string,""),repeatKey:M.types.optional(M.types.string,""),walkRowSamples:M.types.maybe(M.types.frozen()),walkStrip:M.types.optional(M.types.boolean,!1),walkLayers:M.types.optional(M.types.frozen(),[]),facet:M.types.optional(Dc,{}),referencePath:M.types.optional(M.types.string,""),showPerf:M.types.optional(M.types.boolean,!1),contigThickness:M.types.optional(M.types.number,6),connectorThickness:M.types.optional(M.types.number,2),darkMode:M.types.optional(M.types.boolean,!1),scale:M.types.optional(M.types.number,1),translateX:M.types.optional(M.types.number,0),translateY:M.types.optional(M.types.number,0),drawPaths:M.types.optional(M.types.boolean,!1),paneHeight:M.types.maybe(M.types.number),maxGraphNodes:M.types.optional(M.types.number,si),colorDomain:M.types.maybe(M.types.frozen()),connectedViewId:M.types.maybe(M.types.string)})).volatile(()=>({graph:void 0,graphRegion:void 0,loadedReferencePath:void 0,layoutResult:void 0,legendSize:{width:0,height:0},indexBubbles:void 0,geneTrackFeatures:void 0,walkGeneFeatures:void 0,repeatArrays:void 0,popStack:[],error:void 0,isLoading:!1,loadCanceled:!1,statusMessage:"",hoveredNode:null,hoveredRowWalks:[],hoveredBubble:null,pointerInPane:!1,stripHover:null,hoveredEdge:null,selectedNode:null,viewportDirty:0,positionsVersion:0,geometryVersion:0,builtViewport:void 0,paintedViewport:void 0,draggingNode:null,isPanning:!1,viewportOwner:"fit",viewportDirtyTimer:void 0,positionsDirtyFrame:0,lastFetchMs:void 0,readsShown:void 0,lastLayoutMs:void 0,lastGeometryMs:void 0,lastGeometryStrokeCount:void 0,viewportRebuildPending:!1}));var ss=w(ae(),1),me=w(re(),1),O=w(bt(),1);function Jn(e,t){let n=new Set(t),r=e.nodes.filter(c=>n.has(c.name)),o=new Set(r.map(c=>c.id)),a=new Map(e.nodes.map(c=>[c.id,c.length])),i=new Map,s=e.paths?.flatMap(c=>{let d=c.nodeIds.findIndex(p=>o.has(p));if(d<0)return[];let m=c.nodeIds.filter(p=>o.has(p));i.set(c.name,{first:d,nodeIds:m});let g=c.nodeIds.slice(0,d).reduce((p,u)=>p+(a.get(u)??0),0);return[{...c,nodeIds:m,...c.start===void 0?{}:{start:c.start+g}}]});return{name:e.name,nodes:r,edges:e.edges.filter(c=>o.has(c.from)&&o.has(c.to)),...s?.length?{paths:s}:{},anchorPaths:Ve(e,i),pathVisits:e.pathVisits,anchoredBy:e.anchoredBy,referencePath:e.referencePath}}function mi(e,t){let n=new Set(e.nodes.filter(c=>D(c)&&jr(c,t)).map(c=>c.id)),r=e.paths??[];if(n.size===0||r.length===0)return e;let o=r.map(c=>{let d=-1,m=-1;return c.nodeIds.forEach((g,p)=>{n.has(g)&&(d<0&&(d=p),m=p)}),d<0?void 0:{first:d,last:m}});if(o.every((c,d)=>c?.first===0&&c.last===r[d].nodeIds.length-1))return e;let a=new Set,i=[],s=new Map;return r.forEach((c,d)=>{let m=o[d];if(m){let g=c.nodeIds.slice(m.first,m.last+1);for(let p of g)a.add(p);i.push({...c,nodeIds:g}),s.set(c.name,{first:m.first,nodeIds:g})}}),{...e,nodes:e.nodes.filter(c=>a.has(c.id)),edges:e.edges.filter(c=>a.has(c.from)&&a.has(c.to)),paths:i,pathVisits:e.pathVisits&&_c(e.pathVisits,r,o,new Map(e.nodes.map(c=>[c.id,c.name]))),anchorPaths:Ve(e,s)}}function _c(e,t,n,r){let o=new Map,a=new Map;return t.forEach((i,s)=>{let c=K(i.name).name,d=n[s];i.nodeIds.forEach((m,g)=>{let p=r.get(m)??m,u=e.get(p);if(!u)return;let y=`${c} ${p}`,S=o.get(y)??0;for(;S<u.length&&u[S].path!==c;)S++;let k=u[S];if(o.set(y,S+1),k&&d&&g>=d.first&&g<=d.last){let h=a.get(p);h?h.push(k):a.set(p,[k])}})}),a}function Oc(e,t,n){let r=K(e.name).name,o=new Map,a=[],i=()=>({a:-1/0,b:1/0,detour:[],bp:0}),s=[i()];for(let c of e.nodeIds){let d=t.get(c);if(!d)continue;let m=o.get(d.name)??0;o.set(d.name,m+1);let g=n.get(`${r} ${d.name}`)?.[m]??Jr(d),p=s.at(-1),u=a.at(-1);if(D(d)){let y=d.stable.start,S=y+d.length,k=g!==(d.stable.strand??"+"),h=u!==void 0&&p.detour.length===0;h&&!u.inverted&&!k&&u.end===y?u.end=S:h&&u.inverted&&k&&u.start===S?u.start=y:(a.push({start:y,end:S,inverted:k}),s.push(i()))}else p.detour.push({node:d,strand:g}),p.bp+=d.length}return a.forEach((c,d)=>{s[d].b=c.start,s[d+1].a=c.end}),{path:e,runs:a,gaps:s}}function Zn(e,t){return Number.isFinite(e.a)&&Number.isFinite(e.b)&&e.b>=e.a&&Math.max(e.b-e.a,e.bp)<t}function li(e,t,n){let r=0,o=e.length;for(;r<o;){let a=r+o>>1;e[a]<=t?r=a+1:o=a}return r<e.length&&e[r]<n}function Wc(e){let t=new Map;for(let n=1;n<e.length;n++){let r=e[n-1],o=e[n],a=r.stable.start+r.length;a!==o.stable.start&&(t.set(a,"reference-gap"),t.set(o.stable.start,"reference-gap"))}return t}function Hc(e,t,n){let r=(o,a)=>{Number.isFinite(o)&&!n.has(o)&&n.set(o,a)};for(let{runs:o,gaps:a}of e){let i=o[0],s=o.at(-1);i&&s&&(r(i.start,"walk-end"),r(s.end,"walk-end"));for(let c of o)c.inverted&&c.end-c.start>=t&&(r(c.start,"inversion"),r(c.end,"inversion"));for(let c of a)c.b<c.a?(r(c.a,"backward"),r(c.b,"backward")):Zn(c,t)||(r(c.a,"variant"),r(c.b,"variant"))}for(let o=!0;o;){o=!1;let a=[...n.keys()].sort((s,c)=>s-c),i=e.flatMap(({runs:s,gaps:c})=>[...c.filter(d=>Zn(d,t)).map(d=>[d.a,d.b]),...s.filter(d=>d.inverted&&d.end-d.start<t).map(d=>[d.start,d.end])]);for(let[s,c]of i)li(a,s,c)&&(o||=!n.has(s)||!n.has(c),r(s,"overlap"),r(c,"overlap"))}return n}function jc(e,t){let n=[],r=[],o=()=>{let a=r[0],i=r.at(-1);if(a&&i){let s=a.stable.start,c=i.stable.start+i.length,d=`${s}-${c}`;n.push({node:{id:`${d}+`,name:d,length:c-s,depth:0,stable:{refName:a.stable.refName,start:s,rank:0,strand:"+"}},members:r})}r=[]};for(let a of e)t.has(a.stable.start)&&o(),r.push(a);return o(),n}function gi(e,t){let n=e.nodes.filter(D).sort((f,T)=>f.stable.start-T.stable.start),r=e.paths??[];if(n.length===0||r.length===0)return;let o=new Map(e.nodes.map(f=>[f.id,f])),a=oo(e),i=r.map(f=>Oc(f,o,a)),s=Hc(i,t,Wc(n)),c=[...s.keys()].sort((f,T)=>f-T),d=jc(n,s),m=d.map(f=>f.node.stable.start),g=f=>{let T=0,R=m.length-1;for(;T<R;){let N=T+R+1>>1;m[N]<=f?T=N:R=N-1}return T},p=new Map,u=new Map;for(let f of d){p.set(f.node.id,f.members.map(T=>T.id));for(let T of f.members)u.set(T.id,f.node.id)}let y=new Map,S=f=>{let T=`${f.a} ${f.b} ${f.detour.map(N=>N.node.id+N.strand).join(",")}`,R=y.get(T);if(!R){let N=`r${y.size}`;R={id:`${N}+`,name:N,length:f.bp,depth:0,stable:{refName:n[0].stable.refName,start:Number.isFinite(f.a)?f.a:f.b,rank:1,strand:"+"}},y.set(T,R),p.set(R.id,f.detour.map(G=>G.node.id));for(let G of f.detour)u.has(G.node.id)||u.set(G.node.id,R.id)}return R},k=new Map,h=[],x=new Map,l=new Map,b=new Map;for(let{path:f,runs:T,gaps:R}of i){let N=[],G=[],I=!1,W=(v,z)=>{let A=N.at(-1);I&&A?.node===v&&A.strand===z||N.push({node:v,strand:z}),I=!0},B=v=>{I=!1,v.detour.length>0&&(W(S(v),"+"),I=!1)},J=v=>{(v.bp>0||v.b>v.a)&&G.push({start:v.a,end:v.b,bp:v.bp});let z=d[g(v.b>v.a?v.a:v.a-1)];for(let A of v.detour)u.has(A.node.id)||(u.set(A.node.id,z.node.id),p.get(z.node.id).push(A.node.id))};T.forEach((v,z)=>{let A=R[z];Zn(A,t)&&!li(c,A.a,A.b)?J(A):B(A);let P=g(v.start),E=g(v.end-1),V=v.end-v.start<t;if(v.inverted&&!V){I=!1;for(let F=E;F>=P;F--)W(d[F].node,"-");I=!1}else{v.inverted&&G.push({start:v.start,end:v.end,bp:v.end-v.start,inverted:!0});for(let F=P;F<=E;F++)W(d[F].node,"+")}}),B(R.at(-1));let Z=K(f.name).name,te=0;N.forEach(({node:v,strand:z},A)=>{b.set(v.id,(b.get(v.id)??0)+1);let P=x.get(v.name)??[];P.push({path:Z,sample:f.sample??Z,start:te,strand:z}),x.set(v.name,P),te+=v.length;let E=N[A+1];if(E){let V=`${v.id}${z} ${E.node.id}${E.strand}`,F=l.get(V);F?F.pathIds.push(f.name):l.set(V,{from:v.id,to:E.node.id,fromStrand:z,toStrand:E.strand,pathIds:[f.name]})}}),h.push({...f,nodeIds:N.map(v=>v.node.id)}),k.set(f.name,G)}let L=[...d.map(f=>f.node),...y.values()].filter(f=>b.has(f.id)).map(f=>({...f,depth:b.get(f.id)}));return{graph:{...e,nodes:L,edges:[...l.values()],paths:h,pathVisits:x,reads:void 0},members:p,coarseOf:u,deviations:k,cuts:s}}var es=w(U(),1),ee=w(ae(),1),ts=w(gc(),1),q=w(re(),1);var mt=w(ae(),1),wr=w(re(),1);var j=e=>+e.toFixed(1);function Xc(e){let t=/^rgba?\(([^,]+),([^,]+),([^,)]+)(?:,([^)]+))?\)$/.exec(e.replaceAll(" ",""));if(!t)return{color:e,opacity:1};let n=t[4]===void 0?1:Number(t[4]);return{color:`rgb(${t[1]},${t[2]},${t[3]})`,opacity:n}}function Qn(e,t){let{color:n,opacity:r}=Xc(t);return`${e}="${n}"${r<1?` ${e}-opacity="${j(r)}"`:""}`}var hi=.5,fi=.25;function bi(e,t){let n=[],r=[],o=(d,m)=>{let g={d:`M${j(d)} ${j(m)}`,segments:0,x0:d,x1:d,y0:m,y1:m};return r.push(g),g},a=d=>{let m=r.at(-1)??o(d[0],d[1]);for(let g=0;g<d.length;g+=2)m.x0=Math.min(m.x0,d[g]),m.x1=Math.max(m.x1,d[g]),m.y0=Math.min(m.y0,d[g+1]),m.y1=Math.max(m.y1,d[g+1]);return m.segments++,m},i=d=>{let m=new Set;return r.map(g=>{if(!d||g.x1-g.x0>=hi||g.y1-g.y0>=hi)return g.d;let p=(g.x0+g.x1)/2,u=(g.y0+g.y1)/2,y=`${Math.round(p/fi)} ${Math.round(u/fi)}`;return g.segments===0||m.has(y)?"":(m.add(y),`M${j(p)} ${j(u)}h0`)}).join("")},s={canvas:void 0,fillStyle:"#000",strokeStyle:"#000",lineWidth:1,lineCap:"butt",lineJoin:"miter",beginPath(){r=[]},moveTo(d,m){o(d,m)},lineTo(d,m){a([d,m]).d+=`L${j(d)} ${j(m)}`},bezierCurveTo(d,m,g,p,u,y){a([d,m,g,p,u,y]).d+=`C${j(d)} ${j(m)} ${j(g)} ${j(p)} ${j(u)} ${j(y)}`},closePath(){let d=r.at(-1);d&&(d.d+="Z")},stroke(){let d=i(s.lineCap!=="butt");d&&n.push(`<path d="${d}" fill="none" ${Qn("stroke",s.strokeStyle)} stroke-width="${j(s.lineWidth)}" stroke-linecap="${s.lineCap}" stroke-linejoin="${s.lineJoin}"/>`)},fill(){let d=i(!1);d&&n.push(`<path d="${d}" ${Qn("fill",s.fillStyle)}/>`)},fillRect(d,m,g,p){n.push(`<rect x="${j(d)}" y="${j(m)}" width="${j(g)}" height="${j(p)}" ${Qn("fill",s.fillStyle)}/>`)}},c={width:e,height:t,style:{},getContext:()=>s};return s.canvas=c,{canvas:c,markup:()=>n.join("")}}function nt(e,t,n){let r=new Map;for(let a of e.nodes)if(Wr(a)){let{refName:i}=a.stable;if(n[a.id]?.length){let s=r.get(i)??r.set(i,{nodes:[],reach:0}).get(i);s.nodes.push(a),s.reach=Math.max(s.reach,a.length)}}for(let{nodes:a}of r.values())a.sort((i,s)=>i.stable.start-s.stable.start);let o=[];for(let a of t){let i=r.get(a.refName);if(!i)continue;let s=[],c=[],d=new Set,m,g=1/0,p=0,u=(a.start+a.end)/2,{nodes:y,reach:S}=i;for(let k=Xr(y,a.start-S);k<y.length&&y[k].stable.start<a.end;k++){let h=y[k],x=h.stable.start,l=x+h.length;if(l<=a.start)continue;let b=n[h.id];d.add(h.id),p+=Math.min(l,a.end)-Math.max(x,a.start);let L=[];for(let R of a.exons){let N=Math.max(R.start,x),G=Math.min(R.end,l);if(G<=N)continue;let I=yn(b,(N-x)/h.length,(G-x)/h.length);I.length===1&&I.push({...I[0]}),L.push(wt(I))}L.length>0&&(s.push(...L),c.push({nodeId:h.id,d:L.join("")}));let f=Math.min(Math.max(u,x),l),T=Math.abs(f-u);if(T<g){g=T;let[R]=yn(b,(f-x)/h.length,(f-x)/h.length);m=R}}m&&o.push({gene:a,exons:s.join(""),exonsByNode:c,nodeIds:d,at:m,covered:p/(a.end-a.start)})}return o}var yi="6.1.0";var wi=(e,t)=>!!e.referencePath&&K(t).name===e.referencePath;function zc(e,t){return(e.paths??[]).filter(n=>n.name===t).sort((n,r)=>(n.start??0)-(r.start??0))}function ki(e,t){let n=zc(e,t),r=n[0];if(!r)return;let o=new Map(e.nodes.map(h=>[h.id,h])),a=new Map;e.edges.forEach((h,x)=>{a.set(`${h.from}>${h.to}`,x)});let i=h=>o.get(h)?.length??0,s=h=>h.nodeIds.reduce((x,l)=>x+i(l),0),c=n.reduce((h,x)=>h+s(x),0),d=r.start===void 0?void 0:{contig:r.contig??Or(K(t).name),start:r.start,end:Math.max(...n.map(h=>(h.start??0)+s(h)))},m=d?d.end-d.start:c,g=new Set,p=new Set,u=new Map,y=0;for(let h of n)d&&(y=Math.max(y,(h.start??0)-d.start)),h.nodeIds.forEach((x,l)=>{if(g.add(x),l>0){let L=h.nodeIds[l-1],f=a.get(`${L}>${x}`)??a.get(`${x}>${L}`);f!==void 0&&p.add(f)}let b=i(x);u.has(x)||u.set(x,m>0?(y+b/2)/m:0),y+=b});let S=wi(e,t),k=S?[]:(e.paths??[]).filter(h=>wi(e,h.name));return{name:t,reference:S,range:d,nodeIds:g,edgeIndexes:p,progress:u,steps:n.reduce((h,x)=>h+x.nodeIds.length,0),bp:c,referenceBp:k.length>0?k.reduce((h,x)=>h+s(x),0):void 0}}function xi(e,t,n,r){let o=new Map(e.nodes.map(i=>[i.id,i])),a=new Map;for(let[i,s]of t.progress){let c=o.get(i),d=r?.midpoints.get(i),m=n.field==="progress"?s:r&&d!==void 0&&!(c?.stable&&c.stable.rank>0)?(d-r.start)/r.span:void 0;a.set(i,bo(n,m))}return a}function Yc(e,t){let n=new Set,r=0,o=e.referencePath;if(!o||t.reference)return{reversed:n,bp:r};let a=K(t.name).name,i=new Map(e.nodes.map(s=>[s.id,s]));for(let s of t.progress.keys()){let c=i.get(s),d=c?e.pathVisits?.get(c.name):void 0,m=d?.find(p=>p.path===a)?.strand,g=d?.find(p=>p.path===o)?.strand;m&&g&&m!==g&&(n.add(s),r+=c.length)}return{reversed:n,bp:r}}function rt(e,t,n){let r=new Set,o=t.filter(s=>!r.has(s.walk)&&r.add(s.walk)).flatMap(s=>{let c=ki(e,s.walk);return c?[{walk:c,layer:s}]:[]}).sort((s,c)=>Number(c.walk.reference)-Number(s.walk.reference));if(o.length===0)return;let a=0,i=o.map(({walk:s,layer:c})=>{let d=kn(c,s.reference,s.reference?0:a++,o.length===1),{reversed:m,bp:g}=Yc(e,s);return{...s,encoding:d,colors:xi(e,s,d,n),reversed:m,reversedBp:g}});return Si(i,n)}var Uc={field:"progress",scheme:"red"};function ot(e,t,n,r){return t.walks.map(o=>{let a=n.find(s=>s.walk===o.name)?.color,i=kn({walk:o.name,color:{...Uc,...a}},o.reference,0);return Si([{...o,encoding:i,colors:xi(e,o,i,r)}],r)})}function Si(e,t){return{walks:e,referenceDomain:t?{start:t.start,end:t.start+t.span}:void 0,nodeIds:new Set(e.flatMap(n=>[...n.nodeIds])),edgeIndexes:new Set(e.flatMap(n=>[...n.edgeIndexes])),names:new Set(e.map(n=>n.name))}}var tr='font-family="Helvetica, Arial, sans-serif" font-size="11"',Kc=48,jt=18,qc=16,Jc=22,Zc="rgb(160,160,160)",Mi="#1c1c22";function Re(e){return e.replaceAll("&","&").replaceAll("<","<").replaceAll(">",">").replaceAll('"',""")}function er(e,t,n,r,o,a,i,s=1){let c=r.length>1?Kc:jt,d=r.length>1?`fill="url(#${e})"`:`fill="${r[0].color}"${s<1?` fill-opacity="${s}"`:""}`,m=r.length>1?`<linearGradient id="${e}">${r.map(p=>`<stop offset="${p.offset}" stop-color="${p.color}"/>`).join("")}</linearGradient>`:"";return{width:Math.max(c+5+(o.length+a.length)*yt,(i?.length??0)*yt),markup:`${m}<g transform="translate(${t} ${n})" ${tr}><rect y="5" width="${c}" height="8" rx="2" ${d}/><text x="${c+5}" y="13"><tspan font-weight="bold">${Re(o)}</tspan>${Re(a)}</text>${i?`<text y="28">${Re(i)}</text>`:""}</g>`}}function Qc(e,t){return{width:jt+5+4*yt,markup:`<g transform="translate(${e} ${t})" ${tr}><rect x="1" y="4" width="${jt-2}" height="10" rx="4" fill="none" stroke="${An}" stroke-width="2"/><text x="${jt+5}" y="13">exon</text></g>`}}function Ri(e,t,n,r,o,a){let i=$o(r,a);return er(e,t,n,xn(r.encoding),o,i.delta+i.outside+i.reversed,i.scale)}function ed(e,t){return e.replaceAll(/([ML])(-?[\d.e-]+),(-?[\d.e-]+)/g,(n,r,o,a)=>`${r}${+(Number(o)*t.scaleX+t.translateX).toFixed(1)},${+(Number(a)*t.scaleY+t.translateY).toFixed(1)}`)}function td(e,t,n,r,o){return`<rect x="${e-n/2}" y="${t-_e-bn+2}" width="${n}" height="${_e+bn*2-2}" rx="3" fill="#fff" fill-opacity="0.85" stroke="${An}"/><text x="${e}" y="${t}" font-family="Helvetica, Arial, sans-serif" font-size="${_e}" fill="${Mi}" text-anchor="middle"><tspan font-style="italic" font-weight="600">${Re(r)}</tspan>${o?Re(o):""}</text>`}function nr(e,t,n={}){let r=n.width??1200,o=n.height??800,a=n.region,i=n.colorDomain??a,s=n.walkRows,c=Qe(t,{region:n.fitToDrawing?void 0:a,extent:s&&t.extent?je(s):void 0}),d=t.pixelRows??!1,m=new Map(e.nodes.map(A=>[A.id,A])),g=Rt(n.colorScheme??"auto",e),p=g==="reference-position"&&!t.tubeMap?Ae(e,i):void 0,u=p&&{start:p.start,end:p.start+p.span},y=t.tubeMap?[]:be(e),S=n.walks??[],k=S.some(A=>A.color?.field==="reference")?p??Ae(e,i):void 0,h=S.length>0&&!t.tubeMap?rt(e,S,k):void 0,x=Nt(n.facet),l=x.field&&h&&h.walks.length>1?ot(e,h,S,k):void 0,b=new Map((e.paths?.length?Oe(e.paths):[]).map(A=>[A.name,A.label])),L=A=>b.get(A)??A,f=n.referenceName??pn(e,a),T=h?.referenceDomain&&{...h.referenceDomain,name:f},R=n.contigThickness??6,N=n.nodeWidth??"depth",G=n.genes?.length&&!t.tubeMap&&!s?nt(e,n.genes,t.nodePositions):[],I=Mt(e,m,R,N),W=0;function B(A,P,E,V){let F=[],se=Bo(Eo(G,I.halfWidthPx,A,Y=>ed(Y,P)),{id:`exons${W++}`,width:E,height:V});se&&F.push(we(se));let H=Y=>({x:Y.x*P.scaleX+P.translateX,y:Y.y*P.scaleY+P.translateY}),ce={width:E,height:V};for(let{item:Y,x:fe,y:ve,w:uc,text:mc}of Qr(_o(G,H,R,Vo(t.nodePositions,P)),ce,Zr(ce))){let lc=H(Y.at).y+R/2;F.push(`<line x1="${fe}" x2="${fe}" y1="${ve-_e-2}" y2="${lc}" stroke="${Mi}" stroke-width="0.8" stroke-opacity="0.6"/>`,td(fe,ve,uc,Y.gene.name,mc.slice(Y.gene.name.length)))}s&&F.push(we(vn(s,{...P,width:E,height:V},{ramp:u,rowGenes:n.rowGenes})));let ht=s?[s.reference,...s.rows].map((Y,fe)=>({label:Y.label,y:fe*le})):t.rowLabels??[];for(let{label:Y,y:fe}of ht){let ve=fe*P.scaleY+P.translateY;ve>=0&&ve<=V&&F.push(`<text x="6" y="${ve+4}" ${tr} stroke="#fff" stroke-width="3" paint-order="stroke">${Re(Y)}</text>`)}return F.join("")}function J(A,P,E){let V=Ge(c,P,E,d,l?{padLeft:oe,padTop:oe,padRight:oe,padBottom:oe}:{});if(!V)return"";let F=ke(V.scale,d),{canvas:se,markup:H}=bi(P,E),ce=new Co(se);ce.uploadGeometry(Lt({nodePositions:s?{}:t.nodePositions,graph:e,nodeById:m,colorScheme:g,contigThickness:R,connectorThickness:n.connectorThickness??2,drawPaths:!1,nodeWidth:N,highlight:A,axis:F,referenceRamp:p,deletions:new Map(y.map(Y=>[Y.edgeIndex,Y.bypassed])),deletionRoutes:t.deletionRoutes,stranded:t.stranded,hiddenEdges:new Set(n.showDeletionEdges?[]:y.map(Y=>Y.edgeIndex))}));let ht={scaleX:F.scaleX,scaleY:F.scaleY,translateX:V.translateX,translateY:V.translateY};return ce.updateTransform({...ht,dpr:1}),ce.render([1,1,1,1]),H()+B(A,ht,P,E)}let Z=[],te;if(l){let A=Pt(l.map(E=>E.walks[0].name),x.field||"walk",x.domain),P=At({count:A.count,bounds:c,pixelRows:d,width:r,room:o,columns:A.columns??x.columns});l.forEach((E,V)=>{let F=A.cells[V],se=F%P.columns*(P.width+Rn),H=Math.floor(F/P.columns)*(P.height+vt+Rn),ce=E.walks[0];Z.push(Ri(`key${V}`,se+6,H+2,ce,L(ce.name),T).markup,`<svg x="${se}" y="${H+vt}" width="${P.width}" height="${P.height}">${J(E,P.width,P.height)}</svg>`)}),te=P.total}else{let A=6,P=H=>{Z.push(H.markup),A+=H.width+qc};if(h&&(h.walks.forEach((H,ce)=>{P(Ri(`key${ce}`,A,2,H,L(H.name),T))}),P(er("faded",A,2,[{offset:0,color:Zc}],"",`not on ${h.walks.length===1?L(h.walks[0].name):"these walks"}`,void 0,.3))),s){let H=Tn(Ln(s,{ramp:u,genes:n.rowGenes?.size?n.rowGeneGaps:void 0}),A,2,"rows-key");P({width:H.width,markup:we(H.tree)})}else!h&&p&&P(er("ramp",A,2,xn({field:"reference",scheme:"rainbow"}),f?`${f} position`:"Reference position","",Fo(f,p.start,p.start+p.span)));G.some(H=>H.exonsByNode.length>0)&&P(Qc(A,2));let E=Z.length>0?vt:0,V=r-2*$,F=d||!(c.w>0)?c.h:c.h*V/c.w,se=Math.max(160,Math.min(o-E,Math.ceil(F+2*$)));Z.push(`<svg y="${E}" width="${r}" height="${se}">${J(h,r,se)}</svg>`),te=E+se}let v=n.walkStrip;if(v&&!s&&!t.tubeMap){let A=Ct(v.rows,{width:r}),P=Tn(Ln(v.rows,{ramp:u,genes:Go(A,v.rowGenes,v.rowGeneGaps)}),6,te+A.height,"strip-key");Z.push(`<line x1="0" x2="${r}" y1="${te+.5}" y2="${te+.5}" stroke="#ddd"/>`,`<svg y="${te}" width="${r}" height="${A.height}">${we(vn(v.rows,A,{ramp:u,rowGenes:v.rowGenes,idPrefix:"strip"}))}${we(Po(v.rows,A,new Set(S.map(E=>E.walk))))}</svg>`,we(P.tree)),te+=A.height+Jc}let z=JSON.stringify({generator:`@jbrowse/bandage-core@${yi}`,...n.spec===void 0?{}:{spec:n.spec}});return`<svg xmlns="http://www.w3.org/2000/svg" width="${r}" height="${te}" viewBox="0 0 ${r} ${te}"><metadata>${Re(z)}</metadata><rect width="${r}" height="${te}" fill="#fff"/>${Z.join("")}</svg>
|
|
3
|
+
`}var nd=24,rd=e=>e.bp1>e.bp0;function Li(e,t){let n=e.filter(rd);if(n.length===0){let a=e[0];return a?[{tx:a.x0,sx:t(a.bp0)}]:[]}let r=n.map(a=>({c:a,s0:t(a.bp0),s1:t(a.bp1),trimLeft:0,trimRight:0}));for(let a=0;a+1<r.length;a++){let i=r[a],s=r[a+1],d=Math.min(s.c.x0-i.c.x1,nd)-(s.s0-i.s1);if(d>0){let m=(i.s1-i.s0)/2,g=(s.s1-s.s0)/2,p=Math.min(d/2,m),u=Math.min(d-p,g);p=Math.min(d-u,m),i.trimRight=p,s.trimLeft=u}}let o=[];for(let{c:a,s0:i,s1:s,trimLeft:c,trimRight:d}of r)o.push({tx:a.x0,sx:i+c},{tx:a.x1,sx:s-d});return o}function Ti(e,t){let n=e.length;if(n===0)return t;let r=e[0],o=e[n-1];if(t<=r.tx)return r.sx+(t-r.tx);if(t>=o.tx)return o.sx+(t-o.tx);let a=0,i=n-1;for(;i-a>1;){let m=a+i>>1;e[m].tx<=t?a=m:i=m}let s=e[a],c=e[i],d=c.tx-s.tx;return d>0?s.sx+(t-s.tx)/d*(c.sx-s.sx):s.sx}var od=.05,Xt=9;function ad(e,t){let{minY:n,maxY:r}=e.layout.bounds,o=r-n;return e.columns&&o>0?Math.max(od,Math.min(1,t/o)):1}function rr(e,t){let{scaleX:n,translateX:r,translateY:o}=t,a=t.scaleY*ad(e,t.usableHeight),i=c=>(c-e.yOffset)*a+o,{columns:s}=e;if(s){let c=Li(s,d=>d*n+r);return{x:d=>Ti(c,d),y:i,yScale:a}}return{x:c=>c*n+r,y:i,yScale:a}}function or(e,{x:t,y:n},r,o){let a=null;return e.layout.nodes.forEach(i=>{i.order>=0&&t(i.x-Xt)<=r&&r<=t(i.x+i.pixelWidth+Xt)&&n(i.y-Xt)<=o&&o<=n(i.y+i.contentHeight+Xt)&&(a=i.name)}),a}var Zt=w(U(),1),Ji=w(ae(),1),yr=w(bt(),1);function vi(e){if(typeof e!="object"||e===null)return!1;let t=e;return typeof t.horizontalScroll=="function"&&typeof t.zoomTo=="function"&&"coarseDynamicBlocks"in t&&"dynamicBlocks"in t}function Ai(e){return e.reduce((t,n)=>t&&t.end-t.start>=n.end-n.start?t:n,void 0)}function at(e,t){let n=Ai(e.dynamicBlocks.contentBlocks.filter(a=>a.refName===t.refName&&a.assemblyName===t.assemblyName)),{bpPerPx:r}=e;if(!n||!(r>0))return;let o=n.offsetPx-e.offsetPx;return n.reversed?{scale:-1/r,translateX:o+n.end/r}:{scale:1/r,translateX:o-n.start/r}}function zt(e){let t=Ai(e.dynamicBlocks.contentBlocks),n=t?.displayedRegionIndex===void 0?void 0:e.displayedRegions[t.displayedRegionIndex];return t&&e.bpPerPx>0?{refName:t.refName,assemblyName:t.assemblyName,start:t.start,end:t.end,bpPerPx:e.bpPerPx,span:e.bpPerPx*e.width,regionStart:n?.start??t.start,regionEnd:n?.end??t.end}:void 0}function ar(e,t,n=!0){let r=e.end-e.start,o=n?Math.max(0,Math.min(e.span,(t-r)/2)):0,a=Math.max(e.regionStart,Math.floor(e.start-o)),i=Math.min(e.regionEnd,Math.ceil(e.end+o)),s=i-a-t;return s>0&&(a+=Math.floor(s/2),i-=Math.ceil(s/2)),{refName:e.refName,assemblyName:e.assemblyName,start:a,end:i}}function Ni(e,t,n=!0){if(e?.refName!==t.refName||e.assemblyName!==t.assemblyName)return!1;if(n)return e.start<=t.start+1&&t.end<=e.end+1;let r=ar(t,1/0,!1);return Math.abs(e.start-r.start)<1&&Math.abs(e.end-r.end)<1}var Jt=w(U(),1),Le=w(ae(),1);var id=.9,ir=2,sd=1e3;function sr(e,t,n,r=a=>a,o=[]){let a=new Map(e.nodes.map(s=>[s.name,s])),i=[];for(let s of t){let c=[],d=1/0,m=-1/0,g=1/0,p=[],u=[];for(let x of It(s)){let l=a.get(x),b=l&&n[l.id];if(!(!l||!b?.length)){if(D(l)&&(l.stable.start<s.start||l.stable.start>=s.end)){u.push(b[Math.floor(b.length/2)]);continue}p.push(l.id),c.push(wt(b.length===1?[b[0],b[0]]:b));for(let L of b)d=Math.min(d,L.x),m=Math.max(m,L.x),g=Math.min(g,L.y)}}if(p.length===0)continue;let y={x:(d+m)/2,y:g},S=u.length?{x:u.reduce((x,l)=>x+l.x,0)/u.length,y:u.reduce((x,l)=>x+l.y,0)/u.length}:y,k=new Map;for(let x of s.routes??[])for(let l of new Set(x.steps))k.set(l,(k.get(l)??0)+1);let h=[];for(let x of s.routes??[]){if(s.longestAlleleLength<sd)break;if(x.steps.length===0)continue;let l=Math.min(...x.steps.map(f=>k.get(f))),b,L=-1;for(let f of x.steps)if(k.get(f)===l)for(let T of n[f]??[]){let R=Math.hypot(T.x-S.x,T.y-S.y);R>L&&(L=R,b=T)}b&&h.push({route:x,at:b,text:cd(x,r)})}i.push({bubble:s,...Gt(s,o),path:c.join(""),labelAt:y,members:p.length,nodeIds:p,whole:p.length>=id*e.nodes.length,routes:h})}return i}function cd(e,t){let n=[...new Set(e.walks.map(t))].sort(),r=n.slice(0,ir).join(", "),o=n.length>ir?` +${n.length-ir}`:"";return`${r}${o} \xB7 ${Mo(e.bp)}`}function cr(e){if(!e.nodes.some(D))return[];let t=new Map(e.nodes.map(p=>[p.id,p])),n=ao(e),r=new Map(n.map((p,u)=>[p,u])),o=new Int32Array(n.length+1),a=new Map,i=new Set;for(let p of e.edges){let u=r.get(p.from),y=r.get(p.to);if(u===void 0||y===void 0||u===y)continue;i.add(`${p.from}>${p.to}`).add(`${p.to}>${p.from}`);let[S,k]=u<y?[u,y]:[y,u];o[S+1]++,o[k]--;let[h,x]=u<y?[p.from,p.to]:[p.to,p.from];(a.get(h)??a.set(h,new Set).get(h)).add(x)}for(let p=1;p<o.length;p++)o[p]+=o[p-1];let s=e.nodes.filter(D).sort((p,u)=>p.stable.start-u.stable.start),c=new Set([s[0].id,s.at(-1).id]),d=s.map(p=>[p,r.get(p.id)]).filter(([p,u])=>c.has(p.id)||o[u]===0).sort(([p,u],[y,S])=>u-S||p.stable.start-y.stable.start),m=e.paths?.map(p=>{let u=new Map;return p.nodeIds.forEach((y,S)=>{u.has(y)||u.set(y,S)}),u}),g=[];for(let p=0;p+1<d.length;p++){let[u,y]=d[p],[S,k]=d[p+1],h=n.slice(y+1,k);if(h.length===0)continue;let x=new Map([[u.id,{min:0,max:0,n:1}]]);for(let B of[u.id,...h]){let J=x.get(B);if(J)for(let Z of a.get(B)??[]){if(r.get(Z)>k)continue;let v=Z===S.id?0:t.get(Z).length,z=x.get(Z);x.set(Z,{min:Math.min(z?.min??1/0,J.min+v),max:Math.max(z?.max??-1/0,J.max+v),n:Math.min(Ro,J.n+(z?.n??0))})}}let l=m&&dd(e,t,m,u.id,S.id),b=l?.n?l:void 0,L=b??x.get(S.id)??{min:0,max:0,n:0},f=l!==void 0&&l.left>0,T=u.stable.start+u.length,R=S.stable.start,N=[u.id,...h.filter(B=>D(t.get(B))),S.id],G=N.some((B,J)=>J>0&&!i.has(`${N[J-1]}>${B}`)),I=G||f,W=G&&!b;g.push({refName:u.stable.refName,start:T,end:R,segmentCount:h.length+2,pathCount:L.n,inversion:!1,shortestAlleleLength:W?R-T:L.min,longestAlleleLength:W?R-T:L.max,segments:[u,...h.map(B=>t.get(B)),S].map(B=>B.name).join(","),shortestAllele:void 0,longestAllele:void 0,partial:I,routes:b?.routes})}return g}function dd(e,t,n,r,o){let a=new Map,i=1/0,s=-1/0,c=0;return e.paths.forEach((d,m)=>{let g=n[m].get(r),p=n[m].get(o);if(g===void 0||p===void 0){(g!==void 0||p!==void 0)&&c++;return}let u=d.nodeIds.slice(Math.min(g,p)+1,Math.max(g,p));p<g&&u.reverse();let y=0;for(let h of u)y+=t.get(h)?.length??0;let S=u.join(","),k=a.get(S)??{steps:u,bp:y,walks:[]};k.walks.push(d.name),a.set(S,k),i=Math.min(i,y),s=Math.max(s,y)}),a.size||c?{min:i,max:s,n:a.size,left:c,routes:[...a.values()]}:void 0}function dr(e,t,n){if(t==="uniform"||t==="grey")return;let r={...lo(e),referenceRamp:n};return new Map(e.nodes.map((o,a)=>[o.id,po(go(o,a,t,r))]))}var ct=w(U(),1),_i=w(Gi(),1),pe=w(ae(),1);var Yt=w(U(),1),Ii=w(ae(),1),pd=/^[^#]+#\d+$/;function ud(e,t){let n=e.assemblyNameToPanSN??{},r=new Set(Object.values(n)),o={};for(let{name:a,aliases:i}of t){let s=i.find(c=>pd.test(c));s!==void 0&&!r.has(s)&&(o[a]=s)}return Object.keys(o).length===0?e:{...e,assemblyNameToPanSN:{...o,...n}}}function he(e,t){let n=(0,Yt.readConfObject)(t,"adapter");return n.type==="GbzBaseSyntenyAdapter"?ud(n,(0,Ii.getSession)(e).assemblyManager.assemblyList.map(r=>({name:(0,Yt.readConfObject)(r,"name"),aliases:(0,Yt.readConfObject)(r,"aliases")??[]}))):n}function pr(e){let t=[];for(let n of[...e].sort((r,o)=>r.start-o.start)){let r=t.at(-1);r&&n.start<=r.end?r.end=Math.max(r.end,n.end):t.push({...n})}return t}function ur(e){let t=[],n=new Map;for(let r of[...e].sort((o,a)=>o.start-a.start)){let o=`${r.refName} ${r.strand} ${r.name}`,a=n.get(o);if(a&&r.start<a.end)a.end=Math.max(a.end,r.end),a.exons=pr([...a.exons,...r.exons]);else{let i={...r,exons:pr(r.exons)};t.push(i),n.set(o,i)}}return t}var mr=w(U(),1),it=new Set(["Gff3TabixAdapter","Gff3Adapter","BedTabixAdapter","BedAdapter","GtfTabixAdapter","GtfAdapter","BigBedAdapter","NCListAdapter"]),md=/gene|refseq|gencode|ensembl|annotation/i,ld=new Set(["BedTabixAdapter","BedAdapter"]);function Ut(e,t){if(t)return e.find(r=>r.trackId===t);let n=e.filter(r=>it.has(r.adapterType));return n.find(r=>md.test(`${r.trackId} ${r.name??""}`))??n.find(r=>!ld.has(r.adapterType))}function Ci(e,t){let n=e.tracks?.find(r=>(0,mr.readConfObject)(r.configuration,"trackId")===t)?.displays[0];return n?(0,mr.readConfObject)(n.configuration,"filter")??[]:[]}var gd=new Set(["chromosome","region","contig","supercontig","scaffold"]);function ie(e,t){return typeof e.get=="function"?e.get(t):e[t]}var hd=new Set(["exon","CDS","five_prime_UTR","three_prime_UTR","UTR"]);function Ei(e,t){let n=ie(e,"type");typeof n=="string"&&hd.has(n)&&t.push({start:ie(e,"start"),end:ie(e,"end")});let r=ie(e,"subfeatures");for(let o of r??[])Ei(o,t)}function fd(e){let t=[...e].sort((r,o)=>r.start-o.start),n=[];for(let r of t){let o=n.at(-1);o&&r.start<=o.end?o.end=Math.max(o.end,r.end):n.push({...r})}return n}function Kt(e){let t=[];for(let n of e){let r=ie(n,"gene_name")??ie(n,"name")??ie(n,"gene"),o=ie(n,"start"),a=ie(n,"end");if(!r||!(a>o)||gd.has(ie(n,"type")))continue;let i=[];Ei(n,i),t.push({name:r,refName:ie(n,"refName"),start:o,end:a,strand:ie(n,"strand")??0,exons:i.length?fd(i):[{start:o,end:a}]})}return ur(t)}var hr=new Set(["BedAdapter","BedTabixAdapter","BigBedAdapter","VcfAdapter","VcfTabixAdapter"]),bd=/repeat|tandem|\bstr\b|vntr|trf|trgt|vamos|expansion|microsat/i;function Bi(e,t){return t?e.find(r=>r.trackId===t):e.filter(r=>hr.has(r.adapterType)).find(r=>bd.test(`${r.trackId} ${r.name??""}`))}function st(e,t){return typeof e.get=="function"?e.get(t):e[t]}var Fi=/^\w+=[^;]*(;\w+=[^;]*)*$/;function yd(e){let t=st(e,"name");if(!(typeof t!="string"||!Fi.test(t)))return Object.fromEntries(t.split(";").map(n=>{let r=n.indexOf("=");return[n.slice(0,r),n.slice(r+1)]}))}function de(e,t){let n=st(e,t);return n!==void 0?n:st(e,"INFO")?.[t]??yd(e)?.[t]}var $i=["RUS","MOTIFS","RU","motifs","motif","sequence","consensus"],wd=["RUL","period","PERIOD","consensusSize","unit","unitLength"],kd=["TRID","REPID","VARID","ID","name","id"];function qt(e,t){for(let n of t){let r=de(e,n),o=String((Array.isArray(r)?r[0]:r)??"").split(",")[0].trim();if(o!==""&&o!==".")return o}}var Di=/^[ACGTURYSWKMBDHVN]+$/i;function xd(e){let t=Number(qt(e,wd));if(Number.isFinite(t)&&t>0)return Math.round(t);let n=qt(e,$i);return n&&Di.test(n)?n.length:void 0}function Me(e){return(Array.isArray(e)?e:String(e??"").split(",")).map(n=>{let r=n===""||n===null||n===void 0?NaN:Number(n);return Number.isFinite(r)?r:void 0})}function gr(e){return(Array.isArray(e)?e:String(e??"").split(",")).map(n=>{let r=String(n??"").trim();return r===""||r==="."?void 0:r})}var lr="<CNV:TR>";function Sd(e){let t=gr(st(e,"ALT"));if(!t.includes(lr))return;let n=Me(de(e,"RN")),r=gr(de(e,"RUS")),o=Me(de(e,"RUL")),a=Me(de(e,"RUC")),i=Me(de(e,"RB")),s=0;return t.map((c,d)=>{let m=n[d]??(c===lr?1:0),g=0,p=0;for(let u=0;u<m;u++,s++){let y=r[s],S=o[s]??(y&&Di.test(y)?y.length:void 0),k=a[s],h=i[s]??(S&&k!==void 0?Math.round(S*k):void 0);h!==void 0&&(g+=h,p++)}return c===lr&&m>0&&p===m?g:void 0})}function Rd(e,t,n){let r=e?.includes("|");return(e??"").split(/[/|]/).flatMap((o,a)=>{let i=Number(o),s=i>0?t[i-1]:n;return!Number.isInteger(i)||s===void 0?[]:[{bp:s,...r?{haplotype:a+1}:{}}]})}function Md(e,t,n){let r=st(e,"samples"),o={};for(let[a,i]of Object.entries(r??{})){let s=Me(i.SD),c=Me(i.AL).flatMap((m,g)=>m!==void 0&&m>0?[s[g]===void 0?{bp:m}:{bp:m,spanningReads:s[g]}]:[]),d=c.length>0||!t?c:Rd(gr(i.GT)[0],t,n);d.length>0&&(o[a]=d)}return Object.keys(o).length>0?o:void 0}function Ld(e,t){let n=de(e,"start"),r=de(e,"end"),o=Me(de(e,"SVLEN"))[0];return t&&o!==void 0?{start:n+1,end:n+1+o}:{start:n,end:r}}function Vi(e){let t=[];for(let n of e){let r=Sd(n),{start:o,end:a}=Ld(n,r!==void 0),i=xd(n);if(!(a>o)||i===void 0)continue;let s=de(n,"refName"),c=qt(n,$i),d=qt(n,kd);t.push({key:`${s}:${o}-${a}`,name:(d&&!Fi.test(d)?d:void 0)??(c&&c.length<=12?`(${c})n`:`${s}:${(o+1).toLocaleString()}-${a.toLocaleString()}`),refName:s,start:o,end:a,unit:i,motif:c,calls:Md(n,r,a-o)})}return t.sort((n,r)=>n.start-r.start)}var Oi=ui.views(e=>({get defaultLayoutMode(){return"force"},get defaultColorScheme(){return"auto"},get hasPendingSource(){return!1},get canRetryLoad(){return!1},get sourceTrack(){try{return(0,pe.getContainingTrack)(e).configuration}catch{return}}})).views(e=>({get chosenLayoutMode(){return e.layoutMode??e.defaultLayoutMode},get chosenColorScheme(){return e.colorScheme??e.defaultColorScheme}})).views(e=>({get paneWidth(){return(0,pe.getContainingView)(e).width},get drawnGraph(){return e.layoutResult?.tubeMap?.coarse?.graph??e.graph}})).views(e=>({get nodeById(){if(e.drawnGraph){let t=new Map;for(let n of e.drawnGraph.nodes)t.set(n.id,n);return t}},get nodeLengths(){let t=new Map;for(let n of e.drawnGraph?.nodes??[])t.set(n.id,n.length);return t},get nodeCount(){return e.graph?.nodes.length??0},get edgeCount(){return e.graph?.edges.length??0},get pathCount(){return e.graph?.paths?.length??0},get hasGraph(){return e.graph!==void 0},get geometryPainted(){return qn(e)},get showLoading(){return e.error===void 0&&(e.isLoading||e.hasPendingSource||e.graph!==void 0&&!qn(e))},get canCancelLoad(){return e.isLoading&&!e.layoutResult},get usesLayoutEngine(){return e.graph?so(e.chosenLayoutMode,e.graph):!1},get canAnchorLayout(){return e.graph?.nodes.some(t=>t.stable?.rank===0)??!1},get anchorPaths(){return e.graph?.anchorPaths??[]},get walkChoices(){let t=e.graph?.paths;return t?.length?Oe(t):[]},get effectiveDrawPaths(){return e.drawPaths&&wn(e.graph?.paths?.length??0)},get activeReferencePath(){return e.graph?.referencePath},get rampDomain(){return e.colorDomain??e.graphRegion},get walkRamp(){let{graph:t}=e;return t&&e.walkLayers.some(n=>n.color?.field==="reference")?Ae(t,this.rampDomain):void 0},get modeDrawsNodes(){return _(e.chosenLayoutMode).drawsNodes},get liftedWalkLayers(){return e.walkLayers.length>0||!this.modeDrawsNodes?e.walkLayers:e.hoveredRowWalks.map(t=>({walk:t}))},get walkLift(){let{graph:t}=e,n=this.liftedWalkLayers;return t&&n.length>0&&!e.layoutResult?.tubeMap?rt(t,n,this.walkRamp):void 0},get facetPanels(){let{graph:t}=e,n=this.walkLift;return e.facet.field!==""&&this.modeDrawsNodes&&t&&n&&e.walkLayers.length>1&&n.walks.length>1?ot(t,n,e.walkLayers,this.walkRamp):void 0},get drawnWalks(){return this.facetPanels?.map(t=>t.walks[0])??this.walkLift?.walks??[]},get liftsWalks(){return!Ie.has(e.chosenLayoutMode)},get walkReference(){let t=this.walkLift?.referenceDomain;return t&&{...t,name:e.graphRegion?.refName}},walkLabel(t){return this.walkChoices.find(n=>n.name===t)?.label??t},get liftPaintsOffReference(){for(let t of this.walkLift?.walks??[])if(t.encoding.field!=="walk"){for(let n of t.colors.values())if(n===yo)return!0}return!1},get liftedWalksLabel(){let t=this.walkLift?.walks??[];return t.length===1?this.walkLabel(t[0].name):"these walks"},get effectiveColorScheme(){return e.layoutResult?.tubeMap&&(this.tubeMapReads||e.chosenColorScheme==="auto")?"uniform":Rt(e.chosenColorScheme,e.graph)},get tubeMapReads(){return(e.layoutResult?.tubeMap?.layout.reads.length??0)>0},get colorSchemeLock(){return this.walkLift?{value:"By walk",why:"Each lifted walk colours its own lane: set it under the menu, Walk, Colour"}:this.tubeMapReads?{value:"By strand",why:"Reads take the reds and blues, so the tube map leaves its nodes clear"}:void 0},get nodePositions(){return e.layoutResult?.nodePositions},get labelsNodeSizes(){return!e.layoutResult?.tubeMap&&!this.walkLift},get rowLabels(){return e.layoutResult?.rowLabels??[]},get alleleDeletions(){return e.layoutResult?.alleleDeletions??[]},get deletionRoutes(){return e.layoutResult?.deletionRoutes},get stranded(){return e.layoutResult?.stranded},get pixelRows(){return e.layoutResult?.pixelRows??!1},get zoomPercent(){return`${(e.scale*100).toFixed(1)}%`},get isDefaultViewport(){return e.scale===1&&e.translateX===0&&e.translateY===0}})).views(e=>({get poppedFrom(){return e.popStack.at(-1)},get derivedBubbles(){return e.graph?cr(e.graph):[]}})).views(e=>({get bubbles(){return e.indexBubbles?.length?e.indexBubbles:e.derivedBubbles}})).views(e=>({get cutHaplotypes(){},get sourceGfaLocation(){},get sourceAdapter(){let t=e.sourceTrack;return t?he(e,t):void 0},get sourceTrackId(){let t=e.sourceTrack;return t?(0,ct.readConfObject)(t,"trackId"):void 0},get assemblyTrackChoices(){let t=e.graphRegion;return t?(0,pe.getSession)(e).tracks.filter(n=>(0,ct.readConfObject)(n,"assemblyNames").includes(t.assemblyName)).map(n=>({trackId:n.trackId,name:(0,ct.readConfObject)(n,"name"),adapterType:(0,ct.readConfObject)(n,"adapter").type})):[]}})).views(e=>({get geneTrackChoices(){return e.assemblyTrackChoices.filter(t=>it.has(t.adapterType))},get repeatTrackChoices(){return e.assemblyTrackChoices.filter(t=>hr.has(t.adapterType))},get repeatChoices(){return e.repeatArrays??[]}})).views(e=>({get repeatTrack(){return Bi(e.repeatTrackChoices,e.repeatTrackId)},get geneTrack(){return Ut(e.geneTrackChoices,e.geneTrackId)},get selectedRepeat(){return e.repeatChoices.find(t=>t.key===e.repeatKey)},get backbone(){return e.graph?dn(e.graph):void 0},get cutWalkRows(){return e.graph?kt(e.graph,e.graphRegion):void 0},assemblySpellings(t){let{assemblyManager:n}=(0,pe.getSession)(e),r=n.has(t)?n.get(t):void 0,o=e.sourceAdapter?.assemblyNameToPanSN??{},a=[t,...r?[r.name,...r.aliases]:[]];return{name:t,aliases:[...a,...a.flatMap(i=>o[i]??[])]}},get drawsLoadedReference(){let t=e.graph;return t?.anchoredBy==="tags"||t?.referencePath!==void 0&&t.referencePath===e.loadedReferencePath}})).views(e=>({get geneAssembly(){let t=e.graphRegion;return t?e.assemblySpellings(t.assemblyName):void 0},get geneLaneFilter(){let t;try{t=(0,pe.getContainingView)(e)}catch{return}let n=Ci(t,e.geneTrack?.trackId);return n.length?new _i.default({filters:n,jexl:(0,pe.getEnv)(e).pluginManager.jexl}):void 0},get geneFeatures(){let t=e.geneTrackFeatures,n=this.geneLaneFilter;return t?Kt(n?t.filter(r=>n.passes(r)):t):void 0}})).views(e=>({get backboneGenes(){let{backbone:t,geneAssembly:n,geneFeatures:r}=e,o=e.drawsLoadedReference||n!==void 0&&un(t,[n])!==void 0;return t&&r&&o?ln(r,t):void 0}})).views(e=>({get nodeNeighbors(){return e.drawnGraph?We(e.drawnGraph):void 0},get nodeInk(){return Mt(e.drawnGraph,e.nodeById,e.contigThickness,e.nodeWidth)},get deletions(){return e.graph&&this.drawsNodes?be(e.graph):[]},get walkRowBars(){if(e.chosenLayoutMode!=="walkrows"||!e.graph)return;let t=e.selectedRepeat,n=t?kt(e.graph,t,t.unit):e.cutWalkRows;if(!n)return;let r=He(n.rows,e.walkRowSamples),[o,...a]=oa([n.reference,...r],t?.calls);return{...n,reference:o,rows:a}},get drawsNodes(){return!e.layoutResult?.tubeMap&&!this.walkRowBars},get drawnRowLabels(){let t=this.walkRowBars;return t?[t.reference,...t.rows].map((n,r)=>({label:n.label,y:r*le})):e.rowLabels},get fitPadLeft(){return Math.max($,...this.drawnRowLabels.map(t=>no(t.label,0).x1+6))},get genePins(){ue(e.positionsVersion);let t=e.layoutResult?.nodePositions;return e.showGenes&&this.drawsNodes&&e.graph&&e.backboneGenes&&t?nt(e.graph,e.backboneGenes,t):[]},get bubbleHalos(){ue(e.positionsVersion);let t=e.layoutResult?.nodePositions;if(!e.showBubbles||!this.drawsNodes||!e.graph||!t)return[];let n=new Map(e.walkChoices.map(r=>[r.name,r.label]));return sr(e.graph,e.bubbles,t,r=>n.get(r)??r,e.repeatArrays)},get referenceRamp(){return e.effectiveColorScheme==="reference-position"&&e.drawnGraph?Ae(e.drawnGraph,e.rampDomain):void 0},get assemblyNames(){let t=e.graphRegion;return t?[t.assemblyName]:[]},get scaleX(){return ke(e.scale,e.pixelRows).scaleX},get scaleY(){return ke(e.scale,e.pixelRows).scaleY},get axisScale(){return ke(e.scale,e.pixelRows)},get layoutBounds(){let t=e.layoutResult,n=this.walkRowBars;return t?Qe(t,{region:e.popStack.length===0?e.graphRegion:void 0,extent:n&&t.extent?je(n):void 0}):void 0}})).views(e=>({get deletionEdgeIndexes(){return new Map(e.deletions.map(t=>[t.edgeIndex,t.bypassed]))},get hiddenEdgeIndexes(){return new Set(e.showDeletionEdges?[]:e.deletions.map(t=>t.edgeIndex))},get referenceRampDomain(){let t=e.referenceRamp;return t?{start:t.start,end:t.start+t.span}:void 0},get referenceRampOffKeys(){let t=e.referenceRamp,n=e.layoutResult,r=n?.tubeMap?n.nodePositions:void 0,o=!1,a=!1;if(t&&e.drawnGraph)for(let i of e.drawnGraph.nodes)r&&!r[i.id]||(t.midpoints.has(i.id)?i.stable&&i.stable.rank>0&&(o=!0):a=!0);return{offReference:o,unplaced:a}},get tubeMapNodeColors(){let t=e.drawnGraph;return e.layoutResult?.tubeMap&&t?dr(t,e.effectiveColorScheme,e.referenceRamp):void 0},get tubeMapTubeColors(){let t=e.layoutResult?.tubeMap?.pathColors,n=t&&this.tubeMapNodeColors?t.map((a,i)=>ro(i,t.length)):t,r=new Set(e.hoveredRowWalks),o=e.drawnGraph?.paths;return n&&o&&r.size>0?n.map((a,i)=>r.has(o[i]?.name??"")?a:mo):n},nodeSpan(t){let{nodeById:n,nodeNeighbors:r}=e;return n&&r?ye({nodeId:t,nodeById:n,neighbors:r}):void 0}})).views(e=>({get pathLegend(){let t=e.graph?.paths,n=e.layoutResult?.tubeMap;return(e.drawPaths||n)&&t&&wn(t.length)?Oe(t,e.tubeMapTubeColors):[]},get hoveredSpan(){let t=e.hoveredNode,n=e.hoveredBubble;return t!==null?e.nodeSpan(t):n?{start:n.start,end:n.end}:void 0}})).views(e=>({get hoverHighlight(){let t=e.graphRegion,n=e.hoveredSpan;return t&&n?{refName:t.refName,assemblyName:t.assemblyName,...n}:void 0}}));var fr=w(U(),1);function Q(e){return typeof e=="object"&&e!==null}function Td(e){return Q(e)&&e.type==="LinearGenomeView"&&typeof e.id=="string"&&typeof e.navToLocString=="function"&&Array.isArray(e.assemblyNames)}function dt(e){return e.flatMap(t=>Q(t)&&Array.isArray(t.views)?[t,...t.views]:[t])}function pt({views:e,connectedViewId:t,assemblyName:n}){let r=dt(e).filter(a=>Td(a)).filter(a=>a.assemblyNames.includes(n));return r.find(a=>a.id===t)??(r.length===1?r[0]:void 0)}function ut(e,t){let n=e.assemblyManager;return n?.has(t)?n.get(t)?.name??t:t}function Hi(e,t,n){n.catch(r=>{console.error(`[GraphGenomeView] ${t}`,r),e.notifyError?.(`${t}: ${r}`,r)})}var vd=1e3;function br(e,t=vd){let n=Math.max(0,Math.ceil((t-(e.end-e.start))/2));return{...e,start:Math.max(0,e.start-n),end:e.end+n}}function ji(e,t){return t?e.map(n=>n.rank===0?{...n,sample:t.assemblyName,haplotype:void 0,refName:t.refName,start:t.start,end:t.end}:n):e}function Xi({session:e,location:t,assembly:n,connectedViewId:r,tracks:o=[]}){let a=pt({views:e.views,connectedViewId:r,assemblyName:n}),i;return a?(Hi(e,`Could not show ${n} ${Ye(t)}`,Promise.resolve(a.navToLocString(Bt(t),n))),i=a.id):i=e.addView("LinearGenomeView",{displayName:`${n} \u2014 ${Ye(t)}`,init:{assembly:n,loc:Bt(t),tracks:o}}).id,i}function zi({session:e,location:t,assembly:n,connectedViewId:r}){let o=pt({views:e.views,connectedViewId:r,assemblyName:n});return o&&e.addHighlight?.({refName:t.refName,start:t.start,end:t.end,assemblyName:n}),o!==void 0}function Wi(e,t){if(t===void 0)return[];let n=e.tracks.find(o=>(0,fr.readConfObject)(o,"trackId")===t),r=n?(0,fr.readConfObject)(n,"assemblyNames"):[];return Array.isArray(r)?r.filter(o=>typeof o=="string").map(o=>ut(e,o)):[]}function Yi({session:e,contributors:t,trackId:n,graphTrackId:r}){let o=Wi(e,r),a=Wi(e,n),i=t.filter(d=>a.includes(d.sample)),s=i.length>=2?i:t,c={init:{views:s.map(d=>({assembly:d.sample,loc:Bt(d),...r!==void 0&&o.includes(d.sample)?{tracks:[r]}:{}})),tracks:n?s.slice(1).map(()=>[n]):[],collapseEmptyRows:!0}};e.launchView?Hi(e,"Could not open the synteny view",e.launchView("LinearSyntenyView",c)):e.addView("LinearSyntenyView",c)}var Ui=Oi.views(e=>({get contributingAssemblies(){let t=e.graph,n=t?Hr(t):[];return t?aa(t,{maxGap:n.length>0?zr(n):1/0}):[]}})).views(e=>({get assemblyResolver(){let{assemblyManager:t}=(0,Le.getSession)(e),n=e.sourceAdapter?.assemblyNameToPanSN,r=new Map(Object.entries(n??{}).map(([a,i])=>[i,a])),o=a=>a!==void 0&&t.has(a)?t.get(a)?.name??a:void 0;return a=>o(r.get(a))??o(a)},get geneTracksByAssembly(){let t=new Map;for(let n of(0,Le.getSession)(e).tracks){let r=(0,Jt.readConfObject)(n,"adapter").type;if(!it.has(r))continue;let o={trackId:n.trackId,name:(0,Jt.readConfObject)(n,"name"),adapterType:r};for(let a of(0,Jt.readConfObject)(n,"assemblyNames")){let i=ut((0,Le.getSession)(e),a);t.set(i,[...t.get(i)??[],o])}}return new Map([...t].flatMap(([n,r])=>{let o=Ut(r,"");return o?[[n,o]]:[]}))}})).views(e=>({get launchableAssemblies(){return ia(ji(e.contributingAssemblies,e.graphRegion),e.assemblyResolver)},get canHighlightInLinearView(){let t=e.graphRegion;return t!==void 0&&pt({views:[...(0,Le.getSession)(e).views],connectedViewId:e.connectedViewId,assemblyName:t.assemblyName})!==void 0},nodeLaunchTargets(t){let n=e.nodeById?.get(t),r=n?Xe(n):void 0,o=r?ze(e.assemblyResolver,r):void 0,a=e.graphRegion,i=e.nodeById,s=e.nodeNeighbors,c=a&&i&&s?ye({nodeId:t,nodeById:i,neighbors:s}):void 0,d=a&&c?{sample:a.assemblyName,haplotype:void 0,refName:a.refName,...c}:void 0;return{own:r&&o?{location:br(r),assembly:o}:void 0,reference:a&&d?{location:br(d),assembly:a.assemblyName}:void 0,highlight:a&&d?{location:d,assembly:a.assemblyName}:void 0}}})).views(e=>({get host(){let t;try{t=(0,Le.getContainingView)(e)}catch{return}return vi(t)?t:void 0}}));var Ki=Ui.views(e=>({get walkStripShown(){return e.walkStrip&&!e.host&&e.modeDrawsNodes&&!e.layoutResult?.tubeMap&&!e.walkRowBars&&e.popStack.length===0&&(e.graph?.paths?.length??0)>1},get walkStripRows(){let t=this.walkStripShown?e.cutWalkRows:void 0;return t?{...t,rows:He(t.rows,e.walkRowSamples)}:void 0},get walkStripFrame(){let t=this.walkStripRows;if(t)return Ct(t,{width:e.paneWidth})},get cutsWholeWalks(){return _(e.chosenLayoutMode).wholeWalks||e.walkStrip&&!e.host},get walkStripMarks(){let t=this.walkStripRows,n=e.hoveredNode??e.selectedNode,r=n===null?void 0:e.nodeById?.get(n);return t&&r&&e.graph?Ao(e.graph,[t.reference,...t.rows],r):[]},get walkStripLocator(){let t=e.stripHover?e.hoveredNode:null;return t===null?void 0:Et(e.nodePositions?.[t],n=>({x:n.x*e.scaleX+e.translateX,y:n.y*e.scaleY+e.translateY}))}})).views(e=>({get walkGeneReads(){let t=e.walkRowBars??e.walkStripRows;if(!t||!e.showGenes)return;let n=[],r=0,o=0;for(let a of t.rows){if(!a.axis){o++;continue}let i=ze(e.assemblyResolver,{sample:a.sample,haplotype:a.haplotype===void 0?void 0:`${a.sample}#${a.haplotype}`}),s=i?e.geneTracksByAssembly.get(i):void 0;if(!i||!s){r++;continue}n.push({row:a.name,trackId:s.trackId,region:{assemblyName:i,refName:a.axis.contig,...Mn(a.axis,a.bp)}})}return{reads:n.slice(0,Un),gaps:{untracked:r,unplaced:o,unread:Math.max(0,n.length-Un)}}},get walkRowGeneGaps(){return this.walkGeneReads?.gaps},walkRowAt(t,n){let r=e.walkRowBars;if(!r)return;let o=Math.round((n-e.translateY)/(le*e.scaleY)),a=[r.reference,...r.rows][o],i=o*le*e.scaleY+e.translateY,s=(t-e.translateX)/e.scaleX-r.origin;return a&&Math.abs(n-i)<=To/2+2&&s>=0&&s<=a.bp?o:void 0},walkRowLaunchTarget(t,n=e.walkRowBars){let r=n?[n.reference,...n.rows][t]:void 0;if(!r?.axis)return;let o=r.haplotype===void 0?void 0:`${r.sample}#${r.haplotype}`,a=t===0?e.graphRegion?.assemblyName:ze(e.assemblyResolver,{sample:r.sample,haplotype:o});return{label:r.label,assembly:a,location:{sample:r.sample,haplotype:o,refName:r.axis.contig,...Mn(r.axis,r.bp)}}},get walkRowGenes(){let t=e.walkRowBars??e.walkStripRows;if(!t||!e.showGenes)return;let n=new Map(e.walkGeneFeatures??[]);return e.geneFeatures&&n.set(t.reference.name,e.geneFeatures),n.size?vo([t.reference,...t.rows],n):void 0}}));var qi=Ki.views(e=>({get xIsReferenceBp(){return e.layoutResult?.referenceAxis===!0&&_(e.chosenLayoutMode).cutMargins}})).views(e=>({get hostPlacesX(){let{host:t,graphRegion:n}=e;return t!==void 0&&t.initialized&&n!==void 0&&e.xIsReferenceBp&&e.popStack.length===0&&!t.dynamicBlocks.contentBlocks.some(r=>r.refName===n.refName&&r.reversed)}})).views(e=>({get hostFrame(){let{host:t,graphRegion:n}=e;return e.hostPlacesX&&t&&n?at(t,n):void 0},get tubeMapPicture(){let t=e.layoutResult?.tubeMap;return t?Yo(t.layout):void 0},get tubeMapReference(){let t=e.layoutResult?.tubeMap;return t&&e.drawnGraph?Wo(e.drawnGraph,t.layout):void 0},get tubeMapDeviations(){let t=e.layoutResult?.tubeMap?.coarse,n=e.layoutResult?.tubeMap?.layout;return t&&n?ra(t.graph,n,t.deviations):[]},get tubeMapReferenceNodes(){let t=e.layoutResult;return t?.tubeMap&&!t.referenceAxis&&e.drawnGraph?jo(e.drawnGraph,t.tubeMap.layout):void 0}})).views(e=>({get tubeMapGenes(){let t=e.tubeMapReference;return e.showGenes&&!e.host&&t&&e.backboneGenes?qo(t,e.backboneGenes):[]},get referenceStripApplies(){return!!e.host?.initialized&&!!e.layoutResult&&e.drawsNodes&&!e.hostPlacesX&&!e.facetPanels}})).views(e=>({get referenceStripBlocks(){let{graph:t}=e;return e.showReferenceStrip&&e.referenceStripApplies&&t?ea(t,{colorScheme:e.effectiveColorScheme,referenceRamp:e.referenceRamp,walks:e.walkLift?.walks}):[]},get referenceStripFrame(){let{host:t,graphRegion:n}=e;return t?.initialized&&n?at(t,n):void 0}})).views(e=>({get referenceStripShown(){return e.referenceStripBlocks.length>0&&e.referenceStripFrame!==void 0},get referenceStripOverhangs(){let t=e.referenceStripFrame;if(!t||e.referenceStripBlocks.length===0)return!1;let{left:n,right:r}=ta(e.referenceStripBlocks,t,e.paneWidth);return n>0||r>0},get referenceStripFaded(){return e.referenceStripBlocks.some(t=>t.faded)}})).views(e=>({get referenceStripLit(){if(!e.referenceStripShown)return;let t=a=>({x:a.x*e.scaleX+e.translateX,y:a.y*e.scaleY+e.translateY}),n=e.hoveredNode===null?e.hoveredBubble:null;if(n){let a=e.bubbleHalos.find(i=>So(i.bubble,n));return{start:n.start,end:n.end,anchor:a?t(a.labelAt):void 0}}let r=e.hoveredNode??e.selectedNode,o=r===null?void 0:e.nodeSpan(r);return o&&r!==null?{...o,anchor:Et(e.nodePositions?.[r],t)}:void 0},referenceStripNodeAt(t,n){let r=e.referenceStripFrame;return e.referenceStripShown&&r?na(e.referenceStripBlocks,r,t,n):void 0},get paperCss(){return Za(e.darkMode?Ht:Wt)},get referenceStripZonePx(){return e.referenceStripShown?Qo:0}}));var Zi=qi.views(e=>({get paneCeiling(){return Math.max(Ot,e.paneHeight??Ja)},get fitPadTopBase(){let t=Zo(e.tubeMapGenes);return $+Math.max(0,t-1)*Jo+e.referenceStripZonePx},get legendRoom(){let t=e.layoutBounds,{width:n,height:r}=e.legendSize;if(!t||t.w<=0||n===0||e.facetPanels||e.tubeMapReads)return;if(e.hostPlacesX)return"top";let o=this.fitPadTopBase,a=e.host?this.canvasHeight:this.paneCeiling,i=m=>(e.paneWidth-e.fitPadLeft-m)/t.w,s=m=>e.pixelRows?t.h+m+$<=a?1/0:0:(a-m-$)/t.h,c=Math.min(i(n+2*Ne),s(o));return Math.min(i($),s(o+r+Ne))>=c?"top":"right"},get fitPadTop(){return this.fitPadTopBase+(this.legendRoom==="top"?e.legendSize.height+Ne:0)},get fitPadRight(){return this.legendRoom==="right"?Math.max($,e.legendSize.width+2*Ne):$},get minFitScale(){let t=e.layoutBounds,n=e.layoutResult,r=n?.tubeMap?.layout.tracks[0]?.width;return t&&t.h>0&&r&&!n.referenceAxis?Math.min(Qa/r,(this.paneCeiling-this.fitPadTop-$)/t.h):0},get facetSpec(){let{field:t,domain:n,columns:r}=e.facet;return t===""?void 0:n.length===0&&r===void 0?t:{field:t,domain:[...n],...r===void 0?{}:{columns:r}}},get facetPlacement(){let t=e.facetPanels,{field:n,domain:r}=e.facet;return t?Pt(t.map(o=>o.walks[0].name),e.hostPlacesX||n===""?"walk":n,r):void 0},facetGridIn(t){let n=this.facetPlacement,r=e.layoutBounds;return n&&r&&r.w>0?At({count:n.count,bounds:r,pixelRows:e.pixelRows,width:e.paneWidth,room:t,columns:e.hostPlacesX?1:n.columns??e.facet.columns}):void 0},get facetGrid(){return this.facetGridIn(e.host?this.canvasHeight:this.paneCeiling)},get canvasHeight(){let t=e.layoutBounds,n=e.paneWidth-$-this.fitPadRight,r=this.paneCeiling;if(!t)return r;let o=this.facetGrid;if(o)return Math.max(Ot,o.total);let a=Math.max(Ot,e.legendSize.height+2*Ne+e.referenceStripZonePx);return e.pixelRows?Math.min(r,Math.max(a,t.h+this.fitPadTop+$)):t.w>0&&n>0?Math.min(r,Math.max(a,t.h*Math.max(n/t.w,this.minFitScale)+this.fitPadTop+$)):r},get viewBox(){let t=this.facetGrid;return t?{width:t.width,height:t.height}:{width:e.paneWidth,height:this.canvasHeight}},get fittedTransform(){let t=e.layoutBounds,n=this.facetGrid;return t?n?Ge(t,n.width,n.height,e.pixelRows,{padLeft:oe,padTop:oe,padRight:oe,padBottom:oe}):Ge(t,e.paneWidth,this.canvasHeight,e.pixelRows,{minScale:this.minFitScale,padLeft:e.fitPadLeft,padTop:this.fitPadTop,padRight:this.fitPadRight}):void 0}})).views(e=>({viewportToBuild(){return On(tt(e),ii)},applyHighlights(t){let{hoveredNode:n,hoveredEdge:r,selectedNode:o}=e,a=new Map;o!==null&&a.set(o,oi),n!==null&&n!==o&&a.set(n,Yn),t.setNodeHighlights(a),t.setEdgeHighlight(r,Yn)},paint(t){let n=Io();t.updateTransform({scaleX:e.scaleX*n,scaleY:e.scaleY*n,translateX:e.translateX*n,translateY:e.translateY*n,dpr:n}),t.render(e.referenceStripShown?[0,0,0,0]:e.darkMode?Ht:Wt)}})).views(e=>({buildDrawing(t,n){let{nodePositions:r,graph:o,nodeById:a}=e;if(!r||!o||!a)return;ue(e.viewportDirty,e.positionsVersion);let i=(0,yr.untracked)(()=>e.viewportToBuild());return{batch:Lt({nodePositions:e.walkRowBars?{}:r,graph:o,nodeById:a,colorScheme:e.effectiveColorScheme,contigThickness:e.contigThickness,connectorThickness:e.connectorThickness,drawPaths:n,nodeWidth:e.nodeWidth,highlight:t,axis:(0,yr.untracked)(()=>e.axisScale),linearLayout:e.linearLayout,viewportBounds:i,referenceRamp:e.referenceRamp,deletions:e.deletionEdgeIndexes,deletionRoutes:e.deletionRoutes,stranded:e.stranded,hiddenEdges:e.hiddenEdgeIndexes,version:e.positionsVersion}),viewportBounds:i}},get overlayLabels(){return Oo(e)},hoveredOn(t){let n=e.hoveredNode,r=n?e.nodeById?.get(n):void 0;return r?Do(t,r.id,r.length)??"not on this walk":void 0},figureSpec(){let t=e.graphRegion,n=e.sourceAdapter,r=n?.assemblyNameToPanSN,o=t&&`${t.refName}:${t.start}-${t.end}`,a=Ce(e.sourceGfaLocation),i=n?.type==="GbzBaseSyntenyAdapter"?Ce(n.gbzDbLocation):void 0,s=a?{gfa:a,region:o}:i&&t&&o?{gbz:{db:i,index:Ce(n.haplotypeIndexLocation),region:o,haplotypes:e.cutHaplotypes?.map(p=>r?.[p]??p),referenceSample:n.referenceSample||r?.[t.assemblyName]||t.assemblyName,context:n.context,snarls:e.cutsWholeWalks?"overlapping":n.subgraphSnarls}}:void 0;if(!s)return;let c=e.showGenes?e.geneTrack:void 0,d=c?(0,Ji.getSession)(e).tracks.find(p=>p.trackId===c.trackId):void 0,m=d?(0,Zt.expandTabixShorthand)((0,Zt.readConfObject)(d,"adapter"),"gffGzLocation"):void 0,g=m?.type==="Gff3TabixAdapter"?{file:Ce(m.gffGzLocation),index:Ce(m.index?.location),format:"gff3"}:void 0;return JSON.parse(JSON.stringify({...s,genes:g?.file&&g.index?g:void 0,referencePath:e.referencePath||void 0,layout:e.chosenLayoutMode,quality:e.layoutQuality,bubbleSpread:e.bubbleSpread,walks:e.walkLayers.length?e.walkLayers.map(p=>p.color?p:p.walk):void 0,facet:e.walkLayers.length>1?e.facetSpec:void 0,walkStrip:e.walkStripShown||void 0,walkRowSamples:e.walkStripShown?e.walkRowSamples:void 0,width:e.paneWidth,height:e.paneCeiling,colorScheme:e.chosenColorScheme,nodeWidth:e.nodeWidth,showDeletionEdges:e.showDeletionEdges||void 0}))},get figureUnavailable(){return e.layoutResult?e.drawsNodes||e.walkRowBars?void 0:`${_(e.chosenLayoutMode).label} draws a picture of its own, which the SVG export does not`:"Nothing is drawn yet"},get figureSpecUnavailable(){return e.drawsNodes?this.figureSpec()?void 0:"bandage-figure reads a graph cut from a gbz-base track or a GFA url":`bandage-figure draws no ${_(e.chosenLayoutMode).label} layout`},figure(){let{graph:t,layoutResult:n}=e;return t&&n&&!this.figureUnavailable?nr(t,n,{width:e.paneWidth,height:e.paneCeiling,walks:e.walkLayers,facet:e.facetSpec,colorScheme:e.effectiveColorScheme,nodeWidth:e.nodeWidth,showDeletionEdges:e.showDeletionEdges,contigThickness:e.contigThickness,connectorThickness:e.connectorThickness,region:e.graphRegion,colorDomain:e.colorDomain,fitToDrawing:e.popStack.length>0,genes:e.showGenes?e.backboneGenes:void 0,walkRows:e.walkRowBars,rowGenes:e.walkRowGenes,rowGeneGaps:e.walkRowGeneGaps,walkStrip:e.walkStripRows&&{rows:e.walkStripRows,rowGenes:e.walkRowGenes,rowGeneGaps:e.walkRowGeneGaps},spec:this.figureSpec()}):void 0},get tubeMapFrame(){let t=e.layoutResult?.tubeMap;return t?rr(t,{scaleX:e.scaleX,translateX:e.translateX,scaleY:e.scaleY,translateY:e.translateY,usableHeight:e.canvasHeight-e.fitPadTop-$}):void 0}})).views(e=>({get tubeMapRulerBoxes(){let t=e.tubeMapReference;return t&&!e.hostPlacesX?Ho(t):void 0},get connectorZoneBottom(){let t=e.tubeMapPicture,n=e.tubeMapFrame;return t&&n?n.y(t.bounds.minY)-2:0},get tubeMapConnectors(){let t=e.tubeMapReferenceNodes,n=e.tubeMapFrame,{host:r,graphRegion:o}=e,a=t&&n&&r?.initialized&&o?at(r,o):void 0;return t&&n&&a?Xo(t,i=>i*a.scale+a.translateX,n.x,e.paneWidth):[]}})).views(e=>({get tubeMapKeys(){let t=e.layoutResult,n=t?.tubeMap?.layout.reads??[],r=e.tubeMapPicture,o=e.tubeMapFrame,a=r&&o&&Uo(o.yScale)?r.mismatches.filter(i=>Ko(i,{x:o.x,width:e.paneWidth})):[];return{logWidths:t?.tubeMap!==void 0&&!t.referenceAxis,foldBp:e.tubeMapDeviations.length>0?e.tubeMapFold:void 0,forwardReads:n.some(i=>!i.is_reverse),reverseReads:n.some(i=>i.is_reverse),mismatches:new Set(a.map(i=>i.kind))}},tubeMapNodeAt(t,n){let r=e.layoutResult?.tubeMap,o=e.tubeMapFrame;return(r&&o?or(r,o,t,n):null)??zo(e.tubeMapConnectors,e.connectorZoneBottom,t,n)??null}}));var Qi=Zi.actions(e=>({setError(t){e.error=t,e.isLoading=!1,e.statusMessage=""},finishLoading(){e.isLoading=!1,e.statusMessage=""},setStatusMessage(t){e.statusMessage=t},setFetchMs(t){e.lastFetchMs=t},setLayoutMs(t){e.lastLayoutMs=t},setGeometryMetrics(t,n,r){e.lastGeometryMs=t,e.lastGeometryStrokeCount=n,e.builtViewport={...r,viewportDirty:e.viewportDirty},e.geometryVersion++},markPainted(){e.paintedViewport=e.builtViewport},setLayoutQuality(t){e.layoutQuality=t},setLinearLayout(t){e.linearLayout=t},setLayoutMode(t){e.layoutMode=t},setReferencePath(t){e.referencePath=t;let n=e.graph;if(n?.anchoredBy==="paths"){let r=De(n,t);di(n,r),e.graph=r}},setDrawPaths(t){e.drawPaths=t},setShowPerf(t){e.showPerf=t},setColorScheme(t){e.colorScheme=t},setBubbleSpread(t){e.bubbleSpread=t},setNodeWidth(t){e.nodeWidth=t},setShowBubbles(t){e.showBubbles=t},setShowDeletionEdges(t){e.showDeletionEdges=t},setShowGenes(t){e.showGenes=t},setShowReferenceStrip(t){e.showReferenceStrip=t},setTubeMapFold(t){e.tubeMapFold=t},setGeneTrackId(t){e.geneTrackId=t},setRepeatTrackId(t){e.repeatTrackId=t},setRepeatKey(t){e.repeatKey=t},setWalkLayers(t){e.walkLayers=t},liftWalks(t){let n=new Map(e.walkLayers.map(r=>[r.walk,r]));e.walkLayers=t.map(r=>n.get(r)??{walk:r})},setFacet(t){t!==e.facet.field&&(e.facet.domain=[]),e.facet.field=t},setFacetColumns(t){e.facet.columns=t},toggleWalk(t){let n=e.walkLayers;e.walkLayers=n.some(r=>r.walk===t)?n.filter(r=>r.walk!==t):[...n,{walk:t}]},setWalkColor(t,n){e.walkLayers=e.walkLayers.map(r=>r.walk===t?{...r,color:{...r.color,...n}}:r)},setPaneHeight(t){e.paneHeight=t},setWalkRowSamples(t){e.walkRowSamples=t},pairWithLinearView(t){let n=e.connectedViewId;n!==void 0&&dt([...(0,mt.getSession)(e).views]).some(o=>o.id===n)||(e.connectedViewId=t)},setHoveredNode(t){e.hoveredNode=t},setHoveredRowWalks(t){t.join(`
|
|
4
4
|
`)!==e.hoveredRowWalks.join(`
|
|
5
|
-
`)&&(e.hoveredRowWalks=t)},setHoveredBubble(t){e.hoveredBubble=t},setPointerInPane(t){e.pointerInPane=t},setWalkStrip(t){e.walkStrip=t,e.stripHover=null},setStripHover(t){e.stripHover=t;let n=e.walkStripRows,r=e.walkStripFrame,o=t&&n?[n.reference,...n.rows].find(i=>i.name===t.row):void 0,a=o&&r&&e.graph?No(e.graph,o,t.offset,r.scaleX):void 0;e.hoveredNode=a??null},setLegendSize(t){e.legendSize=t},setHoveredEdge(t){e.hoveredEdge=t},setSelectedNode(t){e.selectedNode=t},setDraggingNode(t){e.draggingNode=t},setPanning(t){e.isPanning=t},stopDragging(){e.draggingNode=null,e.isPanning=!1},clearInteractionState(){e.hoveredNode=null,e.hoveredBubble=null,e.hoveredEdge=null,e.selectedNode=null,e.draggingNode=null,e.isPanning=!1},showNodeDetails(t){let n=e.nodeById?.get(t),r=e.nodeById,o=e.nodeNeighbors;if(n&&r&&o){let a=(0,mt.getSession)(e),i=e.graphRegion,s=i?ye({nodeId:t,nodeById:r,neighbors:o}):void 0;(0,mt.isSessionModelWithWidgets)(a)&&a.showWidget(a.addWidget("BaseFeatureWidget","baseFeature",{featureData:{id:n.id,name:n.name,length:n.length,depth:n.depth,rank:n.stable?.rank,stableName:n.stable?.refName,contributingAssembly:Xe(n)?.sample,contributingHaplotype:Xe(n)?.haplotype,sampleCount:n.samples?.length,samples:n.samples,...i&&s?{refName:i.refName,assemblyName:i.assemblyName,start:s.start,end:s.end}:{}}}))}},setTransform(t,n,r){let{host:o}=e;e.viewportOwner==="host"&&o?o.horizontalScroll(e.translateX-n):(e.viewportOwner="user",e.scale=Pe(t),e.translateX=n),e.translateY=r},zoom(t,n,r){let{host:o}=e;if(e.viewportOwner==="host"&&o){o.zoomTo(o.bpPerPx/t,n);return}e.viewportOwner="user";let a=Hn(e,t,n,r,e.pixelRows);e.scale=a.scale,e.translateX=a.translateX,e.translateY=a.translateY},setViewportDirty(){e.viewportRebuildPending=!1,e.viewportDirty++},setPositionsDirty(){e.positionsVersion++},zoomToFit(){if(e.viewportOwner==="host"){let n=e.layoutBounds,r=e.facetGrid!==void 0,o=r?oe:$,a=r?oe:e.fitPadTop,i=e.viewBox.height-a-o;n&&i>0&&(e.translateY=_t(n,i,e.scaleY,a));return}let t=e.fittedTransform;t&&(e.scale=t.scale,e.translateX=t.translateX,e.translateY=t.translateY)},clearPerfMetrics(){e.lastFetchMs=void 0,e.lastLayoutMs=void 0,e.lastGeometryMs=void 0,e.lastGeometryStrokeCount=void 0,e.builtViewport=void 0}})).actions(e=>({hostTransform(t,n){let r=e.viewportOwner!=="host";r&&(e.viewportOwner="host"),e.scale=t,e.translateX=n,r&&e.zoomToFit()},refitView(){e.viewportOwner==="user"&&(e.viewportOwner="fit"),e.zoomToFit()},releaseHost(){e.viewportOwner==="host"&&(e.xIsReferenceBp?e.viewportOwner="user":(e.viewportOwner="fit",e.zoomToFit()))}})).actions(e=>{function t(){clearTimeout(e.viewportDirtyTimer),e.viewportRebuildPending=!0,e.viewportDirtyTimer=setTimeout(()=>{(0,wr.isAlive)(e)&&e.setViewportDirty()},oi)}function n(){cancelAnimationFrame(e.positionsDirtyFrame),e.positionsDirtyFrame=requestAnimationFrame(()=>{(0,wr.isAlive)(e)&&e.setPositionsDirty()})}return{moveNode(r,o,a){let i=e.layoutResult?.nodePositions;if(i?.[r]){for(let s of i[r])s.x+=o,s.y+=a;n()}},scheduleViewportDirty:t}});var ts=Zi.actions(e=>{let t;function n(l){let{rpcManager:b}=(0,ee.getSession)(e);return b.call((0,ee.getRpcSessionId)(e),"GraphComputeLayout",{...l,signal:t?.signal,statusCallback:L=>{e.setStatusMessage((0,ee.statusMessageText)(L)??"")}})}function r(l){return $n(l,{quality:e.layoutQuality,linearLayout:e.linearLayout,bubbleSpread:e.bubbleSpread})}function*o(l){let b=performance.now(),L=Ce.has(e.chosenLayoutMode),f=e.graphRegion,T=L&&f?ui(l,f):l,S=L&&e.tubeMapFold>0&&!T.reads?li(T,e.tubeMapFold):void 0,N=D(e.chosenLayoutMode).run(S?.graph??T,e.graphRegion,e.host?e.layoutResult?.sampleRows:void 0);if(N)return{result:S&&N.tubeMap?{...N,tubeMap:{...N.tubeMap,coarse:S}}:N,duration:performance.now()-b};let G=si(l),C=r(l),W=G.get(C);if(W)return{result:W,duration:performance.now()-b};let B=yield Vn(l,{quality:e.layoutQuality,linearLayout:e.linearLayout,bubbleSpread:e.bubbleSpread},n);return di(G,C,B.result),B}let a=0,i=new Map;function*s(l){let b=++a,L=()=>e.graph===l&&b===a,f=t?.signal,T;try{T=yield*o(l)}catch(N){if(!L()||f?.aborted)return!1;throw N}let S=L();return S&&(e.layoutResult=T.result,e.setLayoutMs(T.duration)),S}function c(l,b){let L=l.anchorPaths;return l.anchoredBy==="paths"&&L?(mn(l,e.assemblySpellings(b.assemblyName))??hn(L,b.assemblyName))?.name:void 0}function*d(l,b,L,f=!1,T){let S=t?.signal;e.setStatusMessage("Parsing GFA");let N=Fn(l,b,{referencePath:e.referencePath||L?.assemblyName,maxNodes:e.maxGraphNodes}),G=L?c(N,L):void 0,C=!e.referencePath&&G!==void 0&&G!==N.referencePath?Ve(N,G):N;if(T){e.setStatusMessage("Reading alignments");try{let{records:B,total:J}=yield T(C);C.reads=B,e.readsShown={shown:B.length,total:J}}catch(B){if(S?.aborted)return;console.warn("[GraphGenomeView] no reads for this graph",B),e.readsShown=void 0}if(S?.aborted)return}else e.readsShown=void 0;let W=f?e.selectedNode:null;e.graph=C,e.graphRegion=L,e.loadedReferencePath=G,e.indexBubbles=void 0,e.geneTrackFeatures=void 0,e.walkGeneFeatures=void 0,i.clear(),e.repeatArrays=void 0,e.popStack=[],e.clearInteractionState(),W!==null&&e.nodeById?.has(W)&&(e.selectedNode=W),e.setStatusMessage("Computing layout"),yield*s(C)}let m=0;function g(){let l=++m;return t?.abort(),t=new AbortController,e.loadCanceled=!1,{isLive:()=>l===m,signal:t.signal}}function*p(l,b,L){let f=ni(l);if(!(l.type!=="RgfaTabixAdapter"||f===void 0))try{let T=yield(0,ee.getSession)(e).rpcManager.call((0,ee.getRpcSessionId)(e),"CoreGetFeatures",{adapterConfig:{type:"MinigraphBubbleAdapter",uri:`${f}.bubbles.bed.gz`,baseUri:l.baseUri,assemblyNameToPanSN:l.assemblyNameToPanSN},regions:[b]});L()&&(e.indexBubbles=T.map(S=>({refName:b.refName,start:S.get("start"),end:S.get("end"),segmentCount:S.get("segmentCount"),pathCount:S.get("pathCount")??0,inversion:S.get("inversion"),shortestAlleleLength:S.get("shortestAlleleLength"),longestAlleleLength:S.get("longestAlleleLength"),segments:S.get("segments"),shortestAllele:void 0,longestAllele:void 0})))}catch(T){console.warn("[GraphGenomeView] no bubble index for this graph",T)}}function*u(l,b,L){let f=(0,ee.getSession)(e),T=l?f.tracks.find(S=>S.trackId===l):void 0;if(T)try{return yield f.rpcManager.call((0,ee.getRpcSessionId)(e),"CoreGetFeatures",{adapterConfig:(0,Qi.readConfObject)(T,"adapter"),regions:[b]})}catch(S){console.warn(`[GraphGenomeView] no ${L} for this graph`,S);return}}function*y(l,b){let L=yield*u(e.geneTrack?.trackId,l,"genes");L&&b()&&(e.geneTrackFeatures=L)}function*x(l,b){let L=yield*u(e.repeatTrack?.trackId,l,"repeats");L&&b()&&(e.repeatArrays=Vi(L))}function*k(l,b,L){let{isLive:f,signal:T}=g();e.isLoading=!0,e.error=void 0;try{let S=typeof b=="string"?b:yield b(T);f()&&(yield*d(S,l,L))}catch(S){f()&&(console.error("[GraphGenomeView.loadWholeGFA]",S),e.error=S)}finally{f()&&e.finishLoading()}return f()}function h(){t?.abort(),t=void 0,m++,a++}function R(){h(),e.graph=void 0,e.graphRegion=void 0,e.loadedReferencePath=void 0,e.layoutResult=void 0,e.indexBubbles=void 0,e.geneTrackFeatures=void 0,e.walkGeneFeatures=void 0,i.clear(),e.repeatArrays=void 0,e.readsShown=void 0,e.popStack=[],e.error=void 0,e.isLoading=!1,e.loadCanceled=!1,e.statusMessage="",e.clearInteractionState(),e.clearPerfMetrics()}return{clearGraph(){R()},cancelLoad(){e.canCancelLoad&&(R(),e.loadCanceled=!0)},stopLoad(){h(),e.isLoading=!1,e.statusMessage="",e.loadCanceled=!0},beforeDestroy(){h()},loadGFA:(0,q.flow)(function*(l,b="Imported GFA"){yield*k(b,l)}),loadGFAFromLocation:(0,q.flow)(function*(l,b){e.setStatusMessage("Fetching GFA");let L=yield*k("uri"in l?l.uri.split("/").pop()??"GFA":"GFA",f=>(0,es.openLocation)(l).readFile({encoding:"utf8",signal:f}),b);b&&L&&e.graph&&(yield*x(b,()=>e.graphRegion===b))}),cutSubgraph:(0,q.flow)(function*(l,b,L={}){let{isLive:f,signal:T}=g();e.isLoading=!0,e.error=void 0,e.setStatusMessage("Fetching subgraph");try{let S=performance.now(),N=yield(0,ee.getSession)(e).rpcManager.call((0,ee.getRpcSessionId)(e),"GetSubgraph",{adapterConfig:l,region:b,opts:L,signal:T});if(!f())return;if(e.setFetchMs(performance.now()-S),!N)throw new Error("Adapter returned no GFA \u2014 region may be outside indexed data or the adapter does not implement getSubgraph");if(yield*d(N,Ye(b),b,!0,wa(l)?G=>(0,ee.getSession)(e).rpcManager.call((0,ee.getRpcSessionId)(e),"GetGraphReads",{adapterConfig:l,nodeNames:G.nodes.map(C=>C.name),signal:T}):void 0),!f())return;e.setStatusMessage("Reading annotations"),yield Promise.all([L.tier==="coarse"?void 0:(0,q.flow)(p)(l,b,f),(0,q.flow)(y)(b,f),(0,q.flow)(x)(b,f)])}catch(S){f()&&(console.error("[GraphGenomeView.cutSubgraph]",S),e.error=S)}finally{f()&&e.finishLoading()}}),reloadRepeats:(0,q.flow)(function*(){let l=e.graphRegion,b=e.repeatTrack?.trackId;l&&(yield*x(l,()=>e.graphRegion===l&&e.repeatTrack?.trackId===b))}),loadWalkGenes:(0,q.flow)(function*(){let l=e.walkGeneReads?.reads??[],b=JSON.stringify(l),L=e.graph,f=new Map;yield Promise.all(l.map(({row:T,trackId:S,region:N})=>(0,q.flow)(function*(){let G=`${S} ${N.refName}:${N.start}-${N.end}`,C=i.get(G);if(!C){let W=yield*u(S,N,"haplotype genes");if(!W)return;C=Kt(W).map(B=>({...B,refName:N.refName})),i.set(G,C)}f.set(T,C)})())),(0,q.isAlive)(e)&&e.graph===L&&JSON.stringify(e.walkGeneReads?.reads??[])===b&&(e.walkGeneFeatures=l.length?f:void 0)}),reloadGenes:(0,q.flow)(function*(){i.clear();let l=e.graphRegion,b=e.geneTrack?.trackId;l&&(yield*y(l,()=>e.graphRegion===l&&e.geneTrack?.trackId===b))}),popBubble:(0,q.flow)(function*(l){let b=e.graph;if(!b)return;let L=Jn(b,Ct(l));if(L.nodes.length===0){(0,ee.getSession)(e).notify("None of the segments of this bubble are in the cut; widen the graph context to open it","info");return}let{isLive:f}=g();e.popStack=[...e.popStack,{graph:b,layoutMode:e.chosenLayoutMode,label:b.name,indexBubbles:e.indexBubbles}],e.indexBubbles=void 0;let T=`${Lo[Gt(l,e.repeatArrays).kind]} at ${l.refName}:${l.start.toLocaleString()}`;e.graph={...L,name:T},e.clearInteractionState(),e.viewportOwner="fit",e.isLoading=!0;try{(yield*s(e.graph))&&e.finishLoading()}catch(S){f()&&(e.error=S,e.finishLoading())}}),unpopBubble:(0,q.flow)(function*(){let l=e.poppedFrom;if(l){e.popStack=e.popStack.slice(0,-1),e.graph=l.graph,e.layoutMode=l.layoutMode,e.indexBubbles=l.indexBubbles,e.clearInteractionState(),e.viewportOwner="fit",e.isLoading=!0;try{(yield*s(l.graph))&&e.finishLoading()}catch(b){e.error=b,e.finishLoading()}}}),recomputeLayout:(0,q.flow)(function*(){let l=e.graph;if(l){e.isLoading=!0,e.setStatusMessage("Computing layout");try{(yield*s(l))&&e.finishLoading()}catch(b){console.error("[GraphGenomeView.recomputeLayout]",b),e.error=b,e.finishLoading()}}})}});function vd(e){return Q(e)&&typeof e.get=="function"}function Ad(e){let t=vd(e)?e.get("name"):Q(e)?e.name:void 0;return typeof t=="string"?t:void 0}function ns(e){let t;if(Q(e)&&Q(e.hoverPosition)){let{refName:n,coord:r,coord0:o,assemblyName:a}=e.hoverPosition;typeof n=="string"&&typeof r=="number"&&(t={refName:n,coord:typeof o=="number"?o:r-1,assemblyName:typeof a=="string"?a:void 0,featureName:Ad(e.hoverFeature)})}return t}function rs(e,t){return(e.assemblyName===void 0||e.assemblyName===t.assemblyName)&&e.refName===t.refName&&e.coord>=t.start&&e.coord<t.end}function os({hover:e,nodes:t}){let n,r;for(let o of t)o.name===e.featureName?n=o.id:r===void 0&&V(o)&&e.coord>=o.stable.start&&e.coord<o.stable.start+o.length&&(r=o.id);return n??r??null}var Nd=/^(.+) HP(\d+)$/,Pd=/^(.+)\.(\d+)$/;function Gd(e){let t=Nd.exec(e),n=Pd.exec(e);return[...t?[{sample:t[1],haplotype:String(Number(t[2])+1)}]:[],...n?[{sample:n[1],haplotype:n[2]}]:[],{sample:e,haplotype:void 0}]}function Cd(e){return K(e).name.split("#")[1]}function as(e,t){let n=t.map(r=>r.name);for(let{sample:r,haplotype:o}of Gd(e)){let a=n.filter(i=>Dr(K(i).name)===r&&(o===void 0||Cd(i)===o));if(a.length>0)return a}return[]}var ss=ts.actions(e=>({startRenderingBackend(t){if(!e.autorunsInstalled){(0,me.addDisposer)(e,(0,O.autorun)(()=>{e.fittedTransform&&(0,O.untracked)(()=>e.viewportOwner==="fit")&&e.zoomToFit()})),(0,me.addDisposer)(e,(0,O.reaction)(()=>{let r=e.facetGrid;return r?`${e.facet.field} ${e.facetPanels?.length} ${r.columns}`:""},()=>{e.refitView()})),(0,me.addDisposer)(e,(0,O.reaction)(()=>({graph:e.graph,reads:JSON.stringify(e.walkGeneReads?.reads??[])}),()=>{e.loadWalkGenes()},{fireImmediately:!0,equals:(r,o)=>r.graph===o.graph&&r.reads===o.reads})),(0,me.addDisposer)(e,(0,O.reaction)(()=>e.fitPadTop,()=>{e.viewportOwner==="host"&&e.zoomToFit()})),(0,me.addDisposer)(e,(0,O.autorun)(()=>{let r=ns((0,is.getSession)(e).hovered);(0,O.untracked)(()=>{let o=e.graphRegion,a=e.graph,i=r&&o&&rs(r,o)?r:void 0,s=i?.featureName&&a?.paths?as(i.featureName,a.paths):[];o&&a&&!e.pointerInPane&&e.setHoveredNode(i&&s.length===0?os({hover:i,nodes:a.nodes}):null),e.setHoveredRowWalks(s)})})),(0,me.addDisposer)(e,(0,O.reaction)(()=>`${e.scale}-${e.translateX}-${e.translateY}`,()=>{e.setHoveredNode(null),e.setHoveredBubble(null),e.setHoveredEdge(null)},{name:"GraphClearHoverOnViewportChange"}));let n=!0;(0,me.addDisposer)(e,(0,O.autorun)(()=>{let{scale:r}=e,o=tt(e);if(n){n=!1;return}let a=(0,O.untracked)(()=>e.builtViewport);a?.scale===r&&Wn(a.bounds,o)||e.scheduleViewportDirty()})),(0,me.addDisposer)(e,(0,O.autorun)(()=>{let r=e.currentRenderingBackend;ue(e.geometryVersion),r&&(e.applyHighlights(r),e.renderNow())}))}e.attachRenderingBackend(t,()=>({upload:n=>{if(n.resize(e.paneWidth,e.canvasHeight),e.layoutResult?.tubeMap)return ue(e.viewportDirty),n.uploadGeometry(Kn),e.setGeometryMetrics(0,0,{scale:(0,O.untracked)(()=>e.scale),bounds:(0,O.untracked)(()=>tt(e))}),!0;if(e.facetPanels)return ue(e.viewportDirty),n.uploadGeometry(Kn),e.setGeometryMetrics(0,0,{scale:(0,O.untracked)(()=>e.scale),bounds:(0,O.untracked)(()=>e.viewportToBuild())}),!0;let r=performance.now(),o=e.buildDrawing(e.walkLift,e.effectiveDrawPaths);return o?(n.uploadGeometry(o.batch),e.setGeometryMetrics(performance.now()-r,o.batch.nodeStrokes.length,{scale:(0,O.untracked)(()=>e.scale),bounds:o.viewportBounds}),!0):!1},render:n=>e.nodePositions?(e.paint(n),e.markPainted(),!0):!1,releaseTargets:n=>{n.releaseOffscreenTargets()}}))}})).actions(e=>({switchLayout(t){return e.setLayoutMode(t),e.recomputeLayout()},retryLoad(){},afterAttach(){e.isDefaultViewport||(e.viewportOwner="user")}}));var Qt=w(U(),1),Id="FeatureTrack";function cs({session:e,assemblyName:t,first:n}){let r=[];for(let o of e.tracks){let a=(0,Qt.readConfObject)(o,"type"),i=(0,Qt.readConfObject)(o,"assemblyNames"),s=(0,Qt.readConfObject)(o,"trackId");a===Id&&Array.isArray(i)&&i.includes(t)&&typeof s=="string"&&s!==n&&r.push(s)}return n?[n,...r]:r}var en=w(U(),1),ds=w(gc(),1),tn=w(re(),1);var Ed="SyntenyTrack",Bd="Synteny adapters";function Fd(e){if((0,en.readConfObject)(e,"type")===Ed)return!0;let t=e.adapter?.type;if(typeof t!="string"||!(0,tn.isStateTreeNode)(e))return!1;let{pluginManager:n}=(0,tn.getEnv)(e);return!!n?.hasAdapterType(t)&&n.getAdapterType(t).adapterMetadata?.category===Bd}function ps(e,t){let n=new Set(t),r=[];for(let o of e.tracks){let a=(0,en.readConfObject)(o,"assemblyNames"),i=(0,en.readConfObject)(o,"trackId");if(Fd(o)&&typeof i=="string"&&Array.isArray(a)){let s=a.filter(c=>typeof c=="string"&&n.has(ut(e,c))).length;s>=2&&r.push({trackId:i,name:(0,ds.getTrackName)(o,e),coverage:s})}}return r.sort((o,a)=>a.coverage-o.coverage)}function us(e,t,n="image/svg+xml"){let r=URL.createObjectURL(new Blob([e],{type:n})),o=document.createElement("a");o.href=r,o.download=t,o.click(),setTimeout(()=>{URL.revokeObjectURL(r)},0)}var ls=ss.actions(e=>({showInLinearView(t){let n=(0,Te.getSession)(e),r=t.assembly===e.graphRegion?.assemblyName,o=ji({session:n,location:t.location,assembly:t.assembly,connectedViewId:e.connectedViewId,tracks:cs({session:n,assemblyName:t.assembly,first:r?e.sourceTrackId:void 0})});r&&e.pairWithLinearView(o)},highlightInLinearView(t){Xi({session:(0,Te.getSession)(e),location:t.location,assembly:t.assembly,connectedViewId:e.connectedViewId})},showSyntenyView(t){zi({session:(0,Te.getSession)(e),contributors:e.launchableAssemblies,trackId:t,graphTrackId:e.sourceTrackId})}})).views(e=>({get syntenyLaunchTracks(){let t=e.launchableAssemblies.map(n=>n.sample);return t.length>=2?ps((0,Te.getSession)(e),t):[]}})).views(e=>({graphMenuItems(){let t=e.walkChoices;return[{label:"Layout",subMenu:io.map(n=>({type:"radio",label:n.label,checked:e.chosenLayoutMode===n.value,disabled:e.graph?!n.available(e.graph):!1,onClick:()=>{e.switchLayout(n.value)}}))},{label:"Color",subMenu:co.map(n=>({type:"radio",label:n.label,checked:e.chosenColorScheme===n.value,onClick:()=>{e.setColorScheme(n.value)}}))},...t.length>0&&e.liftsWalks?[{label:"Walk",subMenu:[{label:"None",onClick:()=>{e.setWalkLayers([])}},...e.walkLayers.length>1&&e.modeDrawsNodes?[{label:"Side by side",subMenu:ei.map(({value:n,label:r})=>({type:"radio",label:r,checked:e.facet.field===n,onClick:()=>{e.setFacet(n)}}))}]:[],...e.facetPanels&&e.facet.field==="walk"&&!e.hostPlacesX?[{label:"Columns",subMenu:[void 0,...e.facetPanels.map((n,r)=>r+1)].map(n=>({type:"radio",label:n===void 0?"Auto":`${n}`,checked:e.facet.columns===n,onClick:()=>{e.setFacetColumns(n)}}))}]:[],...t.length>zn?[{label:"Choose walks...",onClick:()=>{(0,Te.getSession)(e).queueDialog(n=>[Qa,{model:e,onClose:n}])}}]:[],...(t.length>zn?t.filter(n=>e.walkLayers.some(r=>r.walk===n.name)):t).map(n=>({type:"checkbox",label:n.label,checked:e.walkLayers.some(r=>r.walk===n.name),onClick:()=>{e.toggleWalk(n.name)}})),...e.drawnWalks.map(n=>({label:`Colour ${e.walkLabel(n.name)}`,subMenu:[{type:"subHeader",label:"Colour by"},...ho.map(r=>({type:"radio",label:r.label,checked:n.encoding.field===r.value,onClick:()=>{e.setWalkColor(n.name,{field:r.value})}})),{type:"subHeader",label:"Palette"},...fo.filter(r=>r.value!=="rainbow"||n.encoding.field==="reference").map(r=>({type:"radio",label:r.label,checked:n.encoding.scheme===r.value,onClick:()=>{e.setWalkColor(n.name,{scheme:r.value})}}))]}))]}]:[],...Ce.has(e.chosenLayoutMode)?[{label:"Fold variants",subMenu:ti.map(({bp:n,label:r})=>({type:"radio",label:r,checked:e.tubeMapFold===n,disabled:n>0&&e.graph?.reads!==void 0,onClick:()=>{e.setTubeMapFold(n),e.recomputeLayout()}}))}]:[],...e.chosenLayoutMode==="walkrows"&&e.repeatChoices.length>0?[{label:"Repeat",subMenu:[{type:"radio",label:"Whole window",checked:e.repeatKey==="",onClick:()=>{e.setRepeatKey("")}},...e.repeatChoices.map(({key:n,name:r,unit:o})=>({type:"radio",label:`${r} \xB7 ${o.toLocaleString()} bp unit`,checked:e.repeatKey===n,onClick:()=>{e.setRepeatKey(n)}}))]}]:[],...e.hostPlacesX?[]:[{label:"Zoom in",onClick:()=>{e.zoom(1.5,e.viewBox.width/2,e.viewBox.height/2)}},{label:"Zoom out",onClick:()=>{e.zoom(1/1.5,e.viewBox.width/2,e.viewBox.height/2)}},{label:"Zoom to fit",onClick:()=>{e.zoomToFit()}}],{type:"checkbox",label:"Mark bubbles",checked:e.showBubbles,onClick:()=>{e.setShowBubbles(!e.showBubbles)}},{type:"checkbox",label:"Show deletion edges",checked:e.showDeletionEdges,onClick:()=>{e.setShowDeletionEdges(!e.showDeletionEdges)}},{type:"checkbox",label:"Genes on the backbone",checked:e.showGenes,onClick:()=>{e.setShowGenes(!e.showGenes)}},...!e.host&&e.modeDrawsNodes&&(e.graph?.paths?.length??0)>1?[{type:"checkbox",label:"Walk rows under the graph",checked:e.walkStrip,onClick:()=>{e.setWalkStrip(!e.walkStrip)}}]:[],...e.referenceStripApplies?[{type:"checkbox",label:"Reference strip at bp",checked:e.showReferenceStrip,onClick:()=>{e.setShowReferenceStrip(!e.showReferenceStrip)}}]:[],{label:"Export SVG",disabled:e.figureUnavailable!==void 0,disabledHelpText:e.figureUnavailable,onClick:()=>{let n=e.figure();n&&us(n,`${(e.graph?.name??"graph").replaceAll(/[^\w.-]+/g,"_")}.svg`)}},{label:"Copy figure spec",disabled:e.figureSpecUnavailable!==void 0,disabledHelpText:e.figureSpecUnavailable,onClick:()=>{let n=e.figureSpec(),r=(0,Te.getSession)(e);navigator.clipboard.writeText(`${JSON.stringify(n,null,2)}
|
|
6
|
-
`).then(()=>{r.notify("Figure spec copied. Save it as spec.json and run: npx -p @jbrowse/bandage-core bandage-figure spec.json -o figure.svg","info")}).catch(o=>{r.notify(`Could not copy the figure spec: ${String(o)}`)})}}]},launchMenuItems(){let t=[];for(let n of sa({contributors:e.launchableAssemblies,syntenyTracks:e.syntenyLaunchTracks,onShowLinear:r=>{e.showInLinearView(r)},onShowSynteny:r=>{e.showSyntenyView(r)}}))(0,ms.pushLaunchViewMenuItem)(t,n);return t}}));function nn(){return ls}var kr=w(U(),1);function gs(e){return Array.isArray(e)&&e.every(t=>typeof t=="string")}function hs(e){let t=(0,kr.readConfObject)(e,"assemblyNames"),n=gs(t)?t.slice(1):[];return n.length>0?n:void 0}function rn(e){let t=(0,kr.readConfObject)(e,"assemblyNames");return gs(t)?t[0]:void 0}function on(e,t){return e===void 0||e===t?void 0:`The graph is cut on its reference, ${e}: open it from a view of ${e}`}function $d(e){return("uri"in e?e.uri.split(/[?#]/)[0]:"localPath"in e?e.localPath:"name"in e?e.name:"").split(/[\\/]/).at(-1)??""}function xr(){return X.types.compose("GraphGenomeView",fs.BaseViewModel,nn(),X.types.model({type:X.types.literal("GraphGenomeView"),gfaLocation:X.types.maybe(X.types.frozen()),loadedRegion:X.types.maybe(X.types.frozen()),loadedTrackId:X.types.optional(X.types.string,""),subgraphContext:X.types.optional(X.types.number,1),subgraphHaplotypes:X.types.maybe(X.types.frozen()),maxRegionBp:X.types.optional(X.types.number,et)})).views(e=>({get rpcSessionId(){return e.id},get paneWidth(){return e.width},get cutHaplotypes(){return e.subgraphHaplotypes},get sourceGfaLocation(){return e.gfaLocation},get sourceTrack(){return e.loadedTrackId?(0,bs.getSession)(e).tracks.find(t=>t.trackId===e.loadedTrackId):void 0},get canRetryLoad(){return e.gfaLocation!==void 0||e.loadedTrackId!==""&&e.loadedRegion!==void 0}})).views(e=>({get hasPendingSource(){return e.canRetryLoad&&!e.graph&&!e.loadCanceled},menuItems(){return e.launchMenuItems()}})).actions(e=>{let t=e.clearGraph;return{clearGraph(){t(),e.gfaLocation=void 0,e.loadedRegion=void 0,e.loadedTrackId=""},load(){let n=e.loadedRegion;if(e.gfaLocation)return e.displayName||e.setDisplayName($d(e.gfaLocation)),e.loadGFAFromLocation(e.gfaLocation,n);if(!e.loadedTrackId||!n)return;let r=e.sourceTrack,o=n.end-n.start,a=r?on(rn(r),n.assemblyName):void 0;if(!r)e.setError(new Error(`The track this graph was cut from, "${e.loadedTrackId}", is not in this session`));else if(a)e.setError(new Error(a));else if(o>e.maxRegionBp)e.setError(new Error(`Region too large (${Se(o)}) \u2014 zoom in to view graph (max ${Se(e.maxRegionBp)})`));else return e.cutSubgraph(he(e,r),n,{hops:e.subgraphContext,haplotypes:e.subgraphHaplotypes,...e.cutsWholeWalks?{snarls:"overlapping"}:{}})}}}).actions(e=>({retryLoad(){e.load()},switchLayout(t){let n=e.cutsWholeWalks;return e.setLayoutMode(t),e.loadedTrackId&&e.cutsWholeWalks!==n?e.load():e.recomputeLayout()},afterAttach(){e.graph||e.load(),(0,X.addDisposer)(e,(0,ys.reaction)(()=>e.walkStrip,()=>{e.loadedTrackId&&!D(e.chosenLayoutMode).wholeWalks&&e.load()}))}}))}var Vd=(0,xs.defineLaunchKeys)()({});function Sr(e){e.addViewType(()=>new ks.default({name:"GraphGenomeView",displayName:"Graph genome view",stateModel:xr(),launchKeys:Vd,ReactComponent:(0,ws.lazy)(()=>import("./chunks/GraphGenomeView-QAJUST4R.js"))}))}var Ss=w(U(),1),Ee=w(ge(),1),Rr=["MultiWaySyntenyDisplay","LinearSyntenyDisplay","DotplotDisplay","ChordSyntenyDisplay"];function _d(e){let t=e.getElementTypesInGroup("display"),n=o=>t.find(a=>a.name===o),r=o=>o&&Object.assign(Object.create(o),{adapterCapabilities:["headerLanes"]});return[n("LinearGraphDisplay"),n("LinearBasicDisplay"),...Rr.map(o=>r(n(o)))].filter(o=>o!==void 0)}function Mr(e){e.addTrackType(()=>{let t=(0,Ss.ConfigurationSchema)("GraphTrack",{},{baseConfiguration:(0,Ee.createBaseTrackConfig)(e),explicitIdentifier:"trackId"}),n=new Ee.TrackType({name:"GraphTrack",displayName:"Pangenome graph track",configSchema:t,stateModel:(0,Ee.createBaseTrackModel)(e,"GraphTrack",t)});for(let r of _d(e))n.addDisplayType(r);return n})}function Lr(e){e.addToExtensionPoint("LaunchView-GraphGenomeView",t=>{let{session:n,...r}=t;return n.addView("GraphGenomeView",r),t})}var Os=w($e(),1),Ws=w(Ms(),1);var vs=w(U(),1),As=w(Ts(),1),Tr=w(re(),1);function Ns(){return(0,vs.ConfigurationSchema)("LinearGraphDisplay",{layoutMode:{type:"stringEnum",model:Tr.types.enumeration("LayoutMode",xt),defaultValue:"auto"},colorScheme:{type:"stringEnum",model:Tr.types.enumeration("ColorScheme",St),defaultValue:"auto"},...(0,As.trackHeightConfigSchemaFields)({defaultHeight:300,height:"the height of the track the graph is drawn in"})},{explicitlyTyped:!0,explicitIdentifier:"displayId"})}var Fs=w($e(),1);var gt=w(U(),1),$s=w(ge(),1),Vs=w(qr(),1),vr=w(ae(),1),_s=w(Gs(),1),I=w(re(),1),an=w(Is(),1);var lt=w(bt(),1);function Es(e){return e instanceof Error&&(e.name==="NodeLimitError"||e.regionTooLarge===!0||/reads more than nodeLimit|^Subgraph size limit of \d+ nodes exceeded/.test(e.message))}function Bs(e,t){if(e?.refName!==t.refName||e.assemblyName!==t.assemblyName)return!1;let n=e.end-e.start;return t.end-t.start>=n&&t.end>e.start-n&&t.start<e.end+n}var Dd=(0,Fs.lazy)(()=>import("./chunks/GraphTrackSettingsDialog-CLI6V424.js"));function Ds(e){return I.types.compose("LinearGraphDisplay",$s.BaseDisplay,(0,_s.default)(),nn(),I.types.model({type:I.types.literal("LinearGraphDisplay"),configuration:(0,gt.ConfigurationReference)(e),pane:I.types.maybe(I.types.frozen()),overviewRowsChoice:I.types.maybe(I.types.frozen()),overviewRowOrder:I.types.maybe(I.types.frozen()),cutRegion:I.types.maybe(I.types.frozen()),coarseCut:I.types.optional(I.types.boolean,!1),maxRegionBp:I.types.optional(I.types.number,et),subgraphContext:I.types.optional(I.types.number,1),subgraphHaplotypes:I.types.maybe(I.types.frozen())})).preProcessSnapshot(t=>{let{pane:n,overviewRowsChoice:r,overviewRowOrder:o,...a}=t;if(!n)return a;let{type:i,...s}=n;return{...s,...a}}).volatile(()=>({recuts:0,settledWindow:void 0,dense:void 0})).views(t=>({get adapterConfig(){return he(t,t.parentTrack.configuration)},get defaultLayoutMode(){return(0,gt.getConf)(t,"layoutMode")},get defaultColorScheme(){return(0,gt.getConf)(t,"colorScheme")},get drawsGenomicCoordinates(){return t.layoutResult===void 0||t.hostPlacesX},get canvasHeight(){return t.height},get canRetryLoad(){return t.cutRegion!==void 0},get cutHaplotypes(){return this.chosenHaplotypes},get chosenHaplotypes(){return t.subgraphHaplotypes??hs(t.parentTrack.configuration)},get coarseAboveBpPerPx(){let r=t.adapterConfig.coarse?.aboveBpPerPx;return typeof r=="number"?r:void 0}})).views(t=>({tierAt(n){let r=t.coarseAboveBpPerPx;return r!==void 0&&n>r?"coarse":"fine"},capFor(n){return n==="coarse"?1/0:t.maxRegionBp},get cutTier(){return t.coarseCut&&t.coarseAboveBpPerPx!==void 0?"coarse":"fine"}})).views(t=>({get settledCapBp(){let n=t.settledWindow;return n?t.capFor(t.tierAt(n.bpPerPx)):1/0}})).views(t=>({get regionTooLarge(){let n=t.settledWindow;return n!==void 0&&n.end-n.start>t.settledCapBp},get regionTooLargeReason(){let n=t.settledWindow;return n?`Region too large for a graph cut (${Se(n.end-n.start)}, max ${Se(t.settledCapBp)})`:""},get zoomCanReleaseGate(){return!0},get fetchCanceled(){return t.loadCanceled}})).views(t=>({get displayPhase(){return(0,an.computeDisplayStatusPhase)({regionTooLarge:t.regionTooLarge,error:t.error??t.renderError},()=>(0,an.computeActivityPhase)({isMinimized:t.isMinimized,fetchInert:!1,viewportEmpty:t.host?.initialized===!0&&t.host.hasVisibleContent===!1,isLoading:t.isLoading||!t.hasGraph,fetchCanceled:t.loadCanceled,awaitingDependentData:!1,rendersCanvas:!0,canvasDrawn:t.painted&&t.geometryPainted},()=>!0,()=>t.host?.effectiveBodyMounted??!0))}})).actions(t=>({setSubgraphContext(n){t.subgraphContext=n},setSubgraphHaplotypes(n){t.subgraphHaplotypes=n,t.dense=void 0},setDense(n){t.dense=n},setMaxRegionBp(n){t.maxRegionBp=n},cut(){let n=t.cutRegion;if(!n)return;let r=on(rn(t.parentTrack.configuration),n.assemblyName);if(r){t.clearGraph(),t.setError(new Error(r));return}let o=t.cutTier==="coarse";return t.cutSubgraph(t.adapterConfig,n,{hops:o?0:t.subgraphContext,haplotypes:t.chosenHaplotypes,tier:o?"coarse":void 0,...D(t.chosenLayoutMode).wholeWalks?{snarls:"overlapping"}:{}})}})).actions(t=>({recutAt(n){let r=t.tierAt(n.bpPerPx);return t.coarseCut=r==="coarse",t.cutRegion=ar(n,t.capFor(r),D(t.chosenLayoutMode).cutMargins),t.recuts++,t.cut()}})).actions(t=>({settleOn(n){t.settledWindow=n;let r=D(t.chosenLayoutMode).cutMargins;return t.regionTooLarge||Bs(t.dense,n)||!t.loadCanceled&&t.tierAt(n.bpPerPx)===t.cutTier&&Ai(t.cutRegion,n,r)?!1:(Promise.resolve(t.recutAt(n)).then(()=>{(0,I.isAlive)(t)&&Es(t.error)&&this.refuseDenseCut(n)}),!0)},refuseDenseCut(n){t.setDense(n),t.cutRegion=void 0,this.settleOn(t.settledWindow??n)},switchLayout(n){let r=D(t.chosenLayoutMode);t.setLayoutMode(n);let o=D(n),a=t.host?zt(t.host):void 0;return a&&!t.regionTooLarge&&(o.cutMargins!==r.cutMargins||o.wholeWalks!==r.wholeWalks)?t.recutAt(a):t.recomputeLayout()},retryLoad(){t.cut()},reload(){t.cut()},cancelFetchByUser(){t.stopLoad()}})).actions(t=>({forceLoad(){let n=t.settledWindow;n&&(t.setMaxRegionBp(Math.ceil(n.end-n.start)),t.settleOn(n))},afterAttach(){t.cutRegion&&!t.graph&&t.cut(),(0,I.addDisposer)(t,(0,lt.reaction)(()=>t.hostPlacesX,n=>{n||t.releaseHost()},{name:"GraphHostPlacesX"})),(0,I.addDisposer)(t,(0,lt.reaction)(()=>t.hostFrame,n=>{n&&t.hostTransform(n.scale,n.translateX)},{equals:(n,r)=>n?.scale===r?.scale&&n?.translateX===r?.translateX,fireImmediately:!0,name:"GraphHostFrame"})),(0,I.addDisposer)(t,(0,lt.reaction)(()=>`${t.facet.field} ${t.facetPlacement?.count}`,()=>{let n=t.facetGridIn(t.paneCeiling)?.total??0;(t.facetGrid?.total??0)>t.height&&t.setHeight(Math.max(t.height,Math.ceil(n)))},{name:"GraphFacetHeight"})),(0,I.addDisposer)(t,(0,lt.reaction)(()=>t.host?.coarseDynamicBlocks,n=>{let{host:r}=t,o=n&&r?zt(r):void 0;o&&t.settleOn(o)},{fireImmediately:!0,name:"GraphHostSettle"}))}})).views(t=>({get graphViewSpec(){let n=t.host?zt(t.host):void 0,r=t.sourceTrackId;if(!n||!r||!t.hasGraph||t.coarseCut||t.regionTooLarge)return;let o=Math.floor(n.start),a=Math.ceil(n.end);return{loadedTrackId:r,loadedRegion:{refName:n.refName,assemblyName:n.assemblyName,start:o,end:a},subgraphContext:t.subgraphContext,subgraphHaplotypes:t.chosenHaplotypes,maxRegionBp:Math.max(t.maxRegionBp,a-o),layoutMode:t.chosenLayoutMode,colorScheme:t.chosenColorScheme,referencePath:t.referencePath,geneTrackId:t.geneTrackId,showGenes:t.showGenes,showBubbles:t.showBubbles,showDeletionEdges:t.showDeletionEdges,walkLayers:t.walkLayers,facet:(0,I.getSnapshot)(t.facet)}}})).actions(t=>({openGraphView(){let n=t.graphViewSpec;n&&(0,vr.getSession)(t).addView("GraphGenomeView",n)}})).views(t=>({trackMenuItems(){let n=t.launchMenuItems();return(0,Vs.pushLaunchViewMenuItem)(n,{label:"Graph genome view",icon:$t,disabled:!t.graphViewSpec,disabledHelpText:"Zoom in until the track cuts a graph",onClick:()=>{t.openGraphView()}}),[...t.graphMenuItems(),{label:"Settings",icon:ca,onClick:()=>{(0,vr.getSession)(t).queueDialog(r=>[Dd,{model:t,open:!0,onClose:r}])}},...n]}}))}function Ar(e){e.addDisplayType(()=>{let t=Ns();return Object.assign(new Ws.default({name:"LinearGraphDisplay",displayName:"Graph",configSchema:t,stateModel:Ds(t),trackType:["GraphTrack","FeatureTrack","SyntenyTrack"],viewType:"LinearGenomeView",ReactComponent:(0,Os.lazy)(()=>import("./chunks/LinearGraphDisplay-2ZCJVTOZ.js"))}),{adapterCapabilities:["getSubgraph"]})})}var Xs=w(Vt(),1);var Nr=w(U(),1),Hs=w(re(),1);function Pr(e){let{uri:t,baseUri:n,csi:r}=e;return typeof t=="string"?{...e,bubblesLocation:{uri:t,baseUri:n},index:{indexType:r?"CSI":"TBI",location:{uri:`${t}.${r?"csi":"tbi"}`,baseUri:n}}}:e}var Od=(0,Nr.ConfigurationSchema)("MinigraphBubbleAdapter",{bubblesLocation:{type:"fileLocation",defaultValue:{uri:"/path/to/graph.bb.bed.gz",locationType:"UriLocation"}},index:(0,Nr.ConfigurationSchema)("MinigraphBubbleIndex",{indexType:{model:Hs.types.enumeration("IndexType",["TBI","CSI"]),type:"stringEnum",defaultValue:"TBI"},location:{type:"fileLocation",defaultValue:{uri:"/path/to/graph.bb.bed.gz.tbi",locationType:"UriLocation"}}}),assemblyNameToPanSN:{type:"frozen",defaultValue:{}}},{explicitlyTyped:!0,preProcessSnapshot:Pr}),js=Od;function Gr(e){e.addAdapterType(()=>new Xs.default({name:"MinigraphBubbleAdapter",displayName:"Minigraph bubble BED adapter",normalizeSnapshot:Pr,configSchema:js,adapterMetadata:{category:"Graph adapters"},getAdapterClass:()=>import("./chunks/MinigraphBubbleAdapter-5AQXW2NH.js").then(t=>t.default)}))}var qs=w(Vt(),1);var cn=w(U(),1),Us=w(re(),1);function zs(e,t,n){return{indexType:n?"CSI":"TBI",location:{uri:`${e}.${n?"csi":"tbi"}`,baseUri:t}}}function Ys(e){let{uri:t,baseUri:n,csi:r}=e;return typeof t=="string"?{...e,segmentsLocation:{uri:`${t}.segs.bed.gz`,baseUri:n},segmentsIndex:zs(`${t}.segs.bed.gz`,n,r),linksLocation:{uri:`${t}.links.bed.gz`,baseUri:n},linksIndex:zs(`${t}.links.bed.gz`,n,r)}:e}function Cr(e){let{coarse:t,baseUri:n}=e;return Ys(typeof t=="object"&&t!==null?{...e,coarse:Ys({baseUri:n,...t})}:e)}var sn=(e,t)=>(0,cn.ConfigurationSchema)(e,{indexType:{model:Us.types.enumeration("IndexType",["TBI","CSI"]),type:"stringEnum",defaultValue:"TBI"},location:{type:"fileLocation",defaultValue:{uri:t,locationType:"UriLocation"}}}),Wd=(0,cn.ConfigurationSchema)("RgfaTabixCoarseTier",{aboveBpPerPx:{type:"maybeNumber"},segmentsLocation:{type:"fileLocation",defaultValue:{uri:"/path/to/graph.tier.segs.bed.gz",locationType:"UriLocation"}},segmentsIndex:sn("RgfaCoarseSegmentsIndex","/path/to/graph.tier.segs.bed.gz.tbi"),linksLocation:{type:"fileLocation",defaultValue:{uri:"/path/to/graph.tier.links.bed.gz",locationType:"UriLocation"}},linksIndex:sn("RgfaCoarseLinksIndex","/path/to/graph.tier.links.bed.gz.tbi")}),Hd=(0,cn.ConfigurationSchema)("RgfaTabixAdapter",{segmentsLocation:{type:"fileLocation",defaultValue:{uri:"/path/to/graph.segs.bed.gz",locationType:"UriLocation"}},segmentsIndex:sn("RgfaSegmentsIndex","/path/to/graph.segs.bed.gz.tbi"),linksLocation:{type:"fileLocation",defaultValue:{uri:"/path/to/graph.links.bed.gz",locationType:"UriLocation"}},linksIndex:sn("RgfaLinksIndex","/path/to/graph.links.bed.gz.tbi"),assemblyNameToPanSN:{type:"frozen",defaultValue:{}},coarse:Wd},{explicitlyTyped:!0,preProcessSnapshot:Cr}),Ks=Hd;function Ir(e){e.addAdapterType(()=>new qs.default({name:"RgfaTabixAdapter",displayName:"Indexed rGFA adapter",normalizeSnapshot:Cr,configSchema:Ks,adapterCapabilities:["getSubgraph"],adapterMetadata:{category:"Graph adapters"},getAdapterClass:()=>import("./chunks/RgfaTabixAdapter-P3RQBV2A.js").then(t=>t.default)}))}var jd=new Set(["RgfaTabixAdapter","GbzBaseSyntenyAdapter"]);function Xd(e){return Yr(e).toLowerCase().endsWith(".gbz.db")}function zd(e){let t=e.adapter;return t?.type==="GbzBaseSyntenyAdapter"&&!t.assemblyNames?.length&&Array.isArray(e.assemblyNames)&&e.assemblyNames.length>0?{...e,adapter:{...t,assemblyNames:e.assemblyNames}}:e}function Yd(e,t,n){if((!n||n==="GbzBaseSyntenyAdapter")&&Xd(e))return{type:"GbzBaseSyntenyAdapter",gbzDbLocation:e,...t?{haplotypeIndexLocation:t}:{}};if((!n||n==="RgfaTabixAdapter")&&Ur(e))return Kr({choice:"RgfaTabixAdapter",loc:e,indexLoc:t,assembly:"",sample:""})}function Er(e){e.addToExtensionPoint("Core-preProcessTrackConfig",zd),e.addToExtensionPoint("Core-guessAdapterForLocation",t=>(n,r,o)=>Yd(n,r,o)??t(n,r,o)),e.addToExtensionPoint("Core-guessTrackTypeForLocation",t=>(n,r)=>jd.has(n)?"GraphTrack":t(n,r))}var ec=w(ae(),1),tc=w(fc(),1),Br=w(hc(),1),nc=w(bc(),1);function Js(e){let t;if(Q(e)){let{refName:n,start:r,end:o,assemblyName:a}=e;typeof n=="string"&&typeof r=="number"&&typeof o=="number"&&(t={refName:n,start:r,end:o,assemblyName:typeof a=="string"?a:void 0})}return t}function Ud(e,t,n){let r=e.connectedViewId;return r===void 0||r===t||!n.has(r)}function Zs(e,t){return e.assemblyName===void 0||t===void 0||t.includes(e.assemblyName)}function Kd(e){return(Array.isArray(e.tracks)?e.tracks:[]).flatMap(n=>Q(n)&&Array.isArray(n.displays)?n.displays.filter(r=>Q(r)&&r.type==="LinearGraphDisplay"):[])}function Qs(e,t,n){let r=[],o=dt(e),a=new Set(o.map(i=>Q(i)?i.id:void 0));for(let i of o){if(Q(i)&&i.id===t)for(let s of Kd(i)){let c=Js(s.hoverHighlight);c&&Zs(c,n)&&r.push({key:typeof s.id=="string"?s.id:"graph-track",region:c})}if(Q(i)&&i.type==="GraphGenomeView"&&Ud(i,t,a)){let s=Js(i.hoverHighlight);s&&Zs(s,n)&&r.push({key:typeof i.id=="string"?i.id:"graph",region:s})}}return r}var Be=w(Fe(),1),qd=(0,nc.makeStyles)()(e=>({highlight:{height:"100%",position:"absolute",background:(0,tc.alpha)(e.palette.primary.main,.25),borderLeft:`2px solid ${e.palette.primary.main}`,borderRight:`2px solid ${e.palette.primary.main}`,pointerEvents:"none",zIndex:10}})),Jd=(0,Br.observer)(function({model:t,region:n}){let{classes:r}=qd(),o=t.getHighlightCoords(n);return o?(0,Be.jsx)("div",{"data-testid":"graph-node-highlight",className:r.highlight,style:{left:o.left,width:o.width}}):null}),Zd=(0,Br.observer)(function({model:t}){let{views:n}=(0,ec.getSession)(t);return(0,Be.jsx)(Be.Fragment,{children:Qs([...n],t.id,t.assemblyNames).map(({key:r,region:o})=>(0,Be.jsx)(Jd,{model:t,region:o},`graph-hover-${r}`))})}),rc=Zd;var oc=w(Fe(),1),Qd="LinearGenomeView-TracksContainerComponent";function Fr(e){e.contributeToExtensionPoint(Qd,({model:t})=>(0,oc.jsx)(rc,{model:t},"graphgenomeview-hover-highlight"))}var ac=w(ge(),1);function ep(e){return e.views(t=>({get adapterConfig(){return he(t,t.parentTrack.configuration)}}))}function $r(e){e.addToExtensionPoint("Core-extendPluggableElement",t=>(t instanceof ac.DisplayType&&Rr.includes(t.name)&&t.extendStateModel(ep),t))}var ic="GraphGenomeView";var sc="6.0.2";var Vr=class extends cc.default{constructor(){super(...arguments);this.name=ic;this.version=sc}install(n){Sr(n),Ar(n),Mr(n),Lr(n),Fr(n),Ir(n),Gr(n),Gn(n),In(n),Er(n),$r(n),n.addRpcMethod(()=>new qe(n)),n.addRpcMethod(()=>new Ke(n)),n.addRpcMethod(()=>new Ue(n))}configure(n){try{(0,dc.isAbstractMenuManager)(n.rootModel)&&n.rootModel.appendToSubMenu(["Add"],{label:"Graph genome view",icon:$t,onClick:r=>{r.addView("GraphGenomeView",{})}})}catch(r){console.warn("[GraphGenomeView] could not add the Add menu entry",r)}}};export{Vr as default};
|
|
5
|
+
`)&&(e.hoveredRowWalks=t)},setHoveredBubble(t){e.hoveredBubble=t},setPointerInPane(t){e.pointerInPane=t},setWalkStrip(t){e.walkStrip=t,e.stripHover=null},setStripHover(t){e.stripHover=t;let n=e.walkStripRows,r=e.walkStripFrame,o=t&&n?[n.reference,...n.rows].find(i=>i.name===t.row):void 0,a=o&&r&&e.graph?No(e.graph,o,t.offset,r.scaleX):void 0;e.hoveredNode=a??null},setLegendSize(t){e.legendSize=t},setHoveredEdge(t){e.hoveredEdge=t},setSelectedNode(t){e.selectedNode=t},setDraggingNode(t){e.draggingNode=t},setPanning(t){e.isPanning=t},stopDragging(){e.draggingNode=null,e.isPanning=!1},clearInteractionState(){e.hoveredNode=null,e.hoveredBubble=null,e.hoveredEdge=null,e.selectedNode=null,e.draggingNode=null,e.isPanning=!1},showNodeDetails(t){let n=e.nodeById?.get(t),r=e.nodeById,o=e.nodeNeighbors;if(n&&r&&o){let a=(0,mt.getSession)(e),i=e.graphRegion,s=i?ye({nodeId:t,nodeById:r,neighbors:o}):void 0;(0,mt.isSessionModelWithWidgets)(a)&&a.showWidget(a.addWidget("BaseFeatureWidget","baseFeature",{featureData:{id:n.id,name:n.name,length:n.length,depth:n.depth,rank:n.stable?.rank,stableName:n.stable?.refName,contributingAssembly:Xe(n)?.sample,contributingHaplotype:Xe(n)?.haplotype,sampleCount:n.samples?.length,samples:n.samples,...i&&s?{refName:i.refName,assemblyName:i.assemblyName,start:s.start,end:s.end}:{}}}))}},setTransform(t,n,r){let{host:o}=e;e.viewportOwner==="host"&&o?o.horizontalScroll(e.translateX-n):(e.viewportOwner="user",e.scale=Pe(t),e.translateX=n),e.translateY=r},zoom(t,n,r){let{host:o}=e;if(e.viewportOwner==="host"&&o){o.zoomTo(o.bpPerPx/t,n);return}e.viewportOwner="user";let a=Hn(e,t,n,r,e.pixelRows);e.scale=a.scale,e.translateX=a.translateX,e.translateY=a.translateY},setViewportDirty(){e.viewportRebuildPending=!1,e.viewportDirty++},setPositionsDirty(){e.positionsVersion++},zoomToFit(){if(e.viewportOwner==="host"){let n=e.layoutBounds,r=e.facetGrid!==void 0,o=r?oe:$,a=r?oe:e.fitPadTop,i=e.viewBox.height-a-o;n&&i>0&&(e.translateY=Vt(n,i,e.scaleY,a));return}let t=e.fittedTransform;t&&(e.scale=t.scale,e.translateX=t.translateX,e.translateY=t.translateY)},clearPerfMetrics(){e.lastFetchMs=void 0,e.lastLayoutMs=void 0,e.lastGeometryMs=void 0,e.lastGeometryStrokeCount=void 0,e.builtViewport=void 0}})).actions(e=>({hostTransform(t,n){let r=e.viewportOwner!=="host";r&&(e.viewportOwner="host"),e.scale=t,e.translateX=n,r&&e.zoomToFit()},refitView(){e.viewportOwner==="user"&&(e.viewportOwner="fit"),e.zoomToFit()},releaseHost(){e.viewportOwner==="host"&&(e.xIsReferenceBp?e.viewportOwner="user":(e.viewportOwner="fit",e.zoomToFit()))}})).actions(e=>{function t(){clearTimeout(e.viewportDirtyTimer),e.viewportRebuildPending=!0,e.viewportDirtyTimer=setTimeout(()=>{(0,wr.isAlive)(e)&&e.setViewportDirty()},ai)}function n(){cancelAnimationFrame(e.positionsDirtyFrame),e.positionsDirtyFrame=requestAnimationFrame(()=>{(0,wr.isAlive)(e)&&e.setPositionsDirty()})}return{moveNode(r,o,a){let i=e.layoutResult?.nodePositions;if(i?.[r]){for(let s of i[r])s.x+=o,s.y+=a;n()}},scheduleViewportDirty:t}});var ns=Qi.actions(e=>{let t;function n(l){let{rpcManager:b}=(0,ee.getSession)(e);return b.call((0,ee.getRpcSessionId)(e),"GraphComputeLayout",{...l,signal:t?.signal,statusCallback:L=>{e.setStatusMessage((0,ee.statusMessageText)(L)??"")}})}function r(l){return $n(l,{quality:e.layoutQuality,linearLayout:e.linearLayout,bubbleSpread:e.bubbleSpread})}function*o(l){let b=performance.now(),L=Ie.has(e.chosenLayoutMode),f=e.graphRegion,T=L&&f?mi(l,f):l,R=L&&e.tubeMapFold>0&&!T.reads?gi(T,e.tubeMapFold):void 0,N=_(e.chosenLayoutMode).run(R?.graph??T,e.graphRegion,e.host?e.layoutResult?.sampleRows:void 0);if(N)return{result:R&&N.tubeMap?{...N,tubeMap:{...N.tubeMap,coarse:R}}:N,duration:performance.now()-b};let G=ci(l),I=r(l),W=G.get(I);if(W)return{result:W,duration:performance.now()-b};let B=yield Dn(l,{quality:e.layoutQuality,linearLayout:e.linearLayout,bubbleSpread:e.bubbleSpread},n);return pi(G,I,B.result),B}let a=0,i=new Map;function*s(l){let b=++a,L=()=>e.graph===l&&b===a,f=t?.signal,T;try{T=yield*o(l)}catch(N){if(!L()||f?.aborted)return!1;throw N}let R=L();return R&&(e.layoutResult=T.result,e.setLayoutMs(T.duration)),R}function c(l,b){let L=l.anchorPaths;return l.anchoredBy==="paths"&&L?(mn(l,e.assemblySpellings(b.assemblyName))??hn(L,b.assemblyName))?.name:void 0}function*d(l,b,L,f=!1,T){let R=t?.signal;e.setStatusMessage("Parsing GFA");let N=Fn(l,b,{referencePath:e.referencePath||L?.assemblyName,maxNodes:e.maxGraphNodes}),G=L?c(N,L):void 0,I=!e.referencePath&&G!==void 0&&G!==N.referencePath?De(N,G):N;if(T){e.setStatusMessage("Reading alignments");try{let{records:B,total:J}=yield T(I);I.reads=B,e.readsShown={shown:B.length,total:J}}catch(B){if(R?.aborted)return;console.warn("[GraphGenomeView] no reads for this graph",B),e.readsShown=void 0}if(R?.aborted)return}else e.readsShown=void 0;let W=f?e.selectedNode:null;e.graph=I,e.graphRegion=L,e.loadedReferencePath=G,e.indexBubbles=void 0,e.geneTrackFeatures=void 0,e.walkGeneFeatures=void 0,i.clear(),e.repeatArrays=void 0,e.popStack=[],e.clearInteractionState(),W!==null&&e.nodeById?.has(W)&&(e.selectedNode=W),e.setStatusMessage("Computing layout"),yield*s(I)}let m=0;function g(){let l=++m;return t?.abort(),t=new AbortController,e.loadCanceled=!1,{isLive:()=>l===m,signal:t.signal}}function*p(l,b,L){let f=ri(l);if(!(l.type!=="RgfaTabixAdapter"||f===void 0))try{let T=yield(0,ee.getSession)(e).rpcManager.call((0,ee.getRpcSessionId)(e),"CoreGetFeatures",{adapterConfig:{type:"MinigraphBubbleAdapter",uri:`${f}.bubbles.bed.gz`,baseUri:l.baseUri,assemblyNameToPanSN:l.assemblyNameToPanSN},regions:[b]});L()&&(e.indexBubbles=T.map(R=>({refName:b.refName,start:R.get("start"),end:R.get("end"),segmentCount:R.get("segmentCount"),pathCount:R.get("pathCount")??0,inversion:R.get("inversion"),shortestAlleleLength:R.get("shortestAlleleLength"),longestAlleleLength:R.get("longestAlleleLength"),segments:R.get("segments"),shortestAllele:void 0,longestAllele:void 0})))}catch(T){console.warn("[GraphGenomeView] no bubble index for this graph",T)}}function*u(l,b,L){let f=(0,ee.getSession)(e),T=l?f.tracks.find(R=>R.trackId===l):void 0;if(T)try{return yield f.rpcManager.call((0,ee.getRpcSessionId)(e),"CoreGetFeatures",{adapterConfig:(0,es.readConfObject)(T,"adapter"),regions:[b]})}catch(R){console.warn(`[GraphGenomeView] no ${L} for this graph`,R);return}}function*y(l,b){let L=yield*u(e.geneTrack?.trackId,l,"genes");L&&b()&&(e.geneTrackFeatures=L)}function*S(l,b){let L=yield*u(e.repeatTrack?.trackId,l,"repeats");L&&b()&&(e.repeatArrays=Vi(L))}function*k(l,b,L){let{isLive:f,signal:T}=g();e.isLoading=!0,e.error=void 0;try{let R=typeof b=="string"?b:yield b(T);f()&&(yield*d(R,l,L))}catch(R){f()&&(console.error("[GraphGenomeView.loadWholeGFA]",R),e.error=R)}finally{f()&&e.finishLoading()}return f()}function h(){t?.abort(),t=void 0,m++,a++}function x(){h(),e.graph=void 0,e.graphRegion=void 0,e.loadedReferencePath=void 0,e.layoutResult=void 0,e.indexBubbles=void 0,e.geneTrackFeatures=void 0,e.walkGeneFeatures=void 0,i.clear(),e.repeatArrays=void 0,e.readsShown=void 0,e.popStack=[],e.error=void 0,e.isLoading=!1,e.loadCanceled=!1,e.statusMessage="",e.clearInteractionState(),e.clearPerfMetrics()}return{clearGraph(){x()},cancelLoad(){e.canCancelLoad&&(x(),e.loadCanceled=!0)},stopLoad(){h(),e.isLoading=!1,e.statusMessage="",e.loadCanceled=!0},beforeDestroy(){h()},loadGFA:(0,q.flow)(function*(l,b="Imported GFA"){yield*k(b,l)}),loadGFAFromLocation:(0,q.flow)(function*(l,b){e.setStatusMessage("Fetching GFA");let L=yield*k("uri"in l?l.uri.split("/").pop()??"GFA":"GFA",f=>(0,ts.openLocation)(l).readFile({encoding:"utf8",signal:f}),b);b&&L&&e.graph&&(yield*S(b,()=>e.graphRegion===b))}),cutSubgraph:(0,q.flow)(function*(l,b,L={}){let{isLive:f,signal:T}=g();e.isLoading=!0,e.error=void 0,e.setStatusMessage("Fetching subgraph");try{let R=performance.now(),N=yield(0,ee.getSession)(e).rpcManager.call((0,ee.getRpcSessionId)(e),"GetSubgraph",{adapterConfig:l,region:b,opts:L,signal:T});if(!f())return;if(e.setFetchMs(performance.now()-R),!N)throw new Error("Adapter returned no GFA \u2014 region may be outside indexed data or the adapter does not implement getSubgraph");if(yield*d(N,Ye(b),b,!0,wa(l)?G=>(0,ee.getSession)(e).rpcManager.call((0,ee.getRpcSessionId)(e),"GetGraphReads",{adapterConfig:l,nodeNames:G.nodes.map(I=>I.name),signal:T}):void 0),!f())return;e.setStatusMessage("Reading annotations"),yield Promise.all([L.tier==="coarse"?void 0:(0,q.flow)(p)(l,b,f),(0,q.flow)(y)(b,f),(0,q.flow)(S)(b,f)])}catch(R){f()&&(console.error("[GraphGenomeView.cutSubgraph]",R),e.error=R)}finally{f()&&e.finishLoading()}}),reloadRepeats:(0,q.flow)(function*(){let l=e.graphRegion,b=e.repeatTrack?.trackId;l&&(yield*S(l,()=>e.graphRegion===l&&e.repeatTrack?.trackId===b))}),loadWalkGenes:(0,q.flow)(function*(){let l=e.walkGeneReads?.reads??[],b=JSON.stringify(l),L=e.graph,f=new Map;yield Promise.all(l.map(({row:T,trackId:R,region:N})=>(0,q.flow)(function*(){let G=`${R} ${N.refName}:${N.start}-${N.end}`,I=i.get(G);if(!I){let W=yield*u(R,N,"haplotype genes");if(!W)return;I=Kt(W).map(B=>({...B,refName:N.refName})),i.set(G,I)}f.set(T,I)})())),(0,q.isAlive)(e)&&e.graph===L&&JSON.stringify(e.walkGeneReads?.reads??[])===b&&(e.walkGeneFeatures=l.length?f:void 0)}),reloadGenes:(0,q.flow)(function*(){i.clear();let l=e.graphRegion,b=e.geneTrack?.trackId;l&&(yield*y(l,()=>e.graphRegion===l&&e.geneTrack?.trackId===b))}),popBubble:(0,q.flow)(function*(l){let b=e.graph;if(!b)return;let L=Jn(b,It(l));if(L.nodes.length===0){(0,ee.getSession)(e).notify("None of the segments of this bubble are in the cut; widen the graph context to open it","info");return}let{isLive:f}=g();e.popStack=[...e.popStack,{graph:b,layoutMode:e.chosenLayoutMode,label:b.name,indexBubbles:e.indexBubbles}],e.indexBubbles=void 0;let T=`${Lo[Gt(l,e.repeatArrays).kind]} at ${l.refName}:${l.start.toLocaleString()}`;e.graph={...L,name:T},e.clearInteractionState(),e.viewportOwner="fit",e.isLoading=!0;try{(yield*s(e.graph))&&e.finishLoading()}catch(R){f()&&(e.error=R,e.finishLoading())}}),unpopBubble:(0,q.flow)(function*(){let l=e.poppedFrom;if(l){e.popStack=e.popStack.slice(0,-1),e.graph=l.graph,e.layoutMode=l.layoutMode,e.indexBubbles=l.indexBubbles,e.clearInteractionState(),e.viewportOwner="fit",e.isLoading=!0;try{(yield*s(l.graph))&&e.finishLoading()}catch(b){e.error=b,e.finishLoading()}}}),recomputeLayout:(0,q.flow)(function*(){let l=e.graph;if(l){e.isLoading=!0,e.setStatusMessage("Computing layout");try{(yield*s(l))&&e.finishLoading()}catch(b){console.error("[GraphGenomeView.recomputeLayout]",b),e.error=b,e.finishLoading()}}})}});function Ad(e){return Q(e)&&typeof e.get=="function"}function Nd(e){let t=Ad(e)?e.get("name"):Q(e)?e.name:void 0;return typeof t=="string"?t:void 0}function rs(e){let t;if(Q(e)&&Q(e.hoverPosition)){let{refName:n,coord:r,coord0:o,assemblyName:a}=e.hoverPosition;typeof n=="string"&&typeof r=="number"&&(t={refName:n,coord:typeof o=="number"?o:r-1,assemblyName:typeof a=="string"?a:void 0,featureName:Nd(e.hoverFeature)})}return t}function os(e,t){return(e.assemblyName===void 0||e.assemblyName===t.assemblyName)&&e.refName===t.refName&&e.coord>=t.start&&e.coord<t.end}function as({hover:e,nodes:t}){let n,r;for(let o of t)o.name===e.featureName?n=o.id:r===void 0&&D(o)&&e.coord>=o.stable.start&&e.coord<o.stable.start+o.length&&(r=o.id);return n??r??null}var Pd=/^(.+) HP(\d+)$/,Gd=/^(.+)\.(\d+)$/;function Id(e){let t=Pd.exec(e),n=Gd.exec(e);return[...t?[{sample:t[1],haplotype:String(Number(t[2])+1)}]:[],...n?[{sample:n[1],haplotype:n[2]}]:[],{sample:e,haplotype:void 0}]}function Cd(e){return K(e).name.split("#")[1]}function is(e,t){let n=t.map(r=>r.name);for(let{sample:r,haplotype:o}of Id(e)){let a=n.filter(i=>_r(K(i).name)===r&&(o===void 0||Cd(i)===o));if(a.length>0)return a}return[]}var cs=ns.actions(e=>({startRenderingBackend(t){if(!e.autorunsInstalled){(0,me.addDisposer)(e,(0,O.autorun)(()=>{e.fittedTransform&&(0,O.untracked)(()=>e.viewportOwner==="fit")&&e.zoomToFit()})),(0,me.addDisposer)(e,(0,O.reaction)(()=>{let r=e.facetGrid;return r?`${e.facet.field} ${e.facetPanels?.length} ${r.columns}`:""},()=>{e.refitView()})),(0,me.addDisposer)(e,(0,O.reaction)(()=>({graph:e.graph,reads:JSON.stringify(e.walkGeneReads?.reads??[])}),()=>{e.loadWalkGenes()},{fireImmediately:!0,equals:(r,o)=>r.graph===o.graph&&r.reads===o.reads})),(0,me.addDisposer)(e,(0,O.reaction)(()=>e.fitPadTop,()=>{e.viewportOwner==="host"&&e.zoomToFit()})),(0,me.addDisposer)(e,(0,O.autorun)(()=>{let r=rs((0,ss.getSession)(e).hovered);(0,O.untracked)(()=>{let o=e.graphRegion,a=e.graph,i=r&&o&&os(r,o)?r:void 0,s=i?.featureName&&a?.paths?is(i.featureName,a.paths):[];o&&a&&!e.pointerInPane&&e.setHoveredNode(i&&s.length===0?as({hover:i,nodes:a.nodes}):null),e.setHoveredRowWalks(s)})})),(0,me.addDisposer)(e,(0,O.reaction)(()=>`${e.scale}-${e.translateX}-${e.translateY}`,()=>{e.setHoveredNode(null),e.setHoveredBubble(null),e.setHoveredEdge(null)},{name:"GraphClearHoverOnViewportChange"}));let n=!0;(0,me.addDisposer)(e,(0,O.autorun)(()=>{let{scale:r}=e,o=tt(e);if(n){n=!1;return}let a=(0,O.untracked)(()=>e.builtViewport);a?.scale===r&&Wn(a.bounds,o)||e.scheduleViewportDirty()})),(0,me.addDisposer)(e,(0,O.autorun)(()=>{let r=e.currentRenderingBackend;ue(e.geometryVersion),r&&(e.applyHighlights(r),e.renderNow())}))}e.attachRenderingBackend(t,()=>({upload:n=>{if(n.resize(e.paneWidth,e.canvasHeight),e.layoutResult?.tubeMap)return ue(e.viewportDirty),n.uploadGeometry(Kn),e.setGeometryMetrics(0,0,{scale:(0,O.untracked)(()=>e.scale),bounds:(0,O.untracked)(()=>tt(e))}),!0;if(e.facetPanels)return ue(e.viewportDirty),n.uploadGeometry(Kn),e.setGeometryMetrics(0,0,{scale:(0,O.untracked)(()=>e.scale),bounds:(0,O.untracked)(()=>e.viewportToBuild())}),!0;let r=performance.now(),o=e.buildDrawing(e.walkLift,e.effectiveDrawPaths);return o?(n.uploadGeometry(o.batch),e.setGeometryMetrics(performance.now()-r,o.batch.nodeStrokes.length,{scale:(0,O.untracked)(()=>e.scale),bounds:o.viewportBounds}),!0):!1},render:n=>e.nodePositions?(e.paint(n),e.markPainted(),!0):!1,releaseTargets:n=>{n.releaseOffscreenTargets()}}))}})).actions(e=>({switchLayout(t){return e.setLayoutMode(t),e.recomputeLayout()},retryLoad(){},afterAttach(){e.isDefaultViewport||(e.viewportOwner="user")}}));var Qt=w(U(),1),Ed="FeatureTrack";function ds({session:e,assemblyName:t,first:n}){let r=[];for(let o of e.tracks){let a=(0,Qt.readConfObject)(o,"type"),i=(0,Qt.readConfObject)(o,"assemblyNames"),s=(0,Qt.readConfObject)(o,"trackId");a===Ed&&Array.isArray(i)&&i.includes(t)&&typeof s=="string"&&s!==n&&r.push(s)}return n?[n,...r]:r}var en=w(U(),1),ps=w(hc(),1),tn=w(re(),1);var Bd="SyntenyTrack",Fd="Synteny adapters";function $d(e){if((0,en.readConfObject)(e,"type")===Bd)return!0;let t=e.adapter?.type;if(typeof t!="string"||!(0,tn.isStateTreeNode)(e))return!1;let{pluginManager:n}=(0,tn.getEnv)(e);return!!n?.hasAdapterType(t)&&n.getAdapterType(t).adapterMetadata?.category===Fd}function us(e,t){let n=new Set(t),r=[];for(let o of e.tracks){let a=(0,en.readConfObject)(o,"assemblyNames"),i=(0,en.readConfObject)(o,"trackId");if($d(o)&&typeof i=="string"&&Array.isArray(a)){let s=a.filter(c=>typeof c=="string"&&n.has(ut(e,c))).length;s>=2&&r.push({trackId:i,name:(0,ps.getTrackName)(o,e),coverage:s})}}return r.sort((o,a)=>a.coverage-o.coverage)}function ms(e,t,n="image/svg+xml"){let r=URL.createObjectURL(new Blob([e],{type:n})),o=document.createElement("a");o.href=r,o.download=t,o.click(),setTimeout(()=>{URL.revokeObjectURL(r)},0)}var gs=cs.actions(e=>({showInLinearView(t){let n=(0,Te.getSession)(e),r=t.assembly===e.graphRegion?.assemblyName,o=Xi({session:n,location:t.location,assembly:t.assembly,connectedViewId:e.connectedViewId,tracks:ds({session:n,assemblyName:t.assembly,first:r?e.sourceTrackId:void 0})});r&&e.pairWithLinearView(o)},highlightInLinearView(t){zi({session:(0,Te.getSession)(e),location:t.location,assembly:t.assembly,connectedViewId:e.connectedViewId})},showSyntenyView(t){Yi({session:(0,Te.getSession)(e),contributors:e.launchableAssemblies,trackId:t,graphTrackId:e.sourceTrackId})}})).views(e=>({get syntenyLaunchTracks(){let t=e.launchableAssemblies.map(n=>n.sample);return t.length>=2?us((0,Te.getSession)(e),t):[]}})).views(e=>({graphMenuItems(){let t=e.walkChoices;return[{label:"Layout",subMenu:io.map(n=>({type:"radio",label:n.label,checked:e.chosenLayoutMode===n.value,disabled:e.graph?!n.available(e.graph):!1,onClick:()=>{e.switchLayout(n.value)}}))},{label:"Color",subMenu:co.map(n=>({type:"radio",label:n.label,checked:e.chosenColorScheme===n.value,onClick:()=>{e.setColorScheme(n.value)}}))},...t.length>0&&e.liftsWalks?[{label:"Walk",subMenu:[{label:"None",onClick:()=>{e.setWalkLayers([])}},...e.walkLayers.length>1&&e.modeDrawsNodes?[{label:"Side by side",subMenu:ti.map(({value:n,label:r})=>({type:"radio",label:r,checked:e.facet.field===n,onClick:()=>{e.setFacet(n)}}))}]:[],...e.facetPanels&&e.facet.field==="walk"&&!e.hostPlacesX?[{label:"Columns",subMenu:[void 0,...e.facetPanels.map((n,r)=>r+1)].map(n=>({type:"radio",label:n===void 0?"Auto":`${n}`,checked:e.facet.columns===n,onClick:()=>{e.setFacetColumns(n)}}))}]:[],...t.length>zn?[{label:"Choose walks...",onClick:()=>{(0,Te.getSession)(e).queueDialog(n=>[ei,{model:e,onClose:n}])}}]:[],...(t.length>zn?t.filter(n=>e.walkLayers.some(r=>r.walk===n.name)):t).map(n=>({type:"checkbox",label:n.label,checked:e.walkLayers.some(r=>r.walk===n.name),onClick:()=>{e.toggleWalk(n.name)}})),...e.drawnWalks.map(n=>({label:`Colour ${e.walkLabel(n.name)}`,subMenu:[{type:"subHeader",label:"Colour by"},...ho.map(r=>({type:"radio",label:r.label,checked:n.encoding.field===r.value,onClick:()=>{e.setWalkColor(n.name,{field:r.value})}})),{type:"subHeader",label:"Palette"},...fo.filter(r=>r.value!=="rainbow"||n.encoding.field==="reference").map(r=>({type:"radio",label:r.label,checked:n.encoding.scheme===r.value,onClick:()=>{e.setWalkColor(n.name,{scheme:r.value})}}))]}))]}]:[],...Ie.has(e.chosenLayoutMode)?[{label:"Fold variants",subMenu:ni.map(({bp:n,label:r})=>({type:"radio",label:r,checked:e.tubeMapFold===n,disabled:n>0&&e.graph?.reads!==void 0,onClick:()=>{e.setTubeMapFold(n),e.recomputeLayout()}}))}]:[],...e.chosenLayoutMode==="walkrows"&&e.repeatChoices.length>0?[{label:"Repeat",subMenu:[{type:"radio",label:"Whole window",checked:e.repeatKey==="",onClick:()=>{e.setRepeatKey("")}},...e.repeatChoices.map(({key:n,name:r,unit:o})=>({type:"radio",label:`${r} \xB7 ${o.toLocaleString()} bp unit`,checked:e.repeatKey===n,onClick:()=>{e.setRepeatKey(n)}}))]}]:[],...e.hostPlacesX?[]:[{label:"Zoom in",onClick:()=>{e.zoom(1.5,e.viewBox.width/2,e.viewBox.height/2)}},{label:"Zoom out",onClick:()=>{e.zoom(1/1.5,e.viewBox.width/2,e.viewBox.height/2)}},{label:"Zoom to fit",onClick:()=>{e.zoomToFit()}}],{type:"checkbox",label:"Mark bubbles",checked:e.showBubbles,onClick:()=>{e.setShowBubbles(!e.showBubbles)}},{type:"checkbox",label:"Show deletion edges",checked:e.showDeletionEdges,onClick:()=>{e.setShowDeletionEdges(!e.showDeletionEdges)}},{type:"checkbox",label:"Genes on the backbone",checked:e.showGenes,onClick:()=>{e.setShowGenes(!e.showGenes)}},...!e.host&&e.modeDrawsNodes&&(e.graph?.paths?.length??0)>1?[{type:"checkbox",label:"Walk rows under the graph",checked:e.walkStrip,onClick:()=>{e.setWalkStrip(!e.walkStrip)}}]:[],...e.referenceStripApplies?[{type:"checkbox",label:"Reference strip at bp",checked:e.showReferenceStrip,onClick:()=>{e.setShowReferenceStrip(!e.showReferenceStrip)}}]:[],{label:"Export SVG",disabled:e.figureUnavailable!==void 0,disabledHelpText:e.figureUnavailable,onClick:()=>{let n=e.figure();n&&ms(n,`${(e.graph?.name??"graph").replaceAll(/[^\w.-]+/g,"_")}.svg`)}},{label:"Copy figure spec",disabled:e.figureSpecUnavailable!==void 0,disabledHelpText:e.figureSpecUnavailable,onClick:()=>{let n=e.figureSpec(),r=(0,Te.getSession)(e);navigator.clipboard.writeText(`${JSON.stringify(n,null,2)}
|
|
6
|
+
`).then(()=>{r.notify("Figure spec copied. Save it as spec.json and run: npx -p @jbrowse/bandage-core bandage-figure spec.json -o figure.svg","info")}).catch(o=>{r.notify(`Could not copy the figure spec: ${String(o)}`)})}}]},launchMenuItems(){let t=[];for(let n of sa({contributors:e.launchableAssemblies,syntenyTracks:e.syntenyLaunchTracks,onShowLinear:r=>{e.showInLinearView(r)},onShowSynteny:r=>{e.showSyntenyView(r)}}))(0,ls.pushLaunchViewMenuItem)(t,n);return t}}));function nn(){return gs}var kr=w(U(),1);function hs(e){return Array.isArray(e)&&e.every(t=>typeof t=="string")}function fs(e){let t=(0,kr.readConfObject)(e,"assemblyNames"),n=hs(t)?t.slice(1):[];return n.length>0?n:void 0}function rn(e){let t=(0,kr.readConfObject)(e,"assemblyNames");return hs(t)?t[0]:void 0}function on(e,t){return e===void 0||e===t?void 0:`The graph is cut on its reference, ${e}: open it from a view of ${e}`}function Dd(e){return("uri"in e?e.uri.split(/[?#]/)[0]:"localPath"in e?e.localPath:"name"in e?e.name:"").split(/[\\/]/).at(-1)??""}function xr(){return X.types.compose("GraphGenomeView",bs.BaseViewModel,nn(),X.types.model({type:X.types.literal("GraphGenomeView"),gfaLocation:X.types.maybe(X.types.frozen()),loadedRegion:X.types.maybe(X.types.frozen()),loadedTrackId:X.types.optional(X.types.string,""),subgraphContext:X.types.optional(X.types.number,1),subgraphHaplotypes:X.types.maybe(X.types.frozen()),maxRegionBp:X.types.optional(X.types.number,et)})).views(e=>({get rpcSessionId(){return e.id},get paneWidth(){return e.width},get cutHaplotypes(){return e.subgraphHaplotypes},get sourceGfaLocation(){return e.gfaLocation},get sourceTrack(){return e.loadedTrackId?(0,ys.getSession)(e).tracks.find(t=>t.trackId===e.loadedTrackId):void 0},get canRetryLoad(){return e.gfaLocation!==void 0||e.loadedTrackId!==""&&e.loadedRegion!==void 0}})).views(e=>({get hasPendingSource(){return e.canRetryLoad&&!e.graph&&!e.loadCanceled},menuItems(){return e.launchMenuItems()}})).actions(e=>{let t=e.clearGraph;return{clearGraph(){t(),e.gfaLocation=void 0,e.loadedRegion=void 0,e.loadedTrackId=""},load(){let n=e.loadedRegion;if(e.gfaLocation)return e.displayName||e.setDisplayName(Dd(e.gfaLocation)),e.loadGFAFromLocation(e.gfaLocation,n);if(!e.loadedTrackId||!n)return;let r=e.sourceTrack,o=n.end-n.start,a=r?on(rn(r),n.assemblyName):void 0;if(!r)e.setError(new Error(`The track this graph was cut from, "${e.loadedTrackId}", is not in this session`));else if(a)e.setError(new Error(a));else if(o>e.maxRegionBp)e.setError(new Error(`Region too large (${Se(o)}) \u2014 zoom in to view graph (max ${Se(e.maxRegionBp)})`));else return e.cutSubgraph(he(e,r),n,{hops:e.subgraphContext,haplotypes:e.subgraphHaplotypes,...e.cutsWholeWalks?{snarls:"overlapping"}:{}})}}}).actions(e=>({retryLoad(){e.load()},switchLayout(t){let n=e.cutsWholeWalks;return e.setLayoutMode(t),e.loadedTrackId&&e.cutsWholeWalks!==n?e.load():e.recomputeLayout()},afterAttach(){e.graph||e.load(),(0,X.addDisposer)(e,(0,ws.reaction)(()=>e.walkStrip,()=>{e.loadedTrackId&&!_(e.chosenLayoutMode).wholeWalks&&e.load()}))}}))}var Vd=(0,Ss.defineLaunchKeys)()({});function Sr(e){e.addViewType(()=>new xs.default({name:"GraphGenomeView",displayName:"Graph genome view",stateModel:xr(),launchKeys:Vd,ReactComponent:(0,ks.lazy)(()=>import("./chunks/GraphGenomeView-PTYYXWL7.js"))}))}var Rs=w(U(),1),Ee=w(ge(),1),Rr=["MultiWaySyntenyDisplay","LinearSyntenyDisplay","DotplotDisplay","ChordSyntenyDisplay"];function _d(e){let t=e.getElementTypesInGroup("display"),n=o=>t.find(a=>a.name===o),r=o=>o&&Object.assign(Object.create(o),{adapterCapabilities:["headerLanes"]});return[n("LinearGraphDisplay"),n("LinearBasicDisplay"),...Rr.map(o=>r(n(o)))].filter(o=>o!==void 0)}function Mr(e){e.addTrackType(()=>{let t=(0,Rs.ConfigurationSchema)("GraphTrack",{},{baseConfiguration:(0,Ee.createBaseTrackConfig)(e),explicitIdentifier:"trackId"}),n=new Ee.TrackType({name:"GraphTrack",displayName:"Pangenome graph track",configSchema:t,stateModel:(0,Ee.createBaseTrackModel)(e,"GraphTrack",t)});for(let r of _d(e))n.addDisplayType(r);return n})}function Lr(e){e.addToExtensionPoint("LaunchView-GraphGenomeView",t=>{let{session:n,...r}=t;return n.addView("GraphGenomeView",r),t})}var Ws=w($e(),1),Hs=w(Ls(),1);var As=w(U(),1),Ns=w(vs(),1),Tr=w(re(),1);function Ps(){return(0,As.ConfigurationSchema)("LinearGraphDisplay",{layoutMode:{type:"stringEnum",model:Tr.types.enumeration("LayoutMode",xt),defaultValue:"auto"},colorScheme:{type:"stringEnum",model:Tr.types.enumeration("ColorScheme",St),defaultValue:"auto"},...(0,Ns.trackHeightConfigSchemaFields)({defaultHeight:300,height:"the height of the track the graph is drawn in"})},{explicitlyTyped:!0,explicitIdentifier:"displayId"})}var $s=w($e(),1);var gt=w(U(),1),Ds=w(ge(),1),Vs=w(qr(),1),vr=w(ae(),1),_s=w(Is(),1),C=w(re(),1),an=w(Es(),1);var lt=w(bt(),1);function Bs(e){return e instanceof Error&&(e.name==="NodeLimitError"||e.regionTooLarge===!0||/reads more than nodeLimit|^Subgraph size limit of \d+ nodes exceeded/.test(e.message))}function Fs(e,t){if(e?.refName!==t.refName||e.assemblyName!==t.assemblyName)return!1;let n=e.end-e.start;return t.end-t.start>=n&&t.end>e.start-n&&t.start<e.end+n}var Od=(0,$s.lazy)(()=>import("./chunks/GraphTrackSettingsDialog-DCV2WZXB.js"));function Os(e){return C.types.compose("LinearGraphDisplay",Ds.BaseDisplay,(0,_s.default)(),nn(),C.types.model({type:C.types.literal("LinearGraphDisplay"),configuration:(0,gt.ConfigurationReference)(e),pane:C.types.maybe(C.types.frozen()),overviewRowsChoice:C.types.maybe(C.types.frozen()),overviewRowOrder:C.types.maybe(C.types.frozen()),cutRegion:C.types.maybe(C.types.frozen()),coarseCut:C.types.optional(C.types.boolean,!1),maxRegionBp:C.types.optional(C.types.number,et),subgraphContext:C.types.optional(C.types.number,1),subgraphHaplotypes:C.types.maybe(C.types.frozen())})).preProcessSnapshot(t=>{let{pane:n,overviewRowsChoice:r,overviewRowOrder:o,...a}=t;if(!n)return a;let{type:i,...s}=n;return{...s,...a}}).volatile(()=>({recuts:0,settledWindow:void 0,dense:void 0})).views(t=>({get adapterConfig(){return he(t,t.parentTrack.configuration)},get defaultLayoutMode(){return(0,gt.getConf)(t,"layoutMode")},get defaultColorScheme(){return(0,gt.getConf)(t,"colorScheme")},get drawsGenomicCoordinates(){return t.layoutResult===void 0||t.hostPlacesX},get canvasHeight(){return t.height},get canRetryLoad(){return t.cutRegion!==void 0},get cutHaplotypes(){return this.chosenHaplotypes},get chosenHaplotypes(){return t.subgraphHaplotypes??fs(t.parentTrack.configuration)},get coarseAboveBpPerPx(){let r=t.adapterConfig.coarse?.aboveBpPerPx;return typeof r=="number"?r:void 0}})).views(t=>({tierAt(n){let r=t.coarseAboveBpPerPx;return r!==void 0&&n>r?"coarse":"fine"},capFor(n){return n==="coarse"?1/0:t.maxRegionBp},get cutTier(){return t.coarseCut&&t.coarseAboveBpPerPx!==void 0?"coarse":"fine"}})).views(t=>({get settledCapBp(){let n=t.settledWindow;return n?t.capFor(t.tierAt(n.bpPerPx)):1/0}})).views(t=>({get regionTooLarge(){let n=t.settledWindow;return n!==void 0&&n.end-n.start>t.settledCapBp},get regionTooLargeReason(){let n=t.settledWindow;return n?`Region too large for a graph cut (${Se(n.end-n.start)}, max ${Se(t.settledCapBp)})`:""},get zoomCanReleaseGate(){return!0},get fetchCanceled(){return t.loadCanceled}})).views(t=>({get displayPhase(){return(0,an.computeDisplayStatusPhase)({regionTooLarge:t.regionTooLarge,error:t.error??t.renderError},()=>(0,an.computeActivityPhase)({isMinimized:t.isMinimized,fetchInert:!1,viewportEmpty:t.host?.initialized===!0&&t.host.hasVisibleContent===!1,isLoading:t.isLoading||!t.hasGraph,fetchCanceled:t.loadCanceled,awaitingDependentData:!1,rendersCanvas:!0,canvasDrawn:t.painted&&t.geometryPainted},()=>!0,()=>t.host?.effectiveBodyMounted??!0))}})).actions(t=>({setSubgraphContext(n){t.subgraphContext=n},setSubgraphHaplotypes(n){t.subgraphHaplotypes=n,t.dense=void 0},setDense(n){t.dense=n},setMaxRegionBp(n){t.maxRegionBp=n},cut(){let n=t.cutRegion;if(!n)return;let r=on(rn(t.parentTrack.configuration),n.assemblyName);if(r){t.clearGraph(),t.setError(new Error(r));return}let o=t.cutTier==="coarse";return t.cutSubgraph(t.adapterConfig,n,{hops:o?0:t.subgraphContext,haplotypes:t.chosenHaplotypes,tier:o?"coarse":void 0,..._(t.chosenLayoutMode).wholeWalks?{snarls:"overlapping"}:{}})}})).actions(t=>({recutAt(n){let r=t.tierAt(n.bpPerPx);return t.coarseCut=r==="coarse",t.cutRegion=ar(n,t.capFor(r),_(t.chosenLayoutMode).cutMargins),t.recuts++,t.cut()}})).actions(t=>({settleOn(n){t.settledWindow=n;let r=_(t.chosenLayoutMode).cutMargins;return t.regionTooLarge||Fs(t.dense,n)||!t.loadCanceled&&t.tierAt(n.bpPerPx)===t.cutTier&&Ni(t.cutRegion,n,r)?!1:(Promise.resolve(t.recutAt(n)).then(()=>{(0,C.isAlive)(t)&&Bs(t.error)&&this.refuseDenseCut(n)}),!0)},refuseDenseCut(n){t.setDense(n),t.cutRegion=void 0,this.settleOn(t.settledWindow??n)},switchLayout(n){let r=_(t.chosenLayoutMode);t.setLayoutMode(n);let o=_(n),a=t.host?zt(t.host):void 0;return a&&!t.regionTooLarge&&(o.cutMargins!==r.cutMargins||o.wholeWalks!==r.wholeWalks)?t.recutAt(a):t.recomputeLayout()},retryLoad(){t.cut()},reload(){t.cut()},cancelFetchByUser(){t.stopLoad()}})).actions(t=>({forceLoad(){let n=t.settledWindow;n&&(t.setMaxRegionBp(Math.ceil(n.end-n.start)),t.settleOn(n))},afterAttach(){t.cutRegion&&!t.graph&&t.cut(),(0,C.addDisposer)(t,(0,lt.reaction)(()=>t.hostPlacesX,n=>{n||t.releaseHost()},{name:"GraphHostPlacesX"})),(0,C.addDisposer)(t,(0,lt.reaction)(()=>t.hostFrame,n=>{n&&t.hostTransform(n.scale,n.translateX)},{equals:(n,r)=>n?.scale===r?.scale&&n?.translateX===r?.translateX,fireImmediately:!0,name:"GraphHostFrame"})),(0,C.addDisposer)(t,(0,lt.reaction)(()=>`${t.facet.field} ${t.facetPlacement?.count}`,()=>{let n=t.facetGridIn(t.paneCeiling)?.total??0;(t.facetGrid?.total??0)>t.height&&t.setHeight(Math.max(t.height,Math.ceil(n)))},{name:"GraphFacetHeight"})),(0,C.addDisposer)(t,(0,lt.reaction)(()=>t.host?.coarseDynamicBlocks,n=>{let{host:r}=t,o=n&&r?zt(r):void 0;o&&t.settleOn(o)},{fireImmediately:!0,name:"GraphHostSettle"}))}})).views(t=>({get graphViewSpec(){let n=t.host?zt(t.host):void 0,r=t.sourceTrackId;if(!n||!r||!t.hasGraph||t.coarseCut||t.regionTooLarge)return;let o=Math.floor(n.start),a=Math.ceil(n.end);return{loadedTrackId:r,loadedRegion:{refName:n.refName,assemblyName:n.assemblyName,start:o,end:a},subgraphContext:t.subgraphContext,subgraphHaplotypes:t.chosenHaplotypes,maxRegionBp:Math.max(t.maxRegionBp,a-o),layoutMode:t.chosenLayoutMode,colorScheme:t.chosenColorScheme,referencePath:t.referencePath,geneTrackId:t.geneTrackId,showGenes:t.showGenes,showBubbles:t.showBubbles,showDeletionEdges:t.showDeletionEdges,walkLayers:t.walkLayers,facet:(0,C.getSnapshot)(t.facet)}}})).actions(t=>({openGraphView(){let n=t.graphViewSpec;n&&(0,vr.getSession)(t).addView("GraphGenomeView",n)}})).views(t=>({trackMenuItems(){let n=t.launchMenuItems();return(0,Vs.pushLaunchViewMenuItem)(n,{label:"Graph genome view",icon:$t,disabled:!t.graphViewSpec,disabledHelpText:"Zoom in until the track cuts a graph",onClick:()=>{t.openGraphView()}}),[...t.graphMenuItems(),{label:"Settings",icon:ca,onClick:()=>{(0,vr.getSession)(t).queueDialog(r=>[Od,{model:t,open:!0,onClose:r}])}},...n]}}))}function Ar(e){e.addDisplayType(()=>{let t=Ps();return Object.assign(new Hs.default({name:"LinearGraphDisplay",displayName:"Graph",configSchema:t,stateModel:Os(t),trackType:["GraphTrack","FeatureTrack","SyntenyTrack"],viewType:"LinearGenomeView",ReactComponent:(0,Ws.lazy)(()=>import("./chunks/LinearGraphDisplay-GQPROPEZ.js"))}),{adapterCapabilities:["getSubgraph"]})})}var zs=w(Dt(),1);var Nr=w(U(),1),js=w(re(),1);function Pr(e){let{uri:t,baseUri:n,csi:r}=e;return typeof t=="string"?{...e,bubblesLocation:{uri:t,baseUri:n},index:{indexType:r?"CSI":"TBI",location:{uri:`${t}.${r?"csi":"tbi"}`,baseUri:n}}}:e}var Wd=(0,Nr.ConfigurationSchema)("MinigraphBubbleAdapter",{bubblesLocation:{type:"fileLocation",defaultValue:{uri:"/path/to/graph.bb.bed.gz",locationType:"UriLocation"}},index:(0,Nr.ConfigurationSchema)("MinigraphBubbleIndex",{indexType:{model:js.types.enumeration("IndexType",["TBI","CSI"]),type:"stringEnum",defaultValue:"TBI"},location:{type:"fileLocation",defaultValue:{uri:"/path/to/graph.bb.bed.gz.tbi",locationType:"UriLocation"}}}),assemblyNameToPanSN:{type:"frozen",defaultValue:{}}},{explicitlyTyped:!0,preProcessSnapshot:Pr}),Xs=Wd;function Gr(e){e.addAdapterType(()=>new zs.default({name:"MinigraphBubbleAdapter",displayName:"Minigraph bubble BED adapter",normalizeSnapshot:Pr,configSchema:Xs,adapterMetadata:{category:"Graph adapters"},getAdapterClass:()=>import("./chunks/MinigraphBubbleAdapter-JKMI26BD.js").then(t=>t.default)}))}var Js=w(Dt(),1);var cn=w(U(),1),Ks=w(re(),1);function Ys(e,t,n){return{indexType:n?"CSI":"TBI",location:{uri:`${e}.${n?"csi":"tbi"}`,baseUri:t}}}function Us(e){let{uri:t,baseUri:n,csi:r}=e;return typeof t=="string"?{...e,segmentsLocation:{uri:`${t}.segs.bed.gz`,baseUri:n},segmentsIndex:Ys(`${t}.segs.bed.gz`,n,r),linksLocation:{uri:`${t}.links.bed.gz`,baseUri:n},linksIndex:Ys(`${t}.links.bed.gz`,n,r)}:e}function Ir(e){let{coarse:t,baseUri:n}=e;return Us(typeof t=="object"&&t!==null?{...e,coarse:Us({baseUri:n,...t})}:e)}var sn=(e,t)=>(0,cn.ConfigurationSchema)(e,{indexType:{model:Ks.types.enumeration("IndexType",["TBI","CSI"]),type:"stringEnum",defaultValue:"TBI"},location:{type:"fileLocation",defaultValue:{uri:t,locationType:"UriLocation"}}}),Hd=(0,cn.ConfigurationSchema)("RgfaTabixCoarseTier",{aboveBpPerPx:{type:"maybeNumber"},segmentsLocation:{type:"fileLocation",defaultValue:{uri:"/path/to/graph.tier.segs.bed.gz",locationType:"UriLocation"}},segmentsIndex:sn("RgfaCoarseSegmentsIndex","/path/to/graph.tier.segs.bed.gz.tbi"),linksLocation:{type:"fileLocation",defaultValue:{uri:"/path/to/graph.tier.links.bed.gz",locationType:"UriLocation"}},linksIndex:sn("RgfaCoarseLinksIndex","/path/to/graph.tier.links.bed.gz.tbi")}),jd=(0,cn.ConfigurationSchema)("RgfaTabixAdapter",{segmentsLocation:{type:"fileLocation",defaultValue:{uri:"/path/to/graph.segs.bed.gz",locationType:"UriLocation"}},segmentsIndex:sn("RgfaSegmentsIndex","/path/to/graph.segs.bed.gz.tbi"),linksLocation:{type:"fileLocation",defaultValue:{uri:"/path/to/graph.links.bed.gz",locationType:"UriLocation"}},linksIndex:sn("RgfaLinksIndex","/path/to/graph.links.bed.gz.tbi"),assemblyNameToPanSN:{type:"frozen",defaultValue:{}},coarse:Hd},{explicitlyTyped:!0,preProcessSnapshot:Ir}),qs=jd;function Cr(e){e.addAdapterType(()=>new Js.default({name:"RgfaTabixAdapter",displayName:"Indexed rGFA adapter",normalizeSnapshot:Ir,configSchema:qs,adapterCapabilities:["getSubgraph"],adapterMetadata:{category:"Graph adapters"},getAdapterClass:()=>import("./chunks/RgfaTabixAdapter-CNC5EQ2T.js").then(t=>t.default)}))}var Xd=new Set(["RgfaTabixAdapter","GbzBaseSyntenyAdapter"]);function zd(e){return Yr(e).toLowerCase().endsWith(".gbz.db")}function Yd(e){let t=e.adapter;return t?.type==="GbzBaseSyntenyAdapter"&&!t.assemblyNames?.length&&Array.isArray(e.assemblyNames)&&e.assemblyNames.length>0?{...e,adapter:{...t,assemblyNames:e.assemblyNames}}:e}function Ud(e,t,n){if((!n||n==="GbzBaseSyntenyAdapter")&&zd(e))return{type:"GbzBaseSyntenyAdapter",gbzDbLocation:e,...t?{haplotypeIndexLocation:t}:{}};if((!n||n==="RgfaTabixAdapter")&&Ur(e))return Kr({choice:"RgfaTabixAdapter",loc:e,indexLoc:t,assembly:"",sample:""})}function Er(e){e.addToExtensionPoint("Core-preProcessTrackConfig",Yd),e.addToExtensionPoint("Core-guessAdapterForLocation",t=>(n,r,o)=>Ud(n,r,o)??t(n,r,o)),e.addToExtensionPoint("Core-guessTrackTypeForLocation",t=>(n,r)=>Xd.has(n)?"GraphTrack":t(n,r))}var tc=w(ae(),1),nc=w(bc(),1),Br=w(fc(),1),rc=w(yc(),1);function Zs(e){let t;if(Q(e)){let{refName:n,start:r,end:o,assemblyName:a}=e;typeof n=="string"&&typeof r=="number"&&typeof o=="number"&&(t={refName:n,start:r,end:o,assemblyName:typeof a=="string"?a:void 0})}return t}function Kd(e,t,n){let r=e.connectedViewId;return r===void 0||r===t||!n.has(r)}function Qs(e,t){return e.assemblyName===void 0||t===void 0||t.includes(e.assemblyName)}function qd(e){return(Array.isArray(e.tracks)?e.tracks:[]).flatMap(n=>Q(n)&&Array.isArray(n.displays)?n.displays.filter(r=>Q(r)&&r.type==="LinearGraphDisplay"):[])}function ec(e,t,n){let r=[],o=dt(e),a=new Set(o.map(i=>Q(i)?i.id:void 0));for(let i of o){if(Q(i)&&i.id===t)for(let s of qd(i)){let c=Zs(s.hoverHighlight);c&&Qs(c,n)&&r.push({key:typeof s.id=="string"?s.id:"graph-track",region:c})}if(Q(i)&&i.type==="GraphGenomeView"&&Kd(i,t,a)){let s=Zs(i.hoverHighlight);s&&Qs(s,n)&&r.push({key:typeof i.id=="string"?i.id:"graph",region:s})}}return r}var Be=w(Fe(),1),Jd=(0,rc.makeStyles)()(e=>({highlight:{height:"100%",position:"absolute",background:(0,nc.alpha)(e.palette.primary.main,.25),borderLeft:`2px solid ${e.palette.primary.main}`,borderRight:`2px solid ${e.palette.primary.main}`,pointerEvents:"none",zIndex:10}})),Zd=(0,Br.observer)(function({model:t,region:n}){let{classes:r}=Jd(),o=t.getHighlightCoords(n);return o?(0,Be.jsx)("div",{"data-testid":"graph-node-highlight",className:r.highlight,style:{left:o.left,width:o.width}}):null}),Qd=(0,Br.observer)(function({model:t}){let{views:n}=(0,tc.getSession)(t);return(0,Be.jsx)(Be.Fragment,{children:ec([...n],t.id,t.assemblyNames).map(({key:r,region:o})=>(0,Be.jsx)(Zd,{model:t,region:o},`graph-hover-${r}`))})}),oc=Qd;var ac=w(Fe(),1),ep="LinearGenomeView-TracksContainerComponent";function Fr(e){e.contributeToExtensionPoint(ep,({model:t})=>(0,ac.jsx)(oc,{model:t},"graphgenomeview-hover-highlight"))}var ic=w(ge(),1);function tp(e){return e.views(t=>({get adapterConfig(){return he(t,t.parentTrack.configuration)}}))}function $r(e){e.addToExtensionPoint("Core-extendPluggableElement",t=>(t instanceof ic.DisplayType&&Rr.includes(t.name)&&t.extendStateModel(tp),t))}var sc="GraphGenomeView";var cc="6.0.3";var Dr=class extends dc.default{constructor(){super(...arguments);this.name=sc;this.version=cc}install(n){Sr(n),Ar(n),Mr(n),Lr(n),Fr(n),Cr(n),Gr(n),Gn(n),Cn(n),Er(n),$r(n),n.addRpcMethod(()=>new qe(n)),n.addRpcMethod(()=>new Ke(n)),n.addRpcMethod(()=>new Ue(n))}configure(n){try{(0,pc.isAbstractMenuManager)(n.rootModel)&&n.rootModel.appendToSubMenu(["Add"],{label:"Graph genome view",icon:$t,onClick:r=>{r.addView("GraphGenomeView",{})}})}catch(r){console.warn("[GraphGenomeView] could not add the Add menu entry",r)}}};export{Dr as default};
|
|
7
7
|
//# sourceMappingURL=jbrowse-plugin-graphgenomeviewer.esm.js.map
|