From 318b8495b72209b2073976098743f249fdf25802 Mon Sep 17 00:00:00 2001 From: mattieserver <3049868+mattieserver@users.noreply.github.com> Date: Thu, 1 Sep 2022 18:44:03 +0200 Subject: [PATCH] Netbox v3.3 Support (#145) * init * added circuit (or at least part of) * refactor circuits + fix js * small changes * small changes * added power + rework settings * small changes --- README.md | 6 +- netbox_topology_views/__init__.py | 5 +- netbox_topology_views/api/views.py | 16 +- netbox_topology_views/forms.py | 26 +- .../netbox_topology_views/img/circuit.png | Bin 0 -> 28633 bytes .../netbox_topology_views/img/power-feed.png | Bin 0 -> 15857 bytes .../netbox_topology_views/img/power-panel.png | Bin 0 -> 18685 bytes .../img/provider-networks.png | Bin 0 -> 34335 bytes .../static/netbox_topology_views/js/app.js | 2 +- netbox_topology_views/static_dev/js/home.js | 26 +- netbox_topology_views/views.py | 446 ++++++++++-------- 11 files changed, 296 insertions(+), 231 deletions(-) create mode 100644 netbox_topology_views/static/netbox_topology_views/img/circuit.png create mode 100644 netbox_topology_views/static/netbox_topology_views/img/power-feed.png create mode 100644 netbox_topology_views/static/netbox_topology_views/img/power-panel.png create mode 100644 netbox_topology_views/static/netbox_topology_views/img/provider-networks.png diff --git a/README.md b/README.md index 1598046..a610540 100644 --- a/README.md +++ b/README.md @@ -45,7 +45,7 @@ Then run `python3 manage.py collectstatic --no-input` There is also support for custom fields. -If you create a custom field "coordinates" for "dcim > device" with type "text" and name "coordinates" you will see the same layout every time. +If you create a custom field "coordinates" for "dcim > device" and "Circuits > circuit" with type "text" and name "coordinates" you will see the same layout every time. The coordinates can then be provided as: "X;Y" @@ -67,12 +67,10 @@ PLUGINS_CONFIG = { | ------------- |-------------| -----| | device_img |['access-switch', 'core-switch', 'firewall', 'router', 'distribution-switch', 'backup', 'storage,wan-network', 'wireless-ap', 'server', 'internal-switch', 'isp-cpe-material', 'non-racked-devices', 'power-units'] | The slug of the device roles that you have a image for. | | preselected_device_roles | ['Firewall', 'Router', 'Distribution Switch', 'Core Switch', 'Internal Switch', 'Access Switch', 'Server', 'Storage', 'Backup', 'Wireless AP'] | The full name of the device roles you want to pre select in the global view. Note that this is case sensitive| -| preselected_intermediate_dev_roles | ['Patch-panel'] | The full name of the device roles you want to display in the global view when using end-to-end connections mode. Note that this is case sensitive| | allow_coordinates_saving | False | (bool) Set to true if you use the custom coordinates fields and want to save the coordinates | | always_save_coordinates | False | (bool) Set if you want to enable the option to save coordinates by default | -| ignore_cable_type | ['power outlet', 'power port'] | The cable types that you want to ignore in the views | +| ignore_cable_type | [] | The cable types that you want to ignore in the views | | preselected_tags | '[]' | The name of tags you want to preload | -| enable_circuit_terminations | False | (bool) Set to true if you want to see circuit terminations in the topology | | draw_default_layout | False | (bool) Set to True if you want to load draw the topology on the initial load (when you go to the topology plugin page) | ### Custom Images diff --git a/netbox_topology_views/__init__.py b/netbox_topology_views/__init__.py index fd2a67d..79cdee4 100644 --- a/netbox_topology_views/__init__.py +++ b/netbox_topology_views/__init__.py @@ -11,14 +11,11 @@ class TopologyViewsConfig(PluginConfig): required_settings = [] default_settings = { 'preselected_device_roles': ['Firewall', 'Router', 'Distribution Switch', 'Core Switch', 'Internal Switch', 'Access Switch', 'Server', 'Storage', 'Backup', 'Wireless AP'], - 'preselected_intermediate_dev_roles' : [], - 'end2end_connections': False, - 'ignore_cable_type': ['power outlet','power port'], + 'ignore_cable_type': [], 'device_img': ['access-switch', 'core-switch', 'firewall', 'router', 'distribution-switch', 'backup', 'storage', 'wan-network', 'wireless-ap', 'server', 'internal-switch', 'isp-cpe-material', 'non-racked-devices', 'power-units'], 'allow_coordinates_saving': False, 'always_save_coordinates': False, 'preselected_tags' : [], - 'enable_circuit_terminations': False, 'draw_default_layout': False } diff --git a/netbox_topology_views/api/views.py b/netbox_topology_views/api/views.py index 35fe7de..14217ed 100644 --- a/netbox_topology_views/api/views.py +++ b/netbox_topology_views/api/views.py @@ -7,7 +7,7 @@ from rest_framework.routers import APIRootView from .serializers import TopologyDummySerializer from django.conf import settings -from dcim.models import DeviceRole, Device, Cable +from dcim.models import DeviceRole, Device, Cable , PowerPanel, PowerFeed from circuits.models import Circuit from extras.models import Tag @@ -37,8 +37,18 @@ class SaveCoordsViewSet(ReadOnlyModelViewSet): if "y" in request.data: if request.data["y"]: y_coord = request.data["y"] - - actual_device= Device.objects.get(id=device_id) + + if device_id.startswith("c"): + device_id = device_id.lstrip('c') + actual_device= Circuit.objects.get(id=device_id) + elif device_id.startswith("p"): + device_id = device_id.lstrip('p') + actual_device= PowerPanel.objects.get(id=device_id) + elif device_id.startswith("f"): + device_id = device_id.lstrip('f') + actual_device= PowerFeed.objects.get(id=device_id) + else: + actual_device= Device.objects.get(id=device_id) if "coordinates" in actual_device.custom_field_data: actual_device.custom_field_data["coordinates"] = "%s;%s" % (x_coord,y_coord) diff --git a/netbox_topology_views/forms.py b/netbox_topology_views/forms.py index 5982912..144d041 100644 --- a/netbox_topology_views/forms.py +++ b/netbox_topology_views/forms.py @@ -16,16 +16,15 @@ from netbox.forms import NetBoxModelFilterSetForm from utilities.forms import (TagFilterField, DynamicModelMultipleChoiceField, MultipleChoiceField) allow_coordinates_saving = bool(settings.PLUGINS_CONFIG["netbox_topology_views"]["allow_coordinates_saving"]) -end2end = settings.PLUGINS_CONFIG["netbox_topology_views"]["end2end_connections"] class DeviceFilterForm(TenancyFilterForm, NetBoxModelFilterSetForm): model = Device fieldsets = ( - (None, ('q', 'hide_unconnected', 'save_coords', 'end2end_connections')), + (None, ('q', 'hide_unconnected', 'save_coords', 'show_circuit', 'show_power' ,)), (None, ('tenant_group_id', 'tenant_id')), (None, ('region_id', 'site_id', 'location_id')), - (None, ('device_role_id', 'intermediate_dev_role_id')), + (None, ('device_role_id', )), (None, ('tag', 'status')), ) @@ -39,17 +38,6 @@ class DeviceFilterForm(TenancyFilterForm, NetBoxModelFilterSetForm): required=False, label=_('Device Role') ) - end2end_connections = forms.BooleanField( - label=_("Display end-to-end connections"), - required=False, - initial=end2end - ) - intermediate_dev_role_id = DynamicModelMultipleChoiceField( - queryset=DeviceRole.objects.all(), - required=False, - label=_('Intermediate Devices Role'), - help_text='Intermediate devices to display when using end-to-end connections mode, even if they do not match the query' - ) site_id = DynamicModelMultipleChoiceField( queryset=Site.objects.all(), required=False, @@ -72,6 +60,16 @@ class DeviceFilterForm(TenancyFilterForm, NetBoxModelFilterSetForm): required=False, initial=False ) + show_circuit = forms.BooleanField( + label=_("Show Circuit Terminations"), + required=False, + initial=False + ) + show_power = forms.BooleanField( + label=_("Show Power panel/feed"), + required=False, + initial=False + ) save_coords = forms.BooleanField( label=_("Save Coordinates"), required=False, diff --git a/netbox_topology_views/static/netbox_topology_views/img/circuit.png b/netbox_topology_views/static/netbox_topology_views/img/circuit.png new file mode 100644 index 0000000000000000000000000000000000000000..b6d925fc35faed254cb914251c003450fcb5a985 GIT binary patch literal 28633 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�(HBXtm#@cH3$>w1n`Dd6l}xT=}FCYpDmi%<>x!qJyHB%%6$R5%x;!vF$# zZ;0eQU^cRPy_
    $m`;6>5$`F5o#6I60Qv>mio`ZQHdh_D{On^EB4^ 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
    gm0 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 RJpzG$XkDX=#X5Em{~x6x{tW;C literal 0 HcmV?d00001 diff --git a/netbox_topology_views/static/netbox_topology_views/img/power-panel.png b/netbox_topology_views/static/netbox_topology_views/img/power-panel.png new file mode 100644 index 0000000000000000000000000000000000000000..26566568c3352ba0f73c1a4128f0b4dedf7b9ec3 GIT binary patch literal 18685 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 literal 0 HcmV?d00001 diff --git a/netbox_topology_views/static/netbox_topology_views/img/provider-networks.png b/netbox_topology_views/static/netbox_topology_views/img/provider-networks.png new file mode 100644 index 0000000000000000000000000000000000000000..271add73936798c24151e7a72ea5c6411a4b2a65 GIT binary patch literal 34335 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 literal 0 HcmV?d00001 diff --git a/netbox_topology_views/static/netbox_topology_views/js/app.js b/netbox_topology_views/static/netbox_topology_views/js/app.js index 25c4ab1..9880387 100644 --- a/netbox_topology_views/static/netbox_topology_views/js/app.js +++ b/netbox_topology_views/static/netbox_topology_views/js/app.js @@ -20,7 +20,7 @@ `,Z()):M+=z,Z();if(z!='"')throw ie('End of string " expected');Z(),oe=te.IDENTIFIER;return}for(oe=te.UNKNOWN;z!="";)M+=z,Z();throw new SyntaxError('Syntax error in part "'+wo(M,30)+'"')}function ua(){var n={};if(ha(),V(),M==="strict"&&(n.strict=!0,V()),(M==="graph"||M==="digraph")&&(n.type=M,V()),oe===te.IDENTIFIER&&(n.id=M,V()),M!="{")throw ie("Angle bracket { expected");if(V(),yo(n),M!="}")throw ie("Angle bracket } expected");if(V(),M!=="")throw ie("End of file expected");return V(),delete n.node,delete n.edge,delete n.graph,n}function yo(n){for(;M!==""&&M!="}";)fa(n),M===";"&&V()}function fa(n){var e=bo(n);if(e){vo(n,e);return}var t=pa(n);if(!t){if(oe!=te.IDENTIFIER)throw ie("Identifier expected");var i=M;if(V(),M==="="){if(V(),oe!=te.IDENTIFIER)throw ie("Identifier expected");n[i]=M,V()}else ga(n,i)}}function bo(n){var e=null;if(M==="subgraph"&&(e={},e.type="subgraph",V(),oe===te.IDENTIFIER&&(e.id=M,V())),M==="{"){if(V(),e||(e={}),e.parent=n,e.node=n.node,e.edge=n.edge,e.graph=n.graph,yo(e),M!="}")throw ie("Angle bracket } expected");V(),delete e.node,delete e.edge,delete e.graph,delete e.parent,n.subgraphs||(n.subgraphs=[]),n.subgraphs.push(e)}return e}function pa(n){return M==="node"?(V(),n.node=_t(),"node"):M==="edge"?(V(),n.edge=_t(),"edge"):M==="graph"?(V(),n.graph=_t(),"graph"):null}function ga(n,e){var t={id:e},i=_t();i&&(t.attr=i),go(n,t),vo(n,e)}function vo(n,e){for(;M==="->"||M==="--";){var t,i=M;V();var s=bo(n);if(s)t=s;else{if(oe!=te.IDENTIFIER)throw ie("Identifier or subgraph expected");t=M,go(n,{id:t}),V()}var o=_t(),r=mo(n,e,t,i,o);ca(n,r),e=t}}function _t(){for(var n,e=null,t={dashed:!0,solid:!1,dotted:[1,5]},i={dot:"circle",box:"box",crow:"crow",curve:"curve",icurve:"inv_curve",normal:"triangle",inv:"inv_triangle",diamond:"diamond",tee:"bar",vee:"vee"},s=new Array,o=new Array;M==="[";){for(V(),e={};M!==""&&M!="]";){if(oe!=te.IDENTIFIER)throw ie("Attribute name expected");var r=M;if(V(),M!="=")throw ie("Equal sign = expected");if(V(),oe!=te.IDENTIFIER)throw ie("Attribute value expected");var a=M;r==="style"&&(a=t[a]);var d;r==="arrowhead"&&(d=i[a],r="arrows",a={to:{enabled:!0,type:d}}),r==="arrowtail"&&(d=i[a],r="arrows",a={from:{enabled:!0,type:d}}),s.push({attr:e,name:r,value:a}),o.push(r),V(),M==","&&V()}if(M!="]")throw ie("Bracket ] expected");V()}if(o.includes("dir")){var h={};for(h.arrows={},n=0;n"&&(o.arrows="to"),o};e.edges.forEach(function(s){var o,r;s.from instanceof Object?o=s.from.nodes:o={id:s.from},s.to instanceof Object?r=s.to.nodes:r={id:s.to},s.from instanceof Object&&s.from.edges&&s.from.edges.forEach(function(a){var d=i(a);t.edges.push(d)}),ma(o,r,function(a,d){var h=mo(t,a.id,d.id,s.type,s.attr),l=i(h);t.edges.push(l)}),s.to instanceof Object&&s.to.edges&&s.to.edges.forEach(function(a){var d=i(a);t.edges.push(d)})})}return e.attr&&(t.options=e.attr),t}function ba(n,e){let t={edges:{inheritColor:!1},nodes:{fixed:!1,parseColor:!1}};e!=null&&(e.fixed!=null&&(t.nodes.fixed=e.fixed),e.parseColor!=null&&(t.nodes.parseColor=e.parseColor),e.inheritColor!=null&&(t.edges.inheritColor=e.inheritColor));let s=n.edges.map(r=>{let a={from:r.source,id:r.id,to:r.target};return r.attributes!=null&&(a.attributes=r.attributes),r.label!=null&&(a.label=r.label),r.attributes!=null&&r.attributes.title!=null&&(a.title=r.attributes.title),r.type==="Directed"&&(a.arrows="to"),r.color&&t.edges.inheritColor===!1&&(a.color=r.color),a});return{nodes:n.nodes.map(r=>{let a={id:r.id,fixed:t.nodes.fixed&&r.x!=null&&r.y!=null};return r.attributes!=null&&(a.attributes=r.attributes),r.label!=null&&(a.label=r.label),r.size!=null&&(a.size=r.size),r.attributes!=null&&r.attributes.title!=null&&(a.title=r.attributes.title),r.title!=null&&(a.title=r.title),r.x!=null&&(a.x=r.x),r.y!=null&&(a.y=r.y),r.color!=null&&(t.nodes.parseColor===!0?a.color=r.color:a.color={background:r.color,border:r.color,highlight:{background:r.color,border:r.color},hover:{background:r.color,border:r.color}}),a}),edges:s}}var va={addDescription:"Click in an empty space to place a new node.",addEdge:"Add Edge",addNode:"Add Node",back:"Back",close:"Close",createEdgeError:"Cannot link edges to a cluster.",del:"Delete selected",deleteClusterError:"Clusters cannot be deleted.",edgeDescription:"Click on a node and drag the edge to another node to connect them.",edit:"Edit",editClusterError:"Clusters cannot be edited.",editEdge:"Edit Edge",editEdgeDescription:"Click on the control points and drag them to a node to connect to it.",editNode:"Edit Node"},wa={addDescription:"Klicke auf eine freie Stelle, um einen neuen Knoten zu plazieren.",addEdge:"Kante hinzuf\xFCgen",addNode:"Knoten hinzuf\xFCgen",back:"Zur\xFCck",close:"Schlie\xDFen",createEdgeError:"Es ist nicht m\xF6glich, Kanten mit Clustern zu verbinden.",del:"L\xF6sche Auswahl",deleteClusterError:"Cluster k\xF6nnen nicht gel\xF6scht werden.",edgeDescription:"Klicke auf einen Knoten und ziehe die Kante zu einem anderen Knoten, um diese zu verbinden.",edit:"Editieren",editClusterError:"Cluster k\xF6nnen nicht editiert werden.",editEdge:"Kante editieren",editEdgeDescription:"Klicke auf die Verbindungspunkte und ziehe diese auf einen Knoten, um sie zu verbinden.",editNode:"Knoten editieren"},_a={addDescription:"Haga clic en un lugar vac\xEDo para colocar un nuevo nodo.",addEdge:"A\xF1adir arista",addNode:"A\xF1adir nodo",back:"Atr\xE1s",close:"Cerrar",createEdgeError:"No se puede conectar una arista a un grupo.",del:"Eliminar selecci\xF3n",deleteClusterError:"No es posible eliminar grupos.",edgeDescription:"Haga clic en un nodo y arrastre la arista hacia otro nodo para conectarlos.",edit:"Editar",editClusterError:"No es posible editar grupos.",editEdge:"Editar arista",editEdgeDescription:"Haga clic en un punto de control y arrastrelo a un nodo para conectarlo.",editNode:"Editar nodo"},Ea={addDescription:"Clicca per aggiungere un nuovo nodo",addEdge:"Aggiungi un vertice",addNode:"Aggiungi un nodo",back:"Indietro",close:"Chiudere",createEdgeError:"Non si possono collegare vertici ad un cluster",del:"Cancella la selezione",deleteClusterError:"I cluster non possono essere cancellati",edgeDescription:"Clicca su un nodo e trascinalo ad un altro nodo per connetterli.",edit:"Modifica",editClusterError:"I clusters non possono essere modificati.",editEdge:"Modifica il vertice",editEdgeDescription:"Clicca sui Punti di controllo e trascinali ad un nodo per connetterli.",editNode:"Modifica il nodo"},xa={addDescription:"Klik op een leeg gebied om een nieuwe node te maken.",addEdge:"Link toevoegen",addNode:"Node toevoegen",back:"Terug",close:"Sluiten",createEdgeError:"Kan geen link maken naar een cluster.",del:"Selectie verwijderen",deleteClusterError:"Clusters kunnen niet worden verwijderd.",edgeDescription:"Klik op een node en sleep de link naar een andere node om ze te verbinden.",edit:"Wijzigen",editClusterError:"Clusters kunnen niet worden aangepast.",editEdge:"Link wijzigen",editEdgeDescription:"Klik op de verbindingspunten en sleep ze naar een node om daarmee te verbinden.",editNode:"Node wijzigen"},Ca={addDescription:"Clique em um espa\xE7o em branco para adicionar um novo n\xF3",addEdge:"Adicionar aresta",addNode:"Adicionar n\xF3",back:"Voltar",close:"Fechar",createEdgeError:"N\xE3o foi poss\xEDvel linkar arestas a um cluster.",del:"Remover selecionado",deleteClusterError:"Clusters n\xE3o puderam ser removidos.",edgeDescription:"Clique em um n\xF3 e arraste a aresta at\xE9 outro n\xF3 para conect\xE1-los",edit:"Editar",editClusterError:"Clusters n\xE3o puderam ser editados.",editEdge:"Editar aresta",editEdgeDescription:"Clique nos pontos de controle e os arraste para um n\xF3 para conect\xE1-los",editNode:"Editar n\xF3"},Ta={addDescription:"\u041A\u043B\u0438\u043A\u043D\u0438\u0442\u0435 \u0432 \u0441\u0432\u043E\u0431\u043E\u0434\u043D\u043E\u0435 \u043C\u0435\u0441\u0442\u043E, \u0447\u0442\u043E\u0431\u044B \u0434\u043E\u0431\u0430\u0432\u0438\u0442\u044C \u043D\u043E\u0432\u044B\u0439 \u0443\u0437\u0435\u043B.",addEdge:"\u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C \u0440\u0435\u0431\u0440\u043E",addNode:"\u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C \u0443\u0437\u0435\u043B",back:"\u041D\u0430\u0437\u0430\u0434",close:"\u0417\u0430\u043A\u0440\u044B\u0432\u0430\u0442\u044C",createEdgeError:"\u041D\u0435\u0432\u043E\u0437\u043C\u043E\u0436\u043D\u043E \u0441\u043E\u0435\u0434\u0438\u043D\u0438\u0442\u044C \u0440\u0435\u0431\u0440\u0430 \u0432 \u043A\u043B\u0430\u0441\u0442\u0435\u0440.",del:"\u0423\u0434\u0430\u043B\u0438\u0442\u044C \u0432\u044B\u0431\u0440\u0430\u043D\u043D\u043E\u0435",deleteClusterError:"\u041A\u043B\u0430\u0441\u0442\u0435\u0440\u044B \u043D\u0435 \u043C\u043E\u0433\u0443\u0442 \u0431\u044B\u0442\u044C \u0443\u0434\u0430\u043B\u0435\u043D\u044B",edgeDescription:"\u041A\u043B\u0438\u043A\u043D\u0438\u0442\u0435 \u043D\u0430 \u0443\u0437\u0435\u043B \u0438 \u043F\u0440\u043E\u0442\u044F\u043D\u0438\u0442\u0435 \u0440\u0435\u0431\u0440\u043E \u043A \u0434\u0440\u0443\u0433\u043E\u043C\u0443 \u0443\u0437\u043B\u0443, \u0447\u0442\u043E\u0431\u044B \u0441\u043E\u0435\u0434\u0438\u043D\u0438\u0442\u044C \u0438\u0445.",edit:"\u0420\u0435\u0434\u0430\u043A\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C",editClusterError:"\u041A\u043B\u0430\u0441\u0442\u0435\u0440\u044B \u043D\u0435\u0434\u043E\u0441\u0442\u0443\u043F\u043D\u044B \u0434\u043B\u044F \u0440\u0435\u0434\u0430\u043A\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u044F.",editEdge:"\u0420\u0435\u0434\u0430\u043A\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0440\u0435\u0431\u0440\u043E",editEdgeDescription:"\u041A\u043B\u0438\u043A\u043D\u0438\u0442\u0435 \u043D\u0430 \u043A\u043E\u043D\u0442\u0440\u043E\u043B\u044C\u043D\u044B\u0435 \u0442\u043E\u0447\u043A\u0438 \u0438 \u043F\u0435\u0440\u0435\u0442\u0430\u0449\u0438\u0442\u0435 \u0438\u0445 \u0432 \u0443\u0437\u0435\u043B, \u0447\u0442\u043E\u0431\u044B \u043F\u043E\u0434\u043A\u043B\u044E\u0447\u0438\u0442\u044C\u0441\u044F \u043A \u043D\u0435\u043C\u0443.",editNode:"\u0420\u0435\u0434\u0430\u043A\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0443\u0437\u0435\u043B"},ka={addDescription:"\u5355\u51FB\u7A7A\u767D\u5904\u653E\u7F6E\u65B0\u8282\u70B9\u3002",addEdge:"\u6DFB\u52A0\u8FDE\u63A5\u7EBF",addNode:"\u6DFB\u52A0\u8282\u70B9",back:"\u8FD4\u56DE",close:"\u95DC\u9589",createEdgeError:"\u65E0\u6CD5\u5C06\u8FDE\u63A5\u7EBF\u8FDE\u63A5\u5230\u7FA4\u96C6\u3002",del:"\u5220\u9664\u9009\u5B9A",deleteClusterError:"\u65E0\u6CD5\u5220\u9664\u7FA4\u96C6\u3002",edgeDescription:"\u5355\u51FB\u67D0\u4E2A\u8282\u70B9\u5E76\u5C06\u8BE5\u8FDE\u63A5\u7EBF\u62D6\u52A8\u5230\u53E6\u4E00\u4E2A\u8282\u70B9\u4EE5\u8FDE\u63A5\u5B83\u4EEC\u3002",edit:"\u7F16\u8F91",editClusterError:"\u65E0\u6CD5\u7F16\u8F91\u7FA4\u96C6\u3002",editEdge:"\u7F16\u8F91\u8FDE\u63A5\u7EBF",editEdgeDescription:"\u5355\u51FB\u63A7\u5236\u8282\u70B9\u5E76\u5C06\u5B83\u4EEC\u62D6\u5230\u8282\u70B9\u4E0A\u8FDE\u63A5\u3002",editNode:"\u7F16\u8F91\u8282\u70B9"},Sa={addDescription:"K\u043B\u0456\u043A\u043D\u0456\u0442\u044C \u043D\u0430 \u0432\u0456\u043B\u044C\u043D\u0435 \u043C\u0456\u0441\u0446\u0435, \u0449\u043E\u0431 \u0434\u043E\u0434\u0430\u0442\u0438 \u043D\u043E\u0432\u0438\u0439 \u0432\u0443\u0437\u043E\u043B.",addEdge:"\u0414\u043E\u0434\u0430\u0442\u0438 \u043A\u0440\u0430\u0439",addNode:"\u0414\u043E\u0434\u0430\u0442\u0438 \u0432\u0443\u0437\u043E\u043B",back:"\u041D\u0430\u0437\u0430\u0434",close:"\u0417\u0430\u043A\u0440\u0438\u0442\u0438",createEdgeError:"\u041D\u0435 \u043C\u043E\u0436\u043B\u0438\u0432\u043E \u043E\u0431'\u0454\u0434\u043D\u0430\u0442\u0438 \u043A\u0440\u0430\u0457 \u0432 \u0433\u0440\u0443\u043F\u0443.",del:"\u0412\u0438\u0434\u0430\u043B\u0438\u0442\u0438 \u043E\u0431\u0440\u0430\u043D\u0435",deleteClusterError:"\u0413\u0440\u0443\u043F\u0438 \u043D\u0435 \u043C\u043E\u0436\u0443\u0442\u044C \u0431\u0443\u0442\u0438 \u0432\u0438\u0434\u0430\u043B\u0435\u043D\u0456.",edgeDescription:"\u041A\u043B\u0456\u043A\u043D\u0456\u0442\u044C \u043D\u0430 \u0432\u0443\u0437\u043E\u043B \u0456 \u043F\u0435\u0440\u0435\u0442\u044F\u0433\u043D\u0456\u0442\u044C \u043A\u0440\u0430\u0439 \u0434\u043E \u0456\u043D\u0448\u043E\u0433\u043E \u0432\u0443\u0437\u043B\u0430, \u0449\u043E\u0431 \u0457\u0445 \u0437'\u0454\u0434\u043D\u0430\u0442\u0438.",edit:"\u0420\u0435\u0434\u0430\u0433\u0443\u0432\u0430\u0442\u0438",editClusterError:"\u0413\u0440\u0443\u043F\u0438 \u043D\u0435\u0434\u043E\u0441\u0442\u0443\u043F\u043D\u0456 \u0434\u043B\u044F \u0440\u0435\u0434\u0430\u0433\u0443\u0432\u0430\u043D\u043D\u044F.",editEdge:"\u0420\u0435\u0434\u0430\u0433\u0443\u0432\u0430\u0442\u0438 \u043A\u0440\u0430\u0439",editEdgeDescription:"\u041A\u043B\u0456\u043A\u043D\u0456\u0442\u044C \u043D\u0430 \u043A\u043E\u043D\u0442\u0440\u043E\u043B\u044C\u043D\u0456 \u0442\u043E\u0447\u043A\u0438 \u0456 \u043F\u0435\u0440\u0435\u0442\u044F\u0433\u043D\u0456\u0442\u044C \u0457\u0445 \u0443 \u0432\u0443\u0437\u043E\u043B, \u0449\u043E\u0431 \u043F\u0456\u0434\u043A\u043B\u044E\u0447\u0438\u0442\u0438\u0441\u044F \u0434\u043E \u043D\u044C\u043E\u0433\u043E.",editNode:"\u0420\u0435\u0434\u0430\u0433\u0443\u0432\u0430\u0442\u0438 \u0432\u0443\u0437\u043E\u043B"},Oa={addDescription:"Cliquez dans un endroit vide pour placer un n\u0153ud.",addEdge:"Ajouter un lien",addNode:"Ajouter un n\u0153ud",back:"Retour",close:"Fermer",createEdgeError:"Impossible de cr\xE9er un lien vers un cluster.",del:"Effacer la s\xE9lection",deleteClusterError:"Les clusters ne peuvent pas \xEAtre effac\xE9s.",edgeDescription:"Cliquez sur un n\u0153ud et glissez le lien vers un autre n\u0153ud pour les connecter.",edit:"\xC9diter",editClusterError:"Les clusters ne peuvent pas \xEAtre \xE9dit\xE9s.",editEdge:"\xC9diter le lien",editEdgeDescription:"Cliquez sur les points de contr\xF4le et glissez-les pour connecter un n\u0153ud.",editNode:"\xC9diter le n\u0153ud"},Ia={addDescription:"Kluknut\xEDm do pr\xE1zdn\xE9ho prostoru m\u016F\u017Eete p\u0159idat nov\xFD vrchol.",addEdge:"P\u0159idat hranu",addNode:"P\u0159idat vrchol",back:"Zp\u011Bt",close:"Zav\u0159\xEDt",createEdgeError:"Nelze p\u0159ipojit hranu ke shluku.",del:"Smazat v\xFDb\u011Br",deleteClusterError:"Nelze mazat shluky.",edgeDescription:"P\u0159eta\u017Een\xEDm z jednoho vrcholu do druh\xE9ho m\u016F\u017Eete spojit tyto vrcholy novou hranou.",edit:"Upravit",editClusterError:"Nelze upravovat shluky.",editEdge:"Upravit hranu",editEdgeDescription:"P\u0159eta\u017Een\xEDm kontroln\xEDho vrcholu hrany ji m\u016F\u017Eete p\u0159ipojit k jin\xE9mu vrcholu.",editNode:"Upravit vrchol"},Pa=Object.freeze({__proto__:null,en:va,de:wa,es:_a,it:Ea,nl:xa,pt:Ca,ru:Ta,cn:ka,uk:Sa,fr:Oa,cs:Ia});function Ma(n,e){try{let[t,i]=e.split(/[-_ /]/,2),s=t!=null?t.toLowerCase():null,o=i!=null?i.toUpperCase():null;if(s&&o){let r=s+"-"+o;if(Object.prototype.hasOwnProperty.call(n,r))return r;console.warn(`Unknown variant ${o} of language ${s}.`)}if(s){let r=s;if(Object.prototype.hasOwnProperty.call(n,r))return r;console.warn(`Unknown language ${s}`)}return console.warn(`Unknown locale ${e}, falling back to English.`),"en"}catch(t){return console.error(t),console.warn(`Unexpected error while normalizing locale ${e}, falling back to English.`),"en"}}var Eo=class{constructor(){this.NUM_ITERATIONS=4,this.image=new Image,this.canvas=document.createElement("canvas")}init(){if(this.initialized())return;this.src=this.image.src;let e=this.image.width,t=this.image.height;this.width=e,this.height=t;let i=Math.floor(t/2),s=Math.floor(t/4),o=Math.floor(t/8),r=Math.floor(t/16),a=Math.floor(e/2),d=Math.floor(e/4),h=Math.floor(e/8),l=Math.floor(e/16);this.canvas.width=3*d,this.canvas.height=i,this.coordinates=[[0,0,a,i],[a,0,d,s],[a,s,h,o],[5*h,s,l,r]],this._fillMipMap()}initialized(){return this.coordinates!==void 0}_fillMipMap(){let e=this.canvas.getContext("2d"),t=this.coordinates[0];e.drawImage(this.image,t[0],t[1],t[2],t[3]);for(let i=1;i2){t*=.5;let a=0;for(;t>2&&a=this.NUM_ITERATIONS&&(a=this.NUM_ITERATIONS-1);let d=this.coordinates[a];e.drawImage(this.canvas,d[0],d[1],d[2],d[3],i,s,o,r)}else e.drawImage(this.image,i,s,o,r)}},xo=class{constructor(e){this.images={},this.imageBroken={},this.callback=e}_tryloadBrokenUrl(e,t,i){if(!(e===void 0||i===void 0)){if(t===void 0){console.warn("No broken url image defined");return}i.image.onerror=()=>{console.error("Could not load brokenImage:",t)},i.image.src=t}}_redrawWithImage(e){this.callback&&this.callback(e)}load(e,t){let i=this.images[e];if(i)return i;let s=new Eo;return this.images[e]=s,s.image.onload=()=>{this._fixImageCoordinates(s.image),s.init(),this._redrawWithImage(s)},s.image.onerror=()=>{console.error("Could not load image:",e),this._tryloadBrokenUrl(e,t,s)},s.image.src=e,s}_fixImageCoordinates(e){e.width===0&&(document.body.appendChild(e),e.width=e.offsetWidth,e.height=e.offsetHeight,document.body.removeChild(e))}},Co=class{constructor(){this.clear(),this._defaultIndex=0,this._groupIndex=0,this._defaultGroups=[{border:"#2B7CE9",background:"#97C2FC",highlight:{border:"#2B7CE9",background:"#D2E5FF"},hover:{border:"#2B7CE9",background:"#D2E5FF"}},{border:"#FFA500",background:"#FFFF00",highlight:{border:"#FFA500",background:"#FFFFA3"},hover:{border:"#FFA500",background:"#FFFFA3"}},{border:"#FA0A10",background:"#FB7E81",highlight:{border:"#FA0A10",background:"#FFAFB1"},hover:{border:"#FA0A10",background:"#FFAFB1"}},{border:"#41A906",background:"#7BE141",highlight:{border:"#41A906",background:"#A1EC76"},hover:{border:"#41A906",background:"#A1EC76"}},{border:"#E129F0",background:"#EB7DF4",highlight:{border:"#E129F0",background:"#F0B3F5"},hover:{border:"#E129F0",background:"#F0B3F5"}},{border:"#7C29F0",background:"#AD85E4",highlight:{border:"#7C29F0",background:"#D3BDF0"},hover:{border:"#7C29F0",background:"#D3BDF0"}},{border:"#C37F00",background:"#FFA807",highlight:{border:"#C37F00",background:"#FFCA66"},hover:{border:"#C37F00",background:"#FFCA66"}},{border:"#4220FB",background:"#6E6EFD",highlight:{border:"#4220FB",background:"#9B9BFD"},hover:{border:"#4220FB",background:"#9B9BFD"}},{border:"#FD5A77",background:"#FFC0CB",highlight:{border:"#FD5A77",background:"#FFD1D9"},hover:{border:"#FD5A77",background:"#FFD1D9"}},{border:"#4AD63A",background:"#C2FABC",highlight:{border:"#4AD63A",background:"#E6FFE3"},hover:{border:"#4AD63A",background:"#E6FFE3"}},{border:"#990000",background:"#EE0000",highlight:{border:"#BB0000",background:"#FF3333"},hover:{border:"#BB0000",background:"#FF3333"}},{border:"#FF6000",background:"#FF6000",highlight:{border:"#FF6000",background:"#FF6000"},hover:{border:"#FF6000",background:"#FF6000"}},{border:"#97C2FC",background:"#2B7CE9",highlight:{border:"#D2E5FF",background:"#2B7CE9"},hover:{border:"#D2E5FF",background:"#2B7CE9"}},{border:"#399605",background:"#255C03",highlight:{border:"#399605",background:"#255C03"},hover:{border:"#399605",background:"#255C03"}},{border:"#B70054",background:"#FF007E",highlight:{border:"#B70054",background:"#FF007E"},hover:{border:"#B70054",background:"#FF007E"}},{border:"#AD85E4",background:"#7C29F0",highlight:{border:"#D3BDF0",background:"#7C29F0"},hover:{border:"#D3BDF0",background:"#7C29F0"}},{border:"#4557FA",background:"#000EA1",highlight:{border:"#6E6EFD",background:"#000EA1"},hover:{border:"#6E6EFD",background:"#000EA1"}},{border:"#FFC0CB",background:"#FD5A77",highlight:{border:"#FFD1D9",background:"#FD5A77"},hover:{border:"#FFD1D9",background:"#FD5A77"}},{border:"#C2FABC",background:"#74D66A",highlight:{border:"#E6FFE3",background:"#74D66A"},hover:{border:"#E6FFE3",background:"#74D66A"}},{border:"#EE0000",background:"#990000",highlight:{border:"#FF3333",background:"#BB0000"},hover:{border:"#FF3333",background:"#BB0000"}}],this.options={},this.defaultOptions={useDefaultGroups:!0},Object.assign(this.options,this.defaultOptions)}setOptions(e){let t=["useDefaultGroups"];if(e!==void 0){for(let i in e)if(Object.prototype.hasOwnProperty.call(e,i)&&t.indexOf(i)===-1){let s=e[i];this.add(i,s)}}}clear(){this._groups=new Map,this._groupNames=[]}get(e,t=!0){let i=this._groups.get(e);if(i===void 0&&t)if(this.options.useDefaultGroups===!1&&this._groupNames.length>0){let s=this._groupIndex%this._groupNames.length;++this._groupIndex,i={},i.color=this._groups.get(this._groupNames[s]),this._groups.set(e,i)}else{let s=this._defaultIndex%this._defaultGroups.length;this._defaultIndex++,i={},i.color=this._defaultGroups[s],this._groups.set(e,i)}return i}add(e,t){return this._groups.has(e)||this._groupNames.push(e),this._groups.set(e,t),t}};function Ii(n,e){let t=["node","edge","label"],i=!0,s=Ce(e,"chosen");if(typeof s=="boolean")i=s;else if(typeof s=="object"){if(t.indexOf(n)===-1)throw new Error("choosify: subOption '"+n+"' should be one of '"+t.join("', '")+"'");let o=Ce(e,["chosen",n]);(typeof o=="boolean"||typeof o=="function")&&(i=o)}return i}function Pi(n,e,t){if(n.width<=0||n.height<=0)return!1;if(t!==void 0){let o={x:e.x-t.x,y:e.y-t.y};if(t.angle!==0){let r=-t.angle;e={x:Math.cos(r)*o.x-Math.sin(r)*o.y,y:Math.sin(r)*o.x+Math.cos(r)*o.y}}else e=o}let i=n.x+n.width,s=n.y+n.width;return n.lefte.x&&n.tope.y}function Xt(n){return typeof n=="string"&&n!==""}function To(n,e,t,i){let s=i.x,o=i.y;if(typeof i.distanceToBorder=="function"){let r=i.distanceToBorder(n,e),a=Math.sin(e)*r,d=Math.cos(e)*r;d===r?(s+=r,o=i.y):a===r?(s=i.x,o-=r):(s+=d,o-=a)}else i.shape.width>i.shape.height?(s=i.x+i.shape.width*.5,o=i.y-t):(s=i.x+t,o=i.y-i.shape.height*.5);return{x:s,y:o}}var ko=class{constructor(e){this.measureText=e,this.current=0,this.width=0,this.height=0,this.lines=[]}_add(e,t,i="normal"){this.lines[e]===void 0&&(this.lines[e]={width:0,height:0,blocks:[]});let s=t;(t===void 0||t==="")&&(s=" ");let o=this.measureText(s,i),r=Object.assign({},o.values);r.text=t,r.width=o.width,r.mod=i,(t===void 0||t==="")&&(r.width=0),this.lines[e].blocks.push(r),this.lines[e].width+=r.width}curWidth(){let e=this.lines[this.current];return e===void 0?0:e.width}append(e,t="normal"){this._add(this.current,e,t)}newLine(e,t="normal"){this._add(this.current,e,t),this.current++}determineLineHeights(){for(let e=0;ee&&(e=s.width),t+=s.height}this.width=e,this.height=t}removeEmptyBlocks(){let e=[];for(let t=0;t"://,""://,""://,"":/<\/b>/,"":/<\/i>/,"":/<\/code>/,"*":/\*/,_:/_/,"`":/`/,afterBold:/[^*]/,afterItal:/[^_]/,afterMono:/[^`]/},Mi=class{constructor(e){this.text=e,this.bold=!1,this.ital=!1,this.mono=!1,this.spacing=!1,this.position=0,this.buffer="",this.modStack=[],this.blocks=[]}mod(){return this.modStack.length===0?"normal":this.modStack[0]}modName(){if(this.modStack.length===0)return"normal";if(this.modStack[0]==="mono")return"mono";if(this.bold&&this.ital)return"boldital";if(this.bold)return"bold";if(this.ital)return"ital"}emitBlock(){this.spacing&&(this.add(" "),this.spacing=!1),this.buffer.length>0&&(this.blocks.push({text:this.buffer,mod:this.modName()}),this.buffer="")}add(e){e===" "&&(this.spacing=!0),this.spacing&&(this.buffer+=" ",this.spacing=!1),e!=" "&&(this.buffer+=e)}parseWS(e){return/[ \t]/.test(e)?(this.mono?this.add(e):this.spacing=!0,!0):!1}setTag(e){this.emitBlock(),this[e]=!0,this.modStack.unshift(e)}unsetTag(e){this.emitBlock(),this[e]=!1,this.modStack.shift()}parseStartTag(e,t){return!this.mono&&!this[e]&&this.match(t)?(this.setTag(e),!0):!1}match(e,t=!0){let[i,s]=this.prepareRegExp(e),o=i.test(this.text.substr(this.position,s));return o&&t&&(this.position+=s-1),o}parseEndTag(e,t,i){let s=this.mod()===e;return e==="mono"?s=s&&this.mono:s=s&&!this.mono,s&&this.match(t)?(i!==void 0?(this.position===this.text.length-1||this.match(i,!1))&&this.unsetTag(e):this.unsetTag(e),!0):!1}replace(e,t){return this.match(e)?(this.add(t),this.position+=length-1,!0):!1}prepareRegExp(e){let t,i;if(e instanceof RegExp)i=e,t=1;else{let s=Da[e];s!==void 0?i=s:i=new RegExp(e),t=e.length}return[i,t]}},So=class{constructor(e,t,i,s){this.ctx=e,this.parent=t,this.selected=i,this.hover=s;let o=(r,a)=>{if(r===void 0)return 0;let d=this.parent.getFormattingValues(e,i,s,a),h=0;return r!==""&&(h=this.ctx.measureText(r).width),{width:h,values:d}};this.lines=new ko(o)}process(e){if(!Xt(e))return this.lines.finalize();let t=this.parent.fontOptions;e=e.replace(/\r\n/g,` `),e=e.replace(/\r/g,` `);let i=String(e).split(` -`),s=i.length;if(t.multi)for(let o=0;o0)for(let a=0;a0)for(let o=0;o/&/.test(s)?(t.replace(t.text,"<","<")||t.replace(t.text,"&","&")||t.add("&"),!0):!1;for(;t.position")||t.parseStartTag("ital","")||t.parseStartTag("mono","")||t.parseEndTag("bold","")||t.parseEndTag("ital","")||t.parseEndTag("mono",""))||i(s)||t.add(s),t.position++}return t.emitBlock(),t.blocks}splitMarkdownBlocks(e){let t=new Mi(e),i=!0,s=o=>/\\/.test(o)?(t.positionthis.parent.fontOptions.maxWdt}getLongestFit(e){let t="",i=0;for(;i0;){let o=this.getLongestFit(s);if(o===0){let r=s[0],a=this.getLongestFitWord(r);this.lines.newLine(r.slice(0,a),t),s[0]=r.slice(a)}else{let r=o;s[o-1]===" "?o--:s[r]===" "&&r++;let a=s.slice(0,o).join("");o==s.length&&i?this.lines.append(a,t):this.lines.newLine(a,t),s=s.slice(r)}}}},Gt=["bold","ital","boldital","mono"],Ue=class{constructor(e,t,i=!1){this.body=e,this.pointToSelf=!1,this.baseSize=void 0,this.fontOptions={},this.setOptions(t),this.size={top:0,left:0,width:0,height:0,yLine:0},this.isEdgeLabel=i}setOptions(e){if(this.elementOptions=e,this.initFontOptions(e.font),Xt(e.label)?this.labelDirty=!0:e.label=void 0,e.font!==void 0&&e.font!==null){if(typeof e.font=="string")this.baseSize=this.fontOptions.size;else if(typeof e.font=="object"){let t=e.font.size;t!==void 0&&(this.baseSize=t)}}}initFontOptions(e){if(A(Gt,t=>{this.fontOptions[t]={}}),Ue.parseFontString(this.fontOptions,e)){this.fontOptions.vadjust=0;return}A(e,(t,i)=>{t!=null&&typeof t!="object"&&(this.fontOptions[i]=t)})}static parseFontString(e,t){if(!t||typeof t!="string")return!1;let i=t.split(" ");return e.size=+i[0].replace("px",""),e.face=i[1],e.color=i[2],!0}constrain(e){let t={constrainWidth:!1,maxWdt:-1,minWdt:-1,constrainHeight:!1,minHgt:-1,valign:"middle"},i=Ce(e,"widthConstraint");if(typeof i=="number")t.maxWdt=Number(i),t.minWdt=Number(i);else if(typeof i=="object"){let o=Ce(e,["widthConstraint","maximum"]);typeof o=="number"&&(t.maxWdt=Number(o));let r=Ce(e,["widthConstraint","minimum"]);typeof r=="number"&&(t.minWdt=Number(r))}let s=Ce(e,"heightConstraint");if(typeof s=="number")t.minHgt=Number(s);else if(typeof s=="object"){let o=Ce(e,["heightConstraint","minimum"]);typeof o=="number"&&(t.minHgt=Number(o));let r=Ce(e,["heightConstraint","valign"]);typeof r=="string"&&(r==="top"||r==="bottom")&&(t.valign=r)}return t}update(e,t){this.setOptions(e,!0),this.propagateFonts(t),j(this.fontOptions,this.constrain(t)),this.fontOptions.chooser=Ii("label",t)}adjustSizes(e){let t=e?e.right+e.left:0;this.fontOptions.constrainWidth&&(this.fontOptions.maxWdt-=t,this.fontOptions.minWdt-=t);let i=e?e.top+e.bottom:0;this.fontOptions.constrainHeight&&(this.fontOptions.minHgt-=i)}addFontOptionsToPile(e,t){for(let i=0;i{r!==void 0&&(Object.prototype.hasOwnProperty.call(t,a)||(Gt.indexOf(a)!==-1?t[a]={}:t[a]=r))})}return t}getFontOption(e,t,i){let s;for(let o=0;o{o[d]=a}),o.size=Number(o.size),o.vadjust=Number(o.vadjust)}}draw(e,t,i,s,o,r="middle"){if(this.elementOptions.label===void 0)return;let a=this.fontOptions.size*this.body.view.scale;this.elementOptions.label&&a=this.elementOptions.scaling.label.maxVisible&&(a=Number(this.elementOptions.scaling.label.maxVisible)/this.body.view.scale),this.calculateLabelSize(e,s,o,t,i,r),this._drawBackground(e),this._drawText(e,t,this.size.yLine,r,a))}_drawBackground(e){if(this.fontOptions.background!==void 0&&this.fontOptions.background!=="none"){e.fillStyle=this.fontOptions.background;let t=this.getSize();e.fillRect(t.left,t.top,t.width,t.height)}}_drawText(e,t,i,s="middle",o){[t,i]=this._setAlignment(e,t,i,s),e.textAlign="left",t=t-this.size.width/2,this.fontOptions.valign&&this.size.height>this.size.labelHeight&&(this.fontOptions.valign==="top"&&(i-=(this.size.height-this.size.labelHeight)/2),this.fontOptions.valign==="bottom"&&(i+=(this.size.height-this.size.labelHeight)/2));for(let r=0;r0&&(e.lineWidth=l.strokeWidth,e.strokeStyle=u,e.lineJoin="round"),e.fillStyle=c,l.strokeWidth>0&&e.strokeText(l.text,t+d,i+l.vadjust),e.fillText(l.text,t+d,i+l.vadjust),d+=l.width}i+=a.height}}}_setAlignment(e,t,i,s){if(this.isEdgeLabel&&this.fontOptions.align!=="horizontal"&&this.pointToSelf===!1){t=0,i=0;let o=2;this.fontOptions.align==="top"?(e.textBaseline="alphabetic",i-=2*o):this.fontOptions.align==="bottom"?(e.textBaseline="hanging",i+=2*o):e.textBaseline="middle"}else e.textBaseline=s;return[t,i]}_getColor(e,t,i){let s=e||"#000000",o=i||"#ffffff";if(t<=this.elementOptions.scaling.label.drawThreshold){let r=Math.max(0,Math.min(1,1-(this.elementOptions.scaling.label.drawThreshold-t)));s=re(s,r),o=re(o,r)}return[s,o]}getTextSize(e,t=!1,i=!1){return this._processLabel(e,t,i),{width:this.size.width,height:this.size.height,lineCount:this.lineCount}}getSize(){let e=2,t=this.size.left,i=this.size.top-.5*e;if(this.isEdgeLabel){let o=-this.size.width*.5;switch(this.fontOptions.align){case"middle":t=o,i=-this.size.height*.5;break;case"top":t=o,i=-(this.size.height+e);break;case"bottom":t=o,i=e;break}}return{left:t,top:i,width:this.size.width,height:this.size.height}}calculateLabelSize(e,t,i,s=0,o=0,r="middle"){this._processLabel(e,t,i),this.size.left=s-this.size.width*.5,this.size.top=o-this.size.height*.5,this.size.yLine=o+(1-this.lineCount)*.5*this.fontOptions.size,r==="hanging"&&(this.size.top+=.5*this.fontOptions.size,this.size.top+=4,this.size.yLine+=4)}getFormattingValues(e,t,i,s){let o=function(d,h,l){return h==="normal"?l==="mod"?"":d[l]:d[h][l]!==void 0?d[h][l]:d[l]},r={color:o(this.fontOptions,s,"color"),size:o(this.fontOptions,s,"size"),face:o(this.fontOptions,s,"face"),mod:o(this.fontOptions,s,"mod"),vadjust:o(this.fontOptions,s,"vadjust"),strokeWidth:this.fontOptions.strokeWidth,strokeColor:this.fontOptions.strokeColor};(t||i)&&(s==="normal"&&this.fontOptions.chooser===!0&&this.elementOptions.labelHighlightBold?r.mod="bold":typeof this.fontOptions.chooser=="function"&&this.fontOptions.chooser(r,this.elementOptions.id,t,i));let a="";return r.mod!==void 0&&r.mod!==""&&(a+=r.mod+" "),a+=r.size+"px "+r.face,e.font=a.replace(/"/g,""),r.font=e.font,r.height=r.size,r}differentState(e,t){return e!==this.selectedState||t!==this.hoverState}_processLabelText(e,t,i,s){return new So(e,this,t,i).process(s)}_processLabel(e,t,i){if(this.labelDirty===!1&&!this.differentState(t,i))return;let s=this._processLabelText(e,t,i,this.elementOptions.label);this.fontOptions.minWdt>0&&s.width0&&s.height0&&(this.enableBorderDashes(e,t),e.stroke(),this.disableBorderDashes(e,t)),e.restore()}performFill(e,t){e.save(),e.fillStyle=t.color,this.enableShadow(e,t),e.fill(),this.disableShadow(e,t),e.restore(),this.performStroke(e,t)}_addBoundingBoxMargin(e){this.boundingBox.left-=e,this.boundingBox.top-=e,this.boundingBox.bottom+=e,this.boundingBox.right+=e}_updateBoundingBox(e,t,i,s,o){i!==void 0&&this.resize(i,s,o),this.left=e-this.width/2,this.top=t-this.height/2,this.boundingBox.left=this.left,this.boundingBox.top=this.top,this.boundingBox.bottom=this.top+this.height,this.boundingBox.right=this.left+this.width}updateBoundingBox(e,t,i,s,o){this._updateBoundingBox(e,t,i,s,o)}getDimensionsFromLabel(e,t,i){this.textSize=this.labelModule.getTextSize(e,t,i);let s=this.textSize.width,o=this.textSize.height,r=14;return s===0&&(s=r,o=r),{width:s,height:o}}},Oo=class extends De{constructor(e,t,i){super(e,t,i);this._setMargins(i)}resize(e,t=this.selected,i=this.hover){if(this.needsRefresh(t,i)){let s=this.getDimensionsFromLabel(e,t,i);this.width=s.width+this.margin.right+this.margin.left,this.height=s.height+this.margin.top+this.margin.bottom,this.radius=this.width/2}}draw(e,t,i,s,o,r){this.resize(e,s,o),this.left=t-this.width/2,this.top=i-this.height/2,this.initContextForDraw(e,r),ao(e,this.left,this.top,this.width,this.height,r.borderRadius),this.performFill(e,r),this.updateBoundingBox(t,i,e,s,o),this.labelModule.draw(e,this.left+this.textSize.width/2+this.margin.left,this.top+this.textSize.height/2+this.margin.top,s,o)}updateBoundingBox(e,t,i,s,o){this._updateBoundingBox(e,t,i,s,o);let r=this.options.shapeProperties.borderRadius;this._addBoundingBoxMargin(r)}distanceToBorder(e,t){e&&this.resize(e);let i=this.options.borderWidth;return Math.min(Math.abs(this.width/2/Math.cos(t)),Math.abs(this.height/2/Math.sin(t)))+i}},Kt=class extends De{constructor(e,t,i){super(e,t,i);this.labelOffset=0,this.selected=!1}setOptions(e,t,i){this.options=e,t===void 0&&i===void 0||this.setImages(t,i)}setImages(e,t){t&&this.selected?(this.imageObj=t,this.imageObjAlt=e):(this.imageObj=e,this.imageObjAlt=t)}switchImages(e){let t=e&&!this.selected||!e&&this.selected;if(this.selected=e,this.imageObjAlt!==void 0&&t){let i=this.imageObj;this.imageObj=this.imageObjAlt,this.imageObjAlt=i}}_getImagePadding(){let e={top:0,right:0,bottom:0,left:0};if(this.options.imagePadding){let t=this.options.imagePadding;typeof t=="object"?(e.top=t.top,e.right=t.right,e.bottom=t.bottom,e.left=t.left):(e.top=t,e.right=t,e.bottom=t,e.left=t)}return e}_resizeImage(){let e,t;if(this.options.shapeProperties.useImageSize===!1){let i=1,s=1;this.imageObj.width&&this.imageObj.height&&(this.imageObj.width>this.imageObj.height?i=this.imageObj.width/this.imageObj.height:s=this.imageObj.height/this.imageObj.width),e=this.options.size*2*i,t=this.options.size*2*s}else{let i=this._getImagePadding();e=this.imageObj.width+i.left+i.right,t=this.imageObj.height+i.top+i.bottom}this.width=e,this.height=t,this.radius=.5*this.width}_drawRawCircle(e,t,i,s){this.initContextForDraw(e,s),Ti(e,t,i,s.size),this.performFill(e,s)}_drawImageAtPosition(e,t){if(this.imageObj.width!=0){e.globalAlpha=t.opacity!==void 0?t.opacity:1,this.enableShadow(e,t);let i=1;this.options.shapeProperties.interpolation===!0&&(i=this.imageObj.width/this.width/this.body.view.scale);let s=this._getImagePadding(),o=this.left+s.left,r=this.top+s.top,a=this.width-s.left-s.right,d=this.height-s.top-s.bottom;this.imageObj.drawImageAtPosition(e,i,o,r,a,d),this.disableShadow(e,t)}}_drawImageLabel(e,t,i,s,o){let r=0;if(this.height!==void 0){r=this.height*.5;let d=this.labelModule.getTextSize(e,s,o);d.lineCount>=1&&(r+=d.height/2)}let a=i+r;this.options.label&&(this.labelOffset=r),this.labelModule.draw(e,t,a,s,o,"hanging")}},Io=class extends Kt{constructor(e,t,i){super(e,t,i);this._setMargins(i)}resize(e,t=this.selected,i=this.hover){if(this.needsRefresh(t,i)){let s=this.getDimensionsFromLabel(e,t,i),o=Math.max(s.width+this.margin.right+this.margin.left,s.height+this.margin.top+this.margin.bottom);this.options.size=o/2,this.width=o,this.height=o,this.radius=this.width/2}}draw(e,t,i,s,o,r){this.resize(e,s,o),this.left=t-this.width/2,this.top=i-this.height/2,this._drawRawCircle(e,t,i,r),this.updateBoundingBox(t,i),this.labelModule.draw(e,this.left+this.textSize.width/2+this.margin.left,i,s,o)}updateBoundingBox(e,t){this.boundingBox.top=t-this.options.size,this.boundingBox.left=e-this.options.size,this.boundingBox.right=e+this.options.size,this.boundingBox.bottom=t+this.options.size}distanceToBorder(e){return e&&this.resize(e),this.width*.5}},Po=class extends Kt{constructor(e,t,i,s,o){super(e,t,i);this.setImages(s,o)}resize(e,t=this.selected,i=this.hover){if(this.imageObj.src===void 0||this.imageObj.width===void 0||this.imageObj.height===void 0){let o=this.options.size*2;this.width=o,this.height=o,this.radius=.5*this.width;return}this.needsRefresh(t,i)&&this._resizeImage()}draw(e,t,i,s,o,r){this.switchImages(s),this.resize();let a=t,d=i;this.options.shapeProperties.coordinateOrigin==="top-left"?(this.left=t,this.top=i,a+=this.width/2,d+=this.height/2):(this.left=t-this.width/2,this.top=i-this.height/2),this._drawRawCircle(e,a,d,r),e.save(),e.clip(),this._drawImageAtPosition(e,r),e.restore(),this._drawImageLabel(e,a,d,s,o),this.updateBoundingBox(t,i)}updateBoundingBox(e,t){this.options.shapeProperties.coordinateOrigin==="top-left"?(this.boundingBox.top=t,this.boundingBox.left=e,this.boundingBox.right=e+this.options.size*2,this.boundingBox.bottom=t+this.options.size*2):(this.boundingBox.top=t-this.options.size,this.boundingBox.left=e-this.options.size,this.boundingBox.right=e+this.options.size,this.boundingBox.bottom=t+this.options.size),this.boundingBox.left=Math.min(this.boundingBox.left,this.labelModule.size.left),this.boundingBox.right=Math.max(this.boundingBox.right,this.labelModule.size.left+this.labelModule.size.width),this.boundingBox.bottom=Math.max(this.boundingBox.bottom,this.boundingBox.bottom+this.labelOffset)}distanceToBorder(e){return e&&this.resize(e),this.width*.5}},ke=class extends De{constructor(e,t,i){super(e,t,i)}resize(e,t=this.selected,i=this.hover,s={size:this.options.size}){var o,r;if(this.needsRefresh(t,i)){this.labelModule.getTextSize(e,t,i);let a=2*s.size;this.width=(o=this.customSizeWidth)!=null?o:a,this.height=(r=this.customSizeHeight)!=null?r:a,this.radius=.5*this.width}}_drawShape(e,t,i,s,o,r,a,d){return this.resize(e,r,a,d),this.left=s-this.width/2,this.top=o-this.height/2,this.initContextForDraw(e,d),aa(t)(e,s,o,d.size),this.performFill(e,d),this.options.icon!==void 0&&this.options.icon.code!==void 0&&(e.font=(r?"bold ":"")+this.height/2+"px "+(this.options.icon.face||"FontAwesome"),e.fillStyle=this.options.icon.color||"black",e.textAlign="center",e.textBaseline="middle",e.fillText(this.options.icon.code,s,o)),{drawExternalLabel:()=>{if(this.options.label!==void 0){this.labelModule.calculateLabelSize(e,r,a,s,o,"hanging");let h=o+.5*this.height+.5*this.labelModule.size.height;this.labelModule.draw(e,s,h,r,a,"hanging")}this.updateBoundingBox(s,o)}}}updateBoundingBox(e,t){this.boundingBox.top=t-this.options.size,this.boundingBox.left=e-this.options.size,this.boundingBox.right=e+this.options.size,this.boundingBox.bottom=t+this.options.size,this.options.label!==void 0&&this.labelModule.size.width>0&&(this.boundingBox.left=Math.min(this.boundingBox.left,this.labelModule.size.left),this.boundingBox.right=Math.max(this.boundingBox.right,this.labelModule.size.left+this.labelModule.size.width),this.boundingBox.bottom=Math.max(this.boundingBox.bottom,this.boundingBox.bottom+this.labelModule.size.height))}},Mo=class extends ke{constructor(e,t,i,s){super(e,t,i,s);this.ctxRenderer=s}draw(e,t,i,s,o,r){this.resize(e,s,o,r),this.left=t-this.width/2,this.top=i-this.height/2,e.save();let a=this.ctxRenderer({ctx:e,id:this.options.id,x:t,y:i,state:{selected:s,hover:o},style:ye({},r),label:this.options.label});if(a.drawNode!=null&&a.drawNode(),e.restore(),a.drawExternalLabel){let d=a.drawExternalLabel;a.drawExternalLabel=()=>{e.save(),d(),e.restore()}}return a.nodeDimensions&&(this.customSizeWidth=a.nodeDimensions.width,this.customSizeHeight=a.nodeDimensions.height),a}distanceToBorder(e,t){return this._distanceToBorder(e,t)}},Do=class extends De{constructor(e,t,i){super(e,t,i);this._setMargins(i)}resize(e,t,i){if(this.needsRefresh(t,i)){let o=this.getDimensionsFromLabel(e,t,i).width+this.margin.right+this.margin.left;this.width=o,this.height=o,this.radius=this.width/2}}draw(e,t,i,s,o,r){this.resize(e,s,o),this.left=t-this.width/2,this.top=i-this.height/2,this.initContextForDraw(e,r),ho(e,t-this.width/2,i-this.height/2,this.width,this.height),this.performFill(e,r),this.updateBoundingBox(t,i,e,s,o),this.labelModule.draw(e,this.left+this.textSize.width/2+this.margin.left,this.top+this.textSize.height/2+this.margin.top,s,o)}distanceToBorder(e,t){return this._distanceToBorder(e,t)}},Fo=class extends ke{constructor(e,t,i){super(e,t,i)}draw(e,t,i,s,o,r){return this._drawShape(e,"diamond",4,t,i,s,o,r)}distanceToBorder(e,t){return this._distanceToBorder(e,t)}},No=class extends ke{constructor(e,t,i){super(e,t,i)}draw(e,t,i,s,o,r){return this._drawShape(e,"circle",2,t,i,s,o,r)}distanceToBorder(e){return e&&this.resize(e),this.options.size}},Di=class extends De{constructor(e,t,i){super(e,t,i)}resize(e,t=this.selected,i=this.hover){if(this.needsRefresh(t,i)){let s=this.getDimensionsFromLabel(e,t,i);this.height=s.height*2,this.width=s.width+s.height,this.radius=.5*this.width}}draw(e,t,i,s,o,r){this.resize(e,s,o),this.left=t-this.width*.5,this.top=i-this.height*.5,this.initContextForDraw(e,r),ki(e,this.left,this.top,this.width,this.height),this.performFill(e,r),this.updateBoundingBox(t,i,e,s,o),this.labelModule.draw(e,t,i,s,o)}distanceToBorder(e,t){e&&this.resize(e);let i=this.width*.5,s=this.height*.5,o=Math.sin(t)*i,r=Math.cos(t)*s;return i*s/Math.sqrt(o*o+r*r)}},Bo=class extends De{constructor(e,t,i){super(e,t,i);this._setMargins(i)}resize(e,t,i){this.needsRefresh(t,i)&&(this.iconSize={width:Number(this.options.icon.size),height:Number(this.options.icon.size)},this.width=this.iconSize.width+this.margin.right+this.margin.left,this.height=this.iconSize.height+this.margin.top+this.margin.bottom,this.radius=.5*this.width)}draw(e,t,i,s,o,r){return this.resize(e,s,o),this.options.icon.size=this.options.icon.size||50,this.left=t-this.width/2,this.top=i-this.height/2,this._icon(e,t,i,s,o,r),{drawExternalLabel:()=>{if(this.options.label!==void 0){let a=5;this.labelModule.draw(e,this.left+this.iconSize.width/2+this.margin.left,i+this.height/2+a,s)}this.updateBoundingBox(t,i)}}}updateBoundingBox(e,t){if(this.boundingBox.top=t-this.options.icon.size*.5,this.boundingBox.left=e-this.options.icon.size*.5,this.boundingBox.right=e+this.options.icon.size*.5,this.boundingBox.bottom=t+this.options.icon.size*.5,this.options.label!==void 0&&this.labelModule.size.width>0){let i=5;this.boundingBox.left=Math.min(this.boundingBox.left,this.labelModule.size.left),this.boundingBox.right=Math.max(this.boundingBox.right,this.labelModule.size.left+this.labelModule.size.width),this.boundingBox.bottom=Math.max(this.boundingBox.bottom,this.boundingBox.bottom+this.labelModule.size.height+i)}}_icon(e,t,i,s,o,r){let a=Number(this.options.icon.size);this.options.icon.code!==void 0?(e.font=[this.options.icon.weight!=null?this.options.icon.weight:s?"bold":"",(this.options.icon.weight!=null&&s?5:0)+a+"px",this.options.icon.face].join(" "),e.fillStyle=this.options.icon.color||"black",e.textAlign="center",e.textBaseline="middle",this.enableShadow(e,r),e.fillText(this.options.icon.code,t,i),this.disableShadow(e,r)):console.error("When using the icon shape, you need to define the code in the icon options object. This can be done per node or globally.")}distanceToBorder(e,t){return this._distanceToBorder(e,t)}},Ao=class extends Kt{constructor(e,t,i,s,o){super(e,t,i);this.setImages(s,o)}resize(e,t=this.selected,i=this.hover){if(this.imageObj.src===void 0||this.imageObj.width===void 0||this.imageObj.height===void 0){let o=this.options.size*2;this.width=o,this.height=o;return}this.needsRefresh(t,i)&&this._resizeImage()}draw(e,t,i,s,o,r){e.save(),this.switchImages(s),this.resize();let a=t,d=i;if(this.options.shapeProperties.coordinateOrigin==="top-left"?(this.left=t,this.top=i,a+=this.width/2,d+=this.height/2):(this.left=t-this.width/2,this.top=i-this.height/2),this.options.shapeProperties.useBorderWithImage===!0){let h=this.options.borderWidth,l=this.options.borderWidthSelected||2*this.options.borderWidth,c=(s?l:h)/this.body.view.scale;e.lineWidth=Math.min(this.width,c),e.beginPath();let u=s?this.options.color.highlight.border:o?this.options.color.hover.border:this.options.color.border,p=s?this.options.color.highlight.background:o?this.options.color.hover.background:this.options.color.background;r.opacity!==void 0&&(u=re(u,r.opacity),p=re(p,r.opacity)),e.strokeStyle=u,e.fillStyle=p,e.rect(this.left-.5*e.lineWidth,this.top-.5*e.lineWidth,this.width+e.lineWidth,this.height+e.lineWidth),e.fill(),this.performStroke(e,r),e.closePath()}this._drawImageAtPosition(e,r),this._drawImageLabel(e,a,d,s,o),this.updateBoundingBox(t,i),e.restore()}updateBoundingBox(e,t){this.resize(),this.options.shapeProperties.coordinateOrigin==="top-left"?(this.left=e,this.top=t):(this.left=e-this.width/2,this.top=t-this.height/2),this.boundingBox.left=this.left,this.boundingBox.top=this.top,this.boundingBox.bottom=this.top+this.height,this.boundingBox.right=this.left+this.width,this.options.label!==void 0&&this.labelModule.size.width>0&&(this.boundingBox.left=Math.min(this.boundingBox.left,this.labelModule.size.left),this.boundingBox.right=Math.max(this.boundingBox.right,this.labelModule.size.left+this.labelModule.size.width),this.boundingBox.bottom=Math.max(this.boundingBox.bottom,this.boundingBox.bottom+this.labelOffset))}distanceToBorder(e,t){return this._distanceToBorder(e,t)}},zo=class extends ke{constructor(e,t,i){super(e,t,i)}draw(e,t,i,s,o,r){return this._drawShape(e,"square",2,t,i,s,o,r)}distanceToBorder(e,t){return this._distanceToBorder(e,t)}},Lo=class extends ke{constructor(e,t,i){super(e,t,i)}draw(e,t,i,s,o,r){return this._drawShape(e,"hexagon",4,t,i,s,o,r)}distanceToBorder(e,t){return this._distanceToBorder(e,t)}},Ro=class extends ke{constructor(e,t,i){super(e,t,i)}draw(e,t,i,s,o,r){return this._drawShape(e,"star",4,t,i,s,o,r)}distanceToBorder(e,t){return this._distanceToBorder(e,t)}},Ho=class extends De{constructor(e,t,i){super(e,t,i);this._setMargins(i)}resize(e,t,i){this.needsRefresh(t,i)&&(this.textSize=this.labelModule.getTextSize(e,t,i),this.width=this.textSize.width+this.margin.right+this.margin.left,this.height=this.textSize.height+this.margin.top+this.margin.bottom,this.radius=.5*this.width)}draw(e,t,i,s,o,r){this.resize(e,s,o),this.left=t-this.width/2,this.top=i-this.height/2,this.enableShadow(e,r),this.labelModule.draw(e,this.left+this.textSize.width/2+this.margin.left,this.top+this.textSize.height/2+this.margin.top,s,o),this.disableShadow(e,r),this.updateBoundingBox(t,i,e,s,o)}distanceToBorder(e,t){return this._distanceToBorder(e,t)}},jo=class extends ke{constructor(e,t,i){super(e,t,i)}draw(e,t,i,s,o,r){return this._drawShape(e,"triangle",3,t,i,s,o,r)}distanceToBorder(e,t){return this._distanceToBorder(e,t)}},Wo=class extends ke{constructor(e,t,i){super(e,t,i)}draw(e,t,i,s,o,r){return this._drawShape(e,"triangleDown",3,t,i,s,o,r)}distanceToBorder(e,t){return this._distanceToBorder(e,t)}},U=class{constructor(e,t,i,s,o,r){this.options=xe(o),this.globalOptions=o,this.defaultOptions=r,this.body=t,this.edges=[],this.id=void 0,this.imagelist=i,this.grouplist=s,this.x=void 0,this.y=void 0,this.baseSize=this.options.size,this.baseFontSize=this.options.font.size,this.predefinedPosition=!1,this.selected=!1,this.hover=!1,this.labelModule=new Ue(this.body,this.options,!1),this.setOptions(e)}attachEdge(e){this.edges.indexOf(e)===-1&&this.edges.push(e)}detachEdge(e){let t=this.edges.indexOf(e);t!=-1&&this.edges.splice(t,1)}setOptions(e){let t=this.options.shape;if(!e)return;if(typeof e.color!="undefined"&&(this._localColor=e.color),e.id!==void 0&&(this.id=e.id),this.id===void 0)throw new Error("Node must have an id");U.checkMass(e,this.id),e.x!==void 0&&(e.x===null?(this.x=void 0,this.predefinedPosition=!1):(this.x=parseInt(e.x),this.predefinedPosition=!0)),e.y!==void 0&&(e.y===null?(this.y=void 0,this.predefinedPosition=!1):(this.y=parseInt(e.y),this.predefinedPosition=!0)),e.size!==void 0&&(this.baseSize=e.size),e.value!==void 0&&(e.value=parseFloat(e.value)),U.parseOptions(this.options,e,!0,this.globalOptions,this.grouplist);let i=[e,this.options,this.defaultOptions];return this.chooser=Ii("node",i),this._load_images(),this.updateLabelModule(e),e.opacity!==void 0&&U.checkOpacity(e.opacity)&&(this.options.opacity=e.opacity),this.updateShape(t),e.hidden!==void 0||e.physics!==void 0}_load_images(){if((this.options.shape==="circularImage"||this.options.shape==="image")&&this.options.image===void 0)throw new Error("Option image must be defined for node type '"+this.options.shape+"'");if(this.options.image!==void 0){if(this.imagelist===void 0)throw new Error("Internal Error: No images provided");if(typeof this.options.image=="string")this.imageObj=this.imagelist.load(this.options.image,this.options.brokenImage,this.id);else{if(this.options.image.unselected===void 0)throw new Error("No unselected image provided");this.imageObj=this.imagelist.load(this.options.image.unselected,this.options.brokenImage,this.id),this.options.image.selected!==void 0?this.imageObjAlt=this.imagelist.load(this.options.image.selected,this.options.brokenImage,this.id):this.imageObjAlt=void 0}}}static checkOpacity(e){return 0<=e&&e<=1}static checkCoordinateOrigin(e){return e===void 0||e==="center"||e==="top-left"}static updateGroupOptions(e,t,i){if(i===void 0)return;let s=e.group;if(t!==void 0&&t.group!==void 0&&s!==t.group)throw new Error("updateGroupOptions: group values in options don't match.");if(!(typeof s=="number"||typeof s=="string"&&s!=""))return;let r=i.get(s);r.opacity!==void 0&&t.opacity===void 0&&(U.checkOpacity(r.opacity)||(console.error("Invalid option for node opacity. Value must be between 0 and 1, found: "+r.opacity),r.opacity=void 0));let a=Object.getOwnPropertyNames(t).filter(d=>t[d]!=null);a.push("font"),mt(a,e,r),e.color=Rt(e.color)}static parseOptions(e,t,i=!1,s={},o){if(mt(["color","fixed","shadow"],e,t,i),U.checkMass(t),e.opacity!==void 0&&(U.checkOpacity(e.opacity)||(console.error("Invalid option for node opacity. Value must be between 0 and 1, found: "+e.opacity),e.opacity=void 0)),t.opacity!==void 0&&(U.checkOpacity(t.opacity)||(console.error("Invalid option for node opacity. Value must be between 0 and 1, found: "+t.opacity),t.opacity=void 0)),t.shapeProperties&&!U.checkCoordinateOrigin(t.shapeProperties.coordinateOrigin)&&console.error("Invalid option for node coordinateOrigin, found: "+t.shapeProperties.coordinateOrigin),ae(e,t,"shadow",s),t.color!==void 0&&t.color!==null){let a=Rt(t.color);bi(e.color,a)}else i===!0&&t.color===null&&(e.color=xe(s.color));t.fixed!==void 0&&t.fixed!==null&&(typeof t.fixed=="boolean"?(e.fixed.x=t.fixed,e.fixed.y=t.fixed):(t.fixed.x!==void 0&&typeof t.fixed.x=="boolean"&&(e.fixed.x=t.fixed.x),t.fixed.y!==void 0&&typeof t.fixed.y=="boolean"&&(e.fixed.y=t.fixed.y))),i===!0&&t.font===null&&(e.font=xe(s.font)),U.updateGroupOptions(e,t,o),t.scaling!==void 0&&ae(e.scaling,t.scaling,"label",s.scaling)}getFormattingValues(){let e={color:this.options.color.background,opacity:this.options.opacity,borderWidth:this.options.borderWidth,borderColor:this.options.color.border,size:this.options.size,borderDashes:this.options.shapeProperties.borderDashes,borderRadius:this.options.shapeProperties.borderRadius,shadow:this.options.shadow.enabled,shadowColor:this.options.shadow.color,shadowSize:this.options.shadow.size,shadowX:this.options.shadow.x,shadowY:this.options.shadow.y};if(this.selected||this.hover?this.chooser===!0?this.selected?(this.options.borderWidthSelected!=null?e.borderWidth=this.options.borderWidthSelected:e.borderWidth*=2,e.color=this.options.color.highlight.background,e.borderColor=this.options.color.highlight.border,e.shadow=this.options.shadow.enabled):this.hover&&(e.color=this.options.color.hover.background,e.borderColor=this.options.color.hover.border,e.shadow=this.options.shadow.enabled):typeof this.chooser=="function"&&(this.chooser(e,this.options.id,this.selected,this.hover),e.shadow===!1&&(e.shadowColor!==this.options.shadow.color||e.shadowSize!==this.options.shadow.size||e.shadowX!==this.options.shadow.x||e.shadowY!==this.options.shadow.y)&&(e.shadow=!0)):e.shadow=this.options.shadow.enabled,this.options.opacity!==void 0){let t=this.options.opacity;e.borderColor=re(e.borderColor,t),e.color=re(e.color,t),e.shadowColor=re(e.shadowColor,t)}return e}updateLabelModule(e){(this.options.label===void 0||this.options.label===null)&&(this.options.label=""),U.updateGroupOptions(this.options,St(ye({},e),{color:e&&e.color||this._localColor||void 0}),this.grouplist);let t=this.grouplist.get(this.options.group,!1),i=[e,this.options,t,this.globalOptions,this.defaultOptions];this.labelModule.update(this.options,i),this.labelModule.baseSize!==void 0&&(this.baseFontSize=this.labelModule.baseSize)}updateShape(e){if(e===this.options.shape&&this.shape)this.shape.setOptions(this.options,this.imageObj,this.imageObjAlt);else switch(this.options.shape){case"box":this.shape=new Oo(this.options,this.body,this.labelModule);break;case"circle":this.shape=new Io(this.options,this.body,this.labelModule);break;case"circularImage":this.shape=new Po(this.options,this.body,this.labelModule,this.imageObj,this.imageObjAlt);break;case"custom":this.shape=new Mo(this.options,this.body,this.labelModule,this.options.ctxRenderer);break;case"database":this.shape=new Do(this.options,this.body,this.labelModule);break;case"diamond":this.shape=new Fo(this.options,this.body,this.labelModule);break;case"dot":this.shape=new No(this.options,this.body,this.labelModule);break;case"ellipse":this.shape=new Di(this.options,this.body,this.labelModule);break;case"icon":this.shape=new Bo(this.options,this.body,this.labelModule);break;case"image":this.shape=new Ao(this.options,this.body,this.labelModule,this.imageObj,this.imageObjAlt);break;case"square":this.shape=new zo(this.options,this.body,this.labelModule);break;case"hexagon":this.shape=new Lo(this.options,this.body,this.labelModule);break;case"star":this.shape=new Ro(this.options,this.body,this.labelModule);break;case"text":this.shape=new Ho(this.options,this.body,this.labelModule);break;case"triangle":this.shape=new jo(this.options,this.body,this.labelModule);break;case"triangleDown":this.shape=new Wo(this.options,this.body,this.labelModule);break;default:this.shape=new Di(this.options,this.body,this.labelModule);break}this.needsRefresh()}select(){this.selected=!0,this.needsRefresh()}unselect(){this.selected=!1,this.needsRefresh()}needsRefresh(){this.shape.refreshNeeded=!0}getTitle(){return this.options.title}distanceToBorder(e,t){return this.shape.distanceToBorder(e,t)}isFixed(){return this.options.fixed.x&&this.options.fixed.y}isSelected(){return this.selected}getValue(){return this.options.value}getLabelSize(){return this.labelModule.size()}setValueRange(e,t,i){if(this.options.value!==void 0){let s=this.options.scaling.customScalingFunction(e,t,i,this.options.value),o=this.options.scaling.max-this.options.scaling.min;if(this.options.scaling.label.enabled===!0){let r=this.options.scaling.label.max-this.options.scaling.label.min;this.options.font.size=this.options.scaling.label.min+s*r}this.options.size=this.options.scaling.min+s*o}else this.options.size=this.baseSize,this.options.font.size=this.baseFontSize;this.updateLabelModule()}draw(e){let t=this.getFormattingValues();return this.shape.draw(e,this.x,this.y,this.selected,this.hover,t)||{}}updateBoundingBox(e){this.shape.updateBoundingBox(this.x,this.y,e)}resize(e){let t=this.getFormattingValues();this.shape.resize(e,this.selected,this.hover,t)}getItemsOnPoint(e){let t=[];return this.labelModule.visible()&&Pi(this.labelModule.getSize(),e)&&t.push({nodeId:this.id,labelId:0}),Pi(this.shape.boundingBox,e)&&t.push({nodeId:this.id}),t}isOverlappingWith(e){return this.shape.lefte.left&&this.shape.tope.top}isBoundingBoxOverlappingWith(e){return this.shape.boundingBox.lefte.left&&this.shape.boundingBox.tope.top}static checkMass(e,t){if(e.mass!==void 0&&e.mass<=0){let i="";t!==void 0&&(i=" in node id: "+t),console.error("%cNegative or zero mass disallowed"+i+", setting mass to 1.",Ei),e.mass=1}}},Vo=class{constructor(e,t,i,s){if(this.body=e,this.images=t,this.groups=i,this.layoutEngine=s,this.body.functions.createNode=this.create.bind(this),this.nodesListeners={add:(o,r)=>{this.add(r.items)},update:(o,r)=>{this.update(r.items,r.data,r.oldData)},remove:(o,r)=>{this.remove(r.items)}},this.defaultOptions={borderWidth:1,borderWidthSelected:void 0,brokenImage:void 0,color:{border:"#2B7CE9",background:"#97C2FC",highlight:{border:"#2B7CE9",background:"#D2E5FF"},hover:{border:"#2B7CE9",background:"#D2E5FF"}},opacity:void 0,fixed:{x:!1,y:!1},font:{color:"#343434",size:14,face:"arial",background:"none",strokeWidth:0,strokeColor:"#ffffff",align:"center",vadjust:0,multi:!1,bold:{mod:"bold"},boldital:{mod:"bold italic"},ital:{mod:"italic"},mono:{mod:"",size:15,face:"monospace",vadjust:2}},group:void 0,hidden:!1,icon:{face:"FontAwesome",code:void 0,size:50,color:"#2B7CE9"},image:void 0,imagePadding:{top:0,right:0,bottom:0,left:0},label:void 0,labelHighlightBold:!0,level:void 0,margin:{top:5,right:5,bottom:5,left:5},mass:1,physics:!0,scaling:{min:10,max:30,label:{enabled:!1,min:14,max:30,maxVisible:30,drawThreshold:5},customScalingFunction:function(o,r,a,d){if(r===o)return .5;{let h=1/(r-o);return Math.max(0,(d-o)*h)}}},shadow:{enabled:!1,color:"rgba(0,0,0,0.5)",size:10,x:5,y:5},shape:"ellipse",shapeProperties:{borderDashes:!1,borderRadius:6,interpolation:!0,useImageSize:!1,useBorderWithImage:!1,coordinateOrigin:"center"},size:25,title:void 0,value:void 0,x:void 0,y:void 0},this.defaultOptions.mass<=0)throw"Internal error: mass in defaultOptions of NodesHandler may not be zero or negative";this.options=xe(this.defaultOptions),this.bindEventListeners()}bindEventListeners(){this.body.emitter.on("refreshNodes",this.refresh.bind(this)),this.body.emitter.on("refresh",this.refresh.bind(this)),this.body.emitter.on("destroy",()=>{A(this.nodesListeners,(e,t)=>{this.body.data.nodes&&this.body.data.nodes.off(t,e)}),delete this.body.functions.createNode,delete this.nodesListeners.add,delete this.nodesListeners.update,delete this.nodesListeners.remove,delete this.nodesListeners})}setOptions(e){if(e!==void 0){if(U.parseOptions(this.options,e),e.opacity!==void 0&&(Number.isNaN(e.opacity)||!Number.isFinite(e.opacity)||e.opacity<0||e.opacity>1?console.error("Invalid option for node opacity. Value must be between 0 and 1, found: "+e.opacity):this.options.opacity=e.opacity),e.shape!==void 0)for(let t in this.body.nodes)Object.prototype.hasOwnProperty.call(this.body.nodes,t)&&this.body.nodes[t].updateShape();if(typeof e.font!="undefined"||typeof e.widthConstraint!="undefined"||typeof e.heightConstraint!="undefined")for(let t of Object.keys(this.body.nodes))this.body.nodes[t].updateLabelModule(),this.body.nodes[t].needsRefresh();if(e.size!==void 0)for(let t in this.body.nodes)Object.prototype.hasOwnProperty.call(this.body.nodes,t)&&this.body.nodes[t].needsRefresh();(e.hidden!==void 0||e.physics!==void 0)&&this.body.emitter.emit("_dataChanged")}}setData(e,t=!1){let i=this.body.data.nodes;if(Ci("id",e))this.body.data.nodes=e;else if(Array.isArray(e))this.body.data.nodes=new fe,this.body.data.nodes.add(e);else if(!e)this.body.data.nodes=new fe;else throw new TypeError("Array or DataSet expected");if(i&&A(this.nodesListeners,function(s,o){i.off(o,s)}),this.body.nodes={},this.body.data.nodes){let s=this;A(this.nodesListeners,function(r,a){s.body.data.nodes.on(a,r)});let o=this.body.data.nodes.getIds();this.add(o,!0)}t===!1&&this.body.emitter.emit("_dataChanged")}add(e,t=!1){let i,s=[];for(let o=0;o{let s=this.body.data.nodes.get(i);s!==void 0&&(e===!0&&t.setOptions({x:null,y:null}),t.setOptions({fixed:!1}),t.setOptions(s))})}getPositions(e){let t={};if(e!==void 0){if(Array.isArray(e)===!0){for(let i=0;i{this.body.emitter.emit("startSimulation")},0)):console.error("Node id supplied to moveNode does not exist. Provided: ",e)}},G=class{static transform(e,t){Array.isArray(e)||(e=[e]);let i=t.point.x,s=t.point.y,o=t.angle,r=t.length;for(let a=0;a0?d>0?r=p:a=p:d>0?a=p:r=p,++C}while(r<=a&&C1?l=1:l<0&&(l=0);let c=e+l*a,u=t+l*d,p=c-o,b=u-r;return Math.sqrt(p*p+b*b)}getArrowData(e,t,i,s,o,r){let a,d,h,l,c,u,p,b=r.width;t==="from"?(h=this.from,l=this.to,c=r.fromArrowScale<0,u=Math.abs(r.fromArrowScale),p=r.fromArrowType):t==="to"?(h=this.to,l=this.from,c=r.toArrowScale<0,u=Math.abs(r.toArrowScale),p=r.toArrowType):(h=this.to,l=this.from,c=r.middleArrowScale<0,u=Math.abs(r.middleArrowScale),p=r.middleArrowType);let C=15*u+3*b;if(h!=l){let v=Math.hypot(h.x-l.x,h.y-l.y),_=C/v;if(t!=="middle")if(this.options.smooth.enabled===!0){let E=this._findBorderPosition(h,e,{via:i}),T=this.getPoint(E.t+_*(t==="from"?1:-1),i);a=Math.atan2(E.y-T.y,E.x-T.x),d=E}else a=Math.atan2(h.y-l.y,h.x-l.x),d=this._findBorderPosition(h,e);else{let E=(c?-_:_)/2,T=this.getPoint(.5+E,i),x=this.getPoint(.5-E,i);a=Math.atan2(T.y-x.y,T.x-x.x),d=this.getPoint(.5,i)}}else{let[v,_,E]=this._getCircleData(e);if(t==="from"){let T=this.options.selfReference.angle,x=this.options.selfReference.angle+Math.PI,w=this._findBorderPositionCircle(this.from,e,{x:v,y:_,low:T,high:x,direction:-1});a=w.t*-2*Math.PI+1.5*Math.PI+.1*Math.PI,d=w}else if(t==="to"){let T=this.options.selfReference.angle,x=this.options.selfReference.angle+Math.PI,w=this._findBorderPositionCircle(this.from,e,{x:v,y:_,low:T,high:x,direction:1});a=w.t*-2*Math.PI+1.5*Math.PI-1.1*Math.PI,d=w}else{let T=this.options.selfReference.angle/(2*Math.PI);d=this._pointOnCircle(v,_,E,T),a=T*-2*Math.PI+1.5*Math.PI+.1*Math.PI}}let f=d.x-C*.9*Math.cos(a),g=d.y-C*.9*Math.sin(a);return{point:d,core:{x:f,y:g},angle:a,length:C,type:p}}drawArrowHead(e,t,i,s,o){e.strokeStyle=this.getColor(e,t),e.fillStyle=e.strokeStyle,e.lineWidth=t.width,Fi.draw(e,o)&&(this.enableShadow(e,t),e.fill(),this.disableShadow(e,t))}enableShadow(e,t){t.shadow===!0&&(e.shadowColor=t.shadowColor,e.shadowBlur=t.shadowSize,e.shadowOffsetX=t.shadowX,e.shadowOffsetY=t.shadowY)}disableShadow(e,t){t.shadow===!0&&(e.shadowColor="rgba(0,0,0,0)",e.shadowBlur=0,e.shadowOffsetX=0,e.shadowOffsetY=0)}drawBackground(e,t){if(t.background!==!1){let i={strokeStyle:e.strokeStyle,lineWidth:e.lineWidth,dashes:e.dashes};e.strokeStyle=t.backgroundColor,e.lineWidth=t.backgroundSize,this.setStrokeDashed(e,t.backgroundDashes),e.stroke(),e.strokeStyle=i.strokeStyle,e.lineWidth=i.lineWidth,e.dashes=i.dashes,this.setStrokeDashed(e,t.dashes)}}setStrokeDashed(e,t){if(t!==!1)if(e.setLineDash!==void 0){let i=Array.isArray(t)?t:[5,5];e.setLineDash(i)}else console.warn("setLineDash is not supported in this browser. The dashed stroke cannot be used.");else e.setLineDash!==void 0?e.setLineDash([]):console.warn("setLineDash is not supported in this browser. The dashed stroke cannot be used.")}},Zt=class extends Ni{constructor(e,t,i){super(e,t,i)}_findBorderPositionBezier(e,t,i=this._getViaCoordinates()){let s=10,o=.2,r=!1,a=1,d=0,h=this.to,l,c,u=this.options.endPointOffset?this.options.endPointOffset.to:0;e.id===this.from.id&&(h=this.from,r=!0,u=this.options.endPointOffset?this.options.endPointOffset.from:0),this.options.arrowStrikethrough===!1&&(u=0);let p=0;do{c=(d+a)*.5,l=this.getPoint(c,i);let b=Math.atan2(h.y-l.y,h.x-l.x),C=h.distanceToBorder(t,b)+u,f=Math.sqrt(Math.pow(l.x-h.x,2)+Math.pow(l.y-h.y,2)),g=C-f;if(Math.abs(g)0&&(h=this._getDistanceToLine(b,C,u,p,o,r),d=h{this.positionBezierNode()},this._body.emitter.on("_repositionBezierNodes",this._boundFunction)}setOptions(e){super.setOptions(e);let t=!1;this.options.physics!==e.physics&&(t=!0),this.options=e,this.id=this.options.id,this.from=this._body.nodes[this.options.from],this.to=this._body.nodes[this.options.to],this.setupSupportNode(),this.connect(),t===!0&&(this.via.setOptions({physics:this.options.physics}),this.positionBezierNode())}connect(){this.from=this._body.nodes[this.options.from],this.to=this._body.nodes[this.options.to],this.from===void 0||this.to===void 0||this.options.physics===!1?this.via.setOptions({physics:!1}):this.from.id===this.to.id?this.via.setOptions({physics:!1}):this.via.setOptions({physics:!0})}cleanup(){return this._body.emitter.off("_repositionBezierNodes",this._boundFunction),this.via!==void 0?(delete this._body.nodes[this.via.id],this.via=void 0,!0):!1}setupSupportNode(){if(this.via===void 0){let e="edgeId:"+this.id,t=this._body.functions.createNode({id:e,shape:"circle",physics:!0,hidden:!0});this._body.nodes[e]=t,this.via=t,this.via.parentEdgeId=this.id,this.positionBezierNode()}}positionBezierNode(){this.via!==void 0&&this.from!==void 0&&this.to!==void 0?(this.via.x=.5*(this.from.x+this.to.x),this.via.y=.5*(this.from.y+this.to.y)):this.via!==void 0&&(this.via.x=0,this.via.y=0)}_line(e,t,i){this._bezierCurve(e,t,i)}_getViaCoordinates(){return this.via}getViaNode(){return this.via}getPoint(e,t=this.via){if(this.from===this.to){let[i,s,o]=this._getCircleData(),r=2*Math.PI*(1-e);return{x:i+o*Math.sin(r),y:s+o-o*(1-Math.cos(r))}}else return{x:Math.pow(1-e,2)*this.fromPoint.x+2*e*(1-e)*t.x+Math.pow(e,2)*this.toPoint.x,y:Math.pow(1-e,2)*this.fromPoint.y+2*e*(1-e)*t.y+Math.pow(e,2)*this.toPoint.y}}_findBorderPosition(e,t){return this._findBorderPositionBezier(e,t,this.via)}_getDistanceToEdge(e,t,i,s,o,r){return this._getDistanceToBezierEdge(e,t,i,s,o,r,this.via)}},Ai=class extends Zt{constructor(e,t,i){super(e,t,i)}_line(e,t,i){this._bezierCurve(e,t,i)}getViaNode(){return this._getViaCoordinates()}_getViaCoordinates(){let e=this.options.smooth.roundness,t=this.options.smooth.type,i=Math.abs(this.from.x-this.to.x),s=Math.abs(this.from.y-this.to.y);if(t==="discrete"||t==="diagonalCross"){let o,r;i<=s?o=r=e*s:o=r=e*i,this.from.x>this.to.x&&(o=-o),this.from.y>=this.to.y&&(r=-r);let a=this.from.x+o,d=this.from.y+r;return t==="discrete"&&(i<=s?a=ithis.to.x&&(o=-o),this.from.y>=this.to.y&&(r=-r);let a=this.from.x+o,d=this.from.y+r;return i<=s?this.from.x<=this.to.x?a=this.to.xa?this.to.x:a:this.from.y>=this.to.y?d=this.to.y>d?this.to.y:d:d=this.to.y0){let g=this._getDistanceToLine(l,c,C,f,o,r);h=gMath.abs(t)||this.options.smooth.forceDirection===!0||this.options.smooth.forceDirection==="horizontal")&&this.options.smooth.forceDirection!=="vertical"?(s=this.from.y,r=this.to.y,i=this.from.x-a*e,o=this.to.x+a*e):(s=this.from.y-a*t,r=this.to.y+a*t,i=this.from.x,o=this.to.x),[{x:i,y:s},{x:o,y:r}]}getViaNode(){return this._getViaCoordinates()}_findBorderPosition(e,t){return this._findBorderPositionBezier(e,t)}_getDistanceToEdge(e,t,i,s,o,r,[a,d]=this._getViaCoordinates()){return this._getDistanceToBezierEdge2(e,t,i,s,o,r,a,d)}getPoint(e,[t,i]=this._getViaCoordinates()){let s=e,o=[Math.pow(1-s,3),3*s*Math.pow(1-s,2),3*Math.pow(s,2)*(1-s),Math.pow(s,3)],r=o[0]*this.fromPoint.x+o[1]*t.x+o[2]*i.x+o[3]*this.toPoint.x,a=o[0]*this.fromPoint.y+o[1]*t.y+o[2]*i.y+o[3]*this.toPoint.y;return{x:r,y:a}}},Li=class extends Ni{constructor(e,t,i){super(e,t,i)}_line(e,t){e.beginPath(),e.moveTo(this.fromPoint.x,this.fromPoint.y),e.lineTo(this.toPoint.x,this.toPoint.y),this.enableShadow(e,t),e.stroke(),this.disableShadow(e,t)}getViaNode(){}getPoint(e){return{x:(1-e)*this.fromPoint.x+e*this.toPoint.x,y:(1-e)*this.fromPoint.y+e*this.toPoint.y}}_findBorderPosition(e,t){let i=this.to,s=this.from;e.id===this.from.id&&(i=this.from,s=this.to);let o=Math.atan2(i.y-s.y,i.x-s.x),r=i.x-s.x,a=i.y-s.y,d=Math.sqrt(r*r+a*a),h=e.distanceToBorder(t,o),l=(d-h)/d;return{x:(1-l)*s.x+l*i.x,y:(1-l)*s.y+l*i.y,t:0}}_getDistanceToEdge(e,t,i,s,o,r){return this._getDistanceToLine(e,t,i,s,o,r)}},Se=class{constructor(e,t,i,s,o){if(t===void 0)throw new Error("No body provided");this.options=xe(s),this.globalOptions=s,this.defaultOptions=o,this.body=t,this.imagelist=i,this.id=void 0,this.fromId=void 0,this.toId=void 0,this.selected=!1,this.hover=!1,this.labelDirty=!0,this.baseWidth=this.options.width,this.baseFontSize=this.options.font.size,this.from=void 0,this.to=void 0,this.edgeType=void 0,this.connected=!1,this.labelModule=new Ue(this.body,this.options,!0),this.setOptions(e)}setOptions(e){if(!e)return;let t=typeof e.physics!="undefined"&&this.options.physics!==e.physics||typeof e.hidden!="undefined"&&(this.options.hidden||!1)!==(e.hidden||!1)||typeof e.from!="undefined"&&this.options.from!==e.from||typeof e.to!="undefined"&&this.options.to!==e.to;Se.parseOptions(this.options,e,!0,this.globalOptions),e.id!==void 0&&(this.id=e.id),e.from!==void 0&&(this.fromId=e.from),e.to!==void 0&&(this.toId=e.to),e.title!==void 0&&(this.title=e.title),e.value!==void 0&&(e.value=parseFloat(e.value));let i=[e,this.options,this.defaultOptions];return this.chooser=Ii("edge",i),this.updateLabelModule(e),t=this.updateEdgeType()||t,this._setInteractionWidths(),this.connect(),t}static parseOptions(e,t,i=!1,s={},o=!1){if(Ve(["endPointOffset","arrowStrikethrough","id","from","hidden","hoverWidth","labelHighlightBold","length","line","opacity","physics","scaling","selectionWidth","selfReferenceSize","selfReference","to","title","value","width","font","chosen","widthConstraint"],e,t,i),t.endPointOffset!==void 0&&t.endPointOffset.from!==void 0&&(Number.isFinite(t.endPointOffset.from)?e.endPointOffset.from=t.endPointOffset.from:(e.endPointOffset.from=s.endPointOffset.from!==void 0?s.endPointOffset.from:0,console.error("endPointOffset.from is not a valid number"))),t.endPointOffset!==void 0&&t.endPointOffset.to!==void 0&&(Number.isFinite(t.endPointOffset.to)?e.endPointOffset.to=t.endPointOffset.to:(e.endPointOffset.to=s.endPointOffset.to!==void 0?s.endPointOffset.to:0,console.error("endPointOffset.to is not a valid number"))),Xt(t.label)?e.label=t.label:Xt(e.label)||(e.label=void 0),ae(e,t,"smooth",s),ae(e,t,"shadow",s),ae(e,t,"background",s),t.dashes!==void 0&&t.dashes!==null?e.dashes=t.dashes:i===!0&&t.dashes===null&&(e.dashes=Object.create(s.dashes)),t.scaling!==void 0&&t.scaling!==null?(t.scaling.min!==void 0&&(e.scaling.min=t.scaling.min),t.scaling.max!==void 0&&(e.scaling.max=t.scaling.max),ae(e.scaling,t.scaling,"label",s.scaling)):i===!0&&t.scaling===null&&(e.scaling=Object.create(s.scaling)),t.arrows!==void 0&&t.arrows!==null)if(typeof t.arrows=="string"){let a=t.arrows.toLowerCase();e.arrows.to.enabled=a.indexOf("to")!=-1,e.arrows.middle.enabled=a.indexOf("middle")!=-1,e.arrows.from.enabled=a.indexOf("from")!=-1}else if(typeof t.arrows=="object")ae(e.arrows,t.arrows,"to",s.arrows),ae(e.arrows,t.arrows,"middle",s.arrows),ae(e.arrows,t.arrows,"from",s.arrows);else throw new Error("The arrow newOptions can only be an object or a string. Refer to the documentation. You used:"+JSON.stringify(t.arrows));else i===!0&&t.arrows===null&&(e.arrows=Object.create(s.arrows));if(t.color!==void 0&&t.color!==null){let a=Ee(t.color)?{color:t.color,highlight:t.color,hover:t.color,inherit:!1,opacity:1}:t.color,d=e.color;if(o)j(d,s.color,!1,i);else for(let h in d)Object.prototype.hasOwnProperty.call(d,h)&&delete d[h];if(Ee(d))d.color=d,d.highlight=d,d.hover=d,d.inherit=!1,a.opacity===void 0&&(d.opacity=1);else{let h=!1;a.color!==void 0&&(d.color=a.color,h=!0),a.highlight!==void 0&&(d.highlight=a.highlight,h=!0),a.hover!==void 0&&(d.hover=a.hover,h=!0),a.inherit!==void 0&&(d.inherit=a.inherit),a.opacity!==void 0&&(d.opacity=Math.min(1,Math.max(0,a.opacity))),h===!0?d.inherit=!1:d.inherit===void 0&&(d.inherit="from")}}else i===!0&&t.color===null&&(e.color=xe(s.color));i===!0&&t.font===null&&(e.font=xe(s.font)),Object.prototype.hasOwnProperty.call(t,"selfReferenceSize")&&(console.warn("The selfReferenceSize property has been deprecated. Please use selfReference property instead. The selfReference can be set like thise selfReference:{size:30, angle:Math.PI / 4}"),e.selfReference.size=t.selfReferenceSize)}getFormattingValues(){let e=this.options.arrows.to===!0||this.options.arrows.to.enabled===!0,t=this.options.arrows.from===!0||this.options.arrows.from.enabled===!0,i=this.options.arrows.middle===!0||this.options.arrows.middle.enabled===!0,s=this.options.color.inherit,o={toArrow:e,toArrowScale:this.options.arrows.to.scaleFactor,toArrowType:this.options.arrows.to.type,toArrowSrc:this.options.arrows.to.src,toArrowImageWidth:this.options.arrows.to.imageWidth,toArrowImageHeight:this.options.arrows.to.imageHeight,middleArrow:i,middleArrowScale:this.options.arrows.middle.scaleFactor,middleArrowType:this.options.arrows.middle.type,middleArrowSrc:this.options.arrows.middle.src,middleArrowImageWidth:this.options.arrows.middle.imageWidth,middleArrowImageHeight:this.options.arrows.middle.imageHeight,fromArrow:t,fromArrowScale:this.options.arrows.from.scaleFactor,fromArrowType:this.options.arrows.from.type,fromArrowSrc:this.options.arrows.from.src,fromArrowImageWidth:this.options.arrows.from.imageWidth,fromArrowImageHeight:this.options.arrows.from.imageHeight,arrowStrikethrough:this.options.arrowStrikethrough,color:s?void 0:this.options.color.color,inheritsColor:s,opacity:this.options.color.opacity,hidden:this.options.hidden,length:this.options.length,shadow:this.options.shadow.enabled,shadowColor:this.options.shadow.color,shadowSize:this.options.shadow.size,shadowX:this.options.shadow.x,shadowY:this.options.shadow.y,dashes:this.options.dashes,width:this.options.width,background:this.options.background.enabled,backgroundColor:this.options.background.color,backgroundSize:this.options.background.size,backgroundDashes:this.options.background.dashes};if(this.selected||this.hover)if(this.chooser===!0){if(this.selected){let r=this.options.selectionWidth;typeof r=="function"?o.width=r(o.width):typeof r=="number"&&(o.width+=r),o.width=Math.max(o.width,.3/this.body.view.scale),o.color=this.options.color.highlight,o.shadow=this.options.shadow.enabled}else if(this.hover){let r=this.options.hoverWidth;typeof r=="function"?o.width=r(o.width):typeof r=="number"&&(o.width+=r),o.width=Math.max(o.width,.3/this.body.view.scale),o.color=this.options.color.hover,o.shadow=this.options.shadow.enabled}}else typeof this.chooser=="function"&&(this.chooser(o,this.options.id,this.selected,this.hover),o.color!==void 0&&(o.inheritsColor=!1),o.shadow===!1&&(o.shadowColor!==this.options.shadow.color||o.shadowSize!==this.options.shadow.size||o.shadowX!==this.options.shadow.x||o.shadowY!==this.options.shadow.y)&&(o.shadow=!0));else o.shadow=this.options.shadow.enabled,o.width=Math.max(o.width,.3/this.body.view.scale);return o}updateLabelModule(e){let t=[e,this.options,this.globalOptions,this.defaultOptions];this.labelModule.update(this.options,t),this.labelModule.baseSize!==void 0&&(this.baseFontSize=this.labelModule.baseSize)}updateEdgeType(){let e=this.options.smooth,t=!1,i=!0;return this.edgeType!==void 0&&((this.edgeType instanceof Bi&&e.enabled===!0&&e.type==="dynamic"||this.edgeType instanceof zi&&e.enabled===!0&&e.type==="cubicBezier"||this.edgeType instanceof Ai&&e.enabled===!0&&e.type!=="dynamic"&&e.type!=="cubicBezier"||this.edgeType instanceof Li&&e.type.enabled===!1)&&(i=!1),i===!0&&(t=this.cleanup())),i===!0?e.enabled===!0?e.type==="dynamic"?(t=!0,this.edgeType=new Bi(this.options,this.body,this.labelModule)):e.type==="cubicBezier"?this.edgeType=new zi(this.options,this.body,this.labelModule):this.edgeType=new Ai(this.options,this.body,this.labelModule):this.edgeType=new Li(this.options,this.body,this.labelModule):this.edgeType.setOptions(this.options),t}connect(){this.disconnect(),this.from=this.body.nodes[this.fromId]||void 0,this.to=this.body.nodes[this.toId]||void 0,this.connected=this.from!==void 0&&this.to!==void 0,this.connected===!0?(this.from.attachEdge(this),this.to.attachEdge(this)):(this.from&&this.from.detachEdge(this),this.to&&this.to.detachEdge(this)),this.edgeType.connect()}disconnect(){this.from&&(this.from.detachEdge(this),this.from=void 0),this.to&&(this.to.detachEdge(this),this.to=void 0),this.connected=!1}getTitle(){return this.title}isSelected(){return this.selected}getValue(){return this.options.value}setValueRange(e,t,i){if(this.options.value!==void 0){let s=this.options.scaling.customScalingFunction(e,t,i,this.options.value),o=this.options.scaling.max-this.options.scaling.min;if(this.options.scaling.label.enabled===!0){let r=this.options.scaling.label.max-this.options.scaling.label.min;this.options.font.size=this.options.scaling.label.min+s*r}this.options.width=this.options.scaling.min+s*o}else this.options.width=this.baseWidth,this.options.font.size=this.baseFontSize;this._setInteractionWidths(),this.updateLabelModule()}_setInteractionWidths(){typeof this.options.hoverWidth=="function"?this.edgeType.hoverWidth=this.options.hoverWidth(this.options.width):this.edgeType.hoverWidth=this.options.hoverWidth+this.options.width,typeof this.options.selectionWidth=="function"?this.edgeType.selectionWidth=this.options.selectionWidth(this.options.width):this.edgeType.selectionWidth=this.options.selectionWidth+this.options.width}draw(e){let t=this.getFormattingValues();if(t.hidden)return;let i=this.edgeType.getViaNode();this.edgeType.drawLine(e,t,this.selected,this.hover,i),this.drawLabel(e,i)}drawArrows(e){let t=this.getFormattingValues();if(t.hidden)return;let i=this.edgeType.getViaNode(),s={};this.edgeType.fromPoint=this.edgeType.from,this.edgeType.toPoint=this.edgeType.to,t.fromArrow&&(s.from=this.edgeType.getArrowData(e,"from",i,this.selected,this.hover,t),t.arrowStrikethrough===!1&&(this.edgeType.fromPoint=s.from.core),t.fromArrowSrc&&(s.from.image=this.imagelist.load(t.fromArrowSrc)),t.fromArrowImageWidth&&(s.from.imageWidth=t.fromArrowImageWidth),t.fromArrowImageHeight&&(s.from.imageHeight=t.fromArrowImageHeight)),t.toArrow&&(s.to=this.edgeType.getArrowData(e,"to",i,this.selected,this.hover,t),t.arrowStrikethrough===!1&&(this.edgeType.toPoint=s.to.core),t.toArrowSrc&&(s.to.image=this.imagelist.load(t.toArrowSrc)),t.toArrowImageWidth&&(s.to.imageWidth=t.toArrowImageWidth),t.toArrowImageHeight&&(s.to.imageHeight=t.toArrowImageHeight)),t.middleArrow&&(s.middle=this.edgeType.getArrowData(e,"middle",i,this.selected,this.hover,t),t.middleArrowSrc&&(s.middle.image=this.imagelist.load(t.middleArrowSrc)),t.middleArrowImageWidth&&(s.middle.imageWidth=t.middleArrowImageWidth),t.middleArrowImageHeight&&(s.middle.imageHeight=t.middleArrowImageHeight)),t.fromArrow&&this.edgeType.drawArrowHead(e,t,this.selected,this.hover,s.from),t.middleArrow&&this.edgeType.drawArrowHead(e,t,this.selected,this.hover,s.middle),t.toArrow&&this.edgeType.drawArrowHead(e,t,this.selected,this.hover,s.to)}drawLabel(e,t){if(this.options.label!==void 0){let i=this.from,s=this.to;this.labelModule.differentState(this.selected,this.hover)&&this.labelModule.getTextSize(e,this.selected,this.hover);let o;if(i.id!=s.id){this.labelModule.pointToSelf=!1,o=this.edgeType.getPoint(.5,t),e.save();let r=this._getRotation(e);r.angle!=0&&(e.translate(r.x,r.y),e.rotate(r.angle)),this.labelModule.draw(e,o.x,o.y,this.selected,this.hover),e.restore()}else{this.labelModule.pointToSelf=!0;let r=To(e,this.options.selfReference.angle,this.options.selfReference.size,i);o=this._pointOnCircle(r.x,r.y,this.options.selfReference.size,this.options.selfReference.angle),this.labelModule.draw(e,o.x,o.y,this.selected,this.hover)}}}getItemsOnPoint(e){let t=[];if(this.labelModule.visible()){let s=this._getRotation();Pi(this.labelModule.getSize(),e,s)&&t.push({edgeId:this.id,labelId:0})}let i={left:e.x,top:e.y};return this.isOverlappingWith(i)&&t.push({edgeId:this.id}),t}isOverlappingWith(e){if(this.connected){let t=10,i=this.from.x,s=this.from.y,o=this.to.x,r=this.to.y,a=e.left,d=e.top;return this.edgeType.getDistanceToEdge(i,s,o,r,a,d)0&&r<0)&&(a+=Math.PI),s.angle=a,s}_pointOnCircle(e,t,i,s){return{x:e+i*Math.cos(s),y:t-i*Math.sin(s)}}select(){this.selected=!0}unselect(){this.selected=!1}cleanup(){return this.edgeType.cleanup()}remove(){this.cleanup(),this.disconnect(),delete this.body.edges[this.id]}endPointsValid(){return this.body.nodes[this.fromId]!==void 0&&this.body.nodes[this.toId]!==void 0}},on=class{constructor(e,t,i){this.body=e,this.images=t,this.groups=i,this.body.functions.createEdge=this.create.bind(this),this.edgesListeners={add:(s,o)=>{this.add(o.items)},update:(s,o)=>{this.update(o.items)},remove:(s,o)=>{this.remove(o.items)}},this.options={},this.defaultOptions={arrows:{to:{enabled:!1,scaleFactor:1,type:"arrow"},middle:{enabled:!1,scaleFactor:1,type:"arrow"},from:{enabled:!1,scaleFactor:1,type:"arrow"}},endPointOffset:{from:0,to:0},arrowStrikethrough:!0,color:{color:"#848484",highlight:"#848484",hover:"#848484",inherit:"from",opacity:1},dashes:!1,font:{color:"#343434",size:14,face:"arial",background:"none",strokeWidth:2,strokeColor:"#ffffff",align:"horizontal",multi:!1,vadjust:0,bold:{mod:"bold"},boldital:{mod:"bold italic"},ital:{mod:"italic"},mono:{mod:"",size:15,face:"courier new",vadjust:2}},hidden:!1,hoverWidth:1.5,label:void 0,labelHighlightBold:!0,length:void 0,physics:!0,scaling:{min:1,max:15,label:{enabled:!0,min:14,max:30,maxVisible:30,drawThreshold:5},customScalingFunction:function(s,o,r,a){if(o===s)return .5;{let d=1/(o-s);return Math.max(0,(a-s)*d)}}},selectionWidth:1.5,selfReference:{size:20,angle:Math.PI/4,renderBehindTheNode:!0},shadow:{enabled:!1,color:"rgba(0,0,0,0.5)",size:10,x:5,y:5},background:{enabled:!1,color:"rgba(111,111,111,1)",size:10,dashes:!1},smooth:{enabled:!0,type:"dynamic",forceDirection:"none",roundness:.5},title:void 0,width:1,value:void 0},j(this.options,this.defaultOptions),this.bindEventListeners()}bindEventListeners(){this.body.emitter.on("_forceDisableDynamicCurves",(e,t=!0)=>{e==="dynamic"&&(e="continuous");let i=!1;for(let s in this.body.edges)if(Object.prototype.hasOwnProperty.call(this.body.edges,s)){let o=this.body.edges[s],r=this.body.data.edges.get(s);if(r!=null){let a=r.smooth;a!==void 0&&a.enabled===!0&&a.type==="dynamic"&&(e===void 0?o.setOptions({smooth:!1}):o.setOptions({smooth:{type:e}}),i=!0)}}t===!0&&i===!0&&this.body.emitter.emit("_dataChanged")}),this.body.emitter.on("_dataUpdated",()=>{this.reconnectEdges()}),this.body.emitter.on("refreshEdges",this.refresh.bind(this)),this.body.emitter.on("refresh",this.refresh.bind(this)),this.body.emitter.on("destroy",()=>{A(this.edgesListeners,(e,t)=>{this.body.data.edges&&this.body.data.edges.off(t,e)}),delete this.body.functions.createEdge,delete this.edgesListeners.add,delete this.edgesListeners.update,delete this.edgesListeners.remove,delete this.edgesListeners})}setOptions(e){if(e!==void 0){Se.parseOptions(this.options,e,!0,this.defaultOptions,!0);let t=!1;if(e.smooth!==void 0)for(let i in this.body.edges)Object.prototype.hasOwnProperty.call(this.body.edges,i)&&(t=this.body.edges[i].updateEdgeType()||t);if(e.font!==void 0)for(let i in this.body.edges)Object.prototype.hasOwnProperty.call(this.body.edges,i)&&this.body.edges[i].updateLabelModule();(e.hidden!==void 0||e.physics!==void 0||t===!0)&&this.body.emitter.emit("_dataChanged")}}setData(e,t=!1){let i=this.body.data.edges;if(Ci("id",e))this.body.data.edges=e;else if(Array.isArray(e))this.body.data.edges=new fe,this.body.data.edges.add(e);else if(!e)this.body.data.edges=new fe;else throw new TypeError("Array or DataSet expected");if(i&&A(this.edgesListeners,(s,o)=>{i.off(o,s)}),this.body.edges={},this.body.data.edges){A(this.edgesListeners,(o,r)=>{this.body.data.edges.on(r,o)});let s=this.body.data.edges.getIds();this.add(s,!0)}this.body.emitter.emit("_adjustEdgesForHierarchicalLayout"),t===!1&&this.body.emitter.emit("_dataChanged")}add(e,t=!1){let i=this.body.edges,s=this.body.data.edges;for(let o=0;o{let o=i[s];o!==void 0&&o.remove()}),t&&this.body.emitter.emit("_dataChanged")}refresh(){A(this.body.edges,(e,t)=>{let i=this.body.data.edges.get(t);i!==void 0&&e.setOptions(i)})}create(e){return new Se(e,this.body,this.images,this.options,this.defaultOptions)}reconnectEdges(){let e,t=this.body.nodes,i=this.body.edges;for(e in t)Object.prototype.hasOwnProperty.call(t,e)&&(t[e].edges=[]);for(e in i)if(Object.prototype.hasOwnProperty.call(i,e)){let s=i[e];s.from=null,s.to=null,s.connect()}}getConnectedNodes(e){let t=[];if(this.body.edges[e]!==void 0){let i=this.body.edges[e];i.fromId!==void 0&&t.push(i.fromId),i.toId!==void 0&&t.push(i.toId)}return t}_updateState(){this._addMissingEdges(),this._removeInvalidEdges()}_removeInvalidEdges(){let e=[];A(this.body.edges,(t,i)=>{let s=this.body.nodes[t.toId],o=this.body.nodes[t.fromId];s!==void 0&&s.isCluster===!0||o!==void 0&&o.isCluster===!0||(s===void 0||o===void 0)&&e.push(i)}),this.remove(e,!1)}_addMissingEdges(){let e=this.body.data.edges;if(e==null)return;let t=this.body.edges,i=[];e.forEach((s,o)=>{t[o]===void 0&&i.push(o)}),this.add(i,!0)}},Ri=class{constructor(e,t,i){this.body=e,this.physicsBody=t,this.barnesHutTree,this.setOptions(i),this._rng=gt("BARNES HUT SOLVER")}setOptions(e){this.options=e,this.thetaInversed=1/this.options.theta,this.overlapAvoidanceFactor=1-Math.max(0,Math.min(1,this.options.avoidOverlap))}solve(){if(this.options.gravitationalConstant!==0&&this.physicsBody.physicsNodeIndices.length>0){let e,t=this.body.nodes,i=this.physicsBody.physicsNodeIndices,s=i.length,o=this._formBarnesHutTree(t,i);this.barnesHutTree=o;for(let r=0;r0&&this._getForceContributions(o.root,e)}}_getForceContributions(e,t){this._getForceContribution(e.children.NW,t),this._getForceContribution(e.children.NE,t),this._getForceContribution(e.children.SW,t),this._getForceContribution(e.children.SE,t)}_getForceContribution(e,t){if(e.childrenCount>0){let i=e.centerOfMass.x-t.x,s=e.centerOfMass.y-t.y,o=Math.sqrt(i*i+s*s);o*e.calcSize>this.thetaInversed?this._calculateForces(o,i,s,t,e):e.childrenCount===4?this._getForceContributions(e,t):e.children.data.id!=t.id&&this._calculateForces(o,i,s,t,e)}}_calculateForces(e,t,i,s,o){e===0&&(e=.1,t=e),this.overlapAvoidanceFactor<1&&s.shape.radius&&(e=Math.max(.1+this.overlapAvoidanceFactor*s.shape.radius,e-s.shape.radius));let r=this.options.gravitationalConstant*o.mass*s.options.mass/Math.pow(e,3),a=t*r,d=i*r;this.physicsBody.forces[s.id].x+=a,this.physicsBody.forces[s.id].y+=d}_formBarnesHutTree(e,t){let i,s=t.length,o=e[t[0]].x,r=e[t[0]].y,a=e[t[0]].x,d=e[t[0]].y;for(let f=1;f0&&(ma&&(a=m),vd&&(d=v))}let h=Math.abs(a-o)-Math.abs(d-r);h>0?(r-=.5*h,d+=.5*h):(o+=.5*h,a-=.5*h);let c=Math.max(1e-5,Math.abs(a-o)),u=.5*c,p=.5*(o+a),b=.5*(r+d),C={root:{centerOfMass:{x:0,y:0},mass:0,range:{minX:p-u,maxX:p+u,minY:b-u,maxY:b+u},size:c,calcSize:1/c,children:{data:null},maxWidth:0,level:0,childrenCount:4}};this._splitBranch(C.root);for(let f=0;f0&&this._placeInTree(C.root,i);return C}_updateBranchMass(e,t){let i=e.centerOfMass,s=e.mass+t.options.mass,o=1/s;i.x=i.x*e.mass+t.x*t.options.mass,i.x*=o,i.y=i.y*e.mass+t.y*t.options.mass,i.y*=o,e.mass=s;let r=Math.max(Math.max(t.height,t.radius),t.width);e.maxWidth=e.maxWidtht.x?s.maxY>t.y?o="NW":o="SW":s.maxY>t.y?o="NE":o="SE",this._placeInRegion(e,t,o)}_placeInRegion(e,t,i){let s=e.children[i];switch(s.childrenCount){case 0:s.children.data=t,s.childrenCount=1,this._updateBranchMass(s,t);break;case 1:s.children.data.x===t.x&&s.children.data.y===t.y?(t.x+=this._rng(),t.y+=this._rng()):(this._splitBranch(s),this._placeInTree(s,t));break;case 4:this._placeInTree(s,t);break}}_splitBranch(e){let t=null;e.childrenCount===1&&(t=e.children.data,e.mass=0,e.centerOfMass.x=0,e.centerOfMass.y=0),e.childrenCount=4,e.children.data=null,this._insertRegion(e,"NW"),this._insertRegion(e,"NE"),this._insertRegion(e,"SW"),this._insertRegion(e,"SE"),t!=null&&this._placeInTree(e,t)}_insertRegion(e,t){let i,s,o,r,a=.5*e.size;switch(t){case"NW":i=e.range.minX,s=e.range.minX+a,o=e.range.minY,r=e.range.minY+a;break;case"NE":i=e.range.minX+a,s=e.range.maxX,o=e.range.minY,r=e.range.minY+a;break;case"SW":i=e.range.minX,s=e.range.minX+a,o=e.range.minY+a,r=e.range.maxY;break;case"SE":i=e.range.minX+a,s=e.range.maxX,o=e.range.minY+a,r=e.range.maxY;break}e.children[t]={centerOfMass:{x:0,y:0},mass:0,range:{minX:i,maxX:s,minY:o,maxY:r},size:.5*e.size,calcSize:2*e.calcSize,children:{data:null},maxWidth:0,level:e.level+1,childrenCount:0}}_debug(e,t){this.barnesHutTree!==void 0&&(e.lineWidth=1,this._drawBranch(this.barnesHutTree.root,e,t))}_drawBranch(e,t,i){i===void 0&&(i="#FF0000"),e.childrenCount===4&&(this._drawBranch(e.children.NW,t),this._drawBranch(e.children.NE,t),this._drawBranch(e.children.SE,t),this._drawBranch(e.children.SW,t)),t.strokeStyle=i,t.beginPath(),t.moveTo(e.range.minX,e.range.minY),t.lineTo(e.range.maxX,e.range.minY),t.stroke(),t.beginPath(),t.moveTo(e.range.maxX,e.range.minY),t.lineTo(e.range.maxX,e.range.maxY),t.stroke(),t.beginPath(),t.moveTo(e.range.maxX,e.range.maxY),t.lineTo(e.range.minX,e.range.maxY),t.stroke(),t.beginPath(),t.moveTo(e.range.minX,e.range.maxY),t.lineTo(e.range.minX,e.range.minY),t.stroke()}},nn=class{constructor(e,t,i){this._rng=gt("REPULSION SOLVER"),this.body=e,this.physicsBody=t,this.setOptions(i)}setOptions(e){this.options=e}solve(){let e,t,i,s,o,r,a,d,h=this.body.nodes,l=this.physicsBody.physicsNodeIndices,c=this.physicsBody.forces,u=this.options.nodeDistance,p=-2/3/u,b=4/3;for(let C=0;C0){let r=o.edges.length+1,a=this.options.centralGravity*r*o.options.mass;s[o.id].x=t*a,s[o.id].y=i*a}}},ln=class{constructor(e){this.body=e,this.physicsBody={physicsNodeIndices:[],physicsEdgeIndices:[],forces:{},velocities:{}},this.physicsEnabled=!0,this.simulationInterval=1e3/60,this.requiresTimeout=!0,this.previousStates={},this.referenceState={},this.freezeCache={},this.renderTimer=void 0,this.adaptiveTimestep=!1,this.adaptiveTimestepEnabled=!1,this.adaptiveCounter=0,this.adaptiveInterval=3,this.stabilized=!1,this.startedStabilization=!1,this.stabilizationIterations=0,this.ready=!1,this.options={},this.defaultOptions={enabled:!0,barnesHut:{theta:.5,gravitationalConstant:-2e3,centralGravity:.3,springLength:95,springConstant:.04,damping:.09,avoidOverlap:0},forceAtlas2Based:{theta:.5,gravitationalConstant:-50,centralGravity:.01,springConstant:.08,springLength:100,damping:.4,avoidOverlap:0},repulsion:{centralGravity:.2,springLength:200,springConstant:.05,nodeDistance:100,damping:.09,avoidOverlap:0},hierarchicalRepulsion:{centralGravity:0,springLength:100,springConstant:.01,nodeDistance:120,damping:.09},maxVelocity:50,minVelocity:.75,solver:"barnesHut",stabilization:{enabled:!0,iterations:1e3,updateInterval:50,onlyDynamicEdges:!1,fit:!0},timestep:.5,adaptiveTimestep:!0,wind:{x:0,y:0}},Object.assign(this.options,this.defaultOptions),this.timestep=.5,this.layoutFailed=!1,this.bindEventListeners()}bindEventListeners(){this.body.emitter.on("initPhysics",()=>{this.initPhysics()}),this.body.emitter.on("_layoutFailed",()=>{this.layoutFailed=!0}),this.body.emitter.on("resetPhysics",()=>{this.stopSimulation(),this.ready=!1}),this.body.emitter.on("disablePhysics",()=>{this.physicsEnabled=!1,this.stopSimulation()}),this.body.emitter.on("restorePhysics",()=>{this.setOptions(this.options),this.ready===!0&&this.startSimulation()}),this.body.emitter.on("startSimulation",()=>{this.ready===!0&&this.startSimulation()}),this.body.emitter.on("stopSimulation",()=>{this.stopSimulation()}),this.body.emitter.on("destroy",()=>{this.stopSimulation(!1),this.body.emitter.off()}),this.body.emitter.on("_dataChanged",()=>{this.updatePhysicsData()})}setOptions(e){if(e!==void 0)if(e===!1)this.options.enabled=!1,this.physicsEnabled=!1,this.stopSimulation();else if(e===!0)this.options.enabled=!0,this.physicsEnabled=!0,this.startSimulation();else{this.physicsEnabled=!0,mt(["stabilization"],this.options,e),ae(this.options,e,"stabilization"),e.enabled===void 0&&(this.options.enabled=!0),this.options.enabled===!1&&(this.physicsEnabled=!1,this.stopSimulation());let t=this.options.wind;t&&((typeof t.x!="number"||Number.isNaN(t.x))&&(t.x=0),(typeof t.y!="number"||Number.isNaN(t.y))&&(t.y=0)),this.timestep=this.options.timestep}this.init()}init(){let e;this.options.solver==="forceAtlas2Based"?(e=this.options.forceAtlas2Based,this.nodesSolver=new dn(this.body,this.physicsBody,e),this.edgesSolver=new Qt(this.body,this.physicsBody,e),this.gravitySolver=new hn(this.body,this.physicsBody,e)):this.options.solver==="repulsion"?(e=this.options.repulsion,this.nodesSolver=new nn(this.body,this.physicsBody,e),this.edgesSolver=new Qt(this.body,this.physicsBody,e),this.gravitySolver=new Et(this.body,this.physicsBody,e)):this.options.solver==="hierarchicalRepulsion"?(e=this.options.hierarchicalRepulsion,this.nodesSolver=new rn(this.body,this.physicsBody,e),this.edgesSolver=new an(this.body,this.physicsBody,e),this.gravitySolver=new Et(this.body,this.physicsBody,e)):(e=this.options.barnesHut,this.nodesSolver=new Ri(this.body,this.physicsBody,e),this.edgesSolver=new Qt(this.body,this.physicsBody,e),this.gravitySolver=new Et(this.body,this.physicsBody,e)),this.modelOptions=e}initPhysics(){this.physicsEnabled===!0&&this.options.enabled===!0?this.options.stabilization.enabled===!0?this.stabilize():(this.stabilized=!1,this.ready=!0,this.body.emitter.emit("fit",{},this.layoutFailed),this.startSimulation()):(this.ready=!0,this.body.emitter.emit("fit"))}startSimulation(){this.physicsEnabled===!0&&this.options.enabled===!0?(this.stabilized=!1,this.adaptiveTimestep=!1,this.body.emitter.emit("_resizeNodes"),this.viewFunction===void 0&&(this.viewFunction=this.simulationStep.bind(this),this.body.emitter.on("initRedraw",this.viewFunction),this.body.emitter.emit("_startRendering"))):this.body.emitter.emit("_redraw")}stopSimulation(e=!0){this.stabilized=!0,e===!0&&this._emitStabilized(),this.viewFunction!==void 0&&(this.body.emitter.off("initRedraw",this.viewFunction),this.viewFunction=void 0,e===!0&&this.body.emitter.emit("_stopRendering"))}simulationStep(){let e=Date.now();this.physicsTick(),(Date.now()-e<.4*this.simulationInterval||this.runDoubleSpeed===!0)&&this.stabilized===!1&&(this.physicsTick(),this.runDoubleSpeed=!0),this.stabilized===!0&&this.stopSimulation()}_emitStabilized(e=this.stabilizationIterations){(this.stabilizationIterations>1||this.startedStabilization===!0)&&setTimeout(()=>{this.body.emitter.emit("stabilized",{iterations:e}),this.startedStabilization=!1,this.stabilizationIterations=0},0)}physicsStep(){this.gravitySolver.solve(),this.nodesSolver.solve(),this.edgesSolver.solve(),this.moveNodes()}adjustTimeStep(){let e=1.2;this._evaluateStepQuality()===!0?this.timestep=e*this.timestep:this.timestep/er))return!1;return!0}moveNodes(){let e=this.physicsBody.physicsNodeIndices,t=0,i=0,s=5;for(let o=0;or&&(e=e>0?r:-r),e}_performStep(e){let t=this.body.nodes[e],i=this.physicsBody.forces[e];this.options.wind&&(i.x+=this.options.wind.x,i.y+=this.options.wind.y);let s=this.physicsBody.velocities[e];return this.previousStates[e]={x:t.x,y:t.y,vx:s.x,vy:s.y},t.options.fixed.x===!1?(s.x=this.calculateComponentVelocity(s.x,i.x,t.options.mass),t.x+=s.x*this.timestep):(i.x=0,s.x=0),t.options.fixed.y===!1?(s.y=this.calculateComponentVelocity(s.y,i.y,t.options.mass),t.y+=s.y*this.timestep):(i.y=0,s.y=0),Math.sqrt(Math.pow(s.x,2)+Math.pow(s.y,2))}_freezeNodes(){let e=this.body.nodes;for(let t in e)if(Object.prototype.hasOwnProperty.call(e,t)&&e[t].x&&e[t].y){let i=e[t].options.fixed;this.freezeCache[t]={x:i.x,y:i.y},i.x=!0,i.y=!0}}_restoreFrozenNodes(){let e=this.body.nodes;for(let t in e)Object.prototype.hasOwnProperty.call(e,t)&&this.freezeCache[t]!==void 0&&(e[t].options.fixed.x=this.freezeCache[t].x,e[t].options.fixed.y=this.freezeCache[t].y);this.freezeCache={}}stabilize(e=this.options.stabilization.iterations){if(typeof e!="number"&&(e=this.options.stabilization.iterations,console.error("The stabilize method needs a numeric amount of iterations. Switching to default: ",e)),this.physicsBody.physicsNodeIndices.length===0){this.ready=!0;return}this.adaptiveTimestep=this.options.adaptiveTimestep,this.body.emitter.emit("_resizeNodes"),this.stopSimulation(),this.stabilized=!1,this.body.emitter.emit("_blockRedraw"),this.targetIterations=e,this.options.stabilization.onlyDynamicEdges===!0&&this._freezeNodes(),this.stabilizationIterations=0,setTimeout(()=>this._stabilizationBatch(),0)}_startStabilizing(){return this.startedStabilization===!0?!1:(this.body.emitter.emit("startStabilizing"),this.startedStabilization=!0,!0)}_stabilizationBatch(){let e=()=>this.stabilized===!1&&this.stabilizationIterations{this.body.emitter.emit("stabilizationProgress",{iterations:this.stabilizationIterations,total:this.targetIterations})};this._startStabilizing()&&t();let i=0;for(;e()&&i0)for(let d=0;da.shape.boundingBox.left&&(o=a.shape.boundingBox.left),ra.shape.boundingBox.top&&(i=a.shape.boundingBox.top),s0)for(let d=0;da.x&&(o=a.x),ra.y&&(i=a.y),s{delete this.containedEdges[i.id]}),A(t.containedNodes,(i,s)=>{this.containedNodes[s]=i}),t.containedNodes={},A(t.containedEdges,(i,s)=>{this.containedEdges[s]=i}),t.containedEdges={},A(t.edges,i=>{A(this.edges,s=>{let o=s.clusteringEdgeReplacingIds.indexOf(i.id);o!==-1&&(A(i.clusteringEdgeReplacingIds,r=>{s.clusteringEdgeReplacingIds.push(r),this.body.edges[r].edgeReplacedById=s.id}),s.clusteringEdgeReplacingIds.splice(o,1))})}),t.edges=[]}},un=class{constructor(e){this.body=e,this.clusteredNodes={},this.clusteredEdges={},this.options={},this.defaultOptions={},Object.assign(this.options,this.defaultOptions),this.body.emitter.on("_resetData",()=>{this.clusteredNodes={},this.clusteredEdges={}})}clusterByHubsize(e,t){e===void 0?e=this._getHubSize():typeof e=="object"&&(t=this._checkOptions(e),e=this._getHubSize());let i=[];for(let s=0;s=e&&i.push(o.id)}for(let s=0;s{o.options&&e.joinCondition(o.options)===!0&&(i[r]=o,A(o.edges,a=>{this.clusteredEdges[a.id]===void 0&&(s[a.id]=a)}))}),this._cluster(i,s,e,t)}clusterByEdgeCount(e,t,i=!0){t=this._checkOptions(t);let s=[],o={},r,a,d;for(let h=0;h0&&Object.keys(c).length>0&&C===!0){let g=function(){for(let m=0;m-1&&(r[p.id]=p)}}this._cluster(o,r,t,i)}_createClusterEdges(e,t,i,s){let o,r,a,d,h,l,c=Object.keys(e),u=[];for(let C=0;Cs?a.x:s,o=a.yr?a.y:r;return{x:.5*(i+s),y:.5*(o+r)}}openCluster(e,t,i=!0){if(e===void 0)throw new Error("No clusterNodeId supplied to openCluster.");let s=this.body.nodes[e];if(s===void 0)throw new Error("The clusterNodeId supplied to openCluster does not exist.");if(s.isCluster!==!0||s.containedNodes===void 0||s.containedEdges===void 0)throw new Error("The node:"+e+" is not a valid cluster.");let o=this.findNode(e),r=o.indexOf(e)-1;if(r>=0){let l=o[r];this.body.nodes[l]._openChildCluster(e),delete this.body.nodes[e],i===!0&&this.body.emitter.emit("_dataChanged");return}let a=s.containedNodes,d=s.containedEdges;if(t!==void 0&&t.releaseFunction!==void 0&&typeof t.releaseFunction=="function"){let l={},c={x:s.x,y:s.y};for(let p in a)if(Object.prototype.hasOwnProperty.call(a,p)){let b=this.body.nodes[p];l[p]={x:b.x,y:b.y}}let u=t.releaseFunction(c,l);for(let p in a)if(Object.prototype.hasOwnProperty.call(a,p)){let b=this.body.nodes[p];u[p]!==void 0&&(b.x=u[p].x===void 0?s.x:u[p].x,b.y=u[p].y===void 0?s.y:u[p].y)}}else A(a,function(l){l.options.fixed.x===!1&&(l.x=s.x),l.options.fixed.y===!1&&(l.y=s.y)});for(let l in a)if(Object.prototype.hasOwnProperty.call(a,l)){let c=this.body.nodes[l];c.vx=s.vx,c.vy=s.vy,c.setOptions({physics:!0}),delete this.clusteredNodes[l]}let h=[];for(let l=0;l0&&rs&&(s=h.edges.length),e+=h.edges.length,t+=Math.pow(h.edges.length,2),i+=1}e=e/i,t=t/i;let o=t-Math.pow(e,2),r=Math.sqrt(o),a=Math.floor(e+2*r);return a>s&&(a=s),a}_createClusteredEdge(e,t,i,s,o){let r=J.cloneOptions(i,"edge");j(r,s),r.from=e,r.to=t,r.id="clusterEdge:"+Te(),o!==void 0&&j(r,o);let a=this.body.functions.createEdge(r);return a.clusteringEdgeReplacingIds=[i.id],a.connect(),this.body.edges[a.id]=a,a}_clusterEdges(e,t,i,s){if(t instanceof Se){let o=t,r={};r[o.id]=o,t=r}if(e instanceof U){let o=e,r={};r[o.id]=o,e=r}if(i==null)throw new Error("_clusterEdges: parameter clusterNode required");s===void 0&&(s=i.clusterEdgeProperties),this._createClusterEdges(e,t,i,s);for(let o in t)if(Object.prototype.hasOwnProperty.call(t,o)&&this.body.edges[o]!==void 0){let r=this.body.edges[o];this._backupEdgeOptions(r),r.setOptions({physics:!1})}for(let o in e)Object.prototype.hasOwnProperty.call(e,o)&&(this.clusteredNodes[o]={clusterId:i.id,node:this.body.nodes[o]},this.body.nodes[o].setOptions({physics:!1}))}_getClusterNodeForNode(e){if(e===void 0)return;let t=this.clusteredNodes[e];if(t===void 0)return;let i=t.clusterId;if(i!==void 0)return this.body.nodes[i]}_filter(e,t){let i=[];return A(e,s=>{t(s)&&i.push(s)}),i}_updateState(){let e,t=[],i={},s=d=>{A(this.body.nodes,h=>{h.isCluster===!0&&d(h)})};for(e in this.clusteredNodes){if(!Object.prototype.hasOwnProperty.call(this.clusteredNodes,e))continue;this.body.nodes[e]===void 0&&t.push(e)}s(function(d){for(let h=0;h{let h=this.body.edges[d];(h===void 0||!h.endPointsValid())&&(i[d]=d)}),s(function(d){A(d.containedEdges,(h,l)=>{!h.endPointsValid()&&!i[l]&&(i[l]=l)})}),A(this.body.edges,(d,h)=>{let l=!0,c=d.clusteringEdgeReplacingIds;if(c!==void 0){let u=0;A(c,p=>{let b=this.body.edges[p];b!==void 0&&b.endPointsValid()&&(u+=1)}),l=u>0}(!d.endPointsValid()||!l)&&(i[h]=h)}),s(d=>{A(i,h=>{delete d.containedEdges[h],A(d.edges,(l,c)=>{if(l.id===h){d.edges[c]=null;return}l.clusteringEdgeReplacingIds=this._filter(l.clusteringEdgeReplacingIds,function(u){return!i[u]})}),d.edges=this._filter(d.edges,function(l){return l!==null})})}),A(i,d=>{delete this.clusteredEdges[d]}),A(i,d=>{delete this.body.edges[d]});let o=Object.keys(this.body.edges);A(o,d=>{let h=this.body.edges[d],l=this._isClusteredNode(h.fromId)||this._isClusteredNode(h.toId);if(l!==this._isClusteredEdge(h.id))if(l){let c=this._getClusterNodeForNode(h.fromId);c!==void 0&&this._clusterEdges(this.body.nodes[h.fromId],h,c);let u=this._getClusterNodeForNode(h.toId);u!==void 0&&this._clusterEdges(this.body.nodes[h.toId],h,u)}else delete this._clusterEdges[d],this._restoreEdge(h)});let r=!1,a=!0;for(;a;){let d=[];s(function(h){let l=Object.keys(h.containedNodes).length,c=h.options.allowSingleNodeCluster===!0;(c&&l<1||!c&&l<2)&&d.push(h.id)});for(let h=0;h0,r=r||a}r&&this._updateState()}_isClusteredNode(e){return this.clusteredNodes[e]!==void 0}_isClusteredEdge(e){return this.clusteredEdges[e]!==void 0}};function Fa(){let n;window!==void 0&&(n=window.requestAnimationFrame||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame||window.msRequestAnimationFrame),n===void 0?window.requestAnimationFrame=function(e){e()}:window.requestAnimationFrame=n}var fn=class{constructor(e,t){Fa(),this.body=e,this.canvas=t,this.redrawRequested=!1,this.renderTimer=void 0,this.requiresTimeout=!0,this.renderingActive=!1,this.renderRequests=0,this.allowRedraw=!0,this.dragging=!1,this.zooming=!1,this.options={},this.defaultOptions={hideEdgesOnDrag:!1,hideEdgesOnZoom:!1,hideNodesOnDrag:!1},Object.assign(this.options,this.defaultOptions),this._determineBrowserMethod(),this.bindEventListeners()}bindEventListeners(){this.body.emitter.on("dragStart",()=>{this.dragging=!0}),this.body.emitter.on("dragEnd",()=>{this.dragging=!1}),this.body.emitter.on("zoom",()=>{this.zooming=!0,window.clearTimeout(this.zoomTimeoutId),this.zoomTimeoutId=window.setTimeout(()=>{this.zooming=!1,this._requestRedraw.bind(this)()},250)}),this.body.emitter.on("_resizeNodes",()=>{this._resizeNodes()}),this.body.emitter.on("_redraw",()=>{this.renderingActive===!1&&this._redraw()}),this.body.emitter.on("_blockRedraw",()=>{this.allowRedraw=!1}),this.body.emitter.on("_allowRedraw",()=>{this.allowRedraw=!0,this.redrawRequested=!1}),this.body.emitter.on("_requestRedraw",this._requestRedraw.bind(this)),this.body.emitter.on("_startRendering",()=>{this.renderRequests+=1,this.renderingActive=!0,this._startRendering()}),this.body.emitter.on("_stopRendering",()=>{this.renderRequests-=1,this.renderingActive=this.renderRequests>0,this.renderTimer=void 0}),this.body.emitter.on("destroy",()=>{this.renderRequests=0,this.allowRedraw=!1,this.renderingActive=!1,this.requiresTimeout===!0?clearTimeout(this.renderTimer):window.cancelAnimationFrame(this.renderTimer),this.body.emitter.off()})}setOptions(e){e!==void 0&&Ve(["hideEdgesOnDrag","hideEdgesOnZoom","hideNodesOnDrag"],this.options,e)}_requestNextFrame(e,t){if(typeof window=="undefined")return;let i,s=window;return this.requiresTimeout===!0?i=s.setTimeout(e,t):s.requestAnimationFrame&&(i=s.requestAnimationFrame(e)),i}_startRendering(){this.renderingActive===!0&&this.renderTimer===void 0&&(this.renderTimer=this._requestNextFrame(this._renderStep.bind(this),this.simulationInterval))}_renderStep(){this.renderingActive===!0&&(this.renderTimer=void 0,this.requiresTimeout===!0&&this._startRendering(),this._redraw(),this.requiresTimeout===!1&&this._startRendering())}redraw(){this.body.emitter.emit("setSize"),this._redraw()}_requestRedraw(){this.redrawRequested!==!0&&this.renderingActive===!1&&this.allowRedraw===!0&&(this.redrawRequested=!0,this._requestNextFrame(()=>{this._redraw(!1)},0))}_redraw(e=!1){if(this.allowRedraw===!0){this.body.emitter.emit("initRedraw"),this.redrawRequested=!1;let t={drawExternalLabels:null};(this.canvas.frame.canvas.width===0||this.canvas.frame.canvas.height===0)&&this.canvas.setSize(),this.canvas.setTransform();let i=this.canvas.getContext(),s=this.canvas.frame.canvas.clientWidth,o=this.canvas.frame.canvas.clientHeight;if(i.clearRect(0,0,s,o),this.canvas.frame.clientWidth===0)return;if(i.save(),i.translate(this.body.view.translation.x,this.body.view.translation.y),i.scale(this.body.view.scale,this.body.view.scale),i.beginPath(),this.body.emitter.emit("beforeDrawing",i),i.closePath(),e===!1&&(this.dragging===!1||this.dragging===!0&&this.options.hideEdgesOnDrag===!1)&&(this.zooming===!1||this.zooming===!0&&this.options.hideEdgesOnZoom===!1)&&this._drawEdges(i),this.dragging===!1||this.dragging===!0&&this.options.hideNodesOnDrag===!1){let{drawExternalLabels:r}=this._drawNodes(i,e);t.drawExternalLabels=r}e===!1&&(this.dragging===!1||this.dragging===!0&&this.options.hideEdgesOnDrag===!1)&&(this.zooming===!1||this.zooming===!0&&this.options.hideEdgesOnZoom===!1)&&this._drawArrows(i),t.drawExternalLabels!=null&&t.drawExternalLabels(),e===!1&&this._drawSelectionBox(i),i.beginPath(),this.body.emitter.emit("afterDrawing",i),i.closePath(),i.restore(),e===!0&&i.clearRect(0,0,s,o)}}_resizeNodes(){this.canvas.setTransform();let e=this.canvas.getContext();e.save(),e.translate(this.body.view.translation.x,this.body.view.translation.y),e.scale(this.body.view.scale,this.body.view.scale);let t=this.body.nodes,i;for(let s in t)Object.prototype.hasOwnProperty.call(t,s)&&(i=t[s],i.resize(e),i.updateBoundingBox(e,i.selected));e.restore()}_drawNodes(e,t=!1){let i=this.body.nodes,s=this.body.nodeIndices,o,r=[],a=[],d=20,h=this.canvas.DOMtoCanvas({x:-d,y:-d}),l=this.canvas.DOMtoCanvas({x:this.canvas.frame.canvas.clientWidth+d,y:this.canvas.frame.canvas.clientHeight+d}),c={top:h.y,left:h.x,bottom:l.y,right:l.x},u=[];for(let f=0;f{for(let f of u)f()}}}_drawEdges(e){let t=this.body.edges,i=this.body.edgeIndices;for(let s=0;s{e.width!==0&&(this.body.view.translation.x=e.width*.5),e.height!==0&&(this.body.view.translation.y=e.height*.5)}),this.body.emitter.on("setSize",this.setSize.bind(this)),this.body.emitter.on("destroy",()=>{this.hammerFrame.destroy(),this.hammer.destroy(),this._cleanUp()})}setOptions(e){if(e!==void 0&&Ve(["width","height","autoResize"],this.options,e),this._cleanUp(),this.options.autoResize===!0){if(window.ResizeObserver){let i=new ResizeObserver(()=>{this.setSize()===!0&&this.body.emitter.emit("_requestRedraw")}),{frame:s}=this;i.observe(s),this._cleanupCallbacks.push(()=>{i.unobserve(s)})}else{let i=setInterval(()=>{this.setSize()===!0&&this.body.emitter.emit("_requestRedraw")},1e3);this._cleanupCallbacks.push(()=>{clearInterval(i)})}let t=this._onResize.bind(this);Rs(window,"resize",t),this._cleanupCallbacks.push(()=>{Hs(window,"resize",t)})}}_cleanUp(){this._cleanupCallbacks.splice(0).reverse().forEach(e=>{try{e()}catch(t){console.error(t)}})}_onResize(){this.setSize(),this.body.emitter.emit("_redraw")}_getCameraState(e=this.pixelRatio){this.initialized===!0&&(this.cameraState.previousWidth=this.frame.canvas.width/e,this.cameraState.previousHeight=this.frame.canvas.height/e,this.cameraState.scale=this.body.view.scale,this.cameraState.position=this.DOMtoCanvas({x:.5*this.frame.canvas.width/e,y:.5*this.frame.canvas.height/e}))}_setCameraState(){if(this.cameraState.scale!==void 0&&this.frame.canvas.clientWidth!==0&&this.frame.canvas.clientHeight!==0&&this.pixelRatio!==0&&this.cameraState.previousWidth>0&&this.cameraState.previousHeight>0){let e=this.frame.canvas.width/this.pixelRatio/this.cameraState.previousWidth,t=this.frame.canvas.height/this.pixelRatio/this.cameraState.previousHeight,i=this.cameraState.scale;e!=1&&t!=1?i=this.cameraState.scale*.5*(e+t):e!=1?i=this.cameraState.scale*e:t!=1&&(i=this.cameraState.scale*t),this.body.view.scale=i;let s=this.DOMtoCanvas({x:.5*this.frame.canvas.clientWidth,y:.5*this.frame.canvas.clientHeight}),o={x:s.x-this.cameraState.position.x,y:s.y-this.cameraState.position.y};this.body.view.translation.x+=o.x*this.body.view.scale,this.body.view.translation.y+=o.y*this.body.view.scale}}_prepareValue(e){if(typeof e=="number")return e+"px";if(typeof e=="string"){if(e.indexOf("%")!==-1||e.indexOf("px")!==-1)return e;if(e.indexOf("%")===-1)return e+"px"}throw new Error("Could not use the value supplied for width or height:"+e)}_create(){for(;this.body.container.hasChildNodes();)this.body.container.removeChild(this.body.container.firstChild);if(this.frame=document.createElement("div"),this.frame.className="vis-network",this.frame.style.position="relative",this.frame.style.overflow="hidden",this.frame.tabIndex=0,this.frame.canvas=document.createElement("canvas"),this.frame.canvas.style.position="relative",this.frame.appendChild(this.frame.canvas),this.frame.canvas.getContext)this._setPixelRatio(),this.setTransform();else{let e=document.createElement("DIV");e.style.color="red",e.style.fontWeight="bold",e.style.padding="10px",e.innerText="Error: your browser does not support HTML canvas",this.frame.canvas.appendChild(e)}this.body.container.appendChild(this.frame),this.body.view.scale=1,this.body.view.translation={x:.5*this.frame.canvas.clientWidth,y:.5*this.frame.canvas.clientHeight},this._bindHammer()}_bindHammer(){this.hammer!==void 0&&this.hammer.destroy(),this.drag={},this.pinch={},this.hammer=new qe(this.frame.canvas),this.hammer.get("pinch").set({enable:!0}),this.hammer.get("pan").set({threshold:5,direction:qe.DIRECTION_ALL}),$t(this.hammer,e=>{this.body.eventListeners.onTouch(e)}),this.hammer.on("tap",e=>{this.body.eventListeners.onTap(e)}),this.hammer.on("doubletap",e=>{this.body.eventListeners.onDoubleTap(e)}),this.hammer.on("press",e=>{this.body.eventListeners.onHold(e)}),this.hammer.on("panstart",e=>{this.body.eventListeners.onDragStart(e)}),this.hammer.on("panmove",e=>{this.body.eventListeners.onDrag(e)}),this.hammer.on("panend",e=>{this.body.eventListeners.onDragEnd(e)}),this.hammer.on("pinch",e=>{this.body.eventListeners.onPinch(e)}),this.frame.canvas.addEventListener("wheel",e=>{this.body.eventListeners.onMouseWheel(e)}),this.frame.canvas.addEventListener("mousemove",e=>{this.body.eventListeners.onMouseMove(e)}),this.frame.canvas.addEventListener("contextmenu",e=>{this.body.eventListeners.onContext(e)}),this.hammerFrame=new qe(this.frame),pn(this.hammerFrame,e=>{this.body.eventListeners.onRelease(e)})}setSize(e=this.options.width,t=this.options.height){e=this._prepareValue(e),t=this._prepareValue(t);let i=!1,s=this.frame.canvas.width,o=this.frame.canvas.height,r=this.pixelRatio;if(this._setPixelRatio(),e!=this.options.width||t!=this.options.height||this.frame.style.width!=e||this.frame.style.height!=t)this._getCameraState(r),this.frame.style.width=e,this.frame.style.height=t,this.frame.canvas.style.width="100%",this.frame.canvas.style.height="100%",this.frame.canvas.width=Math.round(this.frame.canvas.clientWidth*this.pixelRatio),this.frame.canvas.height=Math.round(this.frame.canvas.clientHeight*this.pixelRatio),this.options.width=e,this.options.height=t,this.canvasViewCenter={x:.5*this.frame.clientWidth,y:.5*this.frame.clientHeight},i=!0;else{let a=Math.round(this.frame.canvas.clientWidth*this.pixelRatio),d=Math.round(this.frame.canvas.clientHeight*this.pixelRatio);(this.frame.canvas.width!==a||this.frame.canvas.height!==d)&&this._getCameraState(r),this.frame.canvas.width!==a&&(this.frame.canvas.width=a,i=!0),this.frame.canvas.height!==d&&(this.frame.canvas.height=d,i=!0)}return i===!0&&(this.body.emitter.emit("resize",{width:Math.round(this.frame.canvas.width/this.pixelRatio),height:Math.round(this.frame.canvas.height/this.pixelRatio),oldWidth:Math.round(s/this.pixelRatio),oldHeight:Math.round(o/this.pixelRatio)}),this._setCameraState()),this.initialized=!0,i}getContext(){return this.frame.canvas.getContext("2d")}_determinePixelRatio(){let e=this.getContext();if(e===void 0)throw new Error("Could not get canvax context");let t=1;typeof window!="undefined"&&(t=window.devicePixelRatio||1);let i=e.webkitBackingStorePixelRatio||e.mozBackingStorePixelRatio||e.msBackingStorePixelRatio||e.oBackingStorePixelRatio||e.backingStorePixelRatio||1;return t/i}_setPixelRatio(){this.pixelRatio=this._determinePixelRatio()}setTransform(){let e=this.getContext();if(e===void 0)throw new Error("Could not get canvax context");e.setTransform(this.pixelRatio,0,0,this.pixelRatio,0,0)}_XconvertDOMtoCanvas(e){return(e-this.body.view.translation.x)/this.body.view.scale}_XconvertCanvasToDOM(e){return e*this.body.view.scale+this.body.view.translation.x}_YconvertDOMtoCanvas(e){return(e-this.body.view.translation.y)/this.body.view.scale}_YconvertCanvasToDOM(e){return e*this.body.view.scale+this.body.view.translation.y}canvasToDOM(e){return{x:this._XconvertCanvasToDOM(e.x),y:this._YconvertCanvasToDOM(e.y)}}DOMtoCanvas(e){return{x:this._XconvertDOMtoCanvas(e.x),y:this._YconvertDOMtoCanvas(e.y)}}};function Na(n,e){let t=Object.assign({nodes:e,minZoomLevel:Number.MIN_VALUE,maxZoomLevel:1},n!=null?n:{});if(!Array.isArray(t.nodes))throw new TypeError("Nodes has to be an array of ids.");if(t.nodes.length===0&&(t.nodes=e),!(typeof t.minZoomLevel=="number"&&t.minZoomLevel>0))throw new TypeError("Min zoom level has to be a number higher than zero.");if(!(typeof t.maxZoomLevel=="number"&&t.minZoomLevel<=t.maxZoomLevel))throw new TypeError("Max zoom level has to be a number higher than min zoom level.");return t}var mn=class{constructor(e,t){this.body=e,this.canvas=t,this.animationSpeed=1/this.renderRefreshRate,this.animationEasingFunction="easeInOutQuint",this.easingTime=0,this.sourceScale=0,this.targetScale=0,this.sourceTranslation=0,this.targetTranslation=0,this.lockedOnNodeId=void 0,this.lockedOnNodeOffset=void 0,this.touchTime=0,this.viewFunction=void 0,this.body.emitter.on("fit",this.fit.bind(this)),this.body.emitter.on("animationFinished",()=>{this.body.emitter.emit("_stopRendering")}),this.body.emitter.on("unlockNode",this.releaseNode.bind(this))}setOptions(e={}){this.options=e}fit(e,t=!1){e=Na(e,this.body.nodeIndices);let i=this.canvas.frame.canvas.clientWidth,s=this.canvas.frame.canvas.clientHeight,o,r;if(i===0||s===0)r=1,o=J.getRange(this.body.nodes,e.nodes);else if(t===!0){let h=0;for(let u in this.body.nodes)Object.prototype.hasOwnProperty.call(this.body.nodes,u)&&this.body.nodes[u].predefinedPosition===!0&&(h+=1);if(h>.5*this.body.nodeIndices.length){this.fit(e,!1);return}o=J.getRange(this.body.nodes,e.nodes);let l=this.body.nodeIndices.length;r=12.662/(l+7.4147)+.0964822,r*=Math.min(i/600,s/600)}else{this.body.emitter.emit("_resizeNodes"),o=J.getRange(this.body.nodes,e.nodes);let h=Math.abs(o.maxX-o.minX)*1.1,l=Math.abs(o.maxY-o.minY)*1.1,c=i/h,u=s/l;r=c<=u?c:u}r>e.maxZoomLevel?r=e.maxZoomLevel:r0))throw new TypeError('The option "scale" has to be a number greater than zero.')}else e.scale=this.body.view.scale;e.animation===void 0&&(e.animation={duration:0}),e.animation===!1&&(e.animation={duration:0}),e.animation===!0&&(e.animation={}),e.animation.duration===void 0&&(e.animation.duration=1e3),e.animation.easingFunction===void 0&&(e.animation.easingFunction="easeInOutQuad"),this.animateView(e)}animateView(e){if(e===void 0)return;this.animationEasingFunction=e.animation.easingFunction,this.releaseNode(),e.locked===!0&&(this.lockedOnNodeId=e.lockedOnNode,this.lockedOnNodeOffset=e.offset),this.easingTime!=0&&this._transitionRedraw(!0),this.sourceScale=this.body.view.scale,this.sourceTranslation=this.body.view.translation,this.targetScale=e.scale,this.body.view.scale=this.targetScale;let t=this.canvas.DOMtoCanvas({x:.5*this.canvas.frame.canvas.clientWidth,y:.5*this.canvas.frame.canvas.clientHeight}),i={x:t.x-e.position.x,y:t.y-e.position.y};this.targetTranslation={x:this.sourceTranslation.x+i.x*this.targetScale+e.offset.x,y:this.sourceTranslation.y+i.y*this.targetScale+e.offset.y},e.animation.duration===0?this.lockedOnNodeId!=null?(this.viewFunction=this._lockedRedraw.bind(this),this.body.emitter.on("initRedraw",this.viewFunction)):(this.body.view.scale=this.targetScale,this.body.view.translation=this.targetTranslation,this.body.emitter.emit("_requestRedraw")):(this.animationSpeed=1/(60*e.animation.duration*.001)||1/60,this.animationEasingFunction=e.animation.easingFunction,this.viewFunction=this._transitionRedraw.bind(this),this.body.emitter.on("initRedraw",this.viewFunction),this.body.emitter.emit("_startRendering"))}_lockedRedraw(){let e={x:this.body.nodes[this.lockedOnNodeId].x,y:this.body.nodes[this.lockedOnNodeId].y},t=this.canvas.DOMtoCanvas({x:.5*this.canvas.frame.canvas.clientWidth,y:.5*this.canvas.frame.canvas.clientHeight}),i={x:t.x-e.x,y:t.y-e.y},s=this.body.view.translation,o={x:s.x+i.x*this.body.view.scale+this.lockedOnNodeOffset.x,y:s.y+i.y*this.body.view.scale+this.lockedOnNodeOffset.y};this.body.view.translation=o}releaseNode(){this.lockedOnNodeId!==void 0&&this.viewFunction!==void 0&&(this.body.emitter.off("initRedraw",this.viewFunction),this.lockedOnNodeId=void 0,this.lockedOnNodeOffset=void 0)}_transitionRedraw(e=!1){this.easingTime+=this.animationSpeed,this.easingTime=e===!0?1:this.easingTime;let t=qs[this.animationEasingFunction](this.easingTime);this.body.view.scale=this.sourceScale+(this.targetScale-this.sourceScale)*t,this.body.view.translation={x:this.sourceTranslation.x+(this.targetTranslation.x-this.sourceTranslation.x)*t,y:this.sourceTranslation.y+(this.targetTranslation.y-this.sourceTranslation.y)*t},this.easingTime>=1&&(this.body.emitter.off("initRedraw",this.viewFunction),this.easingTime=0,this.lockedOnNodeId!=null&&(this.viewFunction=this._lockedRedraw.bind(this),this.body.emitter.on("initRedraw",this.viewFunction)),this.body.emitter.emit("animationFinished"))}getScale(){return this.body.view.scale}getViewPosition(){return this.canvas.DOMtoCanvas({x:.5*this.canvas.frame.canvas.clientWidth,y:.5*this.canvas.frame.canvas.clientHeight})}},yn=class{constructor(e,t){this.body=e,this.canvas=t,this.iconsCreated=!1,this.navigationHammers=[],this.boundFunctions={},this.touchTime=0,this.activated=!1,this.body.emitter.on("activate",()=>{this.activated=!0,this.configureKeyboardBindings()}),this.body.emitter.on("deactivate",()=>{this.activated=!1,this.configureKeyboardBindings()}),this.body.emitter.on("destroy",()=>{this.keycharm!==void 0&&this.keycharm.destroy()}),this.options={}}setOptions(e){e!==void 0&&(this.options=e,this.create())}create(){this.options.navigationButtons===!0?this.iconsCreated===!1&&this.loadNavigationElements():this.iconsCreated===!0&&this.cleanNavigation(),this.configureKeyboardBindings()}cleanNavigation(){if(this.navigationHammers.length!=0){for(let e=0;e{this._stopMovement()}),this.navigationHammers.push(i),this.iconsCreated=!0}bindToRedraw(e){this.boundFunctions[e]===void 0&&(this.boundFunctions[e]=this[e].bind(this),this.body.emitter.on("initRedraw",this.boundFunctions[e]),this.body.emitter.emit("_startRendering"))}unbindFromRedraw(e){this.boundFunctions[e]!==void 0&&(this.body.emitter.off("initRedraw",this.boundFunctions[e]),this.body.emitter.emit("_stopRendering"),delete this.boundFunctions[e])}_fit(){new Date().valueOf()-this.touchTime>700&&(this.body.emitter.emit("fit",{duration:700}),this.touchTime=new Date().valueOf())}_stopMovement(){for(let e in this.boundFunctions)Object.prototype.hasOwnProperty.call(this.boundFunctions,e)&&(this.body.emitter.off("initRedraw",this.boundFunctions[e]),this.body.emitter.emit("_stopRendering"));this.boundFunctions={}}_moveUp(){this.body.view.translation.y+=this.options.keyboard.speed.y}_moveDown(){this.body.view.translation.y-=this.options.keyboard.speed.y}_moveLeft(){this.body.view.translation.x+=this.options.keyboard.speed.x}_moveRight(){this.body.view.translation.x-=this.options.keyboard.speed.x}_zoomIn(){let e=this.body.view.scale,t=this.body.view.scale*(1+this.options.keyboard.speed.zoom),i=this.body.view.translation,s=t/e,o=(1-s)*this.canvas.canvasViewCenter.x+i.x*s,r=(1-s)*this.canvas.canvasViewCenter.y+i.y*s;this.body.view.scale=t,this.body.view.translation={x:o,y:r},this.body.emitter.emit("zoom",{direction:"+",scale:this.body.view.scale,pointer:null})}_zoomOut(){let e=this.body.view.scale,t=this.body.view.scale/(1+this.options.keyboard.speed.zoom),i=this.body.view.translation,s=t/e,o=(1-s)*this.canvas.canvasViewCenter.x+i.x*s,r=(1-s)*this.canvas.canvasViewCenter.y+i.y*s;this.body.view.scale=t,this.body.view.translation={x:o,y:r},this.body.emitter.emit("zoom",{direction:"-",scale:this.body.view.scale,pointer:null})}configureKeyboardBindings(){this.keycharm!==void 0&&this.keycharm.destroy(),this.options.keyboard.enabled===!0&&(this.options.keyboard.bindToWindow===!0?this.keycharm=Ut({container:window,preventDefault:!0}):this.keycharm=Ut({container:this.canvas.frame,preventDefault:!0}),this.keycharm.reset(),this.activated===!0&&(this.keycharm.bind("up",()=>{this.bindToRedraw("_moveUp")},"keydown"),this.keycharm.bind("down",()=>{this.bindToRedraw("_moveDown")},"keydown"),this.keycharm.bind("left",()=>{this.bindToRedraw("_moveLeft")},"keydown"),this.keycharm.bind("right",()=>{this.bindToRedraw("_moveRight")},"keydown"),this.keycharm.bind("=",()=>{this.bindToRedraw("_zoomIn")},"keydown"),this.keycharm.bind("num+",()=>{this.bindToRedraw("_zoomIn")},"keydown"),this.keycharm.bind("num-",()=>{this.bindToRedraw("_zoomOut")},"keydown"),this.keycharm.bind("-",()=>{this.bindToRedraw("_zoomOut")},"keydown"),this.keycharm.bind("[",()=>{this.bindToRedraw("_zoomOut")},"keydown"),this.keycharm.bind("]",()=>{this.bindToRedraw("_zoomIn")},"keydown"),this.keycharm.bind("pageup",()=>{this.bindToRedraw("_zoomIn")},"keydown"),this.keycharm.bind("pagedown",()=>{this.bindToRedraw("_zoomOut")},"keydown"),this.keycharm.bind("up",()=>{this.unbindFromRedraw("_moveUp")},"keyup"),this.keycharm.bind("down",()=>{this.unbindFromRedraw("_moveDown")},"keyup"),this.keycharm.bind("left",()=>{this.unbindFromRedraw("_moveLeft")},"keyup"),this.keycharm.bind("right",()=>{this.unbindFromRedraw("_moveRight")},"keyup"),this.keycharm.bind("=",()=>{this.unbindFromRedraw("_zoomIn")},"keyup"),this.keycharm.bind("num+",()=>{this.unbindFromRedraw("_zoomIn")},"keyup"),this.keycharm.bind("num-",()=>{this.unbindFromRedraw("_zoomOut")},"keyup"),this.keycharm.bind("-",()=>{this.unbindFromRedraw("_zoomOut")},"keyup"),this.keycharm.bind("[",()=>{this.unbindFromRedraw("_zoomOut")},"keyup"),this.keycharm.bind("]",()=>{this.unbindFromRedraw("_zoomIn")},"keyup"),this.keycharm.bind("pageup",()=>{this.unbindFromRedraw("_zoomIn")},"keyup"),this.keycharm.bind("pagedown",()=>{this.unbindFromRedraw("_zoomOut")},"keyup")))}},bn=class{constructor(e,t,i){this.body=e,this.canvas=t,this.selectionHandler=i,this.navigationHandler=new yn(e,t),this.body.eventListeners.onTap=this.onTap.bind(this),this.body.eventListeners.onTouch=this.onTouch.bind(this),this.body.eventListeners.onDoubleTap=this.onDoubleTap.bind(this),this.body.eventListeners.onHold=this.onHold.bind(this),this.body.eventListeners.onDragStart=this.onDragStart.bind(this),this.body.eventListeners.onDrag=this.onDrag.bind(this),this.body.eventListeners.onDragEnd=this.onDragEnd.bind(this),this.body.eventListeners.onMouseWheel=this.onMouseWheel.bind(this),this.body.eventListeners.onPinch=this.onPinch.bind(this),this.body.eventListeners.onMouseMove=this.onMouseMove.bind(this),this.body.eventListeners.onRelease=this.onRelease.bind(this),this.body.eventListeners.onContext=this.onContext.bind(this),this.touchTime=0,this.drag={},this.pinch={},this.popup=void 0,this.popupObj=void 0,this.popupTimer=void 0,this.body.functions.getPointer=this.getPointer.bind(this),this.options={},this.defaultOptions={dragNodes:!0,dragView:!0,hover:!1,keyboard:{enabled:!1,speed:{x:10,y:10,zoom:.02},bindToWindow:!0,autoFocus:!0},navigationButtons:!1,tooltipDelay:300,zoomView:!0,zoomSpeed:1},Object.assign(this.options,this.defaultOptions),this.bindEventListeners()}bindEventListeners(){this.body.emitter.on("destroy",()=>{clearTimeout(this.popupTimer),delete this.body.functions.getPointer})}setOptions(e){e!==void 0&&(mt(["hideEdgesOnDrag","hideEdgesOnZoom","hideNodesOnDrag","keyboard","multiselect","selectable","selectConnectedEdges"],this.options,e),ae(this.options,e,"keyboard"),e.tooltip&&(Object.assign(this.options.tooltip,e.tooltip),e.tooltip.color&&(this.options.tooltip.color=Rt(e.tooltip.color)))),this.navigationHandler.setOptions(this.options)}getPointer(e){return{x:e.x-zs(this.canvas.frame.canvas),y:e.y-Ls(this.canvas.frame.canvas)}}onTouch(e){new Date().valueOf()-this.touchTime>50&&(this.drag.pointer=this.getPointer(e.center),this.drag.pinched=!1,this.pinch.scale=this.body.view.scale,this.touchTime=new Date().valueOf())}onTap(e){let t=this.getPointer(e.center),i=this.selectionHandler.options.multiselect&&(e.changedPointers[0].ctrlKey||e.changedPointers[0].metaKey);this.checkSelectionChanges(t,i),this.selectionHandler.commitAndEmit(t,e),this.selectionHandler.generateClickEvent("click",e,t)}onDoubleTap(e){let t=this.getPointer(e.center);this.selectionHandler.generateClickEvent("doubleClick",e,t)}onHold(e){let t=this.getPointer(e.center),i=this.selectionHandler.options.multiselect;this.checkSelectionChanges(t,i),this.selectionHandler.commitAndEmit(t,e),this.selectionHandler.generateClickEvent("click",e,t),this.selectionHandler.generateClickEvent("hold",e,t)}onRelease(e){if(new Date().valueOf()-this.touchTime>10){let t=this.getPointer(e.center);this.selectionHandler.generateClickEvent("release",e,t),this.touchTime=new Date().valueOf()}}onContext(e){let t=this.getPointer({x:e.clientX,y:e.clientY});this.selectionHandler.generateClickEvent("oncontext",e,t)}checkSelectionChanges(e,t=!1){t===!0?this.selectionHandler.selectAdditionalOnPoint(e):this.selectionHandler.selectOnPoint(e)}_determineDifference(e,t){let i=function(s,o){let r=[];for(let a=0;a{let a=r.node;r.xFixed===!1&&(a.x=this.canvas._XconvertDOMtoCanvas(this.canvas._XconvertCanvasToDOM(r.x)+s)),r.yFixed===!1&&(a.y=this.canvas._YconvertDOMtoCanvas(this.canvas._YconvertCanvasToDOM(r.y)+o))}),this.body.emitter.emit("startSimulation")}else{if(e.srcEvent.shiftKey){if(this.selectionHandler.generateClickEvent("dragging",e,t,void 0,!0),this.drag.pointer===void 0){this.onDragStart(e);return}this.body.selectionBox.position.end={x:this.canvas._XconvertDOMtoCanvas(t.x),y:this.canvas._YconvertDOMtoCanvas(t.y)},this.body.emitter.emit("_requestRedraw")}if(this.options.dragView===!0&&!e.srcEvent.shiftKey){if(this.selectionHandler.generateClickEvent("dragging",e,t,void 0,!0),this.drag.pointer===void 0){this.onDragStart(e);return}let s=t.x-this.drag.pointer.x,o=t.y-this.drag.pointer.y;this.body.view.translation={x:this.drag.translation.x+s,y:this.drag.translation.y+o},this.body.emitter.emit("_requestRedraw")}}}onDragEnd(e){if(this.drag.dragging=!1,this.body.selectionBox.show){this.body.selectionBox.show=!1;let t=this.body.selectionBox.position,i={minX:Math.min(t.start.x,t.end.x),minY:Math.min(t.start.y,t.end.y),maxX:Math.max(t.start.x,t.end.x),maxY:Math.max(t.start.y,t.end.y)};this.body.nodeIndices.filter(r=>{let a=this.body.nodes[r];return a.x>=i.minX&&a.x<=i.maxX&&a.y>=i.minY&&a.y<=i.maxY}).forEach(r=>this.selectionHandler.selectObject(this.body.nodes[r]));let o=this.getPointer(e.center);this.selectionHandler.commitAndEmit(o,e),this.selectionHandler.generateClickEvent("dragEnd",e,this.getPointer(e.center),void 0,!0),this.body.emitter.emit("_requestRedraw")}else{let t=this.drag.selection;t&&t.length?(t.forEach(function(i){i.node.options.fixed.x=i.xFixed,i.node.options.fixed.y=i.yFixed}),this.selectionHandler.generateClickEvent("dragEnd",e,this.getPointer(e.center)),this.body.emitter.emit("startSimulation")):(this.selectionHandler.generateClickEvent("dragEnd",e,this.getPointer(e.center),void 0,!0),this.body.emitter.emit("_requestRedraw"))}}onPinch(e){let t=this.getPointer(e.center);this.drag.pinched=!0,this.pinch.scale===void 0&&(this.pinch.scale=1);let i=this.pinch.scale*e.scale;this.zoom(i,t)}zoom(e,t){if(this.options.zoomView===!0){let i=this.body.view.scale;e<1e-5&&(e=1e-5),e>10&&(e=10);let s;this.drag!==void 0&&this.drag.dragging===!0&&(s=this.canvas.DOMtoCanvas(this.drag.pointer));let o=this.body.view.translation,r=e/i,a=(1-r)*t.x+o.x*r,d=(1-r)*t.y+o.y*r;if(this.body.view.scale=e,this.body.view.translation={x:a,y:d},s!=null){let h=this.canvas.canvasToDOM(s);this.drag.pointer.x=h.x,this.drag.pointer.y=h.y}this.body.emitter.emit("_requestRedraw"),ithis._checkShowPopup(t),this.options.tooltipDelay))),this.options.hover===!0&&this.selectionHandler.hoverObject(e,t)}_checkShowPopup(e){let t=this.canvas._XconvertDOMtoCanvas(e.x),i=this.canvas._YconvertDOMtoCanvas(e.y),s={left:t,top:i,right:t,bottom:i},o=this.popupObj===void 0?void 0:this.popupObj.id,r=!1,a="node";if(this.popupObj===void 0){let d=this.body.nodeIndices,h=this.body.nodes,l,c=[];for(let u=0;u0&&(this.popupObj=h[c[c.length-1]],r=!0)}if(this.popupObj===void 0&&r===!1){let d=this.body.edgeIndices,h=this.body.edges,l,c=[];for(let u=0;u0&&(this.popupObj=h[c[c.length-1]],a="edge")}this.popupObj!==void 0?this.popupObj.id!==o&&(this.popup===void 0&&(this.popup=new Qs(this.canvas.frame)),this.popup.popupTargetType=a,this.popup.popupTargetId=this.popupObj.id,this.popup.setPosition(e.x+3,e.y-5),this.popup.setText(this.popupObj.getTitle()),this.popup.show(),this.body.emitter.emit("showPopup",this.popupObj.id)):this.popup!==void 0&&(this.popup.hide(),this.body.emitter.emit("hidePopup"))}_checkHidePopup(e){let t=this.selectionHandler._pointerToPositionObject(e),i=!1;if(this.popup.popupTargetType==="node"){if(this.body.nodes[this.popup.popupTargetId]!==void 0&&(i=this.body.nodes[this.popup.popupTargetId].isOverlappingWith(t),i===!0)){let s=this.selectionHandler.getNodeAt(e);i=s===void 0?!1:s.id===this.popup.popupTargetId}}else this.selectionHandler.getNodeAt(e)===void 0&&this.body.edges[this.popup.popupTargetId]!==void 0&&(i=this.body.edges[this.popup.popupTargetId].isOverlappingWith(t));i===!1&&(this.popupObj=void 0,this.popup.hide(),this.body.emitter.emit("hidePopup"))}};function q(n,e,t,i){if(t==="a"&&!i)throw new TypeError("Private accessor was defined without a getter");if(typeof e=="function"?n!==e||!i:!e.has(n))throw new TypeError("Cannot read private member from an object whose class did not declare it");return t==="m"?i:t==="a"?i.call(n):i?i.value:e.get(n)}function Hi(n,e,t,i,s){if(i==="m")throw new TypeError("Private method is not writable");if(i==="a"&&!s)throw new TypeError("Private accessor was defined without a setter");if(typeof e=="function"?n!==e||!s:!e.has(n))throw new TypeError("Cannot write private member to an object whose class did not declare it");return i==="a"?s.call(n,t):s?s.value=t:e.set(n,t),t}var Ye,le,Fe,Ne,Jt;function vn(n,e){let t=new Set;for(let i of e)n.has(i)||t.add(i);return t}var ji=class{constructor(){Ye.set(this,new Set),le.set(this,new Set)}get size(){return q(this,le,"f").size}add(...e){for(let t of e)q(this,le,"f").add(t)}delete(...e){for(let t of e)q(this,le,"f").delete(t)}clear(){q(this,le,"f").clear()}getSelection(){return[...q(this,le,"f")]}getChanges(){return{added:[...vn(q(this,Ye,"f"),q(this,le,"f"))],deleted:[...vn(q(this,le,"f"),q(this,Ye,"f"))],previous:[...new Set(q(this,Ye,"f"))],current:[...new Set(q(this,le,"f"))]}}commit(){let e=this.getChanges();Hi(this,Ye,q(this,le,"f"),"f"),Hi(this,le,new Set(q(this,Ye,"f")),"f");for(let t of e.added)t.select();for(let t of e.deleted)t.unselect();return e}};Ye=new WeakMap,le=new WeakMap;var wn=class{constructor(e=()=>{}){Fe.set(this,new ji),Ne.set(this,new ji),Jt.set(this,void 0),Hi(this,Jt,e,"f")}get sizeNodes(){return q(this,Fe,"f").size}get sizeEdges(){return q(this,Ne,"f").size}getNodes(){return q(this,Fe,"f").getSelection()}getEdges(){return q(this,Ne,"f").getSelection()}addNodes(...e){q(this,Fe,"f").add(...e)}addEdges(...e){q(this,Ne,"f").add(...e)}deleteNodes(e){q(this,Fe,"f").delete(e)}deleteEdges(e){q(this,Ne,"f").delete(e)}clear(){q(this,Fe,"f").clear(),q(this,Ne,"f").clear()}commit(...e){let t={nodes:q(this,Fe,"f").commit(),edges:q(this,Ne,"f").commit()};return q(this,Jt,"f").call(this,t,...e),t}};Fe=new WeakMap,Ne=new WeakMap,Jt=new WeakMap;var _n=class{constructor(e,t){this.body=e,this.canvas=t,this._selectionAccumulator=new wn,this.hoverObj={nodes:{},edges:{}},this.options={},this.defaultOptions={multiselect:!1,selectable:!0,selectConnectedEdges:!0,hoverConnectedEdges:!0},Object.assign(this.options,this.defaultOptions),this.body.emitter.on("_dataChanged",()=>{this.updateSelection()})}setOptions(e){e!==void 0&&Ve(["multiselect","hoverConnectedEdges","selectable","selectConnectedEdges"],this.options,e)}selectOnPoint(e){let t=!1;if(this.options.selectable===!0){let i=this.getNodeAt(e)||this.getEdgeAt(e);this.unselectAll(),i!==void 0&&(t=this.selectObject(i)),this.body.emitter.emit("_requestRedraw")}return t}selectAdditionalOnPoint(e){let t=!1;if(this.options.selectable===!0){let i=this.getNodeAt(e)||this.getEdgeAt(e);i!==void 0&&(t=!0,i.isSelected()===!0?this.deselectObject(i):this.selectObject(i),this.body.emitter.emit("_requestRedraw"))}return t}_initBaseEvent(e,t){let i={};return i.pointer={DOM:{x:t.x,y:t.y},canvas:this.canvas.DOMtoCanvas(t)},i.event=e,i}generateClickEvent(e,t,i,s,o=!1){let r=this._initBaseEvent(t,i);if(o===!0)r.nodes=[],r.edges=[];else{let a=this.getSelection();r.nodes=a.nodes,r.edges=a.edges}s!==void 0&&(r.previousSelection=s),e=="click"&&(r.items=this.getClickedItems(i)),t.controlEdge!==void 0&&(r.controlEdge=t.controlEdge),this.body.emitter.emit(e,r)}selectObject(e,t=this.options.selectConnectedEdges){return e!==void 0?(e instanceof U?(t===!0&&this._selectionAccumulator.addEdges(...e.edges),this._selectionAccumulator.addNodes(e)):this._selectionAccumulator.addEdges(e),!0):!1}deselectObject(e){e.isSelected()===!0&&(e.selected=!1,this._removeFromSelection(e))}_getAllNodesOverlappingWith(e){let t=[],i=this.body.nodes;for(let s=0;s0)return t===!0?this.body.nodes[s[s.length-1]]:s[s.length-1]}_getEdgesOverlappingWith(e,t){let i=this.body.edges;for(let s=0;s0&&(this.generateClickEvent("deselectEdge",t,e,o),i=!0),s.nodes.deleted.length>0&&(this.generateClickEvent("deselectNode",t,e,o),i=!0),s.nodes.added.length>0&&(this.generateClickEvent("selectNode",t,e),i=!0),s.edges.added.length>0&&(this.generateClickEvent("selectEdge",t,e),i=!0),i===!0&&this.generateClickEvent("select",t,e)}getSelection(){return{nodes:this.getSelectedNodeIds(),edges:this.getSelectedEdgeIds()}}getSelectedNodes(){return this._selectionAccumulator.getNodes()}getSelectedEdges(){return this._selectionAccumulator.getEdges()}getSelectedNodeIds(){return this._selectionAccumulator.getNodes().map(e=>e.id)}getSelectedEdgeIds(){return this._selectionAccumulator.getEdges().map(e=>e.id)}setSelection(e,t={}){if(!e||!e.nodes&&!e.edges)throw new TypeError("Selection must be an object with nodes and/or edges properties");if((t.unselectAll||t.unselectAll===void 0)&&this.unselectAll(),e.nodes)for(let i of e.nodes){let s=this.body.nodes[i];if(!s)throw new RangeError('Node with id "'+i+'" not found');this.selectObject(s,t.highlightEdges)}if(e.edges)for(let i of e.edges){let s=this.body.edges[i];if(!s)throw new RangeError('Edge with id "'+i+'" not found');this.selectObject(s)}this.body.emitter.emit("_requestRedraw"),this._selectionAccumulator.commit()}selectNodes(e,t=!0){if(!e||e.length===void 0)throw"Selection must be an array with ids";this.setSelection({nodes:e},{highlightEdges:t})}selectEdges(e){if(!e||e.length===void 0)throw"Selection must be an array with ids";this.setSelection({edges:e})}updateSelection(){for(let e in this._selectionAccumulator.getNodes())Object.prototype.hasOwnProperty.call(this.body.nodes,e.id)||this._selectionAccumulator.deleteNodes(e);for(let e in this._selectionAccumulator.getEdges())Object.prototype.hasOwnProperty.call(this.body.edges,e.id)||this._selectionAccumulator.deleteEdges(e)}getClickedItems(e){let t=this.canvas.DOMtoCanvas(e),i=[],s=this.body.nodeIndices,o=this.body.nodes;for(let d=s.length-1;d>=0;d--){let l=o[s[d]].getItemsOnPoint(t);i.push.apply(i,l)}let r=this.body.edgeIndices,a=this.body.edges;for(let d=r.length-1;d>=0;d--){let l=a[r[d]].getItemsOnPoint(t);i.push.apply(i,l)}return i}},Wi=class{abstract(){throw new Error("Can't instantiate abstract class!")}fake_use(){}curveType(){return this.abstract()}getPosition(e){return this.fake_use(e),this.abstract()}setPosition(e,t,i=void 0){this.fake_use(e,t,i),this.abstract()}getTreeSize(e){return this.fake_use(e),this.abstract()}sort(e){this.fake_use(e),this.abstract()}fix(e,t){this.fake_use(e,t),this.abstract()}shift(e,t){this.fake_use(e,t),this.abstract()}},En=class extends Wi{constructor(e){super();this.layout=e}curveType(){return"horizontal"}getPosition(e){return e.x}setPosition(e,t,i=void 0){i!==void 0&&this.layout.hierarchical.addToOrdering(e,i),e.x=t}getTreeSize(e){let t=this.layout.hierarchical.getTreeSize(this.layout.body.nodes,e);return{min:t.min_x,max:t.max_x}}sort(e){(0,wt.sort)(e,function(t,i){return t.x-i.x})}fix(e,t){e.y=this.layout.options.hierarchical.levelSeparation*t,e.options.fixed.y=!0}shift(e,t){this.layout.body.nodes[e].x+=t}},xn=class extends Wi{constructor(e){super();this.layout=e}curveType(){return"vertical"}getPosition(e){return e.y}setPosition(e,t,i=void 0){i!==void 0&&this.layout.hierarchical.addToOrdering(e,i),e.y=t}getTreeSize(e){let t=this.layout.hierarchical.getTreeSize(this.layout.body.nodes,e);return{min:t.min_y,max:t.max_y}}sort(e){(0,wt.sort)(e,function(t,i){return t.y-i.y})}fix(e,t){e.x=this.layout.options.hierarchical.levelSeparation*t,e.options.fixed.x=!0}shift(e,t){this.layout.body.nodes[e].y+=t}};function Ba(n,e){let t=new Set;return n.forEach(i=>{i.edges.forEach(s=>{s.connected&&t.add(s)})}),t.forEach(i=>{let s=i.from.id,o=i.to.id;e[s]==null&&(e[s]=0),(e[o]==null||e[s]>=e[o])&&(e[o]=e[s]+1)}),e}function Aa(n){return Cn(e=>e.edges.filter(t=>n.has(t.toId)).every(t=>t.to===e),(e,t)=>t>e,"from",n)}function za(n){return Cn(e=>e.edges.filter(t=>n.has(t.toId)).every(t=>t.from===e),(e,t)=>td+1+h.edges.length,0),r=t+"Id",a=t==="to"?1:-1;for(let[d,h]of i){if(!i.has(d)||!n(h))continue;s[d]=0;let l=[h],c=0,u;for(;u=l.pop();){if(!i.has(d))continue;let p=s[u.id]+a;if(u.edges.filter(b=>b.connected&&b.to!==b.from&&b[t]!==u&&i.has(b.toId)&&i.has(b.fromId)).forEach(b=>{let C=b[r],f=s[C];(f==null||e(p,f))&&(s[C]=p,l.push(b[t]))}),c>o)return Ba(i,s);++c}}return s}var Tn=class{constructor(){this.childrenReference={},this.parentReference={},this.trees={},this.distributionOrdering={},this.levels={},this.distributionIndex={},this.isTree=!1,this.treeIndex=-1}addRelation(e,t){this.childrenReference[e]===void 0&&(this.childrenReference[e]=[]),this.childrenReference[e].push(t),this.parentReference[t]===void 0&&(this.parentReference[t]=[]),this.parentReference[t].push(e)}checkIfTree(){for(let e in this.parentReference)if(this.parentReference[e].length>1){this.isTree=!1;return}this.isTree=!0}numTrees(){return this.treeIndex+1}setTreeIndex(e,t){t!==void 0&&this.trees[e.id]===void 0&&(this.trees[e.id]=t,this.treeIndex=Math.max(t,this.treeIndex))}ensureLevel(e){this.levels[e]===void 0&&(this.levels[e]=0)}getMaxLevel(e){let t={},i=s=>{if(t[s]!==void 0)return t[s];let o=this.levels[s];if(this.childrenReference[s]){let r=this.childrenReference[s];if(r.length>0)for(let a=0;a{this.setupHierarchicalLayout()}),this.body.emitter.on("_dataLoaded",()=>{this.layoutNetwork()}),this.body.emitter.on("_resetHierarchicalLayout",()=>{this.setupHierarchicalLayout()}),this.body.emitter.on("_adjustEdgesForHierarchicalLayout",()=>{if(this.options.hierarchical.enabled!==!0)return;let e=this.direction.curveType();this.body.emitter.emit("_forceDisableDynamicCurves",e,!1)})}setOptions(e,t){if(e!==void 0){let i=this.options.hierarchical,s=i.enabled;if(Ve(["randomSeed","improvedLayout","clusterThreshold"],this.options,e),ae(this.options,e,"hierarchical"),e.randomSeed!==void 0&&this._resetRNG(e.randomSeed),i.enabled===!0)return s===!0&&this.body.emitter.emit("refresh",!0),i.direction==="RL"||i.direction==="DU"?i.levelSeparation>0&&(i.levelSeparation*=-1):i.levelSeparation<0&&(i.levelSeparation*=-1),this.setDirectionStrategy(),this.body.emitter.emit("_resetHierarchicalLayout"),this.adaptAllOptionsForHierarchicalLayout(t);if(s===!0)return this.body.emitter.emit("refresh"),j(t,this.optionsBackup)}return t}_resetRNG(e){this.initialRandomSeed=e,this._rng=gt(this.initialRandomSeed)}adaptAllOptionsForHierarchicalLayout(e){if(this.options.hierarchical.enabled===!0){let t=this.optionsBackup.physics;e.physics===void 0||e.physics===!0?(e.physics={enabled:t.enabled===void 0?!0:t.enabled,solver:"hierarchicalRepulsion"},t.enabled=t.enabled===void 0?!0:t.enabled,t.solver=t.solver||"barnesHut"):typeof e.physics=="object"?(t.enabled=e.physics.enabled===void 0?!0:e.physics.enabled,t.solver=e.physics.solver||"barnesHut",e.physics.solver="hierarchicalRepulsion"):e.physics!==!1&&(t.solver="barnesHut",e.physics={solver:"hierarchicalRepulsion"});let i=this.direction.curveType();if(e.edges===void 0)this.optionsBackup.edges={smooth:{enabled:!0,type:"dynamic"}},e.edges={smooth:!1};else if(e.edges.smooth===void 0)this.optionsBackup.edges={smooth:{enabled:!0,type:"dynamic"}},e.edges.smooth=!1;else if(typeof e.edges.smooth=="boolean")this.optionsBackup.edges={smooth:e.edges.smooth},e.edges.smooth={enabled:e.edges.smooth,type:i};else{let s=e.edges.smooth;s.type!==void 0&&s.type!=="dynamic"&&(i=s.type),this.optionsBackup.edges={smooth:{enabled:s.enabled===void 0?!0:s.enabled,type:s.type===void 0?"dynamic":s.type,roundness:s.roundness===void 0?.5:s.roundness,forceDirection:s.forceDirection===void 0?!1:s.forceDirection}},e.edges.smooth={enabled:s.enabled===void 0?!0:s.enabled,type:i,roundness:s.roundness===void 0?.5:s.roundness,forceDirection:s.forceDirection===void 0?!1:s.forceDirection}}this.body.emitter.emit("_forceDisableDynamicCurves",i)}return e}positionInitially(e){if(this.options.hierarchical.enabled!==!0){this._resetRNG(this.initialRandomSeed);let t=e.length+50;for(let i=0;io){let d=e.length;for(;e.length>o&&s<=i;){s+=1;let h=e.length;s%3==0?this.body.modules.clustering.clusterBridges(r):this.body.modules.clustering.clusterOutliers(r);let l=e.length;if(h==l&&s%3!=0){this._declusterAll(),this.body.emitter.emit("_layoutFailed"),console.info("This network could not be positioned by this version of the improved layout algorithm. Please disable improvedLayout for better performance.");return}}this.body.modules.kamadaKawai.setOptions({springLength:Math.max(150,2*d)})}s>i&&console.info("The clustering didn't succeed within the amount of interations allowed, progressing with partial result."),this.body.modules.kamadaKawai.solve(e,this.body.edgeIndices,!0),this._shiftToCenter();let a=70;for(let d=0;d0){let e,t,i=!1,s=!1;this.lastNodeOnLevel={},this.hierarchical=new Tn;for(t in this.body.nodes)Object.prototype.hasOwnProperty.call(this.body.nodes,t)&&(e=this.body.nodes[t],e.options.level!==void 0?(i=!0,this.hierarchical.levels[t]=e.options.level):s=!0);if(s===!0&&i===!0)throw new Error("To use the hierarchical layout, nodes require either no predefined levels or levels have to be defined for all nodes.");{if(s===!0){let r=this.options.hierarchical.sortMethod;r==="hubsize"?this._determineLevelsByHubsize():r==="directed"?this._determineLevelsDirected():r==="custom"&&this._determineLevelsCustomCallback()}for(let r in this.body.nodes)Object.prototype.hasOwnProperty.call(this.body.nodes,r)&&this.hierarchical.ensureLevel(r);let o=this._getDistribution();this._generateMap(),this._placeNodesByHierarchy(o),this._condenseHierarchy(),this._shiftToCenter()}}}_condenseHierarchy(){let e=!1,t={},i=()=>{let f=o(),g=0;for(let m=0;m{let m=this.hierarchical.trees;for(let v in m)Object.prototype.hasOwnProperty.call(m,v)&&m[v]===f&&this.direction.shift(v,g)},o=()=>{let f=[];for(let g=0;g{if(!g[f.id]&&(g[f.id]=!0,this.hierarchical.childrenReference[f.id])){let m=this.hierarchical.childrenReference[f.id];if(m.length>0)for(let v=0;v{let m=1e9,v=1e9,_=1e9,E=-1e9;for(let T in f)if(Object.prototype.hasOwnProperty.call(f,T)){let x=this.body.nodes[T],w=this.hierarchical.levels[x.id],k=this.direction.getPosition(x),[N,W]=this._getSpaceAroundNode(x,f);m=Math.min(N,m),v=Math.min(W,v),w<=g&&(_=Math.min(k,_),E=Math.max(k,E))}return[_,E,m,v]},d=(f,g)=>{let m=this.hierarchical.getMaxLevel(f.id),v=this.hierarchical.getMaxLevel(g.id);return Math.min(m,v)},h=(f,g,m)=>{let v=this.hierarchical;for(let _=0;_1)for(let x=0;x{let v=this.direction.getPosition(f),_=this.direction.getPosition(g),E=Math.abs(_-v),T=this.options.hierarchical.nodeSpacing;if(E>T){let x={},w={};r(f,x),r(g,w);let k=d(f,g),N=a(x,k),W=a(w,k),L=N[1],R=W[0],B=W[2];if(Math.abs(L-R)>T){let D=L-R+T;D<-B+T&&(D=-B+T),D<0&&(this._shiftBlock(g.id,D),e=!0,m===!0&&this._centerParent(g))}}},c=(f,g)=>{let m=g.id,v=g.edges,_=this.hierarchical.levels[g.id],E=this.options.hierarchical.levelSeparation*this.options.hierarchical.levelSeparation,T={},x=[];for(let B=0;B{let D=0;for(let H=0;H{let D=0;for(let H=0;H{let D=this.direction.getPosition(g),H={};for(let Y=0;Y{let F=this.direction.getPosition(g);if(t[g.id]===void 0){let it={};r(g,it),t[g.id]=it}let D=a(t[g.id]),H=D[2],Y=D[3],ce=B-F,Xe=0;ce>0?Xe=Math.min(ce,Y-this.options.hierarchical.nodeSpacing):ce<0&&(Xe=-Math.min(-ce,H-this.options.hierarchical.nodeSpacing)),Xe!=0&&(this._shiftBlock(g.id,Xe),e=!0)},L=B=>{let F=this.direction.getPosition(g),[D,H]=this._getSpaceAroundNode(g),Y=B-F,ce=F;Y>0?ce=Math.min(F+(H-this.options.hierarchical.nodeSpacing),B):Y<0&&(ce=Math.max(F-(D-this.options.hierarchical.nodeSpacing),B)),ce!==F&&(this.direction.setPosition(g,ce),e=!0)},R=N(f,x);W(R),R=N(f,v),L(R)},u=f=>{let g=this.hierarchical.getLevels();g=g.reverse();for(let m=0;m{let g=this.hierarchical.getLevels();g=g.reverse();for(let m=0;m{for(let f in this.body.nodes)Object.prototype.hasOwnProperty.call(this.body.nodes,f)&&this._centerParent(this.body.nodes[f])},C=()=>{let f=this.hierarchical.getLevels();f=f.reverse();for(let g=0;g0&&Math.abs(c)0&&(d=this.direction.getPosition(i[o-1])+a),this.direction.setPosition(r,d,t),this._validatePositionAndContinue(r,t,d),s++}}}}_placeBranchNodes(e,t){let i=this.hierarchical.childrenReference[e];if(i===void 0)return;let s=[];for(let r=0;rt&&this.positionedNodes[a.id]===void 0){let h=this.options.hierarchical.nodeSpacing,l;r===0?l=this.direction.getPosition(this.body.nodes[e]):l=this.direction.getPosition(s[r-1])+h,this.direction.setPosition(a,l,d),this._validatePositionAndContinue(a,d,l)}else return}let o=this._getCenterPosition(s);this.direction.setPosition(this.body.nodes[e],o,t)}_validatePositionAndContinue(e,t,i){if(!!this.hierarchical.isTree){if(this.lastNodeOnLevel[t]!==void 0){let s=this.direction.getPosition(this.body.nodes[this.lastNodeOnLevel[t]]);if(i-s{this.body.edgeIndices.indexOf(i.id)!==-1&&t.push(i)}),t}_getHubSizes(){let e={},t=this.body.nodeIndices;A(t,s=>{let o=this.body.nodes[s],r=this._getActiveEdges(o).length;e[r]=!0});let i=[];return A(e,s=>{i.push(Number(s))}),wt.default.sort(i,function(s,o){return o-s}),i}_determineLevelsByHubsize(){let e=(i,s)=>{this.hierarchical.levelDownstream(i,s)},t=this._getHubSizes();for(let i=0;i{let r=this.body.nodes[o];s===this._getActiveEdges(r).length&&this._crawlNetwork(e,o)})}}_determineLevelsCustomCallback(){let e=1e5,t=function(s,o,r){},i=(s,o,r)=>{let a=this.hierarchical.levels[s.id];a===void 0&&(a=this.hierarchical.levels[s.id]=e);let d=t(J.cloneOptions(s,"node"),J.cloneOptions(o,"node"),J.cloneOptions(r,"edge"));this.hierarchical.levels[o.id]=a+d};this._crawlNetwork(i),this.hierarchical.setMinLevelToZero(this.body.nodes)}_determineLevelsDirected(){let e=this.body.nodeIndices.reduce((t,i)=>(t.set(i,this.body.nodes[i]),t),new Map);this.options.hierarchical.shakeTowards==="roots"?this.hierarchical.levels=za(e):this.hierarchical.levels=Aa(e),this.hierarchical.setMinLevelToZero(this.body.nodes)}_generateMap(){let e=(t,i)=>{this.hierarchical.levels[i.id]>this.hierarchical.levels[t.id]&&this.hierarchical.addRelation(t.id,i.id)};this._crawlNetwork(e),this.hierarchical.checkIfTree()}_crawlNetwork(e=function(){},t){let i={},s=(o,r)=>{if(i[o.id]===void 0){this.hierarchical.setTreeIndex(o,r),i[o.id]=!0;let a,d=this._getActiveEdges(o);for(let h=0;h{if(i[o])return;i[o]=!0,this.direction.shift(o,t);let r=this.hierarchical.childrenReference[o];if(r!==void 0)for(let a=0;a{let d=this.hierarchical.parentReference[a];if(d!==void 0)for(let h=0;h{let d=this.hierarchical.parentReference[a];if(d!==void 0)for(let h=0;h{this._clean()}),this.body.emitter.on("_dataChanged",this._restore.bind(this)),this.body.emitter.on("_resetData",this._restore.bind(this))}_restore(){this.inMode!==!1&&(this.options.initiallyActive===!0?this.enableEditMode():this.disableEditMode())}setOptions(e,t,i){t!==void 0&&(t.locale!==void 0?this.options.locale=t.locale:this.options.locale=i.locale,t.locales!==void 0?this.options.locales=t.locales:this.options.locales=i.locales),e!==void 0&&(typeof e=="boolean"?this.options.enabled=e:(this.options.enabled=!0,j(this.options,e)),this.options.initiallyActive===!0&&(this.editMode=!0),this._setup())}toggleEditMode(){this.editMode===!0?this.disableEditMode():this.enableEditMode()}enableEditMode(){this.editMode=!0,this._clean(),this.guiEnabled===!0&&(this.manipulationDiv.style.display="block",this.closeDiv.style.display="block",this.editModeDiv.style.display="none",this.showManipulatorToolbar())}disableEditMode(){this.editMode=!1,this._clean(),this.guiEnabled===!0&&(this.manipulationDiv.style.display="none",this.closeDiv.style.display="none",this.editModeDiv.style.display="block",this._createEditButton())}showManipulatorToolbar(){if(this._clean(),this.manipulationDOM={},this.guiEnabled===!0){this.editMode=!0,this.manipulationDiv.style.display="block",this.closeDiv.style.display="block";let e=this.selectionHandler.getSelectedNodeCount(),t=this.selectionHandler.getSelectedEdgeCount(),i=e+t,s=this.options.locales[this.options.locale],o=!1;this.options.addNode!==!1&&(this._createAddNodeButton(s),o=!0),this.options.addEdge!==!1&&(o===!0?this._createSeperator(1):o=!0,this._createAddEdgeButton(s)),e===1&&typeof this.options.editNode=="function"?(o===!0?this._createSeperator(2):o=!0,this._createEditNodeButton(s)):t===1&&e===0&&this.options.editEdge!==!1&&(o===!0?this._createSeperator(3):o=!0,this._createEditEdgeButton(s)),i!==0&&(e>0&&this.options.deleteNode!==!1?(o===!0&&this._createSeperator(4),this._createDeleteButton(s)):e===0&&this.options.deleteEdge!==!1&&(o===!0&&this._createSeperator(4),this._createDeleteButton(s))),this._bindElementEvents(this.closeDiv,this.toggleEditMode.bind(this)),this._temporaryBindEvent("select",this.showManipulatorToolbar.bind(this))}this.body.emitter.emit("_redraw")}addNodeMode(){if(this.editMode!==!0&&this.enableEditMode(),this._clean(),this.inMode="addNode",this.guiEnabled===!0){let e=this.options.locales[this.options.locale];this.manipulationDOM={},this._createBackButton(e),this._createSeperator(),this._createDescription(e.addDescription||this.options.locales.en.addDescription),this._bindElementEvents(this.closeDiv,this.toggleEditMode.bind(this))}this._temporaryBindEvent("click",this._performAddNode.bind(this))}editNode(){this.editMode!==!0&&this.enableEditMode(),this._clean();let e=this.selectionHandler.getSelectedNodes()[0];if(e!==void 0)if(this.inMode="editNode",typeof this.options.editNode=="function")if(e.isCluster!==!0){let t=j({},e.options,!1);if(t.x=e.x,t.y=e.y,this.options.editNode.length===2)this.options.editNode(t,i=>{i!=null&&this.inMode==="editNode"&&this.body.data.nodes.getDataSet().update(i),this.showManipulatorToolbar()});else throw new Error("The function for edit does not support two arguments (data, callback)")}else alert(this.options.locales[this.options.locale].editClusterError||this.options.locales.en.editClusterError);else throw new Error("No function has been configured to handle the editing of nodes.");else this.showManipulatorToolbar()}addEdgeMode(){if(this.editMode!==!0&&this.enableEditMode(),this._clean(),this.inMode="addEdge",this.guiEnabled===!0){let e=this.options.locales[this.options.locale];this.manipulationDOM={},this._createBackButton(e),this._createSeperator(),this._createDescription(e.edgeDescription||this.options.locales.en.edgeDescription),this._bindElementEvents(this.closeDiv,this.toggleEditMode.bind(this))}this._temporaryBindUI("onTouch",this._handleConnect.bind(this)),this._temporaryBindUI("onDragEnd",this._finishConnect.bind(this)),this._temporaryBindUI("onDrag",this._dragControlNode.bind(this)),this._temporaryBindUI("onRelease",this._finishConnect.bind(this)),this._temporaryBindUI("onDragStart",this._dragStartEdge.bind(this)),this._temporaryBindUI("onHold",()=>{})}editEdgeMode(){if(this.editMode!==!0&&this.enableEditMode(),this._clean(),this.inMode="editEdge",typeof this.options.editEdge=="object"&&typeof this.options.editEdge.editWithoutDrag=="function"&&(this.edgeBeingEditedId=this.selectionHandler.getSelectedEdgeIds()[0],this.edgeBeingEditedId!==void 0)){let e=this.body.edges[this.edgeBeingEditedId];this._performEditEdge(e.from.id,e.to.id);return}if(this.guiEnabled===!0){let e=this.options.locales[this.options.locale];this.manipulationDOM={},this._createBackButton(e),this._createSeperator(),this._createDescription(e.editEdgeDescription||this.options.locales.en.editEdgeDescription),this._bindElementEvents(this.closeDiv,this.toggleEditMode.bind(this))}if(this.edgeBeingEditedId=this.selectionHandler.getSelectedEdgeIds()[0],this.edgeBeingEditedId!==void 0){let e=this.body.edges[this.edgeBeingEditedId],t=this._getNewTargetNode(e.from.x,e.from.y),i=this._getNewTargetNode(e.to.x,e.to.y);this.temporaryIds.nodes.push(t.id),this.temporaryIds.nodes.push(i.id),this.body.nodes[t.id]=t,this.body.nodeIndices.push(t.id),this.body.nodes[i.id]=i,this.body.nodeIndices.push(i.id),this._temporaryBindUI("onTouch",this._controlNodeTouch.bind(this)),this._temporaryBindUI("onTap",()=>{}),this._temporaryBindUI("onHold",()=>{}),this._temporaryBindUI("onDragStart",this._controlNodeDragStart.bind(this)),this._temporaryBindUI("onDrag",this._controlNodeDrag.bind(this)),this._temporaryBindUI("onDragEnd",this._controlNodeDragEnd.bind(this)),this._temporaryBindUI("onMouseMove",()=>{}),this._temporaryBindEvent("beforeDrawing",s=>{let o=e.edgeType.findBorderPositions(s);t.selected===!1&&(t.x=o.from.x,t.y=o.from.y),i.selected===!1&&(i.x=o.to.x,i.y=o.to.y)}),this.body.emitter.emit("_redraw")}else this.showManipulatorToolbar()}deleteSelected(){this.editMode!==!0&&this.enableEditMode(),this._clean(),this.inMode="delete";let e=this.selectionHandler.getSelectedNodeIds(),t=this.selectionHandler.getSelectedEdgeIds(),i;if(e.length>0){for(let s=0;s0&&typeof this.options.deleteEdge=="function"&&(i=this.options.deleteEdge);if(typeof i=="function"){let s={nodes:e,edges:t};if(i.length===2)i(s,o=>{o!=null&&this.inMode==="delete"?(this.body.data.edges.getDataSet().remove(o.edges),this.body.data.nodes.getDataSet().remove(o.nodes),this.body.emitter.emit("startSimulation"),this.showManipulatorToolbar()):(this.body.emitter.emit("startSimulation"),this.showManipulatorToolbar())});else throw new Error("The function for delete does not support two arguments (data, callback)")}else this.body.data.edges.getDataSet().remove(t),this.body.data.nodes.getDataSet().remove(e),this.body.emitter.emit("startSimulation"),this.showManipulatorToolbar()}_setup(){this.options.enabled===!0?(this.guiEnabled=!0,this._createWrappers(),this.editMode===!1?this._createEditButton():this.showManipulatorToolbar()):(this._removeManipulationDOM(),this.guiEnabled=!1)}_createWrappers(){var e,t;this.manipulationDiv===void 0&&(this.manipulationDiv=document.createElement("div"),this.manipulationDiv.className="vis-manipulation",this.editMode===!0?this.manipulationDiv.style.display="block":this.manipulationDiv.style.display="none",this.canvas.frame.appendChild(this.manipulationDiv)),this.editModeDiv===void 0&&(this.editModeDiv=document.createElement("div"),this.editModeDiv.className="vis-edit-mode",this.editMode===!0?this.editModeDiv.style.display="none":this.editModeDiv.style.display="block",this.canvas.frame.appendChild(this.editModeDiv)),this.closeDiv===void 0&&(this.closeDiv=document.createElement("button"),this.closeDiv.className="vis-close",this.closeDiv.setAttribute("aria-label",(t=(e=this.options.locales[this.options.locale])==null?void 0:e.close)!=null?t:this.options.locales.en.close),this.closeDiv.style.display=this.manipulationDiv.style.display,this.canvas.frame.appendChild(this.closeDiv))}_getNewTargetNode(e,t){let i=j({},this.options.controlNodeStyle);i.id="targetNode"+Te(),i.hidden=!1,i.physics=!1,i.x=e,i.y=t;let s=this.body.functions.createNode(i);return s.shape.boundingBox={left:e,right:e,top:t,bottom:t},s}_createEditButton(){this._clean(),this.manipulationDOM={},_e(this.editModeDiv);let e=this.options.locales[this.options.locale],t=this._createButton("editMode","vis-edit vis-edit-mode",e.edit||this.options.locales.en.edit);this.editModeDiv.appendChild(t),this._bindElementEvents(t,this.toggleEditMode.bind(this))}_clean(){this.inMode=!1,this.guiEnabled===!0&&(_e(this.editModeDiv),_e(this.manipulationDiv),this._cleanupDOMEventListeners()),this._cleanupTemporaryNodesAndEdges(),this._unbindTemporaryUIs(),this._unbindTemporaryEvents(),this.body.emitter.emit("restorePhysics")}_cleanupDOMEventListeners(){for(let e of this._domEventListenerCleanupQueue.splice(0))e()}_removeManipulationDOM(){this._clean(),_e(this.manipulationDiv),_e(this.editModeDiv),_e(this.closeDiv),this.manipulationDiv&&this.canvas.frame.removeChild(this.manipulationDiv),this.editModeDiv&&this.canvas.frame.removeChild(this.editModeDiv),this.closeDiv&&this.canvas.frame.removeChild(this.closeDiv),this.manipulationDiv=void 0,this.editModeDiv=void 0,this.closeDiv=void 0}_createSeperator(e=1){this.manipulationDOM["seperatorLineDiv"+e]=document.createElement("div"),this.manipulationDOM["seperatorLineDiv"+e].className="vis-separator-line",this.manipulationDiv.appendChild(this.manipulationDOM["seperatorLineDiv"+e])}_createAddNodeButton(e){let t=this._createButton("addNode","vis-add",e.addNode||this.options.locales.en.addNode);this.manipulationDiv.appendChild(t),this._bindElementEvents(t,this.addNodeMode.bind(this))}_createAddEdgeButton(e){let t=this._createButton("addEdge","vis-connect",e.addEdge||this.options.locales.en.addEdge);this.manipulationDiv.appendChild(t),this._bindElementEvents(t,this.addEdgeMode.bind(this))}_createEditNodeButton(e){let t=this._createButton("editNode","vis-edit",e.editNode||this.options.locales.en.editNode);this.manipulationDiv.appendChild(t),this._bindElementEvents(t,this.editNode.bind(this))}_createEditEdgeButton(e){let t=this._createButton("editEdge","vis-edit",e.editEdge||this.options.locales.en.editEdge);this.manipulationDiv.appendChild(t),this._bindElementEvents(t,this.editEdgeMode.bind(this))}_createDeleteButton(e){let t;this.options.rtl?t="vis-delete-rtl":t="vis-delete";let i=this._createButton("delete",t,e.del||this.options.locales.en.del);this.manipulationDiv.appendChild(i),this._bindElementEvents(i,this.deleteSelected.bind(this))}_createBackButton(e){let t=this._createButton("back","vis-back",e.back||this.options.locales.en.back);this.manipulationDiv.appendChild(t),this._bindElementEvents(t,this.showManipulatorToolbar.bind(this))}_createButton(e,t,i,s="vis-label"){return this.manipulationDOM[e+"Div"]=document.createElement("button"),this.manipulationDOM[e+"Div"].className="vis-button "+t,this.manipulationDOM[e+"Label"]=document.createElement("div"),this.manipulationDOM[e+"Label"].className=s,this.manipulationDOM[e+"Label"].innerText=i,this.manipulationDOM[e+"Div"].appendChild(this.manipulationDOM[e+"Label"]),this.manipulationDOM[e+"Div"]}_createDescription(e){this.manipulationDOM.descriptionLabel=document.createElement("div"),this.manipulationDOM.descriptionLabel.className="vis-none",this.manipulationDOM.descriptionLabel.innerText=e,this.manipulationDiv.appendChild(this.manipulationDOM.descriptionLabel)}_temporaryBindEvent(e,t){this.temporaryEventFunctions.push({event:e,boundFunction:t}),this.body.emitter.on(e,t)}_temporaryBindUI(e,t){if(this.body.eventListeners[e]!==void 0)this.temporaryUIFunctions[e]=this.body.eventListeners[e],this.body.eventListeners[e]=t;else throw new Error("This UI function does not exist. Typo? You tried: "+e+" possible are: "+JSON.stringify(Object.keys(this.body.eventListeners)))}_unbindTemporaryUIs(){for(let e in this.temporaryUIFunctions)Object.prototype.hasOwnProperty.call(this.temporaryUIFunctions,e)&&(this.body.eventListeners[e]=this.temporaryUIFunctions[e],delete this.temporaryUIFunctions[e]);this.temporaryUIFunctions={}}_unbindTemporaryEvents(){for(let e=0;e{i.destroy()});let s=({keyCode:o,key:r})=>{(r==="Enter"||r===" "||o===13||o===32)&&t()};e.addEventListener("keyup",s,!1),this._domEventListenerCleanupQueue.push(()=>{e.removeEventListener("keyup",s,!1)})}_cleanupTemporaryNodesAndEdges(){for(let e=0;e=0;a--)if(o[a]!==this.selectedControlNode.id){r=this.body.nodes[o[a]];break}if(r!==void 0&&this.selectedControlNode!==void 0)if(r.isCluster===!0)alert(this.options.locales[this.options.locale].createEdgeError||this.options.locales.en.createEdgeError);else{let a=this.body.nodes[this.temporaryIds.nodes[0]];this.selectedControlNode.id===a.id?this._performEditEdge(r.id,s.to.id):this._performEditEdge(s.from.id,r.id)}else s.updateEdgeType(),this.body.emitter.emit("restorePhysics");this.body.emitter.emit("_redraw")}_handleConnect(e){if(new Date().valueOf()-this.touchTime>100){this.lastTouch=this.body.functions.getPointer(e.center),this.lastTouch.translation=Object.assign({},this.body.view.translation),this.interactionHandler.drag.pointer=this.lastTouch,this.interactionHandler.drag.translation=this.lastTouch.translation;let t=this.lastTouch,i=this.selectionHandler.getNodeAt(t);if(i!==void 0)if(i.isCluster===!0)alert(this.options.locales[this.options.locale].createEdgeError||this.options.locales.en.createEdgeError);else{let s=this._getNewTargetNode(i.x,i.y);this.body.nodes[s.id]=s,this.body.nodeIndices.push(s.id);let o=this.body.functions.createEdge({id:"connectionEdge"+Te(),from:i.id,to:s.id,physics:!1,smooth:{enabled:!0,type:"continuous",roundness:.5}});this.body.edges[o.id]=o,this.body.edgeIndices.push(o.id),this.temporaryIds.nodes.push(s.id),this.temporaryIds.edges.push(o.id)}this.touchTime=new Date().valueOf()}}_dragControlNode(e){let t=this.body.functions.getPointer(e.center),i=this.selectionHandler._pointerToPositionObject(t),s;this.temporaryIds.edges[0]!==void 0&&(s=this.body.edges[this.temporaryIds.edges[0]].fromId);let o=this.selectionHandler._getAllNodesOverlappingWith(i),r;for(let a=o.length-1;a>=0;a--)if(this.temporaryIds.nodes.indexOf(o[a])===-1){r=this.body.nodes[o[a]];break}if(e.controlEdge={from:s,to:r?r.id:void 0},this.selectionHandler.generateClickEvent("controlNodeDragging",e,t),this.temporaryIds.nodes[0]!==void 0){let a=this.body.nodes[this.temporaryIds.nodes[0]];a.x=this.canvas._XconvertDOMtoCanvas(t.x),a.y=this.canvas._YconvertDOMtoCanvas(t.y),this.body.emitter.emit("_redraw")}else this.interactionHandler.onDrag(e)}_finishConnect(e){let t=this.body.functions.getPointer(e.center),i=this.selectionHandler._pointerToPositionObject(t),s;this.temporaryIds.edges[0]!==void 0&&(s=this.body.edges[this.temporaryIds.edges[0]].fromId);let o=this.selectionHandler._getAllNodesOverlappingWith(i),r;for(let a=o.length-1;a>=0;a--)if(this.temporaryIds.nodes.indexOf(o[a])===-1){r=this.body.nodes[o[a]];break}this._cleanupTemporaryNodesAndEdges(),r!==void 0&&(r.isCluster===!0?alert(this.options.locales[this.options.locale].createEdgeError||this.options.locales.en.createEdgeError):this.body.nodes[s]!==void 0&&this.body.nodes[r.id]!==void 0&&this._performAddEdge(s,r.id)),e.controlEdge={from:s,to:r?r.id:void 0},this.selectionHandler.generateClickEvent("controlNodeDragEnd",e,t),this.body.emitter.emit("_redraw")}_dragStartEdge(e){let t=this.lastTouch;this.selectionHandler.generateClickEvent("dragStart",e,t,void 0,!0)}_performAddNode(e){let t={id:Te(),x:e.pointer.canvas.x,y:e.pointer.canvas.y,label:"new"};if(typeof this.options.addNode=="function")if(this.options.addNode.length===2)this.options.addNode(t,i=>{i!=null&&this.inMode==="addNode"&&this.body.data.nodes.getDataSet().add(i),this.showManipulatorToolbar()});else throw this.showManipulatorToolbar(),new Error("The function for add does not support two arguments (data,callback)");else this.body.data.nodes.getDataSet().add(t),this.showManipulatorToolbar()}_performAddEdge(e,t){let i={from:e,to:t};if(typeof this.options.addEdge=="function")if(this.options.addEdge.length===2)this.options.addEdge(i,s=>{s!=null&&this.inMode==="addEdge"&&(this.body.data.edges.getDataSet().add(s),this.selectionHandler.unselectAll(),this.showManipulatorToolbar())});else throw new Error("The function for connect does not support two arguments (data,callback)");else this.body.data.edges.getDataSet().add(i),this.selectionHandler.unselectAll(),this.showManipulatorToolbar()}_performEditEdge(e,t){let i={id:this.edgeBeingEditedId,from:e,to:t,label:this.body.data.edges.get(this.edgeBeingEditedId).label},s=this.options.editEdge;if(typeof s=="object"&&(s=s.editWithoutDrag),typeof s=="function")if(s.length===2)s(i,o=>{o==null||this.inMode!=="editEdge"?(this.body.edges[i.id].updateEdgeType(),this.body.emitter.emit("_redraw"),this.showManipulatorToolbar()):(this.body.data.edges.getDataSet().update(o),this.selectionHandler.unselectAll(),this.showManipulatorToolbar())});else throw new Error("The function for edit does not support two arguments (data, callback)");else this.body.data.edges.getDataSet().update(i),this.selectionHandler.unselectAll(),this.showManipulatorToolbar()}},O="string",S="boolean",y="number",xt="array",P="object",On="dom",La="any",Vi=["arrow","bar","box","circle","crow","curve","diamond","image","inv_curve","inv_triangle","triangle","vee"],qi={borderWidth:{number:y},borderWidthSelected:{number:y,undefined:"undefined"},brokenImage:{string:O,undefined:"undefined"},chosen:{label:{boolean:S,function:"function"},node:{boolean:S,function:"function"},__type__:{object:P,boolean:S}},color:{border:{string:O},background:{string:O},highlight:{border:{string:O},background:{string:O},__type__:{object:P,string:O}},hover:{border:{string:O},background:{string:O},__type__:{object:P,string:O}},__type__:{object:P,string:O}},opacity:{number:y,undefined:"undefined"},fixed:{x:{boolean:S},y:{boolean:S},__type__:{object:P,boolean:S}},font:{align:{string:O},color:{string:O},size:{number:y},face:{string:O},background:{string:O},strokeWidth:{number:y},strokeColor:{string:O},vadjust:{number:y},multi:{boolean:S,string:O},bold:{color:{string:O},size:{number:y},face:{string:O},mod:{string:O},vadjust:{number:y},__type__:{object:P,string:O}},boldital:{color:{string:O},size:{number:y},face:{string:O},mod:{string:O},vadjust:{number:y},__type__:{object:P,string:O}},ital:{color:{string:O},size:{number:y},face:{string:O},mod:{string:O},vadjust:{number:y},__type__:{object:P,string:O}},mono:{color:{string:O},size:{number:y},face:{string:O},mod:{string:O},vadjust:{number:y},__type__:{object:P,string:O}},__type__:{object:P,string:O}},group:{string:O,number:y,undefined:"undefined"},heightConstraint:{minimum:{number:y},valign:{string:O},__type__:{object:P,boolean:S,number:y}},hidden:{boolean:S},icon:{face:{string:O},code:{string:O},size:{number:y},color:{string:O},weight:{string:O,number:y},__type__:{object:P}},id:{string:O,number:y},image:{selected:{string:O,undefined:"undefined"},unselected:{string:O,undefined:"undefined"},__type__:{object:P,string:O}},imagePadding:{top:{number:y},right:{number:y},bottom:{number:y},left:{number:y},__type__:{object:P,number:y}},label:{string:O,undefined:"undefined"},labelHighlightBold:{boolean:S},level:{number:y,undefined:"undefined"},margin:{top:{number:y},right:{number:y},bottom:{number:y},left:{number:y},__type__:{object:P,number:y}},mass:{number:y},physics:{boolean:S},scaling:{min:{number:y},max:{number:y},label:{enabled:{boolean:S},min:{number:y},max:{number:y},maxVisible:{number:y},drawThreshold:{number:y},__type__:{object:P,boolean:S}},customScalingFunction:{function:"function"},__type__:{object:P}},shadow:{enabled:{boolean:S},color:{string:O},size:{number:y},x:{number:y},y:{number:y},__type__:{object:P,boolean:S}},shape:{string:["custom","ellipse","circle","database","box","text","image","circularImage","diamond","dot","star","triangle","triangleDown","square","icon","hexagon"]},ctxRenderer:{function:"function"},shapeProperties:{borderDashes:{boolean:S,array:xt},borderRadius:{number:y},interpolation:{boolean:S},useImageSize:{boolean:S},useBorderWithImage:{boolean:S},coordinateOrigin:{string:["center","top-left"]},__type__:{object:P}},size:{number:y},title:{string:O,dom:On,undefined:"undefined"},value:{number:y,undefined:"undefined"},widthConstraint:{minimum:{number:y},maximum:{number:y},__type__:{object:P,boolean:S,number:y}},x:{number:y},y:{number:y},__type__:{object:P}},Ra={configure:{enabled:{boolean:S},filter:{boolean:S,string:O,array:xt,function:"function"},container:{dom:On},showButton:{boolean:S},__type__:{object:P,boolean:S,string:O,array:xt,function:"function"}},edges:{arrows:{to:{enabled:{boolean:S},scaleFactor:{number:y},type:{string:Vi},imageHeight:{number:y},imageWidth:{number:y},src:{string:O},__type__:{object:P,boolean:S}},middle:{enabled:{boolean:S},scaleFactor:{number:y},type:{string:Vi},imageWidth:{number:y},imageHeight:{number:y},src:{string:O},__type__:{object:P,boolean:S}},from:{enabled:{boolean:S},scaleFactor:{number:y},type:{string:Vi},imageWidth:{number:y},imageHeight:{number:y},src:{string:O},__type__:{object:P,boolean:S}},__type__:{string:["from","to","middle"],object:P}},endPointOffset:{from:{number:y},to:{number:y},__type__:{object:P,number:y}},arrowStrikethrough:{boolean:S},background:{enabled:{boolean:S},color:{string:O},size:{number:y},dashes:{boolean:S,array:xt},__type__:{object:P,boolean:S}},chosen:{label:{boolean:S,function:"function"},edge:{boolean:S,function:"function"},__type__:{object:P,boolean:S}},color:{color:{string:O},highlight:{string:O},hover:{string:O},inherit:{string:["from","to","both"],boolean:S},opacity:{number:y},__type__:{object:P,string:O}},dashes:{boolean:S,array:xt},font:{color:{string:O},size:{number:y},face:{string:O},background:{string:O},strokeWidth:{number:y},strokeColor:{string:O},align:{string:["horizontal","top","middle","bottom"]},vadjust:{number:y},multi:{boolean:S,string:O},bold:{color:{string:O},size:{number:y},face:{string:O},mod:{string:O},vadjust:{number:y},__type__:{object:P,string:O}},boldital:{color:{string:O},size:{number:y},face:{string:O},mod:{string:O},vadjust:{number:y},__type__:{object:P,string:O}},ital:{color:{string:O},size:{number:y},face:{string:O},mod:{string:O},vadjust:{number:y},__type__:{object:P,string:O}},mono:{color:{string:O},size:{number:y},face:{string:O},mod:{string:O},vadjust:{number:y},__type__:{object:P,string:O}},__type__:{object:P,string:O}},hidden:{boolean:S},hoverWidth:{function:"function",number:y},label:{string:O,undefined:"undefined"},labelHighlightBold:{boolean:S},length:{number:y,undefined:"undefined"},physics:{boolean:S},scaling:{min:{number:y},max:{number:y},label:{enabled:{boolean:S},min:{number:y},max:{number:y},maxVisible:{number:y},drawThreshold:{number:y},__type__:{object:P,boolean:S}},customScalingFunction:{function:"function"},__type__:{object:P}},selectionWidth:{function:"function",number:y},selfReferenceSize:{number:y},selfReference:{size:{number:y},angle:{number:y},renderBehindTheNode:{boolean:S},__type__:{object:P}},shadow:{enabled:{boolean:S},color:{string:O},size:{number:y},x:{number:y},y:{number:y},__type__:{object:P,boolean:S}},smooth:{enabled:{boolean:S},type:{string:["dynamic","continuous","discrete","diagonalCross","straightCross","horizontal","vertical","curvedCW","curvedCCW","cubicBezier"]},roundness:{number:y},forceDirection:{string:["horizontal","vertical","none"],boolean:S},__type__:{object:P,boolean:S}},title:{string:O,undefined:"undefined"},width:{number:y},widthConstraint:{maximum:{number:y},__type__:{object:P,boolean:S,number:y}},value:{number:y,undefined:"undefined"},__type__:{object:P}},groups:{useDefaultGroups:{boolean:S},__any__:qi,__type__:{object:P}},interaction:{dragNodes:{boolean:S},dragView:{boolean:S},hideEdgesOnDrag:{boolean:S},hideEdgesOnZoom:{boolean:S},hideNodesOnDrag:{boolean:S},hover:{boolean:S},keyboard:{enabled:{boolean:S},speed:{x:{number:y},y:{number:y},zoom:{number:y},__type__:{object:P}},bindToWindow:{boolean:S},autoFocus:{boolean:S},__type__:{object:P,boolean:S}},multiselect:{boolean:S},navigationButtons:{boolean:S},selectable:{boolean:S},selectConnectedEdges:{boolean:S},hoverConnectedEdges:{boolean:S},tooltipDelay:{number:y},zoomView:{boolean:S},zoomSpeed:{number:y},__type__:{object:P}},layout:{randomSeed:{undefined:"undefined",number:y,string:O},improvedLayout:{boolean:S},clusterThreshold:{number:y},hierarchical:{enabled:{boolean:S},levelSeparation:{number:y},nodeSpacing:{number:y},treeSpacing:{number:y},blockShifting:{boolean:S},edgeMinimization:{boolean:S},parentCentralization:{boolean:S},direction:{string:["UD","DU","LR","RL"]},sortMethod:{string:["hubsize","directed"]},shakeTowards:{string:["leaves","roots"]},__type__:{object:P,boolean:S}},__type__:{object:P}},manipulation:{enabled:{boolean:S},initiallyActive:{boolean:S},addNode:{boolean:S,function:"function"},addEdge:{boolean:S,function:"function"},editNode:{function:"function"},editEdge:{editWithoutDrag:{function:"function"},__type__:{object:P,boolean:S,function:"function"}},deleteNode:{boolean:S,function:"function"},deleteEdge:{boolean:S,function:"function"},controlNodeStyle:qi,__type__:{object:P,boolean:S}},nodes:qi,physics:{enabled:{boolean:S},barnesHut:{theta:{number:y},gravitationalConstant:{number:y},centralGravity:{number:y},springLength:{number:y},springConstant:{number:y},damping:{number:y},avoidOverlap:{number:y},__type__:{object:P}},forceAtlas2Based:{theta:{number:y},gravitationalConstant:{number:y},centralGravity:{number:y},springLength:{number:y},springConstant:{number:y},damping:{number:y},avoidOverlap:{number:y},__type__:{object:P}},repulsion:{centralGravity:{number:y},springLength:{number:y},springConstant:{number:y},nodeDistance:{number:y},damping:{number:y},__type__:{object:P}},hierarchicalRepulsion:{centralGravity:{number:y},springLength:{number:y},springConstant:{number:y},nodeDistance:{number:y},damping:{number:y},avoidOverlap:{number:y},__type__:{object:P}},maxVelocity:{number:y},minVelocity:{number:y},solver:{string:["barnesHut","repulsion","hierarchicalRepulsion","forceAtlas2Based"]},stabilization:{enabled:{boolean:S},iterations:{number:y},updateInterval:{number:y},onlyDynamicEdges:{boolean:S},fit:{boolean:S},__type__:{object:P,boolean:S}},timestep:{number:y},adaptiveTimestep:{boolean:S},wind:{x:{number:y},y:{number:y},__type__:{object:P}},__type__:{object:P,boolean:S}},autoResize:{boolean:S},clickToUse:{boolean:S},locale:{string:O},locales:{__any__:{any:La},__type__:{object:P}},height:{string:O},width:{string:O},__type__:{object:P}},In={nodes:{borderWidth:[1,0,10,1],borderWidthSelected:[2,0,10,1],color:{border:["color","#2B7CE9"],background:["color","#97C2FC"],highlight:{border:["color","#2B7CE9"],background:["color","#D2E5FF"]},hover:{border:["color","#2B7CE9"],background:["color","#D2E5FF"]}},opacity:[0,0,1,.1],fixed:{x:!1,y:!1},font:{color:["color","#343434"],size:[14,0,100,1],face:["arial","verdana","tahoma"],background:["color","none"],strokeWidth:[0,0,50,1],strokeColor:["color","#ffffff"]},hidden:!1,labelHighlightBold:!0,physics:!0,scaling:{min:[10,0,200,1],max:[30,0,200,1],label:{enabled:!1,min:[14,0,200,1],max:[30,0,200,1],maxVisible:[30,0,200,1],drawThreshold:[5,0,20,1]}},shadow:{enabled:!1,color:"rgba(0,0,0,0.5)",size:[10,0,20,1],x:[5,-30,30,1],y:[5,-30,30,1]},shape:["ellipse","box","circle","database","diamond","dot","square","star","text","triangle","triangleDown","hexagon"],shapeProperties:{borderDashes:!1,borderRadius:[6,0,20,1],interpolation:!0,useImageSize:!1},size:[25,0,200,1]},edges:{arrows:{to:{enabled:!1,scaleFactor:[1,0,3,.05],type:"arrow"},middle:{enabled:!1,scaleFactor:[1,0,3,.05],type:"arrow"},from:{enabled:!1,scaleFactor:[1,0,3,.05],type:"arrow"}},endPointOffset:{from:[0,-10,10,1],to:[0,-10,10,1]},arrowStrikethrough:!0,color:{color:["color","#848484"],highlight:["color","#848484"],hover:["color","#848484"],inherit:["from","to","both",!0,!1],opacity:[1,0,1,.05]},dashes:!1,font:{color:["color","#343434"],size:[14,0,100,1],face:["arial","verdana","tahoma"],background:["color","none"],strokeWidth:[2,0,50,1],strokeColor:["color","#ffffff"],align:["horizontal","top","middle","bottom"]},hidden:!1,hoverWidth:[1.5,0,5,.1],labelHighlightBold:!0,physics:!0,scaling:{min:[1,0,100,1],max:[15,0,100,1],label:{enabled:!0,min:[14,0,200,1],max:[30,0,200,1],maxVisible:[30,0,200,1],drawThreshold:[5,0,20,1]}},selectionWidth:[1.5,0,5,.1],selfReferenceSize:[20,0,200,1],selfReference:{size:[20,0,200,1],angle:[Math.PI/2,-6*Math.PI,6*Math.PI,Math.PI/8],renderBehindTheNode:!0},shadow:{enabled:!1,color:"rgba(0,0,0,0.5)",size:[10,0,20,1],x:[5,-30,30,1],y:[5,-30,30,1]},smooth:{enabled:!0,type:["dynamic","continuous","discrete","diagonalCross","straightCross","horizontal","vertical","curvedCW","curvedCCW","cubicBezier"],forceDirection:["horizontal","vertical","none"],roundness:[.5,0,1,.05]},width:[1,0,30,1]},layout:{hierarchical:{enabled:!1,levelSeparation:[150,20,500,5],nodeSpacing:[100,20,500,5],treeSpacing:[200,20,500,5],blockShifting:!0,edgeMinimization:!0,parentCentralization:!0,direction:["UD","DU","LR","RL"],sortMethod:["hubsize","directed"],shakeTowards:["leaves","roots"]}},interaction:{dragNodes:!0,dragView:!0,hideEdgesOnDrag:!1,hideEdgesOnZoom:!1,hideNodesOnDrag:!1,hover:!1,keyboard:{enabled:!1,speed:{x:[10,0,40,1],y:[10,0,40,1],zoom:[.02,0,.1,.005]},bindToWindow:!0,autoFocus:!0},multiselect:!1,navigationButtons:!1,selectable:!0,selectConnectedEdges:!0,hoverConnectedEdges:!0,tooltipDelay:[300,0,1e3,25],zoomView:!0,zoomSpeed:[1,.1,2,.1]},manipulation:{enabled:!1,initiallyActive:!1},physics:{enabled:!0,barnesHut:{theta:[.5,.1,1,.05],gravitationalConstant:[-2e3,-3e4,0,50],centralGravity:[.3,0,10,.05],springLength:[95,0,500,5],springConstant:[.04,0,1.2,.005],damping:[.09,0,1,.01],avoidOverlap:[0,0,1,.01]},forceAtlas2Based:{theta:[.5,.1,1,.05],gravitationalConstant:[-50,-500,0,1],centralGravity:[.01,0,1,.005],springLength:[95,0,500,5],springConstant:[.08,0,1.2,.005],damping:[.4,0,1,.01],avoidOverlap:[0,0,1,.01]},repulsion:{centralGravity:[.2,0,10,.05],springLength:[200,0,500,5],springConstant:[.05,0,1.2,.005],nodeDistance:[100,0,500,5],damping:[.09,0,1,.01]},hierarchicalRepulsion:{centralGravity:[.2,0,10,.05],springLength:[100,0,500,5],springConstant:[.01,0,1.2,.005],nodeDistance:[120,0,500,5],damping:[.09,0,1,.01],avoidOverlap:[0,0,1,.01]},maxVelocity:[50,0,150,1],minVelocity:[.1,.01,.5,.01],solver:["barnesHut","forceAtlas2Based","repulsion","hierarchicalRepulsion"],timestep:[.5,.01,1,.01],wind:{x:[0,-10,10,.1],y:[0,-10,10,.1]}}},Ha=(n,e,t)=>!!(n.includes("physics")&&In.physics.solver.includes(e)&&t.physics.solver!==e&&e!=="wind");var Pn=class{constructor(){}getDistances(e,t,i){let s={},o=e.edges;for(let a=0;ao&&ar&&Cthis.body.emitter.emit("_requestRedraw")),this.groups=new Co,this.canvas=new gn(this.body),this.selectionHandler=new _n(this.body,this.canvas),this.interactionHandler=new bn(this.body,this.canvas,this.selectionHandler),this.view=new mn(this.body,this.canvas),this.renderer=new fn(this.body,this.canvas),this.physics=new ln(this.body),this.layoutEngine=new kn(this.body),this.clustering=new un(this.body),this.manipulation=new Sn(this.body,this.canvas,this.selectionHandler,this.interactionHandler),this.nodesHandler=new Vo(this.body,this.images,this.groups,this.layoutEngine),this.edgesHandler=new on(this.body,this.images,this.groups),this.body.modules.kamadaKawai=new Mn(this.body,150,.05),this.body.modules.clustering=this.clustering,this.canvas._create(),this.setOptions(t),this.setData(e)}(0,ro.default)(I.prototype);I.prototype.setOptions=function(n){if(n===null&&(n=void 0),n!==void 0){if($s.validate(n,Ra)===!0&&console.error("%cErrors have been found in the supplied options object.",Ei),Ve(["locale","locales","clickToUse"],this.options,n),n.locale!==void 0&&(n.locale=Ma(n.locales||this.options.locales,n.locale)),n=this.layoutEngine.setOptions(n.layout,n),this.canvas.setOptions(n),this.groups.setOptions(n.groups),this.nodesHandler.setOptions(n.nodes),this.edgesHandler.setOptions(n.edges),this.physics.setOptions(n.physics),this.manipulation.setOptions(n.manipulation,n,this.options),this.interactionHandler.setOptions(n.interaction),this.renderer.setOptions(n.interaction),this.selectionHandler.setOptions(n.interaction),n.groups!==void 0&&this.body.emitter.emit("refreshNodes"),"configure"in n&&(this.configurator||(this.configurator=new Zs(this,this.body.container,In,this.canvas.pixelRatio,Ha)),this.configurator.setOptions(n.configure)),this.configurator&&this.configurator.options.enabled===!0){let i={nodes:{},edges:{},layout:{},interaction:{},manipulation:{},physics:{},global:{}};j(i.nodes,this.nodesHandler.options),j(i.edges,this.edgesHandler.options),j(i.layout,this.layoutEngine.options),j(i.interaction,this.selectionHandler.options),j(i.interaction,this.renderer.options),j(i.interaction,this.interactionHandler.options),j(i.manipulation,this.manipulation.options),j(i.physics,this.physics.options),j(i.global,this.canvas.options),j(i.global,this.options),this.configurator.setModuleOptions(i)}n.clickToUse!==void 0?n.clickToUse===!0?this.activator===void 0&&(this.activator=new Ks(this.canvas.frame),this.activator.on("change",()=>{this.body.emitter.emit("activate")})):(this.activator!==void 0&&(this.activator.destroy(),delete this.activator),this.body.emitter.emit("activate")):this.body.emitter.emit("activate"),this.canvas.setSize(),this.body.emitter.emit("startSimulation")}};I.prototype._updateVisibleIndices=function(){let n=this.body.nodes,e=this.body.edges;this.body.nodeIndices=[],this.body.edgeIndices=[];for(let t in n)Object.prototype.hasOwnProperty.call(n,t)&&!this.clustering._isClusteredNode(t)&&n[t].options.hidden===!1&&this.body.nodeIndices.push(n[t].id);for(let t in e)if(Object.prototype.hasOwnProperty.call(e,t)){let i=e[t],s=n[i.fromId],o=n[i.toId],r=s!==void 0&&o!==void 0;!this.clustering._isClusteredEdge(t)&&i.options.hidden===!1&&r&&s.options.hidden===!1&&o.options.hidden===!1&&this.body.edgeIndices.push(i.id)}};I.prototype.bindEventListeners=function(){this.body.emitter.on("_dataChanged",()=>{this.edgesHandler._updateState(),this.body.emitter.emit("_dataUpdated")}),this.body.emitter.on("_dataUpdated",()=>{this.clustering._updateState(),this._updateVisibleIndices(),this._updateValueRange(this.body.nodes),this._updateValueRange(this.body.edges),this.body.emitter.emit("startSimulation"),this.body.emitter.emit("_requestRedraw")})};I.prototype.setData=function(n){if(this.body.emitter.emit("resetPhysics"),this.body.emitter.emit("_resetData"),this.selectionHandler.unselectAll(),n&&n.dot&&(n.nodes||n.edges))throw new SyntaxError('Data must contain either parameter "dot" or parameter pair "nodes" and "edges", but not both.');if(this.setOptions(n&&n.options),n&&n.dot){console.warn("The dot property has been deprecated. Please use the static convertDot method to convert DOT into vis.network format and use the normal data format with nodes and edges. This converter is used like this: var data = vis.network.convertDot(dotString);");let e=ya(n.dot);this.setData(e);return}else if(n&&n.gephi){console.warn("The gephi property has been deprecated. Please use the static convertGephi method to convert gephi into vis.network format and use the normal data format with nodes and edges. This converter is used like this: var data = vis.network.convertGephi(gephiJson);");let e=ba(n.gephi);this.setData(e);return}else this.nodesHandler.setData(n&&n.nodes,!0),this.edgesHandler.setData(n&&n.edges,!0);this.body.emitter.emit("_dataChanged"),this.body.emitter.emit("_dataLoaded"),this.body.emitter.emit("initPhysics")};I.prototype.destroy=function(){this.body.emitter.emit("destroy"),this.body.emitter.off(),this.off(),delete this.groups,delete this.canvas,delete this.selectionHandler,delete this.interactionHandler,delete this.view,delete this.renderer,delete this.physics,delete this.layoutEngine,delete this.clustering,delete this.manipulation,delete this.nodesHandler,delete this.edgesHandler,delete this.configurator,delete this.images;for(let n in this.body.nodes)!Object.prototype.hasOwnProperty.call(this.body.nodes,n)||delete this.body.nodes[n];for(let n in this.body.edges)!Object.prototype.hasOwnProperty.call(this.body.edges,n)||delete this.body.edges[n];_e(this.body.container)};I.prototype._updateValueRange=function(n){let e,t,i,s=0;for(e in n)if(Object.prototype.hasOwnProperty.call(n,e)){let o=n[e].getValue();o!==void 0&&(t=t===void 0?o:Math.min(o,t),i=i===void 0?o:Math.max(o,i),s+=o)}if(t!==void 0&&i!==void 0)for(e in n)Object.prototype.hasOwnProperty.call(n,e)&&n[e].setValueRange(t,i,s)};I.prototype.isActive=function(){return!this.activator||this.activator.active};I.prototype.setSize=function(){return this.canvas.setSize.apply(this.canvas,arguments)};I.prototype.canvasToDOM=function(){return this.canvas.canvasToDOM.apply(this.canvas,arguments)};I.prototype.DOMtoCanvas=function(){return this.canvas.DOMtoCanvas.apply(this.canvas,arguments)};I.prototype.findNode=function(){return this.clustering.findNode.apply(this.clustering,arguments)};I.prototype.isCluster=function(){return this.clustering.isCluster.apply(this.clustering,arguments)};I.prototype.openCluster=function(){return this.clustering.openCluster.apply(this.clustering,arguments)};I.prototype.cluster=function(){return this.clustering.cluster.apply(this.clustering,arguments)};I.prototype.getNodesInCluster=function(){return this.clustering.getNodesInCluster.apply(this.clustering,arguments)};I.prototype.clusterByConnection=function(){return this.clustering.clusterByConnection.apply(this.clustering,arguments)};I.prototype.clusterByHubsize=function(){return this.clustering.clusterByHubsize.apply(this.clustering,arguments)};I.prototype.updateClusteredNode=function(){return this.clustering.updateClusteredNode.apply(this.clustering,arguments)};I.prototype.getClusteredEdges=function(){return this.clustering.getClusteredEdges.apply(this.clustering,arguments)};I.prototype.getBaseEdge=function(){return this.clustering.getBaseEdge.apply(this.clustering,arguments)};I.prototype.getBaseEdges=function(){return this.clustering.getBaseEdges.apply(this.clustering,arguments)};I.prototype.updateEdge=function(){return this.clustering.updateEdge.apply(this.clustering,arguments)};I.prototype.clusterOutliers=function(){return this.clustering.clusterOutliers.apply(this.clustering,arguments)};I.prototype.getSeed=function(){return this.layoutEngine.getSeed.apply(this.layoutEngine,arguments)};I.prototype.enableEditMode=function(){return this.manipulation.enableEditMode.apply(this.manipulation,arguments)};I.prototype.disableEditMode=function(){return this.manipulation.disableEditMode.apply(this.manipulation,arguments)};I.prototype.addNodeMode=function(){return this.manipulation.addNodeMode.apply(this.manipulation,arguments)};I.prototype.editNode=function(){return this.manipulation.editNode.apply(this.manipulation,arguments)};I.prototype.editNodeMode=function(){return console.warn("Deprecated: Please use editNode instead of editNodeMode."),this.manipulation.editNode.apply(this.manipulation,arguments)};I.prototype.addEdgeMode=function(){return this.manipulation.addEdgeMode.apply(this.manipulation,arguments)};I.prototype.editEdgeMode=function(){return this.manipulation.editEdgeMode.apply(this.manipulation,arguments)};I.prototype.deleteSelected=function(){return this.manipulation.deleteSelected.apply(this.manipulation,arguments)};I.prototype.getPositions=function(){return this.nodesHandler.getPositions.apply(this.nodesHandler,arguments)};I.prototype.getPosition=function(){return this.nodesHandler.getPosition.apply(this.nodesHandler,arguments)};I.prototype.storePositions=function(){return this.nodesHandler.storePositions.apply(this.nodesHandler,arguments)};I.prototype.moveNode=function(){return this.nodesHandler.moveNode.apply(this.nodesHandler,arguments)};I.prototype.getBoundingBox=function(){return this.nodesHandler.getBoundingBox.apply(this.nodesHandler,arguments)};I.prototype.getConnectedNodes=function(n){return this.body.nodes[n]!==void 0?this.nodesHandler.getConnectedNodes.apply(this.nodesHandler,arguments):this.edgesHandler.getConnectedNodes.apply(this.edgesHandler,arguments)};I.prototype.getConnectedEdges=function(){return this.nodesHandler.getConnectedEdges.apply(this.nodesHandler,arguments)};I.prototype.startSimulation=function(){return this.physics.startSimulation.apply(this.physics,arguments)};I.prototype.stopSimulation=function(){return this.physics.stopSimulation.apply(this.physics,arguments)};I.prototype.stabilize=function(){return this.physics.stabilize.apply(this.physics,arguments)};I.prototype.getSelection=function(){return this.selectionHandler.getSelection.apply(this.selectionHandler,arguments)};I.prototype.setSelection=function(){return this.selectionHandler.setSelection.apply(this.selectionHandler,arguments)};I.prototype.getSelectedNodes=function(){return this.selectionHandler.getSelectedNodeIds.apply(this.selectionHandler,arguments)};I.prototype.getSelectedEdges=function(){return this.selectionHandler.getSelectedEdgeIds.apply(this.selectionHandler,arguments)};I.prototype.getNodeAt=function(){let n=this.selectionHandler.getNodeAt.apply(this.selectionHandler,arguments);return n!==void 0&&n.id!==void 0?n.id:n};I.prototype.getEdgeAt=function(){let n=this.selectionHandler.getEdgeAt.apply(this.selectionHandler,arguments);return n!==void 0&&n.id!==void 0?n.id:n};I.prototype.selectNodes=function(){return this.selectionHandler.selectNodes.apply(this.selectionHandler,arguments)};I.prototype.selectEdges=function(){return this.selectionHandler.selectEdges.apply(this.selectionHandler,arguments)};I.prototype.unselectAll=function(){this.selectionHandler.unselectAll.apply(this.selectionHandler,arguments),this.selectionHandler.commitWithoutEmitting.apply(this.selectionHandler),this.redraw()};I.prototype.redraw=function(){return this.renderer.redraw.apply(this.renderer,arguments)};I.prototype.getScale=function(){return this.view.getScale.apply(this.view,arguments)};I.prototype.getViewPosition=function(){return this.view.getViewPosition.apply(this.view,arguments)};I.prototype.fit=function(){return this.view.fit.apply(this.view,arguments)};I.prototype.moveTo=function(){return this.view.moveTo.apply(this.view,arguments)};I.prototype.focus=function(){return this.view.focus.apply(this.view,arguments)};I.prototype.releaseNode=function(){return this.view.releaseNode.apply(this.view,arguments)};I.prototype.getOptionsFromConfigurator=function(){let n={};return this.configurator&&(n=this.configurator.getOptions.apply(this.configurator)),n};var Ct=null,Tt=null,Dn=null,ja="image/png",Fn=null,Nn=null,Ui=new fe,Yi=new fe,Bn={interaction:{hover:!0,hoverConnectedEdges:!0,multiselect:!1},nodes:{shape:"image",brokenImage:"../../static/netbox_topology_views/img/role-unknown.png",size:35,font:{multi:"md",face:"helvetica"}},edges:{length:100,width:2,font:{face:"helvetica"},shadow:{enabled:!0}},physics:{solver:"forceAtlas2Based"}};var An=null,zn=null;function Wa(n){var e=null;if(document.cookie&&document.cookie!=="")for(var t=document.cookie.split(";"),i=0;i0)for(let a=0;a0)for(let o=0;o/&/.test(s)?(t.replace(t.text,"<","<")||t.replace(t.text,"&","&")||t.add("&"),!0):!1;for(;t.position")||t.parseStartTag("ital","")||t.parseStartTag("mono","")||t.parseEndTag("bold","")||t.parseEndTag("ital","")||t.parseEndTag("mono",""))||i(s)||t.add(s),t.position++}return t.emitBlock(),t.blocks}splitMarkdownBlocks(e){let t=new Mi(e),i=!0,s=o=>/\\/.test(o)?(t.positionthis.parent.fontOptions.maxWdt}getLongestFit(e){let t="",i=0;for(;i0;){let o=this.getLongestFit(s);if(o===0){let r=s[0],a=this.getLongestFitWord(r);this.lines.newLine(r.slice(0,a),t),s[0]=r.slice(a)}else{let r=o;s[o-1]===" "?o--:s[r]===" "&&r++;let a=s.slice(0,o).join("");o==s.length&&i?this.lines.append(a,t):this.lines.newLine(a,t),s=s.slice(r)}}}},Gt=["bold","ital","boldital","mono"],Ue=class{constructor(e,t,i=!1){this.body=e,this.pointToSelf=!1,this.baseSize=void 0,this.fontOptions={},this.setOptions(t),this.size={top:0,left:0,width:0,height:0,yLine:0},this.isEdgeLabel=i}setOptions(e){if(this.elementOptions=e,this.initFontOptions(e.font),Xt(e.label)?this.labelDirty=!0:e.label=void 0,e.font!==void 0&&e.font!==null){if(typeof e.font=="string")this.baseSize=this.fontOptions.size;else if(typeof e.font=="object"){let t=e.font.size;t!==void 0&&(this.baseSize=t)}}}initFontOptions(e){if(A(Gt,t=>{this.fontOptions[t]={}}),Ue.parseFontString(this.fontOptions,e)){this.fontOptions.vadjust=0;return}A(e,(t,i)=>{t!=null&&typeof t!="object"&&(this.fontOptions[i]=t)})}static parseFontString(e,t){if(!t||typeof t!="string")return!1;let i=t.split(" ");return e.size=+i[0].replace("px",""),e.face=i[1],e.color=i[2],!0}constrain(e){let t={constrainWidth:!1,maxWdt:-1,minWdt:-1,constrainHeight:!1,minHgt:-1,valign:"middle"},i=Ce(e,"widthConstraint");if(typeof i=="number")t.maxWdt=Number(i),t.minWdt=Number(i);else if(typeof i=="object"){let o=Ce(e,["widthConstraint","maximum"]);typeof o=="number"&&(t.maxWdt=Number(o));let r=Ce(e,["widthConstraint","minimum"]);typeof r=="number"&&(t.minWdt=Number(r))}let s=Ce(e,"heightConstraint");if(typeof s=="number")t.minHgt=Number(s);else if(typeof s=="object"){let o=Ce(e,["heightConstraint","minimum"]);typeof o=="number"&&(t.minHgt=Number(o));let r=Ce(e,["heightConstraint","valign"]);typeof r=="string"&&(r==="top"||r==="bottom")&&(t.valign=r)}return t}update(e,t){this.setOptions(e,!0),this.propagateFonts(t),j(this.fontOptions,this.constrain(t)),this.fontOptions.chooser=Ii("label",t)}adjustSizes(e){let t=e?e.right+e.left:0;this.fontOptions.constrainWidth&&(this.fontOptions.maxWdt-=t,this.fontOptions.minWdt-=t);let i=e?e.top+e.bottom:0;this.fontOptions.constrainHeight&&(this.fontOptions.minHgt-=i)}addFontOptionsToPile(e,t){for(let i=0;i{r!==void 0&&(Object.prototype.hasOwnProperty.call(t,a)||(Gt.indexOf(a)!==-1?t[a]={}:t[a]=r))})}return t}getFontOption(e,t,i){let s;for(let o=0;o{o[d]=a}),o.size=Number(o.size),o.vadjust=Number(o.vadjust)}}draw(e,t,i,s,o,r="middle"){if(this.elementOptions.label===void 0)return;let a=this.fontOptions.size*this.body.view.scale;this.elementOptions.label&&a=this.elementOptions.scaling.label.maxVisible&&(a=Number(this.elementOptions.scaling.label.maxVisible)/this.body.view.scale),this.calculateLabelSize(e,s,o,t,i,r),this._drawBackground(e),this._drawText(e,t,this.size.yLine,r,a))}_drawBackground(e){if(this.fontOptions.background!==void 0&&this.fontOptions.background!=="none"){e.fillStyle=this.fontOptions.background;let t=this.getSize();e.fillRect(t.left,t.top,t.width,t.height)}}_drawText(e,t,i,s="middle",o){[t,i]=this._setAlignment(e,t,i,s),e.textAlign="left",t=t-this.size.width/2,this.fontOptions.valign&&this.size.height>this.size.labelHeight&&(this.fontOptions.valign==="top"&&(i-=(this.size.height-this.size.labelHeight)/2),this.fontOptions.valign==="bottom"&&(i+=(this.size.height-this.size.labelHeight)/2));for(let r=0;r0&&(e.lineWidth=l.strokeWidth,e.strokeStyle=u,e.lineJoin="round"),e.fillStyle=c,l.strokeWidth>0&&e.strokeText(l.text,t+d,i+l.vadjust),e.fillText(l.text,t+d,i+l.vadjust),d+=l.width}i+=a.height}}}_setAlignment(e,t,i,s){if(this.isEdgeLabel&&this.fontOptions.align!=="horizontal"&&this.pointToSelf===!1){t=0,i=0;let o=2;this.fontOptions.align==="top"?(e.textBaseline="alphabetic",i-=2*o):this.fontOptions.align==="bottom"?(e.textBaseline="hanging",i+=2*o):e.textBaseline="middle"}else e.textBaseline=s;return[t,i]}_getColor(e,t,i){let s=e||"#000000",o=i||"#ffffff";if(t<=this.elementOptions.scaling.label.drawThreshold){let r=Math.max(0,Math.min(1,1-(this.elementOptions.scaling.label.drawThreshold-t)));s=re(s,r),o=re(o,r)}return[s,o]}getTextSize(e,t=!1,i=!1){return this._processLabel(e,t,i),{width:this.size.width,height:this.size.height,lineCount:this.lineCount}}getSize(){let e=2,t=this.size.left,i=this.size.top-.5*e;if(this.isEdgeLabel){let o=-this.size.width*.5;switch(this.fontOptions.align){case"middle":t=o,i=-this.size.height*.5;break;case"top":t=o,i=-(this.size.height+e);break;case"bottom":t=o,i=e;break}}return{left:t,top:i,width:this.size.width,height:this.size.height}}calculateLabelSize(e,t,i,s=0,o=0,r="middle"){this._processLabel(e,t,i),this.size.left=s-this.size.width*.5,this.size.top=o-this.size.height*.5,this.size.yLine=o+(1-this.lineCount)*.5*this.fontOptions.size,r==="hanging"&&(this.size.top+=.5*this.fontOptions.size,this.size.top+=4,this.size.yLine+=4)}getFormattingValues(e,t,i,s){let o=function(d,h,l){return h==="normal"?l==="mod"?"":d[l]:d[h][l]!==void 0?d[h][l]:d[l]},r={color:o(this.fontOptions,s,"color"),size:o(this.fontOptions,s,"size"),face:o(this.fontOptions,s,"face"),mod:o(this.fontOptions,s,"mod"),vadjust:o(this.fontOptions,s,"vadjust"),strokeWidth:this.fontOptions.strokeWidth,strokeColor:this.fontOptions.strokeColor};(t||i)&&(s==="normal"&&this.fontOptions.chooser===!0&&this.elementOptions.labelHighlightBold?r.mod="bold":typeof this.fontOptions.chooser=="function"&&this.fontOptions.chooser(r,this.elementOptions.id,t,i));let a="";return r.mod!==void 0&&r.mod!==""&&(a+=r.mod+" "),a+=r.size+"px "+r.face,e.font=a.replace(/"/g,""),r.font=e.font,r.height=r.size,r}differentState(e,t){return e!==this.selectedState||t!==this.hoverState}_processLabelText(e,t,i,s){return new So(e,this,t,i).process(s)}_processLabel(e,t,i){if(this.labelDirty===!1&&!this.differentState(t,i))return;let s=this._processLabelText(e,t,i,this.elementOptions.label);this.fontOptions.minWdt>0&&s.width0&&s.height0&&(this.enableBorderDashes(e,t),e.stroke(),this.disableBorderDashes(e,t)),e.restore()}performFill(e,t){e.save(),e.fillStyle=t.color,this.enableShadow(e,t),e.fill(),this.disableShadow(e,t),e.restore(),this.performStroke(e,t)}_addBoundingBoxMargin(e){this.boundingBox.left-=e,this.boundingBox.top-=e,this.boundingBox.bottom+=e,this.boundingBox.right+=e}_updateBoundingBox(e,t,i,s,o){i!==void 0&&this.resize(i,s,o),this.left=e-this.width/2,this.top=t-this.height/2,this.boundingBox.left=this.left,this.boundingBox.top=this.top,this.boundingBox.bottom=this.top+this.height,this.boundingBox.right=this.left+this.width}updateBoundingBox(e,t,i,s,o){this._updateBoundingBox(e,t,i,s,o)}getDimensionsFromLabel(e,t,i){this.textSize=this.labelModule.getTextSize(e,t,i);let s=this.textSize.width,o=this.textSize.height,r=14;return s===0&&(s=r,o=r),{width:s,height:o}}},Oo=class extends De{constructor(e,t,i){super(e,t,i);this._setMargins(i)}resize(e,t=this.selected,i=this.hover){if(this.needsRefresh(t,i)){let s=this.getDimensionsFromLabel(e,t,i);this.width=s.width+this.margin.right+this.margin.left,this.height=s.height+this.margin.top+this.margin.bottom,this.radius=this.width/2}}draw(e,t,i,s,o,r){this.resize(e,s,o),this.left=t-this.width/2,this.top=i-this.height/2,this.initContextForDraw(e,r),ao(e,this.left,this.top,this.width,this.height,r.borderRadius),this.performFill(e,r),this.updateBoundingBox(t,i,e,s,o),this.labelModule.draw(e,this.left+this.textSize.width/2+this.margin.left,this.top+this.textSize.height/2+this.margin.top,s,o)}updateBoundingBox(e,t,i,s,o){this._updateBoundingBox(e,t,i,s,o);let r=this.options.shapeProperties.borderRadius;this._addBoundingBoxMargin(r)}distanceToBorder(e,t){e&&this.resize(e);let i=this.options.borderWidth;return Math.min(Math.abs(this.width/2/Math.cos(t)),Math.abs(this.height/2/Math.sin(t)))+i}},Kt=class extends De{constructor(e,t,i){super(e,t,i);this.labelOffset=0,this.selected=!1}setOptions(e,t,i){this.options=e,t===void 0&&i===void 0||this.setImages(t,i)}setImages(e,t){t&&this.selected?(this.imageObj=t,this.imageObjAlt=e):(this.imageObj=e,this.imageObjAlt=t)}switchImages(e){let t=e&&!this.selected||!e&&this.selected;if(this.selected=e,this.imageObjAlt!==void 0&&t){let i=this.imageObj;this.imageObj=this.imageObjAlt,this.imageObjAlt=i}}_getImagePadding(){let e={top:0,right:0,bottom:0,left:0};if(this.options.imagePadding){let t=this.options.imagePadding;typeof t=="object"?(e.top=t.top,e.right=t.right,e.bottom=t.bottom,e.left=t.left):(e.top=t,e.right=t,e.bottom=t,e.left=t)}return e}_resizeImage(){let e,t;if(this.options.shapeProperties.useImageSize===!1){let i=1,s=1;this.imageObj.width&&this.imageObj.height&&(this.imageObj.width>this.imageObj.height?i=this.imageObj.width/this.imageObj.height:s=this.imageObj.height/this.imageObj.width),e=this.options.size*2*i,t=this.options.size*2*s}else{let i=this._getImagePadding();e=this.imageObj.width+i.left+i.right,t=this.imageObj.height+i.top+i.bottom}this.width=e,this.height=t,this.radius=.5*this.width}_drawRawCircle(e,t,i,s){this.initContextForDraw(e,s),Ti(e,t,i,s.size),this.performFill(e,s)}_drawImageAtPosition(e,t){if(this.imageObj.width!=0){e.globalAlpha=t.opacity!==void 0?t.opacity:1,this.enableShadow(e,t);let i=1;this.options.shapeProperties.interpolation===!0&&(i=this.imageObj.width/this.width/this.body.view.scale);let s=this._getImagePadding(),o=this.left+s.left,r=this.top+s.top,a=this.width-s.left-s.right,d=this.height-s.top-s.bottom;this.imageObj.drawImageAtPosition(e,i,o,r,a,d),this.disableShadow(e,t)}}_drawImageLabel(e,t,i,s,o){let r=0;if(this.height!==void 0){r=this.height*.5;let d=this.labelModule.getTextSize(e,s,o);d.lineCount>=1&&(r+=d.height/2)}let a=i+r;this.options.label&&(this.labelOffset=r),this.labelModule.draw(e,t,a,s,o,"hanging")}},Io=class extends Kt{constructor(e,t,i){super(e,t,i);this._setMargins(i)}resize(e,t=this.selected,i=this.hover){if(this.needsRefresh(t,i)){let s=this.getDimensionsFromLabel(e,t,i),o=Math.max(s.width+this.margin.right+this.margin.left,s.height+this.margin.top+this.margin.bottom);this.options.size=o/2,this.width=o,this.height=o,this.radius=this.width/2}}draw(e,t,i,s,o,r){this.resize(e,s,o),this.left=t-this.width/2,this.top=i-this.height/2,this._drawRawCircle(e,t,i,r),this.updateBoundingBox(t,i),this.labelModule.draw(e,this.left+this.textSize.width/2+this.margin.left,i,s,o)}updateBoundingBox(e,t){this.boundingBox.top=t-this.options.size,this.boundingBox.left=e-this.options.size,this.boundingBox.right=e+this.options.size,this.boundingBox.bottom=t+this.options.size}distanceToBorder(e){return e&&this.resize(e),this.width*.5}},Po=class extends Kt{constructor(e,t,i,s,o){super(e,t,i);this.setImages(s,o)}resize(e,t=this.selected,i=this.hover){if(this.imageObj.src===void 0||this.imageObj.width===void 0||this.imageObj.height===void 0){let o=this.options.size*2;this.width=o,this.height=o,this.radius=.5*this.width;return}this.needsRefresh(t,i)&&this._resizeImage()}draw(e,t,i,s,o,r){this.switchImages(s),this.resize();let a=t,d=i;this.options.shapeProperties.coordinateOrigin==="top-left"?(this.left=t,this.top=i,a+=this.width/2,d+=this.height/2):(this.left=t-this.width/2,this.top=i-this.height/2),this._drawRawCircle(e,a,d,r),e.save(),e.clip(),this._drawImageAtPosition(e,r),e.restore(),this._drawImageLabel(e,a,d,s,o),this.updateBoundingBox(t,i)}updateBoundingBox(e,t){this.options.shapeProperties.coordinateOrigin==="top-left"?(this.boundingBox.top=t,this.boundingBox.left=e,this.boundingBox.right=e+this.options.size*2,this.boundingBox.bottom=t+this.options.size*2):(this.boundingBox.top=t-this.options.size,this.boundingBox.left=e-this.options.size,this.boundingBox.right=e+this.options.size,this.boundingBox.bottom=t+this.options.size),this.boundingBox.left=Math.min(this.boundingBox.left,this.labelModule.size.left),this.boundingBox.right=Math.max(this.boundingBox.right,this.labelModule.size.left+this.labelModule.size.width),this.boundingBox.bottom=Math.max(this.boundingBox.bottom,this.boundingBox.bottom+this.labelOffset)}distanceToBorder(e){return e&&this.resize(e),this.width*.5}},ke=class extends De{constructor(e,t,i){super(e,t,i)}resize(e,t=this.selected,i=this.hover,s={size:this.options.size}){var o,r;if(this.needsRefresh(t,i)){this.labelModule.getTextSize(e,t,i);let a=2*s.size;this.width=(o=this.customSizeWidth)!=null?o:a,this.height=(r=this.customSizeHeight)!=null?r:a,this.radius=.5*this.width}}_drawShape(e,t,i,s,o,r,a,d){return this.resize(e,r,a,d),this.left=s-this.width/2,this.top=o-this.height/2,this.initContextForDraw(e,d),aa(t)(e,s,o,d.size),this.performFill(e,d),this.options.icon!==void 0&&this.options.icon.code!==void 0&&(e.font=(r?"bold ":"")+this.height/2+"px "+(this.options.icon.face||"FontAwesome"),e.fillStyle=this.options.icon.color||"black",e.textAlign="center",e.textBaseline="middle",e.fillText(this.options.icon.code,s,o)),{drawExternalLabel:()=>{if(this.options.label!==void 0){this.labelModule.calculateLabelSize(e,r,a,s,o,"hanging");let h=o+.5*this.height+.5*this.labelModule.size.height;this.labelModule.draw(e,s,h,r,a,"hanging")}this.updateBoundingBox(s,o)}}}updateBoundingBox(e,t){this.boundingBox.top=t-this.options.size,this.boundingBox.left=e-this.options.size,this.boundingBox.right=e+this.options.size,this.boundingBox.bottom=t+this.options.size,this.options.label!==void 0&&this.labelModule.size.width>0&&(this.boundingBox.left=Math.min(this.boundingBox.left,this.labelModule.size.left),this.boundingBox.right=Math.max(this.boundingBox.right,this.labelModule.size.left+this.labelModule.size.width),this.boundingBox.bottom=Math.max(this.boundingBox.bottom,this.boundingBox.bottom+this.labelModule.size.height))}},Mo=class extends ke{constructor(e,t,i,s){super(e,t,i,s);this.ctxRenderer=s}draw(e,t,i,s,o,r){this.resize(e,s,o,r),this.left=t-this.width/2,this.top=i-this.height/2,e.save();let a=this.ctxRenderer({ctx:e,id:this.options.id,x:t,y:i,state:{selected:s,hover:o},style:ye({},r),label:this.options.label});if(a.drawNode!=null&&a.drawNode(),e.restore(),a.drawExternalLabel){let d=a.drawExternalLabel;a.drawExternalLabel=()=>{e.save(),d(),e.restore()}}return a.nodeDimensions&&(this.customSizeWidth=a.nodeDimensions.width,this.customSizeHeight=a.nodeDimensions.height),a}distanceToBorder(e,t){return this._distanceToBorder(e,t)}},Do=class extends De{constructor(e,t,i){super(e,t,i);this._setMargins(i)}resize(e,t,i){if(this.needsRefresh(t,i)){let o=this.getDimensionsFromLabel(e,t,i).width+this.margin.right+this.margin.left;this.width=o,this.height=o,this.radius=this.width/2}}draw(e,t,i,s,o,r){this.resize(e,s,o),this.left=t-this.width/2,this.top=i-this.height/2,this.initContextForDraw(e,r),ho(e,t-this.width/2,i-this.height/2,this.width,this.height),this.performFill(e,r),this.updateBoundingBox(t,i,e,s,o),this.labelModule.draw(e,this.left+this.textSize.width/2+this.margin.left,this.top+this.textSize.height/2+this.margin.top,s,o)}distanceToBorder(e,t){return this._distanceToBorder(e,t)}},Fo=class extends ke{constructor(e,t,i){super(e,t,i)}draw(e,t,i,s,o,r){return this._drawShape(e,"diamond",4,t,i,s,o,r)}distanceToBorder(e,t){return this._distanceToBorder(e,t)}},No=class extends ke{constructor(e,t,i){super(e,t,i)}draw(e,t,i,s,o,r){return this._drawShape(e,"circle",2,t,i,s,o,r)}distanceToBorder(e){return e&&this.resize(e),this.options.size}},Di=class extends De{constructor(e,t,i){super(e,t,i)}resize(e,t=this.selected,i=this.hover){if(this.needsRefresh(t,i)){let s=this.getDimensionsFromLabel(e,t,i);this.height=s.height*2,this.width=s.width+s.height,this.radius=.5*this.width}}draw(e,t,i,s,o,r){this.resize(e,s,o),this.left=t-this.width*.5,this.top=i-this.height*.5,this.initContextForDraw(e,r),ki(e,this.left,this.top,this.width,this.height),this.performFill(e,r),this.updateBoundingBox(t,i,e,s,o),this.labelModule.draw(e,t,i,s,o)}distanceToBorder(e,t){e&&this.resize(e);let i=this.width*.5,s=this.height*.5,o=Math.sin(t)*i,r=Math.cos(t)*s;return i*s/Math.sqrt(o*o+r*r)}},Bo=class extends De{constructor(e,t,i){super(e,t,i);this._setMargins(i)}resize(e,t,i){this.needsRefresh(t,i)&&(this.iconSize={width:Number(this.options.icon.size),height:Number(this.options.icon.size)},this.width=this.iconSize.width+this.margin.right+this.margin.left,this.height=this.iconSize.height+this.margin.top+this.margin.bottom,this.radius=.5*this.width)}draw(e,t,i,s,o,r){return this.resize(e,s,o),this.options.icon.size=this.options.icon.size||50,this.left=t-this.width/2,this.top=i-this.height/2,this._icon(e,t,i,s,o,r),{drawExternalLabel:()=>{if(this.options.label!==void 0){let a=5;this.labelModule.draw(e,this.left+this.iconSize.width/2+this.margin.left,i+this.height/2+a,s)}this.updateBoundingBox(t,i)}}}updateBoundingBox(e,t){if(this.boundingBox.top=t-this.options.icon.size*.5,this.boundingBox.left=e-this.options.icon.size*.5,this.boundingBox.right=e+this.options.icon.size*.5,this.boundingBox.bottom=t+this.options.icon.size*.5,this.options.label!==void 0&&this.labelModule.size.width>0){let i=5;this.boundingBox.left=Math.min(this.boundingBox.left,this.labelModule.size.left),this.boundingBox.right=Math.max(this.boundingBox.right,this.labelModule.size.left+this.labelModule.size.width),this.boundingBox.bottom=Math.max(this.boundingBox.bottom,this.boundingBox.bottom+this.labelModule.size.height+i)}}_icon(e,t,i,s,o,r){let a=Number(this.options.icon.size);this.options.icon.code!==void 0?(e.font=[this.options.icon.weight!=null?this.options.icon.weight:s?"bold":"",(this.options.icon.weight!=null&&s?5:0)+a+"px",this.options.icon.face].join(" "),e.fillStyle=this.options.icon.color||"black",e.textAlign="center",e.textBaseline="middle",this.enableShadow(e,r),e.fillText(this.options.icon.code,t,i),this.disableShadow(e,r)):console.error("When using the icon shape, you need to define the code in the icon options object. This can be done per node or globally.")}distanceToBorder(e,t){return this._distanceToBorder(e,t)}},Ao=class extends Kt{constructor(e,t,i,s,o){super(e,t,i);this.setImages(s,o)}resize(e,t=this.selected,i=this.hover){if(this.imageObj.src===void 0||this.imageObj.width===void 0||this.imageObj.height===void 0){let o=this.options.size*2;this.width=o,this.height=o;return}this.needsRefresh(t,i)&&this._resizeImage()}draw(e,t,i,s,o,r){e.save(),this.switchImages(s),this.resize();let a=t,d=i;if(this.options.shapeProperties.coordinateOrigin==="top-left"?(this.left=t,this.top=i,a+=this.width/2,d+=this.height/2):(this.left=t-this.width/2,this.top=i-this.height/2),this.options.shapeProperties.useBorderWithImage===!0){let h=this.options.borderWidth,l=this.options.borderWidthSelected||2*this.options.borderWidth,c=(s?l:h)/this.body.view.scale;e.lineWidth=Math.min(this.width,c),e.beginPath();let u=s?this.options.color.highlight.border:o?this.options.color.hover.border:this.options.color.border,p=s?this.options.color.highlight.background:o?this.options.color.hover.background:this.options.color.background;r.opacity!==void 0&&(u=re(u,r.opacity),p=re(p,r.opacity)),e.strokeStyle=u,e.fillStyle=p,e.rect(this.left-.5*e.lineWidth,this.top-.5*e.lineWidth,this.width+e.lineWidth,this.height+e.lineWidth),e.fill(),this.performStroke(e,r),e.closePath()}this._drawImageAtPosition(e,r),this._drawImageLabel(e,a,d,s,o),this.updateBoundingBox(t,i),e.restore()}updateBoundingBox(e,t){this.resize(),this.options.shapeProperties.coordinateOrigin==="top-left"?(this.left=e,this.top=t):(this.left=e-this.width/2,this.top=t-this.height/2),this.boundingBox.left=this.left,this.boundingBox.top=this.top,this.boundingBox.bottom=this.top+this.height,this.boundingBox.right=this.left+this.width,this.options.label!==void 0&&this.labelModule.size.width>0&&(this.boundingBox.left=Math.min(this.boundingBox.left,this.labelModule.size.left),this.boundingBox.right=Math.max(this.boundingBox.right,this.labelModule.size.left+this.labelModule.size.width),this.boundingBox.bottom=Math.max(this.boundingBox.bottom,this.boundingBox.bottom+this.labelOffset))}distanceToBorder(e,t){return this._distanceToBorder(e,t)}},zo=class extends ke{constructor(e,t,i){super(e,t,i)}draw(e,t,i,s,o,r){return this._drawShape(e,"square",2,t,i,s,o,r)}distanceToBorder(e,t){return this._distanceToBorder(e,t)}},Lo=class extends ke{constructor(e,t,i){super(e,t,i)}draw(e,t,i,s,o,r){return this._drawShape(e,"hexagon",4,t,i,s,o,r)}distanceToBorder(e,t){return this._distanceToBorder(e,t)}},Ro=class extends ke{constructor(e,t,i){super(e,t,i)}draw(e,t,i,s,o,r){return this._drawShape(e,"star",4,t,i,s,o,r)}distanceToBorder(e,t){return this._distanceToBorder(e,t)}},Ho=class extends De{constructor(e,t,i){super(e,t,i);this._setMargins(i)}resize(e,t,i){this.needsRefresh(t,i)&&(this.textSize=this.labelModule.getTextSize(e,t,i),this.width=this.textSize.width+this.margin.right+this.margin.left,this.height=this.textSize.height+this.margin.top+this.margin.bottom,this.radius=.5*this.width)}draw(e,t,i,s,o,r){this.resize(e,s,o),this.left=t-this.width/2,this.top=i-this.height/2,this.enableShadow(e,r),this.labelModule.draw(e,this.left+this.textSize.width/2+this.margin.left,this.top+this.textSize.height/2+this.margin.top,s,o),this.disableShadow(e,r),this.updateBoundingBox(t,i,e,s,o)}distanceToBorder(e,t){return this._distanceToBorder(e,t)}},jo=class extends ke{constructor(e,t,i){super(e,t,i)}draw(e,t,i,s,o,r){return this._drawShape(e,"triangle",3,t,i,s,o,r)}distanceToBorder(e,t){return this._distanceToBorder(e,t)}},Wo=class extends ke{constructor(e,t,i){super(e,t,i)}draw(e,t,i,s,o,r){return this._drawShape(e,"triangleDown",3,t,i,s,o,r)}distanceToBorder(e,t){return this._distanceToBorder(e,t)}},U=class{constructor(e,t,i,s,o,r){this.options=xe(o),this.globalOptions=o,this.defaultOptions=r,this.body=t,this.edges=[],this.id=void 0,this.imagelist=i,this.grouplist=s,this.x=void 0,this.y=void 0,this.baseSize=this.options.size,this.baseFontSize=this.options.font.size,this.predefinedPosition=!1,this.selected=!1,this.hover=!1,this.labelModule=new Ue(this.body,this.options,!1),this.setOptions(e)}attachEdge(e){this.edges.indexOf(e)===-1&&this.edges.push(e)}detachEdge(e){let t=this.edges.indexOf(e);t!=-1&&this.edges.splice(t,1)}setOptions(e){let t=this.options.shape;if(!e)return;if(typeof e.color!="undefined"&&(this._localColor=e.color),e.id!==void 0&&(this.id=e.id),this.id===void 0)throw new Error("Node must have an id");U.checkMass(e,this.id),e.x!==void 0&&(e.x===null?(this.x=void 0,this.predefinedPosition=!1):(this.x=parseInt(e.x),this.predefinedPosition=!0)),e.y!==void 0&&(e.y===null?(this.y=void 0,this.predefinedPosition=!1):(this.y=parseInt(e.y),this.predefinedPosition=!0)),e.size!==void 0&&(this.baseSize=e.size),e.value!==void 0&&(e.value=parseFloat(e.value)),U.parseOptions(this.options,e,!0,this.globalOptions,this.grouplist);let i=[e,this.options,this.defaultOptions];return this.chooser=Ii("node",i),this._load_images(),this.updateLabelModule(e),e.opacity!==void 0&&U.checkOpacity(e.opacity)&&(this.options.opacity=e.opacity),this.updateShape(t),e.hidden!==void 0||e.physics!==void 0}_load_images(){if((this.options.shape==="circularImage"||this.options.shape==="image")&&this.options.image===void 0)throw new Error("Option image must be defined for node type '"+this.options.shape+"'");if(this.options.image!==void 0){if(this.imagelist===void 0)throw new Error("Internal Error: No images provided");if(typeof this.options.image=="string")this.imageObj=this.imagelist.load(this.options.image,this.options.brokenImage,this.id);else{if(this.options.image.unselected===void 0)throw new Error("No unselected image provided");this.imageObj=this.imagelist.load(this.options.image.unselected,this.options.brokenImage,this.id),this.options.image.selected!==void 0?this.imageObjAlt=this.imagelist.load(this.options.image.selected,this.options.brokenImage,this.id):this.imageObjAlt=void 0}}}static checkOpacity(e){return 0<=e&&e<=1}static checkCoordinateOrigin(e){return e===void 0||e==="center"||e==="top-left"}static updateGroupOptions(e,t,i){if(i===void 0)return;let s=e.group;if(t!==void 0&&t.group!==void 0&&s!==t.group)throw new Error("updateGroupOptions: group values in options don't match.");if(!(typeof s=="number"||typeof s=="string"&&s!=""))return;let r=i.get(s);r.opacity!==void 0&&t.opacity===void 0&&(U.checkOpacity(r.opacity)||(console.error("Invalid option for node opacity. Value must be between 0 and 1, found: "+r.opacity),r.opacity=void 0));let a=Object.getOwnPropertyNames(t).filter(d=>t[d]!=null);a.push("font"),mt(a,e,r),e.color=Rt(e.color)}static parseOptions(e,t,i=!1,s={},o){if(mt(["color","fixed","shadow"],e,t,i),U.checkMass(t),e.opacity!==void 0&&(U.checkOpacity(e.opacity)||(console.error("Invalid option for node opacity. Value must be between 0 and 1, found: "+e.opacity),e.opacity=void 0)),t.opacity!==void 0&&(U.checkOpacity(t.opacity)||(console.error("Invalid option for node opacity. Value must be between 0 and 1, found: "+t.opacity),t.opacity=void 0)),t.shapeProperties&&!U.checkCoordinateOrigin(t.shapeProperties.coordinateOrigin)&&console.error("Invalid option for node coordinateOrigin, found: "+t.shapeProperties.coordinateOrigin),ae(e,t,"shadow",s),t.color!==void 0&&t.color!==null){let a=Rt(t.color);bi(e.color,a)}else i===!0&&t.color===null&&(e.color=xe(s.color));t.fixed!==void 0&&t.fixed!==null&&(typeof t.fixed=="boolean"?(e.fixed.x=t.fixed,e.fixed.y=t.fixed):(t.fixed.x!==void 0&&typeof t.fixed.x=="boolean"&&(e.fixed.x=t.fixed.x),t.fixed.y!==void 0&&typeof t.fixed.y=="boolean"&&(e.fixed.y=t.fixed.y))),i===!0&&t.font===null&&(e.font=xe(s.font)),U.updateGroupOptions(e,t,o),t.scaling!==void 0&&ae(e.scaling,t.scaling,"label",s.scaling)}getFormattingValues(){let e={color:this.options.color.background,opacity:this.options.opacity,borderWidth:this.options.borderWidth,borderColor:this.options.color.border,size:this.options.size,borderDashes:this.options.shapeProperties.borderDashes,borderRadius:this.options.shapeProperties.borderRadius,shadow:this.options.shadow.enabled,shadowColor:this.options.shadow.color,shadowSize:this.options.shadow.size,shadowX:this.options.shadow.x,shadowY:this.options.shadow.y};if(this.selected||this.hover?this.chooser===!0?this.selected?(this.options.borderWidthSelected!=null?e.borderWidth=this.options.borderWidthSelected:e.borderWidth*=2,e.color=this.options.color.highlight.background,e.borderColor=this.options.color.highlight.border,e.shadow=this.options.shadow.enabled):this.hover&&(e.color=this.options.color.hover.background,e.borderColor=this.options.color.hover.border,e.shadow=this.options.shadow.enabled):typeof this.chooser=="function"&&(this.chooser(e,this.options.id,this.selected,this.hover),e.shadow===!1&&(e.shadowColor!==this.options.shadow.color||e.shadowSize!==this.options.shadow.size||e.shadowX!==this.options.shadow.x||e.shadowY!==this.options.shadow.y)&&(e.shadow=!0)):e.shadow=this.options.shadow.enabled,this.options.opacity!==void 0){let t=this.options.opacity;e.borderColor=re(e.borderColor,t),e.color=re(e.color,t),e.shadowColor=re(e.shadowColor,t)}return e}updateLabelModule(e){(this.options.label===void 0||this.options.label===null)&&(this.options.label=""),U.updateGroupOptions(this.options,St(ye({},e),{color:e&&e.color||this._localColor||void 0}),this.grouplist);let t=this.grouplist.get(this.options.group,!1),i=[e,this.options,t,this.globalOptions,this.defaultOptions];this.labelModule.update(this.options,i),this.labelModule.baseSize!==void 0&&(this.baseFontSize=this.labelModule.baseSize)}updateShape(e){if(e===this.options.shape&&this.shape)this.shape.setOptions(this.options,this.imageObj,this.imageObjAlt);else switch(this.options.shape){case"box":this.shape=new Oo(this.options,this.body,this.labelModule);break;case"circle":this.shape=new Io(this.options,this.body,this.labelModule);break;case"circularImage":this.shape=new Po(this.options,this.body,this.labelModule,this.imageObj,this.imageObjAlt);break;case"custom":this.shape=new Mo(this.options,this.body,this.labelModule,this.options.ctxRenderer);break;case"database":this.shape=new Do(this.options,this.body,this.labelModule);break;case"diamond":this.shape=new Fo(this.options,this.body,this.labelModule);break;case"dot":this.shape=new No(this.options,this.body,this.labelModule);break;case"ellipse":this.shape=new Di(this.options,this.body,this.labelModule);break;case"icon":this.shape=new Bo(this.options,this.body,this.labelModule);break;case"image":this.shape=new Ao(this.options,this.body,this.labelModule,this.imageObj,this.imageObjAlt);break;case"square":this.shape=new zo(this.options,this.body,this.labelModule);break;case"hexagon":this.shape=new Lo(this.options,this.body,this.labelModule);break;case"star":this.shape=new Ro(this.options,this.body,this.labelModule);break;case"text":this.shape=new Ho(this.options,this.body,this.labelModule);break;case"triangle":this.shape=new jo(this.options,this.body,this.labelModule);break;case"triangleDown":this.shape=new Wo(this.options,this.body,this.labelModule);break;default:this.shape=new Di(this.options,this.body,this.labelModule);break}this.needsRefresh()}select(){this.selected=!0,this.needsRefresh()}unselect(){this.selected=!1,this.needsRefresh()}needsRefresh(){this.shape.refreshNeeded=!0}getTitle(){return this.options.title}distanceToBorder(e,t){return this.shape.distanceToBorder(e,t)}isFixed(){return this.options.fixed.x&&this.options.fixed.y}isSelected(){return this.selected}getValue(){return this.options.value}getLabelSize(){return this.labelModule.size()}setValueRange(e,t,i){if(this.options.value!==void 0){let s=this.options.scaling.customScalingFunction(e,t,i,this.options.value),o=this.options.scaling.max-this.options.scaling.min;if(this.options.scaling.label.enabled===!0){let r=this.options.scaling.label.max-this.options.scaling.label.min;this.options.font.size=this.options.scaling.label.min+s*r}this.options.size=this.options.scaling.min+s*o}else this.options.size=this.baseSize,this.options.font.size=this.baseFontSize;this.updateLabelModule()}draw(e){let t=this.getFormattingValues();return this.shape.draw(e,this.x,this.y,this.selected,this.hover,t)||{}}updateBoundingBox(e){this.shape.updateBoundingBox(this.x,this.y,e)}resize(e){let t=this.getFormattingValues();this.shape.resize(e,this.selected,this.hover,t)}getItemsOnPoint(e){let t=[];return this.labelModule.visible()&&Pi(this.labelModule.getSize(),e)&&t.push({nodeId:this.id,labelId:0}),Pi(this.shape.boundingBox,e)&&t.push({nodeId:this.id}),t}isOverlappingWith(e){return this.shape.lefte.left&&this.shape.tope.top}isBoundingBoxOverlappingWith(e){return this.shape.boundingBox.lefte.left&&this.shape.boundingBox.tope.top}static checkMass(e,t){if(e.mass!==void 0&&e.mass<=0){let i="";t!==void 0&&(i=" in node id: "+t),console.error("%cNegative or zero mass disallowed"+i+", setting mass to 1.",Ei),e.mass=1}}},Vo=class{constructor(e,t,i,s){if(this.body=e,this.images=t,this.groups=i,this.layoutEngine=s,this.body.functions.createNode=this.create.bind(this),this.nodesListeners={add:(o,r)=>{this.add(r.items)},update:(o,r)=>{this.update(r.items,r.data,r.oldData)},remove:(o,r)=>{this.remove(r.items)}},this.defaultOptions={borderWidth:1,borderWidthSelected:void 0,brokenImage:void 0,color:{border:"#2B7CE9",background:"#97C2FC",highlight:{border:"#2B7CE9",background:"#D2E5FF"},hover:{border:"#2B7CE9",background:"#D2E5FF"}},opacity:void 0,fixed:{x:!1,y:!1},font:{color:"#343434",size:14,face:"arial",background:"none",strokeWidth:0,strokeColor:"#ffffff",align:"center",vadjust:0,multi:!1,bold:{mod:"bold"},boldital:{mod:"bold italic"},ital:{mod:"italic"},mono:{mod:"",size:15,face:"monospace",vadjust:2}},group:void 0,hidden:!1,icon:{face:"FontAwesome",code:void 0,size:50,color:"#2B7CE9"},image:void 0,imagePadding:{top:0,right:0,bottom:0,left:0},label:void 0,labelHighlightBold:!0,level:void 0,margin:{top:5,right:5,bottom:5,left:5},mass:1,physics:!0,scaling:{min:10,max:30,label:{enabled:!1,min:14,max:30,maxVisible:30,drawThreshold:5},customScalingFunction:function(o,r,a,d){if(r===o)return .5;{let h=1/(r-o);return Math.max(0,(d-o)*h)}}},shadow:{enabled:!1,color:"rgba(0,0,0,0.5)",size:10,x:5,y:5},shape:"ellipse",shapeProperties:{borderDashes:!1,borderRadius:6,interpolation:!0,useImageSize:!1,useBorderWithImage:!1,coordinateOrigin:"center"},size:25,title:void 0,value:void 0,x:void 0,y:void 0},this.defaultOptions.mass<=0)throw"Internal error: mass in defaultOptions of NodesHandler may not be zero or negative";this.options=xe(this.defaultOptions),this.bindEventListeners()}bindEventListeners(){this.body.emitter.on("refreshNodes",this.refresh.bind(this)),this.body.emitter.on("refresh",this.refresh.bind(this)),this.body.emitter.on("destroy",()=>{A(this.nodesListeners,(e,t)=>{this.body.data.nodes&&this.body.data.nodes.off(t,e)}),delete this.body.functions.createNode,delete this.nodesListeners.add,delete this.nodesListeners.update,delete this.nodesListeners.remove,delete this.nodesListeners})}setOptions(e){if(e!==void 0){if(U.parseOptions(this.options,e),e.opacity!==void 0&&(Number.isNaN(e.opacity)||!Number.isFinite(e.opacity)||e.opacity<0||e.opacity>1?console.error("Invalid option for node opacity. Value must be between 0 and 1, found: "+e.opacity):this.options.opacity=e.opacity),e.shape!==void 0)for(let t in this.body.nodes)Object.prototype.hasOwnProperty.call(this.body.nodes,t)&&this.body.nodes[t].updateShape();if(typeof e.font!="undefined"||typeof e.widthConstraint!="undefined"||typeof e.heightConstraint!="undefined")for(let t of Object.keys(this.body.nodes))this.body.nodes[t].updateLabelModule(),this.body.nodes[t].needsRefresh();if(e.size!==void 0)for(let t in this.body.nodes)Object.prototype.hasOwnProperty.call(this.body.nodes,t)&&this.body.nodes[t].needsRefresh();(e.hidden!==void 0||e.physics!==void 0)&&this.body.emitter.emit("_dataChanged")}}setData(e,t=!1){let i=this.body.data.nodes;if(Ci("id",e))this.body.data.nodes=e;else if(Array.isArray(e))this.body.data.nodes=new fe,this.body.data.nodes.add(e);else if(!e)this.body.data.nodes=new fe;else throw new TypeError("Array or DataSet expected");if(i&&A(this.nodesListeners,function(s,o){i.off(o,s)}),this.body.nodes={},this.body.data.nodes){let s=this;A(this.nodesListeners,function(r,a){s.body.data.nodes.on(a,r)});let o=this.body.data.nodes.getIds();this.add(o,!0)}t===!1&&this.body.emitter.emit("_dataChanged")}add(e,t=!1){let i,s=[];for(let o=0;o{let s=this.body.data.nodes.get(i);s!==void 0&&(e===!0&&t.setOptions({x:null,y:null}),t.setOptions({fixed:!1}),t.setOptions(s))})}getPositions(e){let t={};if(e!==void 0){if(Array.isArray(e)===!0){for(let i=0;i{this.body.emitter.emit("startSimulation")},0)):console.error("Node id supplied to moveNode does not exist. Provided: ",e)}},G=class{static transform(e,t){Array.isArray(e)||(e=[e]);let i=t.point.x,s=t.point.y,o=t.angle,r=t.length;for(let a=0;a0?d>0?r=p:a=p:d>0?a=p:r=p,++C}while(r<=a&&C1?l=1:l<0&&(l=0);let c=e+l*a,u=t+l*d,p=c-o,b=u-r;return Math.sqrt(p*p+b*b)}getArrowData(e,t,i,s,o,r){let a,d,h,l,c,u,p,b=r.width;t==="from"?(h=this.from,l=this.to,c=r.fromArrowScale<0,u=Math.abs(r.fromArrowScale),p=r.fromArrowType):t==="to"?(h=this.to,l=this.from,c=r.toArrowScale<0,u=Math.abs(r.toArrowScale),p=r.toArrowType):(h=this.to,l=this.from,c=r.middleArrowScale<0,u=Math.abs(r.middleArrowScale),p=r.middleArrowType);let C=15*u+3*b;if(h!=l){let v=Math.hypot(h.x-l.x,h.y-l.y),_=C/v;if(t!=="middle")if(this.options.smooth.enabled===!0){let E=this._findBorderPosition(h,e,{via:i}),T=this.getPoint(E.t+_*(t==="from"?1:-1),i);a=Math.atan2(E.y-T.y,E.x-T.x),d=E}else a=Math.atan2(h.y-l.y,h.x-l.x),d=this._findBorderPosition(h,e);else{let E=(c?-_:_)/2,T=this.getPoint(.5+E,i),x=this.getPoint(.5-E,i);a=Math.atan2(T.y-x.y,T.x-x.x),d=this.getPoint(.5,i)}}else{let[v,_,E]=this._getCircleData(e);if(t==="from"){let T=this.options.selfReference.angle,x=this.options.selfReference.angle+Math.PI,w=this._findBorderPositionCircle(this.from,e,{x:v,y:_,low:T,high:x,direction:-1});a=w.t*-2*Math.PI+1.5*Math.PI+.1*Math.PI,d=w}else if(t==="to"){let T=this.options.selfReference.angle,x=this.options.selfReference.angle+Math.PI,w=this._findBorderPositionCircle(this.from,e,{x:v,y:_,low:T,high:x,direction:1});a=w.t*-2*Math.PI+1.5*Math.PI-1.1*Math.PI,d=w}else{let T=this.options.selfReference.angle/(2*Math.PI);d=this._pointOnCircle(v,_,E,T),a=T*-2*Math.PI+1.5*Math.PI+.1*Math.PI}}let f=d.x-C*.9*Math.cos(a),g=d.y-C*.9*Math.sin(a);return{point:d,core:{x:f,y:g},angle:a,length:C,type:p}}drawArrowHead(e,t,i,s,o){e.strokeStyle=this.getColor(e,t),e.fillStyle=e.strokeStyle,e.lineWidth=t.width,Fi.draw(e,o)&&(this.enableShadow(e,t),e.fill(),this.disableShadow(e,t))}enableShadow(e,t){t.shadow===!0&&(e.shadowColor=t.shadowColor,e.shadowBlur=t.shadowSize,e.shadowOffsetX=t.shadowX,e.shadowOffsetY=t.shadowY)}disableShadow(e,t){t.shadow===!0&&(e.shadowColor="rgba(0,0,0,0)",e.shadowBlur=0,e.shadowOffsetX=0,e.shadowOffsetY=0)}drawBackground(e,t){if(t.background!==!1){let i={strokeStyle:e.strokeStyle,lineWidth:e.lineWidth,dashes:e.dashes};e.strokeStyle=t.backgroundColor,e.lineWidth=t.backgroundSize,this.setStrokeDashed(e,t.backgroundDashes),e.stroke(),e.strokeStyle=i.strokeStyle,e.lineWidth=i.lineWidth,e.dashes=i.dashes,this.setStrokeDashed(e,t.dashes)}}setStrokeDashed(e,t){if(t!==!1)if(e.setLineDash!==void 0){let i=Array.isArray(t)?t:[5,5];e.setLineDash(i)}else console.warn("setLineDash is not supported in this browser. The dashed stroke cannot be used.");else e.setLineDash!==void 0?e.setLineDash([]):console.warn("setLineDash is not supported in this browser. The dashed stroke cannot be used.")}},Zt=class extends Ni{constructor(e,t,i){super(e,t,i)}_findBorderPositionBezier(e,t,i=this._getViaCoordinates()){let s=10,o=.2,r=!1,a=1,d=0,h=this.to,l,c,u=this.options.endPointOffset?this.options.endPointOffset.to:0;e.id===this.from.id&&(h=this.from,r=!0,u=this.options.endPointOffset?this.options.endPointOffset.from:0),this.options.arrowStrikethrough===!1&&(u=0);let p=0;do{c=(d+a)*.5,l=this.getPoint(c,i);let b=Math.atan2(h.y-l.y,h.x-l.x),C=h.distanceToBorder(t,b)+u,f=Math.sqrt(Math.pow(l.x-h.x,2)+Math.pow(l.y-h.y,2)),g=C-f;if(Math.abs(g)0&&(h=this._getDistanceToLine(b,C,u,p,o,r),d=h{this.positionBezierNode()},this._body.emitter.on("_repositionBezierNodes",this._boundFunction)}setOptions(e){super.setOptions(e);let t=!1;this.options.physics!==e.physics&&(t=!0),this.options=e,this.id=this.options.id,this.from=this._body.nodes[this.options.from],this.to=this._body.nodes[this.options.to],this.setupSupportNode(),this.connect(),t===!0&&(this.via.setOptions({physics:this.options.physics}),this.positionBezierNode())}connect(){this.from=this._body.nodes[this.options.from],this.to=this._body.nodes[this.options.to],this.from===void 0||this.to===void 0||this.options.physics===!1?this.via.setOptions({physics:!1}):this.from.id===this.to.id?this.via.setOptions({physics:!1}):this.via.setOptions({physics:!0})}cleanup(){return this._body.emitter.off("_repositionBezierNodes",this._boundFunction),this.via!==void 0?(delete this._body.nodes[this.via.id],this.via=void 0,!0):!1}setupSupportNode(){if(this.via===void 0){let e="edgeId:"+this.id,t=this._body.functions.createNode({id:e,shape:"circle",physics:!0,hidden:!0});this._body.nodes[e]=t,this.via=t,this.via.parentEdgeId=this.id,this.positionBezierNode()}}positionBezierNode(){this.via!==void 0&&this.from!==void 0&&this.to!==void 0?(this.via.x=.5*(this.from.x+this.to.x),this.via.y=.5*(this.from.y+this.to.y)):this.via!==void 0&&(this.via.x=0,this.via.y=0)}_line(e,t,i){this._bezierCurve(e,t,i)}_getViaCoordinates(){return this.via}getViaNode(){return this.via}getPoint(e,t=this.via){if(this.from===this.to){let[i,s,o]=this._getCircleData(),r=2*Math.PI*(1-e);return{x:i+o*Math.sin(r),y:s+o-o*(1-Math.cos(r))}}else return{x:Math.pow(1-e,2)*this.fromPoint.x+2*e*(1-e)*t.x+Math.pow(e,2)*this.toPoint.x,y:Math.pow(1-e,2)*this.fromPoint.y+2*e*(1-e)*t.y+Math.pow(e,2)*this.toPoint.y}}_findBorderPosition(e,t){return this._findBorderPositionBezier(e,t,this.via)}_getDistanceToEdge(e,t,i,s,o,r){return this._getDistanceToBezierEdge(e,t,i,s,o,r,this.via)}},Ai=class extends Zt{constructor(e,t,i){super(e,t,i)}_line(e,t,i){this._bezierCurve(e,t,i)}getViaNode(){return this._getViaCoordinates()}_getViaCoordinates(){let e=this.options.smooth.roundness,t=this.options.smooth.type,i=Math.abs(this.from.x-this.to.x),s=Math.abs(this.from.y-this.to.y);if(t==="discrete"||t==="diagonalCross"){let o,r;i<=s?o=r=e*s:o=r=e*i,this.from.x>this.to.x&&(o=-o),this.from.y>=this.to.y&&(r=-r);let a=this.from.x+o,d=this.from.y+r;return t==="discrete"&&(i<=s?a=ithis.to.x&&(o=-o),this.from.y>=this.to.y&&(r=-r);let a=this.from.x+o,d=this.from.y+r;return i<=s?this.from.x<=this.to.x?a=this.to.xa?this.to.x:a:this.from.y>=this.to.y?d=this.to.y>d?this.to.y:d:d=this.to.y0){let g=this._getDistanceToLine(l,c,C,f,o,r);h=gMath.abs(t)||this.options.smooth.forceDirection===!0||this.options.smooth.forceDirection==="horizontal")&&this.options.smooth.forceDirection!=="vertical"?(s=this.from.y,r=this.to.y,i=this.from.x-a*e,o=this.to.x+a*e):(s=this.from.y-a*t,r=this.to.y+a*t,i=this.from.x,o=this.to.x),[{x:i,y:s},{x:o,y:r}]}getViaNode(){return this._getViaCoordinates()}_findBorderPosition(e,t){return this._findBorderPositionBezier(e,t)}_getDistanceToEdge(e,t,i,s,o,r,[a,d]=this._getViaCoordinates()){return this._getDistanceToBezierEdge2(e,t,i,s,o,r,a,d)}getPoint(e,[t,i]=this._getViaCoordinates()){let s=e,o=[Math.pow(1-s,3),3*s*Math.pow(1-s,2),3*Math.pow(s,2)*(1-s),Math.pow(s,3)],r=o[0]*this.fromPoint.x+o[1]*t.x+o[2]*i.x+o[3]*this.toPoint.x,a=o[0]*this.fromPoint.y+o[1]*t.y+o[2]*i.y+o[3]*this.toPoint.y;return{x:r,y:a}}},Li=class extends Ni{constructor(e,t,i){super(e,t,i)}_line(e,t){e.beginPath(),e.moveTo(this.fromPoint.x,this.fromPoint.y),e.lineTo(this.toPoint.x,this.toPoint.y),this.enableShadow(e,t),e.stroke(),this.disableShadow(e,t)}getViaNode(){}getPoint(e){return{x:(1-e)*this.fromPoint.x+e*this.toPoint.x,y:(1-e)*this.fromPoint.y+e*this.toPoint.y}}_findBorderPosition(e,t){let i=this.to,s=this.from;e.id===this.from.id&&(i=this.from,s=this.to);let o=Math.atan2(i.y-s.y,i.x-s.x),r=i.x-s.x,a=i.y-s.y,d=Math.sqrt(r*r+a*a),h=e.distanceToBorder(t,o),l=(d-h)/d;return{x:(1-l)*s.x+l*i.x,y:(1-l)*s.y+l*i.y,t:0}}_getDistanceToEdge(e,t,i,s,o,r){return this._getDistanceToLine(e,t,i,s,o,r)}},Se=class{constructor(e,t,i,s,o){if(t===void 0)throw new Error("No body provided");this.options=xe(s),this.globalOptions=s,this.defaultOptions=o,this.body=t,this.imagelist=i,this.id=void 0,this.fromId=void 0,this.toId=void 0,this.selected=!1,this.hover=!1,this.labelDirty=!0,this.baseWidth=this.options.width,this.baseFontSize=this.options.font.size,this.from=void 0,this.to=void 0,this.edgeType=void 0,this.connected=!1,this.labelModule=new Ue(this.body,this.options,!0),this.setOptions(e)}setOptions(e){if(!e)return;let t=typeof e.physics!="undefined"&&this.options.physics!==e.physics||typeof e.hidden!="undefined"&&(this.options.hidden||!1)!==(e.hidden||!1)||typeof e.from!="undefined"&&this.options.from!==e.from||typeof e.to!="undefined"&&this.options.to!==e.to;Se.parseOptions(this.options,e,!0,this.globalOptions),e.id!==void 0&&(this.id=e.id),e.from!==void 0&&(this.fromId=e.from),e.to!==void 0&&(this.toId=e.to),e.title!==void 0&&(this.title=e.title),e.value!==void 0&&(e.value=parseFloat(e.value));let i=[e,this.options,this.defaultOptions];return this.chooser=Ii("edge",i),this.updateLabelModule(e),t=this.updateEdgeType()||t,this._setInteractionWidths(),this.connect(),t}static parseOptions(e,t,i=!1,s={},o=!1){if(Ve(["endPointOffset","arrowStrikethrough","id","from","hidden","hoverWidth","labelHighlightBold","length","line","opacity","physics","scaling","selectionWidth","selfReferenceSize","selfReference","to","title","value","width","font","chosen","widthConstraint"],e,t,i),t.endPointOffset!==void 0&&t.endPointOffset.from!==void 0&&(Number.isFinite(t.endPointOffset.from)?e.endPointOffset.from=t.endPointOffset.from:(e.endPointOffset.from=s.endPointOffset.from!==void 0?s.endPointOffset.from:0,console.error("endPointOffset.from is not a valid number"))),t.endPointOffset!==void 0&&t.endPointOffset.to!==void 0&&(Number.isFinite(t.endPointOffset.to)?e.endPointOffset.to=t.endPointOffset.to:(e.endPointOffset.to=s.endPointOffset.to!==void 0?s.endPointOffset.to:0,console.error("endPointOffset.to is not a valid number"))),Xt(t.label)?e.label=t.label:Xt(e.label)||(e.label=void 0),ae(e,t,"smooth",s),ae(e,t,"shadow",s),ae(e,t,"background",s),t.dashes!==void 0&&t.dashes!==null?e.dashes=t.dashes:i===!0&&t.dashes===null&&(e.dashes=Object.create(s.dashes)),t.scaling!==void 0&&t.scaling!==null?(t.scaling.min!==void 0&&(e.scaling.min=t.scaling.min),t.scaling.max!==void 0&&(e.scaling.max=t.scaling.max),ae(e.scaling,t.scaling,"label",s.scaling)):i===!0&&t.scaling===null&&(e.scaling=Object.create(s.scaling)),t.arrows!==void 0&&t.arrows!==null)if(typeof t.arrows=="string"){let a=t.arrows.toLowerCase();e.arrows.to.enabled=a.indexOf("to")!=-1,e.arrows.middle.enabled=a.indexOf("middle")!=-1,e.arrows.from.enabled=a.indexOf("from")!=-1}else if(typeof t.arrows=="object")ae(e.arrows,t.arrows,"to",s.arrows),ae(e.arrows,t.arrows,"middle",s.arrows),ae(e.arrows,t.arrows,"from",s.arrows);else throw new Error("The arrow newOptions can only be an object or a string. Refer to the documentation. You used:"+JSON.stringify(t.arrows));else i===!0&&t.arrows===null&&(e.arrows=Object.create(s.arrows));if(t.color!==void 0&&t.color!==null){let a=Ee(t.color)?{color:t.color,highlight:t.color,hover:t.color,inherit:!1,opacity:1}:t.color,d=e.color;if(o)j(d,s.color,!1,i);else for(let h in d)Object.prototype.hasOwnProperty.call(d,h)&&delete d[h];if(Ee(d))d.color=d,d.highlight=d,d.hover=d,d.inherit=!1,a.opacity===void 0&&(d.opacity=1);else{let h=!1;a.color!==void 0&&(d.color=a.color,h=!0),a.highlight!==void 0&&(d.highlight=a.highlight,h=!0),a.hover!==void 0&&(d.hover=a.hover,h=!0),a.inherit!==void 0&&(d.inherit=a.inherit),a.opacity!==void 0&&(d.opacity=Math.min(1,Math.max(0,a.opacity))),h===!0?d.inherit=!1:d.inherit===void 0&&(d.inherit="from")}}else i===!0&&t.color===null&&(e.color=xe(s.color));i===!0&&t.font===null&&(e.font=xe(s.font)),Object.prototype.hasOwnProperty.call(t,"selfReferenceSize")&&(console.warn("The selfReferenceSize property has been deprecated. Please use selfReference property instead. The selfReference can be set like thise selfReference:{size:30, angle:Math.PI / 4}"),e.selfReference.size=t.selfReferenceSize)}getFormattingValues(){let e=this.options.arrows.to===!0||this.options.arrows.to.enabled===!0,t=this.options.arrows.from===!0||this.options.arrows.from.enabled===!0,i=this.options.arrows.middle===!0||this.options.arrows.middle.enabled===!0,s=this.options.color.inherit,o={toArrow:e,toArrowScale:this.options.arrows.to.scaleFactor,toArrowType:this.options.arrows.to.type,toArrowSrc:this.options.arrows.to.src,toArrowImageWidth:this.options.arrows.to.imageWidth,toArrowImageHeight:this.options.arrows.to.imageHeight,middleArrow:i,middleArrowScale:this.options.arrows.middle.scaleFactor,middleArrowType:this.options.arrows.middle.type,middleArrowSrc:this.options.arrows.middle.src,middleArrowImageWidth:this.options.arrows.middle.imageWidth,middleArrowImageHeight:this.options.arrows.middle.imageHeight,fromArrow:t,fromArrowScale:this.options.arrows.from.scaleFactor,fromArrowType:this.options.arrows.from.type,fromArrowSrc:this.options.arrows.from.src,fromArrowImageWidth:this.options.arrows.from.imageWidth,fromArrowImageHeight:this.options.arrows.from.imageHeight,arrowStrikethrough:this.options.arrowStrikethrough,color:s?void 0:this.options.color.color,inheritsColor:s,opacity:this.options.color.opacity,hidden:this.options.hidden,length:this.options.length,shadow:this.options.shadow.enabled,shadowColor:this.options.shadow.color,shadowSize:this.options.shadow.size,shadowX:this.options.shadow.x,shadowY:this.options.shadow.y,dashes:this.options.dashes,width:this.options.width,background:this.options.background.enabled,backgroundColor:this.options.background.color,backgroundSize:this.options.background.size,backgroundDashes:this.options.background.dashes};if(this.selected||this.hover)if(this.chooser===!0){if(this.selected){let r=this.options.selectionWidth;typeof r=="function"?o.width=r(o.width):typeof r=="number"&&(o.width+=r),o.width=Math.max(o.width,.3/this.body.view.scale),o.color=this.options.color.highlight,o.shadow=this.options.shadow.enabled}else if(this.hover){let r=this.options.hoverWidth;typeof r=="function"?o.width=r(o.width):typeof r=="number"&&(o.width+=r),o.width=Math.max(o.width,.3/this.body.view.scale),o.color=this.options.color.hover,o.shadow=this.options.shadow.enabled}}else typeof this.chooser=="function"&&(this.chooser(o,this.options.id,this.selected,this.hover),o.color!==void 0&&(o.inheritsColor=!1),o.shadow===!1&&(o.shadowColor!==this.options.shadow.color||o.shadowSize!==this.options.shadow.size||o.shadowX!==this.options.shadow.x||o.shadowY!==this.options.shadow.y)&&(o.shadow=!0));else o.shadow=this.options.shadow.enabled,o.width=Math.max(o.width,.3/this.body.view.scale);return o}updateLabelModule(e){let t=[e,this.options,this.globalOptions,this.defaultOptions];this.labelModule.update(this.options,t),this.labelModule.baseSize!==void 0&&(this.baseFontSize=this.labelModule.baseSize)}updateEdgeType(){let e=this.options.smooth,t=!1,i=!0;return this.edgeType!==void 0&&((this.edgeType instanceof Bi&&e.enabled===!0&&e.type==="dynamic"||this.edgeType instanceof zi&&e.enabled===!0&&e.type==="cubicBezier"||this.edgeType instanceof Ai&&e.enabled===!0&&e.type!=="dynamic"&&e.type!=="cubicBezier"||this.edgeType instanceof Li&&e.type.enabled===!1)&&(i=!1),i===!0&&(t=this.cleanup())),i===!0?e.enabled===!0?e.type==="dynamic"?(t=!0,this.edgeType=new Bi(this.options,this.body,this.labelModule)):e.type==="cubicBezier"?this.edgeType=new zi(this.options,this.body,this.labelModule):this.edgeType=new Ai(this.options,this.body,this.labelModule):this.edgeType=new Li(this.options,this.body,this.labelModule):this.edgeType.setOptions(this.options),t}connect(){this.disconnect(),this.from=this.body.nodes[this.fromId]||void 0,this.to=this.body.nodes[this.toId]||void 0,this.connected=this.from!==void 0&&this.to!==void 0,this.connected===!0?(this.from.attachEdge(this),this.to.attachEdge(this)):(this.from&&this.from.detachEdge(this),this.to&&this.to.detachEdge(this)),this.edgeType.connect()}disconnect(){this.from&&(this.from.detachEdge(this),this.from=void 0),this.to&&(this.to.detachEdge(this),this.to=void 0),this.connected=!1}getTitle(){return this.title}isSelected(){return this.selected}getValue(){return this.options.value}setValueRange(e,t,i){if(this.options.value!==void 0){let s=this.options.scaling.customScalingFunction(e,t,i,this.options.value),o=this.options.scaling.max-this.options.scaling.min;if(this.options.scaling.label.enabled===!0){let r=this.options.scaling.label.max-this.options.scaling.label.min;this.options.font.size=this.options.scaling.label.min+s*r}this.options.width=this.options.scaling.min+s*o}else this.options.width=this.baseWidth,this.options.font.size=this.baseFontSize;this._setInteractionWidths(),this.updateLabelModule()}_setInteractionWidths(){typeof this.options.hoverWidth=="function"?this.edgeType.hoverWidth=this.options.hoverWidth(this.options.width):this.edgeType.hoverWidth=this.options.hoverWidth+this.options.width,typeof this.options.selectionWidth=="function"?this.edgeType.selectionWidth=this.options.selectionWidth(this.options.width):this.edgeType.selectionWidth=this.options.selectionWidth+this.options.width}draw(e){let t=this.getFormattingValues();if(t.hidden)return;let i=this.edgeType.getViaNode();this.edgeType.drawLine(e,t,this.selected,this.hover,i),this.drawLabel(e,i)}drawArrows(e){let t=this.getFormattingValues();if(t.hidden)return;let i=this.edgeType.getViaNode(),s={};this.edgeType.fromPoint=this.edgeType.from,this.edgeType.toPoint=this.edgeType.to,t.fromArrow&&(s.from=this.edgeType.getArrowData(e,"from",i,this.selected,this.hover,t),t.arrowStrikethrough===!1&&(this.edgeType.fromPoint=s.from.core),t.fromArrowSrc&&(s.from.image=this.imagelist.load(t.fromArrowSrc)),t.fromArrowImageWidth&&(s.from.imageWidth=t.fromArrowImageWidth),t.fromArrowImageHeight&&(s.from.imageHeight=t.fromArrowImageHeight)),t.toArrow&&(s.to=this.edgeType.getArrowData(e,"to",i,this.selected,this.hover,t),t.arrowStrikethrough===!1&&(this.edgeType.toPoint=s.to.core),t.toArrowSrc&&(s.to.image=this.imagelist.load(t.toArrowSrc)),t.toArrowImageWidth&&(s.to.imageWidth=t.toArrowImageWidth),t.toArrowImageHeight&&(s.to.imageHeight=t.toArrowImageHeight)),t.middleArrow&&(s.middle=this.edgeType.getArrowData(e,"middle",i,this.selected,this.hover,t),t.middleArrowSrc&&(s.middle.image=this.imagelist.load(t.middleArrowSrc)),t.middleArrowImageWidth&&(s.middle.imageWidth=t.middleArrowImageWidth),t.middleArrowImageHeight&&(s.middle.imageHeight=t.middleArrowImageHeight)),t.fromArrow&&this.edgeType.drawArrowHead(e,t,this.selected,this.hover,s.from),t.middleArrow&&this.edgeType.drawArrowHead(e,t,this.selected,this.hover,s.middle),t.toArrow&&this.edgeType.drawArrowHead(e,t,this.selected,this.hover,s.to)}drawLabel(e,t){if(this.options.label!==void 0){let i=this.from,s=this.to;this.labelModule.differentState(this.selected,this.hover)&&this.labelModule.getTextSize(e,this.selected,this.hover);let o;if(i.id!=s.id){this.labelModule.pointToSelf=!1,o=this.edgeType.getPoint(.5,t),e.save();let r=this._getRotation(e);r.angle!=0&&(e.translate(r.x,r.y),e.rotate(r.angle)),this.labelModule.draw(e,o.x,o.y,this.selected,this.hover),e.restore()}else{this.labelModule.pointToSelf=!0;let r=To(e,this.options.selfReference.angle,this.options.selfReference.size,i);o=this._pointOnCircle(r.x,r.y,this.options.selfReference.size,this.options.selfReference.angle),this.labelModule.draw(e,o.x,o.y,this.selected,this.hover)}}}getItemsOnPoint(e){let t=[];if(this.labelModule.visible()){let s=this._getRotation();Pi(this.labelModule.getSize(),e,s)&&t.push({edgeId:this.id,labelId:0})}let i={left:e.x,top:e.y};return this.isOverlappingWith(i)&&t.push({edgeId:this.id}),t}isOverlappingWith(e){if(this.connected){let t=10,i=this.from.x,s=this.from.y,o=this.to.x,r=this.to.y,a=e.left,d=e.top;return this.edgeType.getDistanceToEdge(i,s,o,r,a,d)0&&r<0)&&(a+=Math.PI),s.angle=a,s}_pointOnCircle(e,t,i,s){return{x:e+i*Math.cos(s),y:t-i*Math.sin(s)}}select(){this.selected=!0}unselect(){this.selected=!1}cleanup(){return this.edgeType.cleanup()}remove(){this.cleanup(),this.disconnect(),delete this.body.edges[this.id]}endPointsValid(){return this.body.nodes[this.fromId]!==void 0&&this.body.nodes[this.toId]!==void 0}},on=class{constructor(e,t,i){this.body=e,this.images=t,this.groups=i,this.body.functions.createEdge=this.create.bind(this),this.edgesListeners={add:(s,o)=>{this.add(o.items)},update:(s,o)=>{this.update(o.items)},remove:(s,o)=>{this.remove(o.items)}},this.options={},this.defaultOptions={arrows:{to:{enabled:!1,scaleFactor:1,type:"arrow"},middle:{enabled:!1,scaleFactor:1,type:"arrow"},from:{enabled:!1,scaleFactor:1,type:"arrow"}},endPointOffset:{from:0,to:0},arrowStrikethrough:!0,color:{color:"#848484",highlight:"#848484",hover:"#848484",inherit:"from",opacity:1},dashes:!1,font:{color:"#343434",size:14,face:"arial",background:"none",strokeWidth:2,strokeColor:"#ffffff",align:"horizontal",multi:!1,vadjust:0,bold:{mod:"bold"},boldital:{mod:"bold italic"},ital:{mod:"italic"},mono:{mod:"",size:15,face:"courier new",vadjust:2}},hidden:!1,hoverWidth:1.5,label:void 0,labelHighlightBold:!0,length:void 0,physics:!0,scaling:{min:1,max:15,label:{enabled:!0,min:14,max:30,maxVisible:30,drawThreshold:5},customScalingFunction:function(s,o,r,a){if(o===s)return .5;{let d=1/(o-s);return Math.max(0,(a-s)*d)}}},selectionWidth:1.5,selfReference:{size:20,angle:Math.PI/4,renderBehindTheNode:!0},shadow:{enabled:!1,color:"rgba(0,0,0,0.5)",size:10,x:5,y:5},background:{enabled:!1,color:"rgba(111,111,111,1)",size:10,dashes:!1},smooth:{enabled:!0,type:"dynamic",forceDirection:"none",roundness:.5},title:void 0,width:1,value:void 0},j(this.options,this.defaultOptions),this.bindEventListeners()}bindEventListeners(){this.body.emitter.on("_forceDisableDynamicCurves",(e,t=!0)=>{e==="dynamic"&&(e="continuous");let i=!1;for(let s in this.body.edges)if(Object.prototype.hasOwnProperty.call(this.body.edges,s)){let o=this.body.edges[s],r=this.body.data.edges.get(s);if(r!=null){let a=r.smooth;a!==void 0&&a.enabled===!0&&a.type==="dynamic"&&(e===void 0?o.setOptions({smooth:!1}):o.setOptions({smooth:{type:e}}),i=!0)}}t===!0&&i===!0&&this.body.emitter.emit("_dataChanged")}),this.body.emitter.on("_dataUpdated",()=>{this.reconnectEdges()}),this.body.emitter.on("refreshEdges",this.refresh.bind(this)),this.body.emitter.on("refresh",this.refresh.bind(this)),this.body.emitter.on("destroy",()=>{A(this.edgesListeners,(e,t)=>{this.body.data.edges&&this.body.data.edges.off(t,e)}),delete this.body.functions.createEdge,delete this.edgesListeners.add,delete this.edgesListeners.update,delete this.edgesListeners.remove,delete this.edgesListeners})}setOptions(e){if(e!==void 0){Se.parseOptions(this.options,e,!0,this.defaultOptions,!0);let t=!1;if(e.smooth!==void 0)for(let i in this.body.edges)Object.prototype.hasOwnProperty.call(this.body.edges,i)&&(t=this.body.edges[i].updateEdgeType()||t);if(e.font!==void 0)for(let i in this.body.edges)Object.prototype.hasOwnProperty.call(this.body.edges,i)&&this.body.edges[i].updateLabelModule();(e.hidden!==void 0||e.physics!==void 0||t===!0)&&this.body.emitter.emit("_dataChanged")}}setData(e,t=!1){let i=this.body.data.edges;if(Ci("id",e))this.body.data.edges=e;else if(Array.isArray(e))this.body.data.edges=new fe,this.body.data.edges.add(e);else if(!e)this.body.data.edges=new fe;else throw new TypeError("Array or DataSet expected");if(i&&A(this.edgesListeners,(s,o)=>{i.off(o,s)}),this.body.edges={},this.body.data.edges){A(this.edgesListeners,(o,r)=>{this.body.data.edges.on(r,o)});let s=this.body.data.edges.getIds();this.add(s,!0)}this.body.emitter.emit("_adjustEdgesForHierarchicalLayout"),t===!1&&this.body.emitter.emit("_dataChanged")}add(e,t=!1){let i=this.body.edges,s=this.body.data.edges;for(let o=0;o{let o=i[s];o!==void 0&&o.remove()}),t&&this.body.emitter.emit("_dataChanged")}refresh(){A(this.body.edges,(e,t)=>{let i=this.body.data.edges.get(t);i!==void 0&&e.setOptions(i)})}create(e){return new Se(e,this.body,this.images,this.options,this.defaultOptions)}reconnectEdges(){let e,t=this.body.nodes,i=this.body.edges;for(e in t)Object.prototype.hasOwnProperty.call(t,e)&&(t[e].edges=[]);for(e in i)if(Object.prototype.hasOwnProperty.call(i,e)){let s=i[e];s.from=null,s.to=null,s.connect()}}getConnectedNodes(e){let t=[];if(this.body.edges[e]!==void 0){let i=this.body.edges[e];i.fromId!==void 0&&t.push(i.fromId),i.toId!==void 0&&t.push(i.toId)}return t}_updateState(){this._addMissingEdges(),this._removeInvalidEdges()}_removeInvalidEdges(){let e=[];A(this.body.edges,(t,i)=>{let s=this.body.nodes[t.toId],o=this.body.nodes[t.fromId];s!==void 0&&s.isCluster===!0||o!==void 0&&o.isCluster===!0||(s===void 0||o===void 0)&&e.push(i)}),this.remove(e,!1)}_addMissingEdges(){let e=this.body.data.edges;if(e==null)return;let t=this.body.edges,i=[];e.forEach((s,o)=>{t[o]===void 0&&i.push(o)}),this.add(i,!0)}},Ri=class{constructor(e,t,i){this.body=e,this.physicsBody=t,this.barnesHutTree,this.setOptions(i),this._rng=gt("BARNES HUT SOLVER")}setOptions(e){this.options=e,this.thetaInversed=1/this.options.theta,this.overlapAvoidanceFactor=1-Math.max(0,Math.min(1,this.options.avoidOverlap))}solve(){if(this.options.gravitationalConstant!==0&&this.physicsBody.physicsNodeIndices.length>0){let e,t=this.body.nodes,i=this.physicsBody.physicsNodeIndices,s=i.length,o=this._formBarnesHutTree(t,i);this.barnesHutTree=o;for(let r=0;r0&&this._getForceContributions(o.root,e)}}_getForceContributions(e,t){this._getForceContribution(e.children.NW,t),this._getForceContribution(e.children.NE,t),this._getForceContribution(e.children.SW,t),this._getForceContribution(e.children.SE,t)}_getForceContribution(e,t){if(e.childrenCount>0){let i=e.centerOfMass.x-t.x,s=e.centerOfMass.y-t.y,o=Math.sqrt(i*i+s*s);o*e.calcSize>this.thetaInversed?this._calculateForces(o,i,s,t,e):e.childrenCount===4?this._getForceContributions(e,t):e.children.data.id!=t.id&&this._calculateForces(o,i,s,t,e)}}_calculateForces(e,t,i,s,o){e===0&&(e=.1,t=e),this.overlapAvoidanceFactor<1&&s.shape.radius&&(e=Math.max(.1+this.overlapAvoidanceFactor*s.shape.radius,e-s.shape.radius));let r=this.options.gravitationalConstant*o.mass*s.options.mass/Math.pow(e,3),a=t*r,d=i*r;this.physicsBody.forces[s.id].x+=a,this.physicsBody.forces[s.id].y+=d}_formBarnesHutTree(e,t){let i,s=t.length,o=e[t[0]].x,r=e[t[0]].y,a=e[t[0]].x,d=e[t[0]].y;for(let f=1;f0&&(ma&&(a=m),vd&&(d=v))}let h=Math.abs(a-o)-Math.abs(d-r);h>0?(r-=.5*h,d+=.5*h):(o+=.5*h,a-=.5*h);let c=Math.max(1e-5,Math.abs(a-o)),u=.5*c,p=.5*(o+a),b=.5*(r+d),C={root:{centerOfMass:{x:0,y:0},mass:0,range:{minX:p-u,maxX:p+u,minY:b-u,maxY:b+u},size:c,calcSize:1/c,children:{data:null},maxWidth:0,level:0,childrenCount:4}};this._splitBranch(C.root);for(let f=0;f0&&this._placeInTree(C.root,i);return C}_updateBranchMass(e,t){let i=e.centerOfMass,s=e.mass+t.options.mass,o=1/s;i.x=i.x*e.mass+t.x*t.options.mass,i.x*=o,i.y=i.y*e.mass+t.y*t.options.mass,i.y*=o,e.mass=s;let r=Math.max(Math.max(t.height,t.radius),t.width);e.maxWidth=e.maxWidtht.x?s.maxY>t.y?o="NW":o="SW":s.maxY>t.y?o="NE":o="SE",this._placeInRegion(e,t,o)}_placeInRegion(e,t,i){let s=e.children[i];switch(s.childrenCount){case 0:s.children.data=t,s.childrenCount=1,this._updateBranchMass(s,t);break;case 1:s.children.data.x===t.x&&s.children.data.y===t.y?(t.x+=this._rng(),t.y+=this._rng()):(this._splitBranch(s),this._placeInTree(s,t));break;case 4:this._placeInTree(s,t);break}}_splitBranch(e){let t=null;e.childrenCount===1&&(t=e.children.data,e.mass=0,e.centerOfMass.x=0,e.centerOfMass.y=0),e.childrenCount=4,e.children.data=null,this._insertRegion(e,"NW"),this._insertRegion(e,"NE"),this._insertRegion(e,"SW"),this._insertRegion(e,"SE"),t!=null&&this._placeInTree(e,t)}_insertRegion(e,t){let i,s,o,r,a=.5*e.size;switch(t){case"NW":i=e.range.minX,s=e.range.minX+a,o=e.range.minY,r=e.range.minY+a;break;case"NE":i=e.range.minX+a,s=e.range.maxX,o=e.range.minY,r=e.range.minY+a;break;case"SW":i=e.range.minX,s=e.range.minX+a,o=e.range.minY+a,r=e.range.maxY;break;case"SE":i=e.range.minX+a,s=e.range.maxX,o=e.range.minY+a,r=e.range.maxY;break}e.children[t]={centerOfMass:{x:0,y:0},mass:0,range:{minX:i,maxX:s,minY:o,maxY:r},size:.5*e.size,calcSize:2*e.calcSize,children:{data:null},maxWidth:0,level:e.level+1,childrenCount:0}}_debug(e,t){this.barnesHutTree!==void 0&&(e.lineWidth=1,this._drawBranch(this.barnesHutTree.root,e,t))}_drawBranch(e,t,i){i===void 0&&(i="#FF0000"),e.childrenCount===4&&(this._drawBranch(e.children.NW,t),this._drawBranch(e.children.NE,t),this._drawBranch(e.children.SE,t),this._drawBranch(e.children.SW,t)),t.strokeStyle=i,t.beginPath(),t.moveTo(e.range.minX,e.range.minY),t.lineTo(e.range.maxX,e.range.minY),t.stroke(),t.beginPath(),t.moveTo(e.range.maxX,e.range.minY),t.lineTo(e.range.maxX,e.range.maxY),t.stroke(),t.beginPath(),t.moveTo(e.range.maxX,e.range.maxY),t.lineTo(e.range.minX,e.range.maxY),t.stroke(),t.beginPath(),t.moveTo(e.range.minX,e.range.maxY),t.lineTo(e.range.minX,e.range.minY),t.stroke()}},nn=class{constructor(e,t,i){this._rng=gt("REPULSION SOLVER"),this.body=e,this.physicsBody=t,this.setOptions(i)}setOptions(e){this.options=e}solve(){let e,t,i,s,o,r,a,d,h=this.body.nodes,l=this.physicsBody.physicsNodeIndices,c=this.physicsBody.forces,u=this.options.nodeDistance,p=-2/3/u,b=4/3;for(let C=0;C0){let r=o.edges.length+1,a=this.options.centralGravity*r*o.options.mass;s[o.id].x=t*a,s[o.id].y=i*a}}},ln=class{constructor(e){this.body=e,this.physicsBody={physicsNodeIndices:[],physicsEdgeIndices:[],forces:{},velocities:{}},this.physicsEnabled=!0,this.simulationInterval=1e3/60,this.requiresTimeout=!0,this.previousStates={},this.referenceState={},this.freezeCache={},this.renderTimer=void 0,this.adaptiveTimestep=!1,this.adaptiveTimestepEnabled=!1,this.adaptiveCounter=0,this.adaptiveInterval=3,this.stabilized=!1,this.startedStabilization=!1,this.stabilizationIterations=0,this.ready=!1,this.options={},this.defaultOptions={enabled:!0,barnesHut:{theta:.5,gravitationalConstant:-2e3,centralGravity:.3,springLength:95,springConstant:.04,damping:.09,avoidOverlap:0},forceAtlas2Based:{theta:.5,gravitationalConstant:-50,centralGravity:.01,springConstant:.08,springLength:100,damping:.4,avoidOverlap:0},repulsion:{centralGravity:.2,springLength:200,springConstant:.05,nodeDistance:100,damping:.09,avoidOverlap:0},hierarchicalRepulsion:{centralGravity:0,springLength:100,springConstant:.01,nodeDistance:120,damping:.09},maxVelocity:50,minVelocity:.75,solver:"barnesHut",stabilization:{enabled:!0,iterations:1e3,updateInterval:50,onlyDynamicEdges:!1,fit:!0},timestep:.5,adaptiveTimestep:!0,wind:{x:0,y:0}},Object.assign(this.options,this.defaultOptions),this.timestep=.5,this.layoutFailed=!1,this.bindEventListeners()}bindEventListeners(){this.body.emitter.on("initPhysics",()=>{this.initPhysics()}),this.body.emitter.on("_layoutFailed",()=>{this.layoutFailed=!0}),this.body.emitter.on("resetPhysics",()=>{this.stopSimulation(),this.ready=!1}),this.body.emitter.on("disablePhysics",()=>{this.physicsEnabled=!1,this.stopSimulation()}),this.body.emitter.on("restorePhysics",()=>{this.setOptions(this.options),this.ready===!0&&this.startSimulation()}),this.body.emitter.on("startSimulation",()=>{this.ready===!0&&this.startSimulation()}),this.body.emitter.on("stopSimulation",()=>{this.stopSimulation()}),this.body.emitter.on("destroy",()=>{this.stopSimulation(!1),this.body.emitter.off()}),this.body.emitter.on("_dataChanged",()=>{this.updatePhysicsData()})}setOptions(e){if(e!==void 0)if(e===!1)this.options.enabled=!1,this.physicsEnabled=!1,this.stopSimulation();else if(e===!0)this.options.enabled=!0,this.physicsEnabled=!0,this.startSimulation();else{this.physicsEnabled=!0,mt(["stabilization"],this.options,e),ae(this.options,e,"stabilization"),e.enabled===void 0&&(this.options.enabled=!0),this.options.enabled===!1&&(this.physicsEnabled=!1,this.stopSimulation());let t=this.options.wind;t&&((typeof t.x!="number"||Number.isNaN(t.x))&&(t.x=0),(typeof t.y!="number"||Number.isNaN(t.y))&&(t.y=0)),this.timestep=this.options.timestep}this.init()}init(){let e;this.options.solver==="forceAtlas2Based"?(e=this.options.forceAtlas2Based,this.nodesSolver=new dn(this.body,this.physicsBody,e),this.edgesSolver=new Qt(this.body,this.physicsBody,e),this.gravitySolver=new hn(this.body,this.physicsBody,e)):this.options.solver==="repulsion"?(e=this.options.repulsion,this.nodesSolver=new nn(this.body,this.physicsBody,e),this.edgesSolver=new Qt(this.body,this.physicsBody,e),this.gravitySolver=new Et(this.body,this.physicsBody,e)):this.options.solver==="hierarchicalRepulsion"?(e=this.options.hierarchicalRepulsion,this.nodesSolver=new rn(this.body,this.physicsBody,e),this.edgesSolver=new an(this.body,this.physicsBody,e),this.gravitySolver=new Et(this.body,this.physicsBody,e)):(e=this.options.barnesHut,this.nodesSolver=new Ri(this.body,this.physicsBody,e),this.edgesSolver=new Qt(this.body,this.physicsBody,e),this.gravitySolver=new Et(this.body,this.physicsBody,e)),this.modelOptions=e}initPhysics(){this.physicsEnabled===!0&&this.options.enabled===!0?this.options.stabilization.enabled===!0?this.stabilize():(this.stabilized=!1,this.ready=!0,this.body.emitter.emit("fit",{},this.layoutFailed),this.startSimulation()):(this.ready=!0,this.body.emitter.emit("fit"))}startSimulation(){this.physicsEnabled===!0&&this.options.enabled===!0?(this.stabilized=!1,this.adaptiveTimestep=!1,this.body.emitter.emit("_resizeNodes"),this.viewFunction===void 0&&(this.viewFunction=this.simulationStep.bind(this),this.body.emitter.on("initRedraw",this.viewFunction),this.body.emitter.emit("_startRendering"))):this.body.emitter.emit("_redraw")}stopSimulation(e=!0){this.stabilized=!0,e===!0&&this._emitStabilized(),this.viewFunction!==void 0&&(this.body.emitter.off("initRedraw",this.viewFunction),this.viewFunction=void 0,e===!0&&this.body.emitter.emit("_stopRendering"))}simulationStep(){let e=Date.now();this.physicsTick(),(Date.now()-e<.4*this.simulationInterval||this.runDoubleSpeed===!0)&&this.stabilized===!1&&(this.physicsTick(),this.runDoubleSpeed=!0),this.stabilized===!0&&this.stopSimulation()}_emitStabilized(e=this.stabilizationIterations){(this.stabilizationIterations>1||this.startedStabilization===!0)&&setTimeout(()=>{this.body.emitter.emit("stabilized",{iterations:e}),this.startedStabilization=!1,this.stabilizationIterations=0},0)}physicsStep(){this.gravitySolver.solve(),this.nodesSolver.solve(),this.edgesSolver.solve(),this.moveNodes()}adjustTimeStep(){let e=1.2;this._evaluateStepQuality()===!0?this.timestep=e*this.timestep:this.timestep/er))return!1;return!0}moveNodes(){let e=this.physicsBody.physicsNodeIndices,t=0,i=0,s=5;for(let o=0;or&&(e=e>0?r:-r),e}_performStep(e){let t=this.body.nodes[e],i=this.physicsBody.forces[e];this.options.wind&&(i.x+=this.options.wind.x,i.y+=this.options.wind.y);let s=this.physicsBody.velocities[e];return this.previousStates[e]={x:t.x,y:t.y,vx:s.x,vy:s.y},t.options.fixed.x===!1?(s.x=this.calculateComponentVelocity(s.x,i.x,t.options.mass),t.x+=s.x*this.timestep):(i.x=0,s.x=0),t.options.fixed.y===!1?(s.y=this.calculateComponentVelocity(s.y,i.y,t.options.mass),t.y+=s.y*this.timestep):(i.y=0,s.y=0),Math.sqrt(Math.pow(s.x,2)+Math.pow(s.y,2))}_freezeNodes(){let e=this.body.nodes;for(let t in e)if(Object.prototype.hasOwnProperty.call(e,t)&&e[t].x&&e[t].y){let i=e[t].options.fixed;this.freezeCache[t]={x:i.x,y:i.y},i.x=!0,i.y=!0}}_restoreFrozenNodes(){let e=this.body.nodes;for(let t in e)Object.prototype.hasOwnProperty.call(e,t)&&this.freezeCache[t]!==void 0&&(e[t].options.fixed.x=this.freezeCache[t].x,e[t].options.fixed.y=this.freezeCache[t].y);this.freezeCache={}}stabilize(e=this.options.stabilization.iterations){if(typeof e!="number"&&(e=this.options.stabilization.iterations,console.error("The stabilize method needs a numeric amount of iterations. Switching to default: ",e)),this.physicsBody.physicsNodeIndices.length===0){this.ready=!0;return}this.adaptiveTimestep=this.options.adaptiveTimestep,this.body.emitter.emit("_resizeNodes"),this.stopSimulation(),this.stabilized=!1,this.body.emitter.emit("_blockRedraw"),this.targetIterations=e,this.options.stabilization.onlyDynamicEdges===!0&&this._freezeNodes(),this.stabilizationIterations=0,setTimeout(()=>this._stabilizationBatch(),0)}_startStabilizing(){return this.startedStabilization===!0?!1:(this.body.emitter.emit("startStabilizing"),this.startedStabilization=!0,!0)}_stabilizationBatch(){let e=()=>this.stabilized===!1&&this.stabilizationIterations{this.body.emitter.emit("stabilizationProgress",{iterations:this.stabilizationIterations,total:this.targetIterations})};this._startStabilizing()&&t();let i=0;for(;e()&&i0)for(let d=0;da.shape.boundingBox.left&&(o=a.shape.boundingBox.left),ra.shape.boundingBox.top&&(i=a.shape.boundingBox.top),s0)for(let d=0;da.x&&(o=a.x),ra.y&&(i=a.y),s{delete this.containedEdges[i.id]}),A(t.containedNodes,(i,s)=>{this.containedNodes[s]=i}),t.containedNodes={},A(t.containedEdges,(i,s)=>{this.containedEdges[s]=i}),t.containedEdges={},A(t.edges,i=>{A(this.edges,s=>{let o=s.clusteringEdgeReplacingIds.indexOf(i.id);o!==-1&&(A(i.clusteringEdgeReplacingIds,r=>{s.clusteringEdgeReplacingIds.push(r),this.body.edges[r].edgeReplacedById=s.id}),s.clusteringEdgeReplacingIds.splice(o,1))})}),t.edges=[]}},un=class{constructor(e){this.body=e,this.clusteredNodes={},this.clusteredEdges={},this.options={},this.defaultOptions={},Object.assign(this.options,this.defaultOptions),this.body.emitter.on("_resetData",()=>{this.clusteredNodes={},this.clusteredEdges={}})}clusterByHubsize(e,t){e===void 0?e=this._getHubSize():typeof e=="object"&&(t=this._checkOptions(e),e=this._getHubSize());let i=[];for(let s=0;s=e&&i.push(o.id)}for(let s=0;s{o.options&&e.joinCondition(o.options)===!0&&(i[r]=o,A(o.edges,a=>{this.clusteredEdges[a.id]===void 0&&(s[a.id]=a)}))}),this._cluster(i,s,e,t)}clusterByEdgeCount(e,t,i=!0){t=this._checkOptions(t);let s=[],o={},r,a,d;for(let h=0;h0&&Object.keys(c).length>0&&C===!0){let g=function(){for(let m=0;m-1&&(r[p.id]=p)}}this._cluster(o,r,t,i)}_createClusterEdges(e,t,i,s){let o,r,a,d,h,l,c=Object.keys(e),u=[];for(let C=0;Cs?a.x:s,o=a.yr?a.y:r;return{x:.5*(i+s),y:.5*(o+r)}}openCluster(e,t,i=!0){if(e===void 0)throw new Error("No clusterNodeId supplied to openCluster.");let s=this.body.nodes[e];if(s===void 0)throw new Error("The clusterNodeId supplied to openCluster does not exist.");if(s.isCluster!==!0||s.containedNodes===void 0||s.containedEdges===void 0)throw new Error("The node:"+e+" is not a valid cluster.");let o=this.findNode(e),r=o.indexOf(e)-1;if(r>=0){let l=o[r];this.body.nodes[l]._openChildCluster(e),delete this.body.nodes[e],i===!0&&this.body.emitter.emit("_dataChanged");return}let a=s.containedNodes,d=s.containedEdges;if(t!==void 0&&t.releaseFunction!==void 0&&typeof t.releaseFunction=="function"){let l={},c={x:s.x,y:s.y};for(let p in a)if(Object.prototype.hasOwnProperty.call(a,p)){let b=this.body.nodes[p];l[p]={x:b.x,y:b.y}}let u=t.releaseFunction(c,l);for(let p in a)if(Object.prototype.hasOwnProperty.call(a,p)){let b=this.body.nodes[p];u[p]!==void 0&&(b.x=u[p].x===void 0?s.x:u[p].x,b.y=u[p].y===void 0?s.y:u[p].y)}}else A(a,function(l){l.options.fixed.x===!1&&(l.x=s.x),l.options.fixed.y===!1&&(l.y=s.y)});for(let l in a)if(Object.prototype.hasOwnProperty.call(a,l)){let c=this.body.nodes[l];c.vx=s.vx,c.vy=s.vy,c.setOptions({physics:!0}),delete this.clusteredNodes[l]}let h=[];for(let l=0;l0&&rs&&(s=h.edges.length),e+=h.edges.length,t+=Math.pow(h.edges.length,2),i+=1}e=e/i,t=t/i;let o=t-Math.pow(e,2),r=Math.sqrt(o),a=Math.floor(e+2*r);return a>s&&(a=s),a}_createClusteredEdge(e,t,i,s,o){let r=J.cloneOptions(i,"edge");j(r,s),r.from=e,r.to=t,r.id="clusterEdge:"+Te(),o!==void 0&&j(r,o);let a=this.body.functions.createEdge(r);return a.clusteringEdgeReplacingIds=[i.id],a.connect(),this.body.edges[a.id]=a,a}_clusterEdges(e,t,i,s){if(t instanceof Se){let o=t,r={};r[o.id]=o,t=r}if(e instanceof U){let o=e,r={};r[o.id]=o,e=r}if(i==null)throw new Error("_clusterEdges: parameter clusterNode required");s===void 0&&(s=i.clusterEdgeProperties),this._createClusterEdges(e,t,i,s);for(let o in t)if(Object.prototype.hasOwnProperty.call(t,o)&&this.body.edges[o]!==void 0){let r=this.body.edges[o];this._backupEdgeOptions(r),r.setOptions({physics:!1})}for(let o in e)Object.prototype.hasOwnProperty.call(e,o)&&(this.clusteredNodes[o]={clusterId:i.id,node:this.body.nodes[o]},this.body.nodes[o].setOptions({physics:!1}))}_getClusterNodeForNode(e){if(e===void 0)return;let t=this.clusteredNodes[e];if(t===void 0)return;let i=t.clusterId;if(i!==void 0)return this.body.nodes[i]}_filter(e,t){let i=[];return A(e,s=>{t(s)&&i.push(s)}),i}_updateState(){let e,t=[],i={},s=d=>{A(this.body.nodes,h=>{h.isCluster===!0&&d(h)})};for(e in this.clusteredNodes){if(!Object.prototype.hasOwnProperty.call(this.clusteredNodes,e))continue;this.body.nodes[e]===void 0&&t.push(e)}s(function(d){for(let h=0;h{let h=this.body.edges[d];(h===void 0||!h.endPointsValid())&&(i[d]=d)}),s(function(d){A(d.containedEdges,(h,l)=>{!h.endPointsValid()&&!i[l]&&(i[l]=l)})}),A(this.body.edges,(d,h)=>{let l=!0,c=d.clusteringEdgeReplacingIds;if(c!==void 0){let u=0;A(c,p=>{let b=this.body.edges[p];b!==void 0&&b.endPointsValid()&&(u+=1)}),l=u>0}(!d.endPointsValid()||!l)&&(i[h]=h)}),s(d=>{A(i,h=>{delete d.containedEdges[h],A(d.edges,(l,c)=>{if(l.id===h){d.edges[c]=null;return}l.clusteringEdgeReplacingIds=this._filter(l.clusteringEdgeReplacingIds,function(u){return!i[u]})}),d.edges=this._filter(d.edges,function(l){return l!==null})})}),A(i,d=>{delete this.clusteredEdges[d]}),A(i,d=>{delete this.body.edges[d]});let o=Object.keys(this.body.edges);A(o,d=>{let h=this.body.edges[d],l=this._isClusteredNode(h.fromId)||this._isClusteredNode(h.toId);if(l!==this._isClusteredEdge(h.id))if(l){let c=this._getClusterNodeForNode(h.fromId);c!==void 0&&this._clusterEdges(this.body.nodes[h.fromId],h,c);let u=this._getClusterNodeForNode(h.toId);u!==void 0&&this._clusterEdges(this.body.nodes[h.toId],h,u)}else delete this._clusterEdges[d],this._restoreEdge(h)});let r=!1,a=!0;for(;a;){let d=[];s(function(h){let l=Object.keys(h.containedNodes).length,c=h.options.allowSingleNodeCluster===!0;(c&&l<1||!c&&l<2)&&d.push(h.id)});for(let h=0;h0,r=r||a}r&&this._updateState()}_isClusteredNode(e){return this.clusteredNodes[e]!==void 0}_isClusteredEdge(e){return this.clusteredEdges[e]!==void 0}};function Fa(){let n;window!==void 0&&(n=window.requestAnimationFrame||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame||window.msRequestAnimationFrame),n===void 0?window.requestAnimationFrame=function(e){e()}:window.requestAnimationFrame=n}var fn=class{constructor(e,t){Fa(),this.body=e,this.canvas=t,this.redrawRequested=!1,this.renderTimer=void 0,this.requiresTimeout=!0,this.renderingActive=!1,this.renderRequests=0,this.allowRedraw=!0,this.dragging=!1,this.zooming=!1,this.options={},this.defaultOptions={hideEdgesOnDrag:!1,hideEdgesOnZoom:!1,hideNodesOnDrag:!1},Object.assign(this.options,this.defaultOptions),this._determineBrowserMethod(),this.bindEventListeners()}bindEventListeners(){this.body.emitter.on("dragStart",()=>{this.dragging=!0}),this.body.emitter.on("dragEnd",()=>{this.dragging=!1}),this.body.emitter.on("zoom",()=>{this.zooming=!0,window.clearTimeout(this.zoomTimeoutId),this.zoomTimeoutId=window.setTimeout(()=>{this.zooming=!1,this._requestRedraw.bind(this)()},250)}),this.body.emitter.on("_resizeNodes",()=>{this._resizeNodes()}),this.body.emitter.on("_redraw",()=>{this.renderingActive===!1&&this._redraw()}),this.body.emitter.on("_blockRedraw",()=>{this.allowRedraw=!1}),this.body.emitter.on("_allowRedraw",()=>{this.allowRedraw=!0,this.redrawRequested=!1}),this.body.emitter.on("_requestRedraw",this._requestRedraw.bind(this)),this.body.emitter.on("_startRendering",()=>{this.renderRequests+=1,this.renderingActive=!0,this._startRendering()}),this.body.emitter.on("_stopRendering",()=>{this.renderRequests-=1,this.renderingActive=this.renderRequests>0,this.renderTimer=void 0}),this.body.emitter.on("destroy",()=>{this.renderRequests=0,this.allowRedraw=!1,this.renderingActive=!1,this.requiresTimeout===!0?clearTimeout(this.renderTimer):window.cancelAnimationFrame(this.renderTimer),this.body.emitter.off()})}setOptions(e){e!==void 0&&Ve(["hideEdgesOnDrag","hideEdgesOnZoom","hideNodesOnDrag"],this.options,e)}_requestNextFrame(e,t){if(typeof window=="undefined")return;let i,s=window;return this.requiresTimeout===!0?i=s.setTimeout(e,t):s.requestAnimationFrame&&(i=s.requestAnimationFrame(e)),i}_startRendering(){this.renderingActive===!0&&this.renderTimer===void 0&&(this.renderTimer=this._requestNextFrame(this._renderStep.bind(this),this.simulationInterval))}_renderStep(){this.renderingActive===!0&&(this.renderTimer=void 0,this.requiresTimeout===!0&&this._startRendering(),this._redraw(),this.requiresTimeout===!1&&this._startRendering())}redraw(){this.body.emitter.emit("setSize"),this._redraw()}_requestRedraw(){this.redrawRequested!==!0&&this.renderingActive===!1&&this.allowRedraw===!0&&(this.redrawRequested=!0,this._requestNextFrame(()=>{this._redraw(!1)},0))}_redraw(e=!1){if(this.allowRedraw===!0){this.body.emitter.emit("initRedraw"),this.redrawRequested=!1;let t={drawExternalLabels:null};(this.canvas.frame.canvas.width===0||this.canvas.frame.canvas.height===0)&&this.canvas.setSize(),this.canvas.setTransform();let i=this.canvas.getContext(),s=this.canvas.frame.canvas.clientWidth,o=this.canvas.frame.canvas.clientHeight;if(i.clearRect(0,0,s,o),this.canvas.frame.clientWidth===0)return;if(i.save(),i.translate(this.body.view.translation.x,this.body.view.translation.y),i.scale(this.body.view.scale,this.body.view.scale),i.beginPath(),this.body.emitter.emit("beforeDrawing",i),i.closePath(),e===!1&&(this.dragging===!1||this.dragging===!0&&this.options.hideEdgesOnDrag===!1)&&(this.zooming===!1||this.zooming===!0&&this.options.hideEdgesOnZoom===!1)&&this._drawEdges(i),this.dragging===!1||this.dragging===!0&&this.options.hideNodesOnDrag===!1){let{drawExternalLabels:r}=this._drawNodes(i,e);t.drawExternalLabels=r}e===!1&&(this.dragging===!1||this.dragging===!0&&this.options.hideEdgesOnDrag===!1)&&(this.zooming===!1||this.zooming===!0&&this.options.hideEdgesOnZoom===!1)&&this._drawArrows(i),t.drawExternalLabels!=null&&t.drawExternalLabels(),e===!1&&this._drawSelectionBox(i),i.beginPath(),this.body.emitter.emit("afterDrawing",i),i.closePath(),i.restore(),e===!0&&i.clearRect(0,0,s,o)}}_resizeNodes(){this.canvas.setTransform();let e=this.canvas.getContext();e.save(),e.translate(this.body.view.translation.x,this.body.view.translation.y),e.scale(this.body.view.scale,this.body.view.scale);let t=this.body.nodes,i;for(let s in t)Object.prototype.hasOwnProperty.call(t,s)&&(i=t[s],i.resize(e),i.updateBoundingBox(e,i.selected));e.restore()}_drawNodes(e,t=!1){let i=this.body.nodes,s=this.body.nodeIndices,o,r=[],a=[],d=20,h=this.canvas.DOMtoCanvas({x:-d,y:-d}),l=this.canvas.DOMtoCanvas({x:this.canvas.frame.canvas.clientWidth+d,y:this.canvas.frame.canvas.clientHeight+d}),c={top:h.y,left:h.x,bottom:l.y,right:l.x},u=[];for(let f=0;f{for(let f of u)f()}}}_drawEdges(e){let t=this.body.edges,i=this.body.edgeIndices;for(let s=0;s{e.width!==0&&(this.body.view.translation.x=e.width*.5),e.height!==0&&(this.body.view.translation.y=e.height*.5)}),this.body.emitter.on("setSize",this.setSize.bind(this)),this.body.emitter.on("destroy",()=>{this.hammerFrame.destroy(),this.hammer.destroy(),this._cleanUp()})}setOptions(e){if(e!==void 0&&Ve(["width","height","autoResize"],this.options,e),this._cleanUp(),this.options.autoResize===!0){if(window.ResizeObserver){let i=new ResizeObserver(()=>{this.setSize()===!0&&this.body.emitter.emit("_requestRedraw")}),{frame:s}=this;i.observe(s),this._cleanupCallbacks.push(()=>{i.unobserve(s)})}else{let i=setInterval(()=>{this.setSize()===!0&&this.body.emitter.emit("_requestRedraw")},1e3);this._cleanupCallbacks.push(()=>{clearInterval(i)})}let t=this._onResize.bind(this);Rs(window,"resize",t),this._cleanupCallbacks.push(()=>{Hs(window,"resize",t)})}}_cleanUp(){this._cleanupCallbacks.splice(0).reverse().forEach(e=>{try{e()}catch(t){console.error(t)}})}_onResize(){this.setSize(),this.body.emitter.emit("_redraw")}_getCameraState(e=this.pixelRatio){this.initialized===!0&&(this.cameraState.previousWidth=this.frame.canvas.width/e,this.cameraState.previousHeight=this.frame.canvas.height/e,this.cameraState.scale=this.body.view.scale,this.cameraState.position=this.DOMtoCanvas({x:.5*this.frame.canvas.width/e,y:.5*this.frame.canvas.height/e}))}_setCameraState(){if(this.cameraState.scale!==void 0&&this.frame.canvas.clientWidth!==0&&this.frame.canvas.clientHeight!==0&&this.pixelRatio!==0&&this.cameraState.previousWidth>0&&this.cameraState.previousHeight>0){let e=this.frame.canvas.width/this.pixelRatio/this.cameraState.previousWidth,t=this.frame.canvas.height/this.pixelRatio/this.cameraState.previousHeight,i=this.cameraState.scale;e!=1&&t!=1?i=this.cameraState.scale*.5*(e+t):e!=1?i=this.cameraState.scale*e:t!=1&&(i=this.cameraState.scale*t),this.body.view.scale=i;let s=this.DOMtoCanvas({x:.5*this.frame.canvas.clientWidth,y:.5*this.frame.canvas.clientHeight}),o={x:s.x-this.cameraState.position.x,y:s.y-this.cameraState.position.y};this.body.view.translation.x+=o.x*this.body.view.scale,this.body.view.translation.y+=o.y*this.body.view.scale}}_prepareValue(e){if(typeof e=="number")return e+"px";if(typeof e=="string"){if(e.indexOf("%")!==-1||e.indexOf("px")!==-1)return e;if(e.indexOf("%")===-1)return e+"px"}throw new Error("Could not use the value supplied for width or height:"+e)}_create(){for(;this.body.container.hasChildNodes();)this.body.container.removeChild(this.body.container.firstChild);if(this.frame=document.createElement("div"),this.frame.className="vis-network",this.frame.style.position="relative",this.frame.style.overflow="hidden",this.frame.tabIndex=0,this.frame.canvas=document.createElement("canvas"),this.frame.canvas.style.position="relative",this.frame.appendChild(this.frame.canvas),this.frame.canvas.getContext)this._setPixelRatio(),this.setTransform();else{let e=document.createElement("DIV");e.style.color="red",e.style.fontWeight="bold",e.style.padding="10px",e.innerText="Error: your browser does not support HTML canvas",this.frame.canvas.appendChild(e)}this.body.container.appendChild(this.frame),this.body.view.scale=1,this.body.view.translation={x:.5*this.frame.canvas.clientWidth,y:.5*this.frame.canvas.clientHeight},this._bindHammer()}_bindHammer(){this.hammer!==void 0&&this.hammer.destroy(),this.drag={},this.pinch={},this.hammer=new qe(this.frame.canvas),this.hammer.get("pinch").set({enable:!0}),this.hammer.get("pan").set({threshold:5,direction:qe.DIRECTION_ALL}),$t(this.hammer,e=>{this.body.eventListeners.onTouch(e)}),this.hammer.on("tap",e=>{this.body.eventListeners.onTap(e)}),this.hammer.on("doubletap",e=>{this.body.eventListeners.onDoubleTap(e)}),this.hammer.on("press",e=>{this.body.eventListeners.onHold(e)}),this.hammer.on("panstart",e=>{this.body.eventListeners.onDragStart(e)}),this.hammer.on("panmove",e=>{this.body.eventListeners.onDrag(e)}),this.hammer.on("panend",e=>{this.body.eventListeners.onDragEnd(e)}),this.hammer.on("pinch",e=>{this.body.eventListeners.onPinch(e)}),this.frame.canvas.addEventListener("wheel",e=>{this.body.eventListeners.onMouseWheel(e)}),this.frame.canvas.addEventListener("mousemove",e=>{this.body.eventListeners.onMouseMove(e)}),this.frame.canvas.addEventListener("contextmenu",e=>{this.body.eventListeners.onContext(e)}),this.hammerFrame=new qe(this.frame),pn(this.hammerFrame,e=>{this.body.eventListeners.onRelease(e)})}setSize(e=this.options.width,t=this.options.height){e=this._prepareValue(e),t=this._prepareValue(t);let i=!1,s=this.frame.canvas.width,o=this.frame.canvas.height,r=this.pixelRatio;if(this._setPixelRatio(),e!=this.options.width||t!=this.options.height||this.frame.style.width!=e||this.frame.style.height!=t)this._getCameraState(r),this.frame.style.width=e,this.frame.style.height=t,this.frame.canvas.style.width="100%",this.frame.canvas.style.height="100%",this.frame.canvas.width=Math.round(this.frame.canvas.clientWidth*this.pixelRatio),this.frame.canvas.height=Math.round(this.frame.canvas.clientHeight*this.pixelRatio),this.options.width=e,this.options.height=t,this.canvasViewCenter={x:.5*this.frame.clientWidth,y:.5*this.frame.clientHeight},i=!0;else{let a=Math.round(this.frame.canvas.clientWidth*this.pixelRatio),d=Math.round(this.frame.canvas.clientHeight*this.pixelRatio);(this.frame.canvas.width!==a||this.frame.canvas.height!==d)&&this._getCameraState(r),this.frame.canvas.width!==a&&(this.frame.canvas.width=a,i=!0),this.frame.canvas.height!==d&&(this.frame.canvas.height=d,i=!0)}return i===!0&&(this.body.emitter.emit("resize",{width:Math.round(this.frame.canvas.width/this.pixelRatio),height:Math.round(this.frame.canvas.height/this.pixelRatio),oldWidth:Math.round(s/this.pixelRatio),oldHeight:Math.round(o/this.pixelRatio)}),this._setCameraState()),this.initialized=!0,i}getContext(){return this.frame.canvas.getContext("2d")}_determinePixelRatio(){let e=this.getContext();if(e===void 0)throw new Error("Could not get canvax context");let t=1;typeof window!="undefined"&&(t=window.devicePixelRatio||1);let i=e.webkitBackingStorePixelRatio||e.mozBackingStorePixelRatio||e.msBackingStorePixelRatio||e.oBackingStorePixelRatio||e.backingStorePixelRatio||1;return t/i}_setPixelRatio(){this.pixelRatio=this._determinePixelRatio()}setTransform(){let e=this.getContext();if(e===void 0)throw new Error("Could not get canvax context");e.setTransform(this.pixelRatio,0,0,this.pixelRatio,0,0)}_XconvertDOMtoCanvas(e){return(e-this.body.view.translation.x)/this.body.view.scale}_XconvertCanvasToDOM(e){return e*this.body.view.scale+this.body.view.translation.x}_YconvertDOMtoCanvas(e){return(e-this.body.view.translation.y)/this.body.view.scale}_YconvertCanvasToDOM(e){return e*this.body.view.scale+this.body.view.translation.y}canvasToDOM(e){return{x:this._XconvertCanvasToDOM(e.x),y:this._YconvertCanvasToDOM(e.y)}}DOMtoCanvas(e){return{x:this._XconvertDOMtoCanvas(e.x),y:this._YconvertDOMtoCanvas(e.y)}}};function Na(n,e){let t=Object.assign({nodes:e,minZoomLevel:Number.MIN_VALUE,maxZoomLevel:1},n!=null?n:{});if(!Array.isArray(t.nodes))throw new TypeError("Nodes has to be an array of ids.");if(t.nodes.length===0&&(t.nodes=e),!(typeof t.minZoomLevel=="number"&&t.minZoomLevel>0))throw new TypeError("Min zoom level has to be a number higher than zero.");if(!(typeof t.maxZoomLevel=="number"&&t.minZoomLevel<=t.maxZoomLevel))throw new TypeError("Max zoom level has to be a number higher than min zoom level.");return t}var mn=class{constructor(e,t){this.body=e,this.canvas=t,this.animationSpeed=1/this.renderRefreshRate,this.animationEasingFunction="easeInOutQuint",this.easingTime=0,this.sourceScale=0,this.targetScale=0,this.sourceTranslation=0,this.targetTranslation=0,this.lockedOnNodeId=void 0,this.lockedOnNodeOffset=void 0,this.touchTime=0,this.viewFunction=void 0,this.body.emitter.on("fit",this.fit.bind(this)),this.body.emitter.on("animationFinished",()=>{this.body.emitter.emit("_stopRendering")}),this.body.emitter.on("unlockNode",this.releaseNode.bind(this))}setOptions(e={}){this.options=e}fit(e,t=!1){e=Na(e,this.body.nodeIndices);let i=this.canvas.frame.canvas.clientWidth,s=this.canvas.frame.canvas.clientHeight,o,r;if(i===0||s===0)r=1,o=J.getRange(this.body.nodes,e.nodes);else if(t===!0){let h=0;for(let u in this.body.nodes)Object.prototype.hasOwnProperty.call(this.body.nodes,u)&&this.body.nodes[u].predefinedPosition===!0&&(h+=1);if(h>.5*this.body.nodeIndices.length){this.fit(e,!1);return}o=J.getRange(this.body.nodes,e.nodes);let l=this.body.nodeIndices.length;r=12.662/(l+7.4147)+.0964822,r*=Math.min(i/600,s/600)}else{this.body.emitter.emit("_resizeNodes"),o=J.getRange(this.body.nodes,e.nodes);let h=Math.abs(o.maxX-o.minX)*1.1,l=Math.abs(o.maxY-o.minY)*1.1,c=i/h,u=s/l;r=c<=u?c:u}r>e.maxZoomLevel?r=e.maxZoomLevel:r0))throw new TypeError('The option "scale" has to be a number greater than zero.')}else e.scale=this.body.view.scale;e.animation===void 0&&(e.animation={duration:0}),e.animation===!1&&(e.animation={duration:0}),e.animation===!0&&(e.animation={}),e.animation.duration===void 0&&(e.animation.duration=1e3),e.animation.easingFunction===void 0&&(e.animation.easingFunction="easeInOutQuad"),this.animateView(e)}animateView(e){if(e===void 0)return;this.animationEasingFunction=e.animation.easingFunction,this.releaseNode(),e.locked===!0&&(this.lockedOnNodeId=e.lockedOnNode,this.lockedOnNodeOffset=e.offset),this.easingTime!=0&&this._transitionRedraw(!0),this.sourceScale=this.body.view.scale,this.sourceTranslation=this.body.view.translation,this.targetScale=e.scale,this.body.view.scale=this.targetScale;let t=this.canvas.DOMtoCanvas({x:.5*this.canvas.frame.canvas.clientWidth,y:.5*this.canvas.frame.canvas.clientHeight}),i={x:t.x-e.position.x,y:t.y-e.position.y};this.targetTranslation={x:this.sourceTranslation.x+i.x*this.targetScale+e.offset.x,y:this.sourceTranslation.y+i.y*this.targetScale+e.offset.y},e.animation.duration===0?this.lockedOnNodeId!=null?(this.viewFunction=this._lockedRedraw.bind(this),this.body.emitter.on("initRedraw",this.viewFunction)):(this.body.view.scale=this.targetScale,this.body.view.translation=this.targetTranslation,this.body.emitter.emit("_requestRedraw")):(this.animationSpeed=1/(60*e.animation.duration*.001)||1/60,this.animationEasingFunction=e.animation.easingFunction,this.viewFunction=this._transitionRedraw.bind(this),this.body.emitter.on("initRedraw",this.viewFunction),this.body.emitter.emit("_startRendering"))}_lockedRedraw(){let e={x:this.body.nodes[this.lockedOnNodeId].x,y:this.body.nodes[this.lockedOnNodeId].y},t=this.canvas.DOMtoCanvas({x:.5*this.canvas.frame.canvas.clientWidth,y:.5*this.canvas.frame.canvas.clientHeight}),i={x:t.x-e.x,y:t.y-e.y},s=this.body.view.translation,o={x:s.x+i.x*this.body.view.scale+this.lockedOnNodeOffset.x,y:s.y+i.y*this.body.view.scale+this.lockedOnNodeOffset.y};this.body.view.translation=o}releaseNode(){this.lockedOnNodeId!==void 0&&this.viewFunction!==void 0&&(this.body.emitter.off("initRedraw",this.viewFunction),this.lockedOnNodeId=void 0,this.lockedOnNodeOffset=void 0)}_transitionRedraw(e=!1){this.easingTime+=this.animationSpeed,this.easingTime=e===!0?1:this.easingTime;let t=qs[this.animationEasingFunction](this.easingTime);this.body.view.scale=this.sourceScale+(this.targetScale-this.sourceScale)*t,this.body.view.translation={x:this.sourceTranslation.x+(this.targetTranslation.x-this.sourceTranslation.x)*t,y:this.sourceTranslation.y+(this.targetTranslation.y-this.sourceTranslation.y)*t},this.easingTime>=1&&(this.body.emitter.off("initRedraw",this.viewFunction),this.easingTime=0,this.lockedOnNodeId!=null&&(this.viewFunction=this._lockedRedraw.bind(this),this.body.emitter.on("initRedraw",this.viewFunction)),this.body.emitter.emit("animationFinished"))}getScale(){return this.body.view.scale}getViewPosition(){return this.canvas.DOMtoCanvas({x:.5*this.canvas.frame.canvas.clientWidth,y:.5*this.canvas.frame.canvas.clientHeight})}},yn=class{constructor(e,t){this.body=e,this.canvas=t,this.iconsCreated=!1,this.navigationHammers=[],this.boundFunctions={},this.touchTime=0,this.activated=!1,this.body.emitter.on("activate",()=>{this.activated=!0,this.configureKeyboardBindings()}),this.body.emitter.on("deactivate",()=>{this.activated=!1,this.configureKeyboardBindings()}),this.body.emitter.on("destroy",()=>{this.keycharm!==void 0&&this.keycharm.destroy()}),this.options={}}setOptions(e){e!==void 0&&(this.options=e,this.create())}create(){this.options.navigationButtons===!0?this.iconsCreated===!1&&this.loadNavigationElements():this.iconsCreated===!0&&this.cleanNavigation(),this.configureKeyboardBindings()}cleanNavigation(){if(this.navigationHammers.length!=0){for(let e=0;e{this._stopMovement()}),this.navigationHammers.push(i),this.iconsCreated=!0}bindToRedraw(e){this.boundFunctions[e]===void 0&&(this.boundFunctions[e]=this[e].bind(this),this.body.emitter.on("initRedraw",this.boundFunctions[e]),this.body.emitter.emit("_startRendering"))}unbindFromRedraw(e){this.boundFunctions[e]!==void 0&&(this.body.emitter.off("initRedraw",this.boundFunctions[e]),this.body.emitter.emit("_stopRendering"),delete this.boundFunctions[e])}_fit(){new Date().valueOf()-this.touchTime>700&&(this.body.emitter.emit("fit",{duration:700}),this.touchTime=new Date().valueOf())}_stopMovement(){for(let e in this.boundFunctions)Object.prototype.hasOwnProperty.call(this.boundFunctions,e)&&(this.body.emitter.off("initRedraw",this.boundFunctions[e]),this.body.emitter.emit("_stopRendering"));this.boundFunctions={}}_moveUp(){this.body.view.translation.y+=this.options.keyboard.speed.y}_moveDown(){this.body.view.translation.y-=this.options.keyboard.speed.y}_moveLeft(){this.body.view.translation.x+=this.options.keyboard.speed.x}_moveRight(){this.body.view.translation.x-=this.options.keyboard.speed.x}_zoomIn(){let e=this.body.view.scale,t=this.body.view.scale*(1+this.options.keyboard.speed.zoom),i=this.body.view.translation,s=t/e,o=(1-s)*this.canvas.canvasViewCenter.x+i.x*s,r=(1-s)*this.canvas.canvasViewCenter.y+i.y*s;this.body.view.scale=t,this.body.view.translation={x:o,y:r},this.body.emitter.emit("zoom",{direction:"+",scale:this.body.view.scale,pointer:null})}_zoomOut(){let e=this.body.view.scale,t=this.body.view.scale/(1+this.options.keyboard.speed.zoom),i=this.body.view.translation,s=t/e,o=(1-s)*this.canvas.canvasViewCenter.x+i.x*s,r=(1-s)*this.canvas.canvasViewCenter.y+i.y*s;this.body.view.scale=t,this.body.view.translation={x:o,y:r},this.body.emitter.emit("zoom",{direction:"-",scale:this.body.view.scale,pointer:null})}configureKeyboardBindings(){this.keycharm!==void 0&&this.keycharm.destroy(),this.options.keyboard.enabled===!0&&(this.options.keyboard.bindToWindow===!0?this.keycharm=Ut({container:window,preventDefault:!0}):this.keycharm=Ut({container:this.canvas.frame,preventDefault:!0}),this.keycharm.reset(),this.activated===!0&&(this.keycharm.bind("up",()=>{this.bindToRedraw("_moveUp")},"keydown"),this.keycharm.bind("down",()=>{this.bindToRedraw("_moveDown")},"keydown"),this.keycharm.bind("left",()=>{this.bindToRedraw("_moveLeft")},"keydown"),this.keycharm.bind("right",()=>{this.bindToRedraw("_moveRight")},"keydown"),this.keycharm.bind("=",()=>{this.bindToRedraw("_zoomIn")},"keydown"),this.keycharm.bind("num+",()=>{this.bindToRedraw("_zoomIn")},"keydown"),this.keycharm.bind("num-",()=>{this.bindToRedraw("_zoomOut")},"keydown"),this.keycharm.bind("-",()=>{this.bindToRedraw("_zoomOut")},"keydown"),this.keycharm.bind("[",()=>{this.bindToRedraw("_zoomOut")},"keydown"),this.keycharm.bind("]",()=>{this.bindToRedraw("_zoomIn")},"keydown"),this.keycharm.bind("pageup",()=>{this.bindToRedraw("_zoomIn")},"keydown"),this.keycharm.bind("pagedown",()=>{this.bindToRedraw("_zoomOut")},"keydown"),this.keycharm.bind("up",()=>{this.unbindFromRedraw("_moveUp")},"keyup"),this.keycharm.bind("down",()=>{this.unbindFromRedraw("_moveDown")},"keyup"),this.keycharm.bind("left",()=>{this.unbindFromRedraw("_moveLeft")},"keyup"),this.keycharm.bind("right",()=>{this.unbindFromRedraw("_moveRight")},"keyup"),this.keycharm.bind("=",()=>{this.unbindFromRedraw("_zoomIn")},"keyup"),this.keycharm.bind("num+",()=>{this.unbindFromRedraw("_zoomIn")},"keyup"),this.keycharm.bind("num-",()=>{this.unbindFromRedraw("_zoomOut")},"keyup"),this.keycharm.bind("-",()=>{this.unbindFromRedraw("_zoomOut")},"keyup"),this.keycharm.bind("[",()=>{this.unbindFromRedraw("_zoomOut")},"keyup"),this.keycharm.bind("]",()=>{this.unbindFromRedraw("_zoomIn")},"keyup"),this.keycharm.bind("pageup",()=>{this.unbindFromRedraw("_zoomIn")},"keyup"),this.keycharm.bind("pagedown",()=>{this.unbindFromRedraw("_zoomOut")},"keyup")))}},bn=class{constructor(e,t,i){this.body=e,this.canvas=t,this.selectionHandler=i,this.navigationHandler=new yn(e,t),this.body.eventListeners.onTap=this.onTap.bind(this),this.body.eventListeners.onTouch=this.onTouch.bind(this),this.body.eventListeners.onDoubleTap=this.onDoubleTap.bind(this),this.body.eventListeners.onHold=this.onHold.bind(this),this.body.eventListeners.onDragStart=this.onDragStart.bind(this),this.body.eventListeners.onDrag=this.onDrag.bind(this),this.body.eventListeners.onDragEnd=this.onDragEnd.bind(this),this.body.eventListeners.onMouseWheel=this.onMouseWheel.bind(this),this.body.eventListeners.onPinch=this.onPinch.bind(this),this.body.eventListeners.onMouseMove=this.onMouseMove.bind(this),this.body.eventListeners.onRelease=this.onRelease.bind(this),this.body.eventListeners.onContext=this.onContext.bind(this),this.touchTime=0,this.drag={},this.pinch={},this.popup=void 0,this.popupObj=void 0,this.popupTimer=void 0,this.body.functions.getPointer=this.getPointer.bind(this),this.options={},this.defaultOptions={dragNodes:!0,dragView:!0,hover:!1,keyboard:{enabled:!1,speed:{x:10,y:10,zoom:.02},bindToWindow:!0,autoFocus:!0},navigationButtons:!1,tooltipDelay:300,zoomView:!0,zoomSpeed:1},Object.assign(this.options,this.defaultOptions),this.bindEventListeners()}bindEventListeners(){this.body.emitter.on("destroy",()=>{clearTimeout(this.popupTimer),delete this.body.functions.getPointer})}setOptions(e){e!==void 0&&(mt(["hideEdgesOnDrag","hideEdgesOnZoom","hideNodesOnDrag","keyboard","multiselect","selectable","selectConnectedEdges"],this.options,e),ae(this.options,e,"keyboard"),e.tooltip&&(Object.assign(this.options.tooltip,e.tooltip),e.tooltip.color&&(this.options.tooltip.color=Rt(e.tooltip.color)))),this.navigationHandler.setOptions(this.options)}getPointer(e){return{x:e.x-zs(this.canvas.frame.canvas),y:e.y-Ls(this.canvas.frame.canvas)}}onTouch(e){new Date().valueOf()-this.touchTime>50&&(this.drag.pointer=this.getPointer(e.center),this.drag.pinched=!1,this.pinch.scale=this.body.view.scale,this.touchTime=new Date().valueOf())}onTap(e){let t=this.getPointer(e.center),i=this.selectionHandler.options.multiselect&&(e.changedPointers[0].ctrlKey||e.changedPointers[0].metaKey);this.checkSelectionChanges(t,i),this.selectionHandler.commitAndEmit(t,e),this.selectionHandler.generateClickEvent("click",e,t)}onDoubleTap(e){let t=this.getPointer(e.center);this.selectionHandler.generateClickEvent("doubleClick",e,t)}onHold(e){let t=this.getPointer(e.center),i=this.selectionHandler.options.multiselect;this.checkSelectionChanges(t,i),this.selectionHandler.commitAndEmit(t,e),this.selectionHandler.generateClickEvent("click",e,t),this.selectionHandler.generateClickEvent("hold",e,t)}onRelease(e){if(new Date().valueOf()-this.touchTime>10){let t=this.getPointer(e.center);this.selectionHandler.generateClickEvent("release",e,t),this.touchTime=new Date().valueOf()}}onContext(e){let t=this.getPointer({x:e.clientX,y:e.clientY});this.selectionHandler.generateClickEvent("oncontext",e,t)}checkSelectionChanges(e,t=!1){t===!0?this.selectionHandler.selectAdditionalOnPoint(e):this.selectionHandler.selectOnPoint(e)}_determineDifference(e,t){let i=function(s,o){let r=[];for(let a=0;a{let a=r.node;r.xFixed===!1&&(a.x=this.canvas._XconvertDOMtoCanvas(this.canvas._XconvertCanvasToDOM(r.x)+s)),r.yFixed===!1&&(a.y=this.canvas._YconvertDOMtoCanvas(this.canvas._YconvertCanvasToDOM(r.y)+o))}),this.body.emitter.emit("startSimulation")}else{if(e.srcEvent.shiftKey){if(this.selectionHandler.generateClickEvent("dragging",e,t,void 0,!0),this.drag.pointer===void 0){this.onDragStart(e);return}this.body.selectionBox.position.end={x:this.canvas._XconvertDOMtoCanvas(t.x),y:this.canvas._YconvertDOMtoCanvas(t.y)},this.body.emitter.emit("_requestRedraw")}if(this.options.dragView===!0&&!e.srcEvent.shiftKey){if(this.selectionHandler.generateClickEvent("dragging",e,t,void 0,!0),this.drag.pointer===void 0){this.onDragStart(e);return}let s=t.x-this.drag.pointer.x,o=t.y-this.drag.pointer.y;this.body.view.translation={x:this.drag.translation.x+s,y:this.drag.translation.y+o},this.body.emitter.emit("_requestRedraw")}}}onDragEnd(e){if(this.drag.dragging=!1,this.body.selectionBox.show){this.body.selectionBox.show=!1;let t=this.body.selectionBox.position,i={minX:Math.min(t.start.x,t.end.x),minY:Math.min(t.start.y,t.end.y),maxX:Math.max(t.start.x,t.end.x),maxY:Math.max(t.start.y,t.end.y)};this.body.nodeIndices.filter(r=>{let a=this.body.nodes[r];return a.x>=i.minX&&a.x<=i.maxX&&a.y>=i.minY&&a.y<=i.maxY}).forEach(r=>this.selectionHandler.selectObject(this.body.nodes[r]));let o=this.getPointer(e.center);this.selectionHandler.commitAndEmit(o,e),this.selectionHandler.generateClickEvent("dragEnd",e,this.getPointer(e.center),void 0,!0),this.body.emitter.emit("_requestRedraw")}else{let t=this.drag.selection;t&&t.length?(t.forEach(function(i){i.node.options.fixed.x=i.xFixed,i.node.options.fixed.y=i.yFixed}),this.selectionHandler.generateClickEvent("dragEnd",e,this.getPointer(e.center)),this.body.emitter.emit("startSimulation")):(this.selectionHandler.generateClickEvent("dragEnd",e,this.getPointer(e.center),void 0,!0),this.body.emitter.emit("_requestRedraw"))}}onPinch(e){let t=this.getPointer(e.center);this.drag.pinched=!0,this.pinch.scale===void 0&&(this.pinch.scale=1);let i=this.pinch.scale*e.scale;this.zoom(i,t)}zoom(e,t){if(this.options.zoomView===!0){let i=this.body.view.scale;e<1e-5&&(e=1e-5),e>10&&(e=10);let s;this.drag!==void 0&&this.drag.dragging===!0&&(s=this.canvas.DOMtoCanvas(this.drag.pointer));let o=this.body.view.translation,r=e/i,a=(1-r)*t.x+o.x*r,d=(1-r)*t.y+o.y*r;if(this.body.view.scale=e,this.body.view.translation={x:a,y:d},s!=null){let h=this.canvas.canvasToDOM(s);this.drag.pointer.x=h.x,this.drag.pointer.y=h.y}this.body.emitter.emit("_requestRedraw"),ithis._checkShowPopup(t),this.options.tooltipDelay))),this.options.hover===!0&&this.selectionHandler.hoverObject(e,t)}_checkShowPopup(e){let t=this.canvas._XconvertDOMtoCanvas(e.x),i=this.canvas._YconvertDOMtoCanvas(e.y),s={left:t,top:i,right:t,bottom:i},o=this.popupObj===void 0?void 0:this.popupObj.id,r=!1,a="node";if(this.popupObj===void 0){let d=this.body.nodeIndices,h=this.body.nodes,l,c=[];for(let u=0;u0&&(this.popupObj=h[c[c.length-1]],r=!0)}if(this.popupObj===void 0&&r===!1){let d=this.body.edgeIndices,h=this.body.edges,l,c=[];for(let u=0;u0&&(this.popupObj=h[c[c.length-1]],a="edge")}this.popupObj!==void 0?this.popupObj.id!==o&&(this.popup===void 0&&(this.popup=new Qs(this.canvas.frame)),this.popup.popupTargetType=a,this.popup.popupTargetId=this.popupObj.id,this.popup.setPosition(e.x+3,e.y-5),this.popup.setText(this.popupObj.getTitle()),this.popup.show(),this.body.emitter.emit("showPopup",this.popupObj.id)):this.popup!==void 0&&(this.popup.hide(),this.body.emitter.emit("hidePopup"))}_checkHidePopup(e){let t=this.selectionHandler._pointerToPositionObject(e),i=!1;if(this.popup.popupTargetType==="node"){if(this.body.nodes[this.popup.popupTargetId]!==void 0&&(i=this.body.nodes[this.popup.popupTargetId].isOverlappingWith(t),i===!0)){let s=this.selectionHandler.getNodeAt(e);i=s===void 0?!1:s.id===this.popup.popupTargetId}}else this.selectionHandler.getNodeAt(e)===void 0&&this.body.edges[this.popup.popupTargetId]!==void 0&&(i=this.body.edges[this.popup.popupTargetId].isOverlappingWith(t));i===!1&&(this.popupObj=void 0,this.popup.hide(),this.body.emitter.emit("hidePopup"))}};function q(n,e,t,i){if(t==="a"&&!i)throw new TypeError("Private accessor was defined without a getter");if(typeof e=="function"?n!==e||!i:!e.has(n))throw new TypeError("Cannot read private member from an object whose class did not declare it");return t==="m"?i:t==="a"?i.call(n):i?i.value:e.get(n)}function Hi(n,e,t,i,s){if(i==="m")throw new TypeError("Private method is not writable");if(i==="a"&&!s)throw new TypeError("Private accessor was defined without a setter");if(typeof e=="function"?n!==e||!s:!e.has(n))throw new TypeError("Cannot write private member to an object whose class did not declare it");return i==="a"?s.call(n,t):s?s.value=t:e.set(n,t),t}var Ye,le,Fe,Ne,Jt;function vn(n,e){let t=new Set;for(let i of e)n.has(i)||t.add(i);return t}var ji=class{constructor(){Ye.set(this,new Set),le.set(this,new Set)}get size(){return q(this,le,"f").size}add(...e){for(let t of e)q(this,le,"f").add(t)}delete(...e){for(let t of e)q(this,le,"f").delete(t)}clear(){q(this,le,"f").clear()}getSelection(){return[...q(this,le,"f")]}getChanges(){return{added:[...vn(q(this,Ye,"f"),q(this,le,"f"))],deleted:[...vn(q(this,le,"f"),q(this,Ye,"f"))],previous:[...new Set(q(this,Ye,"f"))],current:[...new Set(q(this,le,"f"))]}}commit(){let e=this.getChanges();Hi(this,Ye,q(this,le,"f"),"f"),Hi(this,le,new Set(q(this,Ye,"f")),"f");for(let t of e.added)t.select();for(let t of e.deleted)t.unselect();return e}};Ye=new WeakMap,le=new WeakMap;var wn=class{constructor(e=()=>{}){Fe.set(this,new ji),Ne.set(this,new ji),Jt.set(this,void 0),Hi(this,Jt,e,"f")}get sizeNodes(){return q(this,Fe,"f").size}get sizeEdges(){return q(this,Ne,"f").size}getNodes(){return q(this,Fe,"f").getSelection()}getEdges(){return q(this,Ne,"f").getSelection()}addNodes(...e){q(this,Fe,"f").add(...e)}addEdges(...e){q(this,Ne,"f").add(...e)}deleteNodes(e){q(this,Fe,"f").delete(e)}deleteEdges(e){q(this,Ne,"f").delete(e)}clear(){q(this,Fe,"f").clear(),q(this,Ne,"f").clear()}commit(...e){let t={nodes:q(this,Fe,"f").commit(),edges:q(this,Ne,"f").commit()};return q(this,Jt,"f").call(this,t,...e),t}};Fe=new WeakMap,Ne=new WeakMap,Jt=new WeakMap;var _n=class{constructor(e,t){this.body=e,this.canvas=t,this._selectionAccumulator=new wn,this.hoverObj={nodes:{},edges:{}},this.options={},this.defaultOptions={multiselect:!1,selectable:!0,selectConnectedEdges:!0,hoverConnectedEdges:!0},Object.assign(this.options,this.defaultOptions),this.body.emitter.on("_dataChanged",()=>{this.updateSelection()})}setOptions(e){e!==void 0&&Ve(["multiselect","hoverConnectedEdges","selectable","selectConnectedEdges"],this.options,e)}selectOnPoint(e){let t=!1;if(this.options.selectable===!0){let i=this.getNodeAt(e)||this.getEdgeAt(e);this.unselectAll(),i!==void 0&&(t=this.selectObject(i)),this.body.emitter.emit("_requestRedraw")}return t}selectAdditionalOnPoint(e){let t=!1;if(this.options.selectable===!0){let i=this.getNodeAt(e)||this.getEdgeAt(e);i!==void 0&&(t=!0,i.isSelected()===!0?this.deselectObject(i):this.selectObject(i),this.body.emitter.emit("_requestRedraw"))}return t}_initBaseEvent(e,t){let i={};return i.pointer={DOM:{x:t.x,y:t.y},canvas:this.canvas.DOMtoCanvas(t)},i.event=e,i}generateClickEvent(e,t,i,s,o=!1){let r=this._initBaseEvent(t,i);if(o===!0)r.nodes=[],r.edges=[];else{let a=this.getSelection();r.nodes=a.nodes,r.edges=a.edges}s!==void 0&&(r.previousSelection=s),e=="click"&&(r.items=this.getClickedItems(i)),t.controlEdge!==void 0&&(r.controlEdge=t.controlEdge),this.body.emitter.emit(e,r)}selectObject(e,t=this.options.selectConnectedEdges){return e!==void 0?(e instanceof U?(t===!0&&this._selectionAccumulator.addEdges(...e.edges),this._selectionAccumulator.addNodes(e)):this._selectionAccumulator.addEdges(e),!0):!1}deselectObject(e){e.isSelected()===!0&&(e.selected=!1,this._removeFromSelection(e))}_getAllNodesOverlappingWith(e){let t=[],i=this.body.nodes;for(let s=0;s0)return t===!0?this.body.nodes[s[s.length-1]]:s[s.length-1]}_getEdgesOverlappingWith(e,t){let i=this.body.edges;for(let s=0;s0&&(this.generateClickEvent("deselectEdge",t,e,o),i=!0),s.nodes.deleted.length>0&&(this.generateClickEvent("deselectNode",t,e,o),i=!0),s.nodes.added.length>0&&(this.generateClickEvent("selectNode",t,e),i=!0),s.edges.added.length>0&&(this.generateClickEvent("selectEdge",t,e),i=!0),i===!0&&this.generateClickEvent("select",t,e)}getSelection(){return{nodes:this.getSelectedNodeIds(),edges:this.getSelectedEdgeIds()}}getSelectedNodes(){return this._selectionAccumulator.getNodes()}getSelectedEdges(){return this._selectionAccumulator.getEdges()}getSelectedNodeIds(){return this._selectionAccumulator.getNodes().map(e=>e.id)}getSelectedEdgeIds(){return this._selectionAccumulator.getEdges().map(e=>e.id)}setSelection(e,t={}){if(!e||!e.nodes&&!e.edges)throw new TypeError("Selection must be an object with nodes and/or edges properties");if((t.unselectAll||t.unselectAll===void 0)&&this.unselectAll(),e.nodes)for(let i of e.nodes){let s=this.body.nodes[i];if(!s)throw new RangeError('Node with id "'+i+'" not found');this.selectObject(s,t.highlightEdges)}if(e.edges)for(let i of e.edges){let s=this.body.edges[i];if(!s)throw new RangeError('Edge with id "'+i+'" not found');this.selectObject(s)}this.body.emitter.emit("_requestRedraw"),this._selectionAccumulator.commit()}selectNodes(e,t=!0){if(!e||e.length===void 0)throw"Selection must be an array with ids";this.setSelection({nodes:e},{highlightEdges:t})}selectEdges(e){if(!e||e.length===void 0)throw"Selection must be an array with ids";this.setSelection({edges:e})}updateSelection(){for(let e in this._selectionAccumulator.getNodes())Object.prototype.hasOwnProperty.call(this.body.nodes,e.id)||this._selectionAccumulator.deleteNodes(e);for(let e in this._selectionAccumulator.getEdges())Object.prototype.hasOwnProperty.call(this.body.edges,e.id)||this._selectionAccumulator.deleteEdges(e)}getClickedItems(e){let t=this.canvas.DOMtoCanvas(e),i=[],s=this.body.nodeIndices,o=this.body.nodes;for(let d=s.length-1;d>=0;d--){let l=o[s[d]].getItemsOnPoint(t);i.push.apply(i,l)}let r=this.body.edgeIndices,a=this.body.edges;for(let d=r.length-1;d>=0;d--){let l=a[r[d]].getItemsOnPoint(t);i.push.apply(i,l)}return i}},Wi=class{abstract(){throw new Error("Can't instantiate abstract class!")}fake_use(){}curveType(){return this.abstract()}getPosition(e){return this.fake_use(e),this.abstract()}setPosition(e,t,i=void 0){this.fake_use(e,t,i),this.abstract()}getTreeSize(e){return this.fake_use(e),this.abstract()}sort(e){this.fake_use(e),this.abstract()}fix(e,t){this.fake_use(e,t),this.abstract()}shift(e,t){this.fake_use(e,t),this.abstract()}},En=class extends Wi{constructor(e){super();this.layout=e}curveType(){return"horizontal"}getPosition(e){return e.x}setPosition(e,t,i=void 0){i!==void 0&&this.layout.hierarchical.addToOrdering(e,i),e.x=t}getTreeSize(e){let t=this.layout.hierarchical.getTreeSize(this.layout.body.nodes,e);return{min:t.min_x,max:t.max_x}}sort(e){(0,wt.sort)(e,function(t,i){return t.x-i.x})}fix(e,t){e.y=this.layout.options.hierarchical.levelSeparation*t,e.options.fixed.y=!0}shift(e,t){this.layout.body.nodes[e].x+=t}},xn=class extends Wi{constructor(e){super();this.layout=e}curveType(){return"vertical"}getPosition(e){return e.y}setPosition(e,t,i=void 0){i!==void 0&&this.layout.hierarchical.addToOrdering(e,i),e.y=t}getTreeSize(e){let t=this.layout.hierarchical.getTreeSize(this.layout.body.nodes,e);return{min:t.min_y,max:t.max_y}}sort(e){(0,wt.sort)(e,function(t,i){return t.y-i.y})}fix(e,t){e.x=this.layout.options.hierarchical.levelSeparation*t,e.options.fixed.x=!0}shift(e,t){this.layout.body.nodes[e].y+=t}};function Ba(n,e){let t=new Set;return n.forEach(i=>{i.edges.forEach(s=>{s.connected&&t.add(s)})}),t.forEach(i=>{let s=i.from.id,o=i.to.id;e[s]==null&&(e[s]=0),(e[o]==null||e[s]>=e[o])&&(e[o]=e[s]+1)}),e}function Aa(n){return Cn(e=>e.edges.filter(t=>n.has(t.toId)).every(t=>t.to===e),(e,t)=>t>e,"from",n)}function za(n){return Cn(e=>e.edges.filter(t=>n.has(t.toId)).every(t=>t.from===e),(e,t)=>td+1+h.edges.length,0),r=t+"Id",a=t==="to"?1:-1;for(let[d,h]of i){if(!i.has(d)||!n(h))continue;s[d]=0;let l=[h],c=0,u;for(;u=l.pop();){if(!i.has(d))continue;let p=s[u.id]+a;if(u.edges.filter(b=>b.connected&&b.to!==b.from&&b[t]!==u&&i.has(b.toId)&&i.has(b.fromId)).forEach(b=>{let C=b[r],f=s[C];(f==null||e(p,f))&&(s[C]=p,l.push(b[t]))}),c>o)return Ba(i,s);++c}}return s}var Tn=class{constructor(){this.childrenReference={},this.parentReference={},this.trees={},this.distributionOrdering={},this.levels={},this.distributionIndex={},this.isTree=!1,this.treeIndex=-1}addRelation(e,t){this.childrenReference[e]===void 0&&(this.childrenReference[e]=[]),this.childrenReference[e].push(t),this.parentReference[t]===void 0&&(this.parentReference[t]=[]),this.parentReference[t].push(e)}checkIfTree(){for(let e in this.parentReference)if(this.parentReference[e].length>1){this.isTree=!1;return}this.isTree=!0}numTrees(){return this.treeIndex+1}setTreeIndex(e,t){t!==void 0&&this.trees[e.id]===void 0&&(this.trees[e.id]=t,this.treeIndex=Math.max(t,this.treeIndex))}ensureLevel(e){this.levels[e]===void 0&&(this.levels[e]=0)}getMaxLevel(e){let t={},i=s=>{if(t[s]!==void 0)return t[s];let o=this.levels[s];if(this.childrenReference[s]){let r=this.childrenReference[s];if(r.length>0)for(let a=0;a{this.setupHierarchicalLayout()}),this.body.emitter.on("_dataLoaded",()=>{this.layoutNetwork()}),this.body.emitter.on("_resetHierarchicalLayout",()=>{this.setupHierarchicalLayout()}),this.body.emitter.on("_adjustEdgesForHierarchicalLayout",()=>{if(this.options.hierarchical.enabled!==!0)return;let e=this.direction.curveType();this.body.emitter.emit("_forceDisableDynamicCurves",e,!1)})}setOptions(e,t){if(e!==void 0){let i=this.options.hierarchical,s=i.enabled;if(Ve(["randomSeed","improvedLayout","clusterThreshold"],this.options,e),ae(this.options,e,"hierarchical"),e.randomSeed!==void 0&&this._resetRNG(e.randomSeed),i.enabled===!0)return s===!0&&this.body.emitter.emit("refresh",!0),i.direction==="RL"||i.direction==="DU"?i.levelSeparation>0&&(i.levelSeparation*=-1):i.levelSeparation<0&&(i.levelSeparation*=-1),this.setDirectionStrategy(),this.body.emitter.emit("_resetHierarchicalLayout"),this.adaptAllOptionsForHierarchicalLayout(t);if(s===!0)return this.body.emitter.emit("refresh"),j(t,this.optionsBackup)}return t}_resetRNG(e){this.initialRandomSeed=e,this._rng=gt(this.initialRandomSeed)}adaptAllOptionsForHierarchicalLayout(e){if(this.options.hierarchical.enabled===!0){let t=this.optionsBackup.physics;e.physics===void 0||e.physics===!0?(e.physics={enabled:t.enabled===void 0?!0:t.enabled,solver:"hierarchicalRepulsion"},t.enabled=t.enabled===void 0?!0:t.enabled,t.solver=t.solver||"barnesHut"):typeof e.physics=="object"?(t.enabled=e.physics.enabled===void 0?!0:e.physics.enabled,t.solver=e.physics.solver||"barnesHut",e.physics.solver="hierarchicalRepulsion"):e.physics!==!1&&(t.solver="barnesHut",e.physics={solver:"hierarchicalRepulsion"});let i=this.direction.curveType();if(e.edges===void 0)this.optionsBackup.edges={smooth:{enabled:!0,type:"dynamic"}},e.edges={smooth:!1};else if(e.edges.smooth===void 0)this.optionsBackup.edges={smooth:{enabled:!0,type:"dynamic"}},e.edges.smooth=!1;else if(typeof e.edges.smooth=="boolean")this.optionsBackup.edges={smooth:e.edges.smooth},e.edges.smooth={enabled:e.edges.smooth,type:i};else{let s=e.edges.smooth;s.type!==void 0&&s.type!=="dynamic"&&(i=s.type),this.optionsBackup.edges={smooth:{enabled:s.enabled===void 0?!0:s.enabled,type:s.type===void 0?"dynamic":s.type,roundness:s.roundness===void 0?.5:s.roundness,forceDirection:s.forceDirection===void 0?!1:s.forceDirection}},e.edges.smooth={enabled:s.enabled===void 0?!0:s.enabled,type:i,roundness:s.roundness===void 0?.5:s.roundness,forceDirection:s.forceDirection===void 0?!1:s.forceDirection}}this.body.emitter.emit("_forceDisableDynamicCurves",i)}return e}positionInitially(e){if(this.options.hierarchical.enabled!==!0){this._resetRNG(this.initialRandomSeed);let t=e.length+50;for(let i=0;io){let d=e.length;for(;e.length>o&&s<=i;){s+=1;let h=e.length;s%3==0?this.body.modules.clustering.clusterBridges(r):this.body.modules.clustering.clusterOutliers(r);let l=e.length;if(h==l&&s%3!=0){this._declusterAll(),this.body.emitter.emit("_layoutFailed"),console.info("This network could not be positioned by this version of the improved layout algorithm. Please disable improvedLayout for better performance.");return}}this.body.modules.kamadaKawai.setOptions({springLength:Math.max(150,2*d)})}s>i&&console.info("The clustering didn't succeed within the amount of interations allowed, progressing with partial result."),this.body.modules.kamadaKawai.solve(e,this.body.edgeIndices,!0),this._shiftToCenter();let a=70;for(let d=0;d0){let e,t,i=!1,s=!1;this.lastNodeOnLevel={},this.hierarchical=new Tn;for(t in this.body.nodes)Object.prototype.hasOwnProperty.call(this.body.nodes,t)&&(e=this.body.nodes[t],e.options.level!==void 0?(i=!0,this.hierarchical.levels[t]=e.options.level):s=!0);if(s===!0&&i===!0)throw new Error("To use the hierarchical layout, nodes require either no predefined levels or levels have to be defined for all nodes.");{if(s===!0){let r=this.options.hierarchical.sortMethod;r==="hubsize"?this._determineLevelsByHubsize():r==="directed"?this._determineLevelsDirected():r==="custom"&&this._determineLevelsCustomCallback()}for(let r in this.body.nodes)Object.prototype.hasOwnProperty.call(this.body.nodes,r)&&this.hierarchical.ensureLevel(r);let o=this._getDistribution();this._generateMap(),this._placeNodesByHierarchy(o),this._condenseHierarchy(),this._shiftToCenter()}}}_condenseHierarchy(){let e=!1,t={},i=()=>{let f=o(),g=0;for(let m=0;m{let m=this.hierarchical.trees;for(let v in m)Object.prototype.hasOwnProperty.call(m,v)&&m[v]===f&&this.direction.shift(v,g)},o=()=>{let f=[];for(let g=0;g{if(!g[f.id]&&(g[f.id]=!0,this.hierarchical.childrenReference[f.id])){let m=this.hierarchical.childrenReference[f.id];if(m.length>0)for(let v=0;v{let m=1e9,v=1e9,_=1e9,E=-1e9;for(let T in f)if(Object.prototype.hasOwnProperty.call(f,T)){let x=this.body.nodes[T],w=this.hierarchical.levels[x.id],k=this.direction.getPosition(x),[N,W]=this._getSpaceAroundNode(x,f);m=Math.min(N,m),v=Math.min(W,v),w<=g&&(_=Math.min(k,_),E=Math.max(k,E))}return[_,E,m,v]},d=(f,g)=>{let m=this.hierarchical.getMaxLevel(f.id),v=this.hierarchical.getMaxLevel(g.id);return Math.min(m,v)},h=(f,g,m)=>{let v=this.hierarchical;for(let _=0;_1)for(let x=0;x{let v=this.direction.getPosition(f),_=this.direction.getPosition(g),E=Math.abs(_-v),T=this.options.hierarchical.nodeSpacing;if(E>T){let x={},w={};r(f,x),r(g,w);let k=d(f,g),N=a(x,k),W=a(w,k),L=N[1],R=W[0],B=W[2];if(Math.abs(L-R)>T){let D=L-R+T;D<-B+T&&(D=-B+T),D<0&&(this._shiftBlock(g.id,D),e=!0,m===!0&&this._centerParent(g))}}},c=(f,g)=>{let m=g.id,v=g.edges,_=this.hierarchical.levels[g.id],E=this.options.hierarchical.levelSeparation*this.options.hierarchical.levelSeparation,T={},x=[];for(let B=0;B{let D=0;for(let H=0;H{let D=0;for(let H=0;H{let D=this.direction.getPosition(g),H={};for(let Y=0;Y{let F=this.direction.getPosition(g);if(t[g.id]===void 0){let it={};r(g,it),t[g.id]=it}let D=a(t[g.id]),H=D[2],Y=D[3],ce=B-F,Xe=0;ce>0?Xe=Math.min(ce,Y-this.options.hierarchical.nodeSpacing):ce<0&&(Xe=-Math.min(-ce,H-this.options.hierarchical.nodeSpacing)),Xe!=0&&(this._shiftBlock(g.id,Xe),e=!0)},L=B=>{let F=this.direction.getPosition(g),[D,H]=this._getSpaceAroundNode(g),Y=B-F,ce=F;Y>0?ce=Math.min(F+(H-this.options.hierarchical.nodeSpacing),B):Y<0&&(ce=Math.max(F-(D-this.options.hierarchical.nodeSpacing),B)),ce!==F&&(this.direction.setPosition(g,ce),e=!0)},R=N(f,x);W(R),R=N(f,v),L(R)},u=f=>{let g=this.hierarchical.getLevels();g=g.reverse();for(let m=0;m{let g=this.hierarchical.getLevels();g=g.reverse();for(let m=0;m{for(let f in this.body.nodes)Object.prototype.hasOwnProperty.call(this.body.nodes,f)&&this._centerParent(this.body.nodes[f])},C=()=>{let f=this.hierarchical.getLevels();f=f.reverse();for(let g=0;g0&&Math.abs(c)0&&(d=this.direction.getPosition(i[o-1])+a),this.direction.setPosition(r,d,t),this._validatePositionAndContinue(r,t,d),s++}}}}_placeBranchNodes(e,t){let i=this.hierarchical.childrenReference[e];if(i===void 0)return;let s=[];for(let r=0;rt&&this.positionedNodes[a.id]===void 0){let h=this.options.hierarchical.nodeSpacing,l;r===0?l=this.direction.getPosition(this.body.nodes[e]):l=this.direction.getPosition(s[r-1])+h,this.direction.setPosition(a,l,d),this._validatePositionAndContinue(a,d,l)}else return}let o=this._getCenterPosition(s);this.direction.setPosition(this.body.nodes[e],o,t)}_validatePositionAndContinue(e,t,i){if(!!this.hierarchical.isTree){if(this.lastNodeOnLevel[t]!==void 0){let s=this.direction.getPosition(this.body.nodes[this.lastNodeOnLevel[t]]);if(i-s{this.body.edgeIndices.indexOf(i.id)!==-1&&t.push(i)}),t}_getHubSizes(){let e={},t=this.body.nodeIndices;A(t,s=>{let o=this.body.nodes[s],r=this._getActiveEdges(o).length;e[r]=!0});let i=[];return A(e,s=>{i.push(Number(s))}),wt.default.sort(i,function(s,o){return o-s}),i}_determineLevelsByHubsize(){let e=(i,s)=>{this.hierarchical.levelDownstream(i,s)},t=this._getHubSizes();for(let i=0;i{let r=this.body.nodes[o];s===this._getActiveEdges(r).length&&this._crawlNetwork(e,o)})}}_determineLevelsCustomCallback(){let e=1e5,t=function(s,o,r){},i=(s,o,r)=>{let a=this.hierarchical.levels[s.id];a===void 0&&(a=this.hierarchical.levels[s.id]=e);let d=t(J.cloneOptions(s,"node"),J.cloneOptions(o,"node"),J.cloneOptions(r,"edge"));this.hierarchical.levels[o.id]=a+d};this._crawlNetwork(i),this.hierarchical.setMinLevelToZero(this.body.nodes)}_determineLevelsDirected(){let e=this.body.nodeIndices.reduce((t,i)=>(t.set(i,this.body.nodes[i]),t),new Map);this.options.hierarchical.shakeTowards==="roots"?this.hierarchical.levels=za(e):this.hierarchical.levels=Aa(e),this.hierarchical.setMinLevelToZero(this.body.nodes)}_generateMap(){let e=(t,i)=>{this.hierarchical.levels[i.id]>this.hierarchical.levels[t.id]&&this.hierarchical.addRelation(t.id,i.id)};this._crawlNetwork(e),this.hierarchical.checkIfTree()}_crawlNetwork(e=function(){},t){let i={},s=(o,r)=>{if(i[o.id]===void 0){this.hierarchical.setTreeIndex(o,r),i[o.id]=!0;let a,d=this._getActiveEdges(o);for(let h=0;h{if(i[o])return;i[o]=!0,this.direction.shift(o,t);let r=this.hierarchical.childrenReference[o];if(r!==void 0)for(let a=0;a{let d=this.hierarchical.parentReference[a];if(d!==void 0)for(let h=0;h{let d=this.hierarchical.parentReference[a];if(d!==void 0)for(let h=0;h{this._clean()}),this.body.emitter.on("_dataChanged",this._restore.bind(this)),this.body.emitter.on("_resetData",this._restore.bind(this))}_restore(){this.inMode!==!1&&(this.options.initiallyActive===!0?this.enableEditMode():this.disableEditMode())}setOptions(e,t,i){t!==void 0&&(t.locale!==void 0?this.options.locale=t.locale:this.options.locale=i.locale,t.locales!==void 0?this.options.locales=t.locales:this.options.locales=i.locales),e!==void 0&&(typeof e=="boolean"?this.options.enabled=e:(this.options.enabled=!0,j(this.options,e)),this.options.initiallyActive===!0&&(this.editMode=!0),this._setup())}toggleEditMode(){this.editMode===!0?this.disableEditMode():this.enableEditMode()}enableEditMode(){this.editMode=!0,this._clean(),this.guiEnabled===!0&&(this.manipulationDiv.style.display="block",this.closeDiv.style.display="block",this.editModeDiv.style.display="none",this.showManipulatorToolbar())}disableEditMode(){this.editMode=!1,this._clean(),this.guiEnabled===!0&&(this.manipulationDiv.style.display="none",this.closeDiv.style.display="none",this.editModeDiv.style.display="block",this._createEditButton())}showManipulatorToolbar(){if(this._clean(),this.manipulationDOM={},this.guiEnabled===!0){this.editMode=!0,this.manipulationDiv.style.display="block",this.closeDiv.style.display="block";let e=this.selectionHandler.getSelectedNodeCount(),t=this.selectionHandler.getSelectedEdgeCount(),i=e+t,s=this.options.locales[this.options.locale],o=!1;this.options.addNode!==!1&&(this._createAddNodeButton(s),o=!0),this.options.addEdge!==!1&&(o===!0?this._createSeperator(1):o=!0,this._createAddEdgeButton(s)),e===1&&typeof this.options.editNode=="function"?(o===!0?this._createSeperator(2):o=!0,this._createEditNodeButton(s)):t===1&&e===0&&this.options.editEdge!==!1&&(o===!0?this._createSeperator(3):o=!0,this._createEditEdgeButton(s)),i!==0&&(e>0&&this.options.deleteNode!==!1?(o===!0&&this._createSeperator(4),this._createDeleteButton(s)):e===0&&this.options.deleteEdge!==!1&&(o===!0&&this._createSeperator(4),this._createDeleteButton(s))),this._bindElementEvents(this.closeDiv,this.toggleEditMode.bind(this)),this._temporaryBindEvent("select",this.showManipulatorToolbar.bind(this))}this.body.emitter.emit("_redraw")}addNodeMode(){if(this.editMode!==!0&&this.enableEditMode(),this._clean(),this.inMode="addNode",this.guiEnabled===!0){let e=this.options.locales[this.options.locale];this.manipulationDOM={},this._createBackButton(e),this._createSeperator(),this._createDescription(e.addDescription||this.options.locales.en.addDescription),this._bindElementEvents(this.closeDiv,this.toggleEditMode.bind(this))}this._temporaryBindEvent("click",this._performAddNode.bind(this))}editNode(){this.editMode!==!0&&this.enableEditMode(),this._clean();let e=this.selectionHandler.getSelectedNodes()[0];if(e!==void 0)if(this.inMode="editNode",typeof this.options.editNode=="function")if(e.isCluster!==!0){let t=j({},e.options,!1);if(t.x=e.x,t.y=e.y,this.options.editNode.length===2)this.options.editNode(t,i=>{i!=null&&this.inMode==="editNode"&&this.body.data.nodes.getDataSet().update(i),this.showManipulatorToolbar()});else throw new Error("The function for edit does not support two arguments (data, callback)")}else alert(this.options.locales[this.options.locale].editClusterError||this.options.locales.en.editClusterError);else throw new Error("No function has been configured to handle the editing of nodes.");else this.showManipulatorToolbar()}addEdgeMode(){if(this.editMode!==!0&&this.enableEditMode(),this._clean(),this.inMode="addEdge",this.guiEnabled===!0){let e=this.options.locales[this.options.locale];this.manipulationDOM={},this._createBackButton(e),this._createSeperator(),this._createDescription(e.edgeDescription||this.options.locales.en.edgeDescription),this._bindElementEvents(this.closeDiv,this.toggleEditMode.bind(this))}this._temporaryBindUI("onTouch",this._handleConnect.bind(this)),this._temporaryBindUI("onDragEnd",this._finishConnect.bind(this)),this._temporaryBindUI("onDrag",this._dragControlNode.bind(this)),this._temporaryBindUI("onRelease",this._finishConnect.bind(this)),this._temporaryBindUI("onDragStart",this._dragStartEdge.bind(this)),this._temporaryBindUI("onHold",()=>{})}editEdgeMode(){if(this.editMode!==!0&&this.enableEditMode(),this._clean(),this.inMode="editEdge",typeof this.options.editEdge=="object"&&typeof this.options.editEdge.editWithoutDrag=="function"&&(this.edgeBeingEditedId=this.selectionHandler.getSelectedEdgeIds()[0],this.edgeBeingEditedId!==void 0)){let e=this.body.edges[this.edgeBeingEditedId];this._performEditEdge(e.from.id,e.to.id);return}if(this.guiEnabled===!0){let e=this.options.locales[this.options.locale];this.manipulationDOM={},this._createBackButton(e),this._createSeperator(),this._createDescription(e.editEdgeDescription||this.options.locales.en.editEdgeDescription),this._bindElementEvents(this.closeDiv,this.toggleEditMode.bind(this))}if(this.edgeBeingEditedId=this.selectionHandler.getSelectedEdgeIds()[0],this.edgeBeingEditedId!==void 0){let e=this.body.edges[this.edgeBeingEditedId],t=this._getNewTargetNode(e.from.x,e.from.y),i=this._getNewTargetNode(e.to.x,e.to.y);this.temporaryIds.nodes.push(t.id),this.temporaryIds.nodes.push(i.id),this.body.nodes[t.id]=t,this.body.nodeIndices.push(t.id),this.body.nodes[i.id]=i,this.body.nodeIndices.push(i.id),this._temporaryBindUI("onTouch",this._controlNodeTouch.bind(this)),this._temporaryBindUI("onTap",()=>{}),this._temporaryBindUI("onHold",()=>{}),this._temporaryBindUI("onDragStart",this._controlNodeDragStart.bind(this)),this._temporaryBindUI("onDrag",this._controlNodeDrag.bind(this)),this._temporaryBindUI("onDragEnd",this._controlNodeDragEnd.bind(this)),this._temporaryBindUI("onMouseMove",()=>{}),this._temporaryBindEvent("beforeDrawing",s=>{let o=e.edgeType.findBorderPositions(s);t.selected===!1&&(t.x=o.from.x,t.y=o.from.y),i.selected===!1&&(i.x=o.to.x,i.y=o.to.y)}),this.body.emitter.emit("_redraw")}else this.showManipulatorToolbar()}deleteSelected(){this.editMode!==!0&&this.enableEditMode(),this._clean(),this.inMode="delete";let e=this.selectionHandler.getSelectedNodeIds(),t=this.selectionHandler.getSelectedEdgeIds(),i;if(e.length>0){for(let s=0;s0&&typeof this.options.deleteEdge=="function"&&(i=this.options.deleteEdge);if(typeof i=="function"){let s={nodes:e,edges:t};if(i.length===2)i(s,o=>{o!=null&&this.inMode==="delete"?(this.body.data.edges.getDataSet().remove(o.edges),this.body.data.nodes.getDataSet().remove(o.nodes),this.body.emitter.emit("startSimulation"),this.showManipulatorToolbar()):(this.body.emitter.emit("startSimulation"),this.showManipulatorToolbar())});else throw new Error("The function for delete does not support two arguments (data, callback)")}else this.body.data.edges.getDataSet().remove(t),this.body.data.nodes.getDataSet().remove(e),this.body.emitter.emit("startSimulation"),this.showManipulatorToolbar()}_setup(){this.options.enabled===!0?(this.guiEnabled=!0,this._createWrappers(),this.editMode===!1?this._createEditButton():this.showManipulatorToolbar()):(this._removeManipulationDOM(),this.guiEnabled=!1)}_createWrappers(){var e,t;this.manipulationDiv===void 0&&(this.manipulationDiv=document.createElement("div"),this.manipulationDiv.className="vis-manipulation",this.editMode===!0?this.manipulationDiv.style.display="block":this.manipulationDiv.style.display="none",this.canvas.frame.appendChild(this.manipulationDiv)),this.editModeDiv===void 0&&(this.editModeDiv=document.createElement("div"),this.editModeDiv.className="vis-edit-mode",this.editMode===!0?this.editModeDiv.style.display="none":this.editModeDiv.style.display="block",this.canvas.frame.appendChild(this.editModeDiv)),this.closeDiv===void 0&&(this.closeDiv=document.createElement("button"),this.closeDiv.className="vis-close",this.closeDiv.setAttribute("aria-label",(t=(e=this.options.locales[this.options.locale])==null?void 0:e.close)!=null?t:this.options.locales.en.close),this.closeDiv.style.display=this.manipulationDiv.style.display,this.canvas.frame.appendChild(this.closeDiv))}_getNewTargetNode(e,t){let i=j({},this.options.controlNodeStyle);i.id="targetNode"+Te(),i.hidden=!1,i.physics=!1,i.x=e,i.y=t;let s=this.body.functions.createNode(i);return s.shape.boundingBox={left:e,right:e,top:t,bottom:t},s}_createEditButton(){this._clean(),this.manipulationDOM={},_e(this.editModeDiv);let e=this.options.locales[this.options.locale],t=this._createButton("editMode","vis-edit vis-edit-mode",e.edit||this.options.locales.en.edit);this.editModeDiv.appendChild(t),this._bindElementEvents(t,this.toggleEditMode.bind(this))}_clean(){this.inMode=!1,this.guiEnabled===!0&&(_e(this.editModeDiv),_e(this.manipulationDiv),this._cleanupDOMEventListeners()),this._cleanupTemporaryNodesAndEdges(),this._unbindTemporaryUIs(),this._unbindTemporaryEvents(),this.body.emitter.emit("restorePhysics")}_cleanupDOMEventListeners(){for(let e of this._domEventListenerCleanupQueue.splice(0))e()}_removeManipulationDOM(){this._clean(),_e(this.manipulationDiv),_e(this.editModeDiv),_e(this.closeDiv),this.manipulationDiv&&this.canvas.frame.removeChild(this.manipulationDiv),this.editModeDiv&&this.canvas.frame.removeChild(this.editModeDiv),this.closeDiv&&this.canvas.frame.removeChild(this.closeDiv),this.manipulationDiv=void 0,this.editModeDiv=void 0,this.closeDiv=void 0}_createSeperator(e=1){this.manipulationDOM["seperatorLineDiv"+e]=document.createElement("div"),this.manipulationDOM["seperatorLineDiv"+e].className="vis-separator-line",this.manipulationDiv.appendChild(this.manipulationDOM["seperatorLineDiv"+e])}_createAddNodeButton(e){let t=this._createButton("addNode","vis-add",e.addNode||this.options.locales.en.addNode);this.manipulationDiv.appendChild(t),this._bindElementEvents(t,this.addNodeMode.bind(this))}_createAddEdgeButton(e){let t=this._createButton("addEdge","vis-connect",e.addEdge||this.options.locales.en.addEdge);this.manipulationDiv.appendChild(t),this._bindElementEvents(t,this.addEdgeMode.bind(this))}_createEditNodeButton(e){let t=this._createButton("editNode","vis-edit",e.editNode||this.options.locales.en.editNode);this.manipulationDiv.appendChild(t),this._bindElementEvents(t,this.editNode.bind(this))}_createEditEdgeButton(e){let t=this._createButton("editEdge","vis-edit",e.editEdge||this.options.locales.en.editEdge);this.manipulationDiv.appendChild(t),this._bindElementEvents(t,this.editEdgeMode.bind(this))}_createDeleteButton(e){let t;this.options.rtl?t="vis-delete-rtl":t="vis-delete";let i=this._createButton("delete",t,e.del||this.options.locales.en.del);this.manipulationDiv.appendChild(i),this._bindElementEvents(i,this.deleteSelected.bind(this))}_createBackButton(e){let t=this._createButton("back","vis-back",e.back||this.options.locales.en.back);this.manipulationDiv.appendChild(t),this._bindElementEvents(t,this.showManipulatorToolbar.bind(this))}_createButton(e,t,i,s="vis-label"){return this.manipulationDOM[e+"Div"]=document.createElement("button"),this.manipulationDOM[e+"Div"].className="vis-button "+t,this.manipulationDOM[e+"Label"]=document.createElement("div"),this.manipulationDOM[e+"Label"].className=s,this.manipulationDOM[e+"Label"].innerText=i,this.manipulationDOM[e+"Div"].appendChild(this.manipulationDOM[e+"Label"]),this.manipulationDOM[e+"Div"]}_createDescription(e){this.manipulationDOM.descriptionLabel=document.createElement("div"),this.manipulationDOM.descriptionLabel.className="vis-none",this.manipulationDOM.descriptionLabel.innerText=e,this.manipulationDiv.appendChild(this.manipulationDOM.descriptionLabel)}_temporaryBindEvent(e,t){this.temporaryEventFunctions.push({event:e,boundFunction:t}),this.body.emitter.on(e,t)}_temporaryBindUI(e,t){if(this.body.eventListeners[e]!==void 0)this.temporaryUIFunctions[e]=this.body.eventListeners[e],this.body.eventListeners[e]=t;else throw new Error("This UI function does not exist. Typo? You tried: "+e+" possible are: "+JSON.stringify(Object.keys(this.body.eventListeners)))}_unbindTemporaryUIs(){for(let e in this.temporaryUIFunctions)Object.prototype.hasOwnProperty.call(this.temporaryUIFunctions,e)&&(this.body.eventListeners[e]=this.temporaryUIFunctions[e],delete this.temporaryUIFunctions[e]);this.temporaryUIFunctions={}}_unbindTemporaryEvents(){for(let e=0;e{i.destroy()});let s=({keyCode:o,key:r})=>{(r==="Enter"||r===" "||o===13||o===32)&&t()};e.addEventListener("keyup",s,!1),this._domEventListenerCleanupQueue.push(()=>{e.removeEventListener("keyup",s,!1)})}_cleanupTemporaryNodesAndEdges(){for(let e=0;e=0;a--)if(o[a]!==this.selectedControlNode.id){r=this.body.nodes[o[a]];break}if(r!==void 0&&this.selectedControlNode!==void 0)if(r.isCluster===!0)alert(this.options.locales[this.options.locale].createEdgeError||this.options.locales.en.createEdgeError);else{let a=this.body.nodes[this.temporaryIds.nodes[0]];this.selectedControlNode.id===a.id?this._performEditEdge(r.id,s.to.id):this._performEditEdge(s.from.id,r.id)}else s.updateEdgeType(),this.body.emitter.emit("restorePhysics");this.body.emitter.emit("_redraw")}_handleConnect(e){if(new Date().valueOf()-this.touchTime>100){this.lastTouch=this.body.functions.getPointer(e.center),this.lastTouch.translation=Object.assign({},this.body.view.translation),this.interactionHandler.drag.pointer=this.lastTouch,this.interactionHandler.drag.translation=this.lastTouch.translation;let t=this.lastTouch,i=this.selectionHandler.getNodeAt(t);if(i!==void 0)if(i.isCluster===!0)alert(this.options.locales[this.options.locale].createEdgeError||this.options.locales.en.createEdgeError);else{let s=this._getNewTargetNode(i.x,i.y);this.body.nodes[s.id]=s,this.body.nodeIndices.push(s.id);let o=this.body.functions.createEdge({id:"connectionEdge"+Te(),from:i.id,to:s.id,physics:!1,smooth:{enabled:!0,type:"continuous",roundness:.5}});this.body.edges[o.id]=o,this.body.edgeIndices.push(o.id),this.temporaryIds.nodes.push(s.id),this.temporaryIds.edges.push(o.id)}this.touchTime=new Date().valueOf()}}_dragControlNode(e){let t=this.body.functions.getPointer(e.center),i=this.selectionHandler._pointerToPositionObject(t),s;this.temporaryIds.edges[0]!==void 0&&(s=this.body.edges[this.temporaryIds.edges[0]].fromId);let o=this.selectionHandler._getAllNodesOverlappingWith(i),r;for(let a=o.length-1;a>=0;a--)if(this.temporaryIds.nodes.indexOf(o[a])===-1){r=this.body.nodes[o[a]];break}if(e.controlEdge={from:s,to:r?r.id:void 0},this.selectionHandler.generateClickEvent("controlNodeDragging",e,t),this.temporaryIds.nodes[0]!==void 0){let a=this.body.nodes[this.temporaryIds.nodes[0]];a.x=this.canvas._XconvertDOMtoCanvas(t.x),a.y=this.canvas._YconvertDOMtoCanvas(t.y),this.body.emitter.emit("_redraw")}else this.interactionHandler.onDrag(e)}_finishConnect(e){let t=this.body.functions.getPointer(e.center),i=this.selectionHandler._pointerToPositionObject(t),s;this.temporaryIds.edges[0]!==void 0&&(s=this.body.edges[this.temporaryIds.edges[0]].fromId);let o=this.selectionHandler._getAllNodesOverlappingWith(i),r;for(let a=o.length-1;a>=0;a--)if(this.temporaryIds.nodes.indexOf(o[a])===-1){r=this.body.nodes[o[a]];break}this._cleanupTemporaryNodesAndEdges(),r!==void 0&&(r.isCluster===!0?alert(this.options.locales[this.options.locale].createEdgeError||this.options.locales.en.createEdgeError):this.body.nodes[s]!==void 0&&this.body.nodes[r.id]!==void 0&&this._performAddEdge(s,r.id)),e.controlEdge={from:s,to:r?r.id:void 0},this.selectionHandler.generateClickEvent("controlNodeDragEnd",e,t),this.body.emitter.emit("_redraw")}_dragStartEdge(e){let t=this.lastTouch;this.selectionHandler.generateClickEvent("dragStart",e,t,void 0,!0)}_performAddNode(e){let t={id:Te(),x:e.pointer.canvas.x,y:e.pointer.canvas.y,label:"new"};if(typeof this.options.addNode=="function")if(this.options.addNode.length===2)this.options.addNode(t,i=>{i!=null&&this.inMode==="addNode"&&this.body.data.nodes.getDataSet().add(i),this.showManipulatorToolbar()});else throw this.showManipulatorToolbar(),new Error("The function for add does not support two arguments (data,callback)");else this.body.data.nodes.getDataSet().add(t),this.showManipulatorToolbar()}_performAddEdge(e,t){let i={from:e,to:t};if(typeof this.options.addEdge=="function")if(this.options.addEdge.length===2)this.options.addEdge(i,s=>{s!=null&&this.inMode==="addEdge"&&(this.body.data.edges.getDataSet().add(s),this.selectionHandler.unselectAll(),this.showManipulatorToolbar())});else throw new Error("The function for connect does not support two arguments (data,callback)");else this.body.data.edges.getDataSet().add(i),this.selectionHandler.unselectAll(),this.showManipulatorToolbar()}_performEditEdge(e,t){let i={id:this.edgeBeingEditedId,from:e,to:t,label:this.body.data.edges.get(this.edgeBeingEditedId).label},s=this.options.editEdge;if(typeof s=="object"&&(s=s.editWithoutDrag),typeof s=="function")if(s.length===2)s(i,o=>{o==null||this.inMode!=="editEdge"?(this.body.edges[i.id].updateEdgeType(),this.body.emitter.emit("_redraw"),this.showManipulatorToolbar()):(this.body.data.edges.getDataSet().update(o),this.selectionHandler.unselectAll(),this.showManipulatorToolbar())});else throw new Error("The function for edit does not support two arguments (data, callback)");else this.body.data.edges.getDataSet().update(i),this.selectionHandler.unselectAll(),this.showManipulatorToolbar()}},O="string",S="boolean",y="number",xt="array",P="object",On="dom",La="any",Vi=["arrow","bar","box","circle","crow","curve","diamond","image","inv_curve","inv_triangle","triangle","vee"],qi={borderWidth:{number:y},borderWidthSelected:{number:y,undefined:"undefined"},brokenImage:{string:O,undefined:"undefined"},chosen:{label:{boolean:S,function:"function"},node:{boolean:S,function:"function"},__type__:{object:P,boolean:S}},color:{border:{string:O},background:{string:O},highlight:{border:{string:O},background:{string:O},__type__:{object:P,string:O}},hover:{border:{string:O},background:{string:O},__type__:{object:P,string:O}},__type__:{object:P,string:O}},opacity:{number:y,undefined:"undefined"},fixed:{x:{boolean:S},y:{boolean:S},__type__:{object:P,boolean:S}},font:{align:{string:O},color:{string:O},size:{number:y},face:{string:O},background:{string:O},strokeWidth:{number:y},strokeColor:{string:O},vadjust:{number:y},multi:{boolean:S,string:O},bold:{color:{string:O},size:{number:y},face:{string:O},mod:{string:O},vadjust:{number:y},__type__:{object:P,string:O}},boldital:{color:{string:O},size:{number:y},face:{string:O},mod:{string:O},vadjust:{number:y},__type__:{object:P,string:O}},ital:{color:{string:O},size:{number:y},face:{string:O},mod:{string:O},vadjust:{number:y},__type__:{object:P,string:O}},mono:{color:{string:O},size:{number:y},face:{string:O},mod:{string:O},vadjust:{number:y},__type__:{object:P,string:O}},__type__:{object:P,string:O}},group:{string:O,number:y,undefined:"undefined"},heightConstraint:{minimum:{number:y},valign:{string:O},__type__:{object:P,boolean:S,number:y}},hidden:{boolean:S},icon:{face:{string:O},code:{string:O},size:{number:y},color:{string:O},weight:{string:O,number:y},__type__:{object:P}},id:{string:O,number:y},image:{selected:{string:O,undefined:"undefined"},unselected:{string:O,undefined:"undefined"},__type__:{object:P,string:O}},imagePadding:{top:{number:y},right:{number:y},bottom:{number:y},left:{number:y},__type__:{object:P,number:y}},label:{string:O,undefined:"undefined"},labelHighlightBold:{boolean:S},level:{number:y,undefined:"undefined"},margin:{top:{number:y},right:{number:y},bottom:{number:y},left:{number:y},__type__:{object:P,number:y}},mass:{number:y},physics:{boolean:S},scaling:{min:{number:y},max:{number:y},label:{enabled:{boolean:S},min:{number:y},max:{number:y},maxVisible:{number:y},drawThreshold:{number:y},__type__:{object:P,boolean:S}},customScalingFunction:{function:"function"},__type__:{object:P}},shadow:{enabled:{boolean:S},color:{string:O},size:{number:y},x:{number:y},y:{number:y},__type__:{object:P,boolean:S}},shape:{string:["custom","ellipse","circle","database","box","text","image","circularImage","diamond","dot","star","triangle","triangleDown","square","icon","hexagon"]},ctxRenderer:{function:"function"},shapeProperties:{borderDashes:{boolean:S,array:xt},borderRadius:{number:y},interpolation:{boolean:S},useImageSize:{boolean:S},useBorderWithImage:{boolean:S},coordinateOrigin:{string:["center","top-left"]},__type__:{object:P}},size:{number:y},title:{string:O,dom:On,undefined:"undefined"},value:{number:y,undefined:"undefined"},widthConstraint:{minimum:{number:y},maximum:{number:y},__type__:{object:P,boolean:S,number:y}},x:{number:y},y:{number:y},__type__:{object:P}},Ra={configure:{enabled:{boolean:S},filter:{boolean:S,string:O,array:xt,function:"function"},container:{dom:On},showButton:{boolean:S},__type__:{object:P,boolean:S,string:O,array:xt,function:"function"}},edges:{arrows:{to:{enabled:{boolean:S},scaleFactor:{number:y},type:{string:Vi},imageHeight:{number:y},imageWidth:{number:y},src:{string:O},__type__:{object:P,boolean:S}},middle:{enabled:{boolean:S},scaleFactor:{number:y},type:{string:Vi},imageWidth:{number:y},imageHeight:{number:y},src:{string:O},__type__:{object:P,boolean:S}},from:{enabled:{boolean:S},scaleFactor:{number:y},type:{string:Vi},imageWidth:{number:y},imageHeight:{number:y},src:{string:O},__type__:{object:P,boolean:S}},__type__:{string:["from","to","middle"],object:P}},endPointOffset:{from:{number:y},to:{number:y},__type__:{object:P,number:y}},arrowStrikethrough:{boolean:S},background:{enabled:{boolean:S},color:{string:O},size:{number:y},dashes:{boolean:S,array:xt},__type__:{object:P,boolean:S}},chosen:{label:{boolean:S,function:"function"},edge:{boolean:S,function:"function"},__type__:{object:P,boolean:S}},color:{color:{string:O},highlight:{string:O},hover:{string:O},inherit:{string:["from","to","both"],boolean:S},opacity:{number:y},__type__:{object:P,string:O}},dashes:{boolean:S,array:xt},font:{color:{string:O},size:{number:y},face:{string:O},background:{string:O},strokeWidth:{number:y},strokeColor:{string:O},align:{string:["horizontal","top","middle","bottom"]},vadjust:{number:y},multi:{boolean:S,string:O},bold:{color:{string:O},size:{number:y},face:{string:O},mod:{string:O},vadjust:{number:y},__type__:{object:P,string:O}},boldital:{color:{string:O},size:{number:y},face:{string:O},mod:{string:O},vadjust:{number:y},__type__:{object:P,string:O}},ital:{color:{string:O},size:{number:y},face:{string:O},mod:{string:O},vadjust:{number:y},__type__:{object:P,string:O}},mono:{color:{string:O},size:{number:y},face:{string:O},mod:{string:O},vadjust:{number:y},__type__:{object:P,string:O}},__type__:{object:P,string:O}},hidden:{boolean:S},hoverWidth:{function:"function",number:y},label:{string:O,undefined:"undefined"},labelHighlightBold:{boolean:S},length:{number:y,undefined:"undefined"},physics:{boolean:S},scaling:{min:{number:y},max:{number:y},label:{enabled:{boolean:S},min:{number:y},max:{number:y},maxVisible:{number:y},drawThreshold:{number:y},__type__:{object:P,boolean:S}},customScalingFunction:{function:"function"},__type__:{object:P}},selectionWidth:{function:"function",number:y},selfReferenceSize:{number:y},selfReference:{size:{number:y},angle:{number:y},renderBehindTheNode:{boolean:S},__type__:{object:P}},shadow:{enabled:{boolean:S},color:{string:O},size:{number:y},x:{number:y},y:{number:y},__type__:{object:P,boolean:S}},smooth:{enabled:{boolean:S},type:{string:["dynamic","continuous","discrete","diagonalCross","straightCross","horizontal","vertical","curvedCW","curvedCCW","cubicBezier"]},roundness:{number:y},forceDirection:{string:["horizontal","vertical","none"],boolean:S},__type__:{object:P,boolean:S}},title:{string:O,undefined:"undefined"},width:{number:y},widthConstraint:{maximum:{number:y},__type__:{object:P,boolean:S,number:y}},value:{number:y,undefined:"undefined"},__type__:{object:P}},groups:{useDefaultGroups:{boolean:S},__any__:qi,__type__:{object:P}},interaction:{dragNodes:{boolean:S},dragView:{boolean:S},hideEdgesOnDrag:{boolean:S},hideEdgesOnZoom:{boolean:S},hideNodesOnDrag:{boolean:S},hover:{boolean:S},keyboard:{enabled:{boolean:S},speed:{x:{number:y},y:{number:y},zoom:{number:y},__type__:{object:P}},bindToWindow:{boolean:S},autoFocus:{boolean:S},__type__:{object:P,boolean:S}},multiselect:{boolean:S},navigationButtons:{boolean:S},selectable:{boolean:S},selectConnectedEdges:{boolean:S},hoverConnectedEdges:{boolean:S},tooltipDelay:{number:y},zoomView:{boolean:S},zoomSpeed:{number:y},__type__:{object:P}},layout:{randomSeed:{undefined:"undefined",number:y,string:O},improvedLayout:{boolean:S},clusterThreshold:{number:y},hierarchical:{enabled:{boolean:S},levelSeparation:{number:y},nodeSpacing:{number:y},treeSpacing:{number:y},blockShifting:{boolean:S},edgeMinimization:{boolean:S},parentCentralization:{boolean:S},direction:{string:["UD","DU","LR","RL"]},sortMethod:{string:["hubsize","directed"]},shakeTowards:{string:["leaves","roots"]},__type__:{object:P,boolean:S}},__type__:{object:P}},manipulation:{enabled:{boolean:S},initiallyActive:{boolean:S},addNode:{boolean:S,function:"function"},addEdge:{boolean:S,function:"function"},editNode:{function:"function"},editEdge:{editWithoutDrag:{function:"function"},__type__:{object:P,boolean:S,function:"function"}},deleteNode:{boolean:S,function:"function"},deleteEdge:{boolean:S,function:"function"},controlNodeStyle:qi,__type__:{object:P,boolean:S}},nodes:qi,physics:{enabled:{boolean:S},barnesHut:{theta:{number:y},gravitationalConstant:{number:y},centralGravity:{number:y},springLength:{number:y},springConstant:{number:y},damping:{number:y},avoidOverlap:{number:y},__type__:{object:P}},forceAtlas2Based:{theta:{number:y},gravitationalConstant:{number:y},centralGravity:{number:y},springLength:{number:y},springConstant:{number:y},damping:{number:y},avoidOverlap:{number:y},__type__:{object:P}},repulsion:{centralGravity:{number:y},springLength:{number:y},springConstant:{number:y},nodeDistance:{number:y},damping:{number:y},__type__:{object:P}},hierarchicalRepulsion:{centralGravity:{number:y},springLength:{number:y},springConstant:{number:y},nodeDistance:{number:y},damping:{number:y},avoidOverlap:{number:y},__type__:{object:P}},maxVelocity:{number:y},minVelocity:{number:y},solver:{string:["barnesHut","repulsion","hierarchicalRepulsion","forceAtlas2Based"]},stabilization:{enabled:{boolean:S},iterations:{number:y},updateInterval:{number:y},onlyDynamicEdges:{boolean:S},fit:{boolean:S},__type__:{object:P,boolean:S}},timestep:{number:y},adaptiveTimestep:{boolean:S},wind:{x:{number:y},y:{number:y},__type__:{object:P}},__type__:{object:P,boolean:S}},autoResize:{boolean:S},clickToUse:{boolean:S},locale:{string:O},locales:{__any__:{any:La},__type__:{object:P}},height:{string:O},width:{string:O},__type__:{object:P}},In={nodes:{borderWidth:[1,0,10,1],borderWidthSelected:[2,0,10,1],color:{border:["color","#2B7CE9"],background:["color","#97C2FC"],highlight:{border:["color","#2B7CE9"],background:["color","#D2E5FF"]},hover:{border:["color","#2B7CE9"],background:["color","#D2E5FF"]}},opacity:[0,0,1,.1],fixed:{x:!1,y:!1},font:{color:["color","#343434"],size:[14,0,100,1],face:["arial","verdana","tahoma"],background:["color","none"],strokeWidth:[0,0,50,1],strokeColor:["color","#ffffff"]},hidden:!1,labelHighlightBold:!0,physics:!0,scaling:{min:[10,0,200,1],max:[30,0,200,1],label:{enabled:!1,min:[14,0,200,1],max:[30,0,200,1],maxVisible:[30,0,200,1],drawThreshold:[5,0,20,1]}},shadow:{enabled:!1,color:"rgba(0,0,0,0.5)",size:[10,0,20,1],x:[5,-30,30,1],y:[5,-30,30,1]},shape:["ellipse","box","circle","database","diamond","dot","square","star","text","triangle","triangleDown","hexagon"],shapeProperties:{borderDashes:!1,borderRadius:[6,0,20,1],interpolation:!0,useImageSize:!1},size:[25,0,200,1]},edges:{arrows:{to:{enabled:!1,scaleFactor:[1,0,3,.05],type:"arrow"},middle:{enabled:!1,scaleFactor:[1,0,3,.05],type:"arrow"},from:{enabled:!1,scaleFactor:[1,0,3,.05],type:"arrow"}},endPointOffset:{from:[0,-10,10,1],to:[0,-10,10,1]},arrowStrikethrough:!0,color:{color:["color","#848484"],highlight:["color","#848484"],hover:["color","#848484"],inherit:["from","to","both",!0,!1],opacity:[1,0,1,.05]},dashes:!1,font:{color:["color","#343434"],size:[14,0,100,1],face:["arial","verdana","tahoma"],background:["color","none"],strokeWidth:[2,0,50,1],strokeColor:["color","#ffffff"],align:["horizontal","top","middle","bottom"]},hidden:!1,hoverWidth:[1.5,0,5,.1],labelHighlightBold:!0,physics:!0,scaling:{min:[1,0,100,1],max:[15,0,100,1],label:{enabled:!0,min:[14,0,200,1],max:[30,0,200,1],maxVisible:[30,0,200,1],drawThreshold:[5,0,20,1]}},selectionWidth:[1.5,0,5,.1],selfReferenceSize:[20,0,200,1],selfReference:{size:[20,0,200,1],angle:[Math.PI/2,-6*Math.PI,6*Math.PI,Math.PI/8],renderBehindTheNode:!0},shadow:{enabled:!1,color:"rgba(0,0,0,0.5)",size:[10,0,20,1],x:[5,-30,30,1],y:[5,-30,30,1]},smooth:{enabled:!0,type:["dynamic","continuous","discrete","diagonalCross","straightCross","horizontal","vertical","curvedCW","curvedCCW","cubicBezier"],forceDirection:["horizontal","vertical","none"],roundness:[.5,0,1,.05]},width:[1,0,30,1]},layout:{hierarchical:{enabled:!1,levelSeparation:[150,20,500,5],nodeSpacing:[100,20,500,5],treeSpacing:[200,20,500,5],blockShifting:!0,edgeMinimization:!0,parentCentralization:!0,direction:["UD","DU","LR","RL"],sortMethod:["hubsize","directed"],shakeTowards:["leaves","roots"]}},interaction:{dragNodes:!0,dragView:!0,hideEdgesOnDrag:!1,hideEdgesOnZoom:!1,hideNodesOnDrag:!1,hover:!1,keyboard:{enabled:!1,speed:{x:[10,0,40,1],y:[10,0,40,1],zoom:[.02,0,.1,.005]},bindToWindow:!0,autoFocus:!0},multiselect:!1,navigationButtons:!1,selectable:!0,selectConnectedEdges:!0,hoverConnectedEdges:!0,tooltipDelay:[300,0,1e3,25],zoomView:!0,zoomSpeed:[1,.1,2,.1]},manipulation:{enabled:!1,initiallyActive:!1},physics:{enabled:!0,barnesHut:{theta:[.5,.1,1,.05],gravitationalConstant:[-2e3,-3e4,0,50],centralGravity:[.3,0,10,.05],springLength:[95,0,500,5],springConstant:[.04,0,1.2,.005],damping:[.09,0,1,.01],avoidOverlap:[0,0,1,.01]},forceAtlas2Based:{theta:[.5,.1,1,.05],gravitationalConstant:[-50,-500,0,1],centralGravity:[.01,0,1,.005],springLength:[95,0,500,5],springConstant:[.08,0,1.2,.005],damping:[.4,0,1,.01],avoidOverlap:[0,0,1,.01]},repulsion:{centralGravity:[.2,0,10,.05],springLength:[200,0,500,5],springConstant:[.05,0,1.2,.005],nodeDistance:[100,0,500,5],damping:[.09,0,1,.01]},hierarchicalRepulsion:{centralGravity:[.2,0,10,.05],springLength:[100,0,500,5],springConstant:[.01,0,1.2,.005],nodeDistance:[120,0,500,5],damping:[.09,0,1,.01],avoidOverlap:[0,0,1,.01]},maxVelocity:[50,0,150,1],minVelocity:[.1,.01,.5,.01],solver:["barnesHut","forceAtlas2Based","repulsion","hierarchicalRepulsion"],timestep:[.5,.01,1,.01],wind:{x:[0,-10,10,.1],y:[0,-10,10,.1]}}},Ha=(n,e,t)=>!!(n.includes("physics")&&In.physics.solver.includes(e)&&t.physics.solver!==e&&e!=="wind");var Pn=class{constructor(){}getDistances(e,t,i){let s={},o=e.edges;for(let a=0;ao&&ar&&Cthis.body.emitter.emit("_requestRedraw")),this.groups=new Co,this.canvas=new gn(this.body),this.selectionHandler=new _n(this.body,this.canvas),this.interactionHandler=new bn(this.body,this.canvas,this.selectionHandler),this.view=new mn(this.body,this.canvas),this.renderer=new fn(this.body,this.canvas),this.physics=new ln(this.body),this.layoutEngine=new kn(this.body),this.clustering=new un(this.body),this.manipulation=new Sn(this.body,this.canvas,this.selectionHandler,this.interactionHandler),this.nodesHandler=new Vo(this.body,this.images,this.groups,this.layoutEngine),this.edgesHandler=new on(this.body,this.images,this.groups),this.body.modules.kamadaKawai=new Mn(this.body,150,.05),this.body.modules.clustering=this.clustering,this.canvas._create(),this.setOptions(t),this.setData(e)}(0,ro.default)(I.prototype);I.prototype.setOptions=function(n){if(n===null&&(n=void 0),n!==void 0){if($s.validate(n,Ra)===!0&&console.error("%cErrors have been found in the supplied options object.",Ei),Ve(["locale","locales","clickToUse"],this.options,n),n.locale!==void 0&&(n.locale=Ma(n.locales||this.options.locales,n.locale)),n=this.layoutEngine.setOptions(n.layout,n),this.canvas.setOptions(n),this.groups.setOptions(n.groups),this.nodesHandler.setOptions(n.nodes),this.edgesHandler.setOptions(n.edges),this.physics.setOptions(n.physics),this.manipulation.setOptions(n.manipulation,n,this.options),this.interactionHandler.setOptions(n.interaction),this.renderer.setOptions(n.interaction),this.selectionHandler.setOptions(n.interaction),n.groups!==void 0&&this.body.emitter.emit("refreshNodes"),"configure"in n&&(this.configurator||(this.configurator=new Zs(this,this.body.container,In,this.canvas.pixelRatio,Ha)),this.configurator.setOptions(n.configure)),this.configurator&&this.configurator.options.enabled===!0){let i={nodes:{},edges:{},layout:{},interaction:{},manipulation:{},physics:{},global:{}};j(i.nodes,this.nodesHandler.options),j(i.edges,this.edgesHandler.options),j(i.layout,this.layoutEngine.options),j(i.interaction,this.selectionHandler.options),j(i.interaction,this.renderer.options),j(i.interaction,this.interactionHandler.options),j(i.manipulation,this.manipulation.options),j(i.physics,this.physics.options),j(i.global,this.canvas.options),j(i.global,this.options),this.configurator.setModuleOptions(i)}n.clickToUse!==void 0?n.clickToUse===!0?this.activator===void 0&&(this.activator=new Ks(this.canvas.frame),this.activator.on("change",()=>{this.body.emitter.emit("activate")})):(this.activator!==void 0&&(this.activator.destroy(),delete this.activator),this.body.emitter.emit("activate")):this.body.emitter.emit("activate"),this.canvas.setSize(),this.body.emitter.emit("startSimulation")}};I.prototype._updateVisibleIndices=function(){let n=this.body.nodes,e=this.body.edges;this.body.nodeIndices=[],this.body.edgeIndices=[];for(let t in n)Object.prototype.hasOwnProperty.call(n,t)&&!this.clustering._isClusteredNode(t)&&n[t].options.hidden===!1&&this.body.nodeIndices.push(n[t].id);for(let t in e)if(Object.prototype.hasOwnProperty.call(e,t)){let i=e[t],s=n[i.fromId],o=n[i.toId],r=s!==void 0&&o!==void 0;!this.clustering._isClusteredEdge(t)&&i.options.hidden===!1&&r&&s.options.hidden===!1&&o.options.hidden===!1&&this.body.edgeIndices.push(i.id)}};I.prototype.bindEventListeners=function(){this.body.emitter.on("_dataChanged",()=>{this.edgesHandler._updateState(),this.body.emitter.emit("_dataUpdated")}),this.body.emitter.on("_dataUpdated",()=>{this.clustering._updateState(),this._updateVisibleIndices(),this._updateValueRange(this.body.nodes),this._updateValueRange(this.body.edges),this.body.emitter.emit("startSimulation"),this.body.emitter.emit("_requestRedraw")})};I.prototype.setData=function(n){if(this.body.emitter.emit("resetPhysics"),this.body.emitter.emit("_resetData"),this.selectionHandler.unselectAll(),n&&n.dot&&(n.nodes||n.edges))throw new SyntaxError('Data must contain either parameter "dot" or parameter pair "nodes" and "edges", but not both.');if(this.setOptions(n&&n.options),n&&n.dot){console.warn("The dot property has been deprecated. Please use the static convertDot method to convert DOT into vis.network format and use the normal data format with nodes and edges. This converter is used like this: var data = vis.network.convertDot(dotString);");let e=ya(n.dot);this.setData(e);return}else if(n&&n.gephi){console.warn("The gephi property has been deprecated. Please use the static convertGephi method to convert gephi into vis.network format and use the normal data format with nodes and edges. This converter is used like this: var data = vis.network.convertGephi(gephiJson);");let e=ba(n.gephi);this.setData(e);return}else this.nodesHandler.setData(n&&n.nodes,!0),this.edgesHandler.setData(n&&n.edges,!0);this.body.emitter.emit("_dataChanged"),this.body.emitter.emit("_dataLoaded"),this.body.emitter.emit("initPhysics")};I.prototype.destroy=function(){this.body.emitter.emit("destroy"),this.body.emitter.off(),this.off(),delete this.groups,delete this.canvas,delete this.selectionHandler,delete this.interactionHandler,delete this.view,delete this.renderer,delete this.physics,delete this.layoutEngine,delete this.clustering,delete this.manipulation,delete this.nodesHandler,delete this.edgesHandler,delete this.configurator,delete this.images;for(let n in this.body.nodes)!Object.prototype.hasOwnProperty.call(this.body.nodes,n)||delete this.body.nodes[n];for(let n in this.body.edges)!Object.prototype.hasOwnProperty.call(this.body.edges,n)||delete this.body.edges[n];_e(this.body.container)};I.prototype._updateValueRange=function(n){let e,t,i,s=0;for(e in n)if(Object.prototype.hasOwnProperty.call(n,e)){let o=n[e].getValue();o!==void 0&&(t=t===void 0?o:Math.min(o,t),i=i===void 0?o:Math.max(o,i),s+=o)}if(t!==void 0&&i!==void 0)for(e in n)Object.prototype.hasOwnProperty.call(n,e)&&n[e].setValueRange(t,i,s)};I.prototype.isActive=function(){return!this.activator||this.activator.active};I.prototype.setSize=function(){return this.canvas.setSize.apply(this.canvas,arguments)};I.prototype.canvasToDOM=function(){return this.canvas.canvasToDOM.apply(this.canvas,arguments)};I.prototype.DOMtoCanvas=function(){return this.canvas.DOMtoCanvas.apply(this.canvas,arguments)};I.prototype.findNode=function(){return this.clustering.findNode.apply(this.clustering,arguments)};I.prototype.isCluster=function(){return this.clustering.isCluster.apply(this.clustering,arguments)};I.prototype.openCluster=function(){return this.clustering.openCluster.apply(this.clustering,arguments)};I.prototype.cluster=function(){return this.clustering.cluster.apply(this.clustering,arguments)};I.prototype.getNodesInCluster=function(){return this.clustering.getNodesInCluster.apply(this.clustering,arguments)};I.prototype.clusterByConnection=function(){return this.clustering.clusterByConnection.apply(this.clustering,arguments)};I.prototype.clusterByHubsize=function(){return this.clustering.clusterByHubsize.apply(this.clustering,arguments)};I.prototype.updateClusteredNode=function(){return this.clustering.updateClusteredNode.apply(this.clustering,arguments)};I.prototype.getClusteredEdges=function(){return this.clustering.getClusteredEdges.apply(this.clustering,arguments)};I.prototype.getBaseEdge=function(){return this.clustering.getBaseEdge.apply(this.clustering,arguments)};I.prototype.getBaseEdges=function(){return this.clustering.getBaseEdges.apply(this.clustering,arguments)};I.prototype.updateEdge=function(){return this.clustering.updateEdge.apply(this.clustering,arguments)};I.prototype.clusterOutliers=function(){return this.clustering.clusterOutliers.apply(this.clustering,arguments)};I.prototype.getSeed=function(){return this.layoutEngine.getSeed.apply(this.layoutEngine,arguments)};I.prototype.enableEditMode=function(){return this.manipulation.enableEditMode.apply(this.manipulation,arguments)};I.prototype.disableEditMode=function(){return this.manipulation.disableEditMode.apply(this.manipulation,arguments)};I.prototype.addNodeMode=function(){return this.manipulation.addNodeMode.apply(this.manipulation,arguments)};I.prototype.editNode=function(){return this.manipulation.editNode.apply(this.manipulation,arguments)};I.prototype.editNodeMode=function(){return console.warn("Deprecated: Please use editNode instead of editNodeMode."),this.manipulation.editNode.apply(this.manipulation,arguments)};I.prototype.addEdgeMode=function(){return this.manipulation.addEdgeMode.apply(this.manipulation,arguments)};I.prototype.editEdgeMode=function(){return this.manipulation.editEdgeMode.apply(this.manipulation,arguments)};I.prototype.deleteSelected=function(){return this.manipulation.deleteSelected.apply(this.manipulation,arguments)};I.prototype.getPositions=function(){return this.nodesHandler.getPositions.apply(this.nodesHandler,arguments)};I.prototype.getPosition=function(){return this.nodesHandler.getPosition.apply(this.nodesHandler,arguments)};I.prototype.storePositions=function(){return this.nodesHandler.storePositions.apply(this.nodesHandler,arguments)};I.prototype.moveNode=function(){return this.nodesHandler.moveNode.apply(this.nodesHandler,arguments)};I.prototype.getBoundingBox=function(){return this.nodesHandler.getBoundingBox.apply(this.nodesHandler,arguments)};I.prototype.getConnectedNodes=function(n){return this.body.nodes[n]!==void 0?this.nodesHandler.getConnectedNodes.apply(this.nodesHandler,arguments):this.edgesHandler.getConnectedNodes.apply(this.edgesHandler,arguments)};I.prototype.getConnectedEdges=function(){return this.nodesHandler.getConnectedEdges.apply(this.nodesHandler,arguments)};I.prototype.startSimulation=function(){return this.physics.startSimulation.apply(this.physics,arguments)};I.prototype.stopSimulation=function(){return this.physics.stopSimulation.apply(this.physics,arguments)};I.prototype.stabilize=function(){return this.physics.stabilize.apply(this.physics,arguments)};I.prototype.getSelection=function(){return this.selectionHandler.getSelection.apply(this.selectionHandler,arguments)};I.prototype.setSelection=function(){return this.selectionHandler.setSelection.apply(this.selectionHandler,arguments)};I.prototype.getSelectedNodes=function(){return this.selectionHandler.getSelectedNodeIds.apply(this.selectionHandler,arguments)};I.prototype.getSelectedEdges=function(){return this.selectionHandler.getSelectedEdgeIds.apply(this.selectionHandler,arguments)};I.prototype.getNodeAt=function(){let n=this.selectionHandler.getNodeAt.apply(this.selectionHandler,arguments);return n!==void 0&&n.id!==void 0?n.id:n};I.prototype.getEdgeAt=function(){let n=this.selectionHandler.getEdgeAt.apply(this.selectionHandler,arguments);return n!==void 0&&n.id!==void 0?n.id:n};I.prototype.selectNodes=function(){return this.selectionHandler.selectNodes.apply(this.selectionHandler,arguments)};I.prototype.selectEdges=function(){return this.selectionHandler.selectEdges.apply(this.selectionHandler,arguments)};I.prototype.unselectAll=function(){this.selectionHandler.unselectAll.apply(this.selectionHandler,arguments),this.selectionHandler.commitWithoutEmitting.apply(this.selectionHandler),this.redraw()};I.prototype.redraw=function(){return this.renderer.redraw.apply(this.renderer,arguments)};I.prototype.getScale=function(){return this.view.getScale.apply(this.view,arguments)};I.prototype.getViewPosition=function(){return this.view.getViewPosition.apply(this.view,arguments)};I.prototype.fit=function(){return this.view.fit.apply(this.view,arguments)};I.prototype.moveTo=function(){return this.view.moveTo.apply(this.view,arguments)};I.prototype.focus=function(){return this.view.focus.apply(this.view,arguments)};I.prototype.releaseNode=function(){return this.view.releaseNode.apply(this.view,arguments)};I.prototype.getOptionsFromConfigurator=function(){let n={};return this.configurator&&(n=this.configurator.getOptions.apply(this.configurator)),n};var Ct=null,Tt=null,Dn=null,ja="image/png",Fn=null,Nn=null,Ui=new fe,Yi=new fe,Bn={interaction:{hover:!0,hoverConnectedEdges:!0,multiselect:!1},nodes:{shape:"image",brokenImage:"../../static/netbox_topology_views/img/role-unknown.png",size:35,font:{multi:"md",face:"helvetica"}},edges:{length:100,width:2,font:{face:"helvetica"},shadow:{enabled:!0}},physics:{solver:"forceAtlas2Based"}},An=null,zn=null;function Wa(n){var e=null;if(document.cookie&&document.cookie!=="")for(var t=document.cookie.split(";"),i=0;i" - if device.device_role.name is not None: - node_content += "Role: " + device.device_role.name + "" - if device.serial != "": - node_content += "Serial: " + device.serial + "" - if device.primary_ip is not None: - node_content += "IP Address: " + str(device.primary_ip.address) + "" - if device.site is not None: - node_content += "Site: " + device.site.name + "" - if device.location is not None: - node_content += "Location: " + device.location.name + "" - if device.rack is not None: - node_content += "Rack: " + device.rack.name + "" - if device.position is not None: - if device.face is not None: - node_content += "Position: {} ({}) ".format(device.position, device.face) - else: - node_content += "Position: " + device.position + "" - - dev_title = " %s
    " % (node_content) +def create_node(device, save_coords, circuit = None, powerpanel = None, powerfeed= None): node = {} - node["id"] = device.id + node_content = "" + if circuit: + dev_name = "Circuit " + str(device.cid) + node["image"] = "../../static/netbox_topology_views/img/circuit.png" + node["id"] = "c{}".format(device.id) + + if device.provider is not None: + node_content += "Provider: " + device.provider.name + "" + if device.type is not None: + node_content += "Type: " + device.type.name + "" + elif powerpanel: + dev_name = "Power Panel " + str(device.id) + node["image"] = "../../static/netbox_topology_views/img/power-panel.png" + node["id"] = "p{}".format(device.id) + + if device.site is not None: + node_content += "Site: " + device.site.name + "" + if device.location is not None: + node_content += "Location: " + device.location.name + "" + elif powerfeed: + dev_name = "Power Feed " + str(device.id) + node["image"] = "../../static/netbox_topology_views/img/power-feed.png" + node["id"] = "f{}".format(device.id) + + if device.power_panel is not None: + node_content += "Power Panel: " + device.power_panel.name + "" + if device.type is not None: + node_content += "Type: " + device.type + "" + if device.supply is not None: + node_content += "Supply: " + device.supply + "" + if device.phase is not None: + node_content += "Phase: " + device.phase + "" + if device.amperage is not None: + node_content += "Amperage: " + str(device.amperage )+ "" + if device.voltage is not None: + node_content += "Voltage: " + str(device.voltage) + "" + else: + dev_name = device.name + if dev_name is None: + dev_name = "device name unknown" + + if device.device_type is not None: + node_content += "Type: " + device.device_type.model + "" + if device.device_role.name is not None: + node_content += "Role: " + device.device_role.name + "" + if device.serial != "": + node_content += "Serial: " + device.serial + "" + if device.primary_ip is not None: + node_content += "IP Address: " + str(device.primary_ip.address) + "" + if device.site is not None: + node_content += "Site: " + device.site.name + "" + if device.location is not None: + node_content += "Location: " + device.location.name + "" + if device.rack is not None: + node_content += "Rack: " + device.rack.name + "" + if device.position is not None: + if device.face is not None: + node_content += "Position: {} ({}) ".format(device.position, device.face) + else: + node_content += "Position: " + device.position + "" + + node["id"] = device.id + + if device.device_role.slug in settings.PLUGINS_CONFIG["netbox_topology_views"]["device_img"]: + node["image"] = "../../static/netbox_topology_views/img/" + device.device_role.slug + ".png" + else: + node["image"] = "../../static/netbox_topology_views/img/role-unknown.png" + + if device.device_role.color != "": + node["color.border"] = "#" + device.device_role.color + + dev_title = " %s
    " % (node_content) + + node["title"] = dev_title node["name"] = dev_name node["label"] = dev_name - node["title"] = dev_title node["shape"] = "image" - if device.device_role.slug in settings.PLUGINS_CONFIG["netbox_topology_views"]["device_img"]: - node["image"] = "../../static/netbox_topology_views/img/" + device.device_role.slug + ".png" - else: - node["image"] = "../../static/netbox_topology_views/img/role-unknown.png" - - if device.device_role.color != "": - node["color.border"] = "#" + device.device_role.color - - node["physics"] = True + node["physics"] = True if "coordinates" in device.custom_field_data: if device.custom_field_data["coordinates"] is not None: if ";" in device.custom_field_data["coordinates"]: @@ -75,191 +117,202 @@ def create_node(device, save_coords): node["physics"] = True return node -def create_edge(edge_id, cable, termination_a, termination_b, path = None, circuit = None): - cable_a_dev_name = "device A name unknown" if termination_a.device.name is None else termination_a.device.name - cable_a_name = "device A name unknown" if termination_a.name is None else termination_a.name - cable_b_dev_name = "device A name unknown" if termination_b.device.name is None else termination_b.device.name - cable_b_name = "cable B name unknown" if termination_b.name is None else termination_b.name +def create_edge(edge_id, termination_a, termination_b, circuit = None, cable = None, wireless = None, power=None): + cable_a_name = "device A name unknown" if termination_a["termination_name"] is None else termination_a["termination_name"] + cable_a_dev_name = "device A name unknown" if termination_a["termination_device_name"] is None else termination_a["termination_device_name"] + cable_b_name= "device A name unknown" if termination_b["termination_name"] is None else termination_b["termination_name"] + cable_b_dev_name = "cable B name unknown" if termination_b["termination_device_name"] is None else termination_b["termination_device_name"] edge = {} edge["id"] = edge_id - edge["from"] = termination_a.device.id - edge["to"] = termination_b.device.id + edge["from"] = termination_a["device_id"] + edge["to"] = termination_b["device_id"] if circuit is not None: edge["dashes"] = True - edge["title"] = "Circuit provider: " + circuit.provider.name + "
    " + edge["title"] = "Circuit provider: " + circuit["provider_name"] + "
    " edge["title"] += "Termination between
    " edge["title"] += cable_b_dev_name + " [" + cable_b_name + "]
    " edge["title"] += cable_a_dev_name + " [" + cable_a_name + "]" + elif wireless is not None: + edge["dashes"] = [2, 10, 2, 10] + edge["title"] = "Wireless Connection between
    " + cable_a_dev_name + " [" + cable_a_name + "]
    " + cable_b_dev_name + " [" + cable_b_name + "]" + elif power is not None: + edge["dashes"] = [5, 5, 3, 3] + edge["title"] = "Power Connection between
    " + cable_a_dev_name + " [" + cable_a_name + "]
    " + cable_b_dev_name + " [" + cable_b_name + "]" else: edge["title"] = "Cable between
    " + cable_a_dev_name + " [" + cable_a_name + "]
    " + cable_b_dev_name + " [" + cable_b_name + "]" - if path is not None: - edge["title"] += "" if len(path) <= 0 else "
    Through " + "/".join(path) - if cable is not None and cable.color != "": edge["color"] = "#" + cable.color return edge -def get_topology_data(queryset, hide_unconnected, save_coords, intermediate_dev_role_ids, end2end_connections): +def create_circuit_termination(termination): + if isinstance(termination, CircuitTermination): + return { "termination_name": termination.circuit.provider.name, "termination_device_name": termination.circuit.cid, "device_id": "c{}".format(termination.circuit.id) } + if isinstance(termination, Interface) or isinstance(termination, FrontPort) or isinstance(termination, RearPort): + return { "termination_name": termination.name, "termination_device_name": termination.device.name, "device_id": termination.device.id } + return None + +def get_topology_data(queryset, hide_unconnected, save_coords, show_circuit, show_power): nodes_devices = {} edges = [] + nodes = [] edge_ids = 0 - cable_ids = [] - circuit_ids = [] + nodes_circuits = {} + nodes_powerpanel = {} + nodes_powerfeed = {} + nodes_provider_networks = {} + cable_ids = {} if not queryset: return None ignore_cable_type = settings.PLUGINS_CONFIG["netbox_topology_views"]["ignore_cable_type"] - enable_circuit_terminations = settings.PLUGINS_CONFIG["netbox_topology_views"]["enable_circuit_terminations"] device_ids = [d.id for d in queryset] - links = Cable.objects.filter( Q(_termination_a_device_id__in=device_ids) | Q(_termination_b_device_id__in=device_ids) ) \ - .select_related("termination_a_type", "termination_b_type") \ - .prefetch_related("termination_a", "termination_b") + if show_circuit: + site_ids = [d.site.id for d in queryset] + circuits = CircuitTermination.objects.filter( Q(site_id__in=site_ids) | Q( provider_network__isnull=False) ).prefetch_related("provider_network", "circuit") + for circuit in circuits: + if not hide_unconnected and circuit.circuit.id not in nodes_circuits: + nodes_circuits[circuit.circuit.id] = circuit.circuit + + termination_a = {} + termination_b = {} + circuit_model = {} + if circuit.cable is not None: + termination_a = create_circuit_termination(circuit.cable.a_terminations[0]) + termination_b = create_circuit_termination(circuit.cable.b_terminations[0]) + elif circuit.provider_network is not None: + if circuit.provider_network.id not in nodes_provider_networks: + nodes_provider_networks[circuit.provider_network.id] = circuit.provider_network + + if bool(termination_a) and bool(termination_b): + circuit_model = {"provider_name": circuit.circuit.provider.name} + edge_ids += 1 + edges.append(create_edge(edge_id=edge_ids,circuit=circuit_model, termination_a=termination_a, termination_b=termination_b)) + + circuit_has_connections = False + for termination in [circuit.cable.a_terminations[0], circuit.cable.b_terminations[0]]: + if not isinstance(termination, CircuitTermination): + if termination.device.id not in nodes_devices and termination.device.id in device_ids: + nodes_devices[termination.device.id] = termination.device + circuit_has_connections = True + else: + if termination.device.id in device_ids: + circuit_has_connections = True + + if circuit_has_connections and hide_unconnected: + if circuit.circuit.id not in nodes_circuits: + nodes_circuits[circuit.circuit.id] = circuit.circuit + + + for d in nodes_circuits.values(): + nodes.append(create_node(d, save_coords, circuit=True)) + + links = CableTermination.objects.filter( Q(_device_id__in=device_ids) ).select_related("termination_type") + wlan_links = WirelessLink.objects.filter( Q(_interface_a_device_id__in=device_ids) & Q(_interface_b_device_id__in=device_ids)) + + if show_power: + power_panels = PowerPanel.objects.filter( Q (site_id__in=site_ids)) + power_panels_ids = [d.id for d in power_panels] + power_feeds = PowerFeed.objects.filter( Q (power_panel_id__in=power_panels_ids)) + + for power_feed in power_feeds: + if not hide_unconnected or (hide_unconnected and power_feed.cable_id is not None): + if power_feed.power_panel.id not in nodes_powerpanel: + nodes_powerpanel[power_feed.power_panel.id] = power_feed.power_panel + + if power_feed.id not in nodes_powerfeed: + if hide_unconnected: + if power_feed.link_peers[0].device.id in device_ids: + nodes_powerfeed[power_feed.id] = power_feed + else: + nodes_powerfeed[power_feed.id] = power_feed + + edge_ids += 1 + termination_a = { "termination_name": power_feed.power_panel.name, "termination_device_name": str(power_feed.power_panel.id), "device_id": "p{}".format(power_feed.power_panel.id) } + termination_b = { "termination_name": power_feed.name, "termination_device_name": str(termination.id), "device_id": "f{}".format(power_feed.id) } + edges.append(create_edge(edge_id=edge_ids, termination_a=termination_a, termination_b=termination_b, power=True)) + + if power_feed.cable_id is not None: + if power_feed.cable.id not in cable_ids: + cable_ids[power_feed.cable.id] = {} + cable_ids[power_feed.cable.id][power_feed.cable_end] = termination_b + + + for d in nodes_powerfeed.values(): + nodes.append(create_node(d, save_coords, powerfeed = True)) + + for d in nodes_powerpanel.values(): + nodes.append(create_node(d, save_coords, powerpanel = True)) for link in links: - - if link.termination_a_type.name in ignore_cable_type or link.termination_b_type.name in ignore_cable_type \ - or link.id in cable_ids: + if link.termination_type.name in ignore_cable_type : continue - a_is_path_endoint = isinstance(link.termination_a, PathEndpoint) - b_is_path_endoint = isinstance(link.termination_b, PathEndpoint) - - if not end2end_connections or (not a_is_path_endoint and not b_is_path_endoint): - - if isinstance(link.termination_a, CircuitTermination): - if enable_circuit_terminations and link.termination_a.circuit.id not in circuit_ids: - circuit = link.termination_a.circuit - circuit_ids.append(circuit.id) - cable_ids.append(link.id) - - path_destination = circuit.termination_z if link.termination_a.term_side == "A" else circuit.termination_a - - if path_destination is not None and path_destination.provider_network is None: - # ProviderNetwork not supported at the moment - # $path_destination.cable would be none : there is no cable between a CircuitTermination and ProviderNetwork - - if not hasattr(link.termination_b, 'device'): - #CircuitTermination B Missing Device - continue - - origin_device = link.termination_b.device - destination_device = path_destination.cable.termination_b.device - - if origin_device.id in device_ids and destination_device.id in device_ids: - if origin_device.id not in nodes_devices: - nodes_devices[origin_device.id] = origin_device - if destination_device.id not in nodes_devices: - nodes_devices[destination_device.id] = destination_device - - edge_ids += 1 - edges.append(create_edge(edge_ids, link, link.termination_b, path_destination.cable.termination_b, [circuit.cid], circuit)) - - elif link.termination_a.device.id in device_ids and link.termination_b.device.id in device_ids: - - if link.termination_a.device.id not in nodes_devices: - nodes_devices[link.termination_a.device.id] = link.termination_a.device - if link.termination_b.device.id not in nodes_devices: - nodes_devices[link.termination_b.device.id] = link.termination_b.device - - cable_ids.append(link.id) - edge_ids += 1 - edges.append(create_edge(edge_ids, link, link.termination_a, link.termination_b)) - else: - # termination_a can be a CircuitTermination (no trace()) while termination_b is a PathEndpoint - # If so, we swap them so we can follow the path using PathEndpoint#trace() - path_start = link.termination_a if a_is_path_endoint else link.termination_b - if path_start.device is not None and path_start.device.id not in device_ids: - # device not in queryset, skip - continue - - # Ignore incomplete path when in end-to-end connection mode - if path_start.path is not None: - if not path_start.path.is_active or path_start.path.is_split: - continue + #Normal device cables + if link.termination_type.name in supported_termination_types: + complete_link = False + if link.cable_end == "A": + if link.cable.id not in cable_ids: + cable_ids[link.cable.id] = {} + else: + if cable_ids[link.cable.id]['B'] is not None: + complete_link = True + elif link.cable_end == "B": + if link.cable.id not in cable_ids: + cable_ids[link.cable.id] = {} + else: + if cable_ids[link.cable.id]['A'] is not None: + complete_link = True else: - continue + print("Unkown cable end") + cable_ids[link.cable.id][link.cable_end] = link - path_destination = path_start.path.destination - if hasattr(path_destination, "device") and path_destination.device is not None and path_destination.device.id not in device_ids: - # device not in queryset, skip - continue + if complete_link: + edge_ids += 1 + if isinstance(cable_ids[link.cable.id]["B"], CableTermination): + if cable_ids[link.cable.id]["B"]._device_id not in nodes_devices: + nodes_devices[cable_ids[link.cable.id]["B"]._device_id] = cable_ids[link.cable.id]["B"].termination.device + termination_b = { "termination_name": cable_ids[link.cable.id]["B"].termination.name, "termination_device_name": cable_ids[link.cable.id]["B"].termination.device.name, "device_id": cable_ids[link.cable.id]["B"].termination.device.id } + else: + termination_b = cable_ids[link.cable.id]["B"] - valid_path = False + if isinstance(cable_ids[link.cable.id]["A"], CableTermination): + if cable_ids[link.cable.id]["A"]._device_id not in nodes_devices: + nodes_devices[cable_ids[link.cable.id]["A"]._device_id] = cable_ids[link.cable.id]["A"].termination.device + termination_a = { "termination_name": cable_ids[link.cable.id]["A"].termination.name, "termination_device_name": cable_ids[link.cable.id]["A"].termination.device.name, "device_id": cable_ids[link.cable.id]["A"].termination.device.id } + else: + termination_a = cable_ids[link.cable.id]["A"] + + edges.append(create_edge(edge_id=edge_ids, cable=link.cable, termination_a=termination_a, termination_b=termination_b)) + + for wlan_link in wlan_links: + if wlan_link.interface_a.device.id not in nodes_devices: + nodes_devices[wlan_link.interface_a.device.id] = wlan_link.interface_a.device + if wlan_link.interface_b.device.id not in nodes_devices: + nodes_devices[wlan_link.interface_b.device.id] = wlan_link.interface_b.device + + termination_a = {"termination_name": wlan_link.interface_a.name, "termination_device_name": wlan_link.interface_a.device.name, "device_id": wlan_link.interface_a.device.id} + termination_b = {"termination_name": wlan_link.interface_b.name, "termination_device_name": wlan_link.interface_b.device.name, "device_id": wlan_link.interface_b.device.id} + wireless = {"ssid": wlan_link.ssid } - # variables needed for trace() browsing - origin = None - circuit = None - tmp_path = [] + edge_ids += 1 + edges.append(create_edge(edge_id=edge_ids, termination_a=termination_a, termination_b=termination_b,wireless=wireless)) - # trace() : Return the path as a list of three-tuples (A termination, cable, B termination) - # TODO device qui ne s"affichent pas si hide_unconnected - for (termination_a, cable, termination_b) in path_start.trace(): - - if origin is None: - # New part of the link - origin = termination_a - circuit = None - tmp_path = [] - - if isinstance(termination_b, ProviderNetwork): - # ProviderNetwork not supported at the moment - # It would need to manage several kind of nodes (Device, ProviderNetwork) - # and maps javascript nodes ID with Devices IDs and ProviderNetworks IDs - # When $termination_b is a ProviderNetwork instance, $cable will be None - break - - if cable is not None and (cable.termination_a_type in ignore_cable_type or cable.termination_b_type in ignore_cable_type): - # Ignore this path - break - - if isinstance(termination_b, CircuitTermination): - if enable_circuit_terminations: - circuit = termination_b.circuit - tmp_path.append(circuit.cid) - if circuit.id not in circuit_ids: - circuit_ids.append(circuit.id) - else: - # Ignore this path - break - elif end2end_connections and termination_b != path_destination \ - and termination_b.device.device_role.id not in intermediate_dev_role_ids \ - and termination_b.device.id not in device_ids: - # Skip this intermediate device, origin device is keep in $origin for next iteration - tmp_path.append(termination_b.device.name) - elif cable is not None and termination_b is not None: - if cable.id not in cable_ids: - # New part of the link we want to display - cable_ids.append(cable.id) - edge_ids += 1 - edges.append(create_edge(edge_ids, cable, origin, termination_b, tmp_path, circuit)) - - if not valid_path: - valid_path = True - - if termination_b.device.id not in nodes_devices and \ - (termination_b.device.device_role.id in intermediate_dev_role_ids or termination_b.device.id in device_ids) : - nodes_devices[termination_b.device.id] = termination_b.device - # Reset for next iteration - origin = None - # endfor (trace) - - if valid_path and path_start.device.id not in nodes_devices: - nodes_devices[path_start.device.id] = path_start.device - - # endfor (link) - for qs_device in queryset: if qs_device.id not in nodes_devices and not hide_unconnected: nodes_devices[qs_device.id] = qs_device results = {} - results["nodes"] = [create_node(d, save_coords) for d in nodes_devices.values()] + + for d in nodes_devices.values(): + nodes.append(create_node(d, save_coords)) + + results["nodes"] = nodes results["edges"] = edges return results @@ -286,34 +339,31 @@ class TopologyHomeView(PermissionRequiredMixin, View): if request.GET["hide_unconnected"] == "on" : hide_unconnected = True - if "intermediate_dev_role_id" in request.GET: - intermediate_dev_role_ids = list(map(int, request.GET.getlist("intermediate_dev_role_id"))) - else: - intermediate_dev_role_ids = [] + show_power = False + if "show_power" in request.GET: + if request.GET["show_power"] == "on" : + show_power = True + + show_circuit = False + if "show_circuit" in request.GET: + if request.GET["show_circuit"] == "on" : + show_circuit = True - end2end_connections = False - if "end2end_connections" in request.GET: - if request.GET["end2end_connections"] == "on" : - end2end_connections = True - if "draw_init" in request.GET: if request.GET["draw_init"].lower() == "true": - topo_data = get_topology_data(self.queryset, hide_unconnected, save_coords, intermediate_dev_role_ids, end2end_connections) + topo_data = get_topology_data(self.queryset, hide_unconnected, save_coords, show_circuit, show_power) else: - topo_data = get_topology_data(self.queryset, hide_unconnected, save_coords, intermediate_dev_role_ids, end2end_connections) + topo_data = get_topology_data(self.queryset, hide_unconnected, save_coords, show_circuit, show_power) else: preselected_device_roles = settings.PLUGINS_CONFIG["netbox_topology_views"]["preselected_device_roles"] - preselected_intermediate_dev_roles = settings.PLUGINS_CONFIG["netbox_topology_views"]["preselected_intermediate_dev_roles"] preselected_tags = settings.PLUGINS_CONFIG["netbox_topology_views"]["preselected_tags"] always_save_coordinates = bool(settings.PLUGINS_CONFIG["netbox_topology_views"]["always_save_coordinates"]) q_device_role_id = DeviceRole.objects.filter(name__in=preselected_device_roles).values_list("id", flat=True) - q_intermediate_dev_role_id = DeviceRole.objects.filter(name__in=preselected_intermediate_dev_roles).values_list("id", flat=True) q_tags = Tag.objects.filter(name__in=preselected_tags).values_list("name", flat=True) q = QueryDict(mutable=True) q.setlist("device_role_id", list(q_device_role_id)) - q.setlist("intermediate_dev_role_id", list(q_intermediate_dev_role_id)) q.setlist("tag", list(q_tags)) q["draw_init"] = settings.PLUGINS_CONFIG["netbox_topology_views"]["draw_default_layout"] if always_save_coordinates: