jbrowse-plugin-graphgenomeviewer 6.3.1 → 6.4.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 (64) hide show
  1. package/README.md +2 -2
  2. package/dist/chunks/AddTrackWorkflow-ANWIWCO6.js +2 -0
  3. package/dist/chunks/{AddTrackWorkflow-F5YBOJ3E.js.map → AddTrackWorkflow-ANWIWCO6.js.map} +1 -1
  4. package/dist/chunks/ChooseSamplesDialog-OYAB355I.js +2 -0
  5. package/dist/chunks/{ChooseSamplesDialog-KVTDIA4A.js.map → ChooseSamplesDialog-OYAB355I.js.map} +1 -1
  6. package/dist/chunks/ChooseWalksDialog-HJE4CAKU.js +2 -0
  7. package/dist/chunks/{ChooseWalksDialog-L6QKOT7M.js.map → ChooseWalksDialog-HJE4CAKU.js.map} +1 -1
  8. package/dist/chunks/{GraphGenomeView-VIKLXNQD.js → GraphGenomeView-ULQ6U5MK.js} +2 -2
  9. package/dist/chunks/{GraphGenomeView-VIKLXNQD.js.map → GraphGenomeView-ULQ6U5MK.js.map} +1 -1
  10. package/dist/chunks/GraphTrackSettingsDialog-O6IYVHNJ.js +4 -0
  11. package/dist/chunks/{GraphTrackSettingsDialog-MRMSH2FO.js.map → GraphTrackSettingsDialog-O6IYVHNJ.js.map} +1 -1
  12. package/dist/chunks/HighlightColorDialog-LXT72W7R.js +2 -0
  13. package/dist/chunks/{HighlightColorDialog-SABW5OMB.js.map → HighlightColorDialog-LXT72W7R.js.map} +1 -1
  14. package/dist/chunks/LinearGraphDisplay-KM5SOSQQ.js +2 -0
  15. package/dist/chunks/{LinearGraphDisplay-AHCKWNFJ.js.map → LinearGraphDisplay-KM5SOSQQ.js.map} +1 -1
  16. package/dist/chunks/TrackWarningsDialog-YL2UP35Z.js +2 -0
  17. package/dist/chunks/{TrackWarningsDialog-HPHM5S7U.js.map → TrackWarningsDialog-YL2UP35Z.js.map} +1 -1
  18. package/dist/chunks/chunk-64LZZURD.js +2 -0
  19. package/dist/chunks/chunk-64LZZURD.js.map +7 -0
  20. package/dist/chunks/chunk-7KFSWOWX.js +3 -0
  21. package/dist/chunks/chunk-7KFSWOWX.js.map +7 -0
  22. package/dist/chunks/chunk-AMD4KXQV.js +2 -0
  23. package/dist/chunks/chunk-AMD4KXQV.js.map +7 -0
  24. package/dist/chunks/chunk-GB7CF6Z2.js +2 -0
  25. package/dist/chunks/chunk-GB7CF6Z2.js.map +7 -0
  26. package/dist/chunks/chunk-GXQ7NYB3.js +2 -0
  27. package/dist/chunks/chunk-GXQ7NYB3.js.map +7 -0
  28. package/dist/chunks/chunk-NXZT63HN.js +2 -0
  29. package/dist/chunks/chunk-NXZT63HN.js.map +7 -0
  30. package/dist/chunks/chunk-PLV6SE4Y.js +2 -0
  31. package/dist/chunks/chunk-PLV6SE4Y.js.map +7 -0
  32. package/dist/chunks/chunk-X4DGSMS6.js +2 -0
  33. package/dist/chunks/{chunk-A6GKF63C.js.map → chunk-X4DGSMS6.js.map} +1 -1
  34. package/dist/chunks/renderSvg-J7L374ND.js +2 -0
  35. package/dist/chunks/renderSvg-J7L374ND.js.map +7 -0
  36. package/dist/jbrowse-plugin-graphgenomeviewer.esm.js +6 -6
  37. package/dist/jbrowse-plugin-graphgenomeviewer.esm.js.map +4 -4
  38. package/package.json +1 -1
  39. package/src/GraphGenomeView/components/PaneSvg.tsx +828 -0
  40. package/src/GraphGenomeView/components/ReferenceStripOverlay.tsx +23 -5
  41. package/src/GraphGenomeView/components/TubeMapOverlay.tsx +46 -35
  42. package/src/GraphGenomeView/model.test.ts +52 -0
  43. package/src/GraphGenomeView/pane/graphViews.ts +4 -0
  44. package/src/GraphGenomeView/pane/loadActions.ts +5 -2
  45. package/src/GraphGenomeView/pane/settingActions.ts +30 -12
  46. package/src/GraphGenomeView/viewModel.ts +16 -0
  47. package/src/LinearGraphDisplay/LinearGraphDisplay.test.ts +17 -0
  48. package/src/LinearGraphDisplay/model.ts +24 -1
  49. package/src/LinearGraphDisplay/renderSvg.tsx +27 -0
  50. package/src/version.ts +1 -1
  51. package/dist/chunks/AddTrackWorkflow-F5YBOJ3E.js +0 -2
  52. package/dist/chunks/ChooseSamplesDialog-KVTDIA4A.js +0 -2
  53. package/dist/chunks/ChooseWalksDialog-L6QKOT7M.js +0 -2
  54. package/dist/chunks/GraphTrackSettingsDialog-MRMSH2FO.js +0 -4
  55. package/dist/chunks/HighlightColorDialog-SABW5OMB.js +0 -2
  56. package/dist/chunks/LinearGraphDisplay-AHCKWNFJ.js +0 -2
  57. package/dist/chunks/TrackWarningsDialog-HPHM5S7U.js +0 -2
  58. package/dist/chunks/chunk-2SL675KP.js +0 -3
  59. package/dist/chunks/chunk-2SL675KP.js.map +0 -7
  60. package/dist/chunks/chunk-A6GKF63C.js +0 -2
  61. package/dist/chunks/chunk-B7KMMGFB.js +0 -2
  62. package/dist/chunks/chunk-B7KMMGFB.js.map +0 -7
  63. package/dist/chunks/chunk-TYJTJGPO.js +0 -2
  64. package/dist/chunks/chunk-TYJTJGPO.js.map +0 -7
