jbrowse-plugin-graphgenomeviewer 3.0.4 → 3.1.0

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.
Files changed (58) hide show
  1. package/README.md +29 -2
  2. package/dist/chunks/GbzBaseSyntenyAdapter-MIOUYHOF.js +8 -0
  3. package/dist/chunks/GbzBaseSyntenyAdapter-MIOUYHOF.js.map +7 -0
  4. package/dist/chunks/GraphGenomeView-TM7WYDLH.js +14 -0
  5. package/dist/chunks/GraphGenomeView-TM7WYDLH.js.map +7 -0
  6. package/dist/chunks/MinigraphBubbleAdapter-A7SBF2XY.js +2 -0
  7. package/dist/chunks/MinigraphBubbleAdapter-A7SBF2XY.js.map +7 -0
  8. package/dist/chunks/RgfaTabixAdapter-7ZGKJJYW.js +3 -0
  9. package/dist/chunks/RgfaTabixAdapter-7ZGKJJYW.js.map +7 -0
  10. package/dist/chunks/{chunk-X3X74OGB.js → chunk-7T2HTRP3.js} +2 -2
  11. package/dist/chunks/{chunk-X3X74OGB.js.map → chunk-7T2HTRP3.js.map} +3 -3
  12. package/dist/chunks/{chunk-JCG7RLMB.js → chunk-HOM2Y6XS.js} +2 -2
  13. package/dist/chunks/chunk-HOM2Y6XS.js.map +7 -0
  14. package/dist/jbrowse-plugin-graphgenomeviewer.esm.js +2 -2
  15. package/dist/jbrowse-plugin-graphgenomeviewer.esm.js.map +4 -4
  16. package/package.json +21 -22
  17. package/src/GbzBaseSyntenyAdapter/GbzBaseSyntenyAdapter.test.ts +69 -0
  18. package/src/GbzBaseSyntenyAdapter/GbzBaseSyntenyAdapter.ts +13 -10
  19. package/src/GetSubgraph.ts +5 -1
  20. package/src/GraphGenomeView/components/FollowControl.test.tsx +69 -0
  21. package/src/GraphGenomeView/components/FollowControl.tsx +42 -0
  22. package/src/GraphGenomeView/components/GraphStats.tsx +1 -0
  23. package/src/GraphGenomeView/components/GraphToolbar.tsx +2 -0
  24. package/src/GraphGenomeView/follow.test.ts +624 -0
  25. package/src/GraphGenomeView/follow.ts +129 -0
  26. package/src/GraphGenomeView/layout/sampleRowLayout.test.ts +16 -0
  27. package/src/GraphGenomeView/layout/sampleRowLayout.ts +13 -4
  28. package/src/GraphGenomeView/layoutModes.ts +3 -1
  29. package/src/GraphGenomeView/model.ts +361 -55
  30. package/src/GraphGenomeView/types.ts +4 -0
  31. package/src/MinigraphBubbleAdapter/MinigraphBubbleAdapter.ts +1 -1
  32. package/src/RgfaTabixAdapter/RgfaTabixAdapter.test.ts +73 -0
  33. package/src/RgfaTabixAdapter/RgfaTabixAdapter.ts +48 -16
  34. package/src/RgfaTabixAdapter/configSchema.ts +70 -3
  35. package/src/RgfaTabixAdapter/test_data/rgfa_ecoli.tier1000.links.bed.gz +0 -0
  36. package/src/RgfaTabixAdapter/test_data/rgfa_ecoli.tier1000.links.bed.gz.tbi +0 -0
  37. package/src/RgfaTabixAdapter/test_data/rgfa_ecoli.tier1000.segs.bed.gz +0 -0
  38. package/src/RgfaTabixAdapter/test_data/rgfa_ecoli.tier1000.segs.bed.gz.tbi +0 -0
  39. package/src/launchSubgraph/index.ts +12 -6
  40. package/src/launchSubgraph/launchSubgraph.test.ts +89 -3
  41. package/src/launchSubgraph/launchSubgraphView.ts +14 -6
  42. package/src/launchSubgraph/linearViewMenuItems.ts +3 -0
  43. package/src/launchSubgraph/subgraphMenuItems.ts +7 -0
  44. package/src/launchSubgraph/testEnv.ts +2 -0
  45. package/src/panSNTabix.ts +6 -5
  46. package/src/synteny/ComparativeAdapterBase.ts +13 -10
  47. package/src/synteny/clipFeatureToRegion.test.ts +41 -1
  48. package/src/synteny/clipFeatureToRegion.ts +22 -5
  49. package/src/version.ts +1 -1
  50. package/dist/chunks/GbzBaseSyntenyAdapter-6UTRY4CV.js +0 -8
  51. package/dist/chunks/GbzBaseSyntenyAdapter-6UTRY4CV.js.map +0 -7
  52. package/dist/chunks/GraphGenomeView-UD5WCV3Q.js +0 -14
  53. package/dist/chunks/GraphGenomeView-UD5WCV3Q.js.map +0 -7
  54. package/dist/chunks/MinigraphBubbleAdapter-B75VQK7T.js +0 -2
  55. package/dist/chunks/MinigraphBubbleAdapter-B75VQK7T.js.map +0 -7
  56. package/dist/chunks/RgfaTabixAdapter-IT7I5RR3.js +0 -3
  57. package/dist/chunks/RgfaTabixAdapter-IT7I5RR3.js.map +0 -7
  58. package/dist/chunks/chunk-JCG7RLMB.js.map +0 -7
