@kazant/flexgraph 1.1.0 → 1.2.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.
@@ -1,2 +1,2 @@
1
- /*! FlexGraph v1.1.0 | MIT License | (c) 2026 Alexander Pettersen (kazant) | https://github.com/kazant/flexgraph */
2
- var Fe=Object.defineProperty;var Ge=(r,t)=>{for(var n in t)Fe(r,n,{get:t[n],enumerable:!0})};var je=["top","right","bottom","left"],De=["TB","LR","BT","RL"],Ye=["orthogonal","straight","curved"],Ot=Object.freeze({direction:"TB",nodeSpacing:40,rankSpacing:80,edgeSpacing:10,edgeRouting:"orthogonal",cornerRadius:6,lineHops:!0,hopRadius:4,animate:!0,animationDuration:300,nodeMargin:14,groupPadding:20,groupLabelHeight:22,componentSpacing:80,maxIterations:24,bendPenalty:24,crossingPenalty:120,defaultNodeWidth:160,defaultNodeHeight:60,pinOnDrag:!0,draggable:!0,zoomable:!0,pannable:!0,minZoom:.1,maxZoom:4,controls:!0,showPorts:!0,hoverHighlight:"chain",highlightSelection:!0,edgeTypes:{default:{markerEnd:"arrow"},"has-many":{markerStart:"one",markerEnd:"many"},"has-one":{markerStart:"one",markerEnd:"onlyOne"},"belongs-to":{markerStart:"many",markerEnd:"one"},"many-to-many":{markerStart:"many",markerEnd:"many"},association:{markerEnd:"open"},composition:{markerStart:"diamond"},dependency:{markerEnd:"open"}}}),ut=class extends Error{constructor(t,n=[]){super(t),this.name="GraphValidationError",this.details=n}},Q=r=>typeof r=="number"&&Number.isFinite(r);function xt(...r){let t={...Ot,edgeTypes:{...Ot.edgeTypes}};for(let n of r)if(n)for(let[o,s]of Object.entries(n))s!==void 0&&(o==="edgeTypes"?Object.assign(t.edgeTypes,s):t[o]=s);return De.includes(t.direction)||(t.direction="TB"),Ye.includes(t.edgeRouting)||(t.edgeRouting="orthogonal"),t}function Pt(r,t,n){if(!r||typeof r!="object")throw new ut("Graph must be an object");let o=xt(r.options,t),s=[],e=[],i=[],c=new Map;for(let f of r.groups||[]){if(!f||f.id==null){s.push("Group without id");continue}let h=String(f.id);if(c.has(h)){s.push(`Duplicate group id "${h}"`);continue}let g={id:h,label:f.label??h,className:f.className||"",data:f};i.push(g),c.set(h,g)}let a=[],d=new Map;(r.nodes||[]).forEach((f,h)=>{if(!f||f.id==null){s.push(`Node at index ${h} has no id`);return}let g=String(f.id);if(d.has(g)){s.push(`Duplicate node id "${g}"`);return}let w=n&&n.get(g),x=Q(f.width)?f.width:w?w.width:o.defaultNodeWidth,M=Q(f.height)?f.height:w?w.height:o.defaultNodeHeight,m=f.group!=null?String(f.group):null;if(m&&!c.has(m)){let I={id:m,label:m,className:"",data:{id:m}};i.push(I),c.set(m,I)}let y=[],b=new Set;for(let I of f.ports||[]){if(!I||I.id==null){e.push(`Node "${g}": port without id ignored`);continue}let $=String(I.id);if(b.has($)){e.push(`Node "${g}": duplicate port "${$}" ignored`);continue}let B=je.includes(I.side)?I.side:null;B||e.push(`Node "${g}": port "${$}" has invalid side "${I.side}", using auto side`),b.add($),y.push({id:$,side:B,offset:Q(I.offset)?Math.min(1,Math.max(0,I.offset)):null,label:I.label,data:I})}let k=f.constraints||{},S={pinned:!!k.pinned,x:Q(k.x)?k.x:Q(f.x)&&k.pinned?f.x:null,y:Q(k.y)?k.y:Q(f.y)&&k.pinned?f.y:null,rank:Number.isInteger(k.rank)&&k.rank>=0?k.rank:null};S.pinned&&(S.x==null||S.y==null)&&(e.push(`Node "${g}" is pinned but has no x/y; pin ignored until it has a position`),S.pinned=!1);let _={id:g,index:h,label:f.label??g,width:x,height:M,group:m,ports:y,portById:new Map(y.map(I=>[I.id,I])),constraints:S,className:f.className||"",type:f.type||null,data:f};a.push(_),d.set(g,_)});let l=[],u=new Map;(r.edges||[]).forEach((f,h)=>{if(!f)return;let g=f.id!=null?String(f.id):`e${h}`;if(u.has(g)){s.push(`Duplicate edge id "${g}"`);return}let w=String(f.source),x=String(f.target);if(!d.has(w)){s.push(`Edge "${g}": unknown source node "${w}"`);return}if(!d.has(x)){s.push(`Edge "${g}": unknown target node "${x}"`);return}let M=f.sourcePort!=null?String(f.sourcePort):null,m=f.targetPort!=null?String(f.targetPort):null;M&&!d.get(w).portById.has(M)&&(e.push(`Edge "${g}": node "${w}" has no port "${M}"`),M=null),m&&!d.get(x).portById.has(m)&&(e.push(`Edge "${g}": node "${x}" has no port "${m}"`),m=null);let y=o.edgeTypes[f.type]||o.edgeTypes.default||{},b={id:g,index:h,source:w,target:x,sourcePort:M,targetPort:m,type:f.type||"default",label:f.label??null,minLen:Number.isInteger(f.minLen)&&f.minLen>=0?f.minLen:1,weight:Q(f.weight)?f.weight:1,markerStart:f.markerStart!==void 0?f.markerStart:y.markerStart||null,markerEnd:f.markerEnd!==void 0?f.markerEnd:y.markerEnd||null,className:f.className||"",data:f};l.push(b),u.set(g,b)});let p=[];for(let f of r.constraints||[])if(!(!f||!f.type))if(f.type==="leftOf"||f.type==="before"){let h=String(f.a),g=String(f.b);if(!d.has(h)||!d.has(g)){e.push("leftOf constraint references unknown node");continue}p.push({type:"leftOf",a:h,b:g})}else if(f.type==="sameRank"){let h=(f.nodes||[]).map(String).filter(g=>d.has(g));h.length>=2?p.push({type:"sameRank",nodes:h}):e.push("sameRank constraint needs at least two known nodes")}else if(f.type==="rank"){let h=String(f.node);d.has(h)&&Number.isInteger(f.rank)&&(d.get(h).constraints.rank=f.rank)}else e.push(`Unknown constraint type "${f.type}"`);if(s.length)throw new ut(s[0],s);return{options:o,nodes:a,nodeById:d,edges:l,edgeById:u,groups:i,groupById:c,constraints:p,warnings:e}}function Ze(r,t){let n=new Map(r.map(c=>[c,[]])),o=new Map(r.map(c=>[c,0]));for(let c of t)n.get(c.v).push(c),o.set(c.w,o.get(c.w)+1);let s=new Map,e=new Set,i=[...r.filter(c=>o.get(c)===0),...r];for(let c of i){if(s.has(c))continue;let a=[[c,0]];for(s.set(c,1);a.length;){let d=a[a.length-1],[l,u]=d,p=n.get(l);if(u>=p.length){s.set(l,2),a.pop();continue}d[1]++;let f=p[u],h=s.get(f.w);h===1?e.add(f.id):h||(s.set(f.w,1),a.push([f.w,0]))}}return e}var $t=class{constructor(t){this.p=new Map(t.map(n=>[n,n]))}find(t){let n=t;for(;this.p.get(n)!==n;)n=this.p.get(n);for(;this.p.get(t)!==n;){let o=this.p.get(t);this.p.set(t,n),t=o}return n}union(t,n){let o=this.find(t),s=this.find(n);o!==s&&this.p.set(s,o)}};function ae(r,t,n={}){let o=[],s=new $t(r);for(let y of n.sameRank||[])for(let b=1;b<y.length;b++)s.union(y[0],y[b]);let e=[...new Set(r.map(y=>s.find(y)))],i=new Set,c=new Set,a=[];for(let y of t){if(y.source===y.target){i.add(y.id);continue}let b=s.find(y.source),k=s.find(y.target);if(b===k){c.add(y.id);continue}a.push({id:y.id,v:b,w:k,minLen:y.minLen??1})}let d=Ze(e,a),l=a.map(y=>d.has(y.id)?{...y,v:y.w,w:y.v}:y),u=new Map;if(n.fixedRank)for(let[y,b]of n.fixedRank){if(!s.p.has(y))continue;let k=s.find(y);u.has(k)&&u.get(k)!==b&&o.push(`Conflicting fixed ranks in sameRank set of "${y}"`),u.set(k,Math.max(u.get(k)??0,b))}let p=new Map(e.map(y=>[y,[]])),f=new Map(e.map(y=>[y,[]]));for(let y of l)p.get(y.v).push(y),f.get(y.w).push(y);let h=new Map(e.map(y=>[y,f.get(y).length])),g=e.filter(y=>h.get(y)===0),w=[];for(;g.length;){let y=g.shift();w.push(y);for(let b of p.get(y))h.set(b.w,h.get(b.w)-1),h.get(b.w)===0&&g.push(b.w)}let x=new Map;for(let y of w){let b=u.get(y)??0;for(let k of f.get(y))b=Math.max(b,x.get(k.v)+k.minLen);u.has(y)&&b!==u.get(y)&&o.push(`Fixed rank ${u.get(y)} for "${y}" cannot be satisfied; using ${b}`),x.set(y,b)}for(let y=w.length-1;y>=0;y--){let b=w[y];if(u.has(b))continue;let k=p.get(b);if(!k.length||f.get(b).length>=k.length)continue;let _=1/0;for(let I of k)_=Math.min(_,x.get(I.w)-I.minLen);_>x.get(b)&&x.set(b,_)}let M=1/0;for(let y of x.values())M=Math.min(M,y);if(!u.size&&M>0)for(let[y,b]of x)x.set(y,b-M);let m=new Map;for(let y of r)m.set(y,x.get(s.find(y))??0);return{rank:m,reversed:d,flat:c,selfLoops:i,warnings:o}}function de(r,t,n=0){let o=[],s=new Map;for(let d of r)s.set(d.id,o.length),o.push({id:d.id,real:!0,rank:d.rank,width:d.width,height:d.height??0,group:d.group??null,pinX:d.pinX??null,inputIndex:o.length,up:[],down:[]});let e=new Map,i=[],c=(d,l,u,p,f,h)=>{let g={a:d,b:l,aOff:u,bOff:p,w:f,edgeId:h};i.push(g),o[d].down.push({n:l,off:p,own:u,w:f}),o[l].up.push({n:d,off:u,own:p,w:f})};for(let d of t){let l=s.get(d.v),u=s.get(d.w),p=o[l].rank,f=o[u].rank;if(f<=p)continue;let h=o[l].group&&o[l].group===o[u].group?o[l].group:null,g=[],w=l,x=d.vOff||0;for(let M=p+1;M<f;M++){let m=o.length;o.push({id:`__d_${d.id}_${M}`,real:!1,rank:M,width:n,height:0,group:h,pinX:null,edgeId:d.id,inputIndex:m,up:[],down:[]}),c(w,m,x,0,d.weight??1,d.id),g.push(m),w=m,x=0}c(w,u,x,d.wOff||0,d.weight??1,d.id),e.set(d.id,g)}let a=0;for(let d of o)a=Math.max(a,d.rank);return{v:o,index:s,segs:i,chains:e,maxRank:a}}function Bt(r){let t=Array.from({length:r.maxRank+1},()=>[]),n=new Uint8Array(r.v.length),o=r.v.map((s,e)=>e).filter(s=>r.v[s].real).sort((s,e)=>r.v[s].rank-r.v[e].rank||r.v[s].inputIndex-r.v[e].inputIndex);for(let s of o){if(n[s])continue;let e=[s];for(;e.length;){let i=e.pop();if(n[i])continue;n[i]=1,t[r.v[i].rank].push(i);let c=r.v[i].down.map(a=>a.n);for(let a=c.length-1;a>=0;a--)n[c[a]]||e.push(c[a])}}for(let s=0;s<r.v.length;s++)n[s]||t[r.v[s].rank].push(s);return t}function Ue(r){let t=r.length;if(t<2)return 0;let n=r.slice(),o=new Array(t),s=0;for(let e=1;e<t;e*=2){for(let i=0;i<t;i+=2*e){let c=Math.min(i+e,t),a=Math.min(i+2*e,t),d=i,l=c,u=i;for(;d<c&&l<a;)n[d]<=n[l]?o[u++]=n[d++]:(s+=c-d,o[u++]=n[l++]);for(;d<c;)o[u++]=n[d++];for(;l<a;)o[u++]=n[l++]}[n,o]=[o,n]}return s}function We(r,t,n,o){let s=[];for(let e of t)for(let i of r.v[e].down)s.push([o[e]+i.own*.999,o[i.n]+i.off*.999]);return s.sort((e,i)=>e[0]-i[0]||e[1]-i[1]),Ue(s.map(e=>e[1]))}function Rt(r,t){let n=wt(r,t),o=0;for(let s=0;s<t.length-1;s++)o+=We(r,t[s],t[s+1],n);return o}function wt(r,t){let n=new Float64Array(r.v.length);for(let o of t)o.forEach((s,e)=>{n[s]=e});return n}function he(r,t={}){let n=t.maxIterations??24,o=(t.leftOf||[]).map(([d,l])=>[r.index.get(d),r.index.get(l)]).filter(([d,l])=>d!=null&&l!=null&&r.v[d].rank===r.v[l].rank),s=new Set(o.map(([d,l])=>d+":"+l)),e=[];t.initial&&e.push(t.initial.map(d=>d.slice()));let i=Bt(r);e.push(i),!t.initial&&n>4&&(e.push(i.map(d=>d.slice().reverse())),e.push(i.map(d=>d.slice().sort((l,u)=>r.v[l].inputIndex-r.v[u].inputIndex))));let c=null,a=1/0;for(let d of e){let l=qe(r,d,o,s,n);if(l.crossings<a&&(c=l.layers,a=l.crossings),a===0)break}return{layers:c,crossings:a}}function qe(r,t,n,o,s){let e=t.map(d=>le(r,d,n)),i=e.map(d=>d.slice()),c=Rt(r,e),a=0;for(let d=0;d<s&&c>0;d++){let l=d%2===0;Ve(r,e,l,n,d%4>=2),Je(r,e,o);let u=Rt(r,e);if(u<c)c=u,i=e.map(p=>p.slice()),a=0;else if(++a>=6)break}if(c>0&&s>4){e=i.map(d=>d.slice());for(let d=0;d<2;d++){Ke(r,e,o);let l=Rt(r,e);if(l<c)c=l,i=e.map(u=>u.slice());else break}}return{layers:i,crossings:c}}function Ke(r,t,n){let o=wt(r,t);for(let s of t)if(!(s.length<3||s.length>120))for(let e of s.slice()){let i=r.v[e];if(i.pinX!=null||i.group)continue;let c=s.indexOf(e),a=0,d=c,l=0;for(let u=c-1;u>=0;u--){let p=s[u];if(n.has(p+":"+e)||r.v[p].group)break;l+=rt(r,e,p,o)-rt(r,p,e,o),l<a&&(a=l,d=u)}l=0;for(let u=c+1;u<s.length;u++){let p=s[u];if(n.has(e+":"+p)||r.v[p].group)break;l+=rt(r,p,e,o)-rt(r,e,p,o),l<a&&(a=l,d=u)}d!==c&&(s.splice(c,1),s.splice(d,0,e),s.forEach((u,p)=>{o[u]=p}))}}function Ve(r,t,n,o,s){let e=wt(r,t),i=t.length,c=n?ce(1,i):ce(i-2,-1,-1);for(let a of c){let d=t[a],l=new Map;d.forEach((h,g)=>{let w=n?r.v[h].up:r.v[h].down;if(!w.length){l.set(h,g);return}if(s){let m=w.map(b=>e[b.n]+b.off-b.own).sort((b,k)=>b-k),y=m.length>>1;l.set(h,m.length%2?m[y]:(m[y-1]+m[y])/2);return}let x=0,M=0;for(let m of w)x+=(e[m.n]+m.off-m.own)*m.w,M+=m.w;l.set(h,x/M)});let u=new Map;for(let h of d){let g=r.v[h].group;if(!g)continue;let w=u.get(g)||[0,0];w[0]+=l.get(h),w[1]++,u.set(g,w)}let p=h=>{let g=r.v[h].group;return g?u.get(g)[0]/u.get(g)[1]:l.get(h)},f=new Map(d.map((h,g)=>[h,g]));d.sort((h,g)=>p(h)-p(g)||(r.v[h].group||"").localeCompare(r.v[g].group||"")||l.get(h)-l.get(g)||f.get(h)-f.get(g)),t[a]=le(r,d,o),t[a].forEach((h,g)=>{e[h]=g})}}function le(r,t,n){let o=t.slice(),s=[],e=[];if(o.forEach((i,c)=>{r.v[i].pinX!=null&&(s.push(c),e.push(i))}),e.length>1&&(e.sort((i,c)=>r.v[i].pinX-r.v[c].pinX),s.forEach((i,c)=>{o[i]=e[c]})),n.length)for(let i=0;i<n.length+1;i++){let c=!1;for(let[a,d]of n){let l=o.indexOf(a),u=o.indexOf(d);l<0||u<0||l<u||(o.splice(l,1),o.splice(o.indexOf(d),0,a),c=!0)}if(!c)break}return o}function rt(r,t,n,o){let s=0;for(let e of["up","down"]){let i=r.v[t][e],c=r.v[n][e];for(let a of i)for(let d of c)o[a.n]+a.off>o[d.n]+d.off&&(s+=a.w*d.w)}return s}function Je(r,t,n){let o=wt(r,t),s=!0,e=0;for(;s&&e++<8;){s=!1;for(let i of t)for(let c=0;c<i.length-1;c++){let a=i[c],d=i[c+1],l=r.v[a],u=r.v[d];if((l.group||null)!==(u.group||null)||l.pinX!=null&&u.pinX!=null||n.has(a+":"+d))continue;let p=rt(r,a,d,o);rt(r,d,a,o)<p&&(i[c]=d,i[c+1]=a,o[d]=c,o[a]=c+1,s=!0)}}}function ce(r,t,n=1){let o=[];if(n>0)for(let s=r;s<t;s+=n)o.push(s);else for(let s=r;s>t;s+=n)o.push(s);return o}function Qe(r,t,n){let o=r.length,s=new Float64Array(o);for(let l=1;l<o;l++)s[l]=s[l-1]+n[l];let e=[],i=[],c=[],a=[];for(let l=0;l<o;l++)for(e.push(r[l]-s[l]),i.push(t[l]),c.push(l),a.push(l);e.length>1&&e[e.length-2]>e[e.length-1];){let u=e.length-1,p=u-1,f=i[p]+i[u];e[p]=(e[p]*i[p]+e[u]*i[u])/f,i[p]=f,a[p]=a[u],e.pop(),i.pop(),c.pop(),a.pop()}let d=new Float64Array(o);for(let l=0;l<e.length;l++)for(let u=c[l];u<=a[l];u++)d[u]=e[l]+s[u];return d}function fe(r,t,n){let o=r.v.length,s=new Float64Array(o),e=new Float64Array(o),i=n.groupPadding??20,c=n.groupLabelHeight??0,a=(m,y)=>{let b=r.v[m],k=r.v[y],S;return!b.real&&!k.real?S=n.edgeSpacing:!b.real||!k.real?S=(n.nodeSpacing+n.edgeSpacing)/2:S=n.nodeSpacing,b.group!==k.group&&(b.group&&(S+=i),k.group&&(S+=i+(n.labelOnOrderAxis?c:0))),(b.width+k.width)/2+S},d=t.map(m=>m.map((y,b)=>b===0?0:a(m[b-1],y)));t.forEach((m,y)=>{let b=0;m.forEach((S,_)=>{b+=d[y][_],s[S]=b});let k=b/2;m.forEach(S=>{s[S]-=k})});let l=m=>r.v[m].real?1:4,u=(m,y,b)=>{let k=t[m];if(!k.length)return;let S=new Array(k.length),_=new Array(k.length);k.forEach(($,B)=>{let H=r.v[$];if(H.pinX!=null){S[B]=H.pinX,_[B]=1e6;return}let v=0,A=0,C=Y=>{for(let K of Y){let et=K.w*(r.v[K.n].real?1:2)*l($);v+=(s[K.n]+K.off*r.v[K.n].width-K.own*H.width)*et,A+=et}};y&&C(H.up),b&&C(H.down),A===0?(S[B]=s[$],_[B]=.05):(S[B]=v/A,_[B]=A)});let I=Qe(S,_,d[m]);k.forEach(($,B)=>{s[$]=I[B]})},p=t.length,f=n.iterations??8;for(let m=0;m<f;m++){for(let y=1;y<p;y++)u(y,!0,!1);for(let y=p-2;y>=0;y--)u(y,!1,!0)}for(let m=0;m<2;m++){for(let y=0;y<p;y++)u(y,!0,!0);for(let y=p-1;y>=0;y--)u(y,!0,!0)}let h=t.map(m=>m.reduce((y,b)=>Math.max(y,r.v[b].height||0),0)),g=new Map;for(let m of r.v){if(!m.real||!m.group)continue;let y=g.get(m.group)||[1/0,-1/0];y[0]=Math.min(y[0],m.rank),y[1]=Math.max(y[1],m.rank),g.set(m.group,y)}let w=new Float64Array(p);for(let[m,y]of g.values()){let b=n.labelOnOrderAxis||n.labelAtRankEnd?0:c,k=n.labelAtRankEnd&&!n.labelOnOrderAxis?c:0;m>0&&(w[m]=Math.max(w[m],i+b)),y<p-1&&(w[y+1]=Math.max(w[y+1],i+k))}let x=[],M=0;for(let m=0;m<p;m++)m>0?M+=h[m-1]/2+n.rankSpacing+w[m]+h[m]/2:M=h[0]/2,x.push(M);for(let m=0;m<o;m++)e[m]=x[r.v[m].rank];return{x:s,y:e,rankY:x,rankHeight:h}}var W={top:{x:0,y:-1},bottom:{x:0,y:1},left:{x:-1,y:0},right:{x:1,y:0}};function ue(r){switch(r){case"LR":return{x:1,y:0,exit:"right",entry:"left"};case"RL":return{x:-1,y:0,exit:"left",entry:"right"};case"BT":return{x:0,y:-1,exit:"top",entry:"bottom"};default:return{x:0,y:1,exit:"bottom",entry:"top"}}}function at(r){let t=new Map,n={top:[],right:[],bottom:[],left:[]};for(let o of r.ports)o.side&&n[o.side].push(o);for(let o of Object.keys(n)){let s=n[o];s.forEach((e,i)=>{let c=e.offset!=null?e.offset:(i+1)/(s.length+1);t.set(e.id,{side:o,t:c,...tn(o,c)})})}return t}function tn(r,t){switch(r){case"top":return{px:t,py:0};case"bottom":return{px:t,py:1};case"left":return{px:0,py:t};default:return{px:1,py:t}}}var tt=r=>({x:r.x+r.width/2,y:r.y+r.height/2});function pe(r,t){return{x:r.x-t,y:r.y-t,width:r.width+2*t,height:r.height+2*t}}function ge(r,t,n,o=.5){return t>r.x+o&&t<r.x+r.width-o&&n>r.y+o&&n<r.y+r.height-o}function Mt(r,t,n,o=.5){let s=n.x+o,e=n.x+n.width-o,i=n.y+o,c=n.y+n.height-o;if(e<=s||c<=i)return!1;let a=0,d=1,l=t.x-r.x,u=t.y-r.y,p=(f,h)=>{if(f===0)return h>0;let g=h/f;if(f<0){if(g>d)return!1;g>a&&(a=g)}else{if(g<a)return!1;g<d&&(d=g)}return!0};return!p(-l,r.x-s)||!p(l,e-r.x)||!p(-u,r.y-i)||!p(u,c-r.y)?!1:d-a>1e-9}function Ct(r,t){let n=tt(r),o=t.x-n.x,s=t.y-n.y;if(o===0&&s===0)return{...n,side:"bottom"};let e=o!==0?r.width/2/Math.abs(o):1/0,i=s!==0?r.height/2/Math.abs(s):1/0,c=Math.min(e,i),a=e<i?o>0?"right":"left":s>0?"bottom":"top";return{x:n.x+o*c,y:n.y+s*c,side:a}}function zt(r){let t=[];for(let n of r){let o=t[t.length-1];o&&Math.abs(o.x-n.x)<.01&&Math.abs(o.y-n.y)<.01||t.push({x:n.x,y:n.y})}for(let n=t.length-2;n>=1;n--){let o=t[n-1],s=t[n],e=t[n+1],i=(s.x-o.x)*(e.y-s.y)-(s.y-o.y)*(e.x-s.x),c=(s.x-o.x)*(e.x-s.x)+(s.y-o.y)*(e.y-s.y);Math.abs(i)<.01&&c>=0&&t.splice(n,1)}return t}function en(r){let t=0;for(let n=1;n<r.length;n++)t+=Math.hypot(r[n].x-r[n-1].x,r[n].y-r[n-1].y);return t}function Tt(r,t){if(r.length===0)return[];if(r.length===1)return Array.from({length:t},()=>({...r[0]}));let n=en(r)||1,o=[],s=0,e=0;for(let i=0;i<t;i++){let c=n*i/(t-1);for(;s<r.length-2;){let p=Math.hypot(r[s+1].x-r[s].x,r[s+1].y-r[s].y);if(e+p>=c)break;e+=p,s++}let a=r[s],d=r[s+1],l=Math.hypot(d.x-a.x,d.y-a.y)||1,u=Math.min(1,Math.max(0,(c-e)/l));o.push({x:a.x+(d.x-a.x)*u,y:a.y+(d.y-a.y)*u})}return o}var ye=(r,t,n)=>{switch(r){case"BT":return{x:t,y:-n};case"LR":return{x:n,y:t};case"RL":return{x:-n,y:t};default:return{x:t,y:n}}},Ht=(r,t,n)=>{switch(r){case"BT":return{x:t,y:-n};case"LR":return{x:n,y:t};case"RL":return{x:n,y:-t};default:return{x:t,y:n}}};function bt(r,t={}){return r.nodes.some(n=>n.group)?nn(r,t):Xt(r,t)}function me(r,t,n){let o=new Set(t.map(e=>e.id)),s=t.map(e=>({...e,group:null,constraints:n?e.constraints:{...e.constraints,pinned:!1}}));return{options:r.options,nodes:s,nodeById:new Map(s.map(e=>[e.id,e])),edges:r.edges.filter(e=>o.has(e.source)&&o.has(e.target)),groups:[],groupById:new Map,constraints:r.constraints.filter(e=>e.type==="sameRank"?e.nodes.every(i=>o.has(i)):o.has(e.a)&&o.has(e.b)),warnings:[]}}function nn(r,t){let n=xe(r,t.hints||null,t.hints||null),o=new Map,s=i=>({x:i.x+i.width/2,y:i.y+i.height/2});for(let i of r.nodes){let c=n.nodes.get(i.id);if(!i.group){o.set(i.id,s(c));continue}let a=0,d=0,l=0;for(let u of r.edges){let p=u.source===i.id?u.target:u.target===i.id?u.source:null;if(p==null||r.nodeById.get(p).group===i.group)continue;let f=s(n.nodes.get(p));a+=f.x,d+=f.y,l++}o.set(i.id,l?{x:a/l,y:d/l}:s(c))}let e=xe(r,o,t.hints||o);return e.crossingsRouted<=n.crossingsRouted?e:n}function xe(r,t,n){let o=r.options,s=o.groupPadding,e=o.groupLabelHeight,i=new Map;for(let h of r.nodes)h.group&&(i.has(h.group)||i.set(h.group,[]),i.get(h.group).push(h));let c=new Map,a=[];for(let[h,g]of i){let w=Xt(me(r,g,!1),{hints:t}),x=w.bounds,M="\0group:"+h;c.set(h,{sub:w,b:x,blockId:M}),a.push({id:M,index:-1,label:h,width:x.width+2*s,height:x.height+2*s+e,group:null,ports:[],portById:new Map,constraints:{pinned:!1,x:null,y:null,rank:null}})}let d=h=>{let g=r.nodeById.get(h);return g.group?c.get(g.group).blockId:h},l=me(r,r.nodes.filter(h=>!h.group),!0);l.nodes.push(...a);for(let h of a)l.nodeById.set(h.id,h);l.edges=[];for(let h of r.edges){let g=d(h.source),w=d(h.target);g===w&&(h.source!==h.target||g!==h.source)||l.edges.push({...h,source:g,target:w,sourcePort:g===h.source?h.sourcePort:null,targetPort:w===h.target?h.targetPort:null})}let u=null;if(n){u=new Map(n);for(let[h,g]of i){let w=0,x=0,M=0;for(let m of g){let y=n.get(m.id);y&&(w+=y.x,x+=y.y,M++)}M&&u.set(c.get(h).blockId,{x:w/M,y:x/M})}}let p=Xt(l,{hints:u}),f={nodes:new Map,edges:new Map,groups:new Map,crossings:p.crossings,warnings:p.warnings};for(let h of r.nodes)h.group||f.nodes.set(h.id,p.nodes.get(h.id));for(let[,{sub:h,b:g,blockId:w}]of c){let x=p.nodes.get(w),M=x.x+s-g.x,m=x.y+s+e-g.y;for(let[y,b]of h.nodes)f.nodes.set(y,{...b,x:b.x+M,y:b.y+m});for(let[y,b]of h.edges)f.edges.set(y,{...b,waypoints:b.waypoints.map(k=>({x:k.x+M,y:k.y+m}))});f.crossings+=h.crossings}for(let h of r.edges){if(f.edges.has(h.id))continue;let g=p.edges.get(h.id),w=d(h.source)!==h.source||d(h.target)!==h.target;f.edges.set(h.id,g?{...g,waypoints:w?[]:g.waypoints}:{waypoints:[],reversed:!1,selfLoop:h.source===h.target,flat:!1})}for(let h of r.nodes)if(h.group&&h.constraints.pinned){let g=f.nodes.get(h.id);g.x=h.constraints.x,g.y=h.constraints.y}if(gt(r,f),!r.nodes.some(h=>h.constraints.pinned)){let h=pt(f);we(f,-h.x,-h.y);for(let g of f.groups.values())g.x-=h.x,g.y-=h.y}return f.bounds=pt(f),f.crossingsRouted=sn(r,f),f}function sn(r,t){let n=[];for(let e of r.edges){if(e.source===e.target)continue;let i=t.nodes.get(e.source),c=t.nodes.get(e.target);n.push([e.source,e.target,i.x+i.width/2,i.y+i.height/2,c.x+c.width/2,c.y+c.height/2])}let o=0,s=(e,i,c,a,d,l)=>(c-e)*(l-i)-(a-i)*(d-e);for(let e=0;e<n.length;e++)for(let i=e+1;i<n.length;i++){let c=n[e],a=n[i];if(c[0]===a[0]||c[0]===a[1]||c[1]===a[0]||c[1]===a[1])continue;let d=s(a[2],a[3],a[4],a[5],c[2],c[3]),l=s(a[2],a[3],a[4],a[5],c[4],c[5]),u=s(c[2],c[3],c[4],c[5],a[2],a[3]),p=s(c[2],c[3],c[4],c[5],a[4],a[5]);d*l<0&&u*p<0&&o++}return o}function Xt(r,t={}){let n=r.options,o=n.direction,s=o==="LR"||o==="RL",e=[],i=new Map;for(let p of r.nodes){let f=at(p),h=new Map;for(let[x,M]of f)h.set(x,(s?M.py:M.px)-.5);let g=null,w=null;if(p.constraints.pinned){let x=Ht(o,p.constraints.x+p.width/2,p.constraints.y+p.height/2);g=x.x,w=x.y}i.set(p.id,{iw:s?p.height:p.width,ih:s?p.width:p.height,frac:h,pinX:g,pinY:w})}let c=rn(r),a={nodes:new Map,edges:new Map,groups:new Map,crossings:0,warnings:e},d=[];for(let p of c){let f=p.nodes,h=new Set(f),g=r.edges.filter(v=>h.has(v.source)),w=new Map;for(let v of f){let A=r.nodeById.get(v).constraints.rank;A!=null&&w.set(v,A)}let x=r.constraints.filter(v=>v.type==="sameRank").map(v=>v.nodes.filter(A=>h.has(A))).filter(v=>v.length>1),M=ae(f,g,{fixedRank:w,sameRank:x});e.push(...M.warnings);let m=f.map(v=>{let A=r.nodeById.get(v),C=i.get(v);return{id:v,rank:M.rank.get(v),width:C.iw,height:C.ih,group:A.group,pinX:C.pinX}}),y=[];for(let v of g){if(M.selfLoops.has(v.id)||M.flat.has(v.id))continue;let A=M.reversed.has(v.id),C=v.sourcePort?i.get(v.source).frac.get(v.sourcePort)??0:0,Y=v.targetPort?i.get(v.target).frac.get(v.targetPort)??0:0;y.push(A?{id:v.id,v:v.target,w:v.source,vOff:Y,wOff:C,weight:v.weight}:{id:v.id,v:v.source,w:v.target,vOff:C,wOff:Y,weight:v.weight})}let b=de(m,y,0),k;t.hints&&t.hints.size&&(k=on(b,t.hints,o));let S=r.constraints.filter(v=>v.type==="leftOf"&&h.has(v.a)&&h.has(v.b)).map(v=>[v.a,v.b]),_=he(b,{maxIterations:n.maxIterations,leftOf:S,initial:k});a.crossings+=_.crossings;let I=fe(b,_.layers,{nodeSpacing:n.nodeSpacing,edgeSpacing:n.edgeSpacing,rankSpacing:n.rankSpacing,groupPadding:n.groupPadding,groupLabelHeight:n.groupLabelHeight,labelOnOrderAxis:s,labelAtRankEnd:o==="BT"||o==="RL"?!s:!1}),$=f.filter(v=>i.get(v).pinY!=null);if($.length){let v=0;for(let A of $)v+=i.get(A).pinY-I.y[b.index.get(A)];v/=$.length;for(let A=0;A<I.y.length;A++)I.y[A]+=v;for(let A of $){let C=b.index.get(A);I.x[C]=i.get(A).pinX,I.y[C]=i.get(A).pinY}}let B=1/0,H=-1/0;for(let v=0;v<b.v.length;v++){let A=b.v[v].width/2;B=Math.min(B,I.x[v]-A),H=Math.max(H,I.x[v]+A)}d.push({comp:p,g:b,co:I,rk:M,layers:_.layers,minX:B,maxX:H,pinned:$.length>0})}if(t.hints&&t.hints.size){let p=h=>{let g=0,w=0;for(let x of h.comp.nodes){let M=t.hints.get(x);M&&(g+=Ht(o,M.x,M.y).x,w++)}return w?g/w:1/0},f=new Map(d.map(h=>[h,p(h)]));d.sort((h,g)=>f.get(h)-f.get(g))}let l=-1/0;for(let p of d)p.pinned&&(l=Math.max(l,p.maxX+n.componentSpacing));l===-1/0&&(l=0);for(let p of d){if(p.pinned)continue;let f=l-p.minX;for(let h=0;h<p.co.x.length;h++)p.co.x[h]+=f;l+=p.maxX-p.minX+n.componentSpacing}for(let p of d){let{g:f,co:h,rk:g}=p;p.layers.forEach((w,x)=>w.forEach((M,m)=>{let y=f.v[M];if(!y.real)return;let b=r.nodeById.get(y.id),k=ye(o,h.x[M],h.y[M]);a.nodes.set(y.id,{x:k.x-b.width/2,y:k.y-b.height/2,width:b.width,height:b.height,rank:x,order:m})}));for(let w of r.edges){if(!p.comp.set.has(w.source))continue;let M=(f.chains.get(w.id)||[]).map(y=>ye(o,h.x[y],h.y[y])),m=g.reversed.has(w.id);m&&(M=M.reverse()),a.edges.set(w.id,{waypoints:M,reversed:m,selfLoop:g.selfLoops.has(w.id),flat:g.flat.has(w.id)})}}if(!d.some(p=>p.pinned)){let p=1/0,f=1/0;for(let g of a.nodes.values())p=Math.min(p,g.x),f=Math.min(f,g.y);let h=r.groups.length?n.groupPadding+n.groupLabelHeight:0;Number.isFinite(p)&&we(a,-p+h,-f+h)}return gt(r,a),a.bounds=pt(a),a}function we(r,t,n){for(let o of r.nodes.values())o.x+=t,o.y+=n;for(let o of r.edges.values())for(let s of o.waypoints)s.x+=t,s.y+=n}function gt(r,t){let n=r.options;t.groups=new Map;for(let o of r.groups){let s=1/0,e=1/0,i=-1/0,c=-1/0;for(let d of r.nodes){if(d.group!==o.id)continue;let l=t.nodes.get(d.id);l&&(s=Math.min(s,l.x),e=Math.min(e,l.y),i=Math.max(i,l.x+l.width),c=Math.max(c,l.y+l.height))}if(!Number.isFinite(s))continue;let a=n.groupPadding;t.groups.set(o.id,{x:s-a,y:e-a-n.groupLabelHeight,width:i-s+2*a,height:c-e+2*a+n.groupLabelHeight})}return t.groups}function pt(r){let t=1/0,n=1/0,o=-1/0,s=-1/0,e=i=>{t=Math.min(t,i.x),n=Math.min(n,i.y),o=Math.max(o,i.x+i.width),s=Math.max(s,i.y+i.height)};for(let i of r.nodes.values())e(i);for(let i of r.groups.values())e(i);return Number.isFinite(t)?{x:t,y:n,width:o-t,height:s-n}:{x:0,y:0,width:0,height:0}}function on(r,t,n){let o=Bt(r),s=new Float64Array(r.v.length).fill(NaN);r.v.forEach((e,i)=>{if(e.real&&t.has(e.id)){let c=t.get(e.id);s[i]=Ht(n,c.x,c.y).x}});for(let[,e]of r.chains){if(!e.length)continue;let i=r.v[e[0]].up[0]?.n,c=r.v[e[e.length-1]].down[0]?.n;i==null||c==null||Number.isNaN(s[i])||Number.isNaN(s[c])||e.forEach((a,d)=>{s[a]=s[i]+(s[c]-s[i])*(d+1)/(e.length+1)})}return o.map(e=>{let i=new Map(e.map((c,a)=>[c,a]));return e.slice().sort((c,a)=>{let d=s[c],l=s[a];return Number.isNaN(d)&&Number.isNaN(l)?i.get(c)-i.get(a):Number.isNaN(d)?1:Number.isNaN(l)?-1:d-l})})}function rn(r){let t=new Map(r.nodes.map(i=>[i.id,i.id])),n=i=>{for(;t.get(i)!==i;)t.set(i,t.get(t.get(i))),i=t.get(i);return i},o=(i,c)=>{let a=n(i),d=n(c);a!==d&&t.set(d,a)};for(let i of r.edges)o(i.source,i.target);let s=new Map;for(let i of r.nodes)i.group&&(s.has(i.group)?o(s.get(i.group),i.id):s.set(i.group,i.id));for(let i of r.constraints)if(i.type==="leftOf"&&o(i.a,i.b),i.type==="sameRank")for(let c of i.nodes)o(i.nodes[0],c);let e=new Map;for(let i of r.nodes){let c=n(i.id);e.has(c)||e.set(c,[]),e.get(c).push(i.id)}return[...e.values()].map(i=>({nodes:i,set:new Set(i)}))}function Me(r,t,n,o){let s=o==="LR"||o==="RL",e=[...r.nodes.entries()],i=(c,a)=>c.x<a.x+a.width+n&&a.x<c.x+c.width+n&&c.y<a.y+a.height+n&&a.y<c.y+c.height+n;for(let[c,a]of e)if(!t.has(c))for(let d=0;d<200;d++){let l=e.find(([p,f])=>p!==c&&i(a,f));if(!l)break;let u=l[1];s?a.y=u.y+u.height+n:a.x=u.x+u.width+n}}function an(r,t,n){let o=ue(n),s=tt(r),e=tt(t),i=e.x-s.x,c=e.y-s.y,a=Math.abs(i)-(r.width+t.width)/2,d=Math.abs(c)-(r.height+t.height)/2,l=o.x!==0?i*o.x:c*o.y,u=o.x!==0?a:d;return l>0&&u>4?[o.exit,o.entry]:a>=d?i>=0?["right","left"]:["left","right"]:c>=0?["bottom","top"]:["top","bottom"]}function ke(r,t){let n=r.options.direction,o=new Map,s=new Map;for(let a of r.nodes){let d=t.get(a.id);if(!d)continue;let l=at(a),u=new Map;for(let[p,f]of l)u.set(p,{x:d.x+f.px*d.width,y:d.y+f.py*d.height,side:f.side,t:f.t});s.set(a.id,u)}let e=new Map,i=new Map;for(let a of r.edges){let d=t.get(a.source),l=t.get(a.target);if(!d||!l)continue;if(a.source===a.target){let g=s.get(a.source),w=a.sourcePort&&g.get(a.sourcePort),x=a.targetPort&&g.get(a.targetPort),M=Math.min(20,d.width/4,d.height/4);o.set(a.id,{source:w&&w.side?{x:w.x,y:w.y,side:w.side}:{x:d.x+d.width-M,y:d.y,side:"top"},target:x&&x.side?{x:x.x,y:x.y,side:x.side}:{x:d.x+d.width,y:d.y+M,side:"right"}});continue}let[u,p]=an(d,l,n),f=a.sourcePort&&s.get(a.source).get(a.sourcePort),h=a.targetPort&&s.get(a.target).get(a.targetPort);f&&f.side&&(u=f.side),h&&h.side&&(p=h.side),i.set(a.id,[u,p]),f||be(e,a.source+"|"+u,{edgeId:a.id,end:"source",other:a.target}),h||be(e,a.target+"|"+p,{edgeId:a.id,end:"target",other:a.source}),o.set(a.id,{source:f?{x:f.x,y:f.y,side:f.side}:null,target:h?{x:h.x,y:h.y,side:h.side}:null})}for(let a=0;a<2;a++)for(let[d,l]of e){let[u,p]=d.split("|"),f=t.get(u),h=p==="top"||p==="bottom",g=x=>{let M=o.get(x.edgeId),m=x.end==="source"?M.target:M.source;if(a>0&&m)return h?m.x:m.y;let y=tt(t.get(x.other));return h?y.x:y.y};l.sort((x,M)=>g(x)-g(M)||(x.edgeId<M.edgeId?-1:1));let w=[...s.get(u)?.values()||[]].filter(x=>x.side===p).map(x=>x.t);l.forEach((x,M)=>{let m=(M+1)/(l.length+1);for(let b of w)Math.abs(b-m)<.06&&(m=Math.min(.95,m+.1));let y=h?{x:f.x+m*f.width,y:p==="top"?f.y:f.y+f.height,side:p}:{x:p==="left"?f.x:f.x+f.width,y:f.y+m*f.height,side:p};o.get(x.edgeId)[x.end]=y})}let c=a=>{a&&(a.x=Math.round(a.x*100)/100,a.y=Math.round(a.y*100)/100)};for(let a of o.values())c(a.source),c(a.target);return{ends:o,ports:s,sides:i}}function be(r,t,n){r.has(t)||r.set(t,[]),r.get(t).push(n)}function Ee(r,t,n){let o=n.spacing,s={h:new Map,v:new Map},e=new Map;for(let[u,p]of r)e.set(u,p.points.map(f=>({x:f.x,y:f.y})));for(let[u,p]of r){if(p.kind!=="orthogonal")continue;let f=p.points;for(let h=0;h<f.length-1;h++){if(n.fixedEnds!==!1&&(h===0||h===f.length-2))continue;let g=f[h],w=f[h+1],x=Math.abs(g.x-w.x)<.01,M=Math.abs(g.y-w.y)<.01;if(!x&&!M)continue;let m=x?g.x:g.y,y=x?Math.min(g.y,w.y):Math.min(g.x,w.x),b=x?Math.max(g.y,w.y):Math.max(g.x,w.x);if(b-y<.5)continue;let k=x?g.y<=w.y:g.x<=w.x,S=f[h-1],_=f[h+2],I=(C,Y)=>C?Math.sign(x?C.x-Y.x:C.y-Y.y):0,$=I(S,g),B=I(_,w),H={id:u,i:h,c:m,lo:y,hi:b,vertical:x,loIsA:k,pts:e.get(u),dirLo:k?$:B,dirHi:k?B:$},v=Math.round(m*100),A=x?s.v:s.h;A.has(v)||A.set(v,[]),A.get(v).push(H)}}let i=[...s.v.values()].flat(),c=[...s.h.values()].flat(),a=[];for(let u of[!0,!1])for(let p of(u?s.v:s.h).values()){if(p.length<2)continue;p.sort((w,x)=>w.lo-x.lo);let f=[p[0]],h=p[0].hi,g=()=>{f.length>1&&d(f,u)};for(let w=1;w<p.length;w++){let x=p[w];x.lo<h-.5?(f.push(x),h=Math.max(h,x.hi)):(g(),f=[x],h=x.hi)}g()}function d(u,p){if(new Set(u.map(k=>k.id)).size<2)return;let f=[];for(let k of u){let S=f.length;for(;S>0&&hn(k,f[S-1])<0;)S--;f.splice(S,0,k)}let h=u[0].c,g=Math.min(...u.map(k=>k.lo)),w=Math.max(...u.map(k=>k.hi)),x=1/0,M=1/0;for(let k of t.values()){let S=p?k.y:k.x;if((p?k.y+k.height:k.x+k.width)<=g||S>=w)continue;let I=p?k.x:k.y,$=p?k.x+k.width:k.y+k.height;$<=h+.01?x=Math.min(x,h-$):I>=h-.01&&(M=Math.min(M,I-h))}for(let k of p?i:c){if(k.c===h||k.hi<=g||k.lo>=w)continue;let S=Math.abs(k.c-h)/2;k.c<h?x=Math.min(x,S+4):M=Math.min(M,S+4)}let m=f.length,y=Math.max(0,Math.min(x,M)-4),b=Math.min(o,m>1?2*y/(m-1):o);f.forEach((k,S)=>{let _=(S-(m-1)/2)*b;Math.abs(_)>.01&&a.push([k.id,k.i,p,_])})}let l=new Map;for(let[u,p,f,h]of a)l.has(u)||l.set(u,new Map),l.get(u).set(p,f?{x:h,y:0}:{x:0,y:h});for(let[u,p]of l){let f=r.get(u),h=f.points,g=[],w={x:0,y:0};for(let x=0;x<h.length;x++){let M=x>0&&p.get(x-1)||w,m=x<h.length-1&&p.get(x)||w,y=x>0&&x<h.length-1&&cn(h[x-1],h[x],h[x+1]);y&&(M.x!==m.x||M.y!==m.y)?(g.push({x:h[x].x+M.x,y:h[x].y+M.y}),g.push({x:h[x].x+m.x,y:h[x].y+m.y})):g.push({x:h[x].x+M.x+(y?0:m.x),y:h[x].y+M.y+(y?0:m.y)})}f.points=dn(g)}}function cn(r,t,n){return Math.abs(r.x-t.x)<.01&&Math.abs(t.x-n.x)<.01||Math.abs(r.y-t.y)<.01&&Math.abs(t.y-n.y)<.01}function dn(r){let t=[];for(let n of r){let o=t[t.length-1];o&&Math.abs(o.x-n.x)<.01&&Math.abs(o.y-n.y)<.01||t.push(n)}return t}function hn(r,t){return Le(r,t,!0)||Le(r,t,!1)||fn(r,t)}function ve(r,t){let{pts:n,i:o,loIsA:s}=r,e=[];if(t?!s:s)for(let c=o+1;c<n.length;c++)e.push(n[c]);else for(let c=o;c>=0;c--)e.push(n[c]);return e}var ln=(r,t)=>r.x*t.y-r.y*t.x,Se=(r,t)=>{let n=t.x-r.x,o=t.y-r.y,s=Math.hypot(n,o)||1;return{x:n/s,y:o/s}};function Le(r,t,n){let o=r.vertical,s=ve(r,n),e=ve(t,n),i=n?Math.max(r.lo,t.lo):Math.min(r.hi,t.hi),c=o?{x:r.c,y:i}:{x:i,y:r.c},a=o?{x:0,y:n?-1:1}:{x:n?-1:1,y:0},d=a,l=0,u=0,p=(h,g)=>{if(h===g)return 0;let w={x:a.y,y:-a.x},x=o?w.x:w.y;return(h<g?x<0:x>0)?-1:1},f=(h,g)=>g+1<h.length?Math.sign(Math.round(ln(d,Se(h[g],h[g+1]))*1e3)):null;for(let h=0;h<64;h++){let g=l<s.length?(s[l].x-c.x)*d.x+(s[l].y-c.y)*d.y:1/0,w=u<e.length?(e[u].x-c.x)*d.x+(e[u].y-c.y)*d.y:1/0;if(g===1/0&&w===1/0)return 0;if(Math.abs(g-w)<.5){let M=f(s,l),m=f(e,u);if(M===null||m===null)return M===null&&m===null?0:p(M??0,m??0);if(M!==m)return p(M,m);c=s[l],d=Se(s[l],s[l+1]),l++,u++;continue}if(g<w){let M=f(s,l);return M?p(M,0):0}let x=f(e,u);return x?p(0,x):0}return 0}var fn=(r,t)=>r.id<t.id?-1:r.id>t.id?1:r.i-t.i;function Ft(r,t,n=4){let o=[],s=new Map(t.map((a,d)=>[a,d]));for(let a of t){let d=r.get(a).points;for(let l=0;l<d.length-1;l++){let u=d[l],p=d[l+1];Math.abs(u.x-p.x)<.01&&Math.abs(u.y-p.y)>.01&&o.push([s.get(a),u.x,Math.min(u.y,p.y),Math.max(u.y,p.y)])}}let e=64,i=new Map;for(let a of o){let d=Math.floor(a[1]/e);i.has(d)||i.set(d,[]),i.get(d).push(a)}let c=new Map;for(let a of t){let d=s.get(a),l=r.get(a).points,u=[];for(let p=0;p<l.length-1;p++){let f=l[p],h=l[p+1];if(Math.abs(f.y-h.y)>.01)continue;let g=Math.min(f.x,h.x)+n*2,w=Math.max(f.x,h.x)-n*2;if(!(w<=g))for(let x=Math.floor(g/e);x<=Math.floor(w/e);x++)for(let M of i.get(x)||[])M[0]>=d||M[1]<=g||M[1]>=w||f.y<=M[2]+n||f.y>=M[3]-n||u.push({seg:p,x:M[1],y:f.y})}u.length&&c.set(a,u)}return c}var Gt=1,un=[1,-1,0,0],pn=[0,0,1,-1],jt=[1,0,3,2],_e=r=>r.x>0?0:r.x<0?1:r.y>0?2:3;function ct(r,t,n={}){let o=r.options,s=t.nodes,e=o.edgeRouting,{ends:i,ports:c}=ke(r,s),a=new Map,d=new Map,l=n.only||null,u=n.prev||null;if(e==="orthogonal")gn(r,s,i,o,l,u,a,d),Ee(a,s,{spacing:o.edgeSpacing,fixedEnds:!0});else for(let h of r.edges){let g=s.get(h.source),w=s.get(h.target);if(!g||!w)continue;if(h.source===h.target){a.set(h.id,Ie(g,o,i.get(h.id)));continue}let x=t.edges.get(h.id),M=x&&x.waypoints||[],m=i.get(h.id),y,b;e==="curved"||h.sourcePort?y=m.source:y=Ct(g,M[0]||tt(w)),e==="curved"||h.targetPort?b=m.target:b=Ct(w,M[M.length-1]||tt(g)),a.set(h.id,{points:[y,...M.map(k=>({...k})),b],kind:e,sourceSide:y.side,targetSide:b.side})}let p=r.edges.map(h=>h.id).filter(h=>a.has(h)),f=o.lineHops&&e==="orthogonal"?Ft(a,p,o.hopRadius):new Map;for(let[h,g]of a)g.hops=f.get(h)||[];return{paths:a,raw:d,ports:c,mode:e}}function Ie(r,t,n){let o=Math.max(t.nodeMargin*1.5,16),s=n.source,e=n.target,i=W[s.side],c=W[e.side],a={x:s.x+i.x*o,y:s.y+i.y*o},d={x:e.x+c.x*o,y:e.y+c.y*o},l;if(s.side===e.side)l=s.side==="left"||s.side==="right"?[a,{x:a.x,y:d.y}]:[a,{x:d.x,y:a.y}];else if((s.side==="top"||s.side==="bottom")!=(e.side==="top"||e.side==="bottom"))l=s.side==="top"||s.side==="bottom"?[a,{x:d.x,y:a.y}]:[a,{x:a.x,y:d.y}];else{let u=s.side==="top"||s.side==="bottom",p=u?r.x+r.width+o:r.y+r.height+o;l=u?[a,{x:p,y:a.y},{x:p,y:d.y}]:[a,{x:a.x,y:p},{x:d.x,y:p}]}return{points:zt([s,...l,d,e]),kind:"orthogonal",sourceSide:s.side,targetSide:e.side,selfLoop:!0}}function gn(r,t,n,o,s,e,i,c){let a=o.nodeMargin,d=[];for(let[h,g]of t)d.push({id:h,...pe(g,a)});let l=new Map;for(let h of r.edges){let g=n.get(h.id);if(!g||!g.source||!g.target)continue;let w=W[g.source.side],x=W[g.target.side];l.set(h.id,{s:{x:g.source.x+w.x*a,y:g.source.y+w.y*a},t:{x:g.target.x+x.x*a,y:g.target.y+x.y*a},sDir:_e(w),tNeed:jt[_e(x)]})}let u=mn(d,l,a);for(let h of r.edges)if(s&&!s.has(h.id)&&e&&e.raw.has(h.id)){let g=e.raw.get(h.id);c.set(h.id,g),u.markPath(g);let w=e.paths.get(h.id);w&&i.set(h.id,{...w,points:g.map(x=>({...x}))})}let p=r.edges.filter(h=>!i.has(h.id)&&t.has(h.source)&&t.has(h.target)),f=h=>{let g=l.get(h.id);return g?Math.abs(g.s.x-g.t.x)+Math.abs(g.s.y-g.t.y):0};p.sort((h,g)=>f(h)-f(g));for(let h of p){if(h.source===h.target){let m=Ie(t.get(h.source),o,n.get(h.id));i.set(h.id,m),c.set(h.id,m.points);continue}let g=n.get(h.id),w=l.get(h.id),x=u.astar(w.s,w.sDir,w.t,w.tNeed,o);x||(x=yn(w.s,w.t,g.source.side,g.target.side));let M=[g.source,...zt(x),g.target];u.markPath(M),c.set(h.id,M),i.set(h.id,{points:M.map(m=>({...m})),kind:"orthogonal",sourceSide:g.source.side,targetSide:g.target.side})}}function yn(r,t,n,o){let s=n==="top"||n==="bottom",e=o==="top"||o==="bottom";if(s&&e){let i=(r.y+t.y)/2;return[r,{x:r.x,y:i},{x:t.x,y:i},t]}if(!s&&!e){let i=(r.x+t.x)/2;return[r,{x:i,y:r.y},{x:i,y:t.y},t]}return s?[r,{x:r.x,y:t.y},t]:[r,{x:t.x,y:r.y},t]}function mn(r,t,n){let o=new Set,s=new Set,e=L=>Math.round(L*100)/100,i=1/0,c=1/0,a=-1/0,d=-1/0;for(let L of r)o.add(e(L.x)),o.add(e(L.x+L.width)),s.add(e(L.y)),s.add(e(L.y+L.height)),i=Math.min(i,L.x),c=Math.min(c,L.y),a=Math.max(a,L.x+L.width),d=Math.max(d,L.y+L.height);for(let L of t.values())for(let E of[L.s,L.t])o.add(e(E.x)),s.add(e(E.y)),i=Math.min(i,E.x),c=Math.min(c,E.y),a=Math.max(a,E.x),d=Math.max(d,E.y);o.add(e(i-2*n)),o.add(e(a+2*n)),s.add(e(c-2*n)),s.add(e(d+2*n));let l=L=>{let E=[...L].sort((P,Z)=>P-Z),N=[];for(let P=0;P<E.length;P++)N.push(E[P]),P+1<E.length&&E[P+1]-E[P]>4&&N.push(e((E[P]+E[P+1])/2));return N},u=l(o),p=l(s),f=u.length,h=p.length,g=f*h,w=new Map(u.map((L,E)=>[L,E])),x=new Map(p.map((L,E)=>[L,E])),M=120,m=new Map,y=(L,E)=>L*73856093^E*19349663;for(let L of r)for(let E=Math.floor(L.x/M);E<=Math.floor((L.x+L.width)/M);E++)for(let N=Math.floor(L.y/M);N<=Math.floor((L.y+L.height)/M);N++){let P=y(E,N);m.has(P)||m.set(P,[]),m.get(P).push(L)}let b=(L,E)=>{let N=m.get(y(Math.floor(L/M),Math.floor(E/M)));if(!N)return!1;for(let P of N)if(ge(P,L,E,.01))return!0;return!1},k=g<=4e6?new Uint8Array(g):null,S=k?null:new Map,_=L=>{if(k){let N=k[L];return N||(N=b(u[L%f],p[L/f|0])?2:1,k[L]=N),N===2}let E=S.get(L);return E===void 0&&(E=b(u[L%f],p[L/f|0]),S.set(L,E)),E},I=new Uint8Array(g),$=new Uint8Array(g),B=(L,E)=>{let N=E?I:$,P=N[L];if(!P){let Z=L%f,U=L/f|0,z=E?(u[Z]+u[Z+1])/2:u[Z],F=E?p[U]:(p[U]+p[U+1])/2;P=b(z,F)?2:1,N[L]=P}return P===2},H=new Uint16Array(g),v=new Uint16Array(g),A=new Uint16Array(g),C=new Uint16Array(g),Y=L=>{let E=w.get(e(L.x)),N=x.get(e(L.y));return E==null||N==null?-1:N*f+E};function K(L){for(let E=0;E<L.length-1;E++){let N=L[E],P=L[E+1],Z=Math.abs(N.y-P.y)<.01,U=Math.abs(N.x-P.x)<.01;if(Z){let z=x.get(e(N.y)),F=w.get(e(N.x)),j=w.get(e(P.x));if(z==null||F==null||j==null)continue;let nt=Math.min(F,j),st=Math.max(F,j);for(let X=nt;X<=st;X++)H[z*f+X]++,X<st&&A[z*f+X]++}else if(U){let z=w.get(e(N.x)),F=x.get(e(N.y)),j=x.get(e(P.y));if(z==null||F==null||j==null)continue;let nt=Math.min(F,j),st=Math.max(F,j);for(let X=nt;X<=st;X++)v[X*f+z]++,X<st&&C[X*f+z]++}}}let et=g*4,V=et<=16e6,Kt=V?new Float64Array(et):null,Vt=V?new Int32Array(et):null,Jt=V?new Uint32Array(et):null,vt=0;function ze(L,E,N,P,Z){let U=Y(L),z=Y(N);if(U<0||z<0)return null;let F=u[z%f],j=p[z/f|0],nt=Z.bendPenalty,st=Z.crossingPenalty;vt++;let X=V?null:new Map,Qt=V?null:new Map,te=V?R=>Jt[R]===vt?Kt[R]:void 0:R=>X.get(R),ee=V?(R,G,J)=>{Jt[R]=vt,Kt[R]=G,Vt[R]=J}:(R,G,J)=>{X.set(R,G),Qt.set(R,J)},Te=V?R=>Vt[R]:R=>Qt.get(R),dt=new Dt,ne=U*4+E;ee(ne,0,-1),dt.push(ne,Gt*(Math.abs(u[U%f]-F)+Math.abs(p[U/f|0]-j)));let St=1/0,Lt=-1,He=0,Xe=4e5;for(;dt.size;){let R=dt.peekKey(),G=dt.pop();if(R>=St)break;let J=te(G),it=G>>2,yt=G&3,_t=it%f,It=it/f|0;if(!(R>J+Gt*(Math.abs(u[_t]-F)+Math.abs(p[It]-j))+1e-6)){if(++He>Xe)break;if(it===z){let T=yt===P?0:yt===jt[P]?2*nt:nt;J+T<St&&(St=J+T,Lt=G);continue}for(let T=0;T<4;T++){if(T===jt[yt])continue;let ht=_t+un[T],lt=It+pn[T];if(ht<0||lt<0||ht>=f||lt>=h)continue;let q=lt*f+ht;if(q!==z&&_(q))continue;let ft=T<2;if(B(ft?T===0?it:q:T===2?it:q,ft))continue;let se=Math.abs(ft?u[ht]-u[_t]:p[lt]-p[It]),mt=se;T!==yt&&(mt+=nt);let oe=T===0||T===2?it:q,ie=ft?A[oe]:C[oe];ie&&(mt+=se*.25*ie),q!==z&&(ft?v[q]:H[q])&&(mt+=st);let At=q*4+T,Nt=J+mt,re=te(At);(re===void 0||Nt<re-1e-9)&&(ee(At,Nt,G),dt.push(At,Nt+Gt*(Math.abs(u[ht]-F)+Math.abs(p[lt]-j))))}}}if(Lt<0)return null;let Et=[];for(let R=Lt;R!==-1&&R!==void 0;R=Te(R)){let G=R>>2;Et.push({x:u[G%f],y:p[G/f|0]})}return Et.reverse(),Et}return{astar:ze,markPath:K,xs:u,ys:p,N:g}}var Dt=class{constructor(){this.k=[],this.v=[]}get size(){return this.k.length}push(t,n){let o=this.k,s=this.v,e=o.length;for(o.push(n),s.push(t);e>0;){let i=e-1>>1;if(o[i]<=n)break;o[e]=o[i],s[e]=s[i],e=i}o[e]=n,s[e]=t}peekKey(){return this.k[0]}pop(){let t=this.k,n=this.v,o=n[0],s=t.pop(),e=n.pop();if(t.length){let i=0,c=t.length;for(;;){let a=2*i+1;if(a>=c||(a+1<c&&t[a+1]<t[a]&&a++,t[a]>=s))break;t[i]=t[a],n[i]=n[a],i=a}t[i]=s,n[i]=e}return o}};function Ae(r,t,n,o){if(!o)return 0;let s=r.options,e=(a,d)=>d.x>=a.x-1&&d.x<=a.x+a.width+1&&d.y>=a.y-1&&d.y<=a.y+a.height+1&&Math.min(Math.abs(d.x-a.x),Math.abs(d.x-a.x-a.width),Math.abs(d.y-a.y),Math.abs(d.y-a.y-a.height))<=1,i=(a,d)=>{let l={left:Math.abs(d.x-a.x),right:Math.abs(d.x-a.x-a.width),top:Math.abs(d.y-a.y),bottom:Math.abs(d.y-a.y-a.height)};return Object.keys(l).reduce((u,p)=>l[p]<l[u]?p:u)},c=0;for(let a of r.edges){let d=o[a.id],l=t.paths.get(a.id),u=n.get(a.source),p=n.get(a.target);if(!Array.isArray(d)||d.length<2||!l||!u||!p)continue;let f=d.map(g=>({x:+g[0],y:+g[1]}));if(f.some(g=>!Number.isFinite(g.x)||!Number.isFinite(g.y))||!e(u,f[0])||!e(p,f[f.length-1]))continue;let h=!0;for(let g=0;h&&g<f.length-1;g++){let w=f[g],x=f[g+1];t.mode==="orthogonal"&&Math.abs(w.x-x.x)>.5&&Math.abs(w.y-x.y)>.5&&(h=!1)}h&&(l.points=f,l.sourceSide=i(u,f[0]),l.targetSide=i(p,f[f.length-1]),t.raw&&t.raw.set(a.id,f.map(g=>({...g}))),c++)}if(c){let a=r.edges.map(l=>l.id).filter(l=>t.paths.has(l)),d=s.lineHops&&t.mode==="orthogonal"?Ft(t.paths,a,s.hopRadius):new Map;for(let[l,u]of t.paths)u.hops=d.get(l)||[]}return c}var ot="http://www.w3.org/2000/svg",xn=0,Yt={arrow:'<path class="fg-marker-fill" d="M0,-5 L12,0 L0,5 Z"/>',open:'<path class="fg-marker-stroke" d="M1,-5 L12,0 L1,5"/>',many:'<path class="fg-marker-stroke" d="M0,0 L12,-6 M0,0 L12,0 M0,0 L12,6"/>',one:'<path class="fg-marker-stroke" d="M6,-6 L6,6 M0,0 L12,0"/>',onlyOne:'<path class="fg-marker-stroke" d="M3,-6 L3,6 M8,-6 L8,6 M0,0 L12,0"/>',oneOrMany:'<path class="fg-marker-stroke" d="M-3,-6 L-3,6 M0,0 L12,-6 M0,0 L12,0 M0,0 L12,6"/>',zeroOrMany:'<path class="fg-marker-stroke" d="M0,0 L12,-6 M0,0 L12,0 M0,0 L12,6"/><circle class="fg-marker-hollow" cx="-5" cy="0" r="3.5"/>',zeroOrOne:'<path class="fg-marker-stroke" d="M8,-6 L8,6 M0,0 L12,0"/><circle class="fg-marker-hollow" cx="0" cy="0" r="3.5"/>',diamond:'<path class="fg-marker-fill" d="M0,0 L6,-5 L12,0 L6,5 Z"/>',hollowDiamond:'<path class="fg-marker-hollow" d="M0,0 L6,-5 L12,0 L6,5 Z"/>',circle:'<circle class="fg-marker-fill" cx="8" cy="0" r="4"/>'};var kt=class{constructor(t,n){this.id="fg"+ ++xn,this.options=n,this.container=t,t.classList.add("fg-container");let o=this.viewport=D("div","fg-viewport");o.tabIndex=0,this.world=D("div","fg-world"),this.groupsLayer=D("div","fg-groups"),this.svg=document.createElementNS(ot,"svg"),this.svg.setAttribute("class","fg-edges"),this.svg.setAttribute("width","1"),this.svg.setAttribute("height","1"),this.defs=document.createElementNS(ot,"defs"),this.svg.appendChild(this.defs),this.edgesGroup=document.createElementNS(ot,"g"),this.svg.appendChild(this.edgesGroup),this.labelsLayer=D("div","fg-labels"),this.nodesLayer=D("div","fg-nodes"),this.world.append(this.groupsLayer,this.svg,this.labelsLayer,this.nodesLayer),o.appendChild(this.world),t.appendChild(o),this.nodeEls=new Map,this.edgeEls=new Map,this.groupEls=new Map,this.labelEls=new Map,this.markersUsed=new Set,this.transform={x:0,y:0,k:1}}destroy(){this.viewport.remove(),this.container.classList.remove("fg-container")}syncNodes(t){let n=new Set,o=new Map,s=[];for(let e of t){let i=String(e.id);n.add(i);let c=this.nodeEls.get(i),a=Mn(e);if(c||(c=D("div","fg-node"),c.dataset.id=i,this.nodesLayer.appendChild(c),this.nodeEls.set(i,c)),c._sig!==a){c._sig=a,c.className="fg-node"+(e.className?" "+e.className:"")+(e.type?" fg-node--"+e.type:""),c.innerHTML="";let u=this.options.renderNode?this.options.renderNode(e,c):void 0;if(typeof u=="string")c.innerHTML=u;else if(u instanceof Node)c.appendChild(u);else if(u===void 0)if(e.html!=null)c.innerHTML=e.html;else{let p=D("div","fg-node__label");p.textContent=e.label??i,c.appendChild(p)}c._measured=null}let d=typeof e.width=="number",l=typeof e.height=="number";c.style.width=d?e.width+"px":"",c.style.height=l?e.height+"px":"",(!d||!l)&&s.push([i,c,d?e.width:null,l?e.height:null])}for(let[e,i]of this.nodeEls)n.has(e)||(i.remove(),this.nodeEls.delete(e));for(let[,e]of s)e.classList.add("fg-node--measuring");for(let[e,i,c,a]of s)i._measured||(i._measured={width:Math.ceil(i.offsetWidth)||this.options.defaultNodeWidth,height:Math.ceil(i.offsetHeight)||this.options.defaultNodeHeight}),o.set(e,{width:c??i._measured.width,height:a??i._measured.height});for(let[,e]of s)e.classList.remove("fg-node--measuring");return o}renderPorts(t){for(let n of t.nodes){let o=this.nodeEls.get(n.id);if(!o)continue;let s=this.options.showPorts?JSON.stringify(n.ports.map(e=>[e.id,e.side,e.offset])):"";if(o._portSig!==s&&(o._portSig=s,o.querySelectorAll(":scope > .fg-port").forEach(e=>e.remove()),!!s))for(let[e,i]of at(n)){let c=D("div","fg-port fg-port--"+i.side);c.dataset.port=e,c.style.left=i.px*100+"%",c.style.top=i.py*100+"%",o.appendChild(c)}}}placeNodes(t,n){for(let o of t.nodes){let s=this.nodeEls.get(o.id),e=n.get(o.id);!s||!e||(s.style.width=e.width+"px",s.style.height=e.height+"px",s.style.transform=`translate(${e.x}px, ${e.y}px)`,s.classList.toggle("fg-node--pinned",!!o.constraints.pinned))}}renderGroups(t,n){let o=new Set;for(let s of t.groups){let e=n.get(s.id);if(!e)continue;o.add(s.id);let i=this.groupEls.get(s.id);if(!i){i=D("div","fg-group"),i.dataset.id=s.id;let c=D("div","fg-group__label");i.appendChild(c),this.groupsLayer.appendChild(i),this.groupEls.set(s.id,i)}i.className="fg-group"+(s.className?" "+s.className:""),i.firstChild.textContent=s.label,i.firstChild.style.height=this.options.groupLabelHeight+"px",i.firstChild.style.lineHeight=this.options.groupLabelHeight+"px",Object.assign(i.style,{transform:`translate(${e.x}px, ${e.y}px)`,width:e.width+"px",height:e.height+"px"})}for(let[s,e]of this.groupEls)o.has(s)||(e.remove(),this.groupEls.delete(s))}ensureMarker(t){if(!t||!Yt[t]||this.markersUsed.has(t))return;let n=document.createElementNS(ot,"marker");n.setAttribute("id",`${this.id}-m-${t}`),n.setAttribute("viewBox","-10 -8 24 16"),n.setAttribute("refX","12"),n.setAttribute("refY","0"),n.setAttribute("markerWidth","24"),n.setAttribute("markerHeight","16"),n.setAttribute("markerUnits","userSpaceOnUse"),n.setAttribute("orient","auto-start-reverse"),n.setAttribute("class","fg-marker fg-marker--"+t),n.innerHTML=Yt[t],this.defs.appendChild(n),this.markersUsed.add(t)}renderEdges(t,n,o){let s=this.options,e=new Set;for(let i of t.edges){let c=n.paths.get(i.id);if(!c)continue;e.add(i.id);let a=this.edgeEls.get(i.id);if(!a){a=document.createElementNS(ot,"g"),a.dataset.id=i.id;let f=document.createElementNS(ot,"path");f.setAttribute("class","fg-edge__hit");let h=document.createElementNS(ot,"path");h.setAttribute("class","fg-edge__line"),a.append(f,h),this.edgesGroup.appendChild(a),this.edgeEls.set(i.id,a)}a.setAttribute("class",`fg-edge fg-edge--${wn(i.type)}${i.className?" "+i.className:""}`);let d=o?o.get(i.id):null,l=d?kn(d):Ne(c,s.cornerRadius,s.lineHops?c.hops:[],s.hopRadius),[u,p]=a.childNodes;u.setAttribute("d",l),p.setAttribute("d",l);for(let[f,h]of[["marker-start",i.markerStart],["marker-end",i.markerEnd]])h&&Yt[h]?(this.ensureMarker(h),p.setAttribute(f,`url(#${this.id}-m-${h})`)):p.removeAttribute(f);this.renderLabel(i,o?null:c)}for(let[i,c]of this.edgeEls)e.has(i)||(c.remove(),this.edgeEls.delete(i),this.renderLabel({id:i,label:null},null));for(let i of t.edges){let c=this.edgeEls.get(i.id);c&&this.edgesGroup.appendChild(c)}}renderLabel(t,n){let o=this.labelEls.get(t.id);if(t.label==null||t.label===""){o&&(o.remove(),this.labelEls.delete(t.id));return}if(o||(o=D("div","fg-edge-label"),o.dataset.id=t.id,this.labelsLayer.appendChild(o),this.labelEls.set(t.id,o)),o.textContent=t.label,!n){o.style.visibility="hidden";return}o.style.visibility="";let s=bn(n.points);o.style.transform=`translate(${s.x}px, ${s.y}px) translate(-50%, -50%)`}setTransform(t){this.transform=t,this.world.style.transform=`translate(${t.x}px, ${t.y}px) scale(${t.k})`}};function D(r,t){let n=document.createElement(r);return t&&(n.className=t),n}function wn(r){return String(r).replace(/[^a-zA-Z0-9_-]/g,"_")}function Mn(r){return JSON.stringify([r.label,r.html,r.className,r.type,r.columns,r.data])}function bn(r){let t=0,n=0;for(let e=0;e<r.length-1;e++){let i=Math.hypot(r[e+1].x-r[e].x,r[e+1].y-r[e].y);i>t&&(t=i,n=e)}let o=r[n],s=r[n+1]||o;return{x:(o.x+s.x)/2,y:(o.y+s.y)/2}}var O=r=>Math.round(r*100)/100;function kn(r){return r.map((t,n)=>(n?"L":"M")+O(t.x)+","+O(t.y)).join(" ")}function Ne(r,t=6,n=[],o=4){let s=r.points;if(!s||s.length<2)return"";if(r.kind==="curved")return vn(r);let e=`M${O(s[0].x)},${O(s[0].y)}`,i=s.length,c=new Array(i).fill(0);for(let d=1;d<i-1;d++){let l=Math.hypot(s[d].x-s[d-1].x,s[d].y-s[d-1].y),u=Math.hypot(s[d+1].x-s[d].x,s[d+1].y-s[d].y);c[d]=Math.max(0,Math.min(t,l/2,u/2))}let a=new Map;for(let d of n||[])a.has(d.seg)||a.set(d.seg,[]),a.get(d.seg).push(d);for(let d=0;d<i-1;d++){let l=s[d],u=s[d+1],p=Math.hypot(u.x-l.x,u.y-l.y)||1,f=(u.x-l.x)/p,h=(u.y-l.y)/p,g=c[d+1],w=u.x-f*g,x=u.y-h*g,M=a.get(d);if(M&&Math.abs(h)<1e-6){let m=Math.sign(f),y=l.x+f*c[d];M.sort((b,k)=>(b.x-k.x)*m);for(let b of M)(b.x-y)*m<o+1||(w-b.x)*m<o+1||(e+=` L${O(b.x-m*o)},${O(l.y)} A${o},${o} 0 0 ${m>0?1:0} ${O(b.x+m*o)},${O(l.y)}`)}if(e+=` L${O(w)},${O(x)}`,d+1<i-1&&g>0){let m=s[d+2],y=Math.hypot(m.x-u.x,m.y-u.y)||1;e+=` Q${O(u.x)},${O(u.y)} ${O(u.x+(m.x-u.x)/y*g)},${O(u.y+(m.y-u.y)/y*g)}`}}return e}function vn(r){let t=r.points,n=t[0],o=t[t.length-1],s=Math.hypot(o.x-n.x,o.y-n.y),e=Math.max(30,Math.min(160,s*.4));if(t.length===2){let p=W[r.sourceSide]||{x:0,y:0},f=W[r.targetSide]||{x:0,y:0};return`M${O(n.x)},${O(n.y)} C${O(n.x+p.x*e)},${O(n.y+p.y*e)} ${O(o.x+f.x*e)},${O(o.y+f.y*e)} ${O(o.x)},${O(o.y)}`}let i=W[r.sourceSide],c=W[r.targetSide],a=i?{x:n.x-i.x*40,y:n.y-i.y*40}:n,d=c?{x:o.x-c.x*40,y:o.y-c.y*40}:o,l=[a,...t,d],u=`M${O(n.x)},${O(n.y)}`;for(let p=1;p<l.length-2;p++){let f=l[p-1],h=l[p],g=l[p+1],w=l[p+2],x={x:h.x+(g.x-f.x)/6,y:h.y+(g.y-f.y)/6},M={x:g.x-(w.x-h.x)/6,y:g.y-(w.y-h.y)/6};u+=` C${O(x.x)},${O(x.y)} ${O(M.x)},${O(M.y)} ${O(g.x)},${O(g.y)}`}return u}function Oe(r,t,n,o=28){let s=new Map;for(let[e,i]of t){let c=r&&r.get(e),a=Tt(i.points,o);if(!c){s.set(e,a);continue}let d=Tt(c.points,o);s.set(e,a.map((l,u)=>({x:d[u].x+(l.x-d[u].x)*n,y:d[u].y+(l.y-d[u].y)*n})))}return s}function Pe(r){let t=r.renderer,n=t.viewport,o=()=>r.options,s=new Map,e=null,i=0,c=null,a=(y,b)=>{let k=n.getBoundingClientRect(),S=t.transform;return{x:(y-k.left-S.x)/S.k,y:(b-k.top-S.y)/S.k}},d=y=>{let b=y.target.closest&&y.target.closest(".fg-node");if(b&&t.nodesLayer.contains(b))return{kind:"node",id:b.dataset.id,el:b};let k=y.target.closest&&y.target.closest(".fg-edge");if(k)return{kind:"edge",id:k.dataset.id,el:k};let S=y.target.closest&&y.target.closest(".fg-edge-label");if(S)return{kind:"edge",id:S.dataset.id,el:S};let _=y.target.closest&&y.target.closest(".fg-group");return _?{kind:"group",id:_.dataset.id,el:_}:{kind:"background"}};function l(y){if(r._stopZoom(),y.button!==void 0&&y.button!==0&&y.pointerType==="mouse"||y.target.closest&&y.target.closest(".fg-controls")||y.target.closest&&y.target.closest("input, textarea, select, button, a, [data-fg-nodrag]"))return;if(s.set(y.pointerId,{x:y.clientX,y:y.clientY}),n.setPointerCapture?.(y.pointerId),s.size===2&&o().zoomable){let[S,_]=[...s.values()];e={type:"pinch",dist:Math.hypot(S.x-_.x,S.y-_.y),k:t.transform.k,mid:{x:(S.x+_.x)/2,y:(S.y+_.y)/2}};return}let b=d(y),k={x:y.clientX,y:y.clientY};if(b.kind==="node"&&o().draggable){let S=r.positions.get(b.id),_=a(y.clientX,y.clientY);e={type:"drag",id:b.id,target:b,start:k,moved:!1,dx:_.x-S.x,dy:_.y-S.y}}else o().pannable?e={type:"pan",target:b,start:k,moved:!1,tx:t.transform.x,ty:t.transform.y}:e={type:"click",target:b,start:k,moved:!1}}function u(y){if(s.has(y.pointerId)&&s.set(y.pointerId,{x:y.clientX,y:y.clientY}),!e)return;if(e.type==="pinch"){if(s.size<2)return;let[k,S]=[...s.values()],_=Math.hypot(k.x-S.x,k.y-S.y);r.zoomAt(e.k*(_/e.dist),e.mid.x,e.mid.y,!0);return}let b=Math.hypot(y.clientX-e.start.x,y.clientY-e.start.y);if(!(!e.moved&&b<4)){if(e.moved||(e.moved=!0,e.type==="drag"&&(r._dragStart(e.id),n.classList.add("fg-dragging")),e.type==="pan"&&n.classList.add("fg-panning")),e.type==="pan")r.setTransform({x:e.tx+y.clientX-e.start.x,y:e.ty+y.clientY-e.start.y,k:t.transform.k});else if(e.type==="drag"){let k=a(y.clientX,y.clientY);c={id:e.id,x:k.x-e.dx,y:k.y-e.dy},i||(i=requestAnimationFrame(p))}}}function p(){if(i=0,c){let y=c;c=null,r._dragMove(y.id,y.x,y.y)}}function f(y){if(s.delete(y.pointerId),!e)return;let b=e;if(b.type==="pinch"){s.size===0&&(e=null);return}if(e=null,n.classList.remove("fg-dragging","fg-panning"),b.type==="drag"&&b.moved){i&&(cancelAnimationFrame(i),i=0,p()),r._dragEnd(b.id);return}!b.moved&&y.type==="pointerup"&&r._click(b.target,y)}function h(y){if(r._stopZoom(),!o().zoomable)return;y.preventDefault();let b=t.transform.k*Math.exp(-y.deltaY*(y.ctrlKey?.01:.0015));r.zoomAt(b,y.clientX,y.clientY,!0)}let g=null;function w(y){if(e&&e.moved)return;let b=d(y),k=b.kind==="node"||b.kind==="edge"?b.kind+":"+b.id:null;k!==g&&(g=k,r._hover(k?b:null))}function x(y){y.target.closest&&y.target.closest(".fg-controls, input, textarea, select, a")||r._contextMenu(d(y),y)}function M(){g&&(g=null,r._hover(null))}function m(y){y.key==="Escape"?r.select(null):(y.key==="+"||y.key==="=")&&o().zoomable?r.zoomBy(1.2):y.key==="-"&&o().zoomable?r.zoomBy(1/1.2):y.key==="0"&&r.fit()}return n.addEventListener("pointerdown",l),n.addEventListener("pointermove",u),n.addEventListener("pointerup",f),n.addEventListener("pointercancel",f),n.addEventListener("wheel",h,{passive:!1}),n.addEventListener("pointerover",w),n.addEventListener("contextmenu",x),n.addEventListener("pointerleave",M),n.addEventListener("keydown",m),()=>{n.removeEventListener("pointerdown",l),n.removeEventListener("pointermove",u),n.removeEventListener("pointerup",f),n.removeEventListener("pointercancel",f),n.removeEventListener("wheel",h),n.removeEventListener("pointerover",w),n.removeEventListener("contextmenu",x),n.removeEventListener("pointerleave",M),n.removeEventListener("keydown",m),i&&cancelAnimationFrame(i)}}function Zt(r,t,n="chain"){let o=new Set,s=new Set,e=[],i=[];if(t.kind==="node")o.add(t.id),e=[t.id],i=[t.id];else{let l=r.find(u=>u.id===t.id);if(!l)return{nodes:o,edges:s};s.add(l.id),o.add(l.source),o.add(l.target),e=[l.source],i=[l.target]}let c=new Map,a=new Map;for(let l of r)c.has(l.target)||c.set(l.target,[]),a.has(l.source)||a.set(l.source,[]),c.get(l.target).push(l),a.get(l.source).push(l);let d=(l,u,p)=>{let f=new Set(l),h=[...l];for(;h.length;){let g=h.shift();for(let w of u.get(g)||[]){let x=p(w);s.add(w.id),o.add(x),n==="chain"&&!f.has(x)&&(f.add(x),h.push(x))}}};return(t.kind==="node"||n==="chain")&&(d(e,c,l=>l.source),d(i,a,l=>l.target)),{nodes:o,edges:s}}var Sn="1.1.0";var $e={};Ge($e,{countCrossings:()=>En,countNodeOverlaps:()=>_n,countOverlappingSegments:()=>In});function Ln(r,t,n,o){let s=(d,l,u)=>(l.x-d.x)*(u.y-d.y)-(l.y-d.y)*(u.x-d.x),e=s(n,o,r),i=s(n,o,t),c=s(r,t,n),a=s(r,t,o);return(e>1e-9&&i<-1e-9||e<-1e-9&&i>1e-9)&&(c>1e-9&&a<-1e-9||c<-1e-9&&a>1e-9)}function En(r){let t=[...r.entries()].map(([o,s])=>[o,Array.isArray(s)?s:s.points]),n=0;for(let o=0;o<t.length;o++)for(let s=o+1;s<t.length;s++){let e=t[o][1],i=t[s][1];for(let c=0;c<e.length-1;c++)for(let a=0;a<i.length-1;a++)Ln(e[c],e[c+1],i[a],i[a+1])&&n++}return n}function _n(r,t,n){let o=0;for(let[s,e]of r){let i=Array.isArray(e)?e:e.points,c=n.get(s);for(let[a,d]of t)if(!(c&&(a===c.source||a===c.target))){for(let l=0;l<i.length-1;l++)if(Mt(i[l],i[l+1],d,1)){o++;break}}}return o}function In(r){let t=[];for(let[s,e]of r){let i=Array.isArray(e)?e:e.points;for(let c=0;c<i.length-1;c++)t.push([s,i[c],i[c+1],c===0?i[0]:c===i.length-2?i[i.length-1]:null])}let n=(s,e)=>s&&e&&Math.abs(s.x-e.x)<.01&&Math.abs(s.y-e.y)<.01,o=0;for(let s=0;s<t.length;s++)for(let e=s+1;e<t.length;e++){let[i,c,a,d]=t[s],[l,u,p,f]=t[e];if(i===l||n(d,f))continue;let h=Math.abs(c.y-a.y)<.01,g=Math.abs(u.y-p.y)<.01,w=Math.abs(c.x-a.x)<.01,x=Math.abs(u.x-p.x)<.01;if(h&&g&&Math.abs(c.y-u.y)<.5){let M=Math.max(Math.min(c.x,a.x),Math.min(u.x,p.x));Math.min(Math.max(c.x,a.x),Math.max(u.x,p.x))-M>1&&o++}else if(w&&x&&Math.abs(c.x-u.x)<.5){let M=Math.max(Math.min(c.y,a.y),Math.min(u.y,p.y));Math.min(Math.max(c.y,a.y),Math.max(u.y,p.y))-M>1&&o++}}return o}function ls(r,t){let n=Pt(r,t),o=bt(n),s=ct(n,o);return{model:n,layout:o,routing:s}}function fs(r,t,n={}){return new qt(r,t,n)}var An=["id","label","width","height","group","ports","constraints","source","target","sourcePort","targetPort","type","minLen","weight","markerStart","markerEnd","nodes","type","a","b","node","rank"],Ut=r=>{let t={};for(let n of An)r[n]!==void 0&&(t[n]=r[n]);return t},Re=()=>typeof matchMedia<"u"&&matchMedia("(prefers-reduced-motion: reduce)").matches,qt=class{constructor(t,n,o={}){if(typeof t=="string"&&(t=document.querySelector(t)),!t)throw new Error("createGraph: container element not found");this.container=t,this.data=n||{nodes:[],edges:[]},this.userOptions={...o},this.options=xt(this.data.options,this.userOptions),this.renderer=new kt(t,this.options),this.positions=new Map,this.pins=new Map,this.layoutEdges=new Map,this.routing=null,this.model=null,this.selected=null,this._listeners=new Map,this._anim=0,this._hl=[],this.options.controls&&this._controls(),this._detach=Pe(this),this.ready=this._build({mode:"relayout",animate:!1}).then(()=>(this.fit(),this))}relayout({animate:t=this.options.animate,fresh:n=!1}={}){return this._build({mode:"relayout",animate:t,fresh:n})}updateGraph(t,{mode:n="stable",animate:o=this.options.animate}={}){this.data=t;let s=new Set((t.nodes||[]).map(e=>String(e.id)));for(let e of[...this.pins.keys()])s.has(e)||this.pins.delete(e);for(let e of[...this.positions.keys()])s.has(e)||this.positions.delete(e);return this._build({mode:n,animate:o})}setOptions(t,{relayout:n=!0}={}){return Object.assign(this.userOptions,t),this.options=xt(this.data.options,this.userOptions),this.renderer.options=this.options,n?this.relayout({fresh:"direction"in t}):this._reroute()}exportState(){let t={};for(let[o,s]of this.positions)t[o]={x:Be(s.x),y:Be(s.y),pinned:!!this.pins.get(o)};let n={};if(this.routing)for(let[o,s]of this.routing.paths)n[o]=s.points.map(e=>[Ce(e.x),Ce(e.y)]);return{version:1,direction:this.options.direction,edgeRouting:this.routing?.mode,nodes:t,edges:n,transform:{...this.renderer.transform}}}importState(t,{animate:n=this.options.animate,transform:o=!0}={}){if(!t||!t.nodes)return Promise.resolve(this);let s=this._snapshot();for(let[e,i]of Object.entries(t.nodes)){let c=this.positions.get(e);c&&(c.x=i.x,c.y=i.y,i.pinned?this.pins.set(e,{x:i.x,y:i.y}):this.pins.delete(e))}this.model=this._prepareModel();for(let e of this.layoutEdges.values())e.waypoints=[];return this.routing=ct(this.model,{nodes:this.positions,edges:this.layoutEdges}),t.edges&&(!t.edgeRouting||t.edgeRouting===this.routing.mode)&&Ae(this.model,this.routing,this.positions,t.edges),this._present(s,n),o&&t.transform&&this.setTransform(t.transform),Promise.resolve(this)}pin(t,n=!0){let o=this.positions.get(t);if(!o)return;n?this.pins.set(t,{x:o.x,y:o.y}):this.pins.delete(t);let s=this.model.nodeById.get(t);s&&Object.assign(s.constraints,{pinned:n,x:n?o.x:null,y:n?o.y:null}),this.renderer.placeNodes(this.model,this.positions),this._emit("pin",{id:t,pinned:n})}unpin(t){this.pin(t,!1)}unpinAll(){for(let t of[...this.pins.keys()])this.pin(t,!1)}select(t){typeof t=="string"&&(t={kind:"node",id:t});for(let n of this.renderer.viewport.querySelectorAll(".fg-selected"))n.classList.remove("fg-selected");this.selected=t&&t.id!=null?{kind:t.kind,id:String(t.id)}:null,this.selected&&(this.selected.kind==="edge"?this.renderer.edgeEls:this.renderer.nodeEls).get(this.selected.id)?.classList.add("fg-selected"),this._applyHighlight(),this._emit("select",this.selected)}getSelection(){return this.selected}getConnections(t,{chain:n=!1}={}){if(!this.model||!this.model.nodeById.has(t))return null;let o=this.model.edges,s=i=>{let c=new Set([t]),a=[],d=[t];for(;d.length;){let l=d.shift();for(let u of o){let p=i==="next"?u.source:u.target,f=i==="next"?u.target:u.source;p!==l||c.has(f)||(c.add(f),a.push(f),n&&d.push(f))}}return a.map(l=>this.model.nodeById.get(l).data)},e=i=>i.data;return{previous:s("previous"),next:s("next"),incoming:o.filter(i=>i.target===t).map(e),outgoing:o.filter(i=>i.source===t).map(e)}}fit({padding:t=40,maxZoom:n=1}={}){let o=this.renderer.viewport,s=pt({nodes:this.positions,groups:this._groups||new Map});if(!s.width&&!s.height)return;let e=o.clientWidth||800,i=o.clientHeight||600,c=Math.min((e-2*t)/(s.width||1),(i-2*t)/(s.height||1),n);c=Wt(c,this.options.minZoom,this.options.maxZoom),this.setTransform({k:c,x:(e-s.width*c)/2-s.x*c,y:(i-s.height*c)/2-s.y*c})}fitNodes(t,{padding:n=40,maxZoom:o=this.options.maxZoom,animate:s=this.options.animate,edges:e}={}){let i=new Set([...t].map(String).filter(m=>this.positions.has(m)));if(!i.size)return!1;let c=1/0,a=1/0,d=-1/0,l=-1/0,u=(m,y)=>{c=Math.min(c,m),a=Math.min(a,y),d=Math.max(d,m),l=Math.max(l,y)};for(let m of i){let y=this.positions.get(m);u(y.x,y.y),u(y.x+y.width,y.y+y.height)}let p=e||this.model.edges.filter(m=>i.has(m.source)&&i.has(m.target)).map(m=>m.id);for(let m of p)for(let y of this.routing?.paths.get(m)?.points||[])u(y.x,y.y);let f=this.renderer.viewport,h=f.clientWidth||800,g=f.clientHeight||600,w=d-c,x=l-a,M=Math.min((h-2*n)/(w||1),(g-2*n)/(x||1),o);return M=Wt(M,this.options.minZoom,this.options.maxZoom),this._animateTransform({k:M,x:(h-w*M)/2-c*M,y:(g-x*M)/2-a*M},s),!0}fitFlow(t=this.selected,{mode:n="chain",...o}={}){if(t==null)return!1;let s;if(typeof t=="string")s={kind:"node",id:t};else if(t.kind)s={kind:t.kind,id:String(t.id)};else{let c=this.model?.edges.find(a=>a.data===t);if(!c)return!1;s={kind:"edge",id:c.id}}if(!(s.kind==="edge"?this.model?.edgeById:this.model?.nodeById)?.has(s.id))return!1;let i=Zt(this.model.edges,s,n);return this.fitNodes(i.nodes,{...o,edges:[...i.edges]})}_stopZoom(){this._zoomAnim&&typeof cancelAnimationFrame<"u"&&cancelAnimationFrame(this._zoomAnim),this._zoomAnim=0}_animateTransform(t,n){this._stopZoom();let o=this.getTransform();if(!n||Re()||typeof requestAnimationFrame>"u"){this.setTransform(t);return}let s=this.options.animationDuration,e=performance.now(),i=a=>a<.5?4*a*a*a:1-Math.pow(-2*a+2,3)/2,c=a=>{let d=Math.min(1,(a-e)/s),l=i(d),u=o.k*Math.pow(t.k/o.k,l),p=t.k-o.k?(u-o.k)/(t.k-o.k):l;this.setTransform({k:u,x:o.x+(t.x-o.x)*p,y:o.y+(t.y-o.y)*p}),d<1&&(this._zoomAnim=requestAnimationFrame(c))};this._zoomAnim=requestAnimationFrame(c)}zoomAt(t,n,o){let s=this.renderer.transform;t=Wt(t,this.options.minZoom,this.options.maxZoom);let e=this.renderer.viewport.getBoundingClientRect(),i=n-e.left,c=o-e.top;this.setTransform({k:t,x:i-(i-s.x)*t/s.k,y:c-(c-s.y)*t/s.k})}zoomBy(t){let n=this.renderer.viewport.getBoundingClientRect();this.zoomAt(this.renderer.transform.k*t,n.left+n.width/2,n.top+n.height/2)}zoomTo(t){this.zoomAt(t,...Nn(this.renderer.viewport))}setTransform(t){this.renderer.setTransform(t),this._emit("viewport",{...t})}getTransform(){return{...this.renderer.transform}}getLayout(){let t=new Map([...this.positions].map(([o,s])=>[o,{...s}])),n=new Map;if(this.routing)for(let[o,s]of this.routing.paths)n.set(o,s.points.map(e=>({...e})));return{nodes:t,edges:n,groups:new Map(this._groups||[])}}on(t,n){return this._listeners.has(t)||this._listeners.set(t,new Set),this._listeners.get(t).add(n),()=>this._listeners.get(t).delete(n)}destroy(){cancelAnimationFrame(this._anim),this._stopZoom(),this._detach(),this.renderer.destroy(),this._listeners.clear()}_emit(t,n){for(let o of this._listeners.get(t)||[])try{o(n)}catch(s){console.error(s)}}_prepareModel(t){let n=this.renderer.syncNodes(this.data.nodes||[]),o=(this.data.nodes||[]).map(e=>{let i=String(e.id),c=t&&t.get(i)||this.pins.get(i);return c?{...e,constraints:{...e.constraints||{},pinned:!0,x:c.x,y:c.y}}:e}),s=Pt({...this.data,nodes:o},this.userOptions,n);for(let e of s.warnings)console.warn("[FlexGraph] "+e);return this.options=s.options,this.renderer.options=s.options,s}_snapshot(){return{positions:new Map([...this.positions].map(([t,n])=>[t,{...n}])),routing:this.routing,groups:this._groups}}async _build({mode:t,animate:n,fresh:o}){let s=this._snapshot(),e=this._prepareModel(),i,c=this.positions.size>0;if(this.options.worker&&typeof Worker<"u")i=await this._layoutInWorker(e,t,o);else if(t==="stable"&&c){let a=new Map;for(let l of e.nodes){let u=this.positions.get(l.id);u&&a.set(l.id,{x:u.x,y:u.y})}let d=this._prepareModel(a);i=bt(d),Me(i,new Set(a.keys()),this.options.nodeSpacing/2,this.options.direction);for(let l of i.edges.values())l.waypoints=[];e=this._prepareModel()}else{let a=o||!c?null:new Map([...this.positions].map(([d,l])=>[d,{x:l.x+l.width/2,y:l.y+l.height/2}]));i=bt(e,{hints:a})}return this.model=e,this.positions=new Map([...i.nodes].map(([a,d])=>[a,{x:d.x,y:d.y,width:d.width,height:d.height}])),this.layoutEdges=i.edges,this.routing=i.routing||ct(e,{nodes:this.positions,edges:this.layoutEdges}),this.renderer.renderPorts(e),this._present(c?s:null,n),this.selected&&this.select(this.selected),this._emit("layout",{crossings:i.crossings}),this}_layoutInWorker(t,n,o){this._worker||(this._worker=new Worker(this.options.worker,{type:"module"}),this._wseq=0,this._wpending=new Map,this._worker.onmessage=a=>{let d=this._wpending.get(a.data.seq);d&&(this._wpending.delete(a.data.seq),a.data.error?d.reject(new Error(a.data.error)):d.resolve(a.data))});let s={options:this.data.options,nodes:t.nodes.map(a=>({...Ut(a.data),id:a.id,width:a.width,height:a.height,constraints:a.constraints})),edges:t.edges.map(a=>Ut(a.data)),groups:t.groups.map(a=>({id:a.id,label:a.label})),constraints:(this.data.constraints||[]).map(Ut)},e={};for(let[a,d]of Object.entries(this.userOptions))typeof d!="function"&&a!=="worker"&&(e[a]=d);let i=o||n!=="relayout"?null:new Map([...this.positions].map(([a,d])=>[a,{x:d.x+d.width/2,y:d.y+d.height/2}])),c=++this._wseq;return new Promise((a,d)=>{this._wpending.set(c,{resolve:a,reject:d}),this._worker.postMessage({seq:c,data:s,options:e,hints:i})}).then(a=>({nodes:a.nodes,edges:a.edges,crossings:a.crossings,routing:a.routing}))}_reroute(){return this.routing=ct(this.model,{nodes:this.positions,edges:this.layoutEdges}),this._render(),Promise.resolve(this)}_render(t){let n=this.renderer;if(n.placeNodes(this.model,this.positions),this._groups=gt(this.model,{nodes:this.positions}),n.renderGroups(this.model,this._groups),n.renderEdges(this.model,this.routing,t),this.selected?.kind==="edge"&&n.edgeEls.get(this.selected.id)?.classList.add("fg-selected"),this._hl.length)for(let o of this._hl)o.classList.add("fg-hl")}_present(t,n){if(cancelAnimationFrame(this._anim),!t||!n||Re()||!t.routing){this._render();return}let o=this.positions,s=this.options.animationDuration,e=performance.now(),i=a=>a<.5?4*a*a*a:1-Math.pow(-2*a+2,3)/2,c=a=>{let d=Math.min(1,(a-e)/s);if(d>=1){this._render(),this._emit("animationend");return}let l=i(d),u=new Map;for(let[p,f]of o){let h=t.positions.get(p)||f;u.set(p,{x:h.x+(f.x-h.x)*l,y:h.y+(f.y-h.y)*l,width:f.width,height:f.height})}this.renderer.placeNodes(this.model,u),this._groups=gt(this.model,{nodes:u}),this.renderer.renderGroups(this.model,this._groups),this.renderer.renderEdges(this.model,this.routing,Oe(t.routing.paths,this.routing.paths,l)),this._anim=requestAnimationFrame(c)};this._anim=requestAnimationFrame(c)}_dragStart(t){cancelAnimationFrame(this._anim);let n=new Set([t]);for(let o of this.model.edges)o.source===t&&n.add(o.target),o.target===t&&n.add(o.source);this._affected=new Set(this.model.edges.filter(o=>n.has(o.source)||n.has(o.target)).map(o=>o.id));for(let o of this._affected){let s=this.model.edgeById.get(o);if(s.source===t||s.target===t){let e=this.layoutEdges.get(o);e&&(e.waypoints=[])}}this.renderer.nodeEls.get(t)?.classList.add("fg-node--dragging"),this._emit("dragstart",{id:t})}_dragMove(t,n,o){let s=this.positions.get(t);if(!s)return;s.x=n,s.y=o;let e=this.model.nodeById.get(t);e.constraints.pinned&&(e.constraints.x=n,e.constraints.y=o);let i=this.options.nodeMargin,c={x:n-i,y:o-i,width:s.width+2*i,height:s.height+2*i};if(this.routing)for(let[a,d]of this.routing.paths){if(this._affected.has(a))continue;let l=d.points;for(let u=0;u<l.length-1;u++)if(Mt(l[u],l[u+1],c,1)){this._affected.add(a);break}}this.routing=ct(this.model,{nodes:this.positions,edges:this.layoutEdges},{only:this._affected,prev:this.routing}),this._render(),this._emit("drag",{id:t,x:n,y:o})}_dragEnd(t){let n=this.positions.get(t);this.renderer.nodeEls.get(t)?.classList.remove("fg-node--dragging"),this.options.pinOnDrag&&this.pin(t,!0),this._emit("dragend",{id:t,x:n.x,y:n.y}),this._emit("change",this.exportState())}_click(t,n){if(t.kind==="node"){this.select({kind:"node",id:t.id});let o=this.model.nodeById.get(t.id),s=this.getConnections(t.id);this.options.onNodeClick?.(o.data,n,s),this._emit("nodeclick",{node:o.data,event:n,previous:s.previous,next:s.next})}else if(t.kind==="edge"){this.select({kind:"edge",id:t.id});let o=this.model.edgeById.get(t.id);this.options.onEdgeClick?.(o.data,n),this._emit("edgeclick",{edge:o.data,event:n})}else t.kind==="group"?this._emit("groupclick",{group:this.model.groupById.get(t.id)?.data,event:n}):(this.select(null),this.options.onBackgroundClick?.(n))}_contextMenu(t,n){let o=this.options,s,e;if(t.kind==="node"&&this.model?.nodeById.has(t.id)){let i=this.model.nodeById.get(t.id).data,c=this.getConnections(t.id);s={kind:"node",id:t.id,node:i,previous:c.previous,next:c.next,event:n},e=o.onNodeContextMenu&&(()=>o.onNodeContextMenu(i,n,c))}else if(t.kind==="edge"&&this.model?.edgeById.has(t.id)){let i=this.model.edgeById.get(t.id).data;s={kind:"edge",id:t.id,edge:i,event:n},e=o.onEdgeContextMenu&&(()=>o.onEdgeContextMenu(i,n))}else if(t.kind==="group"&&this.model?.groupById.has(t.id)){let i=this.model.groupById.get(t.id).data;s={kind:"group",id:t.id,group:i,event:n},e=o.onGroupContextMenu&&(()=>o.onGroupContextMenu(i,n))}else s={kind:"background",event:n},e=o.onBackgroundContextMenu&&(()=>o.onBackgroundContextMenu(n));(e||this._listeners.get("contextmenu")?.size)&&n.preventDefault(),e?.(),this._emit("contextmenu",s)}_hover(t){this._hovered=t||null,this._applyHighlight(),this._emit("hover",t?{kind:t.kind,id:t.id}:null)}_applyHighlight(){for(let e of this._hl)e.classList.remove("fg-hl");this._hl=[];let t=this.renderer,n=this._hovered||(this.options.highlightSelection?this.selected:null);if(n&&!(n.kind==="edge"?this.model?.edgeById:this.model?.nodeById)?.has(n.id)&&(n=null),t.world.classList.toggle("fg-hovering",!!n),!n)return;let o=e=>{e&&(e.classList.add("fg-hl"),this._hl.push(e))},s=Zt(this.model.edges,n,this.options.hoverHighlight);for(let e of s.nodes)o(t.nodeEls.get(e));for(let e of s.edges)o(t.edgeEls.get(e)),o(t.labelEls.get(e))}_controls(){let t=document.createElement("div");t.className="fg-controls";let n=(o,s,e)=>{let i=document.createElement("button");i.type="button",i.textContent=o,i.title=s,i.setAttribute("aria-label",s),i.addEventListener("click",c=>{c.stopPropagation(),e()}),t.appendChild(i)};n("+","Zoom in",()=>this.zoomBy(1.25)),n("\u2212","Zoom out",()=>this.zoomBy(.8)),n("\u2922","Fit to screen",()=>this.fit()),this.renderer.viewport.appendChild(t)}},Wt=(r,t,n)=>Math.max(t,Math.min(n,r)),Be=r=>Math.round(r*10)/10,Ce=r=>Math.round(r*100)/100;function Nn(r){let t=r.getBoundingClientRect();return[t.left+t.width/2,t.top+t.height/2]}export{Ot as DEFAULT_OPTIONS,ut as GraphValidationError,qt as GraphView,Sn as VERSION,bt as computeLayout,fs as createGraph,Ne as edgePath,ls as layoutGraph,$e as metrics,Pt as normalizeGraph,ct as routeEdges};
1
+ /*! FlexGraph v1.2.0 | MIT License | (c) 2026 Alexander Pettersen (kazant) | https://github.com/kazant/flexgraph */
2
+ var Je=Object.defineProperty;var Qe=(r,t)=>{for(var e in t)Je(r,e,{get:t[e],enumerable:!0})};var tn=["top","right","bottom","left"],en=["TB","LR","BT","RL"],nn=["orthogonal","straight","curved"],Rt=Object.freeze({direction:"TB",nodeSpacing:40,rankSpacing:80,edgeSpacing:10,edgeRouting:"orthogonal",cornerRadius:6,lineHops:!0,hopRadius:4,animate:!0,animationDuration:300,nodeMargin:14,groupPadding:20,groupLabelHeight:22,componentSpacing:80,maxIterations:24,bendPenalty:24,crossingPenalty:120,bundleFanOut:5,defaultNodeWidth:160,defaultNodeHeight:60,pinOnDrag:!0,draggable:!0,zoomable:!0,pannable:!0,minZoom:.1,maxZoom:4,controls:!0,showPorts:!0,hoverHighlight:"chain",highlightSelection:!0,multiSelect:!0,history:!0,historyLimit:100,expandText:"Details",collapseText:"Hide",explore:!1,exploreUnfocused:"dim",exploreLimit:25,exploreBreadcrumb:!0,exploreStartText:"Start",exploreMoreText:void 0,edgeTypes:{default:{markerEnd:"arrow"},"has-many":{markerStart:"one",markerEnd:"many"},"has-one":{markerStart:"one",markerEnd:"onlyOne"},"belongs-to":{markerStart:"many",markerEnd:"one"},"many-to-many":{markerStart:"many",markerEnd:"many"},association:{markerEnd:"open"},composition:{markerStart:"diamond"},dependency:{markerEnd:"open"}}}),gt=class extends Error{constructor(t,e=[]){super(t),this.name="GraphValidationError",this.details=e}},tt=r=>typeof r=="number"&&Number.isFinite(r);function yt(...r){let t={...Rt,edgeTypes:{...Rt.edgeTypes}};for(let e of r)if(e)for(let[s,o]of Object.entries(e))o!==void 0&&(s==="edgeTypes"?Object.assign(t.edgeTypes,o):t[s]=o);return en.includes(t.direction)||(t.direction="TB"),nn.includes(t.edgeRouting)||(t.edgeRouting="orthogonal"),t}function $t(r,t,e){if(!r||typeof r!="object")throw new gt("Graph must be an object");let s=yt(r.options,t),o=[],n=[],i=[],d=new Map;for(let f of r.groups||[]){if(!f||f.id==null){o.push("Group without id");continue}let l=String(f.id);if(d.has(l)){o.push(`Duplicate group id "${l}"`);continue}let u={id:l,label:f.label??l,className:f.className||"",data:f};i.push(u),d.set(l,u)}let a=[],c=new Map;(r.nodes||[]).forEach((f,l)=>{if(!f||f.id==null){o.push(`Node at index ${l} has no id`);return}let u=String(f.id);if(c.has(u)){o.push(`Duplicate node id "${u}"`);return}let m=e&&e.get(u),w=tt(f.width)?f.width:m?m.width:s.defaultNodeWidth,M=tt(f.height)?f.height:m?m.height:s.defaultNodeHeight,b=f.group!=null?String(f.group):null;if(b&&!d.has(b)){let S={id:b,label:b,className:"",data:{id:b}};i.push(S),d.set(b,S)}let x=[],y=new Set;for(let S of f.ports||[]){if(!S||S.id==null){n.push(`Node "${u}": port without id ignored`);continue}let A=String(S.id);if(y.has(A)){n.push(`Node "${u}": duplicate port "${A}" ignored`);continue}let N=tn.includes(S.side)?S.side:null;N||n.push(`Node "${u}": port "${A}" has invalid side "${S.side}", using auto side`),y.add(A),x.push({id:A,side:N,offset:tt(S.offset)?Math.min(1,Math.max(0,S.offset)):null,label:S.label,data:S})}let _=f.constraints||{},k={pinned:!!_.pinned,x:tt(_.x)?_.x:tt(f.x)&&_.pinned?f.x:null,y:tt(_.y)?_.y:tt(f.y)&&_.pinned?f.y:null,rank:Number.isInteger(_.rank)&&_.rank>=0?_.rank:null};k.pinned&&(k.x==null||k.y==null)&&(n.push(`Node "${u}" is pinned but has no x/y; pin ignored until it has a position`),k.pinned=!1);let E={id:u,index:l,label:f.label??u,width:w,height:M,group:b,ports:x,portById:new Map(x.map(S=>[S.id,S])),constraints:k,className:f.className||"",type:f.type||null,data:f};a.push(E),c.set(u,E)});let h=[],p=new Map;(r.edges||[]).forEach((f,l)=>{if(!f)return;let u=f.id!=null?String(f.id):`e${l}`;if(p.has(u)){o.push(`Duplicate edge id "${u}"`);return}let m=String(f.source),w=String(f.target);if(!c.has(m)){o.push(`Edge "${u}": unknown source node "${m}"`);return}if(!c.has(w)){o.push(`Edge "${u}": unknown target node "${w}"`);return}let M=f.sourcePort!=null?String(f.sourcePort):null,b=f.targetPort!=null?String(f.targetPort):null;M&&!c.get(m).portById.has(M)&&(n.push(`Edge "${u}": node "${m}" has no port "${M}"`),M=null),b&&!c.get(w).portById.has(b)&&(n.push(`Edge "${u}": node "${w}" has no port "${b}"`),b=null);let x=s.edgeTypes[f.type]||s.edgeTypes.default||{},y={id:u,index:l,source:m,target:w,sourcePort:M,targetPort:b,type:f.type||"default",label:f.label??null,minLen:Number.isInteger(f.minLen)&&f.minLen>=0?f.minLen:1,weight:tt(f.weight)?f.weight:1,markerStart:f.markerStart!==void 0?f.markerStart:x.markerStart||null,markerEnd:f.markerEnd!==void 0?f.markerEnd:x.markerEnd||null,className:f.className||"",data:f};h.push(y),p.set(u,y)});let g=[];for(let f of r.constraints||[])if(!(!f||!f.type))if(f.type==="leftOf"||f.type==="before"){let l=String(f.a),u=String(f.b);if(!c.has(l)||!c.has(u)){n.push("leftOf constraint references unknown node");continue}g.push({type:"leftOf",a:l,b:u})}else if(f.type==="sameRank"){let l=(f.nodes||[]).map(String).filter(u=>c.has(u));l.length>=2?g.push({type:"sameRank",nodes:l}):n.push("sameRank constraint needs at least two known nodes")}else if(f.type==="rank"){let l=String(f.node);c.has(l)&&Number.isInteger(f.rank)&&(c.get(l).constraints.rank=f.rank)}else n.push(`Unknown constraint type "${f.type}"`);if(o.length)throw new gt(o[0],o);return{options:s,nodes:a,nodeById:c,edges:h,edgeById:p,groups:i,groupById:d,constraints:g,warnings:n}}function sn(r,t){let e=new Map(r.map(d=>[d,[]])),s=new Map(r.map(d=>[d,0]));for(let d of t)e.get(d.v).push(d),s.set(d.w,s.get(d.w)+1);let o=new Map,n=new Set,i=[...r.filter(d=>s.get(d)===0),...r];for(let d of i){if(o.has(d))continue;let a=[[d,0]];for(o.set(d,1);a.length;){let c=a[a.length-1],[h,p]=c,g=e.get(h);if(p>=g.length){o.set(h,2),a.pop();continue}c[1]++;let f=g[p],l=o.get(f.w);l===1?n.add(f.id):l||(o.set(f.w,1),a.push([f.w,0]))}}return n}var Tt=class{constructor(t){this.p=new Map(t.map(e=>[e,e]))}find(t){let e=t;for(;this.p.get(e)!==e;)e=this.p.get(e);for(;this.p.get(t)!==e;){let s=this.p.get(t);this.p.set(t,e),t=s}return e}union(t,e){let s=this.find(t),o=this.find(e);s!==o&&this.p.set(o,s)}};function ue(r,t,e={}){let s=[],o=new Tt(r);for(let x of e.sameRank||[])for(let y=1;y<x.length;y++)o.union(x[0],x[y]);let n=[...new Set(r.map(x=>o.find(x)))],i=new Set,d=new Set,a=[];for(let x of t){if(x.source===x.target){i.add(x.id);continue}let y=o.find(x.source),_=o.find(x.target);if(y===_){d.add(x.id);continue}a.push({id:x.id,v:y,w:_,minLen:x.minLen??1})}let c=sn(n,a),h=a.map(x=>c.has(x.id)?{...x,v:x.w,w:x.v}:x),p=new Map;if(e.fixedRank)for(let[x,y]of e.fixedRank){if(!o.p.has(x))continue;let _=o.find(x);p.has(_)&&p.get(_)!==y&&s.push(`Conflicting fixed ranks in sameRank set of "${x}"`),p.set(_,Math.max(p.get(_)??0,y))}let g=new Map(n.map(x=>[x,[]])),f=new Map(n.map(x=>[x,[]]));for(let x of h)g.get(x.v).push(x),f.get(x.w).push(x);let l=new Map(n.map(x=>[x,f.get(x).length])),u=n.filter(x=>l.get(x)===0),m=[];for(;u.length;){let x=u.shift();m.push(x);for(let y of g.get(x))l.set(y.w,l.get(y.w)-1),l.get(y.w)===0&&u.push(y.w)}let w=new Map;for(let x of m){let y=p.get(x)??0;for(let _ of f.get(x))y=Math.max(y,w.get(_.v)+_.minLen);p.has(x)&&y!==p.get(x)&&s.push(`Fixed rank ${p.get(x)} for "${x}" cannot be satisfied; using ${y}`),w.set(x,y)}for(let x=m.length-1;x>=0;x--){let y=m[x];if(p.has(y))continue;let _=g.get(y);if(!_.length||f.get(y).length>=_.length)continue;let E=1/0;for(let S of _)E=Math.min(E,w.get(S.w)-S.minLen);E>w.get(y)&&w.set(y,E)}let M=1/0;for(let x of w.values())M=Math.min(M,x);if(!p.size&&M>0)for(let[x,y]of w)w.set(x,y-M);let b=new Map;for(let x of r)b.set(x,w.get(o.find(x))??0);return{rank:b,reversed:c,flat:d,selfLoops:i,warnings:s}}function ge(r,t,e=0){let s=[],o=new Map;for(let c of r)o.set(c.id,s.length),s.push({id:c.id,real:!0,rank:c.rank,width:c.width,height:c.height??0,group:c.group??null,pinX:c.pinX??null,inputIndex:s.length,up:[],down:[]});let n=new Map,i=[],d=(c,h,p,g,f,l)=>{let u={a:c,b:h,aOff:p,bOff:g,w:f,edgeId:l};i.push(u),s[c].down.push({n:h,off:g,own:p,w:f}),s[h].up.push({n:c,off:p,own:g,w:f})};for(let c of t){let h=o.get(c.v),p=o.get(c.w),g=s[h].rank,f=s[p].rank;if(f<=g)continue;let l=s[h].group&&s[h].group===s[p].group?s[h].group:null,u=[],m=h,w=c.vOff||0;for(let M=g+1;M<f;M++){let b=s.length;s.push({id:`__d_${c.id}_${M}`,real:!1,rank:M,width:e,height:0,group:l,pinX:null,edgeId:c.id,inputIndex:b,up:[],down:[]}),d(m,b,w,0,c.weight??1,c.id),u.push(b),m=b,w=0}d(m,p,w,c.wOff||0,c.weight??1,c.id),n.set(c.id,u)}let a=0;for(let c of s)a=Math.max(a,c.rank);return{v:s,index:o,segs:i,chains:n,maxRank:a}}function Ht(r){let t=Array.from({length:r.maxRank+1},()=>[]),e=new Uint8Array(r.v.length),s=r.v.map((o,n)=>n).filter(o=>r.v[o].real).sort((o,n)=>r.v[o].rank-r.v[n].rank||r.v[o].inputIndex-r.v[n].inputIndex);for(let o of s){if(e[o])continue;let n=[o];for(;n.length;){let i=n.pop();if(e[i])continue;e[i]=1,t[r.v[i].rank].push(i);let d=r.v[i].down.map(a=>a.n);for(let a=d.length-1;a>=0;a--)e[d[a]]||n.push(d[a])}}for(let o=0;o<r.v.length;o++)e[o]||t[r.v[o].rank].push(o);return t}function on(r){let t=r.length;if(t<2)return 0;let e=r.slice(),s=new Array(t),o=0;for(let n=1;n<t;n*=2){for(let i=0;i<t;i+=2*n){let d=Math.min(i+n,t),a=Math.min(i+2*n,t),c=i,h=d,p=i;for(;c<d&&h<a;)e[c]<=e[h]?s[p++]=e[c++]:(o+=d-c,s[p++]=e[h++]);for(;c<d;)s[p++]=e[c++];for(;h<a;)s[p++]=e[h++]}[e,s]=[s,e]}return o}function rn(r,t,e,s){let o=[];for(let n of t)for(let i of r.v[n].down)o.push([s[n]+i.own*.999,s[i.n]+i.off*.999]);return o.sort((n,i)=>n[0]-i[0]||n[1]-i[1]),on(o.map(n=>n[1]))}function zt(r,t){let e=Mt(r,t),s=0;for(let o=0;o<t.length-1;o++)s+=rn(r,t[o],t[o+1],e);return s}function Mt(r,t){let e=new Float64Array(r.v.length);for(let s of t)s.forEach((o,n)=>{e[o]=n});return e}function ye(r,t={}){let e=t.maxIterations??24,s=(t.leftOf||[]).map(([c,h])=>[r.index.get(c),r.index.get(h)]).filter(([c,h])=>c!=null&&h!=null&&r.v[c].rank===r.v[h].rank),o=new Set(s.map(([c,h])=>c+":"+h)),n=[];t.initial&&n.push(t.initial.map(c=>c.slice()));let i=Ht(r);n.push(i),!t.initial&&e>4&&(n.push(i.map(c=>c.slice().reverse())),n.push(i.map(c=>c.slice().sort((h,p)=>r.v[h].inputIndex-r.v[p].inputIndex))));let d=null,a=1/0;for(let c of n){let h=an(r,c,s,o,e);if(h.crossings<a&&(d=h.layers,a=h.crossings),a===0)break}return{layers:d,crossings:a}}function an(r,t,e,s,o){let n=t.map(c=>xe(r,c,e)),i=n.map(c=>c.slice()),d=zt(r,n),a=0;for(let c=0;c<o&&d>0;c++){let h=c%2===0;dn(r,n,h,e,c%4>=2),hn(r,n,s);let p=zt(r,n);if(p<d)d=p,i=n.map(g=>g.slice()),a=0;else if(++a>=6)break}if(d>0&&o>4){n=i.map(c=>c.slice());for(let c=0;c<2;c++){cn(r,n,s);let h=zt(r,n);if(h<d)d=h,i=n.map(p=>p.slice());else break}}return{layers:i,crossings:d}}function cn(r,t,e){let s=Mt(r,t);for(let o of t)if(!(o.length<3||o.length>120))for(let n of o.slice()){let i=r.v[n];if(i.pinX!=null||i.group)continue;let d=o.indexOf(n),a=0,c=d,h=0;for(let p=d-1;p>=0;p--){let g=o[p];if(e.has(g+":"+n)||r.v[g].group)break;h+=ct(r,n,g,s)-ct(r,g,n,s),h<a&&(a=h,c=p)}h=0;for(let p=d+1;p<o.length;p++){let g=o[p];if(e.has(n+":"+g)||r.v[g].group)break;h+=ct(r,g,n,s)-ct(r,n,g,s),h<a&&(a=h,c=p)}c!==d&&(o.splice(d,1),o.splice(c,0,n),o.forEach((p,g)=>{s[p]=g}))}}function dn(r,t,e,s,o){let n=Mt(r,t),i=t.length,d=e?pe(1,i):pe(i-2,-1,-1);for(let a of d){let c=t[a],h=new Map;c.forEach((l,u)=>{let m=e?r.v[l].up:r.v[l].down;if(!m.length){h.set(l,u);return}if(o){let b=m.map(y=>n[y.n]+y.off-y.own).sort((y,_)=>y-_),x=b.length>>1;h.set(l,b.length%2?b[x]:(b[x-1]+b[x])/2);return}let w=0,M=0;for(let b of m)w+=(n[b.n]+b.off-b.own)*b.w,M+=b.w;h.set(l,w/M)});let p=new Map;for(let l of c){let u=r.v[l].group;if(!u)continue;let m=p.get(u)||[0,0];m[0]+=h.get(l),m[1]++,p.set(u,m)}let g=l=>{let u=r.v[l].group;return u?p.get(u)[0]/p.get(u)[1]:h.get(l)},f=new Map(c.map((l,u)=>[l,u]));c.sort((l,u)=>g(l)-g(u)||(r.v[l].group||"").localeCompare(r.v[u].group||"")||h.get(l)-h.get(u)||f.get(l)-f.get(u)),t[a]=xe(r,c,s),t[a].forEach((l,u)=>{n[l]=u})}}function xe(r,t,e){let s=t.slice(),o=[],n=[];if(s.forEach((i,d)=>{r.v[i].pinX!=null&&(o.push(d),n.push(i))}),n.length>1&&(n.sort((i,d)=>r.v[i].pinX-r.v[d].pinX),o.forEach((i,d)=>{s[i]=n[d]})),e.length)for(let i=0;i<e.length+1;i++){let d=!1;for(let[a,c]of e){let h=s.indexOf(a),p=s.indexOf(c);h<0||p<0||h<p||(s.splice(h,1),s.splice(s.indexOf(c),0,a),d=!0)}if(!d)break}return s}function ct(r,t,e,s){let o=0;for(let n of["up","down"]){let i=r.v[t][n],d=r.v[e][n];for(let a of i)for(let c of d)s[a.n]+a.off>s[c.n]+c.off&&(o+=a.w*c.w)}return o}function hn(r,t,e){let s=Mt(r,t),o=!0,n=0;for(;o&&n++<8;){o=!1;for(let i of t)for(let d=0;d<i.length-1;d++){let a=i[d],c=i[d+1],h=r.v[a],p=r.v[c];if((h.group||null)!==(p.group||null)||h.pinX!=null&&p.pinX!=null||e.has(a+":"+c))continue;let g=ct(r,a,c,s);ct(r,c,a,s)<g&&(i[d]=c,i[d+1]=a,s[c]=d,s[a]=d+1,o=!0)}}}function pe(r,t,e=1){let s=[];if(e>0)for(let o=r;o<t;o+=e)s.push(o);else for(let o=r;o>t;o+=e)s.push(o);return s}function ln(r,t,e){let s=r.length,o=new Float64Array(s);for(let h=1;h<s;h++)o[h]=o[h-1]+e[h];let n=[],i=[],d=[],a=[];for(let h=0;h<s;h++)for(n.push(r[h]-o[h]),i.push(t[h]),d.push(h),a.push(h);n.length>1&&n[n.length-2]>n[n.length-1];){let p=n.length-1,g=p-1,f=i[g]+i[p];n[g]=(n[g]*i[g]+n[p]*i[p])/f,i[g]=f,a[g]=a[p],n.pop(),i.pop(),d.pop(),a.pop()}let c=new Float64Array(s);for(let h=0;h<n.length;h++)for(let p=d[h];p<=a[h];p++)c[p]=n[h]+o[p];return c}function me(r,t,e){let s=r.v.length,o=new Float64Array(s),n=new Float64Array(s),i=e.groupPadding??20,d=e.groupLabelHeight??0,a=(b,x)=>{let y=r.v[b],_=r.v[x],k;return!y.real&&!_.real?k=e.edgeSpacing:!y.real||!_.real?k=(e.nodeSpacing+e.edgeSpacing)/2:k=e.nodeSpacing,y.group!==_.group&&(y.group&&(k+=i),_.group&&(k+=i+(e.labelOnOrderAxis?d:0))),(y.width+_.width)/2+k},c=t.map(b=>b.map((x,y)=>y===0?0:a(b[y-1],x)));t.forEach((b,x)=>{let y=0;b.forEach((k,E)=>{y+=c[x][E],o[k]=y});let _=y/2;b.forEach(k=>{o[k]-=_})});let h=b=>r.v[b].real?1:4,p=(b,x,y)=>{let _=t[b];if(!_.length)return;let k=new Array(_.length),E=new Array(_.length);_.forEach((A,N)=>{let O=r.v[A];if(O.pinX!=null){k[N]=O.pinX,E[N]=1e6;return}let v=0,P=0,T=K=>{for(let q of K){let nt=q.w*(r.v[q.n].real?1:2)*h(A);v+=(o[q.n]+q.off*r.v[q.n].width-q.own*O.width)*nt,P+=nt}};x&&T(O.up),y&&T(O.down),P===0?(k[N]=o[A],E[N]=.05):(k[N]=v/P,E[N]=P)});let S=ln(k,E,c[b]);_.forEach((A,N)=>{o[A]=S[N]})},g=t.length,f=e.iterations??8;for(let b=0;b<f;b++){for(let x=1;x<g;x++)p(x,!0,!1);for(let x=g-2;x>=0;x--)p(x,!1,!0)}for(let b=0;b<2;b++){for(let x=0;x<g;x++)p(x,!0,!0);for(let x=g-1;x>=0;x--)p(x,!0,!0)}let l=t.map(b=>b.reduce((x,y)=>Math.max(x,r.v[y].height||0),0)),u=new Map;for(let b of r.v){if(!b.real||!b.group)continue;let x=u.get(b.group)||[1/0,-1/0];x[0]=Math.min(x[0],b.rank),x[1]=Math.max(x[1],b.rank),u.set(b.group,x)}let m=new Float64Array(g);for(let[b,x]of u.values()){let y=e.labelOnOrderAxis||e.labelAtRankEnd?0:d,_=e.labelAtRankEnd&&!e.labelOnOrderAxis?d:0;b>0&&(m[b]=Math.max(m[b],i+y)),x<g-1&&(m[x+1]=Math.max(m[x+1],i+_))}let w=[],M=0;for(let b=0;b<g;b++)b>0?M+=l[b-1]/2+e.rankSpacing+m[b]+l[b]/2:M=l[0]/2,w.push(M);for(let b=0;b<s;b++)n[b]=w[r.v[b].rank];return{x:o,y:n,rankY:w,rankHeight:l}}var U={top:{x:0,y:-1},bottom:{x:0,y:1},left:{x:-1,y:0},right:{x:1,y:0}};function we(r){switch(r){case"LR":return{x:1,y:0,exit:"right",entry:"left"};case"RL":return{x:-1,y:0,exit:"left",entry:"right"};case"BT":return{x:0,y:-1,exit:"top",entry:"bottom"};default:return{x:0,y:1,exit:"bottom",entry:"top"}}}function dt(r){let t=new Map,e={top:[],right:[],bottom:[],left:[]};for(let s of r.ports)s.side&&e[s.side].push(s);for(let s of Object.keys(e)){let o=e[s];o.forEach((n,i)=>{let d=n.offset!=null?n.offset:(i+1)/(o.length+1);t.set(n.id,{side:s,t:d,...fn(s,d)})})}return t}function fn(r,t){switch(r){case"top":return{px:t,py:0};case"bottom":return{px:t,py:1};case"left":return{px:0,py:t};default:return{px:1,py:t}}}var et=r=>({x:r.x+r.width/2,y:r.y+r.height/2});function be(r,t){return{x:r.x-t,y:r.y-t,width:r.width+2*t,height:r.height+2*t}}function Me(r,t,e,s=.5){return t>r.x+s&&t<r.x+r.width-s&&e>r.y+s&&e<r.y+r.height-s}function ht(r,t,e,s=.5){let o=e.x+s,n=e.x+e.width-s,i=e.y+s,d=e.y+e.height-s;if(n<=o||d<=i)return!1;let a=0,c=1,h=t.x-r.x,p=t.y-r.y,g=(f,l)=>{if(f===0)return l>0;let u=l/f;if(f<0){if(u>c)return!1;u>a&&(a=u)}else{if(u<a)return!1;u<c&&(c=u)}return!0};return!g(-h,r.x-o)||!g(h,n-r.x)||!g(-p,r.y-i)||!g(p,d-r.y)?!1:c-a>1e-9}function Ft(r,t){let e=et(r),s=t.x-e.x,o=t.y-e.y;if(s===0&&o===0)return{...e,side:"bottom"};let n=s!==0?r.width/2/Math.abs(s):1/0,i=o!==0?r.height/2/Math.abs(o):1/0,d=Math.min(n,i),a=n<i?s>0?"right":"left":o>0?"bottom":"top";return{x:e.x+s*d,y:e.y+o*d,side:a}}function _t(r){let t=[];for(let e of r){let s=t[t.length-1];s&&Math.abs(s.x-e.x)<.01&&Math.abs(s.y-e.y)<.01||t.push({x:e.x,y:e.y})}for(let e=t.length-2;e>=1;e--){let s=t[e-1],o=t[e],n=t[e+1],i=(o.x-s.x)*(n.y-o.y)-(o.y-s.y)*(n.x-o.x),d=(o.x-s.x)*(n.x-o.x)+(o.y-s.y)*(n.y-o.y);Math.abs(i)<.01&&d>=0&&t.splice(e,1)}return t}function un(r){let t=0;for(let e=1;e<r.length;e++)t+=Math.hypot(r[e].x-r[e-1].x,r[e].y-r[e-1].y);return t}function Dt(r,t){if(r.length===0)return[];if(r.length===1)return Array.from({length:t},()=>({...r[0]}));let e=un(r)||1,s=[],o=0,n=0;for(let i=0;i<t;i++){let d=e*i/(t-1);for(;o<r.length-2;){let g=Math.hypot(r[o+1].x-r[o].x,r[o+1].y-r[o].y);if(n+g>=d)break;n+=g,o++}let a=r[o],c=r[o+1],h=Math.hypot(c.x-a.x,c.y-a.y)||1,p=Math.min(1,Math.max(0,(d-n)/h));s.push({x:a.x+(c.x-a.x)*p,y:a.y+(c.y-a.y)*p})}return s}var _e=(r,t,e)=>{switch(r){case"BT":return{x:t,y:-e};case"LR":return{x:e,y:t};case"RL":return{x:-e,y:t};default:return{x:t,y:e}}},Xt=(r,t,e)=>{switch(r){case"BT":return{x:t,y:-e};case"LR":return{x:e,y:t};case"RL":return{x:e,y:-t};default:return{x:t,y:e}}};function kt(r,t={}){return r.nodes.some(e=>e.group)?pn(r,t):Gt(r,t)}function ke(r,t,e){let s=new Set(t.map(n=>n.id)),o=t.map(n=>({...n,group:null,constraints:e?n.constraints:{...n.constraints,pinned:!1}}));return{options:r.options,nodes:o,nodeById:new Map(o.map(n=>[n.id,n])),edges:r.edges.filter(n=>s.has(n.source)&&s.has(n.target)),groups:[],groupById:new Map,constraints:r.constraints.filter(n=>n.type==="sameRank"?n.nodes.every(i=>s.has(i)):s.has(n.a)&&s.has(n.b)),warnings:[]}}function pn(r,t){let e=ve(r,t.hints||null,t.hints||null),s=new Map,o=i=>({x:i.x+i.width/2,y:i.y+i.height/2});for(let i of r.nodes){let d=e.nodes.get(i.id);if(!i.group){s.set(i.id,o(d));continue}let a=0,c=0,h=0;for(let p of r.edges){let g=p.source===i.id?p.target:p.target===i.id?p.source:null;if(g==null||r.nodeById.get(g).group===i.group)continue;let f=o(e.nodes.get(g));a+=f.x,c+=f.y,h++}s.set(i.id,h?{x:a/h,y:c/h}:o(d))}let n=ve(r,s,t.hints||s);return n.crossingsRouted<=e.crossingsRouted?n:e}function ve(r,t,e){let s=r.options,o=s.groupPadding,n=s.groupLabelHeight,i=new Map;for(let l of r.nodes)l.group&&(i.has(l.group)||i.set(l.group,[]),i.get(l.group).push(l));let d=new Map,a=[];for(let[l,u]of i){let m=Gt(ke(r,u,!1),{hints:t}),w=m.bounds,M="\0group:"+l;d.set(l,{sub:m,b:w,blockId:M}),a.push({id:M,index:-1,label:l,width:w.width+2*o,height:w.height+2*o+n,group:null,ports:[],portById:new Map,constraints:{pinned:!1,x:null,y:null,rank:null}})}let c=l=>{let u=r.nodeById.get(l);return u.group?d.get(u.group).blockId:l},h=ke(r,r.nodes.filter(l=>!l.group),!0);h.nodes.push(...a);for(let l of a)h.nodeById.set(l.id,l);h.edges=[];for(let l of r.edges){let u=c(l.source),m=c(l.target);u===m&&(l.source!==l.target||u!==l.source)||h.edges.push({...l,source:u,target:m,sourcePort:u===l.source?l.sourcePort:null,targetPort:m===l.target?l.targetPort:null})}let p=null;if(e){p=new Map(e);for(let[l,u]of i){let m=0,w=0,M=0;for(let b of u){let x=e.get(b.id);x&&(m+=x.x,w+=x.y,M++)}M&&p.set(d.get(l).blockId,{x:m/M,y:w/M})}}let g=Gt(h,{hints:p}),f={nodes:new Map,edges:new Map,groups:new Map,crossings:g.crossings,warnings:g.warnings};for(let l of r.nodes)l.group||f.nodes.set(l.id,g.nodes.get(l.id));for(let[,{sub:l,b:u,blockId:m}]of d){let w=g.nodes.get(m),M=w.x+o-u.x,b=w.y+o+n-u.y;for(let[x,y]of l.nodes)f.nodes.set(x,{...y,x:y.x+M,y:y.y+b});for(let[x,y]of l.edges)f.edges.set(x,{...y,waypoints:y.waypoints.map(_=>({x:_.x+M,y:_.y+b}))});f.crossings+=l.crossings}for(let l of r.edges){if(f.edges.has(l.id))continue;let u=g.edges.get(l.id),m=c(l.source)!==l.source||c(l.target)!==l.target;f.edges.set(l.id,u?{...u,waypoints:m?[]:u.waypoints}:{waypoints:[],reversed:!1,selfLoop:l.source===l.target,flat:!1})}for(let l of r.nodes)if(l.group&&l.constraints.pinned){let u=f.nodes.get(l.id);u.x=l.constraints.x,u.y=l.constraints.y}if(mt(r,f),!r.nodes.some(l=>l.constraints.pinned)){let l=xt(f);Se(f,-l.x,-l.y);for(let u of f.groups.values())u.x-=l.x,u.y-=l.y}return f.bounds=xt(f),f.crossingsRouted=gn(r,f),f}function gn(r,t){let e=[];for(let n of r.edges){if(n.source===n.target)continue;let i=t.nodes.get(n.source),d=t.nodes.get(n.target);e.push([n.source,n.target,i.x+i.width/2,i.y+i.height/2,d.x+d.width/2,d.y+d.height/2])}let s=0,o=(n,i,d,a,c,h)=>(d-n)*(h-i)-(a-i)*(c-n);for(let n=0;n<e.length;n++)for(let i=n+1;i<e.length;i++){let d=e[n],a=e[i];if(d[0]===a[0]||d[0]===a[1]||d[1]===a[0]||d[1]===a[1])continue;let c=o(a[2],a[3],a[4],a[5],d[2],d[3]),h=o(a[2],a[3],a[4],a[5],d[4],d[5]),p=o(d[2],d[3],d[4],d[5],a[2],a[3]),g=o(d[2],d[3],d[4],d[5],a[4],a[5]);c*h<0&&p*g<0&&s++}return s}function Gt(r,t={}){let e=r.options,s=e.direction,o=s==="LR"||s==="RL",n=[],i=new Map;for(let g of r.nodes){let f=dt(g),l=new Map;for(let[w,M]of f)l.set(w,(o?M.py:M.px)-.5);let u=null,m=null;if(g.constraints.pinned){let w=Xt(s,g.constraints.x+g.width/2,g.constraints.y+g.height/2);u=w.x,m=w.y}i.set(g.id,{iw:o?g.height:g.width,ih:o?g.width:g.height,frac:l,pinX:u,pinY:m})}let d=xn(r),a={nodes:new Map,edges:new Map,groups:new Map,crossings:0,warnings:n},c=[];for(let g of d){let f=g.nodes,l=new Set(f),u=r.edges.filter(v=>l.has(v.source)),m=new Map;for(let v of f){let P=r.nodeById.get(v).constraints.rank;P!=null&&m.set(v,P)}let w=r.constraints.filter(v=>v.type==="sameRank").map(v=>v.nodes.filter(P=>l.has(P))).filter(v=>v.length>1),M=ue(f,u,{fixedRank:m,sameRank:w});n.push(...M.warnings);let b=f.map(v=>{let P=r.nodeById.get(v),T=i.get(v);return{id:v,rank:M.rank.get(v),width:T.iw,height:T.ih,group:P.group,pinX:T.pinX}}),x=[];for(let v of u){if(M.selfLoops.has(v.id)||M.flat.has(v.id))continue;let P=M.reversed.has(v.id),T=v.sourcePort?i.get(v.source).frac.get(v.sourcePort)??0:0,K=v.targetPort?i.get(v.target).frac.get(v.targetPort)??0:0;x.push(P?{id:v.id,v:v.target,w:v.source,vOff:K,wOff:T,weight:v.weight}:{id:v.id,v:v.source,w:v.target,vOff:T,wOff:K,weight:v.weight})}let y=ge(b,x,0),_;t.hints&&t.hints.size&&(_=yn(y,t.hints,s));let k=r.constraints.filter(v=>v.type==="leftOf"&&l.has(v.a)&&l.has(v.b)).map(v=>[v.a,v.b]),E=ye(y,{maxIterations:e.maxIterations,leftOf:k,initial:_});a.crossings+=E.crossings;let S=me(y,E.layers,{nodeSpacing:e.nodeSpacing,edgeSpacing:e.edgeSpacing,rankSpacing:e.rankSpacing,groupPadding:e.groupPadding,groupLabelHeight:e.groupLabelHeight,labelOnOrderAxis:o,labelAtRankEnd:s==="BT"||s==="RL"?!o:!1}),A=f.filter(v=>i.get(v).pinY!=null);if(A.length){let v=0;for(let P of A)v+=i.get(P).pinY-S.y[y.index.get(P)];v/=A.length;for(let P=0;P<S.y.length;P++)S.y[P]+=v;for(let P of A){let T=y.index.get(P);S.x[T]=i.get(P).pinX,S.y[T]=i.get(P).pinY}}let N=1/0,O=-1/0;for(let v=0;v<y.v.length;v++){let P=y.v[v].width/2;N=Math.min(N,S.x[v]-P),O=Math.max(O,S.x[v]+P)}c.push({comp:g,g:y,co:S,rk:M,layers:E.layers,minX:N,maxX:O,pinned:A.length>0})}if(t.hints&&t.hints.size){let g=l=>{let u=0,m=0;for(let w of l.comp.nodes){let M=t.hints.get(w);M&&(u+=Xt(s,M.x,M.y).x,m++)}return m?u/m:1/0},f=new Map(c.map(l=>[l,g(l)]));c.sort((l,u)=>f.get(l)-f.get(u))}let h=-1/0;for(let g of c)g.pinned&&(h=Math.max(h,g.maxX+e.componentSpacing));h===-1/0&&(h=0);for(let g of c){if(g.pinned)continue;let f=h-g.minX;for(let l=0;l<g.co.x.length;l++)g.co.x[l]+=f;h+=g.maxX-g.minX+e.componentSpacing}for(let g of c){let{g:f,co:l,rk:u}=g;g.layers.forEach((m,w)=>m.forEach((M,b)=>{let x=f.v[M];if(!x.real)return;let y=r.nodeById.get(x.id),_=_e(s,l.x[M],l.y[M]);a.nodes.set(x.id,{x:_.x-y.width/2,y:_.y-y.height/2,width:y.width,height:y.height,rank:w,order:b})}));for(let m of r.edges){if(!g.comp.set.has(m.source))continue;let M=(f.chains.get(m.id)||[]).map(x=>_e(s,l.x[x],l.y[x])),b=u.reversed.has(m.id);b&&(M=M.reverse()),a.edges.set(m.id,{waypoints:M,reversed:b,selfLoop:u.selfLoops.has(m.id),flat:u.flat.has(m.id)})}}if(!c.some(g=>g.pinned)){let g=1/0,f=1/0;for(let u of a.nodes.values())g=Math.min(g,u.x),f=Math.min(f,u.y);let l=r.groups.length?e.groupPadding+e.groupLabelHeight:0;Number.isFinite(g)&&Se(a,-g+l,-f+l)}return mt(r,a),a.bounds=xt(a),a}function Se(r,t,e){for(let s of r.nodes.values())s.x+=t,s.y+=e;for(let s of r.edges.values())for(let o of s.waypoints)o.x+=t,o.y+=e}function mt(r,t){let e=r.options;t.groups=new Map;for(let s of r.groups){let o=1/0,n=1/0,i=-1/0,d=-1/0;for(let c of r.nodes){if(c.group!==s.id)continue;let h=t.nodes.get(c.id);h&&(o=Math.min(o,h.x),n=Math.min(n,h.y),i=Math.max(i,h.x+h.width),d=Math.max(d,h.y+h.height))}if(!Number.isFinite(o))continue;let a=e.groupPadding;t.groups.set(s.id,{x:o-a,y:n-a-e.groupLabelHeight,width:i-o+2*a,height:d-n+2*a+e.groupLabelHeight})}return t.groups}function xt(r){let t=1/0,e=1/0,s=-1/0,o=-1/0,n=i=>{t=Math.min(t,i.x),e=Math.min(e,i.y),s=Math.max(s,i.x+i.width),o=Math.max(o,i.y+i.height)};for(let i of r.nodes.values())n(i);for(let i of r.groups.values())n(i);return Number.isFinite(t)?{x:t,y:e,width:s-t,height:o-e}:{x:0,y:0,width:0,height:0}}function yn(r,t,e){let s=Ht(r),o=new Float64Array(r.v.length).fill(NaN);r.v.forEach((n,i)=>{if(n.real&&t.has(n.id)){let d=t.get(n.id);o[i]=Xt(e,d.x,d.y).x}});for(let[,n]of r.chains){if(!n.length)continue;let i=r.v[n[0]].up[0]?.n,d=r.v[n[n.length-1]].down[0]?.n;i==null||d==null||Number.isNaN(o[i])||Number.isNaN(o[d])||n.forEach((a,c)=>{o[a]=o[i]+(o[d]-o[i])*(c+1)/(n.length+1)})}return s.map(n=>{let i=new Map(n.map((d,a)=>[d,a]));return n.slice().sort((d,a)=>{let c=o[d],h=o[a];return Number.isNaN(c)&&Number.isNaN(h)?i.get(d)-i.get(a):Number.isNaN(c)?1:Number.isNaN(h)?-1:c-h})})}function xn(r){let t=new Map(r.nodes.map(i=>[i.id,i.id])),e=i=>{for(;t.get(i)!==i;)t.set(i,t.get(t.get(i))),i=t.get(i);return i},s=(i,d)=>{let a=e(i),c=e(d);a!==c&&t.set(c,a)};for(let i of r.edges)s(i.source,i.target);let o=new Map;for(let i of r.nodes)i.group&&(o.has(i.group)?s(o.get(i.group),i.id):o.set(i.group,i.id));for(let i of r.constraints)if(i.type==="leftOf"&&s(i.a,i.b),i.type==="sameRank")for(let d of i.nodes)s(i.nodes[0],d);let n=new Map;for(let i of r.nodes){let d=e(i.id);n.has(d)||n.set(d,[]),n.get(d).push(i.id)}return[...n.values()].map(i=>({nodes:i,set:new Set(i)}))}function Ee(r,t,e,s){let o=s==="LR"||s==="RL",n=[...r.nodes.entries()],i=(d,a)=>d.x<a.x+a.width+e&&a.x<d.x+d.width+e&&d.y<a.y+a.height+e&&a.y<d.y+d.height+e;for(let[d,a]of n)if(!t.has(d))for(let c=0;c<200;c++){let h=n.find(([g,f])=>g!==d&&i(a,f));if(!h)break;let p=h[1];o?a.y=p.y+p.height+e:a.x=p.x+p.width+e}}function mn(r,t,e){let s=we(e),o=et(r),n=et(t),i=n.x-o.x,d=n.y-o.y,a=Math.abs(i)-(r.width+t.width)/2,c=Math.abs(d)-(r.height+t.height)/2,h=s.x!==0?i*s.x:d*s.y,p=s.x!==0?a:c;return h>0&&p>4?[s.exit,s.entry]:a>=c?i>=0?["right","left"]:["left","right"]:d>=0?["bottom","top"]:["top","bottom"]}function Ie(r,t){let e=r.options.direction,s=new Map,o=new Map;for(let a of r.nodes){let c=t.get(a.id);if(!c)continue;let h=dt(a),p=new Map;for(let[g,f]of h)p.set(g,{x:c.x+f.px*c.width,y:c.y+f.py*c.height,side:f.side,t:f.t});o.set(a.id,p)}let n=new Map,i=new Map;for(let a of r.edges){let c=t.get(a.source),h=t.get(a.target);if(!c||!h)continue;if(a.source===a.target){let u=o.get(a.source),m=a.sourcePort&&u.get(a.sourcePort),w=a.targetPort&&u.get(a.targetPort),M=Math.min(20,c.width/4,c.height/4);s.set(a.id,{source:m&&m.side?{x:m.x,y:m.y,side:m.side}:{x:c.x+c.width-M,y:c.y,side:"top"},target:w&&w.side?{x:w.x,y:w.y,side:w.side}:{x:c.x+c.width,y:c.y+M,side:"right"}});continue}let[p,g]=mn(c,h,e),f=a.sourcePort&&o.get(a.source).get(a.sourcePort),l=a.targetPort&&o.get(a.target).get(a.targetPort);f&&f.side&&(p=f.side),l&&l.side&&(g=l.side),i.set(a.id,[p,g]),f||Le(n,a.source+"|"+p,{edgeId:a.id,end:"source",other:a.target}),l||Le(n,a.target+"|"+g,{edgeId:a.id,end:"target",other:a.source}),s.set(a.id,{source:f?{x:f.x,y:f.y,side:f.side}:null,target:l?{x:l.x,y:l.y,side:l.side}:null})}for(let a=0;a<2;a++)for(let[c,h]of n){let[p,g]=c.split("|"),f=t.get(p),l=g==="top"||g==="bottom",u=w=>{let M=s.get(w.edgeId),b=w.end==="source"?M.target:M.source;if(a>0&&b)return l?b.x:b.y;let x=et(t.get(w.other));return l?x.x:x.y};h.sort((w,M)=>u(w)-u(M)||(w.edgeId<M.edgeId?-1:1));let m=[...o.get(p)?.values()||[]].filter(w=>w.side===g).map(w=>w.t);h.forEach((w,M)=>{let b=(M+1)/(h.length+1);for(let y of m)Math.abs(y-b)<.06&&(b=Math.min(.95,b+.1));let x=l?{x:f.x+b*f.width,y:g==="top"?f.y:f.y+f.height,side:g}:{x:g==="left"?f.x:f.x+f.width,y:f.y+b*f.height,side:g};s.get(w.edgeId)[w.end]=x})}let d=a=>{a&&(a.x=Math.round(a.x*100)/100,a.y=Math.round(a.y*100)/100)};for(let a of s.values())d(a.source),d(a.target);return{ends:s,ports:o,sides:i}}function Le(r,t,e){r.has(t)||r.set(t,[]),r.get(t).push(e)}function Pe(r,t,e){let s=e.spacing,o={h:new Map,v:new Map},n=new Map;for(let[p,g]of r)n.set(p,g.points.map(f=>({x:f.x,y:f.y})));for(let[p,g]of r){if(g.kind!=="orthogonal"||g.bundle)continue;let f=g.points;for(let l=0;l<f.length-1;l++){if(e.fixedEnds!==!1&&(l===0||l===f.length-2))continue;let u=f[l],m=f[l+1],w=Math.abs(u.x-m.x)<.01,M=Math.abs(u.y-m.y)<.01;if(!w&&!M)continue;let b=w?u.x:u.y,x=w?Math.min(u.y,m.y):Math.min(u.x,m.x),y=w?Math.max(u.y,m.y):Math.max(u.x,m.x);if(y-x<.5)continue;let _=w?u.y<=m.y:u.x<=m.x,k=f[l-1],E=f[l+2],S=(T,K)=>T?Math.sign(w?T.x-K.x:T.y-K.y):0,A=S(k,u),N=S(E,m),O={id:p,i:l,c:b,lo:x,hi:y,vertical:w,loIsA:_,pts:n.get(p),dirLo:_?A:N,dirHi:_?N:A},v=Math.round(b*100),P=w?o.v:o.h;P.has(v)||P.set(v,[]),P.get(v).push(O)}}let i=[...o.v.values()].flat(),d=[...o.h.values()].flat(),a=[];for(let p of[!0,!1])for(let g of(p?o.v:o.h).values()){if(g.length<2)continue;g.sort((m,w)=>m.lo-w.lo);let f=[g[0]],l=g[0].hi,u=()=>{f.length>1&&c(f,p)};for(let m=1;m<g.length;m++){let w=g[m];w.lo<l-.5?(f.push(w),l=Math.max(l,w.hi)):(u(),f=[w],l=w.hi)}u()}function c(p,g){if(new Set(p.map(_=>_.id)).size<2)return;let f=[];for(let _ of p){let k=f.length;for(;k>0&&Mn(_,f[k-1])<0;)k--;f.splice(k,0,_)}let l=p[0].c,u=Math.min(...p.map(_=>_.lo)),m=Math.max(...p.map(_=>_.hi)),w=1/0,M=1/0;for(let _ of t.values()){let k=g?_.y:_.x;if((g?_.y+_.height:_.x+_.width)<=u||k>=m)continue;let S=g?_.x:_.y,A=g?_.x+_.width:_.y+_.height;A<=l+.01?w=Math.min(w,l-A):S>=l-.01&&(M=Math.min(M,S-l))}for(let _ of g?i:d){if(_.c===l||_.hi<=u||_.lo>=m)continue;let k=Math.abs(_.c-l)/2;_.c<l?w=Math.min(w,k+4):M=Math.min(M,k+4)}let b=f.length,x=Math.max(0,Math.min(w,M)-4),y=Math.min(s,b>1?2*x/(b-1):s);f.forEach((_,k)=>{let E=(k-(b-1)/2)*y;Math.abs(E)>.01&&a.push([_.id,_.i,g,E])})}let h=new Map;for(let[p,g,f,l]of a)h.has(p)||h.set(p,new Map),h.get(p).set(g,f?{x:l,y:0}:{x:0,y:l});for(let[p,g]of h){let f=r.get(p),l=f.points,u=[],m={x:0,y:0};for(let w=0;w<l.length;w++){let M=w>0&&g.get(w-1)||m,b=w<l.length-1&&g.get(w)||m,x=w>0&&w<l.length-1&&wn(l[w-1],l[w],l[w+1]);x&&(M.x!==b.x||M.y!==b.y)?(u.push({x:l[w].x+M.x,y:l[w].y+M.y}),u.push({x:l[w].x+b.x,y:l[w].y+b.y})):u.push({x:l[w].x+M.x+(x?0:b.x),y:l[w].y+M.y+(x?0:b.y)})}f.points=bn(u)}}function wn(r,t,e){return Math.abs(r.x-t.x)<.01&&Math.abs(t.x-e.x)<.01||Math.abs(r.y-t.y)<.01&&Math.abs(t.y-e.y)<.01}function bn(r){let t=[];for(let e of r){let s=t[t.length-1];s&&Math.abs(s.x-e.x)<.01&&Math.abs(s.y-e.y)<.01||t.push(e)}return t}function Mn(r,t){return Oe(r,t,!0)||Oe(r,t,!1)||kn(r,t)}function Ae(r,t){let{pts:e,i:s,loIsA:o}=r,n=[];if(t?!o:o)for(let d=s+1;d<e.length;d++)n.push(e[d]);else for(let d=s;d>=0;d--)n.push(e[d]);return n}var _n=(r,t)=>r.x*t.y-r.y*t.x,Ne=(r,t)=>{let e=t.x-r.x,s=t.y-r.y,o=Math.hypot(e,s)||1;return{x:e/o,y:s/o}};function Oe(r,t,e){let s=r.vertical,o=Ae(r,e),n=Ae(t,e),i=e?Math.max(r.lo,t.lo):Math.min(r.hi,t.hi),d=s?{x:r.c,y:i}:{x:i,y:r.c},a=s?{x:0,y:e?-1:1}:{x:e?-1:1,y:0},c=a,h=0,p=0,g=(l,u)=>{if(l===u)return 0;let m={x:a.y,y:-a.x},w=s?m.x:m.y;return(l<u?w<0:w>0)?-1:1},f=(l,u)=>u+1<l.length?Math.sign(Math.round(_n(c,Ne(l[u],l[u+1]))*1e3)):null;for(let l=0;l<64;l++){let u=h<o.length?(o[h].x-d.x)*c.x+(o[h].y-d.y)*c.y:1/0,m=p<n.length?(n[p].x-d.x)*c.x+(n[p].y-d.y)*c.y:1/0;if(u===1/0&&m===1/0)return 0;if(Math.abs(u-m)<.5){let M=f(o,h),b=f(n,p);if(M===null||b===null)return M===null&&b===null?0:g(M??0,b??0);if(M!==b)return g(M,b);d=o[h],c=Ne(o[h],o[h+1]),h++,p++;continue}if(u<m){let M=f(o,h);return M?g(M,0):0}let w=f(n,p);return w?g(0,w):0}return 0}var kn=(r,t)=>r.id<t.id?-1:r.id>t.id?1:r.i-t.i;function jt(r,t,e=4){let s=[],o=new Map(t.map((a,c)=>[a,c]));for(let a of t){let c=r.get(a).points;for(let h=0;h<c.length-1;h++){let p=c[h],g=c[h+1];Math.abs(p.x-g.x)<.01&&Math.abs(p.y-g.y)>.01&&s.push([o.get(a),p.x,Math.min(p.y,g.y),Math.max(p.y,g.y)])}}let n=64,i=new Map;for(let a of s){let c=Math.floor(a[1]/n);i.has(c)||i.set(c,[]),i.get(c).push(a)}let d=new Map;for(let a of t){let c=o.get(a),h=r.get(a).points,p=[];for(let g=0;g<h.length-1;g++){let f=h[g],l=h[g+1];if(Math.abs(f.y-l.y)>.01)continue;let u=Math.min(f.x,l.x)+e*2,m=Math.max(f.x,l.x)-e*2;if(!(m<=u))for(let w=Math.floor(u/n);w<=Math.floor(m/n);w++)for(let M of i.get(w)||[])M[0]>=c||M[1]<=u||M[1]>=m||f.y<=M[2]+e||f.y>=M[3]-e||p.push({seg:g,x:M[1],y:f.y})}p.length&&d.set(a,p)}return d}var Ut=1,vn=[1,-1,0,0],Sn=[0,0,1,-1],Kt=[1,0,3,2],Ce=r=>r.x>0?0:r.x<0?1:r.y>0?2:3;function it(r,t,e={}){let s=r.options,o=t.nodes,n=s.edgeRouting,{ends:i,ports:d}=Ie(r,o),a=new Map,c=new Map,h=e.only||null,p=e.prev||null;if(n==="orthogonal")En(r,o,i,s,h,p,a,c),Pe(a,o,{spacing:s.edgeSpacing,fixedEnds:!0});else for(let l of r.edges){let u=o.get(l.source),m=o.get(l.target);if(!u||!m)continue;if(l.source===l.target){a.set(l.id,Be(u,s,i.get(l.id)));continue}let w=t.edges.get(l.id),M=w&&w.waypoints||[],b=i.get(l.id),x,y;n==="curved"||l.sourcePort?x=b.source:x=Ft(u,M[0]||et(m)),n==="curved"||l.targetPort?y=b.target:y=Ft(m,M[M.length-1]||et(u)),a.set(l.id,{points:[x,...M.map(_=>({..._})),y],kind:n,sourceSide:x.side,targetSide:y.side})}let g=r.edges.map(l=>l.id).filter(l=>a.has(l)),f=s.lineHops&&n==="orthogonal"?jt(a,g,s.hopRadius):new Map;for(let[l,u]of a)u.hops=f.get(l)||[];return{paths:a,raw:c,ports:d,mode:n}}function Be(r,t,e){let s=Math.max(t.nodeMargin*1.5,16),o=e.source,n=e.target,i=U[o.side],d=U[n.side],a={x:o.x+i.x*s,y:o.y+i.y*s},c={x:n.x+d.x*s,y:n.y+d.y*s},h;if(o.side===n.side)h=o.side==="left"||o.side==="right"?[a,{x:a.x,y:c.y}]:[a,{x:c.x,y:a.y}];else if((o.side==="top"||o.side==="bottom")!=(n.side==="top"||n.side==="bottom"))h=o.side==="top"||o.side==="bottom"?[a,{x:c.x,y:a.y}]:[a,{x:a.x,y:c.y}];else{let p=o.side==="top"||o.side==="bottom",g=p?r.x+r.width+s:r.y+r.height+s;h=p?[a,{x:g,y:a.y},{x:g,y:c.y}]:[a,{x:a.x,y:g},{x:c.x,y:g}]}return{points:_t([o,...h,c,n]),kind:"orthogonal",sourceSide:o.side,targetSide:n.side,selfLoop:!0}}function En(r,t,e,s,o,n,i,d){let a=s.nodeMargin,c=[];for(let[l,u]of t)c.push({id:l,...be(u,a)});let h=new Map;for(let l of r.edges){let u=e.get(l.id);if(!u||!u.source||!u.target)continue;let m=U[u.source.side],w=U[u.target.side];h.set(l.id,{s:{x:u.source.x+m.x*a,y:u.source.y+m.y*a},t:{x:u.target.x+w.x*a,y:u.target.y+w.y*a},sDir:Ce(m),tNeed:Kt[Ce(w)]})}let p=Nn(c,h,a);for(let l of r.edges)if(o&&!o.has(l.id)&&n&&n.raw.has(l.id)){let u=n.raw.get(l.id);d.set(l.id,u),p.markPath(u);let m=n.paths.get(l.id);m&&i.set(l.id,{...m,points:u.map(w=>({...w}))})}let g=r.edges.filter(l=>!i.has(l.id)&&t.has(l.source)&&t.has(l.target)),f=l=>{let u=h.get(l.id);return u?Math.abs(u.s.x-u.t.x)+Math.abs(u.s.y-u.t.y):0};g.sort((l,u)=>f(l)-f(u)),In(r,t,e,s,c,g,p,i,d);for(let l of g){if(i.has(l.id))continue;if(l.source===l.target){let b=Be(t.get(l.source),s,e.get(l.id));i.set(l.id,b),d.set(l.id,b.points);continue}let u=e.get(l.id),m=h.get(l.id),w=p.astar(m.s,m.sDir,m.t,m.tNeed,s);w||(w=An(m.s,m.t,u.source.side,u.target.side));let M=[u.source,..._t(w),u.target];p.markPath(M),d.set(l.id,M),i.set(l.id,{points:M.map(b=>({...b})),kind:"orthogonal",sourceSide:u.source.side,targetSide:u.target.side})}}var Ln={top:"bottom",bottom:"top",left:"right",right:"left"};function In(r,t,e,s,o,n,i,d,a){let c=s.bundleFanOut;if(!c)return;let h=new Map;for(let p of n){if(p.source===p.target||p.sourcePort||p.markerStart)continue;let g=e.get(p.id);if(!g||!g.source||!g.target||g.target.side!==Ln[g.source.side])continue;let f=p.source+"|"+g.source.side;h.has(f)||h.set(f,[]),h.get(f).push(p)}for(let[p,g]of h){if(g.length<c)continue;let f=g[0].source,l=e.get(g[0].id).source.side,u=t.get(f),m=U[l],w=m.y!==0,M=w?m.y:m.x,b=l==="bottom"?u.y+u.height:l==="top"?u.y:l==="right"?u.x+u.width:u.x,x=1/0;for(let S of g){let A=e.get(S.id).target;x=Math.min(x,((w?A.y:A.x)-b)*M)}if(x<2*s.nodeMargin+4)continue;let y=b+M*x/2,_=w?{x:u.x+u.width/2,y:b}:{x:b,y:u.y+u.height/2},k=[],E=!0;for(let S of g){let A=e.get(S.id).target,N=_t(w?[_,{x:_.x,y},{x:A.x,y},A]:[_,{x:y,y:_.y},{x:y,y:A.y},A]);for(let O=0;E&&O<N.length-1;O++)for(let v of o)if(v.id!==f&&v.id!==S.target&&ht(N[O],N[O+1],v,1)){E=!1;break}if(!E)break;k.push([S,N,A.side])}if(E)for(let[S,A,N]of k)i.markPath(A),a.set(S.id,A),d.set(S.id,{points:A.map(O=>({...O})),kind:"orthogonal",sourceSide:l,targetSide:N,bundle:p})}}function An(r,t,e,s){let o=e==="top"||e==="bottom",n=s==="top"||s==="bottom";if(o&&n){let i=(r.y+t.y)/2;return[r,{x:r.x,y:i},{x:t.x,y:i},t]}if(!o&&!n){let i=(r.x+t.x)/2;return[r,{x:i,y:r.y},{x:i,y:t.y},t]}return o?[r,{x:r.x,y:t.y},t]:[r,{x:t.x,y:r.y},t]}function Nn(r,t,e){let s=new Set,o=new Set,n=L=>Math.round(L*100)/100,i=1/0,d=1/0,a=-1/0,c=-1/0;for(let L of r)s.add(n(L.x)),s.add(n(L.x+L.width)),o.add(n(L.y)),o.add(n(L.y+L.height)),i=Math.min(i,L.x),d=Math.min(d,L.y),a=Math.max(a,L.x+L.width),c=Math.max(c,L.y+L.height);for(let L of t.values())for(let I of[L.s,L.t])s.add(n(I.x)),o.add(n(I.y)),i=Math.min(i,I.x),d=Math.min(d,I.y),a=Math.max(a,I.x),c=Math.max(c,I.y);s.add(n(i-2*e)),s.add(n(a+2*e)),o.add(n(d-2*e)),o.add(n(c+2*e));let h=L=>{let I=[...L].sort((R,Y)=>R-Y),B=[];for(let R=0;R<I.length;R++)B.push(I[R]),R+1<I.length&&I[R+1]-I[R]>4&&B.push(n((I[R]+I[R+1])/2));return B},p=h(s),g=h(o),f=p.length,l=g.length,u=f*l,m=new Map(p.map((L,I)=>[L,I])),w=new Map(g.map((L,I)=>[L,I])),M=120,b=new Map,x=(L,I)=>L*73856093^I*19349663;for(let L of r)for(let I=Math.floor(L.x/M);I<=Math.floor((L.x+L.width)/M);I++)for(let B=Math.floor(L.y/M);B<=Math.floor((L.y+L.height)/M);B++){let R=x(I,B);b.has(R)||b.set(R,[]),b.get(R).push(L)}let y=(L,I)=>{let B=b.get(x(Math.floor(L/M),Math.floor(I/M)));if(!B)return!1;for(let R of B)if(Me(R,L,I,.01))return!0;return!1},_=u<=4e6?new Uint8Array(u):null,k=_?null:new Map,E=L=>{if(_){let B=_[L];return B||(B=y(p[L%f],g[L/f|0])?2:1,_[L]=B),B===2}let I=k.get(L);return I===void 0&&(I=y(p[L%f],g[L/f|0]),k.set(L,I)),I},S=new Uint8Array(u),A=new Uint8Array(u),N=(L,I)=>{let B=I?S:A,R=B[L];if(!R){let Y=L%f,Z=L/f|0,z=I?(p[Y]+p[Y+1])/2:p[Y],X=I?g[Z]:(g[Z]+g[Z+1])/2;R=y(z,X)?2:1,B[L]=R}return R===2},O=new Uint16Array(u),v=new Uint16Array(u),P=new Uint16Array(u),T=new Uint16Array(u),K=L=>{let I=m.get(n(L.x)),B=w.get(n(L.y));return I==null||B==null?-1:B*f+I};function q(L){for(let I=0;I<L.length-1;I++){let B=L[I],R=L[I+1],Y=Math.abs(B.y-R.y)<.01,Z=Math.abs(B.x-R.x)<.01;if(Y){let z=w.get(n(B.y)),X=m.get(n(B.x)),j=m.get(n(R.x));if(z==null||X==null||j==null)continue;let st=Math.min(X,j),ot=Math.max(X,j);for(let D=st;D<=ot;D++)O[z*f+D]++,D<ot&&P[z*f+D]++}else if(Z){let z=m.get(n(B.x)),X=w.get(n(B.y)),j=w.get(n(R.y));if(z==null||X==null||j==null)continue;let st=Math.min(X,j),ot=Math.max(X,j);for(let D=st;D<=ot;D++)v[D*f+z]++,D<ot&&T[D*f+z]++}}}let nt=u*4,J=nt<=16e6,ne=J?new Float64Array(nt):null,se=J?new Int32Array(nt):null,oe=J?new Uint32Array(nt):null,Lt=0;function Ze(L,I,B,R,Y){let Z=K(L),z=K(B);if(Z<0||z<0)return null;let X=p[z%f],j=g[z/f|0],st=Y.bendPenalty,ot=Y.crossingPenalty;Lt++;let D=J?null:new Map,ie=J?null:new Map,re=J?$=>oe[$]===Lt?ne[$]:void 0:$=>D.get($),ae=J?($,G,Q)=>{oe[$]=Lt,ne[$]=G,se[$]=Q}:($,G,Q)=>{D.set($,G),ie.set($,Q)},We=J?$=>se[$]:$=>ie.get($),lt=new Yt,ce=Z*4+I;ae(ce,0,-1),lt.push(ce,Ut*(Math.abs(p[Z%f]-X)+Math.abs(g[Z/f|0]-j)));let It=1/0,At=-1,Ve=0,qe=4e5;for(;lt.size;){let $=lt.peekKey(),G=lt.pop();if($>=It)break;let Q=re(G),at=G>>2,wt=G&3,Ot=at%f,Pt=at/f|0;if(!($>Q+Ut*(Math.abs(p[Ot]-X)+Math.abs(g[Pt]-j))+1e-6)){if(++Ve>qe)break;if(at===z){let H=wt===R?0:wt===Kt[R]?2*st:st;Q+H<It&&(It=Q+H,At=G);continue}for(let H=0;H<4;H++){if(H===Kt[wt])continue;let ft=Ot+vn[H],ut=Pt+Sn[H];if(ft<0||ut<0||ft>=f||ut>=l)continue;let V=ut*f+ft;if(V!==z&&E(V))continue;let pt=H<2;if(N(pt?H===0?at:V:H===2?at:V,pt))continue;let de=Math.abs(pt?p[ft]-p[Ot]:g[ut]-g[Pt]),bt=de;H!==wt&&(bt+=st);let he=H===0||H===2?at:V,le=pt?P[he]:T[he];le&&(bt+=de*.25*le),V!==z&&(pt?v[V]:O[V])&&(bt+=ot);let Ct=V*4+H,Bt=Q+bt,fe=re(Ct);(fe===void 0||Bt<fe-1e-9)&&(ae(Ct,Bt,G),lt.push(Ct,Bt+Ut*(Math.abs(p[ft]-X)+Math.abs(g[ut]-j))))}}}if(At<0)return null;let Nt=[];for(let $=At;$!==-1&&$!==void 0;$=We($)){let G=$>>2;Nt.push({x:p[G%f],y:g[G/f|0]})}return Nt.reverse(),Nt}return{astar:Ze,markPath:q,xs:p,ys:g,N:u}}var Yt=class{constructor(){this.k=[],this.v=[]}get size(){return this.k.length}push(t,e){let s=this.k,o=this.v,n=s.length;for(s.push(e),o.push(t);n>0;){let i=n-1>>1;if(s[i]<=e)break;s[n]=s[i],o[n]=o[i],n=i}s[n]=e,o[n]=t}peekKey(){return this.k[0]}pop(){let t=this.k,e=this.v,s=e[0],o=t.pop(),n=e.pop();if(t.length){let i=0,d=t.length;for(;;){let a=2*i+1;if(a>=d||(a+1<d&&t[a+1]<t[a]&&a++,t[a]>=o))break;t[i]=t[a],e[i]=e[a],i=a}t[i]=o,e[i]=n}return s}};function Zt(r,t,e,s){if(!s)return 0;let o=r.options,n=(a,c)=>c.x>=a.x-1&&c.x<=a.x+a.width+1&&c.y>=a.y-1&&c.y<=a.y+a.height+1&&Math.min(Math.abs(c.x-a.x),Math.abs(c.x-a.x-a.width),Math.abs(c.y-a.y),Math.abs(c.y-a.y-a.height))<=1,i=(a,c)=>{let h={left:Math.abs(c.x-a.x),right:Math.abs(c.x-a.x-a.width),top:Math.abs(c.y-a.y),bottom:Math.abs(c.y-a.y-a.height)};return Object.keys(h).reduce((p,g)=>h[g]<h[p]?g:p)},d=0;for(let a of r.edges){let c=s[a.id],h=t.paths.get(a.id),p=e.get(a.source),g=e.get(a.target);if(!Array.isArray(c)||c.length<2||!h||!p||!g)continue;let f=c.map(u=>({x:+u[0],y:+u[1]}));if(f.some(u=>!Number.isFinite(u.x)||!Number.isFinite(u.y))||!n(p,f[0])||!n(g,f[f.length-1]))continue;let l=!0;for(let u=0;l&&u<f.length-1;u++){let m=f[u],w=f[u+1];t.mode==="orthogonal"&&Math.abs(m.x-w.x)>.5&&Math.abs(m.y-w.y)>.5&&(l=!1)}l&&(h.points=f,h.sourceSide=i(p,f[0]),h.targetSide=i(g,f[f.length-1]),t.raw&&t.raw.set(a.id,f.map(u=>({...u}))),d++)}if(d){let a=r.edges.map(h=>h.id).filter(h=>t.paths.has(h)),c=o.lineHops&&t.mode==="orthogonal"?jt(t.paths,a,o.hopRadius):new Map;for(let[h,p]of t.paths)p.hops=c.get(h)||[]}return d}var On=[.5,.3,.7,.15,.85],vt=3;function $e(r,{nodes:t=[],edges:e=[]}={}){let s=[...t],o=[];for(let[a,c]of e)for(let h=0;h<c.length-1;h++)o.push({id:a,i:h,a:c[h],b:c[h+1],box:Pn(c[h],c[h+1])});let n=[],i=new Map,d=[...r].sort((a,c)=>Re(a.points)-Re(c.points));for(let a of d){let c=a.points;if(!c||!c.length)continue;let h=a.width,p=a.height,g=[];for(let u=0;u<c.length-1;u++)g.push(Math.hypot(c[u+1].x-c[u].x,c[u+1].y-c[u].y));let f=Math.max(1,...g),l=null;for(let u=0;u<g.length;u++){let m=c[u],w=c[u+1],M=g[u];if(M<1)continue;let b=Math.abs(w.y-m.y)<Math.abs(w.x-m.x),x=b?h:p;for(let y of On){if(y!==.5&&M<x*2.2)continue;let _={x:m.x+(w.x-m.x)*y,y:m.y+(w.y-m.y)*y},k=b?[[0,0],[0,-(p/2+vt)],[0,p/2+vt]]:[[0,0],[h/2+vt,0],[-(h/2+vt),0]];for(let E=0;E<k.length;E++){let S=_.x+k[E][0],A=_.y+k[E][1],N={x:S-h/2,y:A-p/2,width:h,height:p},O=(1-M/f)*20+Math.abs(y-.5)*40+(E?12:0);if(!E&&M<x+8&&(O+=25),!(l&&O>=l.cost)){for(let v of n)Wt(N,v,2)&&(O+=1e3+Cn(N,v));if(!(l&&O>=l.cost)){for(let v of s)Wt(N,v,2)&&(O+=800);if(!(l&&O>=l.cost)){for(let v of o)v.id===a.id&&v.i===u||Wt(N,v.box,0)&&Bn(v.a,v.b,N)&&(O+=v.id===a.id?60:150);(!l||O<l.cost)&&(l={cost:O,x:S,y:A,r:N})}}}}}}if(!l){let u=c[0];l={x:u.x,y:u.y,r:{x:u.x-h/2,y:u.y-p/2,width:h,height:p}}}n.push(l.r),i.set(a.id,{x:l.x,y:l.y})}return i}function Re(r){let t=0;for(let e=0;e<(r?.length||0)-1;e++)t+=Math.hypot(r[e+1].x-r[e].x,r[e+1].y-r[e].y);return t}function Pn(r,t){let e=Math.min(r.x,t.x),s=Math.min(r.y,t.y);return{x:e,y:s,width:Math.abs(r.x-t.x),height:Math.abs(r.y-t.y)}}function Wt(r,t,e){return r.x<t.x+t.width+e&&t.x<r.x+r.width+e&&r.y<t.y+t.height+e&&t.y<r.y+r.height+e}function Cn(r,t){let e=Math.min(r.x+r.width,t.x+t.width)-Math.max(r.x,t.x),s=Math.min(r.y+r.height,t.y+t.height)-Math.max(r.y,t.y);return e>0&&s>0?e*s:0}function Bn(r,t,e){let s=0,o=1,n=t.x-r.x,i=t.y-r.y,d=(a,c)=>{if(Math.abs(a)<1e-9)return c>=0;let h=c/a;if(a<0){if(h>o)return!1;h>s&&(s=h)}else{if(h<s)return!1;h<o&&(o=h)}return!0};return d(-n,r.x-e.x)&&d(n,e.x+e.width-r.x)&&d(-i,r.y-e.y)&&d(i,e.y+e.height-r.y)}var rt="http://www.w3.org/2000/svg",Rn=0,Vt={arrow:'<path class="fg-marker-fill" d="M0,-5 L12,0 L0,5 Z"/>',open:'<path class="fg-marker-stroke" d="M1,-5 L12,0 L1,5"/>',many:'<path class="fg-marker-stroke" d="M0,0 L12,-6 M0,0 L12,0 M0,0 L12,6"/>',one:'<path class="fg-marker-stroke" d="M6,-6 L6,6 M0,0 L12,0"/>',onlyOne:'<path class="fg-marker-stroke" d="M3,-6 L3,6 M8,-6 L8,6 M0,0 L12,0"/>',oneOrMany:'<path class="fg-marker-stroke" d="M-3,-6 L-3,6 M0,0 L12,-6 M0,0 L12,0 M0,0 L12,6"/>',zeroOrMany:'<path class="fg-marker-stroke" d="M0,0 L12,-6 M0,0 L12,0 M0,0 L12,6"/><circle class="fg-marker-hollow" cx="-5" cy="0" r="3.5"/>',zeroOrOne:'<path class="fg-marker-stroke" d="M8,-6 L8,6 M0,0 L12,0"/><circle class="fg-marker-hollow" cx="0" cy="0" r="3.5"/>',diamond:'<path class="fg-marker-fill" d="M0,0 L6,-5 L12,0 L6,5 Z"/>',hollowDiamond:'<path class="fg-marker-hollow" d="M0,0 L6,-5 L12,0 L6,5 Z"/>',circle:'<circle class="fg-marker-fill" cx="8" cy="0" r="4"/>'};var St=class{constructor(t,e){this.id="fg"+ ++Rn,this.options=e,this.container=t,t.classList.add("fg-container");let s=this.viewport=F("div","fg-viewport");s.tabIndex=0,this.world=F("div","fg-world"),this.groupsLayer=F("div","fg-groups"),this.svg=document.createElementNS(rt,"svg"),this.svg.setAttribute("class","fg-edges"),this.svg.setAttribute("width","1"),this.svg.setAttribute("height","1"),this.defs=document.createElementNS(rt,"defs"),this.svg.appendChild(this.defs),this.edgesGroup=document.createElementNS(rt,"g"),this.svg.appendChild(this.edgesGroup),this.labelsLayer=F("div","fg-labels"),this.nodesLayer=F("div","fg-nodes"),this.world.append(this.groupsLayer,this.svg,this.labelsLayer,this.nodesLayer),s.appendChild(this.world),t.appendChild(s),this.nodeEls=new Map,this.edgeEls=new Map,this.groupEls=new Map,this.labelEls=new Map,this.markersUsed=new Set,this.expanded=new Set,this.transform={x:0,y:0,k:1}}destroy(){clearTimeout(this._settle),this.viewport.remove(),this.container.classList.remove("fg-container")}syncNodes(t){let e=this.options,s=new Set,o=new Map,n=[];for(let i of t){let d=String(i.id);s.add(d);let a=this.nodeEls.get(d),c=qt(i,e),h=c&&this.expanded.has(d),p=Tn(i)+(c?h?"+":"-":"");if(a||(a=F("div","fg-node"),a.dataset.id=d,this.nodesLayer.appendChild(a),this.nodeEls.set(d,a)),a._sig!==p){a._sig=p,a.className="fg-node"+(i.className?" "+i.className:"")+(i.type?" fg-node--"+i.type:"")+(c?" fg-node--expandable":"")+(h?" fg-node--expanded":""),a.innerHTML="";let l=c?F("div","fg-node__body"):a;c&&a.appendChild(l);let u=e.renderNode?e.renderNode(i,l):void 0;if(typeof u=="string")l.innerHTML=u;else if(u instanceof Node)l.appendChild(u);else if(u===void 0)if(i.html!=null)l.innerHTML=i.html;else{let m=F("div","fg-node__label");m.textContent=i.label??d,l.appendChild(m)}if(c){if(h){let m=F("div","fg-node__details"),w=e.renderDetails?e.renderDetails(i,m):i.details;typeof w=="string"?m.innerHTML=w:w instanceof Node&&m.appendChild(w),a.appendChild(m)}a.appendChild(Hn(h,e))}a._measured=null}let g=typeof i.width=="number",f=typeof i.height=="number"&&!h;a.style.width=g?i.width+"px":"",a.style.height=f?i.height+"px":"",(!g||!f)&&n.push([d,a,g?i.width:null,f?i.height:null])}for(let[i,d]of this.nodeEls)s.has(i)||(d.remove(),this.nodeEls.delete(i));for(let[,i,d]of n)i.classList.add(d==null?"fg-node--measuring":"fg-node--measuring-h");for(let[i,d,a,c]of n){if(!d._measured){let h=d.getBoundingClientRect(),p=this.transform.k||1;d._measured={width:Math.ceil(h.width/p-.01)||this.options.defaultNodeWidth,height:Math.ceil(h.height/p-.01)||this.options.defaultNodeHeight}}o.set(i,{width:a??d._measured.width,height:c??d._measured.height})}for(let[,i]of n)i.classList.remove("fg-node--measuring","fg-node--measuring-h");return o}renderBadges(t){for(let[e,s]of this.nodeEls){let o=t&&t.get(e),n=s.querySelector(":scope > .fg-node__badge");if(!o){n?.remove();continue}n||(n=F("div","fg-node__badge"),s.appendChild(n)),n.textContent!==o.text&&(n.textContent=o.text),n.classList.toggle("fg-node__badge--open",!!o.open),n.title=o.title||""}}renderPorts(t){for(let e of t.nodes){let s=this.nodeEls.get(e.id);if(!s)continue;let o=this.options.showPorts?JSON.stringify(e.ports.map(n=>[n.id,n.side,n.offset])):"";if(s._portSig!==o&&(s._portSig=o,s.querySelectorAll(":scope > .fg-port").forEach(n=>n.remove()),!!o))for(let[n,i]of dt(e)){let d=F("div","fg-port fg-port--"+i.side);d.dataset.port=n,d.style.left=i.px*100+"%",d.style.top=i.py*100+"%",s.appendChild(d)}}}placeNodes(t,e){for(let s of t.nodes){let o=this.nodeEls.get(s.id),n=e.get(s.id);!o||!n||(o.style.width=n.width+"px",o.style.height=n.height+"px",o.style.transform=`translate(${n.x}px, ${n.y}px)`,o.classList.toggle("fg-node--pinned",!!s.constraints.pinned))}}renderGroups(t,e){let s=new Set;for(let o of t.groups){let n=e.get(o.id);if(!n)continue;s.add(o.id);let i=this.groupEls.get(o.id);if(!i){i=F("div","fg-group"),i.dataset.id=o.id;let d=F("div","fg-group__label");i.appendChild(d),this.groupsLayer.appendChild(i),this.groupEls.set(o.id,i)}i.className="fg-group"+(o.className?" "+o.className:""),i.firstChild.textContent=o.label,i.firstChild.style.height=this.options.groupLabelHeight+"px",i.firstChild.style.lineHeight=this.options.groupLabelHeight+"px",Object.assign(i.style,{transform:`translate(${n.x}px, ${n.y}px)`,width:n.width+"px",height:n.height+"px"})}for(let[o,n]of this.groupEls)s.has(o)||(n.remove(),this.groupEls.delete(o))}ensureMarker(t){if(!t||!Vt[t]||this.markersUsed.has(t))return;let e=document.createElementNS(rt,"marker");e.setAttribute("id",`${this.id}-m-${t}`),e.setAttribute("viewBox","-10 -8 24 16"),e.setAttribute("refX","12"),e.setAttribute("refY","0"),e.setAttribute("markerWidth","24"),e.setAttribute("markerHeight","16"),e.setAttribute("markerUnits","userSpaceOnUse"),e.setAttribute("orient","auto-start-reverse"),e.setAttribute("class","fg-marker fg-marker--"+t),e.innerHTML=Vt[t],this.defs.appendChild(e),this.markersUsed.add(t)}renderEdges(t,e,s,o){let n=this.options,i=new Set,d=[];for(let a of t.edges){let c=e.paths.get(a.id);if(!c)continue;i.add(a.id);let h=this.edgeEls.get(a.id);if(!h){h=document.createElementNS(rt,"g"),h.dataset.id=a.id;let u=document.createElementNS(rt,"path");u.setAttribute("class","fg-edge__hit");let m=document.createElementNS(rt,"path");m.setAttribute("class","fg-edge__line"),h.append(u,m),this.edgesGroup.appendChild(h),this.edgeEls.set(a.id,h)}h.setAttribute("class",`fg-edge fg-edge--${$n(a.type)}${a.className?" "+a.className:""}`);let p=s?s.get(a.id):null,g=p?Fn(p):Te(c,n.cornerRadius,n.lineHops?c.hops:[],n.hopRadius),[f,l]=h.childNodes;f.setAttribute("d",g),l.setAttribute("d",g);for(let[u,m]of[["marker-start",a.markerStart],["marker-end",a.markerEnd]])m&&Vt[m]?(this.ensureMarker(m),l.setAttribute(u,`url(#${this.id}-m-${m})`)):l.removeAttribute(u);this.renderLabel(a,!s)&&!s&&d.push([a.id,c])}for(let[a,c]of this.edgeEls)i.has(a)||(c.remove(),this.edgeEls.delete(a),this.renderLabel({id:a,label:null},!1));d.length&&this.placeLabels(d,e,o);for(let a of t.edges){let c=this.edgeEls.get(a.id);c&&this.edgesGroup.appendChild(c)}}renderLabel(t,e){let s=this.labelEls.get(t.id);return t.label==null||t.label===""?(s&&(s.remove(),this.labelEls.delete(t.id)),!1):(s||(s=F("div","fg-edge-label"),s.dataset.id=t.id,this.labelsLayer.appendChild(s),this.labelEls.set(t.id,s)),s.textContent!==String(t.label)&&(s.textContent=t.label,s._size=null),s.style.visibility=e?"":"hidden",!0)}placeLabels(t,e,s){let o=[];for(let[d,a]of t){let c=this.labelEls.get(d);c._size||(c._size={width:c.offsetWidth,height:c.offsetHeight}),o.push({id:d,points:a.points,width:c._size.width,height:c._size.height})}let n=[...e.paths].map(([d,a])=>[d,a.points]),i=$e(o,{nodes:s?s.values():[],edges:n});for(let[d,a]of i){let c=this.labelEls.get(d),h=c._size;c.style.transform=`translate(${C(a.x-h.width/2)}px, ${C(a.y-h.height/2)}px)`}}setTransform(t){this.transform=t,this.world.style.transform=`translate(${Math.round(t.x)}px, ${Math.round(t.y)}px) scale(${t.k})`,this._k!==t.k&&(this._k=t.k,this.world.style.setProperty("--fg-zoom",t.k)),this.world.classList.add("fg-moving"),clearTimeout(this._settle),this._settle=setTimeout(()=>this.world.classList.remove("fg-moving"),150)}};function F(r,t){let e=document.createElement(r);return t&&(e.className=t),e}function $n(r){return String(r).replace(/[^a-zA-Z0-9_-]/g,"_")}function Tn(r){return JSON.stringify([r.label,r.html,r.className,r.type,r.columns,r.data,r.details])}function qt(r,t){return r.expandable!=null?!!r.expandable:r.details!=null||!!t.renderDetails}var zn='<svg viewBox="0 0 12 12" width="12" height="12" aria-hidden="true"><path d="M3 4.5 6 7.5 9 4.5" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"/></svg>';function Hn(r,t){let e=F("button","fg-node__toggle");return e.type="button",e.setAttribute("aria-expanded",String(r)),e.innerHTML=`<span></span>${zn}`,e.firstChild.textContent=r?t.collapseText:t.expandText,e}var C=r=>Math.round(r*100)/100;function Fn(r){return r.map((t,e)=>(e?"L":"M")+C(t.x)+","+C(t.y)).join(" ")}function Te(r,t=6,e=[],s=4){let o=r.points;if(!o||o.length<2)return"";if(r.kind==="curved")return Dn(r);let n=`M${C(o[0].x)},${C(o[0].y)}`,i=o.length,d=new Array(i).fill(0);for(let c=1;c<i-1;c++){let h=Math.hypot(o[c].x-o[c-1].x,o[c].y-o[c-1].y),p=Math.hypot(o[c+1].x-o[c].x,o[c+1].y-o[c].y);d[c]=Math.max(0,Math.min(t,h/2,p/2))}let a=new Map;for(let c of e||[])a.has(c.seg)||a.set(c.seg,[]),a.get(c.seg).push(c);for(let c=0;c<i-1;c++){let h=o[c],p=o[c+1],g=Math.hypot(p.x-h.x,p.y-h.y)||1,f=(p.x-h.x)/g,l=(p.y-h.y)/g,u=d[c+1],m=p.x-f*u,w=p.y-l*u,M=a.get(c);if(M&&Math.abs(l)<1e-6){let b=Math.sign(f),x=h.x+f*d[c];M.sort((y,_)=>(y.x-_.x)*b);for(let y of M)(y.x-x)*b<s+1||(m-y.x)*b<s+1||(n+=` L${C(y.x-b*s)},${C(h.y)} A${s},${s} 0 0 ${b>0?1:0} ${C(y.x+b*s)},${C(h.y)}`)}if(n+=` L${C(m)},${C(w)}`,c+1<i-1&&u>0){let b=o[c+2],x=Math.hypot(b.x-p.x,b.y-p.y)||1;n+=` Q${C(p.x)},${C(p.y)} ${C(p.x+(b.x-p.x)/x*u)},${C(p.y+(b.y-p.y)/x*u)}`}}return n}function Dn(r){let t=r.points,e=t[0],s=t[t.length-1],o=Math.hypot(s.x-e.x,s.y-e.y),n=Math.max(30,Math.min(160,o*.4));if(t.length===2){let g=U[r.sourceSide]||{x:0,y:0},f=U[r.targetSide]||{x:0,y:0};return`M${C(e.x)},${C(e.y)} C${C(e.x+g.x*n)},${C(e.y+g.y*n)} ${C(s.x+f.x*n)},${C(s.y+f.y*n)} ${C(s.x)},${C(s.y)}`}let i=U[r.sourceSide],d=U[r.targetSide],a=i?{x:e.x-i.x*40,y:e.y-i.y*40}:e,c=d?{x:s.x-d.x*40,y:s.y-d.y*40}:s,h=[a,...t,c],p=`M${C(e.x)},${C(e.y)}`;for(let g=1;g<h.length-2;g++){let f=h[g-1],l=h[g],u=h[g+1],m=h[g+2],w={x:l.x+(u.x-f.x)/6,y:l.y+(u.y-f.y)/6},M={x:u.x-(m.x-l.x)/6,y:u.y-(m.y-l.y)/6};p+=` C${C(w.x)},${C(w.y)} ${C(M.x)},${C(M.y)} ${C(u.x)},${C(u.y)}`}return p}function ze(r,t,e,s=28){let o=new Map;for(let[n,i]of t){let d=r&&r.get(n),a=Dt(i.points,s);if(!d){o.set(n,a);continue}let c=Dt(d.points,s);o.set(n,a.map((h,p)=>({x:c[p].x+(h.x-c[p].x)*e,y:c[p].y+(h.y-c[p].y)*e})))}return o}function He(r){let t=r.renderer,e=t.viewport,s=()=>r.options,o=new Map,n=null,i=0,d=null,a=(y,_)=>{let k=e.getBoundingClientRect(),E=t.transform;return{x:(y-k.left-E.x)/E.k,y:(_-k.top-E.y)/E.k}},c=y=>{let _=y.target.closest&&y.target.closest(".fg-node");if(_&&t.nodesLayer.contains(_))return{kind:"node",id:_.dataset.id,el:_};let k=y.target.closest&&y.target.closest(".fg-edge");if(k)return{kind:"edge",id:k.dataset.id,el:k};let E=y.target.closest&&y.target.closest(".fg-edge-label");if(E)return{kind:"edge",id:E.dataset.id,el:E};let S=y.target.closest&&y.target.closest(".fg-group");return S?{kind:"group",id:S.dataset.id,el:S}:{kind:"background"}};function h(y){if(r._stopZoom(),y.button!==void 0&&y.button!==0&&y.pointerType==="mouse"||y.target.closest&&y.target.closest(".fg-controls")||y.target.closest&&y.target.closest("input, textarea, select, button, a, [data-fg-nodrag]"))return;if(o.set(y.pointerId,{x:y.clientX,y:y.clientY}),e.setPointerCapture?.(y.pointerId),o.size===2&&s().zoomable){let[E,S]=[...o.values()];n={type:"pinch",dist:Math.hypot(E.x-S.x,E.y-S.y),k:t.transform.k,mid:{x:(E.x+S.x)/2,y:(E.y+S.y)/2}};return}let _=c(y),k={x:y.clientX,y:y.clientY};if((_.kind==="background"||_.kind==="group")&&y.shiftKey&&s().multiSelect)n={type:"box",target:_,start:k,moved:!1,base:r.getSelectedItems()};else if(_.kind==="node"&&s().draggable){let E=r.positions.get(_.id),S=a(y.clientX,y.clientY);n={type:"drag",id:_.id,target:_,start:k,moved:!1,dx:S.x-E.x,dy:S.y-E.y}}else s().pannable?n={type:"pan",target:_,start:k,moved:!1,tx:t.transform.x,ty:t.transform.y}:n={type:"click",target:_,start:k,moved:!1}}function p(y){if(o.has(y.pointerId)&&o.set(y.pointerId,{x:y.clientX,y:y.clientY}),!n)return;if(n.type==="pinch"){if(o.size<2)return;let[k,E]=[...o.values()],S=Math.hypot(k.x-E.x,k.y-E.y);r.zoomAt(n.k*(S/n.dist),n.mid.x,n.mid.y,!0);return}let _=Math.hypot(y.clientX-n.start.x,y.clientY-n.start.y);if(!(!n.moved&&_<4)){if(n.moved||(n.moved=!0,n.type==="drag"&&(r._dragStart(n.id),e.classList.add("fg-dragging")),n.type==="pan"&&e.classList.add("fg-panning"),n.type==="box"&&(n.el=document.createElement("div"),n.el.className="fg-selection-box",e.appendChild(n.el))),n.type==="box"){let k=e.getBoundingClientRect(),E=Math.min(n.start.x,y.clientX),S=Math.min(n.start.y,y.clientY),A=Math.abs(y.clientX-n.start.x),N=Math.abs(y.clientY-n.start.y);Object.assign(n.el.style,{left:E-k.left+"px",top:S-k.top+"px",width:A+"px",height:N+"px"});let O=a(E,S),v=a(E+A,S+N);d={box:{x:O.x,y:O.y,width:v.x-O.x,height:v.y-O.y},base:n.base},i||(i=requestAnimationFrame(g));return}if(n.type==="pan")r.setTransform({x:n.tx+y.clientX-n.start.x,y:n.ty+y.clientY-n.start.y,k:t.transform.k});else if(n.type==="drag"){let k=a(y.clientX,y.clientY);d={id:n.id,x:k.x-n.dx,y:k.y-n.dy},i||(i=requestAnimationFrame(g))}}}function g(){if(i=0,d){let y=d;d=null,y.box?r._boxSelect(y.box,y.base):r._dragMove(y.id,y.x,y.y)}}function f(y){if(o.delete(y.pointerId),!n)return;let _=n;if(_.type==="pinch"){o.size===0&&(n=null);return}if(n=null,e.classList.remove("fg-dragging","fg-panning"),_.type==="box"&&_.moved){i&&(cancelAnimationFrame(i),i=0,g()),_.el.remove();return}if(_.type==="drag"&&_.moved){i&&(cancelAnimationFrame(i),i=0,g()),r._dragEnd(_.id);return}!_.moved&&y.type==="pointerup"&&r._click(_.target,y)}function l(y){if(r._stopZoom(),!s().zoomable)return;y.preventDefault();let _=t.transform.k*Math.exp(-y.deltaY*(y.ctrlKey?.01:.0015));r.zoomAt(_,y.clientX,y.clientY,!0)}let u=null;function m(y){if(n&&n.moved)return;let _=c(y),k=_.kind==="node"||_.kind==="edge"?_.kind+":"+_.id:null;k!==u&&(u=k,r._hover(k?_:null))}function w(y){y.target.closest&&y.target.closest(".fg-controls, input, textarea, select, a")||r._contextMenu(c(y),y)}function M(y){let _=y.target.closest&&y.target.closest(".fg-node__toggle");if(!_)return;let k=_.closest(".fg-node");k&&t.nodesLayer.contains(k)&&(y.stopPropagation(),r.toggleExpand(k.dataset.id))}function b(){u&&(u=null,r._hover(null))}function x(y){y.key==="Escape"?r._escape():(y.key==="z"||y.key==="Z")&&(y.ctrlKey||y.metaKey)&&s().history?(y.preventDefault(),y.shiftKey?r.redo():r.undo()):(y.key==="y"||y.key==="Y")&&(y.ctrlKey||y.metaKey)&&s().history?(y.preventDefault(),r.redo()):(y.key==="a"||y.key==="A")&&(y.ctrlKey||y.metaKey)&&s().multiSelect?(y.preventDefault(),r.selectAll()):(y.key==="+"||y.key==="=")&&s().zoomable?r.zoomBy(1.2):y.key==="-"&&s().zoomable?r.zoomBy(1/1.2):y.key==="0"&&r.fit()}return e.addEventListener("pointerdown",h),e.addEventListener("pointermove",p),e.addEventListener("pointerup",f),e.addEventListener("pointercancel",f),e.addEventListener("wheel",l,{passive:!1}),e.addEventListener("pointerover",m),e.addEventListener("contextmenu",w),e.addEventListener("click",M),e.addEventListener("pointerleave",b),e.addEventListener("keydown",x),()=>{e.removeEventListener("pointerdown",h),e.removeEventListener("pointermove",p),e.removeEventListener("pointerup",f),e.removeEventListener("pointercancel",f),e.removeEventListener("wheel",l),e.removeEventListener("pointerover",m),e.removeEventListener("contextmenu",w),e.removeEventListener("click",M),e.removeEventListener("pointerleave",b),e.removeEventListener("keydown",x),i&&cancelAnimationFrame(i)}}function Et(r,t,e="chain"){let s=new Set,o=new Set,n=[],i=[];if(t.kind==="node")s.add(t.id),n=[t.id],i=[t.id];else{let h=r.find(p=>p.id===t.id);if(!h)return{nodes:s,edges:o};o.add(h.id),s.add(h.source),s.add(h.target),n=[h.source],i=[h.target]}let d=new Map,a=new Map;for(let h of r)d.has(h.target)||d.set(h.target,[]),a.has(h.source)||a.set(h.source,[]),d.get(h.target).push(h),a.get(h.source).push(h);let c=(h,p,g)=>{let f=new Set(h),l=[...h];for(;l.length;){let u=l.shift();for(let m of p.get(u)||[]){let w=g(m);o.add(m.id),s.add(w),e==="chain"&&!f.has(w)&&(f.add(w),l.push(w))}}};return(t.kind==="node"||e==="chain")&&(c(n,d,h=>h.source),c(i,a,h=>h.target)),{nodes:s,edges:o}}var W="__fg_more:";function Fe(r){let t=new Map;for(let n of r.nodes||[])n&&n.id!=null&&t.set(String(n.id),n);let e=new Map,s=new Set;for(let n of r.edges||[]){if(!n)continue;let i=String(n.source),d=String(n.target);if(i===d||!t.has(i)||!t.has(d))continue;e.has(i)||e.set(i,[]);let a=e.get(i);a.includes(d)||a.push(d),s.add(d)}let o=[...t.keys()].filter(n=>!s.has(n)&&e.has(n));return!o.length&&t.size&&(o=[t.keys().next().value]),{children:e,roots:o,nodeById:t}}function De(r,t,{path:e=[],shown:s=new Map,limit:o=50,hide:n=!1,moreLabel:i}={}){i=i||(x=>`+${x.toLocaleString("en-US")} more`);let{children:d,roots:a,nodeById:c}=t,h=new Set,p=new Set,g=new Map,f=[],l=(x,y)=>{let _=Math.max(o,s.get(x??"")||0);for(let k of y.slice(0,_))h.add(k),x!=null&&!g.has(k)&&g.set(k,x);y.length>_&&f.push({parent:x,count:y.length-_})},u=e.length-1;if((!n||!e.length)&&l(null,a),e.forEach((x,y)=>{h.add(x),p.add(x),(!n||y===u)&&l(x,d.get(x)||[])}),e.length)for(let x of d.get(e[u])||[])h.has(x)&&p.add(x);else for(let x of h)p.add(x);let m=[],w=[];for(let x of h)m.push(c.get(x));for(let x of r.edges||[])x&&h.has(String(x.source))&&h.has(String(x.target))&&w.push(x);for(let x of f){let y=W+(x.parent??"");m.push({id:y,label:i(x.count),className:"fg-node--more",expandable:!1,_more:x}),x.parent!=null&&w.push({id:y+":edge",source:x.parent,target:y,className:"fg-edge--more"}),(x.parent==null||x.parent===e[u])&&p.add(y)}let M=new Map;for(let x of h){let y=d.get(x);y&&M.set(x,y.length)}let b=(r.constraints||[]).filter(x=>[x.a,x.b,x.node,...x.nodes||[]].every(y=>y==null||h.has(String(y))));return{data:{...r,nodes:m,edges:w,constraints:b},focus:p,parentOf:g,childCount:M}}function Xe(r,t,e){let s=r.indexOf(t);if(s>=0)return r.slice(0,s===r.length-1?s:s+1);let o=e.get(t),n=o!=null?r.indexOf(o):-1;return n>=0?[...r.slice(0,n+1),t]:[t]}var Xn="1.2.0";var Ge={};Qe(Ge,{countCrossings:()=>jn,countNodeOverlaps:()=>Un,countOverlappingSegments:()=>Kn});function Gn(r,t,e,s){let o=(c,h,p)=>(h.x-c.x)*(p.y-c.y)-(h.y-c.y)*(p.x-c.x),n=o(e,s,r),i=o(e,s,t),d=o(r,t,e),a=o(r,t,s);return(n>1e-9&&i<-1e-9||n<-1e-9&&i>1e-9)&&(d>1e-9&&a<-1e-9||d<-1e-9&&a>1e-9)}function jn(r){let t=[...r.entries()].map(([s,o])=>[s,Array.isArray(o)?o:o.points]),e=0;for(let s=0;s<t.length;s++)for(let o=s+1;o<t.length;o++){let n=t[s][1],i=t[o][1];for(let d=0;d<n.length-1;d++)for(let a=0;a<i.length-1;a++)Gn(n[d],n[d+1],i[a],i[a+1])&&e++}return e}function Un(r,t,e){let s=0;for(let[o,n]of r){let i=Array.isArray(n)?n:n.points,d=e.get(o);for(let[a,c]of t)if(!(d&&(a===d.source||a===d.target))){for(let h=0;h<i.length-1;h++)if(ht(i[h],i[h+1],c,1)){s++;break}}}return s}function Kn(r){let t=[];for(let[o,n]of r){let i=Array.isArray(n)?n:n.points;for(let d=0;d<i.length-1;d++)t.push([o,i[d],i[d+1],d===0?i[0]:d===i.length-2?i[i.length-1]:null])}let e=(o,n)=>o&&n&&Math.abs(o.x-n.x)<.01&&Math.abs(o.y-n.y)<.01,s=0;for(let o=0;o<t.length;o++)for(let n=o+1;n<t.length;n++){let[i,d,a,c]=t[o],[h,p,g,f]=t[n];if(i===h||e(c,f))continue;let l=Math.abs(d.y-a.y)<.01,u=Math.abs(p.y-g.y)<.01,m=Math.abs(d.x-a.x)<.01,w=Math.abs(p.x-g.x)<.01;if(l&&u&&Math.abs(d.y-p.y)<.5){let M=Math.max(Math.min(d.x,a.x),Math.min(p.x,g.x));Math.min(Math.max(d.x,a.x),Math.max(p.x,g.x))-M>1&&s++}else if(m&&w&&Math.abs(d.x-p.x)<.5){let M=Math.max(Math.min(d.y,a.y),Math.min(p.y,g.y));Math.min(Math.max(d.y,a.y),Math.max(p.y,g.y))-M>1&&s++}}return s}function Rs(r,t){let e=$t(r,t),s=kt(e),o=it(e,s);return{model:e,layout:s,routing:o}}function $s(r,t,e={}){return new ee(r,t,e)}var Yn=["id","label","width","height","group","ports","constraints","source","target","sourcePort","targetPort","type","minLen","weight","markerStart","markerEnd","nodes","type","a","b","node","rank"],Jt=r=>{let t={};for(let e of Yn)r[e]!==void 0&&(t[e]=r[e]);return t},je=()=>typeof matchMedia<"u"&&matchMedia("(prefers-reduced-motion: reduce)").matches,ee=class{constructor(t,e,s={}){if(typeof t=="string"&&(t=document.querySelector(t)),!t)throw new Error("createGraph: container element not found");this.container=t,this.data=e||{nodes:[],edges:[]},this.userOptions={...s},this.options=yt(this.data.options,this.userOptions),this.renderer=new St(t,this.options),this.positions=new Map,this.pins=new Map,this.layoutEdges=new Map,this.routing=null,this.model=null,this.selected=null,this._sel=new Map,this._listeners=new Map,this._anim=0,this._hl=[],this._explore={path:[],shown:new Map},this._undo=[],this._redo=[],this._recDepth=0;for(let o of this.data.nodes||[])o&&o.expanded&&this.renderer.expanded.add(String(o.id));this.options.controls&&this._controls(),this._detach=He(this),this.ready=this._build({mode:"relayout",animate:!1}).then(()=>(this.fit(),this))}relayout({animate:t=this.options.animate,fresh:e=!1}={}){return this._record("relayout",()=>this._build({mode:"relayout",animate:t,fresh:e}))}updateGraph(t,e={}){return this._record("update",()=>this._updateGraph(t,e))}_updateGraph(t,{mode:e="stable",animate:s=this.options.animate}={}){this.data=t;let o=new Set((t.nodes||[]).map(i=>String(i.id)));for(let i of[...this.pins.keys()])o.has(i)||this.pins.delete(i);for(let i of[...this.positions.keys()])o.has(i)||this.positions.delete(i);for(let i of[...this.renderer.expanded])o.has(i)||this.renderer.expanded.delete(i);let n=this._explore.path.findIndex(i=>!o.has(i));return n>=0&&(this._explore.path=this._explore.path.slice(0,n)),this._build({mode:e,animate:s})}setOptions(t,e){return te.some(o=>o in t&&t[o]!==this.options[o])?this._record("options",()=>this._setOptions(t,e)):this._setOptions(t,e)}_setOptions(t,{relayout:e=!0}={}){Object.assign(this.userOptions,t),this.options=yt(this.data.options,this.userOptions),this.renderer.options=this.options;let s="explore"in t||"exploreUnfocused"in t||"exploreLimit"in t;return"explore"in t&&(this._explore={path:[],shown:new Map}),s&&(e=!0),e?this.relayout({fresh:"direction"in t||"explore"in t}):this._reroute()}exportState(){let t={};for(let[s,o]of this.positions)t[s]={x:Ke(o.x),y:Ke(o.y),pinned:!!this.pins.get(s)};let e={};if(this.routing)for(let[s,o]of this.routing.paths)e[s]=o.points.map(n=>[Ye(n.x),Ye(n.y)]);return{version:1,direction:this.options.direction,edgeRouting:this.routing?.mode,nodes:t,edges:e,transform:{...this.renderer.transform}}}importState(t,e){return!t||!t.nodes?Promise.resolve(this):this._record("import",()=>this._importState(t,e))}_importState(t,{animate:e=this.options.animate,transform:s=!0}={}){let o=this._snapshot();for(let[n,i]of Object.entries(t.nodes)){let d=this.positions.get(n);d&&(d.x=i.x,d.y=i.y,i.pinned?this.pins.set(n,{x:i.x,y:i.y}):this.pins.delete(n))}this.model=this._prepareModel();for(let n of this.layoutEdges.values())n.waypoints=[];return this.routing=it(this.model,{nodes:this.positions,edges:this.layoutEdges}),t.edges&&(!t.edgeRouting||t.edgeRouting===this.routing.mode)&&Zt(this.model,this.routing,this.positions,t.edges),this._present(o,e),s&&t.transform&&this.setTransform(t.transform),Promise.resolve(this)}pin(t,e=!0){let s=this.positions.get(t);if(!s)return;let o=this.pins.get(t);(e?o&&o.x===s.x&&o.y===s.y:!o)||this._record(e?"pin":"unpin",()=>this._pin(t,s,e))}_pin(t,e,s){s?this.pins.set(t,{x:e.x,y:e.y}):this.pins.delete(t);let o=this.model.nodeById.get(t);o&&Object.assign(o.constraints,{pinned:s,x:s?e.x:null,y:s?e.y:null}),this.renderer.placeNodes(this.model,this.positions),this._emit("pin",{id:t,pinned:s})}unpin(t){this.pin(t,!1)}unpinAll(){this.pins.size&&this.batch("unpin",()=>{for(let t of[...this.pins.keys()])this.pin(t,!1)})}async undo(){return this._step(this._undo,this._redo,"undo")}async redo(){return this._step(this._redo,this._undo,"redo")}canUndo(){return this._undo.length>0}canRedo(){return this._redo.length>0}getHistory(){return{undo:this._undo.map(t=>t.label),redo:this._redo.map(t=>t.label)}}clearHistory(){this._undo=[],this._redo=[],this._historyChanged("clear")}batch(t,e){return this._record(t,e)}select(t,{add:e=!1,toggle:s=!1}={}){let o=(t==null?[]:Array.isArray(t)?t:[t]).map(Zn).filter(Boolean),n=Ue([...this._sel.values()]);!e&&!s&&this._sel.clear();for(let i of o){let d=i.kind+":"+i.id,a=this._sel.delete(d);s&&a||this._sel.set(d,i)}this.selected=[...this._sel.values()].pop()||null,this._paintSelection(),this._applyHighlight(),this._emit("select",this.selected),Ue([...this._sel.values()])!==n&&this._emit("selectionchange",this._selectionPayload())}getSelection(){return this.selected}getSelectedItems(){return[...this._sel.values()].map(t=>({...t}))}getSelectedNodes(){return this._selectionPayload().nodes}getSelectedEdges(){return this._selectionPayload().edges}selectAll(){this.model&&this.select(this.model.nodes.filter(t=>!t.id.startsWith(W)).map(t=>t.id))}clearSelection(){this.select(null)}getConnections(t,{chain:e=!1}={}){if(!this.model||!this.model.nodeById.has(t))return null;let s=this._ex?this.model.edges.filter(i=>!i.target.startsWith(W)):this.model.edges,o=i=>{let d=new Set([t]),a=[],c=[t];for(;c.length;){let h=c.shift();for(let p of s){let g=i==="next"?p.source:p.target,f=i==="next"?p.target:p.source;g!==h||d.has(f)||(d.add(f),a.push(f),e&&c.push(f))}}return a.map(h=>this.model.nodeById.get(h).data)},n=i=>i.data;return{previous:o("previous"),next:o("next"),incoming:s.filter(i=>i.target===t).map(n),outgoing:s.filter(i=>i.source===t).map(n)}}expand(t,e=!0){t=String(t);let s=this.model?.nodeById.get(t);return!s||!qt(s.data,this.options)?Promise.resolve(!1):this.renderer.expanded.has(t)===!!e?Promise.resolve(!0):this._record(e?"expand":"collapse",()=>(e?this.renderer.expanded.add(t):this.renderer.expanded.delete(t),this.options.onNodeExpand?.(s.data,!!e),this._emit("expand",{id:t,expanded:!!e,node:s.data}),this._relayoutKeeping(t).then(()=>!0)))}collapse(t){return this.expand(t,!1)}toggleExpand(t){return this.expand(t,!this.isExpanded(t))}isExpanded(t){return this.renderer.expanded.has(String(t))}getExplorePath(){return[...this._explore.path]}setExplorePath(t,{animate:e=this.options.animate}={}){let s=(t||[]).map(String),o=this._explore.path;if(this._explore.path=s,this._emit("explore",{path:[...s]}),!this.options.explore)return Promise.resolve(this);let n=s.length>o.length?s[s.length-1]:o[s.length]??s[s.length-1];return this._relayoutKeeping(n,{animate:e,reveal:s[s.length-1]})}exploreBack(){let t=this._explore.path;return t.length?this.setExplorePath(t.slice(0,-1)):Promise.resolve(this)}fit({padding:t=40,maxZoom:e=1}={}){let s=this.renderer.viewport,o=xt({nodes:this.positions,groups:this._groups||new Map});if(!o.width&&!o.height)return;let n=s.clientWidth||800,i=s.clientHeight||600,d=Math.min((n-2*t)/(o.width||1),(i-2*t)/(o.height||1),e);d=Qt(d,this.options.minZoom,this.options.maxZoom),this.setTransform({k:d,x:(n-o.width*d)/2-o.x*d,y:(i-o.height*d)/2-o.y*d})}fitNodes(t,{padding:e=40,maxZoom:s=this.options.maxZoom,animate:o=this.options.animate,edges:n}={}){let i=this._fitTransform(t,{padding:e,maxZoom:s,edges:n});return i?(this._animateTransform(i,o),!0):!1}_fitTransform(t,{padding:e=40,maxZoom:s=this.options.maxZoom,edges:o}={}){let n=new Set([...t].map(String).filter(M=>this.positions.has(M)));if(!n.size)return null;let i=1/0,d=1/0,a=-1/0,c=-1/0,h=(M,b)=>{i=Math.min(i,M),d=Math.min(d,b),a=Math.max(a,M),c=Math.max(c,b)};for(let M of n){let b=this.positions.get(M);h(b.x,b.y),h(b.x+b.width,b.y+b.height)}let p=o||this.model.edges.filter(M=>n.has(M.source)&&n.has(M.target)).map(M=>M.id);for(let M of p)for(let b of this.routing?.paths.get(M)?.points||[])h(b.x,b.y);let g=this.renderer.viewport,f=g.clientWidth||800,l=g.clientHeight||600,u=a-i,m=c-d,w=Math.min((f-2*e)/(u||1),(l-2*e)/(m||1),s);return w=Qt(w,this.options.minZoom,this.options.maxZoom),{k:w,x:(f-u*w)/2-i*w,y:(l-m*w)/2-d*w}}fitFlow(t=this.selected,{mode:e="chain",...s}={}){if(t==null)return!1;if(t===this.selected&&this._sel.size>1){let d=[...this._sel.values()].flatMap(a=>{if(a.kind==="node")return[a.id];let c=this.model?.edgeById.get(a.id);return c?[c.source,c.target]:[]});return this.fitNodes(d,s)}let o;if(typeof t=="string")o={kind:"node",id:t};else if(t.kind)o={kind:t.kind,id:String(t.id)};else{let d=this.model?.edges.find(a=>a.data===t);if(!d)return!1;o={kind:"edge",id:d.id}}if(!(o.kind==="edge"?this.model?.edgeById:this.model?.nodeById)?.has(o.id))return!1;let i=Et(this.model.edges,o,e);return this.fitNodes(i.nodes,{...s,edges:[...i.edges]})}_stopZoom(){this._zoomAnim&&typeof cancelAnimationFrame<"u"&&cancelAnimationFrame(this._zoomAnim),this._zoomAnim=0}_animateTransform(t,e){this._stopZoom();let s=this.getTransform();if(!e||je()||typeof requestAnimationFrame>"u"){this.setTransform(t);return}let o=this.options.animationDuration,n=performance.now(),i=a=>a<.5?4*a*a*a:1-Math.pow(-2*a+2,3)/2,d=a=>{let c=Math.min(1,(a-n)/o),h=i(c),p=s.k*Math.pow(t.k/s.k,h),g=t.k-s.k?(p-s.k)/(t.k-s.k):h;this.setTransform({k:p,x:s.x+(t.x-s.x)*g,y:s.y+(t.y-s.y)*g}),c<1&&(this._zoomAnim=requestAnimationFrame(d))};this._zoomAnim=requestAnimationFrame(d)}zoomAt(t,e,s){let o=this.renderer.transform;t=Qt(t,this.options.minZoom,this.options.maxZoom);let n=this.renderer.viewport.getBoundingClientRect(),i=e-n.left,d=s-n.top;this.setTransform({k:t,x:i-(i-o.x)*t/o.k,y:d-(d-o.y)*t/o.k})}zoomBy(t){let e=this.renderer.viewport.getBoundingClientRect();this.zoomAt(this.renderer.transform.k*t,e.left+e.width/2,e.top+e.height/2)}zoomTo(t){this.zoomAt(t,...Vn(this.renderer.viewport))}setTransform(t){this.renderer.setTransform(t),this._emit("viewport",{...t})}getTransform(){return{...this.renderer.transform}}getLayout(){let t=new Map([...this.positions].map(([s,o])=>[s,{...o}])),e=new Map;if(this.routing)for(let[s,o]of this.routing.paths)e.set(s,o.points.map(n=>({...n})));return{nodes:t,edges:e,groups:new Map(this._groups||[])}}on(t,e){return this._listeners.has(t)||this._listeners.set(t,new Set),this._listeners.get(t).add(e),()=>this._listeners.get(t).delete(e)}destroy(){cancelAnimationFrame(this._anim),this.container.classList.remove("fg-explore","fg-explore--blur"),delete this.container.dataset.fgDirection,this._stopZoom(),this._detach(),this.renderer.destroy(),this._listeners.clear()}_emit(t,e){for(let s of this._listeners.get(t)||[])try{s(e)}catch(o){console.error(o)}}_refreshView(){if(!this.options.explore){this._ex=null,this._viewData=this.data;return}this._exIndexFor!==this.data&&(this._exIndex=Fe(this.data),this._exIndexFor=this.data);let t=this.options;this._ex=De(this.data,this._exIndex,{path:this._explore.path,shown:this._explore.shown,limit:t.exploreLimit,hide:t.exploreUnfocused==="hide",moreLabel:t.exploreMoreText}),this._viewData=this._ex.data}async _relayoutKeeping(t,{animate:e=this.options.animate,reveal:s}={}){let o=this.getTransform(),n=this.positions.get(t);await this._build({mode:"relayout",animate:e});let i=this.positions.get(t),d=o;if(n&&i&&(d={k:o.k,x:o.x-(i.x-n.x)*o.k,y:o.y-(i.y-n.y)*o.k}),s&&this.positions.has(s)){let a=[s,...this.model.edges.filter(h=>h.source===s).map(h=>h.target)],c=this._fitTransform(a,{maxZoom:o.k});c&&c.k>=o.k*.6&&!this._inView(a,d)&&(d=c)}return this._animateTransform(d,e&&!!n),this}_inView(t,e,s=20){let o=this.renderer.viewport,n=o.clientWidth||800,i=o.clientHeight||600;return t.every(d=>{let a=this.positions.get(d);if(!a)return!0;let c=a.x*e.k+e.x,h=a.y*e.k+e.y;return c>=s&&h>=s&&c+a.width*e.k<=n-s&&h+a.height*e.k<=i-s})}_prepareModel(t){let e=this._viewData||this.data,s=this.renderer.syncNodes(e.nodes||[]),o=(e.nodes||[]).map(i=>{let d=String(i.id),a=t&&t.get(d)||this.pins.get(d);return a?{...i,constraints:{...i.constraints||{},pinned:!0,x:a.x,y:a.y}}:i}),n=$t({...e,nodes:o},this.userOptions,s);for(let i of n.warnings)console.warn("[FlexGraph] "+i);return this.options=n.options,this.renderer.options=n.options,n}_snapshot(){return{positions:new Map([...this.positions].map(([t,e])=>[t,{...e}])),routing:this.routing,groups:this._groups}}_build(t){let e=this._buildNow(t);return this._lastBuild=e.catch(()=>{}),e}async _buildNow({mode:t,animate:e,fresh:s}){let o=this._snapshot();this._refreshView(),this._exploreChrome();let n=this._prepareModel(),i,d=this.positions.size>0;if(this.options.worker&&typeof Worker<"u")i=await this._layoutInWorker(n,t,s);else if(t==="stable"&&d){let a=new Map;for(let h of n.nodes){let p=this.positions.get(h.id);p&&a.set(h.id,{x:p.x,y:p.y})}let c=this._prepareModel(a);i=kt(c),Ee(i,new Set(a.keys()),this.options.nodeSpacing/2,this.options.direction);for(let h of i.edges.values())h.waypoints=[];n=this._prepareModel()}else{let a=s||!d?null:new Map([...this.positions].map(([c,h])=>[c,{x:h.x+h.width/2,y:h.y+h.height/2}]));i=kt(n,{hints:a})}return this.model=n,this.positions=new Map([...i.nodes].map(([a,c])=>[a,{x:c.x,y:c.y,width:c.width,height:c.height}])),this.layoutEdges=i.edges,this.routing=i.routing||it(n,{nodes:this.positions,edges:this.layoutEdges}),this.renderer.renderPorts(n),this._present(d?o:null,e),this._pruneSelection(),this._emit("layout",{crossings:i.crossings}),this}_layoutInWorker(t,e,s){this._worker||(this._worker=new Worker(this.options.worker,{type:"module"}),this._wseq=0,this._wpending=new Map,this._worker.onmessage=a=>{let c=this._wpending.get(a.data.seq);c&&(this._wpending.delete(a.data.seq),a.data.error?c.reject(new Error(a.data.error)):c.resolve(a.data))});let o={options:this.data.options,nodes:t.nodes.map(a=>({...Jt(a.data),id:a.id,width:a.width,height:a.height,constraints:a.constraints})),edges:t.edges.map(a=>Jt(a.data)),groups:t.groups.map(a=>({id:a.id,label:a.label})),constraints:(this._viewData?.constraints||[]).map(Jt)},n={};for(let[a,c]of Object.entries(this.userOptions))typeof c!="function"&&a!=="worker"&&(n[a]=c);let i=s||e!=="relayout"?null:new Map([...this.positions].map(([a,c])=>[a,{x:c.x+c.width/2,y:c.y+c.height/2}])),d=++this._wseq;return new Promise((a,c)=>{this._wpending.set(d,{resolve:a,reject:c}),this._worker.postMessage({seq:d,data:o,options:n,hints:i})}).then(a=>({nodes:a.nodes,edges:a.edges,crossings:a.crossings,routing:a.routing}))}_reroute(){return this.routing=it(this.model,{nodes:this.positions,edges:this.layoutEdges}),this._render(),Promise.resolve(this)}_render(t){let e=this.renderer;e.placeNodes(this.model,this.positions),this._groups=mt(this.model,{nodes:this.positions}),e.renderGroups(this.model,this._groups),e.renderEdges(this.model,this.routing,t,t?null:this.positions);for(let s of this._sel.values())s.kind==="edge"&&e.edgeEls.get(s.id)?.classList.add("fg-selected");if(this._hl.length)for(let s of this._hl)s.classList.add("fg-hl");this._exploreFocus()}_exploreFocus(){let t=this.renderer,e=this._ex,s=new Map;if(e){let o=new Set(this._explore.path);for(let[n,i]of e.childCount)s.set(n,{text:o.has(n)?"\u2212":String(i),open:o.has(n),title:`${i} ${i===1?"child":"children"}`})}for(let[o,n]of t.nodeEls)n.classList.toggle("fg-unfocused",!!e&&!e.focus.has(o));for(let o of this.model.edges)t.edgeEls.get(o.id)?.classList.toggle("fg-unfocused",!!e&&!(e.focus.has(o.source)&&e.focus.has(o.target))),t.labelEls.get(o.id)?.classList.toggle("fg-unfocused",!!e&&!(e.focus.has(o.source)&&e.focus.has(o.target)));t.renderBadges(s)}_exploreChrome(){let t=this.options,e=this.renderer.viewport;this.container.classList.toggle("fg-explore",!!t.explore),this.container.classList.toggle("fg-explore--blur",!!t.explore&&t.exploreUnfocused==="blur"),this.container.dataset.fgDirection=t.direction;let s=e.querySelector(":scope > .fg-breadcrumb");if(!t.explore||!t.exploreBreadcrumb){s?.remove();return}s||(s=document.createElement("nav"),s.className="fg-breadcrumb",s.setAttribute("aria-label","Explore path"),e.appendChild(s)),s.innerHTML="";let o=this._explore.path,n=(i,d,a)=>{let c=document.createElement("button");c.type="button",c.textContent=i,a&&c.setAttribute("aria-current","step"),c.addEventListener("click",h=>{h.stopPropagation(),this.setExplorePath(d)}),s.appendChild(c)};n(t.exploreStartText,[],!o.length),o.forEach((i,d)=>{let a=document.createElement("span");a.className="fg-breadcrumb__sep",a.textContent="\u203A",a.setAttribute("aria-hidden","true"),s.appendChild(a);let c=this._exIndex?.nodeById.get(i);n(String(c?.label??i),o.slice(0,d+1),d===o.length-1)})}_present(t,e){if(cancelAnimationFrame(this._anim),!t||!e||je()||!t.routing){this._render();return}let s=this.positions,o=this.options.animationDuration,n=performance.now(),i=a=>a<.5?4*a*a*a:1-Math.pow(-2*a+2,3)/2,d=a=>{let c=Math.min(1,(a-n)/o);if(c>=1){this._render(),this._emit("animationend");return}let h=i(c),p=new Map;for(let[g,f]of s){let l=this._ex?.parentOf.get(g)??(g.startsWith(W)?g.slice(W.length):null),u=t.positions.get(g)||l!=null&&t.positions.get(l)||f;p.set(g,{x:u.x+(f.x-u.x)*h,y:u.y+(f.y-u.y)*h,width:f.width,height:f.height})}this.renderer.placeNodes(this.model,p),this._groups=mt(this.model,{nodes:p}),this.renderer.renderGroups(this.model,this._groups),this.renderer.renderEdges(this.model,this.routing,ze(t.routing.paths,this.routing.paths,h)),this._anim=requestAnimationFrame(d)};this._anim=requestAnimationFrame(d)}_dragStart(t){cancelAnimationFrame(this._anim),this._dragSnap=this._canRecord()?this._capture("move"):null;let e=this._sel.has("node:"+t)?[...this._sel.values()].filter(n=>n.kind==="node"&&this.positions.has(n.id)).map(n=>n.id):[t],s=new Set(e);this._dragGroup=e.map(n=>{let i=this.positions.get(n);return{id:n,x:i.x,y:i.y}});let o=new Set(s);for(let n of this.model.edges)s.has(n.source)&&o.add(n.target),s.has(n.target)&&o.add(n.source);this._affected=new Set(this.model.edges.filter(n=>o.has(n.source)||o.has(n.target)).map(n=>n.id));for(let n of this._affected){let i=this.model.edgeById.get(n);if(s.has(i.source)||s.has(i.target)){let d=this.layoutEdges.get(n);d&&(d.waypoints=[])}}for(let n of e)this.renderer.nodeEls.get(n)?.classList.add("fg-node--dragging");this._emit("dragstart",{id:t,ids:[...e]})}_dragMove(t,e,s){let o=this.positions.get(t),n=this._dragGroup?.find(c=>c.id===t);if(!o||!n)return;let i=e-n.x,d=s-n.y,a=this.options.nodeMargin;for(let c of this._dragGroup){let h=this.positions.get(c.id);h.x=c.x+i,h.y=c.y+d;let p=this.model.nodeById.get(c.id);p.constraints.pinned&&(p.constraints.x=h.x,p.constraints.y=h.y);let g={x:h.x-a,y:h.y-a,width:h.width+2*a,height:h.height+2*a};if(this.routing)for(let[f,l]of this.routing.paths){if(this._affected.has(f))continue;let u=l.points;for(let m=0;m<u.length-1;m++)if(ht(u[m],u[m+1],g,1)){this._affected.add(f);break}}}this.routing=it(this.model,{nodes:this.positions,edges:this.layoutEdges},{only:this._affected,prev:this.routing}),this._render(),this._emit("drag",{id:t,x:e,y:s,ids:this._dragGroup.map(c=>c.id)})}_dragEnd(t){let e=this.positions.get(t),s=(this._dragGroup||[{id:t}]).map(o=>o.id);this._dragGroup=null,this._recDepth++;try{for(let o of s)this.renderer.nodeEls.get(o)?.classList.remove("fg-node--dragging"),this.options.pinOnDrag&&this.pin(o,!0)}finally{this._recDepth--}this._dragSnap&&(this._push(this._dragSnap),this._dragSnap=null),this._emit("dragend",{id:t,x:e.x,y:e.y,ids:s}),this._emit("change",this.exportState())}_boxSelect(t,e){let s=[];for(let[o,n]of this.positions)o.startsWith(W)||n.x<t.x+t.width&&t.x<n.x+n.width&&n.y<t.y+t.height&&t.y<n.y+n.height&&s.push({kind:"node",id:o});this.select([...e,...s])}_click(t,e){let s=this.options.multiSelect&&!!(e.ctrlKey||e.metaKey||e.shiftKey);if(!(t.kind==="node"&&this._ex&&!s&&this._exploreClick(t.id)))if(t.kind==="node"){if(t.id.startsWith(W))return;this.select({kind:"node",id:t.id},{toggle:s});let o=this.model.nodeById.get(t.id),n=this.getConnections(t.id);this.options.onNodeClick?.(o.data,e,n),this._emit("nodeclick",{node:o.data,event:e,previous:n.previous,next:n.next})}else if(t.kind==="edge"){this.select({kind:"edge",id:t.id},{toggle:s});let o=this.model.edgeById.get(t.id);this.options.onEdgeClick?.(o.data,e),this._emit("edgeclick",{edge:o.data,event:e})}else t.kind==="group"?this._emit("groupclick",{group:this.model.groupById.get(t.id)?.data,event:e}):(s||this.select(null),this.options.onBackgroundClick?.(e))}_exploreClick(t){if(t.startsWith(W)){let e=t.slice(W.length),s=this._explore.shown;return s.set(e,Math.max(this.options.exploreLimit,s.get(e)||0)+this.options.exploreLimit),this._relayoutKeeping(t),!0}return!this._exIndex.children.has(t)&&!this._explore.path.includes(t)||this.setExplorePath(Xe(this._explore.path,t,this._ex.parentOf)),!1}_escape(){if(this._sel.size>1||!(this._ex&&this._explore.path.length)){this.select(null);return}this.select(null),this.exploreBack()}_nodeExists(t){return this._exIndex&&this.options.explore?this._exIndex.nodeById.has(t):!!this.model?.nodeById.has(t)||(this.data.nodes||[]).some(e=>String(e.id)===t)}_pruneSelection(){let t=s=>s.kind==="edge"?(this.data.edges||[]).some((o,n)=>String(o.id??"e"+n)===s.id):this._nodeExists(s.id),e=[...this._sel].filter(([,s])=>!t(s));if(e.length){for(let[s]of e)this._sel.delete(s);this.select([...this._sel.values()])}else this._sel.size&&(this._paintSelection(),this._applyHighlight())}_canRecord(){return!!this.options.history&&!this._recDepth&&!this._restoring&&!!this.model}_record(t,e){if(!this._canRecord())return e();let s=this._capture(t);this._recDepth++;let o;try{o=e()}finally{this._recDepth--}return this._push(s),o}_push(t){this._undo.push(t);let e=Math.max(1,this.options.historyLimit|0);this._undo.length>e&&this._undo.splice(0,this._undo.length-e),this._redo=[],this._historyChanged("record",t.label)}_capture(t){let e={};if(this.routing)for(let[s,o]of this.routing.paths)e[s]=o.points.map(n=>[n.x,n.y]);return{label:t,data:this.data,opts:Object.fromEntries(te.map(s=>[s,this.options[s]])),positions:new Map([...this.positions].map(([s,o])=>[s,{...o}])),pins:new Map([...this.pins].map(([s,o])=>[s,{...o}])),expanded:[...this.renderer.expanded],layoutEdges:new Map([...this.layoutEdges].map(([s,o])=>[s,{...o,waypoints:(o.waypoints||[]).map(n=>({...n}))}])),edges:e}}async _step(t,e,s){await this._lastBuild;let o=t.pop();if(!o)return!1;e.push(this._capture(o.label)),this._restoring=!0;try{await this._restore(o)}finally{this._restoring=!1}return this._historyChanged(s,o.label),this._emit("change",this.exportState()),!0}async _restore(t){let e=this._snapshot();this.data=t.data;let s=te.filter(i=>this.options[i]!==t.opts[i]);for(let i of s)this.userOptions[i]=t.opts[i];s.length&&(this.options=yt(this.data.options,this.userOptions),this.renderer.options=this.options),this.renderer.expanded=new Set(t.expanded);let o=new Set((this.data.nodes||[]).map(i=>String(i.id))),n=this._explore.path.findIndex(i=>!o.has(i));n>=0&&(this._explore.path=this._explore.path.slice(0,n)),this.pins=new Map([...t.pins].map(([i,d])=>[i,{...d}])),this.positions=new Map([...t.positions].map(([i,d])=>[i,{...d}])),this.layoutEdges=new Map([...t.layoutEdges].map(([i,d])=>[i,{...d,waypoints:d.waypoints.map(a=>({...a}))}])),this._refreshView(),this._exploreChrome(),this.model=this._prepareModel(),this.model.nodes.some(i=>!this.positions.has(i.id))?await this._build({mode:"stable",animate:this.options.animate}):(this.routing=it(this.model,{nodes:this.positions,edges:this.layoutEdges}),Zt(this.model,this.routing,this.positions,t.edges),this.renderer.renderPorts(this.model),this._present(e,this.options.animate)),this._pruneSelection(),n>=0&&this._emit("explore",{path:[...this._explore.path]})}_historyChanged(t,e){let s=this._historyButtons;s&&(s.undo.disabled=!this._undo.length,s.redo.disabled=!this._redo.length),this._emit("history",{action:t,label:e,canUndo:this._undo.length>0,canRedo:this._redo.length>0,data:this.data})}_paintSelection(){let t=this.renderer;for(let e of t.viewport.querySelectorAll(".fg-selected"))e.classList.remove("fg-selected");for(let e of this._sel.values())(e.kind==="edge"?t.edgeEls:t.nodeEls).get(e.id)?.classList.add("fg-selected");t.world.classList.toggle("fg-multi",this._sel.size>1)}_selectionPayload(){let t=[],e=[];for(let s of this._sel.values())if(s.kind==="node"){let o=this.model?.nodeById.get(s.id)?.data??this._exIndex?.nodeById.get(s.id)??(this.data.nodes||[]).find(n=>String(n.id)===s.id);o&&t.push(o)}else{let o=this.model?.edgeById.get(s.id)?.data;o&&e.push(o)}return{items:this.getSelectedItems(),nodes:t,edges:e}}_contextMenu(t,e){let s=this.options,o,n;if(t.kind==="node"&&this.model?.nodeById.has(t.id)){let i=this.model.nodeById.get(t.id).data,d=this.getConnections(t.id);o={kind:"node",id:t.id,node:i,previous:d.previous,next:d.next,event:e},n=s.onNodeContextMenu&&(()=>s.onNodeContextMenu(i,e,d))}else if(t.kind==="edge"&&this.model?.edgeById.has(t.id)){let i=this.model.edgeById.get(t.id).data;o={kind:"edge",id:t.id,edge:i,event:e},n=s.onEdgeContextMenu&&(()=>s.onEdgeContextMenu(i,e))}else if(t.kind==="group"&&this.model?.groupById.has(t.id)){let i=this.model.groupById.get(t.id).data;o={kind:"group",id:t.id,group:i,event:e},n=s.onGroupContextMenu&&(()=>s.onGroupContextMenu(i,e))}else o={kind:"background",event:e},n=s.onBackgroundContextMenu&&(()=>s.onBackgroundContextMenu(e));o.selection=this.getSelectedItems(),(n||this._listeners.get("contextmenu")?.size)&&e.preventDefault(),n?.(),this._emit("contextmenu",o)}_hover(t){this._hovered=t||null,this._applyHighlight(),this._emit("hover",t?{kind:t.kind,id:t.id}:null)}_applyHighlight(){for(let n of this._hl)n.classList.remove("fg-hl");this._hl=[];let t=this.renderer,e=n=>!!(n.kind==="edge"?this.model?.edgeById:this.model?.nodeById)?.has(n.id),s=null;if(this._hovered&&e(this._hovered)?s=Et(this.model.edges,this._hovered,this.options.hoverHighlight):this.options.highlightSelection&&this._sel.size>1?s=Wn(this.model.edges,[...this._sel.values()].filter(e)):this.options.highlightSelection&&this.selected&&e(this.selected)&&(s=Et(this.model.edges,this.selected,this.options.hoverHighlight)),t.world.classList.toggle("fg-hovering",!!s),!s)return;let o=n=>{n&&(n.classList.add("fg-hl"),this._hl.push(n))};for(let n of s.nodes)o(t.nodeEls.get(n));for(let n of s.edges)o(t.edgeEls.get(n)),o(t.labelEls.get(n))}_controls(){let t=document.createElement("div");t.className="fg-controls";let e=(s,o,n)=>{let i=document.createElement("button");return i.type="button",i.textContent=s,i.title=o,i.setAttribute("aria-label",o),i.addEventListener("click",d=>{d.stopPropagation(),n()}),t.appendChild(i),i};if(e("+","Zoom in",()=>this.zoomBy(1.25)),e("\u2212","Zoom out",()=>this.zoomBy(.8)),e("\u2922","Fit to screen",()=>this.fit()),this.options.history){let s=e("\u21B6","Undo (Ctrl+Z)",()=>this.undo()),o=e("\u21B7","Redo (Ctrl+Shift+Z)",()=>this.redo());s.disabled=o.disabled=!0,s.classList.add("fg-controls__undo"),this._historyButtons={undo:s,redo:o}}this.renderer.viewport.appendChild(t)}},Qt=(r,t,e)=>Math.max(t,Math.min(e,r)),te=["direction","edgeRouting"],Zn=r=>r==null?null:typeof r=="string"||typeof r=="number"?{kind:"node",id:String(r)}:r.id!=null?{kind:r.kind==="edge"?"edge":"node",id:String(r.id)}:null,Ue=r=>r.map(t=>t.kind+":"+t.id).join("|");function Wn(r,t){let e=new Set,s=new Set;for(let n of t)if(n.kind==="node")e.add(n.id);else{let i=r.find(d=>d.id===n.id);i&&(s.add(i.id),e.add(i.source),e.add(i.target))}let o=new Set(t.filter(n=>n.kind==="node").map(n=>n.id));for(let n of r)o.has(n.source)&&o.has(n.target)&&s.add(n.id);return{nodes:e,edges:s}}var Ke=r=>Math.round(r*10)/10,Ye=r=>Math.round(r*100)/100;function Vn(r){let t=r.getBoundingClientRect();return[t.left+t.width/2,t.top+t.height/2]}export{Rt as DEFAULT_OPTIONS,gt as GraphValidationError,ee as GraphView,Xn as VERSION,kt as computeLayout,$s as createGraph,Te as edgePath,Rs as layoutGraph,Ge as metrics,$t as normalizeGraph,it as routeEdges,Wn as selectionHighlight};