@@ -0,0 +1,2 @@
1
+ import{A as B,G as ge,J as we,P as ye,b as fe,c as pe,d as de,g as be}from"./chunk-GB7CF6Z2.js";import{a as q}from"./chunk-WTOQRUK2.js";import{D as N,P as me,Q as he,a as y,c as ue}from"./chunk-B7GF3TC3.js";import{a as K,b as P,c as v,d as X,e as R,f as ne,g as A,j as z}from"./chunk-MYJYGSOH.js";import{a as V,c as le,d as j}from"./chunk-DILFGQIL.js";import{a as F}from"./chunk-64LZZURD.js";import{a as nt,b as H}from"./chunk-FY3BTKY4.js";var xe=nt((en,ve)=>{ve.exports=JBrowseExports["@mui/material/SvgIcon"]});var L=H(xe(),1);function ln(e){return P(e)?Me(e):void 0}function Me(e){return{sample:V(e.stable.refName),haplotype:le(e.stable.refName),refName:j(e.stable.refName),start:e.stable.start,end:e.stable.start+e.length}}function ot(e,o){let s=[...e].sort((t,i)=>t.start-i.start),r,n;for(let t of s)n=n&&t.start-n.end<=o?{start:n.start,end:Math.max(n.end,t.end)}:{start:t.start,end:t.end},(!r||n.end-n.start>r.end-r.start)&&(r=n);return r}function st(e){return`${e.haplotype??e.sample}\0${e.refName}`}function fn(e,{maxGap:o=1/0}={}){let s=new Map;for(let n of e.nodes)if(P(n)){let t=Me(n),i=st(t),c=s.get(i);c?(c.spans.push({start:t.start,end:t.end}),c.rank=Math.min(c.rank,n.stable.rank)):s.set(i,{sample:t.sample,haplotype:t.haplotype,refName:t.refName,rank:n.stable.rank,spans:[{start:t.start,end:t.end}]})}let r=new Map;for(let n of s.values()){let t=ot(n.spans,o);if(t){let i={sample:n.sample,haplotype:n.haplotype,refName:n.refName,start:t.start,end:t.end,rank:n.rank,nodeCount:n.spans.length},c=n.haplotype??n.sample,l=r.get(c);(!l||i.nodeCount>l.nodeCount)&&r.set(c,i)}}return[...r.values()].sort((n,t)=>+(n.rank!==0)-+(t.rank!==0)||n.sample.localeCompare(t.sample)||(n.haplotype??"").localeCompare(t.haplotype??""))}function rt(e,o){return(o.haplotype===void 0?void 0:e(o.haplotype))??e(o.sample)}function pn(e,o){return e.flatMap(s=>{let r=rt(o,s);return r===void 0?[]:[{...s,sample:r}]})}function dn(e){return`${e.refName}:${e.start+1}-${e.end}`}function oe(e){return`${e.refName}:${(e.start+1).toLocaleString()}-${e.end.toLocaleString()}`}var Le=H(F(),1),ke=(0,L.createSvgIcon)((0,Le.jsx)("path",{d:"M9.01 14H2v2h7.01v3L13 15l-3.99-4zm5.98-1v-3H22V8h-7.01V5L11 9z"}),"CompareArrows");var Ne=H(F(),1),Se=(0,L.createSvgIcon)((0,Ne.jsx)("path",{d:"M17 5h-2V3h2zm-2 16h2v-2.59L19.59 21 21 19.59 18.41 17H21v-2h-6zm4-12h2V7h-2zm0 4h2v-2h-2zm-8 8h2v-2h-2zM7 5h2V3H7zM3 17h2v-2H3zm2 4v-2H3c0 1.1.9 2 2 2M19 3v2h2c0-1.1-.9-2-2-2m-8 2h2V3h-2zM3 9h2V7H3zm4 12h2v-2H7zm-4-8h2v-2H3zm0-8h2V3c-1.1 0-2 .9-2 2"}),"HighlightAlt");var Ie=H(F(),1),se=(0,L.createSvgIcon)((0,Ie.jsx)("path",{d:"M3 16h5v-2H3zm6.5 0h5v-2h-5zm6.5 0h5v-2h-5zM3 20h2v-2H3zm4 0h2v-2H7zm4 0h2v-2h-2zm4 0h2v-2h-2zm4 0h2v-2h-2zM3 12h8v-2H3zm10 0h8v-2h-8zM3 4v4h18V4z"}),"LineStyle");var at="Linear genome view",it="Linear synteny view",ct="No synteny track in this session aligns these assemblies";function Oe({label:e,icon:o,entries:s,entryLabel:r,onSelect:n,disabledHelpText:t,nameTheOnlyEntry:i=!0}){let[c]=s,l=t?[{label:e,icon:o,disabled:!0,disabledHelpText:t,onClick:()=>{}}]:[];return s.length===0?l:s.length===1&&c?[{label:i?`${e} \u2014 ${r(c)}`:e,icon:o,onClick:n(c)}]:[{label:e,icon:o,type:"subMenu",subMenu:s.map(p=>({label:r(p),onClick:n(p)}))}]}function kn({contributors:e,syntenyTracks:o,onShowLinear:s,onShowSynteny:r}){let n=o[0]?.coverage??e.length;return[...Oe({label:at,icon:se,entries:e,entryLabel:t=>`${t.sample} ${oe(t)}`,onSelect:t=>()=>{s({location:t,assembly:t.sample})}}),...e.length>=2?Oe({label:`${it} (${n} assemblies)`,icon:ke,entries:o,entryLabel:t=>t.coverage<n?`${t.name} (${t.coverage} of ${n})`:t.name,nameTheOnlyEntry:!1,disabledHelpText:ct,onSelect:t=>()=>{r(t.trackId)}}):[]]}function Nn({own:e,reference:o,highlight:s,onShowLinear:r,onHighlight:n}){let t=[e?{label:`Open in ${e.assembly} \u2014 ${oe(e.location)}`,target:e}:void 0,o&&o.assembly!==e?.assembly?{label:`Open in ${o.assembly} \u2014 around this node`,target:o}:void 0].filter(i=>i!==void 0);return[...n&&s?[{label:`Highlight in ${s.assembly}`,icon:Se,onClick:()=>{n(s)}}]:[],...t.map(({label:i,target:c})=>({label:i,icon:se,onClick:()=>{r(c)}}))]}function J(e){let o=e.split("#"),s=o.length>=2?Number(o[1]):Number.NaN;return{sample:o[0]??e,haplotype:Number.isFinite(s)?s:void 0}}function lt(e,o,s,r){let n=[],t=[],i=[e];for(r.add(e);i.length>0;){let c=i.pop(),l=o.get(c);if(l){n.push(l);for(let p of s.get(c)??[]){let f=o.get(p);f&&(f.stable.rank===K?t.push(f):r.has(p)||(r.add(p),i.push(p)))}}}return{members:n,anchors:t}}function ft(e){if(new Set(e.map(c=>c.stable.refName)).size!==1||e.length<2)return;let s=[...e].sort((c,l)=>c.stable.start-l.stable.start),r=s[0],n=s.at(-1),t=r.stable.start+r.length,i=n.stable.start;return i>=t?{start:t,end:i,entry:r}:void 0}function pt(e,o,s){let r=new Map(e.map(i=>[i.id,i])),n=new Map,t=[];for(let i of s.get(o.id)??[])r.has(i)&&(n.set(i,0),t.push(i));if(t.length===0)for(let i of e)n.set(i.id,0),t.push(i.id);for(let i of t){let c=n.get(i)+r.get(i).length;for(let l of s.get(i)??[])if(r.has(l)){let p=n.get(l);(p===void 0||c<p)&&(n.set(l,c),t.push(l))}}return n}function dt(e,o,s){let r=pt(e,o,s),n=[...e].sort((l,p)=>r.get(l.id)-r.get(p.id)),t=new Map(n.map((l,p)=>[l.id,p])),i=new Map(e.map(l=>[l.id,l])),c=new Map;for(let[l,p]of n.entries()){let f=0;for(let a of s.get(p.id)??[]){let d=i.get(a);d&&t.get(a)<l&&(f=Math.max(f,c.get(a)+d.length))}c.set(p.id,f)}return{offsets:c,ordered:n}}function Re(e){let o=new Map(e.nodes.filter(P).map(t=>[t.id,t])),s=q(e),r=new Set,n=[];for(let t of o.values())if(t.stable.rank!==K&&!r.has(t.id)){let{members:i,anchors:c}=lt(t.id,o,s,r),l=ft(c);if(l){let{offsets:p,ordered:f}=dt(i,l.entry,s);n.push({start:l.start,refSpan:l.end-l.start,nodeIds:f.map(a=>a.id),nodeOffsets:f.map(a=>p.get(a.id)),pathLength:f.reduce((a,d)=>Math.max(a,p.get(d.id)+d.length),0)})}}return n.sort((t,i)=>t.start-i.start)}var ut=1,mt=.015;function Q({graph:e,span:o,rowY:s,positions:r}){let n=o*mt,t=Re(e),i=new Map(e.nodes.map(f=>[f.id,f])),c=[];for(let f of t){let a=f.refSpan-f.pathLength;a>=ut&&c.push({nodeIds:f.nodeIds,bp:a});let d=Math.max(f.refSpan,n),h=f.pathLength>0?d/f.pathLength:0;f.nodeIds.forEach((b,g)=>{let u=i.get(b);if(u){let m=f.nodeOffsets[g],w=d/f.nodeIds.length,I=_=>f.start+_*h,T=s(u);r[b]=h?[{x:I(m),y:T},{x:I(m+u.length),y:T}]:[{x:f.start+g*w,y:T},{x:f.start+(g+1)*w,y:T}]}})}let l=q(e),p=Object.keys(r);for(let f of p){let a=r[f].at(-1).x;for(let d of l.get(f)??[]){let h=i.get(d);if(h&&!(d in r)){let b=s(h);r[d]=[{x:a,y:b},{x:a+n,y:b}],p.push(d)}}}return c}function ht(e,o){let s=new Map;for(let n of e.nodes)if(X(n)){let{sample:t}=J(n.stable.refName);s.set(t,(s.get(t)??0)+n.length)}let r=new Map(o.map((n,t)=>[n,t]));return[...s.keys()].sort((n,t)=>(r.get(n)??1/0)-(r.get(t)??1/0)||s.get(t)-s.get(n)||n.localeCompare(t))}function Ae(e,o,s=[]){let r=R(e),n=ht(e,s);if(r.length===0||n.length===0)return;let t=z(r,o),i=new Map(n.map((d,h)=>[d,h+1])),c=A(r),l=n.length+1,p=Q({graph:e,span:t,rowY:d=>{let h=d.stable;return((h?i.get(J(h.refName).sample):void 0)??l)*y},positions:c}),a=[{label:J(r[0].stable.refName).sample,y:0},...n.map(d=>({label:d,y:i.get(d)*y}))];return{nodePositions:c,rowLabels:a,sampleRows:n,referenceAxis:!0,pixelRows:!0,alleleDeletions:p}}function bt(e){let o=new Map;for(let[s,r]of e.pathVisits??[])for(let n of r){let t=`${n.path} ${s}`,i=o.get(t);i?i.push(n.strand):o.set(t,[n.strand])}return o}function gt(e){let o=new Map(e.nodes.map(t=>[t.id,t])),s=bt(e),r=(e.paths??[]).map((t,i)=>({path:t,index:i})),n=r.findIndex(t=>N(t.path.name).name===e.referencePath);return n>0&&r.unshift(...r.splice(n,1)),r.flatMap(({path:t,index:i})=>{let c=N(t.name).name,l=new Map,p=t.nodeIds.flatMap(f=>{let a=o.get(f);if(!a)return[];let d=l.get(a.name)??0;l.set(a.name,d+1);let h=s.get(`${c} ${a.name}`)?.[d]??fe(a);return[pe(a,h)]});return p.length>0?[{id:i,name:t.name,sequence:p,sourceTrackID:0,type:"haplotype"}]:[]})}function wt(e){return e.nodes.map(o=>({name:o.id,seq:"",sequenceLength:Math.max(1,o.length)}))}function C(e){return(e.paths?.length??0)>0}var yt=600,vt=3,xt=15;function Mt(e){return Math.max(vt,Math.min(xt,Math.floor(yt/Math.max(1,e))))}function Ee(e){let o=e.paths??[],s=gt(e),r=e.reads?de(e,e.reads,o.length):[],n=r.length>0?he:me,t=o.map((c,l)=>n(l,o.length)),i=be(wt(e),s,r,{nodeWidthOption:"compressed",trackWidth:Mt(s.length)});return i?{layout:i,pathColors:t}:void 0}function re(e){let o=[];return e.nodes.forEach(s=>{s.order>=0&&o.push(s)}),o}function Te(e,o,s,r){let n=e.y+e.contentHeight/2-o;return[{x:s,y:n},{x:r,y:n}]}function _e(e,o){return{minY:e.bounds.minY-o,maxY:e.bounds.maxY-o}}function Pe(e){let o=C(e)?Ee(e):void 0;if(!o)return;let{layout:s,pathColors:r}=o,n=s.bounds.minY,t={};for(let l of re(s))t[l.name]=Te(l,n,l.x,l.x+l.pixelWidth);let{minY:i,maxY:c}=_e(s,n);return{nodePositions:t,tubeMap:{layout:s,yOffset:n,pathColors:r},extent:{minX:s.bounds.minX,maxX:s.bounds.maxX,minY:i,maxY:c}}}function Lt(e,o){let s=new Map(e.nodes.map(c=>[c.id,c])),r=new Map;for(let c of re(o)){let l=r.get(c.order);l?l.push(c):r.set(c.order,[c])}let n=[],t=-1/0;for(let c of[...r.keys()].sort((l,p)=>l-p)){let l=r.get(c),p=1/0,f=-1/0;for(let a of l){let d=s.get(a.name);d&&v(d)&&(p=Math.min(p,d.stable.start),f=Math.max(f,d.stable.start+a.sequenceLength))}p===1/0&&(p=f=t),p<t&&(p=t,f=Math.max(t,f)),t=Math.max(t,f),n.push({order:c,x0:Math.min(...l.map(a=>a.x)),x1:Math.max(...l.map(a=>a.x+a.pixelWidth)),bp0:p,bp1:f})}let i=n.find(c=>c.bp0!==-1/0);for(let c of n)c.bp0===-1/0&&(c.bp0=c.bp1=i?.bp0??0);return n}function kt(e){return e.nodes.some(v)&&C(e)}function Ce(e){let o=kt(e)?Ee(e):void 0;if(!o)return;let{layout:s,pathColors:r}=o,n=Lt(e,s),t=new Map(n.map(l=>[l.order,l])),i=s.bounds.minY,c={};for(let l of re(s)){let p=t.get(l.order);c[l.name]=Te(l,i,p.bp0,p.bp1)}return{nodePositions:c,tubeMap:{layout:s,yOffset:i,columns:n,pathColors:r},referenceAxis:!0,pixelRows:!0,extent:_e(s,i)}}function Nt(e){let o=new Set;for(let s of e.nodes)s.stable&&o.add(s.stable.rank);return new Map([...o].sort((s,r)=>s-r).map((s,r)=>[s,r]))}function We(e,o){let s=R(e);if(s.length===0)return;let r=z(s,o),n=Nt(e),t=A(s),i=Q({graph:e,span:r,rowY:l=>(l.stable?n.get(l.stable.rank)??n.size:n.size)*y,positions:t}),c=[...n].map(([l,p])=>({label:l===0?"Reference (rank 0)":`Rank ${l}`,y:p*y}));return{nodePositions:t,rowLabels:c,referenceAxis:!0,pixelRows:!0,alleleDeletions:i}}var St=12,ae=y;function Ge(e){return 10+8*Math.log2(1+e.length)}function S(e,o){return e<o?-1:e>o?1:0}function Xe(e,o){return S(e.at,o.at)||S(e.side,o.side)||S(e.hops,o.hops)}var He={at:1/0,side:0,hops:0};function It(e){let o=new Map(e.nodes.map(r=>[r.id,r])),s=At(e);return e.nodes.map(r=>r.id).sort((r,n)=>Xe(s.get(r)??He,s.get(n)??He)||S(o.get(r).name,o.get(n).name)||S(r,n))}function Ot(e,o){let s=new Set(e.nodes.map(f=>f.id)),r=new Map(o.map(f=>[f.id,f.stable.start])),n=new Map,t=new Map;o.forEach((f,a)=>{t.set(f.id,o[a-1]?.id),n.set(f.id,o[a+1]?.id)});let i=o[0]?.id,c=(f,a)=>{let d=n.get(f);n.set(f,a),t.set(a,f),n.set(a,d),d!==void 0&&t.set(d,a)},l=(f,a)=>{let d=t.get(f);d===void 0?(i=a,t.set(a,void 0),n.set(a,f),t.set(f,a)):c(d,a)};for(let f of e.paths??[]){let a=0,d=0,h;for(let m of f.nodeIds){let w=r.get(m);w!==void 0&&(h!==void 0&&w!==h&&(w>h?a++:d++),h=w)}let b=d>a?[...f.nodeIds].reverse():f.nodeIds,g,u=new Set;for(let m of b)if(n.has(m)){if(g===void 0)for(let w of u)l(m,w);g=m}else s.has(m)&&(g===void 0?u.add(m):(c(g,m),g=m))}let p=[];for(let f=i;f!==void 0;f=n.get(f))p.push(f);return p}function Rt(e,o){let s=[...o.entries()].sort(([i,c],[l,p])=>Xe(c,p)||S(i,l)).map(([i])=>i),r=s.length;for(let i of s){let c=o.get(i);for(let l of e.get(i)??[])o.has(l)||(o.set(l,{at:c.at,side:1,hops:c.hops+1}),s.push(l))}let n=new Set(s.slice(r)),t=new Set;for(let i of n){if(t.has(i))continue;let{at:c}=o.get(i),l=[i];t.add(i);let p=!0;for(let f of l){let{hops:a}=o.get(f),d=!0,h=!1;for(let b of e.get(f)??[]){let g=o.get(b);g.at===c&&n.has(b)?(d&&=g.hops<=a,t.has(b)||(t.add(b),l.push(b))):g.at!==c&&(h||=g.at<c,p&&=g.at<c)}p&&=!d||h}if(p)for(let f of l){let a=o.get(f);o.set(f,{...a,side:-1,hops:-a.hops})}}}function At(e){let o=new Set(e.nodes.map(t=>t.id)),s=new Map;for(let t of e.edges)!o.has(t.from)||!o.has(t.to)||((s.get(t.from)??s.set(t.from,[]).get(t.from)).push(t.to),(s.get(t.to)??s.set(t.to,[]).get(t.to)).push(t.from));let r=e.nodes.filter(v).sort((t,i)=>S(t.stable.start,i.stable.start)||S(t.name,i.name)),n=new Map;return Ot(e,r).forEach((t,i)=>{n.set(t,{at:i,side:0,hops:0})}),Rt(s,n),n}function Et(e){let o=new Map(e.nodes.map(a=>[a.id,a])),s=It(e),r=new Map(s.map((a,d)=>[a,d])),n=a=>v(o.get(a)),t=new Map(s.map(a=>[a,[]])),i=new Map(s.map(a=>[a,[]])),c=(a,d)=>{t.get(d).push(a),i.get(a).push(d)};for(let a of e.edges)a.from===a.to||!r.has(a.from)||!r.has(a.to)||(r.get(a.from)<r.get(a.to)?c(a.from,a.to):c(a.to,a.from));let l=s.filter(n);for(let a=1;a<l.length;a++)c(l[a-1],l[a]);let p=new Map;for(let a of s){let d=0;for(let h of t.get(a))d=Math.max(d,p.get(h)+1);p.set(a,d)}for(let a=s.length-1;a>=0;a--){let d=s[a],h=i.get(d);if(n(d)||h.length===0)continue;let b=1/0;for(let m of h)b=Math.min(b,p.get(m));let g=p.get(d),u=Math.max(g,b-1);p.set(d,Math.floor((g+u)/2))}let f=[];for(let a of s)(f[p.get(a)]??=[]).push(a);return{layers:f,layerOf:p,preds:t}}function ze(e){if(!e.nodes.some(v))return;let o=new Map(e.nodes.map(a=>[a.id,a])),s=a=>v(o.get(a)),{layers:r,layerOf:n,preds:t}=Et(e),i=r.map(a=>{let d=0;for(let h of a)d=Math.max(d,Ge(o.get(h)));return d}),c=[],l=0;for(let a=0;a<r.length;a++)c[a]=l,l+=i[a]+St;let p=new Map;for(let a of r){let d=[];for(let b of a){if(s(b)){p.set(b,0);continue}let g=t.get(b).filter(m=>p.has(m)),u=0;for(let m of g)u+=p.get(m)/g.length;d.push({id:b,ideal:u===0?ae:u})}d.sort((b,g)=>b.ideal-g.ideal);let h=new Set([0]);for(let{id:b,ideal:g}of d){let u=Math.round(g/ae);u===0&&(u=g>=0?1:-1);for(let m=1;h.has(u);m++)h.has(u+m)?h.has(u-m)||(u-=m):u+=m;h.add(u),p.set(b,u*ae)}}let f={};for(let a of e.nodes){let d=n.get(a.id),h=Ge(a),b=c[d]+i[d]/2,g=p.get(a.id);f[a.id]=[{x:b-h/2,y:g},{x:b+h/2,y:g}]}return{nodePositions:f,referenceAxis:!1,pixelRows:!0}}function Be(e){return e.sample??V(e.name)}function Tt(e){return e.haplotype!==void 0&&e.sample!==void 0?`${e.sample}#${e.haplotype}`:Be(e)}function _t(e,o){let s=[],r;for(let n of e){r!==void 0&&n.start!==void 0&&n.start>r&&s.push(n.start-r),s.push(...n.nodeIds);let t=n.nodeIds.reduce((i,c)=>i+(o.get(c)??0),0);r=n.start===void 0?void 0:n.start+t}return s}function Pt(e,o){let s=[],r;for(let n of e){if(n.start===void 0||r!==void 0&&n.start<r)return;r!==void 0&&n.start>r&&s.push({start:r,end:n.start});let t=n.start;for(let i of n.nodeIds){let c=o.get(i)??0;s.push({start:t,end:t+c}),t+=c}r=t}return s}function Ct(e,o,s,r=!0){if(!s||!r)return{ids:e,complete:!0,from:-1,to:-1};let n=-1,t=-1,i=-1/0,c=1/0;if(e.forEach((p,f)=>{let a=typeof p=="string"?o.get(p):void 0;a&&(a.end<=s.start&&a.end>i&&(i=a.end,n=f),a.start>=s.end&&a.start<c&&(c=a.start,t=f))}),n<0||t<0)return{ids:e,complete:!1,from:-1,to:-1};let l=e.slice(Math.min(n,t)+1,Math.max(n,t));return{ids:n<t?l:l.reverse(),complete:!0,from:n,to:t}}function Zn(e,o){return o?e.filter(s=>o.includes(s.sample)).sort((s,r)=>o.indexOf(s.sample)-o.indexOf(r.sample)||s.label.localeCompare(r.label)):e}function $e(e,o,s){let r=e.paths??[],n=u=>N(u.name).name===e.referencePath,t=r.some(n)?r.filter(n).sort((u,m)=>(u.start??0)-(m.start??0)):r.slice(0,1),i=t[0],c=r.filter(u=>!t.includes(u));if(!i||c.length===0)return;let l=new Map;for(let u of c)l.set(u.name,[...l.get(u.name)??[],u]);let p=new Map(e.nodes.map(u=>[u.id,u.length])),f=i.start??0,a=o&&o.end>o.start?o:void 0,d=new Map;for(let u of t){let m=u.start??0;for(let w of u.nodeIds){let I=p.get(w)??0;d.has(w)||d.set(w,{start:m,end:m+I}),m+=I}}let h=a===void 0||[...d.values()].some(u=>u.end<=a.start)&&[...d.values()].some(u=>u.start>=a.end),b=u=>{let m=u[0],w=[...u].sort((k,O)=>(k.start??0)-(O.start??0)),{ids:I,complete:T,from:_,to:Ze}=Ct(_t(w,p),d,a,h),Y=Pt(w,p),ee=m.contig??j(N(m.name).name),et=Y?.length?_<0?{contig:ee,start:Y[0].start,reversed:!1}:_<Ze?{contig:ee,start:Y[_].end,reversed:!1}:{contig:ee,start:Y[_].start,reversed:!0}:void 0,D=[],W=0,ie=0,ce=0,G=0;for(let k of I){if(typeof k=="number"){D.push({start:W,bp:k,onReference:!1,gap:!0}),W+=k,ce+=k,G=0;continue}let O=p.get(k)??0,x=d.get(k),M=D.at(-1),U=M?.referenceStart,te=x&&U!==void 0&&G>=0&&U+M.bp===x.start,tt=x&&U!==void 0&&G<=0&&x.end===U;!x&&M&&!M.onReference&&!M.gap?M.bp+=O:te||tt?(M.bp+=O,te||(M.referenceStart=x.start,M.reversed=!0),G=te?1:-1):(D.push({start:W,bp:O,onReference:x!==void 0,referenceStart:x?.start}),G=0),W+=O,x||(ie+=O)}return{name:m.name,label:Tt(m),sample:Be(m),haplotype:m.haplotype,bp:W,offReferenceBp:ie,gapBp:ce,complete:T,runs:D,axis:et}};return{origin:a?a.start:f,unit:s,reference:b(t),rows:[...l.values()].map(b).sort((u,m)=>Number(m.complete)-Number(u.complete)||m.bp-u.bp||u.label.localeCompare(m.label))}}var Wt=1.3;function Gt(e,o={rowPx:y,readouts:!0}){let s=e.reference.bp;for(let r of e.rows)s=Math.max(s,r.bp);return{maxX:e.origin+s*(o.readouts?Wt:1),maxY:e.rows.length*o.rowPx}}function so(e,o,s){return e?s&&!s.labelled?[]:[e.reference,...e.rows].map((r,n)=>({label:r.label,y:n*(s?.rowPx??y)})):o?.rowLabels??[]}function Ye(e,o){let s=R(e),r=$e(e,o);if(s.length===0||!r)return;let n=o?s.filter(c=>ne(c,o)):s,t=A(n.length>0?n:s),i=[{label:r.reference.label,y:0},...r.rows.map((c,l)=>({label:c.label,y:(l+1)*y}))];return{nodePositions:t,rowLabels:i,referenceAxis:!0,pixelRows:!0,extent:Gt(r)}}var Ve="Force-directed layout",E=e=>e.nodes.some(v),De=e=>E(e)&&(e.paths?.length??0)>1,Ue=e=>E(e)&&C(e),Fe=e=>E(e)&&e.nodes.some(X),Z=[{value:"auto",label:"Anchored",description:"x is reference bp, one row per stable rank. Needs rGFA tags or a reference path.",run:We,cutMargins:!0,wholeWalks:!1,available:E,drawsLocally:E,drawsNodes:!0},{value:"samplerows",label:"Sample rows",description:"x is reference bp, one row per contributing assembly. Needs rGFA tags or a reference path.",run:Ae,cutMargins:!0,wholeWalks:!1,available:Fe,drawsLocally:Fe,drawsNodes:!0},{value:"walkrows",label:"Walk rows",description:"x is each walk's own bp: one bar per haplotype, blue on the reference's path and purple off it, so a repeat expansion reads as bar length, and each bar boxes its haplotype's own genes where the session has them. Needs W or P lines.",run:Ye,cutMargins:!1,wholeWalks:!0,available:De,drawsLocally:De,drawsNodes:!1},{value:"ordered",label:"Ordered",description:"x is reference order, not bp: every node gets room, bubbles read as lenses. Needs rGFA tags or a reference path.",run:ze,cutMargins:!1,wholeWalks:!1,available:E,drawsLocally:E,drawsNodes:!0},{value:"tubemap",label:"Tube map",description:"sequenceTubeMap: every path a coloured tube through boxed nodes, columns in node order and node widths log-scaled. Needs P or W lines.",run:Pe,cutMargins:!1,wholeWalks:!1,available:C,drawsLocally:C,drawsNodes:!1},{value:"tubemapref",label:"Tube map on reference",description:"The tube map with each column at the reference bp it covers, so the tubes line up with the tracks around them. Needs P or W lines and a reference path.",run:Ce,cutMargins:!0,wholeWalks:!1,available:Ue,drawsLocally:Ue,drawsNodes:!1},{value:"force",label:Ve,description:"OGDF FMMM, via the external Bandage engine.",run:()=>{},cutMargins:!1,wholeWalks:!1,available:()=>!0,drawsLocally:()=>!1,drawsNodes:!0}],Ht=Z.map(e=>e.value);function Xt(e,o){return!je(e).drawsLocally(o)}function je(e){return Z.find(o=>o.value===e)??Z[0]}function zt(e){return e.walkStrip&&e.mode.drawsNodes&&!e.drawsPicture&&!e.popped&&!e.host&&e.walks>1}function Bt(e,o){return e.wholeWalks||o.walkStrip&&!o.host}var $=6,Je=260,$t=11,Yt=3,Dt=1.3,Ut="#111",Ke=3;function Ft(e,o,s){let r=e.pathVisits?.get(s.name)??[],n=[];for(let t of o){let i=t.axis;if(!i)continue;let c=N(t.name).name;for(let l of r){if(l.path!==c)continue;let{start:p,end:f}=ge(i,l.start,l.start+s.length);f>0&&p<t.bp&&n.push({row:t.name,start:p,bp:f-p})}}return n}var qe=new WeakMap;function Vt(e,o){let s=qe.get(e);if(s||(s=new Map,qe.set(e,s)),s.has(o))return s.get(o);let r=new Map(e.nodes.map(i=>[i.id,i.length])),n=(e.paths??[]).filter(i=>i.name===o),t;if(n.every(i=>i.start!==void 0)){t={ids:[],starts:[],ends:[]};for(let i of[...n].sort((c,l)=>c.start-l.start)){let c=i.start;for(let l of i.nodeIds){let p=r.get(l)??0;t.ids.push(l),t.starts.push(c),t.ends.push(c+p),c+=p}}}return s.set(o,t),t}function jt(e,o,s,r){let n=o.axis,t=n&&Vt(e,o.name);if(!n||!t||s<0||s>o.bp)return;let i=n.reversed?n.start-s:n.start+s,c=.5/r,l=n.reversed?{start:n.start-o.bp,end:n.start}:{start:n.start,end:n.start+o.bp},p=Math.max(i-c,l.start),f=Math.min(i+c,l.end),a=0,d=t.starts.length;for(;a<d;){let u=a+d>>1;t.ends[u]<=p?a=u+1:d=u}let h,b=-1,g=!1;for(let u=a;u<t.starts.length&&t.starts[u]<f;u++){let m=t.ends[u]-t.starts[u],w=t.starts[u]<=i&&i<t.ends[u];(m>b||m===b&&w&&!g)&&(b=m,h=t.ids[u],g=w)}return h}function Kt(e,o){let s=o.maxHeight??Je,r=o.labelPx??Math.max(...[e.reference,...e.rows].map(h=>h.label.length))*ue+16,n=e.rows.length+1,{rowPx:t,barPx:i,labelled:c,readouts:l}=ye(n,s-2*$,Yt),p=Math.max(e.reference.bp,...e.rows.map(h=>h.bp),1),f=c?r:$,d=Math.max(1,o.width-f-$)/(p*(l?Dt:1));return{scaleX:d,scaleY:1,translateX:f-e.origin*d,translateY:$+t/2,width:o.width,height:n*t+2*$,rowPx:t,barPx:i,readouts:l,labelled:c,boxesGenes:we(t,i)}}function qt(e,o,s,r){let n=Math.round((r-o.translateY)/o.rowPx),t=[e.reference,...e.rows][n],i=(s-o.translateX)/o.scaleX-e.origin;return t&&n>=0&&i>=0&&i<=t.bp?{index:n,row:t,offset:i}:void 0}function Jt(e,o,s){let r=new Map([e.reference,...e.rows].map((t,i)=>[t.name,i])),n=t=>(e.origin+t)*o.scaleX+o.translateX;return B("g",{"data-testid":"graph-walk-marks"},...s.flatMap(t=>{let i=r.get(t.row);if(i===void 0)return[];let c=i*o.rowPx+o.translateY,l=n(t.start),p=Math.max(2,t.bp*o.scaleX),f=a=>B("rect",{x:l,y:a,width:p,height:Ke,fill:Ut});return[f(c-o.barPx/2-Ke-1),f(c+o.barPx/2+1)]}))}function Qt(e,o,s=new Set){return B("g",{"font-family":"sans-serif","font-size":$t,fill:"#333"},...(o.labelled?[e.reference,...e.rows]:[]).map((r,n)=>B("text",{x:6,y:n*o.rowPx+o.translateY+4,"font-weight":s.has(r.name)?600:void 0},r.label)))}function Zt(e,o,s){if(o?.size)return e.boxesGenes?s:{untracked:0,unread:0,...s,crowded:!0}}var Qe=H(F(),1),fs=(0,L.createSvgIcon)((0,Qe.jsx)("path",{d:"M19.14 12.94c.04-.3.06-.61.06-.94 0-.32-.02-.64-.07-.94l2.03-1.58c.18-.14.23-.41.12-.61l-1.92-3.32c-.12-.22-.37-.29-.59-.22l-2.39.96c-.5-.38-1.03-.7-1.62-.94l-.36-2.54c-.04-.24-.24-.41-.48-.41h-3.84c-.24 0-.43.17-.47.41l-.36 2.54c-.59.24-1.13.57-1.62.94l-2.39-.96c-.22-.08-.47 0-.59.22L2.74 8.87c-.12.21-.08.47.12.61l2.03 1.58c-.05.3-.09.63-.09.94s.02.64.07.94l-2.03 1.58c-.18.14-.23.41-.12.61l1.92 3.32c.12.22.37.29.59.22l2.39-.96c.5.38 1.03.7 1.62.94l.36 2.54c.05.24.24.41.48.41h3.84c.24 0 .44-.17.47-.41l.36-2.54c.59-.24 1.13-.56 1.62-.94l2.39.96c.22.08.47 0 .59-.22l1.92-3.32c.12-.22.07-.47-.12-.61zM12 15.6c-1.98 0-3.6-1.62-3.6-3.6s1.62-3.6 3.6-3.6 3.6 1.62 3.6 3.6-1.62 3.6-3.6 3.6"}),"Settings");export{L as a,bt as b,It as c,Zn as d,$e as e,Gt as f,so as g,Z as h,Ht as i,Xt as j,je as k,zt as l,Bt as m,Ft as n,jt as o,Kt as p,qt as q,Jt as r,Qt as s,Zt as t,ln as u,fn as v,rt as w,pn as x,dn as y,oe as z,se as A,kn as B,Nn as C,fs as D};
2
+ //# sourceMappingURL=chunk-GXQ7NYB3.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["global-externals:@mui/material/SvgIcon", "../../node_modules/.pnpm/@mui+icons-material@9.4.0_@mui+material@9.4.0_@emotion+react@11.14.0_@types+react@19.3._3766ec55733e6b150ee672ad270cc236/node_modules/@mui/icons-material/utils/createSvgIcon.mjs", "../../src/launchFromGraph/contributors.ts", "../../node_modules/.pnpm/@mui+icons-material@9.4.0_@mui+material@9.4.0_@emotion+react@11.14.0_@types+react@19.3._3766ec55733e6b150ee672ad270cc236/node_modules/@mui/icons-material/CompareArrows.mjs", "../../node_modules/.pnpm/@mui+icons-material@9.4.0_@mui+material@9.4.0_@emotion+react@11.14.0_@types+react@19.3._3766ec55733e6b150ee672ad270cc236/node_modules/@mui/icons-material/HighlightAlt.mjs", "../../node_modules/.pnpm/@mui+icons-material@9.4.0_@mui+material@9.4.0_@emotion+react@11.14.0_@types+react@19.3._3766ec55733e6b150ee672ad270cc236/node_modules/@mui/icons-material/LineStyle.mjs", "../../src/launchFromGraph/graphMenuItems.ts", "../../node_modules/.pnpm/@jbrowse+bandage-core@8.0.1/node_modules/@jbrowse/bandage-core/dist/chunks/chunk-RVS2QCOX.js", "../../node_modules/.pnpm/@jbrowse+bandage-core@8.0.1/node_modules/@jbrowse/bandage-core/dist/chunks/chunk-TZFWUT2C.js", "../../node_modules/.pnpm/@jbrowse+bandage-core@8.0.1/node_modules/@jbrowse/bandage-core/dist/chunks/chunk-LOEA5IHZ.js", "../../node_modules/.pnpm/@jbrowse+bandage-core@8.0.1/node_modules/@jbrowse/bandage-core/dist/chunks/chunk-W2I4DOL4.js", "../../node_modules/.pnpm/@jbrowse+bandage-core@8.0.1/node_modules/@jbrowse/bandage-core/dist/chunks/chunk-L3O7AWLI.js", "../../node_modules/.pnpm/@jbrowse+bandage-core@8.0.1/node_modules/@jbrowse/bandage-core/dist/chunks/chunk-HNQPEMYE.js", "../../node_modules/.pnpm/@jbrowse+bandage-core@8.0.1/node_modules/@jbrowse/bandage-core/dist/chunks/chunk-SZNZ2T6D.js", "../../node_modules/.pnpm/@jbrowse+bandage-core@8.0.1/node_modules/@jbrowse/bandage-core/dist/chunks/chunk-MP7LXLWV.js", "../../node_modules/.pnpm/@jbrowse+bandage-core@8.0.1/node_modules/@jbrowse/bandage-core/dist/chunks/chunk-ZJQ6H3AR.js", "../../node_modules/.pnpm/@jbrowse+bandage-core@8.0.1/node_modules/@jbrowse/bandage-core/dist/chunks/chunk-O2ANJQVH.js", "../../node_modules/.pnpm/@mui+icons-material@9.4.0_@mui+material@9.4.0_@emotion+react@11.14.0_@types+react@19.3._3766ec55733e6b150ee672ad270cc236/node_modules/@mui/icons-material/Settings.mjs"],
4
+ "sourcesContent": ["module.exports = JBrowseExports[\"@mui/material/SvgIcon\"];", "'use client';\n\nexport { createSvgIcon as default } from '@mui/material/SvgIcon';", "import { isAnchored } from '@jbrowse/bandage-core/anchoredNodes'\nimport {\n panSNContig,\n panSNHaplotype,\n panSNSample,\n} from '@jbrowse/bandage-core/pansn'\n\nimport type { AnchoredNode } from '@jbrowse/bandage-core/anchoredNodes'\nimport type { Graph, GraphNode } from '@jbrowse/bandage-core/types'\n\nexport interface GraphLocation {\n // PanSN sample name off the node's own stable sequence. The assembly that\n // contributed the sequence, which is a *name*, not a resolved assembly \u2014 see\n // resolveContributors.\n sample: string\n // `sample#hap` where the stable name states a haplotype (HPRC release 2.1\n // names every node `NA20809#2#CM094351.1`), so a sample loaded as two\n // assemblies opens the right one; undefined where it states none\n haplotype: string | undefined\n refName: string\n start: number\n end: number\n}\n\n// Where a node's own sequence lives, in the coordinates of the assembly that\n// contributed it. rGFA states this on every segment: SN names the stable\n// sequence and SO the offset on it, so this is exact at every rank.\n//\n// It is the other question from nodeReferenceSpan, which asks where a node sits\n// on the *reference* axis and can only approximate that off the backbone. A\n// rank>0 node has an exact coordinate of its own; what it has no coordinate for\n// is the reference.\nexport function nodeOwnLocation(node: GraphNode): GraphLocation | undefined {\n return isAnchored(node) ? anchoredNodeLocation(node) : undefined\n}\n\nfunction anchoredNodeLocation(node: AnchoredNode): GraphLocation {\n return {\n sample: panSNSample(node.stable.refName),\n haplotype: panSNHaplotype(node.stable.refName),\n refName: panSNContig(node.stable.refName),\n start: node.stable.start,\n end: node.stable.start + node.length,\n }\n}\n\nexport interface Contributor extends GraphLocation {\n // lowest rank this assembly holds here: 0 means it is the reference backbone\n rank: number\n nodeCount: number\n}\n\ninterface Span {\n start: number\n end: number\n}\n\n// The widest run of spans with no gap larger than `maxGap`, which is the locus\n// this assembly contributes *here*. A bare union of every span would be wrong\n// on a graph where a sample also contributes sequence from a distant\n// duplication: the union then reads as a multi-megabase locus, and a linear view\n// launched at it shows neither end.\nfunction widestCluster(spans: Span[], maxGap: number) {\n const sorted = [...spans].sort((a, b) => a.start - b.start)\n let best: Span | undefined\n let current: Span | undefined\n for (const span of sorted) {\n current =\n current && span.start - current.end <= maxGap\n ? { start: current.start, end: Math.max(current.end, span.end) }\n : { start: span.start, end: span.end }\n if (!best || current.end - current.start > best.end - best.start) {\n best = current\n }\n }\n return best\n}\n\ninterface Group {\n sample: string\n haplotype: string | undefined\n refName: string\n rank: number\n spans: Span[]\n}\n\nfunction groupKey(loc: GraphLocation) {\n return `${loc.haplotype ?? loc.sample}\\u0000${loc.refName}`\n}\n\n// Every assembly with a segment in this graph, and the locus each one covers on\n// its own coordinates.\n//\n// This is what makes a launch out of the graph possible at all: the graph names\n// its contributors in the data (rGFA's SN tag), so a node, a row and the graph\n// as a whole can each say which assembly they belong to without consulting an\n// alignment.\n//\n// Ordered reference-first, then by name, so the row order matches\n// sampleRowLayout's and neither reshuffles as the window moves.\nexport function contributingAssemblies(\n graph: Graph,\n { maxGap = Infinity }: { maxGap?: number } = {},\n): Contributor[] {\n const groups = new Map<string, Group>()\n for (const node of graph.nodes) {\n if (isAnchored(node)) {\n const loc = anchoredNodeLocation(node)\n const key = groupKey(loc)\n const group = groups.get(key)\n if (group) {\n group.spans.push({ start: loc.start, end: loc.end })\n group.rank = Math.min(group.rank, node.stable.rank)\n } else {\n groups.set(key, {\n sample: loc.sample,\n haplotype: loc.haplotype,\n refName: loc.refName,\n rank: node.stable.rank,\n spans: [{ start: loc.start, end: loc.end }],\n })\n }\n }\n }\n\n // One entry per assembly (a haplotype where the names state one, else the\n // sample): an assembly contributing on several contigs is launched at the\n // contig it contributes most of, since a linear view opens on one region.\n const bySample = new Map<string, Contributor>()\n for (const group of groups.values()) {\n const span = widestCluster(group.spans, maxGap)\n if (span) {\n const candidate = {\n sample: group.sample,\n haplotype: group.haplotype,\n refName: group.refName,\n start: span.start,\n end: span.end,\n rank: group.rank,\n nodeCount: group.spans.length,\n }\n const key = group.haplotype ?? group.sample\n const existing = bySample.get(key)\n if (!existing || candidate.nodeCount > existing.nodeCount) {\n bySample.set(key, candidate)\n }\n }\n }\n\n // Reference first, then by name: the same order sampleRowLayout gives its\n // rows, so the menu lists the assemblies in the order they are stacked on\n // screen. Sorting by rank instead would order them by minigraph's build\n // order, which is not what the labels beside the drawing say.\n return [...bySample.values()].sort(\n (a, b) =>\n Number(a.rank !== 0) - Number(b.rank !== 0) ||\n a.sample.localeCompare(b.sample) ||\n (a.haplotype ?? '').localeCompare(b.haplotype ?? ''),\n )\n}\n\n// The assembly a location opens on: its haplotype's where the name states one\n// and the session holds it, else its sample's. A session holding both\n// haplotypes of a sample opens the right one; one holding a haplotype under\n// the bare sample name still opens it.\nexport function resolveLocationAssembly(\n resolve: (sample: string) => string | undefined,\n loc: Pick<GraphLocation, 'sample' | 'haplotype'>,\n) {\n const byHaplotype =\n loc.haplotype === undefined ? undefined : resolve(loc.haplotype)\n return byHaplotype ?? resolve(loc.sample)\n}\n\n// Contributors that name an assembly this session has loaded, which are the\n// only ones a linear or synteny view can open on.\n//\n// The two cases this filters apart are both normal. An E. coli pangenome demo\n// loads every strain as its own assembly, so every contributor resolves and the\n// whole graph is navigable. An HPRC graph names hundreds of haplotypes that no\n// session would ever load as assemblies, so only the reference resolves \u2014\n// there the reference projection (nodeReferenceSpan) is the way back to a\n// coordinate, not this.\n//\n// `resolve` is a name lookup rather than a list of names, because a PanSN sample\n// is the *graph's* spelling and need not be the assembly's. HPRC's graph writes\n// `CHM13`, and the assembly holding that sequence is UCSC's `hs1`, with CHM13\n// among its aliases; matching on names alone leaves that donor unopenable unless\n// the reader renames their assembly after the graph. The resolved (canonical)\n// name replaces the sample, so a launch opens the assembly the session knows.\nexport function resolveContributors(\n contributors: Contributor[],\n resolve: (sample: string) => string | undefined,\n) {\n return contributors.flatMap(c => {\n const sample = resolveLocationAssembly(resolve, c)\n return sample === undefined ? [] : [{ ...c, sample }]\n })\n}\n\n// 1-based inclusive, which is what a locstring means. Unformatted digits: this\n// is parsed, not read. locLabel is the one people read.\nexport function locString(loc: GraphLocation) {\n return `${loc.refName}:${loc.start + 1}-${loc.end}`\n}\n\nexport function locLabel(loc: { refName: string; start: number; end: number }) {\n return `${loc.refName}:${(loc.start + 1).toLocaleString()}-${loc.end.toLocaleString()}`\n}\n", "\"use client\";\n\nimport createSvgIcon from \"./utils/createSvgIcon.mjs\";\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nexport default createSvgIcon(/*#__PURE__*/_jsx(\"path\", {\n d: \"M9.01 14H2v2h7.01v3L13 15l-3.99-4zm5.98-1v-3H22V8h-7.01V5L11 9z\"\n}), 'CompareArrows');", "\"use client\";\n\nimport createSvgIcon from \"./utils/createSvgIcon.mjs\";\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nexport default createSvgIcon(/*#__PURE__*/_jsx(\"path\", {\n d: \"M17 5h-2V3h2zm-2 16h2v-2.59L19.59 21 21 19.59 18.41 17H21v-2h-6zm4-12h2V7h-2zm0 4h2v-2h-2zm-8 8h2v-2h-2zM7 5h2V3H7zM3 17h2v-2H3zm2 4v-2H3c0 1.1.9 2 2 2M19 3v2h2c0-1.1-.9-2-2-2m-8 2h2V3h-2zM3 9h2V7H3zm4 12h2v-2H7zm-4-8h2v-2H3zm0-8h2V3c-1.1 0-2 .9-2 2\"\n}), 'HighlightAlt');", "\"use client\";\n\nimport createSvgIcon from \"./utils/createSvgIcon.mjs\";\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nexport default createSvgIcon(/*#__PURE__*/_jsx(\"path\", {\n d: \"M3 16h5v-2H3zm6.5 0h5v-2h-5zm6.5 0h5v-2h-5zM3 20h2v-2H3zm4 0h2v-2H7zm4 0h2v-2h-2zm4 0h2v-2h-2zm4 0h2v-2h-2zM3 12h8v-2H3zm10 0h8v-2h-8zM3 4v4h18V4z\"\n}), 'LineStyle');", "import CompareArrowsIcon from '@mui/icons-material/CompareArrows'\nimport HighlightAltIcon from '@mui/icons-material/HighlightAlt'\nimport LineStyleIcon from '@mui/icons-material/LineStyle'\n\nimport { locLabel } from './contributors'\n\nimport type { Contributor, GraphLocation } from './contributors'\nimport type { LaunchableSyntenyTrack } from './syntenyTracks'\nimport type { MenuItem } from '@jbrowse/core/ui'\n\nconst LINEAR_LABEL = 'Linear genome view'\nconst SYNTENY_LABEL = 'Linear synteny view'\nconst NO_SYNTENY_TRACK =\n 'No synteny track in this session aligns these assemblies'\n\nexport interface LinearTarget {\n location: GraphLocation\n assembly: string\n}\n\n// One flat item when there is one thing to open, a submenu when there is a\n// choice. Same shape as subgraphMenuItems uses in the other direction, so the\n// two ends of the graph <-> linear trip read the same way.\nfunction oneOrMany<T>({\n label,\n icon,\n entries,\n entryLabel,\n onSelect,\n disabledHelpText,\n nameTheOnlyEntry = true,\n}: {\n label: string\n icon: React.ElementType\n entries: T[]\n entryLabel: (entry: T) => string\n onSelect: (entry: T) => () => void\n disabledHelpText?: string\n // Whether a lone entry's name is worth appending to the item. It is when the\n // entry is where you land (`GRCh38 chr6:31,980,000-32,050,000`) and not when\n // it is the ingredient used to get there \u2014 a synteny track's name says\n // nothing the item does not already say, and reading it costs the width of\n // `pggb graph: all-vs-all synteny (wfmash)`.\n nameTheOnlyEntry?: boolean\n}): MenuItem[] {\n const [first] = entries\n // Nothing to open: a *disabled* item with the reason in its tooltip, when\n // there is a reason worth reading. An item that vanishes teaches nobody that\n // the session is one synteny track short of a multi-genome view.\n const empty: MenuItem[] = disabledHelpText\n ? [{ label, icon, disabled: true, disabledHelpText, onClick: () => {} }]\n : []\n return entries.length === 0\n ? empty\n : entries.length === 1 && first\n ? [\n {\n label: nameTheOnlyEntry ? `${label} \u2014 ${entryLabel(first)}` : label,\n icon,\n onClick: onSelect(first),\n },\n ]\n : [\n {\n label,\n icon,\n type: 'subMenu',\n subMenu: entries.map(entry => ({\n label: entryLabel(entry),\n onClick: onSelect(entry),\n })),\n },\n ]\n}\n\n// The graph's way out: a linear view of any assembly the graph names here, and a\n// synteny view of all of them at once. Until this existed the triangle had two\n// edges \u2014 a linear view could open a graph or a synteny view of a locus, and the\n// graph could open nothing at all.\n//\n// `contributors` are already resolved against the session's assemblies. On an\n// E. coli pangenome every strain is its own assembly, so all of them appear and\n// the synteny item is the interesting one; on an HPRC graph the 400-odd\n// contributing haplotypes are not loaded assemblies and only the reference\n// appears, which is the honest answer rather than a missing feature.\nexport function graphLaunchMenuItems({\n contributors,\n syntenyTracks,\n onShowLinear,\n onShowSynteny,\n}: {\n contributors: Contributor[]\n syntenyTracks: LaunchableSyntenyTrack[]\n onShowLinear: (target: LinearTarget) => void\n onShowSynteny: (trackId: string) => void\n}): MenuItem[] {\n // sorted widest first\n const widest = syntenyTracks[0]?.coverage ?? contributors.length\n return [\n ...oneOrMany({\n label: LINEAR_LABEL,\n icon: LineStyleIcon,\n entries: contributors,\n entryLabel: c => `${c.sample} ${locLabel(c)}`,\n onSelect: c => () => {\n onShowLinear({ location: c, assembly: c.sample })\n },\n }),\n ...(contributors.length >= 2\n ? oneOrMany({\n // the count the launch opens, which is what the widest track aligns\n // and not always every contributor; see launchSyntenyView\n label: `${SYNTENY_LABEL} (${widest} assemblies)`,\n icon: CompareArrowsIcon,\n entries: syntenyTracks,\n entryLabel: track =>\n track.coverage < widest\n ? `${track.name} (${track.coverage} of ${widest})`\n : track.name,\n nameTheOnlyEntry: false,\n disabledHelpText: NO_SYNTENY_TRACK,\n onSelect: track => () => {\n onShowSynteny(track.trackId)\n },\n })\n : []),\n ]\n}\n\n// A single node's way out, for the node context menu. Two different questions,\n// both worth offering:\n//\n// - the node's own coordinates, on the assembly that contributed it. Exact,\n// from the node's SN/SO, and available at every rank \u2014 but only openable\n// when that assembly is loaded, which for an HPRC haplotype it is not.\n// - where the node sits on the reference the graph was cut against. Always\n// openable, and off the backbone it is the flanking projection rather than\n// an exact span (see nodeReferenceSpan), so it is labelled as the region\n// around the node rather than as the node.\n//\n// Labels are verbs. Review: \"the lineargenomeview menu item should say launch\n// if that is what it does\" \u2014 a bare `Linear genome view \u2014 hg38 chr6:\u2026` names a\n// place and leaves the reader to guess whether clicking scrolls the view beside\n// the graph or opens a new one. It does the first when there is one to scroll\n// (see showInLinearView), so \"Open in\" covers both without claiming a launch.\n//\n// Verb, assembly, and where \u2014 nothing else. Every word here is read inside a\n// menu opened on a node, so \"this node in the hg38 view\" and \"in linear view\"\n// restate the context they are already in; what a coordinate opens in is not in\n// question, and the assembly name is.\n//\n// Flat, not under a \"Launch view\" submenu: this menu is a handful of items and\n// every one is contextual to the node just clicked.\nexport function nodeLaunchMenuItems({\n own,\n reference,\n highlight,\n onShowLinear,\n onHighlight,\n}: {\n own: LinearTarget | undefined\n reference: LinearTarget | undefined\n // the node's exact reference span, where `reference` is padded to open on\n highlight: LinearTarget | undefined\n onShowLinear: (target: LinearTarget) => void\n // absent when no linear view in the session is this graph's to mark\n onHighlight?: (target: LinearTarget) => void\n}): MenuItem[] {\n const entries = [\n own\n ? {\n label: `Open in ${own.assembly} \u2014 ${locLabel(own.location)}`,\n target: own,\n }\n : undefined,\n // Only when it says something the item above doesn't. A backbone segment on\n // a loaded reference answers both questions with the same assembly and\n // nearly the same span, and offering that twice reads as two different\n // places to go.\n reference && reference.assembly !== own?.assembly\n ? {\n label: `Open in ${reference.assembly} \u2014 around this node`,\n target: reference,\n }\n : undefined,\n ].filter(entry => entry !== undefined)\n\n // The reference projection, not the node's own coordinates: a highlight is\n // drawn in the linear view already on screen, and that view is on the\n // reference the subgraph was cut from.\n return [\n ...(onHighlight && highlight\n ? [\n {\n label: `Highlight in ${highlight.assembly}`,\n icon: HighlightAltIcon,\n onClick: () => {\n onHighlight(highlight)\n },\n },\n ]\n : []),\n ...entries.map(({ label, target }) => ({\n label,\n icon: LineStyleIcon,\n onClick: () => {\n onShowLinear(target)\n },\n })),\n ]\n}\n", "import {\n buildNeighbors\n} from \"./chunk-ES2N6V56.js\";\nimport {\n REFERENCE_RANK,\n isAnchored\n} from \"./chunk-FYQWPEEY.js\";\n\n// src/alleleProjection/projectAlleles.ts\nfunction parsePanSN(refName) {\n const parts = refName.split(\"#\");\n const haplotype = parts.length >= 2 ? Number(parts[1]) : Number.NaN;\n return {\n sample: parts[0] ?? refName,\n haplotype: Number.isFinite(haplotype) ? haplotype : void 0\n };\n}\nfunction collectRun(seed, byId, adj, claimed) {\n const members = [];\n const anchors = [];\n const queue = [seed];\n claimed.add(seed);\n while (queue.length > 0) {\n const id = queue.pop();\n const node = byId.get(id);\n if (node) {\n members.push(node);\n for (const neighborId of adj.get(id) ?? []) {\n const neighbor = byId.get(neighborId);\n if (neighbor) {\n if (neighbor.stable.rank === REFERENCE_RANK) {\n anchors.push(neighbor);\n } else if (!claimed.has(neighborId)) {\n claimed.add(neighborId);\n queue.push(neighborId);\n }\n }\n }\n }\n }\n return { members, anchors };\n}\nfunction anchorSpan(anchors) {\n const refNames = new Set(anchors.map((a) => a.stable.refName));\n if (refNames.size !== 1 || anchors.length < 2) {\n return void 0;\n }\n const sorted = [...anchors].sort((a, b) => a.stable.start - b.stable.start);\n const first = sorted[0];\n const last = sorted.at(-1);\n const start = first.stable.start + first.length;\n const end = last.stable.start;\n return end >= start ? { start, end, entry: first } : void 0;\n}\nfunction runDistances(members, entry, adj) {\n const byId = new Map(members.map((m) => [m.id, m]));\n const dist = /* @__PURE__ */ new Map();\n const queue = [];\n for (const neighborId of adj.get(entry.id) ?? []) {\n if (byId.has(neighborId)) {\n dist.set(neighborId, 0);\n queue.push(neighborId);\n }\n }\n if (queue.length === 0) {\n for (const member of members) {\n dist.set(member.id, 0);\n queue.push(member.id);\n }\n }\n for (const id of queue) {\n const reach = dist.get(id) + byId.get(id).length;\n for (const neighborId of adj.get(id) ?? []) {\n if (byId.has(neighborId)) {\n const known = dist.get(neighborId);\n if (known === void 0 || reach < known) {\n dist.set(neighborId, reach);\n queue.push(neighborId);\n }\n }\n }\n }\n return dist;\n}\nfunction runOffsets(members, entry, adj) {\n const dist = runDistances(members, entry, adj);\n const ordered = [...members].sort((a, b) => dist.get(a.id) - dist.get(b.id));\n const rank = new Map(ordered.map((m, i) => [m.id, i]));\n const byId = new Map(members.map((m) => [m.id, m]));\n const offsets = /* @__PURE__ */ new Map();\n for (const [i, member] of ordered.entries()) {\n let offset = 0;\n for (const neighborId of adj.get(member.id) ?? []) {\n const neighbor = byId.get(neighborId);\n if (neighbor && rank.get(neighborId) < i) {\n offset = Math.max(offset, offsets.get(neighborId) + neighbor.length);\n }\n }\n offsets.set(member.id, offset);\n }\n return { offsets, ordered };\n}\nfunction projectAlleles(graph) {\n const byId = new Map(\n graph.nodes.filter(isAnchored).map((n) => [n.id, n])\n );\n const adj = buildNeighbors(graph);\n const claimed = /* @__PURE__ */ new Set();\n const alleles = [];\n for (const node of byId.values()) {\n if (node.stable.rank !== REFERENCE_RANK && !claimed.has(node.id)) {\n const { members, anchors } = collectRun(node.id, byId, adj, claimed);\n const span = anchorSpan(anchors);\n if (span) {\n const { offsets, ordered } = runOffsets(members, span.entry, adj);\n alleles.push({\n start: span.start,\n refSpan: span.end - span.start,\n nodeIds: ordered.map((m) => m.id),\n nodeOffsets: ordered.map((m) => offsets.get(m.id)),\n pathLength: ordered.reduce(\n (max, m) => Math.max(max, offsets.get(m.id) + m.length),\n 0\n )\n });\n }\n }\n }\n return alleles.sort((a, b) => a.start - b.start);\n}\n\nexport {\n parsePanSN,\n projectAlleles\n};\n", "import {\n projectAlleles\n} from \"./chunk-RVS2QCOX.js\";\nimport {\n buildNeighbors\n} from \"./chunk-ES2N6V56.js\";\n\n// src/layout/placeOffReference.ts\nvar MIN_DELETION_BP = 1;\nvar MIN_ALLELE_SPAN_FRACTION = 0.015;\nfunction placeOffReference({\n graph,\n span,\n rowY,\n positions\n}) {\n const minSpan = span * MIN_ALLELE_SPAN_FRACTION;\n const alleles = projectAlleles(graph);\n const byId = new Map(graph.nodes.map((n) => [n.id, n]));\n const alleleDeletions = [];\n for (const allele of alleles) {\n const skipped = allele.refSpan - allele.pathLength;\n if (skipped >= MIN_DELETION_BP) {\n alleleDeletions.push({ nodeIds: allele.nodeIds, bp: skipped });\n }\n const drawn = Math.max(allele.refSpan, minSpan);\n const scale = allele.pathLength > 0 ? drawn / allele.pathLength : 0;\n allele.nodeIds.forEach((nodeId, i) => {\n const node = byId.get(nodeId);\n if (node) {\n const offset = allele.nodeOffsets[i];\n const even = drawn / allele.nodeIds.length;\n const at = (bp) => allele.start + bp * scale;\n const y = rowY(node);\n positions[nodeId] = scale ? [\n { x: at(offset), y },\n { x: at(offset + node.length), y }\n ] : [\n { x: allele.start + i * even, y },\n { x: allele.start + (i + 1) * even, y }\n ];\n }\n });\n }\n const neighbors = buildNeighbors(graph);\n const queue = Object.keys(positions);\n for (const fromId of queue) {\n const fromEnd = positions[fromId].at(-1).x;\n for (const nextId of neighbors.get(fromId) ?? []) {\n const next = byId.get(nextId);\n if (next && !(nextId in positions)) {\n const y = rowY(next);\n positions[nextId] = [\n { x: fromEnd, y },\n { x: fromEnd + minSpan, y }\n ];\n queue.push(nextId);\n }\n }\n }\n return alleleDeletions;\n}\n\nexport {\n placeOffReference\n};\n", "import {\n placeOffReference\n} from \"./chunk-TZFWUT2C.js\";\nimport {\n parsePanSN\n} from \"./chunk-RVS2QCOX.js\";\nimport {\n ROW_HEIGHT_PX\n} from \"./chunk-CPMHA4W5.js\";\nimport {\n backboneNodes,\n backbonePositions,\n isOffReference,\n referenceSpan\n} from \"./chunk-FYQWPEEY.js\";\n\n// src/layout/sampleRowLayout.ts\nfunction contributingSamples(graph, keep) {\n const carried = /* @__PURE__ */ new Map();\n for (const node of graph.nodes) {\n if (isOffReference(node)) {\n const { sample } = parsePanSN(node.stable.refName);\n carried.set(sample, (carried.get(sample) ?? 0) + node.length);\n }\n }\n const held = new Map(keep.map((sample, row) => [sample, row]));\n return [...carried.keys()].sort(\n (a, b) => (held.get(a) ?? Infinity) - (held.get(b) ?? Infinity) || carried.get(b) - carried.get(a) || a.localeCompare(b)\n );\n}\nfunction sampleRowLayout(graph, region, keep = []) {\n const backbone = backboneNodes(graph);\n const samples = contributingSamples(graph, keep);\n if (backbone.length === 0 || samples.length === 0) {\n return void 0;\n }\n const span = referenceSpan(backbone, region);\n const rowOf = new Map(samples.map((s, i) => [s, i + 1]));\n const nodePositions = backbonePositions(backbone);\n const spareRow = samples.length + 1;\n const alleleDeletions = placeOffReference({\n graph,\n span,\n rowY: (node) => {\n const stable = node.stable;\n const row = stable ? rowOf.get(parsePanSN(stable.refName).sample) : void 0;\n return (row ?? spareRow) * ROW_HEIGHT_PX;\n },\n positions: nodePositions\n });\n const referenceSample = parsePanSN(backbone[0].stable.refName).sample;\n const rowLabels = [\n { label: referenceSample, y: 0 },\n ...samples.map((sample) => ({\n label: sample,\n y: rowOf.get(sample) * ROW_HEIGHT_PX\n }))\n ];\n return {\n nodePositions,\n rowLabels,\n sampleRows: samples,\n referenceAxis: true,\n pixelRows: true,\n alleleDeletions\n };\n}\n\nexport {\n sampleRowLayout\n};\n", "import {\n canonicalStrand,\n stepName,\n tubeMapReads\n} from \"./chunk-TEDQJPMI.js\";\nimport {\n pathCssColor,\n pathGreyCssColor\n} from \"./chunk-7GBL7SJY.js\";\nimport {\n pathOrigin\n} from \"./chunk-ST2IBUAN.js\";\nimport {\n isBackbone\n} from \"./chunk-FYQWPEEY.js\";\n\n// src/layout/tubeMapLayout.ts\nimport { layoutTubeMap } from \"@jbrowse/tubemap-core\";\nfunction visitStrands(graph) {\n const strands = /* @__PURE__ */ new Map();\n for (const [segment, visits] of graph.pathVisits ?? []) {\n for (const visit of visits) {\n const key = `${visit.path}\t${segment}`;\n const list = strands.get(key);\n if (list) {\n list.push(visit.strand);\n } else {\n strands.set(key, [visit.strand]);\n }\n }\n }\n return strands;\n}\nfunction tubeMapTracks(graph) {\n const nodeById = new Map(graph.nodes.map((n) => [n.id, n]));\n const strands = visitStrands(graph);\n const paths = (graph.paths ?? []).map((path, index) => ({ path, index }));\n const reference = paths.findIndex(\n (p) => pathOrigin(p.path.name).name === graph.referencePath\n );\n if (reference > 0) {\n paths.unshift(...paths.splice(reference, 1));\n }\n return paths.flatMap(({ path, index }) => {\n const visitName = pathOrigin(path.name).name;\n const seen = /* @__PURE__ */ new Map();\n const sequence = path.nodeIds.flatMap((id) => {\n const node = nodeById.get(id);\n if (!node) {\n return [];\n }\n const k = seen.get(node.name) ?? 0;\n seen.set(node.name, k + 1);\n const strand = strands.get(`${visitName}\t${node.name}`)?.[k] ?? canonicalStrand(node);\n return [stepName(node, strand)];\n });\n return sequence.length > 0 ? [\n {\n id: index,\n name: path.name,\n sequence,\n sourceTrackID: 0,\n type: \"haplotype\"\n }\n ] : [];\n });\n}\nfunction tubeMapNodes(graph) {\n return graph.nodes.map((n) => ({\n name: n.id,\n seq: \"\",\n sequenceLength: Math.max(1, n.length)\n }));\n}\nfunction hasTubeMapPaths(graph) {\n return (graph.paths?.length ?? 0) > 0;\n}\nvar STACK_PX = 600;\nvar MIN_TUBE_PX = 3;\nvar MAX_TUBE_PX = 15;\nfunction tubeWidth(trackCount) {\n return Math.max(\n MIN_TUBE_PX,\n Math.min(MAX_TUBE_PX, Math.floor(STACK_PX / Math.max(1, trackCount)))\n );\n}\nfunction runTubeMap(graph) {\n const paths = graph.paths ?? [];\n const tracks = tubeMapTracks(graph);\n const reads = graph.reads ? tubeMapReads(graph, graph.reads, paths.length) : [];\n const tubeColor = reads.length > 0 ? pathGreyCssColor : pathCssColor;\n const pathColors = paths.map((_, i) => tubeColor(i, paths.length));\n const layout = layoutTubeMap(tubeMapNodes(graph), tracks, reads, {\n nodeWidthOption: \"compressed\",\n trackWidth: tubeWidth(tracks.length)\n });\n return layout ? { layout, pathColors } : void 0;\n}\nfunction drawnNodes(layout) {\n const nodes = [];\n layout.nodes.forEach((node) => {\n if (node.order >= 0) {\n nodes.push(node);\n }\n });\n return nodes;\n}\nfunction centreline(node, yOffset, x0, x1) {\n const y = node.y + node.contentHeight / 2 - yOffset;\n return [\n { x: x0, y },\n { x: x1, y }\n ];\n}\nfunction extentOf(layout, yOffset) {\n return {\n minY: layout.bounds.minY - yOffset,\n maxY: layout.bounds.maxY - yOffset\n };\n}\nfunction tubeMapLayout(graph) {\n const run = hasTubeMapPaths(graph) ? runTubeMap(graph) : void 0;\n if (!run) {\n return void 0;\n }\n const { layout, pathColors } = run;\n const yOffset = layout.bounds.minY;\n const nodePositions = {};\n for (const node of drawnNodes(layout)) {\n nodePositions[node.name] = centreline(\n node,\n yOffset,\n node.x,\n node.x + node.pixelWidth\n );\n }\n const { minY, maxY } = extentOf(layout, yOffset);\n return {\n nodePositions,\n tubeMap: { layout, yOffset, pathColors },\n extent: {\n minX: layout.bounds.minX,\n maxX: layout.bounds.maxX,\n minY,\n maxY\n }\n };\n}\nfunction tubeMapColumns(graph, layout) {\n const nodeById = new Map(graph.nodes.map((n) => [n.id, n]));\n const byOrder = /* @__PURE__ */ new Map();\n for (const node of drawnNodes(layout)) {\n const list = byOrder.get(node.order);\n if (list) {\n list.push(node);\n } else {\n byOrder.set(node.order, [node]);\n }\n }\n const columns = [];\n let end = -Infinity;\n for (const order of [...byOrder.keys()].sort((a, b) => a - b)) {\n const nodes = byOrder.get(order);\n let bp0 = Infinity;\n let bp1 = -Infinity;\n for (const node of nodes) {\n const graphNode = nodeById.get(node.name);\n if (graphNode && isBackbone(graphNode)) {\n bp0 = Math.min(bp0, graphNode.stable.start);\n bp1 = Math.max(bp1, graphNode.stable.start + node.sequenceLength);\n }\n }\n if (bp0 === Infinity) {\n bp0 = bp1 = end;\n }\n if (bp0 < end) {\n bp0 = end;\n bp1 = Math.max(end, bp1);\n }\n end = Math.max(end, bp1);\n columns.push({\n order,\n x0: Math.min(...nodes.map((n) => n.x)),\n x1: Math.max(...nodes.map((n) => n.x + n.pixelWidth)),\n bp0,\n bp1\n });\n }\n const first = columns.find((c) => c.bp0 !== -Infinity);\n for (const column of columns) {\n if (column.bp0 === -Infinity) {\n column.bp0 = column.bp1 = first?.bp0 ?? 0;\n }\n }\n return columns;\n}\nfunction pathsReachBackbone(graph) {\n return graph.nodes.some(isBackbone) && hasTubeMapPaths(graph);\n}\nfunction tubeMapReferenceLayout(graph) {\n const run = pathsReachBackbone(graph) ? runTubeMap(graph) : void 0;\n if (!run) {\n return void 0;\n }\n const { layout, pathColors } = run;\n const columns = tubeMapColumns(graph, layout);\n const byOrder = new Map(columns.map((c) => [c.order, c]));\n const yOffset = layout.bounds.minY;\n const nodePositions = {};\n for (const node of drawnNodes(layout)) {\n const column = byOrder.get(node.order);\n nodePositions[node.name] = centreline(node, yOffset, column.bp0, column.bp1);\n }\n return {\n nodePositions,\n tubeMap: { layout, yOffset, columns, pathColors },\n referenceAxis: true,\n pixelRows: true,\n extent: extentOf(layout, yOffset)\n };\n}\n\nexport {\n visitStrands,\n tubeMapTracks,\n hasTubeMapPaths,\n tubeWidth,\n tubeMapLayout,\n tubeMapReferenceLayout\n};\n", "import {\n placeOffReference\n} from \"./chunk-TZFWUT2C.js\";\nimport {\n ROW_HEIGHT_PX\n} from \"./chunk-CPMHA4W5.js\";\nimport {\n backboneNodes,\n backbonePositions,\n referenceSpan\n} from \"./chunk-FYQWPEEY.js\";\n\n// src/layout/anchoredLayout.ts\nfunction rankRows(graph) {\n const present = /* @__PURE__ */ new Set();\n for (const node of graph.nodes) {\n if (node.stable) {\n present.add(node.stable.rank);\n }\n }\n return new Map([...present].sort((a, b) => a - b).map((r, i) => [r, i]));\n}\nfunction anchoredLayout(graph, region) {\n const backbone = backboneNodes(graph);\n if (backbone.length === 0) {\n return void 0;\n }\n const span = referenceSpan(backbone, region);\n const rows = rankRows(graph);\n const nodePositions = backbonePositions(backbone);\n const alleleDeletions = placeOffReference({\n graph,\n span,\n rowY: (node) => (node.stable ? rows.get(node.stable.rank) ?? rows.size : rows.size) * ROW_HEIGHT_PX,\n positions: nodePositions\n });\n const rowLabels = [...rows].map(([rank, row]) => ({\n label: rank === 0 ? \"Reference (rank 0)\" : `Rank ${rank}`,\n y: row * ROW_HEIGHT_PX\n }));\n return {\n nodePositions,\n rowLabels,\n referenceAxis: true,\n pixelRows: true,\n alleleDeletions\n };\n}\n\nexport {\n anchoredLayout\n};\n", "import {\n ROW_HEIGHT_PX\n} from \"./chunk-CPMHA4W5.js\";\nimport {\n isBackbone\n} from \"./chunk-FYQWPEEY.js\";\n\n// src/layout/orderedLayout.ts\nvar GUTTER = 12;\nvar LANE_PX = ROW_HEIGHT_PX;\nfunction nodeWidth(node) {\n return 10 + 8 * Math.log2(1 + node.length);\n}\nfunction compare(a, b) {\n return a < b ? -1 : a > b ? 1 : 0;\n}\nfunction compareKeys(a, b) {\n return compare(a.at, b.at) || compare(a.side, b.side) || compare(a.hops, b.hops);\n}\nvar UNREACHED = { at: Infinity, side: 0, hops: 0 };\nfunction referenceOrder(graph) {\n const byId = new Map(graph.nodes.map((n) => [n.id, n]));\n const key = orderKeys(graph);\n return graph.nodes.map((n) => n.id).sort(\n (a, b) => compareKeys(key.get(a) ?? UNREACHED, key.get(b) ?? UNREACHED) || compare(byId.get(a).name, byId.get(b).name) || compare(a, b)\n );\n}\nfunction placeByWalks(graph, backbone) {\n const isNode = new Set(graph.nodes.map((n) => n.id));\n const startOf = new Map(backbone.map((n) => [n.id, n.stable.start]));\n const next = /* @__PURE__ */ new Map();\n const prev = /* @__PURE__ */ new Map();\n backbone.forEach((n, i) => {\n prev.set(n.id, backbone[i - 1]?.id);\n next.set(n.id, backbone[i + 1]?.id);\n });\n let head = backbone[0]?.id;\n const insertAfter = (at, id) => {\n const after = next.get(at);\n next.set(at, id);\n prev.set(id, at);\n next.set(id, after);\n if (after !== void 0) {\n prev.set(after, id);\n }\n };\n const insertBefore = (at, id) => {\n const before = prev.get(at);\n if (before === void 0) {\n head = id;\n prev.set(id, void 0);\n next.set(id, at);\n prev.set(at, id);\n } else {\n insertAfter(before, id);\n }\n };\n for (const path of graph.paths ?? []) {\n let rising = 0;\n let falling = 0;\n let last;\n for (const id of path.nodeIds) {\n const start = startOf.get(id);\n if (start !== void 0) {\n if (last !== void 0 && start !== last) {\n if (start > last) {\n rising++;\n } else {\n falling++;\n }\n }\n last = start;\n }\n }\n const ids = falling > rising ? [...path.nodeIds].reverse() : path.nodeIds;\n let from;\n const leading = /* @__PURE__ */ new Set();\n for (const id of ids) {\n if (next.has(id)) {\n if (from === void 0) {\n for (const lead of leading) {\n insertBefore(id, lead);\n }\n }\n from = id;\n } else if (isNode.has(id)) {\n if (from === void 0) {\n leading.add(id);\n } else {\n insertAfter(from, id);\n from = id;\n }\n }\n }\n }\n const placed = [];\n for (let id = head; id !== void 0; id = next.get(id)) {\n placed.push(id);\n }\n return placed;\n}\nfunction placeBySearch(adjacent, key) {\n const queue = [...key.entries()].sort(([a, ka], [b, kb]) => compareKeys(ka, kb) || compare(a, b)).map(([id]) => id);\n const placed = queue.length;\n for (const id of queue) {\n const from = key.get(id);\n for (const nb of adjacent.get(id) ?? []) {\n if (!key.has(nb)) {\n key.set(nb, { at: from.at, side: 1, hops: from.hops + 1 });\n queue.push(nb);\n }\n }\n }\n const searched = new Set(queue.slice(placed));\n const sided = /* @__PURE__ */ new Set();\n for (const seed of searched) {\n if (sided.has(seed)) {\n continue;\n }\n const { at } = key.get(seed);\n const run = [seed];\n sided.add(seed);\n let farHalf = true;\n for (const id of run) {\n const { hops } = key.get(id);\n let deadEnd = true;\n let touchesLeft = false;\n for (const nb of adjacent.get(id) ?? []) {\n const other = key.get(nb);\n if (other.at === at && searched.has(nb)) {\n deadEnd &&= other.hops <= hops;\n if (!sided.has(nb)) {\n sided.add(nb);\n run.push(nb);\n }\n } else if (other.at !== at) {\n touchesLeft ||= other.at < at;\n farHalf &&= other.at < at;\n }\n }\n farHalf &&= !deadEnd || touchesLeft;\n }\n if (farHalf) {\n for (const id of run) {\n const k = key.get(id);\n key.set(id, { ...k, side: -1, hops: -k.hops });\n }\n }\n }\n}\nfunction orderKeys(graph) {\n const ids = new Set(graph.nodes.map((n) => n.id));\n const adjacent = /* @__PURE__ */ new Map();\n for (const e of graph.edges) {\n if (!ids.has(e.from) || !ids.has(e.to)) {\n continue;\n }\n ;\n (adjacent.get(e.from) ?? adjacent.set(e.from, []).get(e.from)).push(e.to);\n (adjacent.get(e.to) ?? adjacent.set(e.to, []).get(e.to)).push(e.from);\n }\n const backbone = graph.nodes.filter(isBackbone).sort(\n (a, b) => compare(a.stable.start, b.stable.start) || compare(a.name, b.name)\n );\n const key = /* @__PURE__ */ new Map();\n placeByWalks(graph, backbone).forEach((id, rank) => {\n key.set(id, { at: rank, side: 0, hops: 0 });\n });\n placeBySearch(adjacent, key);\n return key;\n}\nfunction layerGraph(graph) {\n const byId = new Map(graph.nodes.map((n) => [n.id, n]));\n const order = referenceOrder(graph);\n const key = new Map(order.map((id, i) => [id, i]));\n const isRef = (id) => isBackbone(byId.get(id));\n const preds = new Map(order.map((id) => [id, []]));\n const succs = new Map(order.map((id) => [id, []]));\n const link = (a, b) => {\n preds.get(b).push(a);\n succs.get(a).push(b);\n };\n for (const e of graph.edges) {\n if (e.from === e.to || !key.has(e.from) || !key.has(e.to)) {\n continue;\n }\n if (key.get(e.from) < key.get(e.to)) {\n link(e.from, e.to);\n } else {\n link(e.to, e.from);\n }\n }\n const backbone = order.filter(isRef);\n for (let i = 1; i < backbone.length; i++) {\n link(backbone[i - 1], backbone[i]);\n }\n const layerOf = /* @__PURE__ */ new Map();\n for (const id of order) {\n let l = 0;\n for (const p of preds.get(id)) {\n l = Math.max(l, layerOf.get(p) + 1);\n }\n layerOf.set(id, l);\n }\n for (let i = order.length - 1; i >= 0; i--) {\n const id = order[i];\n const s = succs.get(id);\n if (isRef(id) || s.length === 0) {\n continue;\n }\n let minSucc = Infinity;\n for (const t of s) {\n minSucc = Math.min(minSucc, layerOf.get(t));\n }\n const lo = layerOf.get(id);\n const hi = Math.max(lo, minSucc - 1);\n layerOf.set(id, Math.floor((lo + hi) / 2));\n }\n const layers = [];\n for (const id of order) {\n ;\n (layers[layerOf.get(id)] ??= []).push(id);\n }\n return { layers, layerOf, preds };\n}\nfunction orderedLayout(graph) {\n if (!graph.nodes.some(isBackbone)) {\n return void 0;\n }\n const byId = new Map(graph.nodes.map((n) => [n.id, n]));\n const isRef = (id) => isBackbone(byId.get(id));\n const { layers, layerOf: layer, preds } = layerGraph(graph);\n const layerWidth = layers.map((ids) => {\n let w = 0;\n for (const id of ids) {\n w = Math.max(w, nodeWidth(byId.get(id)));\n }\n return w;\n });\n const layerX = [];\n let x = 0;\n for (let l = 0; l < layers.length; l++) {\n layerX[l] = x;\n x += layerWidth[l] + GUTTER;\n }\n const y = /* @__PURE__ */ new Map();\n for (const ids of layers) {\n const free = [];\n for (const id of ids) {\n if (isRef(id)) {\n y.set(id, 0);\n continue;\n }\n const placed = preds.get(id).filter((p) => y.has(p));\n let ideal = 0;\n for (const p of placed) {\n ideal += y.get(p) / placed.length;\n }\n free.push({ id, ideal: ideal === 0 ? LANE_PX : ideal });\n }\n free.sort((a, b) => a.ideal - b.ideal);\n const taken = /* @__PURE__ */ new Set([0]);\n for (const { id, ideal } of free) {\n let lane = Math.round(ideal / LANE_PX);\n if (lane === 0) {\n lane = ideal >= 0 ? 1 : -1;\n }\n for (let d = 1; taken.has(lane); d++) {\n if (!taken.has(lane + d)) {\n lane += d;\n } else if (!taken.has(lane - d)) {\n lane -= d;\n }\n }\n taken.add(lane);\n y.set(id, lane * LANE_PX);\n }\n }\n const nodePositions = {};\n for (const n of graph.nodes) {\n const l = layer.get(n.id);\n const w = nodeWidth(n);\n const cx = layerX[l] + layerWidth[l] / 2;\n const ny = y.get(n.id);\n nodePositions[n.id] = [\n { x: cx - w / 2, y: ny },\n { x: cx + w / 2, y: ny }\n ];\n }\n return { nodePositions, referenceAxis: false, pixelRows: true };\n}\n\nexport {\n referenceOrder,\n layerGraph,\n orderedLayout\n};\n", "import {\n pathOrigin\n} from \"./chunk-ST2IBUAN.js\";\nimport {\n panSNContig,\n panSNSample\n} from \"./chunk-BPLIXMH7.js\";\n\n// src/layout/walkRows.ts\nfunction sampleOf(path) {\n return path.sample ?? panSNSample(path.name);\n}\nfunction labelOf(path) {\n return path.haplotype !== void 0 && path.sample !== void 0 ? `${path.sample}#${path.haplotype}` : sampleOf(path);\n}\nfunction stepsOf(pieces, lengthOf) {\n const steps = [];\n let end;\n for (const piece of pieces) {\n if (end !== void 0 && piece.start !== void 0 && piece.start > end) {\n steps.push(piece.start - end);\n }\n steps.push(...piece.nodeIds);\n const bp = piece.nodeIds.reduce(\n (sum, id) => sum + (lengthOf.get(id) ?? 0),\n 0\n );\n end = piece.start === void 0 ? void 0 : piece.start + bp;\n }\n return steps;\n}\nfunction stepSpans(pieces, lengthOf) {\n const spans = [];\n let end;\n for (const piece of pieces) {\n if (piece.start === void 0 || end !== void 0 && piece.start < end) {\n return void 0;\n }\n if (end !== void 0 && piece.start > end) {\n spans.push({ start: end, end: piece.start });\n }\n let pos = piece.start;\n for (const id of piece.nodeIds) {\n const len = lengthOf.get(id) ?? 0;\n spans.push({ start: pos, end: pos + len });\n pos += len;\n }\n end = pos;\n }\n return spans;\n}\nfunction sliceBetween(steps, span, region, flanked = true) {\n if (!region || !flanked) {\n return { ids: steps, complete: true, from: -1, to: -1 };\n }\n let i0 = -1;\n let i1 = -1;\n let bestEnd = -Infinity;\n let bestStart = Infinity;\n steps.forEach((id, i) => {\n const s = typeof id === \"string\" ? span.get(id) : void 0;\n if (s) {\n if (s.end <= region.start && s.end > bestEnd) {\n bestEnd = s.end;\n i0 = i;\n }\n if (s.start >= region.end && s.start < bestStart) {\n bestStart = s.start;\n i1 = i;\n }\n }\n });\n if (i0 < 0 || i1 < 0) {\n return { ids: steps, complete: false, from: -1, to: -1 };\n }\n const ids = steps.slice(Math.min(i0, i1) + 1, Math.max(i0, i1));\n return {\n ids: i0 < i1 ? ids : ids.reverse(),\n complete: true,\n from: i0,\n to: i1\n };\n}\nfunction filterSamples(rows, samples) {\n return samples ? rows.filter((r) => samples.includes(r.sample)).sort(\n (a, b) => samples.indexOf(a.sample) - samples.indexOf(b.sample) || a.label.localeCompare(b.label)\n ) : rows;\n}\nfunction walkRows(graph, region, unit) {\n const paths = graph.paths ?? [];\n const isReference = (p) => pathOrigin(p.name).name === graph.referencePath;\n const referencePieces = paths.some(isReference) ? paths.filter(isReference).sort((a, b) => (a.start ?? 0) - (b.start ?? 0)) : paths.slice(0, 1);\n const first = referencePieces[0];\n const others = paths.filter((p) => !referencePieces.includes(p));\n if (!first || others.length === 0) {\n return void 0;\n }\n const walks = /* @__PURE__ */ new Map();\n for (const path of others) {\n walks.set(path.name, [...walks.get(path.name) ?? [], path]);\n }\n const lengthOf = new Map(graph.nodes.map((n) => [n.id, n.length]));\n const referenceStart = first.start ?? 0;\n const cut = region && region.end > region.start ? region : void 0;\n const span = /* @__PURE__ */ new Map();\n for (const piece of referencePieces) {\n let pos = piece.start ?? 0;\n for (const id of piece.nodeIds) {\n const len = lengthOf.get(id) ?? 0;\n if (!span.has(id)) {\n span.set(id, { start: pos, end: pos + len });\n }\n pos += len;\n }\n }\n const flanked = cut === void 0 || [...span.values()].some((s) => s.end <= cut.start) && [...span.values()].some((s) => s.start >= cut.end);\n const rowOf = (pieces) => {\n const path = pieces[0];\n const ordered = [...pieces].sort((a, b) => (a.start ?? 0) - (b.start ?? 0));\n const { ids, complete, from, to } = sliceBetween(\n stepsOf(ordered, lengthOf),\n span,\n cut,\n flanked\n );\n const spans = stepSpans(ordered, lengthOf);\n const contig = path.contig ?? panSNContig(pathOrigin(path.name).name);\n const axis = !spans?.length ? void 0 : from < 0 ? { contig, start: spans[0].start, reversed: false } : from < to ? { contig, start: spans[from].end, reversed: false } : { contig, start: spans[from].start, reversed: true };\n const runs = [];\n let bp = 0;\n let offReferenceBp = 0;\n let gapBp = 0;\n let step = 0;\n for (const id of ids) {\n if (typeof id === \"number\") {\n runs.push({ start: bp, bp: id, onReference: false, gap: true });\n bp += id;\n gapBp += id;\n step = 0;\n continue;\n }\n const len = lengthOf.get(id) ?? 0;\n const s = span.get(id);\n const last = runs.at(-1);\n const at = last?.referenceStart;\n const forward = s && at !== void 0 && step >= 0 && at + last.bp === s.start;\n const backward = s && at !== void 0 && step <= 0 && s.end === at;\n if (!s && last && !last.onReference && !last.gap) {\n last.bp += len;\n } else if (forward || backward) {\n last.bp += len;\n if (!forward) {\n last.referenceStart = s.start;\n last.reversed = true;\n }\n step = forward ? 1 : -1;\n } else {\n runs.push({\n start: bp,\n bp: len,\n onReference: s !== void 0,\n referenceStart: s?.start\n });\n step = 0;\n }\n bp += len;\n if (!s) {\n offReferenceBp += len;\n }\n }\n return {\n name: path.name,\n label: labelOf(path),\n sample: sampleOf(path),\n haplotype: path.haplotype,\n bp,\n offReferenceBp,\n gapBp,\n complete,\n runs,\n axis\n };\n };\n const origin = cut ? cut.start : referenceStart;\n return {\n origin,\n unit,\n reference: rowOf(referencePieces),\n rows: [...walks.values()].map(rowOf).sort(\n (a, b) => Number(b.complete) - Number(a.complete) || b.bp - a.bp || a.label.localeCompare(b.label)\n )\n };\n}\n\nexport {\n filterSamples,\n walkRows\n};\n", "import {\n walkRows\n} from \"./chunk-SZNZ2T6D.js\";\nimport {\n ROW_HEIGHT_PX\n} from \"./chunk-CPMHA4W5.js\";\nimport {\n backboneNodes,\n backbonePositions,\n overlapsWindow\n} from \"./chunk-FYQWPEEY.js\";\n\n// src/layout/walkRowLayout.ts\nvar READOUT_ROOM = 1.3;\nfunction walkRowsExtent(walks, pitch = {\n rowPx: ROW_HEIGHT_PX,\n readouts: true\n}) {\n let longest = walks.reference.bp;\n for (const row of walks.rows) {\n longest = Math.max(longest, row.bp);\n }\n return {\n maxX: walks.origin + longest * (pitch.readouts ? READOUT_ROOM : 1),\n maxY: walks.rows.length * pitch.rowPx\n };\n}\nfunction walkRowLabels(rows, layout, pitch) {\n if (!rows) {\n return layout?.rowLabels ?? [];\n }\n if (pitch && !pitch.labelled) {\n return [];\n }\n return [rows.reference, ...rows.rows].map((row, i) => ({\n label: row.label,\n y: i * (pitch?.rowPx ?? ROW_HEIGHT_PX)\n }));\n}\nfunction walkRowLayout(graph, region) {\n const backbone = backboneNodes(graph);\n const walks = walkRows(graph, region);\n if (backbone.length === 0 || !walks) {\n return void 0;\n }\n const overWindow = region ? backbone.filter((n) => overlapsWindow(n, region)) : backbone;\n const nodePositions = backbonePositions(\n overWindow.length > 0 ? overWindow : backbone\n );\n const rowLabels = [\n { label: walks.reference.label, y: 0 },\n ...walks.rows.map((row, i) => ({\n label: row.label,\n y: (i + 1) * ROW_HEIGHT_PX\n }))\n ];\n return {\n nodePositions,\n rowLabels,\n referenceAxis: true,\n pixelRows: true,\n extent: walkRowsExtent(walks)\n };\n}\n\nexport {\n walkRowsExtent,\n walkRowLabels,\n walkRowLayout\n};\n", "import {\n sampleRowLayout\n} from \"./chunk-LOEA5IHZ.js\";\nimport {\n hasTubeMapPaths,\n tubeMapLayout,\n tubeMapReferenceLayout\n} from \"./chunk-W2I4DOL4.js\";\nimport {\n anchoredLayout\n} from \"./chunk-L3O7AWLI.js\";\nimport {\n orderedLayout\n} from \"./chunk-HNQPEMYE.js\";\nimport {\n walkRowLayout\n} from \"./chunk-MP7LXLWV.js\";\nimport {\n isBackbone,\n isOffReference\n} from \"./chunk-FYQWPEEY.js\";\n\n// src/layoutModes.ts\nvar FORCE_LAYOUT_LABEL = \"Force-directed layout\";\nvar hasBackbone = (graph) => graph.nodes.some(isBackbone);\nvar hasWalks = (graph) => hasBackbone(graph) && (graph.paths?.length ?? 0) > 1;\nvar hasTubeMapBackbone = (graph) => hasBackbone(graph) && hasTubeMapPaths(graph);\nvar hasAlleles = (graph) => hasBackbone(graph) && graph.nodes.some(isOffReference);\nvar LAYOUT_MODES = [\n {\n value: \"auto\",\n label: \"Anchored\",\n description: \"x is reference bp, one row per stable rank. Needs rGFA tags or a reference path.\",\n run: anchoredLayout,\n cutMargins: true,\n wholeWalks: false,\n available: hasBackbone,\n drawsLocally: hasBackbone,\n drawsNodes: true\n },\n {\n value: \"samplerows\",\n label: \"Sample rows\",\n description: \"x is reference bp, one row per contributing assembly. Needs rGFA tags or a reference path.\",\n run: sampleRowLayout,\n cutMargins: true,\n wholeWalks: false,\n available: hasAlleles,\n drawsLocally: hasAlleles,\n drawsNodes: true\n },\n {\n value: \"walkrows\",\n label: \"Walk rows\",\n description: \"x is each walk's own bp: one bar per haplotype, blue on the reference's path and purple off it, so a repeat expansion reads as bar length, and each bar boxes its haplotype's own genes where the session has them. Needs W or P lines.\",\n run: walkRowLayout,\n cutMargins: false,\n wholeWalks: true,\n available: hasWalks,\n drawsLocally: hasWalks,\n drawsNodes: false\n },\n {\n value: \"ordered\",\n label: \"Ordered\",\n description: \"x is reference order, not bp: every node gets room, bubbles read as lenses. Needs rGFA tags or a reference path.\",\n run: orderedLayout,\n cutMargins: false,\n wholeWalks: false,\n available: hasBackbone,\n drawsLocally: hasBackbone,\n drawsNodes: true\n },\n {\n value: \"tubemap\",\n label: \"Tube map\",\n description: \"sequenceTubeMap: every path a coloured tube through boxed nodes, columns in node order and node widths log-scaled. Needs P or W lines.\",\n run: tubeMapLayout,\n cutMargins: false,\n wholeWalks: false,\n available: hasTubeMapPaths,\n drawsLocally: hasTubeMapPaths,\n drawsNodes: false\n },\n {\n value: \"tubemapref\",\n label: \"Tube map on reference\",\n description: \"The tube map with each column at the reference bp it covers, so the tubes line up with the tracks around them. Needs P or W lines and a reference path.\",\n run: tubeMapReferenceLayout,\n cutMargins: true,\n wholeWalks: false,\n available: hasTubeMapBackbone,\n drawsLocally: hasTubeMapBackbone,\n drawsNodes: false\n },\n {\n value: \"force\",\n label: FORCE_LAYOUT_LABEL,\n description: \"OGDF FMMM, via the external Bandage engine.\",\n run: () => void 0,\n cutMargins: false,\n wholeWalks: false,\n available: () => true,\n drawsLocally: () => false,\n drawsNodes: true\n }\n];\nvar LAYOUT_MODE_VALUES = LAYOUT_MODES.map((m) => m.value);\nfunction modeUsesLayoutEngine(value, graph) {\n return !layoutModeByValue(value).drawsLocally(graph);\n}\nfunction layoutModeByValue(value) {\n return LAYOUT_MODES.find((m) => m.value === value) ?? LAYOUT_MODES[0];\n}\n\nexport {\n FORCE_LAYOUT_LABEL,\n LAYOUT_MODES,\n LAYOUT_MODE_VALUES,\n modeUsesLayoutEngine,\n layoutModeByValue\n};\n", "import {\n alongRow,\n boxesGenes,\n rowPitch\n} from \"./chunk-V3MD3IZB.js\";\nimport {\n LABEL_CHAR_PX\n} from \"./chunk-AB35TJST.js\";\nimport {\n el\n} from \"./chunk-NNODIW4U.js\";\nimport {\n pathOrigin\n} from \"./chunk-ST2IBUAN.js\";\n\n// src/layout/walkStrip.ts\nfunction walkStripApplies(o) {\n return o.walkStrip && o.mode.drawsNodes && !o.drawsPicture && !o.popped && !o.host && o.walks > 1;\n}\nfunction cutsWholeWalks(mode, o) {\n return mode.wholeWalks || o.walkStrip && !o.host;\n}\nvar PAD_PX = 6;\nvar WALK_STRIP_CEILING_PX = 260;\nvar LABEL_FONT_PX = 11;\nvar MIN_ROW_PX = 3;\nvar READOUT_ROOM = 1.3;\nvar MARK_INK = \"#111\";\nvar TICK_PX = 3;\nfunction stripMarks(graph, rows, node) {\n const visits = graph.pathVisits?.get(node.name) ?? [];\n const marks = [];\n for (const row of rows) {\n const axis = row.axis;\n if (!axis) {\n continue;\n }\n const path = pathOrigin(row.name).name;\n for (const v of visits) {\n if (v.path !== path) {\n continue;\n }\n const { start, end } = alongRow(axis, v.start, v.start + node.length);\n if (end > 0 && start < row.bp) {\n marks.push({ row: row.name, start, bp: end - start });\n }\n }\n }\n return marks;\n}\nvar spanCache = /* @__PURE__ */ new WeakMap();\nfunction spansOf(graph, name) {\n let byName = spanCache.get(graph);\n if (!byName) {\n byName = /* @__PURE__ */ new Map();\n spanCache.set(graph, byName);\n }\n if (byName.has(name)) {\n return byName.get(name);\n }\n const lengthOf = new Map(graph.nodes.map((n) => [n.id, n.length]));\n const pieces = (graph.paths ?? []).filter((p) => p.name === name);\n let spans;\n if (pieces.every((p) => p.start !== void 0)) {\n spans = { ids: [], starts: [], ends: [] };\n for (const piece of [...pieces].sort((a, b) => a.start - b.start)) {\n let pos = piece.start;\n for (const id of piece.nodeIds) {\n const len = lengthOf.get(id) ?? 0;\n spans.ids.push(id);\n spans.starts.push(pos);\n spans.ends.push(pos + len);\n pos += len;\n }\n }\n }\n byName.set(name, spans);\n return spans;\n}\nfunction segmentAt(graph, row, offset, pxPerBp) {\n const axis = row.axis;\n const spans = axis && spansOf(graph, row.name);\n if (!axis || !spans || offset < 0 || offset > row.bp) {\n return void 0;\n }\n const at = axis.reversed ? axis.start - offset : axis.start + offset;\n const tol = 0.5 / pxPerBp;\n const bar = axis.reversed ? { start: axis.start - row.bp, end: axis.start } : { start: axis.start, end: axis.start + row.bp };\n const from = Math.max(at - tol, bar.start);\n const to = Math.min(at + tol, bar.end);\n let lo = 0;\n let hi = spans.starts.length;\n while (lo < hi) {\n const mid = lo + hi >> 1;\n if (spans.ends[mid] <= from) {\n lo = mid + 1;\n } else {\n hi = mid;\n }\n }\n let best;\n let bestLen = -1;\n let bestHolds = false;\n for (let i = lo; i < spans.starts.length && spans.starts[i] < to; i++) {\n const len = spans.ends[i] - spans.starts[i];\n const holds = spans.starts[i] <= at && at < spans.ends[i];\n if (len > bestLen || len === bestLen && holds && !bestHolds) {\n bestLen = len;\n best = spans.ids[i];\n bestHolds = holds;\n }\n }\n return best;\n}\nfunction walkStripFrame(bars, o) {\n const maxHeight = o.maxHeight ?? WALK_STRIP_CEILING_PX;\n const labelPx = o.labelPx ?? Math.max(...[bars.reference, ...bars.rows].map((r) => r.label.length)) * LABEL_CHAR_PX + 16;\n const count = bars.rows.length + 1;\n const { rowPx, barPx, labelled, readouts } = rowPitch(\n count,\n maxHeight - 2 * PAD_PX,\n MIN_ROW_PX\n );\n const longest = Math.max(bars.reference.bp, ...bars.rows.map((r) => r.bp), 1);\n const left = labelled ? labelPx : PAD_PX;\n const usable = Math.max(1, o.width - left - PAD_PX);\n const scaleX = usable / (longest * (readouts ? READOUT_ROOM : 1));\n return {\n scaleX,\n scaleY: 1,\n translateX: left - bars.origin * scaleX,\n translateY: PAD_PX + rowPx / 2,\n width: o.width,\n height: count * rowPx + 2 * PAD_PX,\n rowPx,\n barPx,\n readouts,\n labelled,\n boxesGenes: boxesGenes(rowPx, barPx)\n };\n}\nfunction stripRowAt(bars, frame, x, y) {\n const i = Math.round((y - frame.translateY) / frame.rowPx);\n const row = [bars.reference, ...bars.rows][i];\n const offset = (x - frame.translateX) / frame.scaleX - bars.origin;\n return row && i >= 0 && offset >= 0 && offset <= row.bp ? { index: i, row, offset } : void 0;\n}\nfunction walkMarksTree(bars, frame, marks) {\n const index = new Map(\n [bars.reference, ...bars.rows].map((row, i) => [row.name, i])\n );\n const X = (offset) => (bars.origin + offset) * frame.scaleX + frame.translateX;\n return el(\n \"g\",\n { \"data-testid\": \"graph-walk-marks\" },\n ...marks.flatMap((m) => {\n const i = index.get(m.row);\n if (i === void 0) {\n return [];\n }\n const y = i * frame.rowPx + frame.translateY;\n const x = X(m.start);\n const w = Math.max(2, m.bp * frame.scaleX);\n const tick = (top) => el(\"rect\", { x, y: top, width: w, height: TICK_PX, fill: MARK_INK });\n return [\n tick(y - frame.barPx / 2 - TICK_PX - 1),\n tick(y + frame.barPx / 2 + 1)\n ];\n })\n );\n}\nfunction walkStripLabelsTree(bars, frame, bold = /* @__PURE__ */ new Set()) {\n return el(\n \"g\",\n { \"font-family\": \"sans-serif\", \"font-size\": LABEL_FONT_PX, fill: \"#333\" },\n ...(frame.labelled ? [bars.reference, ...bars.rows] : []).map(\n (row, i) => el(\n \"text\",\n {\n x: 6,\n y: i * frame.rowPx + frame.translateY + 4,\n \"font-weight\": bold.has(row.name) ? 600 : void 0\n },\n row.label\n )\n )\n );\n}\nfunction stripGeneGaps(frame, rowGenes, gaps) {\n if (!rowGenes?.size) {\n return void 0;\n }\n return frame.boxesGenes ? gaps : { untracked: 0, unread: 0, ...gaps, crowded: true };\n}\n\nexport {\n walkStripApplies,\n cutsWholeWalks,\n WALK_STRIP_CEILING_PX,\n stripMarks,\n segmentAt,\n walkStripFrame,\n stripRowAt,\n walkMarksTree,\n walkStripLabelsTree,\n stripGeneGaps\n};\n", "\"use client\";\n\nimport createSvgIcon from \"./utils/createSvgIcon.mjs\";\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nexport default createSvgIcon(/*#__PURE__*/_jsx(\"path\", {\n d: \"M19.14 12.94c.04-.3.06-.61.06-.94 0-.32-.02-.64-.07-.94l2.03-1.58c.18-.14.23-.41.12-.61l-1.92-3.32c-.12-.22-.37-.29-.59-.22l-2.39.96c-.5-.38-1.03-.7-1.62-.94l-.36-2.54c-.04-.24-.24-.41-.48-.41h-3.84c-.24 0-.43.17-.47.41l-.36 2.54c-.59.24-1.13.57-1.62.94l-2.39-.96c-.22-.08-.47 0-.59.22L2.74 8.87c-.12.21-.08.47.12.61l2.03 1.58c-.05.3-.09.63-.09.94s.02.64.07.94l-2.03 1.58c-.18.14-.23.41-.12.61l1.92 3.32c.12.22.37.29.59.22l2.39-.96c.5.38 1.03.7 1.62.94l.36 2.54c.05.24.24.41.48.41h3.84c.24 0 .44-.17.47-.41l.36-2.54c.59-.24 1.13-.56 1.62-.94l2.39.96c.22.08.47 0 .59-.22l1.92-3.32c.12-.22.07-.47-.12-.61zM12 15.6c-1.98 0-3.6-1.62-3.6-3.6s1.62-3.6 3.6-3.6 3.6 1.62 3.6 3.6-1.62 3.6-3.6 3.6\"\n}), 'Settings');"],
5
+ "mappings": "wbAAA,IAAAA,GAAAC,GAAA,CAAAC,GAAAC,KAAA,CAAAA,GAAO,QAAU,eAAe,uBAAuB,ICEvD,IAAAC,EAAyC,UC8BlC,SAASC,GAAgBC,EAA4C,CAC1E,OAAOC,EAAWD,CAAI,EAAIE,GAAqBF,CAAI,EAAI,MACzD,CAEA,SAASE,GAAqBF,EAAmC,CAC/D,MAAO,CACL,OAAQG,EAAYH,EAAK,OAAO,OAAO,EACvC,UAAWI,GAAeJ,EAAK,OAAO,OAAO,EAC7C,QAASK,EAAYL,EAAK,OAAO,OAAO,EACxC,MAAOA,EAAK,OAAO,MACnB,IAAKA,EAAK,OAAO,MAAQA,EAAK,MAChC,CACF,CAkBA,SAASM,GAAcC,EAAeC,EAAgB,CACpD,IAAMC,EAAS,CAAC,GAAGF,CAAK,EAAE,KAAK,CAACG,EAAGC,IAAMD,EAAE,MAAQC,EAAE,KAAK,EACtDC,EACAC,EACJ,QAAWC,KAAQL,EACjBI,EACEA,GAAWC,EAAK,MAAQD,EAAQ,KAAOL,EACnC,CAAE,MAAOK,EAAQ,MAAO,IAAK,KAAK,IAAIA,EAAQ,IAAKC,EAAK,GAAG,CAAE,EAC7D,CAAE,MAAOA,EAAK,MAAO,IAAKA,EAAK,GAAI,GACrC,CAACF,GAAQC,EAAQ,IAAMA,EAAQ,MAAQD,EAAK,IAAMA,EAAK,SACzDA,EAAOC,GAGX,OAAOD,CACT,CAUA,SAASG,GAASC,EAAoB,CACpC,MAAO,GAAGA,EAAI,WAAaA,EAAI,MAAM,KAASA,EAAI,OAAO,EAC3D,CAYO,SAASC,GACdC,EACA,CAAE,OAAAV,EAAS,GAAS,EAAyB,CAAC,EAC/B,CACf,IAAMW,EAAS,IAAI,IACnB,QAAWnB,KAAQkB,EAAM,MACvB,GAAIjB,EAAWD,CAAI,EAAG,CACpB,IAAMgB,EAAMd,GAAqBF,CAAI,EAC/BoB,EAAML,GAASC,CAAG,EAClBK,EAAQF,EAAO,IAAIC,CAAG,EACxBC,GACFA,EAAM,MAAM,KAAK,CAAE,MAAOL,EAAI,MAAO,IAAKA,EAAI,GAAI,CAAC,EACnDK,EAAM,KAAO,KAAK,IAAIA,EAAM,KAAMrB,EAAK,OAAO,IAAI,GAElDmB,EAAO,IAAIC,EAAK,CACd,OAAQJ,EAAI,OACZ,UAAWA,EAAI,UACf,QAASA,EAAI,QACb,KAAMhB,EAAK,OAAO,KAClB,MAAO,CAAC,CAAE,MAAOgB,EAAI,MAAO,IAAKA,EAAI,GAAI,CAAC,CAC5C,CAAC,CAEL,CAMF,IAAMM,EAAW,IAAI,IACrB,QAAWD,KAASF,EAAO,OAAO,EAAG,CACnC,IAAML,EAAOR,GAAce,EAAM,MAAOb,CAAM,EAC9C,GAAIM,EAAM,CACR,IAAMS,EAAY,CAChB,OAAQF,EAAM,OACd,UAAWA,EAAM,UACjB,QAASA,EAAM,QACf,MAAOP,EAAK,MACZ,IAAKA,EAAK,IACV,KAAMO,EAAM,KACZ,UAAWA,EAAM,MAAM,MACzB,EACMD,EAAMC,EAAM,WAAaA,EAAM,OAC/BG,EAAWF,EAAS,IAAIF,CAAG,GAC7B,CAACI,GAAYD,EAAU,UAAYC,EAAS,YAC9CF,EAAS,IAAIF,EAAKG,CAAS,CAE/B,CACF,CAMA,MAAO,CAAC,GAAGD,EAAS,OAAO,CAAC,EAAE,KAC5B,CAACZ,EAAGC,IACF,EAAOD,EAAE,OAAS,GAAK,EAAOC,EAAE,OAAS,IACzCD,EAAE,OAAO,cAAcC,EAAE,MAAM,IAC9BD,EAAE,WAAa,IAAI,cAAcC,EAAE,WAAa,EAAE,CACvD,CACF,CAMO,SAASc,GACdC,EACAV,EACA,CAGA,OADEA,EAAI,YAAc,OAAY,OAAYU,EAAQV,EAAI,SAAS,IAC3CU,EAAQV,EAAI,MAAM,CAC1C,CAkBO,SAASW,GACdC,EACAF,EACA,CACA,OAAOE,EAAa,QAAQC,GAAK,CAC/B,IAAMC,EAASL,GAAwBC,EAASG,CAAC,EACjD,OAAOC,IAAW,OAAY,CAAC,EAAI,CAAC,CAAE,GAAGD,EAAG,OAAAC,CAAO,CAAC,CACtD,CAAC,CACH,CAIO,SAASC,GAAUf,EAAoB,CAC5C,MAAO,GAAGA,EAAI,OAAO,IAAIA,EAAI,MAAQ,CAAC,IAAIA,EAAI,GAAG,EACnD,CAEO,SAASgB,GAAShB,EAAsD,CAC7E,MAAO,GAAGA,EAAI,OAAO,KAAKA,EAAI,MAAQ,GAAG,eAAe,CAAC,IAAIA,EAAI,IAAI,eAAe,CAAC,EACvF,CC7MA,IAAAiB,GAA4B,SACrBC,MAAQ,oBAA2B,GAAAC,KAAK,OAAQ,CACrD,EAAG,iEACL,CAAC,EAAG,eAAe,ECHnB,IAAAC,GAA4B,SACrBC,MAAQ,oBAA2B,GAAAC,KAAK,OAAQ,CACrD,EAAG,2PACL,CAAC,EAAG,cAAc,ECHlB,IAAAC,GAA4B,SACrBC,MAAQ,oBAA2B,GAAAC,KAAK,OAAQ,CACrD,EAAG,oJACL,CAAC,EAAG,WAAW,ECIf,IAAMC,GAAe,qBACfC,GAAgB,sBAChBC,GACJ,2DAUF,SAASC,GAAa,CACpB,MAAAC,EACA,KAAAC,EACA,QAAAC,EACA,WAAAC,EACA,SAAAC,EACA,iBAAAC,EACA,iBAAAC,EAAmB,EACrB,EAae,CACb,GAAM,CAACC,CAAK,EAAIL,EAIVM,EAAoBH,EACtB,CAAC,CAAE,MAAAL,EAAO,KAAAC,EAAM,SAAU,GAAM,iBAAAI,EAAkB,QAAS,IAAM,CAAC,CAAE,CAAC,EACrE,CAAC,EACL,OAAOH,EAAQ,SAAW,EACtBM,EACAN,EAAQ,SAAW,GAAKK,EACtB,CACE,CACE,MAAOD,EAAmB,GAAGN,CAAK,WAAMG,EAAWI,CAAK,CAAC,GAAKP,EAC9D,KAAAC,EACA,QAASG,EAASG,CAAK,CACzB,CACF,EACA,CACE,CACE,MAAAP,EACA,KAAAC,EACA,KAAM,UACN,QAASC,EAAQ,IAAIO,IAAU,CAC7B,MAAON,EAAWM,CAAK,EACvB,QAASL,EAASK,CAAK,CACzB,EAAE,CACJ,CACF,CACR,CAYO,SAASC,GAAqB,CACnC,aAAAC,EACA,cAAAC,EACA,aAAAC,EACA,cAAAC,CACF,EAKe,CAEb,IAAMC,EAASH,EAAc,CAAC,GAAG,UAAYD,EAAa,OAC1D,MAAO,CACL,GAAGZ,GAAU,CACX,MAAOH,GACP,KAAMoB,GACN,QAASL,EACT,WAAYM,GAAK,GAAGA,EAAE,MAAM,IAAIC,GAASD,CAAC,CAAC,GAC3C,SAAUA,GAAK,IAAM,CACnBJ,EAAa,CAAE,SAAUI,EAAG,SAAUA,EAAE,MAAO,CAAC,CAClD,CACF,CAAC,EACD,GAAIN,EAAa,QAAU,EACvBZ,GAAU,CAGR,MAAO,GAAGF,EAAa,KAAKkB,CAAM,eAClC,KAAMI,GACN,QAASP,EACT,WAAYQ,GACVA,EAAM,SAAWL,EACb,GAAGK,EAAM,IAAI,KAAKA,EAAM,QAAQ,OAAOL,CAAM,IAC7CK,EAAM,KACZ,iBAAkB,GAClB,iBAAkBtB,GAClB,SAAUsB,GAAS,IAAM,CACvBN,EAAcM,EAAM,OAAO,CAC7B,CACF,CAAC,EACD,CAAC,CACP,CACF,CA0BO,SAASC,GAAoB,CAClC,IAAAC,EACA,UAAAC,EACA,UAAAC,EACA,aAAAX,EACA,YAAAY,CACF,EAQe,CACb,IAAMvB,EAAU,CACdoB,EACI,CACE,MAAO,WAAWA,EAAI,QAAQ,WAAMJ,GAASI,EAAI,QAAQ,CAAC,GAC1D,OAAQA,CACV,EACA,OAKJC,GAAaA,EAAU,WAAaD,GAAK,SACrC,CACE,MAAO,WAAWC,EAAU,QAAQ,2BACpC,OAAQA,CACV,EACA,MACN,EAAE,OAAOd,GAASA,IAAU,MAAS,EAKrC,MAAO,CACL,GAAIgB,GAAeD,EACf,CACE,CACE,MAAO,gBAAgBA,EAAU,QAAQ,GACzC,KAAME,GACN,QAAS,IAAM,CACbD,EAAYD,CAAS,CACvB,CACF,CACF,EACA,CAAC,EACL,GAAGtB,EAAQ,IAAI,CAAC,CAAE,MAAAF,EAAO,OAAA2B,CAAO,KAAO,CACrC,MAAA3B,EACA,KAAMgB,GACN,QAAS,IAAM,CACbH,EAAac,CAAM,CACrB,CACF,EAAE,CACJ,CACF,CCzMA,SAASC,EAAWC,EAAS,CAC3B,IAAMC,EAAQD,EAAQ,MAAM,GAAG,EACzBE,EAAYD,EAAM,QAAU,EAAI,OAAOA,EAAM,CAAC,CAAC,EAAI,OAAO,IAChE,MAAO,CACL,OAAQA,EAAM,CAAC,GAAKD,EACpB,UAAW,OAAO,SAASE,CAAS,EAAIA,EAAY,MACtD,CACF,CACA,SAASC,GAAWC,EAAMC,EAAMC,EAAKC,EAAS,CAC5C,IAAMC,EAAU,CAAC,EACXC,EAAU,CAAC,EACXC,EAAQ,CAACN,CAAI,EAEnB,IADAG,EAAQ,IAAIH,CAAI,EACTM,EAAM,OAAS,GAAG,CACvB,IAAMC,EAAKD,EAAM,IAAI,EACfE,EAAOP,EAAK,IAAIM,CAAE,EACxB,GAAIC,EAAM,CACRJ,EAAQ,KAAKI,CAAI,EACjB,QAAWC,KAAcP,EAAI,IAAIK,CAAE,GAAK,CAAC,EAAG,CAC1C,IAAMG,EAAWT,EAAK,IAAIQ,CAAU,EAChCC,IACEA,EAAS,OAAO,OAASC,EAC3BN,EAAQ,KAAKK,CAAQ,EACXP,EAAQ,IAAIM,CAAU,IAChCN,EAAQ,IAAIM,CAAU,EACtBH,EAAM,KAAKG,CAAU,GAG3B,CACF,CACF,CACA,MAAO,CAAE,QAAAL,EAAS,QAAAC,CAAQ,CAC5B,CACA,SAASO,GAAWP,EAAS,CAE3B,GADiB,IAAI,IAAIA,EAAQ,IAAKQ,GAAMA,EAAE,OAAO,OAAO,CAAC,EAChD,OAAS,GAAKR,EAAQ,OAAS,EAC1C,OAEF,IAAMS,EAAS,CAAC,GAAGT,CAAO,EAAE,KAAK,CAACQ,EAAGE,IAAMF,EAAE,OAAO,MAAQE,EAAE,OAAO,KAAK,EACpEC,EAAQF,EAAO,CAAC,EAChBG,EAAOH,EAAO,GAAG,EAAE,EACnBI,EAAQF,EAAM,OAAO,MAAQA,EAAM,OACnCG,EAAMF,EAAK,OAAO,MACxB,OAAOE,GAAOD,EAAQ,CAAE,MAAAA,EAAO,IAAAC,EAAK,MAAOH,CAAM,EAAI,MACvD,CACA,SAASI,GAAahB,EAASiB,EAAOnB,EAAK,CACzC,IAAMD,EAAO,IAAI,IAAIG,EAAQ,IAAKkB,GAAM,CAACA,EAAE,GAAIA,CAAC,CAAC,CAAC,EAC5CC,EAAuB,IAAI,IAC3BjB,EAAQ,CAAC,EACf,QAAWG,KAAcP,EAAI,IAAImB,EAAM,EAAE,GAAK,CAAC,EACzCpB,EAAK,IAAIQ,CAAU,IACrBc,EAAK,IAAId,EAAY,CAAC,EACtBH,EAAM,KAAKG,CAAU,GAGzB,GAAIH,EAAM,SAAW,EACnB,QAAWkB,KAAUpB,EACnBmB,EAAK,IAAIC,EAAO,GAAI,CAAC,EACrBlB,EAAM,KAAKkB,EAAO,EAAE,EAGxB,QAAWjB,KAAMD,EAAO,CACtB,IAAMmB,EAAQF,EAAK,IAAIhB,CAAE,EAAIN,EAAK,IAAIM,CAAE,EAAE,OAC1C,QAAWE,KAAcP,EAAI,IAAIK,CAAE,GAAK,CAAC,EACvC,GAAIN,EAAK,IAAIQ,CAAU,EAAG,CACxB,IAAMiB,EAAQH,EAAK,IAAId,CAAU,GAC7BiB,IAAU,QAAUD,EAAQC,KAC9BH,EAAK,IAAId,EAAYgB,CAAK,EAC1BnB,EAAM,KAAKG,CAAU,EAEzB,CAEJ,CACA,OAAOc,CACT,CACA,SAASI,GAAWvB,EAASiB,EAAOnB,EAAK,CACvC,IAAMqB,EAAOH,GAAahB,EAASiB,EAAOnB,CAAG,EACvC0B,EAAU,CAAC,GAAGxB,CAAO,EAAE,KAAK,CAACS,EAAGE,IAAMQ,EAAK,IAAIV,EAAE,EAAE,EAAIU,EAAK,IAAIR,EAAE,EAAE,CAAC,EACrEc,EAAO,IAAI,IAAID,EAAQ,IAAI,CAACN,EAAGQ,IAAM,CAACR,EAAE,GAAIQ,CAAC,CAAC,CAAC,EAC/C7B,EAAO,IAAI,IAAIG,EAAQ,IAAKkB,GAAM,CAACA,EAAE,GAAIA,CAAC,CAAC,CAAC,EAC5CS,EAA0B,IAAI,IACpC,OAAW,CAACD,EAAGN,CAAM,IAAKI,EAAQ,QAAQ,EAAG,CAC3C,IAAII,EAAS,EACb,QAAWvB,KAAcP,EAAI,IAAIsB,EAAO,EAAE,GAAK,CAAC,EAAG,CACjD,IAAMd,EAAWT,EAAK,IAAIQ,CAAU,EAChCC,GAAYmB,EAAK,IAAIpB,CAAU,EAAIqB,IACrCE,EAAS,KAAK,IAAIA,EAAQD,EAAQ,IAAItB,CAAU,EAAIC,EAAS,MAAM,EAEvE,CACAqB,EAAQ,IAAIP,EAAO,GAAIQ,CAAM,CAC/B,CACA,MAAO,CAAE,QAAAD,EAAS,QAAAH,CAAQ,CAC5B,CACA,SAASK,GAAeC,EAAO,CAC7B,IAAMjC,EAAO,IAAI,IACfiC,EAAM,MAAM,OAAOC,CAAU,EAAE,IAAKC,GAAM,CAACA,EAAE,GAAIA,CAAC,CAAC,CACrD,EACMlC,EAAMmC,EAAeH,CAAK,EAC1B/B,EAA0B,IAAI,IAC9BmC,EAAU,CAAC,EACjB,QAAW9B,KAAQP,EAAK,OAAO,EAC7B,GAAIO,EAAK,OAAO,OAASG,GAAkB,CAACR,EAAQ,IAAIK,EAAK,EAAE,EAAG,CAChE,GAAM,CAAE,QAAAJ,EAAS,QAAAC,CAAQ,EAAIN,GAAWS,EAAK,GAAIP,EAAMC,EAAKC,CAAO,EAC7DoC,EAAO3B,GAAWP,CAAO,EAC/B,GAAIkC,EAAM,CACR,GAAM,CAAE,QAAAR,EAAS,QAAAH,CAAQ,EAAID,GAAWvB,EAASmC,EAAK,MAAOrC,CAAG,EAChEoC,EAAQ,KAAK,CACX,MAAOC,EAAK,MACZ,QAASA,EAAK,IAAMA,EAAK,MACzB,QAASX,EAAQ,IAAKN,GAAMA,EAAE,EAAE,EAChC,YAAaM,EAAQ,IAAKN,GAAMS,EAAQ,IAAIT,EAAE,EAAE,CAAC,EACjD,WAAYM,EAAQ,OAClB,CAACY,EAAKlB,IAAM,KAAK,IAAIkB,EAAKT,EAAQ,IAAIT,EAAE,EAAE,EAAIA,EAAE,MAAM,EACtD,CACF,CACF,CAAC,CACH,CACF,CAEF,OAAOgB,EAAQ,KAAK,CAACzB,EAAGE,IAAMF,EAAE,MAAQE,EAAE,KAAK,CACjD,CCzHA,IAAI0B,GAAkB,EAClBC,GAA2B,KAC/B,SAASC,EAAkB,CACzB,MAAAC,EACA,KAAAC,EACA,KAAAC,EACA,UAAAC,CACF,EAAG,CACD,IAAMC,EAAUH,EAAOH,GACjBO,EAAUC,GAAeN,CAAK,EAC9BO,EAAO,IAAI,IAAIP,EAAM,MAAM,IAAKQ,GAAM,CAACA,EAAE,GAAIA,CAAC,CAAC,CAAC,EAChDC,EAAkB,CAAC,EACzB,QAAWC,KAAUL,EAAS,CAC5B,IAAMM,EAAUD,EAAO,QAAUA,EAAO,WACpCC,GAAWd,IACbY,EAAgB,KAAK,CAAE,QAASC,EAAO,QAAS,GAAIC,CAAQ,CAAC,EAE/D,IAAMC,EAAQ,KAAK,IAAIF,EAAO,QAASN,CAAO,EACxCS,EAAQH,EAAO,WAAa,EAAIE,EAAQF,EAAO,WAAa,EAClEA,EAAO,QAAQ,QAAQ,CAACI,EAAQC,IAAM,CACpC,IAAMC,EAAOT,EAAK,IAAIO,CAAM,EAC5B,GAAIE,EAAM,CACR,IAAMC,EAASP,EAAO,YAAYK,CAAC,EAC7BG,EAAON,EAAQF,EAAO,QAAQ,OAC9BS,EAAMC,GAAOV,EAAO,MAAQU,EAAKP,EACjCQ,EAAInB,EAAKc,CAAI,EACnBb,EAAUW,CAAM,EAAID,EAAQ,CAC1B,CAAE,EAAGM,EAAGF,CAAM,EAAG,EAAAI,CAAE,EACnB,CAAE,EAAGF,EAAGF,EAASD,EAAK,MAAM,EAAG,EAAAK,CAAE,CACnC,EAAI,CACF,CAAE,EAAGX,EAAO,MAAQK,EAAIG,EAAM,EAAAG,CAAE,EAChC,CAAE,EAAGX,EAAO,OAASK,EAAI,GAAKG,EAAM,EAAAG,CAAE,CACxC,CACF,CACF,CAAC,CACH,CACA,IAAMC,EAAYC,EAAevB,CAAK,EAChCwB,EAAQ,OAAO,KAAKrB,CAAS,EACnC,QAAWsB,KAAUD,EAAO,CAC1B,IAAME,EAAUvB,EAAUsB,CAAM,EAAE,GAAG,EAAE,EAAE,EACzC,QAAWE,KAAUL,EAAU,IAAIG,CAAM,GAAK,CAAC,EAAG,CAChD,IAAMG,EAAOrB,EAAK,IAAIoB,CAAM,EAC5B,GAAIC,GAAQ,EAAED,KAAUxB,GAAY,CAClC,IAAMkB,EAAInB,EAAK0B,CAAI,EACnBzB,EAAUwB,CAAM,EAAI,CAClB,CAAE,EAAGD,EAAS,EAAAL,CAAE,EAChB,CAAE,EAAGK,EAAUtB,EAAS,EAAAiB,CAAE,CAC5B,EACAG,EAAM,KAAKG,CAAM,CACnB,CACF,CACF,CACA,OAAOlB,CACT,CC5CA,SAASoB,GAAoBC,EAAOC,EAAM,CACxC,IAAMC,EAA0B,IAAI,IACpC,QAAWC,KAAQH,EAAM,MACvB,GAAII,EAAeD,CAAI,EAAG,CACxB,GAAM,CAAE,OAAAE,CAAO,EAAIC,EAAWH,EAAK,OAAO,OAAO,EACjDD,EAAQ,IAAIG,GAASH,EAAQ,IAAIG,CAAM,GAAK,GAAKF,EAAK,MAAM,CAC9D,CAEF,IAAMI,EAAO,IAAI,IAAIN,EAAK,IAAI,CAACI,EAAQG,IAAQ,CAACH,EAAQG,CAAG,CAAC,CAAC,EAC7D,MAAO,CAAC,GAAGN,EAAQ,KAAK,CAAC,EAAE,KACzB,CAACO,EAAGC,KAAOH,EAAK,IAAIE,CAAC,GAAK,MAAaF,EAAK,IAAIG,CAAC,GAAK,MAAaR,EAAQ,IAAIQ,CAAC,EAAIR,EAAQ,IAAIO,CAAC,GAAKA,EAAE,cAAcC,CAAC,CACzH,CACF,CACA,SAASC,GAAgBX,EAAOY,EAAQX,EAAO,CAAC,EAAG,CACjD,IAAMY,EAAWC,EAAcd,CAAK,EAC9Be,EAAUhB,GAAoBC,EAAOC,CAAI,EAC/C,GAAIY,EAAS,SAAW,GAAKE,EAAQ,SAAW,EAC9C,OAEF,IAAMC,EAAOC,EAAcJ,EAAUD,CAAM,EACrCM,EAAQ,IAAI,IAAIH,EAAQ,IAAI,CAACI,EAAGC,IAAM,CAACD,EAAGC,EAAI,CAAC,CAAC,CAAC,EACjDC,EAAgBC,EAAkBT,CAAQ,EAC1CU,EAAWR,EAAQ,OAAS,EAC5BS,EAAkBC,EAAkB,CACxC,MAAAzB,EACA,KAAAgB,EACA,KAAOb,GAAS,CACd,IAAMuB,EAASvB,EAAK,OAEpB,QADYuB,EAASR,EAAM,IAAIZ,EAAWoB,EAAO,OAAO,EAAE,MAAM,EAAI,SACrDH,GAAYI,CAC7B,EACA,UAAWN,CACb,CAAC,EAEKO,EAAY,CAChB,CAAE,MAFoBtB,EAAWO,EAAS,CAAC,EAAE,OAAO,OAAO,EAAE,OAEnC,EAAG,CAAE,EAC/B,GAAGE,EAAQ,IAAKV,IAAY,CAC1B,MAAOA,EACP,EAAGa,EAAM,IAAIb,CAAM,EAAIsB,CACzB,EAAE,CACJ,EACA,MAAO,CACL,cAAAN,EACA,UAAAO,EACA,WAAYb,EACZ,cAAe,GACf,UAAW,GACX,gBAAAS,CACF,CACF,CChDA,SAASK,GAAaC,EAAO,CAC3B,IAAMC,EAA0B,IAAI,IACpC,OAAW,CAACC,EAASC,CAAM,IAAKH,EAAM,YAAc,CAAC,EACnD,QAAWI,KAASD,EAAQ,CAC1B,IAAME,EAAM,GAAGD,EAAM,IAAI,IAAIF,CAAO,GAC9BI,EAAOL,EAAQ,IAAII,CAAG,EACxBC,EACFA,EAAK,KAAKF,EAAM,MAAM,EAEtBH,EAAQ,IAAII,EAAK,CAACD,EAAM,MAAM,CAAC,CAEnC,CAEF,OAAOH,CACT,CACA,SAASM,GAAcP,EAAO,CAC5B,IAAMQ,EAAW,IAAI,IAAIR,EAAM,MAAM,IAAKS,GAAM,CAACA,EAAE,GAAIA,CAAC,CAAC,CAAC,EACpDR,EAAUF,GAAaC,CAAK,EAC5BU,GAASV,EAAM,OAAS,CAAC,GAAG,IAAI,CAACW,EAAMC,KAAW,CAAE,KAAAD,EAAM,MAAAC,CAAM,EAAE,EAClEC,EAAYH,EAAM,UACrBI,GAAMC,EAAWD,EAAE,KAAK,IAAI,EAAE,OAASd,EAAM,aAChD,EACA,OAAIa,EAAY,GACdH,EAAM,QAAQ,GAAGA,EAAM,OAAOG,EAAW,CAAC,CAAC,EAEtCH,EAAM,QAAQ,CAAC,CAAE,KAAAC,EAAM,MAAAC,CAAM,IAAM,CACxC,IAAMI,EAAYD,EAAWJ,EAAK,IAAI,EAAE,KAClCM,EAAuB,IAAI,IAC3BC,EAAWP,EAAK,QAAQ,QAASQ,GAAO,CAC5C,IAAMC,EAAOZ,EAAS,IAAIW,CAAE,EAC5B,GAAI,CAACC,EACH,MAAO,CAAC,EAEV,IAAMC,EAAIJ,EAAK,IAAIG,EAAK,IAAI,GAAK,EACjCH,EAAK,IAAIG,EAAK,KAAMC,EAAI,CAAC,EACzB,IAAMC,EAASrB,EAAQ,IAAI,GAAGe,CAAS,IAAII,EAAK,IAAI,EAAE,IAAIC,CAAC,GAAKE,GAAgBH,CAAI,EACpF,MAAO,CAACI,GAASJ,EAAME,CAAM,CAAC,CAChC,CAAC,EACD,OAAOJ,EAAS,OAAS,EAAI,CAC3B,CACE,GAAIN,EACJ,KAAMD,EAAK,KACX,SAAAO,EACA,cAAe,EACf,KAAM,WACR,CACF,EAAI,CAAC,CACP,CAAC,CACH,CACA,SAASO,GAAazB,EAAO,CAC3B,OAAOA,EAAM,MAAM,IAAKS,IAAO,CAC7B,KAAMA,EAAE,GACR,IAAK,GACL,eAAgB,KAAK,IAAI,EAAGA,EAAE,MAAM,CACtC,EAAE,CACJ,CACA,SAASiB,EAAgB1B,EAAO,CAC9B,OAAQA,EAAM,OAAO,QAAU,GAAK,CACtC,CACA,IAAI2B,GAAW,IACXC,GAAc,EACdC,GAAc,GAClB,SAASC,GAAUC,EAAY,CAC7B,OAAO,KAAK,IACVH,GACA,KAAK,IAAIC,GAAa,KAAK,MAAMF,GAAW,KAAK,IAAI,EAAGI,CAAU,CAAC,CAAC,CACtE,CACF,CACA,SAASC,GAAWhC,EAAO,CACzB,IAAMU,EAAQV,EAAM,OAAS,CAAC,EACxBiC,EAAS1B,GAAcP,CAAK,EAC5BkC,EAAQlC,EAAM,MAAQmC,GAAanC,EAAOA,EAAM,MAAOU,EAAM,MAAM,EAAI,CAAC,EACxE0B,EAAYF,EAAM,OAAS,EAAIG,GAAmBC,GAClDC,EAAa7B,EAAM,IAAI,CAAC8B,EAAGC,IAAML,EAAUK,EAAG/B,EAAM,MAAM,CAAC,EAC3DgC,EAASC,GAAclB,GAAazB,CAAK,EAAGiC,EAAQC,EAAO,CAC/D,gBAAiB,aACjB,WAAYJ,GAAUG,EAAO,MAAM,CACrC,CAAC,EACD,OAAOS,EAAS,CAAE,OAAAA,EAAQ,WAAAH,CAAW,EAAI,MAC3C,CACA,SAASK,GAAWF,EAAQ,CAC1B,IAAMG,EAAQ,CAAC,EACf,OAAAH,EAAO,MAAM,QAAStB,GAAS,CACzBA,EAAK,OAAS,GAChByB,EAAM,KAAKzB,CAAI,CAEnB,CAAC,EACMyB,CACT,CACA,SAASC,GAAW1B,EAAM2B,EAASC,EAAIC,EAAI,CACzC,IAAMC,EAAI9B,EAAK,EAAIA,EAAK,cAAgB,EAAI2B,EAC5C,MAAO,CACL,CAAE,EAAGC,EAAI,EAAAE,CAAE,EACX,CAAE,EAAGD,EAAI,EAAAC,CAAE,CACb,CACF,CACA,SAASC,GAAST,EAAQK,EAAS,CACjC,MAAO,CACL,KAAML,EAAO,OAAO,KAAOK,EAC3B,KAAML,EAAO,OAAO,KAAOK,CAC7B,CACF,CACA,SAASK,GAAcpD,EAAO,CAC5B,IAAMqD,EAAM3B,EAAgB1B,CAAK,EAAIgC,GAAWhC,CAAK,EAAI,OACzD,GAAI,CAACqD,EACH,OAEF,GAAM,CAAE,OAAAX,EAAQ,WAAAH,CAAW,EAAIc,EACzBN,EAAUL,EAAO,OAAO,KACxBY,EAAgB,CAAC,EACvB,QAAWlC,KAAQwB,GAAWF,CAAM,EAClCY,EAAclC,EAAK,IAAI,EAAI0B,GACzB1B,EACA2B,EACA3B,EAAK,EACLA,EAAK,EAAIA,EAAK,UAChB,EAEF,GAAM,CAAE,KAAAmC,EAAM,KAAAC,CAAK,EAAIL,GAAST,EAAQK,CAAO,EAC/C,MAAO,CACL,cAAAO,EACA,QAAS,CAAE,OAAAZ,EAAQ,QAAAK,EAAS,WAAAR,CAAW,EACvC,OAAQ,CACN,KAAMG,EAAO,OAAO,KACpB,KAAMA,EAAO,OAAO,KACpB,KAAAa,EACA,KAAAC,CACF,CACF,CACF,CACA,SAASC,GAAezD,EAAO0C,EAAQ,CACrC,IAAMlC,EAAW,IAAI,IAAIR,EAAM,MAAM,IAAKS,GAAM,CAACA,EAAE,GAAIA,CAAC,CAAC,CAAC,EACpDiD,EAA0B,IAAI,IACpC,QAAWtC,KAAQwB,GAAWF,CAAM,EAAG,CACrC,IAAMpC,EAAOoD,EAAQ,IAAItC,EAAK,KAAK,EAC/Bd,EACFA,EAAK,KAAKc,CAAI,EAEdsC,EAAQ,IAAItC,EAAK,MAAO,CAACA,CAAI,CAAC,CAElC,CACA,IAAMuC,EAAU,CAAC,EACbC,EAAM,KACV,QAAWC,IAAS,CAAC,GAAGH,EAAQ,KAAK,CAAC,EAAE,KAAK,CAACI,EAAGC,IAAMD,EAAIC,CAAC,EAAG,CAC7D,IAAMlB,EAAQa,EAAQ,IAAIG,CAAK,EAC3BG,EAAM,IACNC,EAAM,KACV,QAAW7C,KAAQyB,EAAO,CACxB,IAAMqB,EAAY1D,EAAS,IAAIY,EAAK,IAAI,EACpC8C,GAAaC,EAAWD,CAAS,IACnCF,EAAM,KAAK,IAAIA,EAAKE,EAAU,OAAO,KAAK,EAC1CD,EAAM,KAAK,IAAIA,EAAKC,EAAU,OAAO,MAAQ9C,EAAK,cAAc,EAEpE,CACI4C,IAAQ,MACVA,EAAMC,EAAML,GAEVI,EAAMJ,IACRI,EAAMJ,EACNK,EAAM,KAAK,IAAIL,EAAKK,CAAG,GAEzBL,EAAM,KAAK,IAAIA,EAAKK,CAAG,EACvBN,EAAQ,KAAK,CACX,MAAAE,EACA,GAAI,KAAK,IAAI,GAAGhB,EAAM,IAAKpC,GAAMA,EAAE,CAAC,CAAC,EACrC,GAAI,KAAK,IAAI,GAAGoC,EAAM,IAAKpC,GAAMA,EAAE,EAAIA,EAAE,UAAU,CAAC,EACpD,IAAAuD,EACA,IAAAC,CACF,CAAC,CACH,CACA,IAAMG,EAAQT,EAAQ,KAAM,GAAM,EAAE,MAAQ,IAAS,EACrD,QAAWU,KAAUV,EACfU,EAAO,MAAQ,OACjBA,EAAO,IAAMA,EAAO,IAAMD,GAAO,KAAO,GAG5C,OAAOT,CACT,CACA,SAASW,GAAmBtE,EAAO,CACjC,OAAOA,EAAM,MAAM,KAAKmE,CAAU,GAAKzC,EAAgB1B,CAAK,CAC9D,CACA,SAASuE,GAAuBvE,EAAO,CACrC,IAAMqD,EAAMiB,GAAmBtE,CAAK,EAAIgC,GAAWhC,CAAK,EAAI,OAC5D,GAAI,CAACqD,EACH,OAEF,GAAM,CAAE,OAAAX,EAAQ,WAAAH,CAAW,EAAIc,EACzBM,EAAUF,GAAezD,EAAO0C,CAAM,EACtCgB,EAAU,IAAI,IAAIC,EAAQ,IAAKa,GAAM,CAACA,EAAE,MAAOA,CAAC,CAAC,CAAC,EAClDzB,EAAUL,EAAO,OAAO,KACxBY,EAAgB,CAAC,EACvB,QAAWlC,KAAQwB,GAAWF,CAAM,EAAG,CACrC,IAAM2B,EAASX,EAAQ,IAAItC,EAAK,KAAK,EACrCkC,EAAclC,EAAK,IAAI,EAAI0B,GAAW1B,EAAM2B,EAASsB,EAAO,IAAKA,EAAO,GAAG,CAC7E,CACA,MAAO,CACL,cAAAf,EACA,QAAS,CAAE,OAAAZ,EAAQ,QAAAK,EAAS,QAAAY,EAAS,WAAApB,CAAW,EAChD,cAAe,GACf,UAAW,GACX,OAAQY,GAAST,EAAQK,CAAO,CAClC,CACF,CC/MA,SAAS0B,GAASC,EAAO,CACvB,IAAMC,EAA0B,IAAI,IACpC,QAAWC,KAAQF,EAAM,MACnBE,EAAK,QACPD,EAAQ,IAAIC,EAAK,OAAO,IAAI,EAGhC,OAAO,IAAI,IAAI,CAAC,GAAGD,CAAO,EAAE,KAAK,CAACE,EAAGC,IAAMD,EAAIC,CAAC,EAAE,IAAI,CAACC,EAAGC,IAAM,CAACD,EAAGC,CAAC,CAAC,CAAC,CACzE,CACA,SAASC,GAAeP,EAAOQ,EAAQ,CACrC,IAAMC,EAAWC,EAAcV,CAAK,EACpC,GAAIS,EAAS,SAAW,EACtB,OAEF,IAAME,EAAOC,EAAcH,EAAUD,CAAM,EACrCK,EAAOd,GAASC,CAAK,EACrBc,EAAgBC,EAAkBN,CAAQ,EAC1CO,EAAkBC,EAAkB,CACxC,MAAAjB,EACA,KAAAW,EACA,KAAOT,IAAUA,EAAK,OAASW,EAAK,IAAIX,EAAK,OAAO,IAAI,GAAKW,EAAK,KAAOA,EAAK,MAAQK,EACtF,UAAWJ,CACb,CAAC,EACKK,EAAY,CAAC,GAAGN,CAAI,EAAE,IAAI,CAAC,CAACO,EAAMC,CAAG,KAAO,CAChD,MAAOD,IAAS,EAAI,qBAAuB,QAAQA,CAAI,GACvD,EAAGC,EAAMH,CACX,EAAE,EACF,MAAO,CACL,cAAAJ,EACA,UAAAK,EACA,cAAe,GACf,UAAW,GACX,gBAAAH,CACF,CACF,CCvCA,IAAIM,GAAS,GACTC,GAAUC,EACd,SAASC,GAAUC,EAAM,CACvB,MAAO,IAAK,EAAI,KAAK,KAAK,EAAIA,EAAK,MAAM,CAC3C,CACA,SAASC,EAAQC,EAAGC,EAAG,CACrB,OAAOD,EAAIC,EAAI,GAAKD,EAAIC,EAAI,EAAI,CAClC,CACA,SAASC,GAAYF,EAAGC,EAAG,CACzB,OAAOF,EAAQC,EAAE,GAAIC,EAAE,EAAE,GAAKF,EAAQC,EAAE,KAAMC,EAAE,IAAI,GAAKF,EAAQC,EAAE,KAAMC,EAAE,IAAI,CACjF,CACA,IAAIE,GAAY,CAAE,GAAI,IAAU,KAAM,EAAG,KAAM,CAAE,EACjD,SAASC,GAAeC,EAAO,CAC7B,IAAMC,EAAO,IAAI,IAAID,EAAM,MAAM,IAAKE,GAAM,CAACA,EAAE,GAAIA,CAAC,CAAC,CAAC,EAChDC,EAAMC,GAAUJ,CAAK,EAC3B,OAAOA,EAAM,MAAM,IAAKE,GAAMA,EAAE,EAAE,EAAE,KAClC,CAACP,EAAGC,IAAMC,GAAYM,EAAI,IAAIR,CAAC,GAAKG,GAAWK,EAAI,IAAIP,CAAC,GAAKE,EAAS,GAAKJ,EAAQO,EAAK,IAAIN,CAAC,EAAE,KAAMM,EAAK,IAAIL,CAAC,EAAE,IAAI,GAAKF,EAAQC,EAAGC,CAAC,CACxI,CACF,CACA,SAASS,GAAaL,EAAOM,EAAU,CACrC,IAAMC,EAAS,IAAI,IAAIP,EAAM,MAAM,IAAKE,GAAMA,EAAE,EAAE,CAAC,EAC7CM,EAAU,IAAI,IAAIF,EAAS,IAAKJ,GAAM,CAACA,EAAE,GAAIA,EAAE,OAAO,KAAK,CAAC,CAAC,EAC7DO,EAAuB,IAAI,IAC3BC,EAAuB,IAAI,IACjCJ,EAAS,QAAQ,CAACJ,EAAGS,IAAM,CACzBD,EAAK,IAAIR,EAAE,GAAII,EAASK,EAAI,CAAC,GAAG,EAAE,EAClCF,EAAK,IAAIP,EAAE,GAAII,EAASK,EAAI,CAAC,GAAG,EAAE,CACpC,CAAC,EACD,IAAIC,EAAON,EAAS,CAAC,GAAG,GAClBO,EAAc,CAACC,EAAIC,IAAO,CAC9B,IAAMC,EAAQP,EAAK,IAAIK,CAAE,EACzBL,EAAK,IAAIK,EAAIC,CAAE,EACfL,EAAK,IAAIK,EAAID,CAAE,EACfL,EAAK,IAAIM,EAAIC,CAAK,EACdA,IAAU,QACZN,EAAK,IAAIM,EAAOD,CAAE,CAEtB,EACME,EAAe,CAACH,EAAIC,IAAO,CAC/B,IAAMG,EAASR,EAAK,IAAII,CAAE,EACtBI,IAAW,QACbN,EAAOG,EACPL,EAAK,IAAIK,EAAI,MAAM,EACnBN,EAAK,IAAIM,EAAID,CAAE,EACfJ,EAAK,IAAII,EAAIC,CAAE,GAEfF,EAAYK,EAAQH,CAAE,CAE1B,EACA,QAAWI,KAAQnB,EAAM,OAAS,CAAC,EAAG,CACpC,IAAIoB,EAAS,EACTC,EAAU,EACVC,EACJ,QAAWP,KAAMI,EAAK,QAAS,CAC7B,IAAMI,EAAQf,EAAQ,IAAIO,CAAE,EACxBQ,IAAU,SACRD,IAAS,QAAUC,IAAUD,IAC3BC,EAAQD,EACVF,IAEAC,KAGJC,EAAOC,EAEX,CACA,IAAMC,EAAMH,EAAUD,EAAS,CAAC,GAAGD,EAAK,OAAO,EAAE,QAAQ,EAAIA,EAAK,QAC9DM,EACEC,EAA0B,IAAI,IACpC,QAAWX,KAAMS,EACf,GAAIf,EAAK,IAAIM,CAAE,EAAG,CAChB,GAAIU,IAAS,OACX,QAAWE,KAAQD,EACjBT,EAAaF,EAAIY,CAAI,EAGzBF,EAAOV,CACT,MAAWR,EAAO,IAAIQ,CAAE,IAClBU,IAAS,OACXC,EAAQ,IAAIX,CAAE,GAEdF,EAAYY,EAAMV,CAAE,EACpBU,EAAOV,GAIf,CACA,IAAMa,EAAS,CAAC,EAChB,QAASb,EAAKH,EAAMG,IAAO,OAAQA,EAAKN,EAAK,IAAIM,CAAE,EACjDa,EAAO,KAAKb,CAAE,EAEhB,OAAOa,CACT,CACA,SAASC,GAAcC,EAAU3B,EAAK,CACpC,IAAM4B,EAAQ,CAAC,GAAG5B,EAAI,QAAQ,CAAC,EAAE,KAAK,CAAC,CAACR,EAAGqC,CAAE,EAAG,CAACpC,EAAGqC,CAAE,IAAMpC,GAAYmC,EAAIC,CAAE,GAAKvC,EAAQC,EAAGC,CAAC,CAAC,EAAE,IAAI,CAAC,CAACmB,CAAE,IAAMA,CAAE,EAC5Ga,EAASG,EAAM,OACrB,QAAWhB,KAAMgB,EAAO,CACtB,IAAMN,EAAOtB,EAAI,IAAIY,CAAE,EACvB,QAAWmB,KAAMJ,EAAS,IAAIf,CAAE,GAAK,CAAC,EAC/BZ,EAAI,IAAI+B,CAAE,IACb/B,EAAI,IAAI+B,EAAI,CAAE,GAAIT,EAAK,GAAI,KAAM,EAAG,KAAMA,EAAK,KAAO,CAAE,CAAC,EACzDM,EAAM,KAAKG,CAAE,EAGnB,CACA,IAAMC,EAAW,IAAI,IAAIJ,EAAM,MAAMH,CAAM,CAAC,EACtCQ,EAAwB,IAAI,IAClC,QAAWC,KAAQF,EAAU,CAC3B,GAAIC,EAAM,IAAIC,CAAI,EAChB,SAEF,GAAM,CAAE,GAAAvB,CAAG,EAAIX,EAAI,IAAIkC,CAAI,EACrBC,EAAM,CAACD,CAAI,EACjBD,EAAM,IAAIC,CAAI,EACd,IAAIE,EAAU,GACd,QAAWxB,KAAMuB,EAAK,CACpB,GAAM,CAAE,KAAAE,CAAK,EAAIrC,EAAI,IAAIY,CAAE,EACvB0B,EAAU,GACVC,EAAc,GAClB,QAAWR,KAAMJ,EAAS,IAAIf,CAAE,GAAK,CAAC,EAAG,CACvC,IAAM4B,EAAQxC,EAAI,IAAI+B,CAAE,EACpBS,EAAM,KAAO7B,GAAMqB,EAAS,IAAID,CAAE,GACpCO,IAAYE,EAAM,MAAQH,EACrBJ,EAAM,IAAIF,CAAE,IACfE,EAAM,IAAIF,CAAE,EACZI,EAAI,KAAKJ,CAAE,IAEJS,EAAM,KAAO7B,IACtB4B,IAAgBC,EAAM,GAAK7B,EAC3ByB,IAAYI,EAAM,GAAK7B,EAE3B,CACAyB,IAAY,CAACE,GAAWC,CAC1B,CACA,GAAIH,EACF,QAAWxB,KAAMuB,EAAK,CACpB,IAAMM,EAAIzC,EAAI,IAAIY,CAAE,EACpBZ,EAAI,IAAIY,EAAI,CAAE,GAAG6B,EAAG,KAAM,GAAI,KAAM,CAACA,EAAE,IAAK,CAAC,CAC/C,CAEJ,CACF,CACA,SAASxC,GAAUJ,EAAO,CACxB,IAAMwB,EAAM,IAAI,IAAIxB,EAAM,MAAM,IAAKE,GAAMA,EAAE,EAAE,CAAC,EAC1C4B,EAA2B,IAAI,IACrC,QAAWe,KAAK7C,EAAM,MAChB,CAACwB,EAAI,IAAIqB,EAAE,IAAI,GAAK,CAACrB,EAAI,IAAIqB,EAAE,EAAE,KAIpCf,EAAS,IAAIe,EAAE,IAAI,GAAKf,EAAS,IAAIe,EAAE,KAAM,CAAC,CAAC,EAAE,IAAIA,EAAE,IAAI,GAAG,KAAKA,EAAE,EAAE,GACvEf,EAAS,IAAIe,EAAE,EAAE,GAAKf,EAAS,IAAIe,EAAE,GAAI,CAAC,CAAC,EAAE,IAAIA,EAAE,EAAE,GAAG,KAAKA,EAAE,IAAI,GAEtE,IAAMvC,EAAWN,EAAM,MAAM,OAAO8C,CAAU,EAAE,KAC9C,CAACnD,EAAGC,IAAMF,EAAQC,EAAE,OAAO,MAAOC,EAAE,OAAO,KAAK,GAAKF,EAAQC,EAAE,KAAMC,EAAE,IAAI,CAC7E,EACMO,EAAsB,IAAI,IAChC,OAAAE,GAAaL,EAAOM,CAAQ,EAAE,QAAQ,CAACS,EAAIgC,IAAS,CAClD5C,EAAI,IAAIY,EAAI,CAAE,GAAIgC,EAAM,KAAM,EAAG,KAAM,CAAE,CAAC,CAC5C,CAAC,EACDlB,GAAcC,EAAU3B,CAAG,EACpBA,CACT,CACA,SAAS6C,GAAWhD,EAAO,CACzB,IAAMC,EAAO,IAAI,IAAID,EAAM,MAAM,IAAKE,GAAM,CAACA,EAAE,GAAIA,CAAC,CAAC,CAAC,EAChD+C,EAAQlD,GAAeC,CAAK,EAC5BG,EAAM,IAAI,IAAI8C,EAAM,IAAI,CAAClC,EAAIJ,IAAM,CAACI,EAAIJ,CAAC,CAAC,CAAC,EAC3CuC,EAASnC,GAAO+B,EAAW7C,EAAK,IAAIc,CAAE,CAAC,EACvCoC,EAAQ,IAAI,IAAIF,EAAM,IAAKlC,GAAO,CAACA,EAAI,CAAC,CAAC,CAAC,CAAC,EAC3CqC,EAAQ,IAAI,IAAIH,EAAM,IAAKlC,GAAO,CAACA,EAAI,CAAC,CAAC,CAAC,CAAC,EAC3CsC,EAAO,CAAC,EAAGzD,IAAM,CACrBuD,EAAM,IAAIvD,CAAC,EAAE,KAAK,CAAC,EACnBwD,EAAM,IAAI,CAAC,EAAE,KAAKxD,CAAC,CACrB,EACA,QAAWiD,KAAK7C,EAAM,MAChB6C,EAAE,OAASA,EAAE,IAAM,CAAC1C,EAAI,IAAI0C,EAAE,IAAI,GAAK,CAAC1C,EAAI,IAAI0C,EAAE,EAAE,IAGpD1C,EAAI,IAAI0C,EAAE,IAAI,EAAI1C,EAAI,IAAI0C,EAAE,EAAE,EAChCQ,EAAKR,EAAE,KAAMA,EAAE,EAAE,EAEjBQ,EAAKR,EAAE,GAAIA,EAAE,IAAI,GAGrB,IAAMvC,EAAW2C,EAAM,OAAOC,CAAK,EACnC,QAASvC,EAAI,EAAGA,EAAIL,EAAS,OAAQK,IACnC0C,EAAK/C,EAASK,EAAI,CAAC,EAAGL,EAASK,CAAC,CAAC,EAEnC,IAAM2C,EAA0B,IAAI,IACpC,QAAWvC,KAAMkC,EAAO,CACtB,IAAIM,EAAI,EACR,QAAWC,KAAKL,EAAM,IAAIpC,CAAE,EAC1BwC,EAAI,KAAK,IAAIA,EAAGD,EAAQ,IAAIE,CAAC,EAAI,CAAC,EAEpCF,EAAQ,IAAIvC,EAAIwC,CAAC,CACnB,CACA,QAAS5C,EAAIsC,EAAM,OAAS,EAAGtC,GAAK,EAAGA,IAAK,CAC1C,IAAMI,EAAKkC,EAAMtC,CAAC,EACZ8C,EAAIL,EAAM,IAAIrC,CAAE,EACtB,GAAImC,EAAMnC,CAAE,GAAK0C,EAAE,SAAW,EAC5B,SAEF,IAAIC,EAAU,IACd,QAAWC,KAAKF,EACdC,EAAU,KAAK,IAAIA,EAASJ,EAAQ,IAAIK,CAAC,CAAC,EAE5C,IAAMC,EAAKN,EAAQ,IAAIvC,CAAE,EACnB8C,EAAK,KAAK,IAAID,EAAIF,EAAU,CAAC,EACnCJ,EAAQ,IAAIvC,EAAI,KAAK,OAAO6C,EAAKC,GAAM,CAAC,CAAC,CAC3C,CACA,IAAMC,EAAS,CAAC,EAChB,QAAW/C,KAAMkC,GAEda,EAAOR,EAAQ,IAAIvC,CAAE,CAAC,IAAM,CAAC,GAAG,KAAKA,CAAE,EAE1C,MAAO,CAAE,OAAA+C,EAAQ,QAAAR,EAAS,MAAAH,CAAM,CAClC,CACA,SAASY,GAAc/D,EAAO,CAC5B,GAAI,CAACA,EAAM,MAAM,KAAK8C,CAAU,EAC9B,OAEF,IAAM7C,EAAO,IAAI,IAAID,EAAM,MAAM,IAAKE,GAAM,CAACA,EAAE,GAAIA,CAAC,CAAC,CAAC,EAChDgD,EAASnC,GAAO+B,EAAW7C,EAAK,IAAIc,CAAE,CAAC,EACvC,CAAE,OAAA+C,EAAQ,QAASE,EAAO,MAAAb,CAAM,EAAIH,GAAWhD,CAAK,EACpDiE,EAAaH,EAAO,IAAKtC,GAAQ,CACrC,IAAI0C,EAAI,EACR,QAAWnD,KAAMS,EACf0C,EAAI,KAAK,IAAIA,EAAG1E,GAAUS,EAAK,IAAIc,CAAE,CAAC,CAAC,EAEzC,OAAOmD,CACT,CAAC,EACKC,EAAS,CAAC,EACZC,EAAI,EACR,QAASb,EAAI,EAAGA,EAAIO,EAAO,OAAQP,IACjCY,EAAOZ,CAAC,EAAIa,EACZA,GAAKH,EAAWV,CAAC,EAAIlE,GAEvB,IAAMgF,EAAoB,IAAI,IAC9B,QAAW7C,KAAOsC,EAAQ,CACxB,IAAMQ,EAAO,CAAC,EACd,QAAWvD,KAAMS,EAAK,CACpB,GAAI0B,EAAMnC,CAAE,EAAG,CACbsD,EAAE,IAAItD,EAAI,CAAC,EACX,QACF,CACA,IAAMa,EAASuB,EAAM,IAAIpC,CAAE,EAAE,OAAQyC,GAAMa,EAAE,IAAIb,CAAC,CAAC,EAC/Ce,EAAQ,EACZ,QAAWf,KAAK5B,EACd2C,GAASF,EAAE,IAAIb,CAAC,EAAI5B,EAAO,OAE7B0C,EAAK,KAAK,CAAE,GAAAvD,EAAI,MAAOwD,IAAU,EAAIjF,GAAUiF,CAAM,CAAC,CACxD,CACAD,EAAK,KAAK,CAAC3E,EAAGC,IAAMD,EAAE,MAAQC,EAAE,KAAK,EACrC,IAAM4E,EAAwB,IAAI,IAAI,CAAC,CAAC,CAAC,EACzC,OAAW,CAAE,GAAAzD,EAAI,MAAAwD,CAAM,IAAKD,EAAM,CAChC,IAAIG,EAAO,KAAK,MAAMF,EAAQjF,EAAO,EACjCmF,IAAS,IACXA,EAAOF,GAAS,EAAI,EAAI,IAE1B,QAASG,EAAI,EAAGF,EAAM,IAAIC,CAAI,EAAGC,IAC1BF,EAAM,IAAIC,EAAOC,CAAC,EAEXF,EAAM,IAAIC,EAAOC,CAAC,IAC5BD,GAAQC,GAFRD,GAAQC,EAKZF,EAAM,IAAIC,CAAI,EACdJ,EAAE,IAAItD,EAAI0D,EAAOnF,EAAO,CAC1B,CACF,CACA,IAAMqF,EAAgB,CAAC,EACvB,QAAWzE,KAAKF,EAAM,MAAO,CAC3B,IAAMuD,EAAIS,EAAM,IAAI9D,EAAE,EAAE,EAClBgE,EAAI1E,GAAUU,CAAC,EACf0E,EAAKT,EAAOZ,CAAC,EAAIU,EAAWV,CAAC,EAAI,EACjCsB,EAAKR,EAAE,IAAInE,EAAE,EAAE,EACrByE,EAAczE,EAAE,EAAE,EAAI,CACpB,CAAE,EAAG0E,EAAKV,EAAI,EAAG,EAAGW,CAAG,EACvB,CAAE,EAAGD,EAAKV,EAAI,EAAG,EAAGW,CAAG,CACzB,CACF,CACA,MAAO,CAAE,cAAAF,EAAe,cAAe,GAAO,UAAW,EAAK,CAChE,CCzRA,SAASG,GAASC,EAAM,CACtB,OAAOA,EAAK,QAAUC,EAAYD,EAAK,IAAI,CAC7C,CACA,SAASE,GAAQF,EAAM,CACrB,OAAOA,EAAK,YAAc,QAAUA,EAAK,SAAW,OAAS,GAAGA,EAAK,MAAM,IAAIA,EAAK,SAAS,GAAKD,GAASC,CAAI,CACjH,CACA,SAASG,GAAQC,EAAQC,EAAU,CACjC,IAAMC,EAAQ,CAAC,EACXC,EACJ,QAAWC,KAASJ,EAAQ,CACtBG,IAAQ,QAAUC,EAAM,QAAU,QAAUA,EAAM,MAAQD,GAC5DD,EAAM,KAAKE,EAAM,MAAQD,CAAG,EAE9BD,EAAM,KAAK,GAAGE,EAAM,OAAO,EAC3B,IAAMC,EAAKD,EAAM,QAAQ,OACvB,CAACE,EAAKC,IAAOD,GAAOL,EAAS,IAAIM,CAAE,GAAK,GACxC,CACF,EACAJ,EAAMC,EAAM,QAAU,OAAS,OAASA,EAAM,MAAQC,CACxD,CACA,OAAOH,CACT,CACA,SAASM,GAAUR,EAAQC,EAAU,CACnC,IAAMQ,EAAQ,CAAC,EACXN,EACJ,QAAWC,KAASJ,EAAQ,CAC1B,GAAII,EAAM,QAAU,QAAUD,IAAQ,QAAUC,EAAM,MAAQD,EAC5D,OAEEA,IAAQ,QAAUC,EAAM,MAAQD,GAClCM,EAAM,KAAK,CAAE,MAAON,EAAK,IAAKC,EAAM,KAAM,CAAC,EAE7C,IAAIM,EAAMN,EAAM,MAChB,QAAWG,KAAMH,EAAM,QAAS,CAC9B,IAAMO,EAAMV,EAAS,IAAIM,CAAE,GAAK,EAChCE,EAAM,KAAK,CAAE,MAAOC,EAAK,IAAKA,EAAMC,CAAI,CAAC,EACzCD,GAAOC,CACT,CACAR,EAAMO,CACR,CACA,OAAOD,CACT,CACA,SAASG,GAAaV,EAAOW,EAAMC,EAAQC,EAAU,GAAM,CACzD,GAAI,CAACD,GAAU,CAACC,EACd,MAAO,CAAE,IAAKb,EAAO,SAAU,GAAM,KAAM,GAAI,GAAI,EAAG,EAExD,IAAIc,EAAK,GACLC,EAAK,GACLC,EAAU,KACVC,EAAY,IAchB,GAbAjB,EAAM,QAAQ,CAACK,EAAIa,IAAM,CACvB,IAAMC,EAAI,OAAOd,GAAO,SAAWM,EAAK,IAAIN,CAAE,EAAI,OAC9Cc,IACEA,EAAE,KAAOP,EAAO,OAASO,EAAE,IAAMH,IACnCA,EAAUG,EAAE,IACZL,EAAKI,GAEHC,EAAE,OAASP,EAAO,KAAOO,EAAE,MAAQF,IACrCA,EAAYE,EAAE,MACdJ,EAAKG,GAGX,CAAC,EACGJ,EAAK,GAAKC,EAAK,EACjB,MAAO,CAAE,IAAKf,EAAO,SAAU,GAAO,KAAM,GAAI,GAAI,EAAG,EAEzD,IAAMoB,EAAMpB,EAAM,MAAM,KAAK,IAAIc,EAAIC,CAAE,EAAI,EAAG,KAAK,IAAID,EAAIC,CAAE,CAAC,EAC9D,MAAO,CACL,IAAKD,EAAKC,EAAKK,EAAMA,EAAI,QAAQ,EACjC,SAAU,GACV,KAAMN,EACN,GAAIC,CACN,CACF,CACA,SAASM,GAAcC,EAAMC,EAAS,CACpC,OAAOA,EAAUD,EAAK,OAAQE,GAAMD,EAAQ,SAASC,EAAE,MAAM,CAAC,EAAE,KAC9D,CAACC,EAAGC,IAAMH,EAAQ,QAAQE,EAAE,MAAM,EAAIF,EAAQ,QAAQG,EAAE,MAAM,GAAKD,EAAE,MAAM,cAAcC,EAAE,KAAK,CAClG,EAAIJ,CACN,CACA,SAASK,GAASC,EAAOhB,EAAQiB,EAAM,CACrC,IAAMC,EAAQF,EAAM,OAAS,CAAC,EACxBG,EAAeC,GAAMC,EAAWD,EAAE,IAAI,EAAE,OAASJ,EAAM,cACvDM,EAAkBJ,EAAM,KAAKC,CAAW,EAAID,EAAM,OAAOC,CAAW,EAAE,KAAK,CAACN,EAAGC,KAAOD,EAAE,OAAS,IAAMC,EAAE,OAAS,EAAE,EAAII,EAAM,MAAM,EAAG,CAAC,EACxIK,EAAQD,EAAgB,CAAC,EACzBE,EAASN,EAAM,OAAQE,GAAM,CAACE,EAAgB,SAASF,CAAC,CAAC,EAC/D,GAAI,CAACG,GAASC,EAAO,SAAW,EAC9B,OAEF,IAAMC,EAAwB,IAAI,IAClC,QAAW3C,KAAQ0C,EACjBC,EAAM,IAAI3C,EAAK,KAAM,CAAC,GAAG2C,EAAM,IAAI3C,EAAK,IAAI,GAAK,CAAC,EAAGA,CAAI,CAAC,EAE5D,IAAMK,EAAW,IAAI,IAAI6B,EAAM,MAAM,IAAKU,GAAM,CAACA,EAAE,GAAIA,EAAE,MAAM,CAAC,CAAC,EAC3DC,EAAiBJ,EAAM,OAAS,EAChCK,EAAM5B,GAAUA,EAAO,IAAMA,EAAO,MAAQA,EAAS,OACrDD,EAAuB,IAAI,IACjC,QAAWT,KAASgC,EAAiB,CACnC,IAAI1B,EAAMN,EAAM,OAAS,EACzB,QAAWG,KAAMH,EAAM,QAAS,CAC9B,IAAMO,EAAMV,EAAS,IAAIM,CAAE,GAAK,EAC3BM,EAAK,IAAIN,CAAE,GACdM,EAAK,IAAIN,EAAI,CAAE,MAAOG,EAAK,IAAKA,EAAMC,CAAI,CAAC,EAE7CD,GAAOC,CACT,CACF,CACA,IAAMI,EAAU2B,IAAQ,QAAU,CAAC,GAAG7B,EAAK,OAAO,CAAC,EAAE,KAAMQ,GAAMA,EAAE,KAAOqB,EAAI,KAAK,GAAK,CAAC,GAAG7B,EAAK,OAAO,CAAC,EAAE,KAAMQ,GAAMA,EAAE,OAASqB,EAAI,GAAG,EACnIC,EAAS3C,GAAW,CACxB,IAAMJ,EAAOI,EAAO,CAAC,EACf4C,EAAU,CAAC,GAAG5C,CAAM,EAAE,KAAK,CAAC2B,EAAGC,KAAOD,EAAE,OAAS,IAAMC,EAAE,OAAS,EAAE,EACpE,CAAE,IAAAN,EAAK,SAAAuB,EAAU,KAAAC,EAAM,GAAAC,EAAG,EAAInC,GAClCb,GAAQ6C,EAAS3C,CAAQ,EACzBY,EACA6B,EACA3B,CACF,EACMN,EAAQD,GAAUoC,EAAS3C,CAAQ,EACnC+C,GAASpD,EAAK,QAAUqD,EAAYd,EAAWvC,EAAK,IAAI,EAAE,IAAI,EAC9DsD,GAAQzC,GAAO,OAAkBqC,EAAO,EAAI,CAAE,OAAAE,GAAQ,MAAOvC,EAAM,CAAC,EAAE,MAAO,SAAU,EAAM,EAAIqC,EAAOC,GAAK,CAAE,OAAAC,GAAQ,MAAOvC,EAAMqC,CAAI,EAAE,IAAK,SAAU,EAAM,EAAI,CAAE,OAAAE,GAAQ,MAAOvC,EAAMqC,CAAI,EAAE,MAAO,SAAU,EAAK,EAA9L,OACxBK,EAAO,CAAC,EACV9C,EAAK,EACL+C,GAAiB,EACjBC,GAAQ,EACRC,EAAO,EACX,QAAW/C,KAAMe,EAAK,CACpB,GAAI,OAAOf,GAAO,SAAU,CAC1B4C,EAAK,KAAK,CAAE,MAAO9C,EAAI,GAAIE,EAAI,YAAa,GAAO,IAAK,EAAK,CAAC,EAC9DF,GAAME,EACN8C,IAAS9C,EACT+C,EAAO,EACP,QACF,CACA,IAAM3C,EAAMV,EAAS,IAAIM,CAAE,GAAK,EAC1Bc,EAAIR,EAAK,IAAIN,CAAE,EACfgD,EAAOJ,EAAK,GAAG,EAAE,EACjBK,EAAKD,GAAM,eACXE,GAAUpC,GAAKmC,IAAO,QAAUF,GAAQ,GAAKE,EAAKD,EAAK,KAAOlC,EAAE,MAChEqC,GAAWrC,GAAKmC,IAAO,QAAUF,GAAQ,GAAKjC,EAAE,MAAQmC,EAC1D,CAACnC,GAAKkC,GAAQ,CAACA,EAAK,aAAe,CAACA,EAAK,IAC3CA,EAAK,IAAM5C,EACF8C,IAAWC,IACpBH,EAAK,IAAM5C,EACN8C,KACHF,EAAK,eAAiBlC,EAAE,MACxBkC,EAAK,SAAW,IAElBD,EAAOG,GAAU,EAAI,KAErBN,EAAK,KAAK,CACR,MAAO9C,EACP,GAAIM,EACJ,YAAaU,IAAM,OACnB,eAAgBA,GAAG,KACrB,CAAC,EACDiC,EAAO,GAETjD,GAAMM,EACDU,IACH+B,IAAkBzC,EAEtB,CACA,MAAO,CACL,KAAMf,EAAK,KACX,MAAOE,GAAQF,CAAI,EACnB,OAAQD,GAASC,CAAI,EACrB,UAAWA,EAAK,UAChB,GAAAS,EACA,eAAA+C,GACA,MAAAC,GACA,SAAAR,EACA,KAAAM,EACA,KAAAD,EACF,CACF,EAEA,MAAO,CACL,OAFaR,EAAMA,EAAI,MAAQD,EAG/B,KAAAV,EACA,UAAWY,EAAMP,CAAe,EAChC,KAAM,CAAC,GAAGG,EAAM,OAAO,CAAC,EAAE,IAAII,CAAK,EAAE,KACnC,CAAChB,EAAGC,IAAM,OAAOA,EAAE,QAAQ,EAAI,OAAOD,EAAE,QAAQ,GAAKC,EAAE,GAAKD,EAAE,IAAMA,EAAE,MAAM,cAAcC,EAAE,KAAK,CACnG,CACF,CACF,CCnLA,IAAI+B,GAAe,IACnB,SAASC,GAAeC,EAAOC,EAAQ,CACrC,MAAOC,EACP,SAAU,EACZ,EAAG,CACD,IAAIC,EAAUH,EAAM,UAAU,GAC9B,QAAWI,KAAOJ,EAAM,KACtBG,EAAU,KAAK,IAAIA,EAASC,EAAI,EAAE,EAEpC,MAAO,CACL,KAAMJ,EAAM,OAASG,GAAWF,EAAM,SAAWH,GAAe,GAChE,KAAME,EAAM,KAAK,OAASC,EAAM,KAClC,CACF,CACA,SAASI,GAAcC,EAAMC,EAAQN,EAAO,CAC1C,OAAKK,EAGDL,GAAS,CAACA,EAAM,SACX,CAAC,EAEH,CAACK,EAAK,UAAW,GAAGA,EAAK,IAAI,EAAE,IAAI,CAACF,EAAKI,KAAO,CACrD,MAAOJ,EAAI,MACX,EAAGI,GAAKP,GAAO,OAASC,EAC1B,EAAE,EAROK,GAAQ,WAAa,CAAC,CASjC,CACA,SAASE,GAAcC,EAAOC,EAAQ,CACpC,IAAMC,EAAWC,EAAcH,CAAK,EAC9BV,EAAQc,GAASJ,EAAOC,CAAM,EACpC,GAAIC,EAAS,SAAW,GAAK,CAACZ,EAC5B,OAEF,IAAMe,EAAaJ,EAASC,EAAS,OAAQI,GAAMC,GAAeD,EAAGL,CAAM,CAAC,EAAIC,EAC1EM,EAAgBC,EACpBJ,EAAW,OAAS,EAAIA,EAAaH,CACvC,EACMQ,EAAY,CAChB,CAAE,MAAOpB,EAAM,UAAU,MAAO,EAAG,CAAE,EACrC,GAAGA,EAAM,KAAK,IAAI,CAACI,EAAKI,KAAO,CAC7B,MAAOJ,EAAI,MACX,GAAII,EAAI,GAAKN,CACf,EAAE,CACJ,EACA,MAAO,CACL,cAAAgB,EACA,UAAAE,EACA,cAAe,GACf,UAAW,GACX,OAAQrB,GAAeC,CAAK,CAC9B,CACF,CCxCA,IAAIqB,GAAqB,wBACrBC,EAAeC,GAAUA,EAAM,MAAM,KAAKC,CAAU,EACpDC,GAAYF,GAAUD,EAAYC,CAAK,IAAMA,EAAM,OAAO,QAAU,GAAK,EACzEG,GAAsBH,GAAUD,EAAYC,CAAK,GAAKI,EAAgBJ,CAAK,EAC3EK,GAAcL,GAAUD,EAAYC,CAAK,GAAKA,EAAM,MAAM,KAAKM,CAAc,EAC7EC,EAAe,CACjB,CACE,MAAO,OACP,MAAO,WACP,YAAa,mFACb,IAAKC,GACL,WAAY,GACZ,WAAY,GACZ,UAAWT,EACX,aAAcA,EACd,WAAY,EACd,EACA,CACE,MAAO,aACP,MAAO,cACP,YAAa,6FACb,IAAKU,GACL,WAAY,GACZ,WAAY,GACZ,UAAWJ,GACX,aAAcA,GACd,WAAY,EACd,EACA,CACE,MAAO,WACP,MAAO,YACP,YAAa,0OACb,IAAKK,GACL,WAAY,GACZ,WAAY,GACZ,UAAWR,GACX,aAAcA,GACd,WAAY,EACd,EACA,CACE,MAAO,UACP,MAAO,UACP,YAAa,mHACb,IAAKS,GACL,WAAY,GACZ,WAAY,GACZ,UAAWZ,EACX,aAAcA,EACd,WAAY,EACd,EACA,CACE,MAAO,UACP,MAAO,WACP,YAAa,yIACb,IAAKa,GACL,WAAY,GACZ,WAAY,GACZ,UAAWR,EACX,aAAcA,EACd,WAAY,EACd,EACA,CACE,MAAO,aACP,MAAO,wBACP,YAAa,0JACb,IAAKS,GACL,WAAY,GACZ,WAAY,GACZ,UAAWV,GACX,aAAcA,GACd,WAAY,EACd,EACA,CACE,MAAO,QACP,MAAOL,GACP,YAAa,8CACb,IAAK,IAAG,GACR,WAAY,GACZ,WAAY,GACZ,UAAW,IAAM,GACjB,aAAc,IAAM,GACpB,WAAY,EACd,CACF,EACIgB,GAAqBP,EAAa,IAAKQ,GAAMA,EAAE,KAAK,EACxD,SAASC,GAAqBC,EAAOjB,EAAO,CAC1C,MAAO,CAACkB,GAAkBD,CAAK,EAAE,aAAajB,CAAK,CACrD,CACA,SAASkB,GAAkBD,EAAO,CAChC,OAAOV,EAAa,KAAMQ,GAAMA,EAAE,QAAUE,CAAK,GAAKV,EAAa,CAAC,CACtE,CCjGA,SAASY,GAAiBC,EAAG,CAC3B,OAAOA,EAAE,WAAaA,EAAE,KAAK,YAAc,CAACA,EAAE,cAAgB,CAACA,EAAE,QAAU,CAACA,EAAE,MAAQA,EAAE,MAAQ,CAClG,CACA,SAASC,GAAeC,EAAM,EAAG,CAC/B,OAAOA,EAAK,YAAc,EAAE,WAAa,CAAC,EAAE,IAC9C,CACA,IAAIC,EAAS,EACTC,GAAwB,IACxBC,GAAgB,GAChBC,GAAa,EACbC,GAAe,IACfC,GAAW,OACXC,GAAU,EACd,SAASC,GAAWC,EAAOC,EAAMC,EAAM,CACrC,IAAMC,EAASH,EAAM,YAAY,IAAIE,EAAK,IAAI,GAAK,CAAC,EAC9CE,EAAQ,CAAC,EACf,QAAWC,KAAOJ,EAAM,CACtB,IAAMK,EAAOD,EAAI,KACjB,GAAI,CAACC,EACH,SAEF,IAAMC,EAAOC,EAAWH,EAAI,IAAI,EAAE,KAClC,QAAWI,KAAKN,EAAQ,CACtB,GAAIM,EAAE,OAASF,EACb,SAEF,GAAM,CAAE,MAAAG,EAAO,IAAAC,CAAI,EAAIC,GAASN,EAAMG,EAAE,MAAOA,EAAE,MAAQP,EAAK,MAAM,EAChES,EAAM,GAAKD,EAAQL,EAAI,IACzBD,EAAM,KAAK,CAAE,IAAKC,EAAI,KAAM,MAAAK,EAAO,GAAIC,EAAMD,CAAM,CAAC,CAExD,CACF,CACA,OAAON,CACT,CACA,IAAIS,GAA4B,IAAI,QACpC,SAASC,GAAQd,EAAOe,EAAM,CAC5B,IAAIC,EAASH,GAAU,IAAIb,CAAK,EAKhC,GAJKgB,IACHA,EAAyB,IAAI,IAC7BH,GAAU,IAAIb,EAAOgB,CAAM,GAEzBA,EAAO,IAAID,CAAI,EACjB,OAAOC,EAAO,IAAID,CAAI,EAExB,IAAME,EAAW,IAAI,IAAIjB,EAAM,MAAM,IAAKkB,GAAM,CAACA,EAAE,GAAIA,EAAE,MAAM,CAAC,CAAC,EAC3DC,GAAUnB,EAAM,OAAS,CAAC,GAAG,OAAQoB,GAAMA,EAAE,OAASL,CAAI,EAC5DM,EACJ,GAAIF,EAAO,MAAOC,GAAMA,EAAE,QAAU,MAAM,EAAG,CAC3CC,EAAQ,CAAE,IAAK,CAAC,EAAG,OAAQ,CAAC,EAAG,KAAM,CAAC,CAAE,EACxC,QAAWC,IAAS,CAAC,GAAGH,CAAM,EAAE,KAAK,CAACI,EAAGC,IAAMD,EAAE,MAAQC,EAAE,KAAK,EAAG,CACjE,IAAIC,EAAMH,EAAM,MAChB,QAAWI,KAAMJ,EAAM,QAAS,CAC9B,IAAMK,EAAMV,EAAS,IAAIS,CAAE,GAAK,EAChCL,EAAM,IAAI,KAAKK,CAAE,EACjBL,EAAM,OAAO,KAAKI,CAAG,EACrBJ,EAAM,KAAK,KAAKI,EAAME,CAAG,EACzBF,GAAOE,CACT,CACF,CACF,CACA,OAAAX,EAAO,IAAID,EAAMM,CAAK,EACfA,CACT,CACA,SAASO,GAAU5B,EAAOK,EAAKwB,EAAQC,EAAS,CAC9C,IAAMxB,EAAOD,EAAI,KACXgB,EAAQf,GAAQQ,GAAQd,EAAOK,EAAI,IAAI,EAC7C,GAAI,CAACC,GAAQ,CAACe,GAASQ,EAAS,GAAKA,EAASxB,EAAI,GAChD,OAEF,IAAM0B,EAAKzB,EAAK,SAAWA,EAAK,MAAQuB,EAASvB,EAAK,MAAQuB,EACxDG,EAAM,GAAMF,EACZG,EAAM3B,EAAK,SAAW,CAAE,MAAOA,EAAK,MAAQD,EAAI,GAAI,IAAKC,EAAK,KAAM,EAAI,CAAE,MAAOA,EAAK,MAAO,IAAKA,EAAK,MAAQD,EAAI,EAAG,EACtH6B,EAAO,KAAK,IAAIH,EAAKC,EAAKC,EAAI,KAAK,EACnCE,EAAK,KAAK,IAAIJ,EAAKC,EAAKC,EAAI,GAAG,EACjCG,EAAK,EACLC,EAAKhB,EAAM,OAAO,OACtB,KAAOe,EAAKC,GAAI,CACd,IAAMC,EAAMF,EAAKC,GAAM,EACnBhB,EAAM,KAAKiB,CAAG,GAAKJ,EACrBE,EAAKE,EAAM,EAEXD,EAAKC,CAET,CACA,IAAIC,EACAC,EAAU,GACVC,EAAY,GAChB,QAASC,EAAIN,EAAIM,EAAIrB,EAAM,OAAO,QAAUA,EAAM,OAAOqB,CAAC,EAAIP,EAAIO,IAAK,CACrE,IAAMf,EAAMN,EAAM,KAAKqB,CAAC,EAAIrB,EAAM,OAAOqB,CAAC,EACpCC,EAAQtB,EAAM,OAAOqB,CAAC,GAAKX,GAAMA,EAAKV,EAAM,KAAKqB,CAAC,GACpDf,EAAMa,GAAWb,IAAQa,GAAWG,GAAS,CAACF,KAChDD,EAAUb,EACVY,EAAOlB,EAAM,IAAIqB,CAAC,EAClBD,EAAYE,EAEhB,CACA,OAAOJ,CACT,CACA,SAASK,GAAeC,EAAM,EAAG,CAC/B,IAAMC,EAAY,EAAE,WAAarD,GAC3BsD,EAAU,EAAE,SAAW,KAAK,IAAI,GAAG,CAACF,EAAK,UAAW,GAAGA,EAAK,IAAI,EAAE,IAAKG,GAAMA,EAAE,MAAM,MAAM,CAAC,EAAIC,GAAgB,GAChHC,EAAQL,EAAK,KAAK,OAAS,EAC3B,CAAE,MAAAM,EAAO,MAAAC,EAAO,SAAAC,EAAU,SAAAC,CAAS,EAAIC,GAC3CL,EACAJ,EAAY,EAAItD,EAChBG,EACF,EACM6D,EAAU,KAAK,IAAIX,EAAK,UAAU,GAAI,GAAGA,EAAK,KAAK,IAAKG,GAAMA,EAAE,EAAE,EAAG,CAAC,EACtES,EAAOJ,EAAWN,EAAUvD,EAE5BkE,EADS,KAAK,IAAI,EAAG,EAAE,MAAQD,EAAOjE,CAAM,GACzBgE,GAAWF,EAAW1D,GAAe,IAC9D,MAAO,CACL,OAAA8D,EACA,OAAQ,EACR,WAAYD,EAAOZ,EAAK,OAASa,EACjC,WAAYlE,EAAS2D,EAAQ,EAC7B,MAAO,EAAE,MACT,OAAQD,EAAQC,EAAQ,EAAI3D,EAC5B,MAAA2D,EACA,MAAAC,EACA,SAAAE,EACA,SAAAD,EACA,WAAYM,GAAWR,EAAOC,CAAK,CACrC,CACF,CACA,SAASQ,GAAWf,EAAMgB,EAAOC,EAAGC,EAAG,CACrC,IAAMrB,EAAI,KAAK,OAAOqB,EAAIF,EAAM,YAAcA,EAAM,KAAK,EACnDxD,EAAM,CAACwC,EAAK,UAAW,GAAGA,EAAK,IAAI,EAAEH,CAAC,EACtCb,GAAUiC,EAAID,EAAM,YAAcA,EAAM,OAAShB,EAAK,OAC5D,OAAOxC,GAAOqC,GAAK,GAAKb,GAAU,GAAKA,GAAUxB,EAAI,GAAK,CAAE,MAAOqC,EAAG,IAAArC,EAAK,OAAAwB,CAAO,EAAI,MACxF,CACA,SAASmC,GAAcnB,EAAMgB,EAAOzD,EAAO,CACzC,IAAM6D,EAAQ,IAAI,IAChB,CAACpB,EAAK,UAAW,GAAGA,EAAK,IAAI,EAAE,IAAI,CAACxC,EAAK,IAAM,CAACA,EAAI,KAAM,CAAC,CAAC,CAC9D,EACM6D,EAAKrC,IAAYgB,EAAK,OAAShB,GAAUgC,EAAM,OAASA,EAAM,WACpE,OAAOM,EACL,IACA,CAAE,cAAe,kBAAmB,EACpC,GAAG/D,EAAM,QAASgE,GAAM,CACtB,IAAM,EAAIH,EAAM,IAAIG,EAAE,GAAG,EACzB,GAAI,IAAM,OACR,MAAO,CAAC,EAEV,IAAML,EAAI,EAAIF,EAAM,MAAQA,EAAM,WAC5BC,EAAII,EAAEE,EAAE,KAAK,EACbC,EAAI,KAAK,IAAI,EAAGD,EAAE,GAAKP,EAAM,MAAM,EACnCS,EAAQC,GAAQJ,EAAG,OAAQ,CAAE,EAAAL,EAAG,EAAGS,EAAK,MAAOF,EAAG,OAAQvE,GAAS,KAAMD,EAAS,CAAC,EACzF,MAAO,CACLyE,EAAKP,EAAIF,EAAM,MAAQ,EAAI/D,GAAU,CAAC,EACtCwE,EAAKP,EAAIF,EAAM,MAAQ,EAAI,CAAC,CAC9B,CACF,CAAC,CACH,CACF,CACA,SAASW,GAAoB3B,EAAMgB,EAAOY,EAAuB,IAAI,IAAO,CAC1E,OAAON,EACL,IACA,CAAE,cAAe,aAAc,YAAazE,GAAe,KAAM,MAAO,EACxE,IAAImE,EAAM,SAAW,CAAChB,EAAK,UAAW,GAAGA,EAAK,IAAI,EAAI,CAAC,GAAG,IACxD,CAACxC,EAAKqC,IAAMyB,EACV,OACA,CACE,EAAG,EACH,EAAGzB,EAAImB,EAAM,MAAQA,EAAM,WAAa,EACxC,cAAeY,EAAK,IAAIpE,EAAI,IAAI,EAAI,IAAM,MAC5C,EACAA,EAAI,KACN,CACF,CACF,CACF,CACA,SAASqE,GAAcb,EAAOc,EAAUC,EAAM,CAC5C,GAAKD,GAAU,KAGf,OAAOd,EAAM,WAAae,EAAO,CAAE,UAAW,EAAG,OAAQ,EAAG,GAAGA,EAAM,QAAS,EAAK,CACrF,CC9LA,IAAAC,GAA4B,SACrBC,MAAQ,oBAA2B,GAAAC,KAAK,OAAQ,CACrD,EAAG,irBACL,CAAC,EAAG,UAAU",
6
+ "names": ["require_SvgIcon", "__commonJSMin", "exports", "module", "import_SvgIcon", "nodeOwnLocation", "node", "isAnchored", "anchoredNodeLocation", "panSNSample", "panSNHaplotype", "panSNContig", "widestCluster", "spans", "maxGap", "sorted", "a", "b", "best", "current", "span", "groupKey", "loc", "contributingAssemblies", "graph", "groups", "key", "group", "bySample", "candidate", "existing", "resolveLocationAssembly", "resolve", "resolveContributors", "contributors", "c", "sample", "locString", "locLabel", "import_jsx_runtime", "CompareArrows_default", "_jsx", "import_jsx_runtime", "HighlightAlt_default", "_jsx", "import_jsx_runtime", "LineStyle_default", "_jsx", "LINEAR_LABEL", "SYNTENY_LABEL", "NO_SYNTENY_TRACK", "oneOrMany", "label", "icon", "entries", "entryLabel", "onSelect", "disabledHelpText", "nameTheOnlyEntry", "first", "empty", "entry", "graphLaunchMenuItems", "contributors", "syntenyTracks", "onShowLinear", "onShowSynteny", "widest", "LineStyle_default", "c", "locLabel", "CompareArrows_default", "track", "nodeLaunchMenuItems", "own", "reference", "highlight", "onHighlight", "HighlightAlt_default", "target", "parsePanSN", "refName", "parts", "haplotype", "collectRun", "seed", "byId", "adj", "claimed", "members", "anchors", "queue", "id", "node", "neighborId", "neighbor", "REFERENCE_RANK", "anchorSpan", "a", "sorted", "b", "first", "last", "start", "end", "runDistances", "entry", "m", "dist", "member", "reach", "known", "runOffsets", "ordered", "rank", "i", "offsets", "offset", "projectAlleles", "graph", "isAnchored", "n", "buildNeighbors", "alleles", "span", "max", "MIN_DELETION_BP", "MIN_ALLELE_SPAN_FRACTION", "placeOffReference", "graph", "span", "rowY", "positions", "minSpan", "alleles", "projectAlleles", "byId", "n", "alleleDeletions", "allele", "skipped", "drawn", "scale", "nodeId", "i", "node", "offset", "even", "at", "bp", "y", "neighbors", "buildNeighbors", "queue", "fromId", "fromEnd", "nextId", "next", "contributingSamples", "graph", "keep", "carried", "node", "isOffReference", "sample", "parsePanSN", "held", "row", "a", "b", "sampleRowLayout", "region", "backbone", "backboneNodes", "samples", "span", "referenceSpan", "rowOf", "s", "i", "nodePositions", "backbonePositions", "spareRow", "alleleDeletions", "placeOffReference", "stable", "ROW_HEIGHT_PX", "rowLabels", "visitStrands", "graph", "strands", "segment", "visits", "visit", "key", "list", "tubeMapTracks", "nodeById", "n", "paths", "path", "index", "reference", "p", "pathOrigin", "visitName", "seen", "sequence", "id", "node", "k", "strand", "canonicalStrand", "stepName", "tubeMapNodes", "hasTubeMapPaths", "STACK_PX", "MIN_TUBE_PX", "MAX_TUBE_PX", "tubeWidth", "trackCount", "runTubeMap", "tracks", "reads", "tubeMapReads", "tubeColor", "pathGreyCssColor", "pathCssColor", "pathColors", "_", "i", "layout", "layoutTubeMap", "drawnNodes", "nodes", "centreline", "yOffset", "x0", "x1", "y", "extentOf", "tubeMapLayout", "run", "nodePositions", "minY", "maxY", "tubeMapColumns", "byOrder", "columns", "end", "order", "a", "b", "bp0", "bp1", "graphNode", "isBackbone", "first", "column", "pathsReachBackbone", "tubeMapReferenceLayout", "c", "rankRows", "graph", "present", "node", "a", "b", "r", "i", "anchoredLayout", "region", "backbone", "backboneNodes", "span", "referenceSpan", "rows", "nodePositions", "backbonePositions", "alleleDeletions", "placeOffReference", "ROW_HEIGHT_PX", "rowLabels", "rank", "row", "GUTTER", "LANE_PX", "ROW_HEIGHT_PX", "nodeWidth", "node", "compare", "a", "b", "compareKeys", "UNREACHED", "referenceOrder", "graph", "byId", "n", "key", "orderKeys", "placeByWalks", "backbone", "isNode", "startOf", "next", "prev", "i", "head", "insertAfter", "at", "id", "after", "insertBefore", "before", "path", "rising", "falling", "last", "start", "ids", "from", "leading", "lead", "placed", "placeBySearch", "adjacent", "queue", "ka", "kb", "nb", "searched", "sided", "seed", "run", "farHalf", "hops", "deadEnd", "touchesLeft", "other", "k", "e", "isBackbone", "rank", "layerGraph", "order", "isRef", "preds", "succs", "link", "layerOf", "l", "p", "s", "minSucc", "t", "lo", "hi", "layers", "orderedLayout", "layer", "layerWidth", "w", "layerX", "x", "y", "free", "ideal", "taken", "lane", "d", "nodePositions", "cx", "ny", "sampleOf", "path", "panSNSample", "labelOf", "stepsOf", "pieces", "lengthOf", "steps", "end", "piece", "bp", "sum", "id", "stepSpans", "spans", "pos", "len", "sliceBetween", "span", "region", "flanked", "i0", "i1", "bestEnd", "bestStart", "i", "s", "ids", "filterSamples", "rows", "samples", "r", "a", "b", "walkRows", "graph", "unit", "paths", "isReference", "p", "pathOrigin", "referencePieces", "first", "others", "walks", "n", "referenceStart", "cut", "rowOf", "ordered", "complete", "from", "to", "contig", "panSNContig", "axis", "runs", "offReferenceBp", "gapBp", "step", "last", "at", "forward", "backward", "READOUT_ROOM", "walkRowsExtent", "walks", "pitch", "ROW_HEIGHT_PX", "longest", "row", "walkRowLabels", "rows", "layout", "i", "walkRowLayout", "graph", "region", "backbone", "backboneNodes", "walkRows", "overWindow", "n", "overlapsWindow", "nodePositions", "backbonePositions", "rowLabels", "FORCE_LAYOUT_LABEL", "hasBackbone", "graph", "isBackbone", "hasWalks", "hasTubeMapBackbone", "hasTubeMapPaths", "hasAlleles", "isOffReference", "LAYOUT_MODES", "anchoredLayout", "sampleRowLayout", "walkRowLayout", "orderedLayout", "tubeMapLayout", "tubeMapReferenceLayout", "LAYOUT_MODE_VALUES", "m", "modeUsesLayoutEngine", "value", "layoutModeByValue", "walkStripApplies", "o", "cutsWholeWalks", "mode", "PAD_PX", "WALK_STRIP_CEILING_PX", "LABEL_FONT_PX", "MIN_ROW_PX", "READOUT_ROOM", "MARK_INK", "TICK_PX", "stripMarks", "graph", "rows", "node", "visits", "marks", "row", "axis", "path", "pathOrigin", "v", "start", "end", "alongRow", "spanCache", "spansOf", "name", "byName", "lengthOf", "n", "pieces", "p", "spans", "piece", "a", "b", "pos", "id", "len", "segmentAt", "offset", "pxPerBp", "at", "tol", "bar", "from", "to", "lo", "hi", "mid", "best", "bestLen", "bestHolds", "i", "holds", "walkStripFrame", "bars", "maxHeight", "labelPx", "r", "LABEL_CHAR_PX", "count", "rowPx", "barPx", "labelled", "readouts", "rowPitch", "longest", "left", "scaleX", "boxesGenes", "stripRowAt", "frame", "x", "y", "walkMarksTree", "index", "X", "el", "m", "w", "tick", "top", "walkStripLabelsTree", "bold", "stripGeneGaps", "rowGenes", "gaps", "import_jsx_runtime", "Settings_default", "_jsx"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{a as r}from"./chunk-FY3BTKY4.js";var s=r((p,o)=>{o.exports=JBrowseExports["@jbrowse/core/ui"]});var t=r((x,e)=>{e.exports=JBrowseExports["@mui/material"]});export{s as a,t as b};
2
+ //# sourceMappingURL=chunk-NXZT63HN.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["global-externals:@jbrowse/core/ui", "global-externals:@mui/material"],
4
+ "sourcesContent": ["module.exports = JBrowseExports[\"@jbrowse/core/ui\"];", "module.exports = JBrowseExports[\"@mui/material\"];"],
5
+ "mappings": "wCAAA,IAAAA,EAAAC,EAAA,CAAAC,EAAAC,IAAA,CAAAA,EAAO,QAAU,eAAe,kBAAkB,ICAlD,IAAAC,EAAAC,EAAA,CAAAC,EAAAC,IAAA,CAAAA,EAAO,QAAU,eAAe,eAAe",
6
+ "names": ["require_ui", "__commonJSMin", "exports", "module", "require_material", "__commonJSMin", "exports", "module"]
7
+ }
@@ -0,0 +1,2 @@
1
+ var o=a=>+a.toFixed(1);function v(a){let r=/^rgba?\(([^,]+),([^,]+),([^,)]+)(?:,([^)]+))?\)$/.exec(a.replaceAll(" ",""));if(!r)return{color:a,opacity:1};let l=r[4]===void 0?1:Number(r[4]);return{color:`rgb(${r[1]},${r[2]},${r[3]})`,opacity:l}}function u(a,r){let{color:l,opacity:c}=v(r);return`${a}="${l}"${c<1?` ${a}-opacity="${o(c)}"`:""}`}var m=.5,x=.25;function g(a,r){let l=[],c=[],d=(t,e)=>{let n={d:`M${o(t)} ${o(e)}`,segments:0,x0:t,x1:t,y0:e,y1:e};return c.push(n),n},f=t=>{let e=c.at(-1)??d(t[0],t[1]);for(let n=0;n<t.length;n+=2)e.x0=Math.min(e.x0,t[n]),e.x1=Math.max(e.x1,t[n]),e.y0=Math.min(e.y0,t[n+1]),e.y1=Math.max(e.y1,t[n+1]);return e.segments++,e},p=t=>{let e=new Set;return c.map(n=>{if(!t||n.x1-n.x0>=m||n.y1-n.y0>=m)return n.d;let s=(n.x0+n.x1)/2,$=(n.y0+n.y1)/2,h=`${Math.round(s/x)} ${Math.round($/x)}`;return n.segments===0||e.has(h)?"":(e.add(h),`M${o(s)} ${o($)}h0`)}).join("")},i={canvas:void 0,fillStyle:"#000",strokeStyle:"#000",lineWidth:1,lineCap:"butt",lineJoin:"miter",beginPath(){c=[]},moveTo(t,e){d(t,e)},lineTo(t,e){f([t,e]).d+=`L${o(t)} ${o(e)}`},bezierCurveTo(t,e,n,s,$,h){f([t,e,n,s,$,h]).d+=`C${o(t)} ${o(e)} ${o(n)} ${o(s)} ${o($)} ${o(h)}`},closePath(){let t=c.at(-1);t&&(t.d+="Z")},stroke(){let t=p(i.lineCap!=="butt");t&&l.push(`<path d="${t}" fill="none" ${u("stroke",i.strokeStyle)} stroke-width="${o(i.lineWidth)}" stroke-linecap="${i.lineCap}" stroke-linejoin="${i.lineJoin}"/>`)},fill(){let t=p(!1);t&&l.push(`<path d="${t}" ${u("fill",i.fillStyle)}/>`)},fillRect(t,e,n,s){l.push(`<rect x="${o(t)}" y="${o(e)}" width="${o(n)}" height="${o(s)}" ${u("fill",i.fillStyle)}/>`)}},y={width:a,height:r,style:{},getContext:()=>i};return i.canvas=y,{canvas:y,markup:()=>l.join("")}}export{g as a};
2
+ //# sourceMappingURL=chunk-PLV6SE4Y.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../node_modules/.pnpm/@jbrowse+bandage-core@8.0.1/node_modules/@jbrowse/bandage-core/dist/chunks/chunk-47DYCZOK.js"],
4
+ "sourcesContent": ["// src/renderer/svgCanvas.ts\nvar n = (v) => +v.toFixed(1);\nfunction paint(css) {\n const m = /^rgba?\\(([^,]+),([^,]+),([^,)]+)(?:,([^)]+))?\\)$/.exec(\n css.replaceAll(\" \", \"\")\n );\n if (!m) {\n return { color: css, opacity: 1 };\n }\n const opacity = m[4] === void 0 ? 1 : Number(m[4]);\n return { color: `rgb(${m[1]},${m[2]},${m[3]})`, opacity };\n}\nfunction paintAttrs(kind, css) {\n const { color, opacity } = paint(css);\n return `${kind}=\"${color}\"${opacity < 1 ? ` ${kind}-opacity=\"${n(opacity)}\"` : \"\"}`;\n}\nvar DOT_PX = 0.5;\nvar DOT_CELL_PX = 0.25;\nfunction svgCanvas(width, height) {\n const out = [];\n let subpaths = [];\n const start = (x, y) => {\n const s = { d: `M${n(x)} ${n(y)}`, segments: 0, x0: x, x1: x, y0: y, y1: y };\n subpaths.push(s);\n return s;\n };\n const reach = (points) => {\n const s = subpaths.at(-1) ?? start(points[0], points[1]);\n for (let i = 0; i < points.length; i += 2) {\n s.x0 = Math.min(s.x0, points[i]);\n s.x1 = Math.max(s.x1, points[i]);\n s.y0 = Math.min(s.y0, points[i + 1]);\n s.y1 = Math.max(s.y1, points[i + 1]);\n }\n s.segments++;\n return s;\n };\n const pathData = (dots) => {\n const seen = /* @__PURE__ */ new Set();\n return subpaths.map((s) => {\n if (!dots || s.x1 - s.x0 >= DOT_PX || s.y1 - s.y0 >= DOT_PX) {\n return s.d;\n }\n const x = (s.x0 + s.x1) / 2;\n const y = (s.y0 + s.y1) / 2;\n const cell = `${Math.round(x / DOT_CELL_PX)} ${Math.round(y / DOT_CELL_PX)}`;\n if (s.segments === 0 || seen.has(cell)) {\n return \"\";\n }\n seen.add(cell);\n return `M${n(x)} ${n(y)}h0`;\n }).join(\"\");\n };\n const ctx = {\n canvas: void 0,\n fillStyle: \"#000\",\n strokeStyle: \"#000\",\n lineWidth: 1,\n lineCap: \"butt\",\n lineJoin: \"miter\",\n beginPath() {\n subpaths = [];\n },\n moveTo(x, y) {\n start(x, y);\n },\n lineTo(x, y) {\n reach([x, y]).d += `L${n(x)} ${n(y)}`;\n },\n bezierCurveTo(cx0, cy0, cx1, cy1, x, y) {\n reach([cx0, cy0, cx1, cy1, x, y]).d += `C${n(cx0)} ${n(cy0)} ${n(cx1)} ${n(cy1)} ${n(x)} ${n(y)}`;\n },\n closePath() {\n const s = subpaths.at(-1);\n if (s) {\n s.d += \"Z\";\n }\n },\n stroke() {\n const d = pathData(ctx.lineCap !== \"butt\");\n if (d) {\n out.push(\n `<path d=\"${d}\" fill=\"none\" ${paintAttrs(\"stroke\", ctx.strokeStyle)} stroke-width=\"${n(ctx.lineWidth)}\" stroke-linecap=\"${ctx.lineCap}\" stroke-linejoin=\"${ctx.lineJoin}\"/>`\n );\n }\n },\n fill() {\n const d = pathData(false);\n if (d) {\n out.push(`<path d=\"${d}\" ${paintAttrs(\"fill\", ctx.fillStyle)}/>`);\n }\n },\n fillRect(x, y, w, h) {\n out.push(\n `<rect x=\"${n(x)}\" y=\"${n(y)}\" width=\"${n(w)}\" height=\"${n(h)}\" ${paintAttrs(\"fill\", ctx.fillStyle)}/>`\n );\n }\n };\n const canvas = {\n width,\n height,\n style: {},\n getContext: () => ctx\n };\n ctx.canvas = canvas;\n return {\n canvas,\n // the drawing so far, as SVG elements in canvas pixels\n markup: () => out.join(\"\")\n };\n}\n\nexport {\n svgCanvas\n};\n"],
5
+ "mappings": "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",
6
+ "names": ["n", "v", "paint", "css", "m", "opacity", "paintAttrs", "kind", "color", "DOT_PX", "DOT_CELL_PX", "svgCanvas", "width", "height", "out", "subpaths", "start", "x", "y", "s", "reach", "points", "i", "pathData", "dots", "seen", "cell", "ctx", "cx0", "cy0", "cx1", "cy1", "d", "w", "h", "canvas"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{a as w,g as S,j as D}from"./chunk-GMSOU6VO.js";import{N as u,T as k}from"./chunk-B7GF3TC3.js";import{a as A,b as R}from"./chunk-NXZT63HN.js";import{a as y,b as N}from"./chunk-64LZZURD.js";import{b as c}from"./chunk-FY3BTKY4.js";var m=[{value:0,label:"Fastest"},{value:1,label:"Fast"},{value:2,label:"Default"},{value:3,label:"Fine"},{value:4,label:"Best"}];var L=c(A(),1),o=c(R(),1),b=c(N(),1),G=c(D(),1),e=c(y(),1),C=(0,G.makeStyles)()({section:{marginBottom:24},formControl:{minWidth:200}});function s({warn:l=!1,children:n}){return(0,e.jsx)(o.Typography,{variant:"caption",color:l?"warning.main":"text.secondary",children:n})}var T=(0,b.observer)(function({model:n}){return n.hasGraph&&!n.usesLayoutEngine?(0,e.jsx)(s,{warn:!0,children:"No effect on this layout: only the force-directed layout is drawn by the engine that reads this."}):null});function g({label:l,checked:n,onChange:t,children:p}){let{classes:i}=C();return(0,e.jsxs)("div",{className:i.section,children:[(0,e.jsx)(o.FormControlLabel,{control:(0,e.jsx)(o.Switch,{checked:n,onChange:d=>{t(d.target.checked)}}),label:l}),p]})}function h({label:l,value:n,options:t,testId:p,sx:i,onChange:d}){let{classes:r}=C();return(0,e.jsxs)(o.FormControl,{className:r.formControl,sx:i,children:[(0,e.jsx)(o.InputLabel,{children:l}),(0,e.jsx)(o.Select,{value:n,label:l,"data-testid":p,onChange:a=>{d(a.target.value)},children:t.map(({value:a,label:v,description:f})=>(0,e.jsx)(o.MenuItem,{value:a,children:f?(0,e.jsx)(o.Tooltip,{title:f,placement:"right",children:(0,e.jsx)("span",{children:v})}):v},a))})]})}var I=l=>l.map(({trackId:n,name:t})=>({value:n,label:t})),P=(0,b.observer)(function(n){let{model:t,open:p,onClose:i,children:d}=n,{classes:r}=C();return(0,e.jsxs)(L.Dialog,{open:p,onClose:i,title:"Graph settings",children:[(0,e.jsxs)(o.DialogContent,{children:[(0,e.jsx)("div",{className:r.section,children:(0,e.jsxs)(o.FormControl,{fullWidth:!0,children:[(0,e.jsx)(o.FormLabel,{component:"legend",children:"Layout quality"}),(0,e.jsx)(o.RadioGroup,{value:t.layoutQuality,onChange:a=>{t.setLayoutQuality(parseInt(a.target.value)),t.recomputeLayout()},children:m.map(a=>(0,e.jsx)(o.FormControlLabel,{value:a.value,control:(0,e.jsx)(o.Radio,{}),label:a.label},a.value))}),(0,e.jsx)(s,{children:"FMMM's iteration budget, the same scale Bandage exposes. Higher is slower: on a thousand-node cut the top setting is seconds rather than tenths."}),(0,e.jsx)(T,{model:t})]})}),(0,e.jsxs)(g,{label:"Draw paths",checked:t.drawPaths,onChange:a=>{t.setDrawPaths(a)},children:[(0,e.jsx)(s,{children:"Color each node and connector by the paths through it, one lane per path in legend order, so a path that skips a node leaves its lane empty"}),t.drawPaths&&!t.effectiveDrawPaths?(0,e.jsx)(s,{warn:!0,children:t.pathCount>u?`Off: ${t.pathCount.toLocaleString()} paths is past the ${u} this can tell apart`:"Off: this graph states no paths"}):null]}),(0,e.jsx)(g,{label:"Mark bubbles",checked:t.showBubbles,onChange:a=>{t.setShowBubbles(a)},children:(0,e.jsx)(s,{children:"A halo along the nodes of each bubble, labelled by what it is, with the label opening the bubble on its own"})}),(0,e.jsxs)(g,{label:"Genes on the backbone",checked:t.showGenes,onChange:a=>{t.setShowGenes(a)},children:[(0,e.jsx)(s,{children:"Exons along the reference nodes that carry them and each gene's name at its midpoint, from the assembly's annotation track"}),t.geneTrackChoices.length>1?(0,e.jsx)(h,{label:"Gene track",value:t.geneTrack?.trackId??"",options:I(t.geneTrackChoices),testId:"graph-gene-track-select",sx:{mt:1},onChange:a=>{t.setGeneTrackId(a),t.reloadGenes()}}):null,t.repeatTrackChoices.length>1?(0,e.jsx)(h,{label:"Repeat track",value:t.repeatTrack?.trackId??"",options:I(t.repeatTrackChoices),testId:"graph-repeat-track-select",sx:{mt:1},onChange:a=>{t.setRepeatTrackId(a),t.reloadRepeats()}}):null]}),t.anchorPaths.length>1?(0,e.jsxs)("div",{className:r.section,children:[(0,e.jsx)(h,{label:"Reference path",value:t.activeReferencePath??"",options:t.anchorPaths.map(({name:a})=>({value:a,label:a})),testId:"graph-reference-path-select",onChange:a=>{t.setReferencePath(a),t.recomputeLayout()}}),(0,e.jsx)(s,{children:"Which path the anchored layouts draw x against. A GFA with no rGFA tags states its coordinates only in its paths, and marks none of them as the reference."})]}):null,(0,e.jsxs)("div",{className:r.section,children:[(0,e.jsx)(h,{label:"Bubble spread",value:t.bubbleSpread,options:S,testId:"graph-bubble-spread-select",onChange:a=>{t.setBubbleSpread(a),t.recomputeLayout()}}),(0,e.jsx)(s,{children:"How far the force layout opens a bubble. A pangenome allele is a few bp, so at Bandage's own scale both arms land inside one node thickness and the graph draws as a rope."}),(0,e.jsx)(T,{model:t})]}),(0,e.jsxs)("div",{className:r.section,children:[(0,e.jsx)(h,{label:"Node width",value:t.nodeWidth,options:k,testId:"graph-node-width-select",onChange:a=>{t.setNodeWidth(a)}}),(0,e.jsx)(s,{children:"Bandage's depth as width. In a cut with walks, depth is how many haplotypes carry the node."})]}),d,(0,e.jsxs)("div",{className:r.section,children:[(0,e.jsx)(h,{label:"Color scheme",value:t.chosenColorScheme,options:w,onChange:a=>{t.setColorScheme(a)}}),t.colorSchemeLock?(0,e.jsxs)(s,{warn:!0,children:["No effect now. ",t.colorSchemeLock.why]}):null]})]}),(0,e.jsx)(o.DialogActions,{children:(0,e.jsx)(o.Button,{variant:"contained",color:"primary",onClick:i,children:"Close"})})]})}),W=P;export{W as a};
2
+ //# sourceMappingURL=chunk-X4DGSMS6.js.map
@@ -2,6 +2,6 @@
2
2
  "version": 3,
3
3
  "sources": ["../../node_modules/.pnpm/@jbrowse+bandage-core@8.0.1/node_modules/@jbrowse/bandage-core/dist/chunks/chunk-K5SIJGAE.js", "../../src/GraphGenomeView/components/GraphSettingsDialog.tsx"],
4
4
  "sourcesContent": ["// src/layoutQualities.ts\nvar LAYOUT_QUALITIES = [\n { value: 0, label: \"Fastest\" },\n { value: 1, label: \"Fast\" },\n { value: 2, label: \"Default\" },\n { value: 3, label: \"Fine\" },\n { value: 4, label: \"Best\" }\n];\n\nexport {\n LAYOUT_QUALITIES\n};\n", "import type { ReactNode } from 'react'\n\nimport { BUBBLE_SPREADS } from '@jbrowse/bandage-core/bubbleSpreads'\nimport { COLOR_SCHEMES } from '@jbrowse/bandage-core/colorSchemes'\nimport { LAYOUT_QUALITIES } from '@jbrowse/bandage-core/layoutQualities'\nimport { NODE_WIDTHS } from '@jbrowse/bandage-core/nodeWidths'\nimport { MAX_PATH_COLORS } from '@jbrowse/bandage-core/pathColors'\nimport { Dialog } from '@jbrowse/core/ui'\nimport {\n Button,\n DialogActions,\n DialogContent,\n FormControl,\n FormControlLabel,\n FormLabel,\n InputLabel,\n MenuItem,\n Radio,\n RadioGroup,\n Select,\n Switch,\n Tooltip,\n Typography,\n} from '@mui/material'\nimport { observer } from 'mobx-react'\nimport { makeStyles } from 'tss-react/mui'\n\nimport type { GraphPaneModel } from '../model'\nimport type { SxProps } from '@mui/material'\n\nconst useStyles = makeStyles()({\n section: {\n marginBottom: 24,\n },\n formControl: {\n minWidth: 200,\n },\n})\n\nfunction Caption({\n warn = false,\n children,\n}: {\n warn?: boolean\n children: ReactNode\n}) {\n return (\n <Typography\n variant=\"caption\"\n color={warn ? 'warning.main' : 'text.secondary'}\n >\n {children}\n </Typography>\n )\n}\n\n// Layout quality and bubble spread are the engine's inputs, and an anchored\n// layout places a node from its coordinates without reaching it. Left enabled\n// so the force layout can be set up before switching to it.\nconst EngineOnly = observer(function EngineOnly({\n model,\n}: {\n model: GraphPaneModel\n}) {\n return model.hasGraph && !model.usesLayoutEngine ? (\n <Caption warn>\n No effect on this layout: only the force-directed layout is drawn by the\n engine that reads this.\n </Caption>\n ) : null\n})\n\nfunction SettingSwitch({\n label,\n checked,\n onChange,\n children,\n}: {\n label: string\n checked: boolean\n onChange: (checked: boolean) => void\n children?: ReactNode\n}) {\n const { classes } = useStyles()\n return (\n <div className={classes.section}>\n <FormControlLabel\n control={\n <Switch\n checked={checked}\n onChange={e => {\n onChange(e.target.checked)\n }}\n />\n }\n label={label}\n />\n {children}\n </div>\n )\n}\n\n// One dropdown setting; an option's description is its tooltip\nfunction SettingSelect<T extends string>({\n label,\n value,\n options,\n testId,\n sx,\n onChange,\n}: {\n label: string\n value: T\n options: readonly { value: T; label: string; description?: string }[]\n testId?: string\n sx?: SxProps\n onChange: (value: T) => void\n}) {\n const { classes } = useStyles()\n return (\n <FormControl className={classes.formControl} sx={sx}>\n <InputLabel>{label}</InputLabel>\n <Select\n value={value}\n label={label}\n data-testid={testId}\n onChange={e => {\n onChange(e.target.value as T)\n }}\n >\n {options.map(({ value, label, description }) => (\n <MenuItem key={value} value={value}>\n {description ? (\n <Tooltip title={description} placement=\"right\">\n <span>{label}</span>\n </Tooltip>\n ) : (\n label\n )}\n </MenuItem>\n ))}\n </Select>\n </FormControl>\n )\n}\n\nconst trackOptions = (tracks: { trackId: string; name: string }[]) =>\n tracks.map(({ trackId, name }) => ({ value: trackId, label: name }))\n\n// `children` is the host's own section, between node width and colour\nconst GraphSettingsDialog = observer(function GraphSettingsDialog(props: {\n model: GraphPaneModel\n open: boolean\n onClose: () => void\n children?: ReactNode\n}) {\n const { model, open, onClose, children } = props\n const { classes } = useStyles()\n\n return (\n <Dialog open={open} onClose={onClose} title=\"Graph settings\">\n <DialogContent>\n <div className={classes.section}>\n <FormControl fullWidth>\n <FormLabel component=\"legend\">Layout quality</FormLabel>\n <RadioGroup\n value={model.layoutQuality}\n onChange={e => {\n model.setLayoutQuality(parseInt(e.target.value))\n void model.recomputeLayout()\n }}\n >\n {LAYOUT_QUALITIES.map(q => (\n <FormControlLabel\n key={q.value}\n value={q.value}\n control={<Radio />}\n label={q.label}\n />\n ))}\n </RadioGroup>\n <Caption>\n FMMM&apos;s iteration budget, the same scale Bandage exposes.\n Higher is slower: on a thousand-node cut the top setting is\n seconds rather than tenths.\n </Caption>\n <EngineOnly model={model} />\n </FormControl>\n </div>\n\n <SettingSwitch\n label=\"Draw paths\"\n checked={model.drawPaths}\n onChange={draw => {\n model.setDrawPaths(draw)\n }}\n >\n <Caption>\n Color each node and connector by the paths through it, one lane per\n path in legend order, so a path that skips a node leaves its lane\n empty\n </Caption>\n {model.drawPaths && !model.effectiveDrawPaths ? (\n <Caption warn>\n {model.pathCount > MAX_PATH_COLORS\n ? `Off: ${model.pathCount.toLocaleString()} paths is past the ${MAX_PATH_COLORS} this can tell apart`\n : 'Off: this graph states no paths'}\n </Caption>\n ) : null}\n </SettingSwitch>\n\n <SettingSwitch\n label=\"Mark bubbles\"\n checked={model.showBubbles}\n onChange={show => {\n model.setShowBubbles(show)\n }}\n >\n <Caption>\n A halo along the nodes of each bubble, labelled by what it is, with\n the label opening the bubble on its own\n </Caption>\n </SettingSwitch>\n\n <SettingSwitch\n label=\"Genes on the backbone\"\n checked={model.showGenes}\n onChange={show => {\n model.setShowGenes(show)\n }}\n >\n <Caption>\n Exons along the reference nodes that carry them and each gene's name\n at its midpoint, from the assembly's annotation track\n </Caption>\n {model.geneTrackChoices.length > 1 ? (\n <SettingSelect\n label=\"Gene track\"\n value={model.geneTrack?.trackId ?? ''}\n options={trackOptions(model.geneTrackChoices)}\n testId=\"graph-gene-track-select\"\n sx={{ mt: 1 }}\n onChange={trackId => {\n model.setGeneTrackId(trackId)\n void model.reloadGenes()\n }}\n />\n ) : null}\n {model.repeatTrackChoices.length > 1 ? (\n <SettingSelect\n label=\"Repeat track\"\n value={model.repeatTrack?.trackId ?? ''}\n options={trackOptions(model.repeatTrackChoices)}\n testId=\"graph-repeat-track-select\"\n sx={{ mt: 1 }}\n onChange={trackId => {\n model.setRepeatTrackId(trackId)\n void model.reloadRepeats()\n }}\n />\n ) : null}\n </SettingSwitch>\n\n {model.anchorPaths.length > 1 ? (\n <div className={classes.section}>\n <SettingSelect\n label=\"Reference path\"\n value={model.activeReferencePath ?? ''}\n options={model.anchorPaths.map(({ name }) => ({\n value: name,\n label: name,\n }))}\n testId=\"graph-reference-path-select\"\n onChange={name => {\n model.setReferencePath(name)\n void model.recomputeLayout()\n }}\n />\n <Caption>\n Which path the anchored layouts draw x against. A GFA with no rGFA\n tags states its coordinates only in its paths, and marks none of\n them as the reference.\n </Caption>\n </div>\n ) : null}\n\n <div className={classes.section}>\n <SettingSelect\n label=\"Bubble spread\"\n value={model.bubbleSpread}\n options={BUBBLE_SPREADS}\n testId=\"graph-bubble-spread-select\"\n onChange={spread => {\n model.setBubbleSpread(spread)\n void model.recomputeLayout()\n }}\n />\n <Caption>\n How far the force layout opens a bubble. A pangenome allele is a few\n bp, so at Bandage&apos;s own scale both arms land inside one node\n thickness and the graph draws as a rope.\n </Caption>\n <EngineOnly model={model} />\n </div>\n\n <div className={classes.section}>\n <SettingSelect\n label=\"Node width\"\n value={model.nodeWidth}\n options={NODE_WIDTHS}\n testId=\"graph-node-width-select\"\n onChange={width => {\n model.setNodeWidth(width)\n }}\n />\n <Caption>\n Bandage&apos;s depth as width. In a cut with walks, depth is how\n many haplotypes carry the node.\n </Caption>\n </div>\n\n {children}\n\n <div className={classes.section}>\n <SettingSelect\n label=\"Color scheme\"\n value={model.chosenColorScheme}\n options={COLOR_SCHEMES}\n onChange={scheme => {\n model.setColorScheme(scheme)\n }}\n />\n {model.colorSchemeLock ? (\n <Caption warn>No effect now. {model.colorSchemeLock.why}</Caption>\n ) : null}\n </div>\n </DialogContent>\n\n <DialogActions>\n <Button variant=\"contained\" color=\"primary\" onClick={onClose}>\n Close\n </Button>\n </DialogActions>\n </Dialog>\n )\n})\n\nexport default GraphSettingsDialog\n"],
5
- "mappings": "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",
5
+ "mappings": "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",
6
6
  "names": ["LAYOUT_QUALITIES", "import_ui", "import_material", "import_mobx_react", "import_mui", "import_jsx_runtime", "useStyles", "Caption", "warn", "children", "EngineOnly", "model", "SettingSwitch", "label", "checked", "onChange", "classes", "e", "SettingSelect", "value", "options", "testId", "sx", "description", "trackOptions", "tracks", "trackId", "name", "GraphSettingsDialog", "props", "open", "onClose", "LAYOUT_QUALITIES", "q", "draw", "MAX_PATH_COLORS", "show", "BUBBLE_SPREADS", "spread", "NODE_WIDTHS", "width", "COLOR_SCHEMES", "scheme", "GraphSettingsDialog_default"]
7
7
  }