@@ -1,3 +1,3 @@
1
- import{a as z}from"./chunks/chunk-FCWXYIFC.js";import{a as kt}from"./chunks/chunk-D7XFR2IV.js";import{B as Vt,C as Bt,D as vt,E as ve,G as pe,H as Ft,I as Ct,J as Et,K as me,L as ge,M as Fe,N as Ht,P as $t,Q as _t,R as Dt,T as Ot,U as jt,V as Wt,W as zt,Y as Ce,Z as Ee,a as wt,ba as Yt,c as qr,ca as Xt,d as A,da as Ut,e as St,ea as le,f as Lt,fa as Kt,g as Rt,ga as qt,h as de,ha as Jt,i as Be,ia as he,ja as _,k as Mt,ka as Zt,l as Gt,m as Tt,ma as Jr,n as Q,p as Nt,q as ce,r as ue,x as It,z as Pt}from"./chunks/chunk-X3X74OGB.js";import{a as Z,b as Ur,c as Kr,d as Ve,e as xt}from"./chunks/chunk-XEJ47DLD.js";import{c as At}from"./chunks/chunk-ZNGDWZ6Z.js";import{a as Xr}from"./chunks/chunk-KWAXLUPQ.js";import{a as J}from"./chunks/chunk-J4OLMLS5.js";import"./chunks/chunk-F4C3BEPV.js";import{a as H,b as y}from"./chunks/chunk-FY3BTKY4.js";var en=H((pa,Qt)=>{Qt.exports=JBrowseExports["@jbrowse/core/Plugin"]});var fe=H((la,tn)=>{tn.exports=JBrowseExports["@jbrowse/core/pluggableElementTypes/AdapterType"]});var B=H((ha,nn)=>{nn.exports=JBrowseExports["@jbrowse/core/configuration"]});var cn=H((wa,dn)=>{dn.exports=JBrowseExports["@jbrowse/core/data_adapters/dataAdapterCache"]});var ye=H((ka,un)=>{un.exports=JBrowseExports["@jbrowse/core/pluggableElementTypes"]});var yn=H((Ga,fn)=>{fn.exports=JBrowseExports["@jbrowse/core/pluggableElementTypes/ViewType"]});var kn=H((Aa,wn)=>{wn.exports=JBrowseExports["@jbrowse/core/util/withLaunchInput"]});var Sn=H((Ta,xn)=>{xn.exports=JBrowseExports["@jbrowse/core/pluggableElementTypes/models"]});var Rn=H((Na,Ln)=>{Ln.exports=JBrowseExports["@jbrowse/render-core/RenderLifecycleMixin"]});var Gn=H((Ia,Mn)=>{Mn.exports=JBrowseExports.mobx});var zr=y(en(),1),Yr=y(J(),1);var be=y(Z(),1),ee=(0,wt.createSvgIcon)([(0,be.jsx)("circle",{cx:"7.2",cy:"14.4",r:"3.2"},"0"),(0,be.jsx)("circle",{cx:"14.8",cy:"18",r:"2"},"1"),(0,be.jsx)("circle",{cx:"15.2",cy:"8.8",r:"4.8"},"2")],"BubbleChart");var sn=y(fe(),1);var rn=y(B(),1),on=y(z(),1),Zr=(0,rn.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"}},subgraphSnarls:{type:"stringEnum",model:on.types.enumeration("SnarlOutput",["none","contained","overlapping"]),defaultValue:"contained"},referenceSample:{type:"string",defaultValue:""},assemblyNameToPanSN:{type:"frozen",defaultValue:{}},context:{type:"number",defaultValue:1e3,advanced:!0},nodeLimit:{type:"number",defaultValue:1e5,advanced:!0}},{explicitlyTyped:!0,preProcessSnapshot:e=>e.uri?{...e,gbzDbLocation:{uri:e.uri,baseUri:e.baseUri}}:e}),an=Zr;function He(e){e.addAdapterType(()=>new sn.default({name:"GbzBaseSyntenyAdapter",displayName:"gbz-base pangenome adapter",configSchema:an,adapterCapabilities:["getSubgraph","headerLanes","lanePairsOnAnchor"],adapterMetadata:{category:"Synteny adapters"},getAdapterClass:()=>import("./chunks/GbzBaseSyntenyAdapter-6UTRY4CV.js").then(t=>t.default)}))}var pn=y(cn(),1),mn=y(ye(),1);function Qr(e){return"getSubgraph"in e&&typeof e.getSubgraph=="function"}var te=class extends mn.RpcMethodTypeWithRenameRegion{constructor(){super(...arguments);this.name="GetSubgraph"}async execute(n){let{adapterConfig:r,region:o,sessionId:a,opts:i,signal:s}=n,{dataAdapter:d}=await(0,pn.getAdapter)(this.pluginManager,a,r);return Qr(d)?d.getSubgraph(o,{...i,signal:s}):(console.warn(`[GetSubgraph] ${d.constructor.name} does not implement getSubgraph`),"")}};var gn=y(xt(),1),ln=y(ye(),1),hn=y(z(),1),eo=(0,gn.lazy)(()=>import("./chunks/AddTrackWorkflow-Y3OBHM33.js"));function $e(e){e.addAddTrackWorkflowType(()=>new ln.AddTrackWorkflowType({name:"Pangenome graph track",displayName:"Add pangenome graph track",ReactComponent:eo,stateModel:hn.types.model({})}))}var bn=y(ye(),1);var _e;function De(){return _e??=import("./chunks/bandage-layout-FIOZ7B3E.js").then(e=>e.default()).catch(e=>{throw _e=void 0,e}),_e}var ne=class extends bn.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 De();a?.("Computing layout");let s=performance.now(),d=i.computeLayout(r,o),g=performance.now()-s;return{result:d,duration:g}}};var kr=y(xt(),1),xr=y(yn(),1),Sr=y(kn(),1);var j=y(B(),1),hr=y(Sn(),1),br=y(Ve(),1),G=y(J(),1),fr=y(Xr(),1),p=y(z(),1),yr=y(Rn(),1),wr=y(qr(),1),N=y(Gn(),1);var to=.9,Oe=2,no=1e3;function An(e,t,n,r=o=>o){let o=new Map(e.nodes.map(i=>[i.name,i])),a=[];for(let i of t){let s=[],d,g=[],w=[];for(let b of ce(i)){let f=o.get(b),h=f&&n[f.id];if(!(!f||!h?.length)){if(A(f)&&(f.stable.start<i.start||f.stable.start>=i.end)){w.push(h[Math.floor(h.length/2)]);continue}g.push(f.id),s.push(ue(h.length===1?[h[0],h[0]]:h));for(let k of h)(!d||k.y<d.y)&&(d=k)}}if(!d)continue;let R=w.length?{x:w.reduce((b,f)=>b+f.x,0)/w.length,y:w.reduce((b,f)=>b+f.y,0)/w.length}:d,m=new Map;for(let b of i.routes??[])for(let f of new Set(b.steps))m.set(f,(m.get(f)??0)+1);let u=[];for(let b of i.routes??[]){if(i.longestAlleleLength<no)break;if(b.steps.length===0)continue;let f=Math.min(...b.steps.map(c=>m.get(c))),h,k=-1;for(let c of b.steps)if(m.get(c)===f)for(let l of n[c]??[]){let x=Math.hypot(l.x-R.x,l.y-R.y);x>k&&(k=x,h=l)}h&&u.push({route:b,at:h,text:ro(b,r)})}a.push({bubble:i,...Q(i),path:s.join(""),top:d,members:g.length,nodeIds:g,whole:g.length>=to*e.nodes.length,routes:u})}return a}function ro(e,t){let n=[...new Set(e.walks.map(t))].sort(),r=n.slice(0,Oe).join(", "),o=n.length>Oe?` +${n.length-Oe}`:"";return`${r}${o} \xB7 ${Tt(e.bp)}`}function Tn(e){if(!e.nodes.some(A))return[];let t=new Map(e.nodes.map(m=>[m.id,m])),n=It(e),r=new Map(n.map((m,u)=>[m,u])),o=new Int32Array(n.length+1),a=new Map,i=new Set;for(let m of e.edges){let u=r.get(m.from),b=r.get(m.to);if(u===void 0||b===void 0||u===b)continue;i.add(`${m.from}>${m.to}`).add(`${m.to}>${m.from}`);let[f,h]=u<b?[u,b]:[b,u];o[f+1]++,o[h]--;let[k,c]=u<b?[m.from,m.to]:[m.to,m.from];(a.get(k)??a.set(k,new Set).get(k)).add(c)}for(let m=1;m<o.length;m++)o[m]+=o[m-1];let s=e.nodes.filter(A).sort((m,u)=>m.stable.start-u.stable.start),d=new Set([s[0].id,s.at(-1).id]),g=s.map(m=>[m,r.get(m.id)]).filter(([m,u])=>d.has(m.id)||o[u]===0).sort(([m,u],[b,f])=>u-f||m.stable.start-b.stable.start),w=e.paths?.map(m=>{let u=new Map;return m.nodeIds.forEach((b,f)=>{u.has(b)||u.set(b,f)}),u}),R=[];for(let m=0;m+1<g.length;m++){let[u,b]=g[m],[f,h]=g[m+1],k=n.slice(b+1,h);if(k.length===0)continue;let c=new Map([[u.id,{min:0,max:0,n:1}]]);for(let P of[u.id,...k]){let V=c.get(P);if(V)for(let E of a.get(P)??[]){if(r.get(E)>h)continue;let yt=E===f.id?0:t.get(E).length,Pe=c.get(E);c.set(E,{min:Math.min(Pe?.min??1/0,V.min+yt),max:Math.max(Pe?.max??-1/0,V.max+yt),n:Math.min(At,V.n+(Pe?.n??0))})}}let l=w&&oo(e,t,w,u.id,f.id),x=l?.n?l:void 0,S=x??c.get(f.id)??{min:0,max:0,n:0},M=l!==void 0&&l.left>0,L=u.stable.start+u.length,T=f.stable.start,I=[u.id,...k.filter(P=>A(t.get(P))),f.id],C=I.some((P,V)=>V>0&&!i.has(`${I[V-1]}>${P}`)),K=C||M,$=C&&!x;R.push({refName:u.stable.refName,start:L,end:T,segmentCount:k.length+2,pathCount:S.n,inversion:!1,shortestAlleleLength:$?T-L:S.min,longestAlleleLength:$?T-L:S.max,segments:[u,...k.map(P=>t.get(P)),f].map(P=>P.name).join(","),shortestAllele:void 0,longestAllele:void 0,partial:K,routes:x?.routes})}return R}function oo(e,t,n,r,o){let a=new Map,i=1/0,s=-1/0,d=0;return e.paths.forEach((g,w)=>{let R=n[w].get(r),m=n[w].get(o);if(R===void 0||m===void 0){(R!==void 0||m!==void 0)&&d++;return}let u=g.nodeIds.slice(Math.min(R,m)+1,Math.max(R,m));m<R&&u.reverse();let b=0;for(let k of u)b+=t.get(k)?.length??0;let f=u.join(","),h=a.get(f)??{steps:u,bp:b,walks:[]};h.walks.push(g.name),a.set(f,h),i=Math.min(i,b),s=Math.max(s,b)}),a.size||d?{min:i,max:s,n:a.size,left:d,routes:[...a.values()]}:void 0}function Nn(e,t){let n=new Set(t),r=e.nodes.filter(i=>n.has(i.name)),o=new Set(r.map(i=>i.id)),a=e.paths?.map(i=>({...i,nodeIds:i.nodeIds.filter(s=>o.has(s))})).filter(i=>i.nodeIds.length>0);return{name:e.name,nodes:r,edges:e.edges.filter(i=>o.has(i.from)&&o.has(i.to)),...a?.length?{paths:a}:{},anchorPaths:e.anchorPaths,pathVisits:e.pathVisits,anchoredBy:e.anchoredBy,referencePath:e.referencePath}}var je=new Set(["Gff3TabixAdapter","Gff3Adapter","GtfTabixAdapter","GtfAdapter","BigBedAdapter","NCListAdapter"]),ao=/gene|refseq|gencode|ensembl|annotation/i;function In(e,t){if(t)return e.find(r=>r.trackId===t);let n=e.filter(r=>je.has(r.adapterType));return n.find(r=>ao.test(`${r.trackId} ${r.name??""}`))??n[0]}function v(e,t){return typeof e.get=="function"?e.get(t):e[t]}function Pn(e,t){v(e,"type")==="exon"&&t.push({start:v(e,"start"),end:v(e,"end")});let r=v(e,"subfeatures");for(let o of r??[])Pn(o,t)}function io(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 Vn(e){let t=[];for(let n of e){let r=v(n,"gene_name")??v(n,"name")??v(n,"id"),o=v(n,"start"),a=v(n,"end");if(!r||!(a>o))continue;let i=[];Pn(n,i),t.push({name:r,refName:v(n,"refName"),start:o,end:a,strand:v(n,"strand")??0,exons:i.length?io(i):[{start:o,end:a}]})}return t}function Bn(e){return e.split("#").at(-1)}function vn(e,t,n){let r=new Map,o=new Map;for(let i of e.nodes)if(A(i)&&n[i.id]?.length){let{refName:s}=i.stable,d=o.get(s)??o.set(s,Bn(s)).get(s),g=r.get(d)??r.set(d,{nodes:[],reach:0}).get(d);g.nodes.push(i),g.reach=Math.max(g.reach,i.length)}for(let{nodes:i}of r.values())i.sort((s,d)=>s.stable.start-d.stable.start);let a=[];for(let i of t){let s=r.get(Bn(i.refName));if(!s)continue;let d=[],g,w=1/0,R=0,m=(i.start+i.end)/2,{nodes:u,reach:b}=s;for(let f=Lt(u,i.start-b);f<u.length&&u[f].stable.start<i.end;f++){let h=u[f],k=h.stable.start,c=k+h.length;if(c<=i.start)continue;let l=n[h.id];R+=Math.min(c,i.end)-Math.max(k,i.start);for(let M of i.exons){let L=Math.max(M.start,k),T=Math.min(M.end,c);if(T<=L)continue;let I=ve(l,(L-k)/h.length,(T-k)/h.length);I.length===1&&I.push({...I[0]}),d.push(ue(I))}let x=Math.min(Math.max(m,k),c),S=Math.abs(x-m);if(S<w){w=S;let[M]=ve(l,(x-k)/h.length,(x-k)/h.length);g=M}}g&&a.push({gene:i,exons:d.join(""),at:g,covered:R/(i.end-i.start)})}return a}function so(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 re(e){let t={};for(let n of e)so(n,t);return t}function We(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 Fn=62,co=60;function uo(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===Fn||i===co)&&(o(a),n=i===Fn?"+":"-",r=a+1)}return o(e.length),t}function ze(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(re(o))}else if(r.startsWith("S")){let[,o,...a]=r.split(" "),i,s,d,g=!1,w=a[0]??"*";/^\d+$/.test(w)?(i=+w,s=a[1]??"*",d=a.slice(2)):(g=!0,s=w,i=s==="*"?0:s.length,d=a.slice(1));let R=re(d);g&&"LN"in R&&(i=+R.LN),t.nodes.push({id:o,length:i,sequence:s,tags:R})}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:re(s)})}else if(r.startsWith("L")){let[,o,a,i,s,d,...g]=r.split(" ");o&&i&&s&&t.links.push({source:o,target:i,strand1:a,strand2:s,cigar:d??"*",tags:re(g)})}else if(r.startsWith("W")){let[,o,a,i,s,d,g,...w]=r.split(" ");o&&a&&i&&s&&d&&g&&t.walks.push({sample:o,haplotype:+a,contig:i,start:s==="*"?-1:+s,end:d==="*"?-1:+d,segments:uo(g),tags:re(w)})}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 po(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}}function mo(e){return[...e.paths.map(t=>({...pe(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:t.start===-1?0:t.start,steps:t.segments.map(n=>({id:n.id,strand:n.strand==="-"?"-":"+"}))}))]}function go(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 oe=e=>typeof e=="number"&&e>0?e:void 0;function lo({tags:e,length:t}){let n=oe(e.RC)??oe(e.FC)??oe(e.KC);return oe(e.dp)??oe(e.DP)??(n!==void 0&&t>0?n/t:void 0)}function ho(e,t,n){return{id:`${e.id}${t}`,name:e.id,length:e.length,depth:n,stable:We(e),samples:go(e)}}function Cn(e,t="Imported GFA"){let n=[],r=[],{canonical:o,traversals:a}=po(e),i=u=>`${u}${o.get(u)??"+"}`;for(let u of e.nodes){let b=lo(u)??Math.max(a.get(u.id)??1,1);n.push(ho(u,o.get(u.id)??"+",b))}for(let u of e.links)r.push({from:i(u.source),to:i(u.target),fromStrand:u.strand1==="-"?"-":"+",toStrand:u.strand2==="-"?"-":"+"});let s=[],d=new Map,g=(u,b)=>[u,b].sort().join("--");function w(u,b){for(let f=0;f<u.length-1;f++){let h=g(u[f],u[f+1]);d.has(h)||d.set(h,new Set),d.get(h).add(b)}}for(let u of e.paths){let b=u.path.split(",").map(f=>i(f.slice(0,-1)));s.push({name:u.name,nodeIds:b}),w(b,u.name)}for(let u of e.walks){let b=u.segments.map(h=>i(h.id)),f=`${u.sample}#${u.haplotype}#${u.contig}`;s.push({name:f,nodeIds:b,sample:u.sample,haplotype:u.haplotype,contig:u.contig}),w(b,f)}for(let u of r){let b=d.get(g(u.from,u.to));b&&b.size>0&&(u.pathIds=[...b])}let R=new Map(e.nodes.map(u=>[u.id,u.length])),m=e.paths.length>0||e.walks.length>0?Ft(mo(e),u=>R.get(u)??0):void 0;return{name:t,nodes:n,edges:r,paths:s.length>0?s:void 0,anchorPaths:m?.anchorPaths,pathVisits:m?.pathVisits,anchoredBy:n.some(u=>u.stable)?"tags":void 0}}var En=y(B(),1),Hn=y(z(),1),bo="rgb(60,65,72)";function $n({start:e,end:t}){let r=`min(300, max(0, ((get(feature,'start')+get(feature,'end'))/2 - ${e}) / ${t-e} * 300))`;return`jexl:get(feature,'rank')>0 ? '${bo}' : 'hsl(' + ${r} + ',70%,50%)'`}function fo(e){return typeof e=="object"&&e!==null&&"id"in e&&Array.isArray(e.tracks)}function _n(e,t,n){for(let r of e)if(fo(r)&&(t===void 0||r.id===t)){let a=r.tracks?.find(i=>i.configuration.trackId===n)?.displays[0];if(a)return a}}function Dn(e,t){let{color:n}=(0,Hn.getSnapshot)(e.configuration);(typeof n=="object"&&n!==null&&"value"in n?n.value:n)!==t&&(0,En.setConf)(e,"color",t)}function On(e,t){let n=e.nodes.filter(h=>A(h)&&(t[h.id]?.length??0)>0);if(n.length<2)return t;let r=n.map(h=>{let k=t[h.id],c=k[Math.floor(k.length/2)];return{x:c.x,y:c.y,r:h.stable.start+h.length/2,w:h.length}}),o=r.reduce((h,k)=>h+k.w,0),a=r.reduce((h,k)=>h+k.x*k.w,0)/o,i=r.reduce((h,k)=>h+k.y*k.w,0)/o,s=r.reduce((h,k)=>h+k.r*k.w,0)/o,d=0,g=0;for(let h of r)d+=h.w*(h.x-a)*(h.r-s),g+=h.w*(h.y-i)*(h.r-s);let w=-Math.atan2(g,d),R=Math.cos(w),m=Math.sin(w),u={};for(let[h,k]of Object.entries(t))u[h]=k.map(c=>{let l=c.x-a,x=c.y-i;return{x:a+R*l-m*x,y:i+m*l+R*x}});let b=0,f=0;for(let h of e.nodes)if(!A(h))for(let k of u[h.id]??[])k.y>i?b++:f++;if(f>b)for(let h of Object.values(u))for(let k of h)k.y=2*i-k.y;return u}var jn=30;function yo(e,t){let{opts:n}=t,r=new Map(t.nodes.map(m=>[m.id,de(n,m.length)])),o=m=>r.get(m)??n.minimumNodeLength,a=e.nodes.filter(A).sort((m,u)=>m.stable.start-u.stable.start),i=new Map,s=0;for(let m of a)i.set(m.id,{x:s,y:0}),s+=o(m.id)+n.edgeLength;let d=me(e),g=new Map(a.map(m=>[m.id,0])),w=a.map(m=>m.id);for(let m of w){let u=i.get(m),b=g.get(m)+1;for(let f of d.get(m)??[])g.has(f)||(g.set(f,b),i.set(f,{x:u.x+o(m)/2,y:jn*b}),w.push(f))}let R=0;for(let m of e.nodes)i.has(m.id)||i.set(m.id,{x:R++*s/e.nodes.length,y:jn*3});return i}function Wn(e,t){let n=yo(e,t);return t.nodes.map(r=>({...r,...n.get(r.id)}))}var Ye=new Set(["BedAdapter","BedTabixAdapter","BigBedAdapter","VcfAdapter","VcfTabixAdapter"]),wo=/repeat|tandem|\bstr\b|vntr|trf|trgt|vamos|expansion|microsat/i;function Yn(e,t){return t?e.find(r=>r.trackId===t):e.filter(r=>Ye.has(r.adapterType)).find(r=>wo.test(`${r.trackId} ${r.name??""}`))}function ke(e,t){return typeof e.get=="function"?e.get(t):e[t]}var Xn=/^\w+=[^;]*(;\w+=[^;]*)*$/;function ko(e){let t=ke(e,"name");if(!(typeof t!="string"||!Xn.test(t)))return Object.fromEntries(t.split(";").map(n=>{let r=n.indexOf("=");return[n.slice(0,r),n.slice(r+1)]}))}function we(e,t){let n=ke(e,t);return n!==void 0?n:ke(e,"INFO")?.[t]??ko(e)?.[t]}var Un=["RUS","MOTIFS","RU","motifs","motif","sequence","consensus"],xo=["RUL","period","PERIOD","consensusSize","unit","unitLength"],So=["TRID","REPID","VARID","ID","name","id"];function xe(e,t){for(let n of t){let r=we(e,n),o=String((Array.isArray(r)?r[0]:r)??"").split(",")[0].trim();if(o!==""&&o!==".")return o}}var Lo=/^[ACGTURYSWKMBDHVN]+$/i;function Ro(e){let t=Number(xe(e,xo));if(Number.isFinite(t)&&t>0)return Math.round(t);let n=xe(e,Un);return n&&Lo.test(n)?n.length:void 0}function zn(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 Mo(e){let t=ke(e,"samples"),n={};for(let[r,o]of Object.entries(t??{})){let a=zn(o.SD),i=zn(o.AL).flatMap((s,d)=>s!==void 0&&s>0?[a[d]===void 0?{bp:s}:{bp:s,spanningReads:a[d]}]:[]);i.length>0&&(n[r]=i)}return Object.keys(n).length>0?n:void 0}function Kn(e){let t=[];for(let n of e){let r=we(n,"start"),o=we(n,"end"),a=Ro(n);if(!(o>r)||a===void 0)continue;let i=we(n,"refName"),s=xe(n,Un),d=xe(n,So);t.push({key:`${i}:${r}-${o}`,name:(d&&!Xn.test(d)?d:void 0)??(s&&s.length<=12?`(${s})n`:`${i}:${(r+1).toLocaleString()}-${o.toLocaleString()}`),refName:i,start:r,end:o,unit:a,motif:s,calls:Mo(n)})}return t.sort((n,r)=>n.start-r.start)}function qn(e,t){let n=e.paths?.find(g=>g.name===t);if(!n)return;let r=new Map(e.nodes.map(g=>[g.id,g])),o=new Map;e.edges.forEach((g,w)=>{o.set(`${g.from}>${g.to}`,w)});let a=new Set(n.nodeIds),i=new Set;for(let g=1;g<n.nodeIds.length;g++){let w=n.nodeIds[g-1],R=n.nodeIds[g],m=o.get(`${w}>${R}`)??o.get(`${R}>${w}`);m!==void 0&&i.add(m)}let s=g=>g.reduce((w,R)=>w+(r.get(R)?.length??0),0),d=e.referencePath?e.paths.find(g=>pe(g.name).name===e.referencePath):void 0;return{name:t,nodeIds:a,edgeIndexes:i,steps:n.nodeIds.length,bp:s(n.nodeIds),referenceBp:d&&d!==n?s(d.nodeIds):void 0}}function Se(e){return typeof e=="object"&&e!==null}function Go(e){return Se(e)&&typeof e.get=="function"}function Ao(e){let t=Go(e)?e.get("name"):Se(e)?e.name:void 0;return typeof t=="string"?t:void 0}function Jn(e){let t;if(Se(e)&&Se(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:Ao(e.hoverFeature)})}return t}function Zn(e,t){return(e.assemblyName===void 0||e.assemblyName===t.assemblyName)&&e.refName===t.refName&&e.coord>=t.start&&e.coord<t.end}function Qn({hover:e,nodes:t}){let n,r;for(let o of t)o.name===e.featureName?n=o.id:r===void 0&&A(o)&&e.coord>=o.stable.start&&e.coord<o.stable.start+o.length&&(r=o.id);return n??r??null}var Xe=y(B(),1);function er(e){return typeof e=="object"&&e!==null}function To(e){return er(e)&&e.type==="LinearGenomeView"&&typeof e.id=="string"&&typeof e.navToLocString=="function"&&Array.isArray(e.assemblyNames)}function ae(e){return e.flatMap(t=>er(t)&&Array.isArray(t.views)?[t,...t.views]:[t])}function ie({views:e,connectedViewId:t,assemblyName:n}){let r=ae(e).filter(a=>To(a)).filter(a=>a.assemblyNames.includes(n));return r.find(a=>a.id===t)??(r.length===1?r[0]:void 0)}function nr(e,t,n){n.catch(r=>{console.error(`[GraphGenomeView] ${t}`,r),e.notifyError?.(`${t}: ${r}`,r)})}var No=1e3;function Ue(e,t=No){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 rr(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 or({session:e,location:t,assembly:n,connectedViewId:r,tracks:o=[]}){let a=ie({views:e.views,connectedViewId:r,assemblyName:n}),i;return a?(nr(e,`Could not show ${n} ${_(t)}`,Promise.resolve(a.navToLocString(he(t),n))),i=a.id):i=e.addView("LinearGenomeView",{displayName:`${n} \u2014 ${_(t)}`,init:{assembly:n,loc:he(t),tracks:o}}).id,i}function ar({session:e,location:t,assembly:n,connectedViewId:r}){let o=ie({views:e.views,connectedViewId:r,assemblyName:n});return o?.addToHighlights?.({refName:t.refName,start:t.start,end:t.end,assemblyName:n}),o!==void 0}function tr(e,t){if(t===void 0)return[];let n=e.tracks.find(o=>(0,Xe.readConfObject)(o,"trackId")===t),r=n?(0,Xe.readConfObject)(n,"assemblyNames"):[];return Array.isArray(r)?r.filter(o=>typeof o=="string"):[]}function ir({session:e,contributors:t,trackId:n,graphTrackId:r}){let o=tr(e,r),a=tr(e,n),i=t.filter(g=>a.includes(g.sample)),s=i.length>=2?i:t,d={init:{views:s.map(g=>({assembly:g.sample,loc:he(g),...r!==void 0&&o.includes(g.sample)?{tracks:[r]}:{}})),tracks:n?s.slice(1).map(()=>[n]):[],collapseEmptyRows:!0}};e.launchView?nr(e,"Could not open the synteny view",e.launchView("LinearSyntenyView",d)):e.addView("LinearSyntenyView",d)}var Le=y(B(),1),Io="FeatureTrack";function sr({session:e,assemblyName:t,first:n}){let r=[];for(let o of e.tracks){let a=(0,Le.readConfObject)(o,"type"),i=(0,Le.readConfObject)(o,"assemblyNames"),s=(0,Le.readConfObject)(o,"trackId");a===Io&&Array.isArray(i)&&i.includes(t)&&typeof s=="string"&&s!==n&&r.push(s)}return n?[n,...r]:r}var Re=y(B(),1),dr=y(kt(),1),Po="SyntenyTrack";function cr(e,t){let n=new Set(t),r=[];for(let o of e.tracks){let a=(0,Re.readConfObject)(o,"type"),i=(0,Re.readConfObject)(o,"assemblyNames"),s=(0,Re.readConfObject)(o,"trackId");if(a===Po&&typeof s=="string"&&Array.isArray(i)){let d=i.filter(g=>n.has(g)).length;d>=2&&r.push({trackId:s,name:(0,dr.getTrackName)(o,e),coverage:d})}}return r.sort((o,a)=>a.coverage-o.coverage)}var D=y(B(),1),ur=y(kt(),1);function Ke(e,t){return typeof t=="string"&&e.adapterTypes.has(t)&&e.getAdapterType(t).adapterCapabilities.includes("getSubgraph")}function pr(e){return Array.isArray(e)&&e.every(t=>typeof t=="string")}function Vo(e){return typeof e=="object"&&e!==null&&"laneSelection"in e&&"hiddenLanes"in e}function Bo(e){let t=(0,D.readConfObject)(e,"assemblyNames"),n=pr(t)?t.slice(1):[];return n.length>0?n:void 0}function qe(e){let t=(0,D.readConfObject)(e,"assemblyNames");return pr(t)?t[0]:void 0}function Me(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 vo(e,t,n){let r=n?.tracks.find(o=>(0,D.readConfObject)(o.configuration,"trackId")===t)?.displays.find(Vo);return r?r.laneSelection?.filter(o=>!r.hiddenLanes.includes(o)):Bo(e)}function Je(e,t,n,r){return{trackId:t,name:(0,ur.getTrackName)(e,n),referenceAssembly:qe(e),haplotypes:vo(e,t,r)}}function Ge(e,t,n,r){let o=[];for(let a of t.tracks){let i=(0,D.readConfObject)(a,"assemblyNames"),s=(0,D.readConfObject)(a,"adapter"),d=(0,D.readConfObject)(a,"trackId");Array.isArray(i)&&i.includes(n)&&typeof d=="string"&&typeof s=="object"&&s!==null&&"type"in s&&Ke(e,s.type)&&o.push(Je(a,d,t,r))}return o}var Co=600,Ze=160,Eo=340,mr=".segs.bed.gz";function Ho(e){if(typeof e.uri=="string")return e.uri;let n=e.segmentsLocation?.uri;return typeof n=="string"&&n.endsWith(mr)?n.slice(0,-mr.length):void 0}var O=40,gr=1.4,$o=1.6,_o=150,Do=1;function Ae(...e){}var Y=5e6;function W(e){return e>=1e6?`${+(e/1e6).toFixed(1)} Mb`:`${Math.round(e/1e3)} kb`}var Oo=2e4,jo=1e-6,Wo=100;function Qe(e){return Math.max(jo,Math.min(Wo,e))}function et(e,t){return{scaleX:e,scaleY:t?1:e,pixelRows:t}}function lr(e){return{minX:-e.translateX/e.scaleX,minY:-e.translateY/e.scaleY,maxX:(e.width-e.translateX)/e.scaleX,maxY:(e.canvasHeight-e.translateY)/e.scaleY}}function zo(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 Yo(e,t){return t.minX>=e.minX&&t.maxX<=e.maxX&&t.minY>=e.minY&&t.maxY<=e.maxY}var Te=new WeakMap,Xo=4;function Uo(e){let t=Te.get(e);return t||(t=new Map,Te.set(e,t)),t}function Ko(e,t){let n=Te.get(e);n&&e!==t&&Te.set(t,n)}function qo(e,t,n){e.size>=Xo&&e.delete(e.keys().next().value),e.set(t,n)}function tt(){return p.types.compose("GraphGenomeView",hr.BaseViewModel,(0,yr.RenderLifecycleMixin)(),p.types.model({type:p.types.literal("GraphGenomeView"),layoutQuality:p.types.optional(p.types.number,2),linearLayout:p.types.optional(p.types.boolean,!1),layoutMode:p.types.optional(p.types.enumeration($t),"force"),colorScheme:p.types.optional(p.types.enumeration(Pt),"auto"),bubbleSpread:p.types.optional(p.types.enumeration(Mt),"auto"),nodeWidth:p.types.optional(p.types.enumeration(Ot),"depth"),showBubbles:p.types.optional(p.types.boolean,!0),showDeletionEdges:p.types.optional(p.types.boolean,!1),showGenes:p.types.optional(p.types.boolean,!0),geneTrackId:p.types.optional(p.types.string,""),repeatTrackId:p.types.optional(p.types.string,""),repeatKey:p.types.optional(p.types.string,""),walkRowSamples:p.types.maybe(p.types.frozen()),highlightedPath:p.types.optional(p.types.string,""),referencePath:p.types.optional(p.types.string,""),showPerf:p.types.optional(p.types.boolean,!1),contigThickness:p.types.optional(p.types.number,6),connectorThickness:p.types.optional(p.types.number,2),darkMode:p.types.optional(p.types.boolean,!1),scale:p.types.optional(p.types.number,1),translateX:p.types.optional(p.types.number,0),translateY:p.types.optional(p.types.number,0),drawPaths:p.types.optional(p.types.boolean,!1),paneHeight:p.types.maybe(p.types.number),maxGraphNodes:p.types.optional(p.types.number,Oo),maxRegionBp:p.types.optional(p.types.number,Y),loadedTrackId:p.types.optional(p.types.string,""),loadedRegion:p.types.maybe(p.types.frozen()),subgraphHaplotypes:p.types.maybe(p.types.frozen()),subgraphContext:p.types.optional(p.types.number,1),gfaLocation:p.types.maybe(p.types.frozen()),colorDomain:p.types.maybe(p.types.frozen()),connectedViewId:p.types.maybe(p.types.string)})).volatile(()=>({graph:void 0,layoutResult:void 0,indexBubbles:void 0,geneFeatures:void 0,repeatArrays:void 0,popStack:[],error:void 0,isLoading:!1,loadCanceled:!1,statusMessage:"",hoveredNode:null,hoveredEdge:null,selectedNode:null,viewportDirty:0,positionsVersion:0,geometryVersion:0,builtViewport:void 0,draggingNode:null,isPanning:!1,userMovedViewport:!1,viewportDirtyTimer:void 0,positionsDirtyFrame:0,lastFetchMs:void 0,lastLayoutMs:void 0,lastGeometryMs:void 0,lastGeometryStrokeCount:void 0})).views(e=>({get nodeById(){if(e.graph){let t=new Map;for(let n of e.graph.nodes)t.set(n.id,n);return t}},get nodeLengths(){let t=new Map;for(let n of e.graph?.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 showLoading(){return e.error===void 0&&(e.isLoading||(e.graph!==void 0||!!(e.loadedTrackId&&e.loadedRegion)||!!e.gfaLocation)&&e.lastGeometryStrokeCount===void 0)},get canRetryLoad(){return!!(e.loadedTrackId&&e.loadedRegion)||!!e.gfaLocation},get canCancelLoad(){return e.isLoading&&!e.layoutResult},get usesLayoutEngine(){return e.graph?_t(e.layoutMode,e.graph):!1},get canAnchorLayout(){return e.graph?.nodes.some(t=>t.stable?.rank===0)??!1},get anchorPaths(){return e.graph?.anchorPaths??[]},get pathLegend(){let t=e.graph?.paths;return e.drawPaths&&t&&Ce(t.length)?Ee(t):[]},get walkChoices(){let t=e.graph?.paths;return t?.length?Ee(t):[]},get walkHighlight(){return e.graph&&e.highlightedPath?qn(e.graph,e.highlightedPath):void 0},get effectiveDrawPaths(){return e.drawPaths&&Ce(e.graph?.paths?.length??0)},get activeReferencePath(){return e.graph?.referencePath},get preferredReferencePath(){return e.referencePath===""?e.loadedRegion?.assemblyName:e.referencePath},get rampDomain(){return e.colorDomain??e.loadedRegion},get effectiveColorScheme(){return e.colorScheme!=="auto"?e.colorScheme:e.graph?.anchoredBy?"reference-position":"uniform"},get nodePositions(){return e.layoutResult?.nodePositions},get rowLabels(){return e.layoutResult?.rowLabels??[]},get alleleDeletions(){return e.layoutResult?.alleleDeletions??[]},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?Tn(e.graph):[]}})).views(e=>({get bubbles(){return e.indexBubbles?.length?e.indexBubbles:e.derivedBubbles}})).views(e=>({get assemblyTrackChoices(){let t=e.loadedRegion;return t?(0,G.getSession)(e).tracks.filter(n=>(0,j.readConfObject)(n,"assemblyNames").includes(t.assemblyName)).map(n=>({trackId:n.trackId,name:(0,j.readConfObject)(n,"name"),adapterType:(0,j.readConfObject)(n,"adapter").type})):[]}})).views(e=>({get geneTrackChoices(){return e.assemblyTrackChoices.filter(t=>je.has(t.adapterType))},get repeatTrackChoices(){return e.assemblyTrackChoices.filter(t=>Ye.has(t.adapterType))},get repeatChoices(){return e.repeatArrays??[]}})).views(e=>({get repeatTrack(){return Yn(e.repeatTrackChoices,e.repeatTrackId)},get selectedRepeat(){return e.repeatChoices.find(t=>t.key===e.repeatKey)}})).views(e=>({get nodeNeighbors(){return e.graph?me(e.graph):void 0},get nodeInk(){let{contigThickness:t,nodeWidth:n,nodeById:r}=e,o=e.graph?jt(e.graph):0;return{maxHalfWidthPx:zt(t,n)/2,halfWidthPx:a=>{let i=r?.get(a);return i?Wt(i,t,n,o)/2:t/2}}},get deletions(){return e.graph&&e.layoutMode!=="walkrows"?Vt(e.graph):[]},get walkRowBars(){if(e.layoutMode!=="walkrows"||!e.graph)return;let t=e.selectedRepeat,n=t?Fe(e.graph,t,t.unit):Fe(e.graph,e.loadedRegion);if(!n)return;let r=e.walkRowSamples,o=r?n.rows.filter(a=>r.includes(a.sample)).sort((a,i)=>r.indexOf(a.sample)-r.indexOf(i.sample)||a.label.localeCompare(i.label)):n.rows;return{...n,rows:Ut(o,t?.calls)}},get drawnRowLabels(){let t=this.walkRowBars;return t?[t.reference,...t.rows].map((n,r)=>({label:n.label,y:r*20})):e.rowLabels},get bubbleGlyphs(){return(e.layoutMode==="variants"?e.bubbles:[]).map(n=>({bubble:n,...Q(n)}))},get genePins(){Ae(e.positionsVersion);let t=e.layoutResult?.nodePositions;return e.showGenes&&e.layoutMode!=="variants"&&e.layoutMode!=="walkrows"&&e.graph&&e.geneFeatures&&t?vn(e.graph,e.geneFeatures,t):[]},get bubbleHalos(){Ae(e.positionsVersion);let t=e.layoutResult?.nodePositions;if(!e.showBubbles||e.layoutMode==="variants"||e.layoutMode==="walkrows"||!e.graph||!t)return[];let n=new Map(e.walkChoices.map(r=>[r.name,r.label]));return An(e.graph,e.bubbles,t,r=>n.get(r)??r)},get referenceRamp(){return e.effectiveColorScheme==="reference-position"&&e.graph?Yt(e.graph,e.rampDomain):void 0},get assemblyNames(){let t=e.loadedRegion;return t?[t.assemblyName]:[]},get scaleX(){return et(e.scale,e.pixelRows).scaleX},get scaleY(){return et(e.scale,e.pixelRows).scaleY},get axisScale(){return et(e.scale,e.pixelRows)},get layoutBounds(){let t;if(e.layoutResult){let n=1/0,r=1/0,o=-1/0,a=-1/0;for(let g of Object.values(e.layoutResult.nodePositions))for(let w of g)n=Math.min(n,w.x),r=Math.min(r,w.y),o=Math.max(o,w.x),a=Math.max(a,w.y);let i=e.layoutResult.referenceAxis&&e.popStack.length===0?e.loadedRegion:void 0;i&&i.end>i.start&&(n=i.start,o=i.end);let s=this.walkRowBars,d=s&&e.layoutResult.extent?Ht(s):e.layoutResult.extent;d&&(o=Math.max(o,d.maxX),a=Math.max(a,d.maxY)),t={minX:n,minY:r,w:o-n,h:a-r}}return t},get canvasHeight(){let t=this.layoutBounds,n=e.width-O*2,r=Math.max(Ze,e.paneHeight??Co);if(!t)return r;if(e.pixelRows){let o=e.layoutMode==="variants"?Eo:Ze;return Math.min(r,Math.max(o,t.h+O*2))}return t.w>0&&n>0?Math.min(r,Math.max(Ze,t.h*n/t.w+O*2)):r}})).views(e=>({get geneTrack(){return In(e.geneTrackChoices,e.geneTrackId)},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 hoverHighlight(){let t,n=e.loadedRegion,r=e.hoveredNode,o=e.nodeById,a=e.nodeNeighbors;if(n&&r!==null&&o&&a){let i=ge({nodeId:r,nodeById:o,neighbors:a});i&&(t={refName:n.refName,assemblyName:n.assemblyName,...i})}return t}})).views(e=>({get contributingAssemblies(){let t=e.graph,n=t?St(t):[];return t?Kt(t,{maxGap:n.length>0?Rt(n):1/0}):[]}})).views(e=>({get assemblyResolver(){let{assemblyManager:t,tracks:n}=(0,G.getSession)(e),r=n.find(s=>s.trackId===e.loadedTrackId),o=r?(0,j.readConfObject)(r,"adapter"):void 0,a=new Map(Object.entries(o?.assemblyNameToPanSN??{}).map(([s,d])=>[d,s])),i=s=>s!==void 0&&t.has(s)?t.get(s)?.name??s:void 0;return s=>i(a.get(s))??i(s)}})).views(e=>({get launchableAssemblies(){return Jt(rr(e.contributingAssemblies,e.loadedRegion),e.assemblyResolver)},get canHighlightInLinearView(){let t=e.loadedRegion;return t!==void 0&&ie({views:[...(0,G.getSession)(e).views],connectedViewId:e.connectedViewId,assemblyName:t.assemblyName})!==void 0},nodeLaunchTargets(t){let n=e.nodeById?.get(t),r=n?le(n):void 0,o=r?qt(e.assemblyResolver,r):void 0,a=e.loadedRegion,i=e.nodeById,s=e.nodeNeighbors,d=a&&i&&s?ge({nodeId:t,nodeById:i,neighbors:s}):void 0,g=a&&d?{sample:a.assemblyName,haplotype:void 0,refName:a.refName,...d}:void 0;return{own:r&&o?{location:Ue(r),assembly:o}:void 0,reference:a&&g?{location:Ue(g),assembly:a.assemblyName}:void 0,highlight:a&&g?{location:g,assembly:a.assemblyName}:void 0}}})).actions(e=>({setError(t){e.error=t,e.isLoading=!1},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,e.geometryVersion++},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=Ct(n,t);Ko(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},setGeneTrackId(t){e.geneTrackId=t},setRepeatTrackId(t){e.repeatTrackId=t},setRepeatKey(t){e.repeatKey=t},setHighlightedPath(t){e.highlightedPath=t},setPaneHeight(t){e.paneHeight=t},setSubgraphContext(t){e.subgraphContext=t},setWalkRowSamples(t){e.walkRowSamples=t},setSubgraphHaplotypes(t){e.subgraphHaplotypes=t},setMaxRegionBp(t){e.maxRegionBp=t},pairWithLinearView(t){let n=e.connectedViewId;n!==void 0&&ae([...(0,G.getSession)(e).views]).some(o=>o.id===n)||(e.connectedViewId=t)},setHoveredNode(t){e.hoveredNode=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.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,G.getSession)(e),i=e.loadedRegion,s=i?ge({nodeId:t,nodeById:r,neighbors:o}):void 0;(0,G.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:le(n)?.sample,contributingHaplotype:le(n)?.haplotype,carriedBy:n.samples?.join(", "),...i&&s?{refName:i.refName,assemblyName:i.assemblyName,start:s.start,end:s.end}:{}}}))}},setTransform(t,n,r){e.userMovedViewport=!0,e.scale=Qe(t),e.translateX=n,e.translateY=r},zoom(t,n,r){e.userMovedViewport=!0;let o=Qe(e.scale*t),a=o/e.scale;e.scale=o,e.translateX=n-(n-e.translateX)*a,e.pixelRows||(e.translateY=r-(r-e.translateY)*a)},setViewportDirty(){e.viewportDirty++},setPositionsDirty(){e.positionsVersion++},zoomToFit(){let t=e.layoutBounds,n=e.width-O*2,r=e.canvasHeight-O*2;if(t&&n>0&&r>0&&(t.w>0||!e.pixelRows&&t.h>0)){let o=t.w>0?n/t.w:1/0,a=t.h>0?r/t.h:1/0,i=Qe(e.pixelRows?o:Math.min(o,a));e.scale=i,e.translateX=O-t.minX*i+(n-t.w*i)/2;let s=e.pixelRows?1:i,d=r-t.h*s;e.translateY=O-t.minY*s+Math.max(0,d)/2}},clearPerfMetrics(){e.lastFetchMs=void 0,e.lastLayoutMs=void 0,e.lastGeometryMs=void 0,e.lastGeometryStrokeCount=void 0,e.builtViewport=void 0}})).actions(e=>{function t(){clearTimeout(e.viewportDirtyTimer),e.viewportDirtyTimer=setTimeout(()=>{(0,p.isAlive)(e)&&e.setViewportDirty()},_o)}function n(){cancelAnimationFrame(e.positionsDirtyFrame),e.positionsDirtyFrame=requestAnimationFrame(()=>{(0,p.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}}).actions(e=>{let t;function n(c,l){let x=(0,G.getSession)(e),{rpcManager:S}=x,M="graph",L=c.nodes.some(A);return S.call(M,"GraphComputeLayout",{graph:{nodes:L?Wn(c,l):l.nodes,edges:c.edges},options:{quality:e.layoutQuality,linearLayout:e.linearLayout,...l.opts,...L?{rotateComponents:!1}:{}},signal:t?.signal,statusCallback:T=>{e.setStatusMessage((0,G.statusMessageText)(T)??"")}})}function r(c){let l=c.nodes.some(A);return`${e.layoutQuality}|${e.linearLayout}|${e.bubbleSpread}|${l}|${c.referencePath??""}`}function*o(c){let l=performance.now(),x=Dt(e.layoutMode).run(c,e.loadedRegion);if(x)return{result:x,duration:performance.now()-l};let S=Uo(c),M=r(c),L=S.get(M);if(L)return{result:L,duration:performance.now()-l};let T=Gt(e.bubbleSpread),I=Bt(c),{result:C,duration:K}=yield n(I.graph,Be(I.graph,T)),$=Be(c,T),P=new Map($.nodes.map(q=>[q.id,de($.opts,q.length)])),V=vt(C.nodePositions,I.runs,q=>P.get(q)??0),E={...C,nodePositions:c.nodes.some(A)?On(c,V):V};return qo(S,M,E),{result:E,duration:K}}let a=0;function*i(c){let l=++a,x=()=>e.graph===c&&l===a,S=t?.signal,M;try{M=yield*o(c)}catch(T){if(!x()||S?.aborted)return!1;throw T}let L=x();return L&&(e.layoutResult=M.result,e.setLayoutMs(M.duration)),L}function*s(c,l){e.setStatusMessage("Parsing GFA");let x=ze(c),S=Et(Cn(x,l),e.preferredReferencePath);if(S.nodes.length===0)throw new Error(`No graph segments in ${l}`);if(S.nodes.length>e.maxGraphNodes)throw new Error(`Graph too large to draw: ${S.nodes.length.toLocaleString()} nodes (limit ${e.maxGraphNodes.toLocaleString()}). Zoom in to a smaller region, or raise maxGraphNodes on this view.`);e.graph=S,e.indexBubbles=void 0,e.geneFeatures=void 0,e.repeatArrays=void 0,e.popStack=[],e.clearInteractionState(),e.setStatusMessage("Computing layout"),yield*i(S)}let d=0;function g(){let c=++d;return t?.abort(),t=new AbortController,e.loadCanceled=!1,{isLive:()=>c===d,signal:t.signal}}function w(){return e.loadedTrackId?(0,G.getSession)(e).tracks.find(c=>c.trackId===e.loadedTrackId):void 0}function*R(c,l,x){let S=Ho(c);if(!(c.type!=="RgfaTabixAdapter"||S===void 0))try{let M=yield(0,G.getSession)(e).rpcManager.call("graph","CoreGetFeatures",{adapterConfig:{type:"MinigraphBubbleAdapter",uri:`${S}.bubbles.bed.gz`,baseUri:c.baseUri,assemblyNameToPanSN:c.assemblyNameToPanSN},regions:[l]});x()&&(e.indexBubbles=M.map(L=>({refName:l.refName,start:L.get("start"),end:L.get("end"),segmentCount:L.get("segmentCount"),pathCount:L.get("pathCount")??0,inversion:L.get("inversion"),shortestAlleleLength:L.get("shortestAlleleLength"),longestAlleleLength:L.get("longestAlleleLength"),segments:L.get("segments"),shortestAllele:void 0,longestAllele:void 0})))}catch(M){console.warn("[GraphGenomeView] no bubble index for this graph",M)}}function*m(c,l,x){let S=(0,G.getSession)(e),M=c?S.tracks.find(L=>L.trackId===c):void 0;if(M)try{return yield S.rpcManager.call("graph","CoreGetFeatures",{adapterConfig:(0,j.readConfObject)(M,"adapter"),regions:[l]})}catch(L){console.warn(`[GraphGenomeView] no ${x} for this graph`,L);return}}function*u(c,l){let x=yield*m(e.geneTrack?.trackId,c,"genes");x&&l()&&(e.geneFeatures=Vn(x))}function*b(c,l){let x=yield*m(e.repeatTrack?.trackId,c,"repeats");x&&l()&&(e.repeatArrays=Kn(x))}function*f(c,l,x={}){let{isLive:S,signal:M}=g(),L=w(),T=l.end-l.start,I=(L&&Me(qe(L),l.assemblyName))??(T>e.maxRegionBp?`Region too large (${W(T)}) \u2014 zoom in to view graph (max ${W(e.maxRegionBp)})`:void 0);if(I!==void 0){e.graph=void 0,e.layoutResult=void 0,e.isLoading=!1,e.error=new Error(I);return}e.isLoading=!0,e.error=void 0,e.setStatusMessage("Fetching subgraph");try{let C=(0,G.getSession)(e),{rpcManager:K}=C,$="graph",P=performance.now(),V=yield K.call($,"GetSubgraph",{adapterConfig:c,region:l,opts:{hops:x.hops,haplotypes:x.haplotypes},signal:M});if(!S())return;if(e.setFetchMs(performance.now()-P),!V)throw new Error("Adapter returned no GFA \u2014 region may be outside indexed data or the adapter does not implement getSubgraph");let E=_(l);if(yield*s(V,E),!S())return;e.setStatusMessage("Reading annotations"),yield Promise.all([(0,p.flow)(R)(c,l,S),(0,p.flow)(u)(l,S),(0,p.flow)(b)(l,S)])}catch(C){S()&&(console.error("[GraphGenomeView.loadFromTabixSubgraph]",C),e.error=C)}finally{S()&&(e.isLoading=!1)}}function*h(){let c=e.loadedRegion,l=w();c&&e.loadedTrackId&&!l?e.error=new Error(`The track this graph was cut from, "${e.loadedTrackId}", is not in this session`):l&&c&&(yield*f((0,j.readConfObject)(l,"adapter"),c,{hops:e.subgraphContext,haplotypes:e.subgraphHaplotypes}))}function*k(c,l,x){let{isLive:S,signal:M}=g();e.loadedTrackId="",e.loadedRegion=x,e.isLoading=!0,e.error=void 0;try{let L=typeof l=="string"?l:yield l(M);S()&&(yield*s(L,c))}catch(L){S()&&(console.error("[GraphGenomeView.loadWholeGFA]",L),e.error=L)}finally{S()&&(e.isLoading=!1)}return S()}return{clearGraph(){t?.abort(),t=void 0,d++,a++,e.graph=void 0,e.layoutResult=void 0,e.loadedTrackId="",e.loadedRegion=void 0,e.gfaLocation=void 0,e.indexBubbles=void 0,e.geneFeatures=void 0,e.repeatArrays=void 0,e.popStack=[],e.error=void 0,e.isLoading=!1,e.loadCanceled=!1,e.statusMessage="",e.clearInteractionState(),e.clearPerfMetrics()},cancelLoad(){e.canCancelLoad&&(t?.abort(),t=void 0,d++,a++,e.graph=void 0,e.isLoading=!1,e.statusMessage="",e.loadCanceled=!0)},loadGFA:(0,p.flow)(function*(c,l="Imported GFA"){yield*k(l,c)}),loadGFAFromLocation:(0,p.flow)(function*(c){e.setStatusMessage("Fetching GFA");let l=e.loadedRegion,x=yield*k("uri"in c?c.uri.split("/").pop()??"GFA":"GFA",S=>(0,fr.openLocation)(c).readFile({encoding:"utf8",signal:S}),l);l&&x&&e.graph&&(yield*b(l,()=>e.loadedRegion===l))}),loadFromTabixSubgraph:(0,p.flow)(function*(c,l,x={}){e.loadedTrackId=x.trackId??"",e.loadedRegion=x.trackId?l:void 0,yield*f(c,l,{hops:e.subgraphContext,haplotypes:e.subgraphHaplotypes})}),refetchIfNeeded:(0,p.flow)(function*(){e.graph||(yield*h())}),reloadSubgraph:(0,p.flow)(function*(){yield*h()}),reloadRepeats:(0,p.flow)(function*(){let c=e.loadedRegion,l=e.repeatTrack?.trackId;c&&(yield*b(c,()=>e.loadedRegion===c&&e.repeatTrack?.trackId===l))}),reloadGenes:(0,p.flow)(function*(){let c=e.loadedRegion,l=e.geneTrack?.trackId;c&&(yield*u(c,()=>e.loadedRegion===c&&e.geneTrack?.trackId===l))}),popBubble:(0,p.flow)(function*(c){let l=e.graph;if(!l)return;let x=Nn(l,ce(c));if(x.nodes.length===0){(0,G.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:S}=g();e.popStack=[...e.popStack,{graph:l,layoutMode:e.layoutMode,label:l.name,indexBubbles:e.indexBubbles}],e.indexBubbles=void 0;let M=`${Nt[Q(c).kind]} at ${c.refName}:${c.start.toLocaleString()}`;e.graph={...x,name:M},e.layoutMode==="variants"&&(e.layoutMode="force"),e.clearInteractionState(),e.userMovedViewport=!1,e.isLoading=!0;try{(yield*i(e.graph))&&(e.isLoading=!1)}catch(L){S()&&(e.error=L,e.isLoading=!1)}}),unpopBubble:(0,p.flow)(function*(){let c=e.poppedFrom;if(c){e.popStack=e.popStack.slice(0,-1),e.graph=c.graph,e.layoutMode=c.layoutMode,e.indexBubbles=c.indexBubbles,e.clearInteractionState(),e.userMovedViewport=!1,e.isLoading=!0;try{(yield*i(c.graph))&&(e.isLoading=!1)}catch(l){e.error=l,e.isLoading=!1}}}),recomputeLayout:(0,p.flow)(function*(){let c=e.graph;if(c){e.isLoading=!0,e.setStatusMessage("Computing layout");try{(yield*i(c))&&(e.isLoading=!1)}catch(l){console.error("[GraphGenomeView.recomputeLayout]",l),e.error=l,e.isLoading=!1}}})}}).actions(e=>({startRenderingBackend(t){if(!e.autorunsInstalled){(0,p.addDisposer)(e,(0,N.autorun)(()=>{let r=e.rampDomain,o=e.loadedTrackId;if(r&&o&&e.effectiveColorScheme==="reference-position"){let a=(0,N.untracked)(()=>_n((0,G.getSession)(e).views,e.connectedViewId,o));a&&Dn(a,$n(r))}})),(0,p.addDisposer)(e,(0,N.autorun)(()=>{e.layoutResult&&(0,N.untracked)(()=>!e.userMovedViewport)&&e.zoomToFit()})),(0,p.addDisposer)(e,(0,N.autorun)(()=>{let r=Jn((0,G.getSession)(e).hovered);(0,N.untracked)(()=>{let o=e.loadedRegion,a=e.graph;o&&a&&e.setHoveredNode(r&&Zn(r,o)?Qn({hover:r,nodes:a.nodes}):null)})})),(0,p.addDisposer)(e,(0,N.reaction)(()=>`${e.scale}-${e.translateX}-${e.translateY}`,()=>{e.setHoveredNode(null),e.setHoveredEdge(null)},{name:"GraphClearHoverOnViewportChange"}));let n=!0;(0,p.addDisposer)(e,(0,N.autorun)(()=>{let{scale:r}=e,o=lr(e);if(n){n=!1;return}let a=(0,N.untracked)(()=>e.builtViewport);a?.scale===r&&Yo(a.bounds,o)||e.scheduleViewportDirty()})),(0,p.addDisposer)(e,(0,N.autorun)(()=>{let r=e.currentRenderingBackend,o=e.hoveredNode,a=e.hoveredEdge,i=e.selectedNode;if(Ae(e.geometryVersion),r){let s=new Map;i!==null&&s.set(i,$o),o!==null&&o!==i&&s.set(o,gr),r.setNodeHighlights(s),r.setEdgeHighlight(a,gr),e.renderNow()}}))}e.attachRenderingBackend(t,()=>({upload:n=>{n.resize(e.width,e.canvasHeight);let r=e.nodeById;if(e.nodePositions&&e.graph&&r){Ae(e.viewportDirty,e.positionsVersion);let o=performance.now(),a=(0,N.untracked)(()=>zo(lr(e),Do)),i=Xt({nodePositions:e.nodePositions,graph:e.graph,nodeById:r,colorScheme:e.effectiveColorScheme,contigThickness:e.contigThickness,connectorThickness:e.connectorThickness,drawPaths:e.effectiveDrawPaths,nodeWidth:e.nodeWidth,highlight:e.walkHighlight,axis:(0,N.untracked)(()=>e.axisScale),linearLayout:e.linearLayout,viewportBounds:a,referenceRamp:e.referenceRamp,deletions:e.deletionEdgeIndexes,hiddenEdges:e.hiddenEdgeIndexes,version:e.positionsVersion});return n.uploadGeometry(i),e.setGeometryMetrics(performance.now()-o,i.nodeStrokes.length,{scale:(0,N.untracked)(()=>e.scale),bounds:a}),!0}return!1},render:n=>{if(!e.nodePositions)return!1;let r=(0,wr.getDpr)();return n.updateTransform({scaleX:e.scaleX*r,scaleY:e.scaleY*r,translateX:e.translateX*r,translateY:e.translateY*r,dpr:r}),n.render(e.darkMode?[.12,.12,.12,1]:[1,1,1,1]),!0}}))}})).actions(e=>({retryLoad(){e.loadedTrackId&&e.loadedRegion?e.reloadSubgraph():e.gfaLocation&&e.loadGFAFromLocation(e.gfaLocation)},afterAttach(){e.isDefaultViewport||(e.userMovedViewport=!0),e.gfaLocation&&!e.graph&&e.loadGFAFromLocation(e.gfaLocation),e.refetchIfNeeded()}})).actions(e=>({showInLinearView(t){let n=(0,G.getSession)(e),r=t.assembly===e.loadedRegion?.assemblyName,o=or({session:n,location:t.location,assembly:t.assembly,connectedViewId:e.connectedViewId,tracks:sr({session:n,assemblyName:t.assembly,first:e.loadedTrackId&&r?e.loadedTrackId:void 0})});r&&e.pairWithLinearView(o)},highlightInLinearView(t){ar({session:(0,G.getSession)(e),location:t.location,assembly:t.assembly,connectedViewId:e.connectedViewId})},showSyntenyView(t){ir({session:(0,G.getSession)(e),contributors:e.launchableAssemblies,trackId:t,graphTrackId:e.loadedTrackId||void 0})}})).views(e=>({get syntenyLaunchTracks(){let t=e.launchableAssemblies.map(n=>n.sample);return t.length>=2?cr((0,G.getSession)(e),t):[]}})).views(e=>({menuItems(){let t=[];for(let n of Zt({contributors:e.launchableAssemblies,syntenyTracks:e.syntenyLaunchTracks,onShowLinear:r=>{e.showInLinearView(r)},onShowSynteny:r=>{e.showSyntenyView(r)}}))(0,br.pushLaunchViewMenuItem)(t,n);return t}}))}var Jo=(0,Sr.defineLaunchKeys)()({});function nt(e){e.addViewType(()=>new xr.default({name:"GraphGenomeView",displayName:"Graph genome view",stateModel:tt(),launchKeys:Jo,ReactComponent:(0,kr.lazy)(()=>import("./chunks/GraphGenomeView-UD5WCV3Q.js"))}))}function rt(e){e.addToExtensionPoint("LaunchView-GraphGenomeView",t=>{let{session:n,...r}=t;return n.addView("GraphGenomeView",r),t})}var Mr=y(fe(),1);var ot=y(B(),1),Lr=y(z(),1);function at(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 Zo=(0,ot.ConfigurationSchema)("MinigraphBubbleAdapter",{bubblesLocation:{type:"fileLocation",defaultValue:{uri:"/path/to/graph.bb.bed.gz",locationType:"UriLocation"}},index:(0,ot.ConfigurationSchema)("MinigraphBubbleIndex",{indexType:{model:Lr.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:at}),Rr=Zo;function it(e){e.addAdapterType(()=>new Mr.default({name:"MinigraphBubbleAdapter",displayName:"Minigraph bubble BED adapter",normalizeSnapshot:at,configSchema:Rr,adapterMetadata:{category:"Graph adapters"},getAdapterClass:()=>import("./chunks/MinigraphBubbleAdapter-B75VQK7T.js").then(t=>t.default)}))}var Ir=y(fe(),1);var st=y(B(),1),Tr=y(z(),1);function Gr(e,t,n){return{indexType:n?"CSI":"TBI",location:{uri:`${e}.${n?"csi":"tbi"}`,baseUri:t}}}function dt(e){let{uri:t,baseUri:n,csi:r}=e;return typeof t=="string"?{...e,segmentsLocation:{uri:`${t}.segs.bed.gz`,baseUri:n},segmentsIndex:Gr(`${t}.segs.bed.gz`,n,r),linksLocation:{uri:`${t}.links.bed.gz`,baseUri:n},linksIndex:Gr(`${t}.links.bed.gz`,n,r)}:e}var Ar=(e,t)=>(0,st.ConfigurationSchema)(e,{indexType:{model:Tr.types.enumeration("IndexType",["TBI","CSI"]),type:"stringEnum",defaultValue:"TBI"},location:{type:"fileLocation",defaultValue:{uri:t,locationType:"UriLocation"}}}),Qo=(0,st.ConfigurationSchema)("RgfaTabixAdapter",{segmentsLocation:{type:"fileLocation",defaultValue:{uri:"/path/to/graph.segs.bed.gz",locationType:"UriLocation"}},segmentsIndex:Ar("RgfaSegmentsIndex","/path/to/graph.segs.bed.gz.tbi"),linksLocation:{type:"fileLocation",defaultValue:{uri:"/path/to/graph.links.bed.gz",locationType:"UriLocation"}},linksIndex:Ar("RgfaLinksIndex","/path/to/graph.links.bed.gz.tbi"),assemblyNameToPanSN:{type:"frozen",defaultValue:{}}},{explicitlyTyped:!0,preProcessSnapshot:dt}),Nr=Qo;function ct(e){e.addAdapterType(()=>new Ir.default({name:"RgfaTabixAdapter",displayName:"Indexed rGFA adapter",normalizeSnapshot:dt,configSchema:Nr,adapterCapabilities:["getSubgraph"],adapterMetadata:{category:"Graph adapters"},getAdapterClass:()=>import("./chunks/RgfaTabixAdapter-IT7I5RR3.js").then(t=>t.default)}))}var Vr=y(J(),1),Br=y(Kr(),1),pt=y(Ur(),1),vr=y(Jr(),1);function ut(e){return typeof e=="object"&&e!==null}function ea(e){let t;if(ut(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 ta(e,t,n){let r=e.connectedViewId;return r===void 0||r===t||!n.has(r)}function na(e,t){return e.assemblyName===void 0||t===void 0||t.includes(e.assemblyName)}function Pr(e,t,n){let r=[],o=new Set(ae(e).map(a=>ut(a)?a.id:void 0));for(let a of e)if(ut(a)&&a.type==="GraphGenomeView"&&ta(a,t,o)){let i=ea(a.hoverHighlight);i&&na(i,n)&&r.push({key:typeof a.id=="string"?a.id:"graph",region:i})}return r}var X=y(Z(),1),ra=(0,vr.makeStyles)()(e=>({highlight:{height:"100%",position:"absolute",background:(0,Br.alpha)(e.palette.primary.main,.25),borderLeft:`2px solid ${e.palette.primary.main}`,borderRight:`2px solid ${e.palette.primary.main}`,pointerEvents:"none",zIndex:10}})),oa=(0,pt.observer)(function({model:t,region:n}){let{classes:r}=ra(),o=t.getHighlightCoords(n);return o?(0,X.jsx)("div",{"data-testid":"graph-node-highlight",className:r.highlight,style:{left:o.left,width:o.width}}):null}),aa=(0,pt.observer)(function({model:t}){let{views:n}=(0,Vr.getSession)(t);return(0,X.jsx)(X.Fragment,{children:Pr([...n],t.id,t.assemblyNames).map(({key:r,region:o})=>(0,X.jsx)(oa,{model:t,region:o},`graph-hover-${r}`))})}),Fr=aa;var Cr=y(Z(),1),ia="LinearGenomeView-TracksContainerComponent";function mt(e){e.contributeToExtensionPoint(ia,({model:t})=>(0,Cr.jsx)(Fr,{model:t},"graphgenomeview-hover-highlight"))}var lt=y(B(),1),gt=y(Ve(),1),F=y(J(),1);var Ne="Graph genome view (this region)";function Er(e){let t=Math.max(10,Math.floor((e.end-e.start)*.5));return{...e,start:Math.max(0,e.start-t),end:e.end+t}}function sa(e){return e.reduce((t,n)=>t&&t.end-t.start>=n.end-n.start?t:n,void 0)}function se(e){let t=sa(e);return t?{refName:t.refName,assemblyName:t.assemblyName,start:Math.max(0,Math.floor(t.start)),end:Math.floor(t.end)}:void 0}function Hr(e){let t=e.end-e.start;return t>Y?`Region is ${W(t)} \u2014 zoom in or select a smaller range (max ${W(Y)})`:void 0}function $r({session:e,region:t,trackId:n,connectedViewId:r,haplotypes:o}){let a=t.end-t.start;a>Y?e.notify(`Region too large (${W(a)}) \u2014 zoom in to open a graph view (max ${W(Y)})`,"warning"):e.addView("GraphGenomeView",{displayName:`Graph \u2014 ${_(t)}`,loadedTrackId:n,loadedRegion:t,subgraphHaplotypes:o,connectedViewId:r})}function U({label:e,region:t,tracks:n,session:r,connectedViewId:o}){let a=[];if(t&&n.length>0){let i=Hr(t),s=d=>{let g=Me(d.referenceAssembly,t.assemblyName)??i;return{disabled:g!==void 0,disabledHelpText:g,onClick:()=>{$r({session:r,region:t,trackId:d.trackId,connectedViewId:o,haplotypes:d.haplotypes})}}};a=n.length===1?[{label:e,icon:ee,...s(n[0])}]:[{label:e,icon:ee,type:"subMenu",subMenu:n.map(d=>({label:d.name,...s(d)}))}]}return a}function da(e){return e.name==="LinearBasicDisplay"}function _r(e,t){return Ke(e,(0,lt.getConf)(t,["adapter"]).type)}function Dr(e,t){return[Je(e.configuration,(0,lt.getConf)(e,"trackId"),(0,F.getSession)(e),t)]}function ht(e){e.addToExtensionPoint("Core-extendPluggableElement",t=>(da(t)&&t.extendStateModel(n=>n.extend(r=>{let o=r.trackMenuItems,a=r.contextMenuItems;return{views:{trackMenuItems(){let i=o(),s=(0,F.getContainingTrack)(r);if(_r(e,s)){let d=(0,F.getContainingView)(r);for(let g of U({label:Ne,region:se(d.dynamicBlocks.contentBlocks),tracks:Dr(s,d),session:(0,F.getSession)(r),connectedViewId:d.id}))(0,gt.pushLaunchViewMenuItem)(i,g)}return i},contextMenuItems(){let i=a(),s=r.contextMenuInfo,d=(0,F.getContainingTrack)(r);if(s){let g=(0,F.getContainingView)(r),w=g.displayedRegions[s.displayedRegionIndex],R=_r(e,d);if(w){let m=U({label:R?"Graph genome view (this segment)":"Graph genome view (this feature)",region:Er({refName:w.refName,assemblyName:w.assemblyName,start:s.item.startBp,end:s.item.endBp}),tracks:R?Dr(d,g):Ge(e,(0,F.getSession)(r),w.assemblyName,g),session:(0,F.getSession)(r),connectedViewId:g.id});for(let u of m)(0,gt.pushLaunchViewMenuItem)(i,u)}}return i}}}})),t))}var Or=y(Ve(),1),Ie=y(J(),1);var ca="Graph genome view (this selection)";function ua(e){return e.name==="LinearGenomeView"}function bt(e){e.addToExtensionPoint("Core-extendPluggableElement",t=>(ua(t)&&t.extendStateModel(n=>n.extend(r=>{let o=r.menuItems,a=r.rubberBandMenuItems;function i(){let s=r.assemblyNames[0];return s?Ge(e,(0,Ie.getSession)(r),s,r):[]}return{views:{menuItems(){let s=o();for(let d of U({label:Ne,region:se(r.dynamicBlocks.contentBlocks),tracks:i(),session:(0,Ie.getSession)(r),connectedViewId:r.id}))(0,Or.pushLaunchViewMenuItem)(s,d);return s},rubberBandMenuItems(){return[...a(),...U({label:ca,region:se(r.getSelectedRegions(r.leftOffset,r.rightOffset)),tracks:i(),session:(0,Ie.getSession)(r),connectedViewId:r.id})]}}}})),t))}var jr="GraphGenomeView";var Wr="3.0.4";var ft=class extends zr.default{constructor(){super(...arguments);this.name=jr;this.version=Wr}install(n){nt(n),rt(n),ht(n),bt(n),mt(n),ct(n),it(n),He(n),$e(n),n.addRpcMethod(()=>new ne(n)),n.addRpcMethod(()=>new te(n))}configure(n){try{(0,Yr.isAbstractMenuManager)(n.rootModel)&&n.rootModel.appendToSubMenu(["Add"],{label:"Graph genome view",icon:ee,onClick:r=>{r.addView("GraphGenomeView",{})}})}catch(r){console.warn("[GraphGenomeView] could not add the Add menu entry",r)}}};export{ft as default};
1
+ import{a as W}from"./chunks/chunk-FCWXYIFC.js";import{a as St}from"./chunks/chunk-D7XFR2IV.js";import{B as Vt,C as Ft,D as Ct,E as Ce,G as pe,H as Et,I as Ht,J as Ot,K as me,L as le,M as Ee,N as $t,O as _t,Q as Dt,R as jt,S as He,U as zt,V as Wt,W as Yt,X as Xt,Z as Oe,_ as $e,a as xt,c as ir,ca as Ut,d as M,da as Kt,e as Rt,ea as qt,f as Nt,fa as ge,g as Tt,ga as Jt,h as de,ha as Zt,i as Fe,ia as Qt,ja as he,k as Mt,ka as _,l as At,la as en,m as It,n as ee,na as sr,p as Pt,q as ce,r as ue,x as vt,z as Bt}from"./chunks/chunk-7T2HTRP3.js";import{a as Q,b as rr,c as ar,d as Ve,e as Lt}from"./chunks/chunk-XEJ47DLD.js";import{c as Gt}from"./chunks/chunk-ZNGDWZ6Z.js";import{a as or}from"./chunks/chunk-KWAXLUPQ.js";import{a as Z}from"./chunks/chunk-J4OLMLS5.js";import"./chunks/chunk-F4C3BEPV.js";import{a as H,b as w}from"./chunks/chunk-FY3BTKY4.js";var nn=H((xa,tn)=>{tn.exports=JBrowseExports["@jbrowse/core/Plugin"]});var fe=H((Ra,on)=>{on.exports=JBrowseExports["@jbrowse/core/pluggableElementTypes/AdapterType"]});var B=H((Na,rn)=>{rn.exports=JBrowseExports["@jbrowse/core/configuration"]});var pn=H((Ga,un)=>{un.exports=JBrowseExports["@jbrowse/core/data_adapters/dataAdapterCache"]});var ye=H((Ia,mn)=>{mn.exports=JBrowseExports["@jbrowse/core/pluggableElementTypes"]});var kn=H((Ca,wn)=>{wn.exports=JBrowseExports["@jbrowse/core/pluggableElementTypes/ViewType"]});var Sn=H((Ea,xn)=>{xn.exports=JBrowseExports["@jbrowse/core/util/withLaunchInput"]});var Rn=H((Ha,Ln)=>{Ln.exports=JBrowseExports["@jbrowse/core/pluggableElementTypes/models"]});var Tn=H((Oa,Nn)=>{Nn.exports=JBrowseExports["@jbrowse/render-core/RenderLifecycleMixin"]});var An=H(($a,Mn)=>{Mn.exports=JBrowseExports.mobx});var tr=w(nn(),1),nr=w(Z(),1);var be=w(Q(),1),te=(0,xt.createSvgIcon)([(0,be.jsx)("circle",{cx:"7.2",cy:"14.4",r:"3.2"},"0"),(0,be.jsx)("circle",{cx:"14.8",cy:"18",r:"2"},"1"),(0,be.jsx)("circle",{cx:"15.2",cy:"8.8",r:"4.8"},"2")],"BubbleChart");var cn=w(fe(),1);var an=w(B(),1),sn=w(W(),1),dr=(0,an.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"}},subgraphSnarls:{type:"stringEnum",model:sn.types.enumeration("SnarlOutput",["none","contained","overlapping"]),defaultValue:"contained"},referenceSample:{type:"string",defaultValue:""},assemblyNameToPanSN:{type:"frozen",defaultValue:{}},context:{type:"number",defaultValue:1e3,advanced:!0},nodeLimit:{type:"number",defaultValue:1e5,advanced:!0}},{explicitlyTyped:!0,preProcessSnapshot:e=>e.uri?{...e,gbzDbLocation:{uri:e.uri,baseUri:e.baseUri}}:e}),dn=dr;function _e(e){e.addAdapterType(()=>new cn.default({name:"GbzBaseSyntenyAdapter",displayName:"gbz-base pangenome adapter",configSchema:dn,adapterCapabilities:["getSubgraph","headerLanes","lanePairsOnAnchor"],adapterMetadata:{category:"Synteny adapters"},getAdapterClass:()=>import("./chunks/GbzBaseSyntenyAdapter-MIOUYHOF.js").then(t=>t.default)}))}var ln=w(pn(),1),gn=w(ye(),1);function cr(e){return"getSubgraph"in e&&typeof e.getSubgraph=="function"}var ne=class extends gn.RpcMethodTypeWithRenameRegion{constructor(){super(...arguments);this.name="GetSubgraph"}async execute(n){let{adapterConfig:o,region:r,sessionId:a,opts:i,signal:s}=n,{dataAdapter:p}=await(0,ln.getAdapter)(this.pluginManager,a,o);return cr(p)?p.getSubgraph(r,{...i,signal:s}):(console.warn(`[GetSubgraph] ${p.constructor.name} does not implement getSubgraph`),"")}};var hn=w(Lt(),1),bn=w(ye(),1),fn=w(W(),1),ur=(0,hn.lazy)(()=>import("./chunks/AddTrackWorkflow-Y3OBHM33.js"));function De(e){e.addAddTrackWorkflowType(()=>new bn.AddTrackWorkflowType({name:"Pangenome graph track",displayName:"Add pangenome graph track",ReactComponent:ur,stateModel:fn.types.model({})}))}var yn=w(ye(),1);var je;function ze(){return je??=import("./chunks/bandage-layout-FIOZ7B3E.js").then(e=>e.default()).catch(e=>{throw je=void 0,e}),je}var oe=class extends yn.RpcMethodType{constructor(){super(...arguments);this.name="GraphComputeLayout"}async execute(n){let{graph:o,options:r,statusCallback:a}=n;a?.("Loading layout engine");let i=await ze();a?.("Computing layout");let s=performance.now(),p=i.computeLayout(o,r),m=performance.now()-s;return{result:p,duration:m}}};var Io=w(Lt(),1),Po=w(kn(),1),vo=w(Sn(),1);var j=w(B(),1),No=w(Rn(),1),To=w(Ve(),1),T=w(Z(),1),Mo=w(or(),1),d=w(W(),1),Ao=w(Tn(),1),Go=w(ir(),1),A=w(An(),1);var pr=.9,We=2,mr=1e3;function Gn(e,t,n,o=r=>r){let r=new Map(e.nodes.map(i=>[i.name,i])),a=[];for(let i of t){let s=[],p,m=[],y=[];for(let b of ce(i)){let f=r.get(b),h=f&&n[f.id];if(!(!f||!h?.length)){if(M(f)&&(f.stable.start<i.start||f.stable.start>=i.end)){y.push(h[Math.floor(h.length/2)]);continue}m.push(f.id),s.push(ue(h.length===1?[h[0],h[0]]:h));for(let k of h)(!p||k.y<p.y)&&(p=k)}}if(!p)continue;let R=y.length?{x:y.reduce((b,f)=>b+f.x,0)/y.length,y:y.reduce((b,f)=>b+f.y,0)/y.length}:p,l=new Map;for(let b of i.routes??[])for(let f of new Set(b.steps))l.set(f,(l.get(f)??0)+1);let c=[];for(let b of i.routes??[]){if(i.longestAlleleLength<mr)break;if(b.steps.length===0)continue;let f=Math.min(...b.steps.map(u=>l.get(u))),h,k=-1;for(let u of b.steps)if(l.get(u)===f)for(let g of n[u]??[]){let x=Math.hypot(g.x-R.x,g.y-R.y);x>k&&(k=x,h=g)}h&&c.push({route:b,at:h,text:lr(b,o)})}a.push({bubble:i,...ee(i),path:s.join(""),top:p,members:m.length,nodeIds:m,whole:m.length>=pr*e.nodes.length,routes:c})}return a}function lr(e,t){let n=[...new Set(e.walks.map(t))].sort(),o=n.slice(0,We).join(", "),r=n.length>We?` +${n.length-We}`:"";return`${o}${r} \xB7 ${It(e.bp)}`}function In(e){if(!e.nodes.some(M))return[];let t=new Map(e.nodes.map(l=>[l.id,l])),n=vt(e),o=new Map(n.map((l,c)=>[l,c])),r=new Int32Array(n.length+1),a=new Map,i=new Set;for(let l of e.edges){let c=o.get(l.from),b=o.get(l.to);if(c===void 0||b===void 0||c===b)continue;i.add(`${l.from}>${l.to}`).add(`${l.to}>${l.from}`);let[f,h]=c<b?[c,b]:[b,c];r[f+1]++,r[h]--;let[k,u]=c<b?[l.from,l.to]:[l.to,l.from];(a.get(k)??a.set(k,new Set).get(k)).add(u)}for(let l=1;l<r.length;l++)r[l]+=r[l-1];let s=e.nodes.filter(M).sort((l,c)=>l.stable.start-c.stable.start),p=new Set([s[0].id,s.at(-1).id]),m=s.map(l=>[l,o.get(l.id)]).filter(([l,c])=>p.has(l.id)||r[c]===0).sort(([l,c],[b,f])=>c-f||l.stable.start-b.stable.start),y=e.paths?.map(l=>{let c=new Map;return l.nodeIds.forEach((b,f)=>{c.has(b)||c.set(b,f)}),c}),R=[];for(let l=0;l+1<m.length;l++){let[c,b]=m[l],[f,h]=m[l+1],k=n.slice(b+1,h);if(k.length===0)continue;let u=new Map([[c.id,{min:0,max:0,n:1}]]);for(let P of[c.id,...k]){let v=u.get(P);if(v)for(let E of a.get(P)??[]){if(o.get(E)>h)continue;let kt=E===f.id?0:t.get(E).length,Be=u.get(E);u.set(E,{min:Math.min(Be?.min??1/0,v.min+kt),max:Math.max(Be?.max??-1/0,v.max+kt),n:Math.min(Gt,v.n+(Be?.n??0))})}}let g=y&&gr(e,t,y,c.id,f.id),x=g?.n?g:void 0,L=x??u.get(f.id)??{min:0,max:0,n:0},N=g!==void 0&&g.left>0,S=c.stable.start+c.length,G=f.stable.start,I=[c.id,...k.filter(P=>M(t.get(P))),f.id],C=I.some((P,v)=>v>0&&!i.has(`${I[v-1]}>${P}`)),q=C||N,$=C&&!x;R.push({refName:c.stable.refName,start:S,end:G,segmentCount:k.length+2,pathCount:L.n,inversion:!1,shortestAlleleLength:$?G-S:L.min,longestAlleleLength:$?G-S:L.max,segments:[c,...k.map(P=>t.get(P)),f].map(P=>P.name).join(","),shortestAllele:void 0,longestAllele:void 0,partial:q,routes:x?.routes})}return R}function gr(e,t,n,o,r){let a=new Map,i=1/0,s=-1/0,p=0;return e.paths.forEach((m,y)=>{let R=n[y].get(o),l=n[y].get(r);if(R===void 0||l===void 0){(R!==void 0||l!==void 0)&&p++;return}let c=m.nodeIds.slice(Math.min(R,l)+1,Math.max(R,l));l<R&&c.reverse();let b=0;for(let k of c)b+=t.get(k)?.length??0;let f=c.join(","),h=a.get(f)??{steps:c,bp:b,walks:[]};h.walks.push(m.name),a.set(f,h),i=Math.min(i,b),s=Math.max(s,b)}),a.size||p?{min:i,max:s,n:a.size,left:p,routes:[...a.values()]}:void 0}function Pn(e,t){let n=new Set(t),o=e.nodes.filter(i=>n.has(i.name)),r=new Set(o.map(i=>i.id)),a=e.paths?.map(i=>({...i,nodeIds:i.nodeIds.filter(s=>r.has(s))})).filter(i=>i.nodeIds.length>0);return{name:e.name,nodes:o,edges:e.edges.filter(i=>r.has(i.from)&&r.has(i.to)),...a?.length?{paths:a}:{},anchorPaths:e.anchorPaths,pathVisits:e.pathVisits,anchoredBy:e.anchoredBy,referencePath:e.referencePath}}function vn(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 Bn(e){return e.reduce((t,n)=>t&&t.end-t.start>=n.end-n.start?t:n,void 0)}function Vn(e,t){let n=Bn(e.dynamicBlocks.contentBlocks.filter(r=>r.refName===t.refName&&r.assemblyName===t.assemblyName)),{bpPerPx:o}=e;return n&&o>0?{scale:1/o,translateX:n.offsetPx-e.offsetPx-n.start/o}:void 0}function Fn(e){let t=Bn(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 Cn(e,t){let n=e.end-e.start,o=Math.max(0,Math.min(e.span,(t-n)/2));return{refName:e.refName,assemblyName:e.assemblyName,start:Math.max(e.regionStart,Math.floor(e.start-o)),end:Math.min(e.regionEnd,Math.ceil(e.end+o))}}function En(e,t){return e?.refName===t.refName&&e.assemblyName===t.assemblyName&&e.start<=t.start&&t.end<=e.end}var Ye=new Set(["Gff3TabixAdapter","Gff3Adapter","GtfTabixAdapter","GtfAdapter","BigBedAdapter","NCListAdapter"]),hr=/gene|refseq|gencode|ensembl|annotation/i;function Hn(e,t){if(t)return e.find(o=>o.trackId===t);let n=e.filter(o=>Ye.has(o.adapterType));return n.find(o=>hr.test(`${o.trackId} ${o.name??""}`))??n[0]}function V(e,t){return typeof e.get=="function"?e.get(t):e[t]}function On(e,t){V(e,"type")==="exon"&&t.push({start:V(e,"start"),end:V(e,"end")});let o=V(e,"subfeatures");for(let r of o??[])On(r,t)}function br(e){let t=[...e].sort((o,r)=>o.start-r.start),n=[];for(let o of t){let r=n.at(-1);r&&o.start<=r.end?r.end=Math.max(r.end,o.end):n.push({...o})}return n}function $n(e){let t=[];for(let n of e){let o=V(n,"gene_name")??V(n,"name")??V(n,"id"),r=V(n,"start"),a=V(n,"end");if(!o||!(a>r))continue;let i=[];On(n,i),t.push({name:o,refName:V(n,"refName"),start:r,end:a,strand:V(n,"strand")??0,exons:i.length?br(i):[{start:r,end:a}]})}return t}function _n(e){return e.split("#").at(-1)}function Dn(e,t,n){let o=new Map,r=new Map;for(let i of e.nodes)if(M(i)&&n[i.id]?.length){let{refName:s}=i.stable,p=r.get(s)??r.set(s,_n(s)).get(s),m=o.get(p)??o.set(p,{nodes:[],reach:0}).get(p);m.nodes.push(i),m.reach=Math.max(m.reach,i.length)}for(let{nodes:i}of o.values())i.sort((s,p)=>s.stable.start-p.stable.start);let a=[];for(let i of t){let s=o.get(_n(i.refName));if(!s)continue;let p=[],m,y=1/0,R=0,l=(i.start+i.end)/2,{nodes:c,reach:b}=s;for(let f=Nt(c,i.start-b);f<c.length&&c[f].stable.start<i.end;f++){let h=c[f],k=h.stable.start,u=k+h.length;if(u<=i.start)continue;let g=n[h.id];R+=Math.min(u,i.end)-Math.max(k,i.start);for(let N of i.exons){let S=Math.max(N.start,k),G=Math.min(N.end,u);if(G<=S)continue;let I=Ce(g,(S-k)/h.length,(G-k)/h.length);I.length===1&&I.push({...I[0]}),p.push(ue(I))}let x=Math.min(Math.max(l,k),u),L=Math.abs(x-l);if(L<y){y=L;let[N]=Ce(g,(x-k)/h.length,(x-k)/h.length);m=N}}m&&a.push({gene:i,exons:p.join(""),at:m,covered:R/(i.end-i.start)})}return a}function fr(e,t){let n=e.indexOf(":"),o=e.indexOf(":",n+1);if(n!==-1&&o!==-1){let r=e.slice(0,n),a=e.slice(n+1,o),i=e.slice(o+1);a==="i"||a==="f"?t[r]=+i:a==="Z"&&(t[r]=i)}}function re(e){let t={};for(let n of e)fr(n,t);return t}function Xe(e){let{SN:t,SO:n,SR:o}=e.tags;return typeof t=="string"&&typeof n=="number"&&typeof o=="number"?{refName:t,start:n,rank:o}:void 0}var jn=62,yr=60;function wr(e){let t=[],n="+",o=0;function r(a){a>o&&t.push({id:e.slice(o,a),strand:n})}for(let a=0;a<e.length;a++){let i=e.charCodeAt(a);(i===jn||i===yr)&&(r(a),n=i===jn?"+":"-",o=a+1)}return r(e.length),t}function Ue(e){let t={nodes:[],links:[],paths:[],walks:[],header:[],id:""};for(let n of e.split(`
2
+ `)){let o=n.endsWith("\r")?n.slice(0,-1):n;if(o.startsWith("H")){let[,...r]=o.split(" ");t.header.push(re(r))}else if(o.startsWith("S")){let[,r,...a]=o.split(" "),i,s,p,m=!1,y=a[0]??"*";/^\d+$/.test(y)?(i=+y,s=a[1]??"*",p=a.slice(2)):(m=!0,s=y,i=s==="*"?0:s.length,p=a.slice(1));let R=re(p);m&&"LN"in R&&(i=+R.LN),t.nodes.push({id:r,length:i,sequence:s,tags:R})}else if(o.startsWith("E")){let[,,r,a,,,,,i,...s]=o.split(" ");r&&a&&t.links.push({source:r.slice(0,-1),target:a.slice(0,-1),strand1:r.at(-1),strand2:a.at(-1),cigar:i??"*",tags:re(s)})}else if(o.startsWith("L")){let[,r,a,i,s,p,...m]=o.split(" ");r&&i&&s&&t.links.push({source:r,target:i,strand1:a,strand2:s,cigar:p??"*",tags:re(m)})}else if(o.startsWith("W")){let[,r,a,i,s,p,m,...y]=o.split(" ");r&&a&&i&&s&&p&&m&&t.walks.push({sample:r,haplotype:+a,contig:i,start:s==="*"?-1:+s,end:p==="*"?-1:+p,segments:wr(m),tags:re(y)})}else if(o.startsWith("P")){let[,r,a,...i]=o.split(" ");r&&a&&t.paths.push({name:r,path:a,rest:i})}}return t}function kr(e){let t=new Map,n=new Map;function o(a,i){t.has(a)||t.set(a,i)}function r(a,i){o(a,i),n.set(a,(n.get(a)??0)+1)}for(let a of e.links)o(a.source,a.strand1==="-"?"-":"+"),o(a.target,a.strand2==="-"?"-":"+");for(let a of e.paths)for(let i of a.path.split(","))r(i.slice(0,-1),i.endsWith("-")?"-":"+");for(let a of e.walks)for(let i of a.segments)r(i.id,i.strand==="-"?"-":"+");return{canonical:t,traversals:n}}function xr(e){return[...e.paths.map(t=>({...pe(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:t.start===-1?0:t.start,steps:t.segments.map(n=>({id:n.id,strand:n.strand==="-"?"-":"+"}))}))]}function Sr(e){let t=e.tags.SM;if(typeof t!="string")return;let n=t.split(",").map(o=>o.trim()).filter(Boolean);return n.length>0?n:void 0}var ae=e=>typeof e=="number"&&e>0?e:void 0;function Lr({tags:e,length:t}){let n=ae(e.RC)??ae(e.FC)??ae(e.KC);return ae(e.dp)??ae(e.DP)??(n!==void 0&&t>0?n/t:void 0)}function Rr(e,t,n){return{id:`${e.id}${t}`,name:e.id,length:e.length,depth:n,stable:Xe(e),samples:Sr(e)}}function zn(e,t="Imported GFA"){let n=[],o=[],{canonical:r,traversals:a}=kr(e),i=c=>`${c}${r.get(c)??"+"}`;for(let c of e.nodes){let b=Lr(c)??Math.max(a.get(c.id)??1,1);n.push(Rr(c,r.get(c.id)??"+",b))}for(let c of e.links)o.push({from:i(c.source),to:i(c.target),fromStrand:c.strand1==="-"?"-":"+",toStrand:c.strand2==="-"?"-":"+"});let s=[],p=new Map,m=(c,b)=>[c,b].sort().join("--");function y(c,b){for(let f=0;f<c.length-1;f++){let h=m(c[f],c[f+1]);p.has(h)||p.set(h,new Set),p.get(h).add(b)}}for(let c of e.paths){let b=c.path.split(",").map(f=>i(f.slice(0,-1)));s.push({name:c.name,nodeIds:b}),y(b,c.name)}for(let c of e.walks){let b=c.segments.map(h=>i(h.id)),f=`${c.sample}#${c.haplotype}#${c.contig}`;s.push({name:f,nodeIds:b,sample:c.sample,haplotype:c.haplotype,contig:c.contig}),y(b,f)}for(let c of o){let b=p.get(m(c.from,c.to));b&&b.size>0&&(c.pathIds=[...b])}let R=new Map(e.nodes.map(c=>[c.id,c.length])),l=e.paths.length>0||e.walks.length>0?Et(xr(e),c=>R.get(c)??0):void 0;return{name:t,nodes:n,edges:o,paths:s.length>0?s:void 0,anchorPaths:l?.anchorPaths,pathVisits:l?.pathVisits,anchoredBy:n.some(c=>c.stable)?"tags":void 0}}var Wn=w(B(),1),Yn=w(W(),1),Nr="rgb(60,65,72)";function Xn({start:e,end:t}){let o=`min(300, max(0, ((get(feature,'start')+get(feature,'end'))/2 - ${e}) / ${t-e} * 300))`;return`jexl:get(feature,'rank')>0 ? '${Nr}' : 'hsl(' + ${o} + ',70%,50%)'`}function Tr(e){return typeof e=="object"&&e!==null&&"id"in e&&Array.isArray(e.tracks)}function Un(e,t,n){for(let o of e)if(Tr(o)&&(t===void 0||o.id===t)){let a=o.tracks?.find(i=>i.configuration.trackId===n)?.displays[0];if(a)return a}}function Kn(e,t){let{color:n}=(0,Yn.getSnapshot)(e.configuration);(typeof n=="object"&&n!==null&&"value"in n?n.value:n)!==t&&(0,Wn.setConf)(e,"color",t)}function qn(e,t){let n=e.nodes.filter(h=>M(h)&&(t[h.id]?.length??0)>0);if(n.length<2)return t;let o=n.map(h=>{let k=t[h.id],u=k[Math.floor(k.length/2)];return{x:u.x,y:u.y,r:h.stable.start+h.length/2,w:h.length}}),r=o.reduce((h,k)=>h+k.w,0),a=o.reduce((h,k)=>h+k.x*k.w,0)/r,i=o.reduce((h,k)=>h+k.y*k.w,0)/r,s=o.reduce((h,k)=>h+k.r*k.w,0)/r,p=0,m=0;for(let h of o)p+=h.w*(h.x-a)*(h.r-s),m+=h.w*(h.y-i)*(h.r-s);let y=-Math.atan2(m,p),R=Math.cos(y),l=Math.sin(y),c={};for(let[h,k]of Object.entries(t))c[h]=k.map(u=>{let g=u.x-a,x=u.y-i;return{x:a+R*g-l*x,y:i+l*g+R*x}});let b=0,f=0;for(let h of e.nodes)if(!M(h))for(let k of c[h.id]??[])k.y>i?b++:f++;if(f>b)for(let h of Object.values(c))for(let k of h)k.y=2*i-k.y;return c}var Jn=30;function Mr(e,t){let{opts:n}=t,o=new Map(t.nodes.map(l=>[l.id,de(n,l.length)])),r=l=>o.get(l)??n.minimumNodeLength,a=e.nodes.filter(M).sort((l,c)=>l.stable.start-c.stable.start),i=new Map,s=0;for(let l of a)i.set(l.id,{x:s,y:0}),s+=r(l.id)+n.edgeLength;let p=me(e),m=new Map(a.map(l=>[l.id,0])),y=a.map(l=>l.id);for(let l of y){let c=i.get(l),b=m.get(l)+1;for(let f of p.get(l)??[])m.has(f)||(m.set(f,b),i.set(f,{x:c.x+r(l)/2,y:Jn*b}),y.push(f))}let R=0;for(let l of e.nodes)i.has(l.id)||i.set(l.id,{x:R++*s/e.nodes.length,y:Jn*3});return i}function Zn(e,t){let n=Mr(e,t);return t.nodes.map(o=>({...o,...n.get(o.id)}))}var Ke=new Set(["BedAdapter","BedTabixAdapter","BigBedAdapter","VcfAdapter","VcfTabixAdapter"]),Ar=/repeat|tandem|\bstr\b|vntr|trf|trgt|vamos|expansion|microsat/i;function eo(e,t){return t?e.find(o=>o.trackId===t):e.filter(o=>Ke.has(o.adapterType)).find(o=>Ar.test(`${o.trackId} ${o.name??""}`))}function ke(e,t){return typeof e.get=="function"?e.get(t):e[t]}var to=/^\w+=[^;]*(;\w+=[^;]*)*$/;function Gr(e){let t=ke(e,"name");if(!(typeof t!="string"||!to.test(t)))return Object.fromEntries(t.split(";").map(n=>{let o=n.indexOf("=");return[n.slice(0,o),n.slice(o+1)]}))}function we(e,t){let n=ke(e,t);return n!==void 0?n:ke(e,"INFO")?.[t]??Gr(e)?.[t]}var no=["RUS","MOTIFS","RU","motifs","motif","sequence","consensus"],Ir=["RUL","period","PERIOD","consensusSize","unit","unitLength"],Pr=["TRID","REPID","VARID","ID","name","id"];function xe(e,t){for(let n of t){let o=we(e,n),r=String((Array.isArray(o)?o[0]:o)??"").split(",")[0].trim();if(r!==""&&r!==".")return r}}var vr=/^[ACGTURYSWKMBDHVN]+$/i;function Br(e){let t=Number(xe(e,Ir));if(Number.isFinite(t)&&t>0)return Math.round(t);let n=xe(e,no);return n&&vr.test(n)?n.length:void 0}function Qn(e){return(Array.isArray(e)?e:String(e??"").split(",")).map(n=>{let o=n===""||n===null||n===void 0?NaN:Number(n);return Number.isFinite(o)?o:void 0})}function Vr(e){let t=ke(e,"samples"),n={};for(let[o,r]of Object.entries(t??{})){let a=Qn(r.SD),i=Qn(r.AL).flatMap((s,p)=>s!==void 0&&s>0?[a[p]===void 0?{bp:s}:{bp:s,spanningReads:a[p]}]:[]);i.length>0&&(n[o]=i)}return Object.keys(n).length>0?n:void 0}function oo(e){let t=[];for(let n of e){let o=we(n,"start"),r=we(n,"end"),a=Br(n);if(!(r>o)||a===void 0)continue;let i=we(n,"refName"),s=xe(n,no),p=xe(n,Pr);t.push({key:`${i}:${o}-${r}`,name:(p&&!to.test(p)?p:void 0)??(s&&s.length<=12?`(${s})n`:`${i}:${(o+1).toLocaleString()}-${r.toLocaleString()}`),refName:i,start:o,end:r,unit:a,motif:s,calls:Vr(n)})}return t.sort((n,o)=>n.start-o.start)}function ro(e,t){let n=e.paths?.find(m=>m.name===t);if(!n)return;let o=new Map(e.nodes.map(m=>[m.id,m])),r=new Map;e.edges.forEach((m,y)=>{r.set(`${m.from}>${m.to}`,y)});let a=new Set(n.nodeIds),i=new Set;for(let m=1;m<n.nodeIds.length;m++){let y=n.nodeIds[m-1],R=n.nodeIds[m],l=r.get(`${y}>${R}`)??r.get(`${R}>${y}`);l!==void 0&&i.add(l)}let s=m=>m.reduce((y,R)=>y+(o.get(R)?.length??0),0),p=e.referencePath?e.paths.find(m=>pe(m.name).name===e.referencePath):void 0;return{name:t,nodeIds:a,edgeIndexes:i,steps:n.nodeIds.length,bp:s(n.nodeIds),referenceBp:p&&p!==n?s(p.nodeIds):void 0}}function Se(e){return typeof e=="object"&&e!==null}function Fr(e){return Se(e)&&typeof e.get=="function"}function Cr(e){let t=Fr(e)?e.get("name"):Se(e)?e.name:void 0;return typeof t=="string"?t:void 0}function ao(e){let t;if(Se(e)&&Se(e.hoverPosition)){let{refName:n,coord:o,coord0:r,assemblyName:a}=e.hoverPosition;typeof n=="string"&&typeof o=="number"&&(t={refName:n,coord:typeof r=="number"?r:o-1,assemblyName:typeof a=="string"?a:void 0,featureName:Cr(e.hoverFeature)})}return t}function io(e,t){return(e.assemblyName===void 0||e.assemblyName===t.assemblyName)&&e.refName===t.refName&&e.coord>=t.start&&e.coord<t.end}function so({hover:e,nodes:t}){let n,o;for(let r of t)r.name===e.featureName?n=r.id:o===void 0&&M(r)&&e.coord>=r.stable.start&&e.coord<r.stable.start+r.length&&(o=r.id);return n??o??null}var qe=w(B(),1);function co(e){return typeof e=="object"&&e!==null}function Er(e){return co(e)&&e.type==="LinearGenomeView"&&typeof e.id=="string"&&typeof e.navToLocString=="function"&&Array.isArray(e.assemblyNames)}function ie(e){return e.flatMap(t=>co(t)&&Array.isArray(t.views)?[t,...t.views]:[t])}function Y({views:e,connectedViewId:t,assemblyName:n}){let o=ie(e).filter(a=>Er(a)).filter(a=>a.assemblyNames.includes(n));return o.find(a=>a.id===t)??(o.length===1?o[0]:void 0)}function po(e,t,n){n.catch(o=>{console.error(`[GraphGenomeView] ${t}`,o),e.notifyError?.(`${t}: ${o}`,o)})}var Hr=1e3;function Je(e,t=Hr){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 mo(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 lo({session:e,location:t,assembly:n,connectedViewId:o,tracks:r=[]}){let a=Y({views:e.views,connectedViewId:o,assemblyName:n}),i;return a?(po(e,`Could not show ${n} ${_(t)}`,Promise.resolve(a.navToLocString(he(t),n))),i=a.id):i=e.addView("LinearGenomeView",{displayName:`${n} \u2014 ${_(t)}`,init:{assembly:n,loc:he(t),tracks:r}}).id,i}function go({session:e,location:t,assembly:n,connectedViewId:o}){let r=Y({views:e.views,connectedViewId:o,assemblyName:n});return r?.addToHighlights?.({refName:t.refName,start:t.start,end:t.end,assemblyName:n}),r!==void 0}function uo(e,t){if(t===void 0)return[];let n=e.tracks.find(r=>(0,qe.readConfObject)(r,"trackId")===t),o=n?(0,qe.readConfObject)(n,"assemblyNames"):[];return Array.isArray(o)?o.filter(r=>typeof r=="string"):[]}function ho({session:e,contributors:t,trackId:n,graphTrackId:o}){let r=uo(e,o),a=uo(e,n),i=t.filter(m=>a.includes(m.sample)),s=i.length>=2?i:t,p={init:{views:s.map(m=>({assembly:m.sample,loc:he(m),...o!==void 0&&r.includes(m.sample)?{tracks:[o]}:{}})),tracks:n?s.slice(1).map(()=>[n]):[],collapseEmptyRows:!0}};e.launchView?po(e,"Could not open the synteny view",e.launchView("LinearSyntenyView",p)):e.addView("LinearSyntenyView",p)}var Le=w(B(),1),Or="FeatureTrack";function bo({session:e,assemblyName:t,first:n}){let o=[];for(let r of e.tracks){let a=(0,Le.readConfObject)(r,"type"),i=(0,Le.readConfObject)(r,"assemblyNames"),s=(0,Le.readConfObject)(r,"trackId");a===Or&&Array.isArray(i)&&i.includes(t)&&typeof s=="string"&&s!==n&&o.push(s)}return n?[n,...o]:o}var Re=w(B(),1),fo=w(St(),1),$r="SyntenyTrack";function yo(e,t){let n=new Set(t),o=[];for(let r of e.tracks){let a=(0,Re.readConfObject)(r,"type"),i=(0,Re.readConfObject)(r,"assemblyNames"),s=(0,Re.readConfObject)(r,"trackId");if(a===$r&&typeof s=="string"&&Array.isArray(i)){let p=i.filter(m=>n.has(m)).length;p>=2&&o.push({trackId:s,name:(0,fo.getTrackName)(r,e),coverage:p})}}return o.sort((r,a)=>a.coverage-r.coverage)}var D=w(B(),1),wo=w(St(),1);function Ze(e,t){return typeof t=="string"&&e.adapterTypes.has(t)&&e.getAdapterType(t).adapterCapabilities.includes("getSubgraph")}function ko(e){return Array.isArray(e)&&e.every(t=>typeof t=="string")}function _r(e){return typeof e=="object"&&e!==null&&"laneSelection"in e&&"hiddenLanes"in e}function Dr(e){let t=(0,D.readConfObject)(e,"assemblyNames"),n=ko(t)?t.slice(1):[];return n.length>0?n:void 0}function Qe(e){let t=(0,D.readConfObject)(e,"assemblyNames");return ko(t)?t[0]:void 0}function Ne(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 jr(e,t,n){let o=n?.tracks.find(r=>(0,D.readConfObject)(r.configuration,"trackId")===t)?.displays.find(_r);return o?o.laneSelection?.filter(r=>!o.hiddenLanes.includes(r)):Dr(e)}function et(e,t,n,o){return{trackId:t,name:(0,wo.getTrackName)(e,n),referenceAssembly:Qe(e),haplotypes:jr(e,t,o)}}function Te(e,t,n,o){let r=[];for(let a of t.tracks){let i=(0,D.readConfObject)(a,"assemblyNames"),s=(0,D.readConfObject)(a,"adapter"),p=(0,D.readConfObject)(a,"trackId");Array.isArray(i)&&i.includes(n)&&typeof p=="string"&&typeof s=="object"&&s!==null&&"type"in s&&Ze(e,s.type)&&r.push(et(a,p,t,o))}return r}var Wr=600,tt=160,Yr=340,xo=".segs.bed.gz";function Xr(e){if(typeof e.uri=="string")return e.uri;let n=e.segmentsLocation?.uri;return typeof n=="string"&&n.endsWith(xo)?n.slice(0,-xo.length):void 0}var z=40,So=1.4,Ur=1.6,Kr=150,qr=1;function Me(...e){}var X=5e6;function O(e){return e>=1e6?`${+(e/1e6).toFixed(1)} Mb`:`${Math.round(e/1e3)} kb`}var Jr=2e4,Zr=1e-6,Qr=100;function nt(e){return Math.max(Zr,Math.min(Qr,e))}function ot(e,t){return{scaleX:e,scaleY:t?1:e,pixelRows:t}}function Lo(e){return{minX:-e.translateX/e.scaleX,minY:-e.translateY/e.scaleY,maxX:(e.width-e.translateX)/e.scaleX,maxY:(e.canvasHeight-e.translateY)/e.scaleY}}function ea(e,t){let n=(e.maxX-e.minX)*t,o=(e.maxY-e.minY)*t;return{minX:e.minX-n,minY:e.minY-o,maxX:e.maxX+n,maxY:e.maxY+o}}function Ro(e,t,n){let o=t-e.h*n;return z-e.minY*n+Math.max(0,o)/2}function ta(e,t){return t.minX>=e.minX&&t.maxX<=e.maxX&&t.minY>=e.minY&&t.maxY<=e.maxY}var Ae=new WeakMap,na=4;function oa(e){let t=Ae.get(e);return t||(t=new Map,Ae.set(e,t)),t}function ra(e,t){let n=Ae.get(e);n&&e!==t&&Ae.set(t,n)}function aa(e,t,n){e.size>=na&&e.delete(e.keys().next().value),e.set(t,n)}function rt(){return d.types.compose("GraphGenomeView",No.BaseViewModel,(0,Ao.RenderLifecycleMixin)(),d.types.model({type:d.types.literal("GraphGenomeView"),layoutQuality:d.types.optional(d.types.number,2),linearLayout:d.types.optional(d.types.boolean,!1),layoutMode:d.types.optional(d.types.enumeration(Dt),"force"),colorScheme:d.types.optional(d.types.enumeration(Bt),"auto"),bubbleSpread:d.types.optional(d.types.enumeration(Mt),"auto"),nodeWidth:d.types.optional(d.types.enumeration(zt),"depth"),showBubbles:d.types.optional(d.types.boolean,!0),showDeletionEdges:d.types.optional(d.types.boolean,!1),showGenes:d.types.optional(d.types.boolean,!0),geneTrackId:d.types.optional(d.types.string,""),repeatTrackId:d.types.optional(d.types.string,""),repeatKey:d.types.optional(d.types.string,""),walkRowSamples:d.types.maybe(d.types.frozen()),highlightedPath:d.types.optional(d.types.string,""),referencePath:d.types.optional(d.types.string,""),showPerf:d.types.optional(d.types.boolean,!1),contigThickness:d.types.optional(d.types.number,6),connectorThickness:d.types.optional(d.types.number,2),darkMode:d.types.optional(d.types.boolean,!1),scale:d.types.optional(d.types.number,1),translateX:d.types.optional(d.types.number,0),translateY:d.types.optional(d.types.number,0),drawPaths:d.types.optional(d.types.boolean,!1),paneHeight:d.types.maybe(d.types.number),maxGraphNodes:d.types.optional(d.types.number,Jr),maxRegionBp:d.types.optional(d.types.number,X),loadedTrackId:d.types.optional(d.types.string,""),loadedRegion:d.types.maybe(d.types.frozen()),subgraphHaplotypes:d.types.maybe(d.types.frozen()),subgraphContext:d.types.optional(d.types.number,1),gfaLocation:d.types.maybe(d.types.frozen()),colorDomain:d.types.maybe(d.types.frozen()),connectedViewId:d.types.maybe(d.types.string),followLinearView:d.types.optional(d.types.boolean,!1),coarseCut:d.types.optional(d.types.boolean,!1)})).volatile(()=>({graph:void 0,layoutResult:void 0,indexBubbles:void 0,geneFeatures:void 0,repeatArrays:void 0,popStack:[],error:void 0,isLoading:!1,loadCanceled:!1,statusMessage:"",hoveredNode:null,hoveredEdge:null,selectedNode:null,viewportDirty:0,positionsVersion:0,geometryVersion:0,builtViewport:void 0,draggingNode:null,isPanning:!1,viewportOwner:"fit",followPaneHeight:void 0,followNote:void 0,followRecuts:0,viewportDirtyTimer:void 0,positionsDirtyFrame:0,lastFetchMs:void 0,lastLayoutMs:void 0,lastGeometryMs:void 0,lastGeometryStrokeCount:void 0})).views(e=>({get nodeById(){if(e.graph){let t=new Map;for(let n of e.graph.nodes)t.set(n.id,n);return t}},get nodeLengths(){let t=new Map;for(let n of e.graph?.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 showLoading(){return e.error===void 0&&(e.isLoading||(e.graph!==void 0||!!(e.loadedTrackId&&e.loadedRegion)||!!e.gfaLocation)&&e.lastGeometryStrokeCount===void 0)},get canRetryLoad(){return!!(e.loadedTrackId&&e.loadedRegion)||!!e.gfaLocation},get canCancelLoad(){return e.isLoading&&!e.layoutResult},get usesLayoutEngine(){return e.graph?jt(e.layoutMode,e.graph):!1},get canAnchorLayout(){return e.graph?.nodes.some(t=>t.stable?.rank===0)??!1},get anchorPaths(){return e.graph?.anchorPaths??[]},get pathLegend(){let t=e.graph?.paths;return e.drawPaths&&t&&Oe(t.length)?$e(t):[]},get walkChoices(){let t=e.graph?.paths;return t?.length?$e(t):[]},get walkHighlight(){return e.graph&&e.highlightedPath?ro(e.graph,e.highlightedPath):void 0},get effectiveDrawPaths(){return e.drawPaths&&Oe(e.graph?.paths?.length??0)},get activeReferencePath(){return e.graph?.referencePath},get preferredReferencePath(){return e.referencePath===""?e.loadedRegion?.assemblyName:e.referencePath},get rampDomain(){return e.colorDomain??e.loadedRegion},get effectiveColorScheme(){return e.colorScheme!=="auto"?e.colorScheme:e.graph?.anchoredBy?"reference-position":"uniform"},get nodePositions(){return e.layoutResult?.nodePositions},get rowLabels(){return e.layoutResult?.rowLabels??[]},get alleleDeletions(){return e.layoutResult?.alleleDeletions??[]},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?In(e.graph):[]}})).views(e=>({get bubbles(){return e.indexBubbles?.length?e.indexBubbles:e.derivedBubbles}})).views(e=>({get sourceAdapter(){let t=(0,T.getSession)(e).tracks.find(n=>n.trackId===e.loadedTrackId);return t?(0,j.readConfObject)(t,"adapter"):void 0},get assemblyTrackChoices(){let t=e.loadedRegion;return t?(0,T.getSession)(e).tracks.filter(n=>(0,j.readConfObject)(n,"assemblyNames").includes(t.assemblyName)).map(n=>({trackId:n.trackId,name:(0,j.readConfObject)(n,"name"),adapterType:(0,j.readConfObject)(n,"adapter").type})):[]}})).views(e=>({get geneTrackChoices(){return e.assemblyTrackChoices.filter(t=>Ye.has(t.adapterType))},get repeatTrackChoices(){return e.assemblyTrackChoices.filter(t=>Ke.has(t.adapterType))},get repeatChoices(){return e.repeatArrays??[]}})).views(e=>({get repeatTrack(){return eo(e.repeatTrackChoices,e.repeatTrackId)},get selectedRepeat(){return e.repeatChoices.find(t=>t.key===e.repeatKey)}})).views(e=>({get nodeNeighbors(){return e.graph?me(e.graph):void 0},get nodeInk(){let{contigThickness:t,nodeWidth:n,nodeById:o}=e,r=e.graph?Wt(e.graph):0;return{maxHalfWidthPx:Xt(t,n)/2,halfWidthPx:a=>{let i=o?.get(a);return i?Yt(i,t,n,r)/2:t/2}}},get deletions(){return e.graph&&e.layoutMode!=="walkrows"?Vt(e.graph):[]},get walkRowBars(){if(e.layoutMode!=="walkrows"||!e.graph)return;let t=e.selectedRepeat,n=t?Ee(e.graph,t,t.unit):Ee(e.graph,e.loadedRegion);if(!n)return;let o=e.walkRowSamples,r=o?n.rows.filter(a=>o.includes(a.sample)).sort((a,i)=>o.indexOf(a.sample)-o.indexOf(i.sample)||a.label.localeCompare(i.label)):n.rows;return{...n,rows:qt(r,t?.calls)}},get drawnRowLabels(){let t=this.walkRowBars;return t?[t.reference,...t.rows].map((n,o)=>({label:n.label,y:o*20})):e.rowLabels},get bubbleGlyphs(){return(e.layoutMode==="variants"?e.bubbles:[]).map(n=>({bubble:n,...ee(n)}))},get genePins(){Me(e.positionsVersion);let t=e.layoutResult?.nodePositions;return e.showGenes&&e.layoutMode!=="variants"&&e.layoutMode!=="walkrows"&&e.graph&&e.geneFeatures&&t?Dn(e.graph,e.geneFeatures,t):[]},get bubbleHalos(){Me(e.positionsVersion);let t=e.layoutResult?.nodePositions;if(!e.showBubbles||e.layoutMode==="variants"||e.layoutMode==="walkrows"||!e.graph||!t)return[];let n=new Map(e.walkChoices.map(o=>[o.name,o.label]));return Gn(e.graph,e.bubbles,t,o=>n.get(o)??o)},get referenceRamp(){return e.effectiveColorScheme==="reference-position"&&e.graph?Ut(e.graph,e.rampDomain):void 0},get assemblyNames(){let t=e.loadedRegion;return t?[t.assemblyName]:[]},get scaleX(){return ot(e.scale,e.pixelRows).scaleX},get scaleY(){return ot(e.scale,e.pixelRows).scaleY},get axisScale(){return ot(e.scale,e.pixelRows)},get layoutBounds(){let t;if(e.layoutResult){let n=1/0,o=1/0,r=-1/0,a=-1/0;for(let m of Object.values(e.layoutResult.nodePositions))for(let y of m)n=Math.min(n,y.x),o=Math.min(o,y.y),r=Math.max(r,y.x),a=Math.max(a,y.y);let i=e.layoutResult.referenceAxis&&e.popStack.length===0?e.loadedRegion:void 0;i&&i.end>i.start&&(n=i.start,r=i.end);let s=this.walkRowBars,p=s&&e.layoutResult.extent?$t(s):e.layoutResult.extent;p&&(r=Math.max(r,p.maxX),a=Math.max(a,p.maxY)),t={minX:n,minY:o,w:r-n,h:a-o}}return t},get canvasHeight(){if(e.viewportOwner==="follow"&&e.followPaneHeight!==void 0)return e.followPaneHeight;let t=this.layoutBounds,n=e.width-z*2,o=Math.max(tt,e.paneHeight??Wr);if(!t)return o;if(e.pixelRows){let r=e.layoutMode==="variants"?Yr:tt;return Math.min(o,Math.max(r,t.h+z*2))}return t.w>0&&n>0?Math.min(o,Math.max(tt,t.h*n/t.w+z*2)):o}})).views(e=>({get geneTrack(){return Hn(e.geneTrackChoices,e.geneTrackId)},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 hoverHighlight(){let t,n=e.loadedRegion,o=e.hoveredNode,r=e.nodeById,a=e.nodeNeighbors;if(n&&o!==null&&r&&a){let i=le({nodeId:o,nodeById:r,neighbors:a});i&&(t={refName:n.refName,assemblyName:n.assemblyName,...i})}return t}})).views(e=>({get contributingAssemblies(){let t=e.graph,n=t?Rt(t):[];return t?Jt(t,{maxGap:n.length>0?Tt(n):1/0}):[]}})).views(e=>({get assemblyResolver(){let{assemblyManager:t}=(0,T.getSession)(e),n=e.sourceAdapter?.assemblyNameToPanSN,o=new Map(Object.entries(n??{}).map(([a,i])=>[i,a])),r=a=>a!==void 0&&t.has(a)?t.get(a)?.name??a:void 0;return a=>r(o.get(a))??r(a)}})).views(e=>({get launchableAssemblies(){return Qt(mo(e.contributingAssemblies,e.loadedRegion),e.assemblyResolver)},get canHighlightInLinearView(){let t=e.loadedRegion;return t!==void 0&&Y({views:[...(0,T.getSession)(e).views],connectedViewId:e.connectedViewId,assemblyName:t.assemblyName})!==void 0},nodeLaunchTargets(t){let n=e.nodeById?.get(t),o=n?ge(n):void 0,r=o?Zt(e.assemblyResolver,o):void 0,a=e.loadedRegion,i=e.nodeById,s=e.nodeNeighbors,p=a&&i&&s?le({nodeId:t,nodeById:i,neighbors:s}):void 0,m=a&&p?{sample:a.assemblyName,haplotype:void 0,refName:a.refName,...p}:void 0;return{own:o&&r?{location:Je(o),assembly:r}:void 0,reference:a&&m?{location:Je(m),assembly:a.assemblyName}:void 0,highlight:a&&m?{location:m,assembly:a.assemblyName}:void 0}}})).views(e=>({get coarseAboveBpPerPx(){let n=e.sourceAdapter?.coarse?.aboveBpPerPx;return typeof n=="number"?n:void 0}})).views(e=>({get cutTier(){return e.coarseCut&&e.coarseAboveBpPerPx!==void 0?"coarse":"fine"}})).views(e=>({get regionCapBp(){return e.cutTier==="coarse"?1/0:e.maxRegionBp}})).views(e=>({get followState(){let t=e.loadedRegion,n=e.layoutResult;if(!e.followLinearView)return{active:!1,reason:void 0};if(!t||!e.loadedTrackId)return{active:!1,reason:"Only a graph cut from a track can follow a linear view"};if(e.sourceAdapter?.type==="GbzBaseSyntenyAdapter")return{active:!1,reason:"Not following: a GBZ cut takes seconds, too slow to redo per pan"};let o=Y({views:[...(0,T.getSession)(e).views],connectedViewId:e.connectedViewId,assemblyName:t.assemblyName});return vn(o)?!n||!o.initialized?{active:!1,reason:void 0}:n.referenceAxis?e.popStack.length>0?{active:!1,reason:"Not following while a bubble is open"}:o.dynamicBlocks.contentBlocks.some(r=>r.refName===t.refName&&r.reversed)?{active:!1,reason:"Not following: the linear view shows this region reversed"}:{active:!0,view:o}:{active:!1,reason:`Not following: x is not reference bp (${e.usesLayoutEngine?_t:He(e.layoutMode).label})`}:{active:!1,reason:`No linear view on ${t.assemblyName} to follow`}}})).views(e=>({get followTransform(){let t=e.followState;return t.active&&e.loadedRegion?Vn(t.view,e.loadedRegion):void 0}})).actions(e=>({setError(t){e.error=t,e.isLoading=!1},setStatusMessage(t){e.statusMessage=t},setFetchMs(t){e.lastFetchMs=t},setLayoutMs(t){e.lastLayoutMs=t},setGeometryMetrics(t,n,o){e.lastGeometryMs=t,e.lastGeometryStrokeCount=n,e.builtViewport=o,e.geometryVersion++},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 o=Ht(n,t);ra(n,o),e.graph=o}},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},setGeneTrackId(t){e.geneTrackId=t},setRepeatTrackId(t){e.repeatTrackId=t},setRepeatKey(t){e.repeatKey=t},setHighlightedPath(t){e.highlightedPath=t},setPaneHeight(t){e.paneHeight=t},setSubgraphContext(t){e.subgraphContext=t},setWalkRowSamples(t){e.walkRowSamples=t},setSubgraphHaplotypes(t){e.subgraphHaplotypes=t},setMaxRegionBp(t){e.maxRegionBp=t},pairWithLinearView(t){let n=e.connectedViewId;n!==void 0&&ie([...(0,T.getSession)(e).views]).some(r=>r.id===n)||(e.connectedViewId=t)},setHoveredNode(t){e.hoveredNode=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.hoveredEdge=null,e.selectedNode=null,e.draggingNode=null,e.isPanning=!1},showNodeDetails(t){let n=e.nodeById?.get(t),o=e.nodeById,r=e.nodeNeighbors;if(n&&o&&r){let a=(0,T.getSession)(e),i=e.loadedRegion,s=i?le({nodeId:t,nodeById:o,neighbors:r}):void 0;(0,T.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:ge(n)?.sample,contributingHaplotype:ge(n)?.haplotype,carriedBy:n.samples?.join(", "),...i&&s?{refName:i.refName,assemblyName:i.assemblyName,start:s.start,end:s.end}:{}}}))}},setTransform(t,n,o){let r=e.followState;e.viewportOwner==="follow"&&r.active?r.view.horizontalScroll(e.translateX-n):(e.viewportOwner="user",e.scale=nt(t),e.translateX=n),e.translateY=o},zoom(t,n,o){let r=e.followState;if(e.viewportOwner==="follow"&&r.active){r.view.zoomTo(r.view.bpPerPx/t,n);return}e.viewportOwner="user";let a=nt(e.scale*t),i=a/e.scale;e.scale=a,e.translateX=n-(n-e.translateX)*i,e.pixelRows||(e.translateY=o-(o-e.translateY)*i)},setViewportDirty(){e.viewportDirty++},setPositionsDirty(){e.positionsVersion++},zoomToFit(){let t=e.layoutBounds,n=e.width-z*2,o=e.canvasHeight-z*2;if(e.viewportOwner==="follow"){t&&o>0&&(e.translateY=Ro(t,o,e.scaleY));return}if(t&&n>0&&o>0&&(t.w>0||!e.pixelRows&&t.h>0)){let r=t.w>0?n/t.w:1/0,a=t.h>0?o/t.h:1/0,i=nt(e.pixelRows?r:Math.min(r,a));e.scale=i,e.translateX=z-t.minX*i+(n-t.w*i)/2,e.translateY=Ro(t,o,e.pixelRows?1:i)}},clearPerfMetrics(){e.lastFetchMs=void 0,e.lastLayoutMs=void 0,e.lastGeometryMs=void 0,e.lastGeometryStrokeCount=void 0,e.builtViewport=void 0}})).actions(e=>({setFollowLinearView(t){e.followLinearView=t},followTo(t,n){let o=e.viewportOwner!=="follow";o&&(e.followPaneHeight=e.canvasHeight,e.viewportOwner="follow"),e.scale=t,e.translateX=n,o&&e.zoomToFit()},stopFollowing(){e.viewportOwner==="follow"&&(e.followPaneHeight=void 0,e.layoutResult?.referenceAxis?e.viewportOwner="user":(e.viewportOwner="fit",e.zoomToFit()))}})).actions(e=>{function t(){clearTimeout(e.viewportDirtyTimer),e.viewportDirtyTimer=setTimeout(()=>{(0,d.isAlive)(e)&&e.setViewportDirty()},Kr)}function n(){cancelAnimationFrame(e.positionsDirtyFrame),e.positionsDirtyFrame=requestAnimationFrame(()=>{(0,d.isAlive)(e)&&e.setPositionsDirty()})}return{moveNode(o,r,a){let i=e.layoutResult?.nodePositions;if(i?.[o]){for(let s of i[o])s.x+=r,s.y+=a;n()}},scheduleViewportDirty:t}}).actions(e=>{let t;function n(u,g){let x=(0,T.getSession)(e),{rpcManager:L}=x,N="graph",S=u.nodes.some(M);return L.call(N,"GraphComputeLayout",{graph:{nodes:S?Zn(u,g):g.nodes,edges:u.edges},options:{quality:e.layoutQuality,linearLayout:e.linearLayout,...g.opts,...S?{rotateComponents:!1}:{}},signal:t?.signal,statusCallback:G=>{e.setStatusMessage((0,T.statusMessageText)(G)??"")}})}function o(u){let g=u.nodes.some(M);return`${e.layoutQuality}|${e.linearLayout}|${e.bubbleSpread}|${g}|${u.referencePath??""}`}function*r(u){let g=performance.now(),x=He(e.layoutMode).run(u,e.loadedRegion,e.viewportOwner==="follow"?e.layoutResult?.sampleRows:void 0);if(x)return{result:x,duration:performance.now()-g};let L=oa(u),N=o(u),S=L.get(N);if(S)return{result:S,duration:performance.now()-g};let G=At(e.bubbleSpread),I=Ft(u),{result:C,duration:q}=yield n(I.graph,Fe(I.graph,G)),$=Fe(u,G),P=new Map($.nodes.map(J=>[J.id,de($.opts,J.length)])),v=Ct(C.nodePositions,I.runs,J=>P.get(J)??0),E={...C,nodePositions:u.nodes.some(M)?qn(u,v):v};return aa(L,N,E),{result:E,duration:q}}let a=0;function*i(u){let g=++a,x=()=>e.graph===u&&g===a,L=t?.signal,N;try{N=yield*r(u)}catch(G){if(!x()||L?.aborted)return!1;throw G}let S=x();return S&&(e.layoutResult=N.result,e.setLayoutMs(N.duration)),S}function*s(u,g,x=!1){e.setStatusMessage("Parsing GFA");let L=Ue(u),N=Ot(zn(L,g),e.preferredReferencePath);if(N.nodes.length===0)throw new Error(`No graph segments in ${g}`);if(N.nodes.length>e.maxGraphNodes)throw new Error(`Graph too large to draw: ${N.nodes.length.toLocaleString()} nodes (limit ${e.maxGraphNodes.toLocaleString()}). Zoom in to a smaller region, or raise maxGraphNodes on this view.`);let S=x?e.selectedNode:null;e.graph=N,e.indexBubbles=void 0,e.geneFeatures=void 0,e.repeatArrays=void 0,e.popStack=[],e.clearInteractionState(),S!==null&&e.nodeById?.has(S)&&(e.selectedNode=S),e.setStatusMessage("Computing layout"),yield*i(N)}let p=0;function m(){let u=++p;return t?.abort(),t=new AbortController,e.loadCanceled=!1,{isLive:()=>u===p,signal:t.signal}}function y(){return e.loadedTrackId?(0,T.getSession)(e).tracks.find(u=>u.trackId===e.loadedTrackId):void 0}function*R(u,g,x){let L=Xr(u);if(!(u.type!=="RgfaTabixAdapter"||L===void 0||e.cutTier==="coarse"))try{let N=yield(0,T.getSession)(e).rpcManager.call("graph","CoreGetFeatures",{adapterConfig:{type:"MinigraphBubbleAdapter",uri:`${L}.bubbles.bed.gz`,baseUri:u.baseUri,assemblyNameToPanSN:u.assemblyNameToPanSN},regions:[g]});x()&&(e.indexBubbles=N.map(S=>({refName:g.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(N){console.warn("[GraphGenomeView] no bubble index for this graph",N)}}function*l(u,g,x){let L=(0,T.getSession)(e),N=u?L.tracks.find(S=>S.trackId===u):void 0;if(N)try{return yield L.rpcManager.call("graph","CoreGetFeatures",{adapterConfig:(0,j.readConfObject)(N,"adapter"),regions:[g]})}catch(S){console.warn(`[GraphGenomeView] no ${x} for this graph`,S);return}}function*c(u,g){let x=yield*l(e.geneTrack?.trackId,u,"genes");x&&g()&&(e.geneFeatures=$n(x))}function*b(u,g){let x=yield*l(e.repeatTrack?.trackId,u,"repeats");x&&g()&&(e.repeatArrays=oo(x))}function*f(u,g,x={}){let{isLive:L,signal:N}=m(),S=y(),G=g.end-g.start,I=(S&&Ne(Qe(S),g.assemblyName))??(G>e.regionCapBp?`Region too large (${O(G)}) \u2014 zoom in to view graph (max ${O(e.regionCapBp)})`:void 0);if(I!==void 0){e.graph=void 0,e.layoutResult=void 0,e.isLoading=!1,e.error=new Error(I);return}e.isLoading=!0,e.error=void 0,e.setStatusMessage("Fetching subgraph");try{let C=(0,T.getSession)(e),{rpcManager:q}=C,$="graph",P=performance.now(),v=yield q.call($,"GetSubgraph",{adapterConfig:u,region:g,opts:x,signal:N});if(!L())return;if(e.setFetchMs(performance.now()-P),!v)throw new Error("Adapter returned no GFA \u2014 region may be outside indexed data or the adapter does not implement getSubgraph");let E=_(g);if(yield*s(v,E,!0),!L())return;e.setStatusMessage("Reading annotations"),yield Promise.all([(0,d.flow)(R)(u,g,L),(0,d.flow)(c)(g,L),(0,d.flow)(b)(g,L)])}catch(C){L()&&(console.error("[GraphGenomeView.loadFromTabixSubgraph]",C),e.error=C)}finally{L()&&(e.isLoading=!1)}}function*h(){let u=e.loadedRegion,g=y();if(u&&e.loadedTrackId&&!g)e.error=new Error(`The track this graph was cut from, "${e.loadedTrackId}", is not in this session`);else if(g&&u){let x=e.cutTier==="coarse";yield*f((0,j.readConfObject)(g,"adapter"),u,{hops:x?0:e.subgraphContext,haplotypes:e.subgraphHaplotypes,tier:x?"coarse":void 0})}}function*k(u,g,x){let{isLive:L,signal:N}=m();e.loadedTrackId="",e.loadedRegion=x,e.coarseCut=!1,e.followLinearView=!1,e.isLoading=!0,e.error=void 0;try{let S=typeof g=="string"?g:yield g(N);L()&&(yield*s(S,u))}catch(S){L()&&(console.error("[GraphGenomeView.loadWholeGFA]",S),e.error=S)}finally{L()&&(e.isLoading=!1)}return L()}return{clearGraph(){t?.abort(),t=void 0,p++,a++,e.graph=void 0,e.layoutResult=void 0,e.loadedTrackId="",e.loadedRegion=void 0,e.coarseCut=!1,e.followNote=void 0,e.gfaLocation=void 0,e.indexBubbles=void 0,e.geneFeatures=void 0,e.repeatArrays=void 0,e.popStack=[],e.error=void 0,e.isLoading=!1,e.loadCanceled=!1,e.statusMessage="",e.clearInteractionState(),e.clearPerfMetrics()},cancelLoad(){e.canCancelLoad&&(t?.abort(),t=void 0,p++,a++,e.graph=void 0,e.isLoading=!1,e.statusMessage="",e.loadCanceled=!0)},loadGFA:(0,d.flow)(function*(u,g="Imported GFA"){yield*k(g,u)}),loadGFAFromLocation:(0,d.flow)(function*(u){e.setStatusMessage("Fetching GFA");let g=e.loadedRegion,x=yield*k("uri"in u?u.uri.split("/").pop()??"GFA":"GFA",L=>(0,Mo.openLocation)(u).readFile({encoding:"utf8",signal:L}),g);g&&x&&e.graph&&(yield*b(g,()=>e.loadedRegion===g))}),loadFromTabixSubgraph:(0,d.flow)(function*(u,g,x={}){e.loadedTrackId=x.trackId??"",e.loadedRegion=x.trackId?g:void 0,e.coarseCut=!1,yield*f(u,g,{hops:e.subgraphContext,haplotypes:e.subgraphHaplotypes})}),refetchIfNeeded:(0,d.flow)(function*(){e.graph||(yield*h())}),reloadSubgraph:(0,d.flow)(function*(){yield*h()}),reloadRepeats:(0,d.flow)(function*(){let u=e.loadedRegion,g=e.repeatTrack?.trackId;u&&(yield*b(u,()=>e.loadedRegion===u&&e.repeatTrack?.trackId===g))}),reloadGenes:(0,d.flow)(function*(){let u=e.loadedRegion,g=e.geneTrack?.trackId;u&&(yield*c(u,()=>e.loadedRegion===u&&e.geneTrack?.trackId===g))}),popBubble:(0,d.flow)(function*(u){let g=e.graph;if(!g)return;let x=Pn(g,ce(u));if(x.nodes.length===0){(0,T.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:L}=m();e.popStack=[...e.popStack,{graph:g,layoutMode:e.layoutMode,label:g.name,indexBubbles:e.indexBubbles}],e.indexBubbles=void 0;let N=`${Pt[ee(u).kind]} at ${u.refName}:${u.start.toLocaleString()}`;e.graph={...x,name:N},e.layoutMode==="variants"&&(e.layoutMode="force"),e.clearInteractionState(),e.viewportOwner="fit",e.isLoading=!0;try{(yield*i(e.graph))&&(e.isLoading=!1)}catch(S){L()&&(e.error=S,e.isLoading=!1)}}),unpopBubble:(0,d.flow)(function*(){let u=e.poppedFrom;if(u){e.popStack=e.popStack.slice(0,-1),e.graph=u.graph,e.layoutMode=u.layoutMode,e.indexBubbles=u.indexBubbles,e.clearInteractionState(),e.viewportOwner="fit",e.isLoading=!0;try{(yield*i(u.graph))&&(e.isLoading=!1)}catch(g){e.error=g,e.isLoading=!1}}}),recomputeLayout:(0,d.flow)(function*(){let u=e.graph;if(u){e.isLoading=!0,e.setStatusMessage("Computing layout");try{(yield*i(u))&&(e.isLoading=!1)}catch(g){console.error("[GraphGenomeView.recomputeLayout]",g),e.error=g,e.isLoading=!1}}})}}).actions(e=>({followSettle(){let t=e.followState,n=t.active?Fn(t.view):void 0;if(!n)return;let o=e.coarseAboveBpPerPx,r=o!==void 0&&n.bpPerPx>o?"coarse":"fine",a=r==="coarse"?1/0:e.maxRegionBp,i=n.end-n.start;e.followNote=i>a?`Holding the last cut: ${O(i)} is past the ${O(a)} a cut may span`:void 0,!(e.followNote!==void 0||r===e.cutTier&&En(e.loadedRegion,n))&&(e.coarseCut=r==="coarse",e.loadedRegion=Cn(n,a),e.followRecuts++,e.reloadSubgraph())}})).actions(e=>({startRenderingBackend(t){if(!e.autorunsInstalled){(0,d.addDisposer)(e,(0,A.autorun)(()=>{let o=e.rampDomain,r=e.loadedTrackId;if(o&&r&&e.effectiveColorScheme==="reference-position"){let a=(0,A.untracked)(()=>Un((0,T.getSession)(e).views,e.connectedViewId,r));a&&Kn(a,Xn(o))}})),(0,d.addDisposer)(e,(0,A.autorun)(()=>{e.layoutResult&&(0,A.untracked)(()=>e.viewportOwner==="fit")&&e.zoomToFit()})),(0,d.addDisposer)(e,(0,A.reaction)(()=>e.followState.active,o=>{o||e.stopFollowing()},{name:"GraphFollowActive"})),(0,d.addDisposer)(e,(0,A.reaction)(()=>e.followTransform,o=>{o&&e.followTo(o.scale,o.translateX)},{equals:(o,r)=>o?.scale===r?.scale&&o?.translateX===r?.translateX,fireImmediately:!0,name:"GraphFollowFrame"})),(0,d.addDisposer)(e,(0,A.reaction)(()=>{let o=e.followState;return o.active?o.view.coarseDynamicBlocks:void 0},o=>{o&&e.followSettle()},{fireImmediately:!0,name:"GraphFollowSettle"})),(0,d.addDisposer)(e,(0,A.autorun)(()=>{let o=ao((0,T.getSession)(e).hovered);(0,A.untracked)(()=>{let r=e.loadedRegion,a=e.graph;r&&a&&e.setHoveredNode(o&&io(o,r)?so({hover:o,nodes:a.nodes}):null)})})),(0,d.addDisposer)(e,(0,A.reaction)(()=>`${e.scale}-${e.translateX}-${e.translateY}`,()=>{e.setHoveredNode(null),e.setHoveredEdge(null)},{name:"GraphClearHoverOnViewportChange"}));let n=!0;(0,d.addDisposer)(e,(0,A.autorun)(()=>{let{scale:o}=e,r=Lo(e);if(n){n=!1;return}let a=(0,A.untracked)(()=>e.builtViewport);a?.scale===o&&ta(a.bounds,r)||e.scheduleViewportDirty()})),(0,d.addDisposer)(e,(0,A.autorun)(()=>{let o=e.currentRenderingBackend,r=e.hoveredNode,a=e.hoveredEdge,i=e.selectedNode;if(Me(e.geometryVersion),o){let s=new Map;i!==null&&s.set(i,Ur),r!==null&&r!==i&&s.set(r,So),o.setNodeHighlights(s),o.setEdgeHighlight(a,So),e.renderNow()}}))}e.attachRenderingBackend(t,()=>({upload:n=>{n.resize(e.width,e.canvasHeight);let o=e.nodeById;if(e.nodePositions&&e.graph&&o){Me(e.viewportDirty,e.positionsVersion);let r=performance.now(),a=(0,A.untracked)(()=>ea(Lo(e),qr)),i=Kt({nodePositions:e.nodePositions,graph:e.graph,nodeById:o,colorScheme:e.effectiveColorScheme,contigThickness:e.contigThickness,connectorThickness:e.connectorThickness,drawPaths:e.effectiveDrawPaths,nodeWidth:e.nodeWidth,highlight:e.walkHighlight,axis:(0,A.untracked)(()=>e.axisScale),linearLayout:e.linearLayout,viewportBounds:a,referenceRamp:e.referenceRamp,deletions:e.deletionEdgeIndexes,hiddenEdges:e.hiddenEdgeIndexes,version:e.positionsVersion});return n.uploadGeometry(i),e.setGeometryMetrics(performance.now()-r,i.nodeStrokes.length,{scale:(0,A.untracked)(()=>e.scale),bounds:a}),!0}return!1},render:n=>{if(!e.nodePositions)return!1;let o=(0,Go.getDpr)();return n.updateTransform({scaleX:e.scaleX*o,scaleY:e.scaleY*o,translateX:e.translateX*o,translateY:e.translateY*o,dpr:o}),n.render(e.darkMode?[.12,.12,.12,1]:[1,1,1,1]),!0}}))}})).actions(e=>({retryLoad(){e.loadedTrackId&&e.loadedRegion?e.reloadSubgraph():e.gfaLocation&&e.loadGFAFromLocation(e.gfaLocation)},afterAttach(){e.isDefaultViewport||(e.viewportOwner="user"),e.gfaLocation&&!e.graph&&e.loadGFAFromLocation(e.gfaLocation),e.refetchIfNeeded()}})).actions(e=>({showInLinearView(t){let n=(0,T.getSession)(e),o=t.assembly===e.loadedRegion?.assemblyName,r=lo({session:n,location:t.location,assembly:t.assembly,connectedViewId:e.connectedViewId,tracks:bo({session:n,assemblyName:t.assembly,first:e.loadedTrackId&&o?e.loadedTrackId:void 0})});o&&e.pairWithLinearView(r)},highlightInLinearView(t){go({session:(0,T.getSession)(e),location:t.location,assembly:t.assembly,connectedViewId:e.connectedViewId})},showSyntenyView(t){ho({session:(0,T.getSession)(e),contributors:e.launchableAssemblies,trackId:t,graphTrackId:e.loadedTrackId||void 0})}})).views(e=>({get syntenyLaunchTracks(){let t=e.launchableAssemblies.map(n=>n.sample);return t.length>=2?yo((0,T.getSession)(e),t):[]}})).views(e=>({menuItems(){let t=[];for(let n of en({contributors:e.launchableAssemblies,syntenyTracks:e.syntenyLaunchTracks,onShowLinear:o=>{e.showInLinearView(o)},onShowSynteny:o=>{e.showSyntenyView(o)}}))(0,To.pushLaunchViewMenuItem)(t,n);return t}}))}var ia=(0,vo.defineLaunchKeys)()({});function at(e){e.addViewType(()=>new Po.default({name:"GraphGenomeView",displayName:"Graph genome view",stateModel:rt(),launchKeys:ia,ReactComponent:(0,Io.lazy)(()=>import("./chunks/GraphGenomeView-TM7WYDLH.js"))}))}function it(e){e.addToExtensionPoint("LaunchView-GraphGenomeView",t=>{let{session:n,...o}=t;return n.addView("GraphGenomeView",o),t})}var Fo=w(fe(),1);var st=w(B(),1),Bo=w(W(),1);function dt(e){let{uri:t,baseUri:n,csi:o}=e;return typeof t=="string"?{...e,bubblesLocation:{uri:t,baseUri:n},index:{indexType:o?"CSI":"TBI",location:{uri:`${t}.${o?"csi":"tbi"}`,baseUri:n}}}:e}var sa=(0,st.ConfigurationSchema)("MinigraphBubbleAdapter",{bubblesLocation:{type:"fileLocation",defaultValue:{uri:"/path/to/graph.bb.bed.gz",locationType:"UriLocation"}},index:(0,st.ConfigurationSchema)("MinigraphBubbleIndex",{indexType:{model:Bo.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:dt}),Vo=sa;function ct(e){e.addAdapterType(()=>new Fo.default({name:"MinigraphBubbleAdapter",displayName:"Minigraph bubble BED adapter",normalizeSnapshot:dt,configSchema:Vo,adapterMetadata:{category:"Graph adapters"},getAdapterClass:()=>import("./chunks/MinigraphBubbleAdapter-A7SBF2XY.js").then(t=>t.default)}))}var $o=w(fe(),1);var Ie=w(B(),1),Ho=w(W(),1);function Co(e,t,n){return{indexType:n?"CSI":"TBI",location:{uri:`${e}.${n?"csi":"tbi"}`,baseUri:t}}}function Eo(e){let{uri:t,baseUri:n,csi:o}=e;return typeof t=="string"?{...e,segmentsLocation:{uri:`${t}.segs.bed.gz`,baseUri:n},segmentsIndex:Co(`${t}.segs.bed.gz`,n,o),linksLocation:{uri:`${t}.links.bed.gz`,baseUri:n},linksIndex:Co(`${t}.links.bed.gz`,n,o)}:e}function ut(e){let{coarse:t,baseUri:n}=e;return Eo(typeof t=="object"&&t!==null?{...e,coarse:Eo({baseUri:n,...t})}:e)}var Ge=(e,t)=>(0,Ie.ConfigurationSchema)(e,{indexType:{model:Ho.types.enumeration("IndexType",["TBI","CSI"]),type:"stringEnum",defaultValue:"TBI"},location:{type:"fileLocation",defaultValue:{uri:t,locationType:"UriLocation"}}}),da=(0,Ie.ConfigurationSchema)("RgfaTabixCoarseTier",{aboveBpPerPx:{type:"maybeNumber"},segmentsLocation:{type:"fileLocation",defaultValue:{uri:"/path/to/graph.tier.segs.bed.gz",locationType:"UriLocation"}},segmentsIndex:Ge("RgfaCoarseSegmentsIndex","/path/to/graph.tier.segs.bed.gz.tbi"),linksLocation:{type:"fileLocation",defaultValue:{uri:"/path/to/graph.tier.links.bed.gz",locationType:"UriLocation"}},linksIndex:Ge("RgfaCoarseLinksIndex","/path/to/graph.tier.links.bed.gz.tbi")}),ca=(0,Ie.ConfigurationSchema)("RgfaTabixAdapter",{segmentsLocation:{type:"fileLocation",defaultValue:{uri:"/path/to/graph.segs.bed.gz",locationType:"UriLocation"}},segmentsIndex:Ge("RgfaSegmentsIndex","/path/to/graph.segs.bed.gz.tbi"),linksLocation:{type:"fileLocation",defaultValue:{uri:"/path/to/graph.links.bed.gz",locationType:"UriLocation"}},linksIndex:Ge("RgfaLinksIndex","/path/to/graph.links.bed.gz.tbi"),assemblyNameToPanSN:{type:"frozen",defaultValue:{}},coarse:da},{explicitlyTyped:!0,preProcessSnapshot:ut}),Oo=ca;function pt(e){e.addAdapterType(()=>new $o.default({name:"RgfaTabixAdapter",displayName:"Indexed rGFA adapter",normalizeSnapshot:ut,configSchema:Oo,adapterCapabilities:["getSubgraph"],adapterMetadata:{category:"Graph adapters"},getAdapterClass:()=>import("./chunks/RgfaTabixAdapter-7ZGKJJYW.js").then(t=>t.default)}))}var Do=w(Z(),1),jo=w(ar(),1),lt=w(rr(),1),zo=w(sr(),1);function mt(e){return typeof e=="object"&&e!==null}function ua(e){let t;if(mt(e)){let{refName:n,start:o,end:r,assemblyName:a}=e;typeof n=="string"&&typeof o=="number"&&typeof r=="number"&&(t={refName:n,start:o,end:r,assemblyName:typeof a=="string"?a:void 0})}return t}function pa(e,t,n){let o=e.connectedViewId;return o===void 0||o===t||!n.has(o)}function ma(e,t){return e.assemblyName===void 0||t===void 0||t.includes(e.assemblyName)}function _o(e,t,n){let o=[],r=new Set(ie(e).map(a=>mt(a)?a.id:void 0));for(let a of e)if(mt(a)&&a.type==="GraphGenomeView"&&pa(a,t,r)){let i=ua(a.hoverHighlight);i&&ma(i,n)&&o.push({key:typeof a.id=="string"?a.id:"graph",region:i})}return o}var U=w(Q(),1),la=(0,zo.makeStyles)()(e=>({highlight:{height:"100%",position:"absolute",background:(0,jo.alpha)(e.palette.primary.main,.25),borderLeft:`2px solid ${e.palette.primary.main}`,borderRight:`2px solid ${e.palette.primary.main}`,pointerEvents:"none",zIndex:10}})),ga=(0,lt.observer)(function({model:t,region:n}){let{classes:o}=la(),r=t.getHighlightCoords(n);return r?(0,U.jsx)("div",{"data-testid":"graph-node-highlight",className:o.highlight,style:{left:r.left,width:r.width}}):null}),ha=(0,lt.observer)(function({model:t}){let{views:n}=(0,Do.getSession)(t);return(0,U.jsx)(U.Fragment,{children:_o([...n],t.id,t.assemblyNames).map(({key:o,region:r})=>(0,U.jsx)(ga,{model:t,region:r},`graph-hover-${o}`))})}),Wo=ha;var Yo=w(Q(),1),ba="LinearGenomeView-TracksContainerComponent";function gt(e){e.contributeToExtensionPoint(ba,({model:t})=>(0,Yo.jsx)(Wo,{model:t},"graphgenomeview-hover-highlight"))}var bt=w(B(),1),ht=w(Ve(),1),F=w(Z(),1);var Pe="Graph genome view (this region)";function Xo(e,t={start:0,end:1/0}){let n=Math.max(10,Math.floor((e.end-e.start)*.5));return{...e,start:Math.max(t.start,e.start-n),end:Math.min(t.end,e.end+n)}}function fa(e){return e.reduce((t,n)=>t&&t.end-t.start>=n.end-n.start?t:n,void 0)}function se(e){let t=fa(e);return t?{refName:t.refName,assemblyName:t.assemblyName,start:Math.max(0,Math.floor(t.start)),end:Math.floor(t.end)}:void 0}function Uo(e){let t=e.end-e.start;return t>X?`Region is ${O(t)} \u2014 zoom in or select a smaller range (max ${O(X)})`:void 0}function Ko({session:e,region:t,trackId:n,connectedViewId:o,haplotypes:r}){let a=t.end-t.start;a>X?e.notify(`Region too large (${O(a)}) \u2014 zoom in to open a graph view (max ${O(X)})`,"warning"):e.addView("GraphGenomeView",{displayName:`Graph \u2014 ${_(t)}`,loadedTrackId:n,loadedRegion:t,subgraphHaplotypes:r,connectedViewId:o,followLinearView:o!==void 0,...o===void 0?{}:{layoutMode:"auto"}})}function K({label:e,region:t,tracks:n,session:o,connectedViewId:r,navigate:a}){let i=[];if(t&&n.length>0){let s=Uo(t),p=m=>{let y=Ne(m.referenceAssembly,t.assemblyName)??s;return{disabled:y!==void 0,disabledHelpText:y,onClick:()=>{a?.(t),Ko({session:o,region:t,trackId:m.trackId,connectedViewId:r,haplotypes:m.haplotypes})}}};i=n.length===1?[{label:e,icon:te,...p(n[0])}]:[{label:e,icon:te,type:"subMenu",subMenu:n.map(m=>({label:m.name,...p(m)}))}]}return i}function ya(e){return e.name==="LinearBasicDisplay"}function qo(e,t){return Ze(e,(0,bt.getConf)(t,["adapter"]).type)}function Jo(e,t){return[et(e.configuration,(0,bt.getConf)(e,"trackId"),(0,F.getSession)(e),t)]}function ft(e){e.addToExtensionPoint("Core-extendPluggableElement",t=>(ya(t)&&t.extendStateModel(n=>n.extend(o=>{let r=o.trackMenuItems,a=o.contextMenuItems;return{views:{trackMenuItems(){let i=r(),s=(0,F.getContainingTrack)(o);if(qo(e,s)){let p=(0,F.getContainingView)(o);for(let m of K({label:Pe,region:se(p.dynamicBlocks.contentBlocks),tracks:Jo(s,p),session:(0,F.getSession)(o),connectedViewId:p.id}))(0,ht.pushLaunchViewMenuItem)(i,m)}return i},contextMenuItems(){let i=a(),s=o.contextMenuInfo,p=(0,F.getContainingTrack)(o);if(s){let m=(0,F.getContainingView)(o),y=m.displayedRegions[s.displayedRegionIndex],R=qo(e,p);if(y){let l=K({label:R?"Graph genome view (this segment)":"Graph genome view (this feature)",region:Xo({refName:y.refName,assemblyName:y.assemblyName,start:s.item.startBp,end:s.item.endBp},y),tracks:R?Jo(p,m):Te(e,(0,F.getSession)(o),y.assemblyName,m),session:(0,F.getSession)(o),connectedViewId:m.id,navigate:c=>{m.navTo(c)}});for(let c of l)(0,ht.pushLaunchViewMenuItem)(i,c)}}return i}}}})),t))}var Zo=w(Ve(),1),ve=w(Z(),1);var wa="Graph genome view (this selection)";function ka(e){return e.name==="LinearGenomeView"}function yt(e){e.addToExtensionPoint("Core-extendPluggableElement",t=>(ka(t)&&t.extendStateModel(n=>n.extend(o=>{let r=o.menuItems,a=o.rubberBandMenuItems;function i(){let s=o.assemblyNames[0];return s?Te(e,(0,ve.getSession)(o),s,o):[]}return{views:{menuItems(){let s=r();for(let p of K({label:Pe,region:se(o.dynamicBlocks.contentBlocks),tracks:i(),session:(0,ve.getSession)(o),connectedViewId:o.id}))(0,Zo.pushLaunchViewMenuItem)(s,p);return s},rubberBandMenuItems(){return[...a(),...K({label:wa,region:se(o.getSelectedRegions(o.leftOffset,o.rightOffset)),tracks:i(),session:(0,ve.getSession)(o),connectedViewId:o.id,navigate:s=>{o.navTo(s)}})]}}}})),t))}var Qo="GraphGenomeView";var er="3.1.0";var wt=class extends tr.default{constructor(){super(...arguments);this.name=Qo;this.version=er}install(n){at(n),it(n),ft(n),yt(n),gt(n),pt(n),ct(n),_e(n),De(n),n.addRpcMethod(()=>new oe(n)),n.addRpcMethod(()=>new ne(n))}configure(n){try{(0,nr.isAbstractMenuManager)(n.rootModel)&&n.rootModel.appendToSubMenu(["Add"],{label:"Graph genome view",icon:te,onClick:o=>{o.addView("GraphGenomeView",{})}})}catch(o){console.warn("[GraphGenomeView] could not add the Add menu entry",o)}}};export{wt as default};
3
3
  //# sourceMappingURL=jbrowse-plugin-graphgenomeviewer.esm.js.map