diff --git a/public/app.js b/public/app.js index 0d22992..f089c19 100644 --- a/public/app.js +++ b/public/app.js @@ -1,6 +1,6 @@ import {t, initLanguage, getLocale} from './i18n.js'; import { chatName, messageDirection } from './chat-presentation.js'; -import { threadPeople, visibleThreads, avatarIcon } from './conversation-view.js'; +import { threadPeople, visibleThreads, conversationGraph, isDisabled, avatarIcon } from './conversation-view.js'; import { renderConversationGraph } from './conversation-graph.js'; import { connectionInstructions } from './connection-kit.js'; import { createChatSync } from './chat-sync.js'; @@ -720,9 +720,12 @@ function conversationSubtitle(thread) { } function renderGraph() { if (!state.me) return; - const scope = visibleThreads(state.threads, state.perspective); + const data = conversationGraph(state.threads, state.perspective, {principals:state.principals,showDisabled:$('#graph-show-disabled').checked}); + const scope = data.conversations; + if (state.graphPerson && !data.people.some(person => person.id === state.graphPerson)) state.graphPerson = null; + $('#graph-empty').hidden = data.people.length > 0; $('#graph-summary').textContent = t('{0} conversations · {1} groups · {2} direct chats', scope.length, scope.filter(t => t.kind !== 'direct').length, scope.filter(t => t.kind === 'direct').length) + ' · ' + t('{0} messages',scope.reduce((sum,thread)=>sum+Number(thread.message_count??0),0)); - state.graphController = renderConversationGraph($('#conversation-graph'), scope, { openThread: async id => { showView('conversations'); await selectThread(id); }, chooseAgent: id => { state.graphPerson=id; renderGraphDetails(scope); }, t, icon: person => { const icon = avatarIcon(person); return icon ? (icon.startsWith('/') ? appBase + icon : icon) : null; } }); + state.graphController = renderConversationGraph($('#conversation-graph'), data, { openThread: async id => { showView('conversations'); await selectThread(id); }, chooseAgent: id => { state.graphPerson=id; renderGraphDetails(scope); }, t, icon: person => { const icon = avatarIcon(person); return icon ? (icon.startsWith('/') ? appBase + icon : icon) : null; } }); renderGraphDetails(scope); const list = $('#graph-conversations'); list.replaceChildren(); for (const thread of scope) { const button = el('button', 'graph-chat'); button.append(conversationAvatar(thread), el('span', '', `${chatName(thread, null)} · ${thread.kind === 'direct' ? t('Direct chat') : t('Group chat')} · ${t('{0} messages',thread.message_count??0)}`)); button.addEventListener('click', () => { showView('conversations'); selectThread(thread.id); }); list.append(button); } @@ -732,7 +735,10 @@ function renderGraphDetails(scope){ panel.replaceChildren();panel.hidden=!person;if(!person)return; const chats=visibleThreads(scope,person.id),sent=chats.reduce((sum,chat)=>sum+Number(threadPeople(chat).find(p=>p.id===person.id)?.sent_count??0),0); const header=el('header'),close=el('button','icon-button','×');close.type='button';close.setAttribute('aria-label',t('Close details'));close.addEventListener('click',()=>{state.graphPerson=null;panel.hidden=true;}); - header.append(personAvatar(person),el('strong','',person.name),close);panel.append(header,el('p','',t('{0} conversations · {1} sent',chats.length,sent))); + const avatar=personAvatar(person);avatar.classList.toggle('disabled-avatar',isDisabled(person)); + header.append(avatar,el('strong','',person.name),close);panel.append(header); + if(isDisabled(person))panel.append(el('span','badge off',t('Disabled'))); + panel.append(el('p','',t('{0} conversations · {1} sent',chats.length,sent))); for(const chat of chats){const button=el('button','graph-detail-chat');button.type='button';button.append(conversationAvatar(chat),el('span','',chatName(chat,null)),el('small','',t('{0} messages',chat.message_count??0)));button.addEventListener('click',()=>{showView('conversations');selectThread(chat.id).catch(error=>toast(error.message));});panel.append(button);} } @@ -771,5 +777,6 @@ document.addEventListener("agentpeerchat:languagechange",()=>{ }); $('#graph-fit').addEventListener('click',()=>state.graphController?.fit()); +$('#graph-show-disabled').addEventListener('change',renderGraph); $('#graph-zoom-in').addEventListener('click',()=>state.graphController?.zoom(1.3)); $('#graph-zoom-out').addEventListener('click',()=>state.graphController?.zoom(1/1.3)); diff --git a/public/conversation-graph.js b/public/conversation-graph.js index eecaed4..90c6b7d 100644 --- a/public/conversation-graph.js +++ b/public/conversation-graph.js @@ -1,7 +1,7 @@ -var We="http://www.w3.org/1999/xhtml",Lr={svg:"http://www.w3.org/2000/svg",xhtml:We,xlink:"http://www.w3.org/1999/xlink",xml:"http://www.w3.org/XML/1998/namespace",xmlns:"http://www.w3.org/2000/xmlns/"};function St(e){var r=e+="",n=r.indexOf(":");return n>=0&&(r=e.slice(0,n))!=="xmlns"&&(e=e.slice(n+1)),Lr.hasOwnProperty(r)?{space:Lr[r],local:e}:e}function Bs(e){return function(){var r=this.ownerDocument,n=this.namespaceURI;return n===We&&r.documentElement.namespaceURI===We?r.createElement(e):r.createElementNS(n,e)}}function Hs(e){return function(){return this.ownerDocument.createElementNS(e.space,e.local)}}function Ve(e){var r=St(e);return(r.local?Hs:Bs)(r)}function $s(){}function Ut(e){return e==null?$s:function(){return this.querySelector(e)}}function Ln(e){typeof e!="function"&&(e=Ut(e));for(var r=this._groups,n=r.length,i=new Array(n),o=0;o=C&&(C=w+1);!(y=_[C])&&++C=0;)(s=i[o])&&(a&&s.compareDocumentPosition(a)^4&&a.parentNode.insertBefore(s,a),a=s);return this}function Zn(e){e||(e=nf);function r(p,h){return p&&h?e(p.__data__,h.__data__):!p-!h}for(var n=this._groups,i=n.length,o=new Array(i),a=0;ar?1:e>=r?0:NaN}function Kn(){var e=arguments[0];return arguments[0]=this,e.apply(null,arguments),this}function Qn(){return Array.from(this)}function Jn(){for(var e=this._groups,r=0,n=e.length;r1?this.each((r==null?cf:typeof r=="function"?pf:hf)(e,r,n??"")):Et(this.node(),e)}function Et(e,r){return e.style.getPropertyValue(r)||Ze(e).getComputedStyle(e,null).getPropertyValue(r)}function df(e){return function(){delete this[e]}}function mf(e,r){return function(){this[e]=r}}function gf(e,r){return function(){var n=r.apply(this,arguments);n==null?delete this[e]:this[e]=n}}function oi(e,r){return arguments.length>1?this.each((r==null?df:typeof r=="function"?gf:mf)(e,r)):this.node()[e]}function ai(e){return e.trim().split(/^|\s+/)}function Ur(e){return e.classList||new si(e)}function si(e){this._node=e,this._names=ai(e.getAttribute("class")||"")}si.prototype={add:function(e){var r=this._names.indexOf(e);r<0&&(this._names.push(e),this._node.setAttribute("class",this._names.join(" ")))},remove:function(e){var r=this._names.indexOf(e);r>=0&&(this._names.splice(r,1),this._node.setAttribute("class",this._names.join(" ")))},contains:function(e){return this._names.indexOf(e)>=0}};function fi(e,r){for(var n=Ur(e),i=-1,o=r.length;++i=0&&(n=r.slice(i+1),r=r.slice(0,i)),{type:r,name:n}})}function Rf(e){return function(){var r=this.__on;if(r){for(var n=0,i=-1,o=r.length,a;n{}};function Mi(){for(var e=0,r=arguments.length,n={},i;e=0&&(i=n.slice(o+1),n=n.slice(0,o)),n&&!r.hasOwnProperty(n))throw new Error("unknown type: "+n);return{type:n,name:i}})}Ke.prototype=Mi.prototype={constructor:Ke,on:function(e,r){var n=this._,i=Uf(e+"",n),o,a=-1,s=i.length;if(arguments.length<2){for(;++a0)for(var n=new Array(o),i=0,o,a;i()=>e;function ge(e,{sourceEvent:r,subject:n,target:i,identifier:o,active:a,x:s,y:f,dx:u,dy:l,dispatch:c}){Object.defineProperties(this,{type:{value:e,enumerable:!0,configurable:!0},sourceEvent:{value:r,enumerable:!0,configurable:!0},subject:{value:n,enumerable:!0,configurable:!0},target:{value:i,enumerable:!0,configurable:!0},identifier:{value:o,enumerable:!0,configurable:!0},active:{value:a,enumerable:!0,configurable:!0},x:{value:s,enumerable:!0,configurable:!0},y:{value:f,enumerable:!0,configurable:!0},dx:{value:u,enumerable:!0,configurable:!0},dy:{value:l,enumerable:!0,configurable:!0},_:{value:c}})}ge.prototype.on=function(){var e=this._.on.apply(this._,arguments);return e===this._?this:e};function Bf(e){return!e.ctrlKey&&!e.button}function Hf(){return this.parentNode}function $f(e,r){return r??{x:e.x,y:e.y}}function Gf(){return navigator.maxTouchPoints||"ontouchstart"in this}function Br(){var e=Bf,r=Hf,n=$f,i=Gf,o={},a=Mt("start","drag","end"),s=0,f,u,l,c,p=0;function h(v){v.on("mousedown.drag",d).filter(i).on("touchstart.drag",_).on("touchmove.drag",g,Pi).on("touchend.drag touchcancel.drag",w).style("touch-action","none").style("-webkit-tap-highlight-color","rgba(0,0,0,0)")}function d(v,y){if(!(c||!e.call(this,v,y))){var b=C(this,r.call(this,v,y),v,y,"mouse");b&&(K(v.view).on("mousemove.drag",m,qt).on("mouseup.drag",x,qt),pe(v.view),Qe(v),l=!1,f=v.clientX,u=v.clientY,b("start",v))}}function m(v){if(It(v),!l){var y=v.clientX-f,b=v.clientY-u;l=y*y+b*b>p}o.mouse("drag",v)}function x(v){K(v.view).on("mousemove.drag mouseup.drag",null),de(v.view,l),It(v),o.mouse("end",v)}function _(v,y){if(e.call(this,v,y)){var b=v.changedTouches,A=r.call(this,v,y),S=b.length,T,z;for(T=0;T>8&15|r>>4&240,r>>4&15|r&240,(r&15)<<4|r&15,1):n===8?tr(r>>24&255,r>>16&255,r>>8&255,(r&255)/255):n===4?tr(r>>12&15|r>>8&240,r>>8&15|r>>4&240,r>>4&15|r&240,((r&15)<<4|r&15)/255):null):(r=Vf.exec(e))?new st(r[1],r[2],r[3],1):(r=Yf.exec(e))?new st(r[1]*255/100,r[2]*255/100,r[3]*255/100,1):(r=Xf.exec(e))?tr(r[1],r[2],r[3],r[4]):(r=Zf.exec(e))?tr(r[1]*255/100,r[2]*255/100,r[3]*255/100,r[4]):(r=Kf.exec(e))?Ni(r[1],r[2]/100,r[3]/100,1):(r=Qf.exec(e))?Ni(r[1],r[2]/100,r[3]/100,r[4]):Ti.hasOwnProperty(e)?Ei(Ti[e]):e==="transparent"?new st(NaN,NaN,NaN,0):null}function Ei(e){return new st(e>>16&255,e>>8&255,e&255,1)}function tr(e,r,n,i){return i<=0&&(e=r=n=NaN),new st(e,r,n,i)}function el(e){return e instanceof _e||(e=Rt(e)),e?(e=e.rgb(),new st(e.r,e.g,e.b,e.opacity)):new st}function te(e,r,n,i){return arguments.length===1?el(e):new st(e,r,n,i??1)}function st(e,r,n,i){this.r=+e,this.g=+r,this.b=+n,this.opacity=+i}Je(st,te,Hr(_e,{brighter(e){return e=e==null?rr:Math.pow(rr,e),new st(this.r*e,this.g*e,this.b*e,this.opacity)},darker(e){return e=e==null?xe:Math.pow(xe,e),new st(this.r*e,this.g*e,this.b*e,this.opacity)},rgb(){return this},clamp(){return new st(Ht(this.r),Ht(this.g),Ht(this.b),nr(this.opacity))},displayable(){return-.5<=this.r&&this.r<255.5&&-.5<=this.g&&this.g<255.5&&-.5<=this.b&&this.b<255.5&&0<=this.opacity&&this.opacity<=1},hex:Ii,formatHex:Ii,formatHex8:rl,formatRgb:Ri,toString:Ri}));function Ii(){return`#${Bt(this.r)}${Bt(this.g)}${Bt(this.b)}`}function rl(){return`#${Bt(this.r)}${Bt(this.g)}${Bt(this.b)}${Bt((isNaN(this.opacity)?1:this.opacity)*255)}`}function Ri(){let e=nr(this.opacity);return`${e===1?"rgb(":"rgba("}${Ht(this.r)}, ${Ht(this.g)}, ${Ht(this.b)}${e===1?")":`, ${e})`}`}function nr(e){return isNaN(e)?1:Math.max(0,Math.min(1,e))}function Ht(e){return Math.max(0,Math.min(255,Math.round(e)||0))}function Bt(e){return e=Ht(e),(e<16?"0":"")+e.toString(16)}function Ni(e,r,n,i){return i<=0?e=r=n=NaN:n<=0||n>=1?e=r=NaN:r<=0&&(e=NaN),new gt(e,r,n,i)}function ji(e){if(e instanceof gt)return new gt(e.h,e.s,e.l,e.opacity);if(e instanceof _e||(e=Rt(e)),!e)return new gt;if(e instanceof gt)return e;e=e.rgb();var r=e.r/255,n=e.g/255,i=e.b/255,o=Math.min(r,n,i),a=Math.max(r,n,i),s=NaN,f=a-o,u=(a+o)/2;return f?(r===a?s=(n-i)/f+(n0&&u<1?0:s,new gt(s,f,u,e.opacity)}function Li(e,r,n,i){return arguments.length===1?ji(e):new gt(e,r,n,i??1)}function gt(e,r,n,i){this.h=+e,this.s=+r,this.l=+n,this.opacity=+i}Je(gt,Li,Hr(_e,{brighter(e){return e=e==null?rr:Math.pow(rr,e),new gt(this.h,this.s,this.l*e,this.opacity)},darker(e){return e=e==null?xe:Math.pow(xe,e),new gt(this.h,this.s,this.l*e,this.opacity)},rgb(){var e=this.h%360+(this.h<0)*360,r=isNaN(e)||isNaN(this.s)?0:this.s,n=this.l,i=n+(n<.5?n:1-n)*r,o=2*n-i;return new st($r(e>=240?e-240:e+120,o,i),$r(e,o,i),$r(e<120?e+240:e-120,o,i),this.opacity)},clamp(){return new gt(Di(this.h),er(this.s),er(this.l),nr(this.opacity))},displayable(){return(0<=this.s&&this.s<=1||isNaN(this.s))&&0<=this.l&&this.l<=1&&0<=this.opacity&&this.opacity<=1},formatHsl(){let e=nr(this.opacity);return`${e===1?"hsl(":"hsla("}${Di(this.h)}, ${er(this.s)*100}%, ${er(this.l)*100}%${e===1?")":`, ${e})`}`}}));function Di(e){return e=(e||0)%360,e<0?e+360:e}function er(e){return Math.max(0,Math.min(1,e||0))}function $r(e,r,n){return(e<60?r+(n-r)*e/60:e<180?n:e<240?r+(n-r)*(240-e)/60:r)*255}function Gr(e,r,n,i,o){var a=e*e,s=a*e;return((1-3*e+3*a-s)*r+(4-6*a+3*s)*n+(1+3*e+3*a-3*s)*i+s*o)/6}function Fi(e){var r=e.length-1;return function(n){var i=n<=0?n=0:n>=1?(n=1,r-1):Math.floor(n*r),o=e[i],a=e[i+1],s=i>0?e[i-1]:2*o-a,f=i()=>e;function nl(e,r){return function(n){return e+n*r}}function il(e,r,n){return e=Math.pow(e,n),r=Math.pow(r,n)-e,n=1/n,function(i){return Math.pow(e+i*r,n)}}function qi(e){return(e=+e)==1?ir:function(r,n){return n-r?il(r,n,e):Wr(isNaN(r)?n:r)}}function ir(e,r){var n=r-e;return n?nl(e,n):Wr(isNaN(e)?r:e)}var or=(function e(r){var n=qi(r);function i(o,a){var s=n((o=te(o)).r,(a=te(a)).r),f=n(o.g,a.g),u=n(o.b,a.b),l=ir(o.opacity,a.opacity);return function(c){return o.r=s(c),o.g=f(c),o.b=u(c),o.opacity=l(c),o+""}}return i.gamma=e,i})(1);function Bi(e){return function(r){var n=r.length,i=new Array(n),o=new Array(n),a=new Array(n),s,f;for(s=0;sn&&(a=r.slice(n,a),f[s]?f[s]+=a:f[++s]=a),(i=i[0])===(o=o[0])?f[s]?f[s]+=o:f[++s]=o:(f[++s]=null,u.push({i:s,x:ct(i,o)})),n=Vr.lastIndex;return n180?c+=360:c-l>180&&(l+=360),h.push({i:p.push(o(p)+"rotate(",null,i)-2,x:ct(l,c)})):c&&p.push(o(p)+"rotate("+c+i)}function f(l,c,p,h){l!==c?h.push({i:p.push(o(p)+"skewX(",null,i)-2,x:ct(l,c)}):c&&p.push(o(p)+"skewX("+c+i)}function u(l,c,p,h,d,m){if(l!==p||c!==h){var x=d.push(o(d)+"scale(",null,",",null,")");m.push({i:x-4,x:ct(l,p)},{i:x-2,x:ct(c,h)})}else(p!==1||h!==1)&&d.push(o(d)+"scale("+p+","+h+")")}return function(l,c){var p=[],h=[];return l=e(l),c=e(c),a(l.translateX,l.translateY,c.translateX,c.translateY,p,h),s(l.rotate,c.rotate,p,h),f(l.skewX,c.skewX,p,h),u(l.scaleX,l.scaleY,c.scaleX,c.scaleY,p,h),l=c=null,function(d){for(var m=-1,x=h.length,_;++m=0&&e._call.call(void 0,r),e=e._next;--ee}function Yi(){$t=(lr=ke.now())+ur,ee=be=0;try{Ki()}finally{ee=0,dl(),$t=0}}function pl(){var e=ke.now(),r=e-lr;r>Xi&&(ur-=r,lr=e)}function dl(){for(var e,r=fr,n,i=1/0;r;)r._call?(i>r._time&&(i=r._time),e=r,r=r._next):(n=r._next,r._next=null,r=e?e._next=n:fr=n);we=e,tn(i)}function tn(e){if(!ee){be&&(be=clearTimeout(be));var r=e-$t;r>24?(e<1/0&&(be=setTimeout(Yi,e-ke.now()-ur)),ve&&(ve=clearInterval(ve))):(ve||(lr=ke.now(),ve=setInterval(pl,Xi)),ee=1,Zi(Yi))}}function cr(e,r,n){var i=new Ae;return r=r==null?0:+r,i.restart(o=>{i.stop(),e(o+r)},r,n),i}var ml=Mt("start","end","cancel","interrupt"),gl=[],to=0,Qi=1,pr=2,hr=3,Ji=4,dr=5,Ce=6;function Nt(e,r,n,i,o,a){var s=e.__transition;if(!s)e.__transition={};else if(n in s)return;xl(e,n,{name:r,index:i,group:o,on:ml,tween:gl,time:a.time,delay:a.delay,duration:a.duration,ease:a.ease,timer:null,state:to})}function Me(e,r){var n=Z(e,r);if(n.state>to)throw new Error("too late; already scheduled");return n}function J(e,r){var n=Z(e,r);if(n.state>hr)throw new Error("too late; already running");return n}function Z(e,r){var n=e.__transition;if(!n||!(n=n[r]))throw new Error("transition not found");return n}function xl(e,r,n){var i=e.__transition,o;i[r]=n,n.timer=re(a,0,n.time);function a(l){n.state=Qi,n.timer.restart(s,n.delay,n.time),n.delay<=l&&s(l-n.delay)}function s(l){var c,p,h,d;if(n.state!==Qi)return u();for(c in i)if(d=i[c],d.name===n.name){if(d.state===hr)return cr(s);d.state===Ji?(d.state=Ce,d.timer.stop(),d.on.call("interrupt",e,e.__data__,d.index,d.group),delete i[c]):+cpr&&i.state=0&&(r=r.slice(0,n)),!r||r==="start"})}function jl(e,r,n){var i,o,a=Dl(r)?Me:J;return function(){var s=a(this,e),f=s.on;f!==i&&(o=(i=f).copy()).on(r,n),s.on=o}}function co(e,r){var n=this._id;return arguments.length<2?Z(this.node(),n).on.on(e):this.each(jl(n,e,r))}function Ll(e){return function(){var r=this.parentNode;for(var n in this.__transition)if(+n!==e)return;r&&r.removeChild(this)}}function ho(){return this.on("end.remove",Ll(this._id))}function po(e){var r=this._name,n=this._id;typeof e!="function"&&(e=Ut(e));for(var i=this._groups,o=i.length,a=new Array(o),s=0;s()=>e;function en(e,{sourceEvent:r,target:n,transform:i,dispatch:o}){Object.defineProperties(this,{type:{value:e,enumerable:!0,configurable:!0},sourceEvent:{value:r,enumerable:!0,configurable:!0},target:{value:n,enumerable:!0,configurable:!0},transform:{value:i,enumerable:!0,configurable:!0},_:{value:o}})}function xt(e,r,n){this.k=e,this.x=r,this.y=n}xt.prototype={constructor:xt,scale:function(e){return e===1?this:new xt(this.k*e,this.x,this.y)},translate:function(e,r){return e===0&r===0?this:new xt(this.k,this.x+this.k*e,this.y+this.k*r)},apply:function(e){return[e[0]*this.k+this.x,e[1]*this.k+this.y]},applyX:function(e){return e*this.k+this.x},applyY:function(e){return e*this.k+this.y},invert:function(e){return[(e[0]-this.x)/this.k,(e[1]-this.y)/this.k]},invertX:function(e){return(e-this.x)/this.k},invertY:function(e){return(e-this.y)/this.k},rescaleX:function(e){return e.copy().domain(e.range().map(this.invertX,this).map(e.invert,e))},rescaleY:function(e){return e.copy().domain(e.range().map(this.invertY,this).map(e.invert,e))},toString:function(){return"translate("+this.x+","+this.y+") scale("+this.k+")"}};var Te=new xt(1,0,0);lt.prototype=xt.prototype;function lt(e){for(;!e.__zoom;)if(!(e=e.parentNode))return Te;return e.__zoom}function yr(e){e.stopImmediatePropagation()}function ie(e){e.preventDefault(),e.stopImmediatePropagation()}function Jl(e){return(!e.ctrlKey||e.type==="wheel")&&!e.button}function tu(){var e=this;return e instanceof SVGElement?(e=e.ownerSVGElement||e,e.hasAttribute("viewBox")?(e=e.viewBox.baseVal,[[e.x,e.y],[e.x+e.width,e.y+e.height]]):[[0,0],[e.width.baseVal.value,e.height.baseVal.value]]):[[0,0],[e.clientWidth,e.clientHeight]]}function Co(){return this.__zoom||Te}function eu(e){return-e.deltaY*(e.deltaMode===1?.05:e.deltaMode?1:.002)*(e.ctrlKey?10:1)}function ru(){return navigator.maxTouchPoints||"ontouchstart"in this}function nu(e,r,n){var i=e.invertX(r[0][0])-n[0][0],o=e.invertX(r[1][0])-n[1][0],a=e.invertY(r[0][1])-n[0][1],s=e.invertY(r[1][1])-n[1][1];return e.translate(o>i?(i+o)/2:Math.min(0,i)||Math.max(0,o),s>a?(a+s)/2:Math.min(0,a)||Math.max(0,s))}function rn(){var e=Jl,r=tu,n=nu,i=eu,o=ru,a=[0,1/0],s=[[-1/0,-1/0],[1/0,1/0]],f=250,u=Jr,l=Mt("start","zoom","end"),c,p,h,d=500,m=150,x=0,_=10;function g(k){k.property("__zoom",Co).on("wheel.zoom",S,{passive:!1}).on("mousedown.zoom",T).on("dblclick.zoom",z).filter(o).on("touchstart.zoom",O).on("touchmove.zoom",I).on("touchend.zoom touchcancel.zoom",U).style("-webkit-tap-highlight-color","rgba(0,0,0,0)")}g.transform=function(k,E,M,R){var L=k.selection?k.selection():k;L.property("__zoom",Co),k!==L?y(k,E,M,R):L.interrupt().each(function(){b(this,arguments).event(R).start().zoom(null,typeof E=="function"?E.apply(this,arguments):E).end()})},g.scaleBy=function(k,E,M,R){g.scaleTo(k,function(){var L=this.__zoom.k,D=typeof E=="function"?E.apply(this,arguments):E;return L*D},M,R)},g.scaleTo=function(k,E,M,R){g.transform(k,function(){var L=r.apply(this,arguments),D=this.__zoom,F=M==null?v(L):typeof M=="function"?M.apply(this,arguments):M,j=D.invert(F),q=typeof E=="function"?E.apply(this,arguments):E;return n(C(w(D,q),F,j),L,s)},M,R)},g.translateBy=function(k,E,M,R){g.transform(k,function(){return n(this.__zoom.translate(typeof E=="function"?E.apply(this,arguments):E,typeof M=="function"?M.apply(this,arguments):M),r.apply(this,arguments),s)},null,R)},g.translateTo=function(k,E,M,R,L){g.transform(k,function(){var D=r.apply(this,arguments),F=this.__zoom,j=R==null?v(D):typeof R=="function"?R.apply(this,arguments):R;return n(Te.translate(j[0],j[1]).scale(F.k).translate(typeof E=="function"?-E.apply(this,arguments):-E,typeof M=="function"?-M.apply(this,arguments):-M),D,s)},R,L)};function w(k,E){return E=Math.max(a[0],Math.min(a[1],E)),E===k.k?k:new xt(E,k.x,k.y)}function C(k,E,M){var R=E[0]-M[0]*k.k,L=E[1]-M[1]*k.k;return R===k.x&&L===k.y?k:new xt(k.k,R,L)}function v(k){return[(+k[0][0]+ +k[1][0])/2,(+k[0][1]+ +k[1][1])/2]}function y(k,E,M,R){k.on("start.zoom",function(){b(this,arguments).event(R).start()}).on("interrupt.zoom end.zoom",function(){b(this,arguments).event(R).end()}).tween("zoom",function(){var L=this,D=arguments,F=b(L,D).event(R),j=r.apply(L,D),q=M==null?v(j):typeof M=="function"?M.apply(L,D):M,Y=Math.max(j[1][0]-j[0][0],j[1][1]-j[0][1]),$=L.__zoom,V=typeof E=="function"?E.apply(L,D):E,kt=u($.invert(q).concat(Y/$.k),V.invert(q).concat(Y/V.k));return function(mt){if(mt===1)mt=V;else{var At=kt(mt),jr=Y/At[2];mt=new xt(jr,q[0]-At[0]*jr,q[1]-At[1]*jr)}F.zoom(null,mt)}})}function b(k,E,M){return!M&&k.__zooming||new A(k,E)}function A(k,E){this.that=k,this.args=E,this.active=0,this.sourceEvent=null,this.extent=r.apply(k,E),this.taps=0}A.prototype={event:function(k){return k&&(this.sourceEvent=k),this},start:function(){return++this.active===1&&(this.that.__zooming=this,this.emit("start")),this},zoom:function(k,E){return this.mouse&&k!=="mouse"&&(this.mouse[1]=E.invert(this.mouse[0])),this.touch0&&k!=="touch"&&(this.touch0[1]=E.invert(this.touch0[0])),this.touch1&&k!=="touch"&&(this.touch1[1]=E.invert(this.touch1[0])),this.that.__zoom=E,this.emit("zoom"),this},end:function(){return--this.active===0&&(delete this.that.__zooming,this.emit("end")),this},emit:function(k){var E=K(this.that).datum();l.call(k,this.that,new en(k,{sourceEvent:this.sourceEvent,target:g,type:k,transform:this.that.__zoom,dispatch:l}),E)}};function S(k,...E){if(!e.apply(this,arguments))return;var M=b(this,E).event(k),R=this.__zoom,L=Math.max(a[0],Math.min(a[1],R.k*Math.pow(2,i.apply(this,arguments)))),D=at(k);if(M.wheel)(M.mouse[0][0]!==D[0]||M.mouse[0][1]!==D[1])&&(M.mouse[1]=R.invert(M.mouse[0]=D)),clearTimeout(M.wheel);else{if(R.k===L)return;M.mouse=[D,R.invert(D)],Gt(this),M.start()}ie(k),M.wheel=setTimeout(F,m),M.zoom("mouse",n(C(w(R,L),M.mouse[0],M.mouse[1]),M.extent,s));function F(){M.wheel=null,M.end()}}function T(k,...E){if(h||!e.apply(this,arguments))return;var M=k.currentTarget,R=b(this,E,!0).event(k),L=K(k.view).on("mousemove.zoom",q,!0).on("mouseup.zoom",Y,!0),D=at(k,M),F=k.clientX,j=k.clientY;pe(k.view),yr(k),R.mouse=[D,this.__zoom.invert(D)],Gt(this),R.start();function q($){if(ie($),!R.moved){var V=$.clientX-F,kt=$.clientY-j;R.moved=V*V+kt*kt>x}R.event($).zoom("mouse",n(C(R.that.__zoom,R.mouse[0]=at($,M),R.mouse[1]),R.extent,s))}function Y($){L.on("mousemove.zoom mouseup.zoom",null),de($.view,R.moved),ie($),R.event($).end()}}function z(k,...E){if(e.apply(this,arguments)){var M=this.__zoom,R=at(k.changedTouches?k.changedTouches[0]:k,this),L=M.invert(R),D=M.k*(k.shiftKey?.5:2),F=n(C(w(M,D),R,L),r.apply(this,E),s);ie(k),f>0?K(this).transition().duration(f).call(y,F,R,k):K(this).call(g.transform,F,R,k)}}function O(k,...E){if(e.apply(this,arguments)){var M=k.touches,R=M.length,L=b(this,E,k.changedTouches.length===R).event(k),D,F,j,q;for(yr(k),F=0;F=i)&&(n=i);else{let i=-1;for(let o of e)(o=r(o,++i,e))!=null&&(n=o)&&(n=o)}return n}function Oe(e,r){let n;if(r===void 0)for(let i of e)i!=null&&(n>i||n===void 0&&i>=i)&&(n=i);else{let i=-1;for(let o of e)(o=r(o,++i,e))!=null&&(n>o||n===void 0&&o>=o)&&(n=o)}return n}function _r(e,r){let n=0;if(r===void 0)for(let i of e)(i=+i)&&(n+=i);else{let i=-1;for(let o of e)(o=+r(o,++i,e))&&(n+=o)}return n}var su=typeof global=="object"&&global&&global.Object===Object&&global,Po=su;var fu=typeof self=="object"&&self&&self.Object===Object&&self,lu=Po||fu||Function("return this")(),vr=lu;var uu=vr.Symbol,ae=uu;var To=Object.prototype,cu=To.hasOwnProperty,hu=To.toString,Ee=ae?ae.toStringTag:void 0;function pu(e){var r=cu.call(e,Ee),n=e[Ee];try{e[Ee]=void 0;var i=!0}catch{}var o=hu.call(e);return i&&(r?e[Ee]=n:delete e[Ee]),o}var zo=pu;var du=Object.prototype,mu=du.toString;function gu(e){return mu.call(e)}var Oo=gu;var xu="[object Null]",yu="[object Undefined]",Eo=ae?ae.toStringTag:void 0;function _u(e){return e==null?e===void 0?yu:xu:Eo&&Eo in Object(e)?zo(e):Oo(e)}var Io=_u;function vu(e){return e!=null&&typeof e=="object"}var Ro=vu;var bu="[object Symbol]";function wu(e){return typeof e=="symbol"||Ro(e)&&Io(e)==bu}var No=wu;var ku=/\s/;function Au(e){for(var r=e.length;r--&&ku.test(e.charAt(r)););return r}var Do=Au;var Su=/^\s+/;function Cu(e){return e&&e.slice(0,Do(e)+1).replace(Su,"")}var jo=Cu;function Mu(e){var r=typeof e;return e!=null&&(r=="object"||r=="function")}var Wt=Mu;var Lo=NaN,Pu=/^[-+]0x[0-9a-f]+$/i,Tu=/^0b[01]+$/i,zu=/^0o[0-7]+$/i,Ou=parseInt;function Eu(e){if(typeof e=="number")return e;if(No(e))return Lo;if(Wt(e)){var r=typeof e.valueOf=="function"?e.valueOf():e;e=Wt(r)?r+"":r}if(typeof e!="string")return e===0?e:+e;e=jo(e);var n=Tu.test(e);return n||zu.test(e)?Ou(e.slice(2),n?2:8):Pu.test(e)?Lo:+e}var nn=Eu;var Iu=function(){return vr.Date.now()},br=Iu;var Ru="Expected a function",Nu=Math.max,Du=Math.min;function ju(e,r,n){var i,o,a,s,f,u,l=0,c=!1,p=!1,h=!0;if(typeof e!="function")throw new TypeError(Ru);r=nn(r)||0,Wt(n)&&(c=!!n.leading,p="maxWait"in n,a=p?Nu(nn(n.maxWait)||0,r):a,h="trailing"in n?!!n.trailing:h);function d(b){var A=i,S=o;return i=o=void 0,l=b,s=e.apply(S,A),s}function m(b){return l=b,f=setTimeout(g,r),c?d(b):s}function x(b){var A=b-u,S=b-l,T=r-A;return p?Du(T,a-S):T}function _(b){var A=b-u,S=b-l;return u===void 0||A>=r||A<0||p&&S>=a}function g(){var b=br();if(_(b))return w(b);f=setTimeout(g,x(b))}function w(b){return f=void 0,h&&i?d(b):(i=o=void 0,s)}function C(){f!==void 0&&clearTimeout(f),l=0,i=u=o=f=void 0}function v(){return f===void 0?s:w(br())}function y(){var b=br(),A=_(b);if(i=arguments,o=this,u=b,A){if(f===void 0)return m(u);if(p)return clearTimeout(f),f=setTimeout(g,r),d(u)}return f===void 0&&(f=setTimeout(g,r)),s}return y.cancel=C,y.flush=v,y}var wr=ju;var Lu="Expected a function";function Fu(e,r,n){var i=!0,o=!0;if(typeof e!="function")throw new TypeError(Lu);return Wt(n)&&(i="leading"in n?!!n.leading:i,o="trailing"in n?!!n.trailing:o),wr(e,r,{leading:i,maxWait:r,trailing:o})}var on=Fu;var Dt=Object.freeze({Linear:Object.freeze({None:function(e){return e},In:function(e){return e},Out:function(e){return e},InOut:function(e){return e}}),Quadratic:Object.freeze({In:function(e){return e*e},Out:function(e){return e*(2-e)},InOut:function(e){return(e*=2)<1?.5*e*e:-.5*(--e*(e-2)-1)}}),Cubic:Object.freeze({In:function(e){return e*e*e},Out:function(e){return--e*e*e+1},InOut:function(e){return(e*=2)<1?.5*e*e*e:.5*((e-=2)*e*e+2)}}),Quartic:Object.freeze({In:function(e){return e*e*e*e},Out:function(e){return 1- --e*e*e*e},InOut:function(e){return(e*=2)<1?.5*e*e*e*e:-.5*((e-=2)*e*e*e-2)}}),Quintic:Object.freeze({In:function(e){return e*e*e*e*e},Out:function(e){return--e*e*e*e*e+1},InOut:function(e){return(e*=2)<1?.5*e*e*e*e*e:.5*((e-=2)*e*e*e*e+2)}}),Sinusoidal:Object.freeze({In:function(e){return 1-Math.sin((1-e)*Math.PI/2)},Out:function(e){return Math.sin(e*Math.PI/2)},InOut:function(e){return .5*(1-Math.sin(Math.PI*(.5-e)))}}),Exponential:Object.freeze({In:function(e){return e===0?0:Math.pow(1024,e-1)},Out:function(e){return e===1?1:1-Math.pow(2,-10*e)},InOut:function(e){return e===0?0:e===1?1:(e*=2)<1?.5*Math.pow(1024,e-1):.5*(-Math.pow(2,-10*(e-1))+2)}}),Circular:Object.freeze({In:function(e){return 1-Math.sqrt(1-e*e)},Out:function(e){return Math.sqrt(1- --e*e)},InOut:function(e){return(e*=2)<1?-.5*(Math.sqrt(1-e*e)-1):.5*(Math.sqrt(1-(e-=2)*e)+1)}}),Elastic:Object.freeze({In:function(e){return e===0?0:e===1?1:-Math.pow(2,10*(e-1))*Math.sin((e-1.1)*5*Math.PI)},Out:function(e){return e===0?0:e===1?1:Math.pow(2,-10*e)*Math.sin((e-.1)*5*Math.PI)+1},InOut:function(e){return e===0?0:e===1?1:(e*=2,e<1?-.5*Math.pow(2,10*(e-1))*Math.sin((e-1.1)*5*Math.PI):.5*Math.pow(2,-10*(e-1))*Math.sin((e-1.1)*5*Math.PI)+1)}}),Back:Object.freeze({In:function(e){var r=1.70158;return e===1?1:e*e*((r+1)*e-r)},Out:function(e){var r=1.70158;return e===0?0:--e*e*((r+1)*e+r)+1},InOut:function(e){var r=2.5949095;return(e*=2)<1?.5*(e*e*((r+1)*e-r)):.5*((e-=2)*e*((r+1)*e+r)+2)}}),Bounce:Object.freeze({In:function(e){return 1-Dt.Bounce.Out(1-e)},Out:function(e){return e<.36363636363636365?7.5625*e*e:e<.7272727272727273?7.5625*(e-=.5454545454545454)*e+.75:e<.9090909090909091?7.5625*(e-=.8181818181818182)*e+.9375:7.5625*(e-=.9545454545454546)*e+.984375},InOut:function(e){return e<.5?Dt.Bounce.In(e*2)*.5:Dt.Bounce.Out(e*2-1)*.5+.5}}),generatePow:function(e){return e===void 0&&(e=4),e=e1e4?1e4:e,{In:function(r){return Math.pow(r,e)},Out:function(r){return 1-Math.pow(1-r,e)},InOut:function(r){return r<.5?Math.pow(r*2,e)/2:(1-Math.pow(2-r*2,e))/2+.5}}}}),Ie=function(){return performance.now()},sn=(function(){function e(){for(var r=[],n=0;n0;){this._tweensAddedDuringUpdate={};for(var o=0;o1?a(e[n],e[n-1],n-i):a(e[o],e[o+1>n?n:o+1],i-o)},Bezier:function(e,r){for(var n=0,i=e.length-1,o=Math.pow,a=se.Utils.Bernstein,s=0;s<=i;s++)n+=o(1-r,i-s)*o(r,s)*e[s]*a(i,s);return n},CatmullRom:function(e,r){var n=e.length-1,i=n*r,o=Math.floor(i),a=se.Utils.CatmullRom;return e[0]===e[n]?(r<0&&(o=Math.floor(i=n*(1+r))),a(e[(o-1+n)%n],e[o],e[(o+1)%n],e[(o+2)%n],i-o)):r<0?e[0]-(a(e[0],e[0],e[1],e[1],-i)-e[0]):r>1?e[n]-(a(e[n],e[n],e[n-1],e[n-1],i-n)-e[n]):a(e[o?o-1:0],e[o],e[n1;i--)n*=i;return e[r]=n,n}})(),CatmullRom:function(e,r,n,i,o){var a=(n-e)*.5,s=(i-r)*.5,f=o*o,u=o*f;return(2*r-2*n+a+s)*u+(-3*r+3*n-2*a-s)*f+a*o+r}}},Fo=(function(){function e(){}return e.nextId=function(){return e._nextId++},e._nextId=0,e})(),an=new sn,fn=(function(){function e(r,n){this._isPaused=!1,this._pauseStart=0,this._valuesStart={},this._valuesEnd={},this._valuesStartRepeat={},this._duration=1e3,this._isDynamic=!1,this._initialRepeat=0,this._repeat=0,this._yoyo=!1,this._isPlaying=!1,this._reversed=!1,this._delayTime=0,this._startTime=0,this._easingFunction=Dt.Linear.None,this._interpolationFunction=se.Linear,this._chainedTweens=[],this._onStartCallbackFired=!1,this._onEveryStartCallbackFired=!1,this._id=Fo.nextId(),this._isChainStopped=!1,this._propertiesAreSetUp=!1,this._goToEnd=!1,this._object=r,typeof n=="object"?(this._group=n,n.add(this)):n===!0&&(this._group=an,an.add(this))}return e.prototype.getId=function(){return this._id},e.prototype.isPlaying=function(){return this._isPlaying},e.prototype.isPaused=function(){return this._isPaused},e.prototype.getDuration=function(){return this._duration},e.prototype.to=function(r,n){if(n===void 0&&(n=1e3),this._isPlaying)throw new Error("Can not call Tween.to() while Tween is already started or paused. Stop the Tween first.");return this._valuesEnd=r,this._propertiesAreSetUp=!1,this._duration=n<0?0:n,this},e.prototype.duration=function(r){return r===void 0&&(r=1e3),this._duration=r<0?0:r,this},e.prototype.dynamic=function(r){return r===void 0&&(r=!1),this._isDynamic=r,this},e.prototype.start=function(r,n){if(r===void 0&&(r=Ie()),n===void 0&&(n=!1),this._isPlaying)return this;if(this._repeat=this._initialRepeat,this._reversed){this._reversed=!1;for(var i in this._valuesStartRepeat)this._swapEndStartRepeatValues(i),this._valuesStart[i]=this._valuesStartRepeat[i]}if(this._isPlaying=!0,this._isPaused=!1,this._onStartCallbackFired=!1,this._onEveryStartCallbackFired=!1,this._isChainStopped=!1,this._startTime=r,this._startTime+=this._delayTime,!this._propertiesAreSetUp||n){if(this._propertiesAreSetUp=!0,!this._isDynamic){var o={};for(var a in this._valuesEnd)o[a]=this._valuesEnd[a];this._valuesEnd=o}this._setupProperties(this._object,this._valuesStart,this._valuesEnd,this._valuesStartRepeat,n)}return this},e.prototype.startFromCurrentValues=function(r){return this.start(r,!0)},e.prototype._setupProperties=function(r,n,i,o,a){for(var s in i){var f=r[s],u=Array.isArray(f),l=u?"array":typeof f,c=!u&&Array.isArray(i[s]);if(!(l==="undefined"||l==="function")){if(c){var p=i[s];if(p.length===0)continue;for(var h=[f],d=0,m=p.length;d"u"||a)&&(n[s]=f),u||(n[s]*=1),c?o[s]=i[s].slice().reverse():o[s]=n[s]||0}}},e.prototype.stop=function(){return this._isChainStopped||(this._isChainStopped=!0,this.stopChainedTweens()),this._isPlaying?(this._isPlaying=!1,this._isPaused=!1,this._onStopCallback&&this._onStopCallback(this._object),this):this},e.prototype.end=function(){return this._goToEnd=!0,this.update(this._startTime+this._duration),this},e.prototype.pause=function(r){return r===void 0&&(r=Ie()),this._isPaused||!this._isPlaying?this:(this._isPaused=!0,this._pauseStart=r,this)},e.prototype.resume=function(r){return r===void 0&&(r=Ie()),!this._isPaused||!this._isPlaying?this:(this._isPaused=!1,this._startTime+=r-this._pauseStart,this._pauseStart=0,this)},e.prototype.stopChainedTweens=function(){for(var r=0,n=this._chainedTweens.length;ru)return 1;var x=Math.trunc(s/f),_=s-x*f,g=Math.min(_/i._duration,1);return g===0&&s===i._duration?1:g},c=l(),p=this._easingFunction(c);if(this._updateProperties(this._object,this._valuesStart,this._valuesEnd,p),this._onUpdateCallback&&this._onUpdateCallback(this._object,c),this._duration===0||s>=this._duration)if(this._repeat>0){var h=Math.min(Math.trunc((s-this._duration)/f)+1,this._repeat);isFinite(this._repeat)&&(this._repeat-=h);for(a in this._valuesStartRepeat)!this._yoyo&&typeof this._valuesEnd[a]=="string"&&(this._valuesStartRepeat[a]=this._valuesStartRepeat[a]+parseFloat(this._valuesEnd[a])),this._yoyo&&this._swapEndStartRepeatValues(a),this._valuesStart[a]=this._valuesStartRepeat[a];return this._yoyo&&(this._reversed=!this._reversed),this._startTime+=f*h,this._onRepeatCallback&&this._onRepeatCallback(this._object),this._onEveryStartCallbackFired=!1,!0}else{this._onCompleteCallback&&this._onCompleteCallback(this._object);for(var d=0,m=this._chainedTweens.length;de.length)&&(r=e.length);for(var n=0,i=Array(r);n=0,a=!n&&o&&(r==="hex"||r==="hex6"||r==="hex3"||r==="hex4"||r==="hex8"||r==="name");return a?r==="name"&&this._a===0?this.toName():this.toRgbString():(r==="rgb"&&(i=this.toRgbString()),r==="prgb"&&(i=this.toPercentageRgbString()),(r==="hex"||r==="hex6")&&(i=this.toHexString()),r==="hex3"&&(i=this.toHexString(!0)),r==="hex4"&&(i=this.toHex8String(!0)),r==="hex8"&&(i=this.toHex8String()),r==="name"&&(i=this.toName()),r==="hsl"&&(i=this.toHslString()),r==="hsv"&&(i=this.toHsvString()),i||this.toHexString())},clone:function(){return N(this.toString())},_applyModification:function(r,n){var i=r.apply(null,[this].concat([].slice.call(n)));return this._r=i._r,this._g=i._g,this._b=i._b,this.setAlpha(i._a),this},lighten:function(){return this._applyModification(ic,arguments)},brighten:function(){return this._applyModification(oc,arguments)},darken:function(){return this._applyModification(ac,arguments)},desaturate:function(){return this._applyModification(ec,arguments)},saturate:function(){return this._applyModification(rc,arguments)},greyscale:function(){return this._applyModification(nc,arguments)},spin:function(){return this._applyModification(sc,arguments)},_applyCombination:function(r,n){return r.apply(null,[this].concat([].slice.call(n)))},analogous:function(){return this._applyCombination(uc,arguments)},complement:function(){return this._applyCombination(fc,arguments)},monochromatic:function(){return this._applyCombination(cc,arguments)},splitcomplement:function(){return this._applyCombination(lc,arguments)},triad:function(){return this._applyCombination(Go,[3])},tetrad:function(){return this._applyCombination(Go,[4])}};N.fromRatio=function(e,r){if(kr(e)=="object"){var n={};for(var i in e)e.hasOwnProperty(i)&&(i==="a"?n[i]=e[i]:n[i]=Ne(e[i]));e=n}return N(e,r)};function Zu(e){var r={r:0,g:0,b:0},n=1,i=null,o=null,a=null,s=!1,f=!1;return typeof e=="string"&&(e=gc(e)),kr(e)=="object"&&(Tt(e.r)&&Tt(e.g)&&Tt(e.b)?(r=Ku(e.r,e.g,e.b),s=!0,f=String(e.r).substr(-1)==="%"?"prgb":"rgb"):Tt(e.h)&&Tt(e.s)&&Tt(e.v)?(i=Ne(e.s),o=Ne(e.v),r=Ju(e.h,i,o),s=!0,f="hsv"):Tt(e.h)&&Tt(e.s)&&Tt(e.l)&&(i=Ne(e.s),a=Ne(e.l),r=Qu(e.h,i,a),s=!0,f="hsl"),e.hasOwnProperty("a")&&(n=e.a)),n=Vo(n),{ok:s,format:e.format||f,r:Math.min(255,Math.max(r.r,0)),g:Math.min(255,Math.max(r.g,0)),b:Math.min(255,Math.max(r.b,0)),a:n}}function Ku(e,r,n){return{r:G(e,255)*255,g:G(r,255)*255,b:G(n,255)*255}}function qo(e,r,n){e=G(e,255),r=G(r,255),n=G(n,255);var i=Math.max(e,r,n),o=Math.min(e,r,n),a,s,f=(i+o)/2;if(i==o)a=s=0;else{var u=i-o;switch(s=f>.5?u/(2-i-o):u/(i+o),i){case e:a=(r-n)/u+(r1&&(p-=1),p<1/6?l+(c-l)*6*p:p<1/2?c:p<2/3?l+(c-l)*(2/3-p)*6:l}if(r===0)i=o=a=n;else{var f=n<.5?n*(1+r):n+r-n*r,u=2*n-f;i=s(u,f,e+1/3),o=s(u,f,e),a=s(u,f,e-1/3)}return{r:i*255,g:o*255,b:a*255}}function Bo(e,r,n){e=G(e,255),r=G(r,255),n=G(n,255);var i=Math.max(e,r,n),o=Math.min(e,r,n),a,s,f=i,u=i-o;if(s=i===0?0:u/i,i==o)a=0;else{switch(i){case e:a=(r-n)/u+(r>1)+720)%360;--r;)i.h=(i.h+o)%360,a.push(N(i));return a}function cc(e,r){r=r||6;for(var n=N(e).toHsv(),i=n.h,o=n.s,a=n.v,s=[],f=1/r;r--;)s.push(N({h:i,s:o,v:a})),a=(a+f)%1;return s}N.mix=function(e,r,n){n=n===0?0:n||50;var i=N(e).toRgb(),o=N(r).toRgb(),a=n/100,s={r:(o.r-i.r)*a+i.r,g:(o.g-i.g)*a+i.g,b:(o.b-i.b)*a+i.b,a:(o.a-i.a)*a+i.a};return N(s)};N.readability=function(e,r){var n=N(e),i=N(r);return(Math.max(n.getLuminance(),i.getLuminance())+.05)/(Math.min(n.getLuminance(),i.getLuminance())+.05)};N.isReadable=function(e,r,n){var i=N.readability(e,r),o,a;switch(a=!1,o=xc(n),o.level+o.size){case"AAsmall":case"AAAlarge":a=i>=4.5;break;case"AAlarge":a=i>=3;break;case"AAAsmall":a=i>=7;break}return a};N.mostReadable=function(e,r,n){var i=null,o=0,a,s,f,u;n=n||{},s=n.includeFallbackColors,f=n.level,u=n.size;for(var l=0;lo&&(o=a,i=N(r[l]));return N.isReadable(e,i,{level:f,size:u})||!s?i:(n.includeFallbackColors=!1,N.mostReadable(e,["#fff","#000"],n))};var ln=N.names={aliceblue:"f0f8ff",antiquewhite:"faebd7",aqua:"0ff",aquamarine:"7fffd4",azure:"f0ffff",beige:"f5f5dc",bisque:"ffe4c4",black:"000",blanchedalmond:"ffebcd",blue:"00f",blueviolet:"8a2be2",brown:"a52a2a",burlywood:"deb887",burntsienna:"ea7e5d",cadetblue:"5f9ea0",chartreuse:"7fff00",chocolate:"d2691e",coral:"ff7f50",cornflowerblue:"6495ed",cornsilk:"fff8dc",crimson:"dc143c",cyan:"0ff",darkblue:"00008b",darkcyan:"008b8b",darkgoldenrod:"b8860b",darkgray:"a9a9a9",darkgreen:"006400",darkgrey:"a9a9a9",darkkhaki:"bdb76b",darkmagenta:"8b008b",darkolivegreen:"556b2f",darkorange:"ff8c00",darkorchid:"9932cc",darkred:"8b0000",darksalmon:"e9967a",darkseagreen:"8fbc8f",darkslateblue:"483d8b",darkslategray:"2f4f4f",darkslategrey:"2f4f4f",darkturquoise:"00ced1",darkviolet:"9400d3",deeppink:"ff1493",deepskyblue:"00bfff",dimgray:"696969",dimgrey:"696969",dodgerblue:"1e90ff",firebrick:"b22222",floralwhite:"fffaf0",forestgreen:"228b22",fuchsia:"f0f",gainsboro:"dcdcdc",ghostwhite:"f8f8ff",gold:"ffd700",goldenrod:"daa520",gray:"808080",green:"008000",greenyellow:"adff2f",grey:"808080",honeydew:"f0fff0",hotpink:"ff69b4",indianred:"cd5c5c",indigo:"4b0082",ivory:"fffff0",khaki:"f0e68c",lavender:"e6e6fa",lavenderblush:"fff0f5",lawngreen:"7cfc00",lemonchiffon:"fffacd",lightblue:"add8e6",lightcoral:"f08080",lightcyan:"e0ffff",lightgoldenrodyellow:"fafad2",lightgray:"d3d3d3",lightgreen:"90ee90",lightgrey:"d3d3d3",lightpink:"ffb6c1",lightsalmon:"ffa07a",lightseagreen:"20b2aa",lightskyblue:"87cefa",lightslategray:"789",lightslategrey:"789",lightsteelblue:"b0c4de",lightyellow:"ffffe0",lime:"0f0",limegreen:"32cd32",linen:"faf0e6",magenta:"f0f",maroon:"800000",mediumaquamarine:"66cdaa",mediumblue:"0000cd",mediumorchid:"ba55d3",mediumpurple:"9370db",mediumseagreen:"3cb371",mediumslateblue:"7b68ee",mediumspringgreen:"00fa9a",mediumturquoise:"48d1cc",mediumvioletred:"c71585",midnightblue:"191970",mintcream:"f5fffa",mistyrose:"ffe4e1",moccasin:"ffe4b5",navajowhite:"ffdead",navy:"000080",oldlace:"fdf5e6",olive:"808000",olivedrab:"6b8e23",orange:"ffa500",orangered:"ff4500",orchid:"da70d6",palegoldenrod:"eee8aa",palegreen:"98fb98",paleturquoise:"afeeee",palevioletred:"db7093",papayawhip:"ffefd5",peachpuff:"ffdab9",peru:"cd853f",pink:"ffc0cb",plum:"dda0dd",powderblue:"b0e0e6",purple:"800080",rebeccapurple:"663399",red:"f00",rosybrown:"bc8f8f",royalblue:"4169e1",saddlebrown:"8b4513",salmon:"fa8072",sandybrown:"f4a460",seagreen:"2e8b57",seashell:"fff5ee",sienna:"a0522d",silver:"c0c0c0",skyblue:"87ceeb",slateblue:"6a5acd",slategray:"708090",slategrey:"708090",snow:"fffafa",springgreen:"00ff7f",steelblue:"4682b4",tan:"d2b48c",teal:"008080",thistle:"d8bfd8",tomato:"ff6347",turquoise:"40e0d0",violet:"ee82ee",wheat:"f5deb3",white:"fff",whitesmoke:"f5f5f5",yellow:"ff0",yellowgreen:"9acd32"},hc=N.hexNames=pc(ln);function pc(e){var r={};for(var n in e)e.hasOwnProperty(n)&&(r[e[n]]=n);return r}function Vo(e){return e=parseFloat(e),(isNaN(e)||e<0||e>1)&&(e=1),e}function G(e,r){dc(e)&&(e="100%");var n=mc(e);return e=Math.min(r,Math.max(0,parseFloat(e))),n&&(e=parseInt(e*r,10)/100),Math.abs(e-r)<1e-6?1:e%r/parseFloat(r)}function Ar(e){return Math.min(1,Math.max(0,e))}function ut(e){return parseInt(e,16)}function dc(e){return typeof e=="string"&&e.indexOf(".")!=-1&&parseFloat(e)===1}function mc(e){return typeof e=="string"&&e.indexOf("%")!=-1}function _t(e){return e.length==1?"0"+e:""+e}function Ne(e){return e<=1&&(e=e*100+"%"),e}function Yo(e){return Math.round(parseFloat(e)*255).toString(16)}function Wo(e){return ut(e)/255}var yt=(function(){var e="[-\\+]?\\d+%?",r="[-\\+]?\\d*\\.\\d+%?",n="(?:"+r+")|(?:"+e+")",i="[\\s|\\(]+("+n+")[,|\\s]+("+n+")[,|\\s]+("+n+")\\s*\\)?",o="[\\s|\\(]+("+n+")[,|\\s]+("+n+")[,|\\s]+("+n+")[,|\\s]+("+n+")\\s*\\)?";return{CSS_UNIT:new RegExp(n),rgb:new RegExp("rgb"+i),rgba:new RegExp("rgba"+o),hsl:new RegExp("hsl"+i),hsla:new RegExp("hsla"+o),hsv:new RegExp("hsv"+i),hsva:new RegExp("hsva"+o),hex3:/^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,hex6:/^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/,hex4:/^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,hex8:/^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/}})();function Tt(e){return!!yt.CSS_UNIT.exec(e)}function gc(e){e=e.replace(Yu,"").replace(Xu,"").toLowerCase();var r=!1;if(ln[e])e=ln[e],r=!0;else if(e=="transparent")return{r:0,g:0,b:0,a:0,format:"name"};var n;return(n=yt.rgb.exec(e))?{r:n[1],g:n[2],b:n[3]}:(n=yt.rgba.exec(e))?{r:n[1],g:n[2],b:n[3],a:n[4]}:(n=yt.hsl.exec(e))?{h:n[1],s:n[2],l:n[3]}:(n=yt.hsla.exec(e))?{h:n[1],s:n[2],l:n[3],a:n[4]}:(n=yt.hsv.exec(e))?{h:n[1],s:n[2],v:n[3]}:(n=yt.hsva.exec(e))?{h:n[1],s:n[2],v:n[3],a:n[4]}:(n=yt.hex8.exec(e))?{r:ut(n[1]),g:ut(n[2]),b:ut(n[3]),a:Wo(n[4]),format:r?"name":"hex8"}:(n=yt.hex6.exec(e))?{r:ut(n[1]),g:ut(n[2]),b:ut(n[3]),format:r?"name":"hex"}:(n=yt.hex4.exec(e))?{r:ut(n[1]+""+n[1]),g:ut(n[2]+""+n[2]),b:ut(n[3]+""+n[3]),a:Wo(n[4]+""+n[4]),format:r?"name":"hex8"}:(n=yt.hex3.exec(e))?{r:ut(n[1]+""+n[1]),g:ut(n[2]+""+n[2]),b:ut(n[3]+""+n[3]),format:r?"name":"hex"}:!1}function xc(e){var r,n;return e=e||{level:"AA",size:"small"},r=(e.level||"AA").toUpperCase(),n=(e.size||"small").toLowerCase(),r!=="AA"&&r!=="AAA"&&(r="AA"),n!=="small"&&n!=="large"&&(n="small"),{level:r,size:n}}function un(e,r){(r==null||r>e.length)&&(r=e.length);for(var n=0,i=Array(r);n0&&arguments[0]!==void 0?arguments[0]:6;vc(this,e),Xo(this,Vt,void 0),Xo(this,zt,void 0),Zo(zt,this,r),this.reset()}return wc(e,[{key:"reset",value:function(){Zo(Vt,this,["__reserved for background__"])}},{key:"register",value:function(n){if(ht(Vt,this).length>=Math.pow(2,24-ht(zt,this)))return null;var i=ht(Vt,this).length,o=Ko(i,ht(zt,this)),a=zc(i+(o<<24-ht(zt,this)));return ht(Vt,this).push(n),a}},{key:"lookup",value:function(n){if(!n)return null;var i=typeof n=="string"?Oc(n):Jo.apply(void 0,Sc(n));if(!i)return null;var o=i&Math.pow(2,24-ht(zt,this))-1,a=i>>24-ht(zt,this)&Math.pow(2,ht(zt,this))-1;return Ko(o,ht(zt,this))!==a||o>=ht(Vt,this).length?null:ht(Vt,this)[o]}}])})();var Le,W,oa,dn,jt,ea,aa,sa,cn,Cr,De,fa,mn,hn,pn,Ec,Pr={},Tr=[],Ic=/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i,Or=Array.isArray;function wt(e,r){for(var n in r)e[n]=r[n];return e}function gn(e){e&&e.parentNode&&e.parentNode.removeChild(e)}function Rc(e,r,n){var i,o,a,s={};for(a in r)a=="key"?i=r[a]:a=="ref"?o=r[a]:s[a]=r[a];if(arguments.length>2&&(s.children=arguments.length>3?Le.call(arguments,2):n),typeof e=="function"&&e.defaultProps!=null)for(a in e.defaultProps)s[a]===void 0&&(s[a]=e.defaultProps[a]);return je(e,s,i,o,null)}function je(e,r,n,i,o){var a={type:e,props:r,key:n,ref:i,__k:null,__:null,__b:0,__e:null,__c:null,constructor:void 0,__v:o??++oa,__i:-1,__u:0};return o==null&&W.vnode!=null&&W.vnode(a),a}function Er(e){return e.children}function Mr(e,r){this.props=e,this.context=r}function Yt(e,r){if(r==null)return e.__?Yt(e.__,e.__i+1):null;for(var n;rr&&jt.sort(sa),e=jt.shift(),r=jt.length,Nc(e)}finally{jt.length=zr.__r=0}}function ua(e,r,n,i,o,a,s,f,u,l,c){var p,h,d,m,x,_,g=i&&i.__k||Tr,w=r.length;for(u=Dc(n,r,g,u,w),p=0;p0?s=e.__k[a]=je(s.type,s.props,s.key,s.ref?s.ref:null,s.__v):e.__k[a]=s,u=a+h,s.__=e,s.__b=e.__b+1,f=null,(l=s.__i=jc(s,n,u,p))!=-1&&(p--,(f=n[l])&&(f.__u|=2)),f==null||f.__v==null?(l==-1&&(o>c?h--:ou?h--:h++,s.__u|=4))):e.__k[a]=null;if(p)for(a=0;a(c?1:0)){for(o=n-1,a=n+1;o>=0||a=0?o--:a++])!=null&&(2&l.__u)==0&&f==l.key&&u==l.type)return s}return-1}function na(e,r,n){r[0]=="-"?e.setProperty(r,n??""):e[r]=n==null?"":typeof n!="number"||Ic.test(r)?n:n+"px"}function Sr(e,r,n,i,o){var a,s;t:if(r=="style")if(typeof n=="string")e.style.cssText=n;else{if(typeof i=="string"&&(e.style.cssText=i=""),i)for(r in i)n&&r in n||na(e.style,r,"");if(n)for(r in n)i&&n[r]==i[r]||na(e.style,r,n[r])}else if(r[0]=="o"&&r[1]=="n")a=r!=(r=r.replace(fa,"$1")),s=r.toLowerCase(),r=s in e||r=="onFocusOut"||r=="onFocusIn"?s.slice(2):r.slice(2),e.l||(e.l={}),e.l[r+a]=n,n?i?n[De]=i[De]:(n[De]=mn,e.addEventListener(r,a?pn:hn,a)):e.removeEventListener(r,a?pn:hn,a);else{if(o=="http://www.w3.org/2000/svg")r=r.replace(/xlink(H|:h)/,"h").replace(/sName$/,"s");else if(r!="width"&&r!="height"&&r!="href"&&r!="list"&&r!="form"&&r!="tabIndex"&&r!="download"&&r!="rowSpan"&&r!="colSpan"&&r!="role"&&r!="popover"&&r in e)try{e[r]=n??"";break t}catch{}typeof n=="function"||(n==null||n===!1&&r[4]!="-"?e.removeAttribute(r):e.setAttribute(r,r=="popover"&&n==1?"":n))}}function ia(e){return function(r){if(this.l){var n=this.l[r.type+e];if(r[Cr]==null)r[Cr]=mn++;else if(r[Cr]0?e:Or(e)?e.map(da):e.constructor!==void 0?null:wt({},e)}function Lc(e,r,n,i,o,a,s,f,u){var l,c,p,h,d,m,x,_=n.props||Pr,g=r.props,w=r.type;if(w=="svg"?o="http://www.w3.org/2000/svg":w=="math"?o="http://www.w3.org/1998/Math/MathML":o||(o="http://www.w3.org/1999/xhtml"),a!=null){for(l=0;l2&&(f.children=arguments.length>3?Le.call(arguments,2):n),je(e.type,f,i||e.key,o||e.ref,null)}Le=Tr.slice,W={__e:function(e,r,n,i){for(var o,a,s;r=r.__;)if((o=r.__c)&&!o.__)try{if((a=o.constructor)&&a.getDerivedStateFromError!=null&&(o.setState(a.getDerivedStateFromError(e)),s=o.__d),o.componentDidCatch!=null&&(o.componentDidCatch(e,i||{}),s=o.__d),s)return o.__E=o}catch(f){e=f}throw e}},oa=0,dn=function(e){return e!=null&&e.constructor===void 0},Mr.prototype.setState=function(e,r){var n;n=this.__s!=null&&this.__s!=this.state?this.__s:this.__s=wt({},this.state),typeof e=="function"&&(e=e(wt({},n),this.props)),e&&wt(n,e),e!=null&&this.__v&&(r&&this._sb.push(r),ra(this))},Mr.prototype.forceUpdate=function(e){this.__v&&(this.__e=!0,e&&this.__h.push(e),ra(this))},Mr.prototype.render=Er,jt=[],aa=typeof Promise=="function"?Promise.prototype.then.bind(Promise.resolve()):setTimeout,sa=function(e,r){return e.__v.__b-r.__v.__b},zr.__r=0,cn=Math.random().toString(8),Cr="__d"+cn,De="__a"+cn,fa=/(PointerCapture)$|Capture$/i,mn=0,hn=ia(!1),pn=ia(!0),Ec=0;function xa(e,r){(r==null||r>e.length)&&(r=e.length);for(var n=0,i=Array(r);n"u")){var i=document.head||document.getElementsByTagName("head")[0],o=document.createElement("style");o.type="text/css",n==="top"&&i.firstChild?i.insertBefore(o,i.firstChild):i.appendChild(o),o.styleSheet?o.styleSheet.cssText=e:o.appendChild(document.createTextNode(e))}}var Qc=`.float-tooltip-kap { +var Ge="http://www.w3.org/1999/xhtml",Lr={svg:"http://www.w3.org/2000/svg",xhtml:Ge,xlink:"http://www.w3.org/1999/xlink",xml:"http://www.w3.org/XML/1998/namespace",xmlns:"http://www.w3.org/2000/xmlns/"};function St(e){var r=e+="",n=r.indexOf(":");return n>=0&&(r=e.slice(0,n))!=="xmlns"&&(e=e.slice(n+1)),Lr.hasOwnProperty(r)?{space:Lr[r],local:e}:e}function Bs(e){return function(){var r=this.ownerDocument,n=this.namespaceURI;return n===Ge&&r.documentElement.namespaceURI===Ge?r.createElement(e):r.createElementNS(n,e)}}function Hs(e){return function(){return this.ownerDocument.createElementNS(e.space,e.local)}}function Ve(e){var r=St(e);return(r.local?Hs:Bs)(r)}function $s(){}function Ut(e){return e==null?$s:function(){return this.querySelector(e)}}function Fn(e){typeof e!="function"&&(e=Ut(e));for(var r=this._groups,n=r.length,i=new Array(n),o=0;o=S&&(S=w+1);!(y=_[S])&&++S=0;)(s=i[o])&&(a&&s.compareDocumentPosition(a)^4&&a.parentNode.insertBefore(s,a),a=s);return this}function Kn(e){e||(e=nf);function r(h,p){return h&&p?e(h.__data__,p.__data__):!h-!p}for(var n=this._groups,i=n.length,o=new Array(i),a=0;ar?1:e>=r?0:NaN}function Qn(){var e=arguments[0];return arguments[0]=this,e.apply(null,arguments),this}function Jn(){return Array.from(this)}function ti(){for(var e=this._groups,r=0,n=e.length;r1?this.each((r==null?cf:typeof r=="function"?pf:hf)(e,r,n??"")):Et(this.node(),e)}function Et(e,r){return e.style.getPropertyValue(r)||Ze(e).getComputedStyle(e,null).getPropertyValue(r)}function df(e){return function(){delete this[e]}}function mf(e,r){return function(){this[e]=r}}function gf(e,r){return function(){var n=r.apply(this,arguments);n==null?delete this[e]:this[e]=n}}function ai(e,r){return arguments.length>1?this.each((r==null?df:typeof r=="function"?gf:mf)(e,r)):this.node()[e]}function si(e){return e.trim().split(/^|\s+/)}function Ur(e){return e.classList||new fi(e)}function fi(e){this._node=e,this._names=si(e.getAttribute("class")||"")}fi.prototype={add:function(e){var r=this._names.indexOf(e);r<0&&(this._names.push(e),this._node.setAttribute("class",this._names.join(" ")))},remove:function(e){var r=this._names.indexOf(e);r>=0&&(this._names.splice(r,1),this._node.setAttribute("class",this._names.join(" ")))},contains:function(e){return this._names.indexOf(e)>=0}};function li(e,r){for(var n=Ur(e),i=-1,o=r.length;++i=0&&(n=r.slice(i+1),r=r.slice(0,i)),{type:r,name:n}})}function Rf(e){return function(){var r=this.__on;if(r){for(var n=0,i=-1,o=r.length,a;n{}};function Pi(){for(var e=0,r=arguments.length,n={},i;e=0&&(i=n.slice(o+1),n=n.slice(0,o)),n&&!r.hasOwnProperty(n))throw new Error("unknown type: "+n);return{type:n,name:i}})}Ke.prototype=Pi.prototype={constructor:Ke,on:function(e,r){var n=this._,i=Uf(e+"",n),o,a=-1,s=i.length;if(arguments.length<2){for(;++a0)for(var n=new Array(o),i=0,o,a;i()=>e;function xe(e,{sourceEvent:r,subject:n,target:i,identifier:o,active:a,x:s,y:f,dx:u,dy:l,dispatch:c}){Object.defineProperties(this,{type:{value:e,enumerable:!0,configurable:!0},sourceEvent:{value:r,enumerable:!0,configurable:!0},subject:{value:n,enumerable:!0,configurable:!0},target:{value:i,enumerable:!0,configurable:!0},identifier:{value:o,enumerable:!0,configurable:!0},active:{value:a,enumerable:!0,configurable:!0},x:{value:s,enumerable:!0,configurable:!0},y:{value:f,enumerable:!0,configurable:!0},dx:{value:u,enumerable:!0,configurable:!0},dy:{value:l,enumerable:!0,configurable:!0},_:{value:c}})}xe.prototype.on=function(){var e=this._.on.apply(this._,arguments);return e===this._?this:e};function Bf(e){return!e.ctrlKey&&!e.button}function Hf(){return this.parentNode}function $f(e,r){return r??{x:e.x,y:e.y}}function Wf(){return navigator.maxTouchPoints||"ontouchstart"in this}function Br(){var e=Bf,r=Hf,n=$f,i=Wf,o={},a=Mt("start","drag","end"),s=0,f,u,l,c,h=0;function p(v){v.on("mousedown.drag",d).filter(i).on("touchstart.drag",_).on("touchmove.drag",g,Ti).on("touchend.drag touchcancel.drag",w).style("touch-action","none").style("-webkit-tap-highlight-color","rgba(0,0,0,0)")}function d(v,y){if(!(c||!e.call(this,v,y))){var b=S(this,r.call(this,v,y),v,y,"mouse");b&&(K(v.view).on("mousemove.drag",m,qt).on("mouseup.drag",x,qt),de(v.view),Qe(v),l=!1,f=v.clientX,u=v.clientY,b("start",v))}}function m(v){if(It(v),!l){var y=v.clientX-f,b=v.clientY-u;l=y*y+b*b>h}o.mouse("drag",v)}function x(v){K(v.view).on("mousemove.drag mouseup.drag",null),me(v.view,l),It(v),o.mouse("end",v)}function _(v,y){if(e.call(this,v,y)){var b=v.changedTouches,k=r.call(this,v,y),C=b.length,T,z;for(T=0;T>8&15|r>>4&240,r>>4&15|r&240,(r&15)<<4|r&15,1):n===8?tr(r>>24&255,r>>16&255,r>>8&255,(r&255)/255):n===4?tr(r>>12&15|r>>8&240,r>>8&15|r>>4&240,r>>4&15|r&240,((r&15)<<4|r&15)/255):null):(r=Vf.exec(e))?new st(r[1],r[2],r[3],1):(r=Yf.exec(e))?new st(r[1]*255/100,r[2]*255/100,r[3]*255/100,1):(r=Xf.exec(e))?tr(r[1],r[2],r[3],r[4]):(r=Zf.exec(e))?tr(r[1]*255/100,r[2]*255/100,r[3]*255/100,r[4]):(r=Kf.exec(e))?Di(r[1],r[2]/100,r[3]/100,1):(r=Qf.exec(e))?Di(r[1],r[2]/100,r[3]/100,r[4]):zi.hasOwnProperty(e)?Ii(zi[e]):e==="transparent"?new st(NaN,NaN,NaN,0):null}function Ii(e){return new st(e>>16&255,e>>8&255,e&255,1)}function tr(e,r,n,i){return i<=0&&(e=r=n=NaN),new st(e,r,n,i)}function el(e){return e instanceof ve||(e=Rt(e)),e?(e=e.rgb(),new st(e.r,e.g,e.b,e.opacity)):new st}function ee(e,r,n,i){return arguments.length===1?el(e):new st(e,r,n,i??1)}function st(e,r,n,i){this.r=+e,this.g=+r,this.b=+n,this.opacity=+i}Je(st,ee,Hr(ve,{brighter(e){return e=e==null?rr:Math.pow(rr,e),new st(this.r*e,this.g*e,this.b*e,this.opacity)},darker(e){return e=e==null?ye:Math.pow(ye,e),new st(this.r*e,this.g*e,this.b*e,this.opacity)},rgb(){return this},clamp(){return new st(Ht(this.r),Ht(this.g),Ht(this.b),nr(this.opacity))},displayable(){return-.5<=this.r&&this.r<255.5&&-.5<=this.g&&this.g<255.5&&-.5<=this.b&&this.b<255.5&&0<=this.opacity&&this.opacity<=1},hex:Ri,formatHex:Ri,formatHex8:rl,formatRgb:Ni,toString:Ni}));function Ri(){return`#${Bt(this.r)}${Bt(this.g)}${Bt(this.b)}`}function rl(){return`#${Bt(this.r)}${Bt(this.g)}${Bt(this.b)}${Bt((isNaN(this.opacity)?1:this.opacity)*255)}`}function Ni(){let e=nr(this.opacity);return`${e===1?"rgb(":"rgba("}${Ht(this.r)}, ${Ht(this.g)}, ${Ht(this.b)}${e===1?")":`, ${e})`}`}function nr(e){return isNaN(e)?1:Math.max(0,Math.min(1,e))}function Ht(e){return Math.max(0,Math.min(255,Math.round(e)||0))}function Bt(e){return e=Ht(e),(e<16?"0":"")+e.toString(16)}function Di(e,r,n,i){return i<=0?e=r=n=NaN:n<=0||n>=1?e=r=NaN:r<=0&&(e=NaN),new gt(e,r,n,i)}function Li(e){if(e instanceof gt)return new gt(e.h,e.s,e.l,e.opacity);if(e instanceof ve||(e=Rt(e)),!e)return new gt;if(e instanceof gt)return e;e=e.rgb();var r=e.r/255,n=e.g/255,i=e.b/255,o=Math.min(r,n,i),a=Math.max(r,n,i),s=NaN,f=a-o,u=(a+o)/2;return f?(r===a?s=(n-i)/f+(n0&&u<1?0:s,new gt(s,f,u,e.opacity)}function Fi(e,r,n,i){return arguments.length===1?Li(e):new gt(e,r,n,i??1)}function gt(e,r,n,i){this.h=+e,this.s=+r,this.l=+n,this.opacity=+i}Je(gt,Fi,Hr(ve,{brighter(e){return e=e==null?rr:Math.pow(rr,e),new gt(this.h,this.s,this.l*e,this.opacity)},darker(e){return e=e==null?ye:Math.pow(ye,e),new gt(this.h,this.s,this.l*e,this.opacity)},rgb(){var e=this.h%360+(this.h<0)*360,r=isNaN(e)||isNaN(this.s)?0:this.s,n=this.l,i=n+(n<.5?n:1-n)*r,o=2*n-i;return new st($r(e>=240?e-240:e+120,o,i),$r(e,o,i),$r(e<120?e+240:e-120,o,i),this.opacity)},clamp(){return new gt(ji(this.h),er(this.s),er(this.l),nr(this.opacity))},displayable(){return(0<=this.s&&this.s<=1||isNaN(this.s))&&0<=this.l&&this.l<=1&&0<=this.opacity&&this.opacity<=1},formatHsl(){let e=nr(this.opacity);return`${e===1?"hsl(":"hsla("}${ji(this.h)}, ${er(this.s)*100}%, ${er(this.l)*100}%${e===1?")":`, ${e})`}`}}));function ji(e){return e=(e||0)%360,e<0?e+360:e}function er(e){return Math.max(0,Math.min(1,e||0))}function $r(e,r,n){return(e<60?r+(n-r)*e/60:e<180?n:e<240?r+(n-r)*(240-e)/60:r)*255}function Wr(e,r,n,i,o){var a=e*e,s=a*e;return((1-3*e+3*a-s)*r+(4-6*a+3*s)*n+(1+3*e+3*a-3*s)*i+s*o)/6}function Ui(e){var r=e.length-1;return function(n){var i=n<=0?n=0:n>=1?(n=1,r-1):Math.floor(n*r),o=e[i],a=e[i+1],s=i>0?e[i-1]:2*o-a,f=i()=>e;function nl(e,r){return function(n){return e+n*r}}function il(e,r,n){return e=Math.pow(e,n),r=Math.pow(r,n)-e,n=1/n,function(i){return Math.pow(e+i*r,n)}}function Bi(e){return(e=+e)==1?ir:function(r,n){return n-r?il(r,n,e):Gr(isNaN(r)?n:r)}}function ir(e,r){var n=r-e;return n?nl(e,n):Gr(isNaN(e)?r:e)}var or=(function e(r){var n=Bi(r);function i(o,a){var s=n((o=ee(o)).r,(a=ee(a)).r),f=n(o.g,a.g),u=n(o.b,a.b),l=ir(o.opacity,a.opacity);return function(c){return o.r=s(c),o.g=f(c),o.b=u(c),o.opacity=l(c),o+""}}return i.gamma=e,i})(1);function Hi(e){return function(r){var n=r.length,i=new Array(n),o=new Array(n),a=new Array(n),s,f;for(s=0;sn&&(a=r.slice(n,a),f[s]?f[s]+=a:f[++s]=a),(i=i[0])===(o=o[0])?f[s]?f[s]+=o:f[++s]=o:(f[++s]=null,u.push({i:s,x:ct(i,o)})),n=Vr.lastIndex;return n180?c+=360:c-l>180&&(l+=360),p.push({i:h.push(o(h)+"rotate(",null,i)-2,x:ct(l,c)})):c&&h.push(o(h)+"rotate("+c+i)}function f(l,c,h,p){l!==c?p.push({i:h.push(o(h)+"skewX(",null,i)-2,x:ct(l,c)}):c&&h.push(o(h)+"skewX("+c+i)}function u(l,c,h,p,d,m){if(l!==h||c!==p){var x=d.push(o(d)+"scale(",null,",",null,")");m.push({i:x-4,x:ct(l,h)},{i:x-2,x:ct(c,p)})}else(h!==1||p!==1)&&d.push(o(d)+"scale("+h+","+p+")")}return function(l,c){var h=[],p=[];return l=e(l),c=e(c),a(l.translateX,l.translateY,c.translateX,c.translateY,h,p),s(l.rotate,c.rotate,h,p),f(l.skewX,c.skewX,h,p),u(l.scaleX,l.scaleY,c.scaleX,c.scaleY,h,p),l=c=null,function(d){for(var m=-1,x=p.length,_;++m=0&&e._call.call(void 0,r),e=e._next;--re}function Xi(){$t=(lr=Ae.now())+ur,re=we=0;try{Qi()}finally{re=0,dl(),$t=0}}function pl(){var e=Ae.now(),r=e-lr;r>Zi&&(ur-=r,lr=e)}function dl(){for(var e,r=fr,n,i=1/0;r;)r._call?(i>r._time&&(i=r._time),e=r,r=r._next):(n=r._next,r._next=null,r=e?e._next=n:fr=n);ke=e,tn(i)}function tn(e){if(!re){we&&(we=clearTimeout(we));var r=e-$t;r>24?(e<1/0&&(we=setTimeout(Xi,e-Ae.now()-ur)),be&&(be=clearInterval(be))):(be||(lr=Ae.now(),be=setInterval(pl,Zi)),re=1,Ki(Xi))}}function cr(e,r,n){var i=new Se;return r=r==null?0:+r,i.restart(o=>{i.stop(),e(o+r)},r,n),i}var ml=Mt("start","end","cancel","interrupt"),gl=[],eo=0,Ji=1,pr=2,hr=3,to=4,dr=5,Me=6;function Nt(e,r,n,i,o,a){var s=e.__transition;if(!s)e.__transition={};else if(n in s)return;xl(e,n,{name:r,index:i,group:o,on:ml,tween:gl,time:a.time,delay:a.delay,duration:a.duration,ease:a.ease,timer:null,state:eo})}function Pe(e,r){var n=Z(e,r);if(n.state>eo)throw new Error("too late; already scheduled");return n}function J(e,r){var n=Z(e,r);if(n.state>hr)throw new Error("too late; already running");return n}function Z(e,r){var n=e.__transition;if(!n||!(n=n[r]))throw new Error("transition not found");return n}function xl(e,r,n){var i=e.__transition,o;i[r]=n,n.timer=ne(a,0,n.time);function a(l){n.state=Ji,n.timer.restart(s,n.delay,n.time),n.delay<=l&&s(l-n.delay)}function s(l){var c,h,p,d;if(n.state!==Ji)return u();for(c in i)if(d=i[c],d.name===n.name){if(d.state===hr)return cr(s);d.state===to?(d.state=Me,d.timer.stop(),d.on.call("interrupt",e,e.__data__,d.index,d.group),delete i[c]):+cpr&&i.state=0&&(r=r.slice(0,n)),!r||r==="start"})}function jl(e,r,n){var i,o,a=Dl(r)?Pe:J;return function(){var s=a(this,e),f=s.on;f!==i&&(o=(i=f).copy()).on(r,n),s.on=o}}function ho(e,r){var n=this._id;return arguments.length<2?Z(this.node(),n).on.on(e):this.each(jl(n,e,r))}function Ll(e){return function(){var r=this.parentNode;for(var n in this.__transition)if(+n!==e)return;r&&r.removeChild(this)}}function po(){return this.on("end.remove",Ll(this._id))}function mo(e){var r=this._name,n=this._id;typeof e!="function"&&(e=Ut(e));for(var i=this._groups,o=i.length,a=new Array(o),s=0;s()=>e;function en(e,{sourceEvent:r,target:n,transform:i,dispatch:o}){Object.defineProperties(this,{type:{value:e,enumerable:!0,configurable:!0},sourceEvent:{value:r,enumerable:!0,configurable:!0},target:{value:n,enumerable:!0,configurable:!0},transform:{value:i,enumerable:!0,configurable:!0},_:{value:o}})}function xt(e,r,n){this.k=e,this.x=r,this.y=n}xt.prototype={constructor:xt,scale:function(e){return e===1?this:new xt(this.k*e,this.x,this.y)},translate:function(e,r){return e===0&r===0?this:new xt(this.k,this.x+this.k*e,this.y+this.k*r)},apply:function(e){return[e[0]*this.k+this.x,e[1]*this.k+this.y]},applyX:function(e){return e*this.k+this.x},applyY:function(e){return e*this.k+this.y},invert:function(e){return[(e[0]-this.x)/this.k,(e[1]-this.y)/this.k]},invertX:function(e){return(e-this.x)/this.k},invertY:function(e){return(e-this.y)/this.k},rescaleX:function(e){return e.copy().domain(e.range().map(this.invertX,this).map(e.invert,e))},rescaleY:function(e){return e.copy().domain(e.range().map(this.invertY,this).map(e.invert,e))},toString:function(){return"translate("+this.x+","+this.y+") scale("+this.k+")"}};var ze=new xt(1,0,0);lt.prototype=xt.prototype;function lt(e){for(;!e.__zoom;)if(!(e=e.parentNode))return ze;return e.__zoom}function yr(e){e.stopImmediatePropagation()}function oe(e){e.preventDefault(),e.stopImmediatePropagation()}function Jl(e){return(!e.ctrlKey||e.type==="wheel")&&!e.button}function tu(){var e=this;return e instanceof SVGElement?(e=e.ownerSVGElement||e,e.hasAttribute("viewBox")?(e=e.viewBox.baseVal,[[e.x,e.y],[e.x+e.width,e.y+e.height]]):[[0,0],[e.width.baseVal.value,e.height.baseVal.value]]):[[0,0],[e.clientWidth,e.clientHeight]]}function Mo(){return this.__zoom||ze}function eu(e){return-e.deltaY*(e.deltaMode===1?.05:e.deltaMode?1:.002)*(e.ctrlKey?10:1)}function ru(){return navigator.maxTouchPoints||"ontouchstart"in this}function nu(e,r,n){var i=e.invertX(r[0][0])-n[0][0],o=e.invertX(r[1][0])-n[1][0],a=e.invertY(r[0][1])-n[0][1],s=e.invertY(r[1][1])-n[1][1];return e.translate(o>i?(i+o)/2:Math.min(0,i)||Math.max(0,o),s>a?(a+s)/2:Math.min(0,a)||Math.max(0,s))}function rn(){var e=Jl,r=tu,n=nu,i=eu,o=ru,a=[0,1/0],s=[[-1/0,-1/0],[1/0,1/0]],f=250,u=Jr,l=Mt("start","zoom","end"),c,h,p,d=500,m=150,x=0,_=10;function g(A){A.property("__zoom",Mo).on("wheel.zoom",C,{passive:!1}).on("mousedown.zoom",T).on("dblclick.zoom",z).filter(o).on("touchstart.zoom",E).on("touchmove.zoom",I).on("touchend.zoom touchcancel.zoom",U).style("-webkit-tap-highlight-color","rgba(0,0,0,0)")}g.transform=function(A,O,M,R){var L=A.selection?A.selection():A;L.property("__zoom",Mo),A!==L?y(A,O,M,R):L.interrupt().each(function(){b(this,arguments).event(R).start().zoom(null,typeof O=="function"?O.apply(this,arguments):O).end()})},g.scaleBy=function(A,O,M,R){g.scaleTo(A,function(){var L=this.__zoom.k,D=typeof O=="function"?O.apply(this,arguments):O;return L*D},M,R)},g.scaleTo=function(A,O,M,R){g.transform(A,function(){var L=r.apply(this,arguments),D=this.__zoom,F=M==null?v(L):typeof M=="function"?M.apply(this,arguments):M,j=D.invert(F),q=typeof O=="function"?O.apply(this,arguments):O;return n(S(w(D,q),F,j),L,s)},M,R)},g.translateBy=function(A,O,M,R){g.transform(A,function(){return n(this.__zoom.translate(typeof O=="function"?O.apply(this,arguments):O,typeof M=="function"?M.apply(this,arguments):M),r.apply(this,arguments),s)},null,R)},g.translateTo=function(A,O,M,R,L){g.transform(A,function(){var D=r.apply(this,arguments),F=this.__zoom,j=R==null?v(D):typeof R=="function"?R.apply(this,arguments):R;return n(ze.translate(j[0],j[1]).scale(F.k).translate(typeof O=="function"?-O.apply(this,arguments):-O,typeof M=="function"?-M.apply(this,arguments):-M),D,s)},R,L)};function w(A,O){return O=Math.max(a[0],Math.min(a[1],O)),O===A.k?A:new xt(O,A.x,A.y)}function S(A,O,M){var R=O[0]-M[0]*A.k,L=O[1]-M[1]*A.k;return R===A.x&&L===A.y?A:new xt(A.k,R,L)}function v(A){return[(+A[0][0]+ +A[1][0])/2,(+A[0][1]+ +A[1][1])/2]}function y(A,O,M,R){A.on("start.zoom",function(){b(this,arguments).event(R).start()}).on("interrupt.zoom end.zoom",function(){b(this,arguments).event(R).end()}).tween("zoom",function(){var L=this,D=arguments,F=b(L,D).event(R),j=r.apply(L,D),q=M==null?v(j):typeof M=="function"?M.apply(L,D):M,Y=Math.max(j[1][0]-j[0][0],j[1][1]-j[0][1]),$=L.__zoom,V=typeof O=="function"?O.apply(L,D):O,kt=u($.invert(q).concat(Y/$.k),V.invert(q).concat(Y/V.k));return function(mt){if(mt===1)mt=V;else{var At=kt(mt),jr=Y/At[2];mt=new xt(jr,q[0]-At[0]*jr,q[1]-At[1]*jr)}F.zoom(null,mt)}})}function b(A,O,M){return!M&&A.__zooming||new k(A,O)}function k(A,O){this.that=A,this.args=O,this.active=0,this.sourceEvent=null,this.extent=r.apply(A,O),this.taps=0}k.prototype={event:function(A){return A&&(this.sourceEvent=A),this},start:function(){return++this.active===1&&(this.that.__zooming=this,this.emit("start")),this},zoom:function(A,O){return this.mouse&&A!=="mouse"&&(this.mouse[1]=O.invert(this.mouse[0])),this.touch0&&A!=="touch"&&(this.touch0[1]=O.invert(this.touch0[0])),this.touch1&&A!=="touch"&&(this.touch1[1]=O.invert(this.touch1[0])),this.that.__zoom=O,this.emit("zoom"),this},end:function(){return--this.active===0&&(delete this.that.__zooming,this.emit("end")),this},emit:function(A){var O=K(this.that).datum();l.call(A,this.that,new en(A,{sourceEvent:this.sourceEvent,target:g,type:A,transform:this.that.__zoom,dispatch:l}),O)}};function C(A,...O){if(!e.apply(this,arguments))return;var M=b(this,O).event(A),R=this.__zoom,L=Math.max(a[0],Math.min(a[1],R.k*Math.pow(2,i.apply(this,arguments)))),D=at(A);if(M.wheel)(M.mouse[0][0]!==D[0]||M.mouse[0][1]!==D[1])&&(M.mouse[1]=R.invert(M.mouse[0]=D)),clearTimeout(M.wheel);else{if(R.k===L)return;M.mouse=[D,R.invert(D)],Wt(this),M.start()}oe(A),M.wheel=setTimeout(F,m),M.zoom("mouse",n(S(w(R,L),M.mouse[0],M.mouse[1]),M.extent,s));function F(){M.wheel=null,M.end()}}function T(A,...O){if(p||!e.apply(this,arguments))return;var M=A.currentTarget,R=b(this,O,!0).event(A),L=K(A.view).on("mousemove.zoom",q,!0).on("mouseup.zoom",Y,!0),D=at(A,M),F=A.clientX,j=A.clientY;de(A.view),yr(A),R.mouse=[D,this.__zoom.invert(D)],Wt(this),R.start();function q($){if(oe($),!R.moved){var V=$.clientX-F,kt=$.clientY-j;R.moved=V*V+kt*kt>x}R.event($).zoom("mouse",n(S(R.that.__zoom,R.mouse[0]=at($,M),R.mouse[1]),R.extent,s))}function Y($){L.on("mousemove.zoom mouseup.zoom",null),me($.view,R.moved),oe($),R.event($).end()}}function z(A,...O){if(e.apply(this,arguments)){var M=this.__zoom,R=at(A.changedTouches?A.changedTouches[0]:A,this),L=M.invert(R),D=M.k*(A.shiftKey?.5:2),F=n(S(w(M,D),R,L),r.apply(this,O),s);oe(A),f>0?K(this).transition().duration(f).call(y,F,R,A):K(this).call(g.transform,F,R,A)}}function E(A,...O){if(e.apply(this,arguments)){var M=A.touches,R=M.length,L=b(this,O,A.changedTouches.length===R).event(A),D,F,j,q;for(yr(A),F=0;F=i)&&(n=i);else{let i=-1;for(let o of e)(o=r(o,++i,e))!=null&&(n=o)&&(n=o)}return n}function Ee(e,r){let n;if(r===void 0)for(let i of e)i!=null&&(n>i||n===void 0&&i>=i)&&(n=i);else{let i=-1;for(let o of e)(o=r(o,++i,e))!=null&&(n>o||n===void 0&&o>=o)&&(n=o)}return n}function _r(e,r){let n=0;if(r===void 0)for(let i of e)(i=+i)&&(n+=i);else{let i=-1;for(let o of e)(o=+r(o,++i,e))&&(n+=o)}return n}var su=typeof global=="object"&&global&&global.Object===Object&&global,To=su;var fu=typeof self=="object"&&self&&self.Object===Object&&self,lu=To||fu||Function("return this")(),vr=lu;var uu=vr.Symbol,se=uu;var zo=Object.prototype,cu=zo.hasOwnProperty,hu=zo.toString,Ie=se?se.toStringTag:void 0;function pu(e){var r=cu.call(e,Ie),n=e[Ie];try{e[Ie]=void 0;var i=!0}catch{}var o=hu.call(e);return i&&(r?e[Ie]=n:delete e[Ie]),o}var Oo=pu;var du=Object.prototype,mu=du.toString;function gu(e){return mu.call(e)}var Eo=gu;var xu="[object Null]",yu="[object Undefined]",Io=se?se.toStringTag:void 0;function _u(e){return e==null?e===void 0?yu:xu:Io&&Io in Object(e)?Oo(e):Eo(e)}var Ro=_u;function vu(e){return e!=null&&typeof e=="object"}var No=vu;var bu="[object Symbol]";function wu(e){return typeof e=="symbol"||No(e)&&Ro(e)==bu}var Do=wu;var ku=/\s/;function Au(e){for(var r=e.length;r--&&ku.test(e.charAt(r)););return r}var jo=Au;var Su=/^\s+/;function Cu(e){return e&&e.slice(0,jo(e)+1).replace(Su,"")}var Lo=Cu;function Mu(e){var r=typeof e;return e!=null&&(r=="object"||r=="function")}var Gt=Mu;var Fo=NaN,Pu=/^[-+]0x[0-9a-f]+$/i,Tu=/^0b[01]+$/i,zu=/^0o[0-7]+$/i,Ou=parseInt;function Eu(e){if(typeof e=="number")return e;if(Do(e))return Fo;if(Gt(e)){var r=typeof e.valueOf=="function"?e.valueOf():e;e=Gt(r)?r+"":r}if(typeof e!="string")return e===0?e:+e;e=Lo(e);var n=Tu.test(e);return n||zu.test(e)?Ou(e.slice(2),n?2:8):Pu.test(e)?Fo:+e}var nn=Eu;var Iu=function(){return vr.Date.now()},br=Iu;var Ru="Expected a function",Nu=Math.max,Du=Math.min;function ju(e,r,n){var i,o,a,s,f,u,l=0,c=!1,h=!1,p=!0;if(typeof e!="function")throw new TypeError(Ru);r=nn(r)||0,Gt(n)&&(c=!!n.leading,h="maxWait"in n,a=h?Nu(nn(n.maxWait)||0,r):a,p="trailing"in n?!!n.trailing:p);function d(b){var k=i,C=o;return i=o=void 0,l=b,s=e.apply(C,k),s}function m(b){return l=b,f=setTimeout(g,r),c?d(b):s}function x(b){var k=b-u,C=b-l,T=r-k;return h?Du(T,a-C):T}function _(b){var k=b-u,C=b-l;return u===void 0||k>=r||k<0||h&&C>=a}function g(){var b=br();if(_(b))return w(b);f=setTimeout(g,x(b))}function w(b){return f=void 0,p&&i?d(b):(i=o=void 0,s)}function S(){f!==void 0&&clearTimeout(f),l=0,i=u=o=f=void 0}function v(){return f===void 0?s:w(br())}function y(){var b=br(),k=_(b);if(i=arguments,o=this,u=b,k){if(f===void 0)return m(u);if(h)return clearTimeout(f),f=setTimeout(g,r),d(u)}return f===void 0&&(f=setTimeout(g,r)),s}return y.cancel=S,y.flush=v,y}var wr=ju;var Lu="Expected a function";function Fu(e,r,n){var i=!0,o=!0;if(typeof e!="function")throw new TypeError(Lu);return Gt(n)&&(i="leading"in n?!!n.leading:i,o="trailing"in n?!!n.trailing:o),wr(e,r,{leading:i,maxWait:r,trailing:o})}var on=Fu;var Dt=Object.freeze({Linear:Object.freeze({None:function(e){return e},In:function(e){return e},Out:function(e){return e},InOut:function(e){return e}}),Quadratic:Object.freeze({In:function(e){return e*e},Out:function(e){return e*(2-e)},InOut:function(e){return(e*=2)<1?.5*e*e:-.5*(--e*(e-2)-1)}}),Cubic:Object.freeze({In:function(e){return e*e*e},Out:function(e){return--e*e*e+1},InOut:function(e){return(e*=2)<1?.5*e*e*e:.5*((e-=2)*e*e+2)}}),Quartic:Object.freeze({In:function(e){return e*e*e*e},Out:function(e){return 1- --e*e*e*e},InOut:function(e){return(e*=2)<1?.5*e*e*e*e:-.5*((e-=2)*e*e*e-2)}}),Quintic:Object.freeze({In:function(e){return e*e*e*e*e},Out:function(e){return--e*e*e*e*e+1},InOut:function(e){return(e*=2)<1?.5*e*e*e*e*e:.5*((e-=2)*e*e*e*e+2)}}),Sinusoidal:Object.freeze({In:function(e){return 1-Math.sin((1-e)*Math.PI/2)},Out:function(e){return Math.sin(e*Math.PI/2)},InOut:function(e){return .5*(1-Math.sin(Math.PI*(.5-e)))}}),Exponential:Object.freeze({In:function(e){return e===0?0:Math.pow(1024,e-1)},Out:function(e){return e===1?1:1-Math.pow(2,-10*e)},InOut:function(e){return e===0?0:e===1?1:(e*=2)<1?.5*Math.pow(1024,e-1):.5*(-Math.pow(2,-10*(e-1))+2)}}),Circular:Object.freeze({In:function(e){return 1-Math.sqrt(1-e*e)},Out:function(e){return Math.sqrt(1- --e*e)},InOut:function(e){return(e*=2)<1?-.5*(Math.sqrt(1-e*e)-1):.5*(Math.sqrt(1-(e-=2)*e)+1)}}),Elastic:Object.freeze({In:function(e){return e===0?0:e===1?1:-Math.pow(2,10*(e-1))*Math.sin((e-1.1)*5*Math.PI)},Out:function(e){return e===0?0:e===1?1:Math.pow(2,-10*e)*Math.sin((e-.1)*5*Math.PI)+1},InOut:function(e){return e===0?0:e===1?1:(e*=2,e<1?-.5*Math.pow(2,10*(e-1))*Math.sin((e-1.1)*5*Math.PI):.5*Math.pow(2,-10*(e-1))*Math.sin((e-1.1)*5*Math.PI)+1)}}),Back:Object.freeze({In:function(e){var r=1.70158;return e===1?1:e*e*((r+1)*e-r)},Out:function(e){var r=1.70158;return e===0?0:--e*e*((r+1)*e+r)+1},InOut:function(e){var r=2.5949095;return(e*=2)<1?.5*(e*e*((r+1)*e-r)):.5*((e-=2)*e*((r+1)*e+r)+2)}}),Bounce:Object.freeze({In:function(e){return 1-Dt.Bounce.Out(1-e)},Out:function(e){return e<.36363636363636365?7.5625*e*e:e<.7272727272727273?7.5625*(e-=.5454545454545454)*e+.75:e<.9090909090909091?7.5625*(e-=.8181818181818182)*e+.9375:7.5625*(e-=.9545454545454546)*e+.984375},InOut:function(e){return e<.5?Dt.Bounce.In(e*2)*.5:Dt.Bounce.Out(e*2-1)*.5+.5}}),generatePow:function(e){return e===void 0&&(e=4),e=e1e4?1e4:e,{In:function(r){return Math.pow(r,e)},Out:function(r){return 1-Math.pow(1-r,e)},InOut:function(r){return r<.5?Math.pow(r*2,e)/2:(1-Math.pow(2-r*2,e))/2+.5}}}}),Re=function(){return performance.now()},sn=(function(){function e(){for(var r=[],n=0;n0;){this._tweensAddedDuringUpdate={};for(var o=0;o1?a(e[n],e[n-1],n-i):a(e[o],e[o+1>n?n:o+1],i-o)},Bezier:function(e,r){for(var n=0,i=e.length-1,o=Math.pow,a=fe.Utils.Bernstein,s=0;s<=i;s++)n+=o(1-r,i-s)*o(r,s)*e[s]*a(i,s);return n},CatmullRom:function(e,r){var n=e.length-1,i=n*r,o=Math.floor(i),a=fe.Utils.CatmullRom;return e[0]===e[n]?(r<0&&(o=Math.floor(i=n*(1+r))),a(e[(o-1+n)%n],e[o],e[(o+1)%n],e[(o+2)%n],i-o)):r<0?e[0]-(a(e[0],e[0],e[1],e[1],-i)-e[0]):r>1?e[n]-(a(e[n],e[n],e[n-1],e[n-1],i-n)-e[n]):a(e[o?o-1:0],e[o],e[n1;i--)n*=i;return e[r]=n,n}})(),CatmullRom:function(e,r,n,i,o){var a=(n-e)*.5,s=(i-r)*.5,f=o*o,u=o*f;return(2*r-2*n+a+s)*u+(-3*r+3*n-2*a-s)*f+a*o+r}}},Uo=(function(){function e(){}return e.nextId=function(){return e._nextId++},e._nextId=0,e})(),an=new sn,fn=(function(){function e(r,n){this._isPaused=!1,this._pauseStart=0,this._valuesStart={},this._valuesEnd={},this._valuesStartRepeat={},this._duration=1e3,this._isDynamic=!1,this._initialRepeat=0,this._repeat=0,this._yoyo=!1,this._isPlaying=!1,this._reversed=!1,this._delayTime=0,this._startTime=0,this._easingFunction=Dt.Linear.None,this._interpolationFunction=fe.Linear,this._chainedTweens=[],this._onStartCallbackFired=!1,this._onEveryStartCallbackFired=!1,this._id=Uo.nextId(),this._isChainStopped=!1,this._propertiesAreSetUp=!1,this._goToEnd=!1,this._object=r,typeof n=="object"?(this._group=n,n.add(this)):n===!0&&(this._group=an,an.add(this))}return e.prototype.getId=function(){return this._id},e.prototype.isPlaying=function(){return this._isPlaying},e.prototype.isPaused=function(){return this._isPaused},e.prototype.getDuration=function(){return this._duration},e.prototype.to=function(r,n){if(n===void 0&&(n=1e3),this._isPlaying)throw new Error("Can not call Tween.to() while Tween is already started or paused. Stop the Tween first.");return this._valuesEnd=r,this._propertiesAreSetUp=!1,this._duration=n<0?0:n,this},e.prototype.duration=function(r){return r===void 0&&(r=1e3),this._duration=r<0?0:r,this},e.prototype.dynamic=function(r){return r===void 0&&(r=!1),this._isDynamic=r,this},e.prototype.start=function(r,n){if(r===void 0&&(r=Re()),n===void 0&&(n=!1),this._isPlaying)return this;if(this._repeat=this._initialRepeat,this._reversed){this._reversed=!1;for(var i in this._valuesStartRepeat)this._swapEndStartRepeatValues(i),this._valuesStart[i]=this._valuesStartRepeat[i]}if(this._isPlaying=!0,this._isPaused=!1,this._onStartCallbackFired=!1,this._onEveryStartCallbackFired=!1,this._isChainStopped=!1,this._startTime=r,this._startTime+=this._delayTime,!this._propertiesAreSetUp||n){if(this._propertiesAreSetUp=!0,!this._isDynamic){var o={};for(var a in this._valuesEnd)o[a]=this._valuesEnd[a];this._valuesEnd=o}this._setupProperties(this._object,this._valuesStart,this._valuesEnd,this._valuesStartRepeat,n)}return this},e.prototype.startFromCurrentValues=function(r){return this.start(r,!0)},e.prototype._setupProperties=function(r,n,i,o,a){for(var s in i){var f=r[s],u=Array.isArray(f),l=u?"array":typeof f,c=!u&&Array.isArray(i[s]);if(!(l==="undefined"||l==="function")){if(c){var h=i[s];if(h.length===0)continue;for(var p=[f],d=0,m=h.length;d"u"||a)&&(n[s]=f),u||(n[s]*=1),c?o[s]=i[s].slice().reverse():o[s]=n[s]||0}}},e.prototype.stop=function(){return this._isChainStopped||(this._isChainStopped=!0,this.stopChainedTweens()),this._isPlaying?(this._isPlaying=!1,this._isPaused=!1,this._onStopCallback&&this._onStopCallback(this._object),this):this},e.prototype.end=function(){return this._goToEnd=!0,this.update(this._startTime+this._duration),this},e.prototype.pause=function(r){return r===void 0&&(r=Re()),this._isPaused||!this._isPlaying?this:(this._isPaused=!0,this._pauseStart=r,this)},e.prototype.resume=function(r){return r===void 0&&(r=Re()),!this._isPaused||!this._isPlaying?this:(this._isPaused=!1,this._startTime+=r-this._pauseStart,this._pauseStart=0,this)},e.prototype.stopChainedTweens=function(){for(var r=0,n=this._chainedTweens.length;ru)return 1;var x=Math.trunc(s/f),_=s-x*f,g=Math.min(_/i._duration,1);return g===0&&s===i._duration?1:g},c=l(),h=this._easingFunction(c);if(this._updateProperties(this._object,this._valuesStart,this._valuesEnd,h),this._onUpdateCallback&&this._onUpdateCallback(this._object,c),this._duration===0||s>=this._duration)if(this._repeat>0){var p=Math.min(Math.trunc((s-this._duration)/f)+1,this._repeat);isFinite(this._repeat)&&(this._repeat-=p);for(a in this._valuesStartRepeat)!this._yoyo&&typeof this._valuesEnd[a]=="string"&&(this._valuesStartRepeat[a]=this._valuesStartRepeat[a]+parseFloat(this._valuesEnd[a])),this._yoyo&&this._swapEndStartRepeatValues(a),this._valuesStart[a]=this._valuesStartRepeat[a];return this._yoyo&&(this._reversed=!this._reversed),this._startTime+=f*p,this._onRepeatCallback&&this._onRepeatCallback(this._object),this._onEveryStartCallbackFired=!1,!0}else{this._onCompleteCallback&&this._onCompleteCallback(this._object);for(var d=0,m=this._chainedTweens.length;de.length)&&(r=e.length);for(var n=0,i=Array(r);n=0,a=!n&&o&&(r==="hex"||r==="hex6"||r==="hex3"||r==="hex4"||r==="hex8"||r==="name");return a?r==="name"&&this._a===0?this.toName():this.toRgbString():(r==="rgb"&&(i=this.toRgbString()),r==="prgb"&&(i=this.toPercentageRgbString()),(r==="hex"||r==="hex6")&&(i=this.toHexString()),r==="hex3"&&(i=this.toHexString(!0)),r==="hex4"&&(i=this.toHex8String(!0)),r==="hex8"&&(i=this.toHex8String()),r==="name"&&(i=this.toName()),r==="hsl"&&(i=this.toHslString()),r==="hsv"&&(i=this.toHsvString()),i||this.toHexString())},clone:function(){return N(this.toString())},_applyModification:function(r,n){var i=r.apply(null,[this].concat([].slice.call(n)));return this._r=i._r,this._g=i._g,this._b=i._b,this.setAlpha(i._a),this},lighten:function(){return this._applyModification(ic,arguments)},brighten:function(){return this._applyModification(oc,arguments)},darken:function(){return this._applyModification(ac,arguments)},desaturate:function(){return this._applyModification(ec,arguments)},saturate:function(){return this._applyModification(rc,arguments)},greyscale:function(){return this._applyModification(nc,arguments)},spin:function(){return this._applyModification(sc,arguments)},_applyCombination:function(r,n){return r.apply(null,[this].concat([].slice.call(n)))},analogous:function(){return this._applyCombination(uc,arguments)},complement:function(){return this._applyCombination(fc,arguments)},monochromatic:function(){return this._applyCombination(cc,arguments)},splitcomplement:function(){return this._applyCombination(lc,arguments)},triad:function(){return this._applyCombination(Go,[3])},tetrad:function(){return this._applyCombination(Go,[4])}};N.fromRatio=function(e,r){if(kr(e)=="object"){var n={};for(var i in e)e.hasOwnProperty(i)&&(i==="a"?n[i]=e[i]:n[i]=De(e[i]));e=n}return N(e,r)};function Zu(e){var r={r:0,g:0,b:0},n=1,i=null,o=null,a=null,s=!1,f=!1;return typeof e=="string"&&(e=gc(e)),kr(e)=="object"&&(Tt(e.r)&&Tt(e.g)&&Tt(e.b)?(r=Ku(e.r,e.g,e.b),s=!0,f=String(e.r).substr(-1)==="%"?"prgb":"rgb"):Tt(e.h)&&Tt(e.s)&&Tt(e.v)?(i=De(e.s),o=De(e.v),r=Ju(e.h,i,o),s=!0,f="hsv"):Tt(e.h)&&Tt(e.s)&&Tt(e.l)&&(i=De(e.s),a=De(e.l),r=Qu(e.h,i,a),s=!0,f="hsl"),e.hasOwnProperty("a")&&(n=e.a)),n=Yo(n),{ok:s,format:e.format||f,r:Math.min(255,Math.max(r.r,0)),g:Math.min(255,Math.max(r.g,0)),b:Math.min(255,Math.max(r.b,0)),a:n}}function Ku(e,r,n){return{r:W(e,255)*255,g:W(r,255)*255,b:W(n,255)*255}}function Bo(e,r,n){e=W(e,255),r=W(r,255),n=W(n,255);var i=Math.max(e,r,n),o=Math.min(e,r,n),a,s,f=(i+o)/2;if(i==o)a=s=0;else{var u=i-o;switch(s=f>.5?u/(2-i-o):u/(i+o),i){case e:a=(r-n)/u+(r1&&(h-=1),h<1/6?l+(c-l)*6*h:h<1/2?c:h<2/3?l+(c-l)*(2/3-h)*6:l}if(r===0)i=o=a=n;else{var f=n<.5?n*(1+r):n+r-n*r,u=2*n-f;i=s(u,f,e+1/3),o=s(u,f,e),a=s(u,f,e-1/3)}return{r:i*255,g:o*255,b:a*255}}function Ho(e,r,n){e=W(e,255),r=W(r,255),n=W(n,255);var i=Math.max(e,r,n),o=Math.min(e,r,n),a,s,f=i,u=i-o;if(s=i===0?0:u/i,i==o)a=0;else{switch(i){case e:a=(r-n)/u+(r>1)+720)%360;--r;)i.h=(i.h+o)%360,a.push(N(i));return a}function cc(e,r){r=r||6;for(var n=N(e).toHsv(),i=n.h,o=n.s,a=n.v,s=[],f=1/r;r--;)s.push(N({h:i,s:o,v:a})),a=(a+f)%1;return s}N.mix=function(e,r,n){n=n===0?0:n||50;var i=N(e).toRgb(),o=N(r).toRgb(),a=n/100,s={r:(o.r-i.r)*a+i.r,g:(o.g-i.g)*a+i.g,b:(o.b-i.b)*a+i.b,a:(o.a-i.a)*a+i.a};return N(s)};N.readability=function(e,r){var n=N(e),i=N(r);return(Math.max(n.getLuminance(),i.getLuminance())+.05)/(Math.min(n.getLuminance(),i.getLuminance())+.05)};N.isReadable=function(e,r,n){var i=N.readability(e,r),o,a;switch(a=!1,o=xc(n),o.level+o.size){case"AAsmall":case"AAAlarge":a=i>=4.5;break;case"AAlarge":a=i>=3;break;case"AAAsmall":a=i>=7;break}return a};N.mostReadable=function(e,r,n){var i=null,o=0,a,s,f,u;n=n||{},s=n.includeFallbackColors,f=n.level,u=n.size;for(var l=0;lo&&(o=a,i=N(r[l]));return N.isReadable(e,i,{level:f,size:u})||!s?i:(n.includeFallbackColors=!1,N.mostReadable(e,["#fff","#000"],n))};var ln=N.names={aliceblue:"f0f8ff",antiquewhite:"faebd7",aqua:"0ff",aquamarine:"7fffd4",azure:"f0ffff",beige:"f5f5dc",bisque:"ffe4c4",black:"000",blanchedalmond:"ffebcd",blue:"00f",blueviolet:"8a2be2",brown:"a52a2a",burlywood:"deb887",burntsienna:"ea7e5d",cadetblue:"5f9ea0",chartreuse:"7fff00",chocolate:"d2691e",coral:"ff7f50",cornflowerblue:"6495ed",cornsilk:"fff8dc",crimson:"dc143c",cyan:"0ff",darkblue:"00008b",darkcyan:"008b8b",darkgoldenrod:"b8860b",darkgray:"a9a9a9",darkgreen:"006400",darkgrey:"a9a9a9",darkkhaki:"bdb76b",darkmagenta:"8b008b",darkolivegreen:"556b2f",darkorange:"ff8c00",darkorchid:"9932cc",darkred:"8b0000",darksalmon:"e9967a",darkseagreen:"8fbc8f",darkslateblue:"483d8b",darkslategray:"2f4f4f",darkslategrey:"2f4f4f",darkturquoise:"00ced1",darkviolet:"9400d3",deeppink:"ff1493",deepskyblue:"00bfff",dimgray:"696969",dimgrey:"696969",dodgerblue:"1e90ff",firebrick:"b22222",floralwhite:"fffaf0",forestgreen:"228b22",fuchsia:"f0f",gainsboro:"dcdcdc",ghostwhite:"f8f8ff",gold:"ffd700",goldenrod:"daa520",gray:"808080",green:"008000",greenyellow:"adff2f",grey:"808080",honeydew:"f0fff0",hotpink:"ff69b4",indianred:"cd5c5c",indigo:"4b0082",ivory:"fffff0",khaki:"f0e68c",lavender:"e6e6fa",lavenderblush:"fff0f5",lawngreen:"7cfc00",lemonchiffon:"fffacd",lightblue:"add8e6",lightcoral:"f08080",lightcyan:"e0ffff",lightgoldenrodyellow:"fafad2",lightgray:"d3d3d3",lightgreen:"90ee90",lightgrey:"d3d3d3",lightpink:"ffb6c1",lightsalmon:"ffa07a",lightseagreen:"20b2aa",lightskyblue:"87cefa",lightslategray:"789",lightslategrey:"789",lightsteelblue:"b0c4de",lightyellow:"ffffe0",lime:"0f0",limegreen:"32cd32",linen:"faf0e6",magenta:"f0f",maroon:"800000",mediumaquamarine:"66cdaa",mediumblue:"0000cd",mediumorchid:"ba55d3",mediumpurple:"9370db",mediumseagreen:"3cb371",mediumslateblue:"7b68ee",mediumspringgreen:"00fa9a",mediumturquoise:"48d1cc",mediumvioletred:"c71585",midnightblue:"191970",mintcream:"f5fffa",mistyrose:"ffe4e1",moccasin:"ffe4b5",navajowhite:"ffdead",navy:"000080",oldlace:"fdf5e6",olive:"808000",olivedrab:"6b8e23",orange:"ffa500",orangered:"ff4500",orchid:"da70d6",palegoldenrod:"eee8aa",palegreen:"98fb98",paleturquoise:"afeeee",palevioletred:"db7093",papayawhip:"ffefd5",peachpuff:"ffdab9",peru:"cd853f",pink:"ffc0cb",plum:"dda0dd",powderblue:"b0e0e6",purple:"800080",rebeccapurple:"663399",red:"f00",rosybrown:"bc8f8f",royalblue:"4169e1",saddlebrown:"8b4513",salmon:"fa8072",sandybrown:"f4a460",seagreen:"2e8b57",seashell:"fff5ee",sienna:"a0522d",silver:"c0c0c0",skyblue:"87ceeb",slateblue:"6a5acd",slategray:"708090",slategrey:"708090",snow:"fffafa",springgreen:"00ff7f",steelblue:"4682b4",tan:"d2b48c",teal:"008080",thistle:"d8bfd8",tomato:"ff6347",turquoise:"40e0d0",violet:"ee82ee",wheat:"f5deb3",white:"fff",whitesmoke:"f5f5f5",yellow:"ff0",yellowgreen:"9acd32"},hc=N.hexNames=pc(ln);function pc(e){var r={};for(var n in e)e.hasOwnProperty(n)&&(r[e[n]]=n);return r}function Yo(e){return e=parseFloat(e),(isNaN(e)||e<0||e>1)&&(e=1),e}function W(e,r){dc(e)&&(e="100%");var n=mc(e);return e=Math.min(r,Math.max(0,parseFloat(e))),n&&(e=parseInt(e*r,10)/100),Math.abs(e-r)<1e-6?1:e%r/parseFloat(r)}function Ar(e){return Math.min(1,Math.max(0,e))}function ut(e){return parseInt(e,16)}function dc(e){return typeof e=="string"&&e.indexOf(".")!=-1&&parseFloat(e)===1}function mc(e){return typeof e=="string"&&e.indexOf("%")!=-1}function _t(e){return e.length==1?"0"+e:""+e}function De(e){return e<=1&&(e=e*100+"%"),e}function Xo(e){return Math.round(parseFloat(e)*255).toString(16)}function Vo(e){return ut(e)/255}var yt=(function(){var e="[-\\+]?\\d+%?",r="[-\\+]?\\d*\\.\\d+%?",n="(?:"+r+")|(?:"+e+")",i="[\\s|\\(]+("+n+")[,|\\s]+("+n+")[,|\\s]+("+n+")\\s*\\)?",o="[\\s|\\(]+("+n+")[,|\\s]+("+n+")[,|\\s]+("+n+")[,|\\s]+("+n+")\\s*\\)?";return{CSS_UNIT:new RegExp(n),rgb:new RegExp("rgb"+i),rgba:new RegExp("rgba"+o),hsl:new RegExp("hsl"+i),hsla:new RegExp("hsla"+o),hsv:new RegExp("hsv"+i),hsva:new RegExp("hsva"+o),hex3:/^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,hex6:/^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/,hex4:/^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,hex8:/^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/}})();function Tt(e){return!!yt.CSS_UNIT.exec(e)}function gc(e){e=e.replace(Yu,"").replace(Xu,"").toLowerCase();var r=!1;if(ln[e])e=ln[e],r=!0;else if(e=="transparent")return{r:0,g:0,b:0,a:0,format:"name"};var n;return(n=yt.rgb.exec(e))?{r:n[1],g:n[2],b:n[3]}:(n=yt.rgba.exec(e))?{r:n[1],g:n[2],b:n[3],a:n[4]}:(n=yt.hsl.exec(e))?{h:n[1],s:n[2],l:n[3]}:(n=yt.hsla.exec(e))?{h:n[1],s:n[2],l:n[3],a:n[4]}:(n=yt.hsv.exec(e))?{h:n[1],s:n[2],v:n[3]}:(n=yt.hsva.exec(e))?{h:n[1],s:n[2],v:n[3],a:n[4]}:(n=yt.hex8.exec(e))?{r:ut(n[1]),g:ut(n[2]),b:ut(n[3]),a:Vo(n[4]),format:r?"name":"hex8"}:(n=yt.hex6.exec(e))?{r:ut(n[1]),g:ut(n[2]),b:ut(n[3]),format:r?"name":"hex"}:(n=yt.hex4.exec(e))?{r:ut(n[1]+""+n[1]),g:ut(n[2]+""+n[2]),b:ut(n[3]+""+n[3]),a:Vo(n[4]+""+n[4]),format:r?"name":"hex8"}:(n=yt.hex3.exec(e))?{r:ut(n[1]+""+n[1]),g:ut(n[2]+""+n[2]),b:ut(n[3]+""+n[3]),format:r?"name":"hex"}:!1}function xc(e){var r,n;return e=e||{level:"AA",size:"small"},r=(e.level||"AA").toUpperCase(),n=(e.size||"small").toLowerCase(),r!=="AA"&&r!=="AAA"&&(r="AA"),n!=="small"&&n!=="large"&&(n="small"),{level:r,size:n}}function un(e,r){(r==null||r>e.length)&&(r=e.length);for(var n=0,i=Array(r);n0&&arguments[0]!==void 0?arguments[0]:6;vc(this,e),Zo(this,Vt,void 0),Zo(this,zt,void 0),Ko(zt,this,r),this.reset()}return wc(e,[{key:"reset",value:function(){Ko(Vt,this,["__reserved for background__"])}},{key:"register",value:function(n){if(ht(Vt,this).length>=Math.pow(2,24-ht(zt,this)))return null;var i=ht(Vt,this).length,o=Qo(i,ht(zt,this)),a=zc(i+(o<<24-ht(zt,this)));return ht(Vt,this).push(n),a}},{key:"lookup",value:function(n){if(!n)return null;var i=typeof n=="string"?Oc(n):ta.apply(void 0,Sc(n));if(!i)return null;var o=i&Math.pow(2,24-ht(zt,this))-1,a=i>>24-ht(zt,this)&Math.pow(2,ht(zt,this))-1;return Qo(o,ht(zt,this))!==a||o>=ht(Vt,this).length?null:ht(Vt,this)[o]}}])})();var Fe,G,aa,dn,jt,ra,sa,fa,cn,Cr,je,la,mn,hn,pn,Ec,Pr={},Tr=[],Ic=/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i,Or=Array.isArray;function wt(e,r){for(var n in r)e[n]=r[n];return e}function gn(e){e&&e.parentNode&&e.parentNode.removeChild(e)}function Rc(e,r,n){var i,o,a,s={};for(a in r)a=="key"?i=r[a]:a=="ref"?o=r[a]:s[a]=r[a];if(arguments.length>2&&(s.children=arguments.length>3?Fe.call(arguments,2):n),typeof e=="function"&&e.defaultProps!=null)for(a in e.defaultProps)s[a]===void 0&&(s[a]=e.defaultProps[a]);return Le(e,s,i,o,null)}function Le(e,r,n,i,o){var a={type:e,props:r,key:n,ref:i,__k:null,__:null,__b:0,__e:null,__c:null,constructor:void 0,__v:o??++aa,__i:-1,__u:0};return o==null&&G.vnode!=null&&G.vnode(a),a}function Er(e){return e.children}function Mr(e,r){this.props=e,this.context=r}function Yt(e,r){if(r==null)return e.__?Yt(e.__,e.__i+1):null;for(var n;rr&&jt.sort(fa),e=jt.shift(),r=jt.length,Nc(e)}finally{jt.length=zr.__r=0}}function ca(e,r,n,i,o,a,s,f,u,l,c){var h,p,d,m,x,_,g=i&&i.__k||Tr,w=r.length;for(u=Dc(n,r,g,u,w),h=0;h0?s=e.__k[a]=Le(s.type,s.props,s.key,s.ref?s.ref:null,s.__v):e.__k[a]=s,u=a+p,s.__=e,s.__b=e.__b+1,f=null,(l=s.__i=jc(s,n,u,h))!=-1&&(h--,(f=n[l])&&(f.__u|=2)),f==null||f.__v==null?(l==-1&&(o>c?p--:ou?p--:p++,s.__u|=4))):e.__k[a]=null;if(h)for(a=0;a(c?1:0)){for(o=n-1,a=n+1;o>=0||a=0?o--:a++])!=null&&(2&l.__u)==0&&f==l.key&&u==l.type)return s}return-1}function ia(e,r,n){r[0]=="-"?e.setProperty(r,n??""):e[r]=n==null?"":typeof n!="number"||Ic.test(r)?n:n+"px"}function Sr(e,r,n,i,o){var a,s;t:if(r=="style")if(typeof n=="string")e.style.cssText=n;else{if(typeof i=="string"&&(e.style.cssText=i=""),i)for(r in i)n&&r in n||ia(e.style,r,"");if(n)for(r in n)i&&n[r]==i[r]||ia(e.style,r,n[r])}else if(r[0]=="o"&&r[1]=="n")a=r!=(r=r.replace(la,"$1")),s=r.toLowerCase(),r=s in e||r=="onFocusOut"||r=="onFocusIn"?s.slice(2):r.slice(2),e.l||(e.l={}),e.l[r+a]=n,n?i?n[je]=i[je]:(n[je]=mn,e.addEventListener(r,a?pn:hn,a)):e.removeEventListener(r,a?pn:hn,a);else{if(o=="http://www.w3.org/2000/svg")r=r.replace(/xlink(H|:h)/,"h").replace(/sName$/,"s");else if(r!="width"&&r!="height"&&r!="href"&&r!="list"&&r!="form"&&r!="tabIndex"&&r!="download"&&r!="rowSpan"&&r!="colSpan"&&r!="role"&&r!="popover"&&r in e)try{e[r]=n??"";break t}catch{}typeof n=="function"||(n==null||n===!1&&r[4]!="-"?e.removeAttribute(r):e.setAttribute(r,r=="popover"&&n==1?"":n))}}function oa(e){return function(r){if(this.l){var n=this.l[r.type+e];if(r[Cr]==null)r[Cr]=mn++;else if(r[Cr]0?e:Or(e)?e.map(ma):e.constructor!==void 0?null:wt({},e)}function Lc(e,r,n,i,o,a,s,f,u){var l,c,h,p,d,m,x,_=n.props||Pr,g=r.props,w=r.type;if(w=="svg"?o="http://www.w3.org/2000/svg":w=="math"?o="http://www.w3.org/1998/Math/MathML":o||(o="http://www.w3.org/1999/xhtml"),a!=null){for(l=0;l2&&(f.children=arguments.length>3?Fe.call(arguments,2):n),Le(e.type,f,i||e.key,o||e.ref,null)}Fe=Tr.slice,G={__e:function(e,r,n,i){for(var o,a,s;r=r.__;)if((o=r.__c)&&!o.__)try{if((a=o.constructor)&&a.getDerivedStateFromError!=null&&(o.setState(a.getDerivedStateFromError(e)),s=o.__d),o.componentDidCatch!=null&&(o.componentDidCatch(e,i||{}),s=o.__d),s)return o.__E=o}catch(f){e=f}throw e}},aa=0,dn=function(e){return e!=null&&e.constructor===void 0},Mr.prototype.setState=function(e,r){var n;n=this.__s!=null&&this.__s!=this.state?this.__s:this.__s=wt({},this.state),typeof e=="function"&&(e=e(wt({},n),this.props)),e&&wt(n,e),e!=null&&this.__v&&(r&&this._sb.push(r),na(this))},Mr.prototype.forceUpdate=function(e){this.__v&&(this.__e=!0,e&&this.__h.push(e),na(this))},Mr.prototype.render=Er,jt=[],sa=typeof Promise=="function"?Promise.prototype.then.bind(Promise.resolve()):setTimeout,fa=function(e,r){return e.__v.__b-r.__v.__b},zr.__r=0,cn=Math.random().toString(8),Cr="__d"+cn,je="__a"+cn,la=/(PointerCapture)$|Capture$/i,mn=0,hn=oa(!1),pn=oa(!0),Ec=0;function ya(e,r){(r==null||r>e.length)&&(r=e.length);for(var n=0,i=Array(r);n"u")){var i=document.head||document.getElementsByTagName("head")[0],o=document.createElement("style");o.type="text/css",n==="top"&&i.firstChild?i.insertBefore(o,i.firstChild):i.appendChild(o),o.styleSheet?o.styleSheet.cssText=e:o.appendChild(document.createTextNode(e))}}var Qc=`.float-tooltip-kap { position: absolute; width: max-content; /* prevent shrinking near right edge */ max-width: max(50%, 150px); @@ -12,9 +12,9 @@ In order to be iterable, non-array objects must have a [Symbol.iterator]() metho background: rgba(0,0,0,0.6); pointer-events: none; } -`;Kc(Qc);var _a=Re({props:{content:{default:!1},offsetX:{triggerUpdate:!1},offsetY:{triggerUpdate:!1}},init:function(r,n){var i=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{},o=i.style,a=o===void 0?{}:o,s=!!r&&Ir(r)==="object"&&!!r.node&&typeof r.node=="function",f=K(s?r.node():r);f.style("position")==="static"&&f.style("position","relative"),n.tooltipEl=f.append("div").attr("class","float-tooltip-kap"),Object.entries(a).forEach(function(l){var c=Gc(l,2),p=c[0],h=c[1];return n.tooltipEl.style(p,h)}),n.tooltipEl.style("left","-10000px").style("display","none");var u="tooltip-".concat(Math.round(Math.random()*1e12));n.mouseInside=!1,f.on("mousemove.".concat(u),function(l){n.mouseInside=!0;var c=at(l),p=f.node(),h=p.offsetWidth,d=p.offsetHeight,m=[n.offsetX===null||n.offsetX===void 0?"-".concat(c[0]/h*100,"%"):typeof n.offsetX=="number"?"calc(-50% + ".concat(n.offsetX,"px)"):n.offsetX,n.offsetY===null||n.offsetY===void 0?d>130&&d-c[1]<100?"calc(-100% - 6px)":"21px":typeof n.offsetY=="number"?n.offsetY<0?"calc(-100% - ".concat(Math.abs(n.offsetY),"px)"):"".concat(n.offsetY,"px"):n.offsetY];n.tooltipEl.style("left",c[0]+"px").style("top",c[1]+"px").style("transform","translate(".concat(m.join(","),")")),n.content&&n.tooltipEl.style("display","inline")}),f.on("mouseover.".concat(u),function(){n.mouseInside=!0,n.content&&n.tooltipEl.style("display","inline")}),f.on("mouseout.".concat(u),function(){n.mouseInside=!1,n.tooltipEl.style("display","none")})},update:function(r){r.tooltipEl.style("display",r.content&&r.mouseInside?"inline":"none"),r.content?r.content instanceof HTMLElement?(r.tooltipEl.text(""),r.tooltipEl.append(function(){return r.content})):typeof r.content=="string"?r.tooltipEl.html(r.content):Xc(r.content)?(r.tooltipEl.text(""),Zc(r.content,r.tooltipEl.node())):(r.tooltipEl.style("display","none"),console.warn("Tooltip content is invalid, skipping.",r.content,r.content.toString())):r.tooltipEl.text("")}});function bn(e,r,n){var i,o=1;e==null&&(e=0),r==null&&(r=0),n==null&&(n=0);function a(){var s,f=i.length,u,l=0,c=0,p=0;for(s=0;s=(u=(s+f)/2))?s=u:f=u,i=o,!(o=o[p=+c]))return i[p]=a,e;if(l=+e._x.call(null,o.data),r===l)return a.next=o,i?i[p]=a:e._root=a,e;do i=i?i[p]=new Array(2):e._root=new Array(2),(c=r>=(u=(s+f)/2))?s=u:f=u;while((p=+c)==(h=+(l>=u)));return i[h]=o,i[p]=a,e}function wa(e){Array.isArray(e)||(e=Array.from(e));let r=e.length,n=new Float64Array(r),i=1/0,o=-1/0;for(let a=0,s;ao&&(o=s));if(i>o)return this;this.cover(i).cover(o);for(let a=0;ae||e>=n;)switch(s=+(es||(a=l.x1)=p))&&(l=f[f.length-1],f[f.length-1]=f[f.length-1-c],f[f.length-1-c]=l)}else{var h=Math.abs(e-+this._x.call(null,u.data));h=(l=(s+f)/2))?s=l:f=l,r=n,!(n=n[p=+c]))return this;if(!n.length)break;r[p+1&1]&&(i=r,h=p)}for(;n.data!==e;)if(o=n,!(n=n.next))return this;return(a=n.next)&&delete n.next,o?(a?o.next=a:delete o.next,this):r?(a?r[p]=a:delete r[p],(n=r[0]||r[1])&&n===(r[1]||r[0])&&!n.length&&(i?i[h]=n:this._root=n),this):(this._root=a,this)}function Pa(e){for(var r=0,n=e.length;r=(p=(f+l)/2))?f=p:l=p,(_=n>=(h=(u+c)/2))?u=h:c=h,o=a,!(a=a[g=_<<1|x]))return o[g]=s,e;if(d=+e._x.call(null,a.data),m=+e._y.call(null,a.data),r===d&&n===m)return s.next=a,o?o[g]=s:e._root=s,e;do o=o?o[g]=new Array(4):e._root=new Array(4),(x=r>=(p=(f+l)/2))?f=p:l=p,(_=n>=(h=(u+c)/2))?u=h:c=h;while((g=_<<1|x)===(w=(m>=h)<<1|d>=p));return o[w]=a,o[g]=s,e}function La(e){var r,n,i=e.length,o,a,s=new Array(i),f=new Array(i),u=1/0,l=1/0,c=-1/0,p=-1/0;for(n=0;nc&&(c=o),ap&&(p=a));if(u>c||l>p)return this;for(this.cover(u,l).cover(c,p),n=0;ne||e>=o||i>r||r>=a;)switch(l=(rc||(f=m.y0)>p||(u=m.x1)=g)<<1|e>=_)&&(m=h[h.length-1],h[h.length-1]=h[h.length-1-x],h[h.length-1-x]=m)}else{var w=e-+this._x.call(null,d.data),C=r-+this._y.call(null,d.data),v=w*w+C*C;if(v=(h=(s+u)/2))?s=h:u=h,(x=p>=(d=(f+l)/2))?f=d:l=d,r=n,!(n=n[_=x<<1|m]))return this;if(!n.length)break;(r[_+1&3]||r[_+2&3]||r[_+3&3])&&(i=r,g=_)}for(;n.data!==e;)if(o=n,!(n=n.next))return this;return(a=n.next)&&delete n.next,o?(a?o.next=a:delete o.next,this):r?(a?r[_]=a:delete r[_],(n=r[0]||r[1]||r[2]||r[3])&&n===(r[3]||r[2]||r[1]||r[0])&&!n.length&&(i?i[g]=n:this._root=n),this):(this._root=a,this)}function $a(e){for(var r=0,n=e.length;r=(m=(u+p)/2))?u=m:p=m,(y=n>=(x=(l+h)/2))?l=x:h=x,(b=i>=(_=(c+d)/2))?c=_:d=_,a=s,!(s=s[A=b<<2|y<<1|v]))return a[A]=f,e;if(g=+e._x.call(null,s.data),w=+e._y.call(null,s.data),C=+e._z.call(null,s.data),r===g&&n===w&&i===C)return f.next=s,a?a[A]=f:e._root=f,e;do a=a?a[A]=new Array(8):e._root=new Array(8),(v=r>=(m=(u+p)/2))?u=m:p=m,(y=n>=(x=(l+h)/2))?l=x:h=x,(b=i>=(_=(c+d)/2))?c=_:d=_;while((A=b<<2|y<<1|v)===(S=(C>=_)<<2|(w>=x)<<1|g>=m));return a[S]=s,a[A]=f,e}function rs(e){Array.isArray(e)||(e=Array.from(e));let r=e.length,n=new Float64Array(r),i=new Float64Array(r),o=new Float64Array(r),a=1/0,s=1/0,f=1/0,u=-1/0,l=-1/0,c=-1/0;for(let p=0,h,d,m,x;pu&&(u=d),ml&&(l=m),xc&&(c=x));if(a>u||s>l||f>c)return this;this.cover(a,s,f).cover(u,l,c);for(let p=0;pe||e>=s||o>r||r>=f||a>n||n>=u;)switch(h=(nm||(l=C.y0)>x||(c=C.z0)>_||(p=C.x1)=A)<<2|(r>=b)<<1|e>=y)&&(C=g[g.length-1],g[g.length-1]=g[g.length-1-v],g[g.length-1-v]=C)}else{var S=e-+this._x.call(null,w.data),T=r-+this._y.call(null,w.data),z=n-+this._z.call(null,w.data),O=S*S+T*T+z*z;if(OMath.sqrt((e-i)**2+(r-o)**2+(n-a)**2);function ss(e,r,n,i){let o=[],a=e-i,s=r-i,f=n-i,u=e+i,l=r+i,c=n+i;return this.visit((p,h,d,m,x,_,g)=>{if(!p.length)do{let w=p.data;Jc(e,r,n,this._x(w),this._y(w),this._z(w))<=i&&o.push(w)}while(p=p.next);return h>u||d>l||m>c||x=(x=(s+l)/2))?s=x:l=x,(C=d>=(_=(f+c)/2))?f=_:c=_,(v=m>=(g=(u+p)/2))?u=g:p=g,r=n,!(n=n[y=v<<2|C<<1|w]))return this;if(!n.length)break;(r[y+1&7]||r[y+2&7]||r[y+3&7]||r[y+4&7]||r[y+5&7]||r[y+6&7]||r[y+7&7])&&(i=r,b=y)}for(;n.data!==e;)if(o=n,!(n=n.next))return this;return(a=n.next)&&delete n.next,o?(a?o.next=a:delete o.next,this):r?(a?r[y]=a:delete r[y],(n=r[0]||r[1]||r[2]||r[3]||r[4]||r[5]||r[6]||r[7])&&n===(r[7]||r[6]||r[5]||r[4]||r[3]||r[2]||r[1]||r[0])&&!n.length&&(i?i[b]=n:this._root=n),this):(this._root=a,this)}function ls(e){for(var r=0,n=e.length;r1&&(x=d.y+d.vy),n>2&&(_=d.z+d.vz),h.visit(v);function v(y,b,A,S,T,z,O){var I=[b,A,S,T,z,O],U=I[0],k=I[1],E=I[2],M=I[n],R=I[n+1],L=I[n+2],D=y.data,F=y.r,j=g+F;if(D){if(D.index>d.index){var q=m-D.x-D.vx,Y=n>1?x-D.y-D.vy:0,$=n>2?_-D.z-D.vz:0,V=q*q+Y*Y+$*$;V1&&Y===0&&(Y=ot(o),V+=Y*Y),n>2&&$===0&&($=ot(o),V+=$*$),V=(j-(V=Math.sqrt(V)))/V*a,d.vx+=(q*=V)*(j=(F*=F)/(w+F)),n>1&&(d.vy+=(Y*=V)*j),n>2&&(d.vz+=($*=V)*j),D.vx-=q*(j=1-j),n>1&&(D.vy-=Y*j),n>2&&(D.vz-=$*j))}return}return U>m+j||M1&&(k>x+j||R2&&(E>_+j||L<_-j)}}function u(c){if(c.data)return c.r=i[c.data.index];for(var p=c.r=0;pc.r&&(c.r=c[p].r)}function l(){if(r){var c,p=r.length,h;for(i=new Array(p),c=0;ctypeof h=="function")||Math.random,n=p.find(h=>[1,2,3].includes(h))||2,l()},f.iterations=function(c){return arguments.length?(s=+c,f):s},f.strength=function(c){return arguments.length?(a=+c,f):a},f.radius=function(c){return arguments.length?(e=typeof c=="function"?c:it(+c),l(),f):e},f}function eh(e){return e.index}function ws(e,r){var n=e.get(r);if(!n)throw new Error("node not found: "+r);return n}function Mn(e){var r=eh,n=h,i,o=it(30),a,s,f,u,l,c,p=1;e==null&&(e=[]);function h(g){return 1/Math.min(u[g.source.index],u[g.target.index])}function d(g){for(var w=0,C=e.length;w1&&(T=A.y+A.vy-b.y-b.vy||ot(c)),f>2&&(z=A.z+A.vz-b.z-b.vz||ot(c)),O=Math.sqrt(S*S+T*T+z*z),O=(O-a[v])/O*g*i[v],S*=O,T*=O,z*=O,A.vx-=S*(I=l[v]),f>1&&(A.vy-=T*I),f>2&&(A.vz-=z*I),b.vx+=S*(I=1-I),f>1&&(b.vy+=T*I),f>2&&(b.vz+=z*I)}function m(){if(s){var g,w=s.length,C=e.length,v=new Map(s.map((b,A)=>[r(b,A,s),b])),y;for(g=0,u=new Array(w);gtypeof C=="function")||Math.random,f=w.find(C=>[1,2,3].includes(C))||2,m()},d.links=function(g){return arguments.length?(e=g,m(),d):e},d.id=function(g){return arguments.length?(r=g,d):r},d.iterations=function(g){return arguments.length?(p=+g,d):p},d.strength=function(g){return arguments.length?(n=typeof g=="function"?g:it(+g),x(),d):n},d.distance=function(g){return arguments.length?(o=typeof g=="function"?g:it(+g),_(),d):o},d}function ks(){let e=1;return()=>(e=(1664525*e+1013904223)%4294967296)/4294967296}var As=3;function Rr(e){return e.x}function Pn(e){return e.y}function Ss(e){return e.z}var rh=10,nh=Math.PI*(3-Math.sqrt(5)),ih=Math.PI*20/(9+Math.sqrt(221));function Tn(e,r){r=r||2;var n=Math.min(As,Math.max(1,Math.round(r))),i,o=1,a=.001,s=1-Math.pow(a,1/300),f=0,u=.6,l=new Map,c=re(d),p=Mt("tick","end"),h=ks();e==null&&(e=[]);function d(){m(),p.call("tick",i),o1&&(v.fy==null?v.y+=v.vy*=u:(v.y=v.fy,v.vy=0)),n>2&&(v.fz==null?v.z+=v.vz*=u:(v.z=v.fz,v.vz=0));return i}function x(){for(var g=0,w=e.length,C;g1&&isNaN(C.y)||n>2&&isNaN(C.z)){var v=rh*(n>2?Math.cbrt(.5+g):n>1?Math.sqrt(.5+g):g),y=g*nh,b=g*ih;n===1?C.x=v:n===2?(C.x=v*Math.cos(y),C.y=v*Math.sin(y)):(C.x=v*Math.sin(y)*Math.cos(b),C.y=v*Math.cos(y),C.z=v*Math.sin(y)*Math.sin(b))}(isNaN(C.vx)||n>1&&isNaN(C.vy)||n>2&&isNaN(C.vz))&&(C.vx=0,n>1&&(C.vy=0),n>2&&(C.vz=0))}}function _(g){return g.initialize&&g.initialize(e,h,n),g}return x(),i={tick:m,restart:function(){return c.restart(d),i},stop:function(){return c.stop(),i},numDimensions:function(g){return arguments.length?(n=Math.min(As,Math.max(1,Math.round(g))),l.forEach(_),i):n},nodes:function(g){return arguments.length?(e=g,x(),l.forEach(_),i):e},alpha:function(g){return arguments.length?(o=+g,i):o},alphaMin:function(g){return arguments.length?(a=+g,i):a},alphaDecay:function(g){return arguments.length?(s=+g,i):+s},alphaTarget:function(g){return arguments.length?(f=+g,i):f},velocityDecay:function(g){return arguments.length?(u=1-g,i):1-u},randomSource:function(g){return arguments.length?(h=g,l.forEach(_),i):h},force:function(g,w){return arguments.length>1?(w==null?l.delete(g):l.set(g,_(w)),i):l.get(g)},find:function(){var g=Array.prototype.slice.call(arguments),w=g.shift()||0,C=(n>1?g.shift():null)||0,v=(n>2?g.shift():null)||0,y=g.shift()||1/0,b=0,A=e.length,S,T,z,O,I,U;for(y*=y,b=0;b1?(p.on(g,w),i):p.on(g)}}}function zn(){var e,r,n,i,o,a=it(-30),s,f=1,u=1/0,l=.81;function c(m){var x,_=e.length,g=(r===1?Xt(e,Rr):r===2?Zt(e,Rr,Pn):r===3?Kt(e,Rr,Pn,Ss):null).visitAfter(h);for(o=m,x=0;x<_;++x)n=e[x],g.visit(d)}function p(){if(e){var m,x=e.length,_;for(s=new Array(x),m=0;m1&&(m.y=v/w),r>2&&(m.z=y/w)}else{_=m,_.x=_.data.x,r>1&&(_.y=_.data.y),r>2&&(_.z=_.data.z);do x+=s[_.data.index];while(_=_.next)}m.value=x}function d(m,x,_,g,w){if(!m.value)return!0;var C=[_,g,w][r-1],v=m.x-n.x,y=r>1?m.y-n.y:0,b=r>2?m.z-n.z:0,A=C-x,S=v*v+y*y+b*b;if(A*A/l1&&y===0&&(y=ot(i),S+=y*y),r>2&&b===0&&(b=ot(i),S+=b*b),S1&&(n.vy+=y*m.value*o/S),r>2&&(n.vz+=b*m.value*o/S)),!0;if(m.length||S>=u)return;(m.data!==n||m.next)&&(v===0&&(v=ot(i),S+=v*v),r>1&&y===0&&(y=ot(i),S+=y*y),r>2&&b===0&&(b=ot(i),S+=b*b),S1&&(n.vy+=y*A),r>2&&(n.vz+=b*A));while(m=m.next)}return c.initialize=function(m,...x){e=m,i=x.find(_=>typeof _=="function")||Math.random,r=x.find(_=>[1,2,3].includes(_))||2,p()},c.strength=function(m){return arguments.length?(a=typeof m=="function"?m:it(+m),p(),c):a},c.distanceMin=function(m){return arguments.length?(f=m*m,c):Math.sqrt(f)},c.distanceMax=function(m){return arguments.length?(u=m*m,c):Math.sqrt(u)},c.theta=function(m){return arguments.length?(l=m*m,c):Math.sqrt(l)},c}function On(e,r,n,i){var o,a,s=it(.1),f,u;typeof e!="function"&&(e=it(+e)),r==null&&(r=0),n==null&&(n=0),i==null&&(i=0);function l(p){for(var h=0,d=o.length;h1&&(m.vy+=_*C),a>2&&(m.vz+=g*C)}}function c(){if(o){var p,h=o.length;for(f=new Array(h),u=new Array(h),p=0;p[1,2,3].includes(d))||2,c()},l.strength=function(p){return arguments.length?(s=typeof p=="function"?p:it(+p),c(),l):s},l.radius=function(p){return arguments.length?(e=typeof p=="function"?p:it(+p),c(),l):e},l.x=function(p){return arguments.length?(r=+p,l):r},l.y=function(p){return arguments.length?(n=+p,l):n},l.z=function(p){return arguments.length?(i=+p,l):i},l}var{abs:Fe,cos:Ot,sin:fe,acos:oh,atan2:Ue,sqrt:Lt,pow:dt}=Math;function qe(e){return e<0?-dt(-e,1/3):dt(e,1/3)}var Cs=Math.PI,Nr=2*Cs,Ft=Cs/2,ah=1e-6,En=Number.MAX_SAFE_INTEGER||9007199254740991,In=Number.MIN_SAFE_INTEGER||-9007199254740991,sh={x:0,y:0,z:0},P={Tvalues:[-.06405689286260563,.06405689286260563,-.1911188674736163,.1911188674736163,-.3150426796961634,.3150426796961634,-.4337935076260451,.4337935076260451,-.5454214713888396,.5454214713888396,-.6480936519369755,.6480936519369755,-.7401241915785544,.7401241915785544,-.820001985973903,.820001985973903,-.8864155270044011,.8864155270044011,-.9382745520027328,.9382745520027328,-.9747285559713095,.9747285559713095,-.9951872199970213,.9951872199970213],Cvalues:[.12793819534675216,.12793819534675216,.1258374563468283,.1258374563468283,.12167047292780339,.12167047292780339,.1155056680537256,.1155056680537256,.10744427011596563,.10744427011596563,.09761865210411388,.09761865210411388,.08619016153195327,.08619016153195327,.0733464814110803,.0733464814110803,.05929858491543678,.05929858491543678,.04427743881741981,.04427743881741981,.028531388628933663,.028531388628933663,.0123412297999872,.0123412297999872],arcfn:function(e,r){let n=r(e),i=n.x*n.x+n.y*n.y;return typeof n.z<"u"&&(i+=n.z*n.z),Lt(i)},compute:function(e,r,n){if(e===0)return r[0].t=0,r[0];let i=r.length-1;if(e===1)return r[i].t=1,r[i];let o=1-e,a=r;if(i===0)return r[0].t=e,r[0];if(i===1){let f={x:o*a[0].x+e*a[1].x,y:o*a[0].y+e*a[1].y,t:e};return n&&(f.z=o*a[0].z+e*a[1].z),f}if(i<4){let f=o*o,u=e*e,l,c,p,h=0;i===2?(a=[a[0],a[1],a[2],sh],l=f,c=o*e*2,p=u):i===3&&(l=f*o,c=f*e*3,p=o*u*3,h=e*u);let d={x:l*a[0].x+c*a[1].x+p*a[2].x+h*a[3].x,y:l*a[0].y+c*a[1].y+p*a[2].y+h*a[3].y,t:e};return n&&(d.z=l*a[0].z+c*a[1].z+p*a[2].z+h*a[3].z),d}let s=JSON.parse(JSON.stringify(r));for(;s.length>1;){for(let f=0;f1;o--,a--){let s=[];for(let f=0,u;f"u")e=.5;else if(e===0||e===1)return e;let n=dt(e,r)+dt(1-e,r),i=n-1;return Fe(i/n)},projectionratio:function(e,r){if(r!==2&&r!==3)return!1;if(typeof e>"u")e=.5;else if(e===0||e===1)return e;let n=dt(1-e,r),i=dt(e,r)+n;return n/i},lli8:function(e,r,n,i,o,a,s,f){let u=(e*i-r*n)*(o-s)-(e-n)*(o*f-a*s),l=(e*i-r*n)*(a-f)-(r-i)*(o*f-a*s),c=(e-n)*(a-f)-(r-i)*(o-s);return c==0?!1:{x:u/c,y:l/c}},lli4:function(e,r,n,i){let o=e.x,a=e.y,s=r.x,f=r.y,u=n.x,l=n.y,c=i.x,p=i.y;return P.lli8(o,a,s,f,u,l,c,p)},lli:function(e,r){return P.lli4(e,e.c,r,r.c)},makeline:function(e,r){return new Qt(e.x,e.y,(e.x+r.x)/2,(e.y+r.y)/2,r.x,r.y)},findbbox:function(e){let r=En,n=En,i=In,o=In;return e.forEach(function(a){let s=a.bbox();r>s.x.min&&(r=s.x.min),n>s.y.min&&(n=s.y.min),i0&&(c.c1=u,c.c2=l,c.s1=e,c.s2=n,a.push(c))})}),a},makeshape:function(e,r,n){let i=r.points.length,o=e.points.length,a=P.makeline(r.points[i-1],e.points[0]),s=P.makeline(e.points[o-1],r.points[0]),f={startcap:a,forward:e,back:r,endcap:s,bbox:P.findbbox([a,e,r,s])};return f.intersections=function(u){return P.shapeintersections(f,f.bbox,u,u.bbox,n)},f},getminmax:function(e,r,n){if(!n)return{min:0,max:0};let i=En,o=In,a,s;n.indexOf(0)===-1&&(n=[0].concat(n)),n.indexOf(1)===-1&&n.push(1);for(let f=0,u=n.length;fo&&(o=s[r]);return{min:i,mid:(i+o)/2,max:o,size:o-i}},align:function(e,r){let n=r.p1.x,i=r.p1.y,o=-Ue(r.p2.y-i,r.p2.x-n),a=function(s){return{x:(s.x-n)*Ot(o)-(s.y-i)*fe(o),y:(s.x-n)*fe(o)+(s.y-i)*Ot(o)}};return e.map(a)},roots:function(e,r){r=r||{p1:{x:0,y:0},p2:{x:1,y:0}};let n=e.length-1,i=P.align(e,r),o=function(A){return 0<=A&&A<=1};if(n===2){let A=i[0].y,S=i[1].y,T=i[2].y,z=A-2*S+T;if(z!==0){let O=-Lt(S*S-A*T),I=-A+S,U=-(O+I)/z,k=-(-O+I)/z;return[U,k].filter(o)}else if(S!==T&&z===0)return[(2*S-T)/(2*S-2*T)].filter(o);return[]}let a=i[0].y,s=i[1].y,f=i[2].y,u=i[3].y,l=-a+3*s-3*f+u,c=3*a-6*s+3*f,p=-3*a+3*s,h=a;if(P.approximately(l,0)){if(P.approximately(c,0))return P.approximately(p,0)?[]:[-h/p].filter(o);let A=Lt(p*p-4*c*h),S=2*c;return[(A-p)/S,(-p-A)/S].filter(o)}c/=l,p/=l,h/=l;let d=(3*p-c*c)/3,m=d/3,x=(2*c*c*c-9*c*p+27*h)/27,_=x/2,g=_*_+m*m*m,w,C,v,y,b;if(g<0){let A=-d/3,S=A*A*A,T=Lt(S),z=-x/(2*T),O=z<-1?-1:z>1?1:z,I=oh(O),U=qe(T),k=2*U;return v=k*Ot(I/3)-c/3,y=k*Ot((I+Nr)/3)-c/3,b=k*Ot((I+2*Nr)/3)-c/3,[v,y,b].filter(o)}else{if(g===0)return w=_<0?qe(-_):-qe(_),v=2*w-c/3,y=-w-c/3,[v,y].filter(o);{let A=Lt(g);return w=qe(-_+A),C=qe(_+A),[w-C-c/3].filter(o)}}},droots:function(e){if(e.length===3){let r=e[0],n=e[1],i=e[2],o=r-2*n+i;if(o!==0){let a=-Lt(n*n-r*i),s=-r+n,f=-(a+s)/o,u=-(-a+s)/o;return[f,u]}else if(n!==i&&o===0)return[(2*n-i)/(2*(n-i))];return[]}if(e.length===2){let r=e[0],n=e[1];return r!==n?[r/(r-n)]:[]}return[]},curvature:function(e,r,n,i,o){let a,s,f,u,l=0,c=0,p=P.compute(e,r),h=P.compute(e,n),d=p.x*p.x+p.y*p.y;if(i?(a=Lt(dt(p.y*h.z-h.y*p.z,2)+dt(p.z*h.x-h.z*p.x,2)+dt(p.x*h.y-h.x*p.y,2)),s=dt(d+p.z*p.z,3/2)):(a=p.x*h.y-p.y*h.x,s=dt(d,3/2)),a===0||s===0)return{k:0,r:0};if(l=a/s,c=s/a,!o){let m=P.curvature(e-.001,r,n,i,!0).k,x=P.curvature(e+.001,r,n,i,!0).k;u=(x-l+(l-m))/2,f=(Fe(x-l)+Fe(l-m))/2}return{k:l,r:c,dk:u,adk:f}},inflections:function(e){if(e.length<4)return[];let r=P.align(e,{p1:e[0],p2:e.slice(-1)[0]}),n=r[2].x*r[1].y,i=r[3].x*r[1].y,o=r[1].x*r[2].y,a=r[3].x*r[2].y,s=18*(-3*n+2*i+3*o-a),f=18*(3*n-i-3*o),u=18*(o-n);if(P.approximately(s,0)){if(!P.approximately(f,0)){let h=-u/f;if(0<=h&&h<=1)return[h]}return[]}let l=2*s;if(P.approximately(l,0))return[];let c=f*f-4*s*u;if(c<0)return[];let p=Math.sqrt(c);return[(p-f)/l,-(f+p)/l].filter(function(h){return 0<=h&&h<=1})},bboxoverlap:function(e,r){let n=["x","y"],i=n.length;for(let o=0,a,s,f,u;o=u)return!1;return!0},expandbox:function(e,r){r.x.mine.x.max&&(e.x.max=r.x.max),r.y.max>e.y.max&&(e.y.max=r.y.max),r.z&&r.z.max>e.z.max&&(e.z.max=r.z.max),e.x.mid=(e.x.min+e.x.max)/2,e.y.mid=(e.y.min+e.y.max)/2,e.z&&(e.z.mid=(e.z.min+e.z.max)/2),e.x.size=e.x.max-e.x.min,e.y.size=e.y.max-e.y.min,e.z&&(e.z.size=e.z.max-e.z.min)},pairiteration:function(e,r,n){let i=e.bbox(),o=r.bbox(),a=1e5,s=n||.5;if(i.x.size+i.y.sizeb||b>A)&&(y+=Nr),y>A&&(S=A,A=y,y=S)):A4){if(arguments.length!==1)throw new Error("Only new Bezier(point[]) is accepted for 4th and higher order curves");o=!0}}else if(a!==6&&a!==8&&a!==9&&a!==12&&arguments.length!==1)throw new Error("Only new Bezier(point[]) is accepted for 4th and higher order curves");let s=this._3d=!o&&(a===9||a===12)||r&&r[0]&&typeof r[0].z<"u",f=this.points=[];for(let d=0,m=s?3:2;dd+Be(m.y),0)"u"&&(o=.5),o===0)return new e(n,n,i);if(o===1)return new e(r,n,n);let a=e.getABC(2,r,n,i,o);return new e(r,a.A,i)}static cubicFromPoints(r,n,i,o,a){typeof o>"u"&&(o=.5);let s=e.getABC(3,r,n,i,o);typeof a>"u"&&(a=P.dist(n,s.C));let f=a*(1-o)/o,u=P.dist(r,i),l=(i.x-r.x)/u,c=(i.y-r.y)/u,p=a*l,h=a*c,d=f*l,m=f*c,x={x:n.x-p,y:n.y-h},_={x:n.x+d,y:n.y+m},g=s.A,w={x:g.x+(x.x-g.x)/(1-o),y:g.y+(x.y-g.y)/(1-o)},C={x:g.x+(_.x-g.x)/o,y:g.y+(_.y-g.y)/o},v={x:r.x+(w.x-r.x)/o,y:r.y+(w.y-r.y)/o},y={x:i.x+(C.x-i.x)/(1-o),y:i.y+(C.y-i.y)/(1-o)};return new e(r,v,y,i)}static getUtils(){return P}getUtils(){return e.getUtils()}static get PolyBezier(){return le}valueOf(){return this.toString()}toString(){return P.pointsToString(this.points)}toSVG(){if(this._3d)return!1;let r=this.points,n=r[0].x,i=r[0].y,o=["M",n,i,this.order===2?"Q":"C"];for(let a=1,s=r.length;a0}length(){return P.length(this.derivative.bind(this))}static getABC(r=2,n,i,o,a=.5){let s=P.projectionratio(a,r),f=1-s,u={x:s*n.x+f*o.x,y:s*n.y+f*o.y},l=P.abcratio(a,r);return{A:{x:i.x+(i.x-u.x)/l,y:i.y+(i.y-u.y)/l},B:i,C:u,S:n,E:o}}getABC(r,n){n=n||this.get(r);let i=this.points[0],o=this.points[this.order];return e.getABC(this.order,i,n,o,r)}getLUT(r){if(this.verify(),r=r||100,this._lut.length===r+1)return this._lut;this._lut=[],r++,this._lut=[];for(let n=0,i,o;n1?1:p,h=this.compute(p),h.t=p,h.d=l,h}get(r){return this.compute(r)}point(r){return this.points[r]}compute(r){return this.ratios?P.computeWithRatios(r,this.points,this.ratios,this._3d):P.compute(r,this.points,this._3d,this.ratios)}raise(){let r=this.points,n=[r[0]],i=r.length;for(let o=1,a,s;o1;){i=[];for(let s=0,f,u=n.length-1;s=0&&s<=1}),n=n.concat(r[i].sort(P.numberSort))}.bind(this)),r.values=n.sort(P.numberSort).filter(function(i,o){return n.indexOf(i)===o}),r}bbox(){let r=this.extrema(),n={};return this.dims.forEach(function(i){n[i]=P.getminmax(this,i,r[i])}.bind(this)),n}overlaps(r){let n=this.bbox(),i=r.bbox();return P.bboxoverlap(n,i)}offset(r,n){if(typeof n<"u"){let i=this.get(r),o=this.normal(r),a={c:i,n:o,x:i.x+o.x*n,y:i.y+o.y*n};return this._3d&&(a.z=i.z+o.z*n),a}if(this._linear){let i=this.normal(0),o=this.points.map(function(a){let s={x:a.x+r*i.x,y:a.y+r*i.y};return a.z&&i.z&&(s.z=a.z+r*i.z),s});return[new e(o)]}return this.reduce().map(function(i){return i._linear?i.offset(r)[0]:i.scale(r)})}simple(){if(this.order===3){let o=P.angle(this.points[0],this.points[3],this.points[1]),a=P.angle(this.points[0],this.points[3],this.points[2]);if(o>0&&a<0||o<0&&a>0)return!1}let r=this.normal(0),n=this.normal(1),i=r.x*n.x+r.y*n.y;return this._3d&&(i+=r.z*n.z),Be(uh(i))(1-f/o)*n+f/o*i);return new e(this.points.map((s,f)=>({x:s.x+r.x*a[f],y:s.y+r.y*a[f]})))}scale(r){let n=this.order,i=!1;if(typeof r=="function"&&(i=r),i&&n===2)return this.raise().scale(i);let o=this.clockwise,a=this.points;if(this._linear)return this.translate(this.normal(0),i?i(0):r,i?i(1):r);let s=i?i(0):r,f=i?i(1):r,u=[this.offset(0,10),this.offset(1,10)],l=[],c=P.lli4(u[0],u[0].c,u[1],u[1].c);if(!c)throw new Error("cannot scale this curve. Try reducing it first.");return[0,1].forEach(function(p){let h=l[p*n]=P.copy(a[p*n]);h.x+=(p?f:s)*u[p].n.x,h.y+=(p?f:s)*u[p].n.y}),i?([0,1].forEach(function(p){if(!(n===2&&p)){var h=a[p+1],d={x:h.x-c.x,y:h.y-c.y},m=i?i((p+1)/n):r;i&&!o&&(m=-m);var x=He(d.x*d.x+d.y*d.y);d.x/=x,d.y/=x,l[p+1]={x:h.x+m*d.x,y:h.y+m*d.y}}}),new e(l)):([0,1].forEach(p=>{if(n===2&&p)return;let h=l[p*n],d=this.derivative(p),m={x:h.x+d.x,y:h.y+d.y};l[p+1]=P.lli4(h,m,c,a[p+1])}),new e(l))}outline(r,n,i,o){if(n=n===void 0?r:n,this._linear){let y=this.normal(0),b=this.points[0],A=this.points[this.points.length-1],S,T,z;i===void 0&&(i=r,o=n),S={x:b.x+y.x*r,y:b.y+y.y*r},z={x:A.x+y.x*i,y:A.y+y.y*i},T={x:(S.x+z.x)/2,y:(S.y+z.y)/2};let O=[S,T,z];S={x:b.x-y.x*n,y:b.y-y.y*n},z={x:A.x-y.x*o,y:A.y-y.y*o},T={x:(S.x+z.x)/2,y:(S.y+z.y)/2};let I=[z,T,S],U=P.makeline(I[2],O[0]),k=P.makeline(O[2],I[0]),E=[U,new e(O),k,new e(I)];return new le(E)}let a=this.reduce(),s=a.length,f=[],u=[],l,c=0,p=this.length(),h=typeof i<"u"&&typeof o<"u";function d(y,b,A,S,T){return function(z){let O=S/A,I=(S+T)/A,U=b-y;return P.map(z,0,1,y+O*U,y+I*U)}}a.forEach(function(y){let b=y.length();h?(f.push(y.scale(d(r,i,p,c,b))),u.push(y.scale(d(-n,-o,p,c,b)))):(f.push(y.scale(r)),u.push(y.scale(-n))),c+=b}),u=u.map(function(y){return l=y.points,l[3]?y.points=[l[3],l[2],l[1],l[0]]:y.points=[l[2],l[1],l[0]],y}).reverse();let m=f[0].points[0],x=f[s-1].points[f[s-1].points.length-1],_=u[s-1].points[u[s-1].points.length-1],g=u[0].points[0],w=P.makeline(_,m),C=P.makeline(x,g),v=[w].concat(f).concat([C]).concat(u);return new le(v)}outlineshapes(r,n,i){n=n||r;let o=this.outline(r,n).curves,a=[];for(let s=1,f=o.length;s1,u.endcap.virtual=s{var f=this.get(s);return P.between(f.x,n,o)&&P.between(f.y,i,a)})}selfintersects(r){let n=this.reduce(),i=n.length-2,o=[];for(let a=0,s,f,u;a0&&(a=a.concat(f))}),a}arcs(r){return r=r||.5,this._iterate(r,[])}_error(r,n,i,o){let a=(o-i)/4,s=this.get(i+a),f=this.get(o-a),u=P.dist(r,n),l=P.dist(r,s),c=P.dist(r,f);return Be(l-u)+Be(c-u)}_iterate(r,n){let i=0,o=1,a;do{a=0,o=1;let s=this.get(i),f,u,l,c,p=!1,h=!1,d,m=o,x=1,_=0;do if(h=p,c=l,m=(i+o)/2,_++,f=this.get(m),u=this.get(o),l=P.getccenter(s,f,u),l.interval={start:i,end:o},p=this._error(l,s,i,o)<=r,d=h&&!p,d||(x=o),p){if(o>=1){if(l.interval.end=x=1,c=l,o>1){let w={x:l.x+l.r*fh(l.e),y:l.y+l.r*lh(l.e)};l.e+=P.angle({x:l.x,y:l.y},w,this.get(1))}break}o=o+(o-i)/2}else o=m;while(!d&&a++<100);if(a>=100)break;c=c||l,n.push(c),i=x}while(o<1);return n}};function Rn(e,r){(r==null||r>e.length)&&(r=e.length);for(var n=0,i=Array(r);n2&&arguments[2]!==void 0?arguments[2]:{},o=i.style,a=o===void 0?{}:o,s=!!r&&Ir(r)==="object"&&!!r.node&&typeof r.node=="function",f=K(s?r.node():r);f.style("position")==="static"&&f.style("position","relative"),n.tooltipEl=f.append("div").attr("class","float-tooltip-kap"),Object.entries(a).forEach(function(l){var c=Wc(l,2),h=c[0],p=c[1];return n.tooltipEl.style(h,p)}),n.tooltipEl.style("left","-10000px").style("display","none");var u="tooltip-".concat(Math.round(Math.random()*1e12));n.mouseInside=!1,f.on("mousemove.".concat(u),function(l){n.mouseInside=!0;var c=at(l),h=f.node(),p=h.offsetWidth,d=h.offsetHeight,m=[n.offsetX===null||n.offsetX===void 0?"-".concat(c[0]/p*100,"%"):typeof n.offsetX=="number"?"calc(-50% + ".concat(n.offsetX,"px)"):n.offsetX,n.offsetY===null||n.offsetY===void 0?d>130&&d-c[1]<100?"calc(-100% - 6px)":"21px":typeof n.offsetY=="number"?n.offsetY<0?"calc(-100% - ".concat(Math.abs(n.offsetY),"px)"):"".concat(n.offsetY,"px"):n.offsetY];n.tooltipEl.style("left",c[0]+"px").style("top",c[1]+"px").style("transform","translate(".concat(m.join(","),")")),n.content&&n.tooltipEl.style("display","inline")}),f.on("mouseover.".concat(u),function(){n.mouseInside=!0,n.content&&n.tooltipEl.style("display","inline")}),f.on("mouseout.".concat(u),function(){n.mouseInside=!1,n.tooltipEl.style("display","none")})},update:function(r){r.tooltipEl.style("display",r.content&&r.mouseInside?"inline":"none"),r.content?r.content instanceof HTMLElement?(r.tooltipEl.text(""),r.tooltipEl.append(function(){return r.content})):typeof r.content=="string"?r.tooltipEl.html(r.content):Xc(r.content)?(r.tooltipEl.text(""),Zc(r.content,r.tooltipEl.node())):(r.tooltipEl.style("display","none"),console.warn("Tooltip content is invalid, skipping.",r.content,r.content.toString())):r.tooltipEl.text("")}});function bn(e,r,n){var i,o=1;e==null&&(e=0),r==null&&(r=0),n==null&&(n=0);function a(){var s,f=i.length,u,l=0,c=0,h=0;for(s=0;s=(u=(s+f)/2))?s=u:f=u,i=o,!(o=o[h=+c]))return i[h]=a,e;if(l=+e._x.call(null,o.data),r===l)return a.next=o,i?i[h]=a:e._root=a,e;do i=i?i[h]=new Array(2):e._root=new Array(2),(c=r>=(u=(s+f)/2))?s=u:f=u;while((h=+c)==(p=+(l>=u)));return i[p]=o,i[h]=a,e}function ka(e){Array.isArray(e)||(e=Array.from(e));let r=e.length,n=new Float64Array(r),i=1/0,o=-1/0;for(let a=0,s;ao&&(o=s));if(i>o)return this;this.cover(i).cover(o);for(let a=0;ae||e>=n;)switch(s=+(es||(a=l.x1)=h))&&(l=f[f.length-1],f[f.length-1]=f[f.length-1-c],f[f.length-1-c]=l)}else{var p=Math.abs(e-+this._x.call(null,u.data));p=(l=(s+f)/2))?s=l:f=l,r=n,!(n=n[h=+c]))return this;if(!n.length)break;r[h+1&1]&&(i=r,p=h)}for(;n.data!==e;)if(o=n,!(n=n.next))return this;return(a=n.next)&&delete n.next,o?(a?o.next=a:delete o.next,this):r?(a?r[h]=a:delete r[h],(n=r[0]||r[1])&&n===(r[1]||r[0])&&!n.length&&(i?i[p]=n:this._root=n),this):(this._root=a,this)}function Ta(e){for(var r=0,n=e.length;r=(h=(f+l)/2))?f=h:l=h,(_=n>=(p=(u+c)/2))?u=p:c=p,o=a,!(a=a[g=_<<1|x]))return o[g]=s,e;if(d=+e._x.call(null,a.data),m=+e._y.call(null,a.data),r===d&&n===m)return s.next=a,o?o[g]=s:e._root=s,e;do o=o?o[g]=new Array(4):e._root=new Array(4),(x=r>=(h=(f+l)/2))?f=h:l=h,(_=n>=(p=(u+c)/2))?u=p:c=p;while((g=_<<1|x)===(w=(m>=p)<<1|d>=h));return o[w]=a,o[g]=s,e}function Fa(e){var r,n,i=e.length,o,a,s=new Array(i),f=new Array(i),u=1/0,l=1/0,c=-1/0,h=-1/0;for(n=0;nc&&(c=o),ah&&(h=a));if(u>c||l>h)return this;for(this.cover(u,l).cover(c,h),n=0;ne||e>=o||i>r||r>=a;)switch(l=(rc||(f=m.y0)>h||(u=m.x1)=g)<<1|e>=_)&&(m=p[p.length-1],p[p.length-1]=p[p.length-1-x],p[p.length-1-x]=m)}else{var w=e-+this._x.call(null,d.data),S=r-+this._y.call(null,d.data),v=w*w+S*S;if(v=(p=(s+u)/2))?s=p:u=p,(x=h>=(d=(f+l)/2))?f=d:l=d,r=n,!(n=n[_=x<<1|m]))return this;if(!n.length)break;(r[_+1&3]||r[_+2&3]||r[_+3&3])&&(i=r,g=_)}for(;n.data!==e;)if(o=n,!(n=n.next))return this;return(a=n.next)&&delete n.next,o?(a?o.next=a:delete o.next,this):r?(a?r[_]=a:delete r[_],(n=r[0]||r[1]||r[2]||r[3])&&n===(r[3]||r[2]||r[1]||r[0])&&!n.length&&(i?i[g]=n:this._root=n),this):(this._root=a,this)}function Wa(e){for(var r=0,n=e.length;r=(m=(u+h)/2))?u=m:h=m,(y=n>=(x=(l+p)/2))?l=x:p=x,(b=i>=(_=(c+d)/2))?c=_:d=_,a=s,!(s=s[k=b<<2|y<<1|v]))return a[k]=f,e;if(g=+e._x.call(null,s.data),w=+e._y.call(null,s.data),S=+e._z.call(null,s.data),r===g&&n===w&&i===S)return f.next=s,a?a[k]=f:e._root=f,e;do a=a?a[k]=new Array(8):e._root=new Array(8),(v=r>=(m=(u+h)/2))?u=m:h=m,(y=n>=(x=(l+p)/2))?l=x:p=x,(b=i>=(_=(c+d)/2))?c=_:d=_;while((k=b<<2|y<<1|v)===(C=(S>=_)<<2|(w>=x)<<1|g>=m));return a[C]=s,a[k]=f,e}function ns(e){Array.isArray(e)||(e=Array.from(e));let r=e.length,n=new Float64Array(r),i=new Float64Array(r),o=new Float64Array(r),a=1/0,s=1/0,f=1/0,u=-1/0,l=-1/0,c=-1/0;for(let h=0,p,d,m,x;hu&&(u=d),ml&&(l=m),xc&&(c=x));if(a>u||s>l||f>c)return this;this.cover(a,s,f).cover(u,l,c);for(let h=0;he||e>=s||o>r||r>=f||a>n||n>=u;)switch(p=(nm||(l=S.y0)>x||(c=S.z0)>_||(h=S.x1)=k)<<2|(r>=b)<<1|e>=y)&&(S=g[g.length-1],g[g.length-1]=g[g.length-1-v],g[g.length-1-v]=S)}else{var C=e-+this._x.call(null,w.data),T=r-+this._y.call(null,w.data),z=n-+this._z.call(null,w.data),E=C*C+T*T+z*z;if(EMath.sqrt((e-i)**2+(r-o)**2+(n-a)**2);function fs(e,r,n,i){let o=[],a=e-i,s=r-i,f=n-i,u=e+i,l=r+i,c=n+i;return this.visit((h,p,d,m,x,_,g)=>{if(!h.length)do{let w=h.data;Jc(e,r,n,this._x(w),this._y(w),this._z(w))<=i&&o.push(w)}while(h=h.next);return p>u||d>l||m>c||x=(x=(s+l)/2))?s=x:l=x,(S=d>=(_=(f+c)/2))?f=_:c=_,(v=m>=(g=(u+h)/2))?u=g:h=g,r=n,!(n=n[y=v<<2|S<<1|w]))return this;if(!n.length)break;(r[y+1&7]||r[y+2&7]||r[y+3&7]||r[y+4&7]||r[y+5&7]||r[y+6&7]||r[y+7&7])&&(i=r,b=y)}for(;n.data!==e;)if(o=n,!(n=n.next))return this;return(a=n.next)&&delete n.next,o?(a?o.next=a:delete o.next,this):r?(a?r[y]=a:delete r[y],(n=r[0]||r[1]||r[2]||r[3]||r[4]||r[5]||r[6]||r[7])&&n===(r[7]||r[6]||r[5]||r[4]||r[3]||r[2]||r[1]||r[0])&&!n.length&&(i?i[b]=n:this._root=n),this):(this._root=a,this)}function us(e){for(var r=0,n=e.length;r1&&(x=d.y+d.vy),n>2&&(_=d.z+d.vz),p.visit(v);function v(y,b,k,C,T,z,E){var I=[b,k,C,T,z,E],U=I[0],A=I[1],O=I[2],M=I[n],R=I[n+1],L=I[n+2],D=y.data,F=y.r,j=g+F;if(D){if(D.index>d.index){var q=m-D.x-D.vx,Y=n>1?x-D.y-D.vy:0,$=n>2?_-D.z-D.vz:0,V=q*q+Y*Y+$*$;V1&&Y===0&&(Y=ot(o),V+=Y*Y),n>2&&$===0&&($=ot(o),V+=$*$),V=(j-(V=Math.sqrt(V)))/V*a,d.vx+=(q*=V)*(j=(F*=F)/(w+F)),n>1&&(d.vy+=(Y*=V)*j),n>2&&(d.vz+=($*=V)*j),D.vx-=q*(j=1-j),n>1&&(D.vy-=Y*j),n>2&&(D.vz-=$*j))}return}return U>m+j||M1&&(A>x+j||R2&&(O>_+j||L<_-j)}}function u(c){if(c.data)return c.r=i[c.data.index];for(var h=c.r=0;hc.r&&(c.r=c[h].r)}function l(){if(r){var c,h=r.length,p;for(i=new Array(h),c=0;ctypeof p=="function")||Math.random,n=h.find(p=>[1,2,3].includes(p))||2,l()},f.iterations=function(c){return arguments.length?(s=+c,f):s},f.strength=function(c){return arguments.length?(a=+c,f):a},f.radius=function(c){return arguments.length?(e=typeof c=="function"?c:it(+c),l(),f):e},f}function eh(e){return e.index}function ks(e,r){var n=e.get(r);if(!n)throw new Error("node not found: "+r);return n}function Mn(e){var r=eh,n=p,i,o=it(30),a,s,f,u,l,c,h=1;e==null&&(e=[]);function p(g){return 1/Math.min(u[g.source.index],u[g.target.index])}function d(g){for(var w=0,S=e.length;w1&&(T=k.y+k.vy-b.y-b.vy||ot(c)),f>2&&(z=k.z+k.vz-b.z-b.vz||ot(c)),E=Math.sqrt(C*C+T*T+z*z),E=(E-a[v])/E*g*i[v],C*=E,T*=E,z*=E,k.vx-=C*(I=l[v]),f>1&&(k.vy-=T*I),f>2&&(k.vz-=z*I),b.vx+=C*(I=1-I),f>1&&(b.vy+=T*I),f>2&&(b.vz+=z*I)}function m(){if(s){var g,w=s.length,S=e.length,v=new Map(s.map((b,k)=>[r(b,k,s),b])),y;for(g=0,u=new Array(w);gtypeof S=="function")||Math.random,f=w.find(S=>[1,2,3].includes(S))||2,m()},d.links=function(g){return arguments.length?(e=g,m(),d):e},d.id=function(g){return arguments.length?(r=g,d):r},d.iterations=function(g){return arguments.length?(h=+g,d):h},d.strength=function(g){return arguments.length?(n=typeof g=="function"?g:it(+g),x(),d):n},d.distance=function(g){return arguments.length?(o=typeof g=="function"?g:it(+g),_(),d):o},d}function As(){let e=1;return()=>(e=(1664525*e+1013904223)%4294967296)/4294967296}var Ss=3;function Rr(e){return e.x}function Pn(e){return e.y}function Cs(e){return e.z}var rh=10,nh=Math.PI*(3-Math.sqrt(5)),ih=Math.PI*20/(9+Math.sqrt(221));function Tn(e,r){r=r||2;var n=Math.min(Ss,Math.max(1,Math.round(r))),i,o=1,a=.001,s=1-Math.pow(a,1/300),f=0,u=.6,l=new Map,c=ne(d),h=Mt("tick","end"),p=As();e==null&&(e=[]);function d(){m(),h.call("tick",i),o1&&(v.fy==null?v.y+=v.vy*=u:(v.y=v.fy,v.vy=0)),n>2&&(v.fz==null?v.z+=v.vz*=u:(v.z=v.fz,v.vz=0));return i}function x(){for(var g=0,w=e.length,S;g1&&isNaN(S.y)||n>2&&isNaN(S.z)){var v=rh*(n>2?Math.cbrt(.5+g):n>1?Math.sqrt(.5+g):g),y=g*nh,b=g*ih;n===1?S.x=v:n===2?(S.x=v*Math.cos(y),S.y=v*Math.sin(y)):(S.x=v*Math.sin(y)*Math.cos(b),S.y=v*Math.cos(y),S.z=v*Math.sin(y)*Math.sin(b))}(isNaN(S.vx)||n>1&&isNaN(S.vy)||n>2&&isNaN(S.vz))&&(S.vx=0,n>1&&(S.vy=0),n>2&&(S.vz=0))}}function _(g){return g.initialize&&g.initialize(e,p,n),g}return x(),i={tick:m,restart:function(){return c.restart(d),i},stop:function(){return c.stop(),i},numDimensions:function(g){return arguments.length?(n=Math.min(Ss,Math.max(1,Math.round(g))),l.forEach(_),i):n},nodes:function(g){return arguments.length?(e=g,x(),l.forEach(_),i):e},alpha:function(g){return arguments.length?(o=+g,i):o},alphaMin:function(g){return arguments.length?(a=+g,i):a},alphaDecay:function(g){return arguments.length?(s=+g,i):+s},alphaTarget:function(g){return arguments.length?(f=+g,i):f},velocityDecay:function(g){return arguments.length?(u=1-g,i):1-u},randomSource:function(g){return arguments.length?(p=g,l.forEach(_),i):p},force:function(g,w){return arguments.length>1?(w==null?l.delete(g):l.set(g,_(w)),i):l.get(g)},find:function(){var g=Array.prototype.slice.call(arguments),w=g.shift()||0,S=(n>1?g.shift():null)||0,v=(n>2?g.shift():null)||0,y=g.shift()||1/0,b=0,k=e.length,C,T,z,E,I,U;for(y*=y,b=0;b1?(h.on(g,w),i):h.on(g)}}}function zn(){var e,r,n,i,o,a=it(-30),s,f=1,u=1/0,l=.81;function c(m){var x,_=e.length,g=(r===1?Xt(e,Rr):r===2?Zt(e,Rr,Pn):r===3?Kt(e,Rr,Pn,Cs):null).visitAfter(p);for(o=m,x=0;x<_;++x)n=e[x],g.visit(d)}function h(){if(e){var m,x=e.length,_;for(s=new Array(x),m=0;m1&&(m.y=v/w),r>2&&(m.z=y/w)}else{_=m,_.x=_.data.x,r>1&&(_.y=_.data.y),r>2&&(_.z=_.data.z);do x+=s[_.data.index];while(_=_.next)}m.value=x}function d(m,x,_,g,w){if(!m.value)return!0;var S=[_,g,w][r-1],v=m.x-n.x,y=r>1?m.y-n.y:0,b=r>2?m.z-n.z:0,k=S-x,C=v*v+y*y+b*b;if(k*k/l1&&y===0&&(y=ot(i),C+=y*y),r>2&&b===0&&(b=ot(i),C+=b*b),C1&&(n.vy+=y*m.value*o/C),r>2&&(n.vz+=b*m.value*o/C)),!0;if(m.length||C>=u)return;(m.data!==n||m.next)&&(v===0&&(v=ot(i),C+=v*v),r>1&&y===0&&(y=ot(i),C+=y*y),r>2&&b===0&&(b=ot(i),C+=b*b),C1&&(n.vy+=y*k),r>2&&(n.vz+=b*k));while(m=m.next)}return c.initialize=function(m,...x){e=m,i=x.find(_=>typeof _=="function")||Math.random,r=x.find(_=>[1,2,3].includes(_))||2,h()},c.strength=function(m){return arguments.length?(a=typeof m=="function"?m:it(+m),h(),c):a},c.distanceMin=function(m){return arguments.length?(f=m*m,c):Math.sqrt(f)},c.distanceMax=function(m){return arguments.length?(u=m*m,c):Math.sqrt(u)},c.theta=function(m){return arguments.length?(l=m*m,c):Math.sqrt(l)},c}function On(e,r,n,i){var o,a,s=it(.1),f,u;typeof e!="function"&&(e=it(+e)),r==null&&(r=0),n==null&&(n=0),i==null&&(i=0);function l(h){for(var p=0,d=o.length;p1&&(m.vy+=_*S),a>2&&(m.vz+=g*S)}}function c(){if(o){var h,p=o.length;for(f=new Array(p),u=new Array(p),h=0;h[1,2,3].includes(d))||2,c()},l.strength=function(h){return arguments.length?(s=typeof h=="function"?h:it(+h),c(),l):s},l.radius=function(h){return arguments.length?(e=typeof h=="function"?h:it(+h),c(),l):e},l.x=function(h){return arguments.length?(r=+h,l):r},l.y=function(h){return arguments.length?(n=+h,l):n},l.z=function(h){return arguments.length?(i=+h,l):i},l}var{abs:Ue,cos:Ot,sin:le,acos:oh,atan2:qe,sqrt:Lt,pow:dt}=Math;function Be(e){return e<0?-dt(-e,1/3):dt(e,1/3)}var Ms=Math.PI,Nr=2*Ms,Ft=Ms/2,ah=1e-6,En=Number.MAX_SAFE_INTEGER||9007199254740991,In=Number.MIN_SAFE_INTEGER||-9007199254740991,sh={x:0,y:0,z:0},P={Tvalues:[-.06405689286260563,.06405689286260563,-.1911188674736163,.1911188674736163,-.3150426796961634,.3150426796961634,-.4337935076260451,.4337935076260451,-.5454214713888396,.5454214713888396,-.6480936519369755,.6480936519369755,-.7401241915785544,.7401241915785544,-.820001985973903,.820001985973903,-.8864155270044011,.8864155270044011,-.9382745520027328,.9382745520027328,-.9747285559713095,.9747285559713095,-.9951872199970213,.9951872199970213],Cvalues:[.12793819534675216,.12793819534675216,.1258374563468283,.1258374563468283,.12167047292780339,.12167047292780339,.1155056680537256,.1155056680537256,.10744427011596563,.10744427011596563,.09761865210411388,.09761865210411388,.08619016153195327,.08619016153195327,.0733464814110803,.0733464814110803,.05929858491543678,.05929858491543678,.04427743881741981,.04427743881741981,.028531388628933663,.028531388628933663,.0123412297999872,.0123412297999872],arcfn:function(e,r){let n=r(e),i=n.x*n.x+n.y*n.y;return typeof n.z<"u"&&(i+=n.z*n.z),Lt(i)},compute:function(e,r,n){if(e===0)return r[0].t=0,r[0];let i=r.length-1;if(e===1)return r[i].t=1,r[i];let o=1-e,a=r;if(i===0)return r[0].t=e,r[0];if(i===1){let f={x:o*a[0].x+e*a[1].x,y:o*a[0].y+e*a[1].y,t:e};return n&&(f.z=o*a[0].z+e*a[1].z),f}if(i<4){let f=o*o,u=e*e,l,c,h,p=0;i===2?(a=[a[0],a[1],a[2],sh],l=f,c=o*e*2,h=u):i===3&&(l=f*o,c=f*e*3,h=o*u*3,p=e*u);let d={x:l*a[0].x+c*a[1].x+h*a[2].x+p*a[3].x,y:l*a[0].y+c*a[1].y+h*a[2].y+p*a[3].y,t:e};return n&&(d.z=l*a[0].z+c*a[1].z+h*a[2].z+p*a[3].z),d}let s=JSON.parse(JSON.stringify(r));for(;s.length>1;){for(let f=0;f1;o--,a--){let s=[];for(let f=0,u;f"u")e=.5;else if(e===0||e===1)return e;let n=dt(e,r)+dt(1-e,r),i=n-1;return Ue(i/n)},projectionratio:function(e,r){if(r!==2&&r!==3)return!1;if(typeof e>"u")e=.5;else if(e===0||e===1)return e;let n=dt(1-e,r),i=dt(e,r)+n;return n/i},lli8:function(e,r,n,i,o,a,s,f){let u=(e*i-r*n)*(o-s)-(e-n)*(o*f-a*s),l=(e*i-r*n)*(a-f)-(r-i)*(o*f-a*s),c=(e-n)*(a-f)-(r-i)*(o-s);return c==0?!1:{x:u/c,y:l/c}},lli4:function(e,r,n,i){let o=e.x,a=e.y,s=r.x,f=r.y,u=n.x,l=n.y,c=i.x,h=i.y;return P.lli8(o,a,s,f,u,l,c,h)},lli:function(e,r){return P.lli4(e,e.c,r,r.c)},makeline:function(e,r){return new Qt(e.x,e.y,(e.x+r.x)/2,(e.y+r.y)/2,r.x,r.y)},findbbox:function(e){let r=En,n=En,i=In,o=In;return e.forEach(function(a){let s=a.bbox();r>s.x.min&&(r=s.x.min),n>s.y.min&&(n=s.y.min),i0&&(c.c1=u,c.c2=l,c.s1=e,c.s2=n,a.push(c))})}),a},makeshape:function(e,r,n){let i=r.points.length,o=e.points.length,a=P.makeline(r.points[i-1],e.points[0]),s=P.makeline(e.points[o-1],r.points[0]),f={startcap:a,forward:e,back:r,endcap:s,bbox:P.findbbox([a,e,r,s])};return f.intersections=function(u){return P.shapeintersections(f,f.bbox,u,u.bbox,n)},f},getminmax:function(e,r,n){if(!n)return{min:0,max:0};let i=En,o=In,a,s;n.indexOf(0)===-1&&(n=[0].concat(n)),n.indexOf(1)===-1&&n.push(1);for(let f=0,u=n.length;fo&&(o=s[r]);return{min:i,mid:(i+o)/2,max:o,size:o-i}},align:function(e,r){let n=r.p1.x,i=r.p1.y,o=-qe(r.p2.y-i,r.p2.x-n),a=function(s){return{x:(s.x-n)*Ot(o)-(s.y-i)*le(o),y:(s.x-n)*le(o)+(s.y-i)*Ot(o)}};return e.map(a)},roots:function(e,r){r=r||{p1:{x:0,y:0},p2:{x:1,y:0}};let n=e.length-1,i=P.align(e,r),o=function(k){return 0<=k&&k<=1};if(n===2){let k=i[0].y,C=i[1].y,T=i[2].y,z=k-2*C+T;if(z!==0){let E=-Lt(C*C-k*T),I=-k+C,U=-(E+I)/z,A=-(-E+I)/z;return[U,A].filter(o)}else if(C!==T&&z===0)return[(2*C-T)/(2*C-2*T)].filter(o);return[]}let a=i[0].y,s=i[1].y,f=i[2].y,u=i[3].y,l=-a+3*s-3*f+u,c=3*a-6*s+3*f,h=-3*a+3*s,p=a;if(P.approximately(l,0)){if(P.approximately(c,0))return P.approximately(h,0)?[]:[-p/h].filter(o);let k=Lt(h*h-4*c*p),C=2*c;return[(k-h)/C,(-h-k)/C].filter(o)}c/=l,h/=l,p/=l;let d=(3*h-c*c)/3,m=d/3,x=(2*c*c*c-9*c*h+27*p)/27,_=x/2,g=_*_+m*m*m,w,S,v,y,b;if(g<0){let k=-d/3,C=k*k*k,T=Lt(C),z=-x/(2*T),E=z<-1?-1:z>1?1:z,I=oh(E),U=Be(T),A=2*U;return v=A*Ot(I/3)-c/3,y=A*Ot((I+Nr)/3)-c/3,b=A*Ot((I+2*Nr)/3)-c/3,[v,y,b].filter(o)}else{if(g===0)return w=_<0?Be(-_):-Be(_),v=2*w-c/3,y=-w-c/3,[v,y].filter(o);{let k=Lt(g);return w=Be(-_+k),S=Be(_+k),[w-S-c/3].filter(o)}}},droots:function(e){if(e.length===3){let r=e[0],n=e[1],i=e[2],o=r-2*n+i;if(o!==0){let a=-Lt(n*n-r*i),s=-r+n,f=-(a+s)/o,u=-(-a+s)/o;return[f,u]}else if(n!==i&&o===0)return[(2*n-i)/(2*(n-i))];return[]}if(e.length===2){let r=e[0],n=e[1];return r!==n?[r/(r-n)]:[]}return[]},curvature:function(e,r,n,i,o){let a,s,f,u,l=0,c=0,h=P.compute(e,r),p=P.compute(e,n),d=h.x*h.x+h.y*h.y;if(i?(a=Lt(dt(h.y*p.z-p.y*h.z,2)+dt(h.z*p.x-p.z*h.x,2)+dt(h.x*p.y-p.x*h.y,2)),s=dt(d+h.z*h.z,3/2)):(a=h.x*p.y-h.y*p.x,s=dt(d,3/2)),a===0||s===0)return{k:0,r:0};if(l=a/s,c=s/a,!o){let m=P.curvature(e-.001,r,n,i,!0).k,x=P.curvature(e+.001,r,n,i,!0).k;u=(x-l+(l-m))/2,f=(Ue(x-l)+Ue(l-m))/2}return{k:l,r:c,dk:u,adk:f}},inflections:function(e){if(e.length<4)return[];let r=P.align(e,{p1:e[0],p2:e.slice(-1)[0]}),n=r[2].x*r[1].y,i=r[3].x*r[1].y,o=r[1].x*r[2].y,a=r[3].x*r[2].y,s=18*(-3*n+2*i+3*o-a),f=18*(3*n-i-3*o),u=18*(o-n);if(P.approximately(s,0)){if(!P.approximately(f,0)){let p=-u/f;if(0<=p&&p<=1)return[p]}return[]}let l=2*s;if(P.approximately(l,0))return[];let c=f*f-4*s*u;if(c<0)return[];let h=Math.sqrt(c);return[(h-f)/l,-(f+h)/l].filter(function(p){return 0<=p&&p<=1})},bboxoverlap:function(e,r){let n=["x","y"],i=n.length;for(let o=0,a,s,f,u;o=u)return!1;return!0},expandbox:function(e,r){r.x.mine.x.max&&(e.x.max=r.x.max),r.y.max>e.y.max&&(e.y.max=r.y.max),r.z&&r.z.max>e.z.max&&(e.z.max=r.z.max),e.x.mid=(e.x.min+e.x.max)/2,e.y.mid=(e.y.min+e.y.max)/2,e.z&&(e.z.mid=(e.z.min+e.z.max)/2),e.x.size=e.x.max-e.x.min,e.y.size=e.y.max-e.y.min,e.z&&(e.z.size=e.z.max-e.z.min)},pairiteration:function(e,r,n){let i=e.bbox(),o=r.bbox(),a=1e5,s=n||.5;if(i.x.size+i.y.sizeb||b>k)&&(y+=Nr),y>k&&(C=k,k=y,y=C)):k4){if(arguments.length!==1)throw new Error("Only new Bezier(point[]) is accepted for 4th and higher order curves");o=!0}}else if(a!==6&&a!==8&&a!==9&&a!==12&&arguments.length!==1)throw new Error("Only new Bezier(point[]) is accepted for 4th and higher order curves");let s=this._3d=!o&&(a===9||a===12)||r&&r[0]&&typeof r[0].z<"u",f=this.points=[];for(let d=0,m=s?3:2;dd+He(m.y),0)

"u"&&(o=.5),o===0)return new e(n,n,i);if(o===1)return new e(r,n,n);let a=e.getABC(2,r,n,i,o);return new e(r,a.A,i)}static cubicFromPoints(r,n,i,o,a){typeof o>"u"&&(o=.5);let s=e.getABC(3,r,n,i,o);typeof a>"u"&&(a=P.dist(n,s.C));let f=a*(1-o)/o,u=P.dist(r,i),l=(i.x-r.x)/u,c=(i.y-r.y)/u,h=a*l,p=a*c,d=f*l,m=f*c,x={x:n.x-h,y:n.y-p},_={x:n.x+d,y:n.y+m},g=s.A,w={x:g.x+(x.x-g.x)/(1-o),y:g.y+(x.y-g.y)/(1-o)},S={x:g.x+(_.x-g.x)/o,y:g.y+(_.y-g.y)/o},v={x:r.x+(w.x-r.x)/o,y:r.y+(w.y-r.y)/o},y={x:i.x+(S.x-i.x)/(1-o),y:i.y+(S.y-i.y)/(1-o)};return new e(r,v,y,i)}static getUtils(){return P}getUtils(){return e.getUtils()}static get PolyBezier(){return ue}valueOf(){return this.toString()}toString(){return P.pointsToString(this.points)}toSVG(){if(this._3d)return!1;let r=this.points,n=r[0].x,i=r[0].y,o=["M",n,i,this.order===2?"Q":"C"];for(let a=1,s=r.length;a0}length(){return P.length(this.derivative.bind(this))}static getABC(r=2,n,i,o,a=.5){let s=P.projectionratio(a,r),f=1-s,u={x:s*n.x+f*o.x,y:s*n.y+f*o.y},l=P.abcratio(a,r);return{A:{x:i.x+(i.x-u.x)/l,y:i.y+(i.y-u.y)/l},B:i,C:u,S:n,E:o}}getABC(r,n){n=n||this.get(r);let i=this.points[0],o=this.points[this.order];return e.getABC(this.order,i,n,o,r)}getLUT(r){if(this.verify(),r=r||100,this._lut.length===r+1)return this._lut;this._lut=[],r++,this._lut=[];for(let n=0,i,o;n1?1:h,p=this.compute(h),p.t=h,p.d=l,p}get(r){return this.compute(r)}point(r){return this.points[r]}compute(r){return this.ratios?P.computeWithRatios(r,this.points,this.ratios,this._3d):P.compute(r,this.points,this._3d,this.ratios)}raise(){let r=this.points,n=[r[0]],i=r.length;for(let o=1,a,s;o1;){i=[];for(let s=0,f,u=n.length-1;s=0&&s<=1}),n=n.concat(r[i].sort(P.numberSort))}.bind(this)),r.values=n.sort(P.numberSort).filter(function(i,o){return n.indexOf(i)===o}),r}bbox(){let r=this.extrema(),n={};return this.dims.forEach(function(i){n[i]=P.getminmax(this,i,r[i])}.bind(this)),n}overlaps(r){let n=this.bbox(),i=r.bbox();return P.bboxoverlap(n,i)}offset(r,n){if(typeof n<"u"){let i=this.get(r),o=this.normal(r),a={c:i,n:o,x:i.x+o.x*n,y:i.y+o.y*n};return this._3d&&(a.z=i.z+o.z*n),a}if(this._linear){let i=this.normal(0),o=this.points.map(function(a){let s={x:a.x+r*i.x,y:a.y+r*i.y};return a.z&&i.z&&(s.z=a.z+r*i.z),s});return[new e(o)]}return this.reduce().map(function(i){return i._linear?i.offset(r)[0]:i.scale(r)})}simple(){if(this.order===3){let o=P.angle(this.points[0],this.points[3],this.points[1]),a=P.angle(this.points[0],this.points[3],this.points[2]);if(o>0&&a<0||o<0&&a>0)return!1}let r=this.normal(0),n=this.normal(1),i=r.x*n.x+r.y*n.y;return this._3d&&(i+=r.z*n.z),He(uh(i))(1-f/o)*n+f/o*i);return new e(this.points.map((s,f)=>({x:s.x+r.x*a[f],y:s.y+r.y*a[f]})))}scale(r){let n=this.order,i=!1;if(typeof r=="function"&&(i=r),i&&n===2)return this.raise().scale(i);let o=this.clockwise,a=this.points;if(this._linear)return this.translate(this.normal(0),i?i(0):r,i?i(1):r);let s=i?i(0):r,f=i?i(1):r,u=[this.offset(0,10),this.offset(1,10)],l=[],c=P.lli4(u[0],u[0].c,u[1],u[1].c);if(!c)throw new Error("cannot scale this curve. Try reducing it first.");return[0,1].forEach(function(h){let p=l[h*n]=P.copy(a[h*n]);p.x+=(h?f:s)*u[h].n.x,p.y+=(h?f:s)*u[h].n.y}),i?([0,1].forEach(function(h){if(!(n===2&&h)){var p=a[h+1],d={x:p.x-c.x,y:p.y-c.y},m=i?i((h+1)/n):r;i&&!o&&(m=-m);var x=$e(d.x*d.x+d.y*d.y);d.x/=x,d.y/=x,l[h+1]={x:p.x+m*d.x,y:p.y+m*d.y}}}),new e(l)):([0,1].forEach(h=>{if(n===2&&h)return;let p=l[h*n],d=this.derivative(h),m={x:p.x+d.x,y:p.y+d.y};l[h+1]=P.lli4(p,m,c,a[h+1])}),new e(l))}outline(r,n,i,o){if(n=n===void 0?r:n,this._linear){let y=this.normal(0),b=this.points[0],k=this.points[this.points.length-1],C,T,z;i===void 0&&(i=r,o=n),C={x:b.x+y.x*r,y:b.y+y.y*r},z={x:k.x+y.x*i,y:k.y+y.y*i},T={x:(C.x+z.x)/2,y:(C.y+z.y)/2};let E=[C,T,z];C={x:b.x-y.x*n,y:b.y-y.y*n},z={x:k.x-y.x*o,y:k.y-y.y*o},T={x:(C.x+z.x)/2,y:(C.y+z.y)/2};let I=[z,T,C],U=P.makeline(I[2],E[0]),A=P.makeline(E[2],I[0]),O=[U,new e(E),A,new e(I)];return new ue(O)}let a=this.reduce(),s=a.length,f=[],u=[],l,c=0,h=this.length(),p=typeof i<"u"&&typeof o<"u";function d(y,b,k,C,T){return function(z){let E=C/k,I=(C+T)/k,U=b-y;return P.map(z,0,1,y+E*U,y+I*U)}}a.forEach(function(y){let b=y.length();p?(f.push(y.scale(d(r,i,h,c,b))),u.push(y.scale(d(-n,-o,h,c,b)))):(f.push(y.scale(r)),u.push(y.scale(-n))),c+=b}),u=u.map(function(y){return l=y.points,l[3]?y.points=[l[3],l[2],l[1],l[0]]:y.points=[l[2],l[1],l[0]],y}).reverse();let m=f[0].points[0],x=f[s-1].points[f[s-1].points.length-1],_=u[s-1].points[u[s-1].points.length-1],g=u[0].points[0],w=P.makeline(_,m),S=P.makeline(x,g),v=[w].concat(f).concat([S]).concat(u);return new ue(v)}outlineshapes(r,n,i){n=n||r;let o=this.outline(r,n).curves,a=[];for(let s=1,f=o.length;s1,u.endcap.virtual=s{var f=this.get(s);return P.between(f.x,n,o)&&P.between(f.y,i,a)})}selfintersects(r){let n=this.reduce(),i=n.length-2,o=[];for(let a=0,s,f,u;a0&&(a=a.concat(f))}),a}arcs(r){return r=r||.5,this._iterate(r,[])}_error(r,n,i,o){let a=(o-i)/4,s=this.get(i+a),f=this.get(o-a),u=P.dist(r,n),l=P.dist(r,s),c=P.dist(r,f);return He(l-u)+He(c-u)}_iterate(r,n){let i=0,o=1,a;do{a=0,o=1;let s=this.get(i),f,u,l,c,h=!1,p=!1,d,m=o,x=1,_=0;do if(p=h,c=l,m=(i+o)/2,_++,f=this.get(m),u=this.get(o),l=P.getccenter(s,f,u),l.interval={start:i,end:o},h=this._error(l,s,i,o)<=r,d=p&&!h,d||(x=o),h){if(o>=1){if(l.interval.end=x=1,c=l,o>1){let w={x:l.x+l.r*fh(l.e),y:l.y+l.r*lh(l.e)};l.e+=P.angle({x:l.x,y:l.y},w,this.get(1))}break}o=o+(o-i)/2}else o=m;while(!d&&a++<100);if(a>=100)break;c=c||l,n.push(c),i=x}while(o<1);return n}};function Rn(e,r){(r==null||r>e.length)&&(r=e.length);for(var n=0,i=Array(r);n0&&arguments[0]!==void 0?arguments[0]:[],r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:[],n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:!0,i=arguments.length>3&&arguments[3]!==void 0?arguments[3]:!1,o=(r instanceof Array?r.length?r:[void 0]:[r]).map(function(f){return{keyAccessor:f,isProp:!(f instanceof Function)}}),a=e.reduce(function(f,u){var l=f,c=u;return o.forEach(function(p,h){var d=p.keyAccessor,m=p.isProp,x;if(m){var _=c,g=_[d],w=yh(_,[d].map(kh));x=g,c=w}else x=d(c,h);h+11&&arguments[1]!==void 0?arguments[1]:1;l===o.length?Object.keys(u).forEach(function(c){return u[c]=n(u[c])}):Object.values(u).forEach(function(c){return f(c,l+1)})})(a);var s=a;return i&&(s=[],(function f(u){var l=arguments.length>1&&arguments[1]!==void 0?arguments[1]:[];l.length===o.length?s.push({keys:l,vals:u}):Object.entries(u).forEach(function(c){var p=vh(c,2),h=p[0],d=p[1];return f(d,[].concat(bh(l),[h]))})})(a),r instanceof Array&&r.length===0&&s.length===1&&(s[0].keys=[])),s});function Os(e,r){switch(arguments.length){case 0:break;case 1:this.range(e);break;default:this.range(r).domain(e);break}return this}var Nn=Symbol("implicit");function $e(){var e=new oe,r=[],n=[],i=Nn;function o(a){let s=e.get(a);if(s===void 0){if(i!==Nn)return i;e.set(a,s=r.push(a)-1)}return n[s%n.length]}return o.domain=function(a){if(!arguments.length)return r.slice();r=[],e=new oe;for(let s of a)e.has(s)||e.set(s,r.push(s)-1);return o},o.range=function(a){return arguments.length?(n=Array.from(a),o):n.slice()},o.unknown=function(a){return arguments.length?(i=a,o):i},o.copy=function(){return $e(r,n).unknown(i)},Os.apply(o,arguments),o}function Es(e){for(var r=e.length/6|0,n=new Array(r),i=0;i"u")){var i=document.head||document.getElementsByTagName("head")[0],o=document.createElement("style");o.type="text/css",n==="top"&&i.firstChild?i.insertBefore(o,i.firstChild):i.appendChild(o),o.styleSheet?o.styleSheet.cssText=e:o.appendChild(document.createTextNode(e))}}var Sh=`.force-graph-container canvas { +In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function yh(e,r){if(e==null)return{};var n,i,o=_h(e,r);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(i=0;i0&&arguments[0]!==void 0?arguments[0]:[],r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:[],n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:!0,i=arguments.length>3&&arguments[3]!==void 0?arguments[3]:!1,o=(r instanceof Array?r.length?r:[void 0]:[r]).map(function(f){return{keyAccessor:f,isProp:!(f instanceof Function)}}),a=e.reduce(function(f,u){var l=f,c=u;return o.forEach(function(h,p){var d=h.keyAccessor,m=h.isProp,x;if(m){var _=c,g=_[d],w=yh(_,[d].map(kh));x=g,c=w}else x=d(c,p);p+11&&arguments[1]!==void 0?arguments[1]:1;l===o.length?Object.keys(u).forEach(function(c){return u[c]=n(u[c])}):Object.values(u).forEach(function(c){return f(c,l+1)})})(a);var s=a;return i&&(s=[],(function f(u){var l=arguments.length>1&&arguments[1]!==void 0?arguments[1]:[];l.length===o.length?s.push({keys:l,vals:u}):Object.entries(u).forEach(function(c){var h=vh(c,2),p=h[0],d=h[1];return f(d,[].concat(bh(l),[p]))})})(a),r instanceof Array&&r.length===0&&s.length===1&&(s[0].keys=[])),s});function Es(e,r){switch(arguments.length){case 0:break;case 1:this.range(e);break;default:this.range(r).domain(e);break}return this}var Nn=Symbol("implicit");function We(){var e=new ae,r=[],n=[],i=Nn;function o(a){let s=e.get(a);if(s===void 0){if(i!==Nn)return i;e.set(a,s=r.push(a)-1)}return n[s%n.length]}return o.domain=function(a){if(!arguments.length)return r.slice();r=[],e=new ae;for(let s of a)e.has(s)||e.set(s,r.push(s)-1);return o},o.range=function(a){return arguments.length?(n=Array.from(a),o):n.slice()},o.unknown=function(a){return arguments.length?(i=a,o):i},o.copy=function(){return We(r,n).unknown(i)},Es.apply(o,arguments),o}function Is(e){for(var r=e.length/6|0,n=new Array(r),i=0;i"u")){var i=document.head||document.getElementsByTagName("head")[0],o=document.createElement("style");o.type="text/css",n==="top"&&i.firstChild?i.insertBefore(o,i.firstChild):i.appendChild(o),o.styleSheet?o.styleSheet.cssText=e:o.appendChild(document.createTextNode(e))}}var Sh=`.force-graph-container canvas { display: block; user-select: none; outline: none; @@ -37,7 +37,7 @@ In order to be iterable, non-array objects must have a [Symbol.iterator]() metho cursor: -moz-grabbing; cursor: -webkit-grabbing; } -`;Ah(Sh);var Ch=$e(Dn);function Is(e,r,n){!r||typeof n!="string"||e.filter(i=>!i[n]).forEach(i=>{i[n]=Ch(r(i))})}function Mh({nodes:e,links:r},n,{nodeFilter:i=()=>!0,onLoopError:o=a=>{throw`Invalid DAG structure! Found cycle in node path: ${a.join(" -> ")}.`}}={}){let a={};e.forEach(l=>a[n(l)]={data:l,out:[],depth:-1,skip:!i(l)}),r.forEach(({source:l,target:c})=>{let p=x(l),h=x(c);if(!a.hasOwnProperty(p))throw`Missing source node with id: ${p}`;if(!a.hasOwnProperty(h))throw`Missing target node with id: ${h}`;let d=a[p],m=a[h];d.out.push(m);function x(_){return typeof _=="object"?n(_):_}});let s=[];return u(Object.values(a)),Object.assign({},...Object.entries(a).filter(([,l])=>!l.skip).map(([l,c])=>({[l]:c.depth})));function u(l,c=[],p=0){for(let h=0,d=l.length;hn(_.data));s.some(_=>_.length===x.length&&_.every((g,w)=>g===x[w]))||(s.push(x),o(x));continue}p>m.depth&&(m.depth=p,u(m.out,[...c,m],p+(m.skip?0:1)))}}}var Ph=2,et=(e,r)=>r.onNeedsRedraw&&r.onNeedsRedraw(),Rs=(e,r)=>{if(!r.isShadow){let n=B(r.linkDirectionalParticles);r.graphData.links.forEach(i=>{let o=Math.round(Math.abs(n(i)));o?i.__photons=[...Array(o)].map(()=>({})):delete i.__photons})}},Dr=Re({props:{graphData:{default:{nodes:[],links:[]},onChange(e,r){r.engineRunning=!1,Rs(e,r)}},dagMode:{onChange(e,r){!e&&(r.graphData.nodes||[]).forEach(n=>n.fx=n.fy=void 0)}},dagLevelDistance:{},dagNodeFilter:{default:e=>!0},onDagError:{triggerUpdate:!1},nodeRelSize:{default:4,triggerUpdate:!1,onChange:et},nodeId:{default:"id"},nodeVal:{default:"val",triggerUpdate:!1,onChange:et},nodeColor:{default:"color",triggerUpdate:!1,onChange:et},nodeAutoColorBy:{},nodeCanvasObject:{triggerUpdate:!1,onChange:et},nodeCanvasObjectMode:{default:()=>"replace",triggerUpdate:!1,onChange:et},nodeVisibility:{default:!0,triggerUpdate:!1,onChange:et},linkSource:{default:"source"},linkTarget:{default:"target"},linkVisibility:{default:!0,triggerUpdate:!1,onChange:et},linkColor:{default:"color",triggerUpdate:!1,onChange:et},linkAutoColorBy:{},linkLineDash:{triggerUpdate:!1,onChange:et},linkWidth:{default:1,triggerUpdate:!1,onChange:et},linkCurvature:{default:0,triggerUpdate:!1,onChange:et},linkSelfCurveRotation:{default:0,triggerUpdate:!1,onChange:et},linkCanvasObject:{triggerUpdate:!1,onChange:et},linkCanvasObjectMode:{default:()=>"replace",triggerUpdate:!1,onChange:et},linkDirectionalArrowLength:{default:0,triggerUpdate:!1,onChange:et},linkDirectionalArrowColor:{triggerUpdate:!1,onChange:et},linkDirectionalArrowRelPos:{default:.5,triggerUpdate:!1,onChange:et},linkDirectionalParticles:{default:0,triggerUpdate:!1,onChange:Rs},linkDirectionalParticleSpeed:{default:.01,triggerUpdate:!1},linkDirectionalParticleOffset:{default:0,triggerUpdate:!1},linkDirectionalParticleWidth:{default:4,triggerUpdate:!1},linkDirectionalParticleColor:{triggerUpdate:!1},linkDirectionalParticleCanvasObject:{triggerUpdate:!1},globalScale:{default:1,triggerUpdate:!1},d3AlphaMin:{default:0,triggerUpdate:!1},d3AlphaDecay:{default:.0228,triggerUpdate:!1,onChange(e,r){r.forceLayout.alphaDecay(e)}},d3AlphaTarget:{default:0,triggerUpdate:!1,onChange(e,r){r.forceLayout.alphaTarget(e)}},d3VelocityDecay:{default:.4,triggerUpdate:!1,onChange(e,r){r.forceLayout.velocityDecay(e)}},warmupTicks:{default:0,triggerUpdate:!1},cooldownTicks:{default:1/0,triggerUpdate:!1},cooldownTime:{default:15e3,triggerUpdate:!1},onUpdate:{default:()=>{},triggerUpdate:!1},onFinishUpdate:{default:()=>{},triggerUpdate:!1},onEngineTick:{default:()=>{},triggerUpdate:!1},onEngineStop:{default:()=>{},triggerUpdate:!1},onNeedsRedraw:{triggerUpdate:!1},isShadow:{default:!1,triggerUpdate:!1}},methods:{d3Force:function(e,r,n){return n===void 0?e.forceLayout.force(r):(e.forceLayout.force(r,n),this)},d3ReheatSimulation:function(e){return e.forceLayout.alpha(1),this.resetCountdown(),this},resetCountdown:function(e){return e.cntTicks=0,e.startTickTime=new Date,e.engineRunning=!0,this},isEngineRunning:e=>!!e.engineRunning,tickFrame:function(e){return!e.isShadow&&r(),i(),!e.isShadow&&o(),!e.isShadow&&a(),n(),this;function r(){e.engineRunning&&(++e.cntTicks>e.cooldownTicks||new Date-e.startTickTime>e.cooldownTime||e.d3AlphaMin>0&&e.forceLayout.alpha(){let m=l(d);if(e.nodeCanvasObject&&(m==="before"||m==="replace")&&(e.nodeCanvasObject(d,c,e.globalScale),m==="replace")){c.restore();return}let x=Math.sqrt(Math.max(0,f(d)||1))*e.nodeRelSize+p;c.beginPath(),c.arc(d.x,d.y,x,0,2*Math.PI,!1),c.fillStyle=u(d)||"rgba(31, 120, 180, 0.92)",c.fill(),e.nodeCanvasObject&&m==="after"&&e.nodeCanvasObject(d,e.ctx,e.globalScale)}),c.restore()}function i(){let s=B(e.linkVisibility),f=B(e.linkColor),u=B(e.linkWidth),l=B(e.linkLineDash),c=B(e.linkCurvature),p=B(e.linkSelfCurveRotation),h=B(e.linkCanvasObjectMode),d=e.ctx,m=e.isShadow*2,x=e.graphData.links.filter(s);x.forEach(v);let _=[],g=[],w=x;if(e.linkCanvasObject){let y=[],b=[];x.forEach(A=>({before:_,after:g,replace:y}[h(A)]||b).push(A)),w=[..._,...g,...b],_=_.concat(y)}d.save(),_.forEach(y=>e.linkCanvasObject(y,d,e.globalScale)),d.restore();let C=zs(w,[f,u,l]);d.save(),Object.entries(C).forEach(([y,b])=>{let A=!y||y==="undefined"?"rgba(0,0,0,0.15)":y;Object.entries(b).forEach(([S,T])=>{let z=(S||1)/e.globalScale+m;Object.entries(T).forEach(([O,I])=>{let U=l(I[0]);d.beginPath(),I.forEach(k=>{let E=k.source,M=k.target;if(!E||!M||!E.hasOwnProperty("x")||!M.hasOwnProperty("x"))return;d.moveTo(E.x,E.y);let R=k.__controlPoints;R?d[R.length===2?"quadraticCurveTo":"bezierCurveTo"](...R,M.x,M.y):d.lineTo(M.x,M.y)}),d.strokeStyle=A,d.lineWidth=z,d.setLineDash(U||[]),d.stroke()})})}),d.restore(),d.save(),g.forEach(y=>e.linkCanvasObject(y,d,e.globalScale)),d.restore();function v(y){let b=c(y);if(!b){y.__controlPoints=null;return}let A=y.source,S=y.target;if(!A||!S||!A.hasOwnProperty("x")||!S.hasOwnProperty("x"))return;let T=Math.sqrt(Math.pow(S.x-A.x,2)+Math.pow(S.y-A.y,2));if(T>0){let z=Math.atan2(S.y-A.y,S.x-A.x),O=T*b,I={x:(A.x+S.x)/2+O*Math.cos(z-Math.PI/2),y:(A.y+S.y)/2+O*Math.sin(z-Math.PI/2)};y.__controlPoints=[I.x,I.y]}else{let z=b*70,O=(p(y)||0)*Math.PI/180,I=O-Math.PI/2,U=O;y.__controlPoints=[S.x+z*Math.cos(I),S.y+z*Math.sin(I),S.x+z*Math.cos(U),S.y+z*Math.sin(U)]}}}function o(){let u=B(e.linkDirectionalArrowLength),l=B(e.linkDirectionalArrowRelPos),c=B(e.linkVisibility),p=B(e.linkDirectionalArrowColor||e.linkColor),h=B(e.nodeVal),d=e.ctx;d.save(),e.graphData.links.filter(c).forEach(m=>{let x=u(m);if(!x||x<0)return;let _=m.source,g=m.target;if(!_||!g||!_.hasOwnProperty("x")||!g.hasOwnProperty("x"))return;let w=Math.sqrt(Math.max(0,h(_)||1))*e.nodeRelSize,C=Math.sqrt(Math.max(0,h(g)||1))*e.nodeRelSize,v=Math.min(1,Math.max(0,l(m))),y=p(m)||"rgba(0,0,0,0.28)",b=x/1.6/2,A=m.__controlPoints&&new Qt(_.x,_.y,...m.__controlPoints,g.x,g.y),S=A?E=>A.get(E):E=>({x:_.x+(g.x-_.x)*E||0,y:_.y+(g.y-_.y)*E||0}),T=A?A.length():Math.sqrt(Math.pow(g.x-_.x,2)+Math.pow(g.y-_.y,2)),z=w+x+(T-w-C-x)*v,O=S(z/T),I=S((z-x)/T),U=S((z-x*(1-.2))/T),k=Math.atan2(O.y-I.y,O.x-I.x)-Math.PI/2;d.beginPath(),d.moveTo(O.x,O.y),d.lineTo(I.x+b*Math.cos(k),I.y+b*Math.sin(k)),d.lineTo(U.x,U.y),d.lineTo(I.x-b*Math.cos(k),I.y-b*Math.sin(k)),d.fillStyle=y,d.fill()}),d.restore()}function a(){let s=B(e.linkDirectionalParticles),f=B(e.linkDirectionalParticleSpeed),u=B(e.linkDirectionalParticleOffset),l=B(e.linkDirectionalParticleWidth),c=B(e.linkVisibility),p=B(e.linkDirectionalParticleColor||e.linkColor),h=e.ctx;h.save(),e.graphData.links.filter(c).forEach(d=>{let m=s(d);if(!d.hasOwnProperty("__photons")||!d.__photons.length)return;let x=d.source,_=d.target;if(!x||!_||!x.hasOwnProperty("x")||!_.hasOwnProperty("x"))return;let g=f(d),w=Math.abs(u(d)),C=d.__photons||[],v=Math.max(0,l(d)/2)/Math.sqrt(e.globalScale),y=p(d)||"rgba(0,0,0,0.28)";h.fillStyle=y;let b=d.__controlPoints?new Qt(x.x,x.y,...d.__controlPoints,_.x,_.y):null,A=0,S=!1;C.forEach(T=>{let z=!!T.__singleHop;if(T.hasOwnProperty("__progressRatio")||(T.__progressRatio=z?g<0?1:0:(A+w)/m),!z&&A++,T.__progressRatio+=g,T.__progressRatio>=1||T.__progressRatio<0)if(!z)T.__progressRatio=T.__progressRatio%1,T.__progressRatio<0&&T.__progressRatio++;else{S=!0;return}let O=T.__progressRatio,I=b?b.get(O):{x:x.x+(_.x-x.x)*O||0,y:x.y+(_.y-x.y)*O||0};e.linkDirectionalParticleCanvasObject?e.linkDirectionalParticleCanvasObject(I.x,I.y,d,h,e.globalScale):(h.beginPath(),h.arc(I.x,I.y,v,0,2*Math.PI,!1),h.fill())}),S&&(d.__photons=d.__photons.filter(T=>!T.__singleHop||T.__progressRatio<=1&&T.__progressRatio>=0))}),h.restore()}},emitParticle:function(e,r){return r&&(!r.__photons&&(r.__photons=[]),r.__photons.push({__singleHop:!0})),this}},stateInit:()=>({forceLayout:Tn().force("link",Mn()).force("charge",zn()).force("center",bn()).force("dagRadial",null).stop(),engineRunning:!1}),init(e,r){r.ctx=e},update(e,r){e.engineRunning=!1,e.onUpdate(),e.nodeAutoColorBy!==null&&Is(e.graphData.nodes,B(e.nodeAutoColorBy),e.nodeColor),e.linkAutoColorBy!==null&&Is(e.graphData.links,B(e.linkAutoColorBy),e.linkColor),e.graphData.links.forEach(s=>{s.source=s[e.linkSource],s.target=s[e.linkTarget]}),e.forceLayout.stop().alpha(1).nodes(e.graphData.nodes);let n=e.forceLayout.force("link");n&&n.id(s=>s[e.nodeId]).links(e.graphData.links);let i=e.dagMode&&Mh(e.graphData,s=>s[e.nodeId],{nodeFilter:e.dagNodeFilter,onLoopError:e.onDagError||void 0}),o=Math.max(...Object.values(i||[])),a=e.dagLevelDistance||e.graphData.nodes.length/(o||1)*Ph*(["radialin","radialout"].indexOf(e.dagMode)!==-1?.7:1);if(["lr","rl","td","bu"].includes(r.dagMode)){let s=["lr","rl"].includes(r.dagMode)?"fx":"fy";e.graphData.nodes.filter(e.dagNodeFilter).forEach(f=>delete f[s])}if(["lr","rl","td","bu"].includes(e.dagMode)){let s=["rl","bu"].includes(e.dagMode),f=l=>(i[l[e.nodeId]]-o/2)*a*(s?-1:1),u=["lr","rl"].includes(e.dagMode)?"fx":"fy";e.graphData.nodes.filter(e.dagNodeFilter).forEach(l=>l[u]=f(l))}e.forceLayout.force("dagRadial",["radialin","radialout"].indexOf(e.dagMode)!==-1?On(s=>{let f=i[s[e.nodeId]]||-1;return(e.dagMode==="radialin"?o-f:f)*a}).strength(s=>e.dagNodeFilter(s)?1:0):null);for(let s=0;s0&&e.forceLayout.alpha()s[f][o](a))},triggerUpdate:!1}},linkMethod:function(o){return function(a,...s){let f=[];return n.forEach(u=>{let l=a[u],c=l[o](...s);c!==l&&f.push(c)}),f.length?f[0]:this}}}}var Th=800,zh=4,Oh=5,js=Ds("forceGraph",Dr),Eh=Ds(["forceGraph","shadowGraph"],Dr),Ih=Object.assign(...["nodeColor","nodeAutoColorBy","nodeCanvasObject","nodeCanvasObjectMode","linkColor","linkAutoColorBy","linkLineDash","linkWidth","linkCanvasObject","linkCanvasObjectMode","linkDirectionalArrowLength","linkDirectionalArrowColor","linkDirectionalArrowRelPos","linkDirectionalParticles","linkDirectionalParticleSpeed","linkDirectionalParticleOffset","linkDirectionalParticleWidth","linkDirectionalParticleColor","linkDirectionalParticleCanvasObject","dagMode","dagLevelDistance","dagNodeFilter","onDagError","d3AlphaMin","d3AlphaDecay","d3VelocityDecay","warmupTicks","cooldownTicks","cooldownTime","onEngineTick","onEngineStop"].map(e=>({[e]:js.linkProp(e)})),...["nodeRelSize","nodeId","nodeVal","nodeVisibility","linkSource","linkTarget","linkVisibility","linkCurvature","linkSelfCurveRotation"].map(e=>({[e]:Eh.linkProp(e)}))),Rh=Object.assign(...["d3Force","d3ReheatSimulation","emitParticle"].map(e=>({[e]:js.linkMethod(e)})));function jn(e){if(e.canvas){let r=e.canvas.width,n=e.canvas.height;r===300&&n===150&&(r=n=0);let i=window.devicePixelRatio;r/=i,n/=i,[e.canvas,e.shadowCanvas].forEach(a=>{a.style.width=`${e.width}px`,a.style.height=`${e.height}px`,a.width=e.width*i,a.height=e.height*i,!r&&!n&&a.getContext("2d").scale(i,i)});let o=lt(e.canvas).k;e.zoom.translateBy(e.zoom.__baseElem,(e.width-r)/2/o,(e.height-n)/2/o),e.needsRedraw=!0}}function Ls(e){let r=window.devicePixelRatio;e.setTransform(r,0,0,r,0,0)}function Ns(e,r,n){e.save(),Ls(e),e.clearRect(0,0,r,n),e.restore()}var Fs=Re({props:{width:{default:window.innerWidth,onChange:(e,r)=>jn(r),triggerUpdate:!1},height:{default:window.innerHeight,onChange:(e,r)=>jn(r),triggerUpdate:!1},graphData:{default:{nodes:[],links:[]},onChange:(e,r)=>{[e.nodes,e.links].every(i=>(i||[]).every(o=>!o.hasOwnProperty("__indexColor")))&&r.colorTracker.reset(),[{type:"Node",objs:e.nodes},{type:"Link",objs:e.links}].forEach(n),r.forceGraph.graphData(e),r.shadowGraph.graphData(e);function n({type:i,objs:o}){o.filter(a=>{if(!a.hasOwnProperty("__indexColor"))return!0;let s=r.colorTracker.lookup(a.__indexColor);return!s||!s.hasOwnProperty("d")||s.d!==a}).forEach(a=>{a.__indexColor=r.colorTracker.register({type:i,d:a})})}},triggerUpdate:!1},backgroundColor:{onChange(e,r){r.canvas&&e&&(r.canvas.style.background=e)},triggerUpdate:!1},nodeLabel:{default:"name",triggerUpdate:!1},nodePointerAreaPaint:{onChange(e,r){r.shadowGraph.nodeCanvasObject(e?(n,i,o)=>e(n,n.__indexColor,i,o):null),r.flushShadowCanvas&&r.flushShadowCanvas()},triggerUpdate:!1},linkPointerAreaPaint:{onChange(e,r){r.shadowGraph.linkCanvasObject(e?(n,i,o)=>e(n,n.__indexColor,i,o):null),r.flushShadowCanvas&&r.flushShadowCanvas()},triggerUpdate:!1},linkLabel:{default:"name",triggerUpdate:!1},linkHoverPrecision:{default:4,triggerUpdate:!1},minZoom:{default:.01,onChange(e,r){r.zoom.scaleExtent([e,r.zoom.scaleExtent()[1]])},triggerUpdate:!1},maxZoom:{default:1e3,onChange(e,r){r.zoom.scaleExtent([r.zoom.scaleExtent()[0],e])},triggerUpdate:!1},enableNodeDrag:{default:!0,triggerUpdate:!1},enableZoomInteraction:{default:!0,triggerUpdate:!1},enablePanInteraction:{default:!0,triggerUpdate:!1},enableZoomPanInteraction:{default:!0,triggerUpdate:!1},enablePointerInteraction:{default:!0,onChange(e,r){r.hoverObj=null},triggerUpdate:!1},autoPauseRedraw:{default:!0,triggerUpdate:!1},onNodeDrag:{default:()=>{},triggerUpdate:!1},onNodeDragEnd:{default:()=>{},triggerUpdate:!1},onNodeClick:{triggerUpdate:!1},onNodeRightClick:{triggerUpdate:!1},onNodeHover:{triggerUpdate:!1},onLinkClick:{triggerUpdate:!1},onLinkRightClick:{triggerUpdate:!1},onLinkHover:{triggerUpdate:!1},onBackgroundClick:{triggerUpdate:!1},onBackgroundRightClick:{triggerUpdate:!1},showPointerCursor:{default:!0,triggerUpdate:!1},onZoom:{triggerUpdate:!1},onZoomEnd:{triggerUpdate:!1},onRenderFramePre:{triggerUpdate:!1},onRenderFramePost:{triggerUpdate:!1},...Ih},aliases:{stopAnimation:"pauseAnimation"},methods:{graph2ScreenCoords:function(e,r,n){let i=lt(e.canvas);return{x:r*i.k+i.x,y:n*i.k+i.y}},screen2GraphCoords:function(e,r,n){let i=lt(e.canvas);return{x:(r-i.x)/i.k,y:(n-i.y)/i.k}},centerAt:function(e,r,n,i){if(!e.canvas)return null;if(r!==void 0||n!==void 0){let s=Object.assign({},r!==void 0?{x:r}:{},n!==void 0?{y:n}:{});return i?e.tweenGroup.add(new fn(o()).to(s,i).easing(Dt.Quadratic.Out).onUpdate(a).onComplete(function(){e.tweenGroup.remove(this)}).start()):a(s),this}return o();function o(){let s=lt(e.canvas);return{x:(e.width/2-s.x)/s.k,y:(e.height/2-s.y)/s.k}}function a({x:s,y:f}){e.zoom.translateTo(e.zoom.__baseElem,s===void 0?o().x:s,f===void 0?o().y:f),e.needsRedraw=!0}},zoom:function(e,r,n){if(!e.canvas)return null;if(r!==void 0)return n?e.tweenGroup.add(new fn({k:i()}).to({k:r},n).easing(Dt.Quadratic.Out).onUpdate(({k:a})=>o(a)).onComplete(function(){e.tweenGroup.remove(this)}).start()):o(r),this;return i();function i(){return lt(e.canvas).k}function o(a){e.zoom.scaleTo(e.zoom.__baseElem,a),e.needsRedraw=!0}},zoomToFit:function(e,r=0,n=10,...i){let o=this.getGraphBbox(...i);if(o){let a={x:(o.x[0]+o.x[1])/2,y:(o.y[0]+o.y[1])/2},s=Math.max(1e-12,Math.min(1e12,(e.width-n*2)/(o.x[1]-o.x[0]),(e.height-n*2)/(o.y[1]-o.y[0])));this.centerAt(a.x,a.y,r),this.zoom(s,r)}return this},getGraphBbox:function(e,r=()=>!0){let n=B(e.nodeVal),i=a=>Math.sqrt(Math.max(0,n(a)||1))*e.nodeRelSize,o=e.graphData.nodes.filter(r).map(a=>({x:a.x,y:a.y,r:i(a)}));return o.length?{x:[Oe(o,a=>a.x-a.r),ze(o,a=>a.x+a.r)],y:[Oe(o,a=>a.y-a.r),ze(o,a=>a.y+a.r)]}:null},pauseAnimation:function(e){return e.animationFrameRequestId&&(cancelAnimationFrame(e.animationFrameRequestId),e.animationFrameRequestId=null),this},resumeAnimation:function(e){return e.animationFrameRequestId||this._animationCycle(),this},_destructor:function(){this.pauseAnimation(),this.graphData({nodes:[],links:[]})},...Rh},stateInit:()=>({lastSetZoom:1,zoom:rn(),forceGraph:new Dr,shadowGraph:new Dr().cooldownTicks(0).nodeColor("__indexColor").linkColor("__indexColor").isShadow(!0),colorTracker:new ta,tweenGroup:new sn}),init:function(e,r){e.innerHTML="";let n=document.createElement("div");n.classList.add("force-graph-container"),n.style.position="relative",e.appendChild(n),r.canvas=document.createElement("canvas"),r.backgroundColor&&(r.canvas.style.background=r.backgroundColor),n.appendChild(r.canvas),r.shadowCanvas=document.createElement("canvas");let i=r.canvas.getContext("2d"),o=r.shadowCanvas.getContext("2d",{willReadFrequently:!0}),a={x:-1e12,y:-1e12},s=()=>{let u=null,l=window.devicePixelRatio,c=a.x>0&&a.y>0?o.getImageData(a.x*l,a.y*l,1,1):null;return c&&(u=r.colorTracker.lookup(c.data)),u};K(r.canvas).call(Br().subject(()=>{if(!r.enableNodeDrag)return null;let u=s();return u&&u.type==="Node"?u.d:null}).on("start",u=>{let l=u.subject;l.__initialDragPos={x:l.x,y:l.y,fx:l.fx,fy:l.fy},u.active||(l.fx=l.x,l.fy=l.y),r.canvas.classList.add("grabbable")}).on("drag",u=>{let l=u.subject,c=l.__initialDragPos,p=u,h=lt(r.canvas).k,d={x:c.x+(p.x-c.x)/h-l.x,y:c.y+(p.y-c.y)/h-l.y};["x","y"].forEach(m=>l[`f${m}`]=l[m]=c[m]+(p[m]-c[m])/h),!(!l.__dragged&&Oh>=Math.sqrt(_r(["x","y"].map(m=>(u[m]-c[m])**2))))&&(r.forceGraph.d3AlphaTarget(.3).resetCountdown(),r.isPointerDragging=!0,l.__dragged=!0,r.onNodeDrag(l,d))}).on("end",u=>{let l=u.subject,c=l.__initialDragPos,p={x:l.x-c.x,y:l.y-c.y};c.fx===void 0&&(l.fx=void 0),c.fy===void 0&&(l.fy=void 0),delete l.__initialDragPos,r.forceGraph.d3AlphaTarget()&&r.forceGraph.d3AlphaTarget(0).resetCountdown(),r.canvas.classList.remove("grabbable"),r.isPointerDragging=!1,l.__dragged&&(delete l.__dragged,r.onNodeDragEnd(l,p))})),r.zoom(r.zoom.__baseElem=K(r.canvas)),r.zoom.__baseElem.on("dblclick.zoom",null),r.zoom.filter(u=>!u.button&&r.enableZoomPanInteraction&&(u.type!=="wheel"||B(r.enableZoomInteraction)(u))&&(u.type==="wheel"||B(r.enablePanInteraction)(u))).on("zoom",u=>{let l=u.transform;[i,o].forEach(c=>{Ls(c),c.translate(l.x,l.y),c.scale(l.k,l.k)}),r.isPointerDragging=!0,r.onZoom&&r.onZoom({...l,...this.centerAt()}),r.needsRedraw=!0}).on("end",u=>{r.isPointerDragging=!1,r.onZoomEnd&&r.onZoomEnd({...u.transform,...this.centerAt()})}),jn(r),r.forceGraph.onNeedsRedraw(()=>r.needsRedraw=!0).onFinishUpdate(()=>{lt(r.canvas).k===r.lastSetZoom&&r.graphData.nodes.length&&(r.zoom.scaleTo(r.zoom.__baseElem,r.lastSetZoom=zh/Math.cbrt(r.graphData.nodes.length)),r.needsRedraw=!0)}),r.tooltip=new _a(n),["pointermove","pointerdown"].forEach(u=>n.addEventListener(u,l=>{u==="pointerdown"&&(r.isPointerPressed=!0,r.pointerDownEvent=l),!r.isPointerDragging&&l.type==="pointermove"&&r.onBackgroundClick&&(l.pressure>0||r.isPointerPressed)&&(l.pointerType==="mouse"||l.movementX===void 0||[l.movementX,l.movementY].some(h=>Math.abs(h)>1))&&(r.isPointerDragging=!0);let c=p(n);a.x=l.pageX-c.left,a.y=l.pageY-c.top;function p(h){let d=h.getBoundingClientRect(),m=window.pageXOffset||document.documentElement.scrollLeft,x=window.pageYOffset||document.documentElement.scrollTop;return{top:d.top+x,left:d.left+m}}},{passive:!0})),n.addEventListener("pointerup",u=>{if(!r.isPointerPressed)return;if(r.isPointerPressed=!1,r.isPointerDragging){r.isPointerDragging=!1;return}let l=[u,r.pointerDownEvent];requestAnimationFrame(()=>{if(u.button===0)if(r.hoverObj){let c=r[`on${r.hoverObj.type}Click`];c&&c(r.hoverObj.d,...l)}else r.onBackgroundClick&&r.onBackgroundClick(...l);if(u.button===2)if(r.hoverObj){let c=r[`on${r.hoverObj.type}RightClick`];c&&c(r.hoverObj.d,...l)}else r.onBackgroundRightClick&&r.onBackgroundRightClick(...l)})},{passive:!0}),n.addEventListener("contextmenu",u=>!r.onBackgroundRightClick&&!r.onNodeRightClick&&!r.onLinkRightClick?!0:(u.preventDefault(),!1)),r.forceGraph(i),r.shadowGraph(o);let f=on(()=>{Ns(o,r.width,r.height),r.shadowGraph.linkWidth(l=>B(r.linkWidth)(l)+r.linkHoverPrecision);let u=lt(r.canvas);r.shadowGraph.globalScale(u.k).tickFrame()},Th);r.flushShadowCanvas=f.flush,(this._animationCycle=function u(){let l=!r.autoPauseRedraw||!!r.needsRedraw||r.forceGraph.isEngineRunning()||r.graphData.links.some(c=>c.__photons&&c.__photons.length);if(r.needsRedraw=!1,r.enablePointerInteraction){let c=r.isPointerDragging?null:s();if(c!==r.hoverObj){let p=r.hoverObj,h=p?p.type:null,d=c?c.type:null;if(h&&h!==d){let m=r[`on${h}Hover`];m&&m(null,p.d)}if(d){let m=r[`on${d}Hover`];m&&m(c.d,h===d?p.d:null)}r.tooltip.content(c&&B(r[`${c.type.toLowerCase()}Label`])(c.d)||null),r.canvas.classList[(c&&r[`on${d}Click`]||!c&&r.onBackgroundClick)&&B(r.showPointerCursor)(c?.d)?"add":"remove"]("clickable"),r.hoverObj=c}l&&f()}if(l){Ns(i,r.width,r.height);let c=lt(r.canvas).k;r.onRenderFramePre&&r.onRenderFramePre(i,c),r.forceGraph.globalScale(c).tickFrame(),r.onRenderFramePost&&r.onRenderFramePost(i,c)}r.tweenGroup.update(),r.animationFrameRequestId=requestAnimationFrame(u)})()},update:function(r){}});function Ge(e){return e?.participants??e?.members??[]}function Nh(e,r="all"){return r==="all"?e:e.filter(n=>Ge(n).some(i=>i.id===r))}function Us(e,r="all"){let n=Nh(e,r),i=new Map;for(let o of n)for(let a of Ge(o))i.set(a.id,a);return{people:[...i.values()],conversations:n}}var qs=new WeakMap;function y1(e,r,{openThread:n,chooseAgent:i,t:o,icon:a}){let s=Us(r),f=JSON.stringify(s),u=c=>s.conversations.reduce((p,h)=>p+Number(Ge(h).find(d=>d.id===c)?.sent_count??0),0),l=qs.get(e);if(!l){e.replaceChildren();let c=new Fs(e).backgroundColor("#101726").nodeId("id").nodeRelSize(28).nodeCanvasObject((m,x,_)=>{let g=m.group?30:25;x.save(),x.translate(m.x,m.y),x.shadowColor=m.group?"#a78bfa":"#53d9c7",x.shadowBlur=12,x.fillStyle=m.group?"#302a49":"#26374c",x.beginPath(),x.arc(0,0,g+4,0,Math.PI*2),x.fill(),x.shadowBlur=0,l.selectedId===m.id&&(x.strokeStyle="#a6fff0",x.lineWidth=3,x.stroke()),(m.group?m.people.slice(0,3):[m.person]).forEach((C,v)=>{let y=l.images.get(C.id),b=m.group?12:23,A=m.group?v===0?0:v===1?-13:13:0,S=m.group?v===0?-10:10:0;x.save(),x.beginPath(),x.arc(A,S,b,0,Math.PI*2),x.clip(),x.fillStyle="#526b8b",x.fillRect(A-b,S-b,b*2,b*2),y?.complete&&y.naturalWidth?x.drawImage(y,A-b,S-b,b*2,b*2):(x.fillStyle="white",x.font=`bold ${b}px system-ui`,x.textAlign="center",x.textBaseline="middle",x.fillText(C.name.slice(0,1).toUpperCase(),A,S)),x.restore()}),x.fillStyle="#eff5ff",x.textAlign="center",x.font=`600 ${Math.max(12,13/_)}px system-ui`,x.fillText(m.name,0,g+23),x.fillStyle="#93a5bf",x.font=`${Math.max(10,11/_)}px system-ui`,x.fillText(m.group?o("{0} messages",m.count):o("{0} sent",m.count),0,g+40),x.restore()}).nodePointerAreaPaint((m,x,_,g)=>{_.fillStyle=x,_.beginPath(),_.arc(m.x,m.y,m.group?34:29,0,Math.PI*2),_.fill(),_.font=`600 ${Math.max(12,13/g)}px system-ui`;let w=Math.max(80,_.measureText(m.name).width+20);_.fillRect(m.x-w/2,m.y+25,w,55)}).linkColor(m=>m.group?"#9f8bd3":"#5b9cab").linkWidth(2).linkCurvature(0).linkHoverPrecision(12).linkCanvasObjectMode(()=>"after").linkCanvasObject((m,x,_)=>{if(m.group)return;let g=(m.source.x+m.target.x)/2,w=(m.source.y+m.target.y)/2,C=o("{0} messages",m.count);x.save(),x.font=`600 ${12/_}px system-ui`;let v=x.measureText(C).width+18/_,y=24/_;x.fillStyle="#213849",x.strokeStyle="#5b9cab",x.lineWidth=1/_,x.beginPath(),x.roundRect(g-v/2,w-y/2,v,y,6/_),x.fill(),x.stroke(),x.textAlign="center",x.textBaseline="middle",x.fillStyle="#d9f9f3",x.fillText(C,g,w),x.restore()}).linkPointerAreaPaint((m,x,_,g)=>{if(_.strokeStyle=x,_.lineWidth=18/g,_.beginPath(),_.moveTo(m.source.x,m.source.y),_.lineTo(m.target.x,m.target.y),_.stroke(),!m.group){_.font=`600 ${12/g}px system-ui`;let w=_.measureText(o("{0} messages",m.count)).width+22/g;_.fillStyle=x,_.fillRect((m.source.x+m.target.x)/2-w/2,(m.source.y+m.target.y)/2-15/g,w,30/g)}}).linkLineDash(m=>m.group?[5,4]:null).linkLabel(m=>{let x=document.createElement("span");return x.textContent=m.name,x}).nodeLabel(m=>{let x=document.createElement("span");return x.textContent=m.name,x}).onNodeHover(m=>{e.style.cursor=m?"pointer":"grab"}).onLinkHover(m=>{e.style.cursor=m?"pointer":"grab"});l={graph:c,images:new Map,signature:null,visible:!1,fitTicks:0,callbacks:{openThread:n,chooseAgent:i}},qs.set(e,l);let p=()=>{e.clientWidth?(c.width(e.clientWidth).height(Math.max(440,Math.min(600,innerHeight-300))),c.resumeAnimation(),l.visible||(l.fitTicks=15,c.d3ReheatSimulation()),l.visible=!0):(c.pauseAnimation(),l.visible=!1)};new ResizeObserver(p).observe(e),l.resize=p,c.onEngineTick(()=>{l.fitTicks>0&&--l.fitTicks===0&&e.clientWidth&&c.zoomToFit(300,95)});let h=e.querySelector("canvas");h.setAttribute("role","img"),h.setAttribute("aria-label",o("Conversation map"));let d=null;h.addEventListener("pointerdown",m=>{m.button===0&&(d={x:m.clientX,y:m.clientY})}),h.addEventListener("pointerup",m=>{if(!d||m.button!==0)return;let x=d;if(d=null,Math.hypot(m.clientX-x.x,m.clientY-x.y)>5)return;let _=h.getBoundingClientRect(),g=c.screen2GraphCoords(m.clientX-_.left,m.clientY-_.top),w=c.zoom(),C=c.graphData(),v=h.getContext("2d");for(let y of[...C.nodes].reverse()){v.font=`600 ${Math.max(12,13/w)}px system-ui`;let b=Math.max(80,v.measureText(y.name).width+20);if(Math.hypot(g.x-y.x,g.y-y.y)<(y.group?34:29)||Math.abs(g.x-y.x)25&&g.y-y.y<80){l.selectedId=y.id,y.group?l.callbacks.openThread(y.thread):l.callbacks.chooseAgent(y.id);return}}for(let y of C.links){let b=y.source,A=y.target,S=A.x-b.x,T=A.y-b.y,z=S*S+T*T,O=z?Math.max(0,Math.min(1,((g.x-b.x)*S+(g.y-b.y)*T)/z)):0,I=Math.hypot(g.x-b.x-O*S,g.y-b.y-O*T);v.font=`600 ${12/w}px system-ui`;let U=v.measureText(o("{0} messages",y.count)).width+22/w;if(I<12/w||!y.group&&Math.abs(g.x-(b.x+A.x)/2)m.group?145:230)}if(l.callbacks={openThread:n,chooseAgent:i},l.resize(),l.signature!==f){l.signature=f,l.fitTicks=15;let c=s.people.map(h=>({id:h.id,name:h.name,person:h,count:u(h.id)})),p=[];for(let h of s.people){let d=a(h);if(d){let m=new Image;m.src=d,l.images.set(h.id,m)}else l.images.delete(h.id)}for(let h of s.conversations){let d=Ge(h);if(h.kind==="direct"&&d.length===2)p.push({source:d[0].id,target:d[1].id,thread:h.id,count:Number(h.message_count??0),name:d.map(m=>m.name).join(" \u2194 ")});else{let m="group:"+h.id;c.push({id:m,name:h.title||o("Group chat"),group:!0,people:d,thread:h.id,count:Number(h.message_count??0)});for(let x of d)p.push({source:x.id,target:m,group:!0,name:h.title,thread:h.id})}}l.graph.graphData({nodes:c,links:p}),l.graph.onEngineStop(()=>{l.graph.zoomToFit(400,95),l.graph.onEngineStop(()=>{})})}return{fit:()=>l.graph.zoomToFit(400,95),zoom:c=>l.graph.zoom(l.graph.zoom()*c,250)}}export{y1 as renderConversationGraph}; +`;Ah(Sh);var Ch=We(Dn);function Rs(e,r,n){!r||typeof n!="string"||e.filter(i=>!i[n]).forEach(i=>{i[n]=Ch(r(i))})}function Mh({nodes:e,links:r},n,{nodeFilter:i=()=>!0,onLoopError:o=a=>{throw`Invalid DAG structure! Found cycle in node path: ${a.join(" -> ")}.`}}={}){let a={};e.forEach(l=>a[n(l)]={data:l,out:[],depth:-1,skip:!i(l)}),r.forEach(({source:l,target:c})=>{let h=x(l),p=x(c);if(!a.hasOwnProperty(h))throw`Missing source node with id: ${h}`;if(!a.hasOwnProperty(p))throw`Missing target node with id: ${p}`;let d=a[h],m=a[p];d.out.push(m);function x(_){return typeof _=="object"?n(_):_}});let s=[];return u(Object.values(a)),Object.assign({},...Object.entries(a).filter(([,l])=>!l.skip).map(([l,c])=>({[l]:c.depth})));function u(l,c=[],h=0){for(let p=0,d=l.length;pn(_.data));s.some(_=>_.length===x.length&&_.every((g,w)=>g===x[w]))||(s.push(x),o(x));continue}h>m.depth&&(m.depth=h,u(m.out,[...c,m],h+(m.skip?0:1)))}}}var Ph=2,et=(e,r)=>r.onNeedsRedraw&&r.onNeedsRedraw(),Ns=(e,r)=>{if(!r.isShadow){let n=B(r.linkDirectionalParticles);r.graphData.links.forEach(i=>{let o=Math.round(Math.abs(n(i)));o?i.__photons=[...Array(o)].map(()=>({})):delete i.__photons})}},Dr=Ne({props:{graphData:{default:{nodes:[],links:[]},onChange(e,r){r.engineRunning=!1,Ns(e,r)}},dagMode:{onChange(e,r){!e&&(r.graphData.nodes||[]).forEach(n=>n.fx=n.fy=void 0)}},dagLevelDistance:{},dagNodeFilter:{default:e=>!0},onDagError:{triggerUpdate:!1},nodeRelSize:{default:4,triggerUpdate:!1,onChange:et},nodeId:{default:"id"},nodeVal:{default:"val",triggerUpdate:!1,onChange:et},nodeColor:{default:"color",triggerUpdate:!1,onChange:et},nodeAutoColorBy:{},nodeCanvasObject:{triggerUpdate:!1,onChange:et},nodeCanvasObjectMode:{default:()=>"replace",triggerUpdate:!1,onChange:et},nodeVisibility:{default:!0,triggerUpdate:!1,onChange:et},linkSource:{default:"source"},linkTarget:{default:"target"},linkVisibility:{default:!0,triggerUpdate:!1,onChange:et},linkColor:{default:"color",triggerUpdate:!1,onChange:et},linkAutoColorBy:{},linkLineDash:{triggerUpdate:!1,onChange:et},linkWidth:{default:1,triggerUpdate:!1,onChange:et},linkCurvature:{default:0,triggerUpdate:!1,onChange:et},linkSelfCurveRotation:{default:0,triggerUpdate:!1,onChange:et},linkCanvasObject:{triggerUpdate:!1,onChange:et},linkCanvasObjectMode:{default:()=>"replace",triggerUpdate:!1,onChange:et},linkDirectionalArrowLength:{default:0,triggerUpdate:!1,onChange:et},linkDirectionalArrowColor:{triggerUpdate:!1,onChange:et},linkDirectionalArrowRelPos:{default:.5,triggerUpdate:!1,onChange:et},linkDirectionalParticles:{default:0,triggerUpdate:!1,onChange:Ns},linkDirectionalParticleSpeed:{default:.01,triggerUpdate:!1},linkDirectionalParticleOffset:{default:0,triggerUpdate:!1},linkDirectionalParticleWidth:{default:4,triggerUpdate:!1},linkDirectionalParticleColor:{triggerUpdate:!1},linkDirectionalParticleCanvasObject:{triggerUpdate:!1},globalScale:{default:1,triggerUpdate:!1},d3AlphaMin:{default:0,triggerUpdate:!1},d3AlphaDecay:{default:.0228,triggerUpdate:!1,onChange(e,r){r.forceLayout.alphaDecay(e)}},d3AlphaTarget:{default:0,triggerUpdate:!1,onChange(e,r){r.forceLayout.alphaTarget(e)}},d3VelocityDecay:{default:.4,triggerUpdate:!1,onChange(e,r){r.forceLayout.velocityDecay(e)}},warmupTicks:{default:0,triggerUpdate:!1},cooldownTicks:{default:1/0,triggerUpdate:!1},cooldownTime:{default:15e3,triggerUpdate:!1},onUpdate:{default:()=>{},triggerUpdate:!1},onFinishUpdate:{default:()=>{},triggerUpdate:!1},onEngineTick:{default:()=>{},triggerUpdate:!1},onEngineStop:{default:()=>{},triggerUpdate:!1},onNeedsRedraw:{triggerUpdate:!1},isShadow:{default:!1,triggerUpdate:!1}},methods:{d3Force:function(e,r,n){return n===void 0?e.forceLayout.force(r):(e.forceLayout.force(r,n),this)},d3ReheatSimulation:function(e){return e.forceLayout.alpha(1),this.resetCountdown(),this},resetCountdown:function(e){return e.cntTicks=0,e.startTickTime=new Date,e.engineRunning=!0,this},isEngineRunning:e=>!!e.engineRunning,tickFrame:function(e){return!e.isShadow&&r(),i(),!e.isShadow&&o(),!e.isShadow&&a(),n(),this;function r(){e.engineRunning&&(++e.cntTicks>e.cooldownTicks||new Date-e.startTickTime>e.cooldownTime||e.d3AlphaMin>0&&e.forceLayout.alpha(){let m=l(d);if(e.nodeCanvasObject&&(m==="before"||m==="replace")&&(e.nodeCanvasObject(d,c,e.globalScale),m==="replace")){c.restore();return}let x=Math.sqrt(Math.max(0,f(d)||1))*e.nodeRelSize+h;c.beginPath(),c.arc(d.x,d.y,x,0,2*Math.PI,!1),c.fillStyle=u(d)||"rgba(31, 120, 180, 0.92)",c.fill(),e.nodeCanvasObject&&m==="after"&&e.nodeCanvasObject(d,e.ctx,e.globalScale)}),c.restore()}function i(){let s=B(e.linkVisibility),f=B(e.linkColor),u=B(e.linkWidth),l=B(e.linkLineDash),c=B(e.linkCurvature),h=B(e.linkSelfCurveRotation),p=B(e.linkCanvasObjectMode),d=e.ctx,m=e.isShadow*2,x=e.graphData.links.filter(s);x.forEach(v);let _=[],g=[],w=x;if(e.linkCanvasObject){let y=[],b=[];x.forEach(k=>({before:_,after:g,replace:y}[p(k)]||b).push(k)),w=[..._,...g,...b],_=_.concat(y)}d.save(),_.forEach(y=>e.linkCanvasObject(y,d,e.globalScale)),d.restore();let S=Os(w,[f,u,l]);d.save(),Object.entries(S).forEach(([y,b])=>{let k=!y||y==="undefined"?"rgba(0,0,0,0.15)":y;Object.entries(b).forEach(([C,T])=>{let z=(C||1)/e.globalScale+m;Object.entries(T).forEach(([E,I])=>{let U=l(I[0]);d.beginPath(),I.forEach(A=>{let O=A.source,M=A.target;if(!O||!M||!O.hasOwnProperty("x")||!M.hasOwnProperty("x"))return;d.moveTo(O.x,O.y);let R=A.__controlPoints;R?d[R.length===2?"quadraticCurveTo":"bezierCurveTo"](...R,M.x,M.y):d.lineTo(M.x,M.y)}),d.strokeStyle=k,d.lineWidth=z,d.setLineDash(U||[]),d.stroke()})})}),d.restore(),d.save(),g.forEach(y=>e.linkCanvasObject(y,d,e.globalScale)),d.restore();function v(y){let b=c(y);if(!b){y.__controlPoints=null;return}let k=y.source,C=y.target;if(!k||!C||!k.hasOwnProperty("x")||!C.hasOwnProperty("x"))return;let T=Math.sqrt(Math.pow(C.x-k.x,2)+Math.pow(C.y-k.y,2));if(T>0){let z=Math.atan2(C.y-k.y,C.x-k.x),E=T*b,I={x:(k.x+C.x)/2+E*Math.cos(z-Math.PI/2),y:(k.y+C.y)/2+E*Math.sin(z-Math.PI/2)};y.__controlPoints=[I.x,I.y]}else{let z=b*70,E=(h(y)||0)*Math.PI/180,I=E-Math.PI/2,U=E;y.__controlPoints=[C.x+z*Math.cos(I),C.y+z*Math.sin(I),C.x+z*Math.cos(U),C.y+z*Math.sin(U)]}}}function o(){let u=B(e.linkDirectionalArrowLength),l=B(e.linkDirectionalArrowRelPos),c=B(e.linkVisibility),h=B(e.linkDirectionalArrowColor||e.linkColor),p=B(e.nodeVal),d=e.ctx;d.save(),e.graphData.links.filter(c).forEach(m=>{let x=u(m);if(!x||x<0)return;let _=m.source,g=m.target;if(!_||!g||!_.hasOwnProperty("x")||!g.hasOwnProperty("x"))return;let w=Math.sqrt(Math.max(0,p(_)||1))*e.nodeRelSize,S=Math.sqrt(Math.max(0,p(g)||1))*e.nodeRelSize,v=Math.min(1,Math.max(0,l(m))),y=h(m)||"rgba(0,0,0,0.28)",b=x/1.6/2,k=m.__controlPoints&&new Qt(_.x,_.y,...m.__controlPoints,g.x,g.y),C=k?O=>k.get(O):O=>({x:_.x+(g.x-_.x)*O||0,y:_.y+(g.y-_.y)*O||0}),T=k?k.length():Math.sqrt(Math.pow(g.x-_.x,2)+Math.pow(g.y-_.y,2)),z=w+x+(T-w-S-x)*v,E=C(z/T),I=C((z-x)/T),U=C((z-x*(1-.2))/T),A=Math.atan2(E.y-I.y,E.x-I.x)-Math.PI/2;d.beginPath(),d.moveTo(E.x,E.y),d.lineTo(I.x+b*Math.cos(A),I.y+b*Math.sin(A)),d.lineTo(U.x,U.y),d.lineTo(I.x-b*Math.cos(A),I.y-b*Math.sin(A)),d.fillStyle=y,d.fill()}),d.restore()}function a(){let s=B(e.linkDirectionalParticles),f=B(e.linkDirectionalParticleSpeed),u=B(e.linkDirectionalParticleOffset),l=B(e.linkDirectionalParticleWidth),c=B(e.linkVisibility),h=B(e.linkDirectionalParticleColor||e.linkColor),p=e.ctx;p.save(),e.graphData.links.filter(c).forEach(d=>{let m=s(d);if(!d.hasOwnProperty("__photons")||!d.__photons.length)return;let x=d.source,_=d.target;if(!x||!_||!x.hasOwnProperty("x")||!_.hasOwnProperty("x"))return;let g=f(d),w=Math.abs(u(d)),S=d.__photons||[],v=Math.max(0,l(d)/2)/Math.sqrt(e.globalScale),y=h(d)||"rgba(0,0,0,0.28)";p.fillStyle=y;let b=d.__controlPoints?new Qt(x.x,x.y,...d.__controlPoints,_.x,_.y):null,k=0,C=!1;S.forEach(T=>{let z=!!T.__singleHop;if(T.hasOwnProperty("__progressRatio")||(T.__progressRatio=z?g<0?1:0:(k+w)/m),!z&&k++,T.__progressRatio+=g,T.__progressRatio>=1||T.__progressRatio<0)if(!z)T.__progressRatio=T.__progressRatio%1,T.__progressRatio<0&&T.__progressRatio++;else{C=!0;return}let E=T.__progressRatio,I=b?b.get(E):{x:x.x+(_.x-x.x)*E||0,y:x.y+(_.y-x.y)*E||0};e.linkDirectionalParticleCanvasObject?e.linkDirectionalParticleCanvasObject(I.x,I.y,d,p,e.globalScale):(p.beginPath(),p.arc(I.x,I.y,v,0,2*Math.PI,!1),p.fill())}),C&&(d.__photons=d.__photons.filter(T=>!T.__singleHop||T.__progressRatio<=1&&T.__progressRatio>=0))}),p.restore()}},emitParticle:function(e,r){return r&&(!r.__photons&&(r.__photons=[]),r.__photons.push({__singleHop:!0})),this}},stateInit:()=>({forceLayout:Tn().force("link",Mn()).force("charge",zn()).force("center",bn()).force("dagRadial",null).stop(),engineRunning:!1}),init(e,r){r.ctx=e},update(e,r){e.engineRunning=!1,e.onUpdate(),e.nodeAutoColorBy!==null&&Rs(e.graphData.nodes,B(e.nodeAutoColorBy),e.nodeColor),e.linkAutoColorBy!==null&&Rs(e.graphData.links,B(e.linkAutoColorBy),e.linkColor),e.graphData.links.forEach(s=>{s.source=s[e.linkSource],s.target=s[e.linkTarget]}),e.forceLayout.stop().alpha(1).nodes(e.graphData.nodes);let n=e.forceLayout.force("link");n&&n.id(s=>s[e.nodeId]).links(e.graphData.links);let i=e.dagMode&&Mh(e.graphData,s=>s[e.nodeId],{nodeFilter:e.dagNodeFilter,onLoopError:e.onDagError||void 0}),o=Math.max(...Object.values(i||[])),a=e.dagLevelDistance||e.graphData.nodes.length/(o||1)*Ph*(["radialin","radialout"].indexOf(e.dagMode)!==-1?.7:1);if(["lr","rl","td","bu"].includes(r.dagMode)){let s=["lr","rl"].includes(r.dagMode)?"fx":"fy";e.graphData.nodes.filter(e.dagNodeFilter).forEach(f=>delete f[s])}if(["lr","rl","td","bu"].includes(e.dagMode)){let s=["rl","bu"].includes(e.dagMode),f=l=>(i[l[e.nodeId]]-o/2)*a*(s?-1:1),u=["lr","rl"].includes(e.dagMode)?"fx":"fy";e.graphData.nodes.filter(e.dagNodeFilter).forEach(l=>l[u]=f(l))}e.forceLayout.force("dagRadial",["radialin","radialout"].indexOf(e.dagMode)!==-1?On(s=>{let f=i[s[e.nodeId]]||-1;return(e.dagMode==="radialin"?o-f:f)*a}).strength(s=>e.dagNodeFilter(s)?1:0):null);for(let s=0;s0&&e.forceLayout.alpha()s[f][o](a))},triggerUpdate:!1}},linkMethod:function(o){return function(a,...s){let f=[];return n.forEach(u=>{let l=a[u],c=l[o](...s);c!==l&&f.push(c)}),f.length?f[0]:this}}}}var Th=800,zh=4,Oh=5,Ls=js("forceGraph",Dr),Eh=js(["forceGraph","shadowGraph"],Dr),Ih=Object.assign(...["nodeColor","nodeAutoColorBy","nodeCanvasObject","nodeCanvasObjectMode","linkColor","linkAutoColorBy","linkLineDash","linkWidth","linkCanvasObject","linkCanvasObjectMode","linkDirectionalArrowLength","linkDirectionalArrowColor","linkDirectionalArrowRelPos","linkDirectionalParticles","linkDirectionalParticleSpeed","linkDirectionalParticleOffset","linkDirectionalParticleWidth","linkDirectionalParticleColor","linkDirectionalParticleCanvasObject","dagMode","dagLevelDistance","dagNodeFilter","onDagError","d3AlphaMin","d3AlphaDecay","d3VelocityDecay","warmupTicks","cooldownTicks","cooldownTime","onEngineTick","onEngineStop"].map(e=>({[e]:Ls.linkProp(e)})),...["nodeRelSize","nodeId","nodeVal","nodeVisibility","linkSource","linkTarget","linkVisibility","linkCurvature","linkSelfCurveRotation"].map(e=>({[e]:Eh.linkProp(e)}))),Rh=Object.assign(...["d3Force","d3ReheatSimulation","emitParticle"].map(e=>({[e]:Ls.linkMethod(e)})));function jn(e){if(e.canvas){let r=e.canvas.width,n=e.canvas.height;r===300&&n===150&&(r=n=0);let i=window.devicePixelRatio;r/=i,n/=i,[e.canvas,e.shadowCanvas].forEach(a=>{a.style.width=`${e.width}px`,a.style.height=`${e.height}px`,a.width=e.width*i,a.height=e.height*i,!r&&!n&&a.getContext("2d").scale(i,i)});let o=lt(e.canvas).k;e.zoom.translateBy(e.zoom.__baseElem,(e.width-r)/2/o,(e.height-n)/2/o),e.needsRedraw=!0}}function Fs(e){let r=window.devicePixelRatio;e.setTransform(r,0,0,r,0,0)}function Ds(e,r,n){e.save(),Fs(e),e.clearRect(0,0,r,n),e.restore()}var Us=Ne({props:{width:{default:window.innerWidth,onChange:(e,r)=>jn(r),triggerUpdate:!1},height:{default:window.innerHeight,onChange:(e,r)=>jn(r),triggerUpdate:!1},graphData:{default:{nodes:[],links:[]},onChange:(e,r)=>{[e.nodes,e.links].every(i=>(i||[]).every(o=>!o.hasOwnProperty("__indexColor")))&&r.colorTracker.reset(),[{type:"Node",objs:e.nodes},{type:"Link",objs:e.links}].forEach(n),r.forceGraph.graphData(e),r.shadowGraph.graphData(e);function n({type:i,objs:o}){o.filter(a=>{if(!a.hasOwnProperty("__indexColor"))return!0;let s=r.colorTracker.lookup(a.__indexColor);return!s||!s.hasOwnProperty("d")||s.d!==a}).forEach(a=>{a.__indexColor=r.colorTracker.register({type:i,d:a})})}},triggerUpdate:!1},backgroundColor:{onChange(e,r){r.canvas&&e&&(r.canvas.style.background=e)},triggerUpdate:!1},nodeLabel:{default:"name",triggerUpdate:!1},nodePointerAreaPaint:{onChange(e,r){r.shadowGraph.nodeCanvasObject(e?(n,i,o)=>e(n,n.__indexColor,i,o):null),r.flushShadowCanvas&&r.flushShadowCanvas()},triggerUpdate:!1},linkPointerAreaPaint:{onChange(e,r){r.shadowGraph.linkCanvasObject(e?(n,i,o)=>e(n,n.__indexColor,i,o):null),r.flushShadowCanvas&&r.flushShadowCanvas()},triggerUpdate:!1},linkLabel:{default:"name",triggerUpdate:!1},linkHoverPrecision:{default:4,triggerUpdate:!1},minZoom:{default:.01,onChange(e,r){r.zoom.scaleExtent([e,r.zoom.scaleExtent()[1]])},triggerUpdate:!1},maxZoom:{default:1e3,onChange(e,r){r.zoom.scaleExtent([r.zoom.scaleExtent()[0],e])},triggerUpdate:!1},enableNodeDrag:{default:!0,triggerUpdate:!1},enableZoomInteraction:{default:!0,triggerUpdate:!1},enablePanInteraction:{default:!0,triggerUpdate:!1},enableZoomPanInteraction:{default:!0,triggerUpdate:!1},enablePointerInteraction:{default:!0,onChange(e,r){r.hoverObj=null},triggerUpdate:!1},autoPauseRedraw:{default:!0,triggerUpdate:!1},onNodeDrag:{default:()=>{},triggerUpdate:!1},onNodeDragEnd:{default:()=>{},triggerUpdate:!1},onNodeClick:{triggerUpdate:!1},onNodeRightClick:{triggerUpdate:!1},onNodeHover:{triggerUpdate:!1},onLinkClick:{triggerUpdate:!1},onLinkRightClick:{triggerUpdate:!1},onLinkHover:{triggerUpdate:!1},onBackgroundClick:{triggerUpdate:!1},onBackgroundRightClick:{triggerUpdate:!1},showPointerCursor:{default:!0,triggerUpdate:!1},onZoom:{triggerUpdate:!1},onZoomEnd:{triggerUpdate:!1},onRenderFramePre:{triggerUpdate:!1},onRenderFramePost:{triggerUpdate:!1},...Ih},aliases:{stopAnimation:"pauseAnimation"},methods:{graph2ScreenCoords:function(e,r,n){let i=lt(e.canvas);return{x:r*i.k+i.x,y:n*i.k+i.y}},screen2GraphCoords:function(e,r,n){let i=lt(e.canvas);return{x:(r-i.x)/i.k,y:(n-i.y)/i.k}},centerAt:function(e,r,n,i){if(!e.canvas)return null;if(r!==void 0||n!==void 0){let s=Object.assign({},r!==void 0?{x:r}:{},n!==void 0?{y:n}:{});return i?e.tweenGroup.add(new fn(o()).to(s,i).easing(Dt.Quadratic.Out).onUpdate(a).onComplete(function(){e.tweenGroup.remove(this)}).start()):a(s),this}return o();function o(){let s=lt(e.canvas);return{x:(e.width/2-s.x)/s.k,y:(e.height/2-s.y)/s.k}}function a({x:s,y:f}){e.zoom.translateTo(e.zoom.__baseElem,s===void 0?o().x:s,f===void 0?o().y:f),e.needsRedraw=!0}},zoom:function(e,r,n){if(!e.canvas)return null;if(r!==void 0)return n?e.tweenGroup.add(new fn({k:i()}).to({k:r},n).easing(Dt.Quadratic.Out).onUpdate(({k:a})=>o(a)).onComplete(function(){e.tweenGroup.remove(this)}).start()):o(r),this;return i();function i(){return lt(e.canvas).k}function o(a){e.zoom.scaleTo(e.zoom.__baseElem,a),e.needsRedraw=!0}},zoomToFit:function(e,r=0,n=10,...i){let o=this.getGraphBbox(...i);if(o){let a={x:(o.x[0]+o.x[1])/2,y:(o.y[0]+o.y[1])/2},s=Math.max(1e-12,Math.min(1e12,(e.width-n*2)/(o.x[1]-o.x[0]),(e.height-n*2)/(o.y[1]-o.y[0])));this.centerAt(a.x,a.y,r),this.zoom(s,r)}return this},getGraphBbox:function(e,r=()=>!0){let n=B(e.nodeVal),i=a=>Math.sqrt(Math.max(0,n(a)||1))*e.nodeRelSize,o=e.graphData.nodes.filter(r).map(a=>({x:a.x,y:a.y,r:i(a)}));return o.length?{x:[Ee(o,a=>a.x-a.r),Oe(o,a=>a.x+a.r)],y:[Ee(o,a=>a.y-a.r),Oe(o,a=>a.y+a.r)]}:null},pauseAnimation:function(e){return e.animationFrameRequestId&&(cancelAnimationFrame(e.animationFrameRequestId),e.animationFrameRequestId=null),this},resumeAnimation:function(e){return e.animationFrameRequestId||this._animationCycle(),this},_destructor:function(){this.pauseAnimation(),this.graphData({nodes:[],links:[]})},...Rh},stateInit:()=>({lastSetZoom:1,zoom:rn(),forceGraph:new Dr,shadowGraph:new Dr().cooldownTicks(0).nodeColor("__indexColor").linkColor("__indexColor").isShadow(!0),colorTracker:new ea,tweenGroup:new sn}),init:function(e,r){e.innerHTML="";let n=document.createElement("div");n.classList.add("force-graph-container"),n.style.position="relative",e.appendChild(n),r.canvas=document.createElement("canvas"),r.backgroundColor&&(r.canvas.style.background=r.backgroundColor),n.appendChild(r.canvas),r.shadowCanvas=document.createElement("canvas");let i=r.canvas.getContext("2d"),o=r.shadowCanvas.getContext("2d",{willReadFrequently:!0}),a={x:-1e12,y:-1e12},s=()=>{let u=null,l=window.devicePixelRatio,c=a.x>0&&a.y>0?o.getImageData(a.x*l,a.y*l,1,1):null;return c&&(u=r.colorTracker.lookup(c.data)),u};K(r.canvas).call(Br().subject(()=>{if(!r.enableNodeDrag)return null;let u=s();return u&&u.type==="Node"?u.d:null}).on("start",u=>{let l=u.subject;l.__initialDragPos={x:l.x,y:l.y,fx:l.fx,fy:l.fy},u.active||(l.fx=l.x,l.fy=l.y),r.canvas.classList.add("grabbable")}).on("drag",u=>{let l=u.subject,c=l.__initialDragPos,h=u,p=lt(r.canvas).k,d={x:c.x+(h.x-c.x)/p-l.x,y:c.y+(h.y-c.y)/p-l.y};["x","y"].forEach(m=>l[`f${m}`]=l[m]=c[m]+(h[m]-c[m])/p),!(!l.__dragged&&Oh>=Math.sqrt(_r(["x","y"].map(m=>(u[m]-c[m])**2))))&&(r.forceGraph.d3AlphaTarget(.3).resetCountdown(),r.isPointerDragging=!0,l.__dragged=!0,r.onNodeDrag(l,d))}).on("end",u=>{let l=u.subject,c=l.__initialDragPos,h={x:l.x-c.x,y:l.y-c.y};c.fx===void 0&&(l.fx=void 0),c.fy===void 0&&(l.fy=void 0),delete l.__initialDragPos,r.forceGraph.d3AlphaTarget()&&r.forceGraph.d3AlphaTarget(0).resetCountdown(),r.canvas.classList.remove("grabbable"),r.isPointerDragging=!1,l.__dragged&&(delete l.__dragged,r.onNodeDragEnd(l,h))})),r.zoom(r.zoom.__baseElem=K(r.canvas)),r.zoom.__baseElem.on("dblclick.zoom",null),r.zoom.filter(u=>!u.button&&r.enableZoomPanInteraction&&(u.type!=="wheel"||B(r.enableZoomInteraction)(u))&&(u.type==="wheel"||B(r.enablePanInteraction)(u))).on("zoom",u=>{let l=u.transform;[i,o].forEach(c=>{Fs(c),c.translate(l.x,l.y),c.scale(l.k,l.k)}),r.isPointerDragging=!0,r.onZoom&&r.onZoom({...l,...this.centerAt()}),r.needsRedraw=!0}).on("end",u=>{r.isPointerDragging=!1,r.onZoomEnd&&r.onZoomEnd({...u.transform,...this.centerAt()})}),jn(r),r.forceGraph.onNeedsRedraw(()=>r.needsRedraw=!0).onFinishUpdate(()=>{lt(r.canvas).k===r.lastSetZoom&&r.graphData.nodes.length&&(r.zoom.scaleTo(r.zoom.__baseElem,r.lastSetZoom=zh/Math.cbrt(r.graphData.nodes.length)),r.needsRedraw=!0)}),r.tooltip=new va(n),["pointermove","pointerdown"].forEach(u=>n.addEventListener(u,l=>{u==="pointerdown"&&(r.isPointerPressed=!0,r.pointerDownEvent=l),!r.isPointerDragging&&l.type==="pointermove"&&r.onBackgroundClick&&(l.pressure>0||r.isPointerPressed)&&(l.pointerType==="mouse"||l.movementX===void 0||[l.movementX,l.movementY].some(p=>Math.abs(p)>1))&&(r.isPointerDragging=!0);let c=h(n);a.x=l.pageX-c.left,a.y=l.pageY-c.top;function h(p){let d=p.getBoundingClientRect(),m=window.pageXOffset||document.documentElement.scrollLeft,x=window.pageYOffset||document.documentElement.scrollTop;return{top:d.top+x,left:d.left+m}}},{passive:!0})),n.addEventListener("pointerup",u=>{if(!r.isPointerPressed)return;if(r.isPointerPressed=!1,r.isPointerDragging){r.isPointerDragging=!1;return}let l=[u,r.pointerDownEvent];requestAnimationFrame(()=>{if(u.button===0)if(r.hoverObj){let c=r[`on${r.hoverObj.type}Click`];c&&c(r.hoverObj.d,...l)}else r.onBackgroundClick&&r.onBackgroundClick(...l);if(u.button===2)if(r.hoverObj){let c=r[`on${r.hoverObj.type}RightClick`];c&&c(r.hoverObj.d,...l)}else r.onBackgroundRightClick&&r.onBackgroundRightClick(...l)})},{passive:!0}),n.addEventListener("contextmenu",u=>!r.onBackgroundRightClick&&!r.onNodeRightClick&&!r.onLinkRightClick?!0:(u.preventDefault(),!1)),r.forceGraph(i),r.shadowGraph(o);let f=on(()=>{Ds(o,r.width,r.height),r.shadowGraph.linkWidth(l=>B(r.linkWidth)(l)+r.linkHoverPrecision);let u=lt(r.canvas);r.shadowGraph.globalScale(u.k).tickFrame()},Th);r.flushShadowCanvas=f.flush,(this._animationCycle=function u(){let l=!r.autoPauseRedraw||!!r.needsRedraw||r.forceGraph.isEngineRunning()||r.graphData.links.some(c=>c.__photons&&c.__photons.length);if(r.needsRedraw=!1,r.enablePointerInteraction){let c=r.isPointerDragging?null:s();if(c!==r.hoverObj){let h=r.hoverObj,p=h?h.type:null,d=c?c.type:null;if(p&&p!==d){let m=r[`on${p}Hover`];m&&m(null,h.d)}if(d){let m=r[`on${d}Hover`];m&&m(c.d,p===d?h.d:null)}r.tooltip.content(c&&B(r[`${c.type.toLowerCase()}Label`])(c.d)||null),r.canvas.classList[(c&&r[`on${d}Click`]||!c&&r.onBackgroundClick)&&B(r.showPointerCursor)(c?.d)?"add":"remove"]("clickable"),r.hoverObj=c}l&&f()}if(l){Ds(i,r.width,r.height);let c=lt(r.canvas).k;r.onRenderFramePre&&r.onRenderFramePre(i,c),r.forceGraph.globalScale(c).tickFrame(),r.onRenderFramePost&&r.onRenderFramePost(i,c)}r.tweenGroup.update(),r.animationFrameRequestId=requestAnimationFrame(u)})()},update:function(r){}});function Ln(e){return e?.participants??e?.members??[]}function Jt(e){return e?.active===0||e?.active===!1}var qs=new WeakMap;function x1(e,r,{openThread:n,chooseAgent:i,t:o,icon:a}){let s=JSON.stringify(r),f=l=>r.conversations.reduce((c,h)=>c+Number(Ln(h).find(p=>p.id===l)?.sent_count??0),0),u=qs.get(e);if(!u){e.replaceChildren();let l=new Us(e).backgroundColor("#101726").nodeId("id").nodeRelSize(28).nodeCanvasObject((d,m,x)=>{let _=d.group?30:25,g=!d.group&&Jt(d.person);m.save(),m.translate(d.x,d.y),m.shadowColor=d.group?"#a78bfa":"#53d9c7",m.shadowBlur=g?0:12,m.fillStyle=g?"#383c44":d.group?"#302a49":"#26374c",m.beginPath(),m.arc(0,0,_+4,0,Math.PI*2),m.fill(),m.shadowBlur=0,u.selectedId===d.id&&(m.strokeStyle=g?"#adb3bd":"#a6fff0",m.lineWidth=3,m.stroke()),(d.group?d.people.slice(0,3):[d.person]).forEach((v,y)=>{let b=u.images.get(v.id),k=d.group?12:23,C=d.group?y===0?0:y===1?-13:13:0,T=d.group?y===0?-10:10:0;m.save(),m.beginPath(),m.arc(C,T,k,0,Math.PI*2),m.clip(),Jt(v)&&(m.filter="grayscale(1)",m.globalAlpha=.65),m.fillStyle=Jt(v)?"#676c76":"#526b8b",m.fillRect(C-k,T-k,k*2,k*2),b?.complete&&b.naturalWidth?m.drawImage(b,C-k,T-k,k*2,k*2):(m.fillStyle="white",m.font=`bold ${k}px system-ui`,m.textAlign="center",m.textBaseline="middle",m.fillText(v.name.slice(0,1).toUpperCase(),C,T)),m.restore()}),m.fillStyle=g?"#adb3bd":"#eff5ff",m.textAlign="center",m.font=`600 ${Math.max(12,13/x)}px system-ui`,m.fillText(d.name,0,_+23);let S=d.group?o("{0} messages",d.count):o("{0} sent",d.count);m.fillStyle=g?"#adb3bd":"#93a5bf",m.font=`${Math.max(10,11/x)}px system-ui`,m.fillText(g?`${o("Disabled")} \xB7 ${S}`:S,0,_+40),m.restore()}).nodePointerAreaPaint((d,m,x,_)=>{x.fillStyle=m,x.beginPath(),x.arc(d.x,d.y,d.group?34:29,0,Math.PI*2),x.fill(),x.font=`600 ${Math.max(12,13/_)}px system-ui`;let g=Math.max(80,x.measureText(d.name).width+20);x.fillRect(d.x-g/2,d.y+25,g,55)}).linkColor(d=>d.disabled?"#7a808b":d.group?"#9f8bd3":"#5b9cab").linkWidth(2).linkCurvature(0).linkHoverPrecision(12).linkCanvasObjectMode(()=>"after").linkCanvasObject((d,m,x)=>{if(d.group)return;let _=(d.source.x+d.target.x)/2,g=(d.source.y+d.target.y)/2,w=o("{0} messages",d.count);m.save(),m.font=`600 ${12/x}px system-ui`;let S=m.measureText(w).width+18/x,v=24/x;m.fillStyle=d.disabled?"#30343c":"#213849",m.strokeStyle=d.disabled?"#7a808b":"#5b9cab",m.lineWidth=1/x,m.beginPath(),m.roundRect(_-S/2,g-v/2,S,v,6/x),m.fill(),m.stroke(),m.textAlign="center",m.textBaseline="middle",m.fillStyle=d.disabled?"#c4c8d0":"#d9f9f3",m.fillText(w,_,g),m.restore()}).linkPointerAreaPaint((d,m,x,_)=>{if(x.strokeStyle=m,x.lineWidth=18/_,x.beginPath(),x.moveTo(d.source.x,d.source.y),x.lineTo(d.target.x,d.target.y),x.stroke(),!d.group){x.font=`600 ${12/_}px system-ui`;let g=x.measureText(o("{0} messages",d.count)).width+22/_;x.fillStyle=m,x.fillRect((d.source.x+d.target.x)/2-g/2,(d.source.y+d.target.y)/2-15/_,g,30/_)}}).linkLineDash(d=>d.group||d.disabled?[5,4]:null).linkLabel(d=>{let m=document.createElement("span");return m.textContent=d.name,m}).nodeLabel(d=>{let m=document.createElement("span");return m.textContent=d.name+(!d.group&&Jt(d.person)?` \xB7 ${o("Disabled")}`:""),m}).onNodeHover(d=>{e.style.cursor=d?"pointer":"grab"}).onLinkHover(d=>{e.style.cursor=d?"pointer":"grab"});u={graph:l,images:new Map,signature:null,visible:!1,fitTicks:0,callbacks:{openThread:n,chooseAgent:i}},qs.set(e,u);let c=()=>{e.clientWidth?(l.width(e.clientWidth).height(Math.max(440,Math.min(600,innerHeight-300))),l.resumeAnimation(),u.visible||(u.fitTicks=15,l.d3ReheatSimulation()),u.visible=!0):(l.pauseAnimation(),u.visible=!1)};new ResizeObserver(c).observe(e),u.resize=c,l.onEngineTick(()=>{u.fitTicks>0&&--u.fitTicks===0&&e.clientWidth&&l.zoomToFit(300,95)});let h=e.querySelector("canvas");h.setAttribute("role","img"),h.setAttribute("aria-label",o("Conversation map"));let p=null;h.addEventListener("pointerdown",d=>{d.button===0&&(p={x:d.clientX,y:d.clientY})}),h.addEventListener("pointerup",d=>{if(!p||d.button!==0)return;let m=p;if(p=null,Math.hypot(d.clientX-m.x,d.clientY-m.y)>5)return;let x=h.getBoundingClientRect(),_=l.screen2GraphCoords(d.clientX-x.left,d.clientY-x.top),g=l.zoom(),w=l.graphData(),S=h.getContext("2d");for(let v of[...w.nodes].reverse()){S.font=`600 ${Math.max(12,13/g)}px system-ui`;let y=Math.max(80,S.measureText(v.name).width+20);if(Math.hypot(_.x-v.x,_.y-v.y)<(v.group?34:29)||Math.abs(_.x-v.x)25&&_.y-v.y<80){u.selectedId=v.id,v.group?u.callbacks.openThread(v.thread):u.callbacks.chooseAgent(v.id);return}}for(let v of w.links){let y=v.source,b=v.target,k=b.x-y.x,C=b.y-y.y,T=k*k+C*C,z=T?Math.max(0,Math.min(1,((_.x-y.x)*k+(_.y-y.y)*C)/T)):0,E=Math.hypot(_.x-y.x-z*k,_.y-y.y-z*C);S.font=`600 ${12/g}px system-ui`;let I=S.measureText(o("{0} messages",v.count)).width+22/g;if(E<12/g||!v.group&&Math.abs(_.x-(y.x+b.x)/2)d.group?145:230)}if(u.callbacks={openThread:n,chooseAgent:i},u.resize(),u.signature!==s){u.signature=s,u.fitTicks=15;let l=r.people.map(h=>({id:h.id,name:h.name,person:h,count:f(h.id)})),c=[];for(let h of r.people){let p=a(h);if(p){let d=new Image;d.src=p,u.images.set(h.id,d)}else u.images.delete(h.id)}for(let h of r.conversations){let p=Ln(h);if(h.kind==="direct"&&p.length===2)c.push({source:p[0].id,target:p[1].id,disabled:p.some(Jt),thread:h.id,count:Number(h.message_count??0),name:p.map(d=>d.name).join(" \u2194 ")});else{let d="group:"+h.id;l.push({id:d,name:h.title||o("Group chat"),group:!0,people:p,thread:h.id,count:Number(h.message_count??0)});for(let m of p)c.push({source:m.id,target:d,disabled:Jt(m),group:!0,name:h.title,thread:h.id})}}l.some(h=>h.id===u.selectedId)||(u.selectedId=null),u.graph.graphData({nodes:l,links:c}),u.graph.onEngineStop(()=>{u.graph.zoomToFit(400,95),u.graph.onEngineStop(()=>{})})}return{fit:()=>u.graph.zoomToFit(400,95),zoom:l=>u.graph.zoom(u.graph.zoom()*l,250)}}export{x1 as renderConversationGraph}; /*! Bundled license information: lodash-es/lodash.js: diff --git a/public/conversation-view.js b/public/conversation-view.js index 4bbdb61..d6ad81e 100644 --- a/public/conversation-view.js +++ b/public/conversation-view.js @@ -2,8 +2,23 @@ export function threadPeople(thread) { return thread?.participants ?? thread?.me export function visibleThreads(threads, perspective = 'all') { return perspective === 'all' ? threads : threads.filter(thread => threadPeople(thread).some(person => person.id === perspective)); } -export function conversationGraph(threads, perspective = 'all') { - const conversations = visibleThreads(threads, perspective); +export function isDisabled(person) { return person?.active === 0 || person?.active === false; } +export function conversationGraph(threads, perspective = 'all', {principals = [], showDisabled = false} = {}) { + // Thread summaries omit active state. Join only their existing members with + // the current directory; never introduce people outside authorized threads. + const directory = new Map(principals.map(person => [person.id, person])); + const projected = threads.flatMap(thread => { + const members = threadPeople(thread); + const people = members.map(person => { + const active = directory.get(person.id)?.active; + return active === undefined ? person : {...person, active}; + }).filter(person => showDisabled || !isDisabled(person)); + // A hidden endpoint removes a direct edge, not the history behind it. + // Groups retain their enabled members without dangling links or empty hubs. + if (!people.length || (thread.kind === 'direct' && people.length !== members.length)) return []; + return [{...thread, ...('participants' in thread ? {participants: people} : {members: people})}]; + }); + const conversations = visibleThreads(projected, perspective); const people = new Map(); for (const thread of conversations) for (const person of threadPeople(thread)) people.set(person.id, person); return { people: [...people.values()], conversations }; diff --git a/public/index.html b/public/index.html index dc912ef..d688ec4 100644 --- a/public/index.html +++ b/public/index.html @@ -129,7 +129,16 @@

Join this instance as an Agent

-

Choose an agent to see its conversations. Choose a connection or group to open the chat.

↔ Direct chat◉ Group chat · connected members

Graph visualization: Force Graph · MIT licenses

+
+ + +

Choose an agent to see its conversations. Choose a connection or group to open the chat.

+
↔ Direct chat◉ Group chat · connected members
+

Hidden contacts remain in chat history.

+
+
+

Graph visualization: Force Graph · MIT licenses

+
diff --git a/public/profile-locales.js b/public/profile-locales.js index deb02e8..7dcf214 100644 --- a/public/profile-locales.js +++ b/public/profile-locales.js @@ -2,6 +2,8 @@ export const profileTranslations = { '工作区导航':'Workspace navigation','对话':'Conversations','通讯录':'Contacts','你的工作区':'YOUR WORKSPACE','成员与 Agent':'People & agents', '{0} 条消息':'{0} messages','已发送 {0} 条':'{0} sent','{0} 个对话 · 已发送 {1} 条':'{0} conversations · {1} sent','关闭详情':'Close details', + '隐藏的联系人仍保留在历史聊天中。':'Hidden contacts remain in chat history.', + '当前视图没有匹配的对话。':'No conversations match this view.', '适应画布':'Fit view','放大':'Zoom in','缩小':'Zoom out','上传图标':'Upload icon','Agent 图标':'Agent icon','首字母':'Initial', '原创预设图标,也可以上传自己的图片。':'Original preset icons. You can upload your own image.', '图标预览':'Icon preview', diff --git a/public/src/conversation-graph.mjs b/public/src/conversation-graph.mjs index 277a856..ec2024d 100644 --- a/public/src/conversation-graph.mjs +++ b/public/src/conversation-graph.mjs @@ -1,38 +1,41 @@ import ForceGraph from 'force-graph'; import {forceCollide} from 'd3-force-3d'; -import {conversationGraph,threadPeople} from '../conversation-view.js'; +import {isDisabled,threadPeople} from '../conversation-view.js'; const instances=new WeakMap(); -export function renderConversationGraph(container,threads,{openThread,chooseAgent,t,icon}){ - const data=conversationGraph(threads), signature=JSON.stringify(data); +export function renderConversationGraph(container,data,{openThread,chooseAgent,t,icon}){ + const signature=JSON.stringify(data); const sentCount=id=>data.conversations.reduce((sum,thread)=>sum+Number(threadPeople(thread).find(p=>p.id===id)?.sent_count??0),0); let entry=instances.get(container); if(!entry){ container.replaceChildren(); const graph=new ForceGraph(container).backgroundColor('#101726').nodeId('id').nodeRelSize(28) .nodeCanvasObject((node,ctx,scale)=>{ - const radius=node.group?30:25; + const radius=node.group?30:25,disabled=!node.group&&isDisabled(node.person); ctx.save();ctx.translate(node.x,node.y); - ctx.shadowColor=node.group?'#a78bfa':'#53d9c7';ctx.shadowBlur=12; - ctx.fillStyle=node.group?'#302a49':'#26374c';ctx.beginPath();ctx.arc(0,0,radius+4,0,Math.PI*2);ctx.fill();ctx.shadowBlur=0;if(entry.selectedId===node.id){ctx.strokeStyle='#a6fff0';ctx.lineWidth=3;ctx.stroke();} + ctx.shadowColor=node.group?'#a78bfa':'#53d9c7';ctx.shadowBlur=disabled?0:12; + ctx.fillStyle=disabled?'#383c44':node.group?'#302a49':'#26374c';ctx.beginPath();ctx.arc(0,0,radius+4,0,Math.PI*2);ctx.fill();ctx.shadowBlur=0;if(entry.selectedId===node.id){ctx.strokeStyle=disabled?'#adb3bd':'#a6fff0';ctx.lineWidth=3;ctx.stroke();} const people=node.group?node.people.slice(0,3):[node.person]; people.forEach((person,i)=>{ const image=entry.images.get(person.id),r=node.group?12:23; const x=node.group?(i===0?0:i===1?-13:13):0,y=node.group?(i===0?-10:10):0; - ctx.save();ctx.beginPath();ctx.arc(x,y,r,0,Math.PI*2);ctx.clip();ctx.fillStyle='#526b8b';ctx.fillRect(x-r,y-r,r*2,r*2); + ctx.save();ctx.beginPath();ctx.arc(x,y,r,0,Math.PI*2);ctx.clip(); + if(isDisabled(person)){ctx.filter='grayscale(1)';ctx.globalAlpha=.65;} + ctx.fillStyle=isDisabled(person)?'#676c76':'#526b8b';ctx.fillRect(x-r,y-r,r*2,r*2); if(image?.complete&&image.naturalWidth)ctx.drawImage(image,x-r,y-r,r*2,r*2); else{ctx.fillStyle='white';ctx.font=`bold ${r}px system-ui`;ctx.textAlign='center';ctx.textBaseline='middle';ctx.fillText(person.name.slice(0,1).toUpperCase(),x,y);}ctx.restore(); }); - ctx.fillStyle='#eff5ff';ctx.textAlign='center';ctx.font=`600 ${Math.max(12,13/scale)}px system-ui`;ctx.fillText(node.name,0,radius+23); - ctx.fillStyle='#93a5bf';ctx.font=`${Math.max(10,11/scale)}px system-ui`;ctx.fillText(node.group?t('{0} messages',node.count):t('{0} sent',node.count),0,radius+40);ctx.restore(); + ctx.fillStyle=disabled?'#adb3bd':'#eff5ff';ctx.textAlign='center';ctx.font=`600 ${Math.max(12,13/scale)}px system-ui`;ctx.fillText(node.name,0,radius+23); + const count=node.group?t('{0} messages',node.count):t('{0} sent',node.count); + ctx.fillStyle=disabled?'#adb3bd':'#93a5bf';ctx.font=`${Math.max(10,11/scale)}px system-ui`;ctx.fillText(disabled?`${t('Disabled')} · ${count}`:count,0,radius+40);ctx.restore(); }).nodePointerAreaPaint((node,color,ctx,scale)=>{ctx.fillStyle=color;ctx.beginPath();ctx.arc(node.x,node.y,node.group?34:29,0,Math.PI*2);ctx.fill();ctx.font=`600 ${Math.max(12,13/scale)}px system-ui`;const width=Math.max(80,ctx.measureText(node.name).width+20);ctx.fillRect(node.x-width/2,node.y+25,width,55);}) - .linkColor(link=>link.group?'#9f8bd3':'#5b9cab').linkWidth(2).linkCurvature(0).linkHoverPrecision(12) + .linkColor(link=>link.disabled?'#7a808b':link.group?'#9f8bd3':'#5b9cab').linkWidth(2).linkCurvature(0).linkHoverPrecision(12) .linkCanvasObjectMode(()=> 'after').linkCanvasObject((link,ctx,scale)=>{ - if(link.group)return;const x=(link.source.x+link.target.x)/2,y=(link.source.y+link.target.y)/2;const text=t('{0} messages',link.count);ctx.save();ctx.font=`600 ${12/scale}px system-ui`;const width=ctx.measureText(text).width+18/scale,height=24/scale;ctx.fillStyle='#213849';ctx.strokeStyle='#5b9cab';ctx.lineWidth=1/scale;ctx.beginPath();ctx.roundRect(x-width/2,y-height/2,width,height,6/scale);ctx.fill();ctx.stroke();ctx.textAlign='center';ctx.textBaseline='middle';ctx.fillStyle='#d9f9f3';ctx.fillText(text,x,y);ctx.restore(); + if(link.group)return;const x=(link.source.x+link.target.x)/2,y=(link.source.y+link.target.y)/2;const text=t('{0} messages',link.count);ctx.save();ctx.font=`600 ${12/scale}px system-ui`;const width=ctx.measureText(text).width+18/scale,height=24/scale;ctx.fillStyle=link.disabled?'#30343c':'#213849';ctx.strokeStyle=link.disabled?'#7a808b':'#5b9cab';ctx.lineWidth=1/scale;ctx.beginPath();ctx.roundRect(x-width/2,y-height/2,width,height,6/scale);ctx.fill();ctx.stroke();ctx.textAlign='center';ctx.textBaseline='middle';ctx.fillStyle=link.disabled?'#c4c8d0':'#d9f9f3';ctx.fillText(text,x,y);ctx.restore(); }).linkPointerAreaPaint((link,color,ctx,scale)=>{ ctx.strokeStyle=color;ctx.lineWidth=18/scale;ctx.beginPath();ctx.moveTo(link.source.x,link.source.y);ctx.lineTo(link.target.x,link.target.y);ctx.stroke();if(!link.group){ctx.font=`600 ${12/scale}px system-ui`;const width=ctx.measureText(t('{0} messages',link.count)).width+22/scale;ctx.fillStyle=color;ctx.fillRect((link.source.x+link.target.x)/2-width/2,(link.source.y+link.target.y)/2-15/scale,width,30/scale);} }) - .linkLineDash(link=>link.group?[5,4]:null).linkLabel(link=>{const label=document.createElement('span');label.textContent=link.name;return label;}) - .nodeLabel(node=>{const label=document.createElement('span');label.textContent=node.name;return label;}) + .linkLineDash(link=>link.group||link.disabled?[5,4]:null).linkLabel(link=>{const label=document.createElement('span');label.textContent=link.name;return label;}) + .nodeLabel(node=>{const label=document.createElement('span');label.textContent=node.name+(!node.group&&isDisabled(node.person)?` · ${t('Disabled')}`:'');return label;}) .onNodeHover(node=>{container.style.cursor=node?'pointer':'grab';}).onLinkHover(link=>{container.style.cursor=link?'pointer':'grab';}); entry={graph,images:new Map(),signature:null,visible:false,fitTicks:0,callbacks:{openThread,chooseAgent}};instances.set(container,entry); const resize=()=>{if(container.clientWidth){graph.width(container.clientWidth).height(Math.max(440,Math.min(600,innerHeight-300)));graph.resumeAnimation();if(!entry.visible){entry.fitTicks=15;graph.d3ReheatSimulation();}entry.visible=true;}else{graph.pauseAnimation();entry.visible=false;}}; @@ -66,8 +69,9 @@ export function renderConversationGraph(container,threads,{openThread,chooseAgen entry.signature=signature;entry.fitTicks=15; const nodes=data.people.map(person=>({id:person.id,name:person.name,person,count:sentCount(person.id)})),links=[]; for(const person of data.people){const src=icon(person);if(src){const image=new Image();image.src=src;entry.images.set(person.id,image);}else entry.images.delete(person.id);} - for(const thread of data.conversations){const people=threadPeople(thread);if(thread.kind==='direct'&&people.length===2)links.push({source:people[0].id,target:people[1].id,thread:thread.id,count:Number(thread.message_count??0),name:people.map(p=>p.name).join(' ↔ ')}); - else{const id='group:'+thread.id;nodes.push({id,name:thread.title||t('Group chat'),group:true,people,thread:thread.id,count:Number(thread.message_count??0)});for(const person of people)links.push({source:person.id,target:id,group:true,name:thread.title,thread:thread.id});}} + for(const thread of data.conversations){const people=threadPeople(thread);if(thread.kind==='direct'&&people.length===2)links.push({source:people[0].id,target:people[1].id,disabled:people.some(isDisabled),thread:thread.id,count:Number(thread.message_count??0),name:people.map(p=>p.name).join(' ↔ ')}); + else{const id='group:'+thread.id;nodes.push({id,name:thread.title||t('Group chat'),group:true,people,thread:thread.id,count:Number(thread.message_count??0)});for(const person of people)links.push({source:person.id,target:id,disabled:isDisabled(person),group:true,name:thread.title,thread:thread.id});}} + if(!nodes.some(node=>node.id===entry.selectedId))entry.selectedId=null; entry.graph.graphData({nodes,links});entry.graph.onEngineStop(()=>{entry.graph.zoomToFit(400,95);entry.graph.onEngineStop(()=>{});}); } return{fit:()=>entry.graph.zoomToFit(400,95),zoom:factor=>entry.graph.zoom(entry.graph.zoom()*factor,250)}; diff --git a/public/style.css b/public/style.css index 211b86d..00d3c61 100644 --- a/public/style.css +++ b/public/style.css @@ -342,6 +342,10 @@ dialog form>p{color:var(--muted);font-size:12px;line-height:1.8;margin-top:10px} .conversation-map .page-header{margin:0 0 18px} .graph-controls{display:flex;gap:8px;flex-wrap:wrap} .graph-legend{display:flex;gap:22px;flex-wrap:wrap;font-size:12px;color:var(--muted);margin:16px 0} +.graph-filter{display:flex;align-items:center;gap:8px;margin:0;font-weight:400} +.graph-filter-hint{margin-bottom:12px} +.graph-empty{position:absolute;inset:0;display:grid;place-items:center;padding:32px;text-align:center;color:var(--muted);pointer-events:none} +.disabled-avatar{filter:grayscale(1);opacity:.65} .graph-stage{position:relative} #conversation-graph{position:relative;min-height:440px;background:#101726;border:1px solid #3c4658;border-radius:8px;overflow:hidden} #conversation-graph canvas{display:block;touch-action:none} diff --git a/tests/conversation-view.test.mjs b/tests/conversation-view.test.mjs index 2d77609..089c984 100644 --- a/tests/conversation-view.test.mjs +++ b/tests/conversation-view.test.mjs @@ -1,6 +1,6 @@ import test from 'node:test'; import assert from 'node:assert/strict'; -import {visibleThreads, conversationGraph} from '../public/conversation-view.js'; +import {threadPeople, visibleThreads, conversationGraph} from '../public/conversation-view.js'; import {chatName, messageDirection} from '../public/chat-presentation.js'; const dots={id:'dots',name:'Dots',kind:'agent'},muse={id:'muse',name:'Muse',kind:'agent'},other={id:'other',name:'Other',kind:'agent'}; const direct={id:'dm',kind:'direct',participants:[dots,muse]},group={id:'group',title:'Project',kind:'group',participants:[muse,other]}; @@ -18,3 +18,43 @@ test('Graph is derived from authorized conversation membership and respects pers assert.deepEqual(conversationGraph([direct,group]).people.map(p=>p.id),['dots','muse','other']); assert.deepEqual(conversationGraph([]),{people:[],conversations:[]}); }); +test('disabled contacts and direct edges are hidden by default while mixed groups and history survive',()=>{ + const disabled={...other,active:0,sent_count:4},enabled={...muse,active:1,sent_count:3}; + const history=[ + {id:'disabled-dm',kind:'direct',participants:[enabled,disabled],message_count:7}, + {id:'mixed-group',kind:'group',title:'History',participants:[enabled,disabled,dots],message_count:12}, + {id:'disabled-group',kind:'group',participants:[disabled],message_count:4} + ]; + const before=structuredClone(history),graph=conversationGraph(history); + assert.deepEqual(graph.people.map(p=>p.id),['muse','dots']); + assert.deepEqual(graph.conversations.map(t=>t.id),['mixed-group']); + assert.deepEqual(threadPeople(graph.conversations[0]).map(p=>p.id),['muse','dots']); + assert.equal(graph.conversations[0].message_count,12,'group counts describe retained history'); + assert.equal(graph.people[0].sent_count,3); + const all=conversationGraph(history,'all',{showDisabled:true}); + assert.deepEqual(all.conversations,history); + assert.equal(all.people.find(p=>p.id==='other').active,0,'renderer receives the disabled state'); + assert.deepEqual(history,before,'filtering must not mutate chat history'); + assert.deepEqual(visibleThreads(history,'other'),history,'normal chat access is unaffected'); +}); +test('latest directory status overrides missing or stale membership status without adding unrelated contacts',()=>{ + const history=[{...direct,participants:[{...dots,active:1},muse]}]; + const principals=[{...dots,active:0},{...muse,active:1},{...other,active:1}]; + assert.deepEqual(conversationGraph(history,'all',{principals}),{people:[],conversations:[]}); + const shown=conversationGraph(history,'all',{principals,showDisabled:true}); + assert.deepEqual(shown.people.map(p=>[p.id,p.active]),[['dots',0],['muse',1]]); + const enabledAgain=principals.map(p=>({...p,active:1})); + assert.deepEqual(conversationGraph(history,'all',{principals:enabledAgain}).people.map(p=>p.id),['dots','muse']); + assert.equal(history[0].participants[0].active,1,'directory join is a projection'); +}); +test('disabled perspectives and legacy member lists respect the filter without orphan groups',()=>{ + const disabled={...other,active:false}; + const history=[{id:'legacy',kind:'group',members:[dots,disabled]}, {id:'empty',kind:'group',members:[]}]; + assert.deepEqual(conversationGraph(history,'other'),{people:[],conversations:[]}); + assert.deepEqual(conversationGraph(history,'other',{showDisabled:true}).people.map(p=>p.id),['dots','other']); + const graph=conversationGraph(history,'dots'); + assert.deepEqual(graph.people,[dots]); + assert.deepEqual(graph.conversations[0].members,[dots]); + assert.equal(history[0].members.length,2); + assert.deepEqual(conversationGraph(history,'unrelated',{showDisabled:true}),{people:[],conversations:[]}); +});