@@ -0,0 +1,2 @@
1
+ import{c as V,e as Z,f as J,g as q,h as Q,k as tt,p as et}from"./chunk-7KFSWOWX.js";import{a as E}from"./chunk-PLV6SE4Y.js";import{Ca as U,K as N,O as z,S as _,T as H,X as I,ba as G,e as W,f as X,h as P,ha as j,i as v,w as F,x as Y}from"./chunk-GB7CF6Z2.js";import{g as M,i as $,s as k}from"./chunk-WTOQRUK2.js";import{z as L}from"./chunk-B7GF3TC3.js";import"./chunk-KRXALLQG.js";import"./chunk-EHV7EUMI.js";import"./chunk-MYJYGSOH.js";import"./chunk-DILFGQIL.js";import"./chunk-FCWXYIFC.js";import"./chunk-J6KYLXRD.js";import{a as S}from"./chunk-64LZZURD.js";import{a as T,b as y}from"./chunk-FY3BTKY4.js";var nt=T((vt,rt)=>{rt.exports=JBrowseExports["@jbrowse/display-kit/renderDisplaySvg"]});var ot=T((Et,at)=>{at.exports=JBrowseExports["@jbrowse/core/util/paintLayer"]});var ct=y(nt(),1);var C=y(ot(),1);var e=y(S(),1),O={fontFamily:"sans-serif",fontSize:11},st=6.2,b=16,h=18,D=48,m=2,gt=6,it=t=>t;function ft({model:t,lift:a,drawPaths:n,width:r,height:o,rasterize:i}){let s=t.buildDrawing(a,n);if(!s)return null;let l={scaleX:t.scaleX,scaleY:t.scaleY,translateX:t.translateX,translateY:t.translateY};if(i){let d=document.createElement("canvas");d.width=Math.round(r*m),d.height=Math.round(o*m);let w=new _(d);return w.uploadGeometry(s.batch),w.updateTransform({scaleX:l.scaleX*m,scaleY:l.scaleY*m,translateX:l.translateX*m,translateY:l.translateY*m,dpr:m}),w.render([0,0,0,0]),(0,e.jsx)("image",{width:r,height:o,href:d.toDataURL("image/png")})}let{canvas:p,markup:u}=E(r,o),c=p.getContext("2d");c.clearRect??=()=>{};let f=new _(p);return f.uploadGeometry(s.batch),f.updateTransform({...l,dpr:1}),f.render([0,0,0,0]),(0,e.jsx)("svg",{width:r,height:o,overflow:"hidden",children:(0,e.jsx)("g",{dangerouslySetInnerHTML:{__html:u()}})})}function R({id:t,x:a,y:n=-9,stops:r,width:o,height:i=8}){return r.length>1?(0,e.jsxs)(e.Fragment,{children:[(0,e.jsx)("defs",{children:(0,e.jsx)("linearGradient",{id:t,children:r.map((s,l)=>(0,e.jsx)("stop",{offset:s.offset,stopColor:s.color},l))})}),(0,e.jsx)("rect",{x:a,y:n,width:o,height:i,rx:2,fill:`url(#${t})`})]}):(0,e.jsx)("rect",{x:a,y:n,width:o,height:i,rx:2,fill:r[0]?.color})}function g(t,a,n,r,o="",i){let s=Math.max(n+5+(r.length+o.length)*st,(i?.length??0)*st);return{key:t,width:s,height:i?b*2:b,draw:l=>{let p=l-s;return(0,e.jsxs)("g",{...O,children:[a(p),(0,e.jsxs)("text",{x:p+n+5,y:0,children:[(0,e.jsx)("tspan",{fontWeight:"bold",children:r}),o]}),i?(0,e.jsx)("text",{x:p,y:b,children:i}):null]},t)}}}function ht(t,a,n){let r=I(a,t.walkReference),o=k(a.encoding),i=r.shades?D:h;return g(a.name,s=>(0,e.jsx)(R,{id:n,x:s,stops:o,width:i}),i,t.walkLabel(a.name),r.delta+r.outside+r.reversed,r.scale)}function x(t,a,n){return g(t,r=>(0,e.jsx)(R,{id:t,x:r,stops:[{offset:0,color:a}],width:h}),h,"",n)}function ut(t){let a=t.walkLift;if(a)return a.walks.map(o=>k(o.encoding));if(t.effectiveColorScheme==="reference-position")return[k({field:"reference",scheme:"rainbow"})];let n=t.referenceStripBlocks.map(o=>o.colors[0]).filter((o,i,s)=>o!==s[i-1]),r=Math.min(gt,n.length);return[Array.from({length:r},(o,i)=>({offset:r>1?i/(r-1):0,color:n[r>1?Math.round(i*(n.length-1)/(r-1)):0]}))]}function wt(t,a){if(!t.referenceStripShown)return[];let n=(t.walkLift?.walks.length??0)>1,r=ut(t),o=[g("strip",i=>(0,e.jsx)(e.Fragment,{children:r.map((s,l)=>(0,e.jsx)("g",{transform:`translate(0 ${l*8/r.length})`,children:(0,e.jsx)(R,{id:`${a}-strip-${l}`,x:i,y:-9,stops:s,width:h,height:8/r.length})},l))}),h,"",`top strip: reference segments at their bp${n?", a row per walk":""}`)];return t.referenceStripFaded&&o.push(x("strip-faded",M,`reference not on ${n?"that row's walk":t.liftedWalksLabel}`)),t.referenceStripOverhangs&&o.push(g("overhang",i=>(0,e.jsx)("path",{transform:`translate(${i} -10)`,d:"M0,5 L8,0 L8,10 Z M18,5 L10,0 L10,10 Z",fill:"#18181c"}),h,"","the graph draws reference past this edge")),o}function mt(t){let a=new Map;for(let n of t.bubbleHalos)if(!n.whole){let r=F[n.kind],o=a.get(r)??new Set;o.add(Y[n.kind]),a.set(r,o)}return[...a].map(([n,r])=>g(`halo-${n}`,o=>(0,e.jsx)("line",{x1:o+5,x2:o+13,y1:-5,y2:-5,stroke:n,strokeOpacity:.35,strokeWidth:8,strokeLinecap:"round"}),h,"",`bubble: ${[...r].join(", ")}`))}function yt(t){return t.pathLegend.map(({name:a,label:n,color:r})=>g(`path-${a}`,o=>(0,e.jsx)("rect",{x:o,y:-6,width:h,height:3,rx:2,fill:r}),h,"",n))}function lt(t){return t.flatMap((a,n)=>[{offset:n/t.length,color:a},{offset:(n+1)/t.length,color:a}])}function bt(t,a){if(!t.layoutResult?.tubeMap)return[];let{logWidths:n,foldBp:r,forwardReads:o,reverseReads:i,mismatches:s}=t.tubeMapKeys,l=t.readsShown,p=[],u=(c,f,d)=>g(c,w=>(0,e.jsx)("text",{x:w+h/2,y:0,textAnchor:"middle",fontFamily:"monospace",fontSize:12,children:f}),h,"",d);return o&&p.push(g("fwd",c=>(0,e.jsx)(R,{id:`${a}-fwd`,x:c,stops:lt(W),width:h}),h,"","read on the forward strand")),i&&p.push(g("rev",c=>(0,e.jsx)(R,{id:`${a}-rev`,x:c,stops:lt(X),width:h}),h,"","read on the reverse strand")),l&&l.shown<l.total&&p.push(g("sampled",()=>null,h,"",`${l.shown.toLocaleString("en-US")} of ${l.total.toLocaleString("en-US")} reads shown`)),s.has("substitution")&&p.push(u("sub","A","a read's base unlike the node's")),s.has("insertion")&&p.push(u("ins","*","bases a read inserts")),s.has("deletion")&&p.push(x("del","grey","bases a read skips")),r!==void 0&&p.push(g("fold",c=>(0,e.jsxs)(e.Fragment,{children:[(0,e.jsx)("rect",{x:c,y:-9,width:h,height:7,fill:"#b8b8c0"}),(0,e.jsx)("rect",{x:c+h/2-1,y:-9,width:2,height:7,fill:U()})]}),h,"",`a haplotype's variant under ${L(r)}`)),n&&p.push(g("log",c=>(0,e.jsx)("path",{transform:`translate(${c} -9)`,d:`M0.5,6 V1.5 H5.5 V6 M8.5,6 V1.5 H${h-.5} V6`,fill:"none",stroke:j()}),h,"","width grows with log of length")),p}function Rt(t,a){let n=t.walkRowBars;return n?N(n,{ramp:t.referenceRampDomain,genes:t.walkRowGeneKey}).map((r,o)=>{let{tree:i,width:s}=z([r],0,0,`${a}-rows-key-${o}`);return{key:`walk-rows-${o}`,width:s,height:b,draw:l=>(0,e.jsx)("g",{transform:`translate(${l-s} -12)`,children:(0,e.jsx)(Z,{el:i})},o)}}):[]}function kt({model:t,idPrefix:a}){let n=[],r=t.walkLift,o=r?void 0:t.referenceRampDomain;if(o){let f=Math.round(o.start),d=Math.round(o.end);n.push(g("ramp",w=>(0,e.jsx)(R,{id:`${a}-ramp`,x:w,stops:k({field:"reference",scheme:"rainbow"}),width:D}),D,"",`${f.toLocaleString()}-${d.toLocaleString()} (${L(d-f)})`)),t.referenceRampOffKeys.offReference&&n.push(x("off",$,"off the reference"))}if(n.push(...wt(t,a),...mt(t)),t.genePins.some(f=>f.exonsByNode.length>0)&&n.push(g("exon",f=>(0,e.jsx)("rect",{x:f+1,y:-10,width:h-2,height:10,rx:4,fill:"none",stroke:H,strokeWidth:2}),h,"","exon")),n.push(...yt(t),...bt(t,a),...Rt(t,a)),r&&!t.facetPanels&&(r.walks.forEach((f,d)=>{n.push(ht(t,f,`${a}-walk-${d}`))}),t.liftPaintsOffReference&&n.push(x("lift-off",$,"off the reference")),n.push(x("faded",M,`not on ${t.liftedWalksLabel}`))),n.length===0)return null;let i=G+t.referenceStripZonePx,s=t.paneWidth-G-6,l=Math.max(...n.map(f=>f.width))+12,p=s+6-l+6,u=n.reduce((f,d)=>f+d.height,0)+6,c=i+b;return(0,e.jsxs)("g",{"data-testid":"graph-svg-keys",children:[(0,e.jsx)("rect",{x:p-6,y:i,width:l,height:u,rx:3,fill:"#fff",fillOpacity:.82}),n.map(f=>{let d=c;return c+=f.height,(0,e.jsx)("g",{transform:`translate(0 ${d})`,children:f.draw(p+f.width)},f.key)})]})}function pt({x:t,y:a,text:n,fontSize:r,anchor:o,bold:i}){let s=n.length*r*.56+6,l=o==="middle"?t-s/2:t-3;return(0,e.jsxs)(e.Fragment,{children:[(0,e.jsx)("rect",{x:l,y:a-r*.65,width:s,height:r*1.3,rx:3,fill:"#fff",fillOpacity:.8}),(0,e.jsx)("text",{x:t,y:a+r*.35,textAnchor:o,fontSize:r,fontWeight:i?600:void 0,fill:"#18181c",children:n})]})}function xt({model:t}){return(0,e.jsx)("g",{fontFamily:O.fontFamily,children:t.overlayLabels.sizes.map(({key:a,text:n,x:r,y:o,kind:i,leader:s})=>(0,e.jsxs)("g",{children:[s?(0,e.jsx)("line",{x1:s.arcX,y1:s.arcY,x2:s.labelX,y2:s.labelY,stroke:"#18181c"}):null,(0,e.jsx)(pt,{x:r,y:o,text:n,fontSize:10,anchor:"middle",bold:i==="deletion"})]},a))})}function St({model:t}){return(0,e.jsx)("g",{fontFamily:O.fontFamily,children:t.drawnRowLabels.map(({label:a,y:n})=>{let r=n*t.scaleY+t.translateY;return r>=0&&r<=t.canvasHeight?(0,e.jsx)(pt,{x:10,y:r,text:a,fontSize:11,anchor:"start"},n):null})})}function Lt({model:t,rasterize:a,idPrefix:n}){let r=t.facetPanels,o=t.facetGrid,i=t.facetPlacement;if(!r||!o||!i)return null;let{columns:s,width:l,height:p}=o;return(0,e.jsx)(e.Fragment,{children:r.map((u,c)=>{let f=i.cells[c],d=f%s*(l+P),w=Math.floor(f/s)*(v+p+P),K=u.walks[0],A=ht(t,K,`${n}-facet-${c}`);return(0,e.jsxs)("g",{transform:`translate(${d} ${w})`,children:[(0,e.jsx)("g",{transform:`translate(0 ${b-2})`,children:A.draw(A.width+6)}),(0,e.jsx)("g",{transform:`translate(0 ${v})`,children:(0,e.jsx)(ft,{model:t,lift:u,drawPaths:!1,width:l,height:p,rasterize:a})})]},K.name)})})}function B({model:t,rasterize:a=!1,idPrefix:n}){let r=t.paneWidth,o=t.canvasHeight,i=!!t.layoutResult?.tubeMap,s={rasterizeLayers:a};return(0,e.jsxs)("g",{"data-testid":"graph-pane-svg",children:[t.facetPanels?(0,e.jsx)(Lt,{model:t,rasterize:a,idPrefix:n}):i?(0,e.jsx)(C.PaintLayer,{width:r,height:o,opts:s,paint:l=>{tt(it(l),t,{highlightNode:null})}}):(0,e.jsx)(ft,{model:t,lift:t.walkLift,drawPaths:t.effectiveDrawPaths,width:r,height:o,rasterize:a}),t.referenceStripShown?(0,e.jsx)(C.PaintLayer,{width:r,height:o,opts:s,paint:l=>{Q(it(l),t,{lit:void 0,dpr:1})}}):null,t.facetPanels?null:(0,e.jsxs)(e.Fragment,{children:[(0,e.jsx)(et,{model:t}),(0,e.jsx)(St,{model:t}),(0,e.jsx)(xt,{model:t}),(0,e.jsx)(V,{model:t}),(0,e.jsx)(J,{model:t}),(0,e.jsx)(q,{model:t}),(0,e.jsx)(kt,{model:t,idPrefix:n})]})]})}var dt=y(S(),1);function Pt({model:t,opts:a}){return(0,dt.jsx)(B,{model:t,rasterize:!!a?.rasterizeLayers,idPrefix:`graph-${t.id}`})}function qt(t,a){return(0,ct.renderDisplaySvg)(t,a,Pt)}export{qt as renderGraphTrackSvg};
2
+ //# sourceMappingURL=renderSvg-J7L374ND.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["global-externals:@jbrowse/display-kit/renderDisplaySvg", "global-externals:@jbrowse/core/util/paintLayer", "../../src/LinearGraphDisplay/renderSvg.tsx", "../../src/GraphGenomeView/components/PaneSvg.tsx"],
4
+ "sourcesContent": ["module.exports = JBrowseExports[\"@jbrowse/display-kit/renderDisplaySvg\"];", "module.exports = JBrowseExports[\"@jbrowse/core/util/paintLayer\"];", "import { renderDisplaySvg } from '@jbrowse/display-kit/renderDisplaySvg'\n\nimport PaneSvg from '../GraphGenomeView/components/PaneSvg'\n\nimport type { LinearGraphDisplayModel } from './model'\nimport type { LgvSvgBodyProps } from '@jbrowse/display-kit/renderDisplaySvg'\nimport type { ExportSvgDisplayOptions } from '@jbrowse/display-kit/types'\n\nfunction GraphTrackSvgBody({\n model,\n opts,\n}: LgvSvgBodyProps<LinearGraphDisplayModel>) {\n return (\n <PaneSvg\n model={model}\n rasterize={!!opts?.rasterizeLayers}\n idPrefix={`graph-${model.id}`}\n />\n )\n}\n\nexport function renderGraphTrackSvg(\n model: LinearGraphDisplayModel,\n opts?: ExportSvgDisplayOptions,\n) {\n return renderDisplaySvg(model, opts, GraphTrackSvgBody)\n}\n", "import {\n BUBBLE_KIND_COLORS,\n BUBBLE_KIND_NAMES,\n} from '@jbrowse/bandage-core/bubbles/classifyBubble'\nimport { FACET_GAP_PX, FACET_TITLE_PX } from '@jbrowse/bandage-core/facetGrid'\nimport { formatBp } from '@jbrowse/bandage-core/graphLabels'\nimport { LEGEND_INSET_PX } from '@jbrowse/bandage-core/labelLayout'\nimport {\n walkRowsKey,\n walkRowsKeyTree,\n} from '@jbrowse/bandage-core/layout/walkRowDraw'\nimport { Canvas2DRenderer } from '@jbrowse/bandage-core/renderer/Canvas2DRenderer'\nimport {\n LIFT_BACKDROP_CSS,\n REFERENCE_RAMP_ALT_CSS,\n} from '@jbrowse/bandage-core/renderer/GeometryBuilder'\nimport { svgCanvas } from '@jbrowse/bandage-core/renderer/svgCanvas'\nimport { rulerInk } from '@jbrowse/bandage-core/tubeMap/axis'\nimport { deviationInk } from '@jbrowse/bandage-core/tubeMap/deviations'\nimport {\n FORWARD_READ_COLORS,\n REVERSE_READ_COLORS,\n} from '@jbrowse/bandage-core/tubeMap/reads'\nimport { encodingStops } from '@jbrowse/bandage-core/walkEncoding'\nimport { walkKey } from '@jbrowse/bandage-core/walkKey'\nimport { PaintLayer } from '@jbrowse/core/util/paintLayer'\n\nimport BubbleHalos from './BubbleHalos'\nimport ElTree from './ElTree'\nimport GenePins, { EXON_COLOR } from './GenePins'\nimport LabelLayer from './LabelLayer'\nimport { paintReferenceStrip } from './ReferenceStripOverlay'\nimport { paintTubeMap } from './TubeMapOverlay'\nimport WalkRowsOverlay from './WalkRowsOverlay'\n\nimport type { GraphPaneModel } from '../model'\nimport type { LiftedWalk, WalkLift } from '@jbrowse/bandage-core/walkHighlight'\nimport type { Ctx2D } from '@jbrowse/core/util/paintLayer'\n\nconst FONT = { fontFamily: 'sans-serif', fontSize: 11 }\nconst CHAR_PX = 6.2\nconst ROW_PX = 16\nconst SWATCH_PX = 18\nconst BAR_PX = 48\nconst RASTER_SCALE = 2\nconst STRIP_SAMPLES = 6\n\nconst asCanvasCtx = (ctx: Ctx2D) => ctx as CanvasRenderingContext2D\n\n// The drawing's nodes and edges through the pane's own transform, so the\n// export lines up with the linear view's ruler wherever the screen does\nfunction Body({\n model,\n lift,\n drawPaths,\n width,\n height,\n rasterize,\n}: {\n model: GraphPaneModel\n lift: WalkLift | undefined\n drawPaths: boolean\n width: number\n height: number\n rasterize: boolean\n}) {\n const built = model.buildDrawing(lift, drawPaths)\n if (!built) {\n return null\n }\n const transform = {\n scaleX: model.scaleX,\n scaleY: model.scaleY,\n translateX: model.translateX,\n translateY: model.translateY,\n }\n if (rasterize) {\n const canvas = document.createElement('canvas')\n canvas.width = Math.round(width * RASTER_SCALE)\n canvas.height = Math.round(height * RASTER_SCALE)\n const renderer = new Canvas2DRenderer(canvas)\n renderer.uploadGeometry(built.batch)\n renderer.updateTransform({\n scaleX: transform.scaleX * RASTER_SCALE,\n scaleY: transform.scaleY * RASTER_SCALE,\n translateX: transform.translateX * RASTER_SCALE,\n translateY: transform.translateY * RASTER_SCALE,\n dpr: RASTER_SCALE,\n })\n renderer.render([0, 0, 0, 0])\n return (\n <image\n width={width}\n height={height}\n href={canvas.toDataURL('image/png')}\n />\n )\n }\n const { canvas, markup } = svgCanvas(width, height)\n const ctx = canvas.getContext('2d') as unknown as { clearRect?: () => void }\n ctx.clearRect ??= () => {}\n const renderer = new Canvas2DRenderer(canvas)\n renderer.uploadGeometry(built.batch)\n renderer.updateTransform({ ...transform, dpr: 1 })\n renderer.render([0, 0, 0, 0])\n return (\n <svg width={width} height={height} overflow=\"hidden\">\n <g dangerouslySetInnerHTML={{ __html: markup() }} />\n </svg>\n )\n}\n\nfunction Swatch({\n id,\n x,\n y = -9,\n stops,\n width,\n height = 8,\n}: {\n id: string\n x: number\n y?: number\n stops: { offset: number; color: string }[]\n width: number\n height?: number\n}) {\n return stops.length > 1 ? (\n <>\n <defs>\n <linearGradient id={id}>\n {stops.map((s, i) => (\n <stop key={i} offset={s.offset} stopColor={s.color} />\n ))}\n </linearGradient>\n </defs>\n <rect\n x={x}\n y={y}\n width={width}\n height={height}\n rx={2}\n fill={`url(#${id})`}\n />\n </>\n ) : (\n <rect\n x={x}\n y={y}\n width={width}\n height={height}\n rx={2}\n fill={stops[0]?.color}\n />\n )\n}\n\ninterface KeyRow {\n key: string\n width: number\n height: number\n draw: (right: number) => React.ReactNode\n}\n\n// A row of the key: a swatch, then its words, ending at `right`\nfunction swatchRow(\n key: string,\n swatch: (x: number) => React.ReactNode,\n swatchWidth: number,\n label: string,\n after = '',\n under?: string,\n): KeyRow {\n const width = Math.max(\n swatchWidth + 5 + (label.length + after.length) * CHAR_PX,\n (under?.length ?? 0) * CHAR_PX,\n )\n return {\n key,\n width,\n height: under ? ROW_PX * 2 : ROW_PX,\n draw: right => {\n const x = right - width\n return (\n <g key={key} {...FONT}>\n {swatch(x)}\n <text x={x + swatchWidth + 5} y={0}>\n <tspan fontWeight=\"bold\">{label}</tspan>\n {after}\n </text>\n {under ? (\n <text x={x} y={ROW_PX}>\n {under}\n </text>\n ) : null}\n </g>\n )\n },\n }\n}\n\nfunction walkRow(model: GraphPaneModel, walk: LiftedWalk, id: string) {\n const key = walkKey(walk, model.walkReference)\n const stops = encodingStops(walk.encoding)\n const width = key.shades ? BAR_PX : SWATCH_PX\n return swatchRow(\n walk.name,\n x => <Swatch id={id} x={x} stops={stops} width={width} />,\n width,\n model.walkLabel(walk.name),\n key.delta + key.outside + key.reversed,\n key.scale,\n )\n}\n\nfunction flatRow(key: string, color: string, label: string) {\n return swatchRow(\n key,\n x => (\n <Swatch id={key} x={x} stops={[{ offset: 0, color }]} width={SWATCH_PX} />\n ),\n SWATCH_PX,\n '',\n label,\n )\n}\n\n// The strip's own colours, a row per lifted walk, else the node scheme's\nfunction stripStops(model: GraphPaneModel) {\n const lift = model.walkLift\n if (lift) {\n return lift.walks.map(w => encodingStops(w.encoding))\n }\n if (model.effectiveColorScheme === 'reference-position') {\n return [encodingStops({ field: 'reference', scheme: 'rainbow' })]\n }\n const colors = model.referenceStripBlocks\n .map(b => b.colors[0]!)\n .filter((c, i, all) => c !== all[i - 1])\n const n = Math.min(STRIP_SAMPLES, colors.length)\n return [\n Array.from({ length: n }, (_, i) => ({\n offset: n > 1 ? i / (n - 1) : 0,\n color:\n colors[n > 1 ? Math.round((i * (colors.length - 1)) / (n - 1)) : 0]!,\n })),\n ]\n}\n\nfunction stripKeyRows(model: GraphPaneModel, idPrefix: string): KeyRow[] {\n if (!model.referenceStripShown) {\n return []\n }\n const rowPerWalk = (model.walkLift?.walks.length ?? 0) > 1\n const bands = stripStops(model)\n const rows = [\n swatchRow(\n 'strip',\n x => (\n <>\n {bands.map((stops, i) => (\n <g key={i} transform={`translate(0 ${(i * 8) / bands.length})`}>\n <Swatch\n id={`${idPrefix}-strip-${i}`}\n x={x}\n y={-9}\n stops={stops}\n width={SWATCH_PX}\n height={8 / bands.length}\n />\n </g>\n ))}\n </>\n ),\n SWATCH_PX,\n '',\n `top strip: reference segments at their bp${rowPerWalk ? ', a row per walk' : ''}`,\n ),\n ]\n if (model.referenceStripFaded) {\n rows.push(\n flatRow(\n 'strip-faded',\n LIFT_BACKDROP_CSS,\n `reference not on ${rowPerWalk ? \"that row's walk\" : model.liftedWalksLabel}`,\n ),\n )\n }\n if (model.referenceStripOverhangs) {\n rows.push(\n swatchRow(\n 'overhang',\n x => (\n <path\n transform={`translate(${x} -10)`}\n d=\"M0,5 L8,0 L8,10 Z M18,5 L10,0 L10,10 Z\"\n fill=\"#18181c\"\n />\n ),\n SWATCH_PX,\n '',\n 'the graph draws reference past this edge',\n ),\n )\n }\n return rows\n}\n\nfunction haloRows(model: GraphPaneModel): KeyRow[] {\n const kindsByColor = new Map<string, Set<string>>()\n for (const h of model.bubbleHalos) {\n if (!h.whole) {\n const color = BUBBLE_KIND_COLORS[h.kind]\n const kinds = kindsByColor.get(color) ?? new Set<string>()\n kinds.add(BUBBLE_KIND_NAMES[h.kind])\n kindsByColor.set(color, kinds)\n }\n }\n return [...kindsByColor].map(([color, kinds]) =>\n swatchRow(\n `halo-${color}`,\n x => (\n <line\n x1={x + 5}\n x2={x + 13}\n y1={-5}\n y2={-5}\n stroke={color}\n strokeOpacity={0.35}\n strokeWidth={8}\n strokeLinecap=\"round\"\n />\n ),\n SWATCH_PX,\n '',\n `bubble: ${[...kinds].join(', ')}`,\n ),\n )\n}\n\nfunction pathRows(model: GraphPaneModel): KeyRow[] {\n return model.pathLegend.map(({ name, label, color }) =>\n swatchRow(\n `path-${name}`,\n x => (\n <rect x={x} y={-6} width={SWATCH_PX} height={3} rx={2} fill={color} />\n ),\n SWATCH_PX,\n '',\n label,\n ),\n )\n}\n\nfunction readStops(colors: readonly string[]) {\n return colors.flatMap((color, i) => [\n { offset: i / colors.length, color },\n { offset: (i + 1) / colors.length, color },\n ])\n}\n\nfunction tubeMapRows(model: GraphPaneModel, idPrefix: string): KeyRow[] {\n if (!model.layoutResult?.tubeMap) {\n return []\n }\n const { logWidths, foldBp, forwardReads, reverseReads, mismatches } =\n model.tubeMapKeys\n const reads = model.readsShown\n const rows: KeyRow[] = []\n const glyph = (key: string, char: string, label: string) =>\n swatchRow(\n key,\n x => (\n <text\n x={x + SWATCH_PX / 2}\n y={0}\n textAnchor=\"middle\"\n fontFamily=\"monospace\"\n fontSize={12}\n >\n {char}\n </text>\n ),\n SWATCH_PX,\n '',\n label,\n )\n if (forwardReads) {\n rows.push(\n swatchRow(\n 'fwd',\n x => (\n <Swatch\n id={`${idPrefix}-fwd`}\n x={x}\n stops={readStops(FORWARD_READ_COLORS)}\n width={SWATCH_PX}\n />\n ),\n SWATCH_PX,\n '',\n 'read on the forward strand',\n ),\n )\n }\n if (reverseReads) {\n rows.push(\n swatchRow(\n 'rev',\n x => (\n <Swatch\n id={`${idPrefix}-rev`}\n x={x}\n stops={readStops(REVERSE_READ_COLORS)}\n width={SWATCH_PX}\n />\n ),\n SWATCH_PX,\n '',\n 'read on the reverse strand',\n ),\n )\n }\n if (reads && reads.shown < reads.total) {\n rows.push(\n swatchRow(\n 'sampled',\n () => null,\n SWATCH_PX,\n '',\n `${reads.shown.toLocaleString('en-US')} of ${reads.total.toLocaleString('en-US')} reads shown`,\n ),\n )\n }\n if (mismatches.has('substitution')) {\n rows.push(glyph('sub', 'A', \"a read's base unlike the node's\"))\n }\n if (mismatches.has('insertion')) {\n rows.push(glyph('ins', '*', 'bases a read inserts'))\n }\n if (mismatches.has('deletion')) {\n rows.push(flatRow('del', 'grey', 'bases a read skips'))\n }\n if (foldBp !== undefined) {\n rows.push(\n swatchRow(\n 'fold',\n x => (\n <>\n <rect x={x} y={-9} width={SWATCH_PX} height={7} fill=\"#b8b8c0\" />\n <rect\n x={x + SWATCH_PX / 2 - 1}\n y={-9}\n width={2}\n height={7}\n fill={deviationInk()}\n />\n </>\n ),\n SWATCH_PX,\n '',\n `a haplotype's variant under ${formatBp(foldBp)}`,\n ),\n )\n }\n if (logWidths) {\n rows.push(\n swatchRow(\n 'log',\n x => (\n <path\n transform={`translate(${x} -9)`}\n d={`M0.5,6 V1.5 H5.5 V6 M8.5,6 V1.5 H${SWATCH_PX - 0.5} V6`}\n fill=\"none\"\n stroke={rulerInk()}\n />\n ),\n SWATCH_PX,\n '',\n 'width grows with log of length',\n ),\n )\n }\n return rows\n}\n\nfunction walkRowsKeyRows(model: GraphPaneModel, idPrefix: string): KeyRow[] {\n const bars = model.walkRowBars\n if (!bars) {\n return []\n }\n return walkRowsKey(bars, {\n ramp: model.referenceRampDomain,\n genes: model.walkRowGeneKey,\n }).map((entry, i) => {\n const { tree, width } = walkRowsKeyTree(\n [entry],\n 0,\n 0,\n `${idPrefix}-rows-key-${i}`,\n )\n return {\n key: `walk-rows-${i}`,\n width,\n height: ROW_PX,\n draw: (right: number) => (\n <g key={i} transform={`translate(${right - width} -12)`}>\n <ElTree el={tree} />\n </g>\n ),\n }\n })\n}\n\n// The keys the screen stacks in the top right corner, in its order\nfunction Keys({\n model,\n idPrefix,\n}: {\n model: GraphPaneModel\n idPrefix: string\n}) {\n const rows: KeyRow[] = []\n const lift = model.walkLift\n const domain = lift ? undefined : model.referenceRampDomain\n if (domain) {\n const start = Math.round(domain.start)\n const end = Math.round(domain.end)\n rows.push(\n swatchRow(\n 'ramp',\n x => (\n <Swatch\n id={`${idPrefix}-ramp`}\n x={x}\n stops={encodingStops({ field: 'reference', scheme: 'rainbow' })}\n width={BAR_PX}\n />\n ),\n BAR_PX,\n '',\n `${start.toLocaleString()}-${end.toLocaleString()} (${formatBp(end - start)})`,\n ),\n )\n if (model.referenceRampOffKeys.offReference) {\n rows.push(flatRow('off', REFERENCE_RAMP_ALT_CSS, 'off the reference'))\n }\n }\n rows.push(...stripKeyRows(model, idPrefix), ...haloRows(model))\n if (model.genePins.some(pin => pin.exonsByNode.length > 0)) {\n rows.push(\n swatchRow(\n 'exon',\n x => (\n <rect\n x={x + 1}\n y={-10}\n width={SWATCH_PX - 2}\n height={10}\n rx={4}\n fill=\"none\"\n stroke={EXON_COLOR}\n strokeWidth={2}\n />\n ),\n SWATCH_PX,\n '',\n 'exon',\n ),\n )\n }\n rows.push(\n ...pathRows(model),\n ...tubeMapRows(model, idPrefix),\n ...walkRowsKeyRows(model, idPrefix),\n )\n if (lift && !model.facetPanels) {\n lift.walks.forEach((walk, i) => {\n rows.push(walkRow(model, walk, `${idPrefix}-walk-${i}`))\n })\n if (model.liftPaintsOffReference) {\n rows.push(\n flatRow('lift-off', REFERENCE_RAMP_ALT_CSS, 'off the reference'),\n )\n }\n rows.push(\n flatRow('faded', LIFT_BACKDROP_CSS, `not on ${model.liftedWalksLabel}`),\n )\n }\n if (rows.length === 0) {\n return null\n }\n const top = LEGEND_INSET_PX + model.referenceStripZonePx\n const right = model.paneWidth - LEGEND_INSET_PX - 6\n const boxWidth = Math.max(...rows.map(r => r.width)) + 12\n const left = right + 6 - boxWidth + 6\n const boxHeight = rows.reduce((sum, r) => sum + r.height, 0) + 6\n let y = top + ROW_PX\n return (\n <g data-testid=\"graph-svg-keys\">\n <rect\n x={left - 6}\n y={top}\n width={boxWidth}\n height={boxHeight}\n rx={3}\n fill=\"#fff\"\n fillOpacity={0.82}\n />\n {rows.map(row => {\n const at = y\n y += row.height\n return (\n <g key={row.key} transform={`translate(0 ${at})`}>\n {row.draw(left + row.width)}\n </g>\n )\n })}\n </g>\n )\n}\n\n// Words on a pale rounded backing, as the screen's labels sit\nfunction Chip({\n x,\n y,\n text,\n fontSize,\n anchor,\n bold,\n}: {\n x: number\n y: number\n text: string\n fontSize: number\n anchor: 'start' | 'middle'\n bold?: boolean\n}) {\n const w = text.length * fontSize * 0.56 + 6\n const left = anchor === 'middle' ? x - w / 2 : x - 3\n return (\n <>\n <rect\n x={left}\n y={y - fontSize * 0.65}\n width={w}\n height={fontSize * 1.3}\n rx={3}\n fill=\"#fff\"\n fillOpacity={0.8}\n />\n <text\n x={x}\n y={y + fontSize * 0.35}\n textAnchor={anchor}\n fontSize={fontSize}\n fontWeight={bold ? 600 : undefined}\n fill=\"#18181c\"\n >\n {text}\n </text>\n </>\n )\n}\n\n// The node and deletion lengths written on the drawing, with their leaders\nfunction SizeLabels({ model }: { model: GraphPaneModel }) {\n return (\n <g fontFamily={FONT.fontFamily}>\n {model.overlayLabels.sizes.map(({ key, text, x, y, kind, leader }) => (\n <g key={key}>\n {leader ? (\n <line\n x1={leader.arcX}\n y1={leader.arcY}\n x2={leader.labelX}\n y2={leader.labelY}\n stroke=\"#18181c\"\n />\n ) : null}\n <Chip\n x={x}\n y={y}\n text={text}\n fontSize={10}\n anchor=\"middle\"\n bold={kind === 'deletion'}\n />\n </g>\n ))}\n </g>\n )\n}\n\nfunction RowLabels({ model }: { model: GraphPaneModel }) {\n return (\n <g fontFamily={FONT.fontFamily}>\n {model.drawnRowLabels.map(({ label, y }) => {\n const screenY = y * model.scaleY + model.translateY\n return screenY >= 0 && screenY <= model.canvasHeight ? (\n <Chip\n key={y}\n x={10}\n y={screenY}\n text={label}\n fontSize={11}\n anchor=\"start\"\n />\n ) : null\n })}\n </g>\n )\n}\n\n// Each lifted walk in a panel of its own, its key as the panel's title\nfunction Facets({\n model,\n rasterize,\n idPrefix,\n}: {\n model: GraphPaneModel\n rasterize: boolean\n idPrefix: string\n}) {\n const panels = model.facetPanels\n const grid = model.facetGrid\n const place = model.facetPlacement\n if (!panels || !grid || !place) {\n return null\n }\n const { columns, width, height } = grid\n return (\n <>\n {panels.map((lift, i) => {\n const cell = place.cells[i]!\n const x = (cell % columns) * (width + FACET_GAP_PX)\n const y =\n Math.floor(cell / columns) * (FACET_TITLE_PX + height + FACET_GAP_PX)\n const walk = lift.walks[0]!\n const title = walkRow(model, walk, `${idPrefix}-facet-${i}`)\n return (\n <g key={walk.name} transform={`translate(${x} ${y})`}>\n <g transform={`translate(0 ${ROW_PX - 2})`}>\n {title.draw(title.width + 6)}\n </g>\n <g transform={`translate(0 ${FACET_TITLE_PX})`}>\n <Body\n model={model}\n lift={lift}\n drawPaths={false}\n width={width}\n height={height}\n rasterize={rasterize}\n />\n </g>\n </g>\n )\n })}\n </>\n )\n}\n\n// The pane as the screen draws it, for the linear view's SVG export: the\n// canvas's ink, the tube map and reference strip painters, and the SVG\n// overlays the screen mounts over them. Hover and selection are left out.\nexport default function PaneSvg({\n model,\n rasterize = false,\n idPrefix,\n}: {\n model: GraphPaneModel\n rasterize?: boolean\n idPrefix: string\n}) {\n const width = model.paneWidth\n const height = model.canvasHeight\n const tubeMap = !!model.layoutResult?.tubeMap\n const opts = { rasterizeLayers: rasterize }\n return (\n <g data-testid=\"graph-pane-svg\">\n {model.facetPanels ? (\n <Facets model={model} rasterize={rasterize} idPrefix={idPrefix} />\n ) : tubeMap ? (\n <PaintLayer\n width={width}\n height={height}\n opts={opts}\n paint={ctx => {\n paintTubeMap(asCanvasCtx(ctx), model, { highlightNode: null })\n }}\n />\n ) : (\n <Body\n model={model}\n lift={model.walkLift}\n drawPaths={model.effectiveDrawPaths}\n width={width}\n height={height}\n rasterize={rasterize}\n />\n )}\n {model.referenceStripShown ? (\n <PaintLayer\n width={width}\n height={height}\n opts={opts}\n paint={ctx => {\n paintReferenceStrip(asCanvasCtx(ctx), model, {\n lit: undefined,\n dpr: 1,\n })\n }}\n />\n ) : null}\n {model.facetPanels ? null : (\n <>\n <WalkRowsOverlay model={model} />\n <RowLabels model={model} />\n <SizeLabels model={model} />\n <BubbleHalos model={model} />\n <GenePins model={model} />\n <LabelLayer model={model} />\n <Keys model={model} idPrefix={idPrefix} />\n </>\n )}\n </g>\n )\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["require_renderDisplaySvg", "__commonJSMin", "exports", "module", "require_paintLayer", "__commonJSMin", "exports", "module", "import_renderDisplaySvg", "import_paintLayer", "import_jsx_runtime", "FONT", "CHAR_PX", "ROW_PX", "SWATCH_PX", "BAR_PX", "RASTER_SCALE", "STRIP_SAMPLES", "asCanvasCtx", "ctx", "Body", "model", "lift", "drawPaths", "width", "height", "rasterize", "built", "transform", "canvas", "renderer", "Canvas2DRenderer", "markup", "svgCanvas", "Swatch", "id", "x", "y", "stops", "i", "swatchRow", "key", "swatch", "swatchWidth", "label", "after", "under", "right", "walkRow", "walk", "walkKey", "encodingStops", "flatRow", "color", "stripStops", "w", "colors", "b", "c", "all", "n", "_", "stripKeyRows", "idPrefix", "rowPerWalk", "bands", "rows", "LIFT_BACKDROP_CSS", "haloRows", "kindsByColor", "h", "BUBBLE_KIND_COLORS", "kinds", "BUBBLE_KIND_NAMES", "pathRows", "name", "readStops", "tubeMapRows", "logWidths", "foldBp", "forwardReads", "reverseReads", "mismatches", "reads", "glyph", "char", "FORWARD_READ_COLORS", "REVERSE_READ_COLORS", "deviationInk", "formatBp", "rulerInk", "walkRowsKeyRows", "bars", "walkRowsKey", "entry", "tree", "walkRowsKeyTree", "ElTree", "Keys", "domain", "start", "end", "REFERENCE_RAMP_ALT_CSS", "pin", "EXON_COLOR", "top", "LEGEND_INSET_PX", "boxWidth", "r", "left", "boxHeight", "sum", "row", "at", "Chip", "text", "fontSize", "anchor", "bold", "SizeLabels", "kind", "leader", "RowLabels", "screenY", "Facets", "panels", "grid", "place", "columns", "cell", "FACET_GAP_PX", "FACET_TITLE_PX", "title", "PaneSvg", "tubeMap", "opts", "paintTubeMap", "paintReferenceStrip", "WalkRowsOverlay_default", "BubbleHalos_default", "GenePins_default", "LabelLayer_default", "import_jsx_runtime", "GraphTrackSvgBody", "model", "opts", "PaneSvg", "renderGraphTrackSvg"]
7
+ }