@antv/layout 1.0.0-alpha.13 → 1.0.0-alpha.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,8 +1,8 @@
1
- ## About
1
+ # @antv/layout
2
2
 
3
- Collection of basic layout algorithms to be used with [@antv/graphlib]().
3
+ Collection of basic layout algorithms to be used with [@antv/graphlib](https://www.npmjs.com/package/@antv/graphlib).
4
4
 
5
- [Living Demo](https://observablehq.com/d/2db6b0cc5e97d8d6)
5
+ [Online Demo](https://observablehq.com/d/2db6b0cc5e97d8d6)
6
6
 
7
7
  ## Usage
8
8
 
@@ -59,9 +59,25 @@ const { CircularLayout } = window.Layout;
59
59
 
60
60
  ## Documentation
61
61
 
62
- - [G6 Layout](https://g6.antv.vision/zh/docs/api/graphLayout/guide)
62
+ We provide the following layouts:
63
63
 
64
- Layout algorithms can be divided into two categories, the first is synchronous, e.g. circular layout
64
+ - [Circular](#Circular)
65
+ - [Random](#Random)
66
+ - [Grid](#Grid)
67
+ - [MDS](#MDS)
68
+ - [Concentric](#Concentric)
69
+ - [Radial](#Radial)
70
+ - [Fruchterman](#Fruchterman)
71
+ - [D3Force](#D3Force)
72
+ - [Force](#Force)
73
+ - [ForceAtlas2](#ForceAtlas2)
74
+
75
+ You can choose the following two ways to use, the difference is whether to change the node & edge data in the graph model:
76
+
77
+ - Calling execute to return positions of nodes & edges.
78
+ - Or calling assign to directly assign the positions to the nodes in graph model.
79
+
80
+ The first argument is the target `graph` whose type is **Graph**.
65
81
 
66
82
  ### Circular
67
83
 
@@ -71,29 +87,209 @@ Circular layout arranges the node on a circle. By tuning the configurations, use
71
87
  <img src="https://gw.alipayobjects.com/mdn/rms_f8c6a0/afts/img/A*_nLORItzM5QAAAAAAAAAAABkARQnAQ" alt="circular layout" width="300">
72
88
  <img src="https://gw.alipayobjects.com/mdn/rms_f8c6a0/afts/img/A*6J6BRIjmXKAAAAAAAAAAAABkARQnAQ" alt="circular layout" width="300">
73
89
 
74
- Arguments
90
+ [Online Demo](https://observablehq.com/d/2db6b0cc5e97d8d6#cell-38)
91
+
92
+ LayoutOptions:
93
+
94
+ - `center` **[number, number]** The center of the graph. e.g. `[0, 0]`
95
+ - `radius` **number** The radius of the circle. If the raidus exists, startRadius and endRadius do not take effect.
96
+ - `startRadius` **number** The start radius of spiral layout. The default value is `null`.
97
+ - `endRadius` **number** The end radius of spiral layout. The default value is `null`.
98
+ - `clockwise` **boolean** Whether to layout clockwisely. The default value is `true`.
99
+ - `divisions` **number** The division number of the nodes on the circle. Takes effect when `endRadius - startRadius !== 0`. The default value is `1`.
100
+ - `ordering` **null | 'topology' | 'degree'** The ordering method for nodes. `null` by default, which means the nodes are arranged in data order. `'topology'` means in topology order; `'degree'` means in degree order.
101
+ - `angleRatio` **number** How many `2*PI`s Between the first node and the last node. The default value is `1`.
102
+
103
+ ### Random
104
+
105
+ <img src="https://gw.alipayobjects.com/mdn/rms_f8c6a0/afts/img/A*G5_uRodUTaYAAAAAAAAAAABkARQnAQ" alt="random layout" width="300">
106
+
107
+ [Online Demo](https://observablehq.com/d/2db6b0cc5e97d8d6#cell-226)
108
+
109
+ LayoutOptions:
110
+
111
+ - `center` **[number, number]** The center of the graph. e.g. `[0, 0]`
112
+ - `width` **number** The width of the graph.
113
+ - `height` **number** The height of the graph.
114
+
115
+ ### Grid
116
+
117
+ Grid orders the nodes according to the configurations and arranged them onto grid.
118
+
119
+ <img src="https://gw.alipayobjects.com/mdn/rms_f8c6a0/afts/img/A*Oh6mRLVEBBIAAAAAAAAAAABkARQnAQ" alt="grid layout" width="300">
120
+
121
+ [Online Demo](https://observablehq.com/d/2db6b0cc5e97d8d6#cell-438)
122
+
123
+ LayoutOptions:
124
+
125
+ - `center` **[number, number]** The center of the graph. e.g. `[0, 0]`
126
+ - `width` **number** The width of the graph.
127
+ - `height` **number** The height of the graph.
128
+ - `rows` **number** The row number of the grid. If `rows` and `cols` is not provided, the algorithm will calculate it according to the space and node numbers automatically.
129
+ - `cols` **number** The col number of the grid.
130
+ - `condense` **boolean** Wheter to utilize the minimum space of the canvas. `false` means utilizing the full space, `true` means utilizing the minimum space.
131
+ - `preventOverlap` **boolean** Whether to prevent node overlappings. To activate preventing node overlappings, nodeSize is required, which is used for collide detection. The size in the node data will take effect if nodeSize is not assigned. If the size in node data does not exist either, nodeSize is assigned to 30 by default.
132
+ - `nodeSize` **number** The diameter of the node. It is used for preventing node overlappings.
133
+ - `preventOverlapPadding` **boolean** The minimum padding between nodes to prevent node overlappings. Takes effect when preventOverlap is true.
134
+ - `sortBy` **string** The ordering method for nodes. Smaller the index in the ordered array, more center the node will be placed. If sortBy is `undefined`, the algorithm order the nodes according to their degrees.
135
+
136
+ ### MDS
137
+
138
+ MDS (Multidimensional scaling) is used for project high dimensional data onto low dimensional space.
139
+
140
+ <img src="https://gw.alipayobjects.com/mdn/rms_f8c6a0/afts/img/A*aUS7TJR2NHcAAAAAAAAAAABkARQnAQ" alt="MDS layout" width="300">
141
+
142
+ [Online Demo](https://observablehq.com/d/2db6b0cc5e97d8d6#cell-557)
143
+
144
+ LayoutOptions:
145
+
146
+ - `center` **[number, number]** The center of the graph. e.g. `[0, 0]`
147
+ - `linkDistance` **number** The edge length. The default value is `50`.
148
+
149
+ ### Concentric
150
+
151
+ Concentric arranges the nodes on several concentric circles. Each node is sorted by degree by default. The greater the degree of a node, the closer it is to the center point.
152
+
153
+ <img src="https://gw.alipayobjects.com/mdn/rms_f8c6a0/afts/img/A*QpyPTbBpO2AAAAAAAAAAAABkARQnAQ" alt="concentric layout" width="300">
154
+
155
+ [Online Demo](https://observablehq.com/d/2db6b0cc5e97d8d6#cell-596)
156
+
157
+ LayoutOptions:
158
+
159
+ - `center` **[number, number]** The center of the graph. e.g. `[0, 0]`
160
+ - `width` **number** The width of the graph.
161
+ - `height` **number** The height of the graph.
162
+ - `maxLevelDiff` **number** The sum of concentric values in each level. If it is `undefined`, `maxValue / 4` will take place, where maxValue is the max value of ordering properties. For example, if sortBy is `'degree'`, maxValue is the max degree value of all the nodes.
163
+ - `nodeSize` **number** The diameter of the node. It is used for preventing node overlappings. The default value is `30`.
164
+ - `minNodeSpacing` **number** The minimum separation between adjacent nodes. The default value is `10`.
165
+ - `clockwise` **boolean** Place the nodes in clockwise or not. The default value is `true`.
166
+ - `startAngle` **number** Where nodes start in radians. The default value is `(3 / 2) * Math.PI`.
167
+ - `equidistant` **boolean** Whether levels have an equal radial distance between them, may cause bounding box overflow. The default value is `false`.
168
+
169
+ ### Radial
170
+
171
+ Radial layout arranges the nodes to concentrics centered at a focus node according to their shortest path length to the focus node. We implements it according to the paper: [More Flexible Radial Layout](http://emis.ams.org/journals/JGAA/accepted/2011/BrandesPich2011.15.1.pdf).
75
172
 
76
- - `graph` **Graph**: target graph.
77
- - `options?` **LayoutOptions**.
78
- - `center` **[number, number]** The center of the graph. e.g. `[0, 0]`
79
- - `radius` **number** The radius of the circle. If the raidus exists, startRadius and endRadius do not take effect.
80
- - `startRadius` **number** The start radius of spiral layout. The default value is `null`.
81
- - `endRadius` **number** The end radius of spiral layout. The default value is `null`.
82
- - `clockwise` **boolean** Whether to layout clockwisely. The default value is `true`.
83
- - `divisions` **number** The division number of the nodes on the circle. Takes effect when `endRadius - startRadius !== 0`. The default value is `1`.
84
- - `ordering` **null | 'topology' | 'degree'** The ordering method for nodes. `null` by default, which means the nodes are arranged in data order. `'topology'` means in topology order; `'degree'` means in degree order.
85
- - `angleRatio` **number** How many `2*PI`s Between the first node and the last node. The default value is `1`.
173
+ <img src="https://gw.alipayobjects.com/mdn/rms_f8c6a0/afts/img/A*GAFjRJeAoAsAAAAAAAAAAABkARQnAQ" alt="radial layout" width="300">
174
+
175
+ [Online Demo](https://observablehq.com/d/2db6b0cc5e97d8d6#cell-874)
176
+
177
+ LayoutOptions:
178
+
179
+ - `center` **[number, number]** The center of the graph. e.g. `[0, 0]`
180
+ - `width` **number** The width of the graph.
181
+ - `height` **number** The height of the graph.
182
+ - `linkDistance` **number** The edge length. The default value is `50`.
183
+ - `focusNode` **string** The focus node of the radial layout. The first node of the data is the default value. It can be the id of a node or the node item.
184
+ - `unitRadius` **number** The separation between adjacent circles. If not provided, the layout will fill the canvas automatically.
185
+ - `preventOverlap` **boolean** Whether to prevent node overlappings. To activate preventing node overlappings, nodeSize is required, which is used for collide detection. The size in the node data will take effect if nodeSize is not assigned. If the size in node data does not exist either, nodeSize is assigned to 30 by default.
186
+ - `nodeSize` **number** The diameter of the node. It is used for preventing node overlappings.
187
+ - `preventOverlapPadding` **boolean** The minimum padding between nodes to prevent node overlappings. Takes effect when preventOverlap is true.
188
+ - `nodeSpacing` **number** It is the minimum distance between nodes to prevent node overlappings.
189
+ - `strictRadial` **boolean** Whether to layout the graph as strict radial, which means the nodes will be arranged on each circle strictly. Takes effect only when preventOverlap is true.
190
+ - `true` The overlapped nodes can be arranged around their circle with small offsets.
191
+ - `false` The overlapped nodes are arranged along their circles strictly. But for the situation that there are too many nodes on a circle to be arranged, the overlappings might not be eliminated completely.
192
+ - `sortBy` **string** Sort the nodes of the same level. undefined by default, which means place the nodes with connections as close as possible; 'data' means place the node according to the ordering in data, the closer the nodes in data ordering, the closer the nodes will be placed. sortBy also can be assigned to any name of property in nodes data, such as 'cluster', 'name' and so on (make sure the property exists in the data)
193
+ - `sortStrength` **number** The strength to sort the nodes in the same circle. Larger number means place the nodes with smaller distance of sortBy more closely. Takes effect only when sortBy is not undefined.
194
+
195
+ ### Fruchterman
196
+
197
+ Fruchterman is a kind of force-directed layout. The implementation is according to the paper [Graph Drawing by Force-directed Placement](http://www.mathe2.uni-bayreuth.de/axel/papers/reingold:graph_drawing_by_force_directed_placement.pdf).
198
+
199
+ <img src="https://gw.alipayobjects.com/mdn/rms_f8c6a0/afts/img/A*jK3ITYqVJnQAAAAAAAAAAABkARQnAQ" alt="fruchterman layout" width="300">
200
+
201
+ [Online Demo](https://observablehq.com/d/2db6b0cc5e97d8d6#cell-1058)
202
+
203
+ LayoutOptions:
204
+
205
+ - `center` **[number, number]** The center of the graph. e.g. `[0, 0]`
206
+ - `width` **number** The width of the graph.
207
+ - `height` **number** The height of the graph.
208
+ - `maxIteration` **number**
209
+ - `gravity` **number** The gravity, which will affect the compactness of the layout. The default value is `10`.
210
+ - `speed` **number** The moving speed of each iteraction. Large value of the speed might lead to violent swing.
211
+ - `clustering` **boolean** We can also layout according to `nodeClusterBy` field in data when enable clustering.
212
+ - `clusterGravity` The gravity of each cluster, which will affect the compactness of each cluster. The default value is `10`.
213
+
214
+ ### D3Force
215
+
216
+ Force is the classical force-dicrected layout algorithm, which corresponds to force-directed layout in d3.js.
217
+
218
+ <img src="https://gw.alipayobjects.com/mdn/rms_f8c6a0/afts/img/A*Nt45Q6nnK2wAAAAAAAAAAABkARQnAQ" alt="d3force layout" width="300">
219
+
220
+ [Online Demo](https://observablehq.com/d/2db6b0cc5e97d8d6#cell-791)
221
+
222
+ LayoutOptions:
223
+
224
+ - `center` **[number, number]** The center of the graph. e.g. `[0, 0]`
225
+ - `linkDistance` **number** The edge length. The default length is `50`.
226
+ - `nodeStrength` **number** The strength of node force. Positive value means attractive force, negative value means repulsive force.
227
+ - `edgeStrength` **number** The strength of edge force, ranges from 0 to 1. Calculated according to the degree of nodes by default.
228
+ - `preventOverlap` **boolean**
229
+ - `collideStrength` **number** The strength of force for preventing node overlappings. The range is `[0, 1]`.
230
+ - `nodeSize` **number** The diameter of the node. It is used for preventing node overlappings. If nodeSize is not assigned, the size property in node data will take effect. If the size in node data does not exist either, nodeSize is assigned to `10` by default.
231
+ - `nodeSpacing` **number** The minimum space between two nodes when preventOverlap is true. The default value is `0`.
232
+
233
+ ### Force
234
+
235
+ Force2 implements the force-directed layout algorithm. It comes from graphin-force, supports assign different masses and center gravities for different nodes freedomly. Comparing to graphin-force, the performance is improved greatly.
236
+
237
+ <img src="https://gw.alipayobjects.com/mdn/rms_f8c6a0/afts/img/A*lX-qSqDECrIAAAAAAAAAAAAAARQnAQ" alt="force layout" width="300">
238
+
239
+ [Online Demo](https://observablehq.com/d/2db6b0cc5e97d8d6#cell-1402)
240
+
241
+ LayoutOptions:
242
+
243
+ - `center` **[number, number]** The center of the graph. e.g. `[0, 0]`.
244
+ - `linkDistance` **number** The edge length. The default length is `200`.
245
+ - `nodeStrength` **number** The strength of node force. Positive value means repulsive force, negative value means attractive force (it is different from 'force'). The default value is `1000`.
246
+ - `edgeStrength` **number** The strength of edge force. Calculated according to the degree of nodes by default. The default value is `200`.
247
+ - `preventOverlap` **boolean**
248
+ - `nodeSize` **number** The diameter of the node. It is used for preventing node overlappings. If nodeSize is not assigned, the size property in node data will take effect. If the size in node data does not exist either, nodeSize is assigned to `10` by default.
249
+ - `nodeSpacing` **number** The minimum space between two nodes when preventOverlap is true. The default value is `0`.
250
+ - `minMovement` **number** When the average/minimum/maximum (according to `distanceThresholdMode`) movement of nodes in one iteration is smaller than minMovement, terminate the layout.
251
+ - `distanceThresholdMode` **'mean' | 'max' | 'min'** The condition to judge with minMovement, `'mean'` means the layout stops while the nodes' average movement is smaller than minMovement, `'max' / 'min'` means the layout stops while the nodes' maximum/minimum movement is smaller than minMovement. `'mean'` by default
252
+ - `damping` **number** Range [0, 1], affect the speed of decreasing node moving speed. Large the number, slower the decreasing. The default value is `0.9`.
253
+ - `interval` **number** Controls the speed of the nodes' movement in each iteration. The default value is `0.02`.
254
+ - `maxSpeed` **number** The max speed in each iteration. The default value is `1000`.
255
+ - `force` **number** Coefficient for the repulsive force. Larger the number, larger the repulsive force.
256
+ - `coulombDisScale` **number** A parameter for repulsive force between nodes. Large the number, larger the repulsion. The default value is `0.005`.
257
+ - `gravity` **number** The gravity strength to the center for all the nodes. Larger the number, more compact the nodes. The default value is `10`.
258
+
259
+ ### ForceAtlas2
260
+
261
+ FA2 is a kind of force directed layout, which performs better on the convergence and compactness.
262
+
263
+ <img src="https://gw.alipayobjects.com/mdn/rms_f8c6a0/afts/img/A*MqwAQZLIVPwAAAAAAAAAAAAAARQnAQ" alt="forceAtlas2 layout" width="300">
264
+
265
+ [Online Demo](https://observablehq.com/d/2db6b0cc5e97d8d6#cell-1542)
266
+
267
+ LayoutOptions:
268
+
269
+ - `center` **[number, number]** The center of the graph. e.g. `[0, 0]`.
270
+ - `kr` **number** Repulsive parameter, smaller the kr, more compact the graph. The default value is `5`.
271
+ - `kg` **number** The parameter for the gravity. Larger kg, the graph will be more compact to the center. The default value is `5`.
272
+ - `ks` **number** The moving speed of the nodes during iterations. The default value is `0.1`.
273
+ - `tao` **number** The threshold of the swinging. The default value is `0.1`.
274
+ - `preventOverlap` **boolean**
275
+ - `dissuadeHubs` **boolean** Wheather to enable hub mode. If it is `true`, the nodes with larger in-degree will be placed on the center in higher priority.
276
+ - `barnesHut` **boolean** Whether to enable the barnes hut speedup, which is the quad-tree optimization. Due to the computation for quad-tree re-build in each iteration, we sugguest to enable it in large graph. It is `undefined` by deafult, when the number of nodes is larger than 250, it will be activated automatically. If it is set to be `false`, it will not be activated anyway.
86
277
 
87
278
  ### Supervisor
88
279
 
280
+ Sometimes we need to execute CPU-intensive algorithms in WebWorker so as not to block the main thread. For this we encapsulate a class called Supervisor. It accepts a graph model and layout algorithm as parameters, completes the creation and communication of WebWorker internally, and notifies the main thread through events after the calculation is completed.
281
+
89
282
  ```js
90
283
  const graph = new Graph();
91
284
  const layout = new CircularLayout();
92
285
 
93
- const supervisor = new Supervisor(graph, layout, { auto: true });
286
+ const supervisor = new Supervisor(graph, layout);
287
+ supervisor.on("layoutend", (positions) => {});
94
288
  supervisor.start();
95
289
  ```
96
290
 
291
+ [Online Demo](https://observablehq.com/d/2db6b0cc5e97d8d6#cell-199)
292
+
97
293
  ## License
98
294
 
99
295
  The scripts and documentation in this project are released under the [MIT License](LICENSE).
@@ -0,0 +1,2 @@
1
+ (()=>{"use strict";var t={d:(e,r)=>{for(var n in r)t.o(r,n)&&!t.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:r[n]})},o:(t,e)=>Object.prototype.hasOwnProperty.call(t,e)},e={};t.d(e,{calculateLayout:()=>Ge,stopLayout:()=>$e});var r=function(){return r=Object.assign||function(t){for(var e,r=1,n=arguments.length;r<n;r++)for(var o in e=arguments[r])Object.prototype.hasOwnProperty.call(e,o)&&(t[o]=e[o]);return t},r.apply(this,arguments)};function n(t,e){var r={};for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&e.indexOf(n)<0&&(r[n]=t[n]);if(null!=t&&"function"==typeof Object.getOwnPropertySymbols){var o=0;for(n=Object.getOwnPropertySymbols(t);o<n.length;o++)e.indexOf(n[o])<0&&Object.prototype.propertyIsEnumerable.call(t,n[o])&&(r[n[o]]=t[n[o]])}return r}function o(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),s=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s}function i(t,e,r){if(r||2===arguments.length)for(var n,o=0,i=e.length;o<i;o++)!n&&o in e||(n||(n=Array.prototype.slice.call(e,0,o)),n[o]=e[o]);return t.concat(n||Array.prototype.slice.call(e))}Object.create,Object.create;const s=function(){function t(){this._events={}}return t.prototype.on=function(t,e,r){return this._events[t]||(this._events[t]=[]),this._events[t].push({callback:e,once:!!r}),this},t.prototype.once=function(t,e){return this.on(t,e,!0)},t.prototype.emit=function(t){for(var e=this,r=[],n=1;n<arguments.length;n++)r[n-1]=arguments[n];var o=this._events[t]||[],i=this._events["*"]||[],s=function(n){for(var o=n.length,i=0;i<o;i++)if(n[i]){var s=n[i],a=s.callback;s.once&&(n.splice(i,1),0===n.length&&delete e._events[t],o--,i--),a.apply(e,r)}};s(o),s(i)},t.prototype.off=function(t,e){if(t)if(e){for(var r=this._events[t]||[],n=r.length,o=0;o<n;o++)r[o].callback===e&&(r.splice(o,1),n--,o--);0===r.length&&delete this._events[t]}else delete this._events[t];else this._events={};return this},t.prototype.getEvents=function(){return this._events},t}();function a(t,e,r,n){for(;t.length;){const o=t.shift();if(r(o))return!0;e.add(o.id),n(o.id).forEach((r=>{e.has(r.id)||(e.add(r.id),t.push(r))}))}return!1}function h(t,e,r,n){if(r(t))return!0;e.add(t.id);for(const o of n(t.id))if(!e.has(o.id)&&h(o,e,r,n))return!0;return!1}class u extends s{nodeMap=new Map;edgeMap=new Map;inEdgesMap=new Map;outEdgesMap=new Map;bothEdgesMap=new Map;treeIndices=new Map;changes=[];batchCount=0;onChanged=()=>{};constructor(t){super(),t&&(t.nodes&&this.addNodes(t.nodes),t.edges&&this.addEdges(t.edges),t.tree&&this.addTree(t.tree),t.onChanged&&(this.onChanged=t.onChanged))}batch=t=>{this.batchCount+=1,t(),this.batchCount-=1,this.batchCount||this.commit()};commit(){const t=this.changes;this.changes=[];const e={graph:this,changes:t};this.emit("changed",e),this.onChanged(e)}reduceChanges(t){let e=[];return t.forEach((t=>{switch(t.type){case"NodeRemoved":{let r=!1;e=e.filter((e=>{if("NodeAdded"===e.type){const n=e.value.id===t.value.id;return n&&(r=!0),!n}return"NodeDataUpdated"===e.type?e.id!==t.value.id:"TreeStructureChanged"!==e.type||e.nodeId!==t.value.id})),r||e.push(t);break}case"EdgeRemoved":{let r=!1;e=e.filter((e=>{if("EdgeAdded"===e.type){const n=e.value.id===t.value.id;return n&&(r=!0),!n}return"EdgeDataUpdated"!==e.type&&"EdgeUpdated"!==e.type||e.id!==t.value.id})),r||e.push(t);break}case"NodeDataUpdated":case"EdgeDataUpdated":case"EdgeUpdated":{const r=e.find((e=>e.type===t.type&&e.id===t.id&&e.propertyName===t.propertyName));r?r.newValue=t.newValue:e.push(t);break}case"TreeStructureDetached":e=e.filter((e=>"TreeStructureAttached"===e.type?e.treeKey!==t.treeKey:"TreeStructureChanged"!==e.type||e.treeKey!==t.treeKey)),e.push(t);break;case"TreeStructureChanged":{const r=e.find((e=>"TreeStructureChanged"===e.type&&e.treeKey===t.treeKey&&e.nodeId===t.nodeId));r?r.newParentId=t.newParentId:e.push(t);break}default:e.push(t)}})),e}checkNodeExistence(t){this.getNode(t)}hasNode(t){return this.nodeMap.has(t)}areNeighbors(t,e){return this.getNeighbors(e).some((e=>e.id===t))}getNode(t){const e=this.nodeMap.get(t);if(!e)throw new Error("Node not found for id: "+t);return e}getRelatedEdges(t,e){if(this.checkNodeExistence(t),"in"===e){const e=this.inEdgesMap.get(t);return Array.from(e)}if("out"===e){const e=this.outEdgesMap.get(t);return Array.from(e)}{const e=this.bothEdgesMap.get(t);return Array.from(e)}}getDegree(t,e){return this.getRelatedEdges(t,e).length}getSuccessors(t){const e=this.getRelatedEdges(t,"out").map((t=>this.getNode(t.target)));return Array.from(new Set(e))}getPredecessors(t){const e=this.getRelatedEdges(t,"in").map((t=>this.getNode(t.source)));return Array.from(new Set(e))}getNeighbors(t){const e=this.getPredecessors(t),r=this.getSuccessors(t);return Array.from(new Set([...e,...r]))}doAddNode(t){if(this.hasNode(t.id))throw new Error("Node already exists: "+t.id);this.nodeMap.set(t.id,t),this.inEdgesMap.set(t.id,new Set),this.outEdgesMap.set(t.id,new Set),this.bothEdgesMap.set(t.id,new Set),this.treeIndices.forEach((e=>{e.childrenMap.set(t.id,new Set)})),this.changes.push({type:"NodeAdded",value:t})}addNodes(t){this.batch((()=>{for(const e of t)this.doAddNode(e)}))}addNode(t){this.addNodes([t])}doRemoveNode(t){const e=this.getNode(t);this.bothEdgesMap.get(t)?.forEach((t=>this.doRemoveEdge(t.id))),this.nodeMap.delete(t),this.treeIndices.forEach((e=>{e.childrenMap.get(t)?.forEach((t=>{e.parentMap.delete(t.id)})),e.parentMap.delete(t),e.childrenMap.delete(t)})),this.changes.push({type:"NodeRemoved",value:e})}removeNodes(t){this.batch((()=>{t.forEach((t=>this.doRemoveNode(t)))}))}removeNode(t){this.removeNodes([t])}updateNodeDataProperty(t,e,r){const n=this.getNode(t);this.batch((()=>{const o=n.data[e],i=r;n.data[e]=i,this.changes.push({type:"NodeDataUpdated",id:t,propertyName:e,oldValue:o,newValue:i})}))}mergeNodeData(t,e){this.batch((()=>{Object.entries(e).forEach((([e,r])=>{this.updateNodeDataProperty(t,e,r)}))}))}updateNodeData(...t){const e=t[0],r=this.getNode(e);if("string"==typeof t[1])return void this.updateNodeDataProperty(e,t[1],t[2]);let n;if("function"==typeof t[1]){const e=t[1];n=e(r.data)}else"object"==typeof t[1]&&(n=t[1]);this.batch((()=>{const t=r.data,o=n;r.data=n,this.changes.push({type:"NodeDataUpdated",id:e,oldValue:t,newValue:o})}))}checkEdgeExistence(t){if(!this.hasEdge(t))throw new Error("Edge not found for id: "+t)}hasEdge(t){return this.edgeMap.has(t)}getEdge(t){return this.checkEdgeExistence(t),this.edgeMap.get(t)}getEdgeDetail(t){const e=this.getEdge(t);return{edge:e,source:this.getNode(e.source),target:this.getNode(e.target)}}doAddEdge(t){if(this.hasEdge(t.id))throw new Error("Edge already exists: "+t.id);this.checkNodeExistence(t.source),this.checkNodeExistence(t.target),this.edgeMap.set(t.id,t);const e=this.inEdgesMap.get(t.target),r=this.outEdgesMap.get(t.source),n=this.bothEdgesMap.get(t.source),o=this.bothEdgesMap.get(t.target);e.add(t),r.add(t),n.add(t),o.add(t),this.changes.push({type:"EdgeAdded",value:t})}addEdges(t){this.batch((()=>{for(const e of t)this.doAddEdge(e)}))}addEdge(t){this.addEdges([t])}doRemoveEdge(t){const e=this.getEdge(t),r=this.outEdgesMap.get(e.source),n=this.inEdgesMap.get(e.target),o=this.bothEdgesMap.get(e.source),i=this.bothEdgesMap.get(e.target);r.delete(e),n.delete(e),o.delete(e),i.delete(e),this.edgeMap.delete(t),this.changes.push({type:"EdgeRemoved",value:e})}removeEdges(t){this.batch((()=>{t.forEach((t=>this.doRemoveEdge(t)))}))}removeEdge(t){this.removeEdges([t])}updateEdgeSource(t,e){const r=this.getEdge(t);this.checkNodeExistence(e);const n=r.source,o=e;this.outEdgesMap.get(n).delete(r),this.bothEdgesMap.get(n).delete(r),this.outEdgesMap.get(o).add(r),this.bothEdgesMap.get(o).add(r),r.source=e,this.batch((()=>{this.changes.push({type:"EdgeUpdated",id:t,propertyName:"source",oldValue:n,newValue:o})}))}updateEdgeTarget(t,e){const r=this.getEdge(t);this.checkNodeExistence(e);const n=r.target,o=e;this.inEdgesMap.get(n).delete(r),this.bothEdgesMap.get(n).delete(r),this.inEdgesMap.get(o).add(r),this.bothEdgesMap.get(o).add(r),r.target=e,this.batch((()=>{this.changes.push({type:"EdgeUpdated",id:t,propertyName:"target",oldValue:n,newValue:o})}))}updateEdgeDataProperty(t,e,r){const n=this.getEdge(t);this.batch((()=>{const o=n.data[e],i=r;n.data[e]=i,this.changes.push({type:"EdgeDataUpdated",id:t,propertyName:e,oldValue:o,newValue:i})}))}updateEdgeData(...t){const e=t[0],r=this.getEdge(e);if("string"==typeof t[1])return void this.updateEdgeDataProperty(e,t[1],t[2]);let n;if("function"==typeof t[1]){const e=t[1];n=e(r.data)}else"object"==typeof t[1]&&(n=t[1]);this.batch((()=>{const t=r.data,o=n;r.data=n,this.changes.push({type:"EdgeDataUpdated",id:e,oldValue:t,newValue:o})}))}mergeEdgeData(t,e){this.batch((()=>{Object.entries(e).forEach((([e,r])=>{this.updateEdgeDataProperty(t,e,r)}))}))}checkTreeExistence(t){if(!this.hasTreeStructure(t))throw new Error("Tree structure not found for treeKey: "+t)}hasTreeStructure(t){return this.treeIndices.has(t)}attachTreeStructure(t){this.treeIndices.has(t)||(this.treeIndices.set(t,{parentMap:new Map,childrenMap:new Map}),this.batch((()=>{this.changes.push({type:"TreeStructureAttached",treeKey:t})})))}detachTreeStructure(t){this.checkTreeExistence(t),this.treeIndices.delete(t),this.batch((()=>{this.changes.push({type:"TreeStructureDetached",treeKey:t})}))}addTree(t,e){this.batch((()=>{this.attachTreeStructure(e);const r=[],n=Array.isArray(t)?t:[t];for(;n.length;){const t=n.shift();r.push(t),t.children&&n.push(...t.children)}this.addNodes(r),r.forEach((t=>{t.children?.forEach((r=>{this.setParent(r.id,t.id,e)}))}))}))}getRoots(t){return this.checkTreeExistence(t),this.getAllNodes().filter((e=>!this.getParent(e.id,t)))}getChildren(t,e){this.checkNodeExistence(t),this.checkTreeExistence(e);const r=this.treeIndices.get(e).childrenMap.get(t);return Array.from(r||[])}getParent(t,e){return this.checkNodeExistence(t),this.checkTreeExistence(e),this.treeIndices.get(e).parentMap.get(t)||null}getAncestors(t,e){const r=[];let n,o=this.getNode(t);for(;n=this.getParent(o.id,e);)r.push(n),o=n;return r}setParent(t,e,r){this.checkTreeExistence(r);const n=this.treeIndices.get(r),o=this.getNode(t),i=n.parentMap.get(t),s=this.getNode(e);n.parentMap.set(t,s),i&&n.childrenMap.get(i.id)?.delete(o);let a=n.childrenMap.get(s.id);a||(a=new Set,n.childrenMap.set(s.id,a)),a.add(o),this.batch((()=>{this.changes.push({type:"TreeStructureChanged",treeKey:r,nodeId:t,oldParentId:i?.id,newParentId:s.id})}))}dfsTree(t,e,r){return h(this.getNode(t),new Set,e,(t=>this.getChildren(t,r)))}bfsTree(t,e,r){return a([this.getNode(t)],new Set,e,(t=>this.getChildren(t,r)))}getAllNodes(){return Array.from(this.nodeMap.values())}getAllEdges(){return Array.from(this.edgeMap.values())}bfs(t,e,r="out"){const n={in:this.getPredecessors.bind(this),out:this.getSuccessors.bind(this),both:this.getNeighbors.bind(this)}[r];return a([this.getNode(t)],new Set,e,n)}dfs(t,e,r="out"){const n={in:this.getPredecessors.bind(this),out:this.getSuccessors.bind(this),both:this.getNeighbors.bind(this)}[r];return h(this.getNode(t),new Set,e,n)}clone(){const t=this.getAllNodes().map((t=>({...t,data:{...t.data}}))),e=this.getAllEdges().map((t=>({...t,data:{...t.data}}))),r=new u({nodes:t,edges:e});return this.treeIndices.forEach((({parentMap:t,childrenMap:e},n)=>{const o=new Map;t.forEach(((t,e)=>{o.set(e,r.getNode(t.id))}));const i=new Map;e.forEach(((t,e)=>{i.set(e,new Set(Array.from(t).map((t=>r.getNode(t.id)))))})),r.treeIndices.set(n,{parentMap:o,childrenMap:i})})),r}toJSON(){return JSON.stringify({nodes:this.getAllNodes(),edges:this.getAllEdges()})}}var l=/-(\w)/g,c=(function(t){return t.replace(l,(function(t,e){return e?e.toUpperCase():""}))},Object.create(null),Array.isArray),f=function(t){for(var e=[],r=t.length,n=0;n<r;n+=1){e[n]=[];for(var o=0;o<r;o+=1)n===o?e[n][o]=0:0!==t[n][o]&&t[n][o]?e[n][o]=t[n][o]:e[n][o]=1/0}for(var i=0;i<r;i+=1)for(n=0;n<r;n+=1)for(o=0;o<r;o+=1)e[n][o]>e[n][i]+e[i][o]&&(e[n][o]=e[n][i]+e[i][o]);return e},d=function(t,e){var r=t.nodes,n=t.edges,o=[],i={};if(!r)throw new Error("invalid nodes data!");return r&&r.forEach((function(t,e){i[t.id]=e,o.push([])})),null==n||n.forEach((function(t){var r=t.source,n=t.target,s=i[r],a=i[n];void 0!==s&&void 0!==a&&(o[s][a]=1,e||(o[a][s]=1))})),o},g=function(t,e){return Math.sqrt((t.x-e.x)*(t.x-e.x)+(t.y-e.y)*(t.y-e.y))},p={}.toString;const y=function(t,e){return p.call(t)==="[object "+e+"]"},m=function(t){return y(t,"Number")};var w=function(t){if(null===t)return t;if(t instanceof Date)return new Date(t.getTime());if(t instanceof Array){var e=[];return t.forEach((function(t){e.push(t)})),e.map((function(t){return w(t)}))}if("object"==typeof t){var r={};return Object.keys(t).forEach((function(e){r[e]=w(t[e])})),r}return t},v=function(t,e){var r=w(t);return r.data=r.data||{},e&&(m(r.data.x)||(r.data.x=Math.random()*e[0]),m(r.data.y)||(r.data.y=Math.random()*e[1])),r};const x=function(t){return"function"==typeof t},M=function(t){var e=typeof t;return null!==t&&"object"===e||"function"===e};function b(t,e){return x(e)?e:m(e)?function(){return e}:function(){return t}}function E(t,e,r){return void 0===r&&(r=!0),e||0===e?x(e)?e:m(e)?function(){return e}:c(e)?function(){if(r){var n=Math.max.apply(Math,i([],o(e),!1));return isNaN(n)?t:n}return e}:M(e)?function(){if(r){var n=Math.max(e.width,e.height);return isNaN(n)?t:n}return[e.width,e.height]}:function(){return t}:function(e){var r=(e.data||{}).size;return r?c(r)?r[0]>r[1]?r[0]:r[1]:M(r)?r.width>r.height?r.width:r.height:r:t}}var N=function(t,e,n,o){var i=t.getAllNodes(),s=t.getAllEdges();if(!(null==i?void 0:i.length)){var a={nodes:[],edges:s};return null==o||o(a),a}if(1===i.length)return e&&t.mergeNodeData(i[0].id,{x:n[0],y:n[1]}),a={nodes:[r(r({},i[0]),{data:r(r({},i[0].data),{x:n[0],y:n[1]})})],edges:s},null==o||o(a),a},S={radius:null,startRadius:null,endRadius:null,startAngle:0,endAngle:2*Math.PI,clockwise:!0,divisions:1,ordering:null,angleRatio:1},A=function(){function t(t){void 0===t&&(t={}),this.options=t,this.id="circular",this.options=r(r({},S),t)}return t.prototype.execute=function(t,e){return this.genericCircularLayout(!1,t,e)},t.prototype.assign=function(t,e){this.genericCircularLayout(!0,t,e)},t.prototype.genericCircularLayout=function(t,e,n){var i=r(r({},this.options),n),s=i.width,a=i.height,h=i.center,u=i.divisions,l=i.startAngle,c=void 0===l?0:l,f=i.endAngle,d=void 0===f?2*Math.PI:f,g=i.angleRatio,p=i.ordering,y=i.clockwise,m=i.nodeSpacing,w=i.nodeSize,x=i.onLayoutEnd,M=e.getAllNodes(),S=e.getAllEdges(),A=o(D(s,a,h),3),I=A[0],_=A[1],R=A[2],z=null==M?void 0:M.length;if(!z||1===z)return N(e,t,R,x);var T=(d-c)/z,O=i.radius,C=i.startRadius,P=i.endRadius;if(m){var q=b(10,m),L=E(10,w),F=-1/0;M.forEach((function(t){var e=L(t);F<e&&(F=e)}));var j=0;M.forEach((function(t,e){j+=0===e?F||10:(q(t)||0)+(F||10)})),O=j/(2*Math.PI)}else O||C||P?!C&&P?C=P:C&&!P&&(P=C):O=Math.min(_,I)/2;var V=T*g,W=[];W="topology"===p?k(e,M):"topology-directed"===p?k(e,M,!0):"degree"===p?function(t,e){var r=[];return e.forEach((function(t,e){r.push(v(t))})),r.sort((function(e,r){return t.getDegree(e.id,"both")-t.getDegree(r.id,"both")})),r}(e,M):M.map((function(t){return v(t)}));for(var $=Math.ceil(z/u),G=0;G<z;++G){var U=O;U||null===C||null===P||(U=C+G*(P-C)/(z-1)),U||(U=10+100*G/(z-1));var B=c+G%$*V+2*Math.PI/u*Math.floor(G/$);y||(B=d-G%$*V-2*Math.PI/u*Math.floor(G/$)),W[G].data.x=R[0]+Math.cos(B)*U,W[G].data.y=R[1]+Math.sin(B)*U}t&&W.forEach((function(t){e.mergeNodeData(t.id,{x:t.data.x,y:t.data.y})}));var H={nodes:W,edges:S};return null==x||x(H),H},t}(),k=function(t,e,r){void 0===r&&(r=!1);var n=[v(e[0])],o={},i=e.length;o[e[0].id]=!0;var s=0;return e.forEach((function(a,h){if(0!==h)if(h!==i-1&&t.getDegree(a.id,"both")===t.getDegree(e[h+1].id,"both")&&!t.areNeighbors(n[s].id,a.id)||o[a.id]){for(var u=r?t.getSuccessors(n[s].id):t.getNeighbors(n[s].id),l=!1,c=0;c<u.length;c++){var f=u[c];if(t.getDegree(f.id)===t.getDegree(a.id)&&!o[f.id]){n.push(v(f)),o[f.id]=!0,l=!0;break}}for(var d=0;!l&&(o[e[d].id]||(n.push(v(e[d])),o[e[d].id]=!0,l=!0),++d!==i););}else n.push(v(a)),o[a.id]=!0,s++})),n},D=function(t,e,r){var n=t,o=e,i=r;return n||"undefined"==typeof window||(n=window.innerWidth),o||"undefined"==typeof window||(o=window.innerHeight),i||(i=[n/2,o/2]),[n,o,i]};const I=function(t){return y(t,"String")};var _={nodeSize:30,nodeSpacing:10,preventOverlap:!1,sweep:void 0,equidistant:!1,startAngle:1.5*Math.PI,clockwise:!0,maxLevelDiff:void 0,sortBy:"degree"},R=function(){function t(t){void 0===t&&(t={}),this.options=t,this.id="concentric",this.options=r(r({},_),t)}return t.prototype.execute=function(t,e){return this.genericConcentricLayout(!1,t,e)},t.prototype.assign=function(t,e){this.genericConcentricLayout(!0,t,e)},t.prototype.genericConcentricLayout=function(t,e,n){var o=r(r({},this.options),n),i=o.center,s=o.width,a=o.height,h=o.sortBy,u=o.maxLevelDiff,l=o.sweep,f=o.clockwise,d=o.equidistant,g=o.preventOverlap,p=o.startAngle,y=void 0===p?1.5*Math.PI:p,w=o.nodeSize,b=o.nodeSpacing,E=o.onLayoutEnd,S=e.getAllNodes(),A=e.getAllEdges(),k=s||"undefined"==typeof window?s:window.innerWidth,D=a||"undefined"==typeof window?a:window.innerHeight,_=i||[k/2,D/2];if(!(null==S?void 0:S.length)||1===S.length)return N(e,t,_,E);var R,z=[],T=0;R=c(w)?Math.max(w[0],w[1]):w,c(b)?T=Math.max(b[0],b[1]):m(b)&&(T=b),S.forEach((function(t){var e=v(t);z.push(e);var r=R,n=e.data;c(n.size)?r=Math.max(n.size[0],n.size[1]):m(n.size)?r=n.size:M(n.size)&&(r=Math.max(n.size.width,n.size.height)),R=Math.max(R,r),x(b)&&(T=Math.max(b(t),T))}));var O={};z.forEach((function(t,e){O[t.id]=e}));var C=h;I(C)&&void 0!==z[0].data[C]||(C="degree"),"degree"===C?z.sort((function(t,r){return e.getDegree(r.id,"both")-e.getDegree(t.id,"both")})):z.sort((function(t,e){return e.data[C]-t.data[C]}));var P=z[0],q=(u||("degree"===C?e.getDegree(P.id,"both"):P.data[C]))/4,L=[{nodes:[]}],F=L[0];z.forEach((function(t){if(F.nodes.length>0){var r="degree"===C?Math.abs(e.getDegree(F.nodes[0].id,"both")-e.getDegree(t.id,"both")):Math.abs(F.nodes[0].data[C]-t.data[C]);q&&r>=q&&(F={nodes:[]},L.push(F))}F.nodes.push(t)}));var j=R+T;if(!g){var V=L.length>0&&L[0].nodes.length>1,W=(Math.min(k,D)/2-j)/(L.length+(V?1:0));j=Math.min(j,W)}var $=0;if(L.forEach((function(t){var e=void 0===l?2*Math.PI-2*Math.PI/t.nodes.length:l;if(t.dTheta=e/Math.max(1,t.nodes.length-1),t.nodes.length>1&&g){var r=Math.cos(t.dTheta)-Math.cos(0),n=Math.sin(t.dTheta)-Math.sin(0),o=Math.sqrt(j*j/(r*r+n*n));$=Math.max(o,$)}t.r=$,$+=j})),d){for(var G=0,U=0,B=0;B<L.length;B++){var H=(L[B].r||0)-U;G=Math.max(G,H)}U=0,L.forEach((function(t,e){0===e&&(U=t.r||0),t.r=U,U+=G}))}L.forEach((function(t){var e=t.dTheta||0,r=t.r||0;t.nodes.forEach((function(t,n){var o=y+(f?1:-1)*e*n;t.data.x=_[0]+r*Math.cos(o),t.data.y=_[1]+r*Math.sin(o)}))})),t&&z.forEach((function(t){return e.mergeNodeData(t.id,{x:t.data.x,y:t.data.y})}));var K={nodes:z,edges:A};return null==E||E(K),K},t}();function z(t,e,r,n){if(isNaN(e)||isNaN(r))return t;var o,i,s,a,h,u,l,c,f,d=t._root,g={data:n},p=t._x0,y=t._y0,m=t._x1,w=t._y1;if(!d)return t._root=g,t;for(;d.length;)if((u=e>=(i=(p+m)/2))?p=i:m=i,(l=r>=(s=(y+w)/2))?y=s:w=s,o=d,!(d=d[c=l<<1|u]))return o[c]=g,t;if(a=+t._x.call(null,d.data),h=+t._y.call(null,d.data),e===a&&r===h)return g.next=d,o?o[c]=g:t._root=g,t;do{o=o?o[c]=new Array(4):t._root=new Array(4),(u=e>=(i=(p+m)/2))?p=i:m=i,(l=r>=(s=(y+w)/2))?y=s:w=s}while((c=l<<1|u)==(f=(h>=s)<<1|a>=i));return o[f]=d,o[c]=g,t}function T(t,e,r,n,o){this.node=t,this.x0=e,this.y0=r,this.x1=n,this.y1=o}function O(t){return t[0]}function C(t){return t[1]}function P(t,e,r){var n=new q(null==e?O:e,null==r?C:r,NaN,NaN,NaN,NaN);return null==t?n:n.addAll(t)}function q(t,e,r,n,o,i){this._x=t,this._y=e,this._x0=r,this._y0=n,this._x1=o,this._y1=i,this._root=void 0}function L(t){for(var e={data:t.data},r=e;t=t.next;)r=r.next={data:t.data};return e}var F=P.prototype=q.prototype;function j(t){return function(){return t}}function V(t){return 1e-6*(t()-.5)}F.copy=function(){var t,e,r=new q(this._x,this._y,this._x0,this._y0,this._x1,this._y1),n=this._root;if(!n)return r;if(!n.length)return r._root=L(n),r;for(t=[{source:n,target:r._root=new Array(4)}];n=t.pop();)for(var o=0;o<4;++o)(e=n.source[o])&&(e.length?t.push({source:e,target:n.target[o]=new Array(4)}):n.target[o]=L(e));return r},F.add=function(t){const e=+this._x.call(null,t),r=+this._y.call(null,t);return z(this.cover(e,r),e,r,t)},F.addAll=function(t){var e,r,n,o,i=t.length,s=new Array(i),a=new Array(i),h=1/0,u=1/0,l=-1/0,c=-1/0;for(r=0;r<i;++r)isNaN(n=+this._x.call(null,e=t[r]))||isNaN(o=+this._y.call(null,e))||(s[r]=n,a[r]=o,n<h&&(h=n),n>l&&(l=n),o<u&&(u=o),o>c&&(c=o));if(h>l||u>c)return this;for(this.cover(h,u).cover(l,c),r=0;r<i;++r)z(this,s[r],a[r],t[r]);return this},F.cover=function(t,e){if(isNaN(t=+t)||isNaN(e=+e))return this;var r=this._x0,n=this._y0,o=this._x1,i=this._y1;if(isNaN(r))o=(r=Math.floor(t))+1,i=(n=Math.floor(e))+1;else{for(var s,a,h=o-r||1,u=this._root;r>t||t>=o||n>e||e>=i;)switch(a=(e<n)<<1|t<r,(s=new Array(4))[a]=u,u=s,h*=2,a){case 0:o=r+h,i=n+h;break;case 1:r=o-h,i=n+h;break;case 2:o=r+h,n=i-h;break;case 3:r=o-h,n=i-h}this._root&&this._root.length&&(this._root=u)}return this._x0=r,this._y0=n,this._x1=o,this._y1=i,this},F.data=function(){var t=[];return this.visit((function(e){if(!e.length)do{t.push(e.data)}while(e=e.next)})),t},F.extent=function(t){return arguments.length?this.cover(+t[0][0],+t[0][1]).cover(+t[1][0],+t[1][1]):isNaN(this._x0)?void 0:[[this._x0,this._y0],[this._x1,this._y1]]},F.find=function(t,e,r){var n,o,i,s,a,h,u,l=this._x0,c=this._y0,f=this._x1,d=this._y1,g=[],p=this._root;for(p&&g.push(new T(p,l,c,f,d)),null==r?r=1/0:(l=t-r,c=e-r,f=t+r,d=e+r,r*=r);h=g.pop();)if(!(!(p=h.node)||(o=h.x0)>f||(i=h.y0)>d||(s=h.x1)<l||(a=h.y1)<c))if(p.length){var y=(o+s)/2,m=(i+a)/2;g.push(new T(p[3],y,m,s,a),new T(p[2],o,m,y,a),new T(p[1],y,i,s,m),new T(p[0],o,i,y,m)),(u=(e>=m)<<1|t>=y)&&(h=g[g.length-1],g[g.length-1]=g[g.length-1-u],g[g.length-1-u]=h)}else{var w=t-+this._x.call(null,p.data),v=e-+this._y.call(null,p.data),x=w*w+v*v;if(x<r){var M=Math.sqrt(r=x);l=t-M,c=e-M,f=t+M,d=e+M,n=p.data}}return n},F.remove=function(t){if(isNaN(i=+this._x.call(null,t))||isNaN(s=+this._y.call(null,t)))return this;var e,r,n,o,i,s,a,h,u,l,c,f,d=this._root,g=this._x0,p=this._y0,y=this._x1,m=this._y1;if(!d)return this;if(d.length)for(;;){if((u=i>=(a=(g+y)/2))?g=a:y=a,(l=s>=(h=(p+m)/2))?p=h:m=h,e=d,!(d=d[c=l<<1|u]))return this;if(!d.length)break;(e[c+1&3]||e[c+2&3]||e[c+3&3])&&(r=e,f=c)}for(;d.data!==t;)if(n=d,!(d=d.next))return this;return(o=d.next)&&delete d.next,n?(o?n.next=o:delete n.next,this):e?(o?e[c]=o:delete e[c],(d=e[0]||e[1]||e[2]||e[3])&&d===(e[3]||e[2]||e[1]||e[0])&&!d.length&&(r?r[f]=d:this._root=d),this):(this._root=o,this)},F.removeAll=function(t){for(var e=0,r=t.length;e<r;++e)this.remove(t[e]);return this},F.root=function(){return this._root},F.size=function(){var t=0;return this.visit((function(e){if(!e.length)do{++t}while(e=e.next)})),t},F.visit=function(t){var e,r,n,o,i,s,a=[],h=this._root;for(h&&a.push(new T(h,this._x0,this._y0,this._x1,this._y1));e=a.pop();)if(!t(h=e.node,n=e.x0,o=e.y0,i=e.x1,s=e.y1)&&h.length){var u=(n+i)/2,l=(o+s)/2;(r=h[3])&&a.push(new T(r,u,l,i,s)),(r=h[2])&&a.push(new T(r,n,l,u,s)),(r=h[1])&&a.push(new T(r,u,o,i,l)),(r=h[0])&&a.push(new T(r,n,o,u,l))}return this},F.visitAfter=function(t){var e,r=[],n=[];for(this._root&&r.push(new T(this._root,this._x0,this._y0,this._x1,this._y1));e=r.pop();){var o=e.node;if(o.length){var i,s=e.x0,a=e.y0,h=e.x1,u=e.y1,l=(s+h)/2,c=(a+u)/2;(i=o[0])&&r.push(new T(i,s,a,l,c)),(i=o[1])&&r.push(new T(i,l,a,h,c)),(i=o[2])&&r.push(new T(i,s,c,l,u)),(i=o[3])&&r.push(new T(i,l,c,h,u))}n.push(e)}for(;e=n.pop();)t(e.node,e.x0,e.y0,e.x1,e.y1);return this},F.x=function(t){return arguments.length?(this._x=t,this):this._x},F.y=function(t){return arguments.length?(this._y=t,this):this._y};var W={value:()=>{}};function $(){for(var t,e=0,r=arguments.length,n={};e<r;++e){if(!(t=arguments[e]+"")||t in n||/[\s.]/.test(t))throw new Error("illegal type: "+t);n[t]=[]}return new G(n)}function G(t){this._=t}function U(t,e){return t.trim().split(/^|\s+/).map((function(t){var r="",n=t.indexOf(".");if(n>=0&&(r=t.slice(n+1),t=t.slice(0,n)),t&&!e.hasOwnProperty(t))throw new Error("unknown type: "+t);return{type:t,name:r}}))}function B(t,e){for(var r,n=0,o=t.length;n<o;++n)if((r=t[n]).name===e)return r.value}function H(t,e,r){for(var n=0,o=t.length;n<o;++n)if(t[n].name===e){t[n]=W,t=t.slice(0,n).concat(t.slice(n+1));break}return null!=r&&t.push({name:e,value:r}),t}G.prototype=$.prototype={constructor:G,on:function(t,e){var r,n=this._,o=U(t+"",n),i=-1,s=o.length;if(!(arguments.length<2)){if(null!=e&&"function"!=typeof e)throw new Error("invalid callback: "+e);for(;++i<s;)if(r=(t=o[i]).type)n[r]=H(n[r],t.name,e);else if(null==e)for(r in n)n[r]=H(n[r],t.name,null);return this}for(;++i<s;)if((r=(t=o[i]).type)&&(r=B(n[r],t.name)))return r},copy:function(){var t={},e=this._;for(var r in e)t[r]=e[r].slice();return new G(t)},call:function(t,e){if((r=arguments.length-2)>0)for(var r,n,o=new Array(r),i=0;i<r;++i)o[i]=arguments[i+2];if(!this._.hasOwnProperty(t))throw new Error("unknown type: "+t);for(i=0,r=(n=this._[t]).length;i<r;++i)n[i].value.apply(e,o)},apply:function(t,e,r){if(!this._.hasOwnProperty(t))throw new Error("unknown type: "+t);for(var n=this._[t],o=0,i=n.length;o<i;++o)n[o].value.apply(e,r)}};const K=$;var J,Y,X=0,Q=0,Z=0,tt=0,et=0,rt=0,nt="object"==typeof performance&&performance.now?performance:Date,ot="object"==typeof window&&window.requestAnimationFrame?window.requestAnimationFrame.bind(window):function(t){setTimeout(t,17)};function it(){return et||(ot(st),et=nt.now()+rt)}function st(){et=0}function at(){this._call=this._time=this._next=null}function ht(t,e,r){var n=new at;return n.restart(t,e,r),n}function ut(){et=(tt=nt.now())+rt,X=Q=0;try{!function(){it(),++X;for(var t,e=J;e;)(t=et-e._time)>=0&&e._call.call(void 0,t),e=e._next;--X}()}finally{X=0,function(){for(var t,e,r=J,n=1/0;r;)r._call?(n>r._time&&(n=r._time),t=r,r=r._next):(e=r._next,r._next=null,r=t?t._next=e:J=e);Y=t,ct(n)}(),et=0}}function lt(){var t=nt.now(),e=t-tt;e>1e3&&(rt-=e,tt=t)}function ct(t){X||(Q&&(Q=clearTimeout(Q)),t-et>24?(t<1/0&&(Q=setTimeout(ut,t-nt.now()-rt)),Z&&(Z=clearInterval(Z))):(Z||(tt=nt.now(),Z=setInterval(lt,1e3)),X=1,ot(ut)))}at.prototype=ht.prototype={constructor:at,restart:function(t,e,r){if("function"!=typeof t)throw new TypeError("callback is not a function");r=(null==r?it():+r)+(null==e?0:+e),this._next||Y===this||(Y?Y._next=this:J=this,Y=this),this._call=t,this._time=r,ct()},stop:function(){this._call&&(this._call=null,this._time=1/0,ct())}};const ft=4294967296;function dt(t){return t.x}function gt(t){return t.y}var pt=Math.PI*(3-Math.sqrt(5));function yt(t){var e,r=1,n=.001,o=1-Math.pow(n,1/300),i=0,s=.6,a=new Map,h=ht(c),u=K("tick","end"),l=function(){let t=1;return()=>(t=(1664525*t+1013904223)%ft)/ft}();function c(){f(),u.call("tick",e),r<n&&(h.stop(),u.call("end",e))}function f(n){var h,u,l=t.length;void 0===n&&(n=1);for(var c=0;c<n;++c)for(r+=(i-r)*o,a.forEach((function(t){t(r)})),h=0;h<l;++h)null==(u=t[h]).fx?u.x+=u.vx*=s:(u.x=u.fx,u.vx=0),null==u.fy?u.y+=u.vy*=s:(u.y=u.fy,u.vy=0);return e}function d(){for(var e,r=0,n=t.length;r<n;++r){if((e=t[r]).index=r,null!=e.fx&&(e.x=e.fx),null!=e.fy&&(e.y=e.fy),isNaN(e.x)||isNaN(e.y)){var o=10*Math.sqrt(.5+r),i=r*pt;e.x=o*Math.cos(i),e.y=o*Math.sin(i)}(isNaN(e.vx)||isNaN(e.vy))&&(e.vx=e.vy=0)}}function g(e){return e.initialize&&e.initialize(t,l),e}return null==t&&(t=[]),d(),e={tick:f,restart:function(){return h.restart(c),e},stop:function(){return h.stop(),e},nodes:function(r){return arguments.length?(t=r,d(),a.forEach(g),e):t},alpha:function(t){return arguments.length?(r=+t,e):r},alphaMin:function(t){return arguments.length?(n=+t,e):n},alphaDecay:function(t){return arguments.length?(o=+t,e):+o},alphaTarget:function(t){return arguments.length?(i=+t,e):i},velocityDecay:function(t){return arguments.length?(s=1-t,e):1-s},randomSource:function(t){return arguments.length?(l=t,a.forEach(g),e):l},force:function(t,r){return arguments.length>1?(null==r?a.delete(t):a.set(t,g(r)),e):a.get(t)},find:function(e,r,n){var o,i,s,a,h,u=0,l=t.length;for(null==n?n=1/0:n*=n,u=0;u<l;++u)(s=(o=e-(a=t[u]).x)*o+(i=r-a.y)*i)<n&&(h=a,n=s);return h},on:function(t,r){return arguments.length>1?(u.on(t,r),e):u.on(t)}}}function mt(){var t,e,r,n,o,i=j(-30),s=1,a=1/0,h=.81;function u(r){var o,i=t.length,s=P(t,dt,gt).visitAfter(c);for(n=r,o=0;o<i;++o)e=t[o],s.visit(f)}function l(){if(t){var e,r,n=t.length;for(o=new Array(n),e=0;e<n;++e)r=t[e],o[r.index]=+i(r,e,t)}}function c(t){var e,r,n,i,s,a=0,h=0;if(t.length){for(n=i=s=0;s<4;++s)(e=t[s])&&(r=Math.abs(e.value))&&(a+=e.value,h+=r,n+=r*e.x,i+=r*e.y);t.x=n/h,t.y=i/h}else{(e=t).x=e.data.x,e.y=e.data.y;do{a+=o[e.data.index]}while(e=e.next)}t.value=a}function f(t,i,u,l){if(!t.value)return!0;var c=t.x-e.x,f=t.y-e.y,d=l-i,g=c*c+f*f;if(d*d/h<g)return g<a&&(0===c&&(g+=(c=V(r))*c),0===f&&(g+=(f=V(r))*f),g<s&&(g=Math.sqrt(s*g)),e.vx+=c*t.value*n/g,e.vy+=f*t.value*n/g),!0;if(!(t.length||g>=a)){(t.data!==e||t.next)&&(0===c&&(g+=(c=V(r))*c),0===f&&(g+=(f=V(r))*f),g<s&&(g=Math.sqrt(s*g)));do{t.data!==e&&(d=o[t.data.index]*n/g,e.vx+=c*d,e.vy+=f*d)}while(t=t.next)}}return u.initialize=function(e,n){t=e,r=n,l()},u.strength=function(t){return arguments.length?(i="function"==typeof t?t:j(+t),l(),u):i},u.distanceMin=function(t){return arguments.length?(s=t*t,u):Math.sqrt(s)},u.distanceMax=function(t){return arguments.length?(a=t*t,u):Math.sqrt(a)},u.theta=function(t){return arguments.length?(h=t*t,u):Math.sqrt(h)},u}function wt(t){return t.index}function vt(t,e){var r=t.get(e);if(!r)throw new Error("node not found: "+e);return r}function xt(t){var e,r,n,o,i,s,a=wt,h=function(t){return 1/Math.min(o[t.source.index],o[t.target.index])},u=j(30),l=1;function c(n){for(var o=0,a=t.length;o<l;++o)for(var h,u,c,f,d,g,p,y=0;y<a;++y)u=(h=t[y]).source,f=(c=h.target).x+c.vx-u.x-u.vx||V(s),d=c.y+c.vy-u.y-u.vy||V(s),f*=g=((g=Math.sqrt(f*f+d*d))-r[y])/g*n*e[y],d*=g,c.vx-=f*(p=i[y]),c.vy-=d*p,u.vx+=f*(p=1-p),u.vy+=d*p}function f(){if(n){var s,h,u=n.length,l=t.length,c=new Map(n.map(((t,e)=>[a(t,e,n),t])));for(s=0,o=new Array(u);s<l;++s)(h=t[s]).index=s,"object"!=typeof h.source&&(h.source=vt(c,h.source)),"object"!=typeof h.target&&(h.target=vt(c,h.target)),o[h.source.index]=(o[h.source.index]||0)+1,o[h.target.index]=(o[h.target.index]||0)+1;for(s=0,i=new Array(l);s<l;++s)h=t[s],i[s]=o[h.source.index]/(o[h.source.index]+o[h.target.index]);e=new Array(l),d(),r=new Array(l),g()}}function d(){if(n)for(var r=0,o=t.length;r<o;++r)e[r]=+h(t[r],r,t)}function g(){if(n)for(var e=0,o=t.length;e<o;++e)r[e]=+u(t[e],e,t)}return null==t&&(t=[]),c.initialize=function(t,e){n=t,s=e,f()},c.links=function(e){return arguments.length?(t=e,f(),c):t},c.id=function(t){return arguments.length?(a=t,c):a},c.iterations=function(t){return arguments.length?(l=+t,c):l},c.strength=function(t){return arguments.length?(h="function"==typeof t?t:j(+t),d(),c):h},c.distance=function(t){return arguments.length?(u="function"==typeof t?t:j(+t),g(),c):u},c}function Mt(t){return t.x+t.vx}function bt(t){return t.y+t.vy}function Et(t){var e,r,n,o=1,i=1;function s(){for(var t,s,h,u,l,c,f,d=e.length,g=0;g<i;++g)for(s=P(e,Mt,bt).visitAfter(a),t=0;t<d;++t)h=e[t],c=r[h.index],f=c*c,u=h.x+h.vx,l=h.y+h.vy,s.visit(p);function p(t,e,r,i,s){var a=t.data,d=t.r,g=c+d;if(!a)return e>u+g||i<u-g||r>l+g||s<l-g;if(a.index>h.index){var p=u-a.x-a.vx,y=l-a.y-a.vy,m=p*p+y*y;m<g*g&&(0===p&&(m+=(p=V(n))*p),0===y&&(m+=(y=V(n))*y),m=(g-(m=Math.sqrt(m)))/m*o,h.vx+=(p*=m)*(g=(d*=d)/(f+d)),h.vy+=(y*=m)*g,a.vx-=p*(g=1-g),a.vy-=y*g)}}}function a(t){if(t.data)return t.r=r[t.data.index];for(var e=t.r=0;e<4;++e)t[e]&&t[e].r>t.r&&(t.r=t[e].r)}function h(){if(e){var n,o,i=e.length;for(r=new Array(i),n=0;n<i;++n)o=e[n],r[o.index]=+t(o,n,e)}}return"function"!=typeof t&&(t=j(null==t?1:+t)),s.initialize=function(t,r){e=t,n=r,h()},s.iterations=function(t){return arguments.length?(i=+t,s):i},s.strength=function(t){return arguments.length?(o=+t,s):o},s.radius=function(e){return arguments.length?(t="function"==typeof e?e:j(+e),h(),s):t},s}function Nt(t){var e,r,n,o=j(.1);function i(t){for(var o,i=0,s=e.length;i<s;++i)(o=e[i]).vx+=(n[i]-o.x)*r[i]*t}function s(){if(e){var i,s=e.length;for(r=new Array(s),n=new Array(s),i=0;i<s;++i)r[i]=isNaN(n[i]=+t(e[i],i,e))?0:+o(e[i],i,e)}}return"function"!=typeof t&&(t=j(null==t?0:+t)),i.initialize=function(t){e=t,s()},i.strength=function(t){return arguments.length?(o="function"==typeof t?t:j(+t),s(),i):o},i.x=function(e){return arguments.length?(t="function"==typeof e?e:j(+e),s(),i):t},i}function St(t){var e,r,n,o=j(.1);function i(t){for(var o,i=0,s=e.length;i<s;++i)(o=e[i]).vy+=(n[i]-o.y)*r[i]*t}function s(){if(e){var i,s=e.length;for(r=new Array(s),n=new Array(s),i=0;i<s;++i)r[i]=isNaN(n[i]=+t(e[i],i,e))?0:+o(e[i],i,e)}}return"function"!=typeof t&&(t=j(null==t?0:+t)),i.initialize=function(t){e=t,s()},i.strength=function(t){return arguments.length?(o="function"==typeof t?t:j(+t),s(),i):o},i.y=function(e){return arguments.length?(t="function"==typeof e?e:j(+e),s(),i):t},i}function At(){function t(t){return function(){return t}}var e,r=function(t){return t.cluster},n=t(1),i=t(-1),s=t(100),a=t(.1),h=[0,0],u=[],l={},c=[],f=100,d=100,g={none:{x:0,y:0}},p=[],y="force",m=!0,w=.1;function v(t){if(!m)return v;e.tick(),M();for(var n=0,o=u.length,i=void 0,s=t*w;n<o;++n)(i=u[n]).vx+=(g[r(i)].x-i.x)*s,i.vy+=(g[r(i)].y-i.y)*s}function x(){u&&function(){if(u&&u.length){if(void 0===r(u[0]))throw Error("Couldnt find the grouping attribute for the nodes. Make sure to set it up with forceInBox.groupBy('clusterAttr') before calling .links()");var t,h,g,y,m,w=(t=[],h=[],g={},{},m=[],y=function(t){var e={};return t.forEach((function(t){var n=r(t);e[n]||(e[n]={count:0,sumforceNodeSize:0})})),t.forEach((function(t){var o=r(t),i=n(t),s=e[o];s.count=s.count+1,s.sumforceNodeSize=s.sumforceNodeSize+Math.PI*(i*i)*1.3,e[o]=s})),e}(u),m=function(t){var e={},n=[];return t.forEach((function(t){var n,o,i,s,a,h=(o=(n=t).source,i=n.target,(s=r(l[o]))<=(a=r(l[i]))?"".concat(s,"~").concat(a):"".concat(a,"~").concat(s)),u=0;void 0!==e[h]&&(u=e[h]),u+=1,e[h]=u})),Object.entries(e).forEach((function(t){var e=o(t,2),r=e[0],i=e[1],s=r.split("~")[0],a=r.split("~")[1];void 0!==s&&void 0!==a&&n.push({source:s,target:a,count:i})})),n}(c),Object.keys(y).forEach((function(e,r){var n=y[e];t.push({id:e,size:n.count,r:Math.sqrt(n.sumforceNodeSize/Math.PI)}),g[e]=r})),m.forEach((function(t){var e=t.source,r=t.target,n=g[e],o=g[r];void 0!==n&&void 0!==o&&h.push({source:n,target:o,count:t.count})})),{nodes:t,links:h});e=yt(w.nodes).force("x",Nt(f).strength(.1)).force("y",St(d).strength(.1)).force("collide",Et((function(t){return t.r})).iterations(4)).force("charge",mt().strength(i)).force("links",xt(w.nodes.length?w.links:[]).distance(s).strength(a)),p=e.nodes(),M()}}()}function M(){return g={none:{x:0,y:0}},p.forEach((function(t){g[t.id]={x:t.x-h[0],y:t.y-h[1]}})),g}function b(t){l={},t.forEach((function(t){l[t.id]=t}))}return v.initialize=function(t){u=t,x()},v.template=function(t){return arguments.length?(y=t,x(),v):y},v.groupBy=function(t){return arguments.length?"string"==typeof t?(r=function(e){return e[t]},v):(r=t,v):r},v.enableGrouping=function(t){return arguments.length?(m=t,v):m},v.strength=function(t){return arguments.length?(w=t,v):w},v.centerX=function(t){return arguments.length?(f=t,v):f},v.centerY=function(t){return arguments.length?(d=t,v):d},v.nodes=function(t){return arguments.length?(b(t||[]),u=t||[],v):u},v.links=function(t){return arguments.length?(c=t||[],x(),v):c},v.forceNodeSize=function(e){return arguments.length?(n="function"==typeof e?e:t(+e),x(),v):n},v.nodeSize=v.forceNodeSize,v.forceCharge=function(e){return arguments.length?(i="function"==typeof e?e:t(+e),x(),v):i},v.forceLinkDistance=function(e){return arguments.length?(s="function"==typeof e?e:t(+e),x(),v):s},v.forceLinkStrength=function(e){return arguments.length?(a="function"==typeof e?e:t(+e),x(),v):a},v.offset=function(t){return arguments.length?(h=t,v):h},v.getFocis=M,v}var kt={center:[0,0],preventOverlap:!1,nodeSize:void 0,nodeSpacing:void 0,linkDistance:50,forceSimulation:null,alphaDecay:.028,alphaMin:.001,alpha:.3,collideStrength:1,clustering:!1,clusterNodeStrength:-1,clusterEdgeStrength:.1,clusterEdgeDistance:100,clusterFociStrength:.8,clusterNodeSize:10},Dt=function(){function t(t){void 0===t&&(t={}),this.options=t,this.id="d3force",this.running=!1,this.options=r(r({},kt),t)}return t.prototype.execute=function(t,e){return this.genericForceLayout(!1,t,e)},t.prototype.assign=function(t,e){this.genericForceLayout(!0,t,e)},t.prototype.stop=function(){var t;null===(t=this.forceSimulation)||void 0===t||t.stop(),this.running=!1},t.prototype.restart=function(){var t;null===(t=this.forceSimulation)||void 0===t||t.restart(),this.running=!0},t.prototype.tick=function(t){var e=this;void 0===t&&(t=1),this.forceSimulation.tick(t);var r={nodes:It(this.lastLayoutNodes),edges:_t(this.lastLayoutEdges)};return this.lastAssign&&r.nodes.forEach((function(t){return e.lastGraph.mergeNodeData(t.id,{x:t.data.x,y:t.data.y})})),this.lastOptions.onLayoutEnd&&this.lastOptions.onLayoutEnd(r),r},t.prototype.genericForceLayout=function(t,e,n){var o=this,i=r(r({},this.options),n),s=e.getAllNodes(),a=e.getAllEdges(),h=s.map((function(t){var e,n;return r(r({},v(t)),{x:null===(e=t.data)||void 0===e?void 0:e.x,y:null===(n=t.data)||void 0===n?void 0:n.y})})),u=a.map((function(t){return v(t)}));if(this.lastLayoutNodes=h,this.lastLayoutEdges=u,this.lastAssign=t,this.lastGraph=e,this.lastOptions=i,!this.running){var l=i.alphaMin,c=i.alphaDecay,f=i.alpha,d=i.nodeStrength,g=i.edgeStrength,p=i.linkDistance,y=i.clustering,m=i.clusterFociStrength,w=i.clusterEdgeDistance,x=i.clusterEdgeStrength,M=i.clusterNodeStrength,b=i.clusterNodeSize,E=i.collideStrength,N=void 0===E?1:E,S=i.center,A=void 0===S?[0,0]:S,k=i.preventOverlap,D=i.nodeSize,I=i.nodeSpacing,_=i.onTick,R=i.onLayoutEnd,z=i.forceSimulation;if(z)y&&((T=At()).nodes(h),T.links(u)),z.nodes(h),u&&(C=xt().id((function(t){return t.id})).links(u),g&&C.strength(g),p&&C.distance(p),z.force("link",C)),k&&this.overlapProcess(z,{nodeSize:D,nodeSpacing:I,collideStrength:N}),z.alpha(f).restart(),this.running=!0;else try{var T,O=mt();if(d&&O.strength(d),z=yt().nodes(h),y&&((T=At()).centerX(A[0]).centerY(A[1]).template("force").strength(m),u&&T.links(u),h&&T.nodes(h),T.forceLinkDistance(w).forceLinkStrength(x).forceCharge(M).forceNodeSize(b),z.force("group",T)),z.force("center",function(t,e){var r,n=1;function o(){var o,i,s=r.length,a=0,h=0;for(o=0;o<s;++o)a+=(i=r[o]).x,h+=i.y;for(a=(a/s-t)*n,h=(h/s-e)*n,o=0;o<s;++o)(i=r[o]).x-=a,i.y-=h}return null==t&&(t=0),null==e&&(e=0),o.initialize=function(t){r=t},o.x=function(e){return arguments.length?(t=+e,o):t},o.y=function(t){return arguments.length?(e=+t,o):e},o.strength=function(t){return arguments.length?(n=+t,o):n},o}(A[0],A[1])).force("charge",O).alpha(f).alphaDecay(c).alphaMin(l),k&&this.overlapProcess(z,{nodeSize:D,nodeSpacing:I,collideStrength:N}),u){var C=xt().id((function(t){return t.id})).links(u);g&&C.strength(g),p&&C.distance(p),z.force("link",C)}z.on("tick",(function(){var r=It(h);null==_||_({nodes:r,edges:_t(u)}),t&&r.forEach((function(t){return e.mergeNodeData(t.id,{x:t.data.x,y:t.data.y})}))})).on("end",(function(){o.running=!1;var r=It(h);null==R||R({nodes:r,edges:_t(u)}),t&&r.forEach((function(t){return e.mergeNodeData(t.id,{x:t.data.x,y:t.data.y})}))})),this.running=!0}catch(t){this.running=!1,console.warn(t)}this.forceSimulation=z;var P=It(h),q=_t(u);return t&&P.forEach((function(t){return e.mergeNodeData(t.id,{x:t.data.x,y:t.data.y})})),{nodes:P,edges:q}}},t.prototype.overlapProcess=function(t,e){var r,n,o=e.nodeSize,i=e.nodeSpacing,s=e.collideStrength;if(n=m(i)?function(){return i}:x(i)?i:function(){return 0},o)if(x(o))r=function(t){return o(t)+n(t)};else if(c(o)){var a=(o[0]>o[1]?o[0]:o[1])/2;r=function(t){return a+n(t)}}else if(m(o)){var h=o/2;r=function(t){return h+n(t)}}else r=function(){return 10};else r=function(t){return t.size?c(t.size)?(t.size[0]>t.size[1]?t.size[0]:t.size[1])/2+n(t):M(t.size)?(t.size.width>t.size.height?t.size.width:t.size.height)/2+n(t):t.size/2+n(t):10+n(t)};t.force("collisionForce",Et(r).strength(s))},t}(),It=function(t){return t.map((function(t){var e=t.x,o=t.y,i=n(t,["x","y"]);return r(r({},i),{data:r(r({},i.data),{x:e,y:o})})}))},_t=function(t){return t.map((function(t){var e=t.source,o=t.target,i=n(t,["source","target"]);return r(r({},i),{source:e.id,target:o.id})}))};function Rt(t){var e=0,r=0,n=0;if(t.length){for(var o=0;o<4;o++)(i=t[o])&&i.weight&&(e+=i.weight,r+=i.x*i.weight,n+=i.y*i.weight);t.x=r/e,t.y=n/e,t.weight=e}else{var i=t;t.x=i.data.x,t.y=i.data.y,t.weight=i.data.weight}}var zt={maxIteration:500,gravity:10,factor:1,edgeStrength:200,nodeStrength:1e3,coulombDisScale:.005,damping:.9,maxSpeed:500,minMovement:.4,interval:.02,linkDistance:200,clusterNodeStrength:20,preventOverlap:!0,distanceThresholdMode:"mean"},Tt=function(){function t(t){void 0===t&&(t={}),this.options=t,this.id="force",this.timeInterval=0,this.judgingDistance=0,this.running=!1,this.options=r(r({},zt),t)}return t.prototype.execute=function(t,e){return this.genericForceLayout(!1,t,e)},t.prototype.assign=function(t,e){this.genericForceLayout(!0,t,e)},t.prototype.stop=function(){this.timeInterval&&"undefined"!=typeof window&&window.clearInterval(this.timeInterval),this.running=!1},t.prototype.restart=function(){this.running=!0},t.prototype.tick=function(t){var e=this;if(void 0===t&&(t=this.options.maxIteration||1),this.lastResult)return this.lastResult;for(var r=0;(this.judgingDistance>this.lastOptions.minMovement||r<1)&&r<t;r++)this.runOneStep(this.lastCalcGraph,this.lastGraph,r,this.lastVelMap,this.lastOptions),this.updatePosition(this.lastGraph,this.lastCalcGraph,this.lastVelMap,this.lastOptions);var n={nodes:this.lastLayoutNodes,edges:this.lastLayoutEdges};return this.lastAssign&&n.nodes.forEach((function(t){return e.lastGraph.mergeNodeData(t.id,{x:t.data.x,y:t.data.y})})),this.lastOptions.onLayoutEnd&&this.lastOptions.onLayoutEnd(n),n},t.prototype.genericForceLayout=function(t,e,n){var o=this,i=r(r({},this.options),n),s=e.getAllNodes(),a=e.getAllEdges(),h=this.formatOptions(i,e),l=h.width,c=h.height,f=h.nodeSize,d=h.getMass,g=h.nodeStrength,p=h.edgeStrength,y=h.linkDistance,w=s.map((function(t){return r(r({},t),{data:r(r({},t.data),{x:m(t.data.x)?t.data.x:Math.random()*l,y:m(t.data.y)?t.data.y:Math.random()*c,size:f(t)||30,mass:d(t),nodeStrength:g(t)})})})),v=a.map((function(t){return r(r({},t),{data:r(r({},t.data),{edgeStrength:p(t),linkDistance:y(t,e.getNode(t.source),e.getNode(t.target))})})}));if(!(null==s?void 0:s.length))return this.lastResult={nodes:[],edges:a},{nodes:[],edges:a};var x={};s.forEach((function(t,e){x[t.id]={x:0,y:0}}));var M=new u({nodes:w,edges:v});this.formatCentripetal(h,M);var b=h.maxIteration,E=h.minMovement,N=h.onLayoutEnd,S=h.onTick;if(this.lastLayoutNodes=w,this.lastLayoutEdges=v,this.lastAssign=t,this.lastGraph=e,this.lastCalcGraph=M,this.lastOptions=h,this.lastVelMap=x,"undefined"!=typeof window){var A=0;return this.timeInterval=window.setInterval((function(){s&&o.running&&(o.runOneStep(M,e,A,x,h),o.updatePosition(e,M,x,h),t&&w.forEach((function(t){return e.mergeNodeData(t.id,{x:t.data.x,y:t.data.y})})),null==S||S({nodes:Lt(e,w),edges:a}),(++A>=b||o.judgingDistance<E)&&(null==N||N({nodes:Lt(e,w),edges:a}),window.clearInterval(o.timeInterval)))}),0),this.running=!0,{nodes:Lt(e,w),edges:a}}},t.prototype.formatOptions=function(t,e){var r=t,n=t.width,o=t.height,i=t.getMass;if(r.width=n||"undefined"==typeof window?n:window.innerWidth,r.height=o||"undefined"==typeof window?o:window.innerHeight,t.center||(r.center=[r.width/2,r.height/2]),i||(r.getMass=function(t){var r=1;m(null==t?void 0:t.data.mass)&&(r=null==t?void 0:t.data.mass);var n=e.getDegree(t.id,"both");return!n||n<5?r:5*n*r}),t.preventOverlap){var s=b(0,t.nodeSpacing);t.nodeSize?c(t.nodeSize)?r.nodeSize=function(e){var r=t.nodeSize;return Math.max(r[0],r[1])+s(e)}:r.nodeSize=function(e){return t.nodeSize+s(e)}:r.nodeSize=function(t){var e=((null==t?void 0:t.data)||{}).size;return e?c(e)?Math.max(e[0],e[1])+s(t):M(e)?Math.max(e.width,e.height)+s(t):e+s(t):10+s(t)}}return r.linkDistance=t.linkDistance?b(1,t.linkDistance):function(t){return 1+r.nodeSize(e.getNode(t.source))+r.nodeSize(e.getNode(t.target))},r.nodeStrength=b(1,t.nodeStrength),r.edgeStrength=b(1,t.edgeStrength),t},t.prototype.formatCentripetal=function(t,e){var r,n=t.centripetalOptions,o=t.center,i=t.clusterNodeStrength,s=t.leafCluster,a=t.clustering,h=t.nodeClusterBy,u=e.getAllNodes(),l=n||{leaf:2,single:2,others:1,center:function(t){return{x:o[0],y:o[1]}}};"function"!=typeof i&&(t.clusterNodeStrength=function(t){return i});var c=[];if(s&&h&&(r=Ot(e,h),c=Array.from(new Set(null==u?void 0:u.map((function(t){return t.data[h]}))))||[],t.centripetalOptions=Object.assign(l,{single:100,leaf:function(e){var n=r[e.id]||{},o=n.siblingLeaves,i=n.sameTypeLeaves;return(null==i?void 0:i.length)===(null==o?void 0:o.length)||1===(null==c?void 0:c.length)?1:t.clusterNodeStrength(e)},others:1,center:function(t){var n,o=e.getDegree(t.id,"both");if(!o)return{x:100,y:100};if(1===o){var i=(r[t.id]||{}).sameTypeLeaves,s=void 0===i?[]:i;1===s.length?n=void 0:s.length>1&&(n=qt(s))}else n=void 0;return{x:null==n?void 0:n.x,y:null==n?void 0:n.y}}})),a&&h){r||(r=Ot(e,h)),c||(c=Array.from(new Set(u.map((function(t){return t.data[h]}))))),c=c.filter((function(t){return void 0!==t}));var f={};c.forEach((function(t){var r=u.filter((function(e){return e.data[h]===t})).map((function(t){return e.getNode(t.id)}));f[t]=qt(r)})),t.centripetalOptions=Object.assign(l,{single:function(e){return t.clusterNodeStrength(e)},leaf:function(e){return t.clusterNodeStrength(e)},others:function(e){return t.clusterNodeStrength(e)},center:function(t){var e=f[t.data[h]];return{x:null==e?void 0:e.x,y:null==e?void 0:e.y}}})}var d=t.centripetalOptions||{},g=d.leaf,p=d.single,y=d.others;g&&"function"!=typeof g&&(t.centripetalOptions.leaf=function(){return g}),p&&"function"!=typeof p&&(t.centripetalOptions.single=function(){return p}),y&&"function"!=typeof y&&(t.centripetalOptions.others=function(){return y})},t.prototype.runOneStep=function(t,e,r,n,o){var i={},s=t.getAllNodes(),a=t.getAllEdges();if(null==s?void 0:s.length){var h=o.monitor;this.calRepulsive(t,i,o),a&&this.calAttractive(t,i),this.calGravity(t,e,i,o),this.updateVelocity(t,i,n,o),h&&h({energy:this.calTotalEnergy(i,s),nodes:e.getAllNodes(),edges:e.getAllEdges(),iterations:r})}},t.prototype.calTotalEnergy=function(t,e){if(!(null==e?void 0:e.length))return 0;var r=0;return e.forEach((function(e,n){var o=t[e.id].x,i=t[e.id].y,s=o*o+i*i,a=e.data.mass;r+=(void 0===a?1:a)*s*.5})),r},t.prototype.calRepulsive=function(t,e,r){var n=r.factor,o=r.coulombDisScale;!function(t,e,r,n){var o=e/r,i=t.getAllNodes(),s=i.map((function(t,e){var r=t.data,n=r.nodeStrength;return{x:r.x,y:r.y,size:r.size,index:e,vx:0,vy:0,weight:o*n}})),a=P(s,(function(t){return t.x}),(function(t){return t.y})).visitAfter(Rt);s.forEach((function(t){!function(t,e){e.visit((function(e,r,n,o,i){return function(t,e,r,n,o,i){var s=i.x-t.x||.1,a=i.y-t.y||.1,h=n-e,u=s*s+a*a,l=Math.sqrt(u)*u;if(h*h*.81<u){var c=t.weight/l;return i.vx+=s*c,i.vy+=a*c,!0}if(t.length)return!1;t.data!==i&&(c=t.data.weight/l,i.vx+=s*c,i.vy+=a*c)}(e,r,0,o,0,t)}))}(t,a)})),s.map((function(t,e){var r=i[e],o=r.id,s=r.data.mass,a=void 0===s?1:s;n[o]={x:t.vx/a,y:t.vy/a}}))}(t,n,o*o,e)},t.prototype.calAttractive=function(t,e){t.getAllEdges().forEach((function(r,n){var o=r.source,i=r.target,s=t.getNode(o),a=t.getNode(i);if(s&&a){var h=a.data.x-s.data.x,u=a.data.y-s.data.y;h||u||(h=.01*Math.random(),u=.01*Math.random());var l=Math.sqrt(h*h+u*u),c=h/l,f=u/l,d=r.data||{},g=d.linkDistance,p=void 0===g?200:g,y=d.edgeStrength,m=(p-l)*(void 0===y?200:y),w=1/(s.data.mass||1),v=1/(a.data.mass||1),x=c*m,M=f*m;e[o].x-=x*w,e[o].y-=M*w,e[i].x+=x*v,e[i].y+=M*v}}))},t.prototype.calGravity=function(t,e,r,n){var i=n.getCenter,s=t.getAllNodes(),a=e.getAllNodes(),h=e.getAllEdges(),u=n.width,l=n.height,c=n.center,f=n.gravity,d=n.centripetalOptions;s&&s.forEach((function(n){var s=n.id,g=n.data,p=g.mass,y=g.x,w=g.y,v=e.getNode(s),x=0,M=0,b=f,E=t.getDegree(s,"in"),N=t.getDegree(s,"out"),S=t.getDegree(s,"both"),A=null==i?void 0:i(v,S);if(A){var k=o(A,3);x=y-k[0],M=w-k[1],b=k[2]}else x=y-c[0],M=w-c[1];if(b&&(r[s].x-=b*x/p,r[s].y-=b*M/p),d){var D=d.leaf,I=d.single,_=d.others,R=d.center,z=(null==R?void 0:R(v,a,h,u,l))||{x:0,y:0,centerStrength:0},T=z.x,O=z.y,C=z.centerStrength;if(!m(T)||!m(O))return;var P=(y-T)/p,q=(w-O)/p;if(C&&(r[s].x-=C*P,r[s].y-=C*q),0===S){var L=I(v);if(!L)return;return r[s].x-=L*P,void(r[s].y-=L*q)}if(0===E||0===N){var F=D(v,a,h);if(!F)return;return r[s].x-=F*P,void(r[s].y-=F*q)}var j=_(v);if(!j)return;r[s].x-=j*P,r[s].y-=j*q}}))},t.prototype.updateVelocity=function(t,e,r,n){var o=n.damping,i=n.maxSpeed,s=n.interval,a=t.getAllNodes();(null==a?void 0:a.length)&&a.forEach((function(t){var n=t.id,a=(r[n].x+e[n].x*s)*o||.01,h=(r[n].y+e[n].y*s)*o||.01,u=Math.sqrt(a*a+h*h);if(u>i){var l=i/u;a*=l,h*=l}r[n]={x:a,y:h}}))},t.prototype.updatePosition=function(t,e,r,n){var o=this,i=n.distanceThresholdMode,s=n.interval,a=e.getAllNodes();if(null==a?void 0:a.length){var h=0;"max"===i?this.judgingDistance=-1/0:"min"===i&&(this.judgingDistance=1/0),a.forEach((function(n){var a=n.id,u=t.getNode(a);if(m(u.data.fx)&&m(u.data.fy))e.mergeNodeData(a,{x:u.data.fx,y:u.data.fy});else{var l=r[a].x*s,c=r[a].y*s;e.mergeNodeData(a,{x:n.data.x+l,y:n.data.y+c});var f=Math.sqrt(l*l+c*c);switch(i){case"max":o.judgingDistance<f&&(o.judgingDistance=f);break;case"min":o.judgingDistance>f&&(o.judgingDistance=f);break;default:h+=f}}})),i&&"mean"!==i||(this.judgingDistance=h/a.length)}else this.judgingDistance=0},t}(),Ot=function(t,e){var r=t.getAllNodes();if(!(null==r?void 0:r.length))return{};var n={};return r.forEach((function(r,o){1===t.getDegree(r.id,"both")&&(n[r.id]=Ct(t,"leaf",r,e))})),n},Ct=function(t,e,r,n){var o=t.getDegree(r.id,"in"),i=t.getDegree(r.id,"out"),s=r,a=[];return 0===o?(s=t.getSuccessors(r.id)[0],a=t.getNeighbors(s.id)):0===i&&(s=t.getPredecessors(r.id)[0],a=t.getNeighbors(s.id)),a=a.filter((function(e){return 0===t.getDegree(e.id,"in")||0===t.getDegree(e.id,"out")})),{coreNode:s,siblingLeaves:a,sameTypeLeaves:Pt(t,e,n,r,a)}},Pt=function(t,e,r,n,o){var i=n.data[r]||"",s=(null==o?void 0:o.filter((function(t){return t.data[r]===i})))||[];return"leaf"===e&&(s=s.filter((function(e){return 0===t.getDegree(e.id,"in")||0===t.getDegree(e.id,"out")}))),s},qt=function(t){var e={x:0,y:0};t.forEach((function(t){var r=t.data,n=r.x,o=r.y;e.x+=n||0,e.y+=o||0}));var r=t.length||1;return{x:e.x/r,y:e.y/r}},Lt=function(t,e){return e.map((function(e){var n=e.id,o=e.data,i=t.getNode(n);return r(r({},i),{data:r(r({},i.data),{x:o.x,y:o.y})})}))},Ft=function(){function t(t){this.id=t.id||0,this.rx=t.rx,this.ry=t.ry,this.fx=0,this.fy=0,this.mass=t.mass,this.degree=t.degree,this.g=t.g||0}return t.prototype.distanceTo=function(t){var e=this.rx-t.rx,r=this.ry-t.ry;return Math.hypot(e,r)},t.prototype.setPos=function(t,e){this.rx=t,this.ry=e},t.prototype.resetForce=function(){this.fx=0,this.fy=0},t.prototype.addForce=function(t){var e=t.rx-this.rx,r=t.ry-this.ry,n=Math.hypot(e,r);n=n<1e-4?1e-4:n;var o=this.g*(this.degree+1)*(t.degree+1)/n;this.fx+=o*e/n,this.fy+=o*r/n},t.prototype.in=function(t){return t.contains(this.rx,this.ry)},t.prototype.add=function(e){var r=this.mass+e.mass;return new t({rx:(this.rx*this.mass+e.rx*e.mass)/r,ry:(this.ry*this.mass+e.ry*e.mass)/r,mass:r,degree:this.degree+e.degree})},t}();const jt=Ft;const Vt=function(){function t(t){this.xmid=t.xmid,this.ymid=t.ymid,this.length=t.length,this.massCenter=t.massCenter||[0,0],this.mass=t.mass||1}return t.prototype.getLength=function(){return this.length},t.prototype.contains=function(t,e){var r=this.length/2;return t<=this.xmid+r&&t>=this.xmid-r&&e<=this.ymid+r&&e>=this.ymid-r},t.prototype.NW=function(){return new t({xmid:this.xmid-this.length/4,ymid:this.ymid+this.length/4,length:this.length/2})},t.prototype.NE=function(){return new t({xmid:this.xmid+this.length/4,ymid:this.ymid+this.length/4,length:this.length/2})},t.prototype.SW=function(){return new t({xmid:this.xmid-this.length/4,ymid:this.ymid-this.length/4,length:this.length/2})},t.prototype.SE=function(){return new t({xmid:this.xmid+this.length/4,ymid:this.ymid-this.length/4,length:this.length/2})},t}(),Wt=function(){function t(t){this.body=null,this.quad=null,this.NW=null,this.NE=null,this.SW=null,this.SE=null,this.theta=.5,null!=t&&(this.quad=t)}return t.prototype.insert=function(e){null!=this.body?this._isExternal()?(this.quad&&(this.NW=new t(this.quad.NW()),this.NE=new t(this.quad.NE()),this.SW=new t(this.quad.SW()),this.SE=new t(this.quad.SE())),this._putBody(this.body),this._putBody(e),this.body=this.body.add(e)):(this.body=this.body.add(e),this._putBody(e)):this.body=e},t.prototype._putBody=function(t){this.quad&&(t.in(this.quad.NW())&&this.NW?this.NW.insert(t):t.in(this.quad.NE())&&this.NE?this.NE.insert(t):t.in(this.quad.SW())&&this.SW?this.SW.insert(t):t.in(this.quad.SE())&&this.SE&&this.SE.insert(t))},t.prototype._isExternal=function(){return null==this.NW&&null==this.NE&&null==this.SW&&null==this.SE},t.prototype.updateForce=function(t){null!=this.body&&t!==this.body&&(this._isExternal()||(this.quad?this.quad.getLength():0)/this.body.distanceTo(t)<this.theta?t.addForce(this.body):(this.NW&&this.NW.updateForce(t),this.NE&&this.NE.updateForce(t),this.SW&&this.SW.updateForce(t),this.SE&&this.SE.updateForce(t)))},t}();var $t={center:[0,0],width:300,height:300,kr:5,kg:1,mode:"normal",preventOverlap:!1,dissuadeHubs:!1,maxIteration:0,ks:.1,ksmax:10,tao:.1},Gt=function(){function t(t){void 0===t&&(t={}),this.options=t,this.id="forceAtlas2",this.options=r(r({},$t),t)}return t.prototype.execute=function(t,e){return this.genericForceAtlas2Layout(!1,t,e)},t.prototype.assign=function(t,e){this.genericForceAtlas2Layout(!0,t,e)},t.prototype.genericForceAtlas2Layout=function(t,e,n){var o=e.getAllEdges(),i=e.getAllNodes(),s=this.formatOptions(n,i.length),a=s.width,h=s.height,l=s.prune,c=s.maxIteration,f=s.nodeSize,d=s.center,g=s.onLayoutEnd;if(!(null==i?void 0:i.length)||1===i.length)return N(e,t,d,g);var p=i.map((function(t){return v(t,[a,h])})),y=o.filter((function(t){return t.source!==t.target})),m=new u({nodes:p,edges:y}),w=this.getSizes(m,e,f);if(this.run(m,e,c,w,t,s),l){for(var x=0;x<y.length;x+=1){var M=y[x],b=M.source,E=M.target,S=m.getDegree(b),A=m.getDegree(b);if(S<=1){var k=m.getNode(E);m.mergeNodeData(b,{x:k.data.x,y:k.data.y})}else if(A<=1){var D=m.getNode(b);m.mergeNodeData(E,{x:D.data.x,y:D.data.y})}}var I=r(r({},s),{prune:!1,barnesHut:!1});this.run(m,e,100,w,t,I)}var _={nodes:p,edges:o};return null==g||g(_),_},t.prototype.getSizes=function(t,e,r){for(var n=t.getAllNodes(),s={},a=0;a<n.length;a+=1){var h=n[a],u=h.id,l=h.data;if(s[u]=10,m(l.size))s[u]=l.size;else if(c(l.size))isNaN(l.size[0])||(s[u]=Math.max(l.size[0])),isNaN(l.size[1])||(s[u]=Math.max(l.size[1]));else if(M(l.size))s[u]=Math.max(l.size.width,l.size.height);else if(x(r)){var f=r(e.getNode(u));c(f)?s[u]=Math.max.apply(Math,i([],o(f),!1)):s[u]=f}else c(r)?s[u]=Math.max.apply(Math,i([],o(r),!1)):m(r)&&(s[u]=r)}return s},t.prototype.formatOptions=function(t,e){void 0===t&&(t={});var n=r(r({},this.options),t),o=n.center,i=n.width,s=n.height,a=n.barnesHut,h=n.prune,u=n.maxIteration,l=n.kr,c=n.kg;return n.width=i||"undefined"==typeof window?i:window.innerWidth,n.height=s||"undefined"==typeof window?s:window.innerHeight,n.center=o||[n.width/2,n.height/2],void 0===a&&e>250&&(n.barnesHut=!0),void 0===h&&e>100&&(n.prune=!0),0!==u||h?0===u&&h&&(n.maxIteration=100,e<=200&&e>100?n.maxIteration=500:e>200&&(n.maxIteration=950)):(n.maxIteration=250,e<=200&&e>100?n.maxIteration=1e3:e>200&&(n.maxIteration=1200)),l||(n.kr=50,e>100&&e<=500?n.kr=20:e>500&&(n.kr=1)),c||(n.kg=20,e>100&&e<=500?n.kg=10:e>500&&(n.kg=1)),n},t.prototype.run=function(t,e,r,n,o,i){for(var s=i.kr,a=i.barnesHut,h=i.onTick,u=t.getAllNodes(),l=0,c=r,f={},d={},g={},p=0;p<u.length;p+=1){var y=u[p],m=y.data,w=y.id;if(f[w]=[0,0],a){var v={id:p,rx:m.x,ry:m.y,mass:1,g:s,degree:t.getDegree(w)};g[w]=new jt(v)}}for(;c>0;)l=this.oneStep(t,{iter:c,preventOverlapIters:50,krPrime:100,sg:l,forces:f,preForces:d,bodies:g,sizes:n},i),c--,null==h||h({nodes:u,edges:e.getAllEdges()});return t},t.prototype.oneStep=function(t,e,r){for(var n=e.iter,s=e.preventOverlapIters,a=e.krPrime,h=e.sg,u=e.preForces,l=e.bodies,c=e.sizes,f=e.forces,d=r.preventOverlap,g=r.barnesHut,p=t.getAllNodes(),y=0;y<p.length;y+=1){var m=p[y].id;u[m]=i([],o(f[m]),!1),f[m]=[0,0]}return f=this.getAttrForces(t,n,s,c,f,r),f=g&&(d&&n>s||!d)?this.getOptRepGraForces(t,f,l,r):this.getRepGraForces(t,n,s,f,a,c,r),this.updatePos(t,f,u,h,r)},t.prototype.getAttrForces=function(t,e,r,n,o,i){for(var s=i.preventOverlap,a=i.dissuadeHubs,h=i.mode,u=i.prune,l=t.getAllEdges(),c=0;c<l.length;c+=1){var f=l[c],d=f.source,g=f.target,p=t.getNode(d),y=t.getNode(g),m=t.getDegree(d),w=t.getDegree(g);if(!u||!(m<=1||w<=1)){var v=[y.data.x-p.data.x,y.data.y-p.data.y],x=Math.hypot(v[0],v[1]);x=x<1e-4?1e-4:x,v[0]=v[0]/x,v[1]=v[1]/x,s&&e<r&&(x=x-n[d]-n[g]);var M=x,b=M;"linlog"===h&&(b=M=Math.log(1+x)),a&&(M=x/m,b=x/w),s&&e<r&&x<=0?(M=0,b=0):s&&e<r&&x>0&&(M=x,b=x),o[d][0]+=M*v[0],o[g][0]-=b*v[0],o[d][1]+=M*v[1],o[g][1]-=b*v[1]}}return o},t.prototype.getOptRepGraForces=function(t,e,r,n){for(var o=n.kg,i=n.center,s=n.prune,a=t.getAllNodes(),h=a.length,u=9e10,l=-9e10,c=9e10,f=-9e10,d=0;d<h;d+=1){var g=a[d],p=g.id,y=g.data;s&&t.getDegree(p)<=1||(r[p].setPos(y.x,y.y),y.x>=l&&(l=y.x),y.x<=u&&(u=y.x),y.y>=f&&(f=y.y),y.y<=c&&(c=y.y))}var m=Math.max(l-u,f-c),w=new Vt({xmid:(l+u)/2,ymid:(f+c)/2,length:m,massCenter:i,mass:h}),v=new Wt(w);for(d=0;d<h;d+=1)p=a[d].id,s&&t.getDegree(p)<=1||r[p].in(w)&&v.insert(r[p]);for(d=0;d<h;d+=1){var x=a[d],M=(p=x.id,y=x.data,t.getDegree(p));if(!(s&&M<=1)){r[p].resetForce(),v.updateForce(r[p]),e[p][0]-=r[p].fx,e[p][1]-=r[p].fy;var b=[y.x-i[0],y.y-i[1]],E=Math.hypot(b[0],b[1]);E=E<1e-4?1e-4:E,b[0]=b[0]/E,b[1]=b[1]/E;var N=o*(M+1);e[p][0]-=N*b[0],e[p][1]-=N*b[1]}}return e},t.prototype.getRepGraForces=function(t,e,r,n,o,i,s){for(var a=s.preventOverlap,h=s.kr,u=s.kg,l=s.center,c=s.prune,f=t.getAllNodes(),d=f.length,g=0;g<d;g+=1){for(var p=f[g],y=t.getDegree(p.id),m=g+1;m<d;m+=1){var w=f[m],v=t.getDegree(w.id);if(!c||!(y<=1||v<=1)){var x=[w.data.x-p.data.x,w.data.y-p.data.y],M=Math.hypot(x[0],x[1]);M=M<1e-4?1e-4:M,x[0]=x[0]/M,x[1]=x[1]/M,a&&e<r&&(M=M-i[p.id]-i[w.id]);var b=h*(y+1)*(v+1)/M;a&&e<r&&M<0?b=o*(y+1)*(v+1):a&&e<r&&0===M?b=0:a&&e<r&&M>0&&(b=h*(y+1)*(v+1)/M),n[p.id][0]-=b*x[0],n[w.id][0]+=b*x[0],n[p.id][1]-=b*x[1],n[w.id][1]+=b*x[1]}}var E=[p.data.x-l[0],p.data.y-l[1]],N=Math.hypot(E[0],E[1]);E[0]=E[0]/N,E[1]=E[1]/N;var S=u*(y+1);n[p.id][0]-=S*E[0],n[p.id][1]-=S*E[1]}return n},t.prototype.updatePos=function(t,e,r,n,o){for(var i=o.ks,s=o.tao,a=o.prune,h=o.ksmax,u=t.getAllNodes(),l=u.length,c=[],f=[],d=0,g=0,p=n,y=0;y<l;y+=1){var w=u[y].id,v=t.getDegree(w);if(!(a&&v<=1)){var x=[e[w][0]-r[w][0],e[w][1]-r[w][1]],M=Math.hypot(x[0],x[1]),b=[e[w][0]+r[w][0],e[w][1]+r[w][1]],E=Math.hypot(b[0],b[1]);c[y]=M,f[y]=E/2,d+=(v+1)*c[y],g+=(v+1)*f[y]}}var N=p;for(p=s*g/d,0!==N&&(p=p>1.5*N?1.5*N:p),y=0;y<l;y+=1){var S=u[y],A=(w=S.id,S.data);if(v=t.getDegree(w),!(a&&v<=1||m(A.fx)&&m(A.fy))){var k=i*p/(1+p*Math.sqrt(c[y])),D=Math.hypot(e[w][0],e[w][1]),I=h/(D=D<1e-4?1e-4:D),_=(k=k>I?I:k)*e[w][0],R=k*e[w][1];t.mergeNodeData(w,{x:A.x+_,y:A.y+R})}}return p},t}(),Ut={maxIteration:1e3,gravity:10,speed:5,clustering:!1,clusterGravity:10,width:300,height:300,nodeClusterBy:"cluster"},Bt=function(){function t(t){void 0===t&&(t={}),this.options=t,this.id="fruchterman",this.timeInterval=0,this.running=!1,this.options=r(r({},Ut),t)}return t.prototype.execute=function(t,e){return this.genericFruchtermanLayout(!1,t,e)},t.prototype.assign=function(t,e){this.genericFruchtermanLayout(!0,t,e)},t.prototype.stop=function(){this.timeInterval&&"undefined"!=typeof window&&window.clearInterval(this.timeInterval),this.running=!1},t.prototype.restart=function(){this.running=!0},t.prototype.tick=function(t){var e=this;if(void 0===t&&(t=this.options.maxIteration||1),this.lastResult)return this.lastResult;for(var r=0;r<t;r++)this.runOneStep(this.lastGraph,this.lastClusterMap,this.lastOptions);var n={nodes:this.lastLayoutNodes,edges:this.lastLayoutEdges};return this.lastAssign&&n.nodes.forEach((function(t){return e.lastGraph.mergeNodeData(t.id,{x:t.data.x,y:t.data.y})})),this.lastOptions.onLayoutEnd&&this.lastOptions.onLayoutEnd(n),n},t.prototype.genericFruchtermanLayout=function(t,e,n){var o=this;if(!this.running){var i=this.formatOptions(n),s=i.width,a=i.height,h=i.center,l=i.clustering,c=i.nodeClusterBy,f=i.maxIteration,d=i.onTick,g=i.onLayoutEnd,p=e.getAllNodes(),y=e.getAllEdges();if(!(null==p?void 0:p.length)){var m={nodes:[],edges:y};return this.lastResult=m,null==g||g(m),m}if(1===p.length)return t&&e.mergeNodeData(p[0].id,{x:h[0],y:h[1]}),m={nodes:[r(r({},p[0]),{data:r(r({},p[0].data),{x:h[0],y:h[1]})})],edges:y},this.lastResult=m,null==g||g(m),m;var w=p.map((function(t){return v(t,[s,a])})),x=new u({nodes:w,edges:y}),M={};if(l&&w.forEach((function(t){var e=t.data[c];M[e]||(M[e]={name:e,cx:0,cy:0,count:0})})),this.lastLayoutNodes=w,this.lastLayoutEdges=y,this.lastAssign=t,this.lastGraph=x,this.lastOptions=i,this.lastClusterMap=M,"undefined"!=typeof window){var b=0;return this.timeInterval=window.setInterval((function(){if(o.running&&(o.runOneStep(x,M,i),t&&w.forEach((function(t){var r=t.id,n=t.data;return e.mergeNodeData(r,{x:n.x,y:n.y})})),null==d||d({nodes:w,edges:y}),++b>=f)){try{null==g||g({nodes:w,edges:y})}catch(t){console.warn("onLayoutEnd failed",t)}window.clearInterval(o.timeInterval)}}),0),this.running=!0,{nodes:w,edges:y}}}},t.prototype.formatOptions=function(t){void 0===t&&(t={});var e=r(r({},this.options),t),n=e.clustering,o=e.nodeClusterBy,i=e.center,s=e.width,a=e.height;return e.width=s||"undefined"==typeof window?s:window.innerWidth,e.height=a||"undefined"==typeof window?a:window.innerHeight,e.center=i||[e.width/2,e.height/2],e.clustering=n&&!!o,e},t.prototype.runOneStep=function(t,e,r){var n=r.height,o=r.width,i=r.gravity,s=r.center,a=r.speed,h=r.clustering,u=r.nodeClusterBy,l=r.clusterGravity,c=n*o,f=Math.sqrt(c)/10,d=t.getAllNodes(),g=c/(d.length+1),p=Math.sqrt(g),y={};if(this.applyCalculate(t,y,p,g),h){for(var w in e)e[w].cx=0,e[w].cy=0,e[w].count=0;for(var w in d.forEach((function(t){var r=t.data,n=e[r[u]];m(r.x)&&(n.cx+=r.x),m(r.y)&&(n.cy+=r.y),n.count++})),e)e[w].cx/=e[w].count,e[w].cy/=e[w].count;var v=l||i;d.forEach((function(t,r){var n=t.id,o=t.data;if(m(o.x)&&m(o.y)){var i=e[o[u]],s=Math.sqrt((o.x-i.cx)*(o.x-i.cx)+(o.y-i.cy)*(o.y-i.cy)),a=p*v;y[n].x-=a*(o.x-i.cx)/s,y[n].y-=a*(o.y-i.cy)/s}}))}d.forEach((function(t,e){var r=t.id,n=t.data;if(m(n.x)&&m(n.y)){var o=.01*p*i;y[r].x-=o*(n.x-s[0]),y[r].y-=o*(n.y-s[1])}})),d.forEach((function(e,r){var n=e.id,o=e.data;if(m(o.fx)&&m(o.fy))return o.x=o.fx,void(o.y=o.fy);if(m(o.x)&&m(o.y)){var i=Math.sqrt(y[n].x*y[n].x+y[n].y*y[n].y);if(i>0){var s=Math.min(f*(a/800),i);t.mergeNodeData(n,{x:o.x+y[n].x/i*s,y:o.y+y[n].y/i*s})}}}))},t.prototype.applyCalculate=function(t,e,r,n){this.calRepulsive(t,e,n),this.calAttractive(t,e,r)},t.prototype.calRepulsive=function(t,e,r){var n=t.getAllNodes();n.forEach((function(t,o){var i=t.data,s=t.id;e[s]={x:0,y:0},n.forEach((function(t,n){var a=t.data,h=t.id;if(!(o<=n)&&m(i.x)&&m(a.x)&&m(i.y)&&m(a.y)){var u=i.x-a.x,l=i.y-a.y,c=u*u+l*l;0===c&&(c=1,u=.01,l=.01);var f=r/c,d=u*f,g=l*f;e[s].x+=d,e[s].y+=g,e[h].x-=d,e[h].y-=g}}))}))},t.prototype.calAttractive=function(t,e,r){t.getAllEdges().forEach((function(n){var o=n.source,i=n.target;if(o&&i&&o!==i){var s=t.getNode(o).data,a=t.getNode(i).data;if(m(a.x)&&m(s.x)&&m(a.y)&&m(s.y)){var h=a.x-s.x,u=a.y-s.y,l=Math.sqrt(h*h+u*u)/r,c=h*l,f=u*l;e[o].x+=c,e[o].y+=f,e[i].x-=c,e[i].y-=f}}}))},t}(),Ht={begin:[0,0],preventOverlap:!0,preventOverlapPadding:10,condense:!1,rows:void 0,cols:void 0,position:void 0,sortBy:"degree",nodeSize:30,width:300,height:300},Kt=function(){function t(t){void 0===t&&(t={}),this.options=t,this.id="grid",this.options=r(r({},Ht),t)}return t.prototype.execute=function(t,e){return this.genericGridLayout(!1,t,e)},t.prototype.assign=function(t,e){this.genericGridLayout(!0,t,e)},t.prototype.genericGridLayout=function(t,e,n){var o=r(r({},this.options),n),i=o.begin,s=void 0===i?[0,0]:i,a=o.condense,h=o.preventOverlapPadding,u=o.preventOverlap,l=o.rows,f=o.cols,d=o.nodeSpacing,g=o.nodeSize,p=o.width,y=o.height,w=o.onLayoutEnd,x=o.position,M=o.sortBy,S=e.getAllNodes(),A=e.getAllEdges(),k=null==S?void 0:S.length;if(!k||1===k)return N(e,t,s,w);var D=S.map((function(t){return v(t)}));"id"===M||I(M)&&void 0!==D[0].data[M]||(M="degree"),"degree"===M?D.sort((function(t,r){return e.getDegree(r.id,"both")-e.getDegree(t.id,"both")})):"id"===M?D.sort((function(t,e){return m(e.id)&&m(t.id)?e.id-t.id:"".concat(t.id).localeCompare("".concat(e.id))})):D.sort((function(t,e){return e.data[M]-t.data[M]}));var _=p||"undefined"==typeof window?p:window.innerWidth,R=y||"undefined"==typeof window?y:window.innerHeight,z=k,T={rows:l,cols:f};if(null!=l&&null!=f)T.rows=l,T.cols=f;else if(null!=l&&null==f)T.rows=l,T.cols=Math.ceil(z/T.rows);else if(null==l&&null!=f)T.cols=f,T.rows=Math.ceil(z/T.cols);else{var O=Math.sqrt(z*R/_);T.rows=Math.round(O),T.cols=Math.round(_/R*O)}if(T.rows=Math.max(T.rows,1),T.cols=Math.max(T.cols,1),T.cols*T.rows>z)((P=Jt(T))-1)*(C=Yt(T))>=z?Jt(T,P-1):(C-1)*P>=z&&Yt(T,C-1);else for(;T.cols*T.rows<z;){var C,P=Jt(T);((C=Yt(T))+1)*P>=z?Yt(T,C+1):Jt(T,P+1)}var q=a?0:_/T.cols,L=a?0:R/T.rows;if(u||d){var F=b(10,d),j=E(30,g,!1);D.forEach((function(t){t.data.x&&t.data.y||(t.data.x=0,t.data.y=0);var r,n,o=e.getNode(t.id),i=j(o)||30;c(i)?(r=i[0],n=i[1]):(r=i,n=i);var s=void 0!==F?F(t):h,a=r+s,u=n+s;q=Math.max(q,a),L=Math.max(L,u)}))}for(var V={},W={row:0,col:0},$={},G=0;G<D.length;G++){var U=D[G],B=void 0;if(x&&(B=x(e.getNode(U.id))),B&&(void 0!==B.row||void 0!==B.col)){var H={row:B.row,col:B.col};if(void 0===H.col)for(H.col=0;Xt(V,H);)H.col++;else if(void 0===H.row)for(H.row=0;Xt(V,H);)H.row++;$[U.id]=H,Qt(V,H)}te(U,s,q,L,$,T,W,V)}var K={nodes:D,edges:A};return null==w||w(K),t&&D.forEach((function(t){e.mergeNodeData(t.id,{x:t.data.x,y:t.data.y})})),K},t}(),Jt=function(t,e){var r,n=t.rows||5,o=t.cols||5;return null==e?r=Math.min(n,o):Math.min(n,o)===t.rows?t.rows=e:t.cols=e,r},Yt=function(t,e){var r,n=t.rows||5,o=t.cols||5;return null==e?r=Math.max(n,o):Math.max(n,o)===t.rows?t.rows=e:t.cols=e,r},Xt=function(t,e){return t["c-".concat(e.row,"-").concat(e.col)]||!1},Qt=function(t,e){return t["c-".concat(e.row,"-").concat(e.col)]=!0},Zt=function(t,e){var r=t.cols||5;e.col++,e.col>=r&&(e.col=0,e.row++)},te=function(t,e,r,n,o,i,s,a){var h,u,l=o[t.id];if(l)h=l.col*r+r/2+e[0],u=l.row*n+n/2+e[1];else{for(;Xt(a,s);)Zt(i,s);h=s.col*r+r/2+e[0],u=s.row*n+n/2+e[1],Qt(a,s),Zt(i,s)}t.data.x=h,t.data.y=u};const ee=Object.prototype.toString;function re(t){return ee.call(t).endsWith("Array]")}function ne(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(!re(t))throw new TypeError("input must be an array");if(0===t.length)throw new TypeError("input must not be empty");var r=e.fromIndex,n=void 0===r?0:r,o=e.toIndex,i=void 0===o?t.length:o;if(n<0||n>=t.length||!Number.isInteger(n))throw new Error("fromIndex must be a positive integer smaller than length");if(i<=n||i>t.length||!Number.isInteger(i))throw new Error("toIndex must be an integer greater than fromIndex and at most equal to length");for(var s=t[n],a=n+1;a<i;a++)t[a]>s&&(s=t[a]);return s}function oe(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(!re(t))throw new TypeError("input must be an array");if(0===t.length)throw new TypeError("input must not be empty");var r=e.fromIndex,n=void 0===r?0:r,o=e.toIndex,i=void 0===o?t.length:o;if(n<0||n>=t.length||!Number.isInteger(n))throw new Error("fromIndex must be a positive integer smaller than length");if(i<=n||i>t.length||!Number.isInteger(i))throw new Error("toIndex must be an integer greater than fromIndex and at most equal to length");for(var s=t[n],a=n+1;a<i;a++)t[a]<s&&(s=t[a]);return s}function ie(t){var e,r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(!re(t))throw new TypeError("input must be an array");if(0===t.length)throw new TypeError("input must not be empty");if(void 0!==r.output){if(!re(r.output))throw new TypeError("output option must be an array if specified");e=r.output}else e=new Array(t.length);var n=oe(t),o=ne(t);if(n===o)throw new RangeError("minimum and maximum input values are equal. Cannot rescale a constant array");var i=r.min,s=void 0===i?r.autoMinMax?n:0:i,a=r.max,h=void 0===a?r.autoMinMax?o:1:a;if(s>=h)throw new RangeError("min option must be smaller than max option");for(var u=(h-s)/(o-n),l=0;l<t.length;l++)e[l]=(t[l]-n)*u+s;return e}const se=" ".repeat(2),ae=" ".repeat(4);function he(t,e={}){const{maxRows:r=15,maxColumns:n=10,maxNumSize:o=8,padMinus:i="auto"}=e;return`${t.constructor.name} {\n${se}[\n${ae}${function(t,e,r,n,o){const{rows:i,columns:s}=t,a=Math.min(i,e),h=Math.min(s,r),u=[];if("auto"===o){o=!1;t:for(let e=0;e<a;e++)for(let r=0;r<h;r++)if(t.get(e,r)<0){o=!0;break t}}for(let e=0;e<a;e++){let r=[];for(let i=0;i<h;i++)r.push(ue(t.get(e,i),n,o));u.push(`${r.join(" ")}`)}return h!==s&&(u[u.length-1]+=` ... ${s-r} more columns`),a!==i&&u.push(`... ${i-e} more rows`),u.join(`\n${ae}`)}(t,r,n,o,i)}\n${se}]\n${se}rows: ${t.rows}\n${se}columns: ${t.columns}\n}`}function ue(t,e,r){return(t>=0&&r?` ${le(t,e-1)}`:le(t,e)).padEnd(e)}function le(t,e){let r=t.toString();if(r.length<=e)return r;let n=t.toFixed(e);if(n.length>e&&(n=t.toFixed(Math.max(0,e-(n.length-e)))),n.length<=e&&!n.startsWith("0.000")&&!n.startsWith("-0.000"))return n;let o=t.toExponential(e);return o.length>e&&(o=t.toExponential(Math.max(0,e-(o.length-e)))),o.slice(0)}function ce(t,e,r){let n=r?t.rows:t.rows-1;if(e<0||e>n)throw new RangeError("Row index out of range")}function fe(t,e,r){let n=r?t.columns:t.columns-1;if(e<0||e>n)throw new RangeError("Column index out of range")}function de(t,e){if(e.to1DArray&&(e=e.to1DArray()),e.length!==t.columns)throw new RangeError("vector size must be the same as the number of columns");return e}function ge(t,e){if(e.to1DArray&&(e=e.to1DArray()),e.length!==t.rows)throw new RangeError("vector size must be the same as the number of rows");return e}function pe(t,e,r,n,o){if(5!==arguments.length)throw new RangeError("expected 4 arguments");if(me("startRow",e),me("endRow",r),me("startColumn",n),me("endColumn",o),e>r||n>o||e<0||e>=t.rows||r<0||r>=t.rows||n<0||n>=t.columns||o<0||o>=t.columns)throw new RangeError("Submatrix indices are out of range")}function ye(t,e=0){let r=[];for(let n=0;n<t;n++)r.push(e);return r}function me(t,e){if("number"!=typeof e)throw new TypeError(`${t} must be a number`)}function we(t){if(t.isEmpty())throw new Error("Empty matrix has no elements to index")}class ve{static from1DArray(t,e,r){if(t*e!==r.length)throw new RangeError("data length does not match given dimensions");let n=new Me(t,e);for(let o=0;o<t;o++)for(let t=0;t<e;t++)n.set(o,t,r[o*e+t]);return n}static rowVector(t){let e=new Me(1,t.length);for(let r=0;r<t.length;r++)e.set(0,r,t[r]);return e}static columnVector(t){let e=new Me(t.length,1);for(let r=0;r<t.length;r++)e.set(r,0,t[r]);return e}static zeros(t,e){return new Me(t,e)}static ones(t,e){return new Me(t,e).fill(1)}static rand(t,e,r={}){if("object"!=typeof r)throw new TypeError("options must be an object");const{random:n=Math.random}=r;let o=new Me(t,e);for(let r=0;r<t;r++)for(let t=0;t<e;t++)o.set(r,t,n());return o}static randInt(t,e,r={}){if("object"!=typeof r)throw new TypeError("options must be an object");const{min:n=0,max:o=1e3,random:i=Math.random}=r;if(!Number.isInteger(n))throw new TypeError("min must be an integer");if(!Number.isInteger(o))throw new TypeError("max must be an integer");if(n>=o)throw new RangeError("min must be smaller than max");let s=o-n,a=new Me(t,e);for(let r=0;r<t;r++)for(let t=0;t<e;t++){let e=n+Math.round(i()*s);a.set(r,t,e)}return a}static eye(t,e,r){void 0===e&&(e=t),void 0===r&&(r=1);let n=Math.min(t,e),o=this.zeros(t,e);for(let t=0;t<n;t++)o.set(t,t,r);return o}static diag(t,e,r){let n=t.length;void 0===e&&(e=n),void 0===r&&(r=e);let o=Math.min(n,e,r),i=this.zeros(e,r);for(let e=0;e<o;e++)i.set(e,e,t[e]);return i}static min(t,e){t=this.checkMatrix(t),e=this.checkMatrix(e);let r=t.rows,n=t.columns,o=new Me(r,n);for(let i=0;i<r;i++)for(let r=0;r<n;r++)o.set(i,r,Math.min(t.get(i,r),e.get(i,r)));return o}static max(t,e){t=this.checkMatrix(t),e=this.checkMatrix(e);let r=t.rows,n=t.columns,o=new this(r,n);for(let i=0;i<r;i++)for(let r=0;r<n;r++)o.set(i,r,Math.max(t.get(i,r),e.get(i,r)));return o}static checkMatrix(t){return ve.isMatrix(t)?t:new Me(t)}static isMatrix(t){return null!=t&&"Matrix"===t.klass}get size(){return this.rows*this.columns}apply(t){if("function"!=typeof t)throw new TypeError("callback must be a function");for(let e=0;e<this.rows;e++)for(let r=0;r<this.columns;r++)t.call(this,e,r);return this}to1DArray(){let t=[];for(let e=0;e<this.rows;e++)for(let r=0;r<this.columns;r++)t.push(this.get(e,r));return t}to2DArray(){let t=[];for(let e=0;e<this.rows;e++){t.push([]);for(let r=0;r<this.columns;r++)t[e].push(this.get(e,r))}return t}toJSON(){return this.to2DArray()}isRowVector(){return 1===this.rows}isColumnVector(){return 1===this.columns}isVector(){return 1===this.rows||1===this.columns}isSquare(){return this.rows===this.columns}isEmpty(){return 0===this.rows||0===this.columns}isSymmetric(){if(this.isSquare()){for(let t=0;t<this.rows;t++)for(let e=0;e<=t;e++)if(this.get(t,e)!==this.get(e,t))return!1;return!0}return!1}isEchelonForm(){let t=0,e=0,r=-1,n=!0,o=!1;for(;t<this.rows&&n;){for(e=0,o=!1;e<this.columns&&!1===o;)0===this.get(t,e)?e++:1===this.get(t,e)&&e>r?(o=!0,r=e):(n=!1,o=!0);t++}return n}isReducedEchelonForm(){let t=0,e=0,r=-1,n=!0,o=!1;for(;t<this.rows&&n;){for(e=0,o=!1;e<this.columns&&!1===o;)0===this.get(t,e)?e++:1===this.get(t,e)&&e>r?(o=!0,r=e):(n=!1,o=!0);for(let r=e+1;r<this.rows;r++)0!==this.get(t,r)&&(n=!1);t++}return n}echelonForm(){let t=this.clone(),e=0,r=0;for(;e<t.rows&&r<t.columns;){let n=e;for(let o=e;o<t.rows;o++)t.get(o,r)>t.get(n,r)&&(n=o);if(0===t.get(n,r))r++;else{t.swapRows(e,n);let o=t.get(e,r);for(let n=r;n<t.columns;n++)t.set(e,n,t.get(e,n)/o);for(let n=e+1;n<t.rows;n++){let o=t.get(n,r)/t.get(e,r);t.set(n,r,0);for(let i=r+1;i<t.columns;i++)t.set(n,i,t.get(n,i)-t.get(e,i)*o)}e++,r++}}return t}reducedEchelonForm(){let t=this.echelonForm(),e=t.columns,r=t.rows,n=r-1;for(;n>=0;)if(0===t.maxRow(n))n--;else{let o=0,i=!1;for(;o<r&&!1===i;)1===t.get(n,o)?i=!0:o++;for(let r=0;r<n;r++){let i=t.get(r,o);for(let s=o;s<e;s++){let e=t.get(r,s)-i*t.get(n,s);t.set(r,s,e)}}n--}return t}set(){throw new Error("set method is unimplemented")}get(){throw new Error("get method is unimplemented")}repeat(t={}){if("object"!=typeof t)throw new TypeError("options must be an object");const{rows:e=1,columns:r=1}=t;if(!Number.isInteger(e)||e<=0)throw new TypeError("rows must be a positive integer");if(!Number.isInteger(r)||r<=0)throw new TypeError("columns must be a positive integer");let n=new Me(this.rows*e,this.columns*r);for(let t=0;t<e;t++)for(let e=0;e<r;e++)n.setSubMatrix(this,this.rows*t,this.columns*e);return n}fill(t){for(let e=0;e<this.rows;e++)for(let r=0;r<this.columns;r++)this.set(e,r,t);return this}neg(){return this.mulS(-1)}getRow(t){ce(this,t);let e=[];for(let r=0;r<this.columns;r++)e.push(this.get(t,r));return e}getRowVector(t){return Me.rowVector(this.getRow(t))}setRow(t,e){ce(this,t),e=de(this,e);for(let r=0;r<this.columns;r++)this.set(t,r,e[r]);return this}swapRows(t,e){ce(this,t),ce(this,e);for(let r=0;r<this.columns;r++){let n=this.get(t,r);this.set(t,r,this.get(e,r)),this.set(e,r,n)}return this}getColumn(t){fe(this,t);let e=[];for(let r=0;r<this.rows;r++)e.push(this.get(r,t));return e}getColumnVector(t){return Me.columnVector(this.getColumn(t))}setColumn(t,e){fe(this,t),e=ge(this,e);for(let r=0;r<this.rows;r++)this.set(r,t,e[r]);return this}swapColumns(t,e){fe(this,t),fe(this,e);for(let r=0;r<this.rows;r++){let n=this.get(r,t);this.set(r,t,this.get(r,e)),this.set(r,e,n)}return this}addRowVector(t){t=de(this,t);for(let e=0;e<this.rows;e++)for(let r=0;r<this.columns;r++)this.set(e,r,this.get(e,r)+t[r]);return this}subRowVector(t){t=de(this,t);for(let e=0;e<this.rows;e++)for(let r=0;r<this.columns;r++)this.set(e,r,this.get(e,r)-t[r]);return this}mulRowVector(t){t=de(this,t);for(let e=0;e<this.rows;e++)for(let r=0;r<this.columns;r++)this.set(e,r,this.get(e,r)*t[r]);return this}divRowVector(t){t=de(this,t);for(let e=0;e<this.rows;e++)for(let r=0;r<this.columns;r++)this.set(e,r,this.get(e,r)/t[r]);return this}addColumnVector(t){t=ge(this,t);for(let e=0;e<this.rows;e++)for(let r=0;r<this.columns;r++)this.set(e,r,this.get(e,r)+t[e]);return this}subColumnVector(t){t=ge(this,t);for(let e=0;e<this.rows;e++)for(let r=0;r<this.columns;r++)this.set(e,r,this.get(e,r)-t[e]);return this}mulColumnVector(t){t=ge(this,t);for(let e=0;e<this.rows;e++)for(let r=0;r<this.columns;r++)this.set(e,r,this.get(e,r)*t[e]);return this}divColumnVector(t){t=ge(this,t);for(let e=0;e<this.rows;e++)for(let r=0;r<this.columns;r++)this.set(e,r,this.get(e,r)/t[e]);return this}mulRow(t,e){ce(this,t);for(let r=0;r<this.columns;r++)this.set(t,r,this.get(t,r)*e);return this}mulColumn(t,e){fe(this,t);for(let r=0;r<this.rows;r++)this.set(r,t,this.get(r,t)*e);return this}max(t){if(this.isEmpty())return NaN;switch(t){case"row":{const t=new Array(this.rows).fill(Number.NEGATIVE_INFINITY);for(let e=0;e<this.rows;e++)for(let r=0;r<this.columns;r++)this.get(e,r)>t[e]&&(t[e]=this.get(e,r));return t}case"column":{const t=new Array(this.columns).fill(Number.NEGATIVE_INFINITY);for(let e=0;e<this.rows;e++)for(let r=0;r<this.columns;r++)this.get(e,r)>t[r]&&(t[r]=this.get(e,r));return t}case void 0:{let t=this.get(0,0);for(let e=0;e<this.rows;e++)for(let r=0;r<this.columns;r++)this.get(e,r)>t&&(t=this.get(e,r));return t}default:throw new Error(`invalid option: ${t}`)}}maxIndex(){we(this);let t=this.get(0,0),e=[0,0];for(let r=0;r<this.rows;r++)for(let n=0;n<this.columns;n++)this.get(r,n)>t&&(t=this.get(r,n),e[0]=r,e[1]=n);return e}min(t){if(this.isEmpty())return NaN;switch(t){case"row":{const t=new Array(this.rows).fill(Number.POSITIVE_INFINITY);for(let e=0;e<this.rows;e++)for(let r=0;r<this.columns;r++)this.get(e,r)<t[e]&&(t[e]=this.get(e,r));return t}case"column":{const t=new Array(this.columns).fill(Number.POSITIVE_INFINITY);for(let e=0;e<this.rows;e++)for(let r=0;r<this.columns;r++)this.get(e,r)<t[r]&&(t[r]=this.get(e,r));return t}case void 0:{let t=this.get(0,0);for(let e=0;e<this.rows;e++)for(let r=0;r<this.columns;r++)this.get(e,r)<t&&(t=this.get(e,r));return t}default:throw new Error(`invalid option: ${t}`)}}minIndex(){we(this);let t=this.get(0,0),e=[0,0];for(let r=0;r<this.rows;r++)for(let n=0;n<this.columns;n++)this.get(r,n)<t&&(t=this.get(r,n),e[0]=r,e[1]=n);return e}maxRow(t){if(ce(this,t),this.isEmpty())return NaN;let e=this.get(t,0);for(let r=1;r<this.columns;r++)this.get(t,r)>e&&(e=this.get(t,r));return e}maxRowIndex(t){ce(this,t),we(this);let e=this.get(t,0),r=[t,0];for(let n=1;n<this.columns;n++)this.get(t,n)>e&&(e=this.get(t,n),r[1]=n);return r}minRow(t){if(ce(this,t),this.isEmpty())return NaN;let e=this.get(t,0);for(let r=1;r<this.columns;r++)this.get(t,r)<e&&(e=this.get(t,r));return e}minRowIndex(t){ce(this,t),we(this);let e=this.get(t,0),r=[t,0];for(let n=1;n<this.columns;n++)this.get(t,n)<e&&(e=this.get(t,n),r[1]=n);return r}maxColumn(t){if(fe(this,t),this.isEmpty())return NaN;let e=this.get(0,t);for(let r=1;r<this.rows;r++)this.get(r,t)>e&&(e=this.get(r,t));return e}maxColumnIndex(t){fe(this,t),we(this);let e=this.get(0,t),r=[0,t];for(let n=1;n<this.rows;n++)this.get(n,t)>e&&(e=this.get(n,t),r[0]=n);return r}minColumn(t){if(fe(this,t),this.isEmpty())return NaN;let e=this.get(0,t);for(let r=1;r<this.rows;r++)this.get(r,t)<e&&(e=this.get(r,t));return e}minColumnIndex(t){fe(this,t),we(this);let e=this.get(0,t),r=[0,t];for(let n=1;n<this.rows;n++)this.get(n,t)<e&&(e=this.get(n,t),r[0]=n);return r}diag(){let t=Math.min(this.rows,this.columns),e=[];for(let r=0;r<t;r++)e.push(this.get(r,r));return e}norm(t="frobenius"){let e=0;if("max"===t)return this.max();if("frobenius"===t){for(let t=0;t<this.rows;t++)for(let r=0;r<this.columns;r++)e+=this.get(t,r)*this.get(t,r);return Math.sqrt(e)}throw new RangeError(`unknown norm type: ${t}`)}cumulativeSum(){let t=0;for(let e=0;e<this.rows;e++)for(let r=0;r<this.columns;r++)t+=this.get(e,r),this.set(e,r,t);return this}dot(t){ve.isMatrix(t)&&(t=t.to1DArray());let e=this.to1DArray();if(e.length!==t.length)throw new RangeError("vectors do not have the same size");let r=0;for(let n=0;n<e.length;n++)r+=e[n]*t[n];return r}mmul(t){t=Me.checkMatrix(t);let e=this.rows,r=this.columns,n=t.columns,o=new Me(e,n),i=new Float64Array(r);for(let s=0;s<n;s++){for(let e=0;e<r;e++)i[e]=t.get(e,s);for(let t=0;t<e;t++){let e=0;for(let n=0;n<r;n++)e+=this.get(t,n)*i[n];o.set(t,s,e)}}return o}strassen2x2(t){t=Me.checkMatrix(t);let e=new Me(2,2);const r=this.get(0,0),n=t.get(0,0),o=this.get(0,1),i=t.get(0,1),s=this.get(1,0),a=t.get(1,0),h=this.get(1,1),u=t.get(1,1),l=(r+h)*(n+u),c=(s+h)*n,f=r*(i-u),d=h*(a-n),g=(r+o)*u,p=l+d-g+(o-h)*(a+u),y=f+g,m=c+d,w=l-c+f+(s-r)*(n+i);return e.set(0,0,p),e.set(0,1,y),e.set(1,0,m),e.set(1,1,w),e}strassen3x3(t){t=Me.checkMatrix(t);let e=new Me(3,3);const r=this.get(0,0),n=this.get(0,1),o=this.get(0,2),i=this.get(1,0),s=this.get(1,1),a=this.get(1,2),h=this.get(2,0),u=this.get(2,1),l=this.get(2,2),c=t.get(0,0),f=t.get(0,1),d=t.get(0,2),g=t.get(1,0),p=t.get(1,1),y=t.get(1,2),m=t.get(2,0),w=t.get(2,1),v=t.get(2,2),x=(r-i)*(-f+p),M=(-r+i+s)*(c-f+p),b=(i+s)*(-c+f),E=r*c,N=(-r+h+u)*(c-d+y),S=(-r+h)*(d-y),A=(h+u)*(-c+d),k=(-o+u+l)*(p+m-w),D=(o-l)*(p-w),I=o*m,_=(u+l)*(-m+w),R=(-o+s+a)*(y+m-v),z=(o-a)*(y-v),T=(s+a)*(-m+v),O=E+I+n*g,C=(r+n+o-i-s-u-l)*p+M+b+E+k+I+_,P=E+N+A+(r+n+o-s-a-h-u)*y+I+R+T,q=x+s*(-c+f+g-p-y-m+v)+M+E+I+R+z,L=x+M+b+E+a*w,F=I+R+z+T+i*d,j=E+N+S+u*(-c+d+g-p-y-m+w)+k+D+I,V=k+D+I+_+h*f,W=E+N+S+A+l*v;return e.set(0,0,O),e.set(0,1,C),e.set(0,2,P),e.set(1,0,q),e.set(1,1,L),e.set(1,2,F),e.set(2,0,j),e.set(2,1,V),e.set(2,2,W),e}mmulStrassen(t){t=Me.checkMatrix(t);let e=this.clone(),r=e.rows,n=e.columns,o=t.rows,i=t.columns;function s(t,e,r){let n=t.rows,o=t.columns;if(n===e&&o===r)return t;{let n=ve.zeros(e,r);return n=n.setSubMatrix(t,0,0),n}}n!==o&&console.warn(`Multiplying ${r} x ${n} and ${o} x ${i} matrix: dimensions do not match.`);let a=Math.max(r,o),h=Math.max(n,i);return e=s(e,a,h),function t(e,r,n,o){if(n<=512||o<=512)return e.mmul(r);n%2==1&&o%2==1?(e=s(e,n+1,o+1),r=s(r,n+1,o+1)):n%2==1?(e=s(e,n+1,o),r=s(r,n+1,o)):o%2==1&&(e=s(e,n,o+1),r=s(r,n,o+1));let i=parseInt(e.rows/2,10),a=parseInt(e.columns/2,10),h=e.subMatrix(0,i-1,0,a-1),u=r.subMatrix(0,i-1,0,a-1),l=e.subMatrix(0,i-1,a,e.columns-1),c=r.subMatrix(0,i-1,a,r.columns-1),f=e.subMatrix(i,e.rows-1,0,a-1),d=r.subMatrix(i,r.rows-1,0,a-1),g=e.subMatrix(i,e.rows-1,a,e.columns-1),p=r.subMatrix(i,r.rows-1,a,r.columns-1),y=t(ve.add(h,g),ve.add(u,p),i,a),m=t(ve.add(f,g),u,i,a),w=t(h,ve.sub(c,p),i,a),v=t(g,ve.sub(d,u),i,a),x=t(ve.add(h,l),p,i,a),M=t(ve.sub(f,h),ve.add(u,c),i,a),b=t(ve.sub(l,g),ve.add(d,p),i,a),E=ve.add(y,v);E.sub(x),E.add(b);let N=ve.add(w,x),S=ve.add(m,v),A=ve.sub(y,m);A.add(w),A.add(M);let k=ve.zeros(2*E.rows,2*E.columns);return k=k.setSubMatrix(E,0,0),k=k.setSubMatrix(N,E.rows,0),k=k.setSubMatrix(S,0,E.columns),k=k.setSubMatrix(A,E.rows,E.columns),k.subMatrix(0,n-1,0,o-1)}(e,t=s(t,a,h),a,h)}scaleRows(t={}){if("object"!=typeof t)throw new TypeError("options must be an object");const{min:e=0,max:r=1}=t;if(!Number.isFinite(e))throw new TypeError("min must be a number");if(!Number.isFinite(r))throw new TypeError("max must be a number");if(e>=r)throw new RangeError("min must be smaller than max");let n=new Me(this.rows,this.columns);for(let t=0;t<this.rows;t++){const o=this.getRow(t);o.length>0&&ie(o,{min:e,max:r,output:o}),n.setRow(t,o)}return n}scaleColumns(t={}){if("object"!=typeof t)throw new TypeError("options must be an object");const{min:e=0,max:r=1}=t;if(!Number.isFinite(e))throw new TypeError("min must be a number");if(!Number.isFinite(r))throw new TypeError("max must be a number");if(e>=r)throw new RangeError("min must be smaller than max");let n=new Me(this.rows,this.columns);for(let t=0;t<this.columns;t++){const o=this.getColumn(t);o.length&&ie(o,{min:e,max:r,output:o}),n.setColumn(t,o)}return n}flipRows(){const t=Math.ceil(this.columns/2);for(let e=0;e<this.rows;e++)for(let r=0;r<t;r++){let t=this.get(e,r),n=this.get(e,this.columns-1-r);this.set(e,r,n),this.set(e,this.columns-1-r,t)}return this}flipColumns(){const t=Math.ceil(this.rows/2);for(let e=0;e<this.columns;e++)for(let r=0;r<t;r++){let t=this.get(r,e),n=this.get(this.rows-1-r,e);this.set(r,e,n),this.set(this.rows-1-r,e,t)}return this}kroneckerProduct(t){t=Me.checkMatrix(t);let e=this.rows,r=this.columns,n=t.rows,o=t.columns,i=new Me(e*n,r*o);for(let s=0;s<e;s++)for(let e=0;e<r;e++)for(let r=0;r<n;r++)for(let a=0;a<o;a++)i.set(n*s+r,o*e+a,this.get(s,e)*t.get(r,a));return i}kroneckerSum(t){if(t=Me.checkMatrix(t),!this.isSquare()||!t.isSquare())throw new Error("Kronecker Sum needs two Square Matrices");let e=this.rows,r=t.rows,n=this.kroneckerProduct(Me.eye(r,r)),o=Me.eye(e,e).kroneckerProduct(t);return n.add(o)}transpose(){let t=new Me(this.columns,this.rows);for(let e=0;e<this.rows;e++)for(let r=0;r<this.columns;r++)t.set(r,e,this.get(e,r));return t}sortRows(t=xe){for(let e=0;e<this.rows;e++)this.setRow(e,this.getRow(e).sort(t));return this}sortColumns(t=xe){for(let e=0;e<this.columns;e++)this.setColumn(e,this.getColumn(e).sort(t));return this}subMatrix(t,e,r,n){pe(this,t,e,r,n);let o=new Me(e-t+1,n-r+1);for(let i=t;i<=e;i++)for(let e=r;e<=n;e++)o.set(i-t,e-r,this.get(i,e));return o}subMatrixRow(t,e,r){if(void 0===e&&(e=0),void 0===r&&(r=this.columns-1),e>r||e<0||e>=this.columns||r<0||r>=this.columns)throw new RangeError("Argument out of range");let n=new Me(t.length,r-e+1);for(let o=0;o<t.length;o++)for(let i=e;i<=r;i++){if(t[o]<0||t[o]>=this.rows)throw new RangeError(`Row index out of range: ${t[o]}`);n.set(o,i-e,this.get(t[o],i))}return n}subMatrixColumn(t,e,r){if(void 0===e&&(e=0),void 0===r&&(r=this.rows-1),e>r||e<0||e>=this.rows||r<0||r>=this.rows)throw new RangeError("Argument out of range");let n=new Me(r-e+1,t.length);for(let o=0;o<t.length;o++)for(let i=e;i<=r;i++){if(t[o]<0||t[o]>=this.columns)throw new RangeError(`Column index out of range: ${t[o]}`);n.set(i-e,o,this.get(i,t[o]))}return n}setSubMatrix(t,e,r){if((t=Me.checkMatrix(t)).isEmpty())return this;pe(this,e,e+t.rows-1,r,r+t.columns-1);for(let n=0;n<t.rows;n++)for(let o=0;o<t.columns;o++)this.set(e+n,r+o,t.get(n,o));return this}selection(t,e){!function(t,e){if(!re(e))throw new TypeError("row indices must be an array");for(let r=0;r<e.length;r++)if(e[r]<0||e[r]>=t.rows)throw new RangeError("row indices are out of range")}(this,t),function(t,e){if(!re(e))throw new TypeError("column indices must be an array");for(let r=0;r<e.length;r++)if(e[r]<0||e[r]>=t.columns)throw new RangeError("column indices are out of range")}(this,e);let r=new Me(t.length,e.length);for(let n=0;n<t.length;n++){let o=t[n];for(let t=0;t<e.length;t++){let i=e[t];r.set(n,t,this.get(o,i))}}return r}trace(){let t=Math.min(this.rows,this.columns),e=0;for(let r=0;r<t;r++)e+=this.get(r,r);return e}clone(){let t=new Me(this.rows,this.columns);for(let e=0;e<this.rows;e++)for(let r=0;r<this.columns;r++)t.set(e,r,this.get(e,r));return t}sum(t){switch(t){case"row":return function(t){let e=ye(t.rows);for(let r=0;r<t.rows;++r)for(let n=0;n<t.columns;++n)e[r]+=t.get(r,n);return e}(this);case"column":return function(t){let e=ye(t.columns);for(let r=0;r<t.rows;++r)for(let n=0;n<t.columns;++n)e[n]+=t.get(r,n);return e}(this);case void 0:return function(t){let e=0;for(let r=0;r<t.rows;r++)for(let n=0;n<t.columns;n++)e+=t.get(r,n);return e}(this);default:throw new Error(`invalid option: ${t}`)}}product(t){switch(t){case"row":return function(t){let e=ye(t.rows,1);for(let r=0;r<t.rows;++r)for(let n=0;n<t.columns;++n)e[r]*=t.get(r,n);return e}(this);case"column":return function(t){let e=ye(t.columns,1);for(let r=0;r<t.rows;++r)for(let n=0;n<t.columns;++n)e[n]*=t.get(r,n);return e}(this);case void 0:return function(t){let e=1;for(let r=0;r<t.rows;r++)for(let n=0;n<t.columns;n++)e*=t.get(r,n);return e}(this);default:throw new Error(`invalid option: ${t}`)}}mean(t){const e=this.sum(t);switch(t){case"row":for(let t=0;t<this.rows;t++)e[t]/=this.columns;return e;case"column":for(let t=0;t<this.columns;t++)e[t]/=this.rows;return e;case void 0:return e/this.size;default:throw new Error(`invalid option: ${t}`)}}variance(t,e={}){if("object"==typeof t&&(e=t,t=void 0),"object"!=typeof e)throw new TypeError("options must be an object");const{unbiased:r=!0,mean:n=this.mean(t)}=e;if("boolean"!=typeof r)throw new TypeError("unbiased must be a boolean");switch(t){case"row":if(!re(n))throw new TypeError("mean must be an array");return function(t,e,r){const n=t.rows,o=t.columns,i=[];for(let s=0;s<n;s++){let n=0,a=0,h=0;for(let e=0;e<o;e++)h=t.get(s,e)-r[s],n+=h,a+=h*h;e?i.push((a-n*n/o)/(o-1)):i.push((a-n*n/o)/o)}return i}(this,r,n);case"column":if(!re(n))throw new TypeError("mean must be an array");return function(t,e,r){const n=t.rows,o=t.columns,i=[];for(let s=0;s<o;s++){let o=0,a=0,h=0;for(let e=0;e<n;e++)h=t.get(e,s)-r[s],o+=h,a+=h*h;e?i.push((a-o*o/n)/(n-1)):i.push((a-o*o/n)/n)}return i}(this,r,n);case void 0:if("number"!=typeof n)throw new TypeError("mean must be a number");return function(t,e,r){const n=t.rows,o=t.columns,i=n*o;let s=0,a=0,h=0;for(let e=0;e<n;e++)for(let n=0;n<o;n++)h=t.get(e,n)-r,s+=h,a+=h*h;return e?(a-s*s/i)/(i-1):(a-s*s/i)/i}(this,r,n);default:throw new Error(`invalid option: ${t}`)}}standardDeviation(t,e){"object"==typeof t&&(e=t,t=void 0);const r=this.variance(t,e);if(void 0===t)return Math.sqrt(r);for(let t=0;t<r.length;t++)r[t]=Math.sqrt(r[t]);return r}center(t,e={}){if("object"==typeof t&&(e=t,t=void 0),"object"!=typeof e)throw new TypeError("options must be an object");const{center:r=this.mean(t)}=e;switch(t){case"row":if(!re(r))throw new TypeError("center must be an array");return function(t,e){for(let r=0;r<t.rows;r++)for(let n=0;n<t.columns;n++)t.set(r,n,t.get(r,n)-e[r])}(this,r),this;case"column":if(!re(r))throw new TypeError("center must be an array");return function(t,e){for(let r=0;r<t.rows;r++)for(let n=0;n<t.columns;n++)t.set(r,n,t.get(r,n)-e[n])}(this,r),this;case void 0:if("number"!=typeof r)throw new TypeError("center must be a number");return function(t,e){for(let r=0;r<t.rows;r++)for(let n=0;n<t.columns;n++)t.set(r,n,t.get(r,n)-e)}(this,r),this;default:throw new Error(`invalid option: ${t}`)}}scale(t,e={}){if("object"==typeof t&&(e=t,t=void 0),"object"!=typeof e)throw new TypeError("options must be an object");let r=e.scale;switch(t){case"row":if(void 0===r)r=function(t){const e=[];for(let r=0;r<t.rows;r++){let n=0;for(let e=0;e<t.columns;e++)n+=Math.pow(t.get(r,e),2)/(t.columns-1);e.push(Math.sqrt(n))}return e}(this);else if(!re(r))throw new TypeError("scale must be an array");return function(t,e){for(let r=0;r<t.rows;r++)for(let n=0;n<t.columns;n++)t.set(r,n,t.get(r,n)/e[r])}(this,r),this;case"column":if(void 0===r)r=function(t){const e=[];for(let r=0;r<t.columns;r++){let n=0;for(let e=0;e<t.rows;e++)n+=Math.pow(t.get(e,r),2)/(t.rows-1);e.push(Math.sqrt(n))}return e}(this);else if(!re(r))throw new TypeError("scale must be an array");return function(t,e){for(let r=0;r<t.rows;r++)for(let n=0;n<t.columns;n++)t.set(r,n,t.get(r,n)/e[n])}(this,r),this;case void 0:if(void 0===r)r=function(t){const e=t.size-1;let r=0;for(let n=0;n<t.columns;n++)for(let o=0;o<t.rows;o++)r+=Math.pow(t.get(o,n),2)/e;return Math.sqrt(r)}(this);else if("number"!=typeof r)throw new TypeError("scale must be a number");return function(t,e){for(let r=0;r<t.rows;r++)for(let n=0;n<t.columns;n++)t.set(r,n,t.get(r,n)/e)}(this,r),this;default:throw new Error(`invalid option: ${t}`)}}toString(t){return he(this,t)}}function xe(t,e){return t-e}ve.prototype.klass="Matrix","undefined"!=typeof Symbol&&(ve.prototype[Symbol.for("nodejs.util.inspect.custom")]=function(){return he(this)}),ve.random=ve.rand,ve.randomInt=ve.randInt,ve.diagonal=ve.diag,ve.prototype.diagonal=ve.prototype.diag,ve.identity=ve.eye,ve.prototype.negate=ve.prototype.neg,ve.prototype.tensorProduct=ve.prototype.kroneckerProduct;class Me extends ve{constructor(t,e){if(super(),Me.isMatrix(t))return t.clone();if(Number.isInteger(t)&&t>=0){if(this.data=[],!(Number.isInteger(e)&&e>=0))throw new TypeError("nColumns must be a positive integer");for(let r=0;r<t;r++)this.data.push(new Float64Array(e))}else{if(!re(t))throw new TypeError("First argument must be a positive number or an array");{const r=t;if("number"!=typeof(e=(t=r.length)?r[0].length:0))throw new TypeError("Data must be a 2D array with at least one element");this.data=[];for(let n=0;n<t;n++){if(r[n].length!==e)throw new RangeError("Inconsistent array dimensions");if(!r[n].every((t=>"number"==typeof t)))throw new TypeError("Input data contains non-numeric values");this.data.push(Float64Array.from(r[n]))}}}this.rows=t,this.columns=e}set(t,e,r){return this.data[t][e]=r,this}get(t,e){return this.data[t][e]}removeRow(t){return ce(this,t),this.data.splice(t,1),this.rows-=1,this}addRow(t,e){return void 0===e&&(e=t,t=this.rows),ce(this,t,!0),e=Float64Array.from(de(this,e)),this.data.splice(t,0,e),this.rows+=1,this}removeColumn(t){fe(this,t);for(let e=0;e<this.rows;e++){const r=new Float64Array(this.columns-1);for(let n=0;n<t;n++)r[n]=this.data[e][n];for(let n=t+1;n<this.columns;n++)r[n-1]=this.data[e][n];this.data[e]=r}return this.columns-=1,this}addColumn(t,e){void 0===e&&(e=t,t=this.columns),fe(this,t,!0),e=ge(this,e);for(let r=0;r<this.rows;r++){const n=new Float64Array(this.columns+1);let o=0;for(;o<t;o++)n[o]=this.data[r][o];for(n[o++]=e[r];o<this.columns+1;o++)n[o]=this.data[r][o-1];this.data[r]=n}return this.columns+=1,this}}!function(t,e){t.prototype.add=function(t){return"number"==typeof t?this.addS(t):this.addM(t)},t.prototype.addS=function(t){for(let e=0;e<this.rows;e++)for(let r=0;r<this.columns;r++)this.set(e,r,this.get(e,r)+t);return this},t.prototype.addM=function(t){if(t=e.checkMatrix(t),this.rows!==t.rows||this.columns!==t.columns)throw new RangeError("Matrices dimensions must be equal");for(let e=0;e<this.rows;e++)for(let r=0;r<this.columns;r++)this.set(e,r,this.get(e,r)+t.get(e,r));return this},t.add=function(t,r){return new e(t).add(r)},t.prototype.sub=function(t){return"number"==typeof t?this.subS(t):this.subM(t)},t.prototype.subS=function(t){for(let e=0;e<this.rows;e++)for(let r=0;r<this.columns;r++)this.set(e,r,this.get(e,r)-t);return this},t.prototype.subM=function(t){if(t=e.checkMatrix(t),this.rows!==t.rows||this.columns!==t.columns)throw new RangeError("Matrices dimensions must be equal");for(let e=0;e<this.rows;e++)for(let r=0;r<this.columns;r++)this.set(e,r,this.get(e,r)-t.get(e,r));return this},t.sub=function(t,r){return new e(t).sub(r)},t.prototype.subtract=t.prototype.sub,t.prototype.subtractS=t.prototype.subS,t.prototype.subtractM=t.prototype.subM,t.subtract=t.sub,t.prototype.mul=function(t){return"number"==typeof t?this.mulS(t):this.mulM(t)},t.prototype.mulS=function(t){for(let e=0;e<this.rows;e++)for(let r=0;r<this.columns;r++)this.set(e,r,this.get(e,r)*t);return this},t.prototype.mulM=function(t){if(t=e.checkMatrix(t),this.rows!==t.rows||this.columns!==t.columns)throw new RangeError("Matrices dimensions must be equal");for(let e=0;e<this.rows;e++)for(let r=0;r<this.columns;r++)this.set(e,r,this.get(e,r)*t.get(e,r));return this},t.mul=function(t,r){return new e(t).mul(r)},t.prototype.multiply=t.prototype.mul,t.prototype.multiplyS=t.prototype.mulS,t.prototype.multiplyM=t.prototype.mulM,t.multiply=t.mul,t.prototype.div=function(t){return"number"==typeof t?this.divS(t):this.divM(t)},t.prototype.divS=function(t){for(let e=0;e<this.rows;e++)for(let r=0;r<this.columns;r++)this.set(e,r,this.get(e,r)/t);return this},t.prototype.divM=function(t){if(t=e.checkMatrix(t),this.rows!==t.rows||this.columns!==t.columns)throw new RangeError("Matrices dimensions must be equal");for(let e=0;e<this.rows;e++)for(let r=0;r<this.columns;r++)this.set(e,r,this.get(e,r)/t.get(e,r));return this},t.div=function(t,r){return new e(t).div(r)},t.prototype.divide=t.prototype.div,t.prototype.divideS=t.prototype.divS,t.prototype.divideM=t.prototype.divM,t.divide=t.div,t.prototype.mod=function(t){return"number"==typeof t?this.modS(t):this.modM(t)},t.prototype.modS=function(t){for(let e=0;e<this.rows;e++)for(let r=0;r<this.columns;r++)this.set(e,r,this.get(e,r)%t);return this},t.prototype.modM=function(t){if(t=e.checkMatrix(t),this.rows!==t.rows||this.columns!==t.columns)throw new RangeError("Matrices dimensions must be equal");for(let e=0;e<this.rows;e++)for(let r=0;r<this.columns;r++)this.set(e,r,this.get(e,r)%t.get(e,r));return this},t.mod=function(t,r){return new e(t).mod(r)},t.prototype.modulus=t.prototype.mod,t.prototype.modulusS=t.prototype.modS,t.prototype.modulusM=t.prototype.modM,t.modulus=t.mod,t.prototype.and=function(t){return"number"==typeof t?this.andS(t):this.andM(t)},t.prototype.andS=function(t){for(let e=0;e<this.rows;e++)for(let r=0;r<this.columns;r++)this.set(e,r,this.get(e,r)&t);return this},t.prototype.andM=function(t){if(t=e.checkMatrix(t),this.rows!==t.rows||this.columns!==t.columns)throw new RangeError("Matrices dimensions must be equal");for(let e=0;e<this.rows;e++)for(let r=0;r<this.columns;r++)this.set(e,r,this.get(e,r)&t.get(e,r));return this},t.and=function(t,r){return new e(t).and(r)},t.prototype.or=function(t){return"number"==typeof t?this.orS(t):this.orM(t)},t.prototype.orS=function(t){for(let e=0;e<this.rows;e++)for(let r=0;r<this.columns;r++)this.set(e,r,this.get(e,r)|t);return this},t.prototype.orM=function(t){if(t=e.checkMatrix(t),this.rows!==t.rows||this.columns!==t.columns)throw new RangeError("Matrices dimensions must be equal");for(let e=0;e<this.rows;e++)for(let r=0;r<this.columns;r++)this.set(e,r,this.get(e,r)|t.get(e,r));return this},t.or=function(t,r){return new e(t).or(r)},t.prototype.xor=function(t){return"number"==typeof t?this.xorS(t):this.xorM(t)},t.prototype.xorS=function(t){for(let e=0;e<this.rows;e++)for(let r=0;r<this.columns;r++)this.set(e,r,this.get(e,r)^t);return this},t.prototype.xorM=function(t){if(t=e.checkMatrix(t),this.rows!==t.rows||this.columns!==t.columns)throw new RangeError("Matrices dimensions must be equal");for(let e=0;e<this.rows;e++)for(let r=0;r<this.columns;r++)this.set(e,r,this.get(e,r)^t.get(e,r));return this},t.xor=function(t,r){return new e(t).xor(r)},t.prototype.leftShift=function(t){return"number"==typeof t?this.leftShiftS(t):this.leftShiftM(t)},t.prototype.leftShiftS=function(t){for(let e=0;e<this.rows;e++)for(let r=0;r<this.columns;r++)this.set(e,r,this.get(e,r)<<t);return this},t.prototype.leftShiftM=function(t){if(t=e.checkMatrix(t),this.rows!==t.rows||this.columns!==t.columns)throw new RangeError("Matrices dimensions must be equal");for(let e=0;e<this.rows;e++)for(let r=0;r<this.columns;r++)this.set(e,r,this.get(e,r)<<t.get(e,r));return this},t.leftShift=function(t,r){return new e(t).leftShift(r)},t.prototype.signPropagatingRightShift=function(t){return"number"==typeof t?this.signPropagatingRightShiftS(t):this.signPropagatingRightShiftM(t)},t.prototype.signPropagatingRightShiftS=function(t){for(let e=0;e<this.rows;e++)for(let r=0;r<this.columns;r++)this.set(e,r,this.get(e,r)>>t);return this},t.prototype.signPropagatingRightShiftM=function(t){if(t=e.checkMatrix(t),this.rows!==t.rows||this.columns!==t.columns)throw new RangeError("Matrices dimensions must be equal");for(let e=0;e<this.rows;e++)for(let r=0;r<this.columns;r++)this.set(e,r,this.get(e,r)>>t.get(e,r));return this},t.signPropagatingRightShift=function(t,r){return new e(t).signPropagatingRightShift(r)},t.prototype.rightShift=function(t){return"number"==typeof t?this.rightShiftS(t):this.rightShiftM(t)},t.prototype.rightShiftS=function(t){for(let e=0;e<this.rows;e++)for(let r=0;r<this.columns;r++)this.set(e,r,this.get(e,r)>>>t);return this},t.prototype.rightShiftM=function(t){if(t=e.checkMatrix(t),this.rows!==t.rows||this.columns!==t.columns)throw new RangeError("Matrices dimensions must be equal");for(let e=0;e<this.rows;e++)for(let r=0;r<this.columns;r++)this.set(e,r,this.get(e,r)>>>t.get(e,r));return this},t.rightShift=function(t,r){return new e(t).rightShift(r)},t.prototype.zeroFillRightShift=t.prototype.rightShift,t.prototype.zeroFillRightShiftS=t.prototype.rightShiftS,t.prototype.zeroFillRightShiftM=t.prototype.rightShiftM,t.zeroFillRightShift=t.rightShift,t.prototype.not=function(){for(let t=0;t<this.rows;t++)for(let e=0;e<this.columns;e++)this.set(t,e,~this.get(t,e));return this},t.not=function(t){return new e(t).not()},t.prototype.abs=function(){for(let t=0;t<this.rows;t++)for(let e=0;e<this.columns;e++)this.set(t,e,Math.abs(this.get(t,e)));return this},t.abs=function(t){return new e(t).abs()},t.prototype.acos=function(){for(let t=0;t<this.rows;t++)for(let e=0;e<this.columns;e++)this.set(t,e,Math.acos(this.get(t,e)));return this},t.acos=function(t){return new e(t).acos()},t.prototype.acosh=function(){for(let t=0;t<this.rows;t++)for(let e=0;e<this.columns;e++)this.set(t,e,Math.acosh(this.get(t,e)));return this},t.acosh=function(t){return new e(t).acosh()},t.prototype.asin=function(){for(let t=0;t<this.rows;t++)for(let e=0;e<this.columns;e++)this.set(t,e,Math.asin(this.get(t,e)));return this},t.asin=function(t){return new e(t).asin()},t.prototype.asinh=function(){for(let t=0;t<this.rows;t++)for(let e=0;e<this.columns;e++)this.set(t,e,Math.asinh(this.get(t,e)));return this},t.asinh=function(t){return new e(t).asinh()},t.prototype.atan=function(){for(let t=0;t<this.rows;t++)for(let e=0;e<this.columns;e++)this.set(t,e,Math.atan(this.get(t,e)));return this},t.atan=function(t){return new e(t).atan()},t.prototype.atanh=function(){for(let t=0;t<this.rows;t++)for(let e=0;e<this.columns;e++)this.set(t,e,Math.atanh(this.get(t,e)));return this},t.atanh=function(t){return new e(t).atanh()},t.prototype.cbrt=function(){for(let t=0;t<this.rows;t++)for(let e=0;e<this.columns;e++)this.set(t,e,Math.cbrt(this.get(t,e)));return this},t.cbrt=function(t){return new e(t).cbrt()},t.prototype.ceil=function(){for(let t=0;t<this.rows;t++)for(let e=0;e<this.columns;e++)this.set(t,e,Math.ceil(this.get(t,e)));return this},t.ceil=function(t){return new e(t).ceil()},t.prototype.clz32=function(){for(let t=0;t<this.rows;t++)for(let e=0;e<this.columns;e++)this.set(t,e,Math.clz32(this.get(t,e)));return this},t.clz32=function(t){return new e(t).clz32()},t.prototype.cos=function(){for(let t=0;t<this.rows;t++)for(let e=0;e<this.columns;e++)this.set(t,e,Math.cos(this.get(t,e)));return this},t.cos=function(t){return new e(t).cos()},t.prototype.cosh=function(){for(let t=0;t<this.rows;t++)for(let e=0;e<this.columns;e++)this.set(t,e,Math.cosh(this.get(t,e)));return this},t.cosh=function(t){return new e(t).cosh()},t.prototype.exp=function(){for(let t=0;t<this.rows;t++)for(let e=0;e<this.columns;e++)this.set(t,e,Math.exp(this.get(t,e)));return this},t.exp=function(t){return new e(t).exp()},t.prototype.expm1=function(){for(let t=0;t<this.rows;t++)for(let e=0;e<this.columns;e++)this.set(t,e,Math.expm1(this.get(t,e)));return this},t.expm1=function(t){return new e(t).expm1()},t.prototype.floor=function(){for(let t=0;t<this.rows;t++)for(let e=0;e<this.columns;e++)this.set(t,e,Math.floor(this.get(t,e)));return this},t.floor=function(t){return new e(t).floor()},t.prototype.fround=function(){for(let t=0;t<this.rows;t++)for(let e=0;e<this.columns;e++)this.set(t,e,Math.fround(this.get(t,e)));return this},t.fround=function(t){return new e(t).fround()},t.prototype.log=function(){for(let t=0;t<this.rows;t++)for(let e=0;e<this.columns;e++)this.set(t,e,Math.log(this.get(t,e)));return this},t.log=function(t){return new e(t).log()},t.prototype.log1p=function(){for(let t=0;t<this.rows;t++)for(let e=0;e<this.columns;e++)this.set(t,e,Math.log1p(this.get(t,e)));return this},t.log1p=function(t){return new e(t).log1p()},t.prototype.log10=function(){for(let t=0;t<this.rows;t++)for(let e=0;e<this.columns;e++)this.set(t,e,Math.log10(this.get(t,e)));return this},t.log10=function(t){return new e(t).log10()},t.prototype.log2=function(){for(let t=0;t<this.rows;t++)for(let e=0;e<this.columns;e++)this.set(t,e,Math.log2(this.get(t,e)));return this},t.log2=function(t){return new e(t).log2()},t.prototype.round=function(){for(let t=0;t<this.rows;t++)for(let e=0;e<this.columns;e++)this.set(t,e,Math.round(this.get(t,e)));return this},t.round=function(t){return new e(t).round()},t.prototype.sign=function(){for(let t=0;t<this.rows;t++)for(let e=0;e<this.columns;e++)this.set(t,e,Math.sign(this.get(t,e)));return this},t.sign=function(t){return new e(t).sign()},t.prototype.sin=function(){for(let t=0;t<this.rows;t++)for(let e=0;e<this.columns;e++)this.set(t,e,Math.sin(this.get(t,e)));return this},t.sin=function(t){return new e(t).sin()},t.prototype.sinh=function(){for(let t=0;t<this.rows;t++)for(let e=0;e<this.columns;e++)this.set(t,e,Math.sinh(this.get(t,e)));return this},t.sinh=function(t){return new e(t).sinh()},t.prototype.sqrt=function(){for(let t=0;t<this.rows;t++)for(let e=0;e<this.columns;e++)this.set(t,e,Math.sqrt(this.get(t,e)));return this},t.sqrt=function(t){return new e(t).sqrt()},t.prototype.tan=function(){for(let t=0;t<this.rows;t++)for(let e=0;e<this.columns;e++)this.set(t,e,Math.tan(this.get(t,e)));return this},t.tan=function(t){return new e(t).tan()},t.prototype.tanh=function(){for(let t=0;t<this.rows;t++)for(let e=0;e<this.columns;e++)this.set(t,e,Math.tanh(this.get(t,e)));return this},t.tanh=function(t){return new e(t).tanh()},t.prototype.trunc=function(){for(let t=0;t<this.rows;t++)for(let e=0;e<this.columns;e++)this.set(t,e,Math.trunc(this.get(t,e)));return this},t.trunc=function(t){return new e(t).trunc()},t.pow=function(t,r){return new e(t).pow(r)},t.prototype.pow=function(t){return"number"==typeof t?this.powS(t):this.powM(t)},t.prototype.powS=function(t){for(let e=0;e<this.rows;e++)for(let r=0;r<this.columns;r++)this.set(e,r,Math.pow(this.get(e,r),t));return this},t.prototype.powM=function(t){if(t=e.checkMatrix(t),this.rows!==t.rows||this.columns!==t.columns)throw new RangeError("Matrices dimensions must be equal");for(let e=0;e<this.rows;e++)for(let r=0;r<this.columns;r++)this.set(e,r,Math.pow(this.get(e,r),t.get(e,r)));return this}}(ve,Me);class be extends ve{constructor(t){super(),this.data=t,this.rows=t.length,this.columns=t[0].length}set(t,e,r){return this.data[t][e]=r,this}get(t,e){return this.data[t][e]}}function Ee(t,e){let r=0;return Math.abs(t)>Math.abs(e)?(r=e/t,Math.abs(t)*Math.sqrt(1+r*r)):0!==e?(r=t/e,Math.abs(e)*Math.sqrt(1+r*r)):0}class Ne{constructor(t,e={}){if((t=be.checkMatrix(t)).isEmpty())throw new Error("Matrix must be non-empty");let r=t.rows,n=t.columns;const{computeLeftSingularVectors:o=!0,computeRightSingularVectors:i=!0,autoTranspose:s=!1}=e;let a,h=Boolean(o),u=Boolean(i),l=!1;if(r<n)if(s){a=t.transpose(),r=a.rows,n=a.columns,l=!0;let e=h;h=u,u=e}else a=t.clone(),console.warn("Computing SVD on a matrix with more columns than rows. Consider enabling autoTranspose");else a=t.clone();let c=Math.min(r,n),f=Math.min(r+1,n),d=new Float64Array(f),g=new Me(r,c),p=new Me(n,n),y=new Float64Array(n),m=new Float64Array(r),w=new Float64Array(f);for(let t=0;t<f;t++)w[t]=t;let v=Math.min(r-1,n),x=Math.max(0,Math.min(n-2,r)),M=Math.max(v,x);for(let t=0;t<M;t++){if(t<v){d[t]=0;for(let e=t;e<r;e++)d[t]=Ee(d[t],a.get(e,t));if(0!==d[t]){a.get(t,t)<0&&(d[t]=-d[t]);for(let e=t;e<r;e++)a.set(e,t,a.get(e,t)/d[t]);a.set(t,t,a.get(t,t)+1)}d[t]=-d[t]}for(let e=t+1;e<n;e++){if(t<v&&0!==d[t]){let n=0;for(let o=t;o<r;o++)n+=a.get(o,t)*a.get(o,e);n=-n/a.get(t,t);for(let o=t;o<r;o++)a.set(o,e,a.get(o,e)+n*a.get(o,t))}y[e]=a.get(t,e)}if(h&&t<v)for(let e=t;e<r;e++)g.set(e,t,a.get(e,t));if(t<x){y[t]=0;for(let e=t+1;e<n;e++)y[t]=Ee(y[t],y[e]);if(0!==y[t]){y[t+1]<0&&(y[t]=0-y[t]);for(let e=t+1;e<n;e++)y[e]/=y[t];y[t+1]+=1}if(y[t]=-y[t],t+1<r&&0!==y[t]){for(let e=t+1;e<r;e++)m[e]=0;for(let e=t+1;e<r;e++)for(let r=t+1;r<n;r++)m[e]+=y[r]*a.get(e,r);for(let e=t+1;e<n;e++){let n=-y[e]/y[t+1];for(let o=t+1;o<r;o++)a.set(o,e,a.get(o,e)+n*m[o])}}if(u)for(let e=t+1;e<n;e++)p.set(e,t,y[e])}}let b=Math.min(n,r+1);if(v<n&&(d[v]=a.get(v,v)),r<b&&(d[b-1]=0),x+1<b&&(y[x]=a.get(x,b-1)),y[b-1]=0,h){for(let t=v;t<c;t++){for(let e=0;e<r;e++)g.set(e,t,0);g.set(t,t,1)}for(let t=v-1;t>=0;t--)if(0!==d[t]){for(let e=t+1;e<c;e++){let n=0;for(let o=t;o<r;o++)n+=g.get(o,t)*g.get(o,e);n=-n/g.get(t,t);for(let o=t;o<r;o++)g.set(o,e,g.get(o,e)+n*g.get(o,t))}for(let e=t;e<r;e++)g.set(e,t,-g.get(e,t));g.set(t,t,1+g.get(t,t));for(let e=0;e<t-1;e++)g.set(e,t,0)}else{for(let e=0;e<r;e++)g.set(e,t,0);g.set(t,t,1)}}if(u)for(let t=n-1;t>=0;t--){if(t<x&&0!==y[t])for(let e=t+1;e<n;e++){let r=0;for(let o=t+1;o<n;o++)r+=p.get(o,t)*p.get(o,e);r=-r/p.get(t+1,t);for(let o=t+1;o<n;o++)p.set(o,e,p.get(o,e)+r*p.get(o,t))}for(let e=0;e<n;e++)p.set(e,t,0);p.set(t,t,1)}let E=b-1,N=0,S=Number.EPSILON;for(;b>0;){let t,e;for(t=b-2;t>=-1&&-1!==t;t--){const e=Number.MIN_VALUE+S*Math.abs(d[t]+Math.abs(d[t+1]));if(Math.abs(y[t])<=e||Number.isNaN(y[t])){y[t]=0;break}}if(t===b-2)e=4;else{let r;for(r=b-1;r>=t&&r!==t;r--){let e=(r!==b?Math.abs(y[r]):0)+(r!==t+1?Math.abs(y[r-1]):0);if(Math.abs(d[r])<=S*e){d[r]=0;break}}r===t?e=3:r===b-1?e=1:(e=2,t=r)}switch(t++,e){case 1:{let e=y[b-2];y[b-2]=0;for(let r=b-2;r>=t;r--){let o=Ee(d[r],e),i=d[r]/o,s=e/o;if(d[r]=o,r!==t&&(e=-s*y[r-1],y[r-1]=i*y[r-1]),u)for(let t=0;t<n;t++)o=i*p.get(t,r)+s*p.get(t,b-1),p.set(t,b-1,-s*p.get(t,r)+i*p.get(t,b-1)),p.set(t,r,o)}break}case 2:{let e=y[t-1];y[t-1]=0;for(let n=t;n<b;n++){let o=Ee(d[n],e),i=d[n]/o,s=e/o;if(d[n]=o,e=-s*y[n],y[n]=i*y[n],h)for(let e=0;e<r;e++)o=i*g.get(e,n)+s*g.get(e,t-1),g.set(e,t-1,-s*g.get(e,n)+i*g.get(e,t-1)),g.set(e,n,o)}break}case 3:{const e=Math.max(Math.abs(d[b-1]),Math.abs(d[b-2]),Math.abs(y[b-2]),Math.abs(d[t]),Math.abs(y[t])),o=d[b-1]/e,i=d[b-2]/e,s=y[b-2]/e,a=d[t]/e,l=y[t]/e,c=((i+o)*(i-o)+s*s)/2,f=o*s*(o*s);let m=0;0===c&&0===f||(m=c<0?0-Math.sqrt(c*c+f):Math.sqrt(c*c+f),m=f/(c+m));let w=(a+o)*(a-o)+m,v=a*l;for(let e=t;e<b-1;e++){let o=Ee(w,v);0===o&&(o=Number.MIN_VALUE);let i=w/o,s=v/o;if(e!==t&&(y[e-1]=o),w=i*d[e]+s*y[e],y[e]=i*y[e]-s*d[e],v=s*d[e+1],d[e+1]=i*d[e+1],u)for(let t=0;t<n;t++)o=i*p.get(t,e)+s*p.get(t,e+1),p.set(t,e+1,-s*p.get(t,e)+i*p.get(t,e+1)),p.set(t,e,o);if(o=Ee(w,v),0===o&&(o=Number.MIN_VALUE),i=w/o,s=v/o,d[e]=o,w=i*y[e]+s*d[e+1],d[e+1]=-s*y[e]+i*d[e+1],v=s*y[e+1],y[e+1]=i*y[e+1],h&&e<r-1)for(let t=0;t<r;t++)o=i*g.get(t,e)+s*g.get(t,e+1),g.set(t,e+1,-s*g.get(t,e)+i*g.get(t,e+1)),g.set(t,e,o)}y[b-2]=w,N+=1;break}case 4:if(d[t]<=0&&(d[t]=d[t]<0?-d[t]:0,u))for(let e=0;e<=E;e++)p.set(e,t,-p.get(e,t));for(;t<E&&!(d[t]>=d[t+1]);){let e=d[t];if(d[t]=d[t+1],d[t+1]=e,u&&t<n-1)for(let r=0;r<n;r++)e=p.get(r,t+1),p.set(r,t+1,p.get(r,t)),p.set(r,t,e);if(h&&t<r-1)for(let n=0;n<r;n++)e=g.get(n,t+1),g.set(n,t+1,g.get(n,t)),g.set(n,t,e);t++}N=0,b--}}if(l){let t=p;p=g,g=t}this.m=r,this.n=n,this.s=d,this.U=g,this.V=p}solve(t){let e=t,r=this.threshold,n=this.s.length,o=Me.zeros(n,n);for(let t=0;t<n;t++)Math.abs(this.s[t])<=r?o.set(t,t,0):o.set(t,t,1/this.s[t]);let i=this.U,s=this.rightSingularVectors,a=s.mmul(o),h=s.rows,u=i.rows,l=Me.zeros(h,u);for(let t=0;t<h;t++)for(let e=0;e<u;e++){let r=0;for(let o=0;o<n;o++)r+=a.get(t,o)*i.get(e,o);l.set(t,e,r)}return l.mmul(e)}solveForDiagonal(t){return this.solve(Me.diag(t))}inverse(){let t=this.V,e=this.threshold,r=t.rows,n=t.columns,o=new Me(r,this.s.length);for(let i=0;i<r;i++)for(let r=0;r<n;r++)Math.abs(this.s[r])>e&&o.set(i,r,t.get(i,r)/this.s[r]);let i=this.U,s=i.rows,a=i.columns,h=new Me(r,s);for(let t=0;t<r;t++)for(let e=0;e<s;e++){let r=0;for(let n=0;n<a;n++)r+=o.get(t,n)*i.get(e,n);h.set(t,e,r)}return h}get condition(){return this.s[0]/this.s[Math.min(this.m,this.n)-1]}get norm2(){return this.s[0]}get rank(){let t=Math.max(this.m,this.n)*this.s[0]*Number.EPSILON,e=0,r=this.s;for(let n=0,o=r.length;n<o;n++)r[n]>t&&e++;return e}get diagonal(){return Array.from(this.s)}get threshold(){return Number.EPSILON/2*Math.max(this.m,this.n)*this.s[0]}get leftSingularVectors(){return this.U}get rightSingularVectors(){return this.V}get diagonalMatrix(){return Me.diag(this.s)}}var Se,Ae={center:[0,0],linkDistance:50},ke=function(){function t(t){void 0===t&&(t={}),this.options=t,this.id="mds",this.options=r(r({},Ae),t)}return t.prototype.execute=function(t,e){return this.genericMDSLayout(!1,t,e)},t.prototype.assign=function(t,e){this.genericMDSLayout(!0,t,e)},t.prototype.genericMDSLayout=function(t,e,n){var o=r(r({},this.options),n),i=o.center,s=void 0===i?[0,0]:i,a=o.linkDistance,h=void 0===a?50:a,u=o.onLayoutEnd,l=e.getAllNodes(),c=e.getAllEdges();if(!(null==l?void 0:l.length)||1===l.length)return N(e,t,s,u);var g=d({nodes:l,edges:c},!1),p=f(g);De(p);var y=function(t,e){var r=[];return t.forEach((function(t){var n=[];t.forEach((function(t){n.push(t*e)})),r.push(n)})),r}(p,h),m=Ie(y),w=[];m.forEach((function(t,e){var r=v(l[e]);r.data.x=t[0]+s[0],r.data.y=t[1]+s[1],w.push(r)})),t&&w.forEach((function(t){return e.mergeNodeData(t.id,{x:t.data.x,y:t.data.y})}));var x={nodes:w,edges:c};return null==u||u(x),x},t}(),De=function(t){var e=-999999;t.forEach((function(t){t.forEach((function(t){t!==1/0&&e<t&&(e=t)}))})),t.forEach((function(r,n){r.forEach((function(r,o){r===1/0&&(t[n][o]=e)}))}))},Ie=function(t){var e=Me.mul(Me.pow(t,2),-.5),r=e.mean("row"),n=e.mean("column"),o=e.mean();e.add(o).subRowVector(r).subColumnVector(n);var i=new Ne(e),s=Me.sqrt(i.diagonalMatrix).diagonal();return i.leftSingularVectors.toJSON().map((function(t){return Me.mul([t],[s]).toJSON()[0].splice(0,2)}))},_e={iterations:10,height:10,width:10,speed:100,gravity:10,k:5},Re=function(t,e,r,n,o,i){e.forEach((function(s,a){r[a]={x:0,y:0},e.forEach((function(e,h){if(a!==h&&o[a]===o[h]){var u=s.x-e.x,l=s.y-e.y,c=Math.sqrt(u*u+l*l);if(0===c){c=1;var f=a>h?1:-1;u=.01*f,l=.01*f}if(c<i(t[a])/2+i(t[h])/2){var d=n*n/c;r[a].x+=u/c*d,r[a].y+=l/c*d}}}))}))},ze=function(t,e,r,n,o,i,s,a){var h=i||s/10;return n&&e.forEach((function(e,r){var n=t[r].x-t[o].x,i=t[r].y-t[o].y,s=Math.sqrt(n*n+i*i),a=i/s,h=-n/s,u=Math.sqrt(e.x*e.x+e.y*e.y),l=Math.acos((a*e.x+h*e.y)/u);l>Math.PI/2&&(l-=Math.PI/2,a*=-1,h*=-1);var c=Math.cos(l)*u;e.x=a*c,e.y=h*c})),t.forEach((function(i,s){if(s!==o){var u=Math.sqrt(e[s].x*e[s].x+e[s].y*e[s].y);if(u>0&&s!==o){var l=Math.min(h*(r/800),u);if(i.x+=e[s].x/u*l,i.y+=e[s].y/u*l,n){var c=i.x-t[o].x,f=i.y-t[o].y,d=Math.sqrt(c*c+f*f);c=c/d*a[s],f=f/d*a[s],i.x=t[o].x+c,i.y=t[o].y+f}}}})),t},Te={maxIteration:1e3,focusNode:null,unitRadius:null,linkDistance:50,preventOverlap:!1,strictRadial:!0,maxPreventOverlapIteration:200,sortStrength:10},Oe=function(){function t(t){void 0===t&&(t={}),this.options=t,this.id="radial",this.options=r(r({},Te),t)}return t.prototype.execute=function(t,e){return this.genericRadialLayout(!1,t,e)},t.prototype.assign=function(t,e){this.genericRadialLayout(!0,t,e)},t.prototype.genericRadialLayout=function(t,e,n){var s=r(r({},this.options),n),a=s.width,h=s.height,u=s.center,l=s.focusNode,c=s.unitRadius,g=s.nodeSize,p=s.nodeSpacing,y=s.strictRadial,m=s.preventOverlap,w=s.maxPreventOverlapIteration,x=s.sortBy,M=s.linkDistance,b=void 0===M?50:M,E=s.sortStrength,S=void 0===E?10:E,A=s.maxIteration,k=void 0===A?1e3:A,D=s.onLayoutEnd,_=e.getAllNodes(),R=e.getAllEdges(),z=a||"undefined"==typeof window?a:window.innerWidth,T=h||"undefined"==typeof window?h:window.innerHeight,O=u||[z/2,T/2];if(!(null==_?void 0:_.length)||1===_.length)return N(e,t,O,D);var C=_[0];if(I(l)){for(var P=0;P<_.length;P++)if(_[P].id===l){C=_[P];break}}else C=l||_[0];var q=qe(_,C.id),L=d({nodes:_,edges:R},!1),F=f(L),j=Fe(F,q);Le(F,q,j+1);var V=F[q],W=z-O[0]>O[0]?O[0]:z-O[0],$=T-O[1]>O[1]?O[1]:T-O[1];0===W&&(W=z/2),0===$&&($=T/2);var G=Math.min(W,$),U=Math.max.apply(Math,i([],o(V),!1)),B=[],H=c||G/U;V.forEach((function(t,e){B[e]=t*H}));var K,J=Ce(_,F,b,B,H,x,S),Y=Pe(J),X=function(t,e,r){try{var n=Me.mul(Me.pow(e,2),-.5),o=n.mean("row"),i=n.mean("column"),s=n.mean();n.add(s).subRowVector(o).subColumnVector(i);var a=new Ne(n),h=Me.sqrt(a.diagonalMatrix).diagonal();return a.leftSingularVectors.toJSON().map((function(e){return Me.mul([e],[h]).toJSON()[0].splice(0,t)}))}catch(t){for(var u=[],l=0;l<e.length;l++){var c=Math.random()*r,f=Math.random()*r;u.push([c,f])}return u}}(b,J,b),Q=X.map((function(t){var e=o(t,2),r=e[0],n=e[1];return{x:(isNaN(r)?Math.random()*b:r)-X[q][0],y:(isNaN(n)?Math.random()*b:n)-X[q][1]}}));if(this.run(k,Q,Y,J,B,q),m){K=je(g,p);var Z={nodes:_,nodeSizeFunc:K,positions:Q,radii:B,height:T,width:z,strictRadial:Boolean(y),focusIdx:q,iterations:w||200,k:Q.length/4.5};Q=function(t,e){for(var n=r(r({},_e),e),o=n.positions,i=n.iterations,s=n.width,a=n.k,h=n.speed,u=void 0===h?100:h,l=n.strictRadial,c=n.focusIdx,f=n.radii,d=void 0===f?[]:f,g=n.nodeSizeFunc,p=t.getAllNodes(),y=[],m=s/10,w=0;w<i;w++)o.forEach((function(t,e){y[e]={x:0,y:0}})),Re(p,o,y,a,d,g),ze(o,y,u,l,c,m,s,d);return o}(e,Z)}var tt=[];Q.forEach((function(t,e){var r=v(_[e]);r.data.x=t.x+O[0],r.data.y=t.y+O[1],tt.push(r)})),t&&tt.forEach((function(t){return e.mergeNodeData(t.id,{x:t.data.x,y:t.data.y})}));var et={nodes:tt,edges:R};return null==D||D(et),et},t.prototype.run=function(t,e,r,n,o,i){for(var s=0;s<=t;s++){var a=s/t;this.oneIteration(a,e,o,n,r,i)}},t.prototype.oneIteration=function(t,e,r,n,o,i){var s=1-t;e.forEach((function(a,h){var u=g(a,{x:0,y:0}),l=0===u?0:1/u;if(h!==i){var c=0,f=0,d=0;e.forEach((function(t,e){if(h!==e){var r=g(a,t),i=0===r?0:1/r,s=n[e][h];d+=o[h][e],c+=o[h][e]*(t.x+s*(a.x-t.x)*i),f+=o[h][e]*(t.y+s*(a.y-t.y)*i)}}));var p=0===r[h]?0:1/r[h];d*=s,d+=t*p*p,c*=s,c+=t*p*a.x*l,a.x=c/d,f*=s,f+=t*p*a.y*l,a.y=f/d}}))},t}(),Ce=function(t,e,r,n,o,i,s){if(!t)return[];var a=[];if(e){var h={};e.forEach((function(e,u){var l=[];e.forEach((function(e,a){var c,f;if(u===a)l.push(0);else if(n[u]===n[a])if("data"===i)l.push(e*(Math.abs(u-a)*s)/(n[u]/o));else if(i){var d=void 0,g=void 0;if(h[t[u].id])d=h[t[u].id];else{var p=("id"===i?t[u].id:null===(c=t[u].data)||void 0===c?void 0:c[i])||0;d=I(p)?p.charCodeAt(0):p,h[t[u].id]=d}h[t[a].id]?g=h[t[a].id]:(p=("id"===i?t[a].id:null===(f=t[a].data)||void 0===f?void 0:f[i])||0,g=I(p)?p.charCodeAt(0):p,h[t[a].id]=g),l.push(e*(Math.abs(d-g)*s)/(n[u]/o))}else l.push(e*r/(n[u]/o));else{var y=(r+o)/2;l.push(e*y)}})),a.push(l)}))}return a},Pe=function(t){for(var e=t.length,r=t[0].length,n=[],o=0;o<e;o++){for(var i=[],s=0;s<r;s++)0!==t[o][s]?i.push(1/(t[o][s]*t[o][s])):i.push(0);n.push(i)}return n},qe=function(t,e){var r=-1;return t.forEach((function(t,n){t.id===e&&(r=n)})),Math.max(r,0)},Le=function(t,e,r){for(var n=t.length,o=0;o<n;o++)if(t[e][o]===1/0){t[e][o]=r,t[o][e]=r;for(var i=0;i<n;i++)t[o][i]!==1/0&&t[e][i]===1/0&&(t[e][i]=r+t[o][i],t[i][e]=r+t[o][i])}for(o=0;o<n;o++)if(o!==e)for(i=0;i<n;i++)if(t[o][i]===1/0){var s=Math.abs(t[e][o]-t[e][i]);s=0===s?1:s,t[o][i]=s}},Fe=function(t,e){for(var r=0,n=0;n<t[e].length;n++)t[e][n]!==1/0&&(r=t[e][n]>r?t[e][n]:r);return r},je=function(t,e){var r;return r=m(e)?function(){return e}:x(e)?e:function(){return 0},t?c(t)?function(e){return(t[0]>t[1]?t[0]:t[1])+r(e)}:function(e){return t+r(e)}:function(t){var e,n;if(null===(e=t.data)||void 0===e?void 0:e.bboxSize)return Math.max(t.data.bboxSize[0],t.data.bboxSize[1])+r(t);if(null===(n=t.data)||void 0===n?void 0:n.size){if(c(t.data.size))return Math.max(t.data.size[0],t.data.size[1])+r(t);var o=t.data.size;return M(o)?(o.width>o.height?o.width:o.height)+r(t):o+r(t)}return 10+r(t)}},Ve={center:[0,0],width:300,height:300},We={circular:A,concentric:R,mds:ke,random:function(){function t(t){void 0===t&&(t={}),this.options=t,this.id="random",this.options=r(r({},Ve),t)}return t.prototype.execute=function(t,e){return this.genericRandomLayout(!1,t,e)},t.prototype.assign=function(t,e){this.genericRandomLayout(!0,t,e)},t.prototype.genericRandomLayout=function(t,e,n){var o=r(r({},this.options),n),i=o.center,s=o.width,a=o.height,h=o.onLayoutEnd,u=e.getAllNodes(),l=s||"undefined"==typeof window?s:window.innerWidth,c=a||"undefined"==typeof window?a:window.innerHeight,f=i||[l/2,c/2],d=[];u&&u.forEach((function(t){d.push({id:t.id,data:{x:.9*(Math.random()-.5)*l+f[0],y:.9*(Math.random()-.5)*c+f[1]}})})),t&&d.forEach((function(t){return e.mergeNodeData(t.id,{x:t.data.x,y:t.data.y})}));var g={nodes:d,edges:e.getAllEdges()};return null==h||h(g),g},t}(),grid:Kt,radial:Oe,force:Tt,d3force:Dt,fruchterman:Bt,forceAtlas2:Gt};function $e(){(null==Se?void 0:Se.stop)&&Se.stop()}function Ge(t,e){return r=this,n=void 0,i=function(){var r,n,o,i,s,a,h,l;return function(t,e){var r,n,o,i,s={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]};return i={next:a(0),throw:a(1),return:a(2)},"function"==typeof Symbol&&(i[Symbol.iterator]=function(){return this}),i;function a(a){return function(h){return function(a){if(r)throw new TypeError("Generator is already executing.");for(;i&&(i=0,a[0]&&(s=0)),s;)try{if(r=1,n&&(o=2&a[0]?n.return:a[0]?n.throw||((o=n.return)&&o.call(n),0):n.next)&&!(o=o.call(n,a[1])).done)return o;switch(n=0,o&&(a=[2&a[0],o.value]),a[0]){case 0:case 1:o=a;break;case 4:return s.label++,{value:a[1],done:!1};case 5:s.label++,n=a[1],a=[0];continue;case 7:a=s.ops.pop(),s.trys.pop();continue;default:if(!((o=(o=s.trys).length>0&&o[o.length-1])||6!==a[0]&&2!==a[0])){s=0;continue}if(3===a[0]&&(!o||a[1]>o[0]&&a[1]<o[3])){s.label=a[1];break}if(6===a[0]&&s.label<o[1]){s.label=o[1],o=a;break}if(o&&s.label<o[2]){s.label=o[2],s.ops.push(a);break}o[2]&&s.ops.pop(),s.trys.pop();continue}a=e.call(t,s)}catch(t){a=[6,t],n=0}finally{r=o=0}if(5&a[0])throw a[1];return{value:a[0]?a[1]:void 0,done:!0}}([a,h])}}}(this,(function(c){if(r=t.layout,n=r.id,o=r.options,i=r.iterations,s=t.nodes,a=t.edges,h=new u({nodes:s,edges:a}),!(l=We[n]))throw new Error("Unknown layout id: ".concat(n));return Se=new l(o),[2,new Promise((function(t){var r;Se.assign(h,{onLayoutEnd:function(r){t([r,e])}}),(r=Se).tick&&r.stop&&r.restart&&(Se.stop(),Se.tick(i))}))]}))},new((o=void 0)||(o=Promise))((function(t,e){function s(t){try{h(i.next(t))}catch(t){e(t)}}function a(t){try{h(i.throw(t))}catch(t){e(t)}}function h(e){var r;e.done?t(e.value):(r=e.value,r instanceof o?r:new o((function(t){t(r)}))).then(s,a)}h((i=i.apply(r,n||[])).next())}));var r,n,o,i}addEventListener("message",(function(t){var r,n=t.data,o=n.type,i=n.method,s=n.id,a=n.params;"RPC"===o&&i&&((r=e[i])?Promise.resolve().then((function(){return r.apply(e,a)})):Promise.reject("No such method")).then((function(t){postMessage({type:"RPC",id:s,result:t})})).catch((function(t){var e={message:t};t.stack&&(e.message=t.message,e.stack=t.stack,e.name=t.name),postMessage({type:"RPC",id:s,error:e})}))})),postMessage({type:"RPC",method:"ready"})})();
2
+ //# sourceMappingURL=e80ca3ea392aa15f2414.worker.js